@launchsecure/launch-kit 0.0.38 → 0.0.39
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/beacon/beacon.mjs +308 -298
- package/dist/beacon/beacon.mjs.map +1 -1
- package/dist/beacon/beacon.umd.js +6 -6
- package/dist/beacon/beacon.umd.js.map +1 -1
- package/dist/beacon/types/internal/screenshot.d.ts.map +1 -1
- package/dist/chart-client/assets/index-ysGpLeOW.css +1 -0
- package/dist/chart-client/index.html +2 -2
- package/dist/client/assets/index-CMN3tlGP.css +32 -0
- package/dist/client/index.html +2 -2
- package/dist/council-client/assets/index-ChmNX6bZ.css +1 -0
- package/dist/council-client/index.html +2 -2
- package/dist/deck-client/assets/{_baseUniq-CgW32Gdk.js → _baseUniq-DOrnEQMI.js} +1 -1
- package/dist/deck-client/assets/{arc-D-Mg9gvM.js → arc-DOWK7V3m.js} +1 -1
- package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-CdTsXsgl.js → architectureDiagram-Q4EWVU46-DPhzvk7q.js} +1 -1
- package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-mwTneYyB.js → blockDiagram-DXYQGD6D-CwAGy9lU.js} +1 -1
- package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-C4R8IbjO.js → c4Diagram-AHTNJAMY-L_g_SS21.js} +1 -1
- package/dist/deck-client/assets/channel-DqiACUUq.js +1 -0
- package/dist/deck-client/assets/{chunk-4BX2VUAB-ZWuRIUwb.js → chunk-4BX2VUAB-RKm0LXpu.js} +1 -1
- package/dist/deck-client/assets/{chunk-4TB4RGXK-PNHX10sF.js → chunk-4TB4RGXK-Bk0FUbxU.js} +1 -1
- package/dist/deck-client/assets/{chunk-55IACEB6-CD9MUgPr.js → chunk-55IACEB6-Cl3hja-M.js} +1 -1
- package/dist/deck-client/assets/{chunk-EDXVE4YY-C_CpORb3.js → chunk-EDXVE4YY-CNIMQCV2.js} +1 -1
- package/dist/deck-client/assets/{chunk-FMBD7UC4-Bg5RoVC-.js → chunk-FMBD7UC4-DqOvWr1k.js} +1 -1
- package/dist/deck-client/assets/{chunk-OYMX7WX6-DhTwgQwd.js → chunk-OYMX7WX6-1Kd7yK5u.js} +1 -1
- package/dist/deck-client/assets/{chunk-QZHKN3VN-C5VLMaFa.js → chunk-QZHKN3VN-6_kraYpP.js} +1 -1
- package/dist/deck-client/assets/{chunk-YZCP3GAM-NAGHy4Sr.js → chunk-YZCP3GAM-FgAwIWlo.js} +1 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-D23cq2C3.js +1 -0
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-D23cq2C3.js +1 -0
- package/dist/deck-client/assets/clone-C7jSigGq.js +1 -0
- package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-CpUczjZk.js → cose-bilkent-S5V4N54A-CigVnnPr.js} +1 -1
- package/dist/deck-client/assets/{dagre-KV5264BT-BOvb07MG.js → dagre-KV5264BT-DHZXTktX.js} +1 -1
- package/dist/deck-client/assets/{diagram-5BDNPKRD-BPxwTiC-.js → diagram-5BDNPKRD-H5k0eauU.js} +1 -1
- package/dist/deck-client/assets/{diagram-G4DWMVQ6-Dz_gsHgx.js → diagram-G4DWMVQ6-Bg3dFhSY.js} +1 -1
- package/dist/deck-client/assets/{diagram-MMDJMWI5-B7z-oVTW.js → diagram-MMDJMWI5-CQLC410N.js} +1 -1
- package/dist/deck-client/assets/{diagram-TYMM5635-CAIAglLQ.js → diagram-TYMM5635-DFTCHVkP.js} +1 -1
- package/dist/deck-client/assets/{erDiagram-SMLLAGMA-BiViTWF3.js → erDiagram-SMLLAGMA-aiv9GZnL.js} +1 -1
- package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-DYVemp0H.js → flowDiagram-DWJPFMVM-C6Fhvtsy.js} +1 -1
- package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-Chc1Iyu1.js → ganttDiagram-T4ZO3ILL-DSaGMPM4.js} +1 -1
- package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-B7eFgaj5.js → gitGraphDiagram-UUTBAWPF-DMjL2Vix.js} +1 -1
- package/dist/deck-client/assets/{graph-CKaIoNwb.js → graph-B7Vn5lkK.js} +1 -1
- package/dist/deck-client/assets/{index-BRawc7RA.js → index-BD36e-tD.js} +68 -68
- package/dist/deck-client/assets/index-CGbNOpk9.css +1 -0
- package/dist/deck-client/assets/{infoDiagram-42DDH7IO-BxsVq7vO.js → infoDiagram-42DDH7IO-mNi4iygG.js} +1 -1
- package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-DAM7vPwa.js → ishikawaDiagram-UXIWVN3A-BwCUmUVt.js} +1 -1
- package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-Xe20Nf7R.js → journeyDiagram-VCZTEJTY-C6qoqJmJ.js} +1 -1
- package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-DS8YguzB.js → kanban-definition-6JOO6SKY-Dz1Tt3sA.js} +1 -1
- package/dist/deck-client/assets/{layout-DKMBpzR-.js → layout-CZTyRhOG.js} +1 -1
- package/dist/deck-client/assets/{linear-DTNtBg5h.js → linear--7n7iEvd.js} +1 -1
- package/dist/deck-client/assets/{min-C4DrxCcA.js → min-Bh130DN8.js} +1 -1
- package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-B4nEtsw5.js → mindmap-definition-QFDTVHPH-CfXcK1qH.js} +1 -1
- package/dist/deck-client/assets/{pieDiagram-DEJITSTG-BzHdGNu5.js → pieDiagram-DEJITSTG-DjVHLAVw.js} +1 -1
- package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-CaX0SD4-.js → quadrantDiagram-34T5L4WZ-CXwvZ1i1.js} +1 -1
- package/dist/deck-client/assets/{requirementDiagram-MS252O5E-QeG4p2ni.js → requirementDiagram-MS252O5E-Cl6xm0fR.js} +1 -1
- package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-BoAwgAj-.js → sankeyDiagram-XADWPNL6-BOH9sLyh.js} +1 -1
- package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-Dn4pYYgu.js → sequenceDiagram-FGHM5R23-BC1MYBn6.js} +1 -1
- package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-Is6KRmQV.js → stateDiagram-FHFEXIEX-kNp9bv8K.js} +1 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-hRsAFc2t.js +1 -0
- package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-v64IZGuY.js → timeline-definition-GMOUNBTQ-DKnITsD4.js} +1 -1
- package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-noh9eouF.js → vennDiagram-DHZGUBPP-BdajXRrh.js} +1 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-BL802-su.js +162 -0
- package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-DxR4j737.js → wardleyDiagram-NUSXRM2D-B2hDCDl2.js} +1 -1
- package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-B26vodaL.js → xychartDiagram-5P7HB3ND-CvnYFs51.js} +1 -1
- package/dist/deck-client/index.html +2 -2
- package/dist/server/council-entry.js +0 -0
- package/dist/server/deck-mcp-entry.js +3 -1
- package/dist/server/deck-serve.js +3 -1
- package/dist/server/fb-wizard.js +0 -0
- package/dist/server/init-entry.js +152 -25
- package/dist/server/radar-docker-init-entry.js +0 -0
- package/dist/server/radar-entrypoint-entry.js +0 -0
- package/dist/server/radar-teardown-entry.js +0 -0
- package/dist/server/rover-entry.js +44 -1
- package/package.json +23 -22
- package/scaffolds/ls-marketplace/plugins/kit/commands/activate-statusline.md +8 -7
- package/scaffolds/ls-marketplace/plugins/kit/commands/deactivate-statusline.md +2 -2
- package/scaffolds/ls-marketplace/plugins/kit/skills/comms/SKILL.md +88 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/project-info/SKILL.md +88 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/slides/SKILL.md +118 -0
- package/scaffolds/migrate-safety/scripts/migrate-with-backup.sh +0 -0
- package/scaffolds/recall-hook/scripts/ensure-recall.sh +0 -0
- package/scaffolds/statusline/statusline-base.sh +20 -0
- package/dist/chart-client/assets/index-B6rR0CWx.css +0 -1
- package/dist/client/assets/index-D6uX1lQe.css +0 -32
- package/dist/council-client/assets/index-CleYLarJ.css +0 -1
- package/dist/deck-client/assets/channel-CuSee7GO.js +0 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-_kTisqzs.js +0 -1
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-_kTisqzs.js +0 -1
- package/dist/deck-client/assets/clone-kb3zkY60.js +0 -1
- package/dist/deck-client/assets/index-55P73aS_.css +0 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-Cy45Ttqq.js +0 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-cJ_1is2S.js +0 -162
- /package/dist/chart-client/assets/{index-C_xCi3gW.js → index-BlsuXuQ1.js} +0 -0
- /package/dist/client/assets/{index-CRecYFUA.js → index-BA7BHBWT.js} +0 -0
- /package/dist/council-client/assets/{index-DO-Vn15O.js → index-jjBWyhry.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beacon.mjs","sources":["../../src/beacon/styles.ts","../../src/beacon/element.ts","../../src/beacon/ctx.ts","../../src/beacon/registry.ts","../../src/beacon/transport.ts","../../src/beacon/ui/form.ts","../../src/beacon/ui/dialog.ts","../../src/beacon/ui/overlay.ts","../../src/beacon/plugins/metadata.ts","../../src/beacon/internal/event-buffer.ts","../../src/beacon/plugins/errors.ts","../../src/beacon/internal/selector.ts","../../src/beacon/internal/framework-detect.ts","../../src/beacon/internal/element-capture.ts","../../src/beacon/internal/markers.ts","../../src/beacon/internal/pick-mode-overlay.ts","../../src/beacon/internal/pin-popover.ts","../../src/beacon/internal/picker.ts","../../src/beacon/internal/screenshot.ts","../../src/beacon/internal/annotation-cache.ts","../../src/beacon/plugins/domEle.ts","../../src/beacon/types.ts","../../src/beacon/plugins/domSS.ts","../../src/beacon/internal/monitor/overlay.ts","../../src/beacon/internal/monitor/capture-dom.ts","../../src/beacon/internal/monitor/capture-network.ts","../../src/beacon/internal/monitor/transport.ts","../../src/beacon/internal/monitor/session.ts","../../src/beacon/plugins/liveMonitor.ts","../../src/beacon/core.ts","../../src/beacon/index.ts"],"sourcesContent":["// Shadow-DOM-scoped styles for <launch-kit-beacon>.\n// Exported as a string so the same source compiles cleanly under Vite (UMD\n// bundle) and Next.js (transpilePackages, no ?inline support). The CSS-as-string\n// is shipped inside the bundle; no separate stylesheet fetch.\n\nexport const beaconStyles = String.raw`\n:host {\n --beacon-accent: #0ea5e9;\n --beacon-bg: #ffffff;\n --beacon-fg: #0f172a;\n --beacon-muted: #64748b;\n --beacon-border: #e2e8f0;\n --beacon-radius: 10px;\n --beacon-z-index: 2147483645;\n --beacon-shadow: 0 10px 30px hsl(0 0% 0% / 0.15), 0 2px 6px hsl(0 0% 0% / 0.08);\n --beacon-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --beacon-color-scheme: light dark;\n\n --beacon-bug: #ef4444;\n --beacon-idea: #22c55e;\n --beacon-ux: #a855f7;\n --beacon-a11y: #06b6d4;\n\n position: fixed;\n z-index: var(--beacon-z-index);\n font-family: var(--beacon-font-family);\n font-size: 14px;\n color: var(--beacon-fg);\n line-height: 1.5;\n color-scheme: var(--beacon-color-scheme);\n}\n\n:host([theme='dark']) {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n --beacon-color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n :host([theme='auto']) {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n }\n}\n\n:host([position='bottom-right']) { right: 20px; bottom: 20px; left: auto; top: auto; }\n:host([position='bottom-left']) { left: 20px; bottom: 20px; right: auto; top: auto; }\n\n:host([position='hidden']) {\n position: static;\n display: contents;\n}\n:host([position='hidden']) .beacon-default-trigger { display: none; }\n\n.beacon-default-trigger {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: var(--beacon-accent);\n color: white;\n border: 0;\n border-radius: 999px;\n padding: 10px 16px;\n font: inherit;\n font-weight: 500;\n cursor: pointer;\n box-shadow: var(--beacon-shadow);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n}\n.beacon-default-trigger:hover { transform: translateY(-1px); }\n.beacon-default-trigger svg { width: 18px; height: 18px; }\n\n.beacon-health-dot {\n display: none;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--beacon-bug);\n margin-left: 2px;\n}\n.beacon-health-dot.visible { display: inline-block; }\n\ndialog.beacon-dialog {\n width: 380px;\n max-width: calc(100vw - 24px);\n max-height: calc(100vh - 24px);\n padding: 0;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: var(--beacon-radius);\n box-shadow: var(--beacon-shadow);\n font-family: var(--beacon-font-family);\n font-size: 14px;\n line-height: 1.5;\n}\ndialog.beacon-dialog::backdrop {\n background: hsl(0 0% 0% / 0.8);\n}\n\n.beacon-dialog-inner {\n display: flex;\n flex-direction: column;\n max-height: calc(100vh - 24px);\n}\n\n.beacon-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--beacon-border);\n}\n.beacon-drawer-title { font-weight: 600; }\n.beacon-icon-btn {\n background: transparent;\n border: 0;\n color: var(--beacon-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: inline-flex;\n}\n.beacon-icon-btn:hover { background: var(--beacon-border); color: var(--beacon-fg); }\n.beacon-icon-btn svg { width: 16px; height: 16px; }\n\n.beacon-drawer-body {\n padding: 16px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* Plugin panels share the same vertical rhythm as the drawer body so sibling\n panels (annotate, monitor, etc.) don't visually collide. Without this, every\n plugin panel renders flush against the previous one. */\n.beacon-plugin-panels {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.beacon-field { display: flex; flex-direction: column; gap: 6px; }\n.beacon-label { font-size: 12px; color: var(--beacon-muted); font-weight: 500; }\n.beacon-description { font-size: 12px; color: var(--beacon-muted); }\n\n.beacon-input,\n.beacon-textarea,\n.beacon-select {\n width: 100%;\n padding: 8px 10px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n font: inherit;\n box-sizing: border-box;\n}\n.beacon-textarea { min-height: 80px; resize: vertical; }\n.beacon-input:focus,\n.beacon-textarea:focus,\n.beacon-select:focus { outline: 2px solid var(--beacon-accent); outline-offset: -1px; border-color: var(--beacon-accent); }\n\n.beacon-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n}\n.beacon-toggle input { margin: 0; }\n\n.beacon-radio-group { display: flex; flex-direction: column; gap: 4px; }\n.beacon-radio-opt { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; }\n\n.beacon-severity {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 6px;\n}\n.beacon-severity-opt {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 4px;\n background: transparent;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: var(--beacon-fg);\n text-transform: capitalize;\n}\n.beacon-severity-opt input { position: absolute; opacity: 0; pointer-events: none; }\n.beacon-severity-opt:hover { background: var(--beacon-border); }\n.beacon-severity-opt.selected[data-sev='bug'] { border-color: var(--beacon-bug); color: var(--beacon-bug); }\n.beacon-severity-opt.selected[data-sev='idea'] { border-color: var(--beacon-idea); color: var(--beacon-idea); }\n.beacon-severity-opt.selected[data-sev='ux'] { border-color: var(--beacon-ux); color: var(--beacon-ux); }\n.beacon-severity-opt.selected[data-sev='a11y'] { border-color: var(--beacon-a11y); color: var(--beacon-a11y); }\n\n.beacon-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n.beacon-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n border-radius: 6px;\n border: 0;\n cursor: pointer;\n font: inherit;\n font-weight: 500;\n font-size: 13px;\n transition: opacity 0.15s ease;\n}\n.beacon-btn[disabled] { opacity: 0.5; cursor: not-allowed; }\n.beacon-btn svg { width: 14px; height: 14px; }\n.beacon-btn.primary { background: var(--beacon-accent); color: white; }\n.beacon-btn.secondary {\n background: transparent;\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n}\n.beacon-btn.secondary:hover { background: var(--beacon-border); }\n\n.beacon-status {\n font-size: 12px;\n color: var(--beacon-muted);\n text-align: center;\n padding: 4px;\n}\n.beacon-status.error { color: var(--beacon-bug); }\n.beacon-status.success { color: var(--beacon-idea); }\n\n.beacon-plugin-panel {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n}\n.beacon-plugin-panel-title {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--beacon-muted);\n font-weight: 600;\n}\n\n/* ── Pin list (domEle plugin) ─────────────────────────────── */\n.beacon-pin-list-header {\n font-size: 12px;\n color: var(--beacon-muted);\n font-weight: 500;\n}\n.beacon-pin-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n max-height: 200px;\n overflow-y: auto;\n}\n.beacon-pin-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px;\n background: var(--beacon-border);\n border-radius: 6px;\n}\n.beacon-pin-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--beacon-accent);\n color: white;\n font-size: 11px;\n font-weight: 600;\n flex-shrink: 0;\n}\n.beacon-pin-meta { flex: 1; min-width: 0; }\n.beacon-pin-selector {\n font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace;\n color: var(--beacon-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.beacon-pin-note-input {\n margin-top: 4px;\n width: 100%;\n padding: 4px 6px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 4px;\n font: inherit;\n font-size: 12px;\n box-sizing: border-box;\n}\n.beacon-pin-annotate { align-self: flex-start; }\n.beacon-thumb {\n width: 100%;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n display: block;\n}\n\n/* ── Captured runtime events chip (errors plugin form panel) ─── */\n.beacon-events {\n font-size: 12px;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n padding: 6px 8px;\n}\n.beacon-events-summary {\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--beacon-muted);\n user-select: none;\n}\n.beacon-events-summary::-webkit-details-marker { display: none; }\n.beacon-events-dot {\n color: var(--beacon-bug);\n font-size: 10px;\n line-height: 1;\n}\n.beacon-events-list {\n list-style: none;\n margin: 8px 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 160px;\n overflow-y: auto;\n}\n.beacon-events-item {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.4;\n}\n.beacon-events-kind {\n flex-shrink: 0;\n padding: 1px 5px;\n border-radius: 3px;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n.beacon-events-kind.error { background: hsl(0 84% 50% / 0.15); color: var(--beacon-bug); }\n.beacon-events-kind.rejection { background: hsl(38 92% 50% / 0.15); color: hsl(38 92% 50%); }\n.beacon-events-msg {\n word-break: break-word;\n color: var(--beacon-fg);\n}\n\n/* ── liveMonitor plugin panel ─────────────────────────────── */\n.beacon-monitor {\n padding: 0 0 4px;\n font-size: 12px;\n color: var(--beacon-fg);\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.beacon-monitor-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--beacon-muted);\n font-size: 11px;\n}\n.beacon-monitor-rec {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--beacon-bug);\n animation: beacon-rec-pulse 1.4s ease-in-out infinite;\n}\n@keyframes beacon-rec-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n.beacon-monitor-row {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n.beacon-monitor-input {\n flex: 1;\n font: inherit;\n padding: 6px 8px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n min-width: 0;\n box-sizing: border-box;\n}\n.beacon-monitor-input::placeholder { color: var(--beacon-muted); opacity: 0.7; }\n.beacon-monitor-input:focus {\n outline: 2px solid var(--beacon-accent);\n outline-offset: -1px;\n border-color: var(--beacon-accent);\n}\n.beacon-monitor-btn {\n font: inherit;\n padding: 6px 10px;\n border-radius: 6px;\n border: 1px solid var(--beacon-accent);\n background: var(--beacon-accent);\n color: white;\n cursor: pointer;\n font-weight: 500;\n}\n.beacon-monitor-btn:disabled { opacity: 0.4; cursor: not-allowed; }\n.beacon-monitor-btn.stop {\n background: transparent;\n color: var(--beacon-accent);\n}\n.beacon-monitor-help {\n color: var(--beacon-muted);\n font-size: 11px;\n}\n.beacon-monitor-active-url {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n color: var(--beacon-muted);\n word-break: break-all;\n background: hsl(0 0% 0% / 0.18);\n border-radius: 4px;\n padding: 4px 6px;\n}\n.beacon-monitor-verbose {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--beacon-muted);\n font-size: 11px;\n cursor: pointer;\n user-select: none;\n}\n\n.beacon-overlay-layer {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: calc(var(--beacon-z-index) + 1);\n}\n.beacon-overlay-layer > * { pointer-events: auto; }\n\n/* ── Body-mounted UI ──────────────────────────────────────\n Pin-popover and other overlays mount on document.body to escape transformed\n ancestors. Shadow DOM :host vars don't reach them, so we re-declare the\n variables here on each body-mounted root. */\n\n.beacon-pin-popover {\n --beacon-accent: #0ea5e9;\n --beacon-bg: #ffffff;\n --beacon-fg: #0f172a;\n --beacon-muted: #64748b;\n --beacon-border: #e2e8f0;\n --beacon-radius: 10px;\n --beacon-shadow: 0 10px 30px hsl(0 0% 0% / 0.15), 0 2px 6px hsl(0 0% 0% / 0.08);\n --beacon-bug: #ef4444;\n --beacon-idea: #22c55e;\n --beacon-ux: #a855f7;\n --beacon-a11y: #06b6d4;\n\n position: fixed;\n z-index: 2147483647;\n width: 240px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n box-shadow: var(--beacon-shadow);\n padding: 10px;\n display: none;\n flex-direction: column;\n gap: 8px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-size: 14px;\n line-height: 1.5;\n}\n.beacon-pin-popover.open { display: flex; }\n.beacon-pin-popover.beacon-theme-dark {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n}\n@media (prefers-color-scheme: dark) {\n .beacon-pin-popover.beacon-theme-auto {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n }\n}\n\n.beacon-pin-popover .beacon-pin-popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n}\n.beacon-pin-popover .beacon-pin-popover-actions {\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n}\n.beacon-pin-popover .beacon-pin-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--beacon-accent);\n color: white;\n font-size: 11px;\n font-weight: 600;\n flex-shrink: 0;\n}\n.beacon-pin-popover .beacon-icon-btn {\n background: transparent;\n border: 0;\n color: var(--beacon-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: inline-flex;\n}\n.beacon-pin-popover .beacon-icon-btn:hover { background: var(--beacon-border); color: var(--beacon-fg); }\n.beacon-pin-popover .beacon-icon-btn svg { width: 16px; height: 16px; }\n.beacon-pin-popover .beacon-textarea {\n width: 100%;\n min-height: 48px;\n padding: 6px 8px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n font: inherit;\n resize: vertical;\n box-sizing: border-box;\n}\n.beacon-pin-popover .beacon-textarea:focus {\n outline: 2px solid var(--beacon-accent);\n outline-offset: -1px;\n border-color: var(--beacon-accent);\n}\n.beacon-pin-popover .beacon-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 6px;\n border: 0;\n cursor: pointer;\n font: inherit;\n font-weight: 500;\n font-size: 13px;\n}\n.beacon-pin-popover .beacon-btn.primary { background: var(--beacon-accent); color: white; }\n.beacon-pin-popover .beacon-btn svg { width: 14px; height: 14px; }\n\n/* ── liveMonitor body-portal overlay ───────────────────────\n Dashed viewport frame + draggable status chip. Body-mounted (same reason as\n pick-mode-overlay), so the CSS var --beacon-monitor-accent is set inline on\n the frame and chip elements by the plugin — the shadow root's :host vars\n don't reach here. */\n\n@keyframes beacon-monitor-frame-pulse {\n 0%, 100% { opacity: 0.55; }\n 50% { opacity: 1; }\n}\n\n.beacon-monitor-overlay-frame {\n --beacon-monitor-accent: #10b981;\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 2147483646;\n border: 2px dashed var(--beacon-monitor-accent);\n border-radius: 4px;\n box-shadow: inset 0 0 56px color-mix(in srgb, var(--beacon-monitor-accent) 18%, transparent);\n box-sizing: border-box;\n animation: beacon-monitor-frame-pulse 2.4s ease-in-out infinite;\n}\n\n.beacon-monitor-overlay-chip {\n --beacon-monitor-accent: #10b981;\n position: fixed;\n z-index: 2147483647;\n pointer-events: auto;\n cursor: grab;\n user-select: none;\n background: #0f172a;\n color: #f1f5f9;\n border: 1px solid color-mix(in srgb, var(--beacon-monitor-accent) 50%, transparent);\n border-radius: 999px;\n padding: 6px 6px 6px 12px;\n box-shadow: 0 6px 20px hsl(0 0% 0% / 0.3);\n font: 500 12px/1.2 system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n letter-spacing: 0.01em;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 140px;\n max-width: min(360px, calc(100vw - 32px));\n touch-action: none;\n}\n.beacon-monitor-overlay-chip[data-dragging] { cursor: grabbing; }\n\n.beacon-monitor-overlay-chip-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.beacon-monitor-overlay-rec-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #ef4444;\n flex-shrink: 0;\n animation: beacon-rec-pulse 1.4s ease-in-out infinite;\n}\n\n.beacon-monitor-overlay-rec-label {\n font-weight: 700;\n letter-spacing: 0.06em;\n color: #ef4444;\n font-size: 11px;\n}\n\n.beacon-monitor-overlay-sep {\n color: #64748b;\n}\n\n.beacon-monitor-overlay-timer {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-variant-numeric: tabular-nums;\n font-size: 12px;\n flex: 1;\n min-width: 48px;\n}\n\n.beacon-monitor-overlay-stop {\n font: inherit;\n font-weight: 500;\n font-size: 11px;\n padding: 3px 10px;\n border-radius: 999px;\n background: var(--beacon-monitor-accent);\n color: #ffffff;\n border: 0;\n cursor: pointer;\n flex-shrink: 0;\n}\n.beacon-monitor-overlay-stop:hover {\n background: color-mix(in srgb, var(--beacon-monitor-accent) 85%, white);\n}\n\n.beacon-monitor-overlay-url {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 10px;\n color: #94a3b8;\n padding: 0 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n`;\n\nconst GLOBAL_STYLE_ID = 'launch-kit-beacon-portal-styles';\n\n/**\n * Ensure the body-mounted parts of the beacon UI (pin popover, pick-mode\n * overlay) have their stylesheet available in document.head. Idempotent across\n * re-init and HMR. Safe to call before document.head exists (early-returns).\n */\nexport function ensureBeaconBodyStyles(): void {\n if (typeof document === 'undefined' || !document.head) return;\n if (document.getElementById(GLOBAL_STYLE_ID)) return;\n const tag = document.createElement('style');\n tag.id = GLOBAL_STYLE_ID;\n tag.textContent = beaconStyles;\n document.head.appendChild(tag);\n}\n","// <launch-kit-beacon> custom element. Hosts the Shadow DOM tree:\n// - default trigger (slot replaceable)\n// - dialog (top-layer drawer)\n// - overlay layer (Shadow-DOM-internal overlay slot)\n//\n// Auto-injection: if init() runs without a tag in the DOM, the core appends a\n// hidden host. Module load only calls customElements.define — no other side effects.\n\nimport { beaconStyles } from './styles';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction iconMegaphone(): SVGElement {\n const s = document.createElementNS(SVG_NS, 'svg');\n s.setAttribute('viewBox', '0 0 24 24');\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '2');\n s.setAttribute('stroke-linecap', 'round');\n s.setAttribute('stroke-linejoin', 'round');\n const p1 = document.createElementNS(SVG_NS, 'path');\n p1.setAttribute('d', 'M3 11l18-5v12L3 14v-3z');\n const p2 = document.createElementNS(SVG_NS, 'path');\n p2.setAttribute('d', 'M11.6 16.8a3 3 0 1 1-5.8-1.6');\n s.appendChild(p1); s.appendChild(p2);\n return s;\n}\n\nexport const BEACON_TAG = 'launch-kit-beacon';\n\n// SSR guard: Next renders the AppHeader client component on the server during\n// the initial HTML pass, which evaluates this module's import graph in Node.\n// `HTMLElement` doesn't exist there, so a top-level `extends HTMLElement` throws\n// before defineBeaconElement() ever has a chance to early-return. Stand in with\n// a no-op base class on the server — the class is never instantiated there\n// (customElements.define is guarded), so the methods below are dead code.\nconst HTMLElementBase: typeof HTMLElement =\n typeof HTMLElement !== 'undefined'\n ? HTMLElement\n : (class {} as unknown as typeof HTMLElement);\n\nexport class LaunchKitBeacon extends HTMLElementBase {\n shadow!: ShadowRoot;\n triggerSlot!: HTMLSlotElement;\n defaultTrigger!: HTMLButtonElement;\n healthDot!: HTMLSpanElement;\n\n // Called by core.ts when a beacon is wired up; lets the element invoke show()\n // on click without having to import the core (avoids circular dep + lets the\n // singleton drive). Null until init() runs.\n onTriggerClick: (() => void) | null = null;\n\n connectedCallback() {\n if (this.shadow) return;\n this.shadow = this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = beaconStyles;\n this.shadow.appendChild(style);\n\n this.triggerSlot = document.createElement('slot');\n this.triggerSlot.name = 'trigger';\n this.shadow.appendChild(this.triggerSlot);\n\n this.defaultTrigger = document.createElement('button');\n this.defaultTrigger.type = 'button';\n this.defaultTrigger.className = 'beacon-default-trigger';\n this.defaultTrigger.appendChild(iconMegaphone());\n const text = document.createElement('span');\n text.textContent = 'Feedback';\n this.defaultTrigger.appendChild(text);\n\n this.healthDot = document.createElement('span');\n this.healthDot.className = 'beacon-health-dot';\n this.defaultTrigger.appendChild(this.healthDot);\n\n this.shadow.appendChild(this.defaultTrigger);\n this.defaultTrigger.addEventListener('click', () => this.onTriggerClick?.());\n\n this.triggerSlot.addEventListener('slotchange', () => {\n const assigned = this.triggerSlot.assignedElements();\n if (assigned.length > 0) {\n this.defaultTrigger.style.display = 'none';\n for (const el of assigned) {\n el.addEventListener('click', () => this.onTriggerClick?.());\n }\n } else {\n this.defaultTrigger.style.display = '';\n }\n });\n\n if (!this.hasAttribute('position')) this.setAttribute('position', 'bottom-right');\n if (!this.hasAttribute('theme')) this.setAttribute('theme', 'auto');\n }\n\n setTriggerLabel(label: string) {\n if (!this.defaultTrigger) return;\n const span = this.defaultTrigger.querySelector('span');\n if (span) span.textContent = label;\n }\n\n setHealthIndicator(visible: boolean) {\n this.healthDot?.classList.toggle('visible', visible);\n }\n}\n\n/**\n * Register the custom element. Guarded so HMR re-imports don't throw.\n * The only module-load side effect — no listeners, no globals.\n */\nexport function defineBeaconElement(): void {\n if (typeof window === 'undefined' || typeof customElements === 'undefined') return;\n if (!customElements.get(BEACON_TAG)) {\n customElements.define(BEACON_TAG, LaunchKitBeacon);\n }\n}\n","// BeaconCtx factory — one ctx per (plugin, init-cycle).\n//\n// captureSignal() reads the core's _currentSubmit slot at call time, so plugins\n// that capture the signal in a setupOnce closure correctly get `undefined`\n// outside an active submit. ctx.signal is per-init and aborts on re-init/destroy.\n\nimport type {\n BeaconCtx,\n BeaconLifecycleEvent,\n Mode,\n PluginEntry,\n} from './types';\n\nexport interface CtxHost {\n // Captured plugin entries from earlier in the current submit. Empty between submits.\n getCaptured(name: string): PluginEntry | undefined;\n // Mutable form-values bucket scoped to this (plugin, init-cycle).\n getFormValues(pluginName: string): Record<string, unknown>;\n // Current-submit AbortSignal — undefined outside submit.\n getCaptureSignal(): AbortSignal | undefined;\n // Per-init signal — aborts on init() re-call, destroy(), or page navigation.\n getInitSignal(): AbortSignal;\n // Mode mediation (the drawer toggles chrome / closes-reopens dialog).\n requestMode(mode: Mode): Promise<() => void>;\n // Non-modal overlay inside shadow DOM, outside the <dialog>.\n overlay(opts: { render: (slot: HTMLElement) => void | (() => void) }): () => void;\n // Subscribe to per-submit lifecycle events.\n onLifecycle(\n ev: 'open' | 'close' | 'beforeSubmit' | 'afterSubmit',\n handler: (e: BeaconLifecycleEvent) => void,\n ): () => void;\n}\n\nexport function createCtx(pluginName: string, host: CtxHost): BeaconCtx {\n return {\n pluginName,\n captured: (name) => host.getCaptured(name),\n get formValues() { return host.getFormValues(pluginName); },\n requestMode: (mode) => host.requestMode(mode),\n overlay: (opts) => host.overlay(opts),\n on: (ev, handler) => host.onLifecycle(ev, handler),\n get signal() { return host.getInitSignal(); },\n captureSignal: () => host.getCaptureSignal(),\n };\n}\n","// Plugin registry: name uniqueness, capture pipeline with auto-wrap per §6.\n\nimport type {\n BeaconCtx,\n BeaconPlugin,\n PluginEntry,\n PluginStatus,\n} from './types';\n\nexport class DuplicatePluginNameError extends Error {\n constructor(name: string) {\n super(`Duplicate plugin name: \"${name}\"`);\n this.name = 'DuplicatePluginNameError';\n }\n}\n\nexport interface RegisteredPlugin {\n plugin: BeaconPlugin;\n ctx: BeaconCtx;\n status: PluginStatus;\n teardown?: () => void;\n}\n\nexport interface PluginErrorReport {\n plugin: string;\n error: Error;\n at: 'setupOnce' | 'capture' | 'form';\n}\n\nexport interface Registry {\n readonly entries: RegisteredPlugin[];\n install(makeCtx: (name: string) => BeaconCtx, onError: (e: PluginErrorReport) => void): void;\n destroy(): void;\n capture(getCaptured: (name: string) => PluginEntry | undefined, onError: (e: PluginErrorReport) => void): Promise<Record<string, PluginEntry>>;\n status(): Record<string, PluginStatus>;\n}\n\nexport function createRegistry(plugins: BeaconPlugin[]): Registry {\n const seen = new Set<string>();\n for (const p of plugins) {\n if (seen.has(p.name)) throw new DuplicatePluginNameError(p.name);\n seen.add(p.name);\n }\n\n const entries: RegisteredPlugin[] = plugins.map((plugin) => ({\n plugin,\n // Placeholder; install() rebinds with the real ctx factory.\n ctx: null as unknown as BeaconCtx,\n status: { state: 'active', failures: 0 },\n }));\n\n return {\n entries,\n\n install(makeCtx, onError) {\n for (const e of entries) {\n e.ctx = makeCtx(e.plugin.name);\n if (!e.plugin.setupOnce) continue;\n try {\n const teardown = e.plugin.setupOnce(e.ctx);\n if (typeof teardown === 'function') e.teardown = teardown;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n e.status = {\n state: 'failed',\n failures: e.status.failures + 1,\n error: { message: error.message, ...(error.stack ? { stack: error.stack } : {}), at: 'setupOnce' },\n };\n onError({ plugin: e.plugin.name, error, at: 'setupOnce' });\n }\n }\n },\n\n destroy() {\n for (const e of entries) {\n try { e.teardown?.(); } catch { /* swallow */ }\n e.teardown = undefined;\n }\n },\n\n async capture(_getCaptured, onError) {\n const out: Record<string, PluginEntry> = {};\n for (const e of entries) {\n if (!e.plugin.capture) continue;\n try {\n const result = await e.plugin.capture(e.ctx);\n const entry = wrapResult(result, e.plugin.version);\n if (entry !== null) {\n out[e.plugin.name] = entry;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n out[e.plugin.name] = wrapFailure(error);\n e.status = {\n state: 'failed',\n failures: e.status.failures + 1,\n error: { message: error.message, ...(error.stack ? { stack: error.stack } : {}), at: 'capture' },\n };\n onError({ plugin: e.plugin.name, error, at: 'capture' });\n }\n }\n return out;\n },\n\n status() {\n const out: Record<string, PluginStatus> = {};\n for (const e of entries) {\n out[e.plugin.name] = e.status;\n }\n return out;\n },\n };\n}\n\n/**\n * Auto-wrap rule (§6):\n * plain object → { v, ...result }\n * primitive / array → { v, value: result }\n * null / undefined → null (caller omits the entry)\n * thrown / rejected → handled by caller via wrapFailure\n */\nexport function wrapResult(result: unknown, version?: number): PluginEntry | null {\n if (result === null || result === undefined) return null;\n const v = version ?? 1;\n if (Array.isArray(result) || typeof result !== 'object') {\n return { v, value: result };\n }\n // Plain object — spread into the entry, force v even if the plugin tried to set it.\n return { ...(result as Record<string, unknown>), v };\n}\n\nexport function wrapFailure(error: Error): PluginEntry {\n return {\n error: error.message,\n ...(error.stack ? { stack: error.stack } : {}),\n };\n}\n","// POST per §9. Per-submit AbortSignal lets the drawer cancel an in-flight send.\n\nimport type { FeedbackPayload, HeadersConfig, TransportResponse } from './types';\n\nexport async function postFeedback(\n endpoint: string,\n payload: FeedbackPayload,\n headers: HeadersConfig | undefined,\n signal: AbortSignal,\n credentials: RequestCredentials = 'omit',\n): Promise<TransportResponse> {\n const resolvedHeaders: Record<string, string> = await resolveHeaders(headers);\n const response = await fetch(endpoint, {\n method: 'POST',\n credentials,\n headers: { 'Content-Type': 'application/json', ...resolvedHeaders },\n body: JSON.stringify(payload),\n signal,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n const body: unknown = contentType.includes('application/json')\n ? await response.json().catch(() => null)\n : await response.text();\n\n return { ok: response.ok, status: response.status, body };\n}\n\nasync function resolveHeaders(headers: HeadersConfig | undefined): Promise<Record<string, string>> {\n if (!headers) return {};\n if (typeof headers === 'function') {\n const result = await headers();\n return result ?? {};\n }\n return headers;\n}\n","// Declarative form renderer. Renders 6 field types (§4.2) into a slot,\n// reading/writing the per-plugin `formValues` namespace via the provided getter/setter.\n//\n// Imperative escape lives in the caller (dialog.ts) — if a plugin returns\n// `{ render }` instead of `{ fields }`, that branch invokes render(slot, ctx) directly.\n\nimport type { FormField } from '../types';\n\nexport interface FieldHost {\n get(name: string): unknown;\n set(name: string, value: unknown): void;\n}\n\nexport function renderFields(slot: HTMLElement, fields: FormField[], host: FieldHost): void {\n for (const field of fields) {\n const wrap = document.createElement('div');\n wrap.className = 'beacon-field';\n\n if (field.label) {\n const label = document.createElement('label');\n label.className = 'beacon-label';\n label.textContent = field.label;\n wrap.appendChild(label);\n }\n if (field.description) {\n const desc = document.createElement('div');\n desc.className = 'beacon-description';\n desc.textContent = field.description;\n wrap.appendChild(desc);\n }\n\n const control = renderControl(field, host);\n wrap.appendChild(control);\n slot.appendChild(wrap);\n }\n}\n\nfunction renderControl(field: FormField, host: FieldHost): HTMLElement {\n const current = host.get(field.name);\n\n switch (field.type) {\n case 'toggle': {\n const root = document.createElement('label');\n root.className = 'beacon-toggle';\n const input = document.createElement('input');\n input.type = 'checkbox';\n input.checked = (current as boolean | undefined) ?? field.defaultValue ?? false;\n input.addEventListener('change', () => host.set(field.name, input.checked));\n root.appendChild(input);\n host.set(field.name, input.checked);\n return root;\n }\n\n case 'text': {\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'beacon-input';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? '');\n input.value = initial;\n if (field.placeholder) input.placeholder = field.placeholder;\n input.addEventListener('input', () => host.set(field.name, input.value));\n host.set(field.name, initial);\n return input;\n }\n\n case 'textarea': {\n const ta = document.createElement('textarea');\n ta.className = 'beacon-textarea';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? '');\n ta.value = initial;\n if (field.placeholder) ta.placeholder = field.placeholder;\n if (field.rows) ta.rows = field.rows;\n ta.addEventListener('input', () => host.set(field.name, ta.value));\n host.set(field.name, initial);\n return ta;\n }\n\n case 'select': {\n const sel = document.createElement('select');\n sel.className = 'beacon-select';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? field.options[0]?.value ?? '');\n for (const opt of field.options) {\n const o = document.createElement('option');\n o.value = opt.value;\n o.textContent = opt.label ?? opt.value;\n if (opt.value === initial) o.selected = true;\n sel.appendChild(o);\n }\n sel.addEventListener('change', () => host.set(field.name, sel.value));\n host.set(field.name, initial);\n return sel;\n }\n\n case 'radio': {\n const group = document.createElement('div');\n group.className = 'beacon-radio-group';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? field.options[0]?.value ?? '');\n for (const opt of field.options) {\n const label = document.createElement('label');\n label.className = 'beacon-radio-opt';\n const input = document.createElement('input');\n input.type = 'radio';\n input.name = field.name;\n input.value = opt.value;\n if (opt.value === initial) input.checked = true;\n input.addEventListener('change', () => host.set(field.name, opt.value));\n const span = document.createElement('span');\n span.textContent = opt.label ?? opt.value;\n label.appendChild(input);\n label.appendChild(span);\n group.appendChild(label);\n }\n host.set(field.name, initial);\n return group;\n }\n\n case 'number': {\n const input = document.createElement('input');\n input.type = 'number';\n input.className = 'beacon-input';\n const initial = (current as number | undefined) ?? field.defaultValue;\n if (initial !== undefined) input.value = String(initial);\n if (field.min !== undefined) input.min = String(field.min);\n if (field.max !== undefined) input.max = String(field.max);\n if (field.step !== undefined) input.step = String(field.step);\n input.addEventListener('input', () => {\n const v = input.value === '' ? undefined : Number(input.value);\n host.set(field.name, v);\n });\n if (initial !== undefined) host.set(field.name, initial);\n return input;\n }\n }\n}\n","// Drawer dialog. Owns the <dialog> element opened via showModal() (top layer)\n// so it escapes any transformed/blurred ancestor without portal hacks.\n//\n// Mode mediation:\n// pickElement → dialog.close() so pointer events reach host page; restored via showModal()\n// minimize / hide → keep dialog open, hide chrome (toggle inner visibility)\n//\n// Reference-counted per mode so overlapping plugin requests compose cleanly.\n\nimport type {\n BeaconPlugin,\n DeclarativeForm,\n FormField,\n ImperativeForm,\n LabelMap,\n Mode,\n Severity,\n BeaconCtx,\n} from '../types';\nimport { renderFields } from './form';\n\nexport interface DialogCallbacks {\n onSubmit(): void;\n onClose(reason: 'user' | 'submitted'): void;\n}\n\nexport interface PluginPanelSource {\n name: string;\n form: DeclarativeForm | ImperativeForm;\n ctx: BeaconCtx;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction iconClose(): SVGElement {\n const s = document.createElementNS(SVG_NS, 'svg');\n s.setAttribute('viewBox', '0 0 24 24');\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '2');\n s.setAttribute('stroke-linecap', 'round');\n s.setAttribute('stroke-linejoin', 'round');\n const p1 = document.createElementNS(SVG_NS, 'line');\n p1.setAttribute('x1', '18'); p1.setAttribute('y1', '6'); p1.setAttribute('x2', '6'); p1.setAttribute('y2', '18');\n const p2 = document.createElementNS(SVG_NS, 'line');\n p2.setAttribute('x1', '6'); p2.setAttribute('y1', '6'); p2.setAttribute('x2', '18'); p2.setAttribute('y2', '18');\n s.appendChild(p1); s.appendChild(p2);\n return s;\n}\n\nexport class DialogView {\n readonly root: HTMLDialogElement;\n private inner: HTMLDivElement;\n private pluginSlot: HTMLDivElement;\n private statusEl: HTMLDivElement;\n private submitBtn: HTMLButtonElement;\n private descTextarea: HTMLTextAreaElement;\n private severitySelected: Severity = 'bug';\n private severitiesContainer!: HTMLDivElement;\n private modeCounts: Record<Mode, number> = { minimize: 0, hide: 0, pickElement: 0 };\n private pluginCleanups: Array<() => void> = [];\n // Track the last focused element so showModal() can restore focus on pickElement release.\n private lastActive: HTMLElement | null = null;\n // Bypasses the discard-confirmation guard for the 1.5s lingering success\n // state — clicking X during \"Sent — thanks!\" shouldn't prompt the user.\n private submitSucceeded = false;\n // Per the HTML spec, `dialog.close()` fires the `close` event via a queued\n // task — async, not sync. A synchronous boolean flag (`= true; close(); = false`)\n // closes before the event fires. Track the number of in-flight programmatic\n // closes we want to suppress; the close listener decrements + skips one per\n // event. Survives whatever microtask the spec chooses.\n private expectedSuppressedCloses = 0;\n\n constructor(\n private labels: LabelMap,\n private severities: Severity[],\n private callbacks: DialogCallbacks,\n ) {\n this.root = document.createElement('dialog');\n this.root.className = 'beacon-dialog';\n\n this.inner = document.createElement('div');\n this.inner.className = 'beacon-dialog-inner';\n this.root.appendChild(this.inner);\n\n // ── Header ──────────────────────────────────────\n const header = document.createElement('div');\n header.className = 'beacon-drawer-header';\n const title = document.createElement('div');\n title.className = 'beacon-drawer-title';\n title.textContent = labels.drawerTitle;\n header.appendChild(title);\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'beacon-icon-btn';\n closeBtn.setAttribute('aria-label', labels.closeButton);\n closeBtn.appendChild(iconClose());\n closeBtn.addEventListener('click', () => this.userCloseAttempt());\n header.appendChild(closeBtn);\n this.inner.appendChild(header);\n\n // Intercept Esc-close via the dialog's `cancel` event. If there's unsaved\n // user input, preventDefault and prompt — otherwise let the native close\n // proceed.\n this.root.addEventListener('cancel', (e) => {\n if (this.submitSucceeded) return;\n if (!this.hasUnsavedInput()) return;\n e.preventDefault();\n // eslint-disable-next-line no-alert\n if (window.confirm('You have unsaved feedback. Discard?')) {\n this.root.close();\n }\n });\n\n // ── Body ──────────────────────────────────────\n const body = document.createElement('div');\n body.className = 'beacon-drawer-body';\n this.inner.appendChild(body);\n\n // Description (core, always present).\n const descField = document.createElement('div');\n descField.className = 'beacon-field';\n const descLabel = document.createElement('label');\n descLabel.className = 'beacon-label';\n descLabel.textContent = labels.descriptionLabel;\n this.descTextarea = document.createElement('textarea');\n this.descTextarea.className = 'beacon-textarea';\n this.descTextarea.placeholder = labels.descriptionPlaceholder;\n this.descTextarea.rows = 4;\n descField.appendChild(descLabel);\n descField.appendChild(this.descTextarea);\n body.appendChild(descField);\n\n // Severity (core, always present).\n const sevField = document.createElement('div');\n sevField.className = 'beacon-field';\n const sevLabel = document.createElement('label');\n sevLabel.className = 'beacon-label';\n sevLabel.textContent = labels.severityLabel;\n this.severitiesContainer = document.createElement('div');\n this.severitiesContainer.className = 'beacon-severity';\n for (const sev of severities) {\n const opt = document.createElement('label');\n opt.className = 'beacon-severity-opt';\n opt.dataset.sev = sev;\n const input = document.createElement('input');\n input.type = 'radio';\n input.name = 'beacon-severity';\n input.value = sev;\n if (sev === this.severitySelected) {\n input.checked = true;\n opt.classList.add('selected');\n }\n input.addEventListener('change', () => this.setSeverity(sev));\n opt.appendChild(input);\n opt.appendChild(document.createTextNode(this.severityLabel(sev)));\n this.severitiesContainer.appendChild(opt);\n }\n sevField.appendChild(sevLabel);\n sevField.appendChild(this.severitiesContainer);\n body.appendChild(sevField);\n\n // ── Plugin panels ──────────────────────────────────────\n this.pluginSlot = document.createElement('div');\n this.pluginSlot.className = 'beacon-plugin-panels';\n body.appendChild(this.pluginSlot);\n\n // ── Status + actions ──────────────────────────────────────\n this.statusEl = document.createElement('div');\n this.statusEl.className = 'beacon-status';\n body.appendChild(this.statusEl);\n\n const actions = document.createElement('div');\n actions.className = 'beacon-actions';\n this.submitBtn = document.createElement('button');\n this.submitBtn.type = 'button';\n this.submitBtn.className = 'beacon-btn primary';\n this.submitBtn.textContent = labels.send;\n this.submitBtn.addEventListener('click', () => this.callbacks.onSubmit());\n actions.appendChild(this.submitBtn);\n body.appendChild(actions);\n\n // Esc / backdrop default close → treat as user close. Mode-triggered\n // closes (pickElement) suppress this so the panels survive the transition.\n this.root.addEventListener('close', () => {\n if (this.expectedSuppressedCloses > 0) {\n this.expectedSuppressedCloses -= 1;\n return;\n }\n this.callbacks.onClose('user');\n });\n }\n\n // ── Mode handling (§5) ──────────────────────────────────────────\n\n async requestMode(mode: Mode): Promise<() => void> {\n this.modeCounts[mode] += 1;\n if (this.modeCounts[mode] === 1) {\n this.applyMode(mode, true);\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.modeCounts[mode] -= 1;\n if (this.modeCounts[mode] === 0) {\n this.applyMode(mode, false);\n }\n };\n }\n\n private applyMode(mode: Mode, on: boolean) {\n switch (mode) {\n case 'pickElement': {\n if (on) {\n this.lastActive = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n if (this.root.open) {\n // Increment BEFORE calling close — the queued close event will\n // decrement when it eventually fires, skipping onClose.\n this.expectedSuppressedCloses += 1;\n this.root.close();\n }\n } else {\n if (!this.root.open) this.tryShowModal();\n this.lastActive?.focus?.();\n }\n break;\n }\n case 'hide': {\n this.inner.style.visibility = on ? 'hidden' : '';\n this.root.style.opacity = on ? '0' : '';\n break;\n }\n case 'minimize': {\n // Keep header visible, hide body.\n const body = this.inner.querySelector<HTMLElement>('.beacon-drawer-body');\n if (body) body.style.display = on ? 'none' : '';\n break;\n }\n }\n }\n\n // ── Public surface ──────────────────────────────────────────\n\n open() {\n if (this.root.open) return;\n this.tryShowModal();\n }\n\n close(reason: 'user' | 'submitted' = 'user') {\n if (this.root.open) {\n this.root.close();\n }\n // Even if not open, ensure modes reset and panel cleanups run.\n if (reason === 'submitted') this.statusEl.textContent = '';\n }\n\n private userCloseAttempt() {\n if (!this.submitSucceeded && this.hasUnsavedInput()) {\n // eslint-disable-next-line no-alert\n if (!window.confirm('You have unsaved feedback. Discard?')) return;\n }\n if (this.root.open) this.root.close();\n }\n\n private hasUnsavedInput(): boolean {\n return this.descTextarea.value.trim().length > 0;\n }\n\n setSubmitSucceeded(value: boolean) {\n this.submitSucceeded = value;\n }\n\n getDescription(): string {\n return this.descTextarea.value;\n }\n setDescription(v: string) {\n this.descTextarea.value = v;\n }\n\n getSeverity(): Severity {\n return this.severitySelected;\n }\n setSeverity(sev: Severity) {\n this.severitySelected = sev;\n for (const opt of Array.from(this.severitiesContainer.children) as HTMLElement[]) {\n opt.classList.toggle('selected', opt.dataset.sev === sev);\n const input = opt.querySelector('input');\n if (input) input.checked = opt.dataset.sev === sev;\n }\n }\n\n setStatus(text: string, kind: 'idle' | 'error' | 'success' = 'idle') {\n this.statusEl.textContent = text;\n this.statusEl.classList.remove('error', 'success');\n if (kind !== 'idle') this.statusEl.classList.add(kind);\n }\n\n setSubmitting(submitting: boolean) {\n this.submitBtn.disabled = submitting;\n this.submitBtn.textContent = submitting ? this.labels.sending : this.labels.send;\n }\n\n // Reset drawer state after a successful submit so the next open() starts fresh.\n resetState() {\n this.descTextarea.value = '';\n this.setStatus('', 'idle');\n this.setSubmitting(false);\n this.submitSucceeded = false;\n if (this.severities[0]) this.setSeverity(this.severities[0]);\n }\n\n // ── Plugin panel management ──────────────────────────────────────\n\n installPluginPanels(sources: PluginPanelSource[], formValuesHost: {\n get(plugin: string, name: string): unknown;\n set(plugin: string, name: string, value: unknown): void;\n }): void {\n this.clearPluginPanels();\n for (const src of sources) {\n const panel = document.createElement('div');\n panel.className = 'beacon-plugin-panel';\n\n if (src.form.title) {\n const titleEl = document.createElement('div');\n titleEl.className = 'beacon-plugin-panel-title';\n titleEl.textContent = src.form.title;\n panel.appendChild(titleEl);\n }\n\n if ('fields' in src.form) {\n renderFields(panel, src.form.fields as FormField[], {\n get: (name) => formValuesHost.get(src.name, name),\n set: (name, value) => formValuesHost.set(src.name, name, value),\n });\n } else {\n const cleanup = src.form.render(panel, src.ctx);\n if (typeof cleanup === 'function') this.pluginCleanups.push(cleanup);\n }\n\n this.pluginSlot.appendChild(panel);\n }\n }\n\n clearPluginPanels(): void {\n for (const fn of this.pluginCleanups) {\n try { fn(); } catch { /* swallow */ }\n }\n this.pluginCleanups = [];\n this.pluginSlot.innerHTML = '';\n }\n\n private severityLabel(sev: Severity): string {\n switch (sev) {\n case 'bug': return this.labels.severityBug;\n case 'idea': return this.labels.severityIdea;\n case 'ux': return this.labels.severityUx;\n case 'a11y': return this.labels.severityA11y;\n }\n }\n\n private tryShowModal() {\n try {\n this.root.showModal();\n } catch {\n // Browsers below baseline: fall back to non-modal. Drawer is visible but doesn't escape\n // ancestor containment — internal-use only, our app supports modern browsers.\n this.root.show();\n }\n }\n}\n\nexport function defaultLabels(): LabelMap {\n return {\n triggerButton: 'Feedback',\n drawerTitle: 'Send feedback',\n closeButton: 'Close',\n send: 'Send',\n sending: 'Sending…',\n sentSuccess: 'Sent — thanks!',\n descriptionLabel: 'Description',\n descriptionPlaceholder: 'What happened?',\n severityLabel: 'Severity',\n severityBug: 'bug',\n severityIdea: 'idea',\n severityUx: 'ux',\n severityA11y: 'a11y',\n };\n}\n\n// Re-exporting BeaconPlugin so dialog consumers don't have to round-trip through types.\nexport type { BeaconPlugin };\n","// Shadow-DOM-internal overlay layer. Plugins paint floating UI here during\n// `requestMode('pickElement')` when the <dialog> is temporarily closed.\n//\n// Each overlay() call appends a slot element and returns a destroy fn that\n// removes it. Overlays survive dialog open/close (they live in the shadow root,\n// not the <dialog>) so plugins can keep painting through mode transitions.\n\nexport interface OverlayHost {\n layer: HTMLElement;\n}\n\nexport function createOverlayHost(shadow: ShadowRoot): OverlayHost {\n const layer = document.createElement('div');\n layer.className = 'beacon-overlay-layer';\n shadow.appendChild(layer);\n return { layer };\n}\n\nexport function attachOverlay(\n host: OverlayHost,\n render: (slot: HTMLElement) => void | (() => void),\n): () => void {\n const slot = document.createElement('div');\n host.layer.appendChild(slot);\n let cleanup: void | (() => void);\n try {\n cleanup = render(slot);\n } catch (err) {\n slot.remove();\n throw err;\n }\n return () => {\n try { cleanup?.(); } catch { /* swallow */ }\n if (slot.parentNode) slot.parentNode.removeChild(slot);\n };\n}\n","// metadata plugin — payload metadata is already captured by core.assemblePayload\n// from window.* APIs. This plugin contributes an optional `uaData` block (Client\n// Hints) so high-entropy UA data lands in payload.plugins.metadata.uaData when\n// available — without making it part of the core required payload.\n\nimport type { BeaconPlugin } from '../types';\n\ninterface UADataLike {\n brands: Array<{ brand: string; version: string }>;\n mobile: boolean;\n platform: string;\n}\n\nfunction getUaData(): { brand: string; mobile: boolean; platform: string } | undefined {\n const nav = navigator as Navigator & { userAgentData?: UADataLike };\n if (!nav.userAgentData) return undefined;\n const brand = nav.userAgentData.brands.find((b) => !/Not[.\\-]?A.?Brand/i.test(b.brand))?.brand\n ?? nav.userAgentData.brands[0]?.brand\n ?? 'unknown';\n return {\n brand,\n mobile: nav.userAgentData.mobile,\n platform: nav.userAgentData.platform,\n };\n}\n\nexport function metadata(): BeaconPlugin {\n return {\n name: 'metadata',\n capture() {\n const uaData = getUaData();\n return uaData ? { uaData } : null;\n },\n };\n}\n","// Bounded ring buffer for runtime errors + unhandled rejections. Owned by the\n// errors plugin instance (not a module-level singleton — install/teardown cleanly\n// across init() re-calls).\n\nexport interface CapturedRuntimeEvent {\n ts: number;\n kind: 'error' | 'unhandledrejection';\n message: string;\n stack?: string;\n source?: string;\n line?: number;\n col?: number;\n}\n\nconst MAX_EVENTS = 30;\nconst MESSAGE_LIMIT = 500;\nconst STACK_LIMIT = 2000;\nconst SOURCE_LIMIT = 500;\nconst DEDUPE_WINDOW_MS = 5000;\n\nconst BEACON_STACK_PATTERN = /launch-kit-beacon|beacon\\.(?:es|umd|mjs)|\\/beacon\\//i;\n\nfunction trunc(value: string | undefined, limit: number): string | undefined {\n if (!value) return undefined;\n return value.length > limit ? value.slice(0, limit) : value;\n}\n\nfunction signature(message: string, stack: string | undefined): string {\n const stackHead = stack?.split('\\n').slice(0, 3).join('|') ?? '';\n return `${message}::${stackHead}`;\n}\n\nfunction fromBeacon(stack: string | undefined): boolean {\n return !!stack && BEACON_STACK_PATTERN.test(stack);\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value).slice(0, MESSAGE_LIMIT);\n } catch {\n return String(value);\n }\n}\n\nexport interface EventBuffer {\n install(): () => void;\n snapshot(): CapturedRuntimeEvent[];\n subscribe(fn: () => void): () => void;\n}\n\nexport function createEventBuffer(): EventBuffer {\n const buffer: CapturedRuntimeEvent[] = [];\n const recentSignatures = new Map<string, number>();\n const listeners = new Set<() => void>();\n let installed = false;\n let onError: ((e: ErrorEvent) => void) | undefined;\n let onRejection: ((e: PromiseRejectionEvent) => void) | undefined;\n\n function push(event: CapturedRuntimeEvent): void {\n if (fromBeacon(event.stack)) return;\n if (event.kind === 'unhandledrejection' && /AbortError/i.test(event.message)) return;\n const sig = signature(event.message, event.stack);\n const last = recentSignatures.get(sig);\n if (last !== undefined && event.ts - last < DEDUPE_WINDOW_MS) {\n recentSignatures.set(sig, event.ts);\n return;\n }\n recentSignatures.set(sig, event.ts);\n buffer.push(event);\n if (buffer.length > MAX_EVENTS) buffer.shift();\n for (const fn of listeners) {\n try { fn(); } catch { /* swallow */ }\n }\n }\n\n return {\n install(): () => void {\n if (installed) return () => {};\n if (typeof window === 'undefined') return () => {};\n installed = true;\n\n onError = (e: ErrorEvent) => {\n try {\n const errMessage = e.error instanceof Error ? e.error.message : undefined;\n const errStack = e.error instanceof Error ? e.error.stack : undefined;\n push({\n ts: Date.now(),\n kind: 'error',\n message: trunc(e.message || errMessage || 'Unknown error', MESSAGE_LIMIT) ?? 'Unknown error',\n ...(errStack ? { stack: trunc(errStack, STACK_LIMIT)! } : {}),\n ...(e.filename ? { source: trunc(e.filename, SOURCE_LIMIT)! } : {}),\n ...(Number.isFinite(e.lineno) ? { line: e.lineno } : {}),\n ...(Number.isFinite(e.colno) ? { col: e.colno } : {}),\n });\n } catch { /* never throw */ }\n };\n\n onRejection = (e: PromiseRejectionEvent) => {\n try {\n const reason: unknown = e.reason;\n const message = reason instanceof Error\n ? reason.message\n : typeof reason === 'string'\n ? reason\n : safeStringify(reason);\n const stack = reason instanceof Error ? reason.stack : undefined;\n push({\n ts: Date.now(),\n kind: 'unhandledrejection',\n message: trunc(message || 'Unknown rejection', MESSAGE_LIMIT) ?? 'Unknown rejection',\n ...(stack ? { stack: trunc(stack, STACK_LIMIT)! } : {}),\n });\n } catch { /* never throw */ }\n };\n\n window.addEventListener('error', onError);\n window.addEventListener('unhandledrejection', onRejection);\n\n return () => {\n if (onError) window.removeEventListener('error', onError);\n if (onRejection) window.removeEventListener('unhandledrejection', onRejection);\n installed = false;\n listeners.clear();\n };\n },\n\n snapshot(): CapturedRuntimeEvent[] {\n return buffer.slice();\n },\n\n subscribe(fn: () => void): () => void {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n },\n };\n}\n","// errors plugin — installs runtime `error` + `unhandledrejection` listeners at\n// setupOnce so the buffer fills before the user clicks Send.\n//\n// Two surfaces:\n// • form() renders an expandable chip in the drawer showing what was\n// captured (\"3 runtime errors captured\" → click to expand the list).\n// Live-updates as new errors fire while the drawer is open.\n// • capture() drains the snapshot into payload.plugins.errors.events.\n\nimport { createEventBuffer, type CapturedRuntimeEvent, type EventBuffer } from '../internal/event-buffer';\nimport type { BeaconPlugin } from '../types';\n\nexport function errors(): BeaconPlugin {\n let buffer: EventBuffer | null = null;\n\n return {\n name: 'errors',\n setupOnce(ctx) {\n buffer = createEventBuffer();\n const uninstall = buffer.install();\n ctx.signal.addEventListener('abort', uninstall, { once: true });\n return uninstall;\n },\n form() {\n return {\n render: (slot) => {\n // `slot` IS the per-plugin .beacon-plugin-panel div — hide it directly\n // when there are no events so the drawer doesn't carry an empty padded\n // box (and an empty red dot). Don't read slot.parentElement: at first\n // render() time the slot isn't attached yet, so the lookup is null.\n const wrapper = document.createElement('details');\n wrapper.className = 'beacon-events';\n\n const summary = document.createElement('summary');\n summary.className = 'beacon-events-summary';\n const dot = document.createElement('span');\n dot.className = 'beacon-events-dot';\n dot.textContent = '●';\n const label = document.createElement('span');\n label.className = 'beacon-events-label';\n summary.appendChild(dot);\n summary.appendChild(label);\n wrapper.appendChild(summary);\n\n const list = document.createElement('ul');\n list.className = 'beacon-events-list';\n wrapper.appendChild(list);\n slot.appendChild(wrapper);\n\n function update() {\n const events: CapturedRuntimeEvent[] = buffer?.snapshot() ?? [];\n const count = events.length;\n if (count === 0) {\n slot.style.display = 'none';\n return;\n }\n slot.style.display = '';\n label.textContent = `${count} runtime error${count !== 1 ? 's' : ''} captured`;\n list.innerHTML = '';\n for (const ev of events) {\n const li = document.createElement('li');\n li.className = 'beacon-events-item';\n const kind = document.createElement('span');\n kind.className = `beacon-events-kind ${ev.kind === 'unhandledrejection' ? 'rejection' : 'error'}`;\n kind.textContent = ev.kind === 'unhandledrejection' ? 'REJ' : 'ERR';\n const msg = document.createElement('span');\n msg.className = 'beacon-events-msg';\n msg.textContent = ev.message;\n li.appendChild(kind);\n li.appendChild(msg);\n list.appendChild(li);\n }\n }\n\n update();\n const unsub = buffer?.subscribe(update);\n return () => { unsub?.(); };\n },\n };\n },\n capture() {\n const events: CapturedRuntimeEvent[] = buffer?.snapshot() ?? [];\n if (events.length === 0) return null;\n return { events };\n },\n };\n}\n","// Build a unique-ish CSS selector path by walking up the parent chain.\n// Strategy per ancestor: id (if unique) → tag.classes (if unique among siblings) → tag:nth-of-type(n).\n// When the walk crosses an open shadow root boundary, the path is joined\n// with \" >> \" to make the boundary explicit (non-standard but informative\n// — selectors aren't expected to be replay-valid querySelector inputs).\n\nconst MAX_DEPTH = 8;\nconst SHADOW_SEPARATOR = ' >> ';\n\nfunction isUniqueId(id: string, root: Document | ShadowRoot = document): boolean {\n if (!id) return false;\n try {\n return root.querySelectorAll(`#${CSS.escape(id)}`).length === 1;\n } catch {\n return false;\n }\n}\n\nfunction tagWithClasses(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const classes = Array.from(el.classList)\n .filter((c) => c.length > 0 && c.length < 40)\n .slice(0, 3)\n .map((c) => `.${CSS.escape(c)}`)\n .join('');\n return tag + classes;\n}\n\nfunction nthOfTypeIndex(el: Element): number {\n const parent = el.parentElement;\n if (!parent) return 1;\n const sameTag = Array.from(parent.children).filter((c) => c.tagName === el.tagName);\n return sameTag.indexOf(el) + 1;\n}\n\nexport function buildSelector(target: Element): string {\n if (!target || target.nodeType !== Node.ELEMENT_NODE) return '';\n\n if (target.id && isUniqueId(target.id)) {\n return `#${CSS.escape(target.id)}`;\n }\n\n const parts: string[] = [];\n // Track shadow-crossings: when we ascend from a shadow root to its host,\n // we set the next separator to \" >> \" instead of \" > \" so the resulting\n // path makes the shadow boundary visible.\n const separators: string[] = [];\n let el: Element | null = target;\n let depth = 0;\n\n while (el && el.tagName.toLowerCase() !== 'body' && depth < MAX_DEPTH) {\n const current: Element = el;\n if (current.id && isUniqueId(current.id)) {\n parts.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n const base = tagWithClasses(current);\n const parent: HTMLElement | null = current.parentElement;\n let part = base;\n if (parent) {\n try {\n const currentClasses = Array.from(current.classList).join(' ');\n const siblings: Element[] = Array.from(parent.children).filter(\n (c: Element) => c.tagName === current.tagName && Array.from(c.classList).join(' ') === currentClasses,\n );\n if (siblings.length > 1) {\n part = `${current.tagName.toLowerCase()}:nth-of-type(${nthOfTypeIndex(current)})`;\n }\n } catch {\n // fall back to base\n }\n }\n\n parts.unshift(part);\n if (parts.length > 1) separators.unshift(' > ');\n\n // Walk to next ancestor: parentElement if present, else cross shadow\n // boundary via the root's host.\n if (parent) {\n el = parent;\n } else {\n const root = current.getRootNode();\n if (root instanceof ShadowRoot) {\n el = root.host as Element;\n // The separator that will join the host segment to what's already in\n // parts represents the shadow boundary crossing.\n if (parts.length > 0) separators[0] = SHADOW_SEPARATOR;\n } else {\n el = null;\n }\n }\n depth++;\n }\n\n // Stitch: parts[0] + separators[0] + parts[1] + separators[1] + ...\n let out = parts[0] ?? '';\n for (let i = 1; i < parts.length; i++) {\n out += (separators[i - 1] ?? ' > ') + parts[i];\n }\n return out;\n}\n","// Best-effort framework component name detection for the active element.\n// Production builds usually minify names — return null quietly when unavailable.\n\nexport type FrameworkHint = { lib: 'react' | 'vue' | 'angular' | 'svelte' | null; name?: string };\n\nfunction detectReact(el: Element): FrameworkHint | null {\n const keys = Object.keys(el).filter(\n (k) => k.startsWith('__reactFiber$') || k.startsWith('__reactInternalInstance$'),\n );\n if (keys.length === 0) return null;\n let fiber: unknown = (el as unknown as Record<string, unknown>)[keys[0]!];\n for (let i = 0; i < 10 && fiber; i++) {\n const f = fiber as { type?: unknown; return?: unknown };\n const type = f.type;\n if (typeof type === 'function') {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name && name !== '_default') return { lib: 'react', name };\n }\n if (typeof type === 'object' && type !== null) {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name) return { lib: 'react', name };\n }\n fiber = f.return;\n }\n return { lib: 'react' };\n}\n\nfunction detectVue(el: Element): FrameworkHint | null {\n const anyEl = el as unknown as Record<string, unknown>;\n const vueParent = anyEl.__vueParentComponent as { type?: { name?: string; __name?: string } } | undefined;\n if (vueParent) {\n const name = vueParent.type?.name ?? vueParent.type?.__name;\n return { lib: 'vue', ...(name ? { name } : {}) };\n }\n if (anyEl.__vue__) return { lib: 'vue' };\n return null;\n}\n\nfunction detectAngular(el: Element): FrameworkHint | null {\n const ng = (window as unknown as { ng?: { getComponent?: (el: Element) => unknown } }).ng;\n if (!ng?.getComponent) return null;\n try {\n const cmp = ng.getComponent(el);\n if (!cmp) return null;\n const ctor = (cmp as { constructor?: { name?: string } }).constructor;\n return { lib: 'angular', ...(ctor?.name ? { name: ctor.name } : {}) };\n } catch {\n return null;\n }\n}\n\nfunction detectSvelte(el: Element): FrameworkHint | null {\n const anyEl = el as unknown as Record<string, unknown>;\n if ('__svelte_meta' in anyEl) return { lib: 'svelte' };\n return null;\n}\n\nexport function detectFramework(el: Element): FrameworkHint | undefined {\n return detectReact(el) ?? detectVue(el) ?? detectAngular(el) ?? detectSvelte(el) ?? undefined;\n}\n","// Capture per-pin element data: outerHTML, selector, computed styles, bounding rect, framework hint.\n\nimport { buildSelector } from './selector';\nimport { detectFramework, type FrameworkHint } from './framework-detect';\n\nconst OUTER_HTML_LIMIT = 5000;\nconst PARENT_OUTER_HTML_LIMIT = 1000;\nconst SELECTOR_LIMIT = 1000;\nconst ID_LIMIT = 200;\nconst CLASSLIST_MAX_ENTRIES = 50;\nconst CLASS_NAME_LIMIT = 200;\nconst STYLE_VALUE_LIMIT = 500;\n\nconst USEFUL_STYLE_PROPS = [\n 'display', 'position', 'top', 'right', 'bottom', 'left',\n 'width', 'height', 'min-width', 'min-height', 'max-width', 'max-height',\n 'margin', 'padding',\n 'font-family', 'font-size', 'font-weight', 'line-height', 'text-align',\n 'color', 'background-color', 'background-image',\n 'border', 'border-radius',\n 'opacity', 'visibility', 'overflow',\n 'z-index', 'transform', 'transition',\n 'flex', 'flex-direction', 'justify-content', 'align-items', 'gap',\n 'grid-template-columns', 'grid-template-rows',\n] as const;\n\nexport interface ElementCapture {\n selector: string;\n tagName: string;\n id: string | null;\n classList: string[];\n outerHTML: string;\n parentOuterHTML?: string;\n computedStyles: Record<string, string>;\n boundingRect: { x: number; y: number; w: number; h: number };\n framework?: FrameworkHint;\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max) + `\\n\\n/* … truncated, original was ${s.length} chars */`;\n}\n\nfunction pickStyles(el: Element): Record<string, string> {\n const computed = getComputedStyle(el);\n const out: Record<string, string> = {};\n for (const prop of USEFUL_STYLE_PROPS) {\n const value = computed.getPropertyValue(prop);\n if (value && value !== 'normal' && value !== 'none' && value !== 'auto' && value !== '0px') {\n out[prop] = value.trim().slice(0, STYLE_VALUE_LIMIT);\n }\n }\n return out;\n}\n\nfunction capClassList(el: Element): string[] {\n return Array.from(el.classList)\n .slice(0, CLASSLIST_MAX_ENTRIES)\n .map((c) => (c.length > CLASS_NAME_LIMIT ? c.slice(0, CLASS_NAME_LIMIT) : c));\n}\n\nexport function captureElement(el: Element): ElementCapture {\n const rect = el.getBoundingClientRect();\n const rawSelector = buildSelector(el);\n const rawId = el.id || null;\n const framework = detectFramework(el);\n return {\n selector: rawSelector.length > SELECTOR_LIMIT ? rawSelector.slice(0, SELECTOR_LIMIT) : rawSelector,\n tagName: el.tagName.toLowerCase(),\n id: rawId && rawId.length > ID_LIMIT ? rawId.slice(0, ID_LIMIT) : rawId,\n classList: capClassList(el),\n outerHTML: truncate(el.outerHTML, OUTER_HTML_LIMIT),\n ...(el.parentElement\n ? { parentOuterHTML: truncate(el.parentElement.outerHTML, PARENT_OUTER_HTML_LIMIT) }\n : {}),\n computedStyles: pickStyles(el),\n boundingRect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n ...(framework ? { framework } : {}),\n };\n}\n","// Draw captured pins onto a screenshot. Outline rectangle + numbered marker per pin.\n\nexport interface PinMarker {\n number: number;\n selector?: string;\n boundingRect: { x: number; y: number; w: number; h: number };\n liveElement?: Element;\n}\n\nconst MARKER_RADIUS = 14;\nconst MARKER_STROKE = '#ffffff';\nconst MARKER_TEXT = '#ffffff';\nconst OUTLINE_WIDTH = 3;\nconst DEFAULT_ACCENT = '#0ea5e9';\n\nexport async function drawMarkers(\n screenshotDataUrl: string,\n pins: PinMarker[],\n viewport: { w: number; h: number; dpr: number },\n accent: string = DEFAULT_ACCENT,\n): Promise<string> {\n const img = await loadImage(screenshotDataUrl);\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2D canvas context');\n\n ctx.drawImage(img, 0, 0);\n\n const scaleX = canvas.width / viewport.w;\n const scaleY = canvas.height / viewport.h;\n\n for (const pin of pins) {\n const rect = getFreshRect(pin);\n if (!rect) continue;\n\n const x = rect.x * scaleX;\n const y = rect.y * scaleY;\n const w = rect.w * scaleX;\n const h = rect.h * scaleY;\n\n ctx.lineWidth = OUTLINE_WIDTH;\n ctx.strokeStyle = accent;\n ctx.strokeRect(x, y, w, h);\n\n const cx = x + w;\n const cy = y;\n\n ctx.beginPath();\n ctx.fillStyle = accent;\n ctx.arc(cx, cy, MARKER_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.lineWidth = 3;\n ctx.strokeStyle = MARKER_STROKE;\n ctx.stroke();\n\n ctx.fillStyle = MARKER_TEXT;\n ctx.font = 'bold 16px system-ui, -apple-system, sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(String(pin.number), cx, cy + 1);\n }\n\n return canvas.toDataURL('image/jpeg', 0.85);\n}\n\nfunction getFreshRect(pin: PinMarker): { x: number; y: number; w: number; h: number } | null {\n if (pin.liveElement && document.contains(pin.liveElement)) {\n const r = pin.liveElement.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n return { x: r.left, y: r.top, w: r.width, h: r.height };\n }\n }\n if (pin.selector) {\n try {\n const found = document.querySelector(pin.selector);\n if (found) {\n const r = found.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n return { x: r.left, y: r.top, w: r.width, h: r.height };\n }\n }\n } catch { /* fall through */ }\n }\n return pin.boundingRect;\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (err) => reject(err);\n img.src = src;\n });\n}\n","// Visual overlay shown during pin-mode. Three layers:\n// 1. Subtle dotted viewport border + soft inset glow → \"you're in pin mode\"\n// 2. Top-center hint pill → \"press Esc to finish\"\n// 3. Numbered markers + outlines → over each already-pinned\n// element so the user can\n// see what they pinned\n//\n// Mounted on document.body (NOT the beacon Shadow DOM) because position:fixed\n// children of transformed/filtered/contained ancestors get anchored to that\n// ancestor instead of the viewport — and many host pages put a transform on\n// sticky headers, which is exactly where the slotted trigger lives.\n//\n// Each element carries the `beacon-no-capture` class so the screenshot filter\n// skips them. All use pointer-events: none so they don't block elementsFromPoint\n// during picking.\n\nconst NO_CAPTURE_CLASS = 'beacon-no-capture';\nconst DEFAULT_ACCENT = '#0ea5e9';\nconst DEFAULT_HINT = 'Click any element to pin it · Press Esc to finish';\n\nexport interface PinAnchor {\n target: Element;\n /** Selector to re-query if `target` is detached (React re-render, conditional unmount). */\n selector?: string;\n /** Last-known viewport rect from pin time. Used as a faded \"anchor lost\" marker\n * if both the live ref and the selector lookup fail. */\n fallbackRect?: { x: number; y: number; w: number; h: number };\n}\n\nexport interface PickModeOverlay {\n addPin(pinNumber: number, anchor: PinAnchor): void;\n /** Swap the hint pill into a loading state (with spinner). Pass undefined to restore the default. */\n setLoading(message?: string): void;\n destroy(): void;\n}\n\nexport interface PickModeOverlayOptions {\n accent?: string;\n}\n\nfunction withAlpha(color: string, alphaHex: string): string {\n return /^#[0-9a-fA-F]{6}$/.test(color) ? `${color}${alphaHex}` : color;\n}\n\nexport function createPickModeOverlay(opts: PickModeOverlayOptions = {}): PickModeOverlay {\n const ACCENT = opts.accent ?? DEFAULT_ACCENT;\n const ACCENT_BORDER = withAlpha(ACCENT, 'b3');\n const ACCENT_GLOW = withAlpha(ACCENT, '2e');\n\n const styleTag = document.createElement('style');\n styleTag.className = NO_CAPTURE_CLASS;\n styleTag.textContent = '@keyframes beacon-spin { to { transform: rotate(360deg); } }';\n document.head.appendChild(styleTag);\n\n const frame = document.createElement('div');\n frame.className = NO_CAPTURE_CLASS;\n frame.setAttribute('aria-hidden', 'true');\n frame.style.cssText = [\n 'position: fixed',\n 'inset: 0',\n 'pointer-events: none',\n 'z-index: 2147483646',\n `border: 2px dashed ${ACCENT_BORDER}`,\n 'border-radius: 4px',\n `box-shadow: inset 0 0 56px ${ACCENT_GLOW}`,\n 'box-sizing: border-box',\n ].join('; ');\n\n const hint = document.createElement('div');\n hint.className = NO_CAPTURE_CLASS;\n hint.setAttribute('role', 'status');\n hint.style.cssText = [\n 'position: fixed',\n 'top: 16px',\n 'left: 50%',\n 'transform: translateX(-50%)',\n `background: ${ACCENT}`,\n 'color: #fff',\n 'padding: 6px 14px',\n 'border-radius: 999px',\n 'font: 500 12px/1.4 system-ui, -apple-system, sans-serif',\n 'letter-spacing: 0.01em',\n 'box-shadow: 0 4px 12px hsl(0 0% 0% / 0.3)',\n 'pointer-events: none',\n 'white-space: nowrap',\n 'z-index: 2147483646',\n ].join('; ');\n hint.textContent = DEFAULT_HINT;\n\n const SPINNER_HTML = `<span style=\"\n display: inline-block;\n width: 12px;\n height: 12px;\n border: 2px solid #fff;\n border-top-color: transparent;\n border-radius: 50%;\n animation: beacon-spin 800ms linear infinite;\n vertical-align: middle;\n margin-right: 8px;\n \"></span>`;\n\n function escapeHtml(s: string): string {\n return s.replace(/[<>&]/g, (c) => ({ '<': '<', '>': '>', '&': '&' }[c] as string));\n }\n\n document.body.appendChild(frame);\n document.body.appendChild(hint);\n\n const tracked = new Map<number, { anchor: PinAnchor; marker: HTMLDivElement; outline: HTMLDivElement }>();\n\n function makeMarker(num: number): HTMLDivElement {\n const m = document.createElement('div');\n m.className = NO_CAPTURE_CLASS;\n m.setAttribute('aria-hidden', 'true');\n m.style.cssText = [\n 'position: fixed',\n 'width: 24px',\n 'height: 24px',\n 'border-radius: 999px',\n `background: ${ACCENT}`,\n 'color: #fff',\n 'display: flex',\n 'align-items: center',\n 'justify-content: center',\n 'font: 700 12px/1 system-ui, -apple-system, sans-serif',\n 'border: 2px solid #fff',\n 'box-shadow: 0 2px 8px hsl(0 0% 0% / 0.4)',\n 'pointer-events: none',\n 'z-index: 2147483646',\n ].join('; ');\n m.textContent = String(num);\n document.body.appendChild(m);\n return m;\n }\n\n function makeOutline(): HTMLDivElement {\n const o = document.createElement('div');\n o.className = NO_CAPTURE_CLASS;\n o.setAttribute('aria-hidden', 'true');\n o.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n `border: 2px solid ${ACCENT}`,\n 'border-radius: 2px',\n 'box-sizing: border-box',\n 'z-index: 2147483645',\n ].join('; ');\n document.body.appendChild(o);\n return o;\n }\n\n function placeAt(\n entry: { marker: HTMLDivElement; outline: HTMLDivElement },\n rect: { x: number; y: number; w: number; h: number },\n isStale: boolean,\n ) {\n const opacity = isStale ? '0.5' : '1';\n entry.outline.style.display = 'block';\n entry.outline.style.opacity = opacity;\n entry.outline.style.left = `${rect.x}px`;\n entry.outline.style.top = `${rect.y}px`;\n entry.outline.style.width = `${rect.w}px`;\n entry.outline.style.height = `${rect.h}px`;\n\n entry.marker.style.display = 'flex';\n entry.marker.style.opacity = opacity;\n entry.marker.style.left = `${rect.x + rect.w - 12}px`;\n entry.marker.style.top = `${Math.max(2, rect.y - 12)}px`;\n }\n\n function hide(entry: { marker: HTMLDivElement; outline: HTMLDivElement }) {\n entry.marker.style.display = 'none';\n entry.outline.style.display = 'none';\n }\n\n function reposition() {\n tracked.forEach((entry) => {\n let liveTarget: Element | null = entry.anchor.target;\n // `document.contains` walks the light tree only — shadow descendants\n // return false even when still attached. `isConnected` is composed-tree\n // aware, so it correctly says \"still in DOM\" for elements pinned inside\n // an open shadow root (e.g. WiredBlock's wired-card targets).\n if (liveTarget && !liveTarget.isConnected) liveTarget = null;\n\n if (!liveTarget && entry.anchor.selector) {\n // Selector may contain a `>>` shadow-boundary marker (informational,\n // not valid CSS) or otherwise unparseable input. querySelector throws\n // SyntaxError on bad selectors; swallow it — the pick loop must not\n // die just because a re-query is impossible.\n try {\n liveTarget = document.querySelector(entry.anchor.selector);\n } catch {\n liveTarget = null;\n }\n if (liveTarget) entry.anchor.target = liveTarget;\n }\n\n if (liveTarget) {\n const r = liveTarget.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n placeAt(entry, { x: r.left, y: r.top, w: r.width, h: r.height }, false);\n return;\n }\n }\n\n const fr = entry.anchor.fallbackRect;\n if (fr && (fr.w > 0 || fr.h > 0)) {\n placeAt(entry, fr, true);\n return;\n }\n\n hide(entry);\n });\n }\n\n let raf: number | null = null;\n function schedule() {\n if (raf !== null) return;\n raf = requestAnimationFrame(() => {\n raf = null;\n reposition();\n });\n }\n\n window.addEventListener('scroll', schedule, true);\n window.addEventListener('resize', schedule);\n\n return {\n addPin(num, anchor) {\n const marker = makeMarker(num);\n const outline = makeOutline();\n tracked.set(num, { anchor, marker, outline });\n reposition();\n },\n setLoading(message) {\n if (message) {\n hint.innerHTML = SPINNER_HTML + escapeHtml(message);\n } else {\n hint.textContent = DEFAULT_HINT;\n }\n },\n destroy() {\n window.removeEventListener('scroll', schedule, true);\n window.removeEventListener('resize', schedule);\n if (raf !== null) cancelAnimationFrame(raf);\n frame.remove();\n hint.remove();\n styleTag.remove();\n tracked.forEach(({ marker, outline }) => {\n marker.remove();\n outline.remove();\n });\n tracked.clear();\n },\n };\n}\n","// Small contextual popover that opens next to a picked element so the user can\n// optionally type a note. The cross icon discards this pin and lets the user keep\n// picking; Save attaches the (optional) note. Escape ends annotation entirely.\n//\n// Body-mounted (NOT inside the beacon shadow root) so it escapes transformed\n// ancestor stacking contexts. Needs the body-mount style rules registered via\n// the global stylesheet (ensureBeaconBodyStyles).\n\nexport type PinPopoverCancel = 'pin' | 'all' | false;\n\nexport interface PinPopoverResult {\n note?: string;\n /** 'pin' = discard this pin, keep picking. 'all' = end annotation. false = save. */\n cancelled: PinPopoverCancel;\n}\n\nconst ICON_CLOSE =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\nconst ICON_CHECK =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<polyline points=\"20 6 9 17 4 12\"/></svg>';\n\nexport function showPinPopover(opts: {\n anchor: { x: number; y: number };\n pinNumber: number;\n}): Promise<PinPopoverResult> {\n return new Promise((resolve) => {\n const popover = document.createElement('div');\n popover.className = 'beacon-pin-popover open beacon-no-capture beacon-theme-auto';\n popover.innerHTML = `\n <div class=\"beacon-pin-popover-header\">\n <div style=\"display:flex;align-items:center;gap:6px;font-weight:600;font-size:13px;\">\n <span class=\"beacon-pin-num\">${opts.pinNumber}</span>\n <span>Note for this pin</span>\n </div>\n <button type=\"button\" class=\"beacon-icon-btn\" data-action=\"cancel\" aria-label=\"Discard this pin\">${ICON_CLOSE}</button>\n </div>\n <textarea class=\"beacon-textarea\" rows=\"2\" placeholder=\"Optional — describe what's wrong here…\" style=\"min-height:48px;\"></textarea>\n <div class=\"beacon-pin-popover-actions\">\n <button type=\"button\" class=\"beacon-btn primary\" data-action=\"save\">${ICON_CHECK} Save</button>\n </div>\n `;\n\n const POPOVER_W = 240;\n const POPOVER_H = 160;\n const left = Math.min(Math.max(8, opts.anchor.x), window.innerWidth - POPOVER_W - 8);\n const top = Math.min(Math.max(8, opts.anchor.y + 12), window.innerHeight - POPOVER_H - 8);\n popover.style.left = `${left}px`;\n popover.style.top = `${top}px`;\n\n document.body.appendChild(popover);\n\n const textarea = popover.querySelector('textarea')!;\n textarea.focus();\n\n function close(result: PinPopoverResult) {\n document.removeEventListener('keydown', handleGlobalKey, true);\n popover.remove();\n resolve(result);\n }\n\n function handleGlobalKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n close({ cancelled: 'all' });\n }\n }\n document.addEventListener('keydown', handleGlobalKey, true);\n\n popover.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const action = target.closest('[data-action]')?.getAttribute('data-action');\n if (!action) return;\n // Don't let the Save/Cancel click bubble to the deck shell — if it lands\n // on top of an interactive element (e.g. the Respond trigger when picking\n // bottom-of-viewport content), bubbling reopens the drawer and aborts the\n // pick loop after a single pin.\n e.stopPropagation();\n if (action === 'cancel') close({ cancelled: 'pin' });\n if (action === 'save') {\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n });\n\n textarea.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n });\n });\n}\n","// Hover/click element picker. Draws an outline + tooltip over the hovered element\n// and resolves with the clicked element. Skips the widget's own elements via\n// composedPath check against the provided shadow root.\n\nexport interface PickerOptions {\n shadowRoot: ShadowRoot;\n onHover?: (el: Element | null) => void;\n accent?: string;\n}\n\nconst DEFAULT_ACCENT = '#0ea5e9';\n\nfunction withAlpha(color: string, alphaHex: string): string {\n return /^#[0-9a-fA-F]{6}$/.test(color) ? `${color}${alphaHex}` : color;\n}\n\nexport interface PickerHandle {\n cancel: () => void;\n promise: Promise<Element | null>;\n}\n\nexport function startPicker(opts: PickerOptions): PickerHandle {\n const { shadowRoot, onHover } = opts;\n const accent = opts.accent ?? DEFAULT_ACCENT;\n const accentFill = withAlpha(accent, '14');\n\n const outline = document.createElement('div');\n outline.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483646',\n `border: 2px solid ${accent}`,\n `background: ${accentFill}`,\n 'transition: all 60ms ease-out',\n 'box-sizing: border-box',\n 'border-radius: 2px',\n ].join('; ');\n document.body.appendChild(outline);\n\n const tooltip = document.createElement('div');\n tooltip.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483647',\n 'background: #0f172a',\n 'color: #fff',\n 'font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace',\n 'padding: 3px 6px',\n 'border-radius: 3px',\n 'max-width: 280px',\n 'overflow: hidden',\n 'text-overflow: ellipsis',\n 'white-space: nowrap',\n ].join('; ');\n document.body.appendChild(tooltip);\n\n const previousCursor = document.body.style.cursor;\n document.body.style.cursor = 'crosshair';\n\n let resolved = false;\n let resolvePromise: (v: Element | null) => void = () => {};\n const promise = new Promise<Element | null>((res) => { resolvePromise = res; });\n\n function isWidgetElement(el: EventTarget | null): boolean {\n if (!el || !(el instanceof Node)) return false;\n let node: Node | null = el;\n while (node) {\n if (node === shadowRoot || node === shadowRoot.host) return true;\n node = node.parentNode ?? (node as ShadowRoot).host ?? null;\n }\n return false;\n }\n\n // Custom elements (tag names containing a hyphen, per the HTML spec) are\n // self-contained UI units — the user wants to annotate the whole\n // `<wired-button>`, not the rough.js SVG path inside its private shadow\n // root. So we stop descending the moment we land on a custom element.\n function isCustomElement(el: Element): boolean {\n return el.tagName.includes('-');\n }\n\n function findTarget(x: number, y: number): Element | null {\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n const candidates = document.elementsFromPoint(x, y);\n outline.style.display = 'block';\n tooltip.style.display = 'block';\n for (const c of candidates) {\n if (isWidgetElement(c)) continue;\n // Descend into open shadow roots so we can hit elements inside deck's\n // WiredBlock (and any other host using attachShadow({mode:\"open\"})).\n // ShadowRoot.elementsFromPoint is supported in all modern browsers.\n let current: Element = c;\n let safety = 16;\n while (current.shadowRoot && !isCustomElement(current) && safety-- > 0) {\n const inner = (current.shadowRoot as unknown as { elementsFromPoint?: (x: number, y: number) => Element[] })\n .elementsFromPoint?.(x, y) ?? [];\n const next = inner.find((e) => !isWidgetElement(e) && e !== current);\n if (!next) break;\n current = next;\n }\n return current;\n }\n return null;\n }\n\n function positionOutline(el: Element) {\n const rect = el.getBoundingClientRect();\n outline.style.left = `${rect.left}px`;\n outline.style.top = `${rect.top}px`;\n outline.style.width = `${rect.width}px`;\n outline.style.height = `${rect.height}px`;\n const tag = el.tagName.toLowerCase();\n const cls = el.classList.length > 0 ? '.' + Array.from(el.classList).slice(0, 2).join('.') : '';\n tooltip.textContent = tag + cls;\n const above = rect.top - 22;\n tooltip.style.left = `${rect.left}px`;\n tooltip.style.top = `${above >= 0 ? above : rect.bottom + 4}px`;\n }\n\n function handleMove(e: MouseEvent) {\n const el = findTarget(e.clientX, e.clientY);\n if (el) {\n positionOutline(el);\n onHover?.(el);\n } else {\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n onHover?.(null);\n }\n }\n\n // pointerdown (not click) so Radix Select/Popover/Dialog don't open under us.\n function handlePointerDown(e: PointerEvent) {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n const el = findTarget(e.clientX, e.clientY);\n if (el) finish(el);\n }\n\n function swallow(e: Event) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n finish(null);\n }\n }\n\n function finish(el: Element | null) {\n if (resolved) return;\n resolved = true;\n document.removeEventListener('mousemove', handleMove, true);\n document.removeEventListener('pointerdown', handlePointerDown, true);\n document.removeEventListener('click', swallow, true);\n document.removeEventListener('mouseup', swallow, true);\n document.removeEventListener('keydown', handleKey, true);\n outline.remove();\n tooltip.remove();\n document.body.style.cursor = previousCursor;\n resolvePromise(el);\n }\n\n document.addEventListener('mousemove', handleMove, true);\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('click', swallow, true);\n document.addEventListener('mouseup', swallow, true);\n document.addEventListener('keydown', handleKey, true);\n\n return {\n cancel: () => finish(null),\n promise,\n };\n}\n","// Lazy-loaded screenshot capture via html-to-image. Captures the full\n// scrollable document (not just the visible viewport) as a JPEG data URL.\n//\n// Most apps using this beacon mount inside an `h-screen` shell with one or\n// more `overflow-y-auto` panels. A viewport-sized snapshot would clip both\n// the content that's scrolled off and any pinned element whose bounding box\n// extends past the fold. To get a true full-page screenshot we temporarily\n// disable overflow + height constraints on the scroll-container chain so the\n// document lays out at its natural full size, then snapshot the whole thing.\n//\n// Cross-origin images without CORS taint the canvas. Belt-and-suspenders:\n// swap cross-origin <img>.src to a transparent pixel before capture, restore after.\n\nlet htmlToImage: typeof import('html-to-image') | null = null;\n\nasync function load() {\n if (!htmlToImage) {\n htmlToImage = await import('html-to-image');\n }\n return htmlToImage;\n}\n\nexport interface ScreenshotOptions {\n quality?: number;\n pixelRatio?: number;\n excludeShadowRoot?: ShadowRoot;\n excludeHosts?: Element[];\n /** When true (default), captures the full scrollable document. Set false for viewport-only. */\n fullPage?: boolean;\n}\n\nexport interface ScreenshotResult {\n dataUrl: string;\n /** CSS-pixel width of the captured area. */\n width: number;\n /** CSS-pixel height of the captured area. */\n height: number;\n /** Device pixel ratio used during capture. */\n pixelRatio: number;\n /**\n * Releases the temporary layout patches applied for full-page capture.\n * MUST be called once any subsequent layout-dependent work (e.g. measuring\n * pin rects against the captured image via `drawMarkers`) is finished.\n * Safe to call multiple times.\n */\n dispose: () => void;\n}\n\nconst TRANSPARENT_PIXEL =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkAAIAAAoAAv/lxKUAAAAASUVORK5CYII=';\n\nfunction isUrlSafeForCanvas(rawUrl: string, crossOriginAttr?: string | null): boolean {\n if (!rawUrl) return true;\n if (rawUrl.startsWith('data:') || rawUrl.startsWith('blob:')) return true;\n if (rawUrl.startsWith('/') || rawUrl.startsWith('#')) return true;\n try {\n const u = new URL(rawUrl, window.location.href);\n if (u.origin === window.location.origin) return true;\n } catch {\n return false;\n }\n return crossOriginAttr === 'anonymous' || crossOriginAttr === 'use-credentials';\n}\n\nfunction neutralizeCrossOriginImages(): () => void {\n const stashedImg: Array<{ el: HTMLImageElement; src: string }> = [];\n const stashedSvg: Array<{ el: SVGImageElement; href: string | null; xlink: string | null }> = [];\n\n document.querySelectorAll('img').forEach((img) => {\n if (!isUrlSafeForCanvas(img.src, img.crossOrigin)) {\n stashedImg.push({ el: img, src: img.src });\n img.src = TRANSPARENT_PIXEL;\n }\n });\n\n document.querySelectorAll('image').forEach((img) => {\n const svgImg = img as unknown as SVGImageElement;\n const href = svgImg.getAttribute('href');\n const xlink = svgImg.getAttributeNS('http://www.w3.org/1999/xlink', 'href');\n const url = href || xlink || '';\n if (url && !isUrlSafeForCanvas(url)) {\n stashedSvg.push({ el: svgImg, href, xlink });\n if (href !== null) svgImg.setAttribute('href', TRANSPARENT_PIXEL);\n if (xlink !== null) svgImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', TRANSPARENT_PIXEL);\n }\n });\n\n return () => {\n for (const { el, src } of stashedImg) el.src = src;\n for (const { el, href, xlink } of stashedSvg) {\n if (href !== null) el.setAttribute('href', href);\n if (xlink !== null) el.setAttributeNS('http://www.w3.org/1999/xlink', 'href', xlink);\n }\n };\n}\n\n// Find every scroll container (`overflow-y|x: auto|scroll` with overflowing content)\n// and open it + its ancestor chain (overflow:visible, height:auto) so the document\n// lays out at full natural size. Snapshots scroll positions before patching and\n// restores them after. The browser implicitly clamps scrollTop to 0 while overflow\n// is visible, so no manual reset is needed.\nfunction expandLayoutForFullPage(): () => void {\n // 1. Find scroll containers (snapshot taken before any mutations).\n const scrollContainers: HTMLElement[] = [];\n document.querySelectorAll<HTMLElement>('*').forEach((el) => {\n const cs = getComputedStyle(el);\n const overflowingY =\n (cs.overflowY === 'auto' || cs.overflowY === 'scroll') && el.scrollHeight > el.clientHeight;\n const overflowingX =\n (cs.overflowX === 'auto' || cs.overflowX === 'scroll') && el.scrollWidth > el.clientWidth;\n if (overflowingY || overflowingX) scrollContainers.push(el);\n });\n\n // 2. Snapshot scroll positions BEFORE any DOM mutation (window + every container).\n // Reading after a patch would return a browser-clamped value, not the user's\n // real position — that's how the original fix lost scroll on restore.\n const savedWindowX = window.scrollX;\n const savedWindowY = window.scrollY;\n const savedContainerScrolls = scrollContainers.map((el) => ({\n el,\n scrollLeft: el.scrollLeft,\n scrollTop: el.scrollTop,\n }));\n\n // 3. Snapshot full inline cssText for every element we're about to patch (each\n // scroll container + its ancestor chain). Restoring cssText atomically is\n // simpler and more reliable than per-property removeProperty/setProperty.\n const touched = new Map<HTMLElement, string>();\n for (const el of scrollContainers) {\n let cur: HTMLElement | null = el;\n while (cur && cur !== document.documentElement.parentElement) {\n if (!touched.has(cur)) touched.set(cur, cur.style.cssText);\n cur = cur.parentElement;\n }\n }\n\n // 4. Apply style patches.\n for (const el of touched.keys()) {\n el.style.setProperty('overflow', 'visible', 'important');\n el.style.setProperty('overflow-x', 'visible', 'important');\n el.style.setProperty('overflow-y', 'visible', 'important');\n el.style.setProperty('max-height', 'none', 'important');\n el.style.setProperty('height', 'auto', 'important');\n el.style.setProperty('min-height', '0', 'important');\n }\n\n return () => {\n // Restore styles first — every container becomes a scroll container again\n // before we try to set its scroll position.\n for (const [el, cssText] of touched) {\n el.style.cssText = cssText;\n }\n // Then put every scroll back exactly where the user had it. Window last so\n // a focus/layout shift from the container restores doesn't override it.\n for (const { el, scrollLeft, scrollTop } of savedContainerScrolls) {\n el.scrollLeft = scrollLeft;\n el.scrollTop = scrollTop;\n }\n window.scrollTo(savedWindowX, savedWindowY);\n };\n}\n\n// Serialize captures end-to-end. Two captures racing would corrupt the\n// layout-restore state: the second call's expandLayoutForFullPage() would read\n// the *patched* DOM (overflow:visible, height:auto, scroll=0) and save those as\n// \"original\", so its dispose() then re-applies the patched values and leaves\n// the page un-scrollable. The gate releases only after the caller invokes the\n// returned dispose(), so a follow-up capture cannot start mid-restore either.\nlet captureGate: Promise<void> = Promise.resolve();\n\nexport async function captureScreenshot(opts: ScreenshotOptions = {}): Promise<ScreenshotResult> {\n const priorGate = captureGate;\n let releaseGate!: () => void;\n captureGate = new Promise<void>((r) => { releaseGate = r; });\n\n try {\n await priorGate;\n return await doCaptureScreenshot(opts, releaseGate);\n } catch (err) {\n releaseGate();\n throw err;\n }\n}\n\nasync function doCaptureScreenshot(\n opts: ScreenshotOptions,\n releaseGate: () => void,\n): Promise<ScreenshotResult> {\n const {\n quality = 0.7,\n pixelRatio = Math.min(window.devicePixelRatio || 1, 2),\n excludeShadowRoot,\n excludeHosts,\n fullPage = true,\n } = opts;\n const lib = await load();\n\n // Skip the beacon's own custom-element hosts so the open <dialog> top layer\n // and the shadow-DOM trigger don't appear in the snapshot.\n const filter = (excludeShadowRoot || excludeHosts?.length)\n ? (node: Node) => {\n let cur: Node | null = node;\n while (cur) {\n if (excludeShadowRoot && cur === excludeShadowRoot.host) return false;\n if (excludeHosts && cur instanceof Element && excludeHosts.includes(cur)) return false;\n if (cur instanceof Element && cur.classList.contains('beacon-no-capture')) return false;\n cur = cur.parentNode;\n }\n return true;\n }\n : undefined;\n\n const restoreImages = neutralizeCrossOriginImages();\n const restoreLayout = fullPage ? expandLayoutForFullPage() : () => {};\n let disposed = false;\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n try { restoreLayout(); } finally {\n try { restoreImages(); } finally {\n releaseGate();\n }\n }\n };\n\n try {\n if (fullPage) {\n // Let layout settle after overflow/height patches before measuring.\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n }\n\n const html = document.documentElement;\n const width = fullPage ? Math.max(html.scrollWidth, window.innerWidth) : window.innerWidth;\n const height = fullPage ? Math.max(html.scrollHeight, window.innerHeight) : window.innerHeight;\n\n const dataUrl = await lib.toJpeg(html, {\n quality,\n pixelRatio,\n cacheBust: true,\n ...(filter ? { filter } : {}),\n imagePlaceholder: TRANSPARENT_PIXEL,\n width,\n height,\n style: { transform: 'none' },\n });\n\n return { dataUrl, width, height, pixelRatio, dispose };\n } catch (err) {\n dispose();\n throw err;\n }\n}\n","// Tiny shared cache so the interactive annotate flow (domEle) and the submit-time\n// screenshot capture (domSS) can hand off an annotated screenshot without\n// round-tripping a multi-MB data URL through the payload's plugin entries.\n//\n// Set after domEle's pick loop completes (with all pin markers drawn onto the\n// snapshot). Read by domSS at capture time — reused verbatim if present, else\n// captured fresh.\n\nlet cached: { dataUrl: string; mime: 'image/jpeg' | 'image/png' } | null = null;\n\nexport function setAnnotationCache(entry: { dataUrl: string; mime: 'image/jpeg' | 'image/png' }): void {\n cached = entry;\n}\n\nexport function getAnnotationCache(): { dataUrl: string; mime: 'image/jpeg' | 'image/png' } | null {\n return cached;\n}\n\nexport function clearAnnotationCache(): void {\n cached = null;\n}\n","// domEle plugin — pin-annotation picker, ported from the old monolithic beacon.\n// Form panel renders an \"Annotate\" button that enters multi-pick mode:\n// • drawer closes (requestMode('pickElement'))\n// • dashed viewport border + hint pill paint\n// • loop: pick element → note popover → either Save, skip, or end\n// • on end, captures a screenshot + draws numbered markers + caches it\n// • drawer reopens with the pin list + preview <img>\n//\n// At submit time capture() returns { pins }. domSS reuses the cached screenshot\n// via beacon/internal/annotation-cache, so the user-visible preview is the\n// exact bytes that ship to the server.\n\nimport { captureElement, type ElementCapture } from '../internal/element-capture';\nimport { drawMarkers, type PinMarker } from '../internal/markers';\nimport { createPickModeOverlay } from '../internal/pick-mode-overlay';\nimport { showPinPopover } from '../internal/pin-popover';\nimport { startPicker } from '../internal/picker';\nimport { captureScreenshot } from '../internal/screenshot';\nimport { setAnnotationCache, clearAnnotationCache } from '../internal/annotation-cache';\nimport type { BeaconPlugin, BeaconCtx } from '../types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction iconTrash(): SVGElement {\n const s = document.createElementNS(SVG_NS, 'svg');\n s.setAttribute('viewBox', '0 0 24 24');\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '2');\n s.setAttribute('stroke-linecap', 'round');\n s.setAttribute('stroke-linejoin', 'round');\n s.setAttribute('aria-hidden', 'true');\n const paths = [\n 'M3 6h18',\n 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6',\n 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2',\n ];\n for (const d of paths) {\n const p = document.createElementNS(SVG_NS, 'path');\n p.setAttribute('d', d);\n s.appendChild(p);\n }\n return s;\n}\n\nexport interface Pin extends ElementCapture {\n number: number;\n note?: string;\n}\n\nexport interface DomEleOptions {\n /** Picker outline + marker color. Falls back to --beacon-accent. */\n accent?: string;\n /** Cap on pin count. Default 20 — mirrors the server-side schema. */\n maxPins?: number;\n}\n\nexport function domEle(opts: DomEleOptions = {}): BeaconPlugin {\n const maxPins = opts.maxPins ?? 20;\n let pins: Pin[] = [];\n let pinElements = new WeakMap<Pin, Element>();\n let cachedAnnotatedDataUrl: string | null = null;\n // Bumped on every regenerate request so stale in-flight captures drop their\n // result instead of overwriting the cache with an outdated marker set.\n let regenToken = 0;\n\n // Panel-scoped refs — reset each time form() is re-rendered.\n let headerEl: HTMLDivElement | null = null;\n let listEl: HTMLDivElement | null = null;\n let previewEl: HTMLImageElement | null = null;\n let btnEl: HTMLButtonElement | null = null;\n\n function reset(): void {\n pins = [];\n pinElements = new WeakMap();\n cachedAnnotatedDataUrl = null;\n regenToken += 1;\n clearAnnotationCache();\n renderList();\n renderPreview();\n }\n\n function findShadowRoot(): ShadowRoot | null {\n const host = document.querySelector('launch-kit-beacon');\n return host?.shadowRoot ?? null;\n }\n\n function resolveAccent(): string {\n if (typeof window === 'undefined') return opts.accent ?? '#0ea5e9';\n if (opts.accent) return opts.accent;\n const host = document.querySelector('launch-kit-beacon');\n if (!host) return '#0ea5e9';\n const v = getComputedStyle(host).getPropertyValue('--beacon-accent').trim();\n return v || '#0ea5e9';\n }\n\n async function enterAnnotateMode(ctx: BeaconCtx): Promise<void> {\n const shadowRoot = findShadowRoot();\n if (!shadowRoot) return;\n const accent = resolveAccent();\n\n const release = await ctx.requestMode('pickElement');\n const overlay = createPickModeOverlay({ accent });\n\n // Restore markers for already-pinned elements so the user can see what\n // they've already pinned while picking the next one.\n for (const pin of pins) {\n const target = pinElements.get(pin);\n if (target) {\n overlay.addPin(pin.number, {\n target,\n selector: pin.selector,\n fallbackRect: pin.boundingRect,\n });\n }\n }\n\n try {\n let keepPicking = true;\n while (keepPicking) {\n if (pins.length >= maxPins) break;\n const handle = startPicker({ shadowRoot, accent });\n const el = await handle.promise;\n if (!el) break; // Escape ends annotation\n\n const rect = el.getBoundingClientRect();\n const popover = await showPinPopover({\n anchor: { x: rect.left, y: rect.bottom },\n pinNumber: pins.length + 1,\n });\n // 'all' (Escape inside popover) ends annotation;\n // 'pin' (cross icon) drops this candidate and re-enters pick mode.\n if (popover.cancelled === 'all') { keepPicking = false; break; }\n if (popover.cancelled === 'pin') continue;\n\n const captured = captureElement(el);\n const pin: Pin = {\n number: pins.length + 1,\n ...captured,\n ...(popover.note ? { note: popover.note } : {}),\n };\n pins.push(pin);\n pinElements.set(pin, el);\n overlay.addPin(pin.number, {\n target: el,\n selector: captured.selector,\n fallbackRect: captured.boundingRect,\n });\n }\n\n // After picks: capture a fresh screenshot, draw markers, cache it for\n // both the in-drawer preview AND the submit-time payload.\n if (pins.length > 0) {\n overlay.setLoading('Capturing screenshot…');\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n await regenerateScreenshot();\n } else {\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n }\n } finally {\n overlay.destroy();\n release();\n }\n\n renderList();\n renderPreview();\n }\n\n // Re-capture the page and redraw all current pin markers into the cache.\n // Called both at the end of an annotate session and after a pin is deleted\n // while others remain — so the in-drawer preview AND the submit-time payload\n // always reflect the current pin set.\n async function regenerateScreenshot(): Promise<void> {\n const myToken = ++regenToken;\n if (pins.length === 0) {\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n renderPreview();\n return;\n }\n const accent = resolveAccent();\n try {\n const beaconHosts = Array.from(document.querySelectorAll('launch-kit-beacon')) as Element[];\n const shot = await captureScreenshot({ excludeHosts: beaconHosts });\n try {\n if (myToken !== regenToken) return;\n const markers: PinMarker[] = pins.map((p) => ({\n number: p.number,\n selector: p.selector,\n boundingRect: p.boundingRect,\n ...(pinElements.get(p) ? { liveElement: pinElements.get(p)! } : {}),\n }));\n const viewport = { w: shot.width, h: shot.height, dpr: shot.pixelRatio };\n const annotated = await drawMarkers(shot.dataUrl, markers, viewport, accent);\n if (myToken !== regenToken) return;\n cachedAnnotatedDataUrl = annotated;\n setAnnotationCache({ dataUrl: annotated, mime: 'image/jpeg' });\n } finally {\n shot.dispose();\n }\n } catch {\n // Screenshot failure is non-fatal — pins still post.\n if (myToken !== regenToken) return;\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n }\n if (myToken === regenToken) renderPreview();\n }\n\n function deletePin(n: number) {\n const idx = pins.findIndex((p) => p.number === n);\n if (idx === -1) return;\n pins.splice(idx, 1);\n pins.forEach((p, i) => { p.number = i + 1; });\n // Cached screenshot has the deleted marker baked in — invalidate, then\n // re-capture if any pins remain. Without this, the user sees the preview\n // vanish and `domSS`'s submit-time fallback ships an un-marked screenshot\n // (the captured `domEle` entry isn't visible to other plugins mid-submit).\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n renderList();\n renderPreview();\n void regenerateScreenshot();\n }\n\n function renderList() {\n if (headerEl) {\n headerEl.textContent = `Pins (${pins.length})`;\n headerEl.style.display = pins.length === 0 ? 'none' : '';\n }\n if (btnEl) {\n btnEl.textContent = pins.length === 0 ? 'Annotate elements' : 'Add another pin';\n }\n if (!listEl) return;\n listEl.innerHTML = '';\n listEl.style.display = pins.length === 0 ? 'none' : '';\n for (const pin of pins) {\n const row = document.createElement('div');\n row.className = 'beacon-pin-item';\n row.dataset.pin = String(pin.number);\n\n const num = document.createElement('span');\n num.className = 'beacon-pin-num';\n num.textContent = String(pin.number);\n\n const meta = document.createElement('div');\n meta.className = 'beacon-pin-meta';\n const sel = document.createElement('div');\n sel.className = 'beacon-pin-selector';\n sel.title = pin.selector;\n sel.textContent = pin.selector || pin.tagName;\n const noteInput = document.createElement('input');\n noteInput.type = 'text';\n noteInput.className = 'beacon-pin-note-input';\n noteInput.placeholder = 'Add a note (optional)';\n noteInput.value = pin.note ?? '';\n noteInput.addEventListener('input', () => {\n if (noteInput.value.trim()) pin.note = noteInput.value;\n else delete pin.note;\n });\n meta.appendChild(sel);\n meta.appendChild(noteInput);\n\n const del = document.createElement('button');\n del.type = 'button';\n del.className = 'beacon-icon-btn';\n del.setAttribute('aria-label', `Remove pin ${pin.number}`);\n del.appendChild(iconTrash());\n del.addEventListener('click', () => deletePin(pin.number));\n\n row.appendChild(num);\n row.appendChild(meta);\n row.appendChild(del);\n listEl.appendChild(row);\n }\n }\n\n function renderPreview() {\n if (!previewEl) return;\n if (cachedAnnotatedDataUrl) {\n previewEl.src = cachedAnnotatedDataUrl;\n previewEl.style.display = 'block';\n } else {\n previewEl.removeAttribute('src');\n previewEl.style.display = 'none';\n }\n }\n\n return {\n name: 'domEle',\n setupOnce(ctx) {\n // Reset interactive state when the drawer closes so a fresh open() starts\n // empty. Without this, pins from a previous session linger in the closure.\n const off = ctx.on('close', () => reset());\n return off;\n },\n form(ctx) {\n return {\n render: (slot) => {\n // \"Pins (N)\" header — only painted when there's at least one pin.\n headerEl = document.createElement('div');\n headerEl.className = 'beacon-pin-list-header';\n slot.appendChild(headerEl);\n\n // Pin list.\n listEl = document.createElement('div');\n listEl.className = 'beacon-pin-list';\n slot.appendChild(listEl);\n\n // Annotate / Add another pin button.\n btnEl = document.createElement('button');\n btnEl.type = 'button';\n btnEl.className = 'beacon-btn secondary beacon-pin-annotate';\n btnEl.addEventListener('click', () => { void enterAnnotateMode(ctx); });\n slot.appendChild(btnEl);\n\n // Preview <img>.\n previewEl = document.createElement('img');\n previewEl.className = 'beacon-thumb';\n previewEl.alt = 'Annotated screenshot preview';\n previewEl.style.display = 'none';\n slot.appendChild(previewEl);\n\n renderList();\n renderPreview();\n return () => { headerEl = null; listEl = null; previewEl = null; btnEl = null; };\n },\n };\n },\n capture() {\n if (pins.length === 0) return null;\n return { pins };\n },\n };\n}\n","// Public types for the launch-kit beacon. Exposed via @launchsecure/launch-kit/beacon.\n\nexport type Severity = 'bug' | 'idea' | 'ux' | 'a11y';\n\nexport type Position = 'bottom-right' | 'bottom-left' | 'hidden';\nexport type Theme = 'auto' | 'light' | 'dark';\n\nexport type HeadersConfig =\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n\nexport type ContextConfig = () => Record<string, unknown>;\n\n// ── Payload (§6) ──────────────────────────────────────────\n\nexport interface PayloadMetadata {\n url: string;\n referrer?: string;\n userAgent: string;\n viewport: { w: number; h: number; dpr: number };\n screen: { w: number; h: number };\n timezone: string;\n locale: string;\n theme?: 'light' | 'dark';\n capturedAt: string;\n}\n\nexport interface PluginSuccessEntry {\n v: number;\n [k: string]: unknown;\n}\n\nexport interface PluginFailureEntry {\n error: string;\n stack?: string;\n}\n\nexport type PluginEntry = PluginSuccessEntry | PluginFailureEntry;\n\nexport interface FeedbackPayload {\n description: string;\n severity: Severity;\n metadata: PayloadMetadata;\n context?: Record<string, unknown>;\n plugins: Record<string, PluginEntry>;\n}\n\nexport function isPluginFailure(entry: PluginEntry | undefined): entry is PluginFailureEntry {\n return !!entry && typeof entry === 'object' && !('v' in entry) && 'error' in entry;\n}\n\n// ── Labels (i18n via init({ labels })) ──────────────────────────────────────────\n\nexport interface LabelMap {\n triggerButton: string;\n drawerTitle: string;\n closeButton: string;\n send: string;\n sending: string;\n sentSuccess: string;\n descriptionLabel: string;\n descriptionPlaceholder: string;\n severityLabel: string;\n severityBug: string;\n severityIdea: string;\n severityUx: string;\n severityA11y: string;\n}\n\n// ── Form fields (§4.2) ──────────────────────────────────────────\n\nexport interface BaseField<K extends string> {\n type: K;\n /** Per-plugin key in ctx.formValues. */\n name: string;\n label?: string;\n description?: string;\n}\n\nexport interface ToggleField extends BaseField<'toggle'> { defaultValue?: boolean }\nexport interface TextField extends BaseField<'text'> { defaultValue?: string; placeholder?: string }\nexport interface TextareaField extends BaseField<'textarea'> { defaultValue?: string; placeholder?: string; rows?: number }\nexport interface SelectField extends BaseField<'select'> { defaultValue?: string; options: Array<{ value: string; label?: string }> }\nexport interface RadioField extends BaseField<'radio'> { defaultValue?: string; options: Array<{ value: string; label?: string }> }\nexport interface NumberField extends BaseField<'number'> { defaultValue?: number; min?: number; max?: number; step?: number }\n\nexport type FormField =\n | ToggleField\n | TextField\n | TextareaField\n | SelectField\n | RadioField\n | NumberField;\n\nexport type DeclarativeForm = { title?: string; fields: FormField[] };\nexport type ImperativeForm = { title?: string; render: (slot: HTMLElement, ctx: BeaconCtx) => void | (() => void) };\n\n// ── Ctx (§5) ──────────────────────────────────────────\n\nexport type Mode = 'minimize' | 'hide' | 'pickElement';\n\nexport interface BeaconLifecycleEvent {\n payload?: FeedbackPayload;\n response?: TransportResponse;\n cancel?: (reason: string) => void;\n}\n\nexport interface BeaconCtx {\n readonly pluginName: string;\n captured(name: string): PluginEntry | undefined;\n readonly formValues: Record<string, unknown>;\n requestMode(mode: Mode): Promise<() => void>;\n overlay(opts: { render: (slot: HTMLElement) => void | (() => void) }): () => void;\n on(\n ev: 'open' | 'close' | 'beforeSubmit' | 'afterSubmit',\n handler: (e: BeaconLifecycleEvent) => void,\n ): () => void;\n readonly signal: AbortSignal;\n captureSignal(): AbortSignal | undefined;\n}\n\n// ── Plugins (§4) ──────────────────────────────────────────\n\nexport interface BeaconPlugin {\n name: string;\n version?: number;\n setupOnce?(ctx: BeaconCtx): void | (() => void);\n form?(ctx: BeaconCtx): DeclarativeForm | ImperativeForm;\n capture?(ctx: BeaconCtx): unknown | Promise<unknown>;\n}\n\n// ── Init / system events (§3, §10) ──────────────────────────────────────────\n\nexport interface InitOptions {\n endpoint: string;\n headers?: HeadersConfig;\n context?: ContextConfig;\n /** fetch credentials mode. Default 'omit' per §9 (safe for cross-origin\n * consumers); same-origin apps that gate the endpoint behind cookie auth\n * should pass 'same-origin'. */\n credentials?: RequestCredentials;\n plugins?: BeaconPlugin[];\n defaultPlugins?: boolean;\n position?: Position;\n theme?: Theme;\n labels?: Partial<LabelMap>;\n debug?: boolean;\n healthIndicator?: 'never' | 'dev' | 'always';\n}\n\nexport interface PluginStatus {\n state: 'active' | 'failed';\n failures: number;\n error?: { message: string; stack?: string; at: 'setupOnce' | 'capture' | 'form' };\n}\n\nexport interface BeaconStatus {\n ready: boolean;\n transport: 'ok' | 'error' | 'idle';\n plugins: Record<string, PluginStatus>;\n}\n\nexport type SystemEvent = 'plugin:error' | 'submit:success' | 'submit:error' | 'ready';\n\nexport interface PluginErrorEvent { plugin: string; error: Error; at: 'setupOnce' | 'capture' | 'form' }\nexport interface SubmitSuccessEvent { payload: FeedbackPayload; response: TransportResponse }\nexport interface SubmitErrorEvent { payload: FeedbackPayload; error: Error }\nexport interface ReadyEvent { ready: true }\n\nexport type SystemEventPayload<E extends SystemEvent> =\n E extends 'plugin:error' ? PluginErrorEvent :\n E extends 'submit:success' ? SubmitSuccessEvent :\n E extends 'submit:error' ? SubmitErrorEvent :\n E extends 'ready' ? ReadyEvent :\n never;\n\n// ── Transport ──────────────────────────────────────────\n\nexport interface TransportResponse {\n ok: boolean;\n status: number;\n body: unknown;\n}\n","// domSS plugin — viewport screenshot. Composes with domEle in two ways:\n// 1. If domEle's interactive annotate flow already drew an annotated\n// screenshot, we reuse that exact buffer (so the user-visible preview\n// matches what the server receives, byte-for-byte).\n// 2. Otherwise (pins-less submit, or annotate session never ran), capture\n// a fresh screenshot at submit time using `requestMode('hide')` to keep\n// the dialog chrome out of the snapshot.\n\nimport { drawMarkers, type PinMarker } from '../internal/markers';\nimport { captureScreenshot } from '../internal/screenshot';\nimport { getAnnotationCache } from '../internal/annotation-cache';\nimport type { BeaconPlugin, PluginEntry } from '../types';\nimport { isPluginFailure } from '../types';\n\nexport interface DomSSOptions {\n quality?: number;\n pixelRatio?: number;\n accent?: string;\n}\n\nexport function domSS(opts: DomSSOptions = {}): BeaconPlugin {\n return {\n name: 'domSS',\n async capture(ctx) {\n // Fast path: reuse the cached annotated screenshot if domEle already\n // produced one during the interactive annotate session.\n const cached = getAnnotationCache();\n if (cached) {\n return { dataUrl: cached.dataUrl, mime: cached.mime };\n }\n\n const release = await ctx.requestMode('hide');\n try {\n // Yield one frame so the dialog-hide actually paints before\n // html-to-image walks the DOM — otherwise the open dialog can briefly\n // render into the snapshot.\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n const beaconHosts = Array.from(document.querySelectorAll('launch-kit-beacon')) as Element[];\n const shot = await captureScreenshot({\n quality: opts.quality,\n pixelRatio: opts.pixelRatio,\n excludeHosts: beaconHosts,\n });\n\n try {\n // If domEle has pins but didn't pre-cache (rare — error during pre-capture),\n // draw markers on the fresh screenshot.\n const domEleEntry = ctx.captured('domEle');\n const pins = readPinsFromEntry(domEleEntry);\n const viewport = { w: shot.width, h: shot.height, dpr: shot.pixelRatio };\n const accent = opts.accent ?? readAccent();\n const final = pins.length > 0\n ? await drawMarkers(shot.dataUrl, pins, viewport, accent)\n : shot.dataUrl;\n\n return { dataUrl: final, mime: 'image/jpeg' };\n } finally {\n shot.dispose();\n }\n } finally {\n release();\n }\n },\n };\n}\n\nfunction readPinsFromEntry(entry: PluginEntry | undefined): PinMarker[] {\n if (!entry || isPluginFailure(entry)) return [];\n const pinsRaw = (entry as { pins?: unknown }).pins;\n if (!Array.isArray(pinsRaw)) return [];\n return pinsRaw\n .filter((p): p is Record<string, unknown> => !!p && typeof p === 'object')\n .map((p) => ({\n number: Number(p.number) || 0,\n selector: typeof p.selector === 'string' ? p.selector : undefined,\n boundingRect: (p.boundingRect as PinMarker['boundingRect']) ?? { x: 0, y: 0, w: 0, h: 0 },\n }));\n}\n\nfunction readAccent(): string {\n if (typeof window === 'undefined') return '#0ea5e9';\n const host = document.querySelector('launch-kit-beacon');\n if (!host) return '#0ea5e9';\n const v = getComputedStyle(host).getPropertyValue('--beacon-accent').trim();\n return v || '#0ea5e9';\n}\n","// Body-portal overlay shown while a monitor session is recording. Two parts:\n// 1. Full-viewport dashed frame with soft inset glow — ambient \"you are being\n// recorded\" signal that survives drawer close.\n// 2. Draggable chip with REC dot, elapsed timer, URL, and Stop button.\n//\n// Body-portal (not the beacon Shadow DOM overlay layer) for the same reason as\n// pick-mode-overlay: position:fixed children of transformed/filtered/contained\n// ancestors get anchored to that ancestor instead of the viewport. The shadow\n// root sits inside the host's layout tree; the body does not.\n//\n// Styles ship via beaconStyles which ensureBeaconBodyStyles() injects into\n// document.head — see styles.ts for the class definitions.\n\nconst NO_CAPTURE_CLASS = 'beacon-no-capture';\nconst POS_STORAGE_KEY = '__lsBeaconMonitorChipPos';\nconst DEFAULT_ACCENT = '#10b981';\n\nexport interface MonitorOverlayOptions {\n /** Frame + chip accent. Falls back to emerald (--beacon-monitor-accent default). */\n accent?: string;\n /** Called when the chip's Stop button is clicked. Owner wires to session.stop(). */\n onStop: () => void;\n /** ms-epoch start time for the elapsed timer. Defaults to Date.now() at create. */\n startedAt?: number;\n /** Initial URL to show in the chip's secondary line. */\n url?: string | null;\n}\n\nexport interface MonitorOverlay {\n updateUrl(url: string | null): void;\n destroy(): void;\n}\n\nexport function createMonitorOverlay(opts: MonitorOverlayOptions): MonitorOverlay {\n const accent = opts.accent ?? DEFAULT_ACCENT;\n const startedAt = opts.startedAt ?? Date.now();\n\n // ── Frame ─────────────────────────────────────────────────────────────\n const frame = document.createElement('div');\n frame.className = `${NO_CAPTURE_CLASS} beacon-monitor-overlay-frame`;\n frame.setAttribute('aria-hidden', 'true');\n frame.style.setProperty('--beacon-monitor-accent', accent);\n document.body.appendChild(frame);\n\n // ── Chip ──────────────────────────────────────────────────────────────\n const chip = document.createElement('div');\n chip.className = `${NO_CAPTURE_CLASS} beacon-monitor-overlay-chip`;\n chip.setAttribute('role', 'status');\n chip.setAttribute('aria-label', 'Recording — drag to move');\n chip.style.setProperty('--beacon-monitor-accent', accent);\n\n const row = document.createElement('div');\n row.className = 'beacon-monitor-overlay-chip-row';\n\n const recDot = document.createElement('span');\n recDot.className = 'beacon-monitor-overlay-rec-dot';\n recDot.setAttribute('aria-hidden', 'true');\n\n const recLabel = document.createElement('span');\n recLabel.className = 'beacon-monitor-overlay-rec-label';\n recLabel.textContent = 'REC';\n\n const sep = document.createElement('span');\n sep.className = 'beacon-monitor-overlay-sep';\n sep.setAttribute('aria-hidden', 'true');\n sep.textContent = '·';\n\n const timer = document.createElement('span');\n timer.className = 'beacon-monitor-overlay-timer';\n timer.textContent = '00:00';\n\n const stopBtn = document.createElement('button');\n stopBtn.type = 'button';\n stopBtn.className = 'beacon-monitor-overlay-stop';\n stopBtn.textContent = 'Stop';\n stopBtn.setAttribute('aria-label', 'Stop monitoring');\n\n row.appendChild(recDot);\n row.appendChild(recLabel);\n row.appendChild(sep);\n row.appendChild(timer);\n row.appendChild(stopBtn);\n chip.appendChild(row);\n\n const urlEl = document.createElement('div');\n urlEl.className = 'beacon-monitor-overlay-url';\n if (opts.url) {\n urlEl.textContent = opts.url;\n urlEl.title = opts.url;\n } else {\n urlEl.style.display = 'none';\n }\n chip.appendChild(urlEl);\n\n document.body.appendChild(chip);\n\n // ── Position ──────────────────────────────────────────────────────────\n // Read AFTER appending so getBoundingClientRect() returns real dimensions\n // for the clamp.\n const initial = readSavedPos() ?? defaultPos();\n applyPos(clamp(initial));\n\n function readSavedPos(): { x: number; y: number } | null {\n try {\n const raw = localStorage.getItem(POS_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { x?: unknown; y?: unknown };\n const x = typeof parsed.x === 'number' ? parsed.x : NaN;\n const y = typeof parsed.y === 'number' ? parsed.y : NaN;\n if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n return { x, y };\n } catch {\n return null;\n }\n }\n\n function defaultPos(): { x: number; y: number } {\n const rect = chip.getBoundingClientRect();\n const w = rect.width || 200;\n return { x: Math.max(8, Math.floor((window.innerWidth - w) / 2)), y: 16 };\n }\n\n function clamp(pos: { x: number; y: number }): { x: number; y: number } {\n const margin = 8;\n const rect = chip.getBoundingClientRect();\n const w = rect.width || 200;\n const h = rect.height || 40;\n const maxX = Math.max(margin, window.innerWidth - w - margin);\n const maxY = Math.max(margin, window.innerHeight - h - margin);\n return {\n x: Math.min(Math.max(margin, pos.x), maxX),\n y: Math.min(Math.max(margin, pos.y), maxY),\n };\n }\n\n function applyPos(pos: { x: number; y: number }): void {\n chip.style.left = `${pos.x}px`;\n chip.style.top = `${pos.y}px`;\n }\n\n // ── Drag ──────────────────────────────────────────────────────────────\n let dragging = false;\n let activePointerId: number | null = null;\n let grabOffset = { x: 0, y: 0 };\n\n function onPointerDown(e: PointerEvent): void {\n // Skip the Stop button so its click reaches its own listener.\n if (e.target instanceof Element && e.target.closest('.beacon-monitor-overlay-stop')) return;\n e.preventDefault();\n dragging = true;\n activePointerId = e.pointerId;\n try { chip.setPointerCapture(e.pointerId); } catch { /* swallow */ }\n chip.setAttribute('data-dragging', 'true');\n const rect = chip.getBoundingClientRect();\n grabOffset = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }\n\n function onPointerMove(e: PointerEvent): void {\n if (!dragging || e.pointerId !== activePointerId) return;\n applyPos(clamp({ x: e.clientX - grabOffset.x, y: e.clientY - grabOffset.y }));\n }\n\n function endDrag(e: PointerEvent): void {\n if (!dragging || e.pointerId !== activePointerId) return;\n dragging = false;\n activePointerId = null;\n chip.removeAttribute('data-dragging');\n try { chip.releasePointerCapture(e.pointerId); } catch { /* swallow */ }\n // Persist on release only — saving on every pointermove would hammer storage.\n const rect = chip.getBoundingClientRect();\n try {\n localStorage.setItem(POS_STORAGE_KEY, JSON.stringify({ x: rect.left, y: rect.top }));\n } catch {\n /* swallow — storage disabled (Safari private mode) */\n }\n }\n\n chip.addEventListener('pointerdown', onPointerDown);\n chip.addEventListener('pointermove', onPointerMove);\n chip.addEventListener('pointerup', endDrag);\n chip.addEventListener('pointercancel', endDrag);\n\n // Stop button — attached AFTER drag handlers so the closest('.stop') check in\n // onPointerDown short-circuits before this fires.\n stopBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n opts.onStop();\n });\n\n // ── Reposition on viewport resize ─────────────────────────────────────\n function onResize(): void {\n const rect = chip.getBoundingClientRect();\n applyPos(clamp({ x: rect.left, y: rect.top }));\n }\n window.addEventListener('resize', onResize);\n\n // ── Timer ─────────────────────────────────────────────────────────────\n function tick(): void {\n const elapsed = Math.max(0, Math.floor((Date.now() - startedAt) / 1000));\n timer.textContent = formatElapsed(elapsed);\n }\n tick();\n const timerId = window.setInterval(tick, 1000);\n\n return {\n updateUrl(url) {\n if (url) {\n urlEl.textContent = url;\n urlEl.title = url;\n urlEl.style.display = '';\n } else {\n urlEl.style.display = 'none';\n }\n },\n destroy() {\n window.clearInterval(timerId);\n window.removeEventListener('resize', onResize);\n chip.removeEventListener('pointerdown', onPointerDown);\n chip.removeEventListener('pointermove', onPointerMove);\n chip.removeEventListener('pointerup', endDrag);\n chip.removeEventListener('pointercancel', endDrag);\n frame.remove();\n chip.remove();\n },\n };\n}\n\nfunction formatElapsed(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n if (h > 0) return `${pad(h)}:${pad(m)}:${pad(s)}`;\n return `${pad(m)}:${pad(s)}`;\n}\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n","// DOM-level capture for monitor mode: clicks, route changes, dialog mounts.\n//\n// Click capture is the differentiating signal. The recurring shape we debug is\n// \"user clicked X, nothing happened (or the wrong thing happened).\" A bare\n// click event tells you the target, but the *interesting* info is usually\n// further up: overlays sitting at the click coords, body pointer-events\n// disabled, open Radix dialogs intercepting via DismissableLayer. We snapshot\n// all of that on every click.\n//\n// We listen capture-phase + passive so we see the event even if a downstream\n// handler calls stopPropagation(); we never preventDefault — capture is\n// observational.\n\nimport type {\n MonitorClickEvent,\n MonitorClickTarget,\n MonitorDialogEvent,\n MonitorOverlayInfo,\n MonitorRouteEvent,\n MonitorSubmitEvent,\n MonitorSubmitField,\n} from './wire';\n\ntype Emit<E> = (event: Omit<E, 'ts' | 'sessionId' | 'seq'>) => void;\n\nexport interface DomCaptureCallbacks {\n emitClick: Emit<MonitorClickEvent>;\n emitRoute: Emit<MonitorRouteEvent>;\n emitDialog: Emit<MonitorDialogEvent>;\n emitSubmit: Emit<MonitorSubmitEvent>;\n}\n\nconst TEXT_LIMIT = 80;\nconst INTERACTIVE_SELECTOR = 'button, a, input[type=\"submit\"], input[type=\"button\"], [role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [role=\"option\"]';\n\nexport interface DomCaptureInstallation {\n uninstall(): void;\n}\n\nconst HTML_LIMIT = 1024;\nconst MAX_OVERLAYS = 5;\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) : s;\n}\n\n/**\n * Build a stable CSS selector for an element. Prefer #id, then tag.class.class,\n * walking up at most 5 levels. Not guaranteed unique but good enough for\n * \"the developer looking at the stream can find this element.\"\n */\nfunction buildSelector(el: Element): string {\n if (el.id) return `#${CSS.escape(el.id)}`;\n const parts: string[] = [];\n let cur: Element | null = el;\n for (let i = 0; i < 5 && cur; i++) {\n const tag = cur.tagName.toLowerCase();\n const id = cur.id ? `#${CSS.escape(cur.id)}` : '';\n const cls = cur.classList.length > 0\n ? '.' + Array.from(cur.classList).slice(0, 3).map(CSS.escape).join('.')\n : '';\n parts.unshift(`${tag}${id}${cls}`);\n if (id) break; // id is unique-enough; stop walking\n cur = cur.parentElement;\n }\n return parts.join(' > ');\n}\n\nfunction truncText(s: string | null | undefined, n: number): string | undefined {\n if (!s) return undefined;\n const trimmed = s.replace(/\\s+/g, ' ').trim();\n if (!trimmed) return undefined;\n return trimmed.length > n ? trimmed.slice(0, n) : trimmed;\n}\n\nfunction describeTarget(el: Element): MonitorClickTarget {\n const text = truncText(el.textContent, TEXT_LIMIT);\n const ariaLabel = truncText(el.getAttribute('aria-label'), TEXT_LIMIT);\n const testid = el.getAttribute('data-testid') || undefined;\n const name = el.getAttribute('name') || undefined;\n\n // Derived human label — pick the most informative thing we can find.\n // Falls back to the nearest interactive ancestor when the literal target\n // (e.g. an <svg> inside a <button>) has nothing useful on it directly.\n let label: string | undefined = ariaLabel || text;\n if (!label) {\n const ancestor = el.closest(INTERACTIVE_SELECTOR);\n if (ancestor && ancestor !== el) {\n label = truncText(ancestor.getAttribute('aria-label'), TEXT_LIMIT)\n || truncText(ancestor.textContent, TEXT_LIMIT);\n }\n }\n\n return {\n tag: el.tagName.toLowerCase(),\n id: el.id || null,\n classes: Array.from(el.classList).slice(0, 10),\n role: el.getAttribute('role'),\n selector: buildSelector(el),\n ...(text ? { text } : {}),\n ...(ariaLabel ? { ariaLabel } : {}),\n ...(testid ? { testid } : {}),\n ...(name ? { name } : {}),\n // Only include label when it adds something beyond `text` (avoids dup).\n ...(label && label !== text ? { label } : {}),\n };\n}\n\n/**\n * Snapshot the overlay stack at a point. Walks all fixed/sticky candidates and\n * keeps those covering the click. Returns the top N by z-index.\n *\n * querySelectorAll('body *') is expensive on large DOMs (10k+ nodes); we only\n * do this while monitor is on, and only on click. The cost is acceptable\n * because the whole point of monitor is to debug click-through bugs.\n */\nfunction overlaysAtPoint(x: number, y: number): MonitorOverlayInfo[] {\n const candidates: MonitorOverlayInfo[] = [];\n const all = document.querySelectorAll<HTMLElement>('body *');\n for (const el of Array.from(all)) {\n const cs = getComputedStyle(el);\n if (cs.position !== 'fixed' && cs.position !== 'sticky') continue;\n const rect = el.getBoundingClientRect();\n if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) continue;\n const z = parseInt(cs.zIndex, 10);\n if (!Number.isFinite(z) && cs.zIndex !== 'auto') continue;\n candidates.push({\n tag: el.tagName.toLowerCase(),\n zIndex: Number.isFinite(z) ? z : 0,\n pointerEvents: cs.pointerEvents,\n classes: Array.from(el.classList).slice(0, 5).join(' '),\n });\n }\n return candidates\n .sort((a, b) => b.zIndex - a.zIndex)\n .slice(0, MAX_OVERLAYS);\n}\n\n/**\n * Click + mousedown capture. Both kinds fire because they expose different\n * things — mousedown is what Radix DismissableLayer listens to for\n * outside-click dismissal; click is what navigation hangs off of.\n */\nfunction installClickCapture(cb: DomCaptureCallbacks): () => void {\n const handle = (kind: 'click' | 'mousedown') => (e: Event): void => {\n const me = e as MouseEvent;\n const target = me.target;\n if (!(target instanceof Element)) return;\n\n const x = me.clientX;\n const y = me.clientY;\n // elementFromPoint may differ from target if an overlay sits above —\n // that mismatch is itself diagnostic (\"the element you wanted is being\n // occluded by X\"). Compare and surface.\n const hit = document.elementFromPoint(x, y);\n const hitMatches = hit === target || (hit ? target.contains(hit) || hit.contains(target) : false);\n\n const openDialogs = document.querySelectorAll('[role=\"dialog\"][data-state=\"open\"]').length;\n const bodyPe = getComputedStyle(document.body).pointerEvents;\n // overlaysAtPoint walks every fixed/sticky element under <body> + calls\n // getComputedStyle on each — measurable cost on 5k+ DOMs. Only run it when\n // the click was intercepted, since that's the only case where the overlay\n // stack is the diagnostic answer. Happy-path clicks skip the walk entirely.\n const overlays = hitMatches ? [] : overlaysAtPoint(x, y);\n\n cb.emitClick({\n kind,\n target: describeTarget(target),\n hitMatchesTarget: hitMatches,\n ...(!hitMatches && hit instanceof Element ? { hitTarget: describeTarget(hit) } : {}),\n coords: { x, y },\n openDialogs,\n bodyPointerEvents: bodyPe,\n ...(overlays.length > 0 ? { overlaysAtPoint: overlays } : {}),\n });\n };\n\n const onClick = handle('click');\n const onMouseDown = handle('mousedown');\n // Capture-phase + passive — see the event even when a downstream handler\n // calls stopPropagation/stopImmediatePropagation.\n document.addEventListener('click', onClick, { capture: true, passive: true });\n document.addEventListener('mousedown', onMouseDown, { capture: true, passive: true });\n\n return () => {\n document.removeEventListener('click', onClick, { capture: true });\n document.removeEventListener('mousedown', onMouseDown, { capture: true });\n };\n}\n\n/**\n * SPA route capture. pushState/replaceState don't fire any event; we\n * monkey-patch to emit. popstate + hashchange are real events.\n */\nfunction installRouteCapture(cb: DomCaptureCallbacks): () => void {\n const originalPush = history.pushState;\n const originalReplace = history.replaceState;\n let lastUrl = window.location.href;\n\n const emit = (via: MonitorRouteEvent['via']): void => {\n const to = window.location.href;\n if (to === lastUrl) return;\n const from = lastUrl;\n lastUrl = to;\n cb.emitRoute({ kind: 'route', from, to, via });\n };\n\n history.pushState = function patchedPushState(...args: Parameters<typeof history.pushState>) {\n const ret = originalPush.apply(this, args);\n emit('pushState');\n return ret;\n };\n history.replaceState = function patchedReplaceState(...args: Parameters<typeof history.replaceState>) {\n const ret = originalReplace.apply(this, args);\n emit('replaceState');\n return ret;\n };\n\n const onPop = (): void => emit('popstate');\n const onHash = (): void => emit('hashchange');\n window.addEventListener('popstate', onPop);\n window.addEventListener('hashchange', onHash);\n\n return () => {\n history.pushState = originalPush;\n history.replaceState = originalReplace;\n window.removeEventListener('popstate', onPop);\n window.removeEventListener('hashchange', onHash);\n };\n}\n\n/**\n * Watch [role=\"dialog\"] subtree changes. Mount + unmount drive most modal bugs\n * (Radix dismissable, stuck overlay, focus trap). We also watch data-state\n * changes for \"dialog visibly closed but kept its element / outside-click\n * handler\" cases.\n */\nfunction installDialogCapture(cb: DomCaptureCallbacks): () => void {\n const seen = new WeakSet<Element>();\n\n const handle = (el: Element, action: 'mount' | 'unmount' | 'state'): void => {\n const selector = buildSelector(el);\n cb.emitDialog({\n kind: 'dialog',\n action,\n selector,\n state: el.getAttribute('data-state'),\n ...(action === 'mount' ? { outerHTML: truncate(el.outerHTML, HTML_LIMIT) } : {}),\n });\n };\n\n // Seed with already-mounted dialogs so we get unmount events when they later\n // disappear.\n for (const el of Array.from(document.querySelectorAll('[role=\"dialog\"]'))) {\n seen.add(el);\n }\n\n const obs = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of Array.from(m.addedNodes)) {\n if (!(node instanceof Element)) continue;\n const dialogs = node.matches?.('[role=\"dialog\"]')\n ? [node]\n : Array.from(node.querySelectorAll?.('[role=\"dialog\"]') ?? []);\n for (const d of dialogs) {\n if (seen.has(d)) continue;\n seen.add(d);\n handle(d, 'mount');\n }\n }\n for (const node of Array.from(m.removedNodes)) {\n if (!(node instanceof Element)) continue;\n const dialogs = node.matches?.('[role=\"dialog\"]')\n ? [node]\n : Array.from(node.querySelectorAll?.('[role=\"dialog\"]') ?? []);\n for (const d of dialogs) {\n if (!seen.has(d)) continue;\n seen.delete(d);\n handle(d, 'unmount');\n }\n }\n if (m.type === 'attributes' && m.attributeName === 'data-state' && m.target instanceof Element) {\n if (m.target.getAttribute('role') === 'dialog') handle(m.target, 'state');\n }\n }\n });\n obs.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-state'],\n });\n\n return () => obs.disconnect();\n}\n\n/**\n * Form submit capture. Emits one event per submitted form with a field-name\n * summary — values are NEVER captured (PII risk). hasValue is the only signal\n * about whether each field was filled. Listens capture-phase so we see\n * submissions even when a handler later calls preventDefault.\n */\nfunction installSubmitCapture(cb: DomCaptureCallbacks): () => void {\n const handler = (e: Event): void => {\n const form = e.target;\n if (!(form instanceof HTMLFormElement)) return;\n const fields: MonitorSubmitField[] = [];\n for (const el of Array.from(form.elements)) {\n if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement)) continue;\n const name = el.getAttribute('name') || '<unnamed>';\n const type = el instanceof HTMLInputElement ? el.type : el.tagName.toLowerCase();\n // hasValue: a non-empty string for text-like inputs; checked for checkboxes/radios.\n let hasValue: boolean;\n if (el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio')) {\n hasValue = el.checked;\n } else {\n hasValue = !!(el as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value;\n }\n fields.push({ name, type, hasValue });\n }\n cb.emitSubmit({\n kind: 'submit',\n form: {\n id: form.id || null,\n action: form.getAttribute('action') || null,\n method: (form.getAttribute('method') || 'GET').toUpperCase(),\n selector: buildSelector(form),\n fields,\n },\n });\n };\n document.addEventListener('submit', handler, { capture: true });\n return () => document.removeEventListener('submit', handler, { capture: true });\n}\n\nexport function installDomCapture(cb: DomCaptureCallbacks): DomCaptureInstallation {\n const undoClick = installClickCapture(cb);\n const undoRoute = installRouteCapture(cb);\n const undoDialog = installDialogCapture(cb);\n const undoSubmit = installSubmitCapture(cb);\n return {\n uninstall() {\n undoClick();\n undoRoute();\n undoDialog();\n undoSubmit();\n },\n };\n}\n","// Capture fetch + XMLHttpRequest activity for monitor mode.\n//\n// Default policy: emit only failed requests (status >= 400 OR threw).\n// Successful requests are silently skipped — capturing every successful API\n// call drowns the signal. verbose:true (passed in via start()) captures\n// everything.\n//\n// Body capture (for agent-driven debugging via MCP):\n// • Request body — captured for POST/PUT/PATCH/DELETE so the AI reading the\n// NDJSON sees what was attempted. Skipped for GET (no body) and HEAD.\n// • Response body — captured for failures (status >= 400) always; for 2xx\n// only in verbose mode.\n// • Both capped at 10KB; longer bodies are truncated with a flag.\n// • Both redacted: Authorization-style bearers, ls_pat_ PATs, JWT-shaped\n// strings → [REDACTED]. For JSON payloads, top-level keys matching\n// password/secret/token/apiKey/etc. have their values replaced wholesale.\n// • Authorization header value is NEVER captured — only its presence\n// (`request.hasAuth: true`) so the agent can tell auth was attached.\n\nimport type {\n MonitorBodyCapture,\n MonitorNetworkEvent,\n MonitorRequestCapture,\n} from './wire';\n\ntype Emit = (event: Omit<MonitorNetworkEvent, 'ts' | 'sessionId' | 'seq'>) => void;\n\nexport interface NetworkCaptureOptions {\n emit: Emit;\n verbose: boolean;\n}\n\nexport interface NetworkCaptureInstallation {\n uninstall(): void;\n}\n\nconst URL_LIMIT = 1000;\nconst BODY_LIMIT = 10 * 1024; // 10KB cap per body\nconst REDACTED = '[REDACTED]';\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\n\n// Secret-shaped strings — redacted wherever they appear in a body\nconst SECRET_PATTERNS: RegExp[] = [\n /Bearer\\s+[A-Za-z0-9._\\-+/=]+/gi,\n /\\bls_pat_[A-Za-z0-9_]+/g,\n // JWT: three dot-separated base64url segments starting with eyJ (the b64\n // encoding of the JSON {\"). Matches Auth0/Clerk/most providers' tokens.\n /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g,\n];\n\n// JSON keys whose values get wholesale-redacted regardless of value shape\nconst SENSITIVE_KEYS = /^(password|passwd|secret|token|api[_-]?key|auth|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key)$/i;\n\nfunction trunc(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) : s;\n}\n\nfunction redactString(s: string): string {\n let out = s;\n for (const re of SECRET_PATTERNS) {\n out = out.replace(re, REDACTED);\n }\n return out;\n}\n\nfunction redactJsonInPlace(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n if (typeof value === 'string') return redactString(value);\n return value;\n }\n if (Array.isArray(value)) return value.map(redactJsonInPlace);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = SENSITIVE_KEYS.test(k) ? REDACTED : redactJsonInPlace(v);\n }\n return out;\n}\n\nfunction redactBody(text: string, contentType: string | undefined): string {\n if (contentType && contentType.includes('application/json')) {\n try {\n const parsed = JSON.parse(text);\n return JSON.stringify(redactJsonInPlace(parsed));\n } catch {\n // Fall through to regex-only — JSON parse failed (malformed or not JSON).\n }\n }\n return redactString(text);\n}\n\n/** Apply redaction + size cap. Returns the wire-shaped capture object. */\nfunction captureBody(text: string, contentType: string | undefined): MonitorBodyCapture {\n const original = text.length;\n const cap: MonitorBodyCapture = { bodySize: original };\n if (original > BODY_LIMIT) {\n cap.body = redactBody(text.slice(0, BODY_LIMIT), contentType);\n cap.bodyTruncated = true;\n } else {\n cap.body = redactBody(text, contentType);\n }\n if (contentType) cap.contentType = contentType;\n return cap;\n}\n\n/** Read init.body or input.body as text, best-effort. Returns null if unreadable. */\nfunction readRequestBody(input: RequestInfo | URL, init: RequestInit | undefined): string | null {\n const body = init?.body;\n if (body != null) {\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof FormData) {\n // Don't capture values (PII risk); summarize field names + value sizes.\n const fields: string[] = [];\n body.forEach((v, k) => {\n fields.push(`${k}=${typeof v === 'string' ? `[${v.length}b]` : '[file]'}`);\n });\n return `[FormData] ${fields.join('&')}`;\n }\n if (body instanceof Blob) return `[Blob ${body.size}b ${body.type || 'unknown'}]`;\n if (body instanceof ArrayBuffer) return `[binary ${body.byteLength}b]`;\n if (ArrayBuffer.isView(body)) return `[binary ${(body as ArrayBufferView).byteLength}b]`;\n // ReadableStream — can't read without tee()-ing and risking caller breakage. Skip.\n return null;\n }\n // Body might be on a Request object passed as input.\n if (input instanceof Request) {\n // Can't synchronously read; cloning + reading is async. Skip in the request\n // path — the caller of fetch typically passes init.body anyway.\n return null;\n }\n return null;\n}\n\n/** Check whether an Authorization header is attached. Value is never read. */\nfunction detectAuth(input: RequestInfo | URL, init: RequestInit | undefined): boolean {\n const checkHeaders = (h: HeadersInit | undefined): boolean => {\n if (!h) return false;\n if (h instanceof Headers) return h.has('authorization');\n if (Array.isArray(h)) return h.some(([k]) => k.toLowerCase() === 'authorization');\n if (typeof h === 'object') return Object.keys(h).some((k) => k.toLowerCase() === 'authorization');\n return false;\n };\n if (checkHeaders(init?.headers)) return true;\n if (input instanceof Request && input.headers.has('authorization')) return true;\n return false;\n}\n\nfunction getRequestContentType(input: RequestInfo | URL, init: RequestInit | undefined): string | undefined {\n const fromHeaders = (h: HeadersInit | undefined): string | undefined => {\n if (!h) return undefined;\n if (h instanceof Headers) return h.get('content-type') || undefined;\n if (Array.isArray(h)) {\n const e = h.find(([k]) => k.toLowerCase() === 'content-type');\n return e ? e[1] : undefined;\n }\n if (typeof h === 'object') {\n for (const [k, v] of Object.entries(h)) {\n if (k.toLowerCase() === 'content-type') return v;\n }\n }\n return undefined;\n };\n return fromHeaders(init?.headers) ?? (input instanceof Request ? input.headers.get('content-type') || undefined : undefined);\n}\n\nfunction buildRequestCapture(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n method: string,\n): MonitorRequestCapture | undefined {\n if (!MUTATING_METHODS.has(method)) return undefined;\n const hasAuth = detectAuth(input, init);\n const bodyText = readRequestBody(input, init);\n if (bodyText == null && !hasAuth) return undefined;\n const contentType = getRequestContentType(input, init);\n const capture: MonitorRequestCapture = bodyText != null\n ? captureBody(bodyText, contentType)\n : {};\n if (hasAuth) capture.hasAuth = true;\n return capture;\n}\n\n/**\n * Wrap window.fetch. Captures method, URL, status, duration, and whether the\n * call failed. Restores the original on uninstall — but only if we're still\n * the outermost wrapper.\n *\n * We wrap (rather than PerformanceObserver) because we need the *URL the\n * developer wrote*, not the resolved one, and because PerformanceObserver\n * doesn't tell us whether the response was an error.\n */\nfunction wrapFetch(opts: NetworkCaptureOptions): () => void {\n const original = window.fetch;\n if (typeof original !== 'function') return () => { /* nothing to restore */ };\n\n const wrapped: typeof fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const start = performance.now();\n const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n // Snapshot the request BEFORE awaiting — init.body may be consumed by the\n // call (it's typically a string for JSON APIs, but defensively read first).\n const request = buildRequestCapture(input, init, method);\n\n try {\n // Call bound to window so fetch's internal `this`-dependent paths still\n // work. Passing globalThis explicitly is the spec-correct way to invoke\n // a free-standing fetch.\n const res = await original.call(window, input as RequestInfo, init);\n const durationMs = Math.round(performance.now() - start);\n const failed = res.status >= 400;\n\n // Capture response body for failures always; 2xx only in verbose mode.\n // Read from a clone so the caller still gets an unconsumed Response.\n let response: MonitorBodyCapture | undefined;\n if (failed || opts.verbose) {\n try {\n const text = await res.clone().text();\n const ct = res.headers.get('content-type') || undefined;\n response = captureBody(text, ct);\n } catch {\n // Body unreadable (already consumed, network error mid-read) — skip.\n }\n }\n\n if (failed || opts.verbose) {\n opts.emit({\n kind: 'fetch',\n url: trunc(url, URL_LIMIT),\n method,\n status: res.status,\n durationMs,\n failed,\n ...(request ? { request } : {}),\n ...(response ? { response } : {}),\n });\n }\n return res;\n } catch (err) {\n const durationMs = Math.round(performance.now() - start);\n opts.emit({\n kind: 'fetch',\n url: trunc(url, URL_LIMIT),\n method,\n status: 0,\n durationMs,\n failed: true,\n error: err instanceof Error ? err.message : String(err),\n ...(request ? { request } : {}),\n });\n throw err;\n }\n };\n\n // Tag so we can detect \"is this still our wrapper\" on uninstall. If another\n // SDK wrapped over us after we installed, leave their wrapper in place —\n // restoring `original` would clobber their instrumentation.\n (wrapped as unknown as { __lsBeaconWrapped: true }).__lsBeaconWrapped = true;\n window.fetch = wrapped;\n\n return () => {\n if ((window.fetch as unknown as { __lsBeaconWrapped?: true }).__lsBeaconWrapped) {\n window.fetch = original;\n }\n };\n}\n\n/**\n * Wrap XMLHttpRequest.prototype. Tracks method+URL+start via open()/send(),\n * reads status on loadend. Same emission policy as fetch.\n */\nfunction readXhrSendBody(body: Document | XMLHttpRequestBodyInit | null | undefined): string | null {\n if (body == null) return null;\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof FormData) {\n const fields: string[] = [];\n body.forEach((v, k) => {\n fields.push(`${k}=${typeof v === 'string' ? `[${v.length}b]` : '[file]'}`);\n });\n return `[FormData] ${fields.join('&')}`;\n }\n if (body instanceof Blob) return `[Blob ${body.size}b ${body.type || 'unknown'}]`;\n if (body instanceof ArrayBuffer) return `[binary ${body.byteLength}b]`;\n if (ArrayBuffer.isView(body)) return `[binary ${(body as ArrayBufferView).byteLength}b]`;\n // Document / XML payloads — rare; skip.\n return null;\n}\n\nfunction wrapXhr(opts: NetworkCaptureOptions): () => void {\n const proto = XMLHttpRequest.prototype;\n const originalOpen = proto.open;\n const originalSend = proto.send;\n const originalSetRequestHeader = proto.setRequestHeader;\n\n interface XhrMeta {\n method: string;\n url: string;\n start: number;\n request?: MonitorRequestCapture;\n /** Last set request content-type — needed for response.body redaction policy when reading. */\n requestContentType?: string;\n /** True if setRequestHeader('authorization', ...) was called. */\n hasAuth: boolean;\n }\n const state = new WeakMap<XMLHttpRequest, XhrMeta>();\n\n proto.open = function patchedOpen(\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n state.set(this, {\n method: method.toUpperCase(),\n url: typeof url === 'string' ? url : url.toString(),\n start: 0,\n hasAuth: false,\n });\n // @ts-expect-error — passthrough overload matrix is unwieldy; rest is forwarded as-is.\n return originalOpen.call(this, method, url, ...rest);\n };\n\n proto.setRequestHeader = function patchedSetRequestHeader(\n name: string,\n value: string,\n ): void {\n const meta = state.get(this);\n if (meta) {\n const lower = name.toLowerCase();\n if (lower === 'authorization') meta.hasAuth = true;\n else if (lower === 'content-type') meta.requestContentType = value;\n }\n return originalSetRequestHeader.call(this, name, value);\n };\n\n proto.send = function patchedSend(this: XMLHttpRequest, body?: Document | XMLHttpRequestBodyInit | null): void {\n const meta = state.get(this);\n if (meta) {\n meta.start = performance.now();\n // Build request snapshot for mutating methods.\n if (MUTATING_METHODS.has(meta.method)) {\n const bodyText = readXhrSendBody(body);\n if (bodyText != null) {\n meta.request = captureBody(bodyText, meta.requestContentType);\n } else {\n meta.request = {};\n }\n if (meta.hasAuth) meta.request.hasAuth = true;\n } else if (meta.hasAuth) {\n meta.request = { hasAuth: true };\n }\n }\n\n const onLoadEnd = (): void => {\n this.removeEventListener('loadend', onLoadEnd);\n const m = state.get(this);\n if (!m) return;\n const durationMs = Math.round(performance.now() - m.start);\n // status === 0 indicates the request errored or was aborted before a response.\n const failed = this.status === 0 || this.status >= 400;\n\n let response: MonitorBodyCapture | undefined;\n if ((failed || opts.verbose) && this.status > 0) {\n try {\n // responseText is only valid for text-shaped responseTypes (default + 'text').\n // Defensively gate.\n const rt = (this.responseType === '' || this.responseType === 'text') ? this.responseText : '';\n if (rt) {\n const ct = this.getResponseHeader('content-type') || undefined;\n response = captureBody(rt, ct);\n }\n } catch {\n // responseText access can throw if responseType is incompatible — skip.\n }\n }\n\n if (failed || opts.verbose) {\n opts.emit({\n kind: 'xhr',\n url: trunc(m.url, URL_LIMIT),\n method: m.method,\n status: this.status,\n durationMs,\n failed,\n ...(m.request ? { request: m.request } : {}),\n ...(response ? { response } : {}),\n });\n }\n state.delete(this);\n };\n this.addEventListener('loadend', onLoadEnd);\n return originalSend.call(this, body as XMLHttpRequestBodyInit | null);\n };\n\n return () => {\n proto.open = originalOpen;\n proto.send = originalSend;\n proto.setRequestHeader = originalSetRequestHeader;\n };\n}\n\nexport function installNetworkCapture(opts: NetworkCaptureOptions): NetworkCaptureInstallation {\n const undoFetch = wrapFetch(opts);\n const undoXhr = wrapXhr(opts);\n return {\n uninstall() {\n undoFetch();\n undoXhr();\n },\n };\n}\n","// Batched POST transport for monitor events.\n//\n// Buffers events in memory and flushes to the configured URL on a 1s timer,\n// when buffer hits 50 entries, or synchronously on pagehide / visibility:hidden\n// via navigator.sendBeacon. Per-event POSTs would flood the receiver during\n// click bursts; sendBeacon is the only mechanism that survives a teardown.\n//\n// On flush failure we surface via onError but don't retry — duplicates are\n// worse than gaps for a dev tool. Buffer caps at MAX_BUFFER and drops oldest\n// to bound memory if the receiver is unreachable for a long time.\n\nimport type { MonitorBatch, MonitorEvent } from './wire';\n\nconst FLUSH_INTERVAL_MS = 1000;\nconst FLUSH_AT_COUNT = 50;\nconst MAX_BUFFER = 500;\n\nexport interface TransportOptions {\n url: string;\n sessionId: string;\n /** Called when a flush failed (network error or non-2xx). For UI badge / console warn. */\n onError?: (err: Error) => void;\n}\n\nexport class MonitorTransport {\n private url: string;\n private sessionId: string;\n private onError?: (err: Error) => void;\n private buffer: MonitorEvent[] = [];\n private inflight = false;\n private timer: ReturnType<typeof setInterval> | null = null;\n private pagehideHandler?: () => void;\n private destroyed = false;\n\n constructor(opts: TransportOptions) {\n this.url = opts.url;\n this.sessionId = opts.sessionId;\n this.onError = opts.onError;\n\n this.timer = setInterval(() => { void this.flush(); }, FLUSH_INTERVAL_MS);\n this.pagehideHandler = () => this.flushSync();\n // pagehide fires for both unload AND bfcache eviction. Prefer it over\n // beforeunload (which doesn't fire on mobile when the user switches tabs).\n window.addEventListener('pagehide', this.pagehideHandler);\n // visibilitychange:hidden is the only reliable signal on iOS Safari when\n // the user backgrounds the tab. Flush sync there too.\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === 'hidden') this.flushSync();\n };\n\n enqueue(event: MonitorEvent): void {\n if (this.destroyed) return;\n this.buffer.push(event);\n if (this.buffer.length > MAX_BUFFER) {\n // Drop oldest non-flushed event rather than grow unbounded.\n this.buffer.shift();\n }\n if (this.buffer.length >= FLUSH_AT_COUNT) void this.flush();\n }\n\n /** Async flush via fetch. No-op when in-flight or empty. */\n async flush(): Promise<void> {\n if (this.destroyed) return;\n if (this.inflight || this.buffer.length === 0) return;\n const events = this.buffer.splice(0, FLUSH_AT_COUNT);\n const batch = this.makeBatch(events);\n this.inflight = true;\n try {\n const res = await fetch(this.url, {\n method: 'POST',\n // credentials:'omit' — going to the dev's local server, not the app\n // backend; avoid leaking session cookies cross-origin.\n credentials: 'omit',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n // keepalive lets the request survive a same-tick navigation when\n // pagehide didn't fire (e.g. a window.location.assign from script).\n keepalive: true,\n });\n if (!res.ok) {\n this.onError?.(new Error(`monitor flush: HTTP ${res.status}`));\n }\n } catch (err) {\n // Network failure (server gone, CORS, etc.) — surface but don't crash.\n // Events in this batch are LOST — re-queueing risks duplicates and we\n // can't tell the receiver \"this is a retry.\" Acceptable trade for dev tooling.\n this.onError?.(err instanceof Error ? err : new Error(String(err)));\n } finally {\n this.inflight = false;\n }\n }\n\n /** Synchronous flush via sendBeacon, used on pagehide / visibility:hidden. */\n private flushSync(): void {\n if (this.destroyed || this.buffer.length === 0) return;\n if (!navigator.sendBeacon) {\n // Old browsers — best-effort fetch with keepalive (no await; we're tearing down).\n void this.flush();\n return;\n }\n const events = this.buffer.splice(0);\n const batch = this.makeBatch(events);\n // sendBeacon doesn't accept Content-Type; the receiver detects JSON by\n // best-effort parsing anyway.\n const blob = new Blob([JSON.stringify(batch)], { type: 'application/json' });\n try {\n navigator.sendBeacon(this.url, blob);\n } catch {\n // sendBeacon can throw on payloads > ~64KB. Drop the batch.\n }\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.timer) clearInterval(this.timer);\n if (this.pagehideHandler) window.removeEventListener('pagehide', this.pagehideHandler);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n // Best-effort final flush so events from the moment of stop() make it out.\n this.flushSync();\n }\n\n private makeBatch(events: MonitorEvent[]): MonitorBatch {\n return {\n sessionId: this.sessionId,\n events,\n meta: {\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n v: 1,\n },\n };\n }\n}\n","// Monitor session orchestrator.\n//\n// One active session at a time, owned by module-level state. start(cfg)\n// installs all capture (errors, network, DOM) and kicks off the transport;\n// stop() uninstalls everything. resumeIfPersisted() reads sessionStorage so\n// an SPA reload mid-repro doesn't silently drop capture.\n//\n// Per design decision B1 the monitor owns its own EventBuffer instance for\n// error capture — independent of the `errors` plugin's buffer. Two window\n// listeners total (one per buffer); zero shared state.\n//\n// Module-level state is intentional: only one monitor session can be running\n// per page. Multi-init() is supported because destroy()/start()/stop() is\n// idempotent.\n\nimport { createEventBuffer, type CapturedRuntimeEvent, type EventBuffer } from '../event-buffer';\nimport { installDomCapture } from './capture-dom';\nimport { installNetworkCapture } from './capture-network';\nimport { MonitorTransport } from './transport';\nimport type { MonitorEvent } from './wire';\n\n// Distributive Omit so the union keeps its discriminant + body when we strip\n// the auto-filled fields. Without distribution, TS collapses to \"only fields\n// all members share\", which excludes label, data, etc. and breaks every emit.\ntype EventInput<T> = T extends unknown ? Omit<T, 'ts' | 'sessionId' | 'seq'> : never;\ntype MonitorEventInput = EventInput<MonitorEvent>;\n\nconst SESSION_URL_KEY = '__lsBeaconMonitorUrl';\nconst SESSION_ID_KEY = '__lsBeaconMonitorSession';\nconst SESSION_VERBOSE_KEY = '__lsBeaconMonitorVerbose';\nconst SESSION_DEADLINE_KEY = '__lsBeaconMonitorDeadline';\nconst DEFAULT_MAX_SESSION_MS = 30 * 60_000;\nconst PROBE_DATA_LIMIT = 4_096;\n\nexport interface MonitorConfig {\n /** Endpoint to POST batches to. Cleared on stop(). */\n url: string;\n /** If true, capture successful network calls in addition to failures. Default false. */\n verbose?: boolean;\n /** Hard session cap. Auto-stops monitoring at this point. Default 30 minutes. */\n maxSessionMs?: number;\n}\n\ntype Listener = (active: boolean, url: string | null) => void;\n\ninterface ActiveSession {\n url: string;\n sessionId: string;\n verbose: boolean;\n deadlineMs: number;\n seq: number;\n transport: MonitorTransport;\n errorsBuffer: EventBuffer;\n uninstallNetwork: () => void;\n uninstallDom: () => void;\n uninstallErrors: () => void;\n errorsUnsub: () => void;\n deadlineTimer: ReturnType<typeof setTimeout>;\n /** Index up to which the errors buffer was already drained. */\n drainedThrough: number;\n}\n\nlet active: ActiveSession | null = null;\nconst listeners = new Set<Listener>();\n\nfunction randomSessionId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n // crypto.randomUUID() returns \"xxxxxxxx-xxxx-...\" — slice keeps TS happy\n // under noUncheckedIndexedAccess.\n return crypto.randomUUID().slice(0, 8);\n }\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction safeSerialize(value: unknown): unknown {\n // Defend against cyclic refs + functions + large blobs. Strings truncate;\n // objects/arrays round-trip through JSON (which strips functions and throws\n // on cycles — we catch and stringify defensively).\n const seen = new WeakSet<object>();\n const walk = (v: unknown): unknown => {\n if (v === null || typeof v !== 'object') {\n if (typeof v === 'string') return v.length > PROBE_DATA_LIMIT ? v.slice(0, PROBE_DATA_LIMIT) : v;\n return v;\n }\n if (seen.has(v as object)) return '[cyclic]';\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(walk);\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(v as object).slice(0, 50)) {\n try {\n out[k] = walk((v as Record<string, unknown>)[k]);\n } catch {\n out[k] = '[unreadable]';\n }\n }\n return out;\n };\n try {\n return walk(value);\n } catch {\n return '[unserialisable]';\n }\n}\n\nfunction notify(): void {\n for (const fn of listeners) {\n try {\n fn(active !== null, active?.url ?? null);\n } catch {\n // listeners must not throw; ignore.\n }\n }\n}\n\nfunction stamp(partial: MonitorEventInput): MonitorEvent {\n if (!active) {\n // Programmer error — caller should check isActive() first. Throwing would\n // crash the host page, so synthesize a no-op event.\n return {\n ...(partial as object),\n ts: Date.now(),\n sessionId: '',\n seq: 0,\n } as unknown as MonitorEvent;\n }\n active.seq += 1;\n return {\n ...(partial as object),\n ts: Date.now(),\n sessionId: active.sessionId,\n seq: active.seq,\n } as unknown as MonitorEvent;\n}\n\nfunction enqueue(partial: MonitorEventInput): void {\n if (!active) return;\n const event = stamp(partial);\n active.transport.enqueue(event);\n}\n\nfunction persistSession(): void {\n if (!active) return;\n try {\n sessionStorage.setItem(SESSION_URL_KEY, active.url);\n sessionStorage.setItem(SESSION_ID_KEY, active.sessionId);\n sessionStorage.setItem(SESSION_VERBOSE_KEY, active.verbose ? '1' : '0');\n sessionStorage.setItem(SESSION_DEADLINE_KEY, String(active.deadlineMs));\n } catch {\n // sessionStorage disabled (Safari private mode). Session still works,\n // just doesn't survive a reload.\n }\n}\n\nfunction clearPersistedSession(): void {\n try {\n sessionStorage.removeItem(SESSION_URL_KEY);\n sessionStorage.removeItem(SESSION_ID_KEY);\n sessionStorage.removeItem(SESSION_VERBOSE_KEY);\n sessionStorage.removeItem(SESSION_DEADLINE_KEY);\n } catch {\n // ignore\n }\n}\n\nfunction readPersistedSession(): { url: string; verbose: boolean; deadlineMs: number } | null {\n try {\n const url = sessionStorage.getItem(SESSION_URL_KEY);\n if (!url) return null;\n const verbose = sessionStorage.getItem(SESSION_VERBOSE_KEY) === '1';\n const deadlineRaw = sessionStorage.getItem(SESSION_DEADLINE_KEY);\n const deadlineMs = deadlineRaw ? Number(deadlineRaw) : Date.now() + DEFAULT_MAX_SESSION_MS;\n if (Number.isFinite(deadlineMs) && deadlineMs <= Date.now()) {\n clearPersistedSession();\n return null;\n }\n return { url, verbose, deadlineMs };\n } catch {\n return null;\n }\n}\n\nfunction emitErrorEvent(ev: CapturedRuntimeEvent): void {\n if (!active) return;\n active.seq += 1;\n active.transport.enqueue({\n kind: ev.kind,\n ts: ev.ts,\n sessionId: active.sessionId,\n seq: active.seq,\n message: ev.message,\n ...(ev.stack ? { stack: ev.stack } : {}),\n ...(ev.source ? { source: ev.source } : {}),\n ...(typeof ev.line === 'number' ? { line: ev.line } : {}),\n ...(typeof ev.col === 'number' ? { col: ev.col } : {}),\n });\n}\n\nexport function start(config: MonitorConfig): void {\n if (active) stop();\n if (!config.url) return;\n\n const maxMs = config.maxSessionMs ?? DEFAULT_MAX_SESSION_MS;\n const deadlineMs = Date.now() + maxMs;\n const sessionId = randomSessionId();\n const verbose = !!config.verbose;\n\n const transport = new MonitorTransport({\n url: config.url,\n sessionId,\n onError: (err) => {\n // Soft-fail. We don't tear down on transient errors — the dev's local\n // server might just be restarting. Surface once so the user sees\n // \"monitor isn't reaching anything\" without a teardown loop.\n console.warn('[launch-kit-beacon] monitor transport error:', err.message);\n },\n });\n\n // Monitor's own error buffer (per B1 — no sharing with errors plugin).\n const errorsBuffer = createEventBuffer();\n const uninstallErrors = errorsBuffer.install();\n\n // Drain anything captured before subscribe, then keep streaming.\n const existing = errorsBuffer.snapshot();\n for (const ev of existing) emitErrorEvent(ev);\n let drainedThrough = existing.length;\n const errorsUnsub = errorsBuffer.subscribe(() => {\n if (!active) return;\n const all = active.errorsBuffer.snapshot();\n while (active.drainedThrough < all.length) {\n const ev = all[active.drainedThrough];\n if (ev) emitErrorEvent(ev);\n active.drainedThrough += 1;\n }\n });\n\n const net = installNetworkCapture({\n emit: (partial) => enqueue(partial),\n verbose,\n });\n\n const dom = installDomCapture({\n emitClick: (partial) => enqueue(partial),\n emitRoute: (partial) => enqueue(partial),\n emitDialog: (partial) => enqueue(partial),\n emitSubmit: (partial) => enqueue(partial),\n });\n\n const deadlineTimer = setTimeout(() => {\n console.info('[launch-kit-beacon] monitor session expired (max duration reached)');\n stop();\n }, Math.max(0, deadlineMs - Date.now()));\n\n active = {\n url: config.url,\n sessionId,\n verbose,\n deadlineMs,\n seq: 0,\n transport,\n errorsBuffer,\n uninstallNetwork: net.uninstall,\n uninstallDom: dom.uninstall,\n uninstallErrors,\n errorsUnsub,\n deadlineTimer,\n drainedThrough,\n };\n\n persistSession();\n notify();\n}\n\n/**\n * Stop the session AND forget it. Used when the user explicitly clicks Stop or\n * the deadline expires — clears sessionStorage so the next page load doesn't\n * resume. For host-driven teardown (AppHeader unmount, HMR) call suspend()\n * instead so resume can rehydrate.\n */\nexport function stop(): void {\n tearDownActive();\n clearPersistedSession();\n notify();\n}\n\n/**\n * Tear down capture + transport BUT keep sessionStorage intact so the next\n * init() can resumeIfPersisted(). Used when the host (e.g. AppHeader) unmounts\n * mid-session due to a layout swap — without this, crossing Next.js route\n * groups kills the session permanently because destroy() → abort → stop()\n * would clear the persistence keys we rely on for rehydrate.\n */\nexport function suspend(): void {\n if (!active) return;\n tearDownActive();\n notify();\n}\n\nfunction tearDownActive(): void {\n if (!active) return;\n clearTimeout(active.deadlineTimer);\n active.errorsUnsub();\n active.uninstallErrors();\n active.uninstallNetwork();\n active.uninstallDom();\n active.transport.destroy();\n active = null;\n}\n\nexport function probe(label: string, data?: unknown): void {\n if (!active) return;\n enqueue({\n kind: 'probe',\n label: label.slice(0, 200),\n data: safeSerialize(data),\n });\n}\n\nexport function isActive(): boolean {\n return active !== null;\n}\n\nexport function currentUrl(): string | null {\n return active?.url ?? null;\n}\n\n/**\n * Subscribe to active-state changes. Used by the panel UI to update its\n * display when start()/stop() fires.\n */\nexport function subscribe(fn: Listener): () => void {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n}\n\n/**\n * Resume a persisted session if one exists in sessionStorage. Called from the\n * plugin's setupOnce so an SPA reload during active monitoring doesn't drop\n * capture. No-op when no session was persisted or the deadline has passed.\n */\nexport function resumeIfPersisted(): void {\n if (active) return;\n if (typeof window === 'undefined') return;\n const persisted = readPersistedSession();\n if (!persisted) return;\n start({\n url: persisted.url,\n verbose: persisted.verbose,\n maxSessionMs: Math.max(60_000, persisted.deadlineMs - Date.now()),\n });\n}\n","// liveMonitor plugin — paste-URL panel that drives the live-event side-channel.\n//\n// Lifecycle (per the new plugin contract):\n// setupOnce → resume any sessionStorage-persisted session; wire ctx.signal\n// so destroy() cleanly stops the session and unsubscribes.\n// form → render an imperative panel into the drawer body. Inactive\n// state shows URL input + Start + verbose toggle; active state\n// shows the URL + Stop button + REC indicator. Subscribes to\n// session active-state changes for live updates.\n//\n// Capture is NOT contributed to the feedback payload — liveMonitor lives on\n// its own side-channel (the launch-beacon receiver), not /api/feedback. The\n// plugin omits `capture()` for that reason.\n\nimport { createMonitorOverlay, type MonitorOverlay } from '../internal/monitor/overlay';\nimport * as session from '../internal/monitor/session';\nimport type { BeaconPlugin } from '../types';\n\nexport interface LiveMonitorOptions {\n /** Hard session cap. Auto-stops monitoring at this point. Default 30 minutes. */\n maxSessionMs?: number;\n}\n\nexport function liveMonitor(opts: LiveMonitorOptions = {}): BeaconPlugin {\n let panelRoot: HTMLDivElement | null = null;\n let unsubscribeActive: (() => void) | null = null;\n let lastUrlInput = '';\n let overlay: MonitorOverlay | null = null;\n\n function mountOverlay(): void {\n if (overlay) return;\n overlay = createMonitorOverlay({\n onStop: () => session.stop(),\n url: session.currentUrl(),\n });\n }\n\n function destroyOverlay(): void {\n if (!overlay) return;\n try { overlay.destroy(); } catch { /* swallow */ }\n overlay = null;\n }\n\n function findShadowRoot(): ShadowRoot | null {\n const host = document.querySelector('launch-kit-beacon');\n return host?.shadowRoot ?? null;\n }\n\n function renderInactive(): void {\n if (!panelRoot) return;\n panelRoot.innerHTML = '';\n\n const title = document.createElement('div');\n title.className = 'beacon-monitor-title';\n title.textContent = 'Monitor — paste a stream URL';\n panelRoot.appendChild(title);\n\n const row = document.createElement('div');\n row.className = 'beacon-monitor-row';\n\n const urlInput = document.createElement('input');\n urlInput.type = 'url';\n urlInput.className = 'beacon-monitor-input';\n urlInput.placeholder = 'http://localhost:9876/m/…';\n urlInput.value = lastUrlInput;\n urlInput.autocomplete = 'off';\n urlInput.spellcheck = false;\n row.appendChild(urlInput);\n\n const startBtn = document.createElement('button');\n startBtn.type = 'button';\n startBtn.className = 'beacon-monitor-btn';\n startBtn.textContent = 'Start';\n startBtn.disabled = !lastUrlInput.trim();\n row.appendChild(startBtn);\n\n panelRoot.appendChild(row);\n\n const verboseLabel = document.createElement('label');\n verboseLabel.className = 'beacon-monitor-verbose';\n const verboseInput = document.createElement('input');\n verboseInput.type = 'checkbox';\n verboseInput.dataset.role = 'verbose';\n verboseLabel.appendChild(verboseInput);\n verboseLabel.appendChild(document.createTextNode(' verbose (capture successful network too)'));\n panelRoot.appendChild(verboseLabel);\n\n const help = document.createElement('div');\n help.className = 'beacon-monitor-help';\n help.textContent = 'Streams clicks, failed network, errors, route + dialog changes.';\n panelRoot.appendChild(help);\n\n urlInput.addEventListener('input', () => {\n lastUrlInput = urlInput.value;\n startBtn.disabled = !urlInput.value.trim();\n });\n\n startBtn.addEventListener('click', () => {\n const value = urlInput.value.trim();\n if (!value) return;\n // Validate URL shape — start() doesn't, so surface bad input here.\n try {\n // eslint-disable-next-line no-new\n new URL(value);\n } catch {\n urlInput.setCustomValidity('Enter a valid URL (e.g. http://localhost:9876/m/abc)');\n urlInput.reportValidity();\n return;\n }\n urlInput.setCustomValidity('');\n session.start({\n url: value,\n verbose: verboseInput.checked,\n ...(opts.maxSessionMs !== undefined ? { maxSessionMs: opts.maxSessionMs } : {}),\n });\n });\n }\n\n function renderActive(): void {\n if (!panelRoot) return;\n panelRoot.innerHTML = '';\n const url = session.currentUrl() ?? '';\n\n const title = document.createElement('div');\n title.className = 'beacon-monitor-title';\n const rec = document.createElement('span');\n rec.className = 'beacon-monitor-rec';\n rec.setAttribute('aria-hidden', 'true');\n title.appendChild(rec);\n title.appendChild(document.createTextNode(' Monitor — recording'));\n panelRoot.appendChild(title);\n\n const urlEl = document.createElement('div');\n urlEl.className = 'beacon-monitor-active-url';\n urlEl.title = url;\n urlEl.textContent = url;\n panelRoot.appendChild(urlEl);\n\n const row = document.createElement('div');\n row.className = 'beacon-monitor-row';\n const stopBtn = document.createElement('button');\n stopBtn.type = 'button';\n stopBtn.className = 'beacon-monitor-btn stop';\n stopBtn.textContent = 'Stop monitoring';\n stopBtn.addEventListener('click', () => session.stop());\n row.appendChild(stopBtn);\n panelRoot.appendChild(row);\n\n const help = document.createElement('div');\n help.className = 'beacon-monitor-help';\n help.textContent = 'Events stream to the URL above. Auto-stops after 30 min.';\n panelRoot.appendChild(help);\n }\n\n function render(): void {\n if (session.isActive()) renderActive();\n else renderInactive();\n }\n\n return {\n name: 'liveMonitor',\n setupOnce(ctx) {\n // Resume any sessionStorage-persisted session so an SPA reload mid-repro\n // doesn't drop capture.\n session.resumeIfPersisted();\n\n // Mirror current state into the body-portal overlay. Mount on first\n // active=true (including the resume case), destroy on active=false.\n if (session.isActive()) mountOverlay();\n const unsubscribeOverlay = session.subscribe((active, url) => {\n if (active) {\n mountOverlay();\n overlay?.updateUrl(url);\n } else {\n destroyOverlay();\n }\n });\n\n // SUSPEND (not stop) on destroy() — host-driven teardown (AppHeader\n // unmount on layout swap, HMR) must keep sessionStorage intact so the\n // next init() can resumeIfPersisted(). Only user-initiated Stop or\n // deadline expiry should forget the session.\n const onAbort = () => {\n destroyOverlay();\n unsubscribeOverlay();\n try { session.suspend(); } catch { /* swallow */ }\n };\n ctx.signal.addEventListener('abort', onAbort, { once: true });\n\n // Find shadow root so the panel can attach proper styles. Strictly\n // observational here — setupOnce returns no teardown.\n void findShadowRoot;\n },\n form() {\n return {\n render: (slot) => {\n panelRoot = document.createElement('div');\n panelRoot.className = 'beacon-monitor';\n slot.appendChild(panelRoot);\n\n render();\n unsubscribeActive = session.subscribe(() => render());\n\n return () => {\n unsubscribeActive?.();\n unsubscribeActive = null;\n panelRoot = null;\n };\n },\n };\n },\n // No capture(): liveMonitor is a side-channel, not a feedback payload contributor.\n };\n}\n\n/**\n * Programmatic API exports. Mirrors the plugin's runtime entry points so app\n * code can drive monitor without touching the UI (e.g. emit a probe from a\n * button click handler during a known-bad repro).\n */\nexport { start as startMonitor, stop as stopMonitor, probe, isActive as isMonitorActive, currentUrl as currentMonitorUrl } from '../internal/monitor/session';\nexport type { MonitorConfig } from '../internal/monitor/session';\n","// Core orchestrator: singleton, init/show/hide/destroy/status/on/off, submit lifecycle.\n//\n// Submit lifecycle (§7):\n// 1. validate description → 2. allocate per-submit AbortController →\n// 3. capture plugins in order → 4. wrap → 5. beforeSubmit (cancellable) →\n// 6. POST → 7. afterSubmit + system event → 8. clear _currentSubmit.\n\nimport { createCtx, type CtxHost } from './ctx';\nimport { BEACON_TAG, defineBeaconElement, LaunchKitBeacon } from './element';\nimport { createRegistry, type Registry, type PluginErrorReport } from './registry';\nimport { postFeedback } from './transport';\nimport type {\n BeaconCtx,\n BeaconLifecycleEvent,\n BeaconPlugin,\n BeaconStatus,\n ContextConfig,\n DeclarativeForm,\n FeedbackPayload,\n HeadersConfig,\n ImperativeForm,\n InitOptions,\n LabelMap,\n Mode,\n PayloadMetadata,\n PluginEntry,\n PluginStatus,\n Position,\n Severity,\n SystemEvent,\n SystemEventPayload,\n Theme,\n TransportResponse,\n} from './types';\nimport { DialogView, defaultLabels, type PluginPanelSource } from './ui/dialog';\nimport { attachOverlay, createOverlayHost, type OverlayHost } from './ui/overlay';\nimport { metadata as presetMetadata, errors as presetErrors, domEle as presetDomEle, domSS as presetDomSS } from './plugins';\nimport { ensureBeaconBodyStyles } from './styles';\nimport { clearAnnotationCache } from './internal/annotation-cache';\n\ninterface BeaconInstance {\n endpoint: string;\n headers: HeadersConfig | undefined;\n context: ContextConfig | undefined;\n credentials: RequestCredentials;\n plugins: BeaconPlugin[];\n registry: Registry;\n dialog: DialogView;\n overlayHost: OverlayHost;\n hostElement: LaunchKitBeacon;\n initAbort: AbortController;\n labels: LabelMap;\n debug: boolean;\n healthIndicator: 'never' | 'dev' | 'always';\n position: Position;\n theme: Theme;\n // ── Per-submit state ──\n currentSubmit: AbortController | null;\n capturedEntries: Record<string, PluginEntry>;\n // ── Form values (plugin-namespaced) ──\n formValues: Record<string, Record<string, unknown>>;\n // ── Lifecycle subscribers (per-submit ctx-channel) ──\n lifecycleHandlers: {\n open: Set<(e: BeaconLifecycleEvent) => void>;\n close: Set<(e: BeaconLifecycleEvent) => void>;\n beforeSubmit: Set<(e: BeaconLifecycleEvent) => void>;\n afterSubmit: Set<(e: BeaconLifecycleEvent) => void>;\n };\n // ── Plugin form panels resolved at open() ──\n panelSources: PluginPanelSource[];\n}\n\nlet current: BeaconInstance | null = null;\n\nconst systemHandlers: {\n [E in SystemEvent]: Set<(e: SystemEventPayload<E>) => void>;\n} = {\n 'plugin:error': new Set(),\n 'submit:success': new Set(),\n 'submit:error': new Set(),\n 'ready': new Set(),\n};\n\n// ── Public API ──────────────────────────────────────────\n\nexport function init(opts: InitOptions): void {\n if (typeof window === 'undefined') return;\n if (!opts.endpoint) throw new Error('init: endpoint is required');\n\n defineBeaconElement();\n destroy();\n\n const labels: LabelMap = { ...defaultLabels(), ...(opts.labels ?? {}) };\n const initAbort = new AbortController();\n const plugins = resolvePluginList(opts);\n const position: Position = opts.position ?? 'bottom-right';\n const theme: Theme = opts.theme ?? 'auto';\n\n // Body-mounted UI (pin popover, pick-mode overlay) lives outside the shadow\n // root — its styles must be available in document.head.\n ensureBeaconBodyStyles();\n\n ensureHost(opts, position, theme);\n const hostElement = document.querySelector<LaunchKitBeacon>(BEACON_TAG);\n if (!hostElement) {\n throw new Error('init: failed to acquire <launch-kit-beacon> host');\n }\n // connectedCallback runs synchronously when the element is in the DOM.\n // shadow root + default trigger are guaranteed by this point.\n if (!hostElement.shadow) {\n throw new Error('init: host element shadow root not initialized');\n }\n\n const overlayHost = createOverlayHost(hostElement.shadow);\n const dialog = new DialogView(\n labels,\n ['bug', 'idea', 'ux', 'a11y'],\n {\n onSubmit: () => { void runSubmit(); },\n onClose: (reason) => { dispatchLifecycle('close', {}); if (reason === 'user') resetFormState(); },\n },\n );\n hostElement.shadow.appendChild(dialog.root);\n // Mark host so screenshot plugins can exclude it.\n hostElement.classList.add('beacon-no-capture');\n\n const registry = createRegistry(plugins);\n\n const instance: BeaconInstance = {\n endpoint: opts.endpoint,\n headers: opts.headers,\n context: opts.context,\n credentials: opts.credentials ?? 'omit',\n plugins,\n registry,\n dialog,\n overlayHost,\n hostElement,\n initAbort,\n labels,\n debug: !!opts.debug || debugFromUrl(),\n healthIndicator: opts.healthIndicator ?? 'never',\n position,\n theme,\n currentSubmit: null,\n capturedEntries: {},\n formValues: {},\n lifecycleHandlers: {\n open: new Set(),\n close: new Set(),\n beforeSubmit: new Set(),\n afterSubmit: new Set(),\n },\n panelSources: [],\n };\n\n current = instance;\n\n // Wire trigger BEFORE installing plugins so a setupOnce that opens the dialog\n // synchronously (rare but possible) works.\n hostElement.onTriggerClick = () => show();\n\n // Install plugins. setupOnce errors are caught and reported but never block init.\n registry.install(\n (name) => makeCtxForPlugin(name),\n (err) => handlePluginError(err),\n );\n\n dispatchSystem('ready', { ready: true });\n if (instance.debug) console.info('[beacon] ready', instance.endpoint);\n}\n\nexport function show(): void {\n const inst = current;\n if (!inst) return;\n if (inst.currentSubmit) return; // §7 concurrency: show is a no-op while submit in flight\n // Resolve plugin form panels fresh at open() so plugins can return different\n // forms each time (e.g., based on current page state).\n inst.panelSources = inst.plugins\n .map<PluginPanelSource | null>((p) => {\n if (!p.form) return null;\n const ctx = makeCtxForPlugin(p.name);\n let form: DeclarativeForm | ImperativeForm;\n try {\n form = p.form(ctx);\n } catch (err) {\n handlePluginError({\n plugin: p.name,\n error: err instanceof Error ? err : new Error(String(err)),\n at: 'form',\n });\n return null;\n }\n return { name: p.name, form, ctx };\n })\n .filter((x): x is PluginPanelSource => x !== null);\n\n inst.dialog.installPluginPanels(inst.panelSources, {\n get: (plugin, name) => inst.formValues[plugin]?.[name],\n set: (plugin, name, value) => {\n const ns = (inst.formValues[plugin] ??= {});\n ns[name] = value;\n },\n });\n inst.dialog.open();\n dispatchLifecycle('open', {});\n}\n\nexport function hide(): void {\n const inst = current;\n if (!inst) return;\n inst.dialog.close('user');\n}\n\nexport function destroy(): void {\n const inst = current;\n if (!inst) return;\n // Abort the per-init signal first so plugins observing ctx.signal can clean up.\n inst.initAbort.abort();\n // Cancel any in-flight submit.\n inst.currentSubmit?.abort();\n inst.registry.destroy();\n // Drop any annotated screenshot the prior session cached. Without this an\n // HMR-reload of the consumer would resurrect last-session pins/screenshot.\n clearAnnotationCache();\n // Tear down dialog + overlay from the host's shadow DOM.\n try {\n inst.dialog.root.remove();\n inst.overlayHost.layer.remove();\n } catch { /* swallow */ }\n inst.hostElement.onTriggerClick = null;\n current = null;\n}\n\nexport function status(): BeaconStatus {\n const inst = current;\n if (!inst) {\n return { ready: false, transport: 'idle', plugins: {} };\n }\n return {\n ready: true,\n transport: 'idle',\n plugins: inst.registry.status(),\n };\n}\n\nexport function on<E extends SystemEvent>(\n event: E,\n handler: (payload: SystemEventPayload<E>) => void,\n): () => void {\n (systemHandlers[event] as Set<(p: SystemEventPayload<E>) => void>).add(handler);\n return () => off(event, handler);\n}\n\nexport function off<E extends SystemEvent>(\n event: E,\n handler: (payload: SystemEventPayload<E>) => void,\n): void {\n (systemHandlers[event] as Set<(p: SystemEventPayload<E>) => void>).delete(handler);\n}\n\n// ── Internal ──────────────────────────────────────────\n\nfunction ensureHost(opts: InitOptions, position: Position, theme: Theme): void {\n let existing = document.querySelector<LaunchKitBeacon>(BEACON_TAG);\n if (!existing) {\n // No host in the page — create one with the resolved defaults. Callers can\n // still mount their own <launch-kit-beacon> in JSX for slot trigger control.\n existing = document.createElement(BEACON_TAG) as LaunchKitBeacon;\n existing.setAttribute('position', position);\n existing.setAttribute('theme', theme);\n if (position === 'hidden') {\n existing.style.position = 'absolute';\n existing.style.left = '-9999px';\n }\n (document.body ?? document.documentElement).appendChild(existing);\n return;\n }\n\n // Host already in the DOM (JSX-mounted). §8: JS init wins on attribute\n // conflict — but only when the consumer EXPLICITLY passed that attribute\n // via init(opts). When init() omits position/theme, the JSX attribute is\n // authoritative — overwriting with our default (\"bottom-right\") would\n // silently relocate a slotted-trigger consumer's button to the corner.\n if (opts.position !== undefined) existing.setAttribute('position', position);\n if (opts.theme !== undefined) existing.setAttribute('theme', theme);\n}\n\nfunction resolvePluginList(opts: InitOptions): BeaconPlugin[] {\n // Semantic (§3): `plugins` overrides the default preset.\n // `defaultPlugins: false` strips the preset (relevant when no `plugins` given).\n if (opts.plugins) return opts.plugins;\n if (opts.defaultPlugins === false) return [];\n return defaultPreset();\n}\n\nfunction defaultPreset(): BeaconPlugin[] {\n return [presetMetadata(), presetErrors(), presetDomEle(), presetDomSS()];\n}\n\nfunction debugFromUrl(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return new URLSearchParams(window.location.search).has('lsbeacon-debug');\n } catch {\n return false;\n }\n}\n\nfunction makeCtxForPlugin(name: string): BeaconCtx {\n const inst = current;\n const host: CtxHost = {\n getCaptured: (n) => inst?.capturedEntries[n],\n getFormValues: (pluginName) => {\n if (!inst) return {};\n return (inst.formValues[pluginName] ??= {});\n },\n getCaptureSignal: () => inst?.currentSubmit?.signal,\n getInitSignal: () => inst!.initAbort.signal,\n requestMode: async (mode: Mode) => {\n if (!inst) return () => {};\n return inst.dialog.requestMode(mode);\n },\n overlay: (opts) => {\n if (!inst) return () => {};\n return attachOverlay(inst.overlayHost, opts.render);\n },\n onLifecycle: (ev, handler) => {\n if (!inst) return () => {};\n const set = inst.lifecycleHandlers[ev];\n set.add(handler);\n return () => set.delete(handler);\n },\n };\n return createCtx(name, host);\n}\n\nfunction dispatchLifecycle(\n ev: 'open' | 'close' | 'beforeSubmit' | 'afterSubmit',\n e: BeaconLifecycleEvent,\n): void {\n const inst = current;\n if (!inst) return;\n for (const fn of inst.lifecycleHandlers[ev]) {\n try { fn(e); } catch (err) {\n if (inst.debug) console.error('[beacon] lifecycle handler threw:', err);\n }\n }\n}\n\nfunction dispatchSystem<E extends SystemEvent>(event: E, payload: SystemEventPayload<E>): void {\n for (const fn of systemHandlers[event] as Set<(p: SystemEventPayload<E>) => void>) {\n try { fn(payload); } catch (err) {\n if (current?.debug) console.error('[beacon] system handler threw:', err);\n }\n }\n}\n\nfunction handlePluginError(err: PluginErrorReport): void {\n dispatchSystem('plugin:error', { plugin: err.plugin, error: err.error, at: err.at });\n const inst = current;\n if (!inst) return;\n if (inst.healthIndicator === 'always' || (inst.healthIndicator === 'dev' && inst.debug)) {\n inst.hostElement.setHealthIndicator(true);\n }\n if (inst.debug) console.warn(`[beacon] plugin \"${err.plugin}\" ${err.at} failed:`, err.error);\n}\n\nfunction resetFormState(): void {\n const inst = current;\n if (!inst) return;\n inst.dialog.resetState();\n inst.dialog.clearPluginPanels();\n inst.formValues = {};\n}\n\nasync function runSubmit(): Promise<void> {\n const inst = current;\n if (!inst) return;\n if (inst.currentSubmit) return;\n\n const description = inst.dialog.getDescription().trim();\n if (!description) {\n inst.dialog.setStatus('Description is required', 'error');\n return;\n }\n\n inst.currentSubmit = new AbortController();\n inst.capturedEntries = {};\n inst.dialog.setSubmitting(true);\n inst.dialog.setStatus('Capturing…');\n\n let payload: FeedbackPayload | null = null;\n try {\n const captured = await inst.registry.capture(\n (n) => inst.capturedEntries[n],\n (err) => handlePluginError(err),\n );\n inst.capturedEntries = captured;\n\n payload = assemblePayload(inst, description, captured);\n\n // beforeSubmit — first veto wins.\n let cancelReason: string | null = null;\n const cancel = (reason: string) => { if (cancelReason === null) cancelReason = reason; };\n dispatchLifecycle('beforeSubmit', { payload, cancel });\n if (cancelReason !== null) {\n inst.dialog.setSubmitting(false);\n inst.dialog.setStatus(`Cancelled: ${cancelReason}`, 'error');\n return;\n }\n\n inst.dialog.setStatus('Sending…');\n const response: TransportResponse = await postFeedback(\n inst.endpoint,\n payload,\n inst.headers,\n inst.currentSubmit.signal,\n inst.credentials,\n );\n\n dispatchLifecycle('afterSubmit', { payload, response });\n inst.dialog.setSubmitting(false);\n\n if (response.ok) {\n dispatchSystem('submit:success', { payload, response });\n inst.dialog.setSubmitSucceeded(true);\n inst.dialog.setStatus(inst.labels.sentSuccess, 'success');\n // Close after a beat so the user sees the confirmation. The\n // submitSucceeded flag short-circuits the discard guard if the user\n // clicks X during this window.\n window.setTimeout(() => {\n if (current === inst) inst.dialog.close('submitted');\n resetFormState();\n }, 1500);\n } else {\n dispatchSystem('submit:error', { payload, error: new Error(`HTTP ${response.status}`) });\n inst.dialog.setStatus(`Failed (${response.status})`, 'error');\n }\n } catch (err) {\n inst.dialog.setSubmitting(false);\n const error = err instanceof Error ? err : new Error(String(err));\n if (payload) {\n dispatchSystem('submit:error', { payload, error });\n }\n inst.dialog.setStatus(`Failed: ${error.message}`, 'error');\n } finally {\n inst.currentSubmit = null;\n }\n}\n\nfunction assemblePayload(\n inst: BeaconInstance,\n description: string,\n pluginEntries: Record<string, PluginEntry>,\n): FeedbackPayload {\n const meta = buildMetadata();\n const ctx = inst.context?.();\n return {\n description,\n severity: inst.dialog.getSeverity(),\n metadata: meta,\n ...(ctx ? { context: ctx } : {}),\n plugins: pluginEntries,\n };\n}\n\nfunction buildMetadata(): PayloadMetadata {\n const url = window.location.href;\n const ref = document.referrer;\n const theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' as const : 'light' as const;\n return {\n url,\n ...(ref ? { referrer: ref } : {}),\n userAgent: navigator.userAgent,\n viewport: {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n screen: {\n w: window.screen.width,\n h: window.screen.height,\n },\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n locale: navigator.language,\n theme,\n capturedAt: new Date().toISOString(),\n };\n}\n\n// ── Test access ──────────────────────────────────────────\n// __testing exposes innards for vitest. Not part of public API.\n\nexport const __testing = {\n resetForTests(): void {\n destroy();\n for (const set of Object.values(systemHandlers)) set.clear();\n },\n getCurrent(): unknown {\n return current;\n },\n};\n\n// Re-exports so consumers see Severity etc. via core; primary export route is index.ts.\nexport type { Severity, BeaconStatus, PluginStatus };\n","// Public entry point for the beacon module.\n//\n// Importing this module registers <launch-kit-beacon> via customElements.define.\n// No other side effects. All other behavior is gated behind init().\n\nimport { defineBeaconElement } from './element';\n\ndefineBeaconElement();\n\nexport { init, show, hide, destroy, on, off, status } from './core';\nexport {\n metadata,\n errors,\n domEle,\n domSS,\n liveMonitor,\n startMonitor,\n stopMonitor,\n probe,\n isMonitorActive,\n currentMonitorUrl,\n} from './plugins';\nexport type { LiveMonitorOptions, MonitorConfig } from './plugins';\nexport type {\n BeaconCtx,\n BeaconPlugin,\n BeaconLifecycleEvent,\n BeaconStatus,\n FeedbackPayload,\n FormField,\n InitOptions,\n LabelMap,\n PluginEntry,\n PluginFailureEntry,\n PluginStatus,\n PluginSuccessEntry,\n Position,\n Severity,\n SystemEvent,\n Theme,\n TransportResponse,\n} from './types';\nexport { isPluginFailure } from './types';\n"],"names":["beaconStyles","GLOBAL_STYLE_ID","ensureBeaconBodyStyles","tag","SVG_NS","iconMegaphone","s","p1","p2","BEACON_TAG","HTMLElementBase","LaunchKitBeacon","style","text","_a","assigned","el","label","span","visible","defineBeaconElement","createCtx","pluginName","host","name","mode","opts","ev","handler","DuplicatePluginNameError","createRegistry","plugins","seen","p","entries","plugin","makeCtx","onError","e","teardown","err","error","_getCaptured","out","result","entry","wrapResult","wrapFailure","version","v","postFeedback","endpoint","payload","headers","signal","credentials","resolvedHeaders","resolveHeaders","response","body","renderFields","slot","fields","field","wrap","desc","control","renderControl","_b","current","root","input","initial","ta","sel","opt","o","group","iconClose","DialogView","labels","severities","callbacks","header","title","closeBtn","descField","descLabel","sevField","sevLabel","sev","actions","released","on","reason","value","kind","submitting","sources","formValuesHost","src","panel","titleEl","cleanup","fn","defaultLabels","createOverlayHost","shadow","layer","attachOverlay","render","getUaData","nav","b","metadata","uaData","MAX_EVENTS","MESSAGE_LIMIT","STACK_LIMIT","SOURCE_LIMIT","DEDUPE_WINDOW_MS","BEACON_STACK_PATTERN","trunc","limit","signature","message","stack","stackHead","fromBeacon","safeStringify","createEventBuffer","buffer","recentSignatures","listeners","installed","onRejection","push","event","sig","last","errMessage","errStack","errors","ctx","uninstall","wrapper","summary","dot","list","update","events","count","li","msg","unsub","MAX_DEPTH","SHADOW_SEPARATOR","isUniqueId","id","tagWithClasses","classes","c","nthOfTypeIndex","parent","buildSelector","target","parts","separators","depth","base","part","currentClasses","detectReact","keys","k","fiber","i","f","type","detectVue","anyEl","vueParent","detectAngular","ng","cmp","ctor","detectSvelte","detectFramework","OUTER_HTML_LIMIT","PARENT_OUTER_HTML_LIMIT","SELECTOR_LIMIT","ID_LIMIT","CLASSLIST_MAX_ENTRIES","CLASS_NAME_LIMIT","STYLE_VALUE_LIMIT","USEFUL_STYLE_PROPS","truncate","max","pickStyles","computed","prop","capClassList","captureElement","rect","rawSelector","rawId","framework","MARKER_RADIUS","MARKER_STROKE","MARKER_TEXT","OUTLINE_WIDTH","DEFAULT_ACCENT","drawMarkers","screenshotDataUrl","pins","viewport","accent","img","loadImage","canvas","scaleX","scaleY","pin","getFreshRect","x","y","w","h","cx","cy","r","found","resolve","reject","NO_CAPTURE_CLASS","DEFAULT_HINT","withAlpha","color","alphaHex","createPickModeOverlay","ACCENT","ACCENT_BORDER","ACCENT_GLOW","styleTag","frame","hint","SPINNER_HTML","escapeHtml","tracked","makeMarker","num","m","makeOutline","placeAt","isStale","opacity","hide","reposition","liveTarget","fr","raf","schedule","anchor","marker","outline","ICON_CLOSE","ICON_CHECK","showPinPopover","popover","POPOVER_W","POPOVER_H","left","top","textarea","close","handleGlobalKey","action","note","startPicker","shadowRoot","onHover","accentFill","tooltip","previousCursor","resolved","resolvePromise","promise","res","isWidgetElement","node","isCustomElement","findTarget","candidates","safety","next","positionOutline","cls","above","handleMove","handlePointerDown","swallow","handleKey","finish","htmlToImage","load","TRANSPARENT_PIXEL","isUrlSafeForCanvas","rawUrl","crossOriginAttr","neutralizeCrossOriginImages","stashedImg","stashedSvg","svgImg","href","xlink","url","expandLayoutForFullPage","scrollContainers","cs","overflowingY","overflowingX","savedWindowX","savedWindowY","savedContainerScrolls","touched","cur","cssText","scrollLeft","scrollTop","captureGate","captureScreenshot","priorGate","releaseGate","doCaptureScreenshot","quality","pixelRatio","excludeShadowRoot","excludeHosts","fullPage","lib","filter","restoreImages","restoreLayout","disposed","dispose","html","width","height","cached","setAnnotationCache","getAnnotationCache","clearAnnotationCache","iconTrash","paths","d","domEle","maxPins","pinElements","cachedAnnotatedDataUrl","regenToken","headerEl","listEl","previewEl","btnEl","reset","renderList","renderPreview","findShadowRoot","resolveAccent","enterAnnotateMode","release","overlay","keepPicking","captured","regenerateScreenshot","myToken","beaconHosts","shot","markers","annotated","deletePin","n","idx","row","meta","noteInput","del","isPluginFailure","domSS","domEleEntry","readPinsFromEntry","readAccent","pinsRaw","POS_STORAGE_KEY","createMonitorOverlay","startedAt","chip","recDot","recLabel","sep","timer","stopBtn","urlEl","readSavedPos","defaultPos","applyPos","clamp","raw","parsed","pos","maxX","maxY","dragging","activePointerId","grabOffset","onPointerDown","onPointerMove","endDrag","onResize","tick","elapsed","formatElapsed","timerId","seconds","pad","TEXT_LIMIT","INTERACTIVE_SELECTOR","HTML_LIMIT","MAX_OVERLAYS","truncText","trimmed","describeTarget","ariaLabel","testid","ancestor","overlaysAtPoint","all","z","installClickCapture","cb","handle","me","hit","hitMatches","openDialogs","bodyPe","overlays","onClick","onMouseDown","installRouteCapture","originalPush","originalReplace","lastUrl","emit","via","to","from","args","ret","onPop","onHash","installDialogCapture","selector","obs","mutations","_c","_d","dialogs","installSubmitCapture","form","hasValue","installDomCapture","undoClick","undoRoute","undoDialog","undoSubmit","URL_LIMIT","BODY_LIMIT","REDACTED","MUTATING_METHODS","SECRET_PATTERNS","SENSITIVE_KEYS","redactString","re","redactJsonInPlace","redactBody","contentType","captureBody","original","cap","readRequestBody","init","detectAuth","getRequestContentType","buildRequestCapture","method","hasAuth","bodyText","capture","wrapFetch","wrapped","start","request","durationMs","failed","ct","readXhrSendBody","wrapXhr","proto","originalOpen","originalSend","originalSetRequestHeader","state","rest","lower","onLoadEnd","rt","installNetworkCapture","undoFetch","undoXhr","FLUSH_INTERVAL_MS","FLUSH_AT_COUNT","MAX_BUFFER","MonitorTransport","batch","blob","SESSION_URL_KEY","SESSION_ID_KEY","SESSION_VERBOSE_KEY","SESSION_DEADLINE_KEY","DEFAULT_MAX_SESSION_MS","PROBE_DATA_LIMIT","active","randomSessionId","safeSerialize","walk","notify","stamp","partial","enqueue","persistSession","clearPersistedSession","readPersistedSession","verbose","deadlineRaw","deadlineMs","emitErrorEvent","config","stop","maxMs","sessionId","transport","errorsBuffer","uninstallErrors","existing","drainedThrough","errorsUnsub","net","dom","deadlineTimer","tearDownActive","suspend","probe","data","isActive","currentUrl","subscribe","resumeIfPersisted","persisted","liveMonitor","panelRoot","unsubscribeActive","lastUrlInput","mountOverlay","session.stop","session.currentUrl","destroyOverlay","renderInactive","urlInput","startBtn","verboseLabel","verboseInput","help","session.start","renderActive","rec","session.isActive","session.resumeIfPersisted","unsubscribeOverlay","session.subscribe","onAbort","session.suspend","systemHandlers","destroy","initAbort","resolvePluginList","position","theme","ensureHost","hostElement","overlayHost","dialog","runSubmit","dispatchLifecycle","resetFormState","registry","instance","debugFromUrl","show","makeCtxForPlugin","handlePluginError","dispatchSystem","inst","ns","status","off","defaultPreset","presetMetadata","presetErrors","presetDomEle","presetDomSS","set","description","assemblePayload","cancelReason","pluginEntries","buildMetadata","ref"],"mappings":"AAKO,MAAMA,KAAe,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}
|
|
1
|
+
{"version":3,"file":"beacon.mjs","sources":["../../src/beacon/styles.ts","../../src/beacon/element.ts","../../src/beacon/ctx.ts","../../src/beacon/registry.ts","../../src/beacon/transport.ts","../../src/beacon/ui/form.ts","../../src/beacon/ui/dialog.ts","../../src/beacon/ui/overlay.ts","../../src/beacon/plugins/metadata.ts","../../src/beacon/internal/event-buffer.ts","../../src/beacon/plugins/errors.ts","../../src/beacon/internal/selector.ts","../../src/beacon/internal/framework-detect.ts","../../src/beacon/internal/element-capture.ts","../../src/beacon/internal/markers.ts","../../src/beacon/internal/pick-mode-overlay.ts","../../src/beacon/internal/pin-popover.ts","../../src/beacon/internal/picker.ts","../../src/beacon/internal/screenshot.ts","../../src/beacon/internal/annotation-cache.ts","../../src/beacon/plugins/domEle.ts","../../src/beacon/types.ts","../../src/beacon/plugins/domSS.ts","../../src/beacon/internal/monitor/overlay.ts","../../src/beacon/internal/monitor/capture-dom.ts","../../src/beacon/internal/monitor/capture-network.ts","../../src/beacon/internal/monitor/transport.ts","../../src/beacon/internal/monitor/session.ts","../../src/beacon/plugins/liveMonitor.ts","../../src/beacon/core.ts","../../src/beacon/index.ts"],"sourcesContent":["// Shadow-DOM-scoped styles for <launch-kit-beacon>.\n// Exported as a string so the same source compiles cleanly under Vite (UMD\n// bundle) and Next.js (transpilePackages, no ?inline support). The CSS-as-string\n// is shipped inside the bundle; no separate stylesheet fetch.\n\nexport const beaconStyles = String.raw`\n:host {\n --beacon-accent: #0ea5e9;\n --beacon-bg: #ffffff;\n --beacon-fg: #0f172a;\n --beacon-muted: #64748b;\n --beacon-border: #e2e8f0;\n --beacon-radius: 10px;\n --beacon-z-index: 2147483645;\n --beacon-shadow: 0 10px 30px hsl(0 0% 0% / 0.15), 0 2px 6px hsl(0 0% 0% / 0.08);\n --beacon-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --beacon-color-scheme: light dark;\n\n --beacon-bug: #ef4444;\n --beacon-idea: #22c55e;\n --beacon-ux: #a855f7;\n --beacon-a11y: #06b6d4;\n\n position: fixed;\n z-index: var(--beacon-z-index);\n font-family: var(--beacon-font-family);\n font-size: 14px;\n color: var(--beacon-fg);\n line-height: 1.5;\n color-scheme: var(--beacon-color-scheme);\n}\n\n:host([theme='dark']) {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n --beacon-color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n :host([theme='auto']) {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n }\n}\n\n:host([position='bottom-right']) { right: 20px; bottom: 20px; left: auto; top: auto; }\n:host([position='bottom-left']) { left: 20px; bottom: 20px; right: auto; top: auto; }\n\n:host([position='hidden']) {\n position: static;\n display: contents;\n}\n:host([position='hidden']) .beacon-default-trigger { display: none; }\n\n.beacon-default-trigger {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: var(--beacon-accent);\n color: white;\n border: 0;\n border-radius: 999px;\n padding: 10px 16px;\n font: inherit;\n font-weight: 500;\n cursor: pointer;\n box-shadow: var(--beacon-shadow);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n}\n.beacon-default-trigger:hover { transform: translateY(-1px); }\n.beacon-default-trigger svg { width: 18px; height: 18px; }\n\n.beacon-health-dot {\n display: none;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--beacon-bug);\n margin-left: 2px;\n}\n.beacon-health-dot.visible { display: inline-block; }\n\ndialog.beacon-dialog {\n width: 380px;\n max-width: calc(100vw - 24px);\n max-height: calc(100vh - 24px);\n padding: 0;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: var(--beacon-radius);\n box-shadow: var(--beacon-shadow);\n font-family: var(--beacon-font-family);\n font-size: 14px;\n line-height: 1.5;\n}\ndialog.beacon-dialog::backdrop {\n background: hsl(0 0% 0% / 0.8);\n}\n\n.beacon-dialog-inner {\n display: flex;\n flex-direction: column;\n max-height: calc(100vh - 24px);\n}\n\n.beacon-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--beacon-border);\n}\n.beacon-drawer-title { font-weight: 600; }\n.beacon-icon-btn {\n background: transparent;\n border: 0;\n color: var(--beacon-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: inline-flex;\n}\n.beacon-icon-btn:hover { background: var(--beacon-border); color: var(--beacon-fg); }\n.beacon-icon-btn svg { width: 16px; height: 16px; }\n\n.beacon-drawer-body {\n padding: 16px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* Plugin panels share the same vertical rhythm as the drawer body so sibling\n panels (annotate, monitor, etc.) don't visually collide. Without this, every\n plugin panel renders flush against the previous one. */\n.beacon-plugin-panels {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.beacon-field { display: flex; flex-direction: column; gap: 6px; }\n.beacon-label { font-size: 12px; color: var(--beacon-muted); font-weight: 500; }\n.beacon-description { font-size: 12px; color: var(--beacon-muted); }\n\n.beacon-input,\n.beacon-textarea,\n.beacon-select {\n width: 100%;\n padding: 8px 10px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n font: inherit;\n box-sizing: border-box;\n}\n.beacon-textarea { min-height: 80px; resize: vertical; }\n.beacon-input:focus,\n.beacon-textarea:focus,\n.beacon-select:focus { outline: 2px solid var(--beacon-accent); outline-offset: -1px; border-color: var(--beacon-accent); }\n\n.beacon-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n}\n.beacon-toggle input { margin: 0; }\n\n.beacon-radio-group { display: flex; flex-direction: column; gap: 4px; }\n.beacon-radio-opt { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; }\n\n.beacon-severity {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 6px;\n}\n.beacon-severity-opt {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 4px;\n background: transparent;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: var(--beacon-fg);\n text-transform: capitalize;\n}\n.beacon-severity-opt input { position: absolute; opacity: 0; pointer-events: none; }\n.beacon-severity-opt:hover { background: var(--beacon-border); }\n.beacon-severity-opt.selected[data-sev='bug'] { border-color: var(--beacon-bug); color: var(--beacon-bug); }\n.beacon-severity-opt.selected[data-sev='idea'] { border-color: var(--beacon-idea); color: var(--beacon-idea); }\n.beacon-severity-opt.selected[data-sev='ux'] { border-color: var(--beacon-ux); color: var(--beacon-ux); }\n.beacon-severity-opt.selected[data-sev='a11y'] { border-color: var(--beacon-a11y); color: var(--beacon-a11y); }\n\n.beacon-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n.beacon-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n border-radius: 6px;\n border: 0;\n cursor: pointer;\n font: inherit;\n font-weight: 500;\n font-size: 13px;\n transition: opacity 0.15s ease;\n}\n.beacon-btn[disabled] { opacity: 0.5; cursor: not-allowed; }\n.beacon-btn svg { width: 14px; height: 14px; }\n.beacon-btn.primary { background: var(--beacon-accent); color: white; }\n.beacon-btn.secondary {\n background: transparent;\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n}\n.beacon-btn.secondary:hover { background: var(--beacon-border); }\n\n.beacon-status {\n font-size: 12px;\n color: var(--beacon-muted);\n text-align: center;\n padding: 4px;\n}\n.beacon-status.error { color: var(--beacon-bug); }\n.beacon-status.success { color: var(--beacon-idea); }\n\n.beacon-plugin-panel {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n}\n.beacon-plugin-panel-title {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--beacon-muted);\n font-weight: 600;\n}\n\n/* ── Pin list (domEle plugin) ─────────────────────────────── */\n.beacon-pin-list-header {\n font-size: 12px;\n color: var(--beacon-muted);\n font-weight: 500;\n}\n.beacon-pin-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n max-height: 200px;\n overflow-y: auto;\n}\n.beacon-pin-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px;\n background: var(--beacon-border);\n border-radius: 6px;\n}\n.beacon-pin-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--beacon-accent);\n color: white;\n font-size: 11px;\n font-weight: 600;\n flex-shrink: 0;\n}\n.beacon-pin-meta { flex: 1; min-width: 0; }\n.beacon-pin-selector {\n font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace;\n color: var(--beacon-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.beacon-pin-note-input {\n margin-top: 4px;\n width: 100%;\n padding: 4px 6px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 4px;\n font: inherit;\n font-size: 12px;\n box-sizing: border-box;\n}\n.beacon-pin-annotate { align-self: flex-start; }\n.beacon-thumb {\n width: 100%;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n display: block;\n}\n\n/* ── Captured runtime events chip (errors plugin form panel) ─── */\n.beacon-events {\n font-size: 12px;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n padding: 6px 8px;\n}\n.beacon-events-summary {\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--beacon-muted);\n user-select: none;\n}\n.beacon-events-summary::-webkit-details-marker { display: none; }\n.beacon-events-dot {\n color: var(--beacon-bug);\n font-size: 10px;\n line-height: 1;\n}\n.beacon-events-list {\n list-style: none;\n margin: 8px 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 160px;\n overflow-y: auto;\n}\n.beacon-events-item {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.4;\n}\n.beacon-events-kind {\n flex-shrink: 0;\n padding: 1px 5px;\n border-radius: 3px;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n.beacon-events-kind.error { background: hsl(0 84% 50% / 0.15); color: var(--beacon-bug); }\n.beacon-events-kind.rejection { background: hsl(38 92% 50% / 0.15); color: hsl(38 92% 50%); }\n.beacon-events-msg {\n word-break: break-word;\n color: var(--beacon-fg);\n}\n\n/* ── liveMonitor plugin panel ─────────────────────────────── */\n.beacon-monitor {\n padding: 0 0 4px;\n font-size: 12px;\n color: var(--beacon-fg);\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.beacon-monitor-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--beacon-muted);\n font-size: 11px;\n}\n.beacon-monitor-rec {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--beacon-bug);\n animation: beacon-rec-pulse 1.4s ease-in-out infinite;\n}\n@keyframes beacon-rec-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n.beacon-monitor-row {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n.beacon-monitor-input {\n flex: 1;\n font: inherit;\n padding: 6px 8px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n min-width: 0;\n box-sizing: border-box;\n}\n.beacon-monitor-input::placeholder { color: var(--beacon-muted); opacity: 0.7; }\n.beacon-monitor-input:focus {\n outline: 2px solid var(--beacon-accent);\n outline-offset: -1px;\n border-color: var(--beacon-accent);\n}\n.beacon-monitor-btn {\n font: inherit;\n padding: 6px 10px;\n border-radius: 6px;\n border: 1px solid var(--beacon-accent);\n background: var(--beacon-accent);\n color: white;\n cursor: pointer;\n font-weight: 500;\n}\n.beacon-monitor-btn:disabled { opacity: 0.4; cursor: not-allowed; }\n.beacon-monitor-btn.stop {\n background: transparent;\n color: var(--beacon-accent);\n}\n.beacon-monitor-help {\n color: var(--beacon-muted);\n font-size: 11px;\n}\n.beacon-monitor-active-url {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n color: var(--beacon-muted);\n word-break: break-all;\n background: hsl(0 0% 0% / 0.18);\n border-radius: 4px;\n padding: 4px 6px;\n}\n.beacon-monitor-verbose {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--beacon-muted);\n font-size: 11px;\n cursor: pointer;\n user-select: none;\n}\n\n.beacon-overlay-layer {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: calc(var(--beacon-z-index) + 1);\n}\n.beacon-overlay-layer > * { pointer-events: auto; }\n\n/* ── Body-mounted UI ──────────────────────────────────────\n Pin-popover and other overlays mount on document.body to escape transformed\n ancestors. Shadow DOM :host vars don't reach them, so we re-declare the\n variables here on each body-mounted root. */\n\n.beacon-pin-popover {\n --beacon-accent: #0ea5e9;\n --beacon-bg: #ffffff;\n --beacon-fg: #0f172a;\n --beacon-muted: #64748b;\n --beacon-border: #e2e8f0;\n --beacon-radius: 10px;\n --beacon-shadow: 0 10px 30px hsl(0 0% 0% / 0.15), 0 2px 6px hsl(0 0% 0% / 0.08);\n --beacon-bug: #ef4444;\n --beacon-idea: #22c55e;\n --beacon-ux: #a855f7;\n --beacon-a11y: #06b6d4;\n\n position: fixed;\n z-index: 2147483647;\n width: 240px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n box-shadow: var(--beacon-shadow);\n padding: 10px;\n display: none;\n flex-direction: column;\n gap: 8px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-size: 14px;\n line-height: 1.5;\n}\n.beacon-pin-popover.open { display: flex; }\n.beacon-pin-popover.beacon-theme-dark {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n}\n@media (prefers-color-scheme: dark) {\n .beacon-pin-popover.beacon-theme-auto {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n }\n}\n\n.beacon-pin-popover .beacon-pin-popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n}\n.beacon-pin-popover .beacon-pin-popover-actions {\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n}\n.beacon-pin-popover .beacon-pin-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--beacon-accent);\n color: white;\n font-size: 11px;\n font-weight: 600;\n flex-shrink: 0;\n}\n.beacon-pin-popover .beacon-icon-btn {\n background: transparent;\n border: 0;\n color: var(--beacon-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: inline-flex;\n}\n.beacon-pin-popover .beacon-icon-btn:hover { background: var(--beacon-border); color: var(--beacon-fg); }\n.beacon-pin-popover .beacon-icon-btn svg { width: 16px; height: 16px; }\n.beacon-pin-popover .beacon-textarea {\n width: 100%;\n min-height: 48px;\n padding: 6px 8px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n font: inherit;\n resize: vertical;\n box-sizing: border-box;\n}\n.beacon-pin-popover .beacon-textarea:focus {\n outline: 2px solid var(--beacon-accent);\n outline-offset: -1px;\n border-color: var(--beacon-accent);\n}\n.beacon-pin-popover .beacon-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 6px;\n border: 0;\n cursor: pointer;\n font: inherit;\n font-weight: 500;\n font-size: 13px;\n}\n.beacon-pin-popover .beacon-btn.primary { background: var(--beacon-accent); color: white; }\n.beacon-pin-popover .beacon-btn svg { width: 14px; height: 14px; }\n\n/* ── liveMonitor body-portal overlay ───────────────────────\n Dashed viewport frame + draggable status chip. Body-mounted (same reason as\n pick-mode-overlay), so the CSS var --beacon-monitor-accent is set inline on\n the frame and chip elements by the plugin — the shadow root's :host vars\n don't reach here. */\n\n@keyframes beacon-monitor-frame-pulse {\n 0%, 100% { opacity: 0.55; }\n 50% { opacity: 1; }\n}\n\n.beacon-monitor-overlay-frame {\n --beacon-monitor-accent: #10b981;\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 2147483646;\n border: 2px dashed var(--beacon-monitor-accent);\n border-radius: 4px;\n box-shadow: inset 0 0 56px color-mix(in srgb, var(--beacon-monitor-accent) 18%, transparent);\n box-sizing: border-box;\n animation: beacon-monitor-frame-pulse 2.4s ease-in-out infinite;\n}\n\n.beacon-monitor-overlay-chip {\n --beacon-monitor-accent: #10b981;\n position: fixed;\n z-index: 2147483647;\n pointer-events: auto;\n cursor: grab;\n user-select: none;\n background: #0f172a;\n color: #f1f5f9;\n border: 1px solid color-mix(in srgb, var(--beacon-monitor-accent) 50%, transparent);\n border-radius: 999px;\n padding: 6px 6px 6px 12px;\n box-shadow: 0 6px 20px hsl(0 0% 0% / 0.3);\n font: 500 12px/1.2 system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n letter-spacing: 0.01em;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 140px;\n max-width: min(360px, calc(100vw - 32px));\n touch-action: none;\n}\n.beacon-monitor-overlay-chip[data-dragging] { cursor: grabbing; }\n\n.beacon-monitor-overlay-chip-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.beacon-monitor-overlay-rec-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #ef4444;\n flex-shrink: 0;\n animation: beacon-rec-pulse 1.4s ease-in-out infinite;\n}\n\n.beacon-monitor-overlay-rec-label {\n font-weight: 700;\n letter-spacing: 0.06em;\n color: #ef4444;\n font-size: 11px;\n}\n\n.beacon-monitor-overlay-sep {\n color: #64748b;\n}\n\n.beacon-monitor-overlay-timer {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-variant-numeric: tabular-nums;\n font-size: 12px;\n flex: 1;\n min-width: 48px;\n}\n\n.beacon-monitor-overlay-stop {\n font: inherit;\n font-weight: 500;\n font-size: 11px;\n padding: 3px 10px;\n border-radius: 999px;\n background: var(--beacon-monitor-accent);\n color: #ffffff;\n border: 0;\n cursor: pointer;\n flex-shrink: 0;\n}\n.beacon-monitor-overlay-stop:hover {\n background: color-mix(in srgb, var(--beacon-monitor-accent) 85%, white);\n}\n\n.beacon-monitor-overlay-url {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 10px;\n color: #94a3b8;\n padding: 0 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n`;\n\nconst GLOBAL_STYLE_ID = 'launch-kit-beacon-portal-styles';\n\n/**\n * Ensure the body-mounted parts of the beacon UI (pin popover, pick-mode\n * overlay) have their stylesheet available in document.head. Idempotent across\n * re-init and HMR. Safe to call before document.head exists (early-returns).\n */\nexport function ensureBeaconBodyStyles(): void {\n if (typeof document === 'undefined' || !document.head) return;\n if (document.getElementById(GLOBAL_STYLE_ID)) return;\n const tag = document.createElement('style');\n tag.id = GLOBAL_STYLE_ID;\n tag.textContent = beaconStyles;\n document.head.appendChild(tag);\n}\n","// <launch-kit-beacon> custom element. Hosts the Shadow DOM tree:\n// - default trigger (slot replaceable)\n// - dialog (top-layer drawer)\n// - overlay layer (Shadow-DOM-internal overlay slot)\n//\n// Auto-injection: if init() runs without a tag in the DOM, the core appends a\n// hidden host. Module load only calls customElements.define — no other side effects.\n\nimport { beaconStyles } from './styles';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction iconMegaphone(): SVGElement {\n const s = document.createElementNS(SVG_NS, 'svg');\n s.setAttribute('viewBox', '0 0 24 24');\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '2');\n s.setAttribute('stroke-linecap', 'round');\n s.setAttribute('stroke-linejoin', 'round');\n const p1 = document.createElementNS(SVG_NS, 'path');\n p1.setAttribute('d', 'M3 11l18-5v12L3 14v-3z');\n const p2 = document.createElementNS(SVG_NS, 'path');\n p2.setAttribute('d', 'M11.6 16.8a3 3 0 1 1-5.8-1.6');\n s.appendChild(p1); s.appendChild(p2);\n return s;\n}\n\nexport const BEACON_TAG = 'launch-kit-beacon';\n\n// SSR guard: Next renders the AppHeader client component on the server during\n// the initial HTML pass, which evaluates this module's import graph in Node.\n// `HTMLElement` doesn't exist there, so a top-level `extends HTMLElement` throws\n// before defineBeaconElement() ever has a chance to early-return. Stand in with\n// a no-op base class on the server — the class is never instantiated there\n// (customElements.define is guarded), so the methods below are dead code.\nconst HTMLElementBase: typeof HTMLElement =\n typeof HTMLElement !== 'undefined'\n ? HTMLElement\n : (class {} as unknown as typeof HTMLElement);\n\nexport class LaunchKitBeacon extends HTMLElementBase {\n shadow!: ShadowRoot;\n triggerSlot!: HTMLSlotElement;\n defaultTrigger!: HTMLButtonElement;\n healthDot!: HTMLSpanElement;\n\n // Called by core.ts when a beacon is wired up; lets the element invoke show()\n // on click without having to import the core (avoids circular dep + lets the\n // singleton drive). Null until init() runs.\n onTriggerClick: (() => void) | null = null;\n\n connectedCallback() {\n if (this.shadow) return;\n this.shadow = this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = beaconStyles;\n this.shadow.appendChild(style);\n\n this.triggerSlot = document.createElement('slot');\n this.triggerSlot.name = 'trigger';\n this.shadow.appendChild(this.triggerSlot);\n\n this.defaultTrigger = document.createElement('button');\n this.defaultTrigger.type = 'button';\n this.defaultTrigger.className = 'beacon-default-trigger';\n this.defaultTrigger.appendChild(iconMegaphone());\n const text = document.createElement('span');\n text.textContent = 'Feedback';\n this.defaultTrigger.appendChild(text);\n\n this.healthDot = document.createElement('span');\n this.healthDot.className = 'beacon-health-dot';\n this.defaultTrigger.appendChild(this.healthDot);\n\n this.shadow.appendChild(this.defaultTrigger);\n this.defaultTrigger.addEventListener('click', () => this.onTriggerClick?.());\n\n this.triggerSlot.addEventListener('slotchange', () => {\n const assigned = this.triggerSlot.assignedElements();\n if (assigned.length > 0) {\n this.defaultTrigger.style.display = 'none';\n for (const el of assigned) {\n el.addEventListener('click', () => this.onTriggerClick?.());\n }\n } else {\n this.defaultTrigger.style.display = '';\n }\n });\n\n if (!this.hasAttribute('position')) this.setAttribute('position', 'bottom-right');\n if (!this.hasAttribute('theme')) this.setAttribute('theme', 'auto');\n }\n\n setTriggerLabel(label: string) {\n if (!this.defaultTrigger) return;\n const span = this.defaultTrigger.querySelector('span');\n if (span) span.textContent = label;\n }\n\n setHealthIndicator(visible: boolean) {\n this.healthDot?.classList.toggle('visible', visible);\n }\n}\n\n/**\n * Register the custom element. Guarded so HMR re-imports don't throw.\n * The only module-load side effect — no listeners, no globals.\n */\nexport function defineBeaconElement(): void {\n if (typeof window === 'undefined' || typeof customElements === 'undefined') return;\n if (!customElements.get(BEACON_TAG)) {\n customElements.define(BEACON_TAG, LaunchKitBeacon);\n }\n}\n","// BeaconCtx factory — one ctx per (plugin, init-cycle).\n//\n// captureSignal() reads the core's _currentSubmit slot at call time, so plugins\n// that capture the signal in a setupOnce closure correctly get `undefined`\n// outside an active submit. ctx.signal is per-init and aborts on re-init/destroy.\n\nimport type {\n BeaconCtx,\n BeaconLifecycleEvent,\n Mode,\n PluginEntry,\n} from './types';\n\nexport interface CtxHost {\n // Captured plugin entries from earlier in the current submit. Empty between submits.\n getCaptured(name: string): PluginEntry | undefined;\n // Mutable form-values bucket scoped to this (plugin, init-cycle).\n getFormValues(pluginName: string): Record<string, unknown>;\n // Current-submit AbortSignal — undefined outside submit.\n getCaptureSignal(): AbortSignal | undefined;\n // Per-init signal — aborts on init() re-call, destroy(), or page navigation.\n getInitSignal(): AbortSignal;\n // Mode mediation (the drawer toggles chrome / closes-reopens dialog).\n requestMode(mode: Mode): Promise<() => void>;\n // Non-modal overlay inside shadow DOM, outside the <dialog>.\n overlay(opts: { render: (slot: HTMLElement) => void | (() => void) }): () => void;\n // Subscribe to per-submit lifecycle events.\n onLifecycle(\n ev: 'open' | 'close' | 'beforeSubmit' | 'afterSubmit',\n handler: (e: BeaconLifecycleEvent) => void,\n ): () => void;\n}\n\nexport function createCtx(pluginName: string, host: CtxHost): BeaconCtx {\n return {\n pluginName,\n captured: (name) => host.getCaptured(name),\n get formValues() { return host.getFormValues(pluginName); },\n requestMode: (mode) => host.requestMode(mode),\n overlay: (opts) => host.overlay(opts),\n on: (ev, handler) => host.onLifecycle(ev, handler),\n get signal() { return host.getInitSignal(); },\n captureSignal: () => host.getCaptureSignal(),\n };\n}\n","// Plugin registry: name uniqueness, capture pipeline with auto-wrap per §6.\n\nimport type {\n BeaconCtx,\n BeaconPlugin,\n PluginEntry,\n PluginStatus,\n} from './types';\n\nexport class DuplicatePluginNameError extends Error {\n constructor(name: string) {\n super(`Duplicate plugin name: \"${name}\"`);\n this.name = 'DuplicatePluginNameError';\n }\n}\n\nexport interface RegisteredPlugin {\n plugin: BeaconPlugin;\n ctx: BeaconCtx;\n status: PluginStatus;\n teardown?: () => void;\n}\n\nexport interface PluginErrorReport {\n plugin: string;\n error: Error;\n at: 'setupOnce' | 'capture' | 'form';\n}\n\nexport interface Registry {\n readonly entries: RegisteredPlugin[];\n install(makeCtx: (name: string) => BeaconCtx, onError: (e: PluginErrorReport) => void): void;\n destroy(): void;\n capture(getCaptured: (name: string) => PluginEntry | undefined, onError: (e: PluginErrorReport) => void): Promise<Record<string, PluginEntry>>;\n status(): Record<string, PluginStatus>;\n}\n\nexport function createRegistry(plugins: BeaconPlugin[]): Registry {\n const seen = new Set<string>();\n for (const p of plugins) {\n if (seen.has(p.name)) throw new DuplicatePluginNameError(p.name);\n seen.add(p.name);\n }\n\n const entries: RegisteredPlugin[] = plugins.map((plugin) => ({\n plugin,\n // Placeholder; install() rebinds with the real ctx factory.\n ctx: null as unknown as BeaconCtx,\n status: { state: 'active', failures: 0 },\n }));\n\n return {\n entries,\n\n install(makeCtx, onError) {\n for (const e of entries) {\n e.ctx = makeCtx(e.plugin.name);\n if (!e.plugin.setupOnce) continue;\n try {\n const teardown = e.plugin.setupOnce(e.ctx);\n if (typeof teardown === 'function') e.teardown = teardown;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n e.status = {\n state: 'failed',\n failures: e.status.failures + 1,\n error: { message: error.message, ...(error.stack ? { stack: error.stack } : {}), at: 'setupOnce' },\n };\n onError({ plugin: e.plugin.name, error, at: 'setupOnce' });\n }\n }\n },\n\n destroy() {\n for (const e of entries) {\n try { e.teardown?.(); } catch { /* swallow */ }\n e.teardown = undefined;\n }\n },\n\n async capture(_getCaptured, onError) {\n const out: Record<string, PluginEntry> = {};\n for (const e of entries) {\n if (!e.plugin.capture) continue;\n try {\n const result = await e.plugin.capture(e.ctx);\n const entry = wrapResult(result, e.plugin.version);\n if (entry !== null) {\n out[e.plugin.name] = entry;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n out[e.plugin.name] = wrapFailure(error);\n e.status = {\n state: 'failed',\n failures: e.status.failures + 1,\n error: { message: error.message, ...(error.stack ? { stack: error.stack } : {}), at: 'capture' },\n };\n onError({ plugin: e.plugin.name, error, at: 'capture' });\n }\n }\n return out;\n },\n\n status() {\n const out: Record<string, PluginStatus> = {};\n for (const e of entries) {\n out[e.plugin.name] = e.status;\n }\n return out;\n },\n };\n}\n\n/**\n * Auto-wrap rule (§6):\n * plain object → { v, ...result }\n * primitive / array → { v, value: result }\n * null / undefined → null (caller omits the entry)\n * thrown / rejected → handled by caller via wrapFailure\n */\nexport function wrapResult(result: unknown, version?: number): PluginEntry | null {\n if (result === null || result === undefined) return null;\n const v = version ?? 1;\n if (Array.isArray(result) || typeof result !== 'object') {\n return { v, value: result };\n }\n // Plain object — spread into the entry, force v even if the plugin tried to set it.\n return { ...(result as Record<string, unknown>), v };\n}\n\nexport function wrapFailure(error: Error): PluginEntry {\n return {\n error: error.message,\n ...(error.stack ? { stack: error.stack } : {}),\n };\n}\n","// POST per §9. Per-submit AbortSignal lets the drawer cancel an in-flight send.\n\nimport type { FeedbackPayload, HeadersConfig, TransportResponse } from './types';\n\nexport async function postFeedback(\n endpoint: string,\n payload: FeedbackPayload,\n headers: HeadersConfig | undefined,\n signal: AbortSignal,\n credentials: RequestCredentials = 'omit',\n): Promise<TransportResponse> {\n const resolvedHeaders: Record<string, string> = await resolveHeaders(headers);\n const response = await fetch(endpoint, {\n method: 'POST',\n credentials,\n headers: { 'Content-Type': 'application/json', ...resolvedHeaders },\n body: JSON.stringify(payload),\n signal,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n const body: unknown = contentType.includes('application/json')\n ? await response.json().catch(() => null)\n : await response.text();\n\n return { ok: response.ok, status: response.status, body };\n}\n\nasync function resolveHeaders(headers: HeadersConfig | undefined): Promise<Record<string, string>> {\n if (!headers) return {};\n if (typeof headers === 'function') {\n const result = await headers();\n return result ?? {};\n }\n return headers;\n}\n","// Declarative form renderer. Renders 6 field types (§4.2) into a slot,\n// reading/writing the per-plugin `formValues` namespace via the provided getter/setter.\n//\n// Imperative escape lives in the caller (dialog.ts) — if a plugin returns\n// `{ render }` instead of `{ fields }`, that branch invokes render(slot, ctx) directly.\n\nimport type { FormField } from '../types';\n\nexport interface FieldHost {\n get(name: string): unknown;\n set(name: string, value: unknown): void;\n}\n\nexport function renderFields(slot: HTMLElement, fields: FormField[], host: FieldHost): void {\n for (const field of fields) {\n const wrap = document.createElement('div');\n wrap.className = 'beacon-field';\n\n if (field.label) {\n const label = document.createElement('label');\n label.className = 'beacon-label';\n label.textContent = field.label;\n wrap.appendChild(label);\n }\n if (field.description) {\n const desc = document.createElement('div');\n desc.className = 'beacon-description';\n desc.textContent = field.description;\n wrap.appendChild(desc);\n }\n\n const control = renderControl(field, host);\n wrap.appendChild(control);\n slot.appendChild(wrap);\n }\n}\n\nfunction renderControl(field: FormField, host: FieldHost): HTMLElement {\n const current = host.get(field.name);\n\n switch (field.type) {\n case 'toggle': {\n const root = document.createElement('label');\n root.className = 'beacon-toggle';\n const input = document.createElement('input');\n input.type = 'checkbox';\n input.checked = (current as boolean | undefined) ?? field.defaultValue ?? false;\n input.addEventListener('change', () => host.set(field.name, input.checked));\n root.appendChild(input);\n host.set(field.name, input.checked);\n return root;\n }\n\n case 'text': {\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'beacon-input';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? '');\n input.value = initial;\n if (field.placeholder) input.placeholder = field.placeholder;\n input.addEventListener('input', () => host.set(field.name, input.value));\n host.set(field.name, initial);\n return input;\n }\n\n case 'textarea': {\n const ta = document.createElement('textarea');\n ta.className = 'beacon-textarea';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? '');\n ta.value = initial;\n if (field.placeholder) ta.placeholder = field.placeholder;\n if (field.rows) ta.rows = field.rows;\n ta.addEventListener('input', () => host.set(field.name, ta.value));\n host.set(field.name, initial);\n return ta;\n }\n\n case 'select': {\n const sel = document.createElement('select');\n sel.className = 'beacon-select';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? field.options[0]?.value ?? '');\n for (const opt of field.options) {\n const o = document.createElement('option');\n o.value = opt.value;\n o.textContent = opt.label ?? opt.value;\n if (opt.value === initial) o.selected = true;\n sel.appendChild(o);\n }\n sel.addEventListener('change', () => host.set(field.name, sel.value));\n host.set(field.name, initial);\n return sel;\n }\n\n case 'radio': {\n const group = document.createElement('div');\n group.className = 'beacon-radio-group';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? field.options[0]?.value ?? '');\n for (const opt of field.options) {\n const label = document.createElement('label');\n label.className = 'beacon-radio-opt';\n const input = document.createElement('input');\n input.type = 'radio';\n input.name = field.name;\n input.value = opt.value;\n if (opt.value === initial) input.checked = true;\n input.addEventListener('change', () => host.set(field.name, opt.value));\n const span = document.createElement('span');\n span.textContent = opt.label ?? opt.value;\n label.appendChild(input);\n label.appendChild(span);\n group.appendChild(label);\n }\n host.set(field.name, initial);\n return group;\n }\n\n case 'number': {\n const input = document.createElement('input');\n input.type = 'number';\n input.className = 'beacon-input';\n const initial = (current as number | undefined) ?? field.defaultValue;\n if (initial !== undefined) input.value = String(initial);\n if (field.min !== undefined) input.min = String(field.min);\n if (field.max !== undefined) input.max = String(field.max);\n if (field.step !== undefined) input.step = String(field.step);\n input.addEventListener('input', () => {\n const v = input.value === '' ? undefined : Number(input.value);\n host.set(field.name, v);\n });\n if (initial !== undefined) host.set(field.name, initial);\n return input;\n }\n }\n}\n","// Drawer dialog. Owns the <dialog> element opened via showModal() (top layer)\n// so it escapes any transformed/blurred ancestor without portal hacks.\n//\n// Mode mediation:\n// pickElement → dialog.close() so pointer events reach host page; restored via showModal()\n// minimize / hide → keep dialog open, hide chrome (toggle inner visibility)\n//\n// Reference-counted per mode so overlapping plugin requests compose cleanly.\n\nimport type {\n BeaconPlugin,\n DeclarativeForm,\n FormField,\n ImperativeForm,\n LabelMap,\n Mode,\n Severity,\n BeaconCtx,\n} from '../types';\nimport { renderFields } from './form';\n\nexport interface DialogCallbacks {\n onSubmit(): void;\n onClose(reason: 'user' | 'submitted'): void;\n}\n\nexport interface PluginPanelSource {\n name: string;\n form: DeclarativeForm | ImperativeForm;\n ctx: BeaconCtx;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction iconClose(): SVGElement {\n const s = document.createElementNS(SVG_NS, 'svg');\n s.setAttribute('viewBox', '0 0 24 24');\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '2');\n s.setAttribute('stroke-linecap', 'round');\n s.setAttribute('stroke-linejoin', 'round');\n const p1 = document.createElementNS(SVG_NS, 'line');\n p1.setAttribute('x1', '18'); p1.setAttribute('y1', '6'); p1.setAttribute('x2', '6'); p1.setAttribute('y2', '18');\n const p2 = document.createElementNS(SVG_NS, 'line');\n p2.setAttribute('x1', '6'); p2.setAttribute('y1', '6'); p2.setAttribute('x2', '18'); p2.setAttribute('y2', '18');\n s.appendChild(p1); s.appendChild(p2);\n return s;\n}\n\nexport class DialogView {\n readonly root: HTMLDialogElement;\n private inner: HTMLDivElement;\n private pluginSlot: HTMLDivElement;\n private statusEl: HTMLDivElement;\n private submitBtn: HTMLButtonElement;\n private descTextarea: HTMLTextAreaElement;\n private severitySelected: Severity = 'bug';\n private severitiesContainer!: HTMLDivElement;\n private modeCounts: Record<Mode, number> = { minimize: 0, hide: 0, pickElement: 0 };\n private pluginCleanups: Array<() => void> = [];\n // Track the last focused element so showModal() can restore focus on pickElement release.\n private lastActive: HTMLElement | null = null;\n // Bypasses the discard-confirmation guard for the 1.5s lingering success\n // state — clicking X during \"Sent — thanks!\" shouldn't prompt the user.\n private submitSucceeded = false;\n // Per the HTML spec, `dialog.close()` fires the `close` event via a queued\n // task — async, not sync. A synchronous boolean flag (`= true; close(); = false`)\n // closes before the event fires. Track the number of in-flight programmatic\n // closes we want to suppress; the close listener decrements + skips one per\n // event. Survives whatever microtask the spec chooses.\n private expectedSuppressedCloses = 0;\n\n constructor(\n private labels: LabelMap,\n private severities: Severity[],\n private callbacks: DialogCallbacks,\n ) {\n this.root = document.createElement('dialog');\n this.root.className = 'beacon-dialog';\n\n this.inner = document.createElement('div');\n this.inner.className = 'beacon-dialog-inner';\n this.root.appendChild(this.inner);\n\n // ── Header ──────────────────────────────────────\n const header = document.createElement('div');\n header.className = 'beacon-drawer-header';\n const title = document.createElement('div');\n title.className = 'beacon-drawer-title';\n title.textContent = labels.drawerTitle;\n header.appendChild(title);\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'beacon-icon-btn';\n closeBtn.setAttribute('aria-label', labels.closeButton);\n closeBtn.appendChild(iconClose());\n closeBtn.addEventListener('click', () => this.userCloseAttempt());\n header.appendChild(closeBtn);\n this.inner.appendChild(header);\n\n // Intercept Esc-close via the dialog's `cancel` event. If there's unsaved\n // user input, preventDefault and prompt — otherwise let the native close\n // proceed.\n this.root.addEventListener('cancel', (e) => {\n if (this.submitSucceeded) return;\n if (!this.hasUnsavedInput()) return;\n e.preventDefault();\n // eslint-disable-next-line no-alert\n if (window.confirm('You have unsaved feedback. Discard?')) {\n this.root.close();\n }\n });\n\n // ── Body ──────────────────────────────────────\n const body = document.createElement('div');\n body.className = 'beacon-drawer-body';\n this.inner.appendChild(body);\n\n // Description (core, always present).\n const descField = document.createElement('div');\n descField.className = 'beacon-field';\n const descLabel = document.createElement('label');\n descLabel.className = 'beacon-label';\n descLabel.textContent = labels.descriptionLabel;\n this.descTextarea = document.createElement('textarea');\n this.descTextarea.className = 'beacon-textarea';\n this.descTextarea.placeholder = labels.descriptionPlaceholder;\n this.descTextarea.rows = 4;\n descField.appendChild(descLabel);\n descField.appendChild(this.descTextarea);\n body.appendChild(descField);\n\n // Severity (core, always present).\n const sevField = document.createElement('div');\n sevField.className = 'beacon-field';\n const sevLabel = document.createElement('label');\n sevLabel.className = 'beacon-label';\n sevLabel.textContent = labels.severityLabel;\n this.severitiesContainer = document.createElement('div');\n this.severitiesContainer.className = 'beacon-severity';\n for (const sev of severities) {\n const opt = document.createElement('label');\n opt.className = 'beacon-severity-opt';\n opt.dataset.sev = sev;\n const input = document.createElement('input');\n input.type = 'radio';\n input.name = 'beacon-severity';\n input.value = sev;\n if (sev === this.severitySelected) {\n input.checked = true;\n opt.classList.add('selected');\n }\n input.addEventListener('change', () => this.setSeverity(sev));\n opt.appendChild(input);\n opt.appendChild(document.createTextNode(this.severityLabel(sev)));\n this.severitiesContainer.appendChild(opt);\n }\n sevField.appendChild(sevLabel);\n sevField.appendChild(this.severitiesContainer);\n body.appendChild(sevField);\n\n // ── Plugin panels ──────────────────────────────────────\n this.pluginSlot = document.createElement('div');\n this.pluginSlot.className = 'beacon-plugin-panels';\n body.appendChild(this.pluginSlot);\n\n // ── Status + actions ──────────────────────────────────────\n this.statusEl = document.createElement('div');\n this.statusEl.className = 'beacon-status';\n body.appendChild(this.statusEl);\n\n const actions = document.createElement('div');\n actions.className = 'beacon-actions';\n this.submitBtn = document.createElement('button');\n this.submitBtn.type = 'button';\n this.submitBtn.className = 'beacon-btn primary';\n this.submitBtn.textContent = labels.send;\n this.submitBtn.addEventListener('click', () => this.callbacks.onSubmit());\n actions.appendChild(this.submitBtn);\n body.appendChild(actions);\n\n // Esc / backdrop default close → treat as user close. Mode-triggered\n // closes (pickElement) suppress this so the panels survive the transition.\n this.root.addEventListener('close', () => {\n if (this.expectedSuppressedCloses > 0) {\n this.expectedSuppressedCloses -= 1;\n return;\n }\n this.callbacks.onClose('user');\n });\n }\n\n // ── Mode handling (§5) ──────────────────────────────────────────\n\n async requestMode(mode: Mode): Promise<() => void> {\n this.modeCounts[mode] += 1;\n if (this.modeCounts[mode] === 1) {\n this.applyMode(mode, true);\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.modeCounts[mode] -= 1;\n if (this.modeCounts[mode] === 0) {\n this.applyMode(mode, false);\n }\n };\n }\n\n private applyMode(mode: Mode, on: boolean) {\n switch (mode) {\n case 'pickElement': {\n if (on) {\n this.lastActive = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n if (this.root.open) {\n // Increment BEFORE calling close — the queued close event will\n // decrement when it eventually fires, skipping onClose.\n this.expectedSuppressedCloses += 1;\n this.root.close();\n }\n } else {\n if (!this.root.open) this.tryShowModal();\n this.lastActive?.focus?.();\n }\n break;\n }\n case 'hide': {\n this.inner.style.visibility = on ? 'hidden' : '';\n this.root.style.opacity = on ? '0' : '';\n break;\n }\n case 'minimize': {\n // Keep header visible, hide body.\n const body = this.inner.querySelector<HTMLElement>('.beacon-drawer-body');\n if (body) body.style.display = on ? 'none' : '';\n break;\n }\n }\n }\n\n // ── Public surface ──────────────────────────────────────────\n\n open() {\n if (this.root.open) return;\n this.tryShowModal();\n }\n\n close(reason: 'user' | 'submitted' = 'user') {\n if (this.root.open) {\n this.root.close();\n }\n // Even if not open, ensure modes reset and panel cleanups run.\n if (reason === 'submitted') this.statusEl.textContent = '';\n }\n\n private userCloseAttempt() {\n if (!this.submitSucceeded && this.hasUnsavedInput()) {\n // eslint-disable-next-line no-alert\n if (!window.confirm('You have unsaved feedback. Discard?')) return;\n }\n if (this.root.open) this.root.close();\n }\n\n private hasUnsavedInput(): boolean {\n return this.descTextarea.value.trim().length > 0;\n }\n\n setSubmitSucceeded(value: boolean) {\n this.submitSucceeded = value;\n }\n\n getDescription(): string {\n return this.descTextarea.value;\n }\n setDescription(v: string) {\n this.descTextarea.value = v;\n }\n\n getSeverity(): Severity {\n return this.severitySelected;\n }\n setSeverity(sev: Severity) {\n this.severitySelected = sev;\n for (const opt of Array.from(this.severitiesContainer.children) as HTMLElement[]) {\n opt.classList.toggle('selected', opt.dataset.sev === sev);\n const input = opt.querySelector('input');\n if (input) input.checked = opt.dataset.sev === sev;\n }\n }\n\n setStatus(text: string, kind: 'idle' | 'error' | 'success' = 'idle') {\n this.statusEl.textContent = text;\n this.statusEl.classList.remove('error', 'success');\n if (kind !== 'idle') this.statusEl.classList.add(kind);\n }\n\n setSubmitting(submitting: boolean) {\n this.submitBtn.disabled = submitting;\n this.submitBtn.textContent = submitting ? this.labels.sending : this.labels.send;\n }\n\n // Reset drawer state after a successful submit so the next open() starts fresh.\n resetState() {\n this.descTextarea.value = '';\n this.setStatus('', 'idle');\n this.setSubmitting(false);\n this.submitSucceeded = false;\n if (this.severities[0]) this.setSeverity(this.severities[0]);\n }\n\n // ── Plugin panel management ──────────────────────────────────────\n\n installPluginPanels(sources: PluginPanelSource[], formValuesHost: {\n get(plugin: string, name: string): unknown;\n set(plugin: string, name: string, value: unknown): void;\n }): void {\n this.clearPluginPanels();\n for (const src of sources) {\n const panel = document.createElement('div');\n panel.className = 'beacon-plugin-panel';\n\n if (src.form.title) {\n const titleEl = document.createElement('div');\n titleEl.className = 'beacon-plugin-panel-title';\n titleEl.textContent = src.form.title;\n panel.appendChild(titleEl);\n }\n\n if ('fields' in src.form) {\n renderFields(panel, src.form.fields as FormField[], {\n get: (name) => formValuesHost.get(src.name, name),\n set: (name, value) => formValuesHost.set(src.name, name, value),\n });\n } else {\n const cleanup = src.form.render(panel, src.ctx);\n if (typeof cleanup === 'function') this.pluginCleanups.push(cleanup);\n }\n\n this.pluginSlot.appendChild(panel);\n }\n }\n\n clearPluginPanels(): void {\n for (const fn of this.pluginCleanups) {\n try { fn(); } catch { /* swallow */ }\n }\n this.pluginCleanups = [];\n this.pluginSlot.innerHTML = '';\n }\n\n private severityLabel(sev: Severity): string {\n switch (sev) {\n case 'bug': return this.labels.severityBug;\n case 'idea': return this.labels.severityIdea;\n case 'ux': return this.labels.severityUx;\n case 'a11y': return this.labels.severityA11y;\n }\n }\n\n private tryShowModal() {\n try {\n this.root.showModal();\n } catch {\n // Browsers below baseline: fall back to non-modal. Drawer is visible but doesn't escape\n // ancestor containment — internal-use only, our app supports modern browsers.\n this.root.show();\n }\n }\n}\n\nexport function defaultLabels(): LabelMap {\n return {\n triggerButton: 'Feedback',\n drawerTitle: 'Send feedback',\n closeButton: 'Close',\n send: 'Send',\n sending: 'Sending…',\n sentSuccess: 'Sent — thanks!',\n descriptionLabel: 'Description',\n descriptionPlaceholder: 'What happened?',\n severityLabel: 'Severity',\n severityBug: 'bug',\n severityIdea: 'idea',\n severityUx: 'ux',\n severityA11y: 'a11y',\n };\n}\n\n// Re-exporting BeaconPlugin so dialog consumers don't have to round-trip through types.\nexport type { BeaconPlugin };\n","// Shadow-DOM-internal overlay layer. Plugins paint floating UI here during\n// `requestMode('pickElement')` when the <dialog> is temporarily closed.\n//\n// Each overlay() call appends a slot element and returns a destroy fn that\n// removes it. Overlays survive dialog open/close (they live in the shadow root,\n// not the <dialog>) so plugins can keep painting through mode transitions.\n\nexport interface OverlayHost {\n layer: HTMLElement;\n}\n\nexport function createOverlayHost(shadow: ShadowRoot): OverlayHost {\n const layer = document.createElement('div');\n layer.className = 'beacon-overlay-layer';\n shadow.appendChild(layer);\n return { layer };\n}\n\nexport function attachOverlay(\n host: OverlayHost,\n render: (slot: HTMLElement) => void | (() => void),\n): () => void {\n const slot = document.createElement('div');\n host.layer.appendChild(slot);\n let cleanup: void | (() => void);\n try {\n cleanup = render(slot);\n } catch (err) {\n slot.remove();\n throw err;\n }\n return () => {\n try { cleanup?.(); } catch { /* swallow */ }\n if (slot.parentNode) slot.parentNode.removeChild(slot);\n };\n}\n","// metadata plugin — payload metadata is already captured by core.assemblePayload\n// from window.* APIs. This plugin contributes an optional `uaData` block (Client\n// Hints) so high-entropy UA data lands in payload.plugins.metadata.uaData when\n// available — without making it part of the core required payload.\n\nimport type { BeaconPlugin } from '../types';\n\ninterface UADataLike {\n brands: Array<{ brand: string; version: string }>;\n mobile: boolean;\n platform: string;\n}\n\nfunction getUaData(): { brand: string; mobile: boolean; platform: string } | undefined {\n const nav = navigator as Navigator & { userAgentData?: UADataLike };\n if (!nav.userAgentData) return undefined;\n const brand = nav.userAgentData.brands.find((b) => !/Not[.\\-]?A.?Brand/i.test(b.brand))?.brand\n ?? nav.userAgentData.brands[0]?.brand\n ?? 'unknown';\n return {\n brand,\n mobile: nav.userAgentData.mobile,\n platform: nav.userAgentData.platform,\n };\n}\n\nexport function metadata(): BeaconPlugin {\n return {\n name: 'metadata',\n capture() {\n const uaData = getUaData();\n return uaData ? { uaData } : null;\n },\n };\n}\n","// Bounded ring buffer for runtime errors + unhandled rejections. Owned by the\n// errors plugin instance (not a module-level singleton — install/teardown cleanly\n// across init() re-calls).\n\nexport interface CapturedRuntimeEvent {\n ts: number;\n kind: 'error' | 'unhandledrejection';\n message: string;\n stack?: string;\n source?: string;\n line?: number;\n col?: number;\n}\n\nconst MAX_EVENTS = 30;\nconst MESSAGE_LIMIT = 500;\nconst STACK_LIMIT = 2000;\nconst SOURCE_LIMIT = 500;\nconst DEDUPE_WINDOW_MS = 5000;\n\nconst BEACON_STACK_PATTERN = /launch-kit-beacon|beacon\\.(?:es|umd|mjs)|\\/beacon\\//i;\n\nfunction trunc(value: string | undefined, limit: number): string | undefined {\n if (!value) return undefined;\n return value.length > limit ? value.slice(0, limit) : value;\n}\n\nfunction signature(message: string, stack: string | undefined): string {\n const stackHead = stack?.split('\\n').slice(0, 3).join('|') ?? '';\n return `${message}::${stackHead}`;\n}\n\nfunction fromBeacon(stack: string | undefined): boolean {\n return !!stack && BEACON_STACK_PATTERN.test(stack);\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value).slice(0, MESSAGE_LIMIT);\n } catch {\n return String(value);\n }\n}\n\nexport interface EventBuffer {\n install(): () => void;\n snapshot(): CapturedRuntimeEvent[];\n subscribe(fn: () => void): () => void;\n}\n\nexport function createEventBuffer(): EventBuffer {\n const buffer: CapturedRuntimeEvent[] = [];\n const recentSignatures = new Map<string, number>();\n const listeners = new Set<() => void>();\n let installed = false;\n let onError: ((e: ErrorEvent) => void) | undefined;\n let onRejection: ((e: PromiseRejectionEvent) => void) | undefined;\n\n function push(event: CapturedRuntimeEvent): void {\n if (fromBeacon(event.stack)) return;\n if (event.kind === 'unhandledrejection' && /AbortError/i.test(event.message)) return;\n const sig = signature(event.message, event.stack);\n const last = recentSignatures.get(sig);\n if (last !== undefined && event.ts - last < DEDUPE_WINDOW_MS) {\n recentSignatures.set(sig, event.ts);\n return;\n }\n recentSignatures.set(sig, event.ts);\n buffer.push(event);\n if (buffer.length > MAX_EVENTS) buffer.shift();\n for (const fn of listeners) {\n try { fn(); } catch { /* swallow */ }\n }\n }\n\n return {\n install(): () => void {\n if (installed) return () => {};\n if (typeof window === 'undefined') return () => {};\n installed = true;\n\n onError = (e: ErrorEvent) => {\n try {\n const errMessage = e.error instanceof Error ? e.error.message : undefined;\n const errStack = e.error instanceof Error ? e.error.stack : undefined;\n push({\n ts: Date.now(),\n kind: 'error',\n message: trunc(e.message || errMessage || 'Unknown error', MESSAGE_LIMIT) ?? 'Unknown error',\n ...(errStack ? { stack: trunc(errStack, STACK_LIMIT)! } : {}),\n ...(e.filename ? { source: trunc(e.filename, SOURCE_LIMIT)! } : {}),\n ...(Number.isFinite(e.lineno) ? { line: e.lineno } : {}),\n ...(Number.isFinite(e.colno) ? { col: e.colno } : {}),\n });\n } catch { /* never throw */ }\n };\n\n onRejection = (e: PromiseRejectionEvent) => {\n try {\n const reason: unknown = e.reason;\n const message = reason instanceof Error\n ? reason.message\n : typeof reason === 'string'\n ? reason\n : safeStringify(reason);\n const stack = reason instanceof Error ? reason.stack : undefined;\n push({\n ts: Date.now(),\n kind: 'unhandledrejection',\n message: trunc(message || 'Unknown rejection', MESSAGE_LIMIT) ?? 'Unknown rejection',\n ...(stack ? { stack: trunc(stack, STACK_LIMIT)! } : {}),\n });\n } catch { /* never throw */ }\n };\n\n window.addEventListener('error', onError);\n window.addEventListener('unhandledrejection', onRejection);\n\n return () => {\n if (onError) window.removeEventListener('error', onError);\n if (onRejection) window.removeEventListener('unhandledrejection', onRejection);\n installed = false;\n listeners.clear();\n };\n },\n\n snapshot(): CapturedRuntimeEvent[] {\n return buffer.slice();\n },\n\n subscribe(fn: () => void): () => void {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n },\n };\n}\n","// errors plugin — installs runtime `error` + `unhandledrejection` listeners at\n// setupOnce so the buffer fills before the user clicks Send.\n//\n// Two surfaces:\n// • form() renders an expandable chip in the drawer showing what was\n// captured (\"3 runtime errors captured\" → click to expand the list).\n// Live-updates as new errors fire while the drawer is open.\n// • capture() drains the snapshot into payload.plugins.errors.events.\n\nimport { createEventBuffer, type CapturedRuntimeEvent, type EventBuffer } from '../internal/event-buffer';\nimport type { BeaconPlugin } from '../types';\n\nexport function errors(): BeaconPlugin {\n let buffer: EventBuffer | null = null;\n\n return {\n name: 'errors',\n setupOnce(ctx) {\n buffer = createEventBuffer();\n const uninstall = buffer.install();\n ctx.signal.addEventListener('abort', uninstall, { once: true });\n return uninstall;\n },\n form() {\n return {\n render: (slot) => {\n // `slot` IS the per-plugin .beacon-plugin-panel div — hide it directly\n // when there are no events so the drawer doesn't carry an empty padded\n // box (and an empty red dot). Don't read slot.parentElement: at first\n // render() time the slot isn't attached yet, so the lookup is null.\n const wrapper = document.createElement('details');\n wrapper.className = 'beacon-events';\n\n const summary = document.createElement('summary');\n summary.className = 'beacon-events-summary';\n const dot = document.createElement('span');\n dot.className = 'beacon-events-dot';\n dot.textContent = '●';\n const label = document.createElement('span');\n label.className = 'beacon-events-label';\n summary.appendChild(dot);\n summary.appendChild(label);\n wrapper.appendChild(summary);\n\n const list = document.createElement('ul');\n list.className = 'beacon-events-list';\n wrapper.appendChild(list);\n slot.appendChild(wrapper);\n\n function update() {\n const events: CapturedRuntimeEvent[] = buffer?.snapshot() ?? [];\n const count = events.length;\n if (count === 0) {\n slot.style.display = 'none';\n return;\n }\n slot.style.display = '';\n label.textContent = `${count} runtime error${count !== 1 ? 's' : ''} captured`;\n list.innerHTML = '';\n for (const ev of events) {\n const li = document.createElement('li');\n li.className = 'beacon-events-item';\n const kind = document.createElement('span');\n kind.className = `beacon-events-kind ${ev.kind === 'unhandledrejection' ? 'rejection' : 'error'}`;\n kind.textContent = ev.kind === 'unhandledrejection' ? 'REJ' : 'ERR';\n const msg = document.createElement('span');\n msg.className = 'beacon-events-msg';\n msg.textContent = ev.message;\n li.appendChild(kind);\n li.appendChild(msg);\n list.appendChild(li);\n }\n }\n\n update();\n const unsub = buffer?.subscribe(update);\n return () => { unsub?.(); };\n },\n };\n },\n capture() {\n const events: CapturedRuntimeEvent[] = buffer?.snapshot() ?? [];\n if (events.length === 0) return null;\n return { events };\n },\n };\n}\n","// Build a unique-ish CSS selector path by walking up the parent chain.\n// Strategy per ancestor: id (if unique) → tag.classes (if unique among siblings) → tag:nth-of-type(n).\n// When the walk crosses an open shadow root boundary, the path is joined\n// with \" >> \" to make the boundary explicit (non-standard but informative\n// — selectors aren't expected to be replay-valid querySelector inputs).\n\nconst MAX_DEPTH = 8;\nconst SHADOW_SEPARATOR = ' >> ';\n\nfunction isUniqueId(id: string, root: Document | ShadowRoot = document): boolean {\n if (!id) return false;\n try {\n return root.querySelectorAll(`#${CSS.escape(id)}`).length === 1;\n } catch {\n return false;\n }\n}\n\nfunction tagWithClasses(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const classes = Array.from(el.classList)\n .filter((c) => c.length > 0 && c.length < 40)\n .slice(0, 3)\n .map((c) => `.${CSS.escape(c)}`)\n .join('');\n return tag + classes;\n}\n\nfunction nthOfTypeIndex(el: Element): number {\n const parent = el.parentElement;\n if (!parent) return 1;\n const sameTag = Array.from(parent.children).filter((c) => c.tagName === el.tagName);\n return sameTag.indexOf(el) + 1;\n}\n\nexport function buildSelector(target: Element): string {\n if (!target || target.nodeType !== Node.ELEMENT_NODE) return '';\n\n if (target.id && isUniqueId(target.id)) {\n return `#${CSS.escape(target.id)}`;\n }\n\n const parts: string[] = [];\n // Track shadow-crossings: when we ascend from a shadow root to its host,\n // we set the next separator to \" >> \" instead of \" > \" so the resulting\n // path makes the shadow boundary visible.\n const separators: string[] = [];\n let el: Element | null = target;\n let depth = 0;\n\n while (el && el.tagName.toLowerCase() !== 'body' && depth < MAX_DEPTH) {\n const current: Element = el;\n if (current.id && isUniqueId(current.id)) {\n parts.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n const base = tagWithClasses(current);\n const parent: HTMLElement | null = current.parentElement;\n let part = base;\n if (parent) {\n try {\n const currentClasses = Array.from(current.classList).join(' ');\n const siblings: Element[] = Array.from(parent.children).filter(\n (c: Element) => c.tagName === current.tagName && Array.from(c.classList).join(' ') === currentClasses,\n );\n if (siblings.length > 1) {\n part = `${current.tagName.toLowerCase()}:nth-of-type(${nthOfTypeIndex(current)})`;\n }\n } catch {\n // fall back to base\n }\n }\n\n parts.unshift(part);\n if (parts.length > 1) separators.unshift(' > ');\n\n // Walk to next ancestor: parentElement if present, else cross shadow\n // boundary via the root's host.\n if (parent) {\n el = parent;\n } else {\n const root = current.getRootNode();\n if (root instanceof ShadowRoot) {\n el = root.host as Element;\n // The separator that will join the host segment to what's already in\n // parts represents the shadow boundary crossing.\n if (parts.length > 0) separators[0] = SHADOW_SEPARATOR;\n } else {\n el = null;\n }\n }\n depth++;\n }\n\n // Stitch: parts[0] + separators[0] + parts[1] + separators[1] + ...\n let out = parts[0] ?? '';\n for (let i = 1; i < parts.length; i++) {\n out += (separators[i - 1] ?? ' > ') + parts[i];\n }\n return out;\n}\n","// Best-effort framework component name detection for the active element.\n// Production builds usually minify names — return null quietly when unavailable.\n\nexport type FrameworkHint = { lib: 'react' | 'vue' | 'angular' | 'svelte' | null; name?: string };\n\nfunction detectReact(el: Element): FrameworkHint | null {\n const keys = Object.keys(el).filter(\n (k) => k.startsWith('__reactFiber$') || k.startsWith('__reactInternalInstance$'),\n );\n if (keys.length === 0) return null;\n let fiber: unknown = (el as unknown as Record<string, unknown>)[keys[0]!];\n for (let i = 0; i < 10 && fiber; i++) {\n const f = fiber as { type?: unknown; return?: unknown };\n const type = f.type;\n if (typeof type === 'function') {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name && name !== '_default') return { lib: 'react', name };\n }\n if (typeof type === 'object' && type !== null) {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name) return { lib: 'react', name };\n }\n fiber = f.return;\n }\n return { lib: 'react' };\n}\n\nfunction detectVue(el: Element): FrameworkHint | null {\n const anyEl = el as unknown as Record<string, unknown>;\n const vueParent = anyEl.__vueParentComponent as { type?: { name?: string; __name?: string } } | undefined;\n if (vueParent) {\n const name = vueParent.type?.name ?? vueParent.type?.__name;\n return { lib: 'vue', ...(name ? { name } : {}) };\n }\n if (anyEl.__vue__) return { lib: 'vue' };\n return null;\n}\n\nfunction detectAngular(el: Element): FrameworkHint | null {\n const ng = (window as unknown as { ng?: { getComponent?: (el: Element) => unknown } }).ng;\n if (!ng?.getComponent) return null;\n try {\n const cmp = ng.getComponent(el);\n if (!cmp) return null;\n const ctor = (cmp as { constructor?: { name?: string } }).constructor;\n return { lib: 'angular', ...(ctor?.name ? { name: ctor.name } : {}) };\n } catch {\n return null;\n }\n}\n\nfunction detectSvelte(el: Element): FrameworkHint | null {\n const anyEl = el as unknown as Record<string, unknown>;\n if ('__svelte_meta' in anyEl) return { lib: 'svelte' };\n return null;\n}\n\nexport function detectFramework(el: Element): FrameworkHint | undefined {\n return detectReact(el) ?? detectVue(el) ?? detectAngular(el) ?? detectSvelte(el) ?? undefined;\n}\n","// Capture per-pin element data: outerHTML, selector, computed styles, bounding rect, framework hint.\n\nimport { buildSelector } from './selector';\nimport { detectFramework, type FrameworkHint } from './framework-detect';\n\nconst OUTER_HTML_LIMIT = 5000;\nconst PARENT_OUTER_HTML_LIMIT = 1000;\nconst SELECTOR_LIMIT = 1000;\nconst ID_LIMIT = 200;\nconst CLASSLIST_MAX_ENTRIES = 50;\nconst CLASS_NAME_LIMIT = 200;\nconst STYLE_VALUE_LIMIT = 500;\n\nconst USEFUL_STYLE_PROPS = [\n 'display', 'position', 'top', 'right', 'bottom', 'left',\n 'width', 'height', 'min-width', 'min-height', 'max-width', 'max-height',\n 'margin', 'padding',\n 'font-family', 'font-size', 'font-weight', 'line-height', 'text-align',\n 'color', 'background-color', 'background-image',\n 'border', 'border-radius',\n 'opacity', 'visibility', 'overflow',\n 'z-index', 'transform', 'transition',\n 'flex', 'flex-direction', 'justify-content', 'align-items', 'gap',\n 'grid-template-columns', 'grid-template-rows',\n] as const;\n\nexport interface ElementCapture {\n selector: string;\n tagName: string;\n id: string | null;\n classList: string[];\n outerHTML: string;\n parentOuterHTML?: string;\n computedStyles: Record<string, string>;\n boundingRect: { x: number; y: number; w: number; h: number };\n framework?: FrameworkHint;\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max) + `\\n\\n/* … truncated, original was ${s.length} chars */`;\n}\n\nfunction pickStyles(el: Element): Record<string, string> {\n const computed = getComputedStyle(el);\n const out: Record<string, string> = {};\n for (const prop of USEFUL_STYLE_PROPS) {\n const value = computed.getPropertyValue(prop);\n if (value && value !== 'normal' && value !== 'none' && value !== 'auto' && value !== '0px') {\n out[prop] = value.trim().slice(0, STYLE_VALUE_LIMIT);\n }\n }\n return out;\n}\n\nfunction capClassList(el: Element): string[] {\n return Array.from(el.classList)\n .slice(0, CLASSLIST_MAX_ENTRIES)\n .map((c) => (c.length > CLASS_NAME_LIMIT ? c.slice(0, CLASS_NAME_LIMIT) : c));\n}\n\nexport function captureElement(el: Element): ElementCapture {\n const rect = el.getBoundingClientRect();\n const rawSelector = buildSelector(el);\n const rawId = el.id || null;\n const framework = detectFramework(el);\n return {\n selector: rawSelector.length > SELECTOR_LIMIT ? rawSelector.slice(0, SELECTOR_LIMIT) : rawSelector,\n tagName: el.tagName.toLowerCase(),\n id: rawId && rawId.length > ID_LIMIT ? rawId.slice(0, ID_LIMIT) : rawId,\n classList: capClassList(el),\n outerHTML: truncate(el.outerHTML, OUTER_HTML_LIMIT),\n ...(el.parentElement\n ? { parentOuterHTML: truncate(el.parentElement.outerHTML, PARENT_OUTER_HTML_LIMIT) }\n : {}),\n computedStyles: pickStyles(el),\n boundingRect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n ...(framework ? { framework } : {}),\n };\n}\n","// Draw captured pins onto a screenshot. Outline rectangle + numbered marker per pin.\n\nexport interface PinMarker {\n number: number;\n selector?: string;\n boundingRect: { x: number; y: number; w: number; h: number };\n liveElement?: Element;\n}\n\nconst MARKER_RADIUS = 14;\nconst MARKER_STROKE = '#ffffff';\nconst MARKER_TEXT = '#ffffff';\nconst OUTLINE_WIDTH = 3;\nconst DEFAULT_ACCENT = '#0ea5e9';\n\nexport async function drawMarkers(\n screenshotDataUrl: string,\n pins: PinMarker[],\n viewport: { w: number; h: number; dpr: number },\n accent: string = DEFAULT_ACCENT,\n): Promise<string> {\n const img = await loadImage(screenshotDataUrl);\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2D canvas context');\n\n ctx.drawImage(img, 0, 0);\n\n const scaleX = canvas.width / viewport.w;\n const scaleY = canvas.height / viewport.h;\n\n for (const pin of pins) {\n const rect = getFreshRect(pin);\n if (!rect) continue;\n\n const x = rect.x * scaleX;\n const y = rect.y * scaleY;\n const w = rect.w * scaleX;\n const h = rect.h * scaleY;\n\n ctx.lineWidth = OUTLINE_WIDTH;\n ctx.strokeStyle = accent;\n ctx.strokeRect(x, y, w, h);\n\n const cx = x + w;\n const cy = y;\n\n ctx.beginPath();\n ctx.fillStyle = accent;\n ctx.arc(cx, cy, MARKER_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.lineWidth = 3;\n ctx.strokeStyle = MARKER_STROKE;\n ctx.stroke();\n\n ctx.fillStyle = MARKER_TEXT;\n ctx.font = 'bold 16px system-ui, -apple-system, sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(String(pin.number), cx, cy + 1);\n }\n\n return canvas.toDataURL('image/jpeg', 0.85);\n}\n\nfunction getFreshRect(pin: PinMarker): { x: number; y: number; w: number; h: number } | null {\n if (pin.liveElement && document.contains(pin.liveElement)) {\n const r = pin.liveElement.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n return { x: r.left, y: r.top, w: r.width, h: r.height };\n }\n }\n if (pin.selector) {\n try {\n const found = document.querySelector(pin.selector);\n if (found) {\n const r = found.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n return { x: r.left, y: r.top, w: r.width, h: r.height };\n }\n }\n } catch { /* fall through */ }\n }\n return pin.boundingRect;\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (err) => reject(err);\n img.src = src;\n });\n}\n","// Visual overlay shown during pin-mode. Three layers:\n// 1. Subtle dotted viewport border + soft inset glow → \"you're in pin mode\"\n// 2. Top-center hint pill → \"press Esc to finish\"\n// 3. Numbered markers + outlines → over each already-pinned\n// element so the user can\n// see what they pinned\n//\n// Mounted on document.body (NOT the beacon Shadow DOM) because position:fixed\n// children of transformed/filtered/contained ancestors get anchored to that\n// ancestor instead of the viewport — and many host pages put a transform on\n// sticky headers, which is exactly where the slotted trigger lives.\n//\n// Each element carries the `beacon-no-capture` class so the screenshot filter\n// skips them. All use pointer-events: none so they don't block elementsFromPoint\n// during picking.\n\nconst NO_CAPTURE_CLASS = 'beacon-no-capture';\nconst DEFAULT_ACCENT = '#0ea5e9';\nconst DEFAULT_HINT = 'Click any element to pin it · Press Esc to finish';\n\nexport interface PinAnchor {\n target: Element;\n /** Selector to re-query if `target` is detached (React re-render, conditional unmount). */\n selector?: string;\n /** Last-known viewport rect from pin time. Used as a faded \"anchor lost\" marker\n * if both the live ref and the selector lookup fail. */\n fallbackRect?: { x: number; y: number; w: number; h: number };\n}\n\nexport interface PickModeOverlay {\n addPin(pinNumber: number, anchor: PinAnchor): void;\n /** Swap the hint pill into a loading state (with spinner). Pass undefined to restore the default. */\n setLoading(message?: string): void;\n destroy(): void;\n}\n\nexport interface PickModeOverlayOptions {\n accent?: string;\n}\n\nfunction withAlpha(color: string, alphaHex: string): string {\n return /^#[0-9a-fA-F]{6}$/.test(color) ? `${color}${alphaHex}` : color;\n}\n\nexport function createPickModeOverlay(opts: PickModeOverlayOptions = {}): PickModeOverlay {\n const ACCENT = opts.accent ?? DEFAULT_ACCENT;\n const ACCENT_BORDER = withAlpha(ACCENT, 'b3');\n const ACCENT_GLOW = withAlpha(ACCENT, '2e');\n\n const styleTag = document.createElement('style');\n styleTag.className = NO_CAPTURE_CLASS;\n styleTag.textContent = '@keyframes beacon-spin { to { transform: rotate(360deg); } }';\n document.head.appendChild(styleTag);\n\n const frame = document.createElement('div');\n frame.className = NO_CAPTURE_CLASS;\n frame.setAttribute('aria-hidden', 'true');\n frame.style.cssText = [\n 'position: fixed',\n 'inset: 0',\n 'pointer-events: none',\n 'z-index: 2147483646',\n `border: 2px dashed ${ACCENT_BORDER}`,\n 'border-radius: 4px',\n `box-shadow: inset 0 0 56px ${ACCENT_GLOW}`,\n 'box-sizing: border-box',\n ].join('; ');\n\n const hint = document.createElement('div');\n hint.className = NO_CAPTURE_CLASS;\n hint.setAttribute('role', 'status');\n hint.style.cssText = [\n 'position: fixed',\n 'top: 16px',\n 'left: 50%',\n 'transform: translateX(-50%)',\n `background: ${ACCENT}`,\n 'color: #fff',\n 'padding: 6px 14px',\n 'border-radius: 999px',\n 'font: 500 12px/1.4 system-ui, -apple-system, sans-serif',\n 'letter-spacing: 0.01em',\n 'box-shadow: 0 4px 12px hsl(0 0% 0% / 0.3)',\n 'pointer-events: none',\n 'white-space: nowrap',\n 'z-index: 2147483646',\n ].join('; ');\n hint.textContent = DEFAULT_HINT;\n\n const SPINNER_HTML = `<span style=\"\n display: inline-block;\n width: 12px;\n height: 12px;\n border: 2px solid #fff;\n border-top-color: transparent;\n border-radius: 50%;\n animation: beacon-spin 800ms linear infinite;\n vertical-align: middle;\n margin-right: 8px;\n \"></span>`;\n\n function escapeHtml(s: string): string {\n return s.replace(/[<>&]/g, (c) => ({ '<': '<', '>': '>', '&': '&' }[c] as string));\n }\n\n document.body.appendChild(frame);\n document.body.appendChild(hint);\n\n const tracked = new Map<number, { anchor: PinAnchor; marker: HTMLDivElement; outline: HTMLDivElement }>();\n\n function makeMarker(num: number): HTMLDivElement {\n const m = document.createElement('div');\n m.className = NO_CAPTURE_CLASS;\n m.setAttribute('aria-hidden', 'true');\n m.style.cssText = [\n 'position: fixed',\n 'width: 24px',\n 'height: 24px',\n 'border-radius: 999px',\n `background: ${ACCENT}`,\n 'color: #fff',\n 'display: flex',\n 'align-items: center',\n 'justify-content: center',\n 'font: 700 12px/1 system-ui, -apple-system, sans-serif',\n 'border: 2px solid #fff',\n 'box-shadow: 0 2px 8px hsl(0 0% 0% / 0.4)',\n 'pointer-events: none',\n 'z-index: 2147483646',\n ].join('; ');\n m.textContent = String(num);\n document.body.appendChild(m);\n return m;\n }\n\n function makeOutline(): HTMLDivElement {\n const o = document.createElement('div');\n o.className = NO_CAPTURE_CLASS;\n o.setAttribute('aria-hidden', 'true');\n o.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n `border: 2px solid ${ACCENT}`,\n 'border-radius: 2px',\n 'box-sizing: border-box',\n 'z-index: 2147483645',\n ].join('; ');\n document.body.appendChild(o);\n return o;\n }\n\n function placeAt(\n entry: { marker: HTMLDivElement; outline: HTMLDivElement },\n rect: { x: number; y: number; w: number; h: number },\n isStale: boolean,\n ) {\n const opacity = isStale ? '0.5' : '1';\n entry.outline.style.display = 'block';\n entry.outline.style.opacity = opacity;\n entry.outline.style.left = `${rect.x}px`;\n entry.outline.style.top = `${rect.y}px`;\n entry.outline.style.width = `${rect.w}px`;\n entry.outline.style.height = `${rect.h}px`;\n\n entry.marker.style.display = 'flex';\n entry.marker.style.opacity = opacity;\n entry.marker.style.left = `${rect.x + rect.w - 12}px`;\n entry.marker.style.top = `${Math.max(2, rect.y - 12)}px`;\n }\n\n function hide(entry: { marker: HTMLDivElement; outline: HTMLDivElement }) {\n entry.marker.style.display = 'none';\n entry.outline.style.display = 'none';\n }\n\n function reposition() {\n tracked.forEach((entry) => {\n let liveTarget: Element | null = entry.anchor.target;\n // `document.contains` walks the light tree only — shadow descendants\n // return false even when still attached. `isConnected` is composed-tree\n // aware, so it correctly says \"still in DOM\" for elements pinned inside\n // an open shadow root (e.g. WiredBlock's wired-card targets).\n if (liveTarget && !liveTarget.isConnected) liveTarget = null;\n\n if (!liveTarget && entry.anchor.selector) {\n // Selector may contain a `>>` shadow-boundary marker (informational,\n // not valid CSS) or otherwise unparseable input. querySelector throws\n // SyntaxError on bad selectors; swallow it — the pick loop must not\n // die just because a re-query is impossible.\n try {\n liveTarget = document.querySelector(entry.anchor.selector);\n } catch {\n liveTarget = null;\n }\n if (liveTarget) entry.anchor.target = liveTarget;\n }\n\n if (liveTarget) {\n const r = liveTarget.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n placeAt(entry, { x: r.left, y: r.top, w: r.width, h: r.height }, false);\n return;\n }\n }\n\n const fr = entry.anchor.fallbackRect;\n if (fr && (fr.w > 0 || fr.h > 0)) {\n placeAt(entry, fr, true);\n return;\n }\n\n hide(entry);\n });\n }\n\n let raf: number | null = null;\n function schedule() {\n if (raf !== null) return;\n raf = requestAnimationFrame(() => {\n raf = null;\n reposition();\n });\n }\n\n window.addEventListener('scroll', schedule, true);\n window.addEventListener('resize', schedule);\n\n return {\n addPin(num, anchor) {\n const marker = makeMarker(num);\n const outline = makeOutline();\n tracked.set(num, { anchor, marker, outline });\n reposition();\n },\n setLoading(message) {\n if (message) {\n hint.innerHTML = SPINNER_HTML + escapeHtml(message);\n } else {\n hint.textContent = DEFAULT_HINT;\n }\n },\n destroy() {\n window.removeEventListener('scroll', schedule, true);\n window.removeEventListener('resize', schedule);\n if (raf !== null) cancelAnimationFrame(raf);\n frame.remove();\n hint.remove();\n styleTag.remove();\n tracked.forEach(({ marker, outline }) => {\n marker.remove();\n outline.remove();\n });\n tracked.clear();\n },\n };\n}\n","// Small contextual popover that opens next to a picked element so the user can\n// optionally type a note. The cross icon discards this pin and lets the user keep\n// picking; Save attaches the (optional) note. Escape ends annotation entirely.\n//\n// Body-mounted (NOT inside the beacon shadow root) so it escapes transformed\n// ancestor stacking contexts. Needs the body-mount style rules registered via\n// the global stylesheet (ensureBeaconBodyStyles).\n\nexport type PinPopoverCancel = 'pin' | 'all' | false;\n\nexport interface PinPopoverResult {\n note?: string;\n /** 'pin' = discard this pin, keep picking. 'all' = end annotation. false = save. */\n cancelled: PinPopoverCancel;\n}\n\nconst ICON_CLOSE =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\nconst ICON_CHECK =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<polyline points=\"20 6 9 17 4 12\"/></svg>';\n\nexport function showPinPopover(opts: {\n anchor: { x: number; y: number };\n pinNumber: number;\n}): Promise<PinPopoverResult> {\n return new Promise((resolve) => {\n const popover = document.createElement('div');\n popover.className = 'beacon-pin-popover open beacon-no-capture beacon-theme-auto';\n popover.innerHTML = `\n <div class=\"beacon-pin-popover-header\">\n <div style=\"display:flex;align-items:center;gap:6px;font-weight:600;font-size:13px;\">\n <span class=\"beacon-pin-num\">${opts.pinNumber}</span>\n <span>Note for this pin</span>\n </div>\n <button type=\"button\" class=\"beacon-icon-btn\" data-action=\"cancel\" aria-label=\"Discard this pin\">${ICON_CLOSE}</button>\n </div>\n <textarea class=\"beacon-textarea\" rows=\"2\" placeholder=\"Optional — describe what's wrong here…\" style=\"min-height:48px;\"></textarea>\n <div class=\"beacon-pin-popover-actions\">\n <button type=\"button\" class=\"beacon-btn primary\" data-action=\"save\">${ICON_CHECK} Save</button>\n </div>\n `;\n\n const POPOVER_W = 240;\n const POPOVER_H = 160;\n const left = Math.min(Math.max(8, opts.anchor.x), window.innerWidth - POPOVER_W - 8);\n const top = Math.min(Math.max(8, opts.anchor.y + 12), window.innerHeight - POPOVER_H - 8);\n popover.style.left = `${left}px`;\n popover.style.top = `${top}px`;\n\n document.body.appendChild(popover);\n\n const textarea = popover.querySelector('textarea')!;\n textarea.focus();\n\n function close(result: PinPopoverResult) {\n document.removeEventListener('keydown', handleGlobalKey, true);\n popover.remove();\n resolve(result);\n }\n\n function handleGlobalKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n close({ cancelled: 'all' });\n }\n }\n document.addEventListener('keydown', handleGlobalKey, true);\n\n popover.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const action = target.closest('[data-action]')?.getAttribute('data-action');\n if (!action) return;\n // Don't let the Save/Cancel click bubble to the deck shell — if it lands\n // on top of an interactive element (e.g. the Respond trigger when picking\n // bottom-of-viewport content), bubbling reopens the drawer and aborts the\n // pick loop after a single pin.\n e.stopPropagation();\n if (action === 'cancel') close({ cancelled: 'pin' });\n if (action === 'save') {\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n });\n\n textarea.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n });\n });\n}\n","// Hover/click element picker. Draws an outline + tooltip over the hovered element\n// and resolves with the clicked element. Skips the widget's own elements via\n// composedPath check against the provided shadow root.\n\nexport interface PickerOptions {\n shadowRoot: ShadowRoot;\n onHover?: (el: Element | null) => void;\n accent?: string;\n}\n\nconst DEFAULT_ACCENT = '#0ea5e9';\n\nfunction withAlpha(color: string, alphaHex: string): string {\n return /^#[0-9a-fA-F]{6}$/.test(color) ? `${color}${alphaHex}` : color;\n}\n\nexport interface PickerHandle {\n cancel: () => void;\n promise: Promise<Element | null>;\n}\n\nexport function startPicker(opts: PickerOptions): PickerHandle {\n const { shadowRoot, onHover } = opts;\n const accent = opts.accent ?? DEFAULT_ACCENT;\n const accentFill = withAlpha(accent, '14');\n\n const outline = document.createElement('div');\n outline.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483646',\n `border: 2px solid ${accent}`,\n `background: ${accentFill}`,\n 'transition: all 60ms ease-out',\n 'box-sizing: border-box',\n 'border-radius: 2px',\n ].join('; ');\n document.body.appendChild(outline);\n\n const tooltip = document.createElement('div');\n tooltip.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483647',\n 'background: #0f172a',\n 'color: #fff',\n 'font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace',\n 'padding: 3px 6px',\n 'border-radius: 3px',\n 'max-width: 280px',\n 'overflow: hidden',\n 'text-overflow: ellipsis',\n 'white-space: nowrap',\n ].join('; ');\n document.body.appendChild(tooltip);\n\n const previousCursor = document.body.style.cursor;\n document.body.style.cursor = 'crosshair';\n\n let resolved = false;\n let resolvePromise: (v: Element | null) => void = () => {};\n const promise = new Promise<Element | null>((res) => { resolvePromise = res; });\n\n function isWidgetElement(el: EventTarget | null): boolean {\n if (!el || !(el instanceof Node)) return false;\n let node: Node | null = el;\n while (node) {\n if (node === shadowRoot || node === shadowRoot.host) return true;\n node = node.parentNode ?? (node as ShadowRoot).host ?? null;\n }\n return false;\n }\n\n // Custom elements (tag names containing a hyphen, per the HTML spec) are\n // self-contained UI units — the user wants to annotate the whole\n // `<wired-button>`, not the rough.js SVG path inside its private shadow\n // root. So we stop descending the moment we land on a custom element.\n function isCustomElement(el: Element): boolean {\n return el.tagName.includes('-');\n }\n\n function findTarget(x: number, y: number): Element | null {\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n const candidates = document.elementsFromPoint(x, y);\n outline.style.display = 'block';\n tooltip.style.display = 'block';\n for (const c of candidates) {\n if (isWidgetElement(c)) continue;\n // Descend into open shadow roots so we can hit elements inside deck's\n // WiredBlock (and any other host using attachShadow({mode:\"open\"})).\n // ShadowRoot.elementsFromPoint is supported in all modern browsers.\n let current: Element = c;\n let safety = 16;\n while (current.shadowRoot && !isCustomElement(current) && safety-- > 0) {\n const inner = (current.shadowRoot as unknown as { elementsFromPoint?: (x: number, y: number) => Element[] })\n .elementsFromPoint?.(x, y) ?? [];\n const next = inner.find((e) => !isWidgetElement(e) && e !== current);\n if (!next) break;\n current = next;\n }\n return current;\n }\n return null;\n }\n\n function positionOutline(el: Element) {\n const rect = el.getBoundingClientRect();\n outline.style.left = `${rect.left}px`;\n outline.style.top = `${rect.top}px`;\n outline.style.width = `${rect.width}px`;\n outline.style.height = `${rect.height}px`;\n const tag = el.tagName.toLowerCase();\n const cls = el.classList.length > 0 ? '.' + Array.from(el.classList).slice(0, 2).join('.') : '';\n tooltip.textContent = tag + cls;\n const above = rect.top - 22;\n tooltip.style.left = `${rect.left}px`;\n tooltip.style.top = `${above >= 0 ? above : rect.bottom + 4}px`;\n }\n\n function handleMove(e: MouseEvent) {\n const el = findTarget(e.clientX, e.clientY);\n if (el) {\n positionOutline(el);\n onHover?.(el);\n } else {\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n onHover?.(null);\n }\n }\n\n // pointerdown (not click) so Radix Select/Popover/Dialog don't open under us.\n function handlePointerDown(e: PointerEvent) {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n const el = findTarget(e.clientX, e.clientY);\n if (el) finish(el);\n }\n\n function swallow(e: Event) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n finish(null);\n }\n }\n\n function finish(el: Element | null) {\n if (resolved) return;\n resolved = true;\n document.removeEventListener('mousemove', handleMove, true);\n document.removeEventListener('pointerdown', handlePointerDown, true);\n document.removeEventListener('click', swallow, true);\n document.removeEventListener('mouseup', swallow, true);\n document.removeEventListener('keydown', handleKey, true);\n outline.remove();\n tooltip.remove();\n document.body.style.cursor = previousCursor;\n resolvePromise(el);\n }\n\n document.addEventListener('mousemove', handleMove, true);\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('click', swallow, true);\n document.addEventListener('mouseup', swallow, true);\n document.addEventListener('keydown', handleKey, true);\n\n return {\n cancel: () => finish(null),\n promise,\n };\n}\n","// Lazy-loaded screenshot capture via html-to-image. Captures the full\n// scrollable document (not just the visible viewport) as a JPEG data URL.\n//\n// Most apps using this beacon mount inside an `h-screen` shell with one or\n// more `overflow-y-auto` panels. A viewport-sized snapshot would clip both\n// the content that's scrolled off and any pinned element whose bounding box\n// extends past the fold. To get a true full-page screenshot we temporarily\n// disable overflow + height constraints on the scroll-container chain so the\n// document lays out at its natural full size, then snapshot the whole thing.\n//\n// Cross-origin images without CORS taint the canvas. Belt-and-suspenders:\n// swap cross-origin <img>.src to a transparent pixel before capture, restore after.\n\nlet htmlToImage: typeof import('html-to-image') | null = null;\n\nasync function load() {\n if (!htmlToImage) {\n htmlToImage = await import('html-to-image');\n }\n return htmlToImage;\n}\n\nexport interface ScreenshotOptions {\n quality?: number;\n pixelRatio?: number;\n excludeShadowRoot?: ShadowRoot;\n excludeHosts?: Element[];\n /** When true (default), captures the full scrollable document. Set false for viewport-only. */\n fullPage?: boolean;\n}\n\nexport interface ScreenshotResult {\n dataUrl: string;\n /** CSS-pixel width of the captured area. */\n width: number;\n /** CSS-pixel height of the captured area. */\n height: number;\n /** Device pixel ratio used during capture. */\n pixelRatio: number;\n /**\n * Releases the temporary layout patches applied for full-page capture.\n * MUST be called once any subsequent layout-dependent work (e.g. measuring\n * pin rects against the captured image via `drawMarkers`) is finished.\n * Safe to call multiple times.\n */\n dispose: () => void;\n}\n\nconst TRANSPARENT_PIXEL =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkAAIAAAoAAv/lxKUAAAAASUVORK5CYII=';\n\nfunction isUrlSafeForCanvas(rawUrl: string, crossOriginAttr?: string | null): boolean {\n if (!rawUrl) return true;\n if (rawUrl.startsWith('data:') || rawUrl.startsWith('blob:')) return true;\n if (rawUrl.startsWith('/') || rawUrl.startsWith('#')) return true;\n try {\n const u = new URL(rawUrl, window.location.href);\n if (u.origin === window.location.origin) return true;\n } catch {\n return false;\n }\n return crossOriginAttr === 'anonymous' || crossOriginAttr === 'use-credentials';\n}\n\nfunction neutralizeCrossOriginImages(): () => void {\n const stashedImg: Array<{ el: HTMLImageElement; src: string }> = [];\n const stashedSvg: Array<{ el: SVGImageElement; href: string | null; xlink: string | null }> = [];\n\n document.querySelectorAll('img').forEach((img) => {\n if (!isUrlSafeForCanvas(img.src, img.crossOrigin)) {\n stashedImg.push({ el: img, src: img.src });\n img.src = TRANSPARENT_PIXEL;\n }\n });\n\n document.querySelectorAll('image').forEach((img) => {\n const svgImg = img as unknown as SVGImageElement;\n const href = svgImg.getAttribute('href');\n const xlink = svgImg.getAttributeNS('http://www.w3.org/1999/xlink', 'href');\n const url = href || xlink || '';\n if (url && !isUrlSafeForCanvas(url)) {\n stashedSvg.push({ el: svgImg, href, xlink });\n if (href !== null) svgImg.setAttribute('href', TRANSPARENT_PIXEL);\n if (xlink !== null) svgImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', TRANSPARENT_PIXEL);\n }\n });\n\n return () => {\n for (const { el, src } of stashedImg) el.src = src;\n for (const { el, href, xlink } of stashedSvg) {\n if (href !== null) el.setAttribute('href', href);\n if (xlink !== null) el.setAttributeNS('http://www.w3.org/1999/xlink', 'href', xlink);\n }\n };\n}\n\n// Find every scroll container (`overflow-y|x: auto|scroll` with overflowing content)\n// and open it + its ancestor chain (overflow:visible, height:auto) so the document\n// lays out at full natural size. Snapshots scroll positions before patching and\n// restores them after. The browser implicitly clamps scrollTop to 0 while overflow\n// is visible, so no manual reset is needed.\nfunction expandLayoutForFullPage(): () => void {\n // 1. Find scroll containers (snapshot taken before any mutations).\n const scrollContainers: HTMLElement[] = [];\n document.querySelectorAll<HTMLElement>('*').forEach((el) => {\n const cs = getComputedStyle(el);\n const overflowingY =\n (cs.overflowY === 'auto' || cs.overflowY === 'scroll') && el.scrollHeight > el.clientHeight;\n const overflowingX =\n (cs.overflowX === 'auto' || cs.overflowX === 'scroll') && el.scrollWidth > el.clientWidth;\n if (overflowingY || overflowingX) scrollContainers.push(el);\n });\n\n // 2. Snapshot scroll positions BEFORE any DOM mutation (window + every container).\n // Reading after a patch would return a browser-clamped value, not the user's\n // real position — that's how the original fix lost scroll on restore.\n const savedWindowX = window.scrollX;\n const savedWindowY = window.scrollY;\n const savedContainerScrolls = scrollContainers.map((el) => ({\n el,\n scrollLeft: el.scrollLeft,\n scrollTop: el.scrollTop,\n }));\n\n // 3. Snapshot full inline cssText for every element we're about to patch (each\n // scroll container + its ancestor chain). Restoring cssText atomically is\n // simpler and more reliable than per-property removeProperty/setProperty.\n const touched = new Map<HTMLElement, string>();\n for (const el of scrollContainers) {\n let cur: HTMLElement | null = el;\n while (cur && cur !== document.documentElement.parentElement) {\n if (!touched.has(cur)) touched.set(cur, cur.style.cssText);\n cur = cur.parentElement;\n }\n }\n\n // 4. Apply style patches.\n for (const el of touched.keys()) {\n el.style.setProperty('overflow', 'visible', 'important');\n el.style.setProperty('overflow-x', 'visible', 'important');\n el.style.setProperty('overflow-y', 'visible', 'important');\n el.style.setProperty('max-height', 'none', 'important');\n el.style.setProperty('height', 'auto', 'important');\n el.style.setProperty('min-height', '0', 'important');\n }\n\n return () => {\n // Restore styles first — every container becomes a scroll container again\n // before we try to set its scroll position.\n for (const [el, cssText] of touched) {\n el.style.cssText = cssText;\n }\n // Then put every scroll back exactly where the user had it. Window last so\n // a focus/layout shift from the container restores doesn't override it.\n for (const { el, scrollLeft, scrollTop } of savedContainerScrolls) {\n el.scrollLeft = scrollLeft;\n el.scrollTop = scrollTop;\n }\n window.scrollTo(savedWindowX, savedWindowY);\n };\n}\n\n// Entry animations/transitions break the snapshot: when html-to-image clones the\n// node into an SVG <foreignObject>, any running CSS `animation` RESTARTS from\n// frame 0 on the clone. A common deck pattern — `@keyframes in { from{opacity:0} }`\n// on the visible screen — therefore renders at opacity:0 → a blank capture (the\n// non-animated sidebar still renders). Force every element to its static,\n// non-animated state for the duration of the capture so the clone reflects what\n// the user actually sees. Restored via the returned cleanup.\nfunction freezeAnimations(): () => void {\n const style = document.createElement('style');\n style.setAttribute('data-beacon-capture', '');\n style.textContent =\n '*,*::before,*::after{animation:none !important;transition:none !important;}';\n (document.head ?? document.documentElement).appendChild(style);\n return () => { style.remove(); };\n}\n\n// Serialize captures end-to-end. Two captures racing would corrupt the\n// layout-restore state: the second call's expandLayoutForFullPage() would read\n// the *patched* DOM (overflow:visible, height:auto, scroll=0) and save those as\n// \"original\", so its dispose() then re-applies the patched values and leaves\n// the page un-scrollable. The gate releases only after the caller invokes the\n// returned dispose(), so a follow-up capture cannot start mid-restore either.\nlet captureGate: Promise<void> = Promise.resolve();\n\nexport async function captureScreenshot(opts: ScreenshotOptions = {}): Promise<ScreenshotResult> {\n const priorGate = captureGate;\n let releaseGate!: () => void;\n captureGate = new Promise<void>((r) => { releaseGate = r; });\n\n try {\n await priorGate;\n return await doCaptureScreenshot(opts, releaseGate);\n } catch (err) {\n releaseGate();\n throw err;\n }\n}\n\nasync function doCaptureScreenshot(\n opts: ScreenshotOptions,\n releaseGate: () => void,\n): Promise<ScreenshotResult> {\n const {\n quality = 0.7,\n pixelRatio = Math.min(window.devicePixelRatio || 1, 2),\n excludeShadowRoot,\n excludeHosts,\n fullPage = true,\n } = opts;\n const lib = await load();\n\n // Skip the beacon's own custom-element hosts so the open <dialog> top layer\n // and the shadow-DOM trigger don't appear in the snapshot.\n const filter = (excludeShadowRoot || excludeHosts?.length)\n ? (node: Node) => {\n let cur: Node | null = node;\n while (cur) {\n if (excludeShadowRoot && cur === excludeShadowRoot.host) return false;\n if (excludeHosts && cur instanceof Element && excludeHosts.includes(cur)) return false;\n if (cur instanceof Element && cur.classList.contains('beacon-no-capture')) return false;\n cur = cur.parentNode;\n }\n return true;\n }\n : undefined;\n\n const restoreImages = neutralizeCrossOriginImages();\n const restoreLayout = fullPage ? expandLayoutForFullPage() : () => {};\n const restoreAnimations = freezeAnimations();\n let disposed = false;\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n try { restoreAnimations(); } finally {\n try { restoreLayout(); } finally {\n try { restoreImages(); } finally {\n releaseGate();\n }\n }\n }\n };\n\n try {\n if (fullPage) {\n // Let layout settle after overflow/height patches before measuring.\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n }\n\n const html = document.documentElement;\n const width = fullPage ? Math.max(html.scrollWidth, window.innerWidth) : window.innerWidth;\n const height = fullPage ? Math.max(html.scrollHeight, window.innerHeight) : window.innerHeight;\n\n const dataUrl = await lib.toJpeg(html, {\n quality,\n pixelRatio,\n cacheBust: true,\n ...(filter ? { filter } : {}),\n imagePlaceholder: TRANSPARENT_PIXEL,\n width,\n height,\n style: { transform: 'none' },\n });\n\n return { dataUrl, width, height, pixelRatio, dispose };\n } catch (err) {\n dispose();\n throw err;\n }\n}\n","// Tiny shared cache so the interactive annotate flow (domEle) and the submit-time\n// screenshot capture (domSS) can hand off an annotated screenshot without\n// round-tripping a multi-MB data URL through the payload's plugin entries.\n//\n// Set after domEle's pick loop completes (with all pin markers drawn onto the\n// snapshot). Read by domSS at capture time — reused verbatim if present, else\n// captured fresh.\n\nlet cached: { dataUrl: string; mime: 'image/jpeg' | 'image/png' } | null = null;\n\nexport function setAnnotationCache(entry: { dataUrl: string; mime: 'image/jpeg' | 'image/png' }): void {\n cached = entry;\n}\n\nexport function getAnnotationCache(): { dataUrl: string; mime: 'image/jpeg' | 'image/png' } | null {\n return cached;\n}\n\nexport function clearAnnotationCache(): void {\n cached = null;\n}\n","// domEle plugin — pin-annotation picker, ported from the old monolithic beacon.\n// Form panel renders an \"Annotate\" button that enters multi-pick mode:\n// • drawer closes (requestMode('pickElement'))\n// • dashed viewport border + hint pill paint\n// • loop: pick element → note popover → either Save, skip, or end\n// • on end, captures a screenshot + draws numbered markers + caches it\n// • drawer reopens with the pin list + preview <img>\n//\n// At submit time capture() returns { pins }. domSS reuses the cached screenshot\n// via beacon/internal/annotation-cache, so the user-visible preview is the\n// exact bytes that ship to the server.\n\nimport { captureElement, type ElementCapture } from '../internal/element-capture';\nimport { drawMarkers, type PinMarker } from '../internal/markers';\nimport { createPickModeOverlay } from '../internal/pick-mode-overlay';\nimport { showPinPopover } from '../internal/pin-popover';\nimport { startPicker } from '../internal/picker';\nimport { captureScreenshot } from '../internal/screenshot';\nimport { setAnnotationCache, clearAnnotationCache } from '../internal/annotation-cache';\nimport type { BeaconPlugin, BeaconCtx } from '../types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction iconTrash(): SVGElement {\n const s = document.createElementNS(SVG_NS, 'svg');\n s.setAttribute('viewBox', '0 0 24 24');\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '2');\n s.setAttribute('stroke-linecap', 'round');\n s.setAttribute('stroke-linejoin', 'round');\n s.setAttribute('aria-hidden', 'true');\n const paths = [\n 'M3 6h18',\n 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6',\n 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2',\n ];\n for (const d of paths) {\n const p = document.createElementNS(SVG_NS, 'path');\n p.setAttribute('d', d);\n s.appendChild(p);\n }\n return s;\n}\n\nexport interface Pin extends ElementCapture {\n number: number;\n note?: string;\n}\n\nexport interface DomEleOptions {\n /** Picker outline + marker color. Falls back to --beacon-accent. */\n accent?: string;\n /** Cap on pin count. Default 20 — mirrors the server-side schema. */\n maxPins?: number;\n}\n\nexport function domEle(opts: DomEleOptions = {}): BeaconPlugin {\n const maxPins = opts.maxPins ?? 20;\n let pins: Pin[] = [];\n let pinElements = new WeakMap<Pin, Element>();\n let cachedAnnotatedDataUrl: string | null = null;\n // Bumped on every regenerate request so stale in-flight captures drop their\n // result instead of overwriting the cache with an outdated marker set.\n let regenToken = 0;\n\n // Panel-scoped refs — reset each time form() is re-rendered.\n let headerEl: HTMLDivElement | null = null;\n let listEl: HTMLDivElement | null = null;\n let previewEl: HTMLImageElement | null = null;\n let btnEl: HTMLButtonElement | null = null;\n\n function reset(): void {\n pins = [];\n pinElements = new WeakMap();\n cachedAnnotatedDataUrl = null;\n regenToken += 1;\n clearAnnotationCache();\n renderList();\n renderPreview();\n }\n\n function findShadowRoot(): ShadowRoot | null {\n const host = document.querySelector('launch-kit-beacon');\n return host?.shadowRoot ?? null;\n }\n\n function resolveAccent(): string {\n if (typeof window === 'undefined') return opts.accent ?? '#0ea5e9';\n if (opts.accent) return opts.accent;\n const host = document.querySelector('launch-kit-beacon');\n if (!host) return '#0ea5e9';\n const v = getComputedStyle(host).getPropertyValue('--beacon-accent').trim();\n return v || '#0ea5e9';\n }\n\n async function enterAnnotateMode(ctx: BeaconCtx): Promise<void> {\n const shadowRoot = findShadowRoot();\n if (!shadowRoot) return;\n const accent = resolveAccent();\n\n const release = await ctx.requestMode('pickElement');\n const overlay = createPickModeOverlay({ accent });\n\n // Restore markers for already-pinned elements so the user can see what\n // they've already pinned while picking the next one.\n for (const pin of pins) {\n const target = pinElements.get(pin);\n if (target) {\n overlay.addPin(pin.number, {\n target,\n selector: pin.selector,\n fallbackRect: pin.boundingRect,\n });\n }\n }\n\n try {\n let keepPicking = true;\n while (keepPicking) {\n if (pins.length >= maxPins) break;\n const handle = startPicker({ shadowRoot, accent });\n const el = await handle.promise;\n if (!el) break; // Escape ends annotation\n\n const rect = el.getBoundingClientRect();\n const popover = await showPinPopover({\n anchor: { x: rect.left, y: rect.bottom },\n pinNumber: pins.length + 1,\n });\n // 'all' (Escape inside popover) ends annotation;\n // 'pin' (cross icon) drops this candidate and re-enters pick mode.\n if (popover.cancelled === 'all') { keepPicking = false; break; }\n if (popover.cancelled === 'pin') continue;\n\n const captured = captureElement(el);\n const pin: Pin = {\n number: pins.length + 1,\n ...captured,\n ...(popover.note ? { note: popover.note } : {}),\n };\n pins.push(pin);\n pinElements.set(pin, el);\n overlay.addPin(pin.number, {\n target: el,\n selector: captured.selector,\n fallbackRect: captured.boundingRect,\n });\n }\n\n // After picks: capture a fresh screenshot, draw markers, cache it for\n // both the in-drawer preview AND the submit-time payload.\n if (pins.length > 0) {\n overlay.setLoading('Capturing screenshot…');\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n await regenerateScreenshot();\n } else {\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n }\n } finally {\n overlay.destroy();\n release();\n }\n\n renderList();\n renderPreview();\n }\n\n // Re-capture the page and redraw all current pin markers into the cache.\n // Called both at the end of an annotate session and after a pin is deleted\n // while others remain — so the in-drawer preview AND the submit-time payload\n // always reflect the current pin set.\n async function regenerateScreenshot(): Promise<void> {\n const myToken = ++regenToken;\n if (pins.length === 0) {\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n renderPreview();\n return;\n }\n const accent = resolveAccent();\n try {\n const beaconHosts = Array.from(document.querySelectorAll('launch-kit-beacon')) as Element[];\n const shot = await captureScreenshot({ excludeHosts: beaconHosts });\n try {\n if (myToken !== regenToken) return;\n const markers: PinMarker[] = pins.map((p) => ({\n number: p.number,\n selector: p.selector,\n boundingRect: p.boundingRect,\n ...(pinElements.get(p) ? { liveElement: pinElements.get(p)! } : {}),\n }));\n const viewport = { w: shot.width, h: shot.height, dpr: shot.pixelRatio };\n const annotated = await drawMarkers(shot.dataUrl, markers, viewport, accent);\n if (myToken !== regenToken) return;\n cachedAnnotatedDataUrl = annotated;\n setAnnotationCache({ dataUrl: annotated, mime: 'image/jpeg' });\n } finally {\n shot.dispose();\n }\n } catch {\n // Screenshot failure is non-fatal — pins still post.\n if (myToken !== regenToken) return;\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n }\n if (myToken === regenToken) renderPreview();\n }\n\n function deletePin(n: number) {\n const idx = pins.findIndex((p) => p.number === n);\n if (idx === -1) return;\n pins.splice(idx, 1);\n pins.forEach((p, i) => { p.number = i + 1; });\n // Cached screenshot has the deleted marker baked in — invalidate, then\n // re-capture if any pins remain. Without this, the user sees the preview\n // vanish and `domSS`'s submit-time fallback ships an un-marked screenshot\n // (the captured `domEle` entry isn't visible to other plugins mid-submit).\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n renderList();\n renderPreview();\n void regenerateScreenshot();\n }\n\n function renderList() {\n if (headerEl) {\n headerEl.textContent = `Pins (${pins.length})`;\n headerEl.style.display = pins.length === 0 ? 'none' : '';\n }\n if (btnEl) {\n btnEl.textContent = pins.length === 0 ? 'Annotate elements' : 'Add another pin';\n }\n if (!listEl) return;\n listEl.innerHTML = '';\n listEl.style.display = pins.length === 0 ? 'none' : '';\n for (const pin of pins) {\n const row = document.createElement('div');\n row.className = 'beacon-pin-item';\n row.dataset.pin = String(pin.number);\n\n const num = document.createElement('span');\n num.className = 'beacon-pin-num';\n num.textContent = String(pin.number);\n\n const meta = document.createElement('div');\n meta.className = 'beacon-pin-meta';\n const sel = document.createElement('div');\n sel.className = 'beacon-pin-selector';\n sel.title = pin.selector;\n sel.textContent = pin.selector || pin.tagName;\n const noteInput = document.createElement('input');\n noteInput.type = 'text';\n noteInput.className = 'beacon-pin-note-input';\n noteInput.placeholder = 'Add a note (optional)';\n noteInput.value = pin.note ?? '';\n noteInput.addEventListener('input', () => {\n if (noteInput.value.trim()) pin.note = noteInput.value;\n else delete pin.note;\n });\n meta.appendChild(sel);\n meta.appendChild(noteInput);\n\n const del = document.createElement('button');\n del.type = 'button';\n del.className = 'beacon-icon-btn';\n del.setAttribute('aria-label', `Remove pin ${pin.number}`);\n del.appendChild(iconTrash());\n del.addEventListener('click', () => deletePin(pin.number));\n\n row.appendChild(num);\n row.appendChild(meta);\n row.appendChild(del);\n listEl.appendChild(row);\n }\n }\n\n function renderPreview() {\n if (!previewEl) return;\n if (cachedAnnotatedDataUrl) {\n previewEl.src = cachedAnnotatedDataUrl;\n previewEl.style.display = 'block';\n } else {\n previewEl.removeAttribute('src');\n previewEl.style.display = 'none';\n }\n }\n\n return {\n name: 'domEle',\n setupOnce(ctx) {\n // Reset interactive state when the drawer closes so a fresh open() starts\n // empty. Without this, pins from a previous session linger in the closure.\n const off = ctx.on('close', () => reset());\n return off;\n },\n form(ctx) {\n return {\n render: (slot) => {\n // \"Pins (N)\" header — only painted when there's at least one pin.\n headerEl = document.createElement('div');\n headerEl.className = 'beacon-pin-list-header';\n slot.appendChild(headerEl);\n\n // Pin list.\n listEl = document.createElement('div');\n listEl.className = 'beacon-pin-list';\n slot.appendChild(listEl);\n\n // Annotate / Add another pin button.\n btnEl = document.createElement('button');\n btnEl.type = 'button';\n btnEl.className = 'beacon-btn secondary beacon-pin-annotate';\n btnEl.addEventListener('click', () => { void enterAnnotateMode(ctx); });\n slot.appendChild(btnEl);\n\n // Preview <img>.\n previewEl = document.createElement('img');\n previewEl.className = 'beacon-thumb';\n previewEl.alt = 'Annotated screenshot preview';\n previewEl.style.display = 'none';\n slot.appendChild(previewEl);\n\n renderList();\n renderPreview();\n return () => { headerEl = null; listEl = null; previewEl = null; btnEl = null; };\n },\n };\n },\n capture() {\n if (pins.length === 0) return null;\n return { pins };\n },\n };\n}\n","// Public types for the launch-kit beacon. Exposed via @launchsecure/launch-kit/beacon.\n\nexport type Severity = 'bug' | 'idea' | 'ux' | 'a11y';\n\nexport type Position = 'bottom-right' | 'bottom-left' | 'hidden';\nexport type Theme = 'auto' | 'light' | 'dark';\n\nexport type HeadersConfig =\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n\nexport type ContextConfig = () => Record<string, unknown>;\n\n// ── Payload (§6) ──────────────────────────────────────────\n\nexport interface PayloadMetadata {\n url: string;\n referrer?: string;\n userAgent: string;\n viewport: { w: number; h: number; dpr: number };\n screen: { w: number; h: number };\n timezone: string;\n locale: string;\n theme?: 'light' | 'dark';\n capturedAt: string;\n}\n\nexport interface PluginSuccessEntry {\n v: number;\n [k: string]: unknown;\n}\n\nexport interface PluginFailureEntry {\n error: string;\n stack?: string;\n}\n\nexport type PluginEntry = PluginSuccessEntry | PluginFailureEntry;\n\nexport interface FeedbackPayload {\n description: string;\n severity: Severity;\n metadata: PayloadMetadata;\n context?: Record<string, unknown>;\n plugins: Record<string, PluginEntry>;\n}\n\nexport function isPluginFailure(entry: PluginEntry | undefined): entry is PluginFailureEntry {\n return !!entry && typeof entry === 'object' && !('v' in entry) && 'error' in entry;\n}\n\n// ── Labels (i18n via init({ labels })) ──────────────────────────────────────────\n\nexport interface LabelMap {\n triggerButton: string;\n drawerTitle: string;\n closeButton: string;\n send: string;\n sending: string;\n sentSuccess: string;\n descriptionLabel: string;\n descriptionPlaceholder: string;\n severityLabel: string;\n severityBug: string;\n severityIdea: string;\n severityUx: string;\n severityA11y: string;\n}\n\n// ── Form fields (§4.2) ──────────────────────────────────────────\n\nexport interface BaseField<K extends string> {\n type: K;\n /** Per-plugin key in ctx.formValues. */\n name: string;\n label?: string;\n description?: string;\n}\n\nexport interface ToggleField extends BaseField<'toggle'> { defaultValue?: boolean }\nexport interface TextField extends BaseField<'text'> { defaultValue?: string; placeholder?: string }\nexport interface TextareaField extends BaseField<'textarea'> { defaultValue?: string; placeholder?: string; rows?: number }\nexport interface SelectField extends BaseField<'select'> { defaultValue?: string; options: Array<{ value: string; label?: string }> }\nexport interface RadioField extends BaseField<'radio'> { defaultValue?: string; options: Array<{ value: string; label?: string }> }\nexport interface NumberField extends BaseField<'number'> { defaultValue?: number; min?: number; max?: number; step?: number }\n\nexport type FormField =\n | ToggleField\n | TextField\n | TextareaField\n | SelectField\n | RadioField\n | NumberField;\n\nexport type DeclarativeForm = { title?: string; fields: FormField[] };\nexport type ImperativeForm = { title?: string; render: (slot: HTMLElement, ctx: BeaconCtx) => void | (() => void) };\n\n// ── Ctx (§5) ──────────────────────────────────────────\n\nexport type Mode = 'minimize' | 'hide' | 'pickElement';\n\nexport interface BeaconLifecycleEvent {\n payload?: FeedbackPayload;\n response?: TransportResponse;\n cancel?: (reason: string) => void;\n}\n\nexport interface BeaconCtx {\n readonly pluginName: string;\n captured(name: string): PluginEntry | undefined;\n readonly formValues: Record<string, unknown>;\n requestMode(mode: Mode): Promise<() => void>;\n overlay(opts: { render: (slot: HTMLElement) => void | (() => void) }): () => void;\n on(\n ev: 'open' | 'close' | 'beforeSubmit' | 'afterSubmit',\n handler: (e: BeaconLifecycleEvent) => void,\n ): () => void;\n readonly signal: AbortSignal;\n captureSignal(): AbortSignal | undefined;\n}\n\n// ── Plugins (§4) ──────────────────────────────────────────\n\nexport interface BeaconPlugin {\n name: string;\n version?: number;\n setupOnce?(ctx: BeaconCtx): void | (() => void);\n form?(ctx: BeaconCtx): DeclarativeForm | ImperativeForm;\n capture?(ctx: BeaconCtx): unknown | Promise<unknown>;\n}\n\n// ── Init / system events (§3, §10) ──────────────────────────────────────────\n\nexport interface InitOptions {\n endpoint: string;\n headers?: HeadersConfig;\n context?: ContextConfig;\n /** fetch credentials mode. Default 'omit' per §9 (safe for cross-origin\n * consumers); same-origin apps that gate the endpoint behind cookie auth\n * should pass 'same-origin'. */\n credentials?: RequestCredentials;\n plugins?: BeaconPlugin[];\n defaultPlugins?: boolean;\n position?: Position;\n theme?: Theme;\n labels?: Partial<LabelMap>;\n debug?: boolean;\n healthIndicator?: 'never' | 'dev' | 'always';\n}\n\nexport interface PluginStatus {\n state: 'active' | 'failed';\n failures: number;\n error?: { message: string; stack?: string; at: 'setupOnce' | 'capture' | 'form' };\n}\n\nexport interface BeaconStatus {\n ready: boolean;\n transport: 'ok' | 'error' | 'idle';\n plugins: Record<string, PluginStatus>;\n}\n\nexport type SystemEvent = 'plugin:error' | 'submit:success' | 'submit:error' | 'ready';\n\nexport interface PluginErrorEvent { plugin: string; error: Error; at: 'setupOnce' | 'capture' | 'form' }\nexport interface SubmitSuccessEvent { payload: FeedbackPayload; response: TransportResponse }\nexport interface SubmitErrorEvent { payload: FeedbackPayload; error: Error }\nexport interface ReadyEvent { ready: true }\n\nexport type SystemEventPayload<E extends SystemEvent> =\n E extends 'plugin:error' ? PluginErrorEvent :\n E extends 'submit:success' ? SubmitSuccessEvent :\n E extends 'submit:error' ? SubmitErrorEvent :\n E extends 'ready' ? ReadyEvent :\n never;\n\n// ── Transport ──────────────────────────────────────────\n\nexport interface TransportResponse {\n ok: boolean;\n status: number;\n body: unknown;\n}\n","// domSS plugin — viewport screenshot. Composes with domEle in two ways:\n// 1. If domEle's interactive annotate flow already drew an annotated\n// screenshot, we reuse that exact buffer (so the user-visible preview\n// matches what the server receives, byte-for-byte).\n// 2. Otherwise (pins-less submit, or annotate session never ran), capture\n// a fresh screenshot at submit time using `requestMode('hide')` to keep\n// the dialog chrome out of the snapshot.\n\nimport { drawMarkers, type PinMarker } from '../internal/markers';\nimport { captureScreenshot } from '../internal/screenshot';\nimport { getAnnotationCache } from '../internal/annotation-cache';\nimport type { BeaconPlugin, PluginEntry } from '../types';\nimport { isPluginFailure } from '../types';\n\nexport interface DomSSOptions {\n quality?: number;\n pixelRatio?: number;\n accent?: string;\n}\n\nexport function domSS(opts: DomSSOptions = {}): BeaconPlugin {\n return {\n name: 'domSS',\n async capture(ctx) {\n // Fast path: reuse the cached annotated screenshot if domEle already\n // produced one during the interactive annotate session.\n const cached = getAnnotationCache();\n if (cached) {\n return { dataUrl: cached.dataUrl, mime: cached.mime };\n }\n\n const release = await ctx.requestMode('hide');\n try {\n // Yield one frame so the dialog-hide actually paints before\n // html-to-image walks the DOM — otherwise the open dialog can briefly\n // render into the snapshot.\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n const beaconHosts = Array.from(document.querySelectorAll('launch-kit-beacon')) as Element[];\n const shot = await captureScreenshot({\n quality: opts.quality,\n pixelRatio: opts.pixelRatio,\n excludeHosts: beaconHosts,\n });\n\n try {\n // If domEle has pins but didn't pre-cache (rare — error during pre-capture),\n // draw markers on the fresh screenshot.\n const domEleEntry = ctx.captured('domEle');\n const pins = readPinsFromEntry(domEleEntry);\n const viewport = { w: shot.width, h: shot.height, dpr: shot.pixelRatio };\n const accent = opts.accent ?? readAccent();\n const final = pins.length > 0\n ? await drawMarkers(shot.dataUrl, pins, viewport, accent)\n : shot.dataUrl;\n\n return { dataUrl: final, mime: 'image/jpeg' };\n } finally {\n shot.dispose();\n }\n } finally {\n release();\n }\n },\n };\n}\n\nfunction readPinsFromEntry(entry: PluginEntry | undefined): PinMarker[] {\n if (!entry || isPluginFailure(entry)) return [];\n const pinsRaw = (entry as { pins?: unknown }).pins;\n if (!Array.isArray(pinsRaw)) return [];\n return pinsRaw\n .filter((p): p is Record<string, unknown> => !!p && typeof p === 'object')\n .map((p) => ({\n number: Number(p.number) || 0,\n selector: typeof p.selector === 'string' ? p.selector : undefined,\n boundingRect: (p.boundingRect as PinMarker['boundingRect']) ?? { x: 0, y: 0, w: 0, h: 0 },\n }));\n}\n\nfunction readAccent(): string {\n if (typeof window === 'undefined') return '#0ea5e9';\n const host = document.querySelector('launch-kit-beacon');\n if (!host) return '#0ea5e9';\n const v = getComputedStyle(host).getPropertyValue('--beacon-accent').trim();\n return v || '#0ea5e9';\n}\n","// Body-portal overlay shown while a monitor session is recording. Two parts:\n// 1. Full-viewport dashed frame with soft inset glow — ambient \"you are being\n// recorded\" signal that survives drawer close.\n// 2. Draggable chip with REC dot, elapsed timer, URL, and Stop button.\n//\n// Body-portal (not the beacon Shadow DOM overlay layer) for the same reason as\n// pick-mode-overlay: position:fixed children of transformed/filtered/contained\n// ancestors get anchored to that ancestor instead of the viewport. The shadow\n// root sits inside the host's layout tree; the body does not.\n//\n// Styles ship via beaconStyles which ensureBeaconBodyStyles() injects into\n// document.head — see styles.ts for the class definitions.\n\nconst NO_CAPTURE_CLASS = 'beacon-no-capture';\nconst POS_STORAGE_KEY = '__lsBeaconMonitorChipPos';\nconst DEFAULT_ACCENT = '#10b981';\n\nexport interface MonitorOverlayOptions {\n /** Frame + chip accent. Falls back to emerald (--beacon-monitor-accent default). */\n accent?: string;\n /** Called when the chip's Stop button is clicked. Owner wires to session.stop(). */\n onStop: () => void;\n /** ms-epoch start time for the elapsed timer. Defaults to Date.now() at create. */\n startedAt?: number;\n /** Initial URL to show in the chip's secondary line. */\n url?: string | null;\n}\n\nexport interface MonitorOverlay {\n updateUrl(url: string | null): void;\n destroy(): void;\n}\n\nexport function createMonitorOverlay(opts: MonitorOverlayOptions): MonitorOverlay {\n const accent = opts.accent ?? DEFAULT_ACCENT;\n const startedAt = opts.startedAt ?? Date.now();\n\n // ── Frame ─────────────────────────────────────────────────────────────\n const frame = document.createElement('div');\n frame.className = `${NO_CAPTURE_CLASS} beacon-monitor-overlay-frame`;\n frame.setAttribute('aria-hidden', 'true');\n frame.style.setProperty('--beacon-monitor-accent', accent);\n document.body.appendChild(frame);\n\n // ── Chip ──────────────────────────────────────────────────────────────\n const chip = document.createElement('div');\n chip.className = `${NO_CAPTURE_CLASS} beacon-monitor-overlay-chip`;\n chip.setAttribute('role', 'status');\n chip.setAttribute('aria-label', 'Recording — drag to move');\n chip.style.setProperty('--beacon-monitor-accent', accent);\n\n const row = document.createElement('div');\n row.className = 'beacon-monitor-overlay-chip-row';\n\n const recDot = document.createElement('span');\n recDot.className = 'beacon-monitor-overlay-rec-dot';\n recDot.setAttribute('aria-hidden', 'true');\n\n const recLabel = document.createElement('span');\n recLabel.className = 'beacon-monitor-overlay-rec-label';\n recLabel.textContent = 'REC';\n\n const sep = document.createElement('span');\n sep.className = 'beacon-monitor-overlay-sep';\n sep.setAttribute('aria-hidden', 'true');\n sep.textContent = '·';\n\n const timer = document.createElement('span');\n timer.className = 'beacon-monitor-overlay-timer';\n timer.textContent = '00:00';\n\n const stopBtn = document.createElement('button');\n stopBtn.type = 'button';\n stopBtn.className = 'beacon-monitor-overlay-stop';\n stopBtn.textContent = 'Stop';\n stopBtn.setAttribute('aria-label', 'Stop monitoring');\n\n row.appendChild(recDot);\n row.appendChild(recLabel);\n row.appendChild(sep);\n row.appendChild(timer);\n row.appendChild(stopBtn);\n chip.appendChild(row);\n\n const urlEl = document.createElement('div');\n urlEl.className = 'beacon-monitor-overlay-url';\n if (opts.url) {\n urlEl.textContent = opts.url;\n urlEl.title = opts.url;\n } else {\n urlEl.style.display = 'none';\n }\n chip.appendChild(urlEl);\n\n document.body.appendChild(chip);\n\n // ── Position ──────────────────────────────────────────────────────────\n // Read AFTER appending so getBoundingClientRect() returns real dimensions\n // for the clamp.\n const initial = readSavedPos() ?? defaultPos();\n applyPos(clamp(initial));\n\n function readSavedPos(): { x: number; y: number } | null {\n try {\n const raw = localStorage.getItem(POS_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { x?: unknown; y?: unknown };\n const x = typeof parsed.x === 'number' ? parsed.x : NaN;\n const y = typeof parsed.y === 'number' ? parsed.y : NaN;\n if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n return { x, y };\n } catch {\n return null;\n }\n }\n\n function defaultPos(): { x: number; y: number } {\n const rect = chip.getBoundingClientRect();\n const w = rect.width || 200;\n return { x: Math.max(8, Math.floor((window.innerWidth - w) / 2)), y: 16 };\n }\n\n function clamp(pos: { x: number; y: number }): { x: number; y: number } {\n const margin = 8;\n const rect = chip.getBoundingClientRect();\n const w = rect.width || 200;\n const h = rect.height || 40;\n const maxX = Math.max(margin, window.innerWidth - w - margin);\n const maxY = Math.max(margin, window.innerHeight - h - margin);\n return {\n x: Math.min(Math.max(margin, pos.x), maxX),\n y: Math.min(Math.max(margin, pos.y), maxY),\n };\n }\n\n function applyPos(pos: { x: number; y: number }): void {\n chip.style.left = `${pos.x}px`;\n chip.style.top = `${pos.y}px`;\n }\n\n // ── Drag ──────────────────────────────────────────────────────────────\n let dragging = false;\n let activePointerId: number | null = null;\n let grabOffset = { x: 0, y: 0 };\n\n function onPointerDown(e: PointerEvent): void {\n // Skip the Stop button so its click reaches its own listener.\n if (e.target instanceof Element && e.target.closest('.beacon-monitor-overlay-stop')) return;\n e.preventDefault();\n dragging = true;\n activePointerId = e.pointerId;\n try { chip.setPointerCapture(e.pointerId); } catch { /* swallow */ }\n chip.setAttribute('data-dragging', 'true');\n const rect = chip.getBoundingClientRect();\n grabOffset = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }\n\n function onPointerMove(e: PointerEvent): void {\n if (!dragging || e.pointerId !== activePointerId) return;\n applyPos(clamp({ x: e.clientX - grabOffset.x, y: e.clientY - grabOffset.y }));\n }\n\n function endDrag(e: PointerEvent): void {\n if (!dragging || e.pointerId !== activePointerId) return;\n dragging = false;\n activePointerId = null;\n chip.removeAttribute('data-dragging');\n try { chip.releasePointerCapture(e.pointerId); } catch { /* swallow */ }\n // Persist on release only — saving on every pointermove would hammer storage.\n const rect = chip.getBoundingClientRect();\n try {\n localStorage.setItem(POS_STORAGE_KEY, JSON.stringify({ x: rect.left, y: rect.top }));\n } catch {\n /* swallow — storage disabled (Safari private mode) */\n }\n }\n\n chip.addEventListener('pointerdown', onPointerDown);\n chip.addEventListener('pointermove', onPointerMove);\n chip.addEventListener('pointerup', endDrag);\n chip.addEventListener('pointercancel', endDrag);\n\n // Stop button — attached AFTER drag handlers so the closest('.stop') check in\n // onPointerDown short-circuits before this fires.\n stopBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n opts.onStop();\n });\n\n // ── Reposition on viewport resize ─────────────────────────────────────\n function onResize(): void {\n const rect = chip.getBoundingClientRect();\n applyPos(clamp({ x: rect.left, y: rect.top }));\n }\n window.addEventListener('resize', onResize);\n\n // ── Timer ─────────────────────────────────────────────────────────────\n function tick(): void {\n const elapsed = Math.max(0, Math.floor((Date.now() - startedAt) / 1000));\n timer.textContent = formatElapsed(elapsed);\n }\n tick();\n const timerId = window.setInterval(tick, 1000);\n\n return {\n updateUrl(url) {\n if (url) {\n urlEl.textContent = url;\n urlEl.title = url;\n urlEl.style.display = '';\n } else {\n urlEl.style.display = 'none';\n }\n },\n destroy() {\n window.clearInterval(timerId);\n window.removeEventListener('resize', onResize);\n chip.removeEventListener('pointerdown', onPointerDown);\n chip.removeEventListener('pointermove', onPointerMove);\n chip.removeEventListener('pointerup', endDrag);\n chip.removeEventListener('pointercancel', endDrag);\n frame.remove();\n chip.remove();\n },\n };\n}\n\nfunction formatElapsed(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n if (h > 0) return `${pad(h)}:${pad(m)}:${pad(s)}`;\n return `${pad(m)}:${pad(s)}`;\n}\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n","// DOM-level capture for monitor mode: clicks, route changes, dialog mounts.\n//\n// Click capture is the differentiating signal. The recurring shape we debug is\n// \"user clicked X, nothing happened (or the wrong thing happened).\" A bare\n// click event tells you the target, but the *interesting* info is usually\n// further up: overlays sitting at the click coords, body pointer-events\n// disabled, open Radix dialogs intercepting via DismissableLayer. We snapshot\n// all of that on every click.\n//\n// We listen capture-phase + passive so we see the event even if a downstream\n// handler calls stopPropagation(); we never preventDefault — capture is\n// observational.\n\nimport type {\n MonitorClickEvent,\n MonitorClickTarget,\n MonitorDialogEvent,\n MonitorOverlayInfo,\n MonitorRouteEvent,\n MonitorSubmitEvent,\n MonitorSubmitField,\n} from './wire';\n\ntype Emit<E> = (event: Omit<E, 'ts' | 'sessionId' | 'seq'>) => void;\n\nexport interface DomCaptureCallbacks {\n emitClick: Emit<MonitorClickEvent>;\n emitRoute: Emit<MonitorRouteEvent>;\n emitDialog: Emit<MonitorDialogEvent>;\n emitSubmit: Emit<MonitorSubmitEvent>;\n}\n\nconst TEXT_LIMIT = 80;\nconst INTERACTIVE_SELECTOR = 'button, a, input[type=\"submit\"], input[type=\"button\"], [role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [role=\"option\"]';\n\nexport interface DomCaptureInstallation {\n uninstall(): void;\n}\n\nconst HTML_LIMIT = 1024;\nconst MAX_OVERLAYS = 5;\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) : s;\n}\n\n/**\n * Build a stable CSS selector for an element. Prefer #id, then tag.class.class,\n * walking up at most 5 levels. Not guaranteed unique but good enough for\n * \"the developer looking at the stream can find this element.\"\n */\nfunction buildSelector(el: Element): string {\n if (el.id) return `#${CSS.escape(el.id)}`;\n const parts: string[] = [];\n let cur: Element | null = el;\n for (let i = 0; i < 5 && cur; i++) {\n const tag = cur.tagName.toLowerCase();\n const id = cur.id ? `#${CSS.escape(cur.id)}` : '';\n const cls = cur.classList.length > 0\n ? '.' + Array.from(cur.classList).slice(0, 3).map(CSS.escape).join('.')\n : '';\n parts.unshift(`${tag}${id}${cls}`);\n if (id) break; // id is unique-enough; stop walking\n cur = cur.parentElement;\n }\n return parts.join(' > ');\n}\n\nfunction truncText(s: string | null | undefined, n: number): string | undefined {\n if (!s) return undefined;\n const trimmed = s.replace(/\\s+/g, ' ').trim();\n if (!trimmed) return undefined;\n return trimmed.length > n ? trimmed.slice(0, n) : trimmed;\n}\n\nfunction describeTarget(el: Element): MonitorClickTarget {\n const text = truncText(el.textContent, TEXT_LIMIT);\n const ariaLabel = truncText(el.getAttribute('aria-label'), TEXT_LIMIT);\n const testid = el.getAttribute('data-testid') || undefined;\n const name = el.getAttribute('name') || undefined;\n\n // Derived human label — pick the most informative thing we can find.\n // Falls back to the nearest interactive ancestor when the literal target\n // (e.g. an <svg> inside a <button>) has nothing useful on it directly.\n let label: string | undefined = ariaLabel || text;\n if (!label) {\n const ancestor = el.closest(INTERACTIVE_SELECTOR);\n if (ancestor && ancestor !== el) {\n label = truncText(ancestor.getAttribute('aria-label'), TEXT_LIMIT)\n || truncText(ancestor.textContent, TEXT_LIMIT);\n }\n }\n\n return {\n tag: el.tagName.toLowerCase(),\n id: el.id || null,\n classes: Array.from(el.classList).slice(0, 10),\n role: el.getAttribute('role'),\n selector: buildSelector(el),\n ...(text ? { text } : {}),\n ...(ariaLabel ? { ariaLabel } : {}),\n ...(testid ? { testid } : {}),\n ...(name ? { name } : {}),\n // Only include label when it adds something beyond `text` (avoids dup).\n ...(label && label !== text ? { label } : {}),\n };\n}\n\n/**\n * Snapshot the overlay stack at a point. Walks all fixed/sticky candidates and\n * keeps those covering the click. Returns the top N by z-index.\n *\n * querySelectorAll('body *') is expensive on large DOMs (10k+ nodes); we only\n * do this while monitor is on, and only on click. The cost is acceptable\n * because the whole point of monitor is to debug click-through bugs.\n */\nfunction overlaysAtPoint(x: number, y: number): MonitorOverlayInfo[] {\n const candidates: MonitorOverlayInfo[] = [];\n const all = document.querySelectorAll<HTMLElement>('body *');\n for (const el of Array.from(all)) {\n const cs = getComputedStyle(el);\n if (cs.position !== 'fixed' && cs.position !== 'sticky') continue;\n const rect = el.getBoundingClientRect();\n if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) continue;\n const z = parseInt(cs.zIndex, 10);\n if (!Number.isFinite(z) && cs.zIndex !== 'auto') continue;\n candidates.push({\n tag: el.tagName.toLowerCase(),\n zIndex: Number.isFinite(z) ? z : 0,\n pointerEvents: cs.pointerEvents,\n classes: Array.from(el.classList).slice(0, 5).join(' '),\n });\n }\n return candidates\n .sort((a, b) => b.zIndex - a.zIndex)\n .slice(0, MAX_OVERLAYS);\n}\n\n/**\n * Click + mousedown capture. Both kinds fire because they expose different\n * things — mousedown is what Radix DismissableLayer listens to for\n * outside-click dismissal; click is what navigation hangs off of.\n */\nfunction installClickCapture(cb: DomCaptureCallbacks): () => void {\n const handle = (kind: 'click' | 'mousedown') => (e: Event): void => {\n const me = e as MouseEvent;\n const target = me.target;\n if (!(target instanceof Element)) return;\n\n const x = me.clientX;\n const y = me.clientY;\n // elementFromPoint may differ from target if an overlay sits above —\n // that mismatch is itself diagnostic (\"the element you wanted is being\n // occluded by X\"). Compare and surface.\n const hit = document.elementFromPoint(x, y);\n const hitMatches = hit === target || (hit ? target.contains(hit) || hit.contains(target) : false);\n\n const openDialogs = document.querySelectorAll('[role=\"dialog\"][data-state=\"open\"]').length;\n const bodyPe = getComputedStyle(document.body).pointerEvents;\n // overlaysAtPoint walks every fixed/sticky element under <body> + calls\n // getComputedStyle on each — measurable cost on 5k+ DOMs. Only run it when\n // the click was intercepted, since that's the only case where the overlay\n // stack is the diagnostic answer. Happy-path clicks skip the walk entirely.\n const overlays = hitMatches ? [] : overlaysAtPoint(x, y);\n\n cb.emitClick({\n kind,\n target: describeTarget(target),\n hitMatchesTarget: hitMatches,\n ...(!hitMatches && hit instanceof Element ? { hitTarget: describeTarget(hit) } : {}),\n coords: { x, y },\n openDialogs,\n bodyPointerEvents: bodyPe,\n ...(overlays.length > 0 ? { overlaysAtPoint: overlays } : {}),\n });\n };\n\n const onClick = handle('click');\n const onMouseDown = handle('mousedown');\n // Capture-phase + passive — see the event even when a downstream handler\n // calls stopPropagation/stopImmediatePropagation.\n document.addEventListener('click', onClick, { capture: true, passive: true });\n document.addEventListener('mousedown', onMouseDown, { capture: true, passive: true });\n\n return () => {\n document.removeEventListener('click', onClick, { capture: true });\n document.removeEventListener('mousedown', onMouseDown, { capture: true });\n };\n}\n\n/**\n * SPA route capture. pushState/replaceState don't fire any event; we\n * monkey-patch to emit. popstate + hashchange are real events.\n */\nfunction installRouteCapture(cb: DomCaptureCallbacks): () => void {\n const originalPush = history.pushState;\n const originalReplace = history.replaceState;\n let lastUrl = window.location.href;\n\n const emit = (via: MonitorRouteEvent['via']): void => {\n const to = window.location.href;\n if (to === lastUrl) return;\n const from = lastUrl;\n lastUrl = to;\n cb.emitRoute({ kind: 'route', from, to, via });\n };\n\n history.pushState = function patchedPushState(...args: Parameters<typeof history.pushState>) {\n const ret = originalPush.apply(this, args);\n emit('pushState');\n return ret;\n };\n history.replaceState = function patchedReplaceState(...args: Parameters<typeof history.replaceState>) {\n const ret = originalReplace.apply(this, args);\n emit('replaceState');\n return ret;\n };\n\n const onPop = (): void => emit('popstate');\n const onHash = (): void => emit('hashchange');\n window.addEventListener('popstate', onPop);\n window.addEventListener('hashchange', onHash);\n\n return () => {\n history.pushState = originalPush;\n history.replaceState = originalReplace;\n window.removeEventListener('popstate', onPop);\n window.removeEventListener('hashchange', onHash);\n };\n}\n\n/**\n * Watch [role=\"dialog\"] subtree changes. Mount + unmount drive most modal bugs\n * (Radix dismissable, stuck overlay, focus trap). We also watch data-state\n * changes for \"dialog visibly closed but kept its element / outside-click\n * handler\" cases.\n */\nfunction installDialogCapture(cb: DomCaptureCallbacks): () => void {\n const seen = new WeakSet<Element>();\n\n const handle = (el: Element, action: 'mount' | 'unmount' | 'state'): void => {\n const selector = buildSelector(el);\n cb.emitDialog({\n kind: 'dialog',\n action,\n selector,\n state: el.getAttribute('data-state'),\n ...(action === 'mount' ? { outerHTML: truncate(el.outerHTML, HTML_LIMIT) } : {}),\n });\n };\n\n // Seed with already-mounted dialogs so we get unmount events when they later\n // disappear.\n for (const el of Array.from(document.querySelectorAll('[role=\"dialog\"]'))) {\n seen.add(el);\n }\n\n const obs = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of Array.from(m.addedNodes)) {\n if (!(node instanceof Element)) continue;\n const dialogs = node.matches?.('[role=\"dialog\"]')\n ? [node]\n : Array.from(node.querySelectorAll?.('[role=\"dialog\"]') ?? []);\n for (const d of dialogs) {\n if (seen.has(d)) continue;\n seen.add(d);\n handle(d, 'mount');\n }\n }\n for (const node of Array.from(m.removedNodes)) {\n if (!(node instanceof Element)) continue;\n const dialogs = node.matches?.('[role=\"dialog\"]')\n ? [node]\n : Array.from(node.querySelectorAll?.('[role=\"dialog\"]') ?? []);\n for (const d of dialogs) {\n if (!seen.has(d)) continue;\n seen.delete(d);\n handle(d, 'unmount');\n }\n }\n if (m.type === 'attributes' && m.attributeName === 'data-state' && m.target instanceof Element) {\n if (m.target.getAttribute('role') === 'dialog') handle(m.target, 'state');\n }\n }\n });\n obs.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-state'],\n });\n\n return () => obs.disconnect();\n}\n\n/**\n * Form submit capture. Emits one event per submitted form with a field-name\n * summary — values are NEVER captured (PII risk). hasValue is the only signal\n * about whether each field was filled. Listens capture-phase so we see\n * submissions even when a handler later calls preventDefault.\n */\nfunction installSubmitCapture(cb: DomCaptureCallbacks): () => void {\n const handler = (e: Event): void => {\n const form = e.target;\n if (!(form instanceof HTMLFormElement)) return;\n const fields: MonitorSubmitField[] = [];\n for (const el of Array.from(form.elements)) {\n if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement)) continue;\n const name = el.getAttribute('name') || '<unnamed>';\n const type = el instanceof HTMLInputElement ? el.type : el.tagName.toLowerCase();\n // hasValue: a non-empty string for text-like inputs; checked for checkboxes/radios.\n let hasValue: boolean;\n if (el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio')) {\n hasValue = el.checked;\n } else {\n hasValue = !!(el as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value;\n }\n fields.push({ name, type, hasValue });\n }\n cb.emitSubmit({\n kind: 'submit',\n form: {\n id: form.id || null,\n action: form.getAttribute('action') || null,\n method: (form.getAttribute('method') || 'GET').toUpperCase(),\n selector: buildSelector(form),\n fields,\n },\n });\n };\n document.addEventListener('submit', handler, { capture: true });\n return () => document.removeEventListener('submit', handler, { capture: true });\n}\n\nexport function installDomCapture(cb: DomCaptureCallbacks): DomCaptureInstallation {\n const undoClick = installClickCapture(cb);\n const undoRoute = installRouteCapture(cb);\n const undoDialog = installDialogCapture(cb);\n const undoSubmit = installSubmitCapture(cb);\n return {\n uninstall() {\n undoClick();\n undoRoute();\n undoDialog();\n undoSubmit();\n },\n };\n}\n","// Capture fetch + XMLHttpRequest activity for monitor mode.\n//\n// Default policy: emit only failed requests (status >= 400 OR threw).\n// Successful requests are silently skipped — capturing every successful API\n// call drowns the signal. verbose:true (passed in via start()) captures\n// everything.\n//\n// Body capture (for agent-driven debugging via MCP):\n// • Request body — captured for POST/PUT/PATCH/DELETE so the AI reading the\n// NDJSON sees what was attempted. Skipped for GET (no body) and HEAD.\n// • Response body — captured for failures (status >= 400) always; for 2xx\n// only in verbose mode.\n// • Both capped at 10KB; longer bodies are truncated with a flag.\n// • Both redacted: Authorization-style bearers, ls_pat_ PATs, JWT-shaped\n// strings → [REDACTED]. For JSON payloads, top-level keys matching\n// password/secret/token/apiKey/etc. have their values replaced wholesale.\n// • Authorization header value is NEVER captured — only its presence\n// (`request.hasAuth: true`) so the agent can tell auth was attached.\n\nimport type {\n MonitorBodyCapture,\n MonitorNetworkEvent,\n MonitorRequestCapture,\n} from './wire';\n\ntype Emit = (event: Omit<MonitorNetworkEvent, 'ts' | 'sessionId' | 'seq'>) => void;\n\nexport interface NetworkCaptureOptions {\n emit: Emit;\n verbose: boolean;\n}\n\nexport interface NetworkCaptureInstallation {\n uninstall(): void;\n}\n\nconst URL_LIMIT = 1000;\nconst BODY_LIMIT = 10 * 1024; // 10KB cap per body\nconst REDACTED = '[REDACTED]';\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\n\n// Secret-shaped strings — redacted wherever they appear in a body\nconst SECRET_PATTERNS: RegExp[] = [\n /Bearer\\s+[A-Za-z0-9._\\-+/=]+/gi,\n /\\bls_pat_[A-Za-z0-9_]+/g,\n // JWT: three dot-separated base64url segments starting with eyJ (the b64\n // encoding of the JSON {\"). Matches Auth0/Clerk/most providers' tokens.\n /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g,\n];\n\n// JSON keys whose values get wholesale-redacted regardless of value shape\nconst SENSITIVE_KEYS = /^(password|passwd|secret|token|api[_-]?key|auth|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key)$/i;\n\nfunction trunc(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) : s;\n}\n\nfunction redactString(s: string): string {\n let out = s;\n for (const re of SECRET_PATTERNS) {\n out = out.replace(re, REDACTED);\n }\n return out;\n}\n\nfunction redactJsonInPlace(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n if (typeof value === 'string') return redactString(value);\n return value;\n }\n if (Array.isArray(value)) return value.map(redactJsonInPlace);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = SENSITIVE_KEYS.test(k) ? REDACTED : redactJsonInPlace(v);\n }\n return out;\n}\n\nfunction redactBody(text: string, contentType: string | undefined): string {\n if (contentType && contentType.includes('application/json')) {\n try {\n const parsed = JSON.parse(text);\n return JSON.stringify(redactJsonInPlace(parsed));\n } catch {\n // Fall through to regex-only — JSON parse failed (malformed or not JSON).\n }\n }\n return redactString(text);\n}\n\n/** Apply redaction + size cap. Returns the wire-shaped capture object. */\nfunction captureBody(text: string, contentType: string | undefined): MonitorBodyCapture {\n const original = text.length;\n const cap: MonitorBodyCapture = { bodySize: original };\n if (original > BODY_LIMIT) {\n cap.body = redactBody(text.slice(0, BODY_LIMIT), contentType);\n cap.bodyTruncated = true;\n } else {\n cap.body = redactBody(text, contentType);\n }\n if (contentType) cap.contentType = contentType;\n return cap;\n}\n\n/** Read init.body or input.body as text, best-effort. Returns null if unreadable. */\nfunction readRequestBody(input: RequestInfo | URL, init: RequestInit | undefined): string | null {\n const body = init?.body;\n if (body != null) {\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof FormData) {\n // Don't capture values (PII risk); summarize field names + value sizes.\n const fields: string[] = [];\n body.forEach((v, k) => {\n fields.push(`${k}=${typeof v === 'string' ? `[${v.length}b]` : '[file]'}`);\n });\n return `[FormData] ${fields.join('&')}`;\n }\n if (body instanceof Blob) return `[Blob ${body.size}b ${body.type || 'unknown'}]`;\n if (body instanceof ArrayBuffer) return `[binary ${body.byteLength}b]`;\n if (ArrayBuffer.isView(body)) return `[binary ${(body as ArrayBufferView).byteLength}b]`;\n // ReadableStream — can't read without tee()-ing and risking caller breakage. Skip.\n return null;\n }\n // Body might be on a Request object passed as input.\n if (input instanceof Request) {\n // Can't synchronously read; cloning + reading is async. Skip in the request\n // path — the caller of fetch typically passes init.body anyway.\n return null;\n }\n return null;\n}\n\n/** Check whether an Authorization header is attached. Value is never read. */\nfunction detectAuth(input: RequestInfo | URL, init: RequestInit | undefined): boolean {\n const checkHeaders = (h: HeadersInit | undefined): boolean => {\n if (!h) return false;\n if (h instanceof Headers) return h.has('authorization');\n if (Array.isArray(h)) return h.some(([k]) => k.toLowerCase() === 'authorization');\n if (typeof h === 'object') return Object.keys(h).some((k) => k.toLowerCase() === 'authorization');\n return false;\n };\n if (checkHeaders(init?.headers)) return true;\n if (input instanceof Request && input.headers.has('authorization')) return true;\n return false;\n}\n\nfunction getRequestContentType(input: RequestInfo | URL, init: RequestInit | undefined): string | undefined {\n const fromHeaders = (h: HeadersInit | undefined): string | undefined => {\n if (!h) return undefined;\n if (h instanceof Headers) return h.get('content-type') || undefined;\n if (Array.isArray(h)) {\n const e = h.find(([k]) => k.toLowerCase() === 'content-type');\n return e ? e[1] : undefined;\n }\n if (typeof h === 'object') {\n for (const [k, v] of Object.entries(h)) {\n if (k.toLowerCase() === 'content-type') return v;\n }\n }\n return undefined;\n };\n return fromHeaders(init?.headers) ?? (input instanceof Request ? input.headers.get('content-type') || undefined : undefined);\n}\n\nfunction buildRequestCapture(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n method: string,\n): MonitorRequestCapture | undefined {\n if (!MUTATING_METHODS.has(method)) return undefined;\n const hasAuth = detectAuth(input, init);\n const bodyText = readRequestBody(input, init);\n if (bodyText == null && !hasAuth) return undefined;\n const contentType = getRequestContentType(input, init);\n const capture: MonitorRequestCapture = bodyText != null\n ? captureBody(bodyText, contentType)\n : {};\n if (hasAuth) capture.hasAuth = true;\n return capture;\n}\n\n/**\n * Wrap window.fetch. Captures method, URL, status, duration, and whether the\n * call failed. Restores the original on uninstall — but only if we're still\n * the outermost wrapper.\n *\n * We wrap (rather than PerformanceObserver) because we need the *URL the\n * developer wrote*, not the resolved one, and because PerformanceObserver\n * doesn't tell us whether the response was an error.\n */\nfunction wrapFetch(opts: NetworkCaptureOptions): () => void {\n const original = window.fetch;\n if (typeof original !== 'function') return () => { /* nothing to restore */ };\n\n const wrapped: typeof fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const start = performance.now();\n const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n // Snapshot the request BEFORE awaiting — init.body may be consumed by the\n // call (it's typically a string for JSON APIs, but defensively read first).\n const request = buildRequestCapture(input, init, method);\n\n try {\n // Call bound to window so fetch's internal `this`-dependent paths still\n // work. Passing globalThis explicitly is the spec-correct way to invoke\n // a free-standing fetch.\n const res = await original.call(window, input as RequestInfo, init);\n const durationMs = Math.round(performance.now() - start);\n const failed = res.status >= 400;\n\n // Capture response body for failures always; 2xx only in verbose mode.\n // Read from a clone so the caller still gets an unconsumed Response.\n let response: MonitorBodyCapture | undefined;\n if (failed || opts.verbose) {\n try {\n const text = await res.clone().text();\n const ct = res.headers.get('content-type') || undefined;\n response = captureBody(text, ct);\n } catch {\n // Body unreadable (already consumed, network error mid-read) — skip.\n }\n }\n\n if (failed || opts.verbose) {\n opts.emit({\n kind: 'fetch',\n url: trunc(url, URL_LIMIT),\n method,\n status: res.status,\n durationMs,\n failed,\n ...(request ? { request } : {}),\n ...(response ? { response } : {}),\n });\n }\n return res;\n } catch (err) {\n const durationMs = Math.round(performance.now() - start);\n opts.emit({\n kind: 'fetch',\n url: trunc(url, URL_LIMIT),\n method,\n status: 0,\n durationMs,\n failed: true,\n error: err instanceof Error ? err.message : String(err),\n ...(request ? { request } : {}),\n });\n throw err;\n }\n };\n\n // Tag so we can detect \"is this still our wrapper\" on uninstall. If another\n // SDK wrapped over us after we installed, leave their wrapper in place —\n // restoring `original` would clobber their instrumentation.\n (wrapped as unknown as { __lsBeaconWrapped: true }).__lsBeaconWrapped = true;\n window.fetch = wrapped;\n\n return () => {\n if ((window.fetch as unknown as { __lsBeaconWrapped?: true }).__lsBeaconWrapped) {\n window.fetch = original;\n }\n };\n}\n\n/**\n * Wrap XMLHttpRequest.prototype. Tracks method+URL+start via open()/send(),\n * reads status on loadend. Same emission policy as fetch.\n */\nfunction readXhrSendBody(body: Document | XMLHttpRequestBodyInit | null | undefined): string | null {\n if (body == null) return null;\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof FormData) {\n const fields: string[] = [];\n body.forEach((v, k) => {\n fields.push(`${k}=${typeof v === 'string' ? `[${v.length}b]` : '[file]'}`);\n });\n return `[FormData] ${fields.join('&')}`;\n }\n if (body instanceof Blob) return `[Blob ${body.size}b ${body.type || 'unknown'}]`;\n if (body instanceof ArrayBuffer) return `[binary ${body.byteLength}b]`;\n if (ArrayBuffer.isView(body)) return `[binary ${(body as ArrayBufferView).byteLength}b]`;\n // Document / XML payloads — rare; skip.\n return null;\n}\n\nfunction wrapXhr(opts: NetworkCaptureOptions): () => void {\n const proto = XMLHttpRequest.prototype;\n const originalOpen = proto.open;\n const originalSend = proto.send;\n const originalSetRequestHeader = proto.setRequestHeader;\n\n interface XhrMeta {\n method: string;\n url: string;\n start: number;\n request?: MonitorRequestCapture;\n /** Last set request content-type — needed for response.body redaction policy when reading. */\n requestContentType?: string;\n /** True if setRequestHeader('authorization', ...) was called. */\n hasAuth: boolean;\n }\n const state = new WeakMap<XMLHttpRequest, XhrMeta>();\n\n proto.open = function patchedOpen(\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n state.set(this, {\n method: method.toUpperCase(),\n url: typeof url === 'string' ? url : url.toString(),\n start: 0,\n hasAuth: false,\n });\n // @ts-expect-error — passthrough overload matrix is unwieldy; rest is forwarded as-is.\n return originalOpen.call(this, method, url, ...rest);\n };\n\n proto.setRequestHeader = function patchedSetRequestHeader(\n name: string,\n value: string,\n ): void {\n const meta = state.get(this);\n if (meta) {\n const lower = name.toLowerCase();\n if (lower === 'authorization') meta.hasAuth = true;\n else if (lower === 'content-type') meta.requestContentType = value;\n }\n return originalSetRequestHeader.call(this, name, value);\n };\n\n proto.send = function patchedSend(this: XMLHttpRequest, body?: Document | XMLHttpRequestBodyInit | null): void {\n const meta = state.get(this);\n if (meta) {\n meta.start = performance.now();\n // Build request snapshot for mutating methods.\n if (MUTATING_METHODS.has(meta.method)) {\n const bodyText = readXhrSendBody(body);\n if (bodyText != null) {\n meta.request = captureBody(bodyText, meta.requestContentType);\n } else {\n meta.request = {};\n }\n if (meta.hasAuth) meta.request.hasAuth = true;\n } else if (meta.hasAuth) {\n meta.request = { hasAuth: true };\n }\n }\n\n const onLoadEnd = (): void => {\n this.removeEventListener('loadend', onLoadEnd);\n const m = state.get(this);\n if (!m) return;\n const durationMs = Math.round(performance.now() - m.start);\n // status === 0 indicates the request errored or was aborted before a response.\n const failed = this.status === 0 || this.status >= 400;\n\n let response: MonitorBodyCapture | undefined;\n if ((failed || opts.verbose) && this.status > 0) {\n try {\n // responseText is only valid for text-shaped responseTypes (default + 'text').\n // Defensively gate.\n const rt = (this.responseType === '' || this.responseType === 'text') ? this.responseText : '';\n if (rt) {\n const ct = this.getResponseHeader('content-type') || undefined;\n response = captureBody(rt, ct);\n }\n } catch {\n // responseText access can throw if responseType is incompatible — skip.\n }\n }\n\n if (failed || opts.verbose) {\n opts.emit({\n kind: 'xhr',\n url: trunc(m.url, URL_LIMIT),\n method: m.method,\n status: this.status,\n durationMs,\n failed,\n ...(m.request ? { request: m.request } : {}),\n ...(response ? { response } : {}),\n });\n }\n state.delete(this);\n };\n this.addEventListener('loadend', onLoadEnd);\n return originalSend.call(this, body as XMLHttpRequestBodyInit | null);\n };\n\n return () => {\n proto.open = originalOpen;\n proto.send = originalSend;\n proto.setRequestHeader = originalSetRequestHeader;\n };\n}\n\nexport function installNetworkCapture(opts: NetworkCaptureOptions): NetworkCaptureInstallation {\n const undoFetch = wrapFetch(opts);\n const undoXhr = wrapXhr(opts);\n return {\n uninstall() {\n undoFetch();\n undoXhr();\n },\n };\n}\n","// Batched POST transport for monitor events.\n//\n// Buffers events in memory and flushes to the configured URL on a 1s timer,\n// when buffer hits 50 entries, or synchronously on pagehide / visibility:hidden\n// via navigator.sendBeacon. Per-event POSTs would flood the receiver during\n// click bursts; sendBeacon is the only mechanism that survives a teardown.\n//\n// On flush failure we surface via onError but don't retry — duplicates are\n// worse than gaps for a dev tool. Buffer caps at MAX_BUFFER and drops oldest\n// to bound memory if the receiver is unreachable for a long time.\n\nimport type { MonitorBatch, MonitorEvent } from './wire';\n\nconst FLUSH_INTERVAL_MS = 1000;\nconst FLUSH_AT_COUNT = 50;\nconst MAX_BUFFER = 500;\n\nexport interface TransportOptions {\n url: string;\n sessionId: string;\n /** Called when a flush failed (network error or non-2xx). For UI badge / console warn. */\n onError?: (err: Error) => void;\n}\n\nexport class MonitorTransport {\n private url: string;\n private sessionId: string;\n private onError?: (err: Error) => void;\n private buffer: MonitorEvent[] = [];\n private inflight = false;\n private timer: ReturnType<typeof setInterval> | null = null;\n private pagehideHandler?: () => void;\n private destroyed = false;\n\n constructor(opts: TransportOptions) {\n this.url = opts.url;\n this.sessionId = opts.sessionId;\n this.onError = opts.onError;\n\n this.timer = setInterval(() => { void this.flush(); }, FLUSH_INTERVAL_MS);\n this.pagehideHandler = () => this.flushSync();\n // pagehide fires for both unload AND bfcache eviction. Prefer it over\n // beforeunload (which doesn't fire on mobile when the user switches tabs).\n window.addEventListener('pagehide', this.pagehideHandler);\n // visibilitychange:hidden is the only reliable signal on iOS Safari when\n // the user backgrounds the tab. Flush sync there too.\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === 'hidden') this.flushSync();\n };\n\n enqueue(event: MonitorEvent): void {\n if (this.destroyed) return;\n this.buffer.push(event);\n if (this.buffer.length > MAX_BUFFER) {\n // Drop oldest non-flushed event rather than grow unbounded.\n this.buffer.shift();\n }\n if (this.buffer.length >= FLUSH_AT_COUNT) void this.flush();\n }\n\n /** Async flush via fetch. No-op when in-flight or empty. */\n async flush(): Promise<void> {\n if (this.destroyed) return;\n if (this.inflight || this.buffer.length === 0) return;\n const events = this.buffer.splice(0, FLUSH_AT_COUNT);\n const batch = this.makeBatch(events);\n this.inflight = true;\n try {\n const res = await fetch(this.url, {\n method: 'POST',\n // credentials:'omit' — going to the dev's local server, not the app\n // backend; avoid leaking session cookies cross-origin.\n credentials: 'omit',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n // keepalive lets the request survive a same-tick navigation when\n // pagehide didn't fire (e.g. a window.location.assign from script).\n keepalive: true,\n });\n if (!res.ok) {\n this.onError?.(new Error(`monitor flush: HTTP ${res.status}`));\n }\n } catch (err) {\n // Network failure (server gone, CORS, etc.) — surface but don't crash.\n // Events in this batch are LOST — re-queueing risks duplicates and we\n // can't tell the receiver \"this is a retry.\" Acceptable trade for dev tooling.\n this.onError?.(err instanceof Error ? err : new Error(String(err)));\n } finally {\n this.inflight = false;\n }\n }\n\n /** Synchronous flush via sendBeacon, used on pagehide / visibility:hidden. */\n private flushSync(): void {\n if (this.destroyed || this.buffer.length === 0) return;\n if (!navigator.sendBeacon) {\n // Old browsers — best-effort fetch with keepalive (no await; we're tearing down).\n void this.flush();\n return;\n }\n const events = this.buffer.splice(0);\n const batch = this.makeBatch(events);\n // sendBeacon doesn't accept Content-Type; the receiver detects JSON by\n // best-effort parsing anyway.\n const blob = new Blob([JSON.stringify(batch)], { type: 'application/json' });\n try {\n navigator.sendBeacon(this.url, blob);\n } catch {\n // sendBeacon can throw on payloads > ~64KB. Drop the batch.\n }\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.timer) clearInterval(this.timer);\n if (this.pagehideHandler) window.removeEventListener('pagehide', this.pagehideHandler);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n // Best-effort final flush so events from the moment of stop() make it out.\n this.flushSync();\n }\n\n private makeBatch(events: MonitorEvent[]): MonitorBatch {\n return {\n sessionId: this.sessionId,\n events,\n meta: {\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n v: 1,\n },\n };\n }\n}\n","// Monitor session orchestrator.\n//\n// One active session at a time, owned by module-level state. start(cfg)\n// installs all capture (errors, network, DOM) and kicks off the transport;\n// stop() uninstalls everything. resumeIfPersisted() reads sessionStorage so\n// an SPA reload mid-repro doesn't silently drop capture.\n//\n// Per design decision B1 the monitor owns its own EventBuffer instance for\n// error capture — independent of the `errors` plugin's buffer. Two window\n// listeners total (one per buffer); zero shared state.\n//\n// Module-level state is intentional: only one monitor session can be running\n// per page. Multi-init() is supported because destroy()/start()/stop() is\n// idempotent.\n\nimport { createEventBuffer, type CapturedRuntimeEvent, type EventBuffer } from '../event-buffer';\nimport { installDomCapture } from './capture-dom';\nimport { installNetworkCapture } from './capture-network';\nimport { MonitorTransport } from './transport';\nimport type { MonitorEvent } from './wire';\n\n// Distributive Omit so the union keeps its discriminant + body when we strip\n// the auto-filled fields. Without distribution, TS collapses to \"only fields\n// all members share\", which excludes label, data, etc. and breaks every emit.\ntype EventInput<T> = T extends unknown ? Omit<T, 'ts' | 'sessionId' | 'seq'> : never;\ntype MonitorEventInput = EventInput<MonitorEvent>;\n\nconst SESSION_URL_KEY = '__lsBeaconMonitorUrl';\nconst SESSION_ID_KEY = '__lsBeaconMonitorSession';\nconst SESSION_VERBOSE_KEY = '__lsBeaconMonitorVerbose';\nconst SESSION_DEADLINE_KEY = '__lsBeaconMonitorDeadline';\nconst DEFAULT_MAX_SESSION_MS = 30 * 60_000;\nconst PROBE_DATA_LIMIT = 4_096;\n\nexport interface MonitorConfig {\n /** Endpoint to POST batches to. Cleared on stop(). */\n url: string;\n /** If true, capture successful network calls in addition to failures. Default false. */\n verbose?: boolean;\n /** Hard session cap. Auto-stops monitoring at this point. Default 30 minutes. */\n maxSessionMs?: number;\n}\n\ntype Listener = (active: boolean, url: string | null) => void;\n\ninterface ActiveSession {\n url: string;\n sessionId: string;\n verbose: boolean;\n deadlineMs: number;\n seq: number;\n transport: MonitorTransport;\n errorsBuffer: EventBuffer;\n uninstallNetwork: () => void;\n uninstallDom: () => void;\n uninstallErrors: () => void;\n errorsUnsub: () => void;\n deadlineTimer: ReturnType<typeof setTimeout>;\n /** Index up to which the errors buffer was already drained. */\n drainedThrough: number;\n}\n\nlet active: ActiveSession | null = null;\nconst listeners = new Set<Listener>();\n\nfunction randomSessionId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n // crypto.randomUUID() returns \"xxxxxxxx-xxxx-...\" — slice keeps TS happy\n // under noUncheckedIndexedAccess.\n return crypto.randomUUID().slice(0, 8);\n }\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction safeSerialize(value: unknown): unknown {\n // Defend against cyclic refs + functions + large blobs. Strings truncate;\n // objects/arrays round-trip through JSON (which strips functions and throws\n // on cycles — we catch and stringify defensively).\n const seen = new WeakSet<object>();\n const walk = (v: unknown): unknown => {\n if (v === null || typeof v !== 'object') {\n if (typeof v === 'string') return v.length > PROBE_DATA_LIMIT ? v.slice(0, PROBE_DATA_LIMIT) : v;\n return v;\n }\n if (seen.has(v as object)) return '[cyclic]';\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(walk);\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(v as object).slice(0, 50)) {\n try {\n out[k] = walk((v as Record<string, unknown>)[k]);\n } catch {\n out[k] = '[unreadable]';\n }\n }\n return out;\n };\n try {\n return walk(value);\n } catch {\n return '[unserialisable]';\n }\n}\n\nfunction notify(): void {\n for (const fn of listeners) {\n try {\n fn(active !== null, active?.url ?? null);\n } catch {\n // listeners must not throw; ignore.\n }\n }\n}\n\nfunction stamp(partial: MonitorEventInput): MonitorEvent {\n if (!active) {\n // Programmer error — caller should check isActive() first. Throwing would\n // crash the host page, so synthesize a no-op event.\n return {\n ...(partial as object),\n ts: Date.now(),\n sessionId: '',\n seq: 0,\n } as unknown as MonitorEvent;\n }\n active.seq += 1;\n return {\n ...(partial as object),\n ts: Date.now(),\n sessionId: active.sessionId,\n seq: active.seq,\n } as unknown as MonitorEvent;\n}\n\nfunction enqueue(partial: MonitorEventInput): void {\n if (!active) return;\n const event = stamp(partial);\n active.transport.enqueue(event);\n}\n\nfunction persistSession(): void {\n if (!active) return;\n try {\n sessionStorage.setItem(SESSION_URL_KEY, active.url);\n sessionStorage.setItem(SESSION_ID_KEY, active.sessionId);\n sessionStorage.setItem(SESSION_VERBOSE_KEY, active.verbose ? '1' : '0');\n sessionStorage.setItem(SESSION_DEADLINE_KEY, String(active.deadlineMs));\n } catch {\n // sessionStorage disabled (Safari private mode). Session still works,\n // just doesn't survive a reload.\n }\n}\n\nfunction clearPersistedSession(): void {\n try {\n sessionStorage.removeItem(SESSION_URL_KEY);\n sessionStorage.removeItem(SESSION_ID_KEY);\n sessionStorage.removeItem(SESSION_VERBOSE_KEY);\n sessionStorage.removeItem(SESSION_DEADLINE_KEY);\n } catch {\n // ignore\n }\n}\n\nfunction readPersistedSession(): { url: string; verbose: boolean; deadlineMs: number } | null {\n try {\n const url = sessionStorage.getItem(SESSION_URL_KEY);\n if (!url) return null;\n const verbose = sessionStorage.getItem(SESSION_VERBOSE_KEY) === '1';\n const deadlineRaw = sessionStorage.getItem(SESSION_DEADLINE_KEY);\n const deadlineMs = deadlineRaw ? Number(deadlineRaw) : Date.now() + DEFAULT_MAX_SESSION_MS;\n if (Number.isFinite(deadlineMs) && deadlineMs <= Date.now()) {\n clearPersistedSession();\n return null;\n }\n return { url, verbose, deadlineMs };\n } catch {\n return null;\n }\n}\n\nfunction emitErrorEvent(ev: CapturedRuntimeEvent): void {\n if (!active) return;\n active.seq += 1;\n active.transport.enqueue({\n kind: ev.kind,\n ts: ev.ts,\n sessionId: active.sessionId,\n seq: active.seq,\n message: ev.message,\n ...(ev.stack ? { stack: ev.stack } : {}),\n ...(ev.source ? { source: ev.source } : {}),\n ...(typeof ev.line === 'number' ? { line: ev.line } : {}),\n ...(typeof ev.col === 'number' ? { col: ev.col } : {}),\n });\n}\n\nexport function start(config: MonitorConfig): void {\n if (active) stop();\n if (!config.url) return;\n\n const maxMs = config.maxSessionMs ?? DEFAULT_MAX_SESSION_MS;\n const deadlineMs = Date.now() + maxMs;\n const sessionId = randomSessionId();\n const verbose = !!config.verbose;\n\n const transport = new MonitorTransport({\n url: config.url,\n sessionId,\n onError: (err) => {\n // Soft-fail. We don't tear down on transient errors — the dev's local\n // server might just be restarting. Surface once so the user sees\n // \"monitor isn't reaching anything\" without a teardown loop.\n console.warn('[launch-kit-beacon] monitor transport error:', err.message);\n },\n });\n\n // Monitor's own error buffer (per B1 — no sharing with errors plugin).\n const errorsBuffer = createEventBuffer();\n const uninstallErrors = errorsBuffer.install();\n\n // Drain anything captured before subscribe, then keep streaming.\n const existing = errorsBuffer.snapshot();\n for (const ev of existing) emitErrorEvent(ev);\n let drainedThrough = existing.length;\n const errorsUnsub = errorsBuffer.subscribe(() => {\n if (!active) return;\n const all = active.errorsBuffer.snapshot();\n while (active.drainedThrough < all.length) {\n const ev = all[active.drainedThrough];\n if (ev) emitErrorEvent(ev);\n active.drainedThrough += 1;\n }\n });\n\n const net = installNetworkCapture({\n emit: (partial) => enqueue(partial),\n verbose,\n });\n\n const dom = installDomCapture({\n emitClick: (partial) => enqueue(partial),\n emitRoute: (partial) => enqueue(partial),\n emitDialog: (partial) => enqueue(partial),\n emitSubmit: (partial) => enqueue(partial),\n });\n\n const deadlineTimer = setTimeout(() => {\n console.info('[launch-kit-beacon] monitor session expired (max duration reached)');\n stop();\n }, Math.max(0, deadlineMs - Date.now()));\n\n active = {\n url: config.url,\n sessionId,\n verbose,\n deadlineMs,\n seq: 0,\n transport,\n errorsBuffer,\n uninstallNetwork: net.uninstall,\n uninstallDom: dom.uninstall,\n uninstallErrors,\n errorsUnsub,\n deadlineTimer,\n drainedThrough,\n };\n\n persistSession();\n notify();\n}\n\n/**\n * Stop the session AND forget it. Used when the user explicitly clicks Stop or\n * the deadline expires — clears sessionStorage so the next page load doesn't\n * resume. For host-driven teardown (AppHeader unmount, HMR) call suspend()\n * instead so resume can rehydrate.\n */\nexport function stop(): void {\n tearDownActive();\n clearPersistedSession();\n notify();\n}\n\n/**\n * Tear down capture + transport BUT keep sessionStorage intact so the next\n * init() can resumeIfPersisted(). Used when the host (e.g. AppHeader) unmounts\n * mid-session due to a layout swap — without this, crossing Next.js route\n * groups kills the session permanently because destroy() → abort → stop()\n * would clear the persistence keys we rely on for rehydrate.\n */\nexport function suspend(): void {\n if (!active) return;\n tearDownActive();\n notify();\n}\n\nfunction tearDownActive(): void {\n if (!active) return;\n clearTimeout(active.deadlineTimer);\n active.errorsUnsub();\n active.uninstallErrors();\n active.uninstallNetwork();\n active.uninstallDom();\n active.transport.destroy();\n active = null;\n}\n\nexport function probe(label: string, data?: unknown): void {\n if (!active) return;\n enqueue({\n kind: 'probe',\n label: label.slice(0, 200),\n data: safeSerialize(data),\n });\n}\n\nexport function isActive(): boolean {\n return active !== null;\n}\n\nexport function currentUrl(): string | null {\n return active?.url ?? null;\n}\n\n/**\n * Subscribe to active-state changes. Used by the panel UI to update its\n * display when start()/stop() fires.\n */\nexport function subscribe(fn: Listener): () => void {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n}\n\n/**\n * Resume a persisted session if one exists in sessionStorage. Called from the\n * plugin's setupOnce so an SPA reload during active monitoring doesn't drop\n * capture. No-op when no session was persisted or the deadline has passed.\n */\nexport function resumeIfPersisted(): void {\n if (active) return;\n if (typeof window === 'undefined') return;\n const persisted = readPersistedSession();\n if (!persisted) return;\n start({\n url: persisted.url,\n verbose: persisted.verbose,\n maxSessionMs: Math.max(60_000, persisted.deadlineMs - Date.now()),\n });\n}\n","// liveMonitor plugin — paste-URL panel that drives the live-event side-channel.\n//\n// Lifecycle (per the new plugin contract):\n// setupOnce → resume any sessionStorage-persisted session; wire ctx.signal\n// so destroy() cleanly stops the session and unsubscribes.\n// form → render an imperative panel into the drawer body. Inactive\n// state shows URL input + Start + verbose toggle; active state\n// shows the URL + Stop button + REC indicator. Subscribes to\n// session active-state changes for live updates.\n//\n// Capture is NOT contributed to the feedback payload — liveMonitor lives on\n// its own side-channel (the launch-beacon receiver), not /api/feedback. The\n// plugin omits `capture()` for that reason.\n\nimport { createMonitorOverlay, type MonitorOverlay } from '../internal/monitor/overlay';\nimport * as session from '../internal/monitor/session';\nimport type { BeaconPlugin } from '../types';\n\nexport interface LiveMonitorOptions {\n /** Hard session cap. Auto-stops monitoring at this point. Default 30 minutes. */\n maxSessionMs?: number;\n}\n\nexport function liveMonitor(opts: LiveMonitorOptions = {}): BeaconPlugin {\n let panelRoot: HTMLDivElement | null = null;\n let unsubscribeActive: (() => void) | null = null;\n let lastUrlInput = '';\n let overlay: MonitorOverlay | null = null;\n\n function mountOverlay(): void {\n if (overlay) return;\n overlay = createMonitorOverlay({\n onStop: () => session.stop(),\n url: session.currentUrl(),\n });\n }\n\n function destroyOverlay(): void {\n if (!overlay) return;\n try { overlay.destroy(); } catch { /* swallow */ }\n overlay = null;\n }\n\n function findShadowRoot(): ShadowRoot | null {\n const host = document.querySelector('launch-kit-beacon');\n return host?.shadowRoot ?? null;\n }\n\n function renderInactive(): void {\n if (!panelRoot) return;\n panelRoot.innerHTML = '';\n\n const title = document.createElement('div');\n title.className = 'beacon-monitor-title';\n title.textContent = 'Monitor — paste a stream URL';\n panelRoot.appendChild(title);\n\n const row = document.createElement('div');\n row.className = 'beacon-monitor-row';\n\n const urlInput = document.createElement('input');\n urlInput.type = 'url';\n urlInput.className = 'beacon-monitor-input';\n urlInput.placeholder = 'http://localhost:9876/m/…';\n urlInput.value = lastUrlInput;\n urlInput.autocomplete = 'off';\n urlInput.spellcheck = false;\n row.appendChild(urlInput);\n\n const startBtn = document.createElement('button');\n startBtn.type = 'button';\n startBtn.className = 'beacon-monitor-btn';\n startBtn.textContent = 'Start';\n startBtn.disabled = !lastUrlInput.trim();\n row.appendChild(startBtn);\n\n panelRoot.appendChild(row);\n\n const verboseLabel = document.createElement('label');\n verboseLabel.className = 'beacon-monitor-verbose';\n const verboseInput = document.createElement('input');\n verboseInput.type = 'checkbox';\n verboseInput.dataset.role = 'verbose';\n verboseLabel.appendChild(verboseInput);\n verboseLabel.appendChild(document.createTextNode(' verbose (capture successful network too)'));\n panelRoot.appendChild(verboseLabel);\n\n const help = document.createElement('div');\n help.className = 'beacon-monitor-help';\n help.textContent = 'Streams clicks, failed network, errors, route + dialog changes.';\n panelRoot.appendChild(help);\n\n urlInput.addEventListener('input', () => {\n lastUrlInput = urlInput.value;\n startBtn.disabled = !urlInput.value.trim();\n });\n\n startBtn.addEventListener('click', () => {\n const value = urlInput.value.trim();\n if (!value) return;\n // Validate URL shape — start() doesn't, so surface bad input here.\n try {\n // eslint-disable-next-line no-new\n new URL(value);\n } catch {\n urlInput.setCustomValidity('Enter a valid URL (e.g. http://localhost:9876/m/abc)');\n urlInput.reportValidity();\n return;\n }\n urlInput.setCustomValidity('');\n session.start({\n url: value,\n verbose: verboseInput.checked,\n ...(opts.maxSessionMs !== undefined ? { maxSessionMs: opts.maxSessionMs } : {}),\n });\n });\n }\n\n function renderActive(): void {\n if (!panelRoot) return;\n panelRoot.innerHTML = '';\n const url = session.currentUrl() ?? '';\n\n const title = document.createElement('div');\n title.className = 'beacon-monitor-title';\n const rec = document.createElement('span');\n rec.className = 'beacon-monitor-rec';\n rec.setAttribute('aria-hidden', 'true');\n title.appendChild(rec);\n title.appendChild(document.createTextNode(' Monitor — recording'));\n panelRoot.appendChild(title);\n\n const urlEl = document.createElement('div');\n urlEl.className = 'beacon-monitor-active-url';\n urlEl.title = url;\n urlEl.textContent = url;\n panelRoot.appendChild(urlEl);\n\n const row = document.createElement('div');\n row.className = 'beacon-monitor-row';\n const stopBtn = document.createElement('button');\n stopBtn.type = 'button';\n stopBtn.className = 'beacon-monitor-btn stop';\n stopBtn.textContent = 'Stop monitoring';\n stopBtn.addEventListener('click', () => session.stop());\n row.appendChild(stopBtn);\n panelRoot.appendChild(row);\n\n const help = document.createElement('div');\n help.className = 'beacon-monitor-help';\n help.textContent = 'Events stream to the URL above. Auto-stops after 30 min.';\n panelRoot.appendChild(help);\n }\n\n function render(): void {\n if (session.isActive()) renderActive();\n else renderInactive();\n }\n\n return {\n name: 'liveMonitor',\n setupOnce(ctx) {\n // Resume any sessionStorage-persisted session so an SPA reload mid-repro\n // doesn't drop capture.\n session.resumeIfPersisted();\n\n // Mirror current state into the body-portal overlay. Mount on first\n // active=true (including the resume case), destroy on active=false.\n if (session.isActive()) mountOverlay();\n const unsubscribeOverlay = session.subscribe((active, url) => {\n if (active) {\n mountOverlay();\n overlay?.updateUrl(url);\n } else {\n destroyOverlay();\n }\n });\n\n // SUSPEND (not stop) on destroy() — host-driven teardown (AppHeader\n // unmount on layout swap, HMR) must keep sessionStorage intact so the\n // next init() can resumeIfPersisted(). Only user-initiated Stop or\n // deadline expiry should forget the session.\n const onAbort = () => {\n destroyOverlay();\n unsubscribeOverlay();\n try { session.suspend(); } catch { /* swallow */ }\n };\n ctx.signal.addEventListener('abort', onAbort, { once: true });\n\n // Find shadow root so the panel can attach proper styles. Strictly\n // observational here — setupOnce returns no teardown.\n void findShadowRoot;\n },\n form() {\n return {\n render: (slot) => {\n panelRoot = document.createElement('div');\n panelRoot.className = 'beacon-monitor';\n slot.appendChild(panelRoot);\n\n render();\n unsubscribeActive = session.subscribe(() => render());\n\n return () => {\n unsubscribeActive?.();\n unsubscribeActive = null;\n panelRoot = null;\n };\n },\n };\n },\n // No capture(): liveMonitor is a side-channel, not a feedback payload contributor.\n };\n}\n\n/**\n * Programmatic API exports. Mirrors the plugin's runtime entry points so app\n * code can drive monitor without touching the UI (e.g. emit a probe from a\n * button click handler during a known-bad repro).\n */\nexport { start as startMonitor, stop as stopMonitor, probe, isActive as isMonitorActive, currentUrl as currentMonitorUrl } from '../internal/monitor/session';\nexport type { MonitorConfig } from '../internal/monitor/session';\n","// Core orchestrator: singleton, init/show/hide/destroy/status/on/off, submit lifecycle.\n//\n// Submit lifecycle (§7):\n// 1. validate description → 2. allocate per-submit AbortController →\n// 3. capture plugins in order → 4. wrap → 5. beforeSubmit (cancellable) →\n// 6. POST → 7. afterSubmit + system event → 8. clear _currentSubmit.\n\nimport { createCtx, type CtxHost } from './ctx';\nimport { BEACON_TAG, defineBeaconElement, LaunchKitBeacon } from './element';\nimport { createRegistry, type Registry, type PluginErrorReport } from './registry';\nimport { postFeedback } from './transport';\nimport type {\n BeaconCtx,\n BeaconLifecycleEvent,\n BeaconPlugin,\n BeaconStatus,\n ContextConfig,\n DeclarativeForm,\n FeedbackPayload,\n HeadersConfig,\n ImperativeForm,\n InitOptions,\n LabelMap,\n Mode,\n PayloadMetadata,\n PluginEntry,\n PluginStatus,\n Position,\n Severity,\n SystemEvent,\n SystemEventPayload,\n Theme,\n TransportResponse,\n} from './types';\nimport { DialogView, defaultLabels, type PluginPanelSource } from './ui/dialog';\nimport { attachOverlay, createOverlayHost, type OverlayHost } from './ui/overlay';\nimport { metadata as presetMetadata, errors as presetErrors, domEle as presetDomEle, domSS as presetDomSS } from './plugins';\nimport { ensureBeaconBodyStyles } from './styles';\nimport { clearAnnotationCache } from './internal/annotation-cache';\n\ninterface BeaconInstance {\n endpoint: string;\n headers: HeadersConfig | undefined;\n context: ContextConfig | undefined;\n credentials: RequestCredentials;\n plugins: BeaconPlugin[];\n registry: Registry;\n dialog: DialogView;\n overlayHost: OverlayHost;\n hostElement: LaunchKitBeacon;\n initAbort: AbortController;\n labels: LabelMap;\n debug: boolean;\n healthIndicator: 'never' | 'dev' | 'always';\n position: Position;\n theme: Theme;\n // ── Per-submit state ──\n currentSubmit: AbortController | null;\n capturedEntries: Record<string, PluginEntry>;\n // ── Form values (plugin-namespaced) ──\n formValues: Record<string, Record<string, unknown>>;\n // ── Lifecycle subscribers (per-submit ctx-channel) ──\n lifecycleHandlers: {\n open: Set<(e: BeaconLifecycleEvent) => void>;\n close: Set<(e: BeaconLifecycleEvent) => void>;\n beforeSubmit: Set<(e: BeaconLifecycleEvent) => void>;\n afterSubmit: Set<(e: BeaconLifecycleEvent) => void>;\n };\n // ── Plugin form panels resolved at open() ──\n panelSources: PluginPanelSource[];\n}\n\nlet current: BeaconInstance | null = null;\n\nconst systemHandlers: {\n [E in SystemEvent]: Set<(e: SystemEventPayload<E>) => void>;\n} = {\n 'plugin:error': new Set(),\n 'submit:success': new Set(),\n 'submit:error': new Set(),\n 'ready': new Set(),\n};\n\n// ── Public API ──────────────────────────────────────────\n\nexport function init(opts: InitOptions): void {\n if (typeof window === 'undefined') return;\n if (!opts.endpoint) throw new Error('init: endpoint is required');\n\n defineBeaconElement();\n destroy();\n\n const labels: LabelMap = { ...defaultLabels(), ...(opts.labels ?? {}) };\n const initAbort = new AbortController();\n const plugins = resolvePluginList(opts);\n const position: Position = opts.position ?? 'bottom-right';\n const theme: Theme = opts.theme ?? 'auto';\n\n // Body-mounted UI (pin popover, pick-mode overlay) lives outside the shadow\n // root — its styles must be available in document.head.\n ensureBeaconBodyStyles();\n\n ensureHost(opts, position, theme);\n const hostElement = document.querySelector<LaunchKitBeacon>(BEACON_TAG);\n if (!hostElement) {\n throw new Error('init: failed to acquire <launch-kit-beacon> host');\n }\n // connectedCallback runs synchronously when the element is in the DOM.\n // shadow root + default trigger are guaranteed by this point.\n if (!hostElement.shadow) {\n throw new Error('init: host element shadow root not initialized');\n }\n\n const overlayHost = createOverlayHost(hostElement.shadow);\n const dialog = new DialogView(\n labels,\n ['bug', 'idea', 'ux', 'a11y'],\n {\n onSubmit: () => { void runSubmit(); },\n onClose: (reason) => { dispatchLifecycle('close', {}); if (reason === 'user') resetFormState(); },\n },\n );\n hostElement.shadow.appendChild(dialog.root);\n // Mark host so screenshot plugins can exclude it.\n hostElement.classList.add('beacon-no-capture');\n\n const registry = createRegistry(plugins);\n\n const instance: BeaconInstance = {\n endpoint: opts.endpoint,\n headers: opts.headers,\n context: opts.context,\n credentials: opts.credentials ?? 'omit',\n plugins,\n registry,\n dialog,\n overlayHost,\n hostElement,\n initAbort,\n labels,\n debug: !!opts.debug || debugFromUrl(),\n healthIndicator: opts.healthIndicator ?? 'never',\n position,\n theme,\n currentSubmit: null,\n capturedEntries: {},\n formValues: {},\n lifecycleHandlers: {\n open: new Set(),\n close: new Set(),\n beforeSubmit: new Set(),\n afterSubmit: new Set(),\n },\n panelSources: [],\n };\n\n current = instance;\n\n // Wire trigger BEFORE installing plugins so a setupOnce that opens the dialog\n // synchronously (rare but possible) works.\n hostElement.onTriggerClick = () => show();\n\n // Install plugins. setupOnce errors are caught and reported but never block init.\n registry.install(\n (name) => makeCtxForPlugin(name),\n (err) => handlePluginError(err),\n );\n\n dispatchSystem('ready', { ready: true });\n if (instance.debug) console.info('[beacon] ready', instance.endpoint);\n}\n\nexport function show(): void {\n const inst = current;\n if (!inst) return;\n if (inst.currentSubmit) return; // §7 concurrency: show is a no-op while submit in flight\n // Resolve plugin form panels fresh at open() so plugins can return different\n // forms each time (e.g., based on current page state).\n inst.panelSources = inst.plugins\n .map<PluginPanelSource | null>((p) => {\n if (!p.form) return null;\n const ctx = makeCtxForPlugin(p.name);\n let form: DeclarativeForm | ImperativeForm;\n try {\n form = p.form(ctx);\n } catch (err) {\n handlePluginError({\n plugin: p.name,\n error: err instanceof Error ? err : new Error(String(err)),\n at: 'form',\n });\n return null;\n }\n return { name: p.name, form, ctx };\n })\n .filter((x): x is PluginPanelSource => x !== null);\n\n inst.dialog.installPluginPanels(inst.panelSources, {\n get: (plugin, name) => inst.formValues[plugin]?.[name],\n set: (plugin, name, value) => {\n const ns = (inst.formValues[plugin] ??= {});\n ns[name] = value;\n },\n });\n inst.dialog.open();\n dispatchLifecycle('open', {});\n}\n\nexport function hide(): void {\n const inst = current;\n if (!inst) return;\n inst.dialog.close('user');\n}\n\nexport function destroy(): void {\n const inst = current;\n if (!inst) return;\n // Abort the per-init signal first so plugins observing ctx.signal can clean up.\n inst.initAbort.abort();\n // Cancel any in-flight submit.\n inst.currentSubmit?.abort();\n inst.registry.destroy();\n // Drop any annotated screenshot the prior session cached. Without this an\n // HMR-reload of the consumer would resurrect last-session pins/screenshot.\n clearAnnotationCache();\n // Tear down dialog + overlay from the host's shadow DOM.\n try {\n inst.dialog.root.remove();\n inst.overlayHost.layer.remove();\n } catch { /* swallow */ }\n inst.hostElement.onTriggerClick = null;\n current = null;\n}\n\nexport function status(): BeaconStatus {\n const inst = current;\n if (!inst) {\n return { ready: false, transport: 'idle', plugins: {} };\n }\n return {\n ready: true,\n transport: 'idle',\n plugins: inst.registry.status(),\n };\n}\n\nexport function on<E extends SystemEvent>(\n event: E,\n handler: (payload: SystemEventPayload<E>) => void,\n): () => void {\n (systemHandlers[event] as Set<(p: SystemEventPayload<E>) => void>).add(handler);\n return () => off(event, handler);\n}\n\nexport function off<E extends SystemEvent>(\n event: E,\n handler: (payload: SystemEventPayload<E>) => void,\n): void {\n (systemHandlers[event] as Set<(p: SystemEventPayload<E>) => void>).delete(handler);\n}\n\n// ── Internal ──────────────────────────────────────────\n\nfunction ensureHost(opts: InitOptions, position: Position, theme: Theme): void {\n let existing = document.querySelector<LaunchKitBeacon>(BEACON_TAG);\n if (!existing) {\n // No host in the page — create one with the resolved defaults. Callers can\n // still mount their own <launch-kit-beacon> in JSX for slot trigger control.\n existing = document.createElement(BEACON_TAG) as LaunchKitBeacon;\n existing.setAttribute('position', position);\n existing.setAttribute('theme', theme);\n if (position === 'hidden') {\n existing.style.position = 'absolute';\n existing.style.left = '-9999px';\n }\n (document.body ?? document.documentElement).appendChild(existing);\n return;\n }\n\n // Host already in the DOM (JSX-mounted). §8: JS init wins on attribute\n // conflict — but only when the consumer EXPLICITLY passed that attribute\n // via init(opts). When init() omits position/theme, the JSX attribute is\n // authoritative — overwriting with our default (\"bottom-right\") would\n // silently relocate a slotted-trigger consumer's button to the corner.\n if (opts.position !== undefined) existing.setAttribute('position', position);\n if (opts.theme !== undefined) existing.setAttribute('theme', theme);\n}\n\nfunction resolvePluginList(opts: InitOptions): BeaconPlugin[] {\n // Semantic (§3): `plugins` overrides the default preset.\n // `defaultPlugins: false` strips the preset (relevant when no `plugins` given).\n if (opts.plugins) return opts.plugins;\n if (opts.defaultPlugins === false) return [];\n return defaultPreset();\n}\n\nfunction defaultPreset(): BeaconPlugin[] {\n return [presetMetadata(), presetErrors(), presetDomEle(), presetDomSS()];\n}\n\nfunction debugFromUrl(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return new URLSearchParams(window.location.search).has('lsbeacon-debug');\n } catch {\n return false;\n }\n}\n\nfunction makeCtxForPlugin(name: string): BeaconCtx {\n const inst = current;\n const host: CtxHost = {\n getCaptured: (n) => inst?.capturedEntries[n],\n getFormValues: (pluginName) => {\n if (!inst) return {};\n return (inst.formValues[pluginName] ??= {});\n },\n getCaptureSignal: () => inst?.currentSubmit?.signal,\n getInitSignal: () => inst!.initAbort.signal,\n requestMode: async (mode: Mode) => {\n if (!inst) return () => {};\n return inst.dialog.requestMode(mode);\n },\n overlay: (opts) => {\n if (!inst) return () => {};\n return attachOverlay(inst.overlayHost, opts.render);\n },\n onLifecycle: (ev, handler) => {\n if (!inst) return () => {};\n const set = inst.lifecycleHandlers[ev];\n set.add(handler);\n return () => set.delete(handler);\n },\n };\n return createCtx(name, host);\n}\n\nfunction dispatchLifecycle(\n ev: 'open' | 'close' | 'beforeSubmit' | 'afterSubmit',\n e: BeaconLifecycleEvent,\n): void {\n const inst = current;\n if (!inst) return;\n for (const fn of inst.lifecycleHandlers[ev]) {\n try { fn(e); } catch (err) {\n if (inst.debug) console.error('[beacon] lifecycle handler threw:', err);\n }\n }\n}\n\nfunction dispatchSystem<E extends SystemEvent>(event: E, payload: SystemEventPayload<E>): void {\n for (const fn of systemHandlers[event] as Set<(p: SystemEventPayload<E>) => void>) {\n try { fn(payload); } catch (err) {\n if (current?.debug) console.error('[beacon] system handler threw:', err);\n }\n }\n}\n\nfunction handlePluginError(err: PluginErrorReport): void {\n dispatchSystem('plugin:error', { plugin: err.plugin, error: err.error, at: err.at });\n const inst = current;\n if (!inst) return;\n if (inst.healthIndicator === 'always' || (inst.healthIndicator === 'dev' && inst.debug)) {\n inst.hostElement.setHealthIndicator(true);\n }\n if (inst.debug) console.warn(`[beacon] plugin \"${err.plugin}\" ${err.at} failed:`, err.error);\n}\n\nfunction resetFormState(): void {\n const inst = current;\n if (!inst) return;\n inst.dialog.resetState();\n inst.dialog.clearPluginPanels();\n inst.formValues = {};\n}\n\nasync function runSubmit(): Promise<void> {\n const inst = current;\n if (!inst) return;\n if (inst.currentSubmit) return;\n\n const description = inst.dialog.getDescription().trim();\n if (!description) {\n inst.dialog.setStatus('Description is required', 'error');\n return;\n }\n\n inst.currentSubmit = new AbortController();\n inst.capturedEntries = {};\n inst.dialog.setSubmitting(true);\n inst.dialog.setStatus('Capturing…');\n\n let payload: FeedbackPayload | null = null;\n try {\n const captured = await inst.registry.capture(\n (n) => inst.capturedEntries[n],\n (err) => handlePluginError(err),\n );\n inst.capturedEntries = captured;\n\n payload = assemblePayload(inst, description, captured);\n\n // beforeSubmit — first veto wins.\n let cancelReason: string | null = null;\n const cancel = (reason: string) => { if (cancelReason === null) cancelReason = reason; };\n dispatchLifecycle('beforeSubmit', { payload, cancel });\n if (cancelReason !== null) {\n inst.dialog.setSubmitting(false);\n inst.dialog.setStatus(`Cancelled: ${cancelReason}`, 'error');\n return;\n }\n\n inst.dialog.setStatus('Sending…');\n const response: TransportResponse = await postFeedback(\n inst.endpoint,\n payload,\n inst.headers,\n inst.currentSubmit.signal,\n inst.credentials,\n );\n\n dispatchLifecycle('afterSubmit', { payload, response });\n inst.dialog.setSubmitting(false);\n\n if (response.ok) {\n dispatchSystem('submit:success', { payload, response });\n inst.dialog.setSubmitSucceeded(true);\n inst.dialog.setStatus(inst.labels.sentSuccess, 'success');\n // Close after a beat so the user sees the confirmation. The\n // submitSucceeded flag short-circuits the discard guard if the user\n // clicks X during this window.\n window.setTimeout(() => {\n if (current === inst) inst.dialog.close('submitted');\n resetFormState();\n }, 1500);\n } else {\n dispatchSystem('submit:error', { payload, error: new Error(`HTTP ${response.status}`) });\n inst.dialog.setStatus(`Failed (${response.status})`, 'error');\n }\n } catch (err) {\n inst.dialog.setSubmitting(false);\n const error = err instanceof Error ? err : new Error(String(err));\n if (payload) {\n dispatchSystem('submit:error', { payload, error });\n }\n inst.dialog.setStatus(`Failed: ${error.message}`, 'error');\n } finally {\n inst.currentSubmit = null;\n }\n}\n\nfunction assemblePayload(\n inst: BeaconInstance,\n description: string,\n pluginEntries: Record<string, PluginEntry>,\n): FeedbackPayload {\n const meta = buildMetadata();\n const ctx = inst.context?.();\n return {\n description,\n severity: inst.dialog.getSeverity(),\n metadata: meta,\n ...(ctx ? { context: ctx } : {}),\n plugins: pluginEntries,\n };\n}\n\nfunction buildMetadata(): PayloadMetadata {\n const url = window.location.href;\n const ref = document.referrer;\n const theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' as const : 'light' as const;\n return {\n url,\n ...(ref ? { referrer: ref } : {}),\n userAgent: navigator.userAgent,\n viewport: {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n screen: {\n w: window.screen.width,\n h: window.screen.height,\n },\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n locale: navigator.language,\n theme,\n capturedAt: new Date().toISOString(),\n };\n}\n\n// ── Test access ──────────────────────────────────────────\n// __testing exposes innards for vitest. Not part of public API.\n\nexport const __testing = {\n resetForTests(): void {\n destroy();\n for (const set of Object.values(systemHandlers)) set.clear();\n },\n getCurrent(): unknown {\n return current;\n },\n};\n\n// Re-exports so consumers see Severity etc. via core; primary export route is index.ts.\nexport type { Severity, BeaconStatus, PluginStatus };\n","// Public entry point for the beacon module.\n//\n// Importing this module registers <launch-kit-beacon> via customElements.define.\n// No other side effects. All other behavior is gated behind init().\n\nimport { defineBeaconElement } from './element';\n\ndefineBeaconElement();\n\nexport { init, show, hide, destroy, on, off, status } from './core';\nexport {\n metadata,\n errors,\n domEle,\n domSS,\n liveMonitor,\n startMonitor,\n stopMonitor,\n probe,\n isMonitorActive,\n currentMonitorUrl,\n} from './plugins';\nexport type { LiveMonitorOptions, MonitorConfig } from './plugins';\nexport type {\n BeaconCtx,\n BeaconPlugin,\n BeaconLifecycleEvent,\n BeaconStatus,\n FeedbackPayload,\n FormField,\n InitOptions,\n LabelMap,\n PluginEntry,\n PluginFailureEntry,\n PluginStatus,\n PluginSuccessEntry,\n Position,\n Severity,\n SystemEvent,\n Theme,\n TransportResponse,\n} from './types';\nexport { isPluginFailure } from './types';\n"],"names":["beaconStyles","GLOBAL_STYLE_ID","ensureBeaconBodyStyles","tag","SVG_NS","iconMegaphone","s","p1","p2","BEACON_TAG","HTMLElementBase","LaunchKitBeacon","style","text","_a","assigned","el","label","span","visible","defineBeaconElement","createCtx","pluginName","host","name","mode","opts","ev","handler","DuplicatePluginNameError","createRegistry","plugins","seen","p","entries","plugin","makeCtx","onError","e","teardown","err","error","_getCaptured","out","result","entry","wrapResult","wrapFailure","version","v","postFeedback","endpoint","payload","headers","signal","credentials","resolvedHeaders","resolveHeaders","response","body","renderFields","slot","fields","field","wrap","desc","control","renderControl","_b","current","root","input","initial","ta","sel","opt","o","group","iconClose","DialogView","labels","severities","callbacks","header","title","closeBtn","descField","descLabel","sevField","sevLabel","sev","actions","released","on","reason","value","kind","submitting","sources","formValuesHost","src","panel","titleEl","cleanup","fn","defaultLabels","createOverlayHost","shadow","layer","attachOverlay","render","getUaData","nav","b","metadata","uaData","MAX_EVENTS","MESSAGE_LIMIT","STACK_LIMIT","SOURCE_LIMIT","DEDUPE_WINDOW_MS","BEACON_STACK_PATTERN","trunc","limit","signature","message","stack","stackHead","fromBeacon","safeStringify","createEventBuffer","buffer","recentSignatures","listeners","installed","onRejection","push","event","sig","last","errMessage","errStack","errors","ctx","uninstall","wrapper","summary","dot","list","update","events","count","li","msg","unsub","MAX_DEPTH","SHADOW_SEPARATOR","isUniqueId","id","tagWithClasses","classes","c","nthOfTypeIndex","parent","buildSelector","target","parts","separators","depth","base","part","currentClasses","detectReact","keys","k","fiber","i","f","type","detectVue","anyEl","vueParent","detectAngular","ng","cmp","ctor","detectSvelte","detectFramework","OUTER_HTML_LIMIT","PARENT_OUTER_HTML_LIMIT","SELECTOR_LIMIT","ID_LIMIT","CLASSLIST_MAX_ENTRIES","CLASS_NAME_LIMIT","STYLE_VALUE_LIMIT","USEFUL_STYLE_PROPS","truncate","max","pickStyles","computed","prop","capClassList","captureElement","rect","rawSelector","rawId","framework","MARKER_RADIUS","MARKER_STROKE","MARKER_TEXT","OUTLINE_WIDTH","DEFAULT_ACCENT","drawMarkers","screenshotDataUrl","pins","viewport","accent","img","loadImage","canvas","scaleX","scaleY","pin","getFreshRect","x","y","w","h","cx","cy","r","found","resolve","reject","NO_CAPTURE_CLASS","DEFAULT_HINT","withAlpha","color","alphaHex","createPickModeOverlay","ACCENT","ACCENT_BORDER","ACCENT_GLOW","styleTag","frame","hint","SPINNER_HTML","escapeHtml","tracked","makeMarker","num","m","makeOutline","placeAt","isStale","opacity","hide","reposition","liveTarget","fr","raf","schedule","anchor","marker","outline","ICON_CLOSE","ICON_CHECK","showPinPopover","popover","POPOVER_W","POPOVER_H","left","top","textarea","close","handleGlobalKey","action","note","startPicker","shadowRoot","onHover","accentFill","tooltip","previousCursor","resolved","resolvePromise","promise","res","isWidgetElement","node","isCustomElement","findTarget","candidates","safety","next","positionOutline","cls","above","handleMove","handlePointerDown","swallow","handleKey","finish","htmlToImage","load","TRANSPARENT_PIXEL","isUrlSafeForCanvas","rawUrl","crossOriginAttr","neutralizeCrossOriginImages","stashedImg","stashedSvg","svgImg","href","xlink","url","expandLayoutForFullPage","scrollContainers","cs","overflowingY","overflowingX","savedWindowX","savedWindowY","savedContainerScrolls","touched","cur","cssText","scrollLeft","scrollTop","freezeAnimations","captureGate","captureScreenshot","priorGate","releaseGate","doCaptureScreenshot","quality","pixelRatio","excludeShadowRoot","excludeHosts","fullPage","lib","filter","restoreImages","restoreLayout","restoreAnimations","disposed","dispose","html","width","height","cached","setAnnotationCache","getAnnotationCache","clearAnnotationCache","iconTrash","paths","d","domEle","maxPins","pinElements","cachedAnnotatedDataUrl","regenToken","headerEl","listEl","previewEl","btnEl","reset","renderList","renderPreview","findShadowRoot","resolveAccent","enterAnnotateMode","release","overlay","keepPicking","captured","regenerateScreenshot","myToken","beaconHosts","shot","markers","annotated","deletePin","n","idx","row","meta","noteInput","del","isPluginFailure","domSS","domEleEntry","readPinsFromEntry","readAccent","pinsRaw","POS_STORAGE_KEY","createMonitorOverlay","startedAt","chip","recDot","recLabel","sep","timer","stopBtn","urlEl","readSavedPos","defaultPos","applyPos","clamp","raw","parsed","pos","maxX","maxY","dragging","activePointerId","grabOffset","onPointerDown","onPointerMove","endDrag","onResize","tick","elapsed","formatElapsed","timerId","seconds","pad","TEXT_LIMIT","INTERACTIVE_SELECTOR","HTML_LIMIT","MAX_OVERLAYS","truncText","trimmed","describeTarget","ariaLabel","testid","ancestor","overlaysAtPoint","all","z","installClickCapture","cb","handle","me","hit","hitMatches","openDialogs","bodyPe","overlays","onClick","onMouseDown","installRouteCapture","originalPush","originalReplace","lastUrl","emit","via","to","from","args","ret","onPop","onHash","installDialogCapture","selector","obs","mutations","_c","_d","dialogs","installSubmitCapture","form","hasValue","installDomCapture","undoClick","undoRoute","undoDialog","undoSubmit","URL_LIMIT","BODY_LIMIT","REDACTED","MUTATING_METHODS","SECRET_PATTERNS","SENSITIVE_KEYS","redactString","re","redactJsonInPlace","redactBody","contentType","captureBody","original","cap","readRequestBody","init","detectAuth","getRequestContentType","buildRequestCapture","method","hasAuth","bodyText","capture","wrapFetch","wrapped","start","request","durationMs","failed","ct","readXhrSendBody","wrapXhr","proto","originalOpen","originalSend","originalSetRequestHeader","state","rest","lower","onLoadEnd","rt","installNetworkCapture","undoFetch","undoXhr","FLUSH_INTERVAL_MS","FLUSH_AT_COUNT","MAX_BUFFER","MonitorTransport","batch","blob","SESSION_URL_KEY","SESSION_ID_KEY","SESSION_VERBOSE_KEY","SESSION_DEADLINE_KEY","DEFAULT_MAX_SESSION_MS","PROBE_DATA_LIMIT","active","randomSessionId","safeSerialize","walk","notify","stamp","partial","enqueue","persistSession","clearPersistedSession","readPersistedSession","verbose","deadlineRaw","deadlineMs","emitErrorEvent","config","stop","maxMs","sessionId","transport","errorsBuffer","uninstallErrors","existing","drainedThrough","errorsUnsub","net","dom","deadlineTimer","tearDownActive","suspend","probe","data","isActive","currentUrl","subscribe","resumeIfPersisted","persisted","liveMonitor","panelRoot","unsubscribeActive","lastUrlInput","mountOverlay","session.stop","session.currentUrl","destroyOverlay","renderInactive","urlInput","startBtn","verboseLabel","verboseInput","help","session.start","renderActive","rec","session.isActive","session.resumeIfPersisted","unsubscribeOverlay","session.subscribe","onAbort","session.suspend","systemHandlers","destroy","initAbort","resolvePluginList","position","theme","ensureHost","hostElement","overlayHost","dialog","runSubmit","dispatchLifecycle","resetFormState","registry","instance","debugFromUrl","show","makeCtxForPlugin","handlePluginError","dispatchSystem","inst","ns","status","off","defaultPreset","presetMetadata","presetErrors","presetDomEle","presetDomSS","set","description","assemblePayload","cancelReason","pluginEntries","buildMetadata","ref"],"mappings":"AAKO,MAAMA,KAAe,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAyrB7BC,KAAkB;AAOjB,SAASC,KAA+B;AAE7C,MADI,OAAO,WAAa,OAAe,CAAC,SAAS,QAC7C,SAAS,eAAeD,EAAe,EAAG;AAC9C,QAAME,IAAM,SAAS,cAAc,OAAO;AAC1C,EAAAA,EAAI,KAAKF,IACTE,EAAI,cAAcH,IAClB,SAAS,KAAK,YAAYG,CAAG;AAC/B;AClsBA,MAAMC,IAAS;AAEf,SAASC,KAA4B;AACnC,QAAMC,IAAI,SAAS,gBAAgBF,GAAQ,KAAK;AAChD,EAAAE,EAAE,aAAa,WAAW,WAAW,GACrCA,EAAE,aAAa,QAAQ,MAAM,GAC7BA,EAAE,aAAa,UAAU,cAAc,GACvCA,EAAE,aAAa,gBAAgB,GAAG,GAClCA,EAAE,aAAa,kBAAkB,OAAO,GACxCA,EAAE,aAAa,mBAAmB,OAAO;AACzC,QAAMC,IAAK,SAAS,gBAAgBH,GAAQ,MAAM;AAClD,EAAAG,EAAG,aAAa,KAAK,wBAAwB;AAC7C,QAAMC,IAAK,SAAS,gBAAgBJ,GAAQ,MAAM;AAClD,SAAAI,EAAG,aAAa,KAAK,8BAA8B,GACnDF,EAAE,YAAYC,CAAE,GAAGD,EAAE,YAAYE,CAAE,GAC5BF;AACT;AAEO,MAAMG,IAAa,qBAQpBC,KACJ,OAAO,cAAgB,MACnB,cACC,MAAM;AAAC;AAEP,MAAMC,WAAwBD,GAAgB;AAAA,EAA9C,cAAA;AAAA,UAAA,GAAA,SAAA,GASL,KAAA,iBAAsC;AAAA,EAAA;AAAA,EAEtC,oBAAoB;AAClB,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS,KAAK,aAAa,EAAE,MAAM,QAAQ;AAChD,UAAME,IAAQ,SAAS,cAAc,OAAO;AAC5C,IAAAA,EAAM,cAAcZ,IACpB,KAAK,OAAO,YAAYY,CAAK,GAE7B,KAAK,cAAc,SAAS,cAAc,MAAM,GAChD,KAAK,YAAY,OAAO,WACxB,KAAK,OAAO,YAAY,KAAK,WAAW,GAExC,KAAK,iBAAiB,SAAS,cAAc,QAAQ,GACrD,KAAK,eAAe,OAAO,UAC3B,KAAK,eAAe,YAAY,0BAChC,KAAK,eAAe,YAAYP,IAAe;AAC/C,UAAMQ,IAAO,SAAS,cAAc,MAAM;AAC1C,IAAAA,EAAK,cAAc,YACnB,KAAK,eAAe,YAAYA,CAAI,GAEpC,KAAK,YAAY,SAAS,cAAc,MAAM,GAC9C,KAAK,UAAU,YAAY,qBAC3B,KAAK,eAAe,YAAY,KAAK,SAAS,GAE9C,KAAK,OAAO,YAAY,KAAK,cAAc,GAC3C,KAAK,eAAe,iBAAiB,SAAS,MAAA;ADvE3C,UAAAC;ACuEiD,cAAAA,IAAA,KAAK,mBAAL,gBAAAA,EAAA;AAAA,KAAuB,GAE3E,KAAK,YAAY,iBAAiB,cAAc,MAAM;AACpD,YAAMC,IAAW,KAAK,YAAY,iBAAA;AAClC,UAAIA,EAAS,SAAS,GAAG;AACvB,aAAK,eAAe,MAAM,UAAU;AACpC,mBAAWC,KAAMD;AACf,UAAAC,EAAG,iBAAiB,SAAS,MAAA;AD9EhC,gBAAAF;AC8EsC,oBAAAA,IAAA,KAAK,mBAAL,gBAAAA,EAAA;AAAA,WAAuB;AAAA,MAE9D;AACE,aAAK,eAAe,MAAM,UAAU;AAAA,IAExC,CAAC,GAEI,KAAK,aAAa,UAAU,KAAG,KAAK,aAAa,YAAY,cAAc,GAC3E,KAAK,aAAa,OAAO,KAAG,KAAK,aAAa,SAAS,MAAM;AAAA,EACpE;AAAA,EAEA,gBAAgBG,GAAe;AAC7B,QAAI,CAAC,KAAK,eAAgB;AAC1B,UAAMC,IAAO,KAAK,eAAe,cAAc,MAAM;AACrD,IAAIA,QAAW,cAAcD;AAAA,EAC/B;AAAA,EAEA,mBAAmBE,GAAkB;AD/FhC,QAAAL;ACgGH,KAAAA,IAAA,KAAK,cAAL,QAAAA,EAAgB,UAAU,OAAO,WAAWK;AAAA,EAC9C;AACF;AAMO,SAASC,KAA4B;AAC1C,EAAI,OAAO,SAAW,OAAe,OAAO,iBAAmB,OAC1D,eAAe,IAAIX,CAAU,KAChC,eAAe,OAAOA,GAAYE,EAAe;AAErD;ACjFO,SAASU,GAAUC,GAAoBC,GAA0B;AACtE,SAAO;AAAA,IACL,YAAAD;AAAA,IACA,UAAU,CAACE,MAASD,EAAK,YAAYC,CAAI;AAAA,IACzC,IAAI,aAAa;AAAE,aAAOD,EAAK,cAAcD,CAAU;AAAA,IAAG;AAAA,IAC1D,aAAa,CAACG,MAASF,EAAK,YAAYE,CAAI;AAAA,IAC5C,SAAS,CAACC,MAASH,EAAK,QAAQG,CAAI;AAAA,IACpC,IAAI,CAACC,GAAIC,MAAYL,EAAK,YAAYI,GAAIC,CAAO;AAAA,IACjD,IAAI,SAAS;AAAE,aAAOL,EAAK,cAAA;AAAA,IAAiB;AAAA,IAC5C,eAAe,MAAMA,EAAK,iBAAA;AAAA,EAAiB;AAE/C;ACnCO,MAAMM,WAAiC,MAAM;AAAA,EAClD,YAAYL,GAAc;AACxB,UAAM,2BAA2BA,CAAI,GAAG,GACxC,KAAK,OAAO;AAAA,EACd;AACF;AAuBO,SAASM,GAAeC,GAAmC;AAChE,QAAMC,wBAAW,IAAA;AACjB,aAAWC,KAAKF,GAAS;AACvB,QAAIC,EAAK,IAAIC,EAAE,IAAI,EAAG,OAAM,IAAIJ,GAAyBI,EAAE,IAAI;AAC/D,IAAAD,EAAK,IAAIC,EAAE,IAAI;AAAA,EACjB;AAEA,QAAMC,IAA8BH,EAAQ,IAAI,CAACI,OAAY;AAAA,IAC3D,QAAAA;AAAA;AAAA,IAEA,KAAK;AAAA,IACL,QAAQ,EAAE,OAAO,UAAU,UAAU,EAAA;AAAA,EAAE,EACvC;AAEF,SAAO;AAAA,IACL,SAAAD;AAAA,IAEA,QAAQE,GAASC,GAAS;AACxB,iBAAWC,KAAKJ;AAEd,YADAI,EAAE,MAAMF,EAAQE,EAAE,OAAO,IAAI,GACzB,EAACA,EAAE,OAAO;AACd,cAAI;AACF,kBAAMC,IAAWD,EAAE,OAAO,UAAUA,EAAE,GAAG;AACzC,YAAI,OAAOC,KAAa,eAAYD,EAAE,WAAWC;AAAA,UACnD,SAASC,GAAK;AACZ,kBAAMC,IAAQD,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAChE,YAAAF,EAAE,SAAS;AAAA,cACT,OAAO;AAAA,cACP,UAAUA,EAAE,OAAO,WAAW;AAAA,cAC9B,OAAO,EAAE,SAASG,EAAM,SAAS,GAAIA,EAAM,QAAQ,EAAE,OAAOA,EAAM,MAAA,IAAU,CAAA,GAAK,IAAI,YAAA;AAAA,YAAY,GAEnGJ,EAAQ,EAAE,QAAQC,EAAE,OAAO,MAAM,OAAAG,GAAO,IAAI,aAAa;AAAA,UAC3D;AAAA,IAEJ;AAAA,IAEA,UAAU;AHpEP,UAAA3B;AGqED,iBAAWwB,KAAKJ,GAAS;AACvB,YAAI;AAAE,WAAApB,IAAAwB,EAAE,aAAF,QAAAxB,EAAA,KAAAwB;AAAA,QAAgB,QAAQ;AAAA,QAAgB;AAC9C,QAAAA,EAAE,WAAW;AAAA,MACf;AAAA,IACF;AAAA,IAEA,MAAM,QAAQI,GAAcL,GAAS;AACnC,YAAMM,IAAmC,CAAA;AACzC,iBAAWL,KAAKJ;AACd,YAAKI,EAAE,OAAO;AACd,cAAI;AACF,kBAAMM,IAAS,MAAMN,EAAE,OAAO,QAAQA,EAAE,GAAG,GACrCO,IAAQC,GAAWF,GAAQN,EAAE,OAAO,OAAO;AACjD,YAAIO,MAAU,SACZF,EAAIL,EAAE,OAAO,IAAI,IAAIO;AAAA,UAEzB,SAASL,GAAK;AACZ,kBAAMC,IAAQD,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAChE,YAAAG,EAAIL,EAAE,OAAO,IAAI,IAAIS,GAAYN,CAAK,GACtCH,EAAE,SAAS;AAAA,cACT,OAAO;AAAA,cACP,UAAUA,EAAE,OAAO,WAAW;AAAA,cAC9B,OAAO,EAAE,SAASG,EAAM,SAAS,GAAIA,EAAM,QAAQ,EAAE,OAAOA,EAAM,MAAA,IAAU,CAAA,GAAK,IAAI,UAAA;AAAA,YAAU,GAEjGJ,EAAQ,EAAE,QAAQC,EAAE,OAAO,MAAM,OAAAG,GAAO,IAAI,WAAW;AAAA,UACzD;AAEF,aAAOE;AAAA,IACT;AAAA,IAEA,SAAS;AACP,YAAMA,IAAoC,CAAA;AAC1C,iBAAWL,KAAKJ;AACd,QAAAS,EAAIL,EAAE,OAAO,IAAI,IAAIA,EAAE;AAEzB,aAAOK;AAAA,IACT;AAAA,EAAA;AAEJ;AASO,SAASG,GAAWF,GAAiBI,GAAsC;AAChF,MAAIJ,KAAW,KAA8B,QAAO;AACpD,QAAMK,IAAID,KAAW;AACrB,SAAI,MAAM,QAAQJ,CAAM,KAAK,OAAOA,KAAW,WACtC,EAAE,GAAAK,GAAG,OAAOL,EAAA,IAGd,EAAE,GAAIA,GAAoC,GAAAK,EAAA;AACnD;AAEO,SAASF,GAAYN,GAA2B;AACrD,SAAO;AAAA,IACL,OAAOA,EAAM;AAAA,IACb,GAAIA,EAAM,QAAQ,EAAE,OAAOA,EAAM,MAAA,IAAU,CAAA;AAAA,EAAC;AAEhD;ACpIA,eAAsBS,GACpBC,GACAC,GACAC,GACAC,GACAC,IAAkC,QACN;AAC5B,QAAMC,IAA0C,MAAMC,GAAeJ,CAAO,GACtEK,IAAW,MAAM,MAAMP,GAAU;AAAA,IACrC,QAAQ;AAAA,IACR,aAAAI;AAAA,IACA,SAAS,EAAE,gBAAgB,oBAAoB,GAAGC,EAAA;AAAA,IAClD,MAAM,KAAK,UAAUJ,CAAO;AAAA,IAC5B,QAAAE;AAAA,EAAA,CACD,GAGKK,KADcD,EAAS,QAAQ,IAAI,cAAc,KAAK,IAC1B,SAAS,kBAAkB,IACzD,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAM,IAAI,IACtC,MAAMA,EAAS,KAAA;AAEnB,SAAO,EAAE,IAAIA,EAAS,IAAI,QAAQA,EAAS,QAAQ,MAAAC,EAAA;AACrD;AAEA,eAAeF,GAAeJ,GAAqE;AACjG,SAAKA,IACD,OAAOA,KAAY,aACN,MAAMA,EAAA,KACJ,CAAA,IAEZA,IALc,CAAA;AAMvB;ACtBO,SAASO,GAAaC,GAAmBC,GAAqBvC,GAAuB;AAC1F,aAAWwC,KAASD,GAAQ;AAC1B,UAAME,IAAO,SAAS,cAAc,KAAK;AAGzC,QAFAA,EAAK,YAAY,gBAEbD,EAAM,OAAO;AACf,YAAM9C,IAAQ,SAAS,cAAc,OAAO;AAC5C,MAAAA,EAAM,YAAY,gBAClBA,EAAM,cAAc8C,EAAM,OAC1BC,EAAK,YAAY/C,CAAK;AAAA,IACxB;AACA,QAAI8C,EAAM,aAAa;AACrB,YAAME,IAAO,SAAS,cAAc,KAAK;AACzC,MAAAA,EAAK,YAAY,sBACjBA,EAAK,cAAcF,EAAM,aACzBC,EAAK,YAAYC,CAAI;AAAA,IACvB;AAEA,UAAMC,IAAUC,GAAcJ,GAAOxC,CAAI;AACzC,IAAAyC,EAAK,YAAYE,CAAO,GACxBL,EAAK,YAAYG,CAAI;AAAA,EACvB;AACF;AAEA,SAASG,GAAcJ,GAAkBxC,GAA8B;ALhChE,MAAAT,GAAAsD;AKiCL,QAAMC,IAAU9C,EAAK,IAAIwC,EAAM,IAAI;AAEnC,UAAQA,EAAM,MAAA;AAAA,IACZ,KAAK,UAAU;AACb,YAAMO,IAAO,SAAS,cAAc,OAAO;AAC3C,MAAAA,EAAK,YAAY;AACjB,YAAMC,IAAQ,SAAS,cAAc,OAAO;AAC5C,aAAAA,EAAM,OAAO,YACbA,EAAM,UAAWF,KAAmCN,EAAM,gBAAgB,IAC1EQ,EAAM,iBAAiB,UAAU,MAAMhD,EAAK,IAAIwC,EAAM,MAAMQ,EAAM,OAAO,CAAC,GAC1ED,EAAK,YAAYC,CAAK,GACtBhD,EAAK,IAAIwC,EAAM,MAAMQ,EAAM,OAAO,GAC3BD;AAAA,IACT;AAAA,IAEA,KAAK,QAAQ;AACX,YAAMC,IAAQ,SAAS,cAAc,OAAO;AAC5C,MAAAA,EAAM,OAAO,QACbA,EAAM,YAAY;AAClB,YAAMC,IAAYH,KAAkCN,EAAM,gBAAgB;AAC1E,aAAAQ,EAAM,QAAQC,GACVT,EAAM,gBAAaQ,EAAM,cAAcR,EAAM,cACjDQ,EAAM,iBAAiB,SAAS,MAAMhD,EAAK,IAAIwC,EAAM,MAAMQ,EAAM,KAAK,CAAC,GACvEhD,EAAK,IAAIwC,EAAM,MAAMS,CAAO,GACrBD;AAAA,IACT;AAAA,IAEA,KAAK,YAAY;AACf,YAAME,IAAK,SAAS,cAAc,UAAU;AAC5C,MAAAA,EAAG,YAAY;AACf,YAAMD,IAAYH,KAAkCN,EAAM,gBAAgB;AAC1E,aAAAU,EAAG,QAAQD,GACPT,EAAM,gBAAaU,EAAG,cAAcV,EAAM,cAC1CA,EAAM,SAAMU,EAAG,OAAOV,EAAM,OAChCU,EAAG,iBAAiB,SAAS,MAAMlD,EAAK,IAAIwC,EAAM,MAAMU,EAAG,KAAK,CAAC,GACjElD,EAAK,IAAIwC,EAAM,MAAMS,CAAO,GACrBC;AAAA,IACT;AAAA,IAEA,KAAK,UAAU;AACb,YAAMC,IAAM,SAAS,cAAc,QAAQ;AAC3C,MAAAA,EAAI,YAAY;AAChB,YAAMF,IAAYH,KAAkCN,EAAM,kBAAgBjD,IAAAiD,EAAM,QAAQ,CAAC,MAAf,gBAAAjD,EAAkB,UAAS;AACrG,iBAAW6D,KAAOZ,EAAM,SAAS;AAC/B,cAAMa,IAAI,SAAS,cAAc,QAAQ;AACzC,QAAAA,EAAE,QAAQD,EAAI,OACdC,EAAE,cAAcD,EAAI,SAASA,EAAI,OAC7BA,EAAI,UAAUH,MAASI,EAAE,WAAW,KACxCF,EAAI,YAAYE,CAAC;AAAA,MACnB;AACA,aAAAF,EAAI,iBAAiB,UAAU,MAAMnD,EAAK,IAAIwC,EAAM,MAAMW,EAAI,KAAK,CAAC,GACpEnD,EAAK,IAAIwC,EAAM,MAAMS,CAAO,GACrBE;AAAA,IACT;AAAA,IAEA,KAAK,SAAS;AACZ,YAAMG,IAAQ,SAAS,cAAc,KAAK;AAC1C,MAAAA,EAAM,YAAY;AAClB,YAAML,IAAYH,KAAkCN,EAAM,kBAAgBK,IAAAL,EAAM,QAAQ,CAAC,MAAf,gBAAAK,EAAkB,UAAS;AACrG,iBAAWO,KAAOZ,EAAM,SAAS;AAC/B,cAAM9C,IAAQ,SAAS,cAAc,OAAO;AAC5C,QAAAA,EAAM,YAAY;AAClB,cAAMsD,IAAQ,SAAS,cAAc,OAAO;AAC5C,QAAAA,EAAM,OAAO,SACbA,EAAM,OAAOR,EAAM,MACnBQ,EAAM,QAAQI,EAAI,OACdA,EAAI,UAAUH,MAASD,EAAM,UAAU,KAC3CA,EAAM,iBAAiB,UAAU,MAAMhD,EAAK,IAAIwC,EAAM,MAAMY,EAAI,KAAK,CAAC;AACtE,cAAMzD,IAAO,SAAS,cAAc,MAAM;AAC1C,QAAAA,EAAK,cAAcyD,EAAI,SAASA,EAAI,OACpC1D,EAAM,YAAYsD,CAAK,GACvBtD,EAAM,YAAYC,CAAI,GACtB2D,EAAM,YAAY5D,CAAK;AAAA,MACzB;AACA,aAAAM,EAAK,IAAIwC,EAAM,MAAMS,CAAO,GACrBK;AAAA,IACT;AAAA,IAEA,KAAK,UAAU;AACb,YAAMN,IAAQ,SAAS,cAAc,OAAO;AAC5C,MAAAA,EAAM,OAAO,UACbA,EAAM,YAAY;AAClB,YAAMC,IAAWH,KAAkCN,EAAM;AACzD,aAAIS,MAAY,WAAWD,EAAM,QAAQ,OAAOC,CAAO,IACnDT,EAAM,QAAQ,aAAiB,MAAM,OAAOA,EAAM,GAAG,IACrDA,EAAM,QAAQ,aAAiB,MAAM,OAAOA,EAAM,GAAG,IACrDA,EAAM,SAAS,aAAiB,OAAO,OAAOA,EAAM,IAAI,IAC5DQ,EAAM,iBAAiB,SAAS,MAAM;AACpC,cAAMtB,IAAIsB,EAAM,UAAU,KAAK,SAAY,OAAOA,EAAM,KAAK;AAC7D,QAAAhD,EAAK,IAAIwC,EAAM,MAAMd,CAAC;AAAA,MACxB,CAAC,GACGuB,MAAY,UAAWjD,EAAK,IAAIwC,EAAM,MAAMS,CAAO,GAChDD;AAAA,IACT;AAAA,EAAA;AAEJ;ACrGA,MAAMnE,IAAS;AAEf,SAAS0E,KAAwB;AAC/B,QAAMxE,IAAI,SAAS,gBAAgBF,GAAQ,KAAK;AAChD,EAAAE,EAAE,aAAa,WAAW,WAAW,GACrCA,EAAE,aAAa,QAAQ,MAAM,GAC7BA,EAAE,aAAa,UAAU,cAAc,GACvCA,EAAE,aAAa,gBAAgB,GAAG,GAClCA,EAAE,aAAa,kBAAkB,OAAO,GACxCA,EAAE,aAAa,mBAAmB,OAAO;AACzC,QAAMC,IAAK,SAAS,gBAAgBH,GAAQ,MAAM;AAClD,EAAAG,EAAG,aAAa,MAAM,IAAI,GAAGA,EAAG,aAAa,MAAM,GAAG,GAAGA,EAAG,aAAa,MAAM,GAAG,GAAGA,EAAG,aAAa,MAAM,IAAI;AAC/G,QAAMC,IAAK,SAAS,gBAAgBJ,GAAQ,MAAM;AAClD,SAAAI,EAAG,aAAa,MAAM,GAAG,GAAGA,EAAG,aAAa,MAAM,GAAG,GAAGA,EAAG,aAAa,MAAM,IAAI,GAAGA,EAAG,aAAa,MAAM,IAAI,GAC/GF,EAAE,YAAYC,CAAE,GAAGD,EAAE,YAAYE,CAAE,GAC5BF;AACT;AAEO,MAAMyE,GAAW;AAAA,EAuBtB,YACUC,GACAC,GACAC,GACR;AAHQ,SAAA,SAAAF,GACA,KAAA,aAAAC,GACA,KAAA,YAAAC,GAnBV,KAAQ,mBAA6B,OAErC,KAAQ,aAAmC,EAAE,UAAU,GAAG,MAAM,GAAG,aAAa,EAAA,GAChF,KAAQ,iBAAoC,CAAA,GAE5C,KAAQ,aAAiC,MAGzC,KAAQ,kBAAkB,IAM1B,KAAQ,2BAA2B,GAOjC,KAAK,OAAO,SAAS,cAAc,QAAQ,GAC3C,KAAK,KAAK,YAAY,iBAEtB,KAAK,QAAQ,SAAS,cAAc,KAAK,GACzC,KAAK,MAAM,YAAY,uBACvB,KAAK,KAAK,YAAY,KAAK,KAAK;AAGhC,UAAMC,IAAS,SAAS,cAAc,KAAK;AAC3C,IAAAA,EAAO,YAAY;AACnB,UAAMC,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY,uBAClBA,EAAM,cAAcJ,EAAO,aAC3BG,EAAO,YAAYC,CAAK;AAExB,UAAMC,IAAW,SAAS,cAAc,QAAQ;AAChD,IAAAA,EAAS,OAAO,UAChBA,EAAS,YAAY,mBACrBA,EAAS,aAAa,cAAcL,EAAO,WAAW,GACtDK,EAAS,YAAYP,IAAW,GAChCO,EAAS,iBAAiB,SAAS,MAAM,KAAK,kBAAkB,GAChEF,EAAO,YAAYE,CAAQ,GAC3B,KAAK,MAAM,YAAYF,CAAM,GAK7B,KAAK,KAAK,iBAAiB,UAAU,CAAC7C,MAAM;AAC1C,MAAI,KAAK,mBACJ,KAAK,sBACVA,EAAE,eAAA,GAEE,OAAO,QAAQ,qCAAqC,KACtD,KAAK,KAAK,MAAA;AAAA,IAEd,CAAC;AAGD,UAAMqB,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,YAAY,sBACjB,KAAK,MAAM,YAAYA,CAAI;AAG3B,UAAM2B,IAAY,SAAS,cAAc,KAAK;AAC9C,IAAAA,EAAU,YAAY;AACtB,UAAMC,IAAY,SAAS,cAAc,OAAO;AAChD,IAAAA,EAAU,YAAY,gBACtBA,EAAU,cAAcP,EAAO,kBAC/B,KAAK,eAAe,SAAS,cAAc,UAAU,GACrD,KAAK,aAAa,YAAY,mBAC9B,KAAK,aAAa,cAAcA,EAAO,wBACvC,KAAK,aAAa,OAAO,GACzBM,EAAU,YAAYC,CAAS,GAC/BD,EAAU,YAAY,KAAK,YAAY,GACvC3B,EAAK,YAAY2B,CAAS;AAG1B,UAAME,IAAW,SAAS,cAAc,KAAK;AAC7C,IAAAA,EAAS,YAAY;AACrB,UAAMC,IAAW,SAAS,cAAc,OAAO;AAC/C,IAAAA,EAAS,YAAY,gBACrBA,EAAS,cAAcT,EAAO,eAC9B,KAAK,sBAAsB,SAAS,cAAc,KAAK,GACvD,KAAK,oBAAoB,YAAY;AACrC,eAAWU,KAAOT,GAAY;AAC5B,YAAMN,IAAM,SAAS,cAAc,OAAO;AAC1C,MAAAA,EAAI,YAAY,uBAChBA,EAAI,QAAQ,MAAMe;AAClB,YAAMnB,IAAQ,SAAS,cAAc,OAAO;AAC5C,MAAAA,EAAM,OAAO,SACbA,EAAM,OAAO,mBACbA,EAAM,QAAQmB,GACVA,MAAQ,KAAK,qBACfnB,EAAM,UAAU,IAChBI,EAAI,UAAU,IAAI,UAAU,IAE9BJ,EAAM,iBAAiB,UAAU,MAAM,KAAK,YAAYmB,CAAG,CAAC,GAC5Df,EAAI,YAAYJ,CAAK,GACrBI,EAAI,YAAY,SAAS,eAAe,KAAK,cAAce,CAAG,CAAC,CAAC,GAChE,KAAK,oBAAoB,YAAYf,CAAG;AAAA,IAC1C;AACA,IAAAa,EAAS,YAAYC,CAAQ,GAC7BD,EAAS,YAAY,KAAK,mBAAmB,GAC7C7B,EAAK,YAAY6B,CAAQ,GAGzB,KAAK,aAAa,SAAS,cAAc,KAAK,GAC9C,KAAK,WAAW,YAAY,wBAC5B7B,EAAK,YAAY,KAAK,UAAU,GAGhC,KAAK,WAAW,SAAS,cAAc,KAAK,GAC5C,KAAK,SAAS,YAAY,iBAC1BA,EAAK,YAAY,KAAK,QAAQ;AAE9B,UAAMgC,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,YAAY,kBACpB,KAAK,YAAY,SAAS,cAAc,QAAQ,GAChD,KAAK,UAAU,OAAO,UACtB,KAAK,UAAU,YAAY,sBAC3B,KAAK,UAAU,cAAcX,EAAO,MACpC,KAAK,UAAU,iBAAiB,SAAS,MAAM,KAAK,UAAU,UAAU,GACxEW,EAAQ,YAAY,KAAK,SAAS,GAClChC,EAAK,YAAYgC,CAAO,GAIxB,KAAK,KAAK,iBAAiB,SAAS,MAAM;AACxC,UAAI,KAAK,2BAA2B,GAAG;AACrC,aAAK,4BAA4B;AACjC;AAAA,MACF;AACA,WAAK,UAAU,QAAQ,MAAM;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,YAAYlE,GAAiC;AACjD,SAAK,WAAWA,CAAI,KAAK,GACrB,KAAK,WAAWA,CAAI,MAAM,KAC5B,KAAK,UAAUA,GAAM,EAAI;AAE3B,QAAImE,IAAW;AACf,WAAO,MAAM;AACX,MAAIA,MACJA,IAAW,IACX,KAAK,WAAWnE,CAAI,KAAK,GACrB,KAAK,WAAWA,CAAI,MAAM,KAC5B,KAAK,UAAUA,GAAM,EAAK;AAAA,IAE9B;AAAA,EACF;AAAA,EAEQ,UAAUA,GAAYoE,GAAa;AN/MtC,QAAA/E,GAAAsD;AMgNH,YAAQ3C,GAAA;AAAA,MACN,KAAK,eAAe;AAClB,QAAIoE,KACF,KAAK,aAAa,SAAS,yBAAyB,cAAc,SAAS,gBAAgB,MACvF,KAAK,KAAK,SAGZ,KAAK,4BAA4B,GACjC,KAAK,KAAK,MAAA,OAGP,KAAK,KAAK,aAAW,aAAA,IAC1BzB,KAAAtD,IAAA,KAAK,eAAL,gBAAAA,EAAiB,UAAjB,QAAAsD,EAAA,KAAAtD;AAEF;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,aAAK,MAAM,MAAM,aAAa+E,IAAK,WAAW,IAC9C,KAAK,KAAK,MAAM,UAAUA,IAAK,MAAM;AACrC;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AAEf,cAAMlC,IAAO,KAAK,MAAM,cAA2B,qBAAqB;AACxE,QAAIA,MAAMA,EAAK,MAAM,UAAUkC,IAAK,SAAS;AAC7C;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA,EAIA,OAAO;AACL,IAAI,KAAK,KAAK,QACd,KAAK,aAAA;AAAA,EACP;AAAA,EAEA,MAAMC,IAA+B,QAAQ;AAC3C,IAAI,KAAK,KAAK,QACZ,KAAK,KAAK,MAAA,GAGRA,MAAW,gBAAa,KAAK,SAAS,cAAc;AAAA,EAC1D;AAAA,EAEQ,mBAAmB;AACzB,IAAI,CAAC,KAAK,mBAAmB,KAAK,qBAE5B,CAAC,OAAO,QAAQ,qCAAqC,KAEvD,KAAK,KAAK,QAAM,KAAK,KAAK,MAAA;AAAA,EAChC;AAAA,EAEQ,kBAA2B;AACjC,WAAO,KAAK,aAAa,MAAM,KAAA,EAAO,SAAS;AAAA,EACjD;AAAA,EAEA,mBAAmBC,GAAgB;AACjC,SAAK,kBAAkBA;AAAA,EACzB;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EACA,eAAe9C,GAAW;AACxB,SAAK,aAAa,QAAQA;AAAA,EAC5B;AAAA,EAEA,cAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,YAAYyC,GAAe;AACzB,SAAK,mBAAmBA;AACxB,eAAWf,KAAO,MAAM,KAAK,KAAK,oBAAoB,QAAQ,GAAoB;AAChF,MAAAA,EAAI,UAAU,OAAO,YAAYA,EAAI,QAAQ,QAAQe,CAAG;AACxD,YAAMnB,IAAQI,EAAI,cAAc,OAAO;AACvC,MAAIJ,MAAOA,EAAM,UAAUI,EAAI,QAAQ,QAAQe;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,UAAU7E,GAAcmF,IAAqC,QAAQ;AACnE,SAAK,SAAS,cAAcnF,GAC5B,KAAK,SAAS,UAAU,OAAO,SAAS,SAAS,GAC7CmF,MAAS,UAAQ,KAAK,SAAS,UAAU,IAAIA,CAAI;AAAA,EACvD;AAAA,EAEA,cAAcC,GAAqB;AACjC,SAAK,UAAU,WAAWA,GAC1B,KAAK,UAAU,cAAcA,IAAa,KAAK,OAAO,UAAU,KAAK,OAAO;AAAA,EAC9E;AAAA;AAAA,EAGA,aAAa;AACX,SAAK,aAAa,QAAQ,IAC1B,KAAK,UAAU,IAAI,MAAM,GACzB,KAAK,cAAc,EAAK,GACxB,KAAK,kBAAkB,IACnB,KAAK,WAAW,CAAC,UAAQ,YAAY,KAAK,WAAW,CAAC,CAAC;AAAA,EAC7D;AAAA;AAAA,EAIA,oBAAoBC,GAA8BC,GAGzC;AACP,SAAK,kBAAA;AACL,eAAWC,KAAOF,GAAS;AACzB,YAAMG,IAAQ,SAAS,cAAc,KAAK;AAG1C,UAFAA,EAAM,YAAY,uBAEdD,EAAI,KAAK,OAAO;AAClB,cAAME,IAAU,SAAS,cAAc,KAAK;AAC5C,QAAAA,EAAQ,YAAY,6BACpBA,EAAQ,cAAcF,EAAI,KAAK,OAC/BC,EAAM,YAAYC,CAAO;AAAA,MAC3B;AAEA,UAAI,YAAYF,EAAI;AAClB,QAAAxC,GAAayC,GAAOD,EAAI,KAAK,QAAuB;AAAA,UAClD,KAAK,CAAC5E,MAAS2E,EAAe,IAAIC,EAAI,MAAM5E,CAAI;AAAA,UAChD,KAAK,CAACA,GAAMuE,MAAUI,EAAe,IAAIC,EAAI,MAAM5E,GAAMuE,CAAK;AAAA,QAAA,CAC/D;AAAA,WACI;AACL,cAAMQ,IAAUH,EAAI,KAAK,OAAOC,GAAOD,EAAI,GAAG;AAC9C,QAAI,OAAOG,KAAY,cAAY,KAAK,eAAe,KAAKA,CAAO;AAAA,MACrE;AAEA,WAAK,WAAW,YAAYF,CAAK;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,oBAA0B;AACxB,eAAWG,KAAM,KAAK;AACpB,UAAI;AAAE,QAAAA,EAAA;AAAA,MAAM,QAAQ;AAAA,MAAgB;AAEtC,SAAK,iBAAiB,CAAA,GACtB,KAAK,WAAW,YAAY;AAAA,EAC9B;AAAA,EAEQ,cAAcd,GAAuB;AAC3C,YAAQA,GAAA;AAAA,MACN,KAAK;AAAQ,eAAO,KAAK,OAAO;AAAA,MAChC,KAAK;AAAQ,eAAO,KAAK,OAAO;AAAA,MAChC,KAAK;AAAQ,eAAO,KAAK,OAAO;AAAA,MAChC,KAAK;AAAQ,eAAO,KAAK,OAAO;AAAA,IAAA;AAAA,EAEpC;AAAA,EAEQ,eAAe;AACrB,QAAI;AACF,WAAK,KAAK,UAAA;AAAA,IACZ,QAAQ;AAGN,WAAK,KAAK,KAAA;AAAA,IACZ;AAAA,EACF;AACF;AAEO,SAASe,KAA0B;AACxC,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,cAAc;AAAA,EAAA;AAElB;AC1XO,SAASC,GAAkBC,GAAiC;AACjE,QAAMC,IAAQ,SAAS,cAAc,KAAK;AAC1C,SAAAA,EAAM,YAAY,wBAClBD,EAAO,YAAYC,CAAK,GACjB,EAAE,OAAAA,EAAA;AACX;AAEO,SAASC,GACdtF,GACAuF,GACY;AACZ,QAAMjD,IAAO,SAAS,cAAc,KAAK;AACzC,EAAAtC,EAAK,MAAM,YAAYsC,CAAI;AAC3B,MAAI0C;AACJ,MAAI;AACF,IAAAA,IAAUO,EAAOjD,CAAI;AAAA,EACvB,SAASrB,GAAK;AACZ,UAAAqB,EAAK,OAAA,GACCrB;AAAA,EACR;AACA,SAAO,MAAM;AACX,QAAI;AAAE,MAAA+D,KAAA,QAAAA;AAAA,IAAa,QAAQ;AAAA,IAAgB;AAC3C,IAAI1C,EAAK,cAAYA,EAAK,WAAW,YAAYA,CAAI;AAAA,EACvD;AACF;ACtBA,SAASkD,KAA8E;ARRhF,MAAAjG,GAAAsD;AQSL,QAAM4C,IAAM;AACZ,SAAKA,EAAI,gBAIF;AAAA,IACL,SAJYlG,IAAAkG,EAAI,cAAc,OAAO,KAAK,CAACC,MAAM,CAAC,qBAAqB,KAAKA,EAAE,KAAK,CAAC,MAAxE,gBAAAnG,EAA2E,YACpFsD,IAAA4C,EAAI,cAAc,OAAO,CAAC,MAA1B,gBAAA5C,EAA6B,UAC7B;AAAA,IAGH,QAAQ4C,EAAI,cAAc;AAAA,IAC1B,UAAUA,EAAI,cAAc;AAAA,EAAA,IAPN;AAS1B;AAEO,SAASE,KAAyB;AACvC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AACR,YAAMC,IAASJ,GAAA;AACf,aAAOI,IAAS,EAAE,QAAAA,EAAA,IAAW;AAAA,IAC/B;AAAA,EAAA;AAEJ;ACpBA,MAAMC,KAAa,IACbC,IAAgB,KAChBC,KAAc,KACdC,KAAe,KACfC,KAAmB,KAEnBC,KAAuB;AAE7B,SAASC,EAAM3B,GAA2B4B,GAAmC;AAC3E,MAAK5B;AACL,WAAOA,EAAM,SAAS4B,IAAQ5B,EAAM,MAAM,GAAG4B,CAAK,IAAI5B;AACxD;AAEA,SAAS6B,GAAUC,GAAiBC,GAAmC;AACrE,QAAMC,KAAYD,KAAA,gBAAAA,EAAO,MAAM;AAAA,GAAM,MAAM,GAAG,GAAG,KAAK,SAAQ;AAC9D,SAAO,GAAGD,CAAO,KAAKE,CAAS;AACjC;AAEA,SAASC,GAAWF,GAAoC;AACtD,SAAO,CAAC,CAACA,KAASL,GAAqB,KAAKK,CAAK;AACnD;AAEA,SAASG,GAAclC,GAAwB;AAC7C,MAAI;AACF,WAAO,KAAK,UAAUA,CAAK,EAAE,MAAM,GAAGsB,CAAa;AAAA,EACrD,QAAQ;AACN,WAAO,OAAOtB,CAAK;AAAA,EACrB;AACF;AAQO,SAASmC,KAAiC;AAC/C,QAAMC,IAAiC,CAAA,GACjCC,wBAAuB,IAAA,GACvBC,wBAAgB,IAAA;AACtB,MAAIC,IAAY,IACZjG,GACAkG;AAEJ,WAASC,EAAKC,GAAmC;AAE/C,QADIT,GAAWS,EAAM,KAAK,KACtBA,EAAM,SAAS,wBAAwB,cAAc,KAAKA,EAAM,OAAO,EAAG;AAC9E,UAAMC,IAAMd,GAAUa,EAAM,SAASA,EAAM,KAAK,GAC1CE,IAAOP,EAAiB,IAAIM,CAAG;AACrC,QAAIC,MAAS,UAAaF,EAAM,KAAKE,IAAOnB,IAAkB;AAC5D,MAAAY,EAAiB,IAAIM,GAAKD,EAAM,EAAE;AAClC;AAAA,IACF;AACA,IAAAL,EAAiB,IAAIM,GAAKD,EAAM,EAAE,GAClCN,EAAO,KAAKM,CAAK,GACbN,EAAO,SAASf,MAAYe,EAAO,MAAA;AACvC,eAAW3B,KAAM6B;AACf,UAAI;AAAE,QAAA7B,EAAA;AAAA,MAAM,QAAQ;AAAA,MAAgB;AAAA,EAExC;AAEA,SAAO;AAAA,IACL,UAAsB;AACpB,aAAI8B,IAAkB,MAAM;AAAA,MAAC,IACzB,OAAO,SAAW,MAAoB,MAAM;AAAA,MAAC,KACjDA,IAAY,IAEZjG,IAAU,CAACC,MAAkB;AAC3B,YAAI;AACF,gBAAMsG,IAAatG,EAAE,iBAAiB,QAAQA,EAAE,MAAM,UAAU,QAC1DuG,IAAWvG,EAAE,iBAAiB,QAAQA,EAAE,MAAM,QAAQ;AAC5D,UAAAkG,EAAK;AAAA,YACH,IAAI,KAAK,IAAA;AAAA,YACT,MAAM;AAAA,YACN,SAASd,EAAMpF,EAAE,WAAWsG,KAAc,iBAAiBvB,CAAa,KAAK;AAAA,YAC7E,GAAIwB,IAAW,EAAE,OAAOnB,EAAMmB,GAAUvB,EAAW,EAAA,IAAO,CAAA;AAAA,YAC1D,GAAIhF,EAAE,WAAW,EAAE,QAAQoF,EAAMpF,EAAE,UAAUiF,EAAY,EAAA,IAAO,CAAA;AAAA,YAChE,GAAI,OAAO,SAASjF,EAAE,MAAM,IAAI,EAAE,MAAMA,EAAE,OAAA,IAAW,CAAA;AAAA,YACrD,GAAI,OAAO,SAASA,EAAE,KAAK,IAAI,EAAE,KAAKA,EAAE,UAAU,CAAA;AAAA,UAAC,CACpD;AAAA,QACH,QAAQ;AAAA,QAAoB;AAAA,MAC9B,GAEAiG,IAAc,CAACjG,MAA6B;AAC1C,YAAI;AACF,gBAAMwD,IAAkBxD,EAAE,QACpBuF,IAAU/B,aAAkB,QAC9BA,EAAO,UACP,OAAOA,KAAW,WAChBA,IACAmC,GAAcnC,CAAM,GACpBgC,IAAQhC,aAAkB,QAAQA,EAAO,QAAQ;AACvD,UAAA0C,EAAK;AAAA,YACH,IAAI,KAAK,IAAA;AAAA,YACT,MAAM;AAAA,YACN,SAASd,EAAMG,KAAW,qBAAqBR,CAAa,KAAK;AAAA,YACjE,GAAIS,IAAQ,EAAE,OAAOJ,EAAMI,GAAOR,EAAW,MAAO,CAAA;AAAA,UAAC,CACtD;AAAA,QACH,QAAQ;AAAA,QAAoB;AAAA,MAC9B,GAEA,OAAO,iBAAiB,SAASjF,CAAO,GACxC,OAAO,iBAAiB,sBAAsBkG,CAAW,GAElD,MAAM;AACX,QAAIlG,KAAS,OAAO,oBAAoB,SAASA,CAAO,GACpDkG,KAAa,OAAO,oBAAoB,sBAAsBA,CAAW,GAC7ED,IAAY,IACZD,EAAU,MAAA;AAAA,MACZ;AAAA,IACF;AAAA,IAEA,WAAmC;AACjC,aAAOF,EAAO,MAAA;AAAA,IAChB;AAAA,IAEA,UAAU3B,GAA4B;AACpC,aAAA6B,EAAU,IAAI7B,CAAE,GACT,MAAM;AAAE,QAAA6B,EAAU,OAAO7B,CAAE;AAAA,MAAG;AAAA,IACvC;AAAA,EAAA;AAEJ;AC3HO,SAASsC,KAAuB;AACrC,MAAIX,IAA6B;AAEjC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUY,GAAK;AACb,MAAAZ,IAASD,GAAA;AACT,YAAMc,IAAYb,EAAO,QAAA;AACzB,aAAAY,EAAI,OAAO,iBAAiB,SAASC,GAAW,EAAE,MAAM,IAAM,GACvDA;AAAA,IACT;AAAA,IACA,OAAO;AACL,aAAO;AAAA,QACL,QAAQ,CAACnF,MAAS;AAKhB,gBAAMoF,IAAU,SAAS,cAAc,SAAS;AAChD,UAAAA,EAAQ,YAAY;AAEpB,gBAAMC,IAAU,SAAS,cAAc,SAAS;AAChD,UAAAA,EAAQ,YAAY;AACpB,gBAAMC,IAAM,SAAS,cAAc,MAAM;AACzC,UAAAA,EAAI,YAAY,qBAChBA,EAAI,cAAc;AAClB,gBAAMlI,IAAQ,SAAS,cAAc,MAAM;AAC3C,UAAAA,EAAM,YAAY,uBAClBiI,EAAQ,YAAYC,CAAG,GACvBD,EAAQ,YAAYjI,CAAK,GACzBgI,EAAQ,YAAYC,CAAO;AAE3B,gBAAME,IAAO,SAAS,cAAc,IAAI;AACxC,UAAAA,EAAK,YAAY,sBACjBH,EAAQ,YAAYG,CAAI,GACxBvF,EAAK,YAAYoF,CAAO;AAExB,mBAASI,IAAS;AAChB,kBAAMC,KAAiCnB,KAAA,gBAAAA,EAAQ,eAAc,CAAA,GACvDoB,IAAQD,EAAO;AACrB,gBAAIC,MAAU,GAAG;AACf,cAAA1F,EAAK,MAAM,UAAU;AACrB;AAAA,YACF;AACA,YAAAA,EAAK,MAAM,UAAU,IACrB5C,EAAM,cAAc,GAAGsI,CAAK,iBAAiBA,MAAU,IAAI,MAAM,EAAE,aACnEH,EAAK,YAAY;AACjB,uBAAWzH,KAAM2H,GAAQ;AACvB,oBAAME,IAAK,SAAS,cAAc,IAAI;AACtC,cAAAA,EAAG,YAAY;AACf,oBAAMxD,IAAO,SAAS,cAAc,MAAM;AAC1C,cAAAA,EAAK,YAAY,sBAAsBrE,EAAG,SAAS,uBAAuB,cAAc,OAAO,IAC/FqE,EAAK,cAAcrE,EAAG,SAAS,uBAAuB,QAAQ;AAC9D,oBAAM8H,IAAM,SAAS,cAAc,MAAM;AACzC,cAAAA,EAAI,YAAY,qBAChBA,EAAI,cAAc9H,EAAG,SACrB6H,EAAG,YAAYxD,CAAI,GACnBwD,EAAG,YAAYC,CAAG,GAClBL,EAAK,YAAYI,CAAE;AAAA,YACrB;AAAA,UACF;AAEA,UAAAH,EAAA;AACA,gBAAMK,IAAQvB,KAAA,gBAAAA,EAAQ,UAAUkB;AAChC,iBAAO,MAAM;AAAE,YAAAK,KAAA,QAAAA;AAAA,UAAW;AAAA,QAC5B;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,UAAU;AACR,YAAMJ,KAAiCnB,KAAA,gBAAAA,EAAQ,eAAc,CAAA;AAC7D,aAAImB,EAAO,WAAW,IAAU,OACzB,EAAE,QAAAA,EAAA;AAAA,IACX;AAAA,EAAA;AAEJ;AChFA,MAAMK,KAAY,GACZC,KAAmB;AAEzB,SAASC,GAAWC,GAAYxF,IAA8B,UAAmB;AAC/E,MAAI,CAACwF,EAAI,QAAO;AAChB,MAAI;AACF,WAAOxF,EAAK,iBAAiB,IAAI,IAAI,OAAOwF,CAAE,CAAC,EAAE,EAAE,WAAW;AAAA,EAChE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,GAAe/I,GAAqB;AAC3C,QAAMb,IAAMa,EAAG,QAAQ,YAAA,GACjBgJ,IAAU,MAAM,KAAKhJ,EAAG,SAAS,EACpC,OAAO,CAACiJ,MAAMA,EAAE,SAAS,KAAKA,EAAE,SAAS,EAAE,EAC3C,MAAM,GAAG,CAAC,EACV,IAAI,CAACA,MAAM,IAAI,IAAI,OAAOA,CAAC,CAAC,EAAE,EAC9B,KAAK,EAAE;AACV,SAAO9J,IAAM6J;AACf;AAEA,SAASE,GAAelJ,GAAqB;AAC3C,QAAMmJ,IAASnJ,EAAG;AAClB,SAAKmJ,IACW,MAAM,KAAKA,EAAO,QAAQ,EAAE,OAAO,CAACF,MAAMA,EAAE,YAAYjJ,EAAG,OAAO,EACnE,QAAQA,CAAE,IAAI,IAFT;AAGtB;AAEO,SAASoJ,GAAcC,GAAyB;AACrD,MAAI,CAACA,KAAUA,EAAO,aAAa,KAAK,aAAc,QAAO;AAE7D,MAAIA,EAAO,MAAMR,GAAWQ,EAAO,EAAE;AACnC,WAAO,IAAI,IAAI,OAAOA,EAAO,EAAE,CAAC;AAGlC,QAAMC,IAAkB,CAAA,GAIlBC,IAAuB,CAAA;AAC7B,MAAIvJ,IAAqBqJ,GACrBG,IAAQ;AAEZ,SAAOxJ,KAAMA,EAAG,QAAQ,kBAAkB,UAAUwJ,IAAQb,MAAW;AACrE,UAAMtF,IAAmBrD;AACzB,QAAIqD,EAAQ,MAAMwF,GAAWxF,EAAQ,EAAE,GAAG;AACxC,MAAAiG,EAAM,QAAQ,IAAI,IAAI,OAAOjG,EAAQ,EAAE,CAAC,EAAE;AAC1C;AAAA,IACF;AAEA,UAAMoG,IAAOV,GAAe1F,CAAO,GAC7B8F,IAA6B9F,EAAQ;AAC3C,QAAIqG,IAAOD;AACX,QAAIN;AACF,UAAI;AACF,cAAMQ,IAAiB,MAAM,KAAKtG,EAAQ,SAAS,EAAE,KAAK,GAAG;AAI7D,QAH4B,MAAM,KAAK8F,EAAO,QAAQ,EAAE;AAAA,UACtD,CAACF,MAAeA,EAAE,YAAY5F,EAAQ,WAAW,MAAM,KAAK4F,EAAE,SAAS,EAAE,KAAK,GAAG,MAAMU;AAAA,QAAA,EAE5E,SAAS,MACpBD,IAAO,GAAGrG,EAAQ,QAAQ,aAAa,gBAAgB6F,GAAe7F,CAAO,CAAC;AAAA,MAElF,QAAQ;AAAA,MAER;AAQF,QALAiG,EAAM,QAAQI,CAAI,GACdJ,EAAM,SAAS,KAAGC,EAAW,QAAQ,KAAK,GAI1CJ;AACF,MAAAnJ,IAAKmJ;AAAA,SACA;AACL,YAAM7F,IAAOD,EAAQ,YAAA;AACrB,MAAIC,aAAgB,cAClBtD,IAAKsD,EAAK,MAGNgG,EAAM,SAAS,MAAGC,EAAW,CAAC,IAAIX,OAEtC5I,IAAK;AAAA,IAET;AACA,IAAAwJ;AAAA,EACF;AAGA,MAAI7H,IAAM2H,EAAM,CAAC,KAAK;AACtB,WAAS,IAAI,GAAG,IAAIA,EAAM,QAAQ;AAChC,IAAA3H,MAAQ4H,EAAW,IAAI,CAAC,KAAK,SAASD,EAAM,CAAC;AAE/C,SAAO3H;AACT;AChGA,SAASiI,GAAY5J,GAAmC;AACtD,QAAM6J,IAAO,OAAO,KAAK7J,CAAE,EAAE;AAAA,IAC3B,CAAC8J,MAAMA,EAAE,WAAW,eAAe,KAAKA,EAAE,WAAW,0BAA0B;AAAA,EAAA;AAEjF,MAAID,EAAK,WAAW,EAAG,QAAO;AAC9B,MAAIE,IAAkB/J,EAA0C6J,EAAK,CAAC,CAAE;AACxE,WAASG,IAAI,GAAGA,IAAI,MAAMD,GAAOC,KAAK;AACpC,UAAMC,IAAIF,GACJG,IAAOD,EAAE;AACf,QAAI,OAAOC,KAAS,YAAY;AAC9B,YAAM1J,IAAQ0J,EAAiD,eAAgBA,EAA2B;AAC1G,UAAI1J,KAAQA,MAAS,mBAAmB,EAAE,KAAK,SAAS,MAAAA,EAAA;AAAA,IAC1D;AACA,QAAI,OAAO0J,KAAS,YAAYA,MAAS,MAAM;AAC7C,YAAM1J,IAAQ0J,EAAiD,eAAgBA,EAA2B;AAC1G,UAAI1J,EAAM,QAAO,EAAE,KAAK,SAAS,MAAAA,EAAA;AAAA,IACnC;AACA,IAAAuJ,IAAQE,EAAE;AAAA,EACZ;AACA,SAAO,EAAE,KAAK,QAAA;AAChB;AAEA,SAASE,GAAUnK,GAAmC;AZtB/C,MAAAF,GAAAsD;AYuBL,QAAMgH,IAAQpK,GACRqK,IAAYD,EAAM;AACxB,MAAIC,GAAW;AACb,UAAM7J,MAAOV,IAAAuK,EAAU,SAAV,gBAAAvK,EAAgB,WAAQsD,IAAAiH,EAAU,SAAV,gBAAAjH,EAAgB;AACrD,WAAO,EAAE,KAAK,OAAO,GAAI5C,IAAO,EAAE,MAAAA,EAAA,IAAS,GAAC;AAAA,EAC9C;AACA,SAAI4J,EAAM,UAAgB,EAAE,KAAK,MAAA,IAC1B;AACT;AAEA,SAASE,GAActK,GAAmC;AACxD,QAAMuK,IAAM,OAA2E;AACvF,MAAI,EAACA,KAAA,QAAAA,EAAI,cAAc,QAAO;AAC9B,MAAI;AACF,UAAMC,IAAMD,EAAG,aAAavK,CAAE;AAC9B,QAAI,CAACwK,EAAK,QAAO;AACjB,UAAMC,IAAQD,EAA4C;AAC1D,WAAO,EAAE,KAAK,WAAW,GAAIC,KAAA,QAAAA,EAAM,OAAO,EAAE,MAAMA,EAAK,KAAA,IAAS,GAAC;AAAA,EACnE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,GAAa1K,GAAmC;AAEvD,SAAI,mBADUA,IACuB,EAAE,KAAK,SAAA,IACrC;AACT;AAEO,SAAS2K,GAAgB3K,GAAwC;AACtE,SAAO4J,GAAY5J,CAAE,KAAKmK,GAAUnK,CAAE,KAAKsK,GAActK,CAAE,KAAK0K,GAAa1K,CAAE,KAAK;AACtF;ACtDA,MAAM4K,KAAmB,KACnBC,KAA0B,KAC1BC,KAAiB,KACjBC,KAAW,KACXC,KAAwB,IACxBC,KAAmB,KACnBC,KAAoB,KAEpBC,KAAqB;AAAA,EACzB;AAAA,EAAW;AAAA,EAAY;AAAA,EAAO;AAAA,EAAS;AAAA,EAAU;AAAA,EACjD;AAAA,EAAS;AAAA,EAAU;AAAA,EAAa;AAAA,EAAc;AAAA,EAAa;AAAA,EAC3D;AAAA,EAAU;AAAA,EACV;AAAA,EAAe;AAAA,EAAa;AAAA,EAAe;AAAA,EAAe;AAAA,EAC1D;AAAA,EAAS;AAAA,EAAoB;AAAA,EAC7B;AAAA,EAAU;AAAA,EACV;AAAA,EAAW;AAAA,EAAc;AAAA,EACzB;AAAA,EAAW;AAAA,EAAa;AAAA,EACxB;AAAA,EAAQ;AAAA,EAAkB;AAAA,EAAmB;AAAA,EAAe;AAAA,EAC5D;AAAA,EAAyB;AAC3B;AAcA,SAASC,GAAS9L,GAAW+L,GAAqB;AAChD,SAAI/L,EAAE,UAAU+L,IAAY/L,IACrBA,EAAE,MAAM,GAAG+L,CAAG,IAAI;AAAA;AAAA,+BAAoC/L,EAAE,MAAM;AACvE;AAEA,SAASgM,GAAWtL,GAAqC;AACvD,QAAMuL,IAAW,iBAAiBvL,CAAE,GAC9B2B,IAA8B,CAAA;AACpC,aAAW6J,KAAQL,IAAoB;AACrC,UAAMpG,IAAQwG,EAAS,iBAAiBC,CAAI;AAC5C,IAAIzG,KAASA,MAAU,YAAYA,MAAU,UAAUA,MAAU,UAAUA,MAAU,UACnFpD,EAAI6J,CAAI,IAAIzG,EAAM,OAAO,MAAM,GAAGmG,EAAiB;AAAA,EAEvD;AACA,SAAOvJ;AACT;AAEA,SAAS8J,GAAazL,GAAuB;AAC3C,SAAO,MAAM,KAAKA,EAAG,SAAS,EAC3B,MAAM,GAAGgL,EAAqB,EAC9B,IAAI,CAAC/B,MAAOA,EAAE,SAASgC,KAAmBhC,EAAE,MAAM,GAAGgC,EAAgB,IAAIhC,CAAE;AAChF;AAEO,SAASyC,GAAe1L,GAA6B;AAC1D,QAAM2L,IAAO3L,EAAG,sBAAA,GACV4L,IAAcxC,GAAcpJ,CAAE,GAC9B6L,IAAQ7L,EAAG,MAAM,MACjB8L,IAAYnB,GAAgB3K,CAAE;AACpC,SAAO;AAAA,IACL,UAAU4L,EAAY,SAASd,KAAiBc,EAAY,MAAM,GAAGd,EAAc,IAAIc;AAAA,IACvF,SAAS5L,EAAG,QAAQ,YAAA;AAAA,IACpB,IAAI6L,KAASA,EAAM,SAASd,KAAWc,EAAM,MAAM,GAAGd,EAAQ,IAAIc;AAAA,IAClE,WAAWJ,GAAazL,CAAE;AAAA,IAC1B,WAAWoL,GAASpL,EAAG,WAAW4K,EAAgB;AAAA,IAClD,GAAI5K,EAAG,gBACH,EAAE,iBAAiBoL,GAASpL,EAAG,cAAc,WAAW6K,EAAuB,EAAA,IAC/E,CAAA;AAAA,IACJ,gBAAgBS,GAAWtL,CAAE;AAAA,IAC7B,cAAc;AAAA,MACZ,GAAG,KAAK,MAAM2L,EAAK,CAAC;AAAA,MACpB,GAAG,KAAK,MAAMA,EAAK,CAAC;AAAA,MACpB,GAAG,KAAK,MAAMA,EAAK,KAAK;AAAA,MACxB,GAAG,KAAK,MAAMA,EAAK,MAAM;AAAA,IAAA;AAAA,IAE3B,GAAIG,IAAY,EAAE,WAAAA,MAAc,CAAA;AAAA,EAAC;AAErC;AC3EA,MAAMC,KAAgB,IAChBC,KAAgB,WAChBC,KAAc,WACdC,KAAgB,GAChBC,KAAiB;AAEvB,eAAsBC,GACpBC,GACAC,GACAC,GACAC,IAAiBL,IACA;AACjB,QAAMM,IAAM,MAAMC,GAAUL,CAAiB,GACvCM,IAAS,SAAS,cAAc,QAAQ;AAC9C,EAAAA,EAAO,QAAQF,EAAI,cACnBE,EAAO,SAASF,EAAI;AACpB,QAAM1E,IAAM4E,EAAO,WAAW,IAAI;AAClC,MAAI,CAAC5E,EAAK,OAAM,IAAI,MAAM,iCAAiC;AAE3D,EAAAA,EAAI,UAAU0E,GAAK,GAAG,CAAC;AAEvB,QAAMG,IAASD,EAAO,QAAQJ,EAAS,GACjCM,IAASF,EAAO,SAASJ,EAAS;AAExC,aAAWO,KAAOR,GAAM;AACtB,UAAMX,IAAOoB,GAAaD,CAAG;AAC7B,QAAI,CAACnB,EAAM;AAEX,UAAMqB,IAAIrB,EAAK,IAAIiB,GACbK,IAAItB,EAAK,IAAIkB,GACbK,IAAIvB,EAAK,IAAIiB,GACbO,IAAIxB,EAAK,IAAIkB;AAEnB,IAAA9E,EAAI,YAAYmE,IAChBnE,EAAI,cAAcyE,GAClBzE,EAAI,WAAWiF,GAAGC,GAAGC,GAAGC,CAAC;AAEzB,UAAMC,IAAKJ,IAAIE,GACTG,IAAKJ;AAEX,IAAAlF,EAAI,UAAA,GACJA,EAAI,YAAYyE,GAChBzE,EAAI,IAAIqF,GAAIC,GAAItB,IAAe,GAAG,KAAK,KAAK,CAAC,GAC7ChE,EAAI,KAAA,GAEJA,EAAI,YAAY,GAChBA,EAAI,cAAciE,IAClBjE,EAAI,OAAA,GAEJA,EAAI,YAAYkE,IAChBlE,EAAI,OAAO,kDACXA,EAAI,YAAY,UAChBA,EAAI,eAAe,UACnBA,EAAI,SAAS,OAAO+E,EAAI,MAAM,GAAGM,GAAIC,IAAK,CAAC;AAAA,EAC7C;AAEA,SAAOV,EAAO,UAAU,cAAc,IAAI;AAC5C;AAEA,SAASI,GAAaD,GAAuE;AAC3F,MAAIA,EAAI,eAAe,SAAS,SAASA,EAAI,WAAW,GAAG;AACzD,UAAMQ,IAAIR,EAAI,YAAY,sBAAA;AAC1B,QAAIQ,EAAE,QAAQ,KAAKA,EAAE,SAAS;AAC5B,aAAO,EAAE,GAAGA,EAAE,MAAM,GAAGA,EAAE,KAAK,GAAGA,EAAE,OAAO,GAAGA,EAAE,OAAA;AAAA,EAEnD;AACA,MAAIR,EAAI;AACN,QAAI;AACF,YAAMS,IAAQ,SAAS,cAAcT,EAAI,QAAQ;AACjD,UAAIS,GAAO;AACT,cAAMD,IAAIC,EAAM,sBAAA;AAChB,YAAID,EAAE,QAAQ,KAAKA,EAAE,SAAS;AAC5B,iBAAO,EAAE,GAAGA,EAAE,MAAM,GAAGA,EAAE,KAAK,GAAGA,EAAE,OAAO,GAAGA,EAAE,OAAA;AAAA,MAEnD;AAAA,IACF,QAAQ;AAAA,IAAqB;AAE/B,SAAOR,EAAI;AACb;AAEA,SAASJ,GAAUtH,GAAwC;AACzD,SAAO,IAAI,QAAQ,CAACoI,GAASC,MAAW;AACtC,UAAMhB,IAAM,IAAI,MAAA;AAChB,IAAAA,EAAI,SAAS,MAAMe,EAAQf,CAAG,GAC9BA,EAAI,UAAU,CAACjL,MAAQiM,EAAOjM,CAAG,GACjCiL,EAAI,MAAMrH;AAAA,EACZ,CAAC;AACH;AChFA,MAAMsI,IAAmB,qBACnBvB,KAAiB,WACjBwB,KAAe;AAsBrB,SAASC,GAAUC,GAAeC,GAA0B;AAC1D,SAAO,oBAAoB,KAAKD,CAAK,IAAI,GAAGA,CAAK,GAAGC,CAAQ,KAAKD;AACnE;AAEO,SAASE,GAAsBrN,IAA+B,IAAqB;AACxF,QAAMsN,IAAStN,EAAK,UAAUyL,IACxB8B,IAAgBL,GAAUI,GAAQ,IAAI,GACtCE,IAAcN,GAAUI,GAAQ,IAAI,GAEpCG,IAAW,SAAS,cAAc,OAAO;AAC/C,EAAAA,EAAS,YAAYT,GACrBS,EAAS,cAAc,gEACvB,SAAS,KAAK,YAAYA,CAAQ;AAElC,QAAMC,IAAQ,SAAS,cAAc,KAAK;AAC1C,EAAAA,EAAM,YAAYV,GAClBU,EAAM,aAAa,eAAe,MAAM,GACxCA,EAAM,MAAM,UAAU;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsBH,CAAa;AAAA,IACnC;AAAA,IACA,8BAA8BC,CAAW;AAAA,IACzC;AAAA,EAAA,EACA,KAAK,IAAI;AAEX,QAAMG,IAAO,SAAS,cAAc,KAAK;AACzC,EAAAA,EAAK,YAAYX,GACjBW,EAAK,aAAa,QAAQ,QAAQ,GAClCA,EAAK,MAAM,UAAU;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAeL,CAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,IAAI,GACXK,EAAK,cAAcV;AAEnB,QAAMW,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYrB,WAASC,EAAWjP,GAAmB;AACrC,WAAOA,EAAE,QAAQ,UAAU,CAAC2J,OAAO,EAAE,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAA,GAAUA,CAAC,CAAY;AAAA,EAC7F;AAEA,WAAS,KAAK,YAAYmF,CAAK,GAC/B,SAAS,KAAK,YAAYC,CAAI;AAE9B,QAAMG,wBAAc,IAAA;AAEpB,WAASC,EAAWC,GAA6B;AAC/C,UAAMC,IAAI,SAAS,cAAc,KAAK;AACtC,WAAAA,EAAE,YAAYjB,GACdiB,EAAE,aAAa,eAAe,MAAM,GACpCA,EAAE,MAAM,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAeX,CAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACA,KAAK,IAAI,GACXW,EAAE,cAAc,OAAOD,CAAG,GAC1B,SAAS,KAAK,YAAYC,CAAC,GACpBA;AAAA,EACT;AAEA,WAASC,IAA8B;AACrC,UAAMhL,IAAI,SAAS,cAAc,KAAK;AACtC,WAAAA,EAAE,YAAY8J,GACd9J,EAAE,aAAa,eAAe,MAAM,GACpCA,EAAE,MAAM,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA,qBAAqBoK,CAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACA,KAAK,IAAI,GACX,SAAS,KAAK,YAAYpK,CAAC,GACpBA;AAAA,EACT;AAEA,WAASiL,EACPhN,GACA8J,GACAmD,GACA;AACA,UAAMC,IAAUD,IAAU,QAAQ;AAClC,IAAAjN,EAAM,QAAQ,MAAM,UAAU,SAC9BA,EAAM,QAAQ,MAAM,UAAUkN,GAC9BlN,EAAM,QAAQ,MAAM,OAAO,GAAG8J,EAAK,CAAC,MACpC9J,EAAM,QAAQ,MAAM,MAAM,GAAG8J,EAAK,CAAC,MACnC9J,EAAM,QAAQ,MAAM,QAAQ,GAAG8J,EAAK,CAAC,MACrC9J,EAAM,QAAQ,MAAM,SAAS,GAAG8J,EAAK,CAAC,MAEtC9J,EAAM,OAAO,MAAM,UAAU,QAC7BA,EAAM,OAAO,MAAM,UAAUkN,GAC7BlN,EAAM,OAAO,MAAM,OAAO,GAAG8J,EAAK,IAAIA,EAAK,IAAI,EAAE,MACjD9J,EAAM,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG8J,EAAK,IAAI,EAAE,CAAC;AAAA,EACtD;AAEA,WAASqD,EAAKnN,GAA4D;AACxE,IAAAA,EAAM,OAAO,MAAM,UAAU,QAC7BA,EAAM,QAAQ,MAAM,UAAU;AAAA,EAChC;AAEA,WAASoN,IAAa;AACpB,IAAAT,EAAQ,QAAQ,CAAC3M,MAAU;AACzB,UAAIqN,IAA6BrN,EAAM,OAAO;AAO9C,UAFIqN,KAAc,CAACA,EAAW,gBAAaA,IAAa,OAEpD,CAACA,KAAcrN,EAAM,OAAO,UAAU;AAKxC,YAAI;AACF,UAAAqN,IAAa,SAAS,cAAcrN,EAAM,OAAO,QAAQ;AAAA,QAC3D,QAAQ;AACN,UAAAqN,IAAa;AAAA,QACf;AACA,QAAIA,MAAYrN,EAAM,OAAO,SAASqN;AAAA,MACxC;AAEA,UAAIA,GAAY;AACd,cAAM5B,IAAI4B,EAAW,sBAAA;AACrB,YAAI5B,EAAE,QAAQ,KAAKA,EAAE,SAAS,GAAG;AAC/B,UAAAuB,EAAQhN,GAAO,EAAE,GAAGyL,EAAE,MAAM,GAAGA,EAAE,KAAK,GAAGA,EAAE,OAAO,GAAGA,EAAE,OAAA,GAAU,EAAK;AACtE;AAAA,QACF;AAAA,MACF;AAEA,YAAM6B,IAAKtN,EAAM,OAAO;AACxB,UAAIsN,MAAOA,EAAG,IAAI,KAAKA,EAAG,IAAI,IAAI;AAChC,QAAAN,EAAQhN,GAAOsN,GAAI,EAAI;AACvB;AAAA,MACF;AAEA,MAAAH,EAAKnN,CAAK;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,MAAIuN,IAAqB;AACzB,WAASC,IAAW;AAClB,IAAID,MAAQ,SACZA,IAAM,sBAAsB,MAAM;AAChC,MAAAA,IAAM,MACNH,EAAA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,gBAAO,iBAAiB,UAAUI,GAAU,EAAI,GAChD,OAAO,iBAAiB,UAAUA,CAAQ,GAEnC;AAAA,IACL,OAAOX,GAAKY,GAAQ;AAClB,YAAMC,IAASd,EAAWC,CAAG,GACvBc,IAAUZ,EAAA;AAChB,MAAAJ,EAAQ,IAAIE,GAAK,EAAE,QAAAY,GAAQ,QAAAC,GAAQ,SAAAC,GAAS,GAC5CP,EAAA;AAAA,IACF;AAAA,IACA,WAAWpI,GAAS;AAClB,MAAIA,IACFwH,EAAK,YAAYC,IAAeC,EAAW1H,CAAO,IAElDwH,EAAK,cAAcV;AAAA,IAEvB;AAAA,IACA,UAAU;AACR,aAAO,oBAAoB,UAAU0B,GAAU,EAAI,GACnD,OAAO,oBAAoB,UAAUA,CAAQ,GACzCD,MAAQ,QAAM,qBAAqBA,CAAG,GAC1ChB,EAAM,OAAA,GACNC,EAAK,OAAA,GACLF,EAAS,OAAA,GACTK,EAAQ,QAAQ,CAAC,EAAE,QAAAe,GAAQ,SAAAC,QAAc;AACvC,QAAAD,EAAO,OAAA,GACPC,EAAQ,OAAA;AAAA,MACV,CAAC,GACDhB,EAAQ,MAAA;AAAA,IACV;AAAA,EAAA;AAEJ;AC/OA,MAAMiB,KACJ,+MAEIC,KACJ;AAGK,SAASC,GAAejP,GAGD;AAC5B,SAAO,IAAI,QAAQ,CAAC8M,MAAY;AAC9B,UAAMoC,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,YAAY,+DACpBA,EAAQ,YAAY;AAAA;AAAA;AAAA,yCAGiBlP,EAAK,SAAS;AAAA;AAAA;AAAA,2GAGoD+O,EAAU;AAAA;AAAA;AAAA;AAAA,8EAIvCC,EAAU;AAAA;AAAA;AAIpF,UAAMG,IAAY,KACZC,IAAY,KACZC,IAAO,KAAK,IAAI,KAAK,IAAI,GAAGrP,EAAK,OAAO,CAAC,GAAG,OAAO,aAAamP,IAAY,CAAC,GAC7EG,IAAM,KAAK,IAAI,KAAK,IAAI,GAAGtP,EAAK,OAAO,IAAI,EAAE,GAAG,OAAO,cAAcoP,IAAY,CAAC;AACxF,IAAAF,EAAQ,MAAM,OAAO,GAAGG,CAAI,MAC5BH,EAAQ,MAAM,MAAM,GAAGI,CAAG,MAE1B,SAAS,KAAK,YAAYJ,CAAO;AAEjC,UAAMK,IAAWL,EAAQ,cAAc,UAAU;AACjD,IAAAK,EAAS,MAAA;AAET,aAASC,EAAMtO,GAA0B;AACvC,eAAS,oBAAoB,WAAWuO,GAAiB,EAAI,GAC7DP,EAAQ,OAAA,GACRpC,EAAQ5L,CAAM;AAAA,IAChB;AAEA,aAASuO,EAAgB7O,GAAkB;AACzC,MAAIA,EAAE,QAAQ,aACZA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACF4O,EAAM,EAAE,WAAW,OAAO;AAAA,IAE9B;AACA,aAAS,iBAAiB,WAAWC,GAAiB,EAAI,GAE1DP,EAAQ,iBAAiB,SAAS,CAACtO,MAAM;AhBlEtC,UAAAxB;AgBoED,YAAMsQ,KAAStQ,IADAwB,EAAE,OACK,QAAQ,eAAe,MAA9B,gBAAAxB,EAAiC,aAAa;AAC7D,UAAKsQ,MAKL9O,EAAE,gBAAA,GACE8O,MAAW,YAAUF,EAAM,EAAE,WAAW,OAAO,GAC/CE,MAAW,SAAQ;AACrB,cAAMC,IAAOJ,EAAS,MAAM,KAAA;AAC5B,QAAAC,EAAM,EAAE,GAAIG,IAAO,EAAE,MAAAA,EAAA,IAAS,IAAK,WAAW,IAAO;AAAA,MACvD;AAAA,IACF,CAAC,GAEDJ,EAAS,iBAAiB,WAAW,CAAC3O,MAAM;AAC1C,UAAIA,EAAE,QAAQ,YAAYA,EAAE,WAAWA,EAAE,UAAU;AACjD,QAAAA,EAAE,eAAA;AACF,cAAM+O,IAAOJ,EAAS,MAAM,KAAA;AAC5B,QAAAC,EAAM,EAAE,GAAIG,IAAO,EAAE,MAAAA,EAAA,IAAS,IAAK,WAAW,IAAO;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;ACrFA,MAAMlE,KAAiB;AAEvB,SAASyB,GAAUC,GAAeC,GAA0B;AAC1D,SAAO,oBAAoB,KAAKD,CAAK,IAAI,GAAGA,CAAK,GAAGC,CAAQ,KAAKD;AACnE;AAOO,SAASyC,GAAY5P,GAAmC;AAC7D,QAAM,EAAE,YAAA6P,GAAY,SAAAC,EAAA,IAAY9P,GAC1B8L,IAAS9L,EAAK,UAAUyL,IACxBsE,IAAa7C,GAAUpB,GAAQ,IAAI,GAEnCgD,IAAU,SAAS,cAAc,KAAK;AAC5C,EAAAA,EAAQ,MAAM,UAAU;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqBhD,CAAM;AAAA,IAC3B,eAAeiE,CAAU;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,IAAI,GACX,SAAS,KAAK,YAAYjB,CAAO;AAEjC,QAAMkB,IAAU,SAAS,cAAc,KAAK;AAC5C,EAAAA,EAAQ,MAAM,UAAU;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,IAAI,GACX,SAAS,KAAK,YAAYA,CAAO;AAEjC,QAAMC,IAAiB,SAAS,KAAK,MAAM;AAC3C,WAAS,KAAK,MAAM,SAAS;AAE7B,MAAIC,IAAW,IACXC,IAA8C,MAAM;AAAA,EAAC;AACzD,QAAMC,IAAU,IAAI,QAAwB,CAACC,MAAQ;AAAE,IAAAF,IAAiBE;AAAA,EAAK,CAAC;AAE9E,WAASC,EAAgBhR,GAAiC;AACxD,QAAI,CAACA,KAAM,EAAEA,aAAc,MAAO,QAAO;AACzC,QAAIiR,IAAoBjR;AACxB,WAAOiR,KAAM;AACX,UAAIA,MAASV,KAAcU,MAASV,EAAW,KAAM,QAAO;AAC5D,MAAAU,IAAOA,EAAK,cAAeA,EAAoB,QAAQ;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAMA,WAASC,EAAgBlR,GAAsB;AAC7C,WAAOA,EAAG,QAAQ,SAAS,GAAG;AAAA,EAChC;AAEA,WAASmR,EAAWnE,GAAWC,GAA2B;AjB5ErD,QAAAnN,GAAAsD;AiB6EH,IAAAoM,EAAQ,MAAM,UAAU,QACxBkB,EAAQ,MAAM,UAAU;AACxB,UAAMU,IAAa,SAAS,kBAAkBpE,GAAGC,CAAC;AAClD,IAAAuC,EAAQ,MAAM,UAAU,SACxBkB,EAAQ,MAAM,UAAU;AACxB,eAAWzH,KAAKmI,GAAY;AAC1B,UAAIJ,EAAgB/H,CAAC,EAAG;AAIxB,UAAI5F,IAAmB4F,GACnBoI,IAAS;AACb,aAAOhO,EAAQ,cAAc,CAAC6N,EAAgB7N,CAAO,KAAKgO,MAAW,KAAG;AAGtE,cAAMC,OAFSlO,KAAAtD,IAAAuD,EAAQ,YACpB,sBADY,gBAAAD,EAAA,KAAAtD,GACQkN,GAAGC,OAAM,CAAA,GACb,KAAK,CAAC3L,MAAM,CAAC0P,EAAgB1P,CAAC,KAAKA,MAAM+B,CAAO;AACnE,YAAI,CAACiO,EAAM;AACX,QAAAjO,IAAUiO;AAAA,MACZ;AACA,aAAOjO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,WAASkO,EAAgBvR,GAAa;AACpC,UAAM2L,IAAO3L,EAAG,sBAAA;AAChB,IAAAwP,EAAQ,MAAM,OAAO,GAAG7D,EAAK,IAAI,MACjC6D,EAAQ,MAAM,MAAM,GAAG7D,EAAK,GAAG,MAC/B6D,EAAQ,MAAM,QAAQ,GAAG7D,EAAK,KAAK,MACnC6D,EAAQ,MAAM,SAAS,GAAG7D,EAAK,MAAM;AACrC,UAAMxM,IAAMa,EAAG,QAAQ,YAAA,GACjBwR,IAAMxR,EAAG,UAAU,SAAS,IAAI,MAAM,MAAM,KAAKA,EAAG,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI;AAC7F,IAAA0Q,EAAQ,cAAcvR,IAAMqS;AAC5B,UAAMC,IAAQ9F,EAAK,MAAM;AACzB,IAAA+E,EAAQ,MAAM,OAAO,GAAG/E,EAAK,IAAI,MACjC+E,EAAQ,MAAM,MAAM,GAAGe,KAAS,IAAIA,IAAQ9F,EAAK,SAAS,CAAC;AAAA,EAC7D;AAEA,WAAS+F,EAAWpQ,GAAe;AACjC,UAAMtB,IAAKmR,EAAW7P,EAAE,SAASA,EAAE,OAAO;AAC1C,IAAItB,KACFuR,EAAgBvR,CAAE,GAClBwQ,KAAA,QAAAA,EAAUxQ,OAEVwP,EAAQ,MAAM,UAAU,QACxBkB,EAAQ,MAAM,UAAU,QACxBF,KAAA,QAAAA,EAAU;AAAA,EAEd;AAGA,WAASmB,EAAkBrQ,GAAiB;AAC1C,QAAIA,EAAE,WAAW,EAAG;AACpB,IAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA;AACF,UAAMtB,IAAKmR,EAAW7P,EAAE,SAASA,EAAE,OAAO;AAC1C,IAAItB,OAAWA,CAAE;AAAA,EACnB;AAEA,WAAS4R,EAAQtQ,GAAU;AACzB,IAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA;AAAA,EACJ;AAEA,WAASuQ,EAAUvQ,GAAkB;AACnC,IAAIA,EAAE,QAAQ,aACZA,EAAE,eAAA,GACFwQ,EAAO,IAAI;AAAA,EAEf;AAEA,WAASA,EAAO9R,GAAoB;AAClC,IAAI4Q,MACJA,IAAW,IACX,SAAS,oBAAoB,aAAac,GAAY,EAAI,GAC1D,SAAS,oBAAoB,eAAeC,GAAmB,EAAI,GACnE,SAAS,oBAAoB,SAASC,GAAS,EAAI,GACnD,SAAS,oBAAoB,WAAWA,GAAS,EAAI,GACrD,SAAS,oBAAoB,WAAWC,GAAW,EAAI,GACvDrC,EAAQ,OAAA,GACRkB,EAAQ,OAAA,GACR,SAAS,KAAK,MAAM,SAASC,GAC7BE,EAAe7Q,CAAE;AAAA,EACnB;AAEA,kBAAS,iBAAiB,aAAa0R,GAAY,EAAI,GACvD,SAAS,iBAAiB,eAAeC,GAAmB,EAAI,GAChE,SAAS,iBAAiB,SAASC,GAAS,EAAI,GAChD,SAAS,iBAAiB,WAAWA,GAAS,EAAI,GAClD,SAAS,iBAAiB,WAAWC,GAAW,EAAI,GAE7C;AAAA,IACL,QAAQ,MAAMC,EAAO,IAAI;AAAA,IACzB,SAAAhB;AAAA,EAAA;AAEJ;ACpKA,IAAIiB,IAAqD;AAEzD,eAAeC,KAAO;AACpB,SAAKD,MACHA,IAAc,MAAM,OAAO,sBAAe,IAErCA;AACT;AA4BA,MAAME,IACJ;AAEF,SAASC,GAAmBC,GAAgBC,GAA0C;AAGpF,MAFI,CAACD,KACDA,EAAO,WAAW,OAAO,KAAKA,EAAO,WAAW,OAAO,KACvDA,EAAO,WAAW,GAAG,KAAKA,EAAO,WAAW,GAAG,EAAG,QAAO;AAC7D,MAAI;AAEF,QADU,IAAI,IAAIA,GAAQ,OAAO,SAAS,IAAI,EACxC,WAAW,OAAO,SAAS,OAAQ,QAAO;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAOC,MAAoB,eAAeA,MAAoB;AAChE;AAEA,SAASC,KAA0C;AACjD,QAAMC,IAA2D,CAAA,GAC3DC,IAAwF,CAAA;AAE9F,kBAAS,iBAAiB,KAAK,EAAE,QAAQ,CAAC9F,MAAQ;AAChD,IAAKyF,GAAmBzF,EAAI,KAAKA,EAAI,WAAW,MAC9C6F,EAAW,KAAK,EAAE,IAAI7F,GAAK,KAAKA,EAAI,KAAK,GACzCA,EAAI,MAAMwF;AAAA,EAEd,CAAC,GAED,SAAS,iBAAiB,OAAO,EAAE,QAAQ,CAACxF,MAAQ;AAClD,UAAM+F,IAAS/F,GACTgG,IAAOD,EAAO,aAAa,MAAM,GACjCE,IAAQF,EAAO,eAAe,gCAAgC,MAAM,GACpEG,IAAMF,KAAQC,KAAS;AAC7B,IAAIC,KAAO,CAACT,GAAmBS,CAAG,MAChCJ,EAAW,KAAK,EAAE,IAAIC,GAAQ,MAAAC,GAAM,OAAAC,GAAO,GACvCD,MAAS,QAAMD,EAAO,aAAa,QAAQP,CAAiB,GAC5DS,MAAU,QAAMF,EAAO,eAAe,gCAAgC,QAAQP,CAAiB;AAAA,EAEvG,CAAC,GAEM,MAAM;AACX,eAAW,EAAE,IAAAjS,GAAI,KAAAoF,EAAA,KAASkN,KAAe,MAAMlN;AAC/C,eAAW,EAAE,IAAApF,GAAI,MAAAyS,GAAM,OAAAC,EAAA,KAAWH;AAChC,MAAIE,MAAS,QAAMzS,EAAG,aAAa,QAAQyS,CAAI,GAC3CC,MAAU,QAAM1S,EAAG,eAAe,gCAAgC,QAAQ0S,CAAK;AAAA,EAEvF;AACF;AAOA,SAASE,KAAsC;AAE7C,QAAMC,IAAkC,CAAA;AACxC,WAAS,iBAA8B,GAAG,EAAE,QAAQ,CAAC7S,MAAO;AAC1D,UAAM8S,IAAK,iBAAiB9S,CAAE,GACxB+S,KACHD,EAAG,cAAc,UAAUA,EAAG,cAAc,aAAa9S,EAAG,eAAeA,EAAG,cAC3EgT,KACHF,EAAG,cAAc,UAAUA,EAAG,cAAc,aAAa9S,EAAG,cAAcA,EAAG;AAChF,KAAI+S,KAAgBC,MAAcH,EAAiB,KAAK7S,CAAE;AAAA,EAC5D,CAAC;AAKD,QAAMiT,IAAe,OAAO,SACtBC,IAAe,OAAO,SACtBC,IAAwBN,EAAiB,IAAI,CAAC7S,OAAQ;AAAA,IAC1D,IAAAA;AAAA,IACA,YAAYA,EAAG;AAAA,IACf,WAAWA,EAAG;AAAA,EAAA,EACd,GAKIoT,wBAAc,IAAA;AACpB,aAAWpT,KAAM6S,GAAkB;AACjC,QAAIQ,IAA0BrT;AAC9B,WAAOqT,KAAOA,MAAQ,SAAS,gBAAgB;AAC7C,MAAKD,EAAQ,IAAIC,CAAG,OAAW,IAAIA,GAAKA,EAAI,MAAM,OAAO,GACzDA,IAAMA,EAAI;AAAA,EAEd;AAGA,aAAWrT,KAAMoT,EAAQ;AACvB,IAAApT,EAAG,MAAM,YAAY,YAAY,WAAW,WAAW,GACvDA,EAAG,MAAM,YAAY,cAAc,WAAW,WAAW,GACzDA,EAAG,MAAM,YAAY,cAAc,WAAW,WAAW,GACzDA,EAAG,MAAM,YAAY,cAAc,QAAQ,WAAW,GACtDA,EAAG,MAAM,YAAY,UAAU,QAAQ,WAAW,GAClDA,EAAG,MAAM,YAAY,cAAc,KAAK,WAAW;AAGrD,SAAO,MAAM;AAGX,eAAW,CAACA,GAAIsT,CAAO,KAAKF;AAC1B,MAAApT,EAAG,MAAM,UAAUsT;AAIrB,eAAW,EAAE,IAAAtT,GAAI,YAAAuT,GAAY,WAAAC,EAAA,KAAeL;AAC1C,MAAAnT,EAAG,aAAauT,GAChBvT,EAAG,YAAYwT;AAEjB,WAAO,SAASP,GAAcC,CAAY;AAAA,EAC5C;AACF;AASA,SAASO,KAA+B;AACtC,QAAM7T,IAAQ,SAAS,cAAc,OAAO;AAC5C,SAAAA,EAAM,aAAa,uBAAuB,EAAE,GAC5CA,EAAM,cACJ,gFACD,SAAS,QAAQ,SAAS,iBAAiB,YAAYA,CAAK,GACtD,MAAM;AAAE,IAAAA,EAAM,OAAA;AAAA,EAAU;AACjC;AAQA,IAAI8T,KAA6B,QAAQ,QAAA;AAEzC,eAAsBC,GAAkBjT,IAA0B,IAA+B;AAC/F,QAAMkT,IAAYF;AAClB,MAAIG;AACJ,EAAAH,KAAc,IAAI,QAAc,CAACpG,MAAM;AAAE,IAAAuG,IAAcvG;AAAA,EAAG,CAAC;AAE3D,MAAI;AACF,iBAAMsG,GACC,MAAME,GAAoBpT,GAAMmT,CAAW;AAAA,EACpD,SAASrS,GAAK;AACZ,UAAAqS,EAAA,GACMrS;AAAA,EACR;AACF;AAEA,eAAesS,GACbpT,GACAmT,GAC2B;AAC3B,QAAM;AAAA,IACJ,SAAAE,IAAU;AAAA,IACV,YAAAC,IAAa,KAAK,IAAI,OAAO,oBAAoB,GAAG,CAAC;AAAA,IACrD,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,EAAA,IACTzT,GACE0T,IAAM,MAAMpC,GAAA,GAIZqC,IAAUJ,KAAqBC,KAAA,QAAAA,EAAc,SAC/C,CAACjD,MAAe;AACd,QAAIoC,IAAmBpC;AACvB,WAAOoC,KAAK;AAGV,UAFIY,KAAqBZ,MAAQY,EAAkB,QAC/CC,KAAgBb,aAAe,WAAWa,EAAa,SAASb,CAAG,KACnEA,aAAe,WAAWA,EAAI,UAAU,SAAS,mBAAmB,EAAG,QAAO;AAClF,MAAAA,IAAMA,EAAI;AAAA,IACZ;AACA,WAAO;AAAA,EACT,IACA,QAEEiB,IAAgBjC,GAAA,GAChBkC,IAAgBJ,IAAWvB,GAAA,IAA4B,MAAM;AAAA,EAAC,GAC9D4B,IAAoBf,GAAA;AAC1B,MAAIgB,IAAW;AACf,QAAMC,IAAU,MAAM;AACpB,QAAI,CAAAD,GACJ;AAAA,MAAAA,IAAW;AACX,UAAI;AAAE,QAAAD,EAAA;AAAA,MAAqB,UAAA;AACzB,YAAI;AAAE,UAAAD,EAAA;AAAA,QAAiB,UAAA;AACrB,cAAI;AAAE,YAAAD,EAAA;AAAA,UAAiB,UAAA;AACrB,YAAAT,EAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,EACF;AAEA,MAAI;AACF,IAAIM,KAEF,MAAM,IAAI,QAAc,CAAC7G,MAAM,sBAAsB,MAAMA,EAAA,CAAG,CAAC;AAGjE,UAAMqH,IAAO,SAAS,iBAChBC,IAAQT,IAAW,KAAK,IAAIQ,EAAK,aAAa,OAAO,UAAU,IAAI,OAAO,YAC1EE,IAASV,IAAW,KAAK,IAAIQ,EAAK,cAAc,OAAO,WAAW,IAAI,OAAO;AAanF,WAAO,EAAE,SAXO,MAAMP,EAAI,OAAOO,GAAM;AAAA,MACrC,SAAAZ;AAAA,MACA,YAAAC;AAAA,MACA,WAAW;AAAA,MACX,GAAIK,IAAS,EAAE,QAAAA,EAAA,IAAW,CAAA;AAAA,MAC1B,kBAAkBpC;AAAA,MAClB,OAAA2C;AAAA,MACA,QAAAC;AAAA,MACA,OAAO,EAAE,WAAW,OAAA;AAAA,IAAO,CAC5B,GAEiB,OAAAD,GAAO,QAAAC,GAAQ,YAAAb,GAAY,SAAAU,EAAA;AAAA,EAC/C,SAASlT,GAAK;AACZ,UAAAkT,EAAA,GACMlT;AAAA,EACR;AACF;ACtQA,IAAIsT,KAAuE;AAEpE,SAASC,GAAmBlT,GAAoE;AACrG,EAAAiT,KAASjT;AACX;AAEO,SAASmT,KAAmF;AACjG,SAAOF;AACT;AAEO,SAASG,IAA6B;AAC3C,EAAAH,KAAS;AACX;ACCA,MAAM1V,KAAS;AAEf,SAAS8V,KAAwB;AAC/B,QAAM5V,IAAI,SAAS,gBAAgBF,IAAQ,KAAK;AAChD,EAAAE,EAAE,aAAa,WAAW,WAAW,GACrCA,EAAE,aAAa,QAAQ,MAAM,GAC7BA,EAAE,aAAa,UAAU,cAAc,GACvCA,EAAE,aAAa,gBAAgB,GAAG,GAClCA,EAAE,aAAa,kBAAkB,OAAO,GACxCA,EAAE,aAAa,mBAAmB,OAAO,GACzCA,EAAE,aAAa,eAAe,MAAM;AACpC,QAAM6V,IAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,aAAWC,KAAKD,GAAO;AACrB,UAAMlU,IAAI,SAAS,gBAAgB7B,IAAQ,MAAM;AACjD,IAAA6B,EAAE,aAAa,KAAKmU,CAAC,GACrB9V,EAAE,YAAY2B,CAAC;AAAA,EACjB;AACA,SAAO3B;AACT;AAcO,SAAS+V,GAAO3U,IAAsB,IAAkB;AAC7D,QAAM4U,IAAU5U,EAAK,WAAW;AAChC,MAAI4L,IAAc,CAAA,GACdiJ,wBAAkB,QAAA,GAClBC,IAAwC,MAGxCC,IAAa,GAGbC,IAAkC,MAClCC,IAAgC,MAChCC,IAAqC,MACrCC,IAAkC;AAEtC,WAASC,IAAc;AACrB,IAAAxJ,IAAO,CAAA,GACPiJ,wBAAkB,QAAA,GAClBC,IAAyB,MACzBC,KAAc,GACdR,EAAA,GACAc,EAAA,GACAC,EAAA;AAAA,EACF;AAEA,WAASC,IAAoC;AAC3C,UAAM1V,IAAO,SAAS,cAAc,mBAAmB;AACvD,YAAOA,KAAA,gBAAAA,EAAM,eAAc;AAAA,EAC7B;AAEA,WAAS2V,IAAwB;AAC/B,QAAI,OAAO,SAAW,IAAa,QAAOxV,EAAK,UAAU;AACzD,QAAIA,EAAK,OAAQ,QAAOA,EAAK;AAC7B,UAAMH,IAAO,SAAS,cAAc,mBAAmB;AACvD,WAAKA,KACK,iBAAiBA,CAAI,EAAE,iBAAiB,iBAAiB,EAAE,KAAA,KACzD;AAAA,EACd;AAEA,iBAAe4V,EAAkBpO,GAA+B;AAC9D,UAAMwI,IAAa0F,EAAA;AACnB,QAAI,CAAC1F,EAAY;AACjB,UAAM/D,IAAS0J,EAAA,GAETE,IAAU,MAAMrO,EAAI,YAAY,aAAa,GAC7CsO,IAAUtI,GAAsB,EAAE,QAAAvB,GAAQ;AAIhD,eAAWM,KAAOR,GAAM;AACtB,YAAMjD,IAASkM,EAAY,IAAIzI,CAAG;AAClC,MAAIzD,KACFgN,EAAQ,OAAOvJ,EAAI,QAAQ;AAAA,QACzB,QAAAzD;AAAA,QACA,UAAUyD,EAAI;AAAA,QACd,cAAcA,EAAI;AAAA,MAAA,CACnB;AAAA,IAEL;AAEA,QAAI;AACF,UAAIwJ,IAAc;AAClB,aAAOA,KACD,EAAAhK,EAAK,UAAUgJ,MADD;AAGlB,cAAMtV,IAAK,MADIsQ,GAAY,EAAE,YAAAC,GAAY,QAAA/D,GAAQ,EACzB;AACxB,YAAI,CAACxM,EAAI;AAET,cAAM2L,IAAO3L,EAAG,sBAAA,GACV4P,IAAU,MAAMD,GAAe;AAAA,UACnC,QAAQ,EAAE,GAAGhE,EAAK,MAAM,GAAGA,EAAK,OAAA;AAAA,UAChC,WAAWW,EAAK,SAAS;AAAA,QAAA,CAC1B;AAGD,YAAIsD,EAAQ,cAAc,OAAO;AAAE,UAAA0G,IAAc;AAAO;AAAA,QAAO;AAC/D,YAAI1G,EAAQ,cAAc,MAAO;AAEjC,cAAM2G,IAAW7K,GAAe1L,CAAE,GAC5B8M,IAAW;AAAA,UACf,QAAQR,EAAK,SAAS;AAAA,UACtB,GAAGiK;AAAA,UACH,GAAI3G,EAAQ,OAAO,EAAE,MAAMA,EAAQ,KAAA,IAAS,CAAA;AAAA,QAAC;AAE/C,QAAAtD,EAAK,KAAKQ,CAAG,GACbyI,EAAY,IAAIzI,GAAK9M,CAAE,GACvBqW,EAAQ,OAAOvJ,EAAI,QAAQ;AAAA,UACzB,QAAQ9M;AAAA,UACR,UAAUuW,EAAS;AAAA,UACnB,cAAcA,EAAS;AAAA,QAAA,CACxB;AAAA,MACH;AAIA,MAAIjK,EAAK,SAAS,KAChB+J,EAAQ,WAAW,uBAAuB,GAC1C,MAAM,IAAI,QAAc,CAAC/I,MAAM,sBAAsB,MAAMA,EAAA,CAAG,CAAC,GAC/D,MAAMkJ,EAAA,MAENhB,IAAyB,MACzBP,EAAA;AAAA,IAEJ,UAAA;AACE,MAAAoB,EAAQ,QAAA,GACRD,EAAA;AAAA,IACF;AAEA,IAAAL,EAAA,GACAC,EAAA;AAAA,EACF;AAMA,iBAAeQ,IAAsC;AACnD,UAAMC,IAAU,EAAEhB;AAClB,QAAInJ,EAAK,WAAW,GAAG;AACrB,MAAAkJ,IAAyB,MACzBP,EAAA,GACAe,EAAA;AACA;AAAA,IACF;AACA,UAAMxJ,IAAS0J,EAAA;AACf,QAAI;AACF,YAAMQ,IAAc,MAAM,KAAK,SAAS,iBAAiB,mBAAmB,CAAC,GACvEC,IAAO,MAAMhD,GAAkB,EAAE,cAAc+C,GAAa;AAClE,UAAI;AACF,YAAID,MAAYhB,EAAY;AAC5B,cAAMmB,IAAuBtK,EAAK,IAAI,CAACrL,OAAO;AAAA,UAC5C,QAAQA,EAAE;AAAA,UACV,UAAUA,EAAE;AAAA,UACZ,cAAcA,EAAE;AAAA,UAChB,GAAIsU,EAAY,IAAItU,CAAC,IAAI,EAAE,aAAasU,EAAY,IAAItU,CAAC,MAAO,CAAA;AAAA,QAAC,EACjE,GACIsL,IAAW,EAAE,GAAGoK,EAAK,OAAO,GAAGA,EAAK,QAAQ,KAAKA,EAAK,WAAA,GACtDE,IAAY,MAAMzK,GAAYuK,EAAK,SAASC,GAASrK,GAAUC,CAAM;AAC3E,YAAIiK,MAAYhB,EAAY;AAC5B,QAAAD,IAAyBqB,GACzB9B,GAAmB,EAAE,SAAS8B,GAAW,MAAM,cAAc;AAAA,MAC/D,UAAA;AACE,QAAAF,EAAK,QAAA;AAAA,MACP;AAAA,IACF,QAAQ;AAEN,UAAIF,MAAYhB,EAAY;AAC5B,MAAAD,IAAyB,MACzBP,EAAA;AAAA,IACF;AACA,IAAIwB,MAAYhB,KAAYO,EAAA;AAAA,EAC9B;AAEA,WAASc,EAAUC,GAAW;AAC5B,UAAMC,IAAM1K,EAAK,UAAU,CAACrL,MAAMA,EAAE,WAAW8V,CAAC;AAChD,IAAIC,MAAQ,OACZ1K,EAAK,OAAO0K,GAAK,CAAC,GAClB1K,EAAK,QAAQ,CAACrL,GAAG+I,MAAM;AAAE,MAAA/I,EAAE,SAAS+I,IAAI;AAAA,IAAG,CAAC,GAK5CwL,IAAyB,MACzBP,EAAA,GACAc,EAAA,GACAC,EAAA,GACKQ,EAAA;AAAA,EACP;AAEA,WAAST,IAAa;AAQpB,QAPIL,MACFA,EAAS,cAAc,SAASpJ,EAAK,MAAM,KAC3CoJ,EAAS,MAAM,UAAUpJ,EAAK,WAAW,IAAI,SAAS,KAEpDuJ,MACFA,EAAM,cAAcvJ,EAAK,WAAW,IAAI,sBAAsB,oBAE5D,EAACqJ,GACL;AAAA,MAAAA,EAAO,YAAY,IACnBA,EAAO,MAAM,UAAUrJ,EAAK,WAAW,IAAI,SAAS;AACpD,iBAAWQ,KAAOR,GAAM;AACtB,cAAM2K,IAAM,SAAS,cAAc,KAAK;AACxC,QAAAA,EAAI,YAAY,mBAChBA,EAAI,QAAQ,MAAM,OAAOnK,EAAI,MAAM;AAEnC,cAAM4B,IAAM,SAAS,cAAc,MAAM;AACzC,QAAAA,EAAI,YAAY,kBAChBA,EAAI,cAAc,OAAO5B,EAAI,MAAM;AAEnC,cAAMoK,IAAO,SAAS,cAAc,KAAK;AACzC,QAAAA,EAAK,YAAY;AACjB,cAAMxT,IAAM,SAAS,cAAc,KAAK;AACxC,QAAAA,EAAI,YAAY,uBAChBA,EAAI,QAAQoJ,EAAI,UAChBpJ,EAAI,cAAcoJ,EAAI,YAAYA,EAAI;AACtC,cAAMqK,IAAY,SAAS,cAAc,OAAO;AAChD,QAAAA,EAAU,OAAO,QACjBA,EAAU,YAAY,yBACtBA,EAAU,cAAc,yBACxBA,EAAU,QAAQrK,EAAI,QAAQ,IAC9BqK,EAAU,iBAAiB,SAAS,MAAM;AACxC,UAAIA,EAAU,MAAM,KAAA,IAAQrK,EAAI,OAAOqK,EAAU,eACrCrK,EAAI;AAAA,QAClB,CAAC,GACDoK,EAAK,YAAYxT,CAAG,GACpBwT,EAAK,YAAYC,CAAS;AAE1B,cAAMC,IAAM,SAAS,cAAc,QAAQ;AAC3C,QAAAA,EAAI,OAAO,UACXA,EAAI,YAAY,mBAChBA,EAAI,aAAa,cAAc,cAActK,EAAI,MAAM,EAAE,GACzDsK,EAAI,YAAYlC,IAAW,GAC3BkC,EAAI,iBAAiB,SAAS,MAAMN,EAAUhK,EAAI,MAAM,CAAC,GAEzDmK,EAAI,YAAYvI,CAAG,GACnBuI,EAAI,YAAYC,CAAI,GACpBD,EAAI,YAAYG,CAAG,GACnBzB,EAAO,YAAYsB,CAAG;AAAA,MACxB;AAAA;AAAA,EACF;AAEA,WAASjB,IAAgB;AACvB,IAAKJ,MACDJ,KACFI,EAAU,MAAMJ,GAChBI,EAAU,MAAM,UAAU,YAE1BA,EAAU,gBAAgB,KAAK,GAC/BA,EAAU,MAAM,UAAU;AAAA,EAE9B;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU7N,GAAK;AAIb,aADYA,EAAI,GAAG,SAAS,MAAM+N,GAAO;AAAA,IAE3C;AAAA,IACA,KAAK/N,GAAK;AACR,aAAO;AAAA,QACL,QAAQ,CAAClF,OAEP6S,IAAW,SAAS,cAAc,KAAK,GACvCA,EAAS,YAAY,0BACrB7S,EAAK,YAAY6S,CAAQ,GAGzBC,IAAS,SAAS,cAAc,KAAK,GACrCA,EAAO,YAAY,mBACnB9S,EAAK,YAAY8S,CAAM,GAGvBE,IAAQ,SAAS,cAAc,QAAQ,GACvCA,EAAM,OAAO,UACbA,EAAM,YAAY,4CAClBA,EAAM,iBAAiB,SAAS,MAAM;AAAE,UAAKM,EAAkBpO,CAAG;AAAA,QAAG,CAAC,GACtElF,EAAK,YAAYgT,CAAK,GAGtBD,IAAY,SAAS,cAAc,KAAK,GACxCA,EAAU,YAAY,gBACtBA,EAAU,MAAM,gCAChBA,EAAU,MAAM,UAAU,QAC1B/S,EAAK,YAAY+S,CAAS,GAE1BG,EAAA,GACAC,EAAA,GACO,MAAM;AAAE,UAAAN,IAAW,MAAMC,IAAS,MAAMC,IAAY,MAAMC,IAAQ;AAAA,QAAM;AAAA,MACjF;AAAA,IAEJ;AAAA,IACA,UAAU;AACR,aAAIvJ,EAAK,WAAW,IAAU,OACvB,EAAE,MAAAA,EAAA;AAAA,IACX;AAAA,EAAA;AAEJ;AChSO,SAAS+K,GAAgBxV,GAA6D;AAC3F,SAAO,CAAC,CAACA,KAAS,OAAOA,KAAU,YAAY,EAAE,OAAOA,MAAU,WAAWA;AAC/E;AC7BO,SAASyV,GAAM5W,IAAqB,IAAkB;AAC3D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,QAAQqH,GAAK;AAGjB,YAAM+M,IAASE,GAAA;AACf,UAAIF;AACF,eAAO,EAAE,SAASA,EAAO,SAAS,MAAMA,EAAO,KAAA;AAGjD,YAAMsB,IAAU,MAAMrO,EAAI,YAAY,MAAM;AAC5C,UAAI;AAIF,cAAM,IAAI,QAAc,CAACuF,MAAM,sBAAsB,MAAMA,EAAA,CAAG,CAAC;AAE/D,cAAMoJ,IAAc,MAAM,KAAK,SAAS,iBAAiB,mBAAmB,CAAC,GACvEC,IAAO,MAAMhD,GAAkB;AAAA,UACnC,SAASjT,EAAK;AAAA,UACd,YAAYA,EAAK;AAAA,UACjB,cAAcgW;AAAA,QAAA,CACf;AAED,YAAI;AAGF,gBAAMa,IAAcxP,EAAI,SAAS,QAAQ,GACnCuE,IAAOkL,GAAkBD,CAAW,GACpChL,IAAW,EAAE,GAAGoK,EAAK,OAAO,GAAGA,EAAK,QAAQ,KAAKA,EAAK,WAAA,GACtDnK,IAAS9L,EAAK,UAAU+W,GAAA;AAK9B,iBAAO,EAAE,SAJKnL,EAAK,SAAS,IACxB,MAAMF,GAAYuK,EAAK,SAASrK,GAAMC,GAAUC,CAAM,IACtDmK,EAAK,SAEgB,MAAM,aAAA;AAAA,QACjC,UAAA;AACE,UAAAA,EAAK,QAAA;AAAA,QACP;AAAA,MACF,UAAA;AACE,QAAAP,EAAA;AAAA,MACF;AAAA,IACF;AAAA,EAAA;AAEJ;AAEA,SAASoB,GAAkB3V,GAA6C;AACtE,MAAI,CAACA,KAASwV,GAAgBxV,CAAK,UAAU,CAAA;AAC7C,QAAM6V,IAAW7V,EAA6B;AAC9C,SAAK,MAAM,QAAQ6V,CAAO,IACnBA,EACJ,OAAO,CAACzW,MAAoC,CAAC,CAACA,KAAK,OAAOA,KAAM,QAAQ,EACxE,IAAI,CAACA,OAAO;AAAA,IACX,QAAQ,OAAOA,EAAE,MAAM,KAAK;AAAA,IAC5B,UAAU,OAAOA,EAAE,YAAa,WAAWA,EAAE,WAAW;AAAA,IACxD,cAAeA,EAAE,gBAA8C,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA;AAAA,EAAE,EACxF,IAPgC,CAAA;AAQtC;AAEA,SAASwW,KAAqB;AAC5B,MAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,QAAMlX,IAAO,SAAS,cAAc,mBAAmB;AACvD,SAAKA,KACK,iBAAiBA,CAAI,EAAE,iBAAiB,iBAAiB,EAAE,KAAA,KACzD;AACd;ACzEA,MAAMmN,KAAmB,qBACnBiK,KAAkB,4BAClBxL,KAAiB;AAkBhB,SAASyL,GAAqBlX,GAA6C;AAChF,QAAM8L,IAAS9L,EAAK,UAAUyL,IACxB0L,IAAYnX,EAAK,aAAa,KAAK,IAAA,GAGnC0N,IAAQ,SAAS,cAAc,KAAK;AAC1C,EAAAA,EAAM,YAAY,GAAGV,EAAgB,iCACrCU,EAAM,aAAa,eAAe,MAAM,GACxCA,EAAM,MAAM,YAAY,2BAA2B5B,CAAM,GACzD,SAAS,KAAK,YAAY4B,CAAK;AAG/B,QAAM0J,IAAO,SAAS,cAAc,KAAK;AACzC,EAAAA,EAAK,YAAY,GAAGpK,EAAgB,gCACpCoK,EAAK,aAAa,QAAQ,QAAQ,GAClCA,EAAK,aAAa,cAAc,0BAA0B,GAC1DA,EAAK,MAAM,YAAY,2BAA2BtL,CAAM;AAExD,QAAMyK,IAAM,SAAS,cAAc,KAAK;AACxC,EAAAA,EAAI,YAAY;AAEhB,QAAMc,IAAS,SAAS,cAAc,MAAM;AAC5C,EAAAA,EAAO,YAAY,kCACnBA,EAAO,aAAa,eAAe,MAAM;AAEzC,QAAMC,IAAW,SAAS,cAAc,MAAM;AAC9C,EAAAA,EAAS,YAAY,oCACrBA,EAAS,cAAc;AAEvB,QAAMC,IAAM,SAAS,cAAc,MAAM;AACzC,EAAAA,EAAI,YAAY,8BAChBA,EAAI,aAAa,eAAe,MAAM,GACtCA,EAAI,cAAc;AAElB,QAAMC,IAAQ,SAAS,cAAc,MAAM;AAC3C,EAAAA,EAAM,YAAY,gCAClBA,EAAM,cAAc;AAEpB,QAAMC,IAAU,SAAS,cAAc,QAAQ;AAC/C,EAAAA,EAAQ,OAAO,UACfA,EAAQ,YAAY,+BACpBA,EAAQ,cAAc,QACtBA,EAAQ,aAAa,cAAc,iBAAiB,GAEpDlB,EAAI,YAAYc,CAAM,GACtBd,EAAI,YAAYe,CAAQ,GACxBf,EAAI,YAAYgB,CAAG,GACnBhB,EAAI,YAAYiB,CAAK,GACrBjB,EAAI,YAAYkB,CAAO,GACvBL,EAAK,YAAYb,CAAG;AAEpB,QAAMmB,IAAQ,SAAS,cAAc,KAAK;AAC1C,EAAAA,EAAM,YAAY,8BACd1X,EAAK,OACP0X,EAAM,cAAc1X,EAAK,KACzB0X,EAAM,QAAQ1X,EAAK,OAEnB0X,EAAM,MAAM,UAAU,QAExBN,EAAK,YAAYM,CAAK,GAEtB,SAAS,KAAK,YAAYN,CAAI;AAK9B,QAAMtU,IAAU6U,EAAA,KAAkBC,EAAA;AAClC,EAAAC,EAASC,EAAMhV,CAAO,CAAC;AAEvB,WAAS6U,IAAgD;AACvD,QAAI;AACF,YAAMI,IAAM,aAAa,QAAQd,EAAe;AAChD,UAAI,CAACc,EAAK,QAAO;AACjB,YAAMC,IAAS,KAAK,MAAMD,CAAG,GACvBzL,IAAI,OAAO0L,EAAO,KAAM,WAAWA,EAAO,IAAI,KAC9CzL,IAAI,OAAOyL,EAAO,KAAM,WAAWA,EAAO,IAAI;AACpD,aAAI,CAAC,OAAO,SAAS1L,CAAC,KAAK,CAAC,OAAO,SAASC,CAAC,IAAU,OAChD,EAAE,GAAAD,GAAG,GAAAC,EAAA;AAAA,IACd,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAASqL,IAAuC;AAE9C,UAAMpL,IADO4K,EAAK,sBAAA,EACH,SAAS;AACxB,WAAO,EAAE,GAAG,KAAK,IAAI,GAAG,KAAK,OAAO,OAAO,aAAa5K,KAAK,CAAC,CAAC,GAAG,GAAG,GAAA;AAAA,EACvE;AAEA,WAASsL,EAAMG,GAAyD;AAEtE,UAAMhN,IAAOmM,EAAK,sBAAA,GACZ5K,IAAIvB,EAAK,SAAS,KAClBwB,IAAIxB,EAAK,UAAU,IACnBiN,KAAO,KAAK,IAAI,GAAQ,OAAO,aAAa1L,IAAI,CAAM,GACtD2L,KAAO,KAAK,IAAI,GAAQ,OAAO,cAAc1L,IAAI,CAAM;AAC7D,WAAO;AAAA,MACL,GAAG,KAAK,IAAI,KAAK,IAAI,GAAQwL,EAAI,CAAC,GAAGC,EAAI;AAAA,MACzC,GAAG,KAAK,IAAI,KAAK,IAAI,GAAQD,EAAI,CAAC,GAAGE,EAAI;AAAA,IAAA;AAAA,EAE7C;AAEA,WAASN,EAASI,GAAqC;AACrD,IAAAb,EAAK,MAAM,OAAO,GAAGa,EAAI,CAAC,MAC1Bb,EAAK,MAAM,MAAM,GAAGa,EAAI,CAAC;AAAA,EAC3B;AAGA,MAAIG,IAAW,IACXC,IAAiC,MACjCC,IAAa,EAAE,GAAG,GAAG,GAAG,EAAA;AAE5B,WAASC,EAAc3X,GAAuB;AAE5C,QAAIA,EAAE,kBAAkB,WAAWA,EAAE,OAAO,QAAQ,8BAA8B,EAAG;AACrF,IAAAA,EAAE,eAAA,GACFwX,IAAW,IACXC,IAAkBzX,EAAE;AACpB,QAAI;AAAE,MAAAwW,EAAK,kBAAkBxW,EAAE,SAAS;AAAA,IAAG,QAAQ;AAAA,IAAgB;AACnE,IAAAwW,EAAK,aAAa,iBAAiB,MAAM;AACzC,UAAMnM,IAAOmM,EAAK,sBAAA;AAClB,IAAAkB,IAAa,EAAE,GAAG1X,EAAE,UAAUqK,EAAK,MAAM,GAAGrK,EAAE,UAAUqK,EAAK,IAAA;AAAA,EAC/D;AAEA,WAASuN,EAAc5X,GAAuB;AAC5C,IAAI,CAACwX,KAAYxX,EAAE,cAAcyX,KACjCR,EAASC,EAAM,EAAE,GAAGlX,EAAE,UAAU0X,EAAW,GAAG,GAAG1X,EAAE,UAAU0X,EAAW,EAAA,CAAG,CAAC;AAAA,EAC9E;AAEA,WAASG,EAAQ7X,GAAuB;AACtC,QAAI,CAACwX,KAAYxX,EAAE,cAAcyX,EAAiB;AAClD,IAAAD,IAAW,IACXC,IAAkB,MAClBjB,EAAK,gBAAgB,eAAe;AACpC,QAAI;AAAE,MAAAA,EAAK,sBAAsBxW,EAAE,SAAS;AAAA,IAAG,QAAQ;AAAA,IAAgB;AAEvE,UAAMqK,IAAOmM,EAAK,sBAAA;AAClB,QAAI;AACF,mBAAa,QAAQH,IAAiB,KAAK,UAAU,EAAE,GAAGhM,EAAK,MAAM,GAAGA,EAAK,IAAA,CAAK,CAAC;AAAA,IACrF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAAmM,EAAK,iBAAiB,eAAemB,CAAa,GAClDnB,EAAK,iBAAiB,eAAeoB,CAAa,GAClDpB,EAAK,iBAAiB,aAAaqB,CAAO,GAC1CrB,EAAK,iBAAiB,iBAAiBqB,CAAO,GAI9ChB,EAAQ,iBAAiB,SAAS,CAAC7W,MAAM;AACvC,IAAAA,EAAE,gBAAA,GACFZ,EAAK,OAAA;AAAA,EACP,CAAC;AAGD,WAAS0Y,IAAiB;AACxB,UAAMzN,IAAOmM,EAAK,sBAAA;AAClB,IAAAS,EAASC,EAAM,EAAE,GAAG7M,EAAK,MAAM,GAAGA,EAAK,IAAA,CAAK,CAAC;AAAA,EAC/C;AACA,SAAO,iBAAiB,UAAUyN,CAAQ;AAG1C,WAASC,IAAa;AACpB,UAAMC,IAAU,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,IAAA,IAAQzB,KAAa,GAAI,CAAC;AACvE,IAAAK,EAAM,cAAcqB,GAAcD,CAAO;AAAA,EAC3C;AACA,EAAAD,EAAA;AACA,QAAMG,IAAU,OAAO,YAAYH,GAAM,GAAI;AAE7C,SAAO;AAAA,IACL,UAAU1G,GAAK;AACb,MAAIA,KACFyF,EAAM,cAAczF,GACpByF,EAAM,QAAQzF,GACdyF,EAAM,MAAM,UAAU,MAEtBA,EAAM,MAAM,UAAU;AAAA,IAE1B;AAAA,IACA,UAAU;AACR,aAAO,cAAcoB,CAAO,GAC5B,OAAO,oBAAoB,UAAUJ,CAAQ,GAC7CtB,EAAK,oBAAoB,eAAemB,CAAa,GACrDnB,EAAK,oBAAoB,eAAeoB,CAAa,GACrDpB,EAAK,oBAAoB,aAAaqB,CAAO,GAC7CrB,EAAK,oBAAoB,iBAAiBqB,CAAO,GACjD/K,EAAM,OAAA,GACN0J,EAAK,OAAA;AAAA,IACP;AAAA,EAAA;AAEJ;AAEA,SAASyB,GAAcE,GAAyB;AAC9C,QAAMtM,IAAI,KAAK,MAAMsM,IAAU,IAAI,GAC7B9K,IAAI,KAAK,MAAO8K,IAAU,OAAQ,EAAE,GACpCna,IAAIma,IAAU;AACpB,SAAItM,IAAI,IAAU,GAAGuM,EAAIvM,CAAC,CAAC,IAAIuM,EAAI/K,CAAC,CAAC,IAAI+K,EAAIpa,CAAC,CAAC,KACxC,GAAGoa,EAAI/K,CAAC,CAAC,IAAI+K,EAAIpa,CAAC,CAAC;AAC5B;AAEA,SAASoa,EAAI3C,GAAmB;AAC9B,SAAOA,IAAI,KAAK,IAAIA,CAAC,KAAK,OAAOA,CAAC;AACpC;AC7MA,MAAM4C,IAAa,IACbC,KAAuB,2IAMvBC,KAAa,MACbC,KAAe;AAErB,SAAS1O,GAAS9L,GAAWyX,GAAmB;AAC9C,SAAOzX,EAAE,SAASyX,IAAIzX,EAAE,MAAM,GAAGyX,CAAC,IAAIzX;AACxC;AAOA,SAAS8J,GAAcpJ,GAAqB;AAC1C,MAAIA,EAAG,GAAI,QAAO,IAAI,IAAI,OAAOA,EAAG,EAAE,CAAC;AACvC,QAAMsJ,IAAkB,CAAA;AACxB,MAAI+J,IAAsBrT;AAC1B,WAASgK,IAAI,GAAGA,IAAI,KAAKqJ,GAAKrJ,KAAK;AACjC,UAAM7K,IAAMkU,EAAI,QAAQ,YAAA,GAClBvK,IAAKuK,EAAI,KAAK,IAAI,IAAI,OAAOA,EAAI,EAAE,CAAC,KAAK,IACzC7B,IAAM6B,EAAI,UAAU,SAAS,IAC/B,MAAM,MAAM,KAAKA,EAAI,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,IAAI,MAAM,EAAE,KAAK,GAAG,IACpE;AAEJ,QADA/J,EAAM,QAAQ,GAAGnK,CAAG,GAAG2J,CAAE,GAAG0I,CAAG,EAAE,GAC7B1I,EAAI;AACR,IAAAuK,IAAMA,EAAI;AAAA,EACZ;AACA,SAAO/J,EAAM,KAAK,KAAK;AACzB;AAEA,SAASyQ,EAAUza,GAA8ByX,GAA+B;AAC9E,MAAI,CAACzX,EAAG;AACR,QAAM0a,IAAU1a,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAA;AACvC,MAAK0a;AACL,WAAOA,EAAQ,SAASjD,IAAIiD,EAAQ,MAAM,GAAGjD,CAAC,IAAIiD;AACpD;AAEA,SAASC,GAAeja,GAAiC;AACvD,QAAMH,IAAOka,EAAU/Z,EAAG,aAAa2Z,CAAU,GAC3CO,IAAYH,EAAU/Z,EAAG,aAAa,YAAY,GAAG2Z,CAAU,GAC/DQ,IAASna,EAAG,aAAa,aAAa,KAAK,QAC3CQ,IAAOR,EAAG,aAAa,MAAM,KAAK;AAKxC,MAAIC,IAA4Bia,KAAara;AAC7C,MAAI,CAACI,GAAO;AACV,UAAMma,IAAWpa,EAAG,QAAQ4Z,EAAoB;AAChD,IAAIQ,KAAYA,MAAapa,MAC3BC,IAAQ8Z,EAAUK,EAAS,aAAa,YAAY,GAAGT,CAAU,KAC5DI,EAAUK,EAAS,aAAaT,CAAU;AAAA,EAEnD;AAEA,SAAO;AAAA,IACL,KAAK3Z,EAAG,QAAQ,YAAA;AAAA,IAChB,IAAIA,EAAG,MAAM;AAAA,IACb,SAAS,MAAM,KAAKA,EAAG,SAAS,EAAE,MAAM,GAAG,EAAE;AAAA,IAC7C,MAAMA,EAAG,aAAa,MAAM;AAAA,IAC5B,UAAUoJ,GAAcpJ,CAAE;AAAA,IAC1B,GAAIH,IAAO,EAAE,MAAAA,EAAA,IAAS,CAAA;AAAA,IACtB,GAAIqa,IAAY,EAAE,WAAAA,EAAA,IAAc,CAAA;AAAA,IAChC,GAAIC,IAAS,EAAE,QAAAA,EAAA,IAAW,CAAA;AAAA,IAC1B,GAAI3Z,IAAO,EAAE,MAAAA,EAAA,IAAS,CAAA;AAAA;AAAA,IAEtB,GAAIP,KAASA,MAAUJ,IAAO,EAAE,OAAAI,EAAA,IAAU,CAAA;AAAA,EAAC;AAE/C;AAUA,SAASoa,GAAgBrN,GAAWC,GAAiC;AACnE,QAAMmE,IAAmC,CAAA,GACnCkJ,IAAM,SAAS,iBAA8B,QAAQ;AAC3D,aAAWta,KAAM,MAAM,KAAKsa,CAAG,GAAG;AAChC,UAAMxH,IAAK,iBAAiB9S,CAAE;AAC9B,QAAI8S,EAAG,aAAa,WAAWA,EAAG,aAAa,SAAU;AACzD,UAAMnH,IAAO3L,EAAG,sBAAA;AAChB,QAAIgN,IAAIrB,EAAK,QAAQqB,IAAIrB,EAAK,SAASsB,IAAItB,EAAK,OAAOsB,IAAItB,EAAK,OAAQ;AACxE,UAAM4O,IAAI,SAASzH,EAAG,QAAQ,EAAE;AAChC,IAAI,CAAC,OAAO,SAASyH,CAAC,KAAKzH,EAAG,WAAW,UACzC1B,EAAW,KAAK;AAAA,MACd,KAAKpR,EAAG,QAAQ,YAAA;AAAA,MAChB,QAAQ,OAAO,SAASua,CAAC,IAAIA,IAAI;AAAA,MACjC,eAAezH,EAAG;AAAA,MAClB,SAAS,MAAM,KAAK9S,EAAG,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAAA,IAAA,CACvD;AAAA,EACH;AACA,SAAOoR,EACJ,KAAK,CAAC,GAAGnL,MAAMA,EAAE,SAAS,EAAE,MAAM,EAClC,MAAM,GAAG6T,EAAY;AAC1B;AAOA,SAASU,GAAoBC,GAAqC;AAChE,QAAMC,IAAS,CAAC1V,MAAgC,CAAC1D,MAAmB;AAClE,UAAMqZ,IAAKrZ,GACL+H,IAASsR,EAAG;AAClB,QAAI,EAAEtR,aAAkB,SAAU;AAElC,UAAM2D,IAAI2N,EAAG,SACP1N,IAAI0N,EAAG,SAIPC,IAAM,SAAS,iBAAiB5N,GAAGC,CAAC,GACpC4N,IAAaD,MAAQvR,MAAWuR,IAAMvR,EAAO,SAASuR,CAAG,KAAKA,EAAI,SAASvR,CAAM,IAAI,KAErFyR,IAAc,SAAS,iBAAiB,oCAAoC,EAAE,QAC9EC,IAAS,iBAAiB,SAAS,IAAI,EAAE,eAKzCC,IAAWH,IAAa,CAAA,IAAKR,GAAgBrN,GAAGC,CAAC;AAEvD,IAAAwN,EAAG,UAAU;AAAA,MACX,MAAAzV;AAAA,MACA,QAAQiV,GAAe5Q,CAAM;AAAA,MAC7B,kBAAkBwR;AAAA,MAClB,GAAI,CAACA,KAAcD,aAAe,UAAU,EAAE,WAAWX,GAAeW,CAAG,EAAA,IAAM,CAAA;AAAA,MACjF,QAAQ,EAAE,GAAA5N,GAAG,GAAAC,EAAA;AAAA,MACb,aAAA6N;AAAA,MACA,mBAAmBC;AAAA,MACnB,GAAIC,EAAS,SAAS,IAAI,EAAE,iBAAiBA,EAAA,IAAa,CAAA;AAAA,IAAC,CAC5D;AAAA,EACH,GAEMC,IAAUP,EAAO,OAAO,GACxBQ,IAAcR,EAAO,WAAW;AAGtC,kBAAS,iBAAiB,SAASO,GAAS,EAAE,SAAS,IAAM,SAAS,IAAM,GAC5E,SAAS,iBAAiB,aAAaC,GAAa,EAAE,SAAS,IAAM,SAAS,IAAM,GAE7E,MAAM;AACX,aAAS,oBAAoB,SAASD,GAAS,EAAE,SAAS,IAAM,GAChE,SAAS,oBAAoB,aAAaC,GAAa,EAAE,SAAS,IAAM;AAAA,EAC1E;AACF;AAMA,SAASC,GAAoBV,GAAqC;AAChE,QAAMW,IAAe,QAAQ,WACvBC,IAAkB,QAAQ;AAChC,MAAIC,IAAU,OAAO,SAAS;AAE9B,QAAMC,IAAO,CAACC,MAAwC;AACpD,UAAMC,IAAK,OAAO,SAAS;AAC3B,QAAIA,MAAOH,EAAS;AACpB,UAAMI,IAAOJ;AACb,IAAAA,IAAUG,GACVhB,EAAG,UAAU,EAAE,MAAM,SAAS,MAAAiB,GAAM,IAAAD,GAAI,KAAAD,GAAK;AAAA,EAC/C;AAEA,UAAQ,YAAY,YAA6BG,GAA4C;AAC3F,UAAMC,IAAMR,EAAa,MAAM,MAAMO,CAAI;AACzC,WAAAJ,EAAK,WAAW,GACTK;AAAA,EACT,GACA,QAAQ,eAAe,YAAgCD,GAA+C;AACpG,UAAMC,IAAMP,EAAgB,MAAM,MAAMM,CAAI;AAC5C,WAAAJ,EAAK,cAAc,GACZK;AAAA,EACT;AAEA,QAAMC,IAAQ,MAAYN,EAAK,UAAU,GACnCO,IAAS,MAAYP,EAAK,YAAY;AAC5C,gBAAO,iBAAiB,YAAYM,CAAK,GACzC,OAAO,iBAAiB,cAAcC,CAAM,GAErC,MAAM;AACX,YAAQ,YAAYV,GACpB,QAAQ,eAAeC,GACvB,OAAO,oBAAoB,YAAYQ,CAAK,GAC5C,OAAO,oBAAoB,cAAcC,CAAM;AAAA,EACjD;AACF;AAQA,SAASC,GAAqBtB,GAAqC;AACjE,QAAMzZ,wBAAW,QAAA,GAEX0Z,IAAS,CAAC1a,GAAaoQ,MAAgD;AAC3E,UAAM4L,IAAW5S,GAAcpJ,CAAE;AACjC,IAAAya,EAAG,WAAW;AAAA,MACZ,MAAM;AAAA,MACN,QAAArK;AAAA,MACA,UAAA4L;AAAA,MACA,OAAOhc,EAAG,aAAa,YAAY;AAAA,MACnC,GAAIoQ,MAAW,UAAU,EAAE,WAAWhF,GAASpL,EAAG,WAAW6Z,EAAU,MAAM,CAAA;AAAA,IAAC,CAC/E;AAAA,EACH;AAIA,aAAW7Z,KAAM,MAAM,KAAK,SAAS,iBAAiB,iBAAiB,CAAC;AACtE,IAAAgB,EAAK,IAAIhB,CAAE;AAGb,QAAMic,IAAM,IAAI,iBAAiB,CAACC,MAAc;AxB5P3C,QAAApc,GAAAsD,GAAA+Y,GAAAC;AwB6PH,eAAWzN,KAAKuN,GAAW;AACzB,iBAAWjL,KAAQ,MAAM,KAAKtC,EAAE,UAAU,GAAG;AAC3C,YAAI,EAAEsC,aAAgB,SAAU;AAChC,cAAMoL,KAAUvc,IAAAmR,EAAK,YAAL,QAAAnR,EAAA,KAAAmR,GAAe,qBAC3B,CAACA,CAAI,IACL,MAAM,OAAK7N,IAAA6N,EAAK,qBAAL,gBAAA7N,EAAA,KAAA6N,GAAwB,uBAAsB,CAAA,CAAE;AAC/D,mBAAWmE,KAAKiH;AACd,UAAIrb,EAAK,IAAIoU,CAAC,MACdpU,EAAK,IAAIoU,CAAC,GACVsF,EAAOtF,GAAG,OAAO;AAAA,MAErB;AACA,iBAAWnE,KAAQ,MAAM,KAAKtC,EAAE,YAAY,GAAG;AAC7C,YAAI,EAAEsC,aAAgB,SAAU;AAChC,cAAMoL,KAAUF,IAAAlL,EAAK,YAAL,QAAAkL,EAAA,KAAAlL,GAAe,qBAC3B,CAACA,CAAI,IACL,MAAM,OAAKmL,IAAAnL,EAAK,qBAAL,gBAAAmL,EAAA,KAAAnL,GAAwB,uBAAsB,CAAA,CAAE;AAC/D,mBAAWmE,KAAKiH;AACd,UAAKrb,EAAK,IAAIoU,CAAC,MACfpU,EAAK,OAAOoU,CAAC,GACbsF,EAAOtF,GAAG,SAAS;AAAA,MAEvB;AACA,MAAIzG,EAAE,SAAS,gBAAgBA,EAAE,kBAAkB,gBAAgBA,EAAE,kBAAkB,WACjFA,EAAE,OAAO,aAAa,MAAM,MAAM,YAAU+L,EAAO/L,EAAE,QAAQ,OAAO;AAAA,IAE5E;AAAA,EACF,CAAC;AACD,SAAAsN,EAAI,QAAQ,SAAS,MAAM;AAAA,IACzB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,iBAAiB,CAAC,YAAY;AAAA,EAAA,CAC/B,GAEM,MAAMA,EAAI,WAAA;AACnB;AAQA,SAASK,GAAqB7B,GAAqC;AACjE,QAAM7Z,IAAU,CAACU,MAAmB;AAClC,UAAMib,IAAOjb,EAAE;AACf,QAAI,EAAEib,aAAgB,iBAAkB;AACxC,UAAMzZ,IAA+B,CAAA;AACrC,eAAW9C,KAAM,MAAM,KAAKuc,EAAK,QAAQ,GAAG;AAC1C,UAAI,EAAEvc,aAAc,oBAAoBA,aAAc,uBAAuBA,aAAc,mBAAoB;AAC/G,YAAMQ,IAAOR,EAAG,aAAa,MAAM,KAAK,aAClCkK,IAAOlK,aAAc,mBAAmBA,EAAG,OAAOA,EAAG,QAAQ,YAAA;AAEnE,UAAIwc;AACJ,MAAIxc,aAAc,qBAAqBA,EAAG,SAAS,cAAcA,EAAG,SAAS,WAC3Ewc,IAAWxc,EAAG,UAEdwc,IAAW,CAAC,CAAExc,EAAkE,OAElF8C,EAAO,KAAK,EAAE,MAAAtC,GAAM,MAAA0J,GAAM,UAAAsS,GAAU;AAAA,IACtC;AACA,IAAA/B,EAAG,WAAW;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,IAAI8B,EAAK,MAAM;AAAA,QACf,QAAQA,EAAK,aAAa,QAAQ,KAAK;AAAA,QACvC,SAASA,EAAK,aAAa,QAAQ,KAAK,OAAO,YAAA;AAAA,QAC/C,UAAUnT,GAAcmT,CAAI;AAAA,QAC5B,QAAAzZ;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EACH;AACA,kBAAS,iBAAiB,UAAUlC,GAAS,EAAE,SAAS,IAAM,GACvD,MAAM,SAAS,oBAAoB,UAAUA,GAAS,EAAE,SAAS,IAAM;AAChF;AAEO,SAAS6b,GAAkBhC,GAAiD;AACjF,QAAMiC,IAAYlC,GAAoBC,CAAE,GAClCkC,IAAYxB,GAAoBV,CAAE,GAClCmC,IAAab,GAAqBtB,CAAE,GACpCoC,IAAaP,GAAqB7B,CAAE;AAC1C,SAAO;AAAA,IACL,YAAY;AACV,MAAAiC,EAAA,GACAC,EAAA,GACAC,EAAA,GACAC,EAAA;AAAA,IACF;AAAA,EAAA;AAEJ;ACxTA,MAAMC,IAAY,KACZC,KAAa,KAAK,MAClBC,KAAW,cACXC,yBAAuB,IAAI,CAAC,QAAQ,OAAO,SAAS,QAAQ,CAAC,GAG7DC,KAA4B;AAAA,EAChC;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AACF,GAGMC,KAAiB;AAEvB,SAASzW,EAAMpH,GAAWyX,GAAmB;AAC3C,SAAOzX,EAAE,SAASyX,IAAIzX,EAAE,MAAM,GAAGyX,CAAC,IAAIzX;AACxC;AAEA,SAAS8d,GAAa9d,GAAmB;AACvC,MAAIqC,IAAMrC;AACV,aAAW+d,KAAMH;AACf,IAAAvb,IAAMA,EAAI,QAAQ0b,GAAIL,EAAQ;AAEhC,SAAOrb;AACT;AAEA,SAAS2b,EAAkBvY,GAAyB;AAClD,MAAIA,MAAU,QAAQ,OAAOA,KAAU;AACrC,WAAI,OAAOA,KAAU,WAAiBqY,GAAarY,CAAK,IACjDA;AAET,MAAI,MAAM,QAAQA,CAAK,EAAG,QAAOA,EAAM,IAAIuY,CAAiB;AAC5D,QAAM3b,IAA+B,CAAA;AACrC,aAAW,CAACmI,GAAG7H,CAAC,KAAK,OAAO,QAAQ8C,CAAgC;AAClE,IAAApD,EAAImI,CAAC,IAAIqT,GAAe,KAAKrT,CAAC,IAAIkT,KAAWM,EAAkBrb,CAAC;AAElE,SAAON;AACT;AAEA,SAAS4b,GAAW1d,GAAc2d,GAAyC;AACzE,MAAIA,KAAeA,EAAY,SAAS,kBAAkB;AACxD,QAAI;AACF,YAAM9E,IAAS,KAAK,MAAM7Y,CAAI;AAC9B,aAAO,KAAK,UAAUyd,EAAkB5E,CAAM,CAAC;AAAA,IACjD,QAAQ;AAAA,IAER;AAEF,SAAO0E,GAAavd,CAAI;AAC1B;AAGA,SAAS4d,EAAY5d,GAAc2d,GAAqD;AACtF,QAAME,IAAW7d,EAAK,QAChB8d,IAA0B,EAAE,UAAUD,EAAA;AAC5C,SAAIA,IAAWX,MACbY,EAAI,OAAOJ,GAAW1d,EAAK,MAAM,GAAGkd,EAAU,GAAGS,CAAW,GAC5DG,EAAI,gBAAgB,MAEpBA,EAAI,OAAOJ,GAAW1d,GAAM2d,CAAW,GAErCA,QAAiB,cAAcA,IAC5BG;AACT;AAGA,SAASC,GAAgBra,GAA0Bsa,GAA8C;AAC/F,QAAMlb,IAAOkb,KAAA,gBAAAA,EAAM;AACnB,MAAIlb,KAAQ,MAAM;AAChB,QAAI,OAAOA,KAAS,SAAU,QAAOA;AACrC,QAAIA,aAAgB,gBAAiB,QAAOA,EAAK,SAAA;AACjD,QAAIA,aAAgB,UAAU;AAE5B,YAAMG,IAAmB,CAAA;AACzB,aAAAH,EAAK,QAAQ,CAACV,GAAG6H,MAAM;AACrB,QAAAhH,EAAO,KAAK,GAAGgH,CAAC,IAAI,OAAO7H,KAAM,WAAW,IAAIA,EAAE,MAAM,OAAO,QAAQ,EAAE;AAAA,MAC3E,CAAC,GACM,cAAca,EAAO,KAAK,GAAG,CAAC;AAAA,IACvC;AACA,WAAIH,aAAgB,OAAa,SAASA,EAAK,IAAI,KAAKA,EAAK,QAAQ,SAAS,MAC1EA,aAAgB,cAAoB,WAAWA,EAAK,UAAU,OAC9D,YAAY,OAAOA,CAAI,IAAU,WAAYA,EAAyB,UAAU,OAE7E;AAAA,EACT;AAEA,SAAIY,aAAiB,SAGZ;AAGX;AAGA,SAASua,GAAWva,GAA0Bsa,GAAwC;AASpF,SADI,IAPiB,CAAC1Q,MACfA,IACDA,aAAa,UAAgBA,EAAE,IAAI,eAAe,IAClD,MAAM,QAAQA,CAAC,IAAUA,EAAE,KAAK,CAAC,CAACrD,CAAC,MAAMA,EAAE,YAAA,MAAkB,eAAe,IAC5E,OAAOqD,KAAM,WAAiB,OAAO,KAAKA,CAAC,EAAE,KAAK,CAACrD,MAAMA,EAAE,YAAA,MAAkB,eAAe,IACzF,KAJQ,IAMA+T,KAAA,gBAAAA,EAAM,OAAO,KAC1Bta,aAAiB,WAAWA,EAAM,QAAQ,IAAI,eAAe;AAEnE;AAEA,SAASwa,GAAsBxa,GAA0Bsa,GAAmD;AAe1G,UAdoB,CAAC1Q,MAAmD;AACtE,QAAKA,GACL;AAAA,UAAIA,aAAa,QAAS,QAAOA,EAAE,IAAI,cAAc,KAAK;AAC1D,UAAI,MAAM,QAAQA,CAAC,GAAG;AACpB,cAAM7L,IAAI6L,EAAE,KAAK,CAAC,CAACrD,CAAC,MAAMA,EAAE,YAAA,MAAkB,cAAc;AAC5D,eAAOxI,IAAIA,EAAE,CAAC,IAAI;AAAA,MACpB;AACA,UAAI,OAAO6L,KAAM;AACf,mBAAW,CAACrD,GAAG7H,CAAC,KAAK,OAAO,QAAQkL,CAAC;AACnC,cAAIrD,EAAE,kBAAkB,eAAgB,QAAO7H;AAAA;AAAA;AAAA,EAIrD,GACmB4b,KAAA,gBAAAA,EAAM,OAAO,MAAMta,aAAiB,WAAUA,EAAM,QAAQ,IAAI,cAAc,KAAK;AACxG;AAEA,SAASya,GACPza,GACAsa,GACAI,GACmC;AACnC,MAAI,CAAChB,GAAiB,IAAIgB,CAAM,EAAG;AACnC,QAAMC,IAAUJ,GAAWva,GAAOsa,CAAI,GAChCM,IAAWP,GAAgBra,GAAOsa,CAAI;AAC5C,MAAIM,KAAY,QAAQ,CAACD,EAAS;AAClC,QAAMV,IAAcO,GAAsBxa,GAAOsa,CAAI,GAC/CO,IAAiCD,KAAY,OAC/CV,EAAYU,GAAUX,CAAW,IACjC,CAAA;AACJ,SAAIU,QAAiB,UAAU,KACxBE;AACT;AAWA,SAASC,GAAU3d,GAAyC;AAC1D,QAAMgd,IAAW,OAAO;AACxB,MAAI,OAAOA,KAAa,WAAY,QAAO,MAAM;AAAA,EAA2B;AAE5E,QAAMY,IAAwB,OAC5B/a,GACAsa,MACsB;AACtB,UAAMU,IAAQ,YAAY,IAAA,GACpBN,MAAUJ,KAAA,gBAAAA,EAAM,YAAWta,aAAiB,UAAUA,EAAM,SAAS,QAAQ,YAAA,GAC7EoP,IACJ,OAAOpP,KAAU,WACbA,IACAA,aAAiB,MACfA,EAAM,SAAA,IACNA,EAAM,KAIRib,IAAUR,GAAoBza,GAAOsa,GAAMI,CAAM;AAEvD,QAAI;AAIF,YAAMlN,IAAM,MAAM2M,EAAS,KAAK,QAAQna,GAAsBsa,CAAI,GAC5DY,IAAa,KAAK,MAAM,YAAY,IAAA,IAAQF,CAAK,GACjDG,IAAS3N,EAAI,UAAU;AAI7B,UAAIrO;AACJ,UAAIgc,KAAUhe,EAAK;AACjB,YAAI;AACF,gBAAMb,IAAO,MAAMkR,EAAI,MAAA,EAAQ,KAAA,GACzB4N,IAAK5N,EAAI,QAAQ,IAAI,cAAc,KAAK;AAC9C,UAAArO,IAAW+a,EAAY5d,GAAM8e,CAAE;AAAA,QACjC,QAAQ;AAAA,QAER;AAGF,cAAID,KAAUhe,EAAK,YACjBA,EAAK,KAAK;AAAA,QACR,MAAM;AAAA,QACN,KAAKgG,EAAMiM,GAAKmK,CAAS;AAAA,QACzB,QAAAmB;AAAA,QACA,QAAQlN,EAAI;AAAA,QACZ,YAAA0N;AAAA,QACA,QAAAC;AAAA,QACA,GAAIF,IAAU,EAAE,SAAAA,EAAA,IAAY,CAAA;AAAA,QAC5B,GAAI9b,IAAW,EAAE,UAAAA,MAAa,CAAA;AAAA,MAAC,CAChC,GAEIqO;AAAA,IACT,SAASvP,GAAK;AACZ,YAAMid,IAAa,KAAK,MAAM,YAAY,IAAA,IAAQF,CAAK;AACvD,YAAA7d,EAAK,KAAK;AAAA,QACR,MAAM;AAAA,QACN,KAAKgG,EAAMiM,GAAKmK,CAAS;AAAA,QACzB,QAAAmB;AAAA,QACA,QAAQ;AAAA,QACR,YAAAQ;AAAA,QACA,QAAQ;AAAA,QACR,OAAOjd,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG;AAAA,QACtD,GAAIgd,IAAU,EAAE,SAAAA,MAAY,CAAA;AAAA,MAAC,CAC9B,GACKhd;AAAA,IACR;AAAA,EACF;AAKC,SAAA8c,EAAmD,oBAAoB,IACxE,OAAO,QAAQA,GAER,MAAM;AACX,IAAK,OAAO,MAAkD,sBAC5D,OAAO,QAAQZ;AAAA,EAEnB;AACF;AAMA,SAASkB,GAAgBjc,GAA2E;AAClG,MAAIA,KAAQ,KAAM,QAAO;AACzB,MAAI,OAAOA,KAAS,SAAU,QAAOA;AACrC,MAAIA,aAAgB,gBAAiB,QAAOA,EAAK,SAAA;AACjD,MAAIA,aAAgB,UAAU;AAC5B,UAAMG,IAAmB,CAAA;AACzB,WAAAH,EAAK,QAAQ,CAACV,GAAG6H,MAAM;AACrB,MAAAhH,EAAO,KAAK,GAAGgH,CAAC,IAAI,OAAO7H,KAAM,WAAW,IAAIA,EAAE,MAAM,OAAO,QAAQ,EAAE;AAAA,IAC3E,CAAC,GACM,cAAca,EAAO,KAAK,GAAG,CAAC;AAAA,EACvC;AACA,SAAIH,aAAgB,OAAa,SAASA,EAAK,IAAI,KAAKA,EAAK,QAAQ,SAAS,MAC1EA,aAAgB,cAAoB,WAAWA,EAAK,UAAU,OAC9D,YAAY,OAAOA,CAAI,IAAU,WAAYA,EAAyB,UAAU,OAE7E;AACT;AAEA,SAASkc,GAAQne,GAAyC;AACxD,QAAMoe,IAAQ,eAAe,WACvBC,IAAeD,EAAM,MACrBE,IAAeF,EAAM,MACrBG,IAA2BH,EAAM,kBAYjCI,wBAAY,QAAA;AAElB,SAAAJ,EAAM,OAAO,SACXb,GACAtL,MACGwM,GACG;AACN,WAAAD,EAAM,IAAI,MAAM;AAAA,MACd,QAAQjB,EAAO,YAAA;AAAA,MACf,KAAK,OAAOtL,KAAQ,WAAWA,IAAMA,EAAI,SAAA;AAAA,MACzC,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACV,GAEMoM,EAAa,KAAK,MAAMd,GAAQtL,GAAK,GAAGwM,CAAI;AAAA,EACrD,GAEAL,EAAM,mBAAmB,SACvBte,GACAuE,GACM;AACN,UAAMmS,IAAOgI,EAAM,IAAI,IAAI;AAC3B,QAAIhI,GAAM;AACR,YAAMkI,IAAQ5e,EAAK,YAAA;AACnB,MAAI4e,MAAU,kBAAiBlI,EAAK,UAAU,KACrCkI,MAAU,mBAAgBlI,EAAK,qBAAqBnS;AAAA,IAC/D;AACA,WAAOka,EAAyB,KAAK,MAAMze,GAAMuE,CAAK;AAAA,EACxD,GAEA+Z,EAAM,OAAO,SAA2Cnc,GAAuD;AAC7G,UAAMuU,IAAOgI,EAAM,IAAI,IAAI;AAC3B,QAAIhI;AAGF,UAFAA,EAAK,QAAQ,YAAY,IAAA,GAErB+F,GAAiB,IAAI/F,EAAK,MAAM,GAAG;AACrC,cAAMiH,IAAWS,GAAgBjc,CAAI;AACrC,QAAIwb,KAAY,OACdjH,EAAK,UAAUuG,EAAYU,GAAUjH,EAAK,kBAAkB,IAE5DA,EAAK,UAAU,CAAA,GAEbA,EAAK,YAASA,EAAK,QAAQ,UAAU;AAAA,MAC3C,MAAA,CAAWA,EAAK,YACdA,EAAK,UAAU,EAAE,SAAS,GAAA;AAI9B,UAAMmI,IAAY,MAAY;AAC5B,WAAK,oBAAoB,WAAWA,CAAS;AAC7C,YAAM1Q,IAAIuQ,EAAM,IAAI,IAAI;AACxB,UAAI,CAACvQ,EAAG;AACR,YAAM8P,IAAa,KAAK,MAAM,YAAY,IAAA,IAAQ9P,EAAE,KAAK,GAEnD+P,IAAS,KAAK,WAAW,KAAK,KAAK,UAAU;AAEnD,UAAIhc;AACJ,WAAKgc,KAAUhe,EAAK,YAAY,KAAK,SAAS;AAC5C,YAAI;AAGF,gBAAM4e,IAAM,KAAK,iBAAiB,MAAM,KAAK,iBAAiB,SAAU,KAAK,eAAe;AAC5F,cAAIA,GAAI;AACN,kBAAMX,IAAK,KAAK,kBAAkB,cAAc,KAAK;AACrD,YAAAjc,IAAW+a,EAAY6B,GAAIX,CAAE;AAAA,UAC/B;AAAA,QACF,QAAQ;AAAA,QAER;AAGF,OAAID,KAAUhe,EAAK,YACjBA,EAAK,KAAK;AAAA,QACR,MAAM;AAAA,QACN,KAAKgG,EAAMiI,EAAE,KAAKmO,CAAS;AAAA,QAC3B,QAAQnO,EAAE;AAAA,QACV,QAAQ,KAAK;AAAA,QACb,YAAA8P;AAAA,QACA,QAAAC;AAAA,QACA,GAAI/P,EAAE,UAAU,EAAE,SAASA,EAAE,QAAA,IAAY,CAAA;AAAA,QACzC,GAAIjM,IAAW,EAAE,UAAAA,MAAa,CAAA;AAAA,MAAC,CAChC,GAEHwc,EAAM,OAAO,IAAI;AAAA,IACnB;AACA,gBAAK,iBAAiB,WAAWG,CAAS,GACnCL,EAAa,KAAK,MAAMrc,CAAqC;AAAA,EACtE,GAEO,MAAM;AACX,IAAAmc,EAAM,OAAOC,GACbD,EAAM,OAAOE,GACbF,EAAM,mBAAmBG;AAAA,EAC3B;AACF;AAEO,SAASM,GAAsB7e,GAAyD;AAC7F,QAAM8e,IAAYnB,GAAU3d,CAAI,GAC1B+e,IAAUZ,GAAQne,CAAI;AAC5B,SAAO;AAAA,IACL,YAAY;AACV,MAAA8e,EAAA,GACAC,EAAA;AAAA,IACF;AAAA,EAAA;AAEJ;ACrZA,MAAMC,KAAoB,KACpBC,KAAiB,IACjBC,KAAa;AASZ,MAAMC,GAAiB;AAAA,EAU5B,YAAYnf,GAAwB;AANpC,SAAQ,SAAyB,CAAA,GACjC,KAAQ,WAAW,IACnB,KAAQ,QAA+C,MAEvD,KAAQ,YAAY,IAiBpB,KAAQ,yBAAyB,MAAY;AAC3C,MAAI,SAAS,oBAAoB,YAAU,KAAK,UAAA;AAAA,IAClD,GAhBE,KAAK,MAAMA,EAAK,KAChB,KAAK,YAAYA,EAAK,WACtB,KAAK,UAAUA,EAAK,SAEpB,KAAK,QAAQ,YAAY,MAAM;AAAE,MAAK,KAAK,MAAA;AAAA,IAAS,GAAGgf,EAAiB,GACxE,KAAK,kBAAkB,MAAM,KAAK,UAAA,GAGlC,OAAO,iBAAiB,YAAY,KAAK,eAAe,GAGxD,SAAS,iBAAiB,oBAAoB,KAAK,sBAAsB;AAAA,EAC3E;AAAA,EAMA,QAAQjY,GAA2B;AACjC,IAAI,KAAK,cACT,KAAK,OAAO,KAAKA,CAAK,GAClB,KAAK,OAAO,SAASmY,MAEvB,KAAK,OAAO,MAAA,GAEV,KAAK,OAAO,UAAUD,MAAqB,KAAK,MAAA;AAAA,EACtD;AAAA;AAAA,EAGA,MAAM,QAAuB;A1B3DxB,QAAA7f,GAAAsD;A0B6DH,QADI,KAAK,aACL,KAAK,YAAY,KAAK,OAAO,WAAW,EAAG;AAC/C,UAAMkF,IAAS,KAAK,OAAO,OAAO,GAAGqX,EAAc,GAC7CG,IAAQ,KAAK,UAAUxX,CAAM;AACnC,SAAK,WAAW;AAChB,QAAI;AACF,YAAMyI,IAAM,MAAM,MAAM,KAAK,KAAK;AAAA,QAChC,QAAQ;AAAA;AAAA;AAAA,QAGR,aAAa;AAAA,QACb,SAAS,EAAE,gBAAgB,mBAAA;AAAA,QAC3B,MAAM,KAAK,UAAU+O,CAAK;AAAA;AAAA;AAAA,QAG1B,WAAW;AAAA,MAAA,CACZ;AACD,MAAK/O,EAAI,OACPjR,IAAA,KAAK,YAAL,QAAAA,EAAA,WAAe,IAAI,MAAM,uBAAuBiR,EAAI,MAAM,EAAE;AAAA,IAEhE,SAASvP,GAAK;AAIZ,OAAA4B,IAAA,KAAK,YAAL,QAAAA,EAAA,WAAe5B,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAAA,IACnE,UAAA;AACE,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGQ,YAAkB;AACxB,QAAI,KAAK,aAAa,KAAK,OAAO,WAAW,EAAG;AAChD,QAAI,CAAC,UAAU,YAAY;AAEzB,MAAK,KAAK,MAAA;AACV;AAAA,IACF;AACA,UAAM8G,IAAS,KAAK,OAAO,OAAO,CAAC,GAC7BwX,IAAQ,KAAK,UAAUxX,CAAM,GAG7ByX,IAAO,IAAI,KAAK,CAAC,KAAK,UAAUD,CAAK,CAAC,GAAG,EAAE,MAAM,oBAAoB;AAC3E,QAAI;AACF,gBAAU,WAAW,KAAK,KAAKC,CAAI;AAAA,IACrC,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,IAAI,KAAK,cACT,KAAK,YAAY,IACb,KAAK,SAAO,cAAc,KAAK,KAAK,GACpC,KAAK,mBAAiB,OAAO,oBAAoB,YAAY,KAAK,eAAe,GACrF,SAAS,oBAAoB,oBAAoB,KAAK,sBAAsB,GAE5E,KAAK,UAAA;AAAA,EACP;AAAA,EAEQ,UAAUzX,GAAsC;AACtD,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,QAAAA;AAAA,MACA,MAAM;AAAA,QACJ,KAAK,OAAO,SAAS;AAAA,QACrB,WAAW,UAAU;AAAA,QACrB,UAAU;AAAA,UACR,GAAG,OAAO;AAAA,UACV,GAAG,OAAO;AAAA,UACV,KAAK,OAAO,oBAAoB;AAAA,QAAA;AAAA,QAElC,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,EAEJ;AACF;AClHA,MAAM0X,KAAkB,wBAClBC,KAAiB,4BACjBC,KAAsB,4BACtBC,KAAuB,6BACvBC,KAAyB,KAAK,KAC9BC,KAAmB;AA8BzB,IAAIC,IAA+B;AACnC,MAAMjZ,wBAAgB,IAAA;AAEtB,SAASkZ,KAA0B;AACjC,SAAI,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe,aAGzD,OAAO,WAAA,EAAa,MAAM,GAAG,CAAC,IAEhC,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AAC/C;AAEA,SAASC,GAAczb,GAAyB;AAI9C,QAAM/D,wBAAW,QAAA,GACXyf,IAAO,CAACxe,MAAwB;AACpC,QAAIA,MAAM,QAAQ,OAAOA,KAAM;AAC7B,aAAI,OAAOA,KAAM,YAAiBA,EAAE,SAASoe,KAAmBpe,EAAE,MAAM,GAAGoe,EAAgB,IACpFpe;AAET,QAAIjB,EAAK,IAAIiB,CAAW,EAAG,QAAO;AAElC,QADAjB,EAAK,IAAIiB,CAAW,GAChB,MAAM,QAAQA,CAAC,EAAG,QAAOA,EAAE,IAAIwe,CAAI;AACvC,UAAM9e,IAA+B,CAAA;AACrC,eAAWmI,KAAK,OAAO,KAAK7H,CAAW,EAAE,MAAM,GAAG,EAAE;AAClD,UAAI;AACF,QAAAN,EAAImI,CAAC,IAAI2W,EAAMxe,EAA8B6H,CAAC,CAAC;AAAA,MACjD,QAAQ;AACN,QAAAnI,EAAImI,CAAC,IAAI;AAAA,MACX;AAEF,WAAOnI;AAAA,EACT;AACA,MAAI;AACF,WAAO8e,EAAK1b,CAAK;AAAA,EACnB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS2b,KAAe;AACtB,aAAWlb,KAAM6B;AACf,QAAI;AACF,MAAA7B,EAAG8a,MAAW,OAAMA,KAAA,gBAAAA,EAAQ,QAAO,IAAI;AAAA,IACzC,QAAQ;AAAA,IAER;AAEJ;AAEA,SAASK,GAAMC,GAA0C;AACvD,SAAKN,KAULA,EAAO,OAAO,GACP;AAAA,IACL,GAAIM;AAAA,IACJ,IAAI,KAAK,IAAA;AAAA,IACT,WAAWN,EAAO;AAAA,IAClB,KAAKA,EAAO;AAAA,EAAA,KAZL;AAAA,IACL,GAAIM;AAAA,IACJ,IAAI,KAAK,IAAA;AAAA,IACT,WAAW;AAAA,IACX,KAAK;AAAA,EAAA;AAUX;AAEA,SAASC,EAAQD,GAAkC;AACjD,MAAI,CAACN,EAAQ;AACb,QAAM7Y,IAAQkZ,GAAMC,CAAO;AAC3B,EAAAN,EAAO,UAAU,QAAQ7Y,CAAK;AAChC;AAEA,SAASqZ,KAAuB;AAC9B,MAAKR;AACL,QAAI;AACF,qBAAe,QAAQN,IAAiBM,EAAO,GAAG,GAClD,eAAe,QAAQL,IAAgBK,EAAO,SAAS,GACvD,eAAe,QAAQJ,IAAqBI,EAAO,UAAU,MAAM,GAAG,GACtE,eAAe,QAAQH,IAAsB,OAAOG,EAAO,UAAU,CAAC;AAAA,IACxE,QAAQ;AAAA,IAGR;AACF;AAEA,SAASS,KAA8B;AACrC,MAAI;AACF,mBAAe,WAAWf,EAAe,GACzC,eAAe,WAAWC,EAAc,GACxC,eAAe,WAAWC,EAAmB,GAC7C,eAAe,WAAWC,EAAoB;AAAA,EAChD,QAAQ;AAAA,EAER;AACF;AAEA,SAASa,KAAqF;AAC5F,MAAI;AACF,UAAMrO,IAAM,eAAe,QAAQqN,EAAe;AAClD,QAAI,CAACrN,EAAK,QAAO;AACjB,UAAMsO,IAAU,eAAe,QAAQf,EAAmB,MAAM,KAC1DgB,IAAc,eAAe,QAAQf,EAAoB,GACzDgB,IAAaD,IAAc,OAAOA,CAAW,IAAI,KAAK,QAAQd;AACpE,WAAI,OAAO,SAASe,CAAU,KAAKA,KAAc,KAAK,SACpDJ,GAAA,GACO,QAEF,EAAE,KAAApO,GAAK,SAAAsO,GAAS,YAAAE,EAAA;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,GAAezgB,GAAgC;AACtD,EAAK2f,MACLA,EAAO,OAAO,GACdA,EAAO,UAAU,QAAQ;AAAA,IACvB,MAAM3f,EAAG;AAAA,IACT,IAAIA,EAAG;AAAA,IACP,WAAW2f,EAAO;AAAA,IAClB,KAAKA,EAAO;AAAA,IACZ,SAAS3f,EAAG;AAAA,IACZ,GAAIA,EAAG,QAAQ,EAAE,OAAOA,EAAG,MAAA,IAAU,CAAA;AAAA,IACrC,GAAIA,EAAG,SAAS,EAAE,QAAQA,EAAG,OAAA,IAAW,CAAA;AAAA,IACxC,GAAI,OAAOA,EAAG,QAAS,WAAW,EAAE,MAAMA,EAAG,KAAA,IAAS,CAAA;AAAA,IACtD,GAAI,OAAOA,EAAG,OAAQ,WAAW,EAAE,KAAKA,EAAG,QAAQ,CAAA;AAAA,EAAC,CACrD;AACH;AAEO,SAAS4d,GAAM8C,GAA6B;AAEjD,MADIf,KAAQgB,EAAA,GACR,CAACD,EAAO,IAAK;AAEjB,QAAME,IAAQF,EAAO,gBAAgBjB,IAC/Be,IAAa,KAAK,IAAA,IAAQI,GAC1BC,IAAYjB,GAAA,GACZU,IAAU,CAAC,CAACI,EAAO,SAEnBI,IAAY,IAAI5B,GAAiB;AAAA,IACrC,KAAKwB,EAAO;AAAA,IACZ,WAAAG;AAAA,IACA,SAAS,CAAChgB,MAAQ;AAIhB,cAAQ,KAAK,gDAAgDA,EAAI,OAAO;AAAA,IAC1E;AAAA,EAAA,CACD,GAGKkgB,IAAexa,GAAA,GACfya,IAAkBD,EAAa,QAAA,GAG/BE,IAAWF,EAAa,SAAA;AAC9B,aAAW/gB,KAAMihB,EAAU,CAAAR,GAAezgB,CAAE;AAC5C,MAAIkhB,IAAiBD,EAAS;AAC9B,QAAME,IAAcJ,EAAa,UAAU,MAAM;AAC/C,QAAI,CAACpB,EAAQ;AACb,UAAMhG,IAAMgG,EAAO,aAAa,SAAA;AAChC,WAAOA,EAAO,iBAAiBhG,EAAI,UAAQ;AACzC,YAAM3Z,IAAK2Z,EAAIgG,EAAO,cAAc;AACpC,MAAI3f,QAAmBA,CAAE,GACzB2f,EAAO,kBAAkB;AAAA,IAC3B;AAAA,EACF,CAAC,GAEKyB,IAAMxC,GAAsB;AAAA,IAChC,MAAM,CAACqB,MAAYC,EAAQD,CAAO;AAAA,IAClC,SAAAK;AAAA,EAAA,CACD,GAEKe,IAAMvF,GAAkB;AAAA,IAC5B,WAAW,CAACmE,MAAYC,EAAQD,CAAO;AAAA,IACvC,WAAW,CAACA,MAAYC,EAAQD,CAAO;AAAA,IACvC,YAAY,CAACA,MAAYC,EAAQD,CAAO;AAAA,IACxC,YAAY,CAACA,MAAYC,EAAQD,CAAO;AAAA,EAAA,CACzC,GAEKqB,IAAgB,WAAW,MAAM;AACrC,YAAQ,KAAK,oEAAoE,GACjFX,EAAA;AAAA,EACF,GAAG,KAAK,IAAI,GAAGH,IAAa,KAAK,IAAA,CAAK,CAAC;AAEvC,EAAAb,IAAS;AAAA,IACP,KAAKe,EAAO;AAAA,IACZ,WAAAG;AAAA,IACA,SAAAP;AAAA,IACA,YAAAE;AAAA,IACA,KAAK;AAAA,IACL,WAAAM;AAAA,IACA,cAAAC;AAAA,IACA,kBAAkBK,EAAI;AAAA,IACtB,cAAcC,EAAI;AAAA,IAClB,iBAAAL;AAAA,IACA,aAAAG;AAAA,IACA,eAAAG;AAAA,IACA,gBAAAJ;AAAA,EAAA,GAGFf,GAAA,GACAJ,GAAA;AACF;AAQO,SAASY,IAAa;AAC3B,EAAAY,GAAA,GACAnB,GAAA,GACAL,GAAA;AACF;AASO,SAASyB,KAAgB;AAC9B,EAAK7B,MACL4B,GAAA,GACAxB,GAAA;AACF;AAEA,SAASwB,KAAuB;AAC9B,EAAK5B,MACL,aAAaA,EAAO,aAAa,GACjCA,EAAO,YAAA,GACPA,EAAO,gBAAA,GACPA,EAAO,iBAAA,GACPA,EAAO,aAAA,GACPA,EAAO,UAAU,QAAA,GACjBA,IAAS;AACX;AAEO,SAAS8B,GAAMniB,GAAeoiB,GAAsB;AACzD,EAAK/B,KACLO,EAAQ;AAAA,IACN,MAAM;AAAA,IACN,OAAO5gB,EAAM,MAAM,GAAG,GAAG;AAAA,IACzB,MAAMugB,GAAc6B,CAAI;AAAA,EAAA,CACzB;AACH;AAEO,SAASC,KAAoB;AAClC,SAAOhC,MAAW;AACpB;AAEO,SAASiC,KAA4B;AAC1C,UAAOjC,KAAA,gBAAAA,EAAQ,QAAO;AACxB;AAMO,SAASkC,GAAUhd,GAA0B;AAClD,SAAA6B,EAAU,IAAI7B,CAAE,GACT,MAAM;AAAE,IAAA6B,EAAU,OAAO7B,CAAE;AAAA,EAAG;AACvC;AAOO,SAASid,KAA0B;AAExC,MADInC,KACA,OAAO,SAAW,IAAa;AACnC,QAAMoC,IAAY1B,GAAA;AAClB,EAAK0B,KACLnE,GAAM;AAAA,IACJ,KAAKmE,EAAU;AAAA,IACf,SAASA,EAAU;AAAA,IACnB,cAAc,KAAK,IAAI,KAAQA,EAAU,aAAa,KAAK,KAAK;AAAA,EAAA,CACjE;AACH;ACtUO,SAASC,GAAYjiB,IAA2B,IAAkB;AACvE,MAAIkiB,IAAmC,MACnCC,IAAyC,MACzCC,IAAe,IACfzM,IAAiC;AAErC,WAAS0M,IAAqB;AAC5B,IAAI1M,MACJA,IAAUuB,GAAqB;AAAA,MAC7B,QAAQ,MAAMoL,EAAQ;AAAA,MACtB,KAAKC,GAAQ;AAAA,IAAW,CACzB;AAAA,EACH;AAEA,WAASC,IAAuB;AAC9B,QAAK7M,GACL;AAAA,UAAI;AAAE,QAAAA,EAAQ,QAAA;AAAA,MAAW,QAAQ;AAAA,MAAgB;AACjD,MAAAA,IAAU;AAAA;AAAA,EACZ;AAOA,WAAS8M,IAAuB;AAC9B,QAAI,CAACP,EAAW;AAChB,IAAAA,EAAU,YAAY;AAEtB,UAAMxe,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY,wBAClBA,EAAM,cAAc,gCACpBwe,EAAU,YAAYxe,CAAK;AAE3B,UAAM6S,IAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,EAAI,YAAY;AAEhB,UAAMmM,IAAW,SAAS,cAAc,OAAO;AAC/C,IAAAA,EAAS,OAAO,OAChBA,EAAS,YAAY,wBACrBA,EAAS,cAAc,6BACvBA,EAAS,QAAQN,GACjBM,EAAS,eAAe,OACxBA,EAAS,aAAa,IACtBnM,EAAI,YAAYmM,CAAQ;AAExB,UAAMC,IAAW,SAAS,cAAc,QAAQ;AAChD,IAAAA,EAAS,OAAO,UAChBA,EAAS,YAAY,sBACrBA,EAAS,cAAc,SACvBA,EAAS,WAAW,CAACP,EAAa,KAAA,GAClC7L,EAAI,YAAYoM,CAAQ,GAExBT,EAAU,YAAY3L,CAAG;AAEzB,UAAMqM,IAAe,SAAS,cAAc,OAAO;AACnD,IAAAA,EAAa,YAAY;AACzB,UAAMC,IAAe,SAAS,cAAc,OAAO;AACnD,IAAAA,EAAa,OAAO,YACpBA,EAAa,QAAQ,OAAO,WAC5BD,EAAa,YAAYC,CAAY,GACrCD,EAAa,YAAY,SAAS,eAAe,2CAA2C,CAAC,GAC7FV,EAAU,YAAYU,CAAY;AAElC,UAAME,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,YAAY,uBACjBA,EAAK,cAAc,mEACnBZ,EAAU,YAAYY,CAAI,GAE1BJ,EAAS,iBAAiB,SAAS,MAAM;AACvC,MAAAN,IAAeM,EAAS,OACxBC,EAAS,WAAW,CAACD,EAAS,MAAM,KAAA;AAAA,IACtC,CAAC,GAEDC,EAAS,iBAAiB,SAAS,MAAM;AACvC,YAAMte,IAAQqe,EAAS,MAAM,KAAA;AAC7B,UAAKre,GAEL;AAAA,YAAI;AAEF,cAAI,IAAIA,CAAK;AAAA,QACf,QAAQ;AACN,UAAAqe,EAAS,kBAAkB,sDAAsD,GACjFA,EAAS,eAAA;AACT;AAAA,QACF;AACA,QAAAA,EAAS,kBAAkB,EAAE,GAC7BK,GAAc;AAAA,UACZ,KAAK1e;AAAA,UACL,SAASwe,EAAa;AAAA,UACtB,GAAI7iB,EAAK,iBAAiB,SAAY,EAAE,cAAcA,EAAK,iBAAiB,CAAA;AAAA,QAAC,CAC9E;AAAA;AAAA,IACH,CAAC;AAAA,EACH;AAEA,WAASgjB,IAAqB;AAC5B,QAAI,CAACd,EAAW;AAChB,IAAAA,EAAU,YAAY;AACtB,UAAMjQ,IAAMsQ,GAAQ,KAAgB,IAE9B7e,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY;AAClB,UAAMuf,IAAM,SAAS,cAAc,MAAM;AACzC,IAAAA,EAAI,YAAY,sBAChBA,EAAI,aAAa,eAAe,MAAM,GACtCvf,EAAM,YAAYuf,CAAG,GACrBvf,EAAM,YAAY,SAAS,eAAe,sBAAsB,CAAC,GACjEwe,EAAU,YAAYxe,CAAK;AAE3B,UAAMgU,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY,6BAClBA,EAAM,QAAQzF,GACdyF,EAAM,cAAczF,GACpBiQ,EAAU,YAAYxK,CAAK;AAE3B,UAAMnB,IAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,EAAI,YAAY;AAChB,UAAMkB,IAAU,SAAS,cAAc,QAAQ;AAC/C,IAAAA,EAAQ,OAAO,UACfA,EAAQ,YAAY,2BACpBA,EAAQ,cAAc,mBACtBA,EAAQ,iBAAiB,SAAS,MAAM6K,GAAc,GACtD/L,EAAI,YAAYkB,CAAO,GACvByK,EAAU,YAAY3L,CAAG;AAEzB,UAAMuM,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,YAAY,uBACjBA,EAAK,cAAc,4DACnBZ,EAAU,YAAYY,CAAI;AAAA,EAC5B;AAEA,WAAS1d,IAAe;AACtB,IAAI8d,GAAQ,IAAYF,EAAA,IACnBP,EAAA;AAAA,EACP;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUpb,GAAK;AAGb8b,MAAAA,GAAQ,GAIJD,GAAQ,KAAYb,EAAA;AACxB,YAAMe,IAAqBC,GAAkB,CAACzD,GAAQ3N,MAAQ;AAC5D,QAAI2N,KACFyC,EAAA,GACA1M,KAAA,QAAAA,EAAS,UAAU1D,MAEnBuQ,EAAA;AAAA,MAEJ,CAAC,GAMKc,IAAU,MAAM;AACpB,QAAAd,EAAA,GACAY,EAAA;AACA,YAAI;AAAEG,UAAAA,GAAQ;AAAA,QAAW,QAAQ;AAAA,QAAgB;AAAA,MACnD;AACA,MAAAlc,EAAI,OAAO,iBAAiB,SAASic,GAAS,EAAE,MAAM,IAAM;AAAA,IAK9D;AAAA,IACA,OAAO;AACL,aAAO;AAAA,QACL,QAAQ,CAACnhB,OACP+f,IAAY,SAAS,cAAc,KAAK,GACxCA,EAAU,YAAY,kBACtB/f,EAAK,YAAY+f,CAAS,GAE1B9c,EAAA,GACA+c,IAAoBkB,GAAkB,MAAMje,GAAQ,GAE7C,MAAM;AACX,UAAA+c,KAAA,QAAAA,KACAA,IAAoB,MACpBD,IAAY;AAAA,QACd;AAAA,MACF;AAAA,IAEJ;AAAA;AAAA,EAAA;AAGJ;AC7IA,IAAIvf,IAAiC;AAErC,MAAM6gB,KAEF;AAAA,EACF,oCAAoB,IAAA;AAAA,EACpB,sCAAsB,IAAA;AAAA,EACtB,oCAAoB,IAAA;AAAA,EACpB,2BAAa,IAAA;AACf;AAIO,SAASrG,GAAKnd,GAAyB;AAC5C,MAAI,OAAO,SAAW,IAAa;AACnC,MAAI,CAACA,EAAK,SAAU,OAAM,IAAI,MAAM,4BAA4B;AAEhE,EAAAN,GAAA,GACA+jB,GAAA;AAEA,QAAMngB,IAAmB,EAAE,GAAGyB,GAAA,GAAiB,GAAI/E,EAAK,UAAU,GAAC,GAC7D0jB,IAAY,IAAI,gBAAA,GAChBrjB,IAAUsjB,GAAkB3jB,CAAI,GAChC4jB,IAAqB5jB,EAAK,YAAY,gBACtC6jB,IAAe7jB,EAAK,SAAS;AAInC,EAAAxB,GAAA,GAEAslB,GAAW9jB,GAAM4jB,GAAUC,CAAK;AAChC,QAAME,IAAc,SAAS,cAA+BhlB,CAAU;AACtE,MAAI,CAACglB;AACH,UAAM,IAAI,MAAM,kDAAkD;AAIpE,MAAI,CAACA,EAAY;AACf,UAAM,IAAI,MAAM,gDAAgD;AAGlE,QAAMC,IAAchf,GAAkB+e,EAAY,MAAM,GAClDE,IAAS,IAAI5gB;AAAA,IACjBC;AAAA,IACA,CAAC,OAAO,QAAQ,MAAM,MAAM;AAAA,IAC5B;AAAA,MACE,UAAU,MAAM;AAAE,QAAK4gB,GAAA;AAAA,MAAa;AAAA,MACpC,SAAS,CAAC9f,MAAW;AAAE,QAAA+f,EAAkB,SAAS,EAAE,GAAO/f,MAAW,UAAQggB,GAAA;AAAA,MAAkB;AAAA,IAAA;AAAA,EAClG;AAEF,EAAAL,EAAY,OAAO,YAAYE,EAAO,IAAI,GAE1CF,EAAY,UAAU,IAAI,mBAAmB;AAE7C,QAAMM,IAAWjkB,GAAeC,CAAO,GAEjCikB,IAA2B;AAAA,IAC/B,UAAUtkB,EAAK;AAAA,IACf,SAASA,EAAK;AAAA,IACd,SAASA,EAAK;AAAA,IACd,aAAaA,EAAK,eAAe;AAAA,IACjC,SAAAK;AAAA,IACA,UAAAgkB;AAAA,IACA,QAAAJ;AAAA,IACA,aAAAD;AAAA,IACA,aAAAD;AAAA,IACA,WAAAL;AAAA,IACA,QAAApgB;AAAA,IACA,OAAO,CAAC,CAACtD,EAAK,SAASukB,GAAA;AAAA,IACvB,iBAAiBvkB,EAAK,mBAAmB;AAAA,IACzC,UAAA4jB;AAAA,IACA,OAAAC;AAAA,IACA,eAAe;AAAA,IACf,iBAAiB,CAAA;AAAA,IACjB,YAAY,CAAA;AAAA,IACZ,mBAAmB;AAAA,MACjB,0BAAU,IAAA;AAAA,MACV,2BAAW,IAAA;AAAA,MACX,kCAAkB,IAAA;AAAA,MAClB,iCAAiB,IAAA;AAAA,IAAI;AAAA,IAEvB,cAAc,CAAA;AAAA,EAAC;AAGjB,EAAAlhB,IAAU2hB,GAIVP,EAAY,iBAAiB,MAAMS,GAAA,GAGnCH,EAAS;AAAA,IACP,CAACvkB,MAAS2kB,GAAiB3kB,CAAI;AAAA,IAC/B,CAACgB,MAAQ4jB,GAAkB5jB,CAAG;AAAA,EAAA,GAGhC6jB,EAAe,SAAS,EAAE,OAAO,GAAA,CAAM,GACnCL,EAAS,SAAO,QAAQ,KAAK,kBAAkBA,EAAS,QAAQ;AACtE;AAEO,SAASE,KAAa;AAC3B,QAAMI,IAAOjiB;AACb,EAAKiiB,MACDA,EAAK,kBAGTA,EAAK,eAAeA,EAAK,QACtB,IAA8B,CAACrkB,MAAM;AACpC,QAAI,CAACA,EAAE,KAAM,QAAO;AACpB,UAAM8G,IAAMod,GAAiBlkB,EAAE,IAAI;AACnC,QAAIsb;AACJ,QAAI;AACF,MAAAA,IAAOtb,EAAE,KAAK8G,CAAG;AAAA,IACnB,SAASvG,GAAK;AACZ,aAAA4jB,GAAkB;AAAA,QAChB,QAAQnkB,EAAE;AAAA,QACV,OAAOO,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAAA,QACzD,IAAI;AAAA,MAAA,CACL,GACM;AAAA,IACT;AACA,WAAO,EAAE,MAAMP,EAAE,MAAM,MAAAsb,GAAM,KAAAxU,EAAA;AAAA,EAC/B,CAAC,EACA,OAAO,CAACiF,MAA8BA,MAAM,IAAI,GAEnDsY,EAAK,OAAO,oBAAoBA,EAAK,cAAc;AAAA,IACjD,KAAK,CAACnkB,GAAQX,MAAA;A7BjMX,UAAAV;A6BiMoB,cAAAA,IAAAwlB,EAAK,WAAWnkB,CAAM,MAAtB,gBAAArB,EAA0BU;AAAA;AAAA,IACjD,KAAK,CAACW,GAAQX,GAAMuE,MAAU;A7BlM3B,UAAAjF;A6BmMD,YAAMylB,KAAMzlB,IAAAwlB,EAAK,YAALnkB,OAAArB,EAAAqB,KAA4B,CAAA;AACxC,MAAAokB,EAAG/kB,CAAI,IAAIuE;AAAA,IACb;AAAA,EAAA,CACD,GACDugB,EAAK,OAAO,KAAA,GACZT,EAAkB,QAAQ,EAAE;AAC9B;AAEO,SAAS7V,KAAa;AAC3B,QAAMsW,IAAOjiB;AACb,EAAKiiB,KACLA,EAAK,OAAO,MAAM,MAAM;AAC1B;AAEO,SAASnB,KAAgB;A7BjNzB,MAAArkB;A6BkNL,QAAMwlB,IAAOjiB;AACb,MAAKiiB,GAEL;AAAA,IAAAA,EAAK,UAAU,MAAA,IAEfxlB,IAAAwlB,EAAK,kBAAL,QAAAxlB,EAAoB,SACpBwlB,EAAK,SAAS,QAAA,GAGdrQ,EAAA;AAEA,QAAI;AACF,MAAAqQ,EAAK,OAAO,KAAK,OAAA,GACjBA,EAAK,YAAY,MAAM,OAAA;AAAA,IACzB,QAAQ;AAAA,IAAgB;AACxB,IAAAA,EAAK,YAAY,iBAAiB,MAClCjiB,IAAU;AAAA;AACZ;AAEO,SAASmiB,KAAuB;AACrC,QAAMF,IAAOjiB;AACb,SAAKiiB,IAGE;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAASA,EAAK,SAAS,OAAA;AAAA,EAAO,IALvB,EAAE,OAAO,IAAO,WAAW,QAAQ,SAAS,GAAC;AAOxD;AAEO,SAASzgB,GACd4C,GACA7G,GACY;AACX,SAAAsjB,GAAezc,CAAK,EAA8C,IAAI7G,CAAO,GACvE,MAAM6kB,GAAIhe,GAAO7G,CAAO;AACjC;AAEO,SAAS6kB,GACdhe,GACA7G,GACM;AACL,EAAAsjB,GAAezc,CAAK,EAA8C,OAAO7G,CAAO;AACnF;AAIA,SAAS4jB,GAAW9jB,GAAmB4jB,GAAoBC,GAAoB;AAC7E,MAAI3C,IAAW,SAAS,cAA+BniB,CAAU;AACjE,MAAI,CAACmiB,GAAU;AAGb,IAAAA,IAAW,SAAS,cAAcniB,CAAU,GAC5CmiB,EAAS,aAAa,YAAY0C,CAAQ,GAC1C1C,EAAS,aAAa,SAAS2C,CAAK,GAChCD,MAAa,aACf1C,EAAS,MAAM,WAAW,YAC1BA,EAAS,MAAM,OAAO,aAEvB,SAAS,QAAQ,SAAS,iBAAiB,YAAYA,CAAQ;AAChE;AAAA,EACF;AAOA,EAAIlhB,EAAK,aAAa,UAAWkhB,EAAS,aAAa,YAAY0C,CAAQ,GACvE5jB,EAAK,UAAU,UAAWkhB,EAAS,aAAa,SAAS2C,CAAK;AACpE;AAEA,SAASF,GAAkB3jB,GAAmC;AAG5D,SAAIA,EAAK,UAAgBA,EAAK,UAC1BA,EAAK,mBAAmB,KAAc,CAAA,IACnCglB,GAAA;AACT;AAEA,SAASA,KAAgC;AACvC,SAAO,CAACC,MAAkBC,GAAA,GAAgBC,GAAA,GAAgBC,IAAa;AACzE;AAEA,SAASb,KAAwB;AAC/B,MAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,MAAI;AACF,WAAO,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,gBAAgB;AAAA,EACzE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASE,GAAiB3kB,GAAyB;AACjD,QAAM8kB,IAAOjiB;AAwBb,SAAOhD,GAAUG,GAvBK;AAAA,IACpB,aAAa,CAACuW,MAAMuO,KAAA,gBAAAA,EAAM,gBAAgBvO;AAAA,IAC1C,eAAe,CAACzW,MAAe;A7BpT5B,UAAAR;A6BqTD,aAAKwlB,KACGxlB,IAAAwlB,EAAK,YAALhlB,OAAAR,EAAAQ,KAAgC,CAAA,KADtB,CAAA;AAAA,IAEpB;AAAA,IACA,kBAAkB,MAAA;A7BxTf,UAAAR;A6BwTqB,cAAAA,IAAAwlB,KAAA,gBAAAA,EAAM,kBAAN,gBAAAxlB,EAAqB;AAAA;AAAA,IAC7C,eAAe,MAAMwlB,EAAM,UAAU;AAAA,IACrC,aAAa,OAAO7kB,MACb6kB,IACEA,EAAK,OAAO,YAAY7kB,CAAI,IADjB,MAAM;AAAA,IAAC;AAAA,IAG3B,SAAS,CAACC,MACH4kB,IACEzf,GAAcyf,EAAK,aAAa5kB,EAAK,MAAM,IADhC,MAAM;AAAA,IAAC;AAAA,IAG3B,aAAa,CAACC,GAAIC,MAAY;AAC5B,UAAI,CAAC0kB,EAAM,QAAO,MAAM;AAAA,MAAC;AACzB,YAAMS,IAAMT,EAAK,kBAAkB3kB,CAAE;AACrC,aAAAolB,EAAI,IAAInlB,CAAO,GACR,MAAMmlB,EAAI,OAAOnlB,CAAO;AAAA,IACjC;AAAA,EAAA,CAEyB;AAC7B;AAEA,SAASikB,EACPlkB,GACAW,GACM;AACN,QAAMgkB,IAAOjiB;AACb,MAAKiiB;AACL,eAAW9f,KAAM8f,EAAK,kBAAkB3kB,CAAE;AACxC,UAAI;AAAE,QAAA6E,EAAGlE,CAAC;AAAA,MAAG,SAASE,GAAK;AACzB,QAAI8jB,EAAK,SAAO,QAAQ,MAAM,qCAAqC9jB,CAAG;AAAA,MACxE;AAEJ;AAEA,SAAS6jB,EAAsC5d,GAAUrF,GAAsC;AAC7F,aAAWoD,KAAM0e,GAAezc,CAAK;AACnC,QAAI;AAAE,MAAAjC,EAAGpD,CAAO;AAAA,IAAG,SAASZ,GAAK;AAC/B,MAAI6B,KAAA,QAAAA,EAAS,SAAO,QAAQ,MAAM,kCAAkC7B,CAAG;AAAA,IACzE;AAEJ;AAEA,SAAS4jB,GAAkB5jB,GAA8B;AACvD,EAAA6jB,EAAe,gBAAgB,EAAE,QAAQ7jB,EAAI,QAAQ,OAAOA,EAAI,OAAO,IAAIA,EAAI,GAAA,CAAI;AACnF,QAAM8jB,IAAOjiB;AACb,EAAKiiB,OACDA,EAAK,oBAAoB,YAAaA,EAAK,oBAAoB,SAASA,EAAK,UAC/EA,EAAK,YAAY,mBAAmB,EAAI,GAEtCA,EAAK,SAAO,QAAQ,KAAK,oBAAoB9jB,EAAI,MAAM,KAAKA,EAAI,EAAE,YAAYA,EAAI,KAAK;AAC7F;AAEA,SAASsjB,KAAuB;AAC9B,QAAMQ,IAAOjiB;AACb,EAAKiiB,MACLA,EAAK,OAAO,WAAA,GACZA,EAAK,OAAO,kBAAA,GACZA,EAAK,aAAa,CAAA;AACpB;AAEA,eAAeV,KAA2B;AACxC,QAAMU,IAAOjiB;AAEb,MADI,CAACiiB,KACDA,EAAK,cAAe;AAExB,QAAMU,IAAcV,EAAK,OAAO,eAAA,EAAiB,KAAA;AACjD,MAAI,CAACU,GAAa;AAChB,IAAAV,EAAK,OAAO,UAAU,2BAA2B,OAAO;AACxD;AAAA,EACF;AAEA,EAAAA,EAAK,gBAAgB,IAAI,gBAAA,GACzBA,EAAK,kBAAkB,CAAA,GACvBA,EAAK,OAAO,cAAc,EAAI,GAC9BA,EAAK,OAAO,UAAU,YAAY;AAElC,MAAIljB,IAAkC;AACtC,MAAI;AACF,UAAMmU,IAAW,MAAM+O,EAAK,SAAS;AAAA,MACnC,CAACvO,MAAMuO,EAAK,gBAAgBvO,CAAC;AAAA,MAC7B,CAACvV,MAAQ4jB,GAAkB5jB,CAAG;AAAA,IAAA;AAEhC,IAAA8jB,EAAK,kBAAkB/O,GAEvBnU,IAAU6jB,GAAgBX,GAAMU,GAAazP,CAAQ;AAGrD,QAAI2P,IAA8B;AAGlC,QADArB,EAAkB,gBAAgB,EAAE,SAAAziB,GAAS,QAD9B,CAAC0C,MAAmB;AAAE,MAAIohB,MAAiB,SAAMA,IAAephB;AAAA,IAAQ,EAC1C,CAAQ,GACjDohB,MAAiB,MAAM;AACzB,MAAAZ,EAAK,OAAO,cAAc,EAAK,GAC/BA,EAAK,OAAO,UAAU,cAAcY,CAAY,IAAI,OAAO;AAC3D;AAAA,IACF;AAEA,IAAAZ,EAAK,OAAO,UAAU,UAAU;AAChC,UAAM5iB,IAA8B,MAAMR;AAAA,MACxCojB,EAAK;AAAA,MACLljB;AAAA,MACAkjB,EAAK;AAAA,MACLA,EAAK,cAAc;AAAA,MACnBA,EAAK;AAAA,IAAA;AAGP,IAAAT,EAAkB,eAAe,EAAE,SAAAziB,GAAS,UAAAM,EAAA,CAAU,GACtD4iB,EAAK,OAAO,cAAc,EAAK,GAE3B5iB,EAAS,MACX2iB,EAAe,kBAAkB,EAAE,SAAAjjB,GAAS,UAAAM,EAAA,CAAU,GACtD4iB,EAAK,OAAO,mBAAmB,EAAI,GACnCA,EAAK,OAAO,UAAUA,EAAK,OAAO,aAAa,SAAS,GAIxD,OAAO,WAAW,MAAM;AACtB,MAAIjiB,MAAYiiB,KAAMA,EAAK,OAAO,MAAM,WAAW,GACnDR,GAAA;AAAA,IACF,GAAG,IAAI,MAEPO,EAAe,gBAAgB,EAAE,SAAAjjB,GAAS,OAAO,IAAI,MAAM,QAAQM,EAAS,MAAM,EAAE,EAAA,CAAG,GACvF4iB,EAAK,OAAO,UAAU,WAAW5iB,EAAS,MAAM,KAAK,OAAO;AAAA,EAEhE,SAASlB,GAAK;AACZ,IAAA8jB,EAAK,OAAO,cAAc,EAAK;AAC/B,UAAM7jB,IAAQD,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAChE,IAAIY,KACFijB,EAAe,gBAAgB,EAAE,SAAAjjB,GAAS,OAAAX,EAAA,CAAO,GAEnD6jB,EAAK,OAAO,UAAU,WAAW7jB,EAAM,OAAO,IAAI,OAAO;AAAA,EAC3D,UAAA;AACE,IAAA6jB,EAAK,gBAAgB;AAAA,EACvB;AACF;AAEA,SAASW,GACPX,GACAU,GACAG,GACiB;A7BlcZ,MAAArmB;A6BmcL,QAAMoX,IAAOkP,GAAA,GACPre,KAAMjI,IAAAwlB,EAAK,YAAL,gBAAAxlB,EAAA,KAAAwlB;AACZ,SAAO;AAAA,IACL,aAAAU;AAAA,IACA,UAAUV,EAAK,OAAO,YAAA;AAAA,IACtB,UAAUpO;AAAA,IACV,GAAInP,IAAM,EAAE,SAASA,EAAA,IAAQ,CAAA;AAAA,IAC7B,SAASoe;AAAA,EAAA;AAEb;AAEA,SAASC,KAAiC;AACxC,QAAMzT,IAAM,OAAO,SAAS,MACtB0T,IAAM,SAAS,UACf9B,IAAQ,OAAO,WAAW,8BAA8B,EAAE,UAAU,SAAkB;AAC5F,SAAO;AAAA,IACL,KAAA5R;AAAA,IACA,GAAI0T,IAAM,EAAE,UAAUA,EAAA,IAAQ,CAAA;AAAA,IAC9B,WAAW,UAAU;AAAA,IACrB,UAAU;AAAA,MACR,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,MACV,KAAK,OAAO,oBAAoB;AAAA,IAAA;AAAA,IAElC,QAAQ;AAAA,MACN,GAAG,OAAO,OAAO;AAAA,MACjB,GAAG,OAAO,OAAO;AAAA,IAAA;AAAA,IAEnB,UAAU,KAAK,iBAAiB,kBAAkB;AAAA,IAClD,QAAQ,UAAU;AAAA,IAClB,OAAA9B;AAAA,IACA,aAAY,oBAAI,KAAA,GAAO,YAAA;AAAA,EAAY;AAEvC;ACleAnkB,GAAA;"}
|