@drip-apex/sdk 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/README.md +5 -0
  2. package/dist/bundle-report.json +584 -226
  3. package/dist/define.cjs +123 -0
  4. package/dist/define.cjs.map +7 -0
  5. package/dist/define.mjs +102 -0
  6. package/dist/define.mjs.map +7 -0
  7. package/dist/drip.cjs +19262 -0
  8. package/dist/drip.cjs.map +7 -0
  9. package/dist/drip.debug.js +1 -1
  10. package/dist/drip.debug.js.map +1 -1
  11. package/dist/drip.heatmap.js +1 -1
  12. package/dist/drip.heatmap.js.map +1 -1
  13. package/dist/drip.js +1 -1
  14. package/dist/drip.js.map +1 -1
  15. package/dist/drip.live.js +1 -1
  16. package/dist/drip.live.js.map +1 -1
  17. package/dist/drip.mjs +19246 -0
  18. package/dist/drip.mjs.map +7 -0
  19. package/dist/drip.replay-recorder.js +2 -0
  20. package/dist/drip.replay-recorder.js.map +1 -0
  21. package/dist/editor.js +147 -142
  22. package/dist/editor.js.map +4 -4
  23. package/dist/flags.cjs +1788 -0
  24. package/dist/flags.cjs.map +7 -0
  25. package/dist/flags.mjs +1765 -0
  26. package/dist/flags.mjs.map +7 -0
  27. package/dist/index.mjs +12 -0
  28. package/dist/index.mjs.map +2 -2
  29. package/dist/metafiles/define.cjs.meta.json +28 -0
  30. package/dist/metafiles/define.mjs.meta.json +32 -0
  31. package/dist/metafiles/drip.cjs.meta.json +3193 -0
  32. package/dist/metafiles/drip.debug.meta.json +2859 -574
  33. package/dist/metafiles/drip.heatmap.meta.json +2732 -460
  34. package/dist/metafiles/drip.live.meta.json +2732 -460
  35. package/dist/metafiles/drip.meta.json +2859 -574
  36. package/dist/metafiles/drip.mjs.meta.json +3235 -0
  37. package/dist/metafiles/drip.replay-recorder.meta.json +82 -0
  38. package/dist/metafiles/editor.meta.json +67 -27
  39. package/dist/metafiles/flags.cjs.meta.json +220 -0
  40. package/dist/metafiles/flags.mjs.meta.json +225 -0
  41. package/dist/metafiles/index.meta.json +2717 -491
  42. package/dist/metafiles/index.mjs.meta.json +14 -4
  43. package/dist/react/index.js +16621 -13539
  44. package/dist/react/index.js.map +4 -4
  45. package/dist/sri.json +20 -15
  46. package/dist/types/activation-runtime.d.ts +91 -0
  47. package/dist/types/analytics-runtime.d.ts +166 -0
  48. package/dist/types/antiflicker.d.ts +9 -3
  49. package/dist/types/assignment-cookie-sync.d.ts +31 -0
  50. package/dist/types/assignment-runtime.d.ts +257 -0
  51. package/dist/types/assignment-store.d.ts +4 -8
  52. package/dist/types/bucket.d.ts +1 -2
  53. package/dist/types/compact-store.d.ts +1 -0
  54. package/dist/types/config-runtime.d.ts +313 -0
  55. package/dist/types/consent-evaluation.d.ts +27 -0
  56. package/dist/types/css.d.ts +5 -3
  57. package/dist/types/debug-loader.d.ts +2 -0
  58. package/dist/types/decide-assignments.d.ts +31 -0
  59. package/dist/types/delivery-timing.d.ts +8 -0
  60. package/dist/types/early-interaction-capture.d.ts +79 -0
  61. package/dist/types/early-reassert.d.ts +32 -0
  62. package/dist/types/edge-runtime.d.ts +11 -0
  63. package/dist/types/editor/api.d.ts +3 -0
  64. package/dist/types/editor/controller.d.ts +3 -1
  65. package/dist/types/editor/publication-result.d.ts +11 -0
  66. package/dist/types/editor/types.d.ts +2 -1
  67. package/dist/types/editor/view-kit.d.ts +1 -1
  68. package/dist/types/endpoint.d.ts +8 -0
  69. package/dist/types/exclusion-groups.d.ts +4 -7
  70. package/dist/types/flags.d.ts +2 -0
  71. package/dist/types/goal-eligibility.d.ts +4 -0
  72. package/dist/types/goals.d.ts +10 -1
  73. package/dist/types/guards.d.ts +7 -7
  74. package/dist/types/handover.d.ts +12 -1
  75. package/dist/types/hash.d.ts +8 -4
  76. package/dist/types/hydration.d.ts +2 -1
  77. package/dist/types/index.d.ts +24 -128
  78. package/dist/types/init-test-helpers.d.ts +48 -0
  79. package/dist/types/inline-bootstrap.d.ts +26 -0
  80. package/dist/types/js.d.ts +3 -1
  81. package/dist/types/money.d.ts +12 -0
  82. package/dist/types/mutate.d.ts +45 -6
  83. package/dist/types/performance.d.ts +2 -0
  84. package/dist/types/persistence-decoders.d.ts +12 -0
  85. package/dist/types/public-api.d.ts +209 -0
  86. package/dist/types/qa-assistant-state.d.ts +34 -0
  87. package/dist/types/react/index.d.ts +28 -3
  88. package/dist/types/reassert-sentinel.d.ts +6 -0
  89. package/dist/types/redirect.d.ts +48 -0
  90. package/dist/types/replay-recorder-entry.d.ts +1 -0
  91. package/dist/types/replay-signal-state.d.ts +6 -0
  92. package/dist/types/replay-signals.d.ts +13 -0
  93. package/dist/types/replay.d.ts +110 -0
  94. package/dist/types/router.d.ts +12 -2
  95. package/dist/types/runtime-state.d.ts +166 -0
  96. package/dist/types/sanitize.d.ts +1 -0
  97. package/dist/types/shadow.d.ts +3 -0
  98. package/dist/types/shopify-cart.d.ts +25 -1
  99. package/dist/types/storefront-vitals.d.ts +24 -0
  100. package/dist/types/targeting-diagnostics.d.ts +1 -0
  101. package/dist/types/targeting.d.ts +16 -2
  102. package/dist/types/track.d.ts +15 -1
  103. package/dist/types/types.d.ts +115 -9
  104. package/dist/types/wait.d.ts +14 -1
  105. package/dist/types/weekday-schedule.d.ts +3 -0
  106. package/package.json +17 -8
  107. package/src/activation-runtime.ts +2737 -0
  108. package/src/analytics-runtime.ts +2175 -0
  109. package/src/antiflicker.test.ts +216 -44
  110. package/src/antiflicker.ts +103 -28
  111. package/src/artifact-concurrency.test.ts +1091 -0
  112. package/src/assignment-cookie-sync.test.ts +202 -0
  113. package/src/assignment-cookie-sync.ts +189 -0
  114. package/src/assignment-runtime.ts +3204 -0
  115. package/src/assignment-store.test.ts +56 -0
  116. package/src/assignment-store.ts +7 -38
  117. package/src/bucket.ts +3 -18
  118. package/src/commerce-analytics-lifecycle.test.ts +75 -15
  119. package/src/commerce-config-lifecycle.test.ts +81 -1
  120. package/src/commerce-price-preserve.test.ts +133 -0
  121. package/src/commerce-price.test.ts +97 -0
  122. package/src/commerce-price.ts +74 -20
  123. package/src/commerce-shipping.test.ts +53 -0
  124. package/src/commerce-shipping.ts +5 -11
  125. package/src/compact-store.ts +15 -0
  126. package/src/config-fetch.test.ts +480 -9
  127. package/src/config-runtime.ts +2070 -0
  128. package/src/consent-evaluation-cookiescript.test.ts +50 -0
  129. package/src/consent-evaluation.ts +138 -0
  130. package/src/css.test.ts +30 -0
  131. package/src/css.ts +120 -6
  132. package/src/cwv.test.ts +60 -77
  133. package/src/debug-loader.test.ts +214 -0
  134. package/src/debug-loader.ts +41 -0
  135. package/src/decide-assignments.test.ts +196 -0
  136. package/src/decide-assignments.ts +204 -0
  137. package/src/delivery-timing.test.ts +104 -0
  138. package/src/delivery-timing.ts +89 -0
  139. package/src/early-interaction-capture.test.ts +451 -0
  140. package/src/early-interaction-capture.ts +230 -0
  141. package/src/early-reassert.test.ts +207 -0
  142. package/src/early-reassert.ts +152 -0
  143. package/src/edge-adoption.test.ts +435 -0
  144. package/src/edge-runtime.ts +30 -0
  145. package/src/editor/api.test.ts +109 -0
  146. package/src/editor/api.ts +34 -3
  147. package/src/editor/controller.test.ts +297 -14
  148. package/src/editor/controller.ts +69 -5
  149. package/src/editor/index.test.ts +2 -0
  150. package/src/editor/index.ts +1 -0
  151. package/src/editor/publication-result.ts +58 -0
  152. package/src/editor/types.ts +10 -1
  153. package/src/editor/view-kit.ts +2 -1
  154. package/src/editor/view.test.ts +108 -0
  155. package/src/editor/view.ts +49 -7
  156. package/src/endpoint.test.ts +15 -0
  157. package/src/endpoint.ts +10 -0
  158. package/src/exclusion-groups.ts +8 -18
  159. package/src/flags.test.ts +88 -1
  160. package/src/flags.ts +29 -29
  161. package/src/global-runtime-reconciler.test.ts +271 -0
  162. package/src/goal-eligibility.test.ts +29 -0
  163. package/src/goal-eligibility.ts +17 -0
  164. package/src/goals.test.ts +144 -1
  165. package/src/goals.ts +97 -18
  166. package/src/guards.test.ts +99 -1
  167. package/src/guards.ts +34 -15
  168. package/src/handover-cache-order.test.ts +6 -3
  169. package/src/handover.test.ts +154 -8
  170. package/src/handover.ts +122 -12
  171. package/src/hash.ts +29 -54
  172. package/src/holdout.test.ts +26 -0
  173. package/src/hydration.test.ts +73 -2
  174. package/src/hydration.ts +18 -9
  175. package/src/index.ts +130 -7287
  176. package/src/init-analytics.test.ts +1694 -0
  177. package/src/init-anti-flicker.test.ts +1211 -0
  178. package/src/init-cart-attributes.test.ts +2003 -0
  179. package/src/init-config-resolution.test.ts +999 -0
  180. package/src/init-consent.test.ts +971 -0
  181. package/src/init-empty.test.ts +11 -5406
  182. package/src/init-integrations.test.ts +846 -0
  183. package/src/init-page-activation.test.ts +5064 -0
  184. package/src/init-qa-loading.test.ts +740 -0
  185. package/src/init-redirects.test.ts +2156 -0
  186. package/src/init-test-helpers.ts +287 -0
  187. package/src/inline-bootstrap.test.ts +184 -0
  188. package/src/inline-bootstrap.ts +73 -0
  189. package/src/js.test.ts +51 -1
  190. package/src/js.ts +86 -2
  191. package/src/money.test.ts +55 -1
  192. package/src/money.ts +104 -2
  193. package/src/money.web-parity.contract.test.ts +85 -0
  194. package/src/mutate.test.ts +474 -10
  195. package/src/mutate.ts +739 -230
  196. package/src/page-trigger.test.ts +218 -8
  197. package/src/performance.ts +10 -0
  198. package/src/persistence-decoders.ts +18 -0
  199. package/src/public-api.ts +1828 -0
  200. package/src/qa-assistant-state.test.ts +249 -3
  201. package/src/qa-assistant-state.ts +146 -6
  202. package/src/qa-assistant-view.test.ts +220 -2
  203. package/src/qa-assistant-view.ts +102 -5
  204. package/src/react/index.test.tsx +37 -0
  205. package/src/react/index.tsx +19 -3
  206. package/src/reassert-sentinel.test.ts +155 -1
  207. package/src/reassert-sentinel.ts +168 -8
  208. package/src/redirect.test.ts +541 -0
  209. package/src/redirect.ts +572 -0
  210. package/src/replay-recorder-entry.ts +115 -0
  211. package/src/replay-signal-state.ts +100 -0
  212. package/src/replay-signals.test.ts +249 -0
  213. package/src/replay-signals.ts +151 -0
  214. package/src/replay.test.ts +764 -0
  215. package/src/replay.ts +514 -0
  216. package/src/router.test.ts +61 -2
  217. package/src/router.ts +50 -12
  218. package/src/runtime-state.ts +507 -0
  219. package/src/runtime.test.ts +174 -7
  220. package/src/runtime.ts +88 -14
  221. package/src/sanitize.test.ts +34 -0
  222. package/src/sanitize.ts +23 -12
  223. package/src/shadow.test.ts +187 -0
  224. package/src/shadow.ts +99 -0
  225. package/src/shopify-cart.test.ts +733 -23
  226. package/src/shopify-cart.ts +402 -49
  227. package/src/storefront-vitals.test.ts +217 -0
  228. package/src/storefront-vitals.ts +206 -0
  229. package/src/surface-signals.ts +6 -0
  230. package/src/targeting-conformance.test.ts +9 -0
  231. package/src/targeting-diagnostics.ts +38 -8
  232. package/src/targeting-parity-corpus.json +559 -0
  233. package/src/targeting-parity-corpus.test.ts +18 -0
  234. package/src/targeting.detailed.test.ts +105 -0
  235. package/src/targeting.test.ts +211 -0
  236. package/src/targeting.ts +88 -207
  237. package/src/track.test.ts +147 -0
  238. package/src/track.ts +125 -26
  239. package/src/types.ts +120 -13
  240. package/src/wait.test.ts +23 -0
  241. package/src/wait.ts +129 -13
  242. package/src/weekday-delivery.test.ts +56 -0
  243. package/src/weekday-schedule-parity-corpus.json +92 -0
  244. package/src/weekday-schedule.test.ts +69 -0
  245. package/src/weekday-schedule.ts +20 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/editor/index.ts", "../src/editor/api.ts", "../src/editor/selector.ts", "../src/editor/command-runtime.ts", "../src/sanitize.ts", "../src/observer-mute.ts", "../src/js.ts", "../src/mutate.ts", "../src/editor/types.ts", "../src/editor/artifacts.ts", "../src/editor/controller.ts", "../src/editor-bootstrap.ts", "../src/editor/device-preview.ts", "../src/editor/picker.ts", "../src/editor/operator.ts", "../src/editor/view-kit.ts", "../src/editor/view.ts"],
4
- "sourcesContent": ["import type { EditorLaunchHint } from \"../editor-bootstrap\";\nimport type { ActiveEditorSession } from \"./types\";\nimport { EditorApi } from \"./api\";\nimport { EditorCommandExecutor, EditorCommandPoller } from \"./command-runtime\";\nimport { EditorController } from \"./controller\";\nimport { mountEditorView, type EditorView } from \"./view\";\n\nconst EDITOR_HOST_ID = \"apex-editor-host\";\nconst EXCHANGE_TIMEOUT_MS = 10_000;\n\nexport type { ActiveEditorSession } from \"./types\";\n\nlet activeSession: ActiveEditorSession | null = null;\nlet activeController: EditorController | null = null;\nlet activeView: EditorView | null = null;\nlet activeCommandPoller: EditorCommandPoller | null = null;\n\nfunction cleanupActiveEditor(): void {\n activeCommandPoller?.stop();\n activeView?.destroy();\n activeController?.destroy();\n activeView = null;\n activeCommandPoller = null;\n activeController = null;\n activeSession = null;\n document.getElementById(EDITOR_HOST_ID)?.remove();\n}\n\nfunction readString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction parseSession(value: unknown, sid: string): ActiveEditorSession | null {\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n const parsed = {\n sid: readString(record.sid),\n bearer: readString(record.bearer),\n expiresAt: readString(record.expiresAt),\n shopId: readString(record.shopId),\n experimentId: readString(record.experimentId),\n initialVariationId: readString(record.initialVariationId),\n targetUrl: readString(record.targetUrl),\n targetOrigin: readString(record.targetOrigin),\n };\n if (\n parsed.sid !== sid ||\n !parsed.bearer ||\n !parsed.expiresAt ||\n !parsed.shopId ||\n !parsed.experimentId ||\n !parsed.initialVariationId ||\n !parsed.targetUrl ||\n !parsed.targetOrigin ||\n !Number.isFinite(Date.parse(parsed.expiresAt)) ||\n Date.parse(parsed.expiresAt) <= Date.now()\n ) {\n return null;\n }\n const variations: ActiveEditorSession[\"variations\"] = [];\n if (Array.isArray(record.variations)) {\n for (const item of record.variations) {\n if (!item || typeof item !== \"object\") continue;\n const variation = item as Record<string, unknown>;\n const id = readString(variation.id);\n if (id) {\n variations.push({\n id,\n name: readString(variation.name),\n slug: readString(variation.slug),\n });\n }\n }\n }\n return {\n sid,\n bearer: parsed.bearer,\n expiresAt: parsed.expiresAt,\n shopId: parsed.shopId,\n experimentId: parsed.experimentId,\n experimentName: readString(record.experimentName),\n initialVariationId: parsed.initialVariationId,\n targetUrl: parsed.targetUrl,\n targetOrigin: parsed.targetOrigin,\n variations,\n };\n}\n\nfunction mountEditorHost(controller: EditorController): void {\n document.getElementById(EDITOR_HOST_ID)?.remove();\n const host = document.createElement(\"div\");\n host.id = EDITOR_HOST_ID;\n host.setAttribute(\"data-apex-editor-state\", \"connected\");\n const shadow = host.attachShadow({ mode: \"closed\" });\n (document.body || document.documentElement).appendChild(host);\n activeView = mountEditorView(shadow, controller);\n}\n\nexport async function start(launch: EditorLaunchHint): Promise<boolean> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), EXCHANGE_TIMEOUT_MS);\n let ownsActiveEditor = false;\n try {\n const exchangeUrl = new URL(\"/api/editor-sessions/exchange\", launch.apiOrigin);\n exchangeUrl.searchParams.set(\"sid\", launch.sid);\n const response = await fetch(exchangeUrl.toString(), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ token: launch.token }),\n cache: \"no-store\",\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n signal: controller.signal,\n });\n if (!response.ok) return false;\n const payload = (await response.json().catch(() => null)) as\n | { ok?: unknown; session?: unknown }\n | null;\n if (payload?.ok !== true) return false;\n const session = parseSession(payload.session, launch.sid);\n if (!session) return false;\n if (\n typeof location !== \"undefined\" &&\n session.targetOrigin !== location.origin\n ) {\n return false;\n }\n activeSession = session;\n ownsActiveEditor = true;\n const api = new EditorApi(launch.apiOrigin, session);\n activeController = new EditorController(session, launch.apiOrigin, api);\n mountEditorHost(activeController);\n await activeController.initialize();\n activeCommandPoller = new EditorCommandPoller(\n api,\n new EditorCommandExecutor(activeController),\n );\n activeController.addCleanup(() => {\n activeCommandPoller?.stop();\n activeCommandPoller = null;\n });\n activeCommandPoller.start();\n try {\n window.opener?.postMessage(\n {\n type: \"apex:editor-connected\",\n sid: session.sid,\n experimentId: session.experimentId,\n variationId: session.initialVariationId,\n },\n launch.apiOrigin,\n );\n } catch {}\n return true;\n } catch {\n if (ownsActiveEditor) cleanupActiveEditor();\n return false;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport function getActiveEditorSession(): ActiveEditorSession | null {\n return activeSession;\n}\n\nexport const __test = {\n reset: cleanupActiveEditor,\n};\n", "import type {\n ActiveEditorSession,\n ClaimedEditorCommand,\n EditorArtifacts,\n EditorBrowserCommand,\n EditorVariation,\n} from \"./types\";\n\nexport class EditorApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly payload?: Record<string, unknown> | null,\n ) {\n super(message);\n }\n}\n\ntype FetchLike = typeof fetch;\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n}\n\nfunction parseArtifacts(value: unknown): EditorArtifacts {\n const input = record(value) ?? {};\n return {\n mutations: Array.isArray(input.mutations) ? input.mutations as EditorArtifacts[\"mutations\"] : [],\n customCss: typeof input.customCss === \"string\" ? input.customCss : \"\",\n customJs: typeof input.customJs === \"string\" ? input.customJs : \"\",\n };\n}\n\nconst EDITOR_COMMANDS = new Set<EditorBrowserCommand>([\n \"navigate\", \"reload\", \"back\", \"forward\", \"click\", \"type\", \"wait_for\",\n \"snapshot\", \"screenshot\", \"eval_readonly\", \"console_logs\", \"network_logs\",\n \"network_probe\", \"current_url\", \"select_element\", \"apply_artifacts\",\n]);\n\nexport class EditorApi {\n constructor(\n private readonly apiOrigin: string,\n private readonly session: ActiveEditorSession,\n private readonly fetchImpl: FetchLike = (...args) => fetch(...args),\n ) {}\n\n private url(path: string, variationId?: string): string {\n const url = new URL(path, this.apiOrigin);\n if (variationId) url.searchParams.set(\"variationId\", variationId);\n return url.toString();\n }\n\n private async request(\n url: string,\n init: RequestInit,\n ): Promise<Record<string, unknown>> {\n const response = await this.fetchImpl(url, {\n ...init,\n credentials: \"omit\",\n cache: \"no-store\",\n referrerPolicy: \"no-referrer\",\n headers: {\n Authorization: `Bearer ${this.session.bearer}`,\n ...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(init.headers ?? {}),\n },\n });\n const payload = record(await response.json().catch(() => null));\n if (!response.ok || payload?.ok === false) {\n throw new EditorApiError(\n typeof payload?.error === \"string\" ? payload.error : `Editor API failed (${response.status})`,\n response.status,\n payload,\n );\n }\n return payload ?? {};\n }\n\n async loadArtifacts(variationId: string): Promise<{\n variation: EditorVariation;\n artifacts: EditorArtifacts;\n }> {\n const payload = await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/artifacts`, variationId),\n { method: \"GET\" },\n );\n const variation = record(payload.variation) ?? {};\n if (typeof variation.artifactHash !== \"string\" || !variation.artifactHash) {\n throw new EditorApiError(\"Editor load response did not include an artifact hash\", 500, payload);\n }\n return {\n variation: {\n id: typeof variation.id === \"string\" ? variation.id : variationId,\n name: typeof variation.name === \"string\" ? variation.name : \"Variation\",\n artifactHash: variation.artifactHash,\n reviewStatus: typeof variation.reviewStatus === \"string\" ? variation.reviewStatus : null,\n },\n artifacts: parseArtifacts(payload.artifacts),\n };\n }\n\n async saveArtifacts(\n variationId: string,\n artifacts: EditorArtifacts,\n expectedPriorHash: string,\n ): Promise<{\n artifactHash: string;\n reviewStatus: string | null;\n warningIssues: Array<{ code?: string; message?: string }>;\n artifacts: EditorArtifacts;\n }> {\n const payload = await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/artifacts`, variationId),\n {\n method: \"PATCH\",\n body: JSON.stringify({ ...artifacts, expectedPriorHash }),\n },\n );\n if (typeof payload.artifactHash !== \"string\") {\n throw new EditorApiError(\"Editor save response did not include an artifact hash\", 500, payload);\n }\n return {\n artifactHash: payload.artifactHash,\n reviewStatus: typeof payload.reviewStatus === \"string\" ? payload.reviewStatus : null,\n warningIssues: Array.isArray(payload.warningIssues)\n ? payload.warningIssues as Array<{ code?: string; message?: string }>\n : [],\n artifacts: parseArtifacts(payload.artifacts),\n };\n }\n\n async extendSession(): Promise<string | null> {\n const payload = await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/extend`),\n { method: \"POST\" },\n );\n const session = record(payload.session);\n return typeof session?.expiresAt === \"string\" ? session.expiresAt : null;\n }\n\n async revoke(): Promise<void> {\n await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}`),\n { method: \"DELETE\" },\n );\n }\n\n\n async claimCommands(limit = 10): Promise<ClaimedEditorCommand[]> {\n const url = this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/commands`);\n const commandUrl = new URL(url);\n commandUrl.searchParams.set(\"limit\", String(Math.max(1, Math.min(limit, 20))));\n const payload = await this.request(commandUrl.toString(), { method: \"GET\" });\n if (!Array.isArray(payload.commands)) return [];\n const commands: ClaimedEditorCommand[] = [];\n for (const value of payload.commands) {\n const command = record(value);\n const commandId = typeof command?.commandId === \"string\" ? command.commandId : \"\";\n const commandName = typeof command?.command === \"string\" ? command.command : \"\";\n if (!commandId || !EDITOR_COMMANDS.has(commandName as EditorBrowserCommand)) continue;\n commands.push({\n commandId,\n command: commandName as EditorBrowserCommand,\n args: record(command?.args) ?? {},\n expiresAt: typeof command?.expiresAt === \"string\" ? command.expiresAt : null,\n });\n }\n return commands;\n }\n\n async completeCommand(\n commandId: string,\n completion: { result: Record<string, unknown> } | { error: string },\n ): Promise<void> {\n await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/commands`),\n {\n method: \"PATCH\",\n body: JSON.stringify({ commandId, ...completion }),\n },\n );\n }\n}\n", "const UNSTABLE_ID = /(?:^|[-_])(react|vue|ember|svelte|uid|uuid|random|generated)[-_]?|\\d{5,}/i;\nconst UNSTABLE_CLASS = /^(active|current|selected|hover|focus|open|closed|js-|is-|has-)|\\d{4,}/i;\n\nfunction escapeCss(value: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(value);\n }\n return value.replace(/[^a-zA-Z0-9_-]/g, (character) => `\\\\${character}`);\n}\n\nfunction quotedAttribute(name: string, value: string): string {\n return `[${name}=\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"]`;\n}\n\nfunction isUnique(selector: string, root: ParentNode): boolean {\n try {\n return root.querySelectorAll(selector).length === 1;\n } catch {\n return false;\n }\n}\n\nfunction stableId(element: Element): string | null {\n const id = element.id.trim();\n return id && id.length <= 80 && !UNSTABLE_ID.test(id) ? id : null;\n}\n\nfunction stableAttribute(element: Element): { name: string; value: string } | null {\n const names = [\"data-testid\", \"data-test\", \"data-cy\", \"data-drip-id\", \"name\", \"aria-label\"];\n for (const name of names) {\n const value = element.getAttribute(name)?.trim();\n if (value && value.length <= 120) return { name, value };\n }\n for (const attribute of Array.from(element.attributes)) {\n if (\n attribute.name.startsWith(\"data-\") &&\n !attribute.name.startsWith(\"data-react\") &&\n attribute.value &&\n attribute.value.length <= 120 &&\n !UNSTABLE_ID.test(attribute.value)\n ) {\n return { name: attribute.name, value: attribute.value };\n }\n }\n return null;\n}\n\nfunction stableClasses(element: Element): string[] {\n return Array.from(element.classList)\n .filter((name) => name.length <= 64 && !UNSTABLE_CLASS.test(name))\n .slice(0, 2);\n}\n\nfunction segment(element: Element, root: ParentNode): string {\n const tag = element.tagName.toLowerCase();\n const id = stableId(element);\n if (id) {\n const candidate = `#${escapeCss(id)}`;\n if (isUnique(candidate, root)) return candidate;\n }\n const attribute = stableAttribute(element);\n if (attribute) {\n const candidate = `${tag}${quotedAttribute(attribute.name, attribute.value)}`;\n if (isUnique(candidate, root)) return candidate;\n }\n const classes = stableClasses(element);\n if (classes.length) {\n const candidate = `${tag}.${classes.map(escapeCss).join(\".\")}`;\n if (isUnique(candidate, root)) return candidate;\n }\n const parent = element.parentElement;\n if (!parent) return tag;\n const sameTag = Array.from(parent.children).filter((child) => child.tagName === element.tagName);\n return sameTag.length > 1\n ? `${tag}:nth-of-type(${sameTag.indexOf(element) + 1})`\n : tag;\n}\n\nexport function generateDeterministicSelector(\n element: Element,\n root: ParentNode = document,\n): string {\n const ownerDocument = element.ownerDocument ?? document;\n const id = stableId(element);\n if (id) {\n const candidate = `#${escapeCss(id)}`;\n if (isUnique(candidate, root)) return candidate;\n }\n const direct = segment(element, root);\n if (isUnique(direct, root)) return direct;\n\n const parts = [direct];\n let current = element.parentElement;\n while (current && current !== ownerDocument.documentElement && parts.length < 5) {\n const part = segment(current, root);\n parts.unshift(part);\n const candidate = parts.join(\" > \");\n if (isUnique(candidate, root)) return candidate;\n if (part.startsWith(\"#\")) break;\n current = current.parentElement;\n }\n return parts.join(\" > \");\n}\n\nexport function elementLabel(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const className = stableClasses(element)[0];\n const rect = element.getBoundingClientRect();\n return `${tag}${className ? `.${className}` : \"\"} ${Math.round(rect.width)}x${Math.round(rect.height)}`;\n}\n", "import type { Mutation, MutationAction } from \"../types\";\nimport { EditorApi, EditorApiError } from \"./api\";\nimport type { ArtifactCommandAudit, EditorController } from \"./controller\";\nimport { generateDeterministicSelector } from \"./selector\";\nimport type {\n ClaimedEditorCommand,\n EditorArtifacts,\n EditorBrowserCommand,\n} from \"./types\";\n\nconst POLL_INTERVAL_MS = 900;\nconst MAX_LOGS = 80;\nconst REDACTED = \"[redacted]\";\nconst SENSITIVE_KEY = /(?:account|address|auth(?:orization)?|bearer|card|cookie|credential|customer|cvv|email|name|pass(?:word|wd)?|payment|phone|postal|secret|session|ssn|token|user|value|zip)/i;\nconst EMAIL = /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi;\nconst JWT = /\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\b/g;\nconst AUTH_VALUE = /\\b(?:bearer|basic)\\s+[A-Za-z0-9._~+\\/-]+=*/gi;\nconst LONG_NUMBER = /\\b(?:\\+?\\d[\\d .()-]{6,}\\d)\\b/g;\nconst MUTATION_ACTIONS = new Set<MutationAction>([\n \"html\", \"text\", \"setText\", \"attribute\", \"style\", \"setStyle\", \"remove\",\n \"insertBefore\", \"insertAfter\",\n]);\n\nexport type EditorCommandResult = { ok: boolean; [key: string]: unknown };\ntype CommandExecution = {\n result: EditorCommandResult;\n afterAcknowledge?: () => void;\n};\n\ntype NavigationActions = {\n navigate(url: string): void;\n reload(): void;\n back(): void;\n forward(): void;\n};\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n}\n\nfunction string(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction isLoopbackOrigin(origin: string): boolean {\n try {\n const hostname = new URL(origin).hostname.toLowerCase();\n return hostname === \"localhost\" || hostname.endsWith(\".localhost\") ||\n hostname === \"127.0.0.1\" || hostname === \"::1\" || hostname === \"[::1]\";\n } catch {\n return false;\n }\n}\n\nfunction sanitizedUrl(value: string, base?: string): string {\n try {\n const url = new URL(value, base);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return `${url.protocol}${REDACTED}`;\n }\n url.username = \"\";\n url.password = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n } catch {\n return REDACTED;\n }\n}\n\nfunction sanitizeDiagnosticText(value: string): string {\n return value\n .replace(/https?:\\/\\/[^\\s\"'<>]+/gi, (url) => sanitizedUrl(url))\n .replace(EMAIL, REDACTED)\n .replace(JWT, REDACTED)\n .replace(AUTH_VALUE, REDACTED)\n .replace(LONG_NUMBER, REDACTED)\n .replace(/\\b(?:api[-_]?key|authorization|cookie|password|secret|token)\\s*[:=]\\s*[^\\s,;]+/gi, (match) => {\n const separator = match.includes(\":\") ? \":\" : \"=\";\n return `${match.split(separator, 1)[0]}${separator}${REDACTED}`;\n });\n}\n\nfunction cloneSafe(value: unknown, depth = 0, key = \"\"): unknown {\n if (key && SENSITIVE_KEY.test(key)) return REDACTED;\n if (value === null || typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return typeof value === \"string\" ? sanitizeDiagnosticText(value).slice(0, 500) : value;\n }\n if (typeof value === \"undefined\") return null;\n if (depth > 4) return \"[truncated]\";\n if (value instanceof Element) return elementSummary(value);\n if (Array.isArray(value)) return value.slice(0, 120).map((item) => cloneSafe(item, depth + 1));\n if (typeof value === \"object\") {\n const output: Record<string, unknown> = {};\n for (const [entryKey, entry] of Object.entries(value as Record<string, unknown>).slice(0, 80)) {\n try { output[entryKey] = cloneSafe(entry, depth + 1, entryKey); } catch {}\n }\n return output;\n }\n return `[${typeof value}]`;\n}\n\nfunction visibleText(element: Element | null): string {\n if (!element) return \"\";\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement || element instanceof HTMLFormElement ||\n (element instanceof HTMLElement && element.isContentEditable)) {\n return \"\";\n }\n return (element.textContent ?? \"\").trim().replace(/\\s+/g, \" \");\n}\n\nfunction elementSummary(element: Element | null): Record<string, unknown> | null {\n if (!element) return null;\n let rect: Record<string, number> | null = null;\n try {\n const box = element.getBoundingClientRect();\n rect = {\n x: Math.round(box.x), y: Math.round(box.y),\n width: Math.round(box.width), height: Math.round(box.height),\n };\n } catch {}\n return {\n selector: generateDeterministicSelector(element),\n tag: element.tagName.toLowerCase(),\n text: sanitizeDiagnosticText(visibleText(element)).slice(0, 220) || null,\n role: element.getAttribute(\"role\"),\n href: element instanceof HTMLAnchorElement ? sanitizedUrl(element.href) : null,\n name: element.getAttribute(\"name\"),\n type: element.getAttribute(\"type\"),\n rect,\n };\n}\n\nfunction sanitizeNetworkEntry(entry: Record<string, unknown>): Record<string, unknown> {\n return {\n ...cloneSafe(entry) as Record<string, unknown>,\n ...(typeof entry.url === \"string\" ? { url: sanitizedUrl(entry.url) } : {}),\n };\n}\n\nfunction findTarget(args: Record<string, unknown>): {\n ok: boolean;\n element?: Element;\n mode?: string;\n error?: string;\n repairHint?: string;\n} {\n const selector = string(args.selector);\n if (selector) {\n try {\n const element = document.querySelector(selector);\n return element\n ? { ok: true, element, mode: \"selector\" }\n : {\n ok: false,\n error: \"Selector target not found.\",\n repairHint: \"Call browser_snapshot or browser_select_element to find a selector that exists on the live page.\",\n };\n } catch {\n return {\n ok: false,\n error: `Invalid selector: ${selector}`,\n repairHint: \"Pass visible text or a valid CSS selector.\",\n };\n }\n }\n const query = string(args.text ?? args.selectorOrText ?? args.instruction ?? args.condition);\n if (!query) return { ok: false, error: \"Target not found\" };\n try {\n const element = document.querySelector(query);\n if (element) return { ok: true, element, mode: \"selectorOrText\" };\n } catch {}\n const lower = query.toLowerCase();\n const candidates = Array.from(document.querySelectorAll(\n \"button,a,input,textarea,select,label,[role='button'],[onclick],[data-testid]\",\n )).slice(0, 350).filter((element) => {\n const aria = `${element.getAttribute(\"aria-label\") ?? \"\"} ${element.getAttribute(\"title\") ?? \"\"} ${element.getAttribute(\"value\") ?? \"\"}`.toLowerCase();\n return visibleText(element).toLowerCase().includes(lower) || aria.includes(lower);\n });\n if (candidates.length === 1) return { ok: true, element: candidates[0], mode: \"text\" };\n if (candidates.length > 1) {\n return {\n ok: false,\n error: \"Browser target text is ambiguous.\",\n repairHint: \"Pass the exact selector from browser_snapshot/browser_select_element instead of loose text.\",\n };\n }\n return { ok: false, error: \"Target not found\" };\n}\n\nfunction parseMutation(value: unknown): Mutation | null {\n const input = record(value);\n const selector = string(input?.selector);\n const action = input?.action;\n if (!selector || typeof action !== \"string\" || !MUTATION_ACTIONS.has(action as MutationAction)) return null;\n const mutation: Mutation = { selector, action: action as MutationAction };\n if (typeof input?.html === \"string\") mutation.html = input.html;\n if (typeof input?.text === \"string\") mutation.text = input.text;\n const attribute = record(input?.attribute);\n if (attribute && typeof attribute.name === \"string\" &&\n (typeof attribute.value === \"string\" || attribute.value === null)) {\n mutation.attribute = { name: attribute.name, value: attribute.value };\n }\n const attributes = record(input?.attributes);\n if (attributes) {\n mutation.attributes = Object.fromEntries(Object.entries(attributes).filter(\n ([, entry]) => typeof entry === \"string\" || entry === null,\n )) as Record<string, string | null>;\n }\n const styles = record(input?.styles);\n if (styles) {\n mutation.styles = Object.fromEntries(Object.entries(styles).filter(\n ([, entry]) => typeof entry === \"string\",\n )) as Record<string, string>;\n }\n return mutation;\n}\n\nfunction parseArtifacts(value: unknown): EditorArtifacts | null {\n const input = record(value);\n if (!input || !Array.isArray(input.mutations)) return null;\n const mutations = input.mutations.map(parseMutation);\n if (mutations.some((mutation) => mutation === null)) return null;\n return {\n mutations: mutations as Mutation[],\n customCss: typeof input.customCss === \"string\" ? input.customCss : \"\",\n customJs: typeof input.customJs === \"string\" ? input.customJs : \"\",\n };\n}\n\nfunction auditResult(audit: ArtifactCommandAudit): EditorCommandResult {\n return { ...audit };\n}\n\nexport class EditorCommandExecutor {\n private readonly consoleLogs: Array<Record<string, unknown>> = [];\n private readonly networkLogs: Array<Record<string, unknown>> = [];\n private restoreConsole: (() => void) | null = null;\n private performanceObserver: PerformanceObserver | null = null;\n\n constructor(\n private readonly controller: EditorController,\n private readonly navigation: NavigationActions = {\n navigate: (url) => location.assign(url),\n reload: () => location.reload(),\n back: () => history.back(),\n forward: () => history.forward(),\n },\n ) {}\n\n start(): void {\n if (this.restoreConsole) return;\n const originals = new Map<\"log\" | \"info\" | \"warn\" | \"error\", (...args: unknown[]) => void>();\n for (const level of [\"log\", \"info\", \"warn\", \"error\"] as const) {\n const original = console[level];\n originals.set(level, original);\n console[level] = (...args: unknown[]) => {\n this.consoleLogs.push({ level, args: cloneSafe(args), ts: Date.now() });\n this.consoleLogs.splice(0, Math.max(0, this.consoleLogs.length - MAX_LOGS));\n original.apply(console, args);\n };\n }\n this.restoreConsole = () => {\n for (const [level, original] of originals) console[level] = original;\n this.restoreConsole = null;\n };\n if (typeof PerformanceObserver !== \"undefined\") {\n try {\n this.performanceObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.networkLogs.push({\n url: entry.name,\n type: entry.entryType,\n startTime: Math.round(entry.startTime),\n duration: Math.round(entry.duration),\n });\n }\n this.networkLogs.splice(0, Math.max(0, this.networkLogs.length - MAX_LOGS));\n });\n this.performanceObserver.observe({ type: \"resource\", buffered: true });\n } catch {}\n }\n }\n\n stop(): void {\n this.restoreConsole?.();\n this.performanceObserver?.disconnect();\n this.performanceObserver = null;\n }\n\n async execute(command: ClaimedEditorCommand): Promise<CommandExecution> {\n const args = command.args;\n switch (command.command) {\n case \"current_url\":\n return {\n result: {\n ok: true,\n url: sanitizedUrl(location.href),\n originalUrl: sanitizedUrl(location.href),\n },\n };\n case \"snapshot\":\n return { result: { ok: true, snapshot: this.snapshot() } };\n case \"console_logs\":\n return {\n result: {\n ok: true,\n logs: this.consoleLogs.slice(-50).map(\n (entry) => cloneSafe(entry) as Record<string, unknown>,\n ),\n },\n };\n case \"network_logs\": {\n const filter = string(args.filter).toLowerCase();\n const logs = this.networkLogs.slice(-80).map(sanitizeNetworkEntry).filter(\n (entry) => !filter || JSON.stringify(entry).toLowerCase().includes(filter),\n );\n return { result: { ok: true, logs } };\n }\n case \"screenshot\":\n return {\n result: {\n ok: false,\n error: \"Live-page screenshot capture is unsupported in the merchant SDK runtime.\",\n repairHint: \"Use browser_snapshot for DOM evidence or capture the store tab through the connected browser runner.\",\n screenshot: { captured: false, reason: \"unsupported_live_origin\" },\n },\n };\n case \"eval_readonly\":\n return { result: this.evaluateReadonly(args) };\n case \"click\":\n return { result: this.click(args) };\n case \"type\":\n return { result: this.type(args) };\n case \"select_element\":\n return { result: this.selectElement(args) };\n case \"wait_for\":\n return { result: await this.waitFor(args) };\n case \"network_probe\":\n return { result: await this.networkProbe(args) };\n case \"apply_artifacts\": {\n const artifacts = parseArtifacts(args.artifacts);\n return {\n result: artifacts\n ? auditResult(this.controller.applyCommandArtifacts(artifacts))\n : { ok: false, error: \"apply_artifacts requires a valid full artifact snapshot.\" },\n };\n }\n case \"navigate\": {\n const rawUrl = string(args.url);\n try {\n const url = new URL(rawUrl, this.controller.session.targetOrigin);\n if (url.origin !== this.controller.session.targetOrigin) {\n return { result: { ok: false, error: \"Navigation must stay on the editor session origin.\" } };\n }\n return {\n result: { ok: true, url: sanitizedUrl(url.toString()) },\n afterAcknowledge: () => this.navigation.navigate(url.toString()),\n };\n } catch {\n return { result: { ok: false, error: \"Invalid navigation URL\" } };\n }\n }\n case \"reload\":\n return { result: { ok: true }, afterAcknowledge: () => this.navigation.reload() };\n case \"back\":\n return { result: { ok: true }, afterAcknowledge: () => this.navigation.back() };\n case \"forward\":\n return { result: { ok: true }, afterAcknowledge: () => this.navigation.forward() };\n }\n }\n\n private snapshot(): Record<string, unknown> {\n const summarize = (selector: string, limit: number) => Array.from(\n document.querySelectorAll(selector),\n ).slice(0, limit).map(elementSummary).filter(Boolean);\n return {\n title: document.title ? sanitizeDiagnosticText(document.title).slice(0, 220) : null,\n url: sanitizedUrl(location.href),\n originalUrl: sanitizedUrl(location.href),\n bodyTextLength: (document.body.textContent ?? \"\").length,\n headings: summarize(\"h1,h2,h3\", 18),\n interactive: summarize(\"button,a,input,textarea,select,[role='button'],form\", 45),\n generated: summarize(\"[data-drip-preview-generated], [class*='apex-'], [class*='abt-'], [class*='drip-']\", 20),\n consoleCount: this.consoleLogs.length,\n networkCount: this.networkLogs.length,\n };\n }\n\n private click(args: Record<string, unknown>): EditorCommandResult {\n const target = findTarget(args);\n if (!target.ok || !target.element) return target as EditorCommandResult;\n try { target.element.scrollIntoView({ block: \"center\", inline: \"center\" }); } catch {}\n if (target.element instanceof HTMLElement) target.element.click();\n else target.element.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n return { ok: true, element: elementSummary(target.element), targetResolution: { mode: target.mode } };\n }\n\n private type(args: Record<string, unknown>): EditorCommandResult {\n const target = findTarget(args);\n if (!target.ok || !target.element) return target as EditorCommandResult;\n const value = typeof args.value === \"string\" ? args.value : String(args.value ?? \"\");\n if (target.element instanceof HTMLInputElement || target.element instanceof HTMLTextAreaElement || target.element instanceof HTMLSelectElement) {\n target.element.focus();\n target.element.value = value;\n } else if (target.element instanceof HTMLElement && target.element.isContentEditable) {\n target.element.focus();\n target.element.textContent = value;\n } else {\n return { ok: false, error: \"Target does not accept text input\" };\n }\n target.element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: true, element: elementSummary(target.element), valueLength: value.length };\n }\n\n private selectElement(args: Record<string, unknown>): EditorCommandResult {\n const target = findTarget(args);\n return target.ok && target.element\n ? { ok: true, element: elementSummary(target.element), targetResolution: { mode: target.mode } }\n : target as EditorCommandResult;\n }\n\n private async waitFor(args: Record<string, unknown>): Promise<EditorCommandResult> {\n const timeout = Math.max(100, Math.min(Number(args.timeoutMs) || 5_000, 15_000));\n const startedAt = Date.now();\n while (Date.now() - startedAt < timeout) {\n const target = findTarget(args);\n if (target.ok && target.element) {\n return { ok: true, element: elementSummary(target.element), waitedMs: Date.now() - startedAt };\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return { ok: false, error: \"Target not found before timeout\", waitedMs: Date.now() - startedAt };\n }\n\n private async networkProbe(args: Record<string, unknown>): Promise<EditorCommandResult> {\n const startIndex = this.networkLogs.length;\n const waitMs = Math.max(250, Math.min(Number(args.waitMs) || 2_000, 8_000));\n const action = this.click(args);\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n const entries = this.networkLogs.slice(startIndex).slice(-30).map(sanitizeNetworkEntry);\n return {\n ok: action.ok,\n attemptedAction: action.ok,\n action,\n waitedMs: waitMs,\n currentUrl: sanitizedUrl(location.href),\n originalUrl: sanitizedUrl(location.href),\n networkObserved: entries.length > 0,\n successfulRequestCount: entries.length,\n entries,\n ...(entries.length ? {} : {\n repairHint: \"No resource request was observed after the action. Inspect the handler and selector, then retry browser_network_probe.\",\n }),\n };\n }\n\n private evaluateReadonly(args: Record<string, unknown>): EditorCommandResult {\n if (!isLoopbackOrigin(this.controller.session.targetOrigin)) {\n return {\n ok: false,\n error: \"eval_readonly is unsupported on live merchant origins.\",\n repairHint: \"Use browser_snapshot, browser_select_element, or another allowlisted inspection command.\",\n };\n }\n if (string(args.code)) {\n return {\n ok: false,\n error: \"JavaScript evaluation is disabled in the merchant SDK runtime.\",\n repairHint: \"Pass an allowlisted operation: document_title, current_url, viewport, element_exists, element_count, or element_summary.\",\n };\n }\n const operation = string(args.operation);\n if (operation === \"document_title\") {\n return { ok: true, operation, result: sanitizeDiagnosticText(document.title).slice(0, 220) };\n }\n if (operation === \"current_url\") {\n return { ok: true, operation, result: sanitizedUrl(location.href) };\n }\n if (operation === \"viewport\") {\n return {\n ok: true,\n operation,\n result: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n if ([\"element_exists\", \"element_count\", \"element_summary\"].includes(operation)) {\n const selector = string(args.selector);\n if (!selector) return { ok: false, error: `${operation} requires a selector.` };\n try {\n const elements = Array.from(document.querySelectorAll(selector));\n if (operation === \"element_exists\") {\n return { ok: true, operation, result: elements.length > 0 };\n }\n if (operation === \"element_count\") {\n return { ok: true, operation, result: elements.length };\n }\n return { ok: true, operation, result: elementSummary(elements[0] ?? null) };\n } catch {\n return { ok: false, error: \"The inspection selector is invalid.\" };\n }\n }\n return {\n ok: false,\n error: \"eval_readonly requires an allowlisted declarative operation.\",\n repairHint: \"Use document_title, current_url, viewport, element_exists, element_count, or element_summary.\",\n };\n }\n}\n\nexport class EditorCommandPoller {\n private running = false;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private polling = false;\n\n constructor(\n private readonly api: EditorApi,\n private readonly executor: EditorCommandExecutor,\n ) {}\n\n start(): void {\n if (this.running) return;\n this.running = true;\n this.executor.start();\n void this.poll();\n }\n\n stop(): void {\n this.running = false;\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.executor.stop();\n }\n\n private async poll(): Promise<void> {\n if (!this.running || this.polling) return;\n this.polling = true;\n try {\n const commands = await this.api.claimCommands();\n for (const command of commands) {\n if (!this.running) break;\n let execution: CommandExecution;\n try {\n execution = await this.executor.execute(command);\n } catch (error) {\n await this.api.completeCommand(command.commandId, {\n error: error instanceof Error ? error.message : \"Browser command execution failed\",\n });\n continue;\n }\n await this.api.completeCommand(command.commandId, { result: execution.result });\n if (execution.afterAcknowledge) {\n const action = execution.afterAcknowledge;\n this.stop();\n setTimeout(action, 0);\n break;\n }\n }\n } catch (error) {\n if (error instanceof EditorApiError && [401, 403, 410].includes(error.status)) {\n this.stop();\n }\n } finally {\n this.polling = false;\n if (this.running) this.timer = setTimeout(() => void this.poll(), POLL_INTERVAL_MS);\n }\n }\n}\n", "/**\n * Lightweight HTML sanitizer using the browser's DOMParser.\n * Strips <script> tags, on* event handlers, and javascript: URLs.\n */\nexport function sanitizeHtml(html: string): string {\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n\n // Remove all <script> elements\n for (const script of Array.from(doc.querySelectorAll(\"script\"))) {\n script.remove();\n }\n\n // Walk every element to strip dangerous attributes\n for (const el of Array.from(doc.body.querySelectorAll(\"*\"))) {\n for (const attr of Array.from(el.attributes)) {\n // Remove on* event handler attributes (onclick, onerror, etc.)\n if (attr.name.toLowerCase().startsWith(\"on\")) {\n el.removeAttribute(attr.name);\n continue;\n }\n\n // Remove javascript: URLs in href, src, action, formaction, xlink:href\n const urlAttrs = [\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\"];\n if (urlAttrs.includes(attr.name.toLowerCase())) {\n const value = attr.value.replace(/\\s+/g, \"\").toLowerCase();\n if (value.startsWith(\"javascript:\")) {\n el.removeAttribute(attr.name);\n }\n }\n }\n }\n\n return doc.body.innerHTML;\n}\n", "const observers = new Map<MutationObserver, MutationCallback | undefined>();\nlet muteDepth = 0;\n\nexport function registerMutedObserver(\n observer: MutationObserver,\n callback?: MutationCallback,\n): void {\n observers.set(observer, callback);\n}\n\nexport function unregisterMutedObserver(observer: MutationObserver): void {\n observers.delete(observer);\n}\n\nexport function runMuted<T>(fn: () => T): T {\n if (muteDepth === 0) {\n // Deliver records queued BEFORE the muted write to their handlers: a\n // real storefront change in the same task must not be discarded along\n // with the SDK's own write records when the queue drains below.\n for (const [observer, callback] of observers) {\n try {\n const pending = observer.takeRecords();\n if (pending.length && callback) callback(pending, observer);\n } catch {\n // A disconnected or test-double observer must not block SDK writes.\n }\n }\n }\n muteDepth += 1;\n try {\n return fn();\n } finally {\n muteDepth -= 1;\n if (muteDepth === 0) {\n for (const observer of observers.keys()) {\n try {\n observer.takeRecords();\n } catch {\n // A disconnected or test-double observer must not block SDK writes.\n }\n }\n }\n }\n}\n\n", "import type { CustomJsPolicy } from \"./types\";\n\nlet activePolicy: CustomJsPolicy = \"hybrid\";\nconst EXTERNAL_JS_CLASS = \"drip-external-js\";\n\nexport function setJsPolicy(policy: CustomJsPolicy): void {\n activePolicy = policy;\n}\n\nexport function isStrictJsPolicy(): boolean {\n return activePolicy === \"strict\";\n}\n\nexport function execJs(code: string, sourceLabel?: string): void {\n if (isStrictJsPolicy()) {\n if (typeof console !== \"undefined\") {\n console.warn(\"[drip] Custom JS blocked by strict policy for \" + (sourceLabel || \"unknown\"));\n }\n return;\n }\n\n try {\n const suffix = sourceLabel ? \"\\n//# sourceURL=drip-\" + sourceLabel + \".js\" : \"\";\n new Function(code + suffix)();\n } catch (e) {\n if (typeof console !== \"undefined\") {\n console.error(\"[drip] JS error in \" + (sourceLabel || \"unknown\") + \":\", e);\n }\n }\n}\n\nexport function loadExternalJs(url: string, sourceLabel: string): Promise<void> {\n if (activePolicy === \"strict\") {\n if (typeof console !== \"undefined\") {\n console.warn(\"[drip] External JS blocked by strict policy for \" + sourceLabel);\n }\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n const id = \"drip-external-js-\" + sourceLabel;\n const previous = document.getElementById(id);\n if (previous && previous.getAttribute(\"src\") === url) {\n resolve();\n return;\n }\n if (previous) previous.remove();\n\n const script = document.createElement(\"script\");\n script.id = id;\n script.className = EXTERNAL_JS_CLASS;\n script.src = url;\n script.async = false;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"Failed to load JS artifact: \" + url));\n (document.head || document.documentElement).appendChild(script);\n });\n}\n\nexport function removeAllExternalJs(): void {\n document.querySelectorAll(\".\" + EXTERNAL_JS_CLASS).forEach((el) => el.remove());\n}\n", "import { Mutation, MutationAction } from \"./types\";\nimport { sanitizeHtml } from \"./sanitize\";\nimport { runMuted } from \"./observer-mute\";\nimport { resetReassertSentinel } from \"./reassert-sentinel\";\nimport { isStrictJsPolicy } from \"./js\";\n\nexport type ApplyOptions = {\n root?: Document | HTMLElement;\n onApplied?: (mutation: Mutation, element: Element, index: number) => void;\n onMiss?: (mutation: Mutation, index: number) => void;\n};\n\nconst INSERT_ATTR = \"data-drip-inserted\";\n\ntype AttributeSnapshot = {\n kind: \"attribute\";\n element: Element;\n values: Array<{ name: string; value: string | null }>;\n};\n\ntype ContentSnapshot = {\n kind: \"content\";\n element: Element;\n property: \"innerHTML\" | \"textContent\";\n value: string | null;\n};\n\ntype StyleSnapshot = {\n kind: \"style\";\n element: HTMLElement;\n values: Array<{ name: string; value: string; priority: string }>;\n};\n\ntype RemoveSnapshot = {\n kind: \"remove\";\n element: Element;\n parent: Node | null;\n nextSibling: Node | null;\n};\n\ntype InsertSnapshot = {\n kind: \"insert\";\n nodes: Node[];\n};\n\ntype MutationSnapshot =\n | AttributeSnapshot\n | ContentSnapshot\n | StyleSnapshot\n | RemoveSnapshot\n | InsertSnapshot;\n\nconst mutationSnapshots: MutationSnapshot[] = [];\n\nconst URL_ATTRIBUTES = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\"]);\nconst SAFE_DATA_URL_MEDIA_TYPES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/avif\",\n]);\n\nexport function isSafeMutationAttribute(name: string, value: string | null): boolean {\n const normalizedName = name.trim().toLowerCase();\n if (!normalizedName || normalizedName.startsWith(\"on\") || normalizedName === \"srcdoc\") {\n return false;\n }\n if (value === null || !URL_ATTRIBUTES.has(normalizedName)) return true;\n const normalizedValue = value.replace(/[\\u0000-\\u0020]+/g, \"\").toLowerCase();\n if (normalizedValue.startsWith(\"javascript:\")) return false;\n if (!normalizedValue.startsWith(\"data:\")) return true;\n const mediaType = normalizedValue.slice(5).split(/[;,]/, 1)[0];\n return SAFE_DATA_URL_MEDIA_TYPES.has(mediaType);\n}\n\nfunction sanitizeMutationHtml(html: string): string {\n const sanitized = sanitizeHtml(html);\n if (!isStrictJsPolicy()) return sanitized;\n const template = document.createElement(\"template\");\n template.innerHTML = sanitized;\n for (const element of Array.from(template.content.querySelectorAll(\"*\"))) {\n for (const attribute of Array.from(element.attributes)) {\n if (!isSafeMutationAttribute(attribute.name, attribute.value)) {\n element.removeAttribute(attribute.name);\n }\n }\n }\n return template.innerHTML;\n}\n\nexport function normalizeCssPropertyName(name: string): string {\n // Prefer CSS syntax (kebab-case) because it works with:\n // - HTMLElement.style.setProperty(...)\n // - inline style rewriting at the edge worker\n // But accept common JS-style camelCase keys for developer ergonomics.\n if (!name) return name;\n if (name.startsWith(\"--\")) return name; // custom properties\n if (name.includes(\"-\")) return name; // already kebab-case\n\n let out = name.replace(/[A-Z]/g, (m) => \"-\" + m.toLowerCase());\n // Special-case msTransform -> -ms-transform\n if (out.startsWith(\"ms-\")) out = \"-\" + out;\n return out;\n}\n\nexport function getMutationKey(mutation: Mutation, index: number): string {\n return (\n mutation.action +\n \":\" +\n index +\n \":\" +\n (mutation.selector || \"\") +\n \":\" +\n (mutation.html || mutation.text || \"\")\n );\n}\n\nexport function isInsertAction(action: MutationAction): boolean {\n return action === \"insertBefore\" || action === \"insertAfter\";\n}\n\nfunction snapshotMutation(\n mutation: Mutation,\n element: Element,\n snapshots: MutationSnapshot[] = mutationSnapshots,\n): void {\n switch (mutation.action) {\n case \"html\":\n snapshots.push({\n kind: \"content\",\n element,\n property: \"innerHTML\",\n value: element.innerHTML,\n });\n break;\n case \"text\":\n case \"setText\":\n snapshots.push({\n kind: \"content\",\n element,\n property: \"textContent\",\n value: element.textContent,\n });\n break;\n case \"attribute\": {\n const names = new Set<string>();\n if (mutation.attribute) names.add(mutation.attribute.name);\n if (mutation.attributes) {\n Object.keys(mutation.attributes).forEach((name) => names.add(name));\n }\n snapshots.push({\n kind: \"attribute\",\n element,\n values: Array.from(names).map((name) => ({\n name,\n value: element.getAttribute(name),\n })),\n });\n break;\n }\n case \"style\":\n case \"setStyle\": {\n const style = (element as HTMLElement).style;\n const names = Object.keys(mutation.styles ?? {}).map(normalizeCssPropertyName);\n snapshots.push({\n kind: \"style\",\n element: element as HTMLElement,\n values: names.map((name) => ({\n name,\n value: style.getPropertyValue(name),\n priority: style.getPropertyPriority(name),\n })),\n });\n break;\n }\n case \"remove\":\n snapshots.push({\n kind: \"remove\",\n element,\n parent: element.parentNode,\n nextSibling: element.nextSibling,\n });\n break;\n }\n}\n\nfunction restoreSnapshot(snapshot: MutationSnapshot): void {\n switch (snapshot.kind) {\n case \"content\":\n if (snapshot.property === \"innerHTML\") {\n snapshot.element.innerHTML = snapshot.value ?? \"\";\n } else {\n snapshot.element.textContent = snapshot.value;\n }\n break;\n case \"attribute\":\n for (const { name, value } of snapshot.values) {\n if (value === null) snapshot.element.removeAttribute(name);\n else snapshot.element.setAttribute(name, value);\n }\n break;\n case \"style\":\n for (const { name, value, priority } of snapshot.values) {\n if (value) snapshot.element.style.setProperty(name, value, priority);\n else snapshot.element.style.removeProperty(name);\n }\n break;\n case \"remove\":\n if (!snapshot.parent || snapshot.element.parentNode) return;\n try {\n snapshot.parent.insertBefore(snapshot.element, snapshot.nextSibling);\n } catch {\n snapshot.parent.appendChild(snapshot.element);\n }\n break;\n case \"insert\":\n for (const node of snapshot.nodes) node.parentNode?.removeChild(node);\n break;\n }\n}\n\nexport function applyToElement(mutation: Mutation, element: Element): void {\n switch (mutation.action) {\n case \"html\":\n if (typeof mutation.html === \"string\") element.innerHTML = sanitizeMutationHtml(mutation.html);\n break;\n case \"text\":\n case \"setText\":\n if (typeof mutation.text === \"string\") element.textContent = mutation.text;\n break;\n case \"attribute\":\n if (mutation.attribute) {\n if (!isStrictJsPolicy() ||\n isSafeMutationAttribute(mutation.attribute.name, mutation.attribute.value)) {\n if (mutation.attribute.value === null) {\n element.removeAttribute(mutation.attribute.name);\n } else {\n element.setAttribute(mutation.attribute.name, mutation.attribute.value);\n }\n }\n }\n if (mutation.attributes) {\n for (const [name, value] of Object.entries(mutation.attributes)) {\n if (isStrictJsPolicy() && !isSafeMutationAttribute(name, value)) continue;\n if (value === null) element.removeAttribute(name);\n else element.setAttribute(name, value);\n }\n }\n break;\n case \"style\":\n case \"setStyle\":\n if (mutation.styles) {\n for (const [name, value] of Object.entries(mutation.styles)) {\n (element as HTMLElement).style.setProperty(\n normalizeCssPropertyName(name),\n value,\n );\n }\n }\n break;\n case \"remove\":\n element.remove();\n break;\n case \"insertBefore\":\n if (typeof mutation.html === \"string\") {\n element.insertAdjacentHTML(\"beforebegin\", sanitizeMutationHtml(mutation.html));\n }\n break;\n case \"insertAfter\":\n if (typeof mutation.html === \"string\") {\n element.insertAdjacentHTML(\"afterend\", sanitizeMutationHtml(mutation.html));\n }\n break;\n }\n}\n\nexport function isInsertDuplicate(element: Element, key: string): boolean {\n const parent = element.parentElement;\n if (!parent) return false;\n return Array.from(parent.querySelectorAll(\"[\" + INSERT_ATTR + \"]\")).some(\n (candidate) => candidate.getAttribute(INSERT_ATTR) === key,\n );\n}\n\nexport function markInserted(el: Element, key: string): void {\n (el as HTMLElement).setAttribute(INSERT_ATTR, key);\n}\n\nfunction applyTrackedMutationWithSnapshots(\n mutation: Mutation,\n element: Element,\n snapshots: MutationSnapshot[],\n key?: string,\n): Element | null {\n return runMuted(() => {\n if (isInsertAction(mutation.action)) {\n const parent = element.parentNode;\n if (!parent || typeof mutation.html !== \"string\") return null;\n const previousSibling = element.previousSibling;\n const nextSibling = element.nextSibling;\n applyToElement(mutation, element);\n const insertedNodes: Node[] = [];\n let current = mutation.action === \"insertBefore\"\n ? (previousSibling ? previousSibling.nextSibling : parent.firstChild)\n : element.nextSibling;\n const boundary = mutation.action === \"insertBefore\" ? element : nextSibling;\n while (current && current !== boundary) {\n insertedNodes.push(current);\n current = current.nextSibling;\n }\n const insertedElements = insertedNodes.filter(\n (node): node is Element => node instanceof Element,\n );\n if (key) insertedElements.forEach((inserted) => markInserted(inserted, key));\n if (insertedNodes.length) snapshots.push({ kind: \"insert\", nodes: insertedNodes });\n return insertedElements[0] ?? null;\n }\n snapshotMutation(mutation, element, snapshots);\n applyToElement(mutation, element);\n return null;\n });\n}\n\nexport function applyTrackedMutation(mutation: Mutation, element: Element, key?: string): Element | null {\n return applyTrackedMutationWithSnapshots(mutation, element, mutationSnapshots, key);\n}\n\n// Every pre-apply innerHTML captured for the element's html mutations. The\n// reassert sentinel uses these to attribute subtree changes: a framework\n// hydration revert restores one of these pre-states (the server original,\n// or \u2014 for stacked treatments \u2014 an earlier treatment's content), while\n// variant-owned widget activity produces content none of them ever had.\nexport function matchesOriginalInnerHtmlSnapshot(element: Element, current: string): boolean {\n for (const snapshot of mutationSnapshots) {\n if (\n snapshot.kind === \"content\" &&\n snapshot.element === element &&\n snapshot.property === \"innerHTML\" &&\n typeof snapshot.value === \"string\"\n ) {\n if (snapshot.value === current) return true;\n }\n }\n return false;\n}\n\nfunction applyMutationsWithSnapshots(\n mutations: Mutation[],\n options: ApplyOptions,\n snapshots: MutationSnapshot[],\n): void {\n const root = options.root || document;\n mutations.forEach((mutation, index) => {\n let elements: NodeListOf<Element>;\n try {\n elements = root.querySelectorAll(mutation.selector);\n } catch {\n options.onMiss?.(mutation, index);\n return;\n }\n if (elements.length === 0) {\n options.onMiss?.(mutation, index);\n return;\n }\n elements.forEach((element) => {\n const key = getMutationKey(mutation, index);\n if (isInsertAction(mutation.action)) {\n if (isInsertDuplicate(element, key)) return;\n applyTrackedMutationWithSnapshots(mutation, element, snapshots, key);\n options.onApplied?.(mutation, element, index);\n return;\n }\n applyTrackedMutationWithSnapshots(mutation, element, snapshots, key);\n options.onApplied?.(mutation, element, index);\n });\n });\n}\n\nexport function applyMutations(mutations: Mutation[], options: ApplyOptions = {}): void {\n applyMutationsWithSnapshots(mutations, options, mutationSnapshots);\n}\n\nexport function reassertNonStructuralMutations(mutations: Mutation[], options: ApplyOptions = {}): void {\n const root = options.root || document;\n mutations.forEach((mutation, index) => {\n if (isInsertAction(mutation.action) || mutation.action === \"remove\") return;\n const elements = root.querySelectorAll(mutation.selector);\n elements.forEach((element) => {\n runMuted(() => applyToElement(mutation, element));\n options.onApplied?.(mutation, element, index);\n });\n });\n}\n\nexport function resetAppliedMutations(): void {\n resetReassertSentinel();\n runMuted(() => {\n for (let i = mutationSnapshots.length - 1; i >= 0; i -= 1) {\n restoreSnapshot(mutationSnapshots[i]);\n }\n });\n mutationSnapshots.length = 0;\n}\n\nexport type MutationApplicationContext = {\n apply: (mutations: Mutation[], options?: ApplyOptions) => void;\n rollback: () => void;\n readonly snapshotCount: number;\n};\n\n/**\n * Owns only the DOM snapshots created through this context. Rolling it back\n * restores the state that existed immediately before its mutations, without\n * touching shopper assignment mutations tracked by the main SDK runtime.\n */\nexport function createMutationApplicationContext(): MutationApplicationContext {\n const snapshots: MutationSnapshot[] = [];\n return {\n apply(mutations, options = {}) {\n applyMutationsWithSnapshots(mutations, options, snapshots);\n },\n rollback() {\n runMuted(() => {\n for (let i = snapshots.length - 1; i >= 0; i -= 1) {\n restoreSnapshot(snapshots[i]);\n }\n });\n snapshots.length = 0;\n },\n get snapshotCount() {\n return snapshots.length;\n },\n };\n}\n\n/** @internal \u2014 exposed for unit testing only. Tree-shaken from production build. */\nexport const __test = {\n normalizeCssPropertyName,\n};\n\nexport function observeSpaNavigation(onChange: () => void): () => void {\n let lastUrl = location.href;\n const notify = () => {\n if (lastUrl !== location.href) {\n lastUrl = location.href;\n onChange();\n }\n };\n const wrap = (method: \"pushState\" | \"replaceState\") => {\n const original = history[method];\n history[method] = function (...args: Parameters<History[\"pushState\"]>) {\n const ret = original.apply(this, args);\n notify();\n return ret;\n };\n return () => {\n history[method] = original;\n };\n };\n const restorePush = wrap(\"pushState\");\n const restoreReplace = wrap(\"replaceState\");\n window.addEventListener(\"popstate\", notify);\n return () => {\n restorePush();\n restoreReplace();\n window.removeEventListener(\"popstate\", notify);\n };\n}\n", "import type { Mutation } from \"../types\";\n\nexport type ActiveEditorSession = {\n sid: string;\n bearer: string;\n expiresAt: string;\n shopId: string;\n experimentId: string;\n experimentName?: string | null;\n initialVariationId: string;\n targetUrl: string;\n targetOrigin: string;\n variations: Array<{ id: string; name?: string | null; slug?: string | null }>;\n};\n\nexport type EditorArtifacts = {\n mutations: Mutation[];\n customCss: string;\n customJs: string;\n};\n\nexport type EditorVariation = {\n id: string;\n name: string;\n artifactHash: string;\n reviewStatus: string | null;\n};\n\nexport type EditorBrowserCommand =\n | \"navigate\"\n | \"reload\"\n | \"back\"\n | \"forward\"\n | \"click\"\n | \"type\"\n | \"wait_for\"\n | \"snapshot\"\n | \"screenshot\"\n | \"eval_readonly\"\n | \"console_logs\"\n | \"network_logs\"\n | \"network_probe\"\n | \"current_url\"\n | \"select_element\"\n | \"apply_artifacts\";\n\nexport type ClaimedEditorCommand = {\n commandId: string;\n command: EditorBrowserCommand;\n args: Record<string, unknown>;\n expiresAt: string | null;\n};\n\nexport type EditorSaveState = \"idle\" | \"saving\" | \"saved\" | \"conflict\" | \"error\";\n\nexport type EditorDeviceState = \"closed\" | \"loading\" | \"active\" | \"blocked\";\n\nexport type EditorState = {\n variation: EditorVariation | null;\n artifacts: EditorArtifacts;\n artifactsEnabled: boolean;\n pickerActive: boolean;\n selectedElement: Element | null;\n selectedSelector: string | null;\n saveState: EditorSaveState;\n saveMessage: string | null;\n dock: \"top\" | \"bottom\";\n canUndo: boolean;\n canRedo: boolean;\n jsApplied: boolean;\n reloadRequired: boolean;\n deviceState: EditorDeviceState;\n};\n\nexport const EMPTY_EDITOR_ARTIFACTS: EditorArtifacts = {\n mutations: [],\n customCss: \"\",\n customJs: \"\",\n};\n\nexport function cloneArtifacts(artifacts: EditorArtifacts): EditorArtifacts {\n return {\n mutations: artifacts.mutations.map((mutation) => ({\n ...mutation,\n attribute: mutation.attribute ? { ...mutation.attribute } : undefined,\n attributes: mutation.attributes ? { ...mutation.attributes } : undefined,\n styles: mutation.styles ? { ...mutation.styles } : undefined,\n })),\n customCss: artifacts.customCss,\n customJs: artifacts.customJs,\n };\n}\n", "import type { Mutation } from \"../types\";\nimport { cloneArtifacts, type EditorArtifacts } from \"./types\";\n\nfunction sameMutationSlot(left: Mutation, right: Mutation): boolean {\n if (left.selector !== right.selector) return false;\n const textActions = new Set([\"text\", \"setText\", \"html\"]);\n const styleActions = new Set([\"style\", \"setStyle\"]);\n if (textActions.has(left.action) && textActions.has(right.action)) return true;\n if (styleActions.has(left.action) && styleActions.has(right.action)) return true;\n return left.action === right.action;\n}\n\nexport function upsertMutation(\n artifacts: EditorArtifacts,\n mutation: Mutation,\n): EditorArtifacts {\n if (mutation.action === \"remove\") {\n return {\n ...artifacts,\n mutations: [\n ...artifacts.mutations.filter((item) => item.selector !== mutation.selector),\n mutation,\n ],\n };\n }\n const mutations = artifacts.mutations\n .filter((item) => !(item.selector === mutation.selector && item.action === \"remove\"))\n .map((item) => ({ ...item }));\n const index = mutations.findIndex((item) => sameMutationSlot(item, mutation));\n if (index < 0) mutations.push(mutation);\n else if ((mutation.action === \"style\" || mutation.action === \"setStyle\") && mutations[index].styles) {\n mutations[index] = {\n ...mutations[index],\n ...mutation,\n styles: { ...mutations[index].styles, ...mutation.styles },\n };\n } else if (mutation.action === \"attribute\") {\n const previous = mutations[index];\n const previousAttributes = {\n ...(previous.attribute ? { [previous.attribute.name]: previous.attribute.value } : {}),\n ...(previous.attributes ?? {}),\n };\n const nextAttributes = {\n ...(mutation.attribute ? { [mutation.attribute.name]: mutation.attribute.value } : {}),\n ...(mutation.attributes ?? {}),\n };\n mutations[index] = {\n ...previous,\n ...mutation,\n attribute: undefined,\n attributes: { ...previousAttributes, ...nextAttributes },\n };\n } else {\n mutations[index] = mutation;\n }\n return { ...artifacts, mutations };\n}\n\nexport function removeSelectorMutations(\n artifacts: EditorArtifacts,\n selector: string,\n): EditorArtifacts {\n return {\n ...artifacts,\n mutations: artifacts.mutations.filter((mutation) => mutation.selector !== selector),\n };\n}\n\nexport function removeMutationAt(\n artifacts: EditorArtifacts,\n index: number,\n): EditorArtifacts {\n return {\n ...artifacts,\n mutations: artifacts.mutations.filter((_, mutationIndex) => mutationIndex !== index),\n };\n}\n\nexport class ArtifactHistory {\n private undoStack: EditorArtifacts[] = [];\n private redoStack: EditorArtifacts[] = [];\n\n push(current: EditorArtifacts): void {\n this.undoStack.push(cloneArtifacts(current));\n this.undoStack = this.undoStack.slice(-50);\n this.redoStack = [];\n }\n\n undo(current: EditorArtifacts): EditorArtifacts | null {\n const previous = this.undoStack.pop();\n if (!previous) return null;\n this.redoStack.push(cloneArtifacts(current));\n return cloneArtifacts(previous);\n }\n\n redo(current: EditorArtifacts): EditorArtifacts | null {\n const next = this.redoStack.pop();\n if (!next) return null;\n this.undoStack.push(cloneArtifacts(current));\n return cloneArtifacts(next);\n }\n\n reset(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n}\n", "import { createMutationApplicationContext, type MutationApplicationContext } from \"../mutate\";\nimport { sanitizeHtml } from \"../sanitize\";\nimport type { Mutation } from \"../types\";\nimport { EditorApi, EditorApiError } from \"./api\";\nimport { ArtifactHistory, removeMutationAt, removeSelectorMutations, upsertMutation } from \"./artifacts\";\nimport { DevicePreview } from \"./device-preview\";\nimport {\n cloneArtifacts,\n EMPTY_EDITOR_ARTIFACTS,\n type ActiveEditorSession,\n type EditorArtifacts,\n type EditorDeviceState,\n type EditorState,\n} from \"./types\";\n\nconst EDITOR_CSS_ID = \"apex-editor-draft-css\";\nconst AUTOSAVE_MS = 700;\nconst EXIT_REVOKE_TIMEOUT_MS = 1_500;\n\nexport type ArtifactCommandAudit = {\n ok: boolean;\n mutationAudit: Array<{\n index: number;\n selector: string;\n action: string;\n beforeCount: number;\n afterCount: number;\n effectVerified: boolean;\n error: string | null;\n }>;\n generatedSelectors: string[];\n generatedVisibility: Array<{\n selector: string;\n count: number;\n visibleCount: number;\n matches: Array<{ text: string; visible: boolean }>;\n }>;\n visibleGeneratedCount: number;\n hiddenEffectVerifiedCount: number;\n networkRequired: boolean;\n customJsDeferred: boolean;\n error?: string;\n repairHint?: string;\n};\n\nexport class EditorController {\n private state: EditorState = {\n variation: null,\n artifacts: cloneArtifacts(EMPTY_EDITOR_ARTIFACTS),\n artifactsEnabled: true,\n pickerActive: false,\n selectedElement: null,\n selectedSelector: null,\n saveState: \"idle\",\n saveMessage: null,\n dock: \"top\",\n canUndo: false,\n canRedo: false,\n jsApplied: false,\n reloadRequired: false,\n deviceState: \"closed\",\n };\n private readonly listeners = new Set<(state: EditorState) => void>();\n private readonly history = new ArtifactHistory();\n private visualContext: MutationApplicationContext | null = null;\n private devicePreview: DevicePreview | null = null;\n private saveTimer: ReturnType<typeof setTimeout> | null = null;\n private saveQueue: Promise<void> = Promise.resolve();\n private revision = 0;\n private variationRequest = 0;\n private readonly cleanups = new Set<() => void>();\n\n constructor(\n readonly session: ActiveEditorSession,\n readonly apiOrigin: string,\n private readonly api = new EditorApi(apiOrigin, session),\n private readonly reload = () => location.reload(),\n ) {}\n\n getState(): EditorState {\n return this.state;\n }\n\n subscribe(listener: (state: EditorState) => void): () => void {\n this.listeners.add(listener);\n listener(this.state);\n return () => this.listeners.delete(listener);\n }\n\n async initialize(): Promise<void> {\n await this.selectVariation(this.session.initialVariationId);\n }\n\n async selectVariation(variationId: string): Promise<void> {\n const request = ++this.variationRequest;\n this.cancelSave();\n this.patch({ saveState: \"idle\", saveMessage: \"Loading draft...\" });\n try {\n const loaded = await this.api.loadArtifacts(variationId);\n if (request !== this.variationRequest) return;\n this.history.reset();\n this.revision += 1;\n this.state = {\n ...this.state,\n variation: loaded.variation,\n artifacts: cloneArtifacts(loaded.artifacts),\n selectedElement: null,\n selectedSelector: null,\n saveState: \"saved\",\n saveMessage: \"Saved\",\n canUndo: false,\n canRedo: false,\n jsApplied: false,\n reloadRequired: false,\n };\n this.applyVisualArtifacts();\n this.emit();\n } catch (error) {\n if (request !== this.variationRequest) return;\n this.patch({\n saveState: \"error\",\n saveMessage: error instanceof Error ? error.message : \"Draft could not be loaded\",\n });\n }\n }\n\n setPickerActive(active: boolean): void {\n this.patch({ pickerActive: active });\n }\n\n selectElement(element: Element, selector: string): void {\n this.patch({ selectedElement: element, selectedSelector: selector, pickerActive: false });\n }\n\n clearSelection(): void {\n this.clearSelectedElement();\n }\n\n clearSelectedElement(): void {\n this.patch({ selectedElement: null, selectedSelector: null, pickerActive: false });\n }\n\n removeSelector(selector: string): void {\n this.commit(removeSelectorMutations(this.state.artifacts, selector));\n }\n\n removeMutation(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this.state.artifacts.mutations.length) return;\n this.commit(removeMutationAt(this.state.artifacts, index));\n }\n\n restoreArtifacts(artifacts: EditorArtifacts): void {\n this.commit(cloneArtifacts(artifacts));\n }\n\n async extendSession(): Promise<string | null> {\n const expiresAt = await this.api.extendSession();\n if (expiresAt) this.session.expiresAt = expiresAt;\n return expiresAt;\n }\n\n async resolveConflict(choice: \"mine\" | \"theirs\"): Promise<void> {\n const variation = this.state.variation;\n if (!variation || this.state.saveState !== \"conflict\") return;\n if (choice === \"theirs\") {\n await this.selectVariation(variation.id);\n return;\n }\n try {\n const loaded = await this.api.loadArtifacts(variation.id);\n this.state = {\n ...this.state,\n variation: { ...variation, artifactHash: loaded.variation.artifactHash },\n saveState: \"idle\",\n saveMessage: \"Unsaved changes\",\n };\n this.emit();\n await this.saveNow();\n } catch (error) {\n this.patch({\n saveState: \"error\",\n saveMessage: error instanceof Error ? error.message : \"Draft could not be saved\",\n });\n }\n }\n\n toggleArtifacts(enabled: boolean): void {\n this.state = { ...this.state, artifactsEnabled: enabled };\n this.applyVisualArtifacts();\n this.devicePreview?.update(this.state.artifacts, enabled);\n this.emit();\n }\n\n setDock(dock: \"top\" | \"bottom\"): void {\n this.patch({ dock });\n }\n\n setText(value: string): void {\n this.mutateSelected({ action: \"setText\", text: value });\n }\n\n setImageSource(value: string): void {\n this.mutateSelected({ action: \"attribute\", attributes: { src: value } });\n }\n\n setStyle(name: string, value: string): void {\n this.mutateSelected({ action: \"setStyle\", styles: { [name]: value } });\n }\n\n hideSelected(): void {\n this.setStyle(\"display\", \"none\");\n }\n\n removeSelected(): void {\n this.mutateSelected({ action: \"remove\" });\n }\n\n setCustomCss(value: string): void {\n this.commit({ ...this.state.artifacts, customCss: value });\n }\n\n setCustomJs(value: string): void {\n this.commit({ ...this.state.artifacts, customJs: value }, false);\n this.patch({ jsApplied: false });\n }\n\n applyCustomJs(): void {\n const code = this.state.artifacts.customJs.trim();\n if (!code) return;\n try {\n new Function(`${code}\\n//# sourceURL=apex-editor-draft.js`)();\n this.patch({\n jsApplied: true,\n reloadRequired: true,\n saveMessage: \"JavaScript applied. Reload required to undo.\",\n });\n } catch (error) {\n this.patch({\n saveState: \"error\",\n saveMessage: error instanceof Error ? error.message : \"JavaScript failed\",\n });\n }\n }\n\n undo(): void {\n const previous = this.history.undo(this.state.artifacts);\n if (previous) this.replaceFromHistory(previous);\n }\n\n redo(): void {\n const next = this.history.redo(this.state.artifacts);\n if (next) this.replaceFromHistory(next);\n }\n\n attachDevicePreview(devicePreview: DevicePreview): void {\n this.devicePreview = devicePreview;\n }\n\n setDeviceState(deviceState: EditorDeviceState): void {\n this.patch({ deviceState });\n }\n\n openDevicePreview(): void {\n this.devicePreview?.open(\n this.state.artifactsEnabled ? this.state.artifacts : cloneArtifacts(EMPTY_EDITOR_ARTIFACTS),\n );\n }\n\n closeDevicePreview(): void {\n this.devicePreview?.close();\n }\n\n addCleanup(cleanup: () => void): () => void {\n this.cleanups.add(cleanup);\n return () => this.cleanups.delete(cleanup);\n }\n\n applyCommandArtifacts(artifacts: EditorArtifacts): ArtifactCommandAudit {\n this.visualContext?.rollback();\n this.visualContext = null;\n document.getElementById(EDITOR_CSS_ID)?.remove();\n const beforeCounts = artifacts.mutations.map((mutation) => this.selectorCount(mutation.selector));\n this.state = { ...this.state, artifactsEnabled: true };\n this.commit(cloneArtifacts(artifacts));\n const mutationAudit = artifacts.mutations.map((mutation, index) => {\n const beforeCount = beforeCounts[index];\n const afterCount = this.selectorCount(mutation.selector);\n const effectVerified = this.verifyMutationEffect(mutation, beforeCount, afterCount);\n return {\n index,\n selector: mutation.selector,\n action: mutation.action,\n beforeCount,\n afterCount,\n effectVerified,\n error: beforeCount < 0 ? \"Invalid selector\" : null,\n };\n });\n const generatedSelectors = Array.from(new Set(\n artifacts.mutations\n .filter((mutation) => mutation.action !== \"remove\")\n .map((mutation) => mutation.selector),\n ));\n const generatedVisibility = generatedSelectors.map((selector) => {\n const elements = this.selectorElements(selector);\n const matches = elements.slice(0, 8).map((element) => ({\n text: (element.textContent ?? \"\").trim().replace(/\\s+/g, \" \").slice(0, 240),\n visible: this.isVisible(element),\n }));\n return {\n selector,\n count: elements.length,\n visibleCount: matches.filter((match) => match.visible).length,\n matches,\n };\n });\n const failed = mutationAudit.filter((entry) => !entry.effectVerified);\n const visibleGeneratedCount = generatedVisibility.reduce(\n (total, entry) => total + entry.visibleCount,\n 0,\n );\n const networkRequired = /\\b(?:fetch|XMLHttpRequest|sendBeacon)\\b/.test(artifacts.customJs);\n return {\n ok: failed.length === 0,\n mutationAudit,\n generatedSelectors,\n generatedVisibility,\n visibleGeneratedCount,\n hiddenEffectVerifiedCount: mutationAudit.filter(\n (entry) => entry.action === \"remove\" && entry.effectVerified,\n ).length,\n networkRequired,\n customJsDeferred: artifacts.customJs.trim().length > 0,\n ...(failed.length\n ? {\n error: \"One or more mutation selectors did not match the live page.\",\n repairHint: \"Inspect the current browser snapshot, choose a selector that exists, and reapply the draft.\",\n }\n : {}),\n };\n }\n\n saveNow(): Promise<void> {\n this.cancelSave();\n if (!this.state.variation || this.state.saveState === \"conflict\") {\n return Promise.resolve();\n }\n const variationId = this.state.variation.id;\n const variationRequest = this.variationRequest;\n const queued = this.saveQueue.then(() =>\n this.performSave(variationId, variationRequest),\n );\n this.saveQueue = queued.catch(() => undefined);\n return queued;\n }\n\n private async performSave(\n variationId: string,\n saveVariationRequest: number,\n ): Promise<void> {\n if (\n saveVariationRequest !== this.variationRequest ||\n this.state.variation?.id !== variationId ||\n this.state.saveState === \"conflict\"\n ) {\n return;\n }\n const expectedHash = this.state.variation.artifactHash;\n const snapshot = cloneArtifacts(this.state.artifacts);\n const saveRevision = this.revision;\n this.patch({ saveState: \"saving\", saveMessage: \"Saving...\" });\n try {\n const result = await this.api.saveArtifacts(variationId, snapshot, expectedHash);\n if (saveVariationRequest !== this.variationRequest || this.state.variation?.id !== variationId) return;\n const changedDuringSave = saveRevision !== this.revision;\n this.state = {\n ...this.state,\n variation: {\n ...this.state.variation!,\n artifactHash: result.artifactHash,\n reviewStatus: result.reviewStatus,\n },\n artifacts: changedDuringSave ? this.state.artifacts : cloneArtifacts(result.artifacts),\n saveState: changedDuringSave ? \"idle\" : \"saved\",\n saveMessage: changedDuringSave\n ? \"Saving latest changes...\"\n : result.warningIssues[0]?.message ?? \"Saved\",\n };\n this.emit();\n } catch (error) {\n if (saveVariationRequest !== this.variationRequest || this.state.variation?.id !== variationId) return;\n if (error instanceof EditorApiError && error.status === 409) {\n this.patch({\n saveState: \"conflict\",\n saveMessage: \"Draft changed elsewhere. Reload this variation before saving.\",\n });\n } else {\n this.patch({\n saveState: \"error\",\n saveMessage: error instanceof Error ? error.message : \"Draft could not be saved\",\n });\n }\n }\n }\n\n async exit(): Promise<void> {\n this.cancelSave();\n this.runCleanups();\n this.devicePreview?.close(false);\n this.visualContext?.rollback();\n document.getElementById(EDITOR_CSS_ID)?.remove();\n try {\n window.opener?.postMessage(\n {\n type: \"apex:editor-exited\",\n sid: this.session.sid,\n experimentId: this.session.experimentId,\n variationId: this.state.variation?.id ?? this.session.initialVariationId,\n },\n this.apiOrigin,\n );\n } catch {}\n try {\n await this.withTimeout(this.api.revoke(), EXIT_REVOKE_TIMEOUT_MS);\n } catch {}\n this.reload();\n }\n\n destroy(): void {\n this.cancelSave();\n this.runCleanups();\n this.devicePreview?.close(false);\n this.visualContext?.rollback();\n document.getElementById(EDITOR_CSS_ID)?.remove();\n this.listeners.clear();\n }\n\n private mutateSelected(input: Omit<Mutation, \"selector\">): void {\n const selector = this.state.selectedSelector;\n if (!selector) return;\n this.commit(upsertMutation(this.state.artifacts, { ...input, selector } as Mutation));\n }\n\n private commit(next: EditorArtifacts, applyVisual = true): void {\n if (this.state.saveState === \"conflict\") return;\n this.history.push(this.state.artifacts);\n this.revision += 1;\n this.state = {\n ...this.state,\n artifacts: cloneArtifacts(next),\n saveState: \"idle\",\n saveMessage: \"Unsaved changes\",\n canUndo: this.history.canUndo,\n canRedo: this.history.canRedo,\n };\n if (applyVisual) this.applyVisualArtifacts();\n this.devicePreview?.update(this.state.artifacts, this.state.artifactsEnabled);\n this.emit();\n this.scheduleSave();\n }\n\n private replaceFromHistory(artifacts: EditorArtifacts): void {\n this.revision += 1;\n this.state = {\n ...this.state,\n artifacts,\n saveState: \"idle\",\n saveMessage: \"Unsaved changes\",\n canUndo: this.history.canUndo,\n canRedo: this.history.canRedo,\n jsApplied: false,\n };\n this.applyVisualArtifacts();\n this.devicePreview?.update(artifacts, this.state.artifactsEnabled);\n this.emit();\n this.scheduleSave();\n }\n\n private applyVisualArtifacts(): void {\n this.visualContext?.rollback();\n this.visualContext = null;\n document.getElementById(EDITOR_CSS_ID)?.remove();\n if (!this.state.artifactsEnabled) return;\n if (this.state.artifacts.customCss.trim()) {\n const style = document.createElement(\"style\");\n style.id = EDITOR_CSS_ID;\n style.textContent = this.state.artifacts.customCss;\n (document.head || document.documentElement).appendChild(style);\n }\n this.visualContext = createMutationApplicationContext();\n this.visualContext.apply(this.state.artifacts.mutations);\n }\n\n private scheduleSave(): void {\n this.cancelSave();\n this.saveTimer = setTimeout(() => void this.saveNow(), AUTOSAVE_MS);\n }\n\n private cancelSave(): void {\n if (this.saveTimer) clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n private patch(patch: Partial<EditorState>): void {\n this.state = { ...this.state, ...patch };\n this.emit();\n }\n\n private emit(): void {\n for (const listener of this.listeners) listener(this.state);\n }\n\n private selectorElements(selector: string): Element[] {\n try {\n return Array.from(document.querySelectorAll(selector));\n } catch {\n return [];\n }\n }\n\n private selectorCount(selector: string): number {\n try {\n return document.querySelectorAll(selector).length;\n } catch {\n return -1;\n }\n }\n\n private isVisible(element: Element): boolean {\n if (!(element instanceof HTMLElement)) return true;\n const style = getComputedStyle(element);\n if (style.display === \"none\" || style.visibility === \"hidden\" || Number(style.opacity) === 0) return false;\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0 || Boolean(element.textContent?.trim());\n }\n\n private verifyMutationEffect(\n mutation: Mutation,\n beforeCount: number,\n afterCount: number,\n ): boolean {\n if (beforeCount <= 0) return false;\n if (mutation.action === \"remove\") return afterCount === 0;\n const elements = this.selectorElements(mutation.selector);\n if (!elements.length) return false;\n if ((mutation.action === \"text\" || mutation.action === \"setText\") && typeof mutation.text === \"string\") {\n return elements.every((element) => element.textContent === mutation.text);\n }\n if (mutation.action === \"html\" && typeof mutation.html === \"string\") {\n const sanitizedHtml = sanitizeHtml(mutation.html);\n return elements.every((element) => {\n const expected = element.cloneNode(false) as Element;\n expected.innerHTML = sanitizedHtml;\n return element.innerHTML === expected.innerHTML;\n });\n }\n if (mutation.action === \"attribute\") {\n const attributes = {\n ...(mutation.attribute ? { [mutation.attribute.name]: mutation.attribute.value } : {}),\n ...(mutation.attributes ?? {}),\n };\n return elements.every((element) => Object.entries(attributes).every(\n ([name, value]) => value === null\n ? !element.hasAttribute(name)\n : element.getAttribute(name) === value,\n ));\n }\n if (mutation.action === \"style\" || mutation.action === \"setStyle\") {\n return elements.every((element) => Object.entries(mutation.styles ?? {}).every(\n ([name, value]) => (element as HTMLElement).style.getPropertyValue(\n name.includes(\"-\") ? name : name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),\n ) === value,\n ));\n }\n return true;\n }\n\n private runCleanups(): void {\n for (const cleanup of this.cleanups) cleanup();\n this.cleanups.clear();\n }\n\n private async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T | undefined> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n return await Promise.race([\n promise,\n new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), timeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n}\n", "export const EDITOR_FRAGMENT_KEY = \"apex-editor\";\nexport const EDITOR_BUNDLE_FILENAME = \"editor.js\";\nexport const EDITOR_DEVICE_FRAME_NAME = \"apex-editor-device-preview\";\nconst EDITOR_SCRIPT_ID = \"drip-editor-bundle\";\nconst EDITOR_LOAD_TIMEOUT_MS = 10_000;\n\nexport type EditorLaunchHint = {\n token: string;\n sid: string;\n apiOrigin: string;\n};\n\ntype LocationLike = Pick<Location, \"hash\" | \"href\">;\ntype HistoryLike = Pick<History, \"replaceState\" | \"state\">;\n\nexport type EditorBundleApi = {\n start: (launch: EditorLaunchHint) => boolean | Promise<boolean>;\n};\n\ntype EditorGlobal = typeof globalThis & {\n ApexEditor?: EditorBundleApi;\n};\n\nlet editorState: \"idle\" | \"starting\" | \"active\" = \"idle\";\n\nexport function isEditorDevicePreview(windowLike: Pick<Window, \"name\"> = window): boolean {\n return windowLike.name === EDITOR_DEVICE_FRAME_NAME;\n}\n\nfunction decodeBase64Url(value: string): string | null {\n try {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n return atob(padded);\n } catch {\n return null;\n }\n}\n\nfunction normalizeApiOrigin(value: unknown): string | null {\n if (typeof value !== \"string\" || !value.trim()) return null;\n try {\n const url = new URL(value);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return null;\n return url.origin;\n } catch {\n return null;\n }\n}\n\nexport function decodeEditorLaunchToken(token: string): Omit<EditorLaunchHint, \"token\"> | null {\n const encodedPayload = token.split(\".\", 1)[0];\n if (!encodedPayload) return null;\n const decoded = decodeBase64Url(encodedPayload);\n if (!decoded) return null;\n try {\n const payload = JSON.parse(decoded) as Record<string, unknown>;\n const sid = typeof payload.sid === \"string\" ? payload.sid.trim() : \"\";\n const apiOrigin = normalizeApiOrigin(payload.apiOrigin ?? payload.api_origin);\n if (payload.aud !== \"apex-editor-exchange\" || !sid || !apiOrigin) return null;\n return { sid, apiOrigin };\n } catch {\n return null;\n }\n}\n\nexport function consumeEditorLaunchFragment(\n locationLike: LocationLike = location,\n historyLike: HistoryLike = history,\n): EditorLaunchHint | null {\n if (!locationLike.hash || locationLike.hash.length < 2) return null;\n const params = new URLSearchParams(locationLike.hash.slice(1));\n const encodedToken = params.get(EDITOR_FRAGMENT_KEY);\n if (!encodedToken) return null;\n\n const token = encodedToken.trim();\n const hint = decodeEditorLaunchToken(token);\n params.delete(EDITOR_FRAGMENT_KEY);\n\n try {\n const cleanUrl = new URL(locationLike.href);\n const remainingHash = params.toString();\n cleanUrl.hash = remainingHash ? `#${remainingHash}` : \"\";\n historyLike.replaceState(historyLike.state ?? null, \"\", cleanUrl.toString());\n } catch {\n return null;\n }\n\n return hint ? { token, ...hint } : null;\n}\n\nexport function resolveEditorBundleUrl(input: {\n configuredUrl?: string;\n scriptSrc?: string;\n pageUrl?: string;\n}): string | null {\n const baseUrl = input.scriptSrc || input.pageUrl;\n if (input.configuredUrl) {\n try {\n const url = new URL(input.configuredUrl, baseUrl);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.toString() : null;\n } catch {\n return null;\n }\n }\n if (!input.scriptSrc) return null;\n try {\n const scriptUrl = new URL(input.scriptSrc, input.pageUrl);\n if (/^\\/sdk\\/[^/]+\\/[^/]+\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, EDITOR_BUNDLE_FILENAME);\n } else if (/\\/drip(?:\\.live|\\.heatmap|\\.debug)?\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, EDITOR_BUNDLE_FILENAME);\n } else {\n scriptUrl.pathname = `/${EDITOR_BUNDLE_FILENAME}`;\n }\n scriptUrl.search = \"\";\n scriptUrl.hash = \"\";\n return scriptUrl.toString();\n } catch {\n return null;\n }\n}\n\nexport function loadEditorBundle(\n bundleUrl: string,\n documentLike: Document = document,\n timeoutMs = EDITOR_LOAD_TIMEOUT_MS,\n): Promise<EditorBundleApi> {\n return new Promise((resolve, reject) => {\n const existing = documentLike.getElementById(EDITOR_SCRIPT_ID);\n existing?.remove();\n\n const script = documentLike.createElement(\"script\");\n script.id = EDITOR_SCRIPT_ID;\n script.src = bundleUrl;\n script.async = true;\n script.crossOrigin = \"anonymous\";\n\n const timeout = setTimeout(() => {\n script.remove();\n reject(new Error(\"Editor bundle load timed out\"));\n }, timeoutMs);\n const finish = (error?: Error) => {\n clearTimeout(timeout);\n if (error) {\n script.remove();\n reject(error);\n return;\n }\n const editorGlobal = globalThis as EditorGlobal;\n const api = editorGlobal.ApexEditor;\n try {\n editorGlobal.ApexEditor = undefined;\n } catch {}\n if (!api || typeof api.start !== \"function\") {\n reject(new Error(\"Editor bundle did not expose a start function\"));\n return;\n }\n resolve(api);\n };\n script.onload = () => finish();\n script.onerror = () => finish(new Error(\"Editor bundle failed to load\"));\n (documentLike.head || documentLike.documentElement).appendChild(script);\n });\n}\n\nexport function interceptEditorLaunch(input: {\n configuredBundleUrl?: string;\n scriptSrc?: string;\n pageUrl?: string;\n onBeforeLoad?: () => void;\n onFailure: () => void;\n loadBundle?: (url: string) => Promise<EditorBundleApi>;\n locationLike?: LocationLike;\n historyLike?: HistoryLike;\n}): boolean {\n if (editorState !== \"idle\") return true;\n const launch = consumeEditorLaunchFragment(input.locationLike, input.historyLike);\n if (!launch) return false;\n\n editorState = \"starting\";\n input.onBeforeLoad?.();\n const bundleUrl = resolveEditorBundleUrl({\n configuredUrl: input.configuredBundleUrl,\n scriptSrc: input.scriptSrc,\n pageUrl: input.pageUrl,\n });\n const fail = () => {\n editorState = \"idle\";\n input.onFailure();\n };\n if (!bundleUrl) {\n Promise.resolve().then(fail);\n return true;\n }\n\n const loader = input.loadBundle ?? ((url: string) => loadEditorBundle(url));\n loader(bundleUrl)\n .then((api) => api.start(launch))\n .then((active) => {\n if (active) editorState = \"active\";\n else fail();\n })\n .catch(fail);\n return true;\n}\n\nexport const __test = {\n getState: () => editorState,\n resetState: () => {\n editorState = \"idle\";\n },\n};\n", "import { createMutationApplicationContext, type MutationApplicationContext } from \"../mutate\";\nimport type { EditorArtifacts, EditorDeviceState } from \"./types\";\n\nconst FRAME_TIMEOUT_MS = 5_000;\nconst DEVICE_STYLE_ID = \"apex-editor-device-css\";\n\nexport type DevicePreviewSize = { width: number; height: number };\n\nexport class DevicePreview {\n private context: MutationApplicationContext | null = null;\n private hiddenChildren: Array<{ element: HTMLElement; visibility: string }> = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private artifacts: EditorArtifacts | null = null;\n\n constructor(\n private readonly frame: HTMLIFrameElement,\n private readonly onState: (state: EditorDeviceState) => void,\n ) {}\n\n open(artifacts: EditorArtifacts): void {\n this.close(false);\n this.artifacts = artifacts;\n this.hideStorePage();\n this.onState(\"loading\");\n this.frame.hidden = false;\n this.frame.onload = () => this.handleLoad();\n this.frame.onerror = () => this.blocked();\n const url = new URL(location.href);\n url.hash = \"\";\n this.frame.src = url.toString();\n this.timer = setTimeout(() => this.blocked(), FRAME_TIMEOUT_MS);\n }\n\n update(artifacts: EditorArtifacts, enabled = true): void {\n this.artifacts = enabled ? artifacts : { mutations: [], customCss: \"\", customJs: \"\" };\n const doc = this.readDocument();\n if (doc) this.apply(doc, this.artifacts);\n }\n\n close(notify = true): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.context?.rollback();\n this.context = null;\n this.frame.onload = null;\n this.frame.onerror = null;\n this.frame.hidden = true;\n this.frame.removeAttribute(\"src\");\n for (const item of this.hiddenChildren) {\n item.element.style.visibility = item.visibility;\n }\n this.hiddenChildren = [];\n if (notify) this.onState(\"closed\");\n }\n\n private handleLoad(): void {\n const doc = this.readDocument();\n if (!doc?.body || !this.artifacts) {\n this.blocked();\n return;\n }\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.apply(doc, this.artifacts);\n this.onState(\"active\");\n }\n\n private readDocument(): Document | null {\n try {\n const doc = this.frame.contentDocument;\n const frameUrl = this.frame.contentWindow?.location.href ?? \"\";\n if (!doc || !frameUrl || frameUrl === \"about:blank\") return null;\n return doc;\n } catch {\n return null;\n }\n }\n\n private apply(doc: Document, artifacts: EditorArtifacts): void {\n this.context?.rollback();\n this.context = createMutationApplicationContext();\n doc.getElementById(DEVICE_STYLE_ID)?.remove();\n if (artifacts.customCss.trim()) {\n const style = doc.createElement(\"style\");\n style.id = DEVICE_STYLE_ID;\n style.textContent = artifacts.customCss;\n (doc.head || doc.documentElement).appendChild(style);\n }\n this.context.apply(artifacts.mutations, { root: doc });\n }\n\n private hideStorePage(): void {\n const editorHost = document.getElementById(\"apex-editor-host\");\n this.hiddenChildren = Array.from(document.body?.children ?? [])\n .filter((element): element is HTMLElement => element instanceof HTMLElement && element !== editorHost)\n .map((element) => {\n const visibility = element.style.visibility;\n element.style.visibility = \"hidden\";\n return { element, visibility };\n });\n }\n\n private blocked(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.frame.onload = null;\n this.frame.onerror = null;\n this.frame.hidden = true;\n this.frame.removeAttribute(\"src\");\n this.restoreStorePage();\n this.onState(\"blocked\");\n }\n\n private restoreStorePage(): void {\n for (const item of this.hiddenChildren) {\n item.element.style.visibility = item.visibility;\n }\n this.hiddenChildren = [];\n }\n}\n", "import { elementLabel, generateDeterministicSelector } from \"./selector\";\n\ntype PickerOverlay = {\n box: HTMLElement;\n label: HTMLElement;\n};\n\nfunction editorElement(element: Element | null): boolean {\n return Boolean(element?.closest(\"#apex-editor-host\"));\n}\n\nfunction editorEvent(event: Event): boolean {\n return event.composedPath().some(\n (item) => item instanceof Element && item.id === \"apex-editor-host\",\n );\n}\n\nfunction selectableElement(element: Element): boolean {\n return element.ownerDocument === document && element.getRootNode() === document;\n}\n\nexport class ElementPicker {\n private active = false;\n private hovered: Element | null = null;\n private selected: Element | null = null;\n\n constructor(\n private readonly overlay: PickerOverlay,\n private readonly onSelect: (element: Element, selector: string) => void,\n private readonly onActiveChange: (active: boolean) => void,\n private readonly onUnsupported?: () => void,\n ) {\n document.addEventListener(\"pointermove\", this.onPointerMove, true);\n document.addEventListener(\"click\", this.onClick, true);\n document.addEventListener(\"keydown\", this.onKeyDown, true);\n window.addEventListener(\"scroll\", this.refresh, true);\n window.addEventListener(\"resize\", this.refresh);\n }\n\n setActive(active: boolean): void {\n this.active = active;\n if (!active) this.hovered = null;\n this.renderOverlay(active ? this.hovered : this.selected);\n this.onActiveChange(active);\n }\n\n setSelected(element: Element | null): void {\n this.selected = element;\n this.renderOverlay(this.active ? this.hovered : element);\n }\n\n destroy(): void {\n document.removeEventListener(\"pointermove\", this.onPointerMove, true);\n document.removeEventListener(\"click\", this.onClick, true);\n document.removeEventListener(\"keydown\", this.onKeyDown, true);\n window.removeEventListener(\"scroll\", this.refresh, true);\n window.removeEventListener(\"resize\", this.refresh);\n }\n\n private onPointerMove = (event: PointerEvent) => {\n if (!this.active) return;\n if (editorEvent(event)) return;\n const target = event.composedPath()[0];\n const element = target instanceof Element ? target : null;\n if (!element || !selectableElement(element) || editorElement(element)) return;\n this.hovered = element;\n this.renderOverlay(element);\n };\n\n private onClick = (event: MouseEvent) => {\n if (!this.active) return;\n if (editorEvent(event)) return;\n const target = event.composedPath()[0];\n const element = target instanceof Element ? target : null;\n if (!element) return;\n if (!selectableElement(element) || editorElement(element)) {\n if (!editorElement(element)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.onUnsupported?.();\n }\n return;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n this.selected = element;\n this.hovered = null;\n this.active = false;\n this.renderOverlay(element);\n this.onSelect(element, generateDeterministicSelector(element));\n this.onActiveChange(false);\n };\n\n private onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && this.active) {\n event.preventDefault();\n this.setActive(false);\n return;\n }\n const target = event.target;\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n (target instanceof HTMLElement && target.isContentEditable)\n ) {\n return;\n }\n if (!this.selected || ![\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(event.key)) {\n return;\n }\n const next = event.key === \"ArrowUp\"\n ? this.selected.parentElement\n : event.key === \"ArrowDown\"\n ? this.selected.firstElementChild\n : event.key === \"ArrowLeft\"\n ? this.selected.previousElementSibling\n : this.selected.nextElementSibling;\n if (!next || !selectableElement(next) || editorElement(next)) return;\n event.preventDefault();\n this.selected = next;\n this.renderOverlay(next);\n this.onSelect(next, generateDeterministicSelector(next));\n };\n\n private refresh = () => {\n this.renderOverlay(this.active ? this.hovered : this.selected);\n };\n\n private renderOverlay(element: Element | null): void {\n if (!element?.isConnected) {\n this.overlay.box.hidden = true;\n this.overlay.label.hidden = true;\n return;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n this.overlay.box.hidden = true;\n this.overlay.label.hidden = true;\n return;\n }\n this.overlay.box.hidden = false;\n this.overlay.label.hidden = false;\n this.overlay.box.dataset.state = this.active && element !== this.selected ? \"hover\" : \"selected\";\n this.overlay.box.style.transform = `translate(${Math.round(rect.left)}px,${Math.round(rect.top)}px)`;\n this.overlay.box.style.width = `${Math.round(rect.width)}px`;\n this.overlay.box.style.height = `${Math.round(rect.height)}px`;\n this.overlay.label.textContent = elementLabel(element);\n const labelTop = rect.top >= 28 ? rect.top - 24 : rect.bottom + 4;\n this.overlay.label.style.transform = `translate(${Math.max(4, Math.round(rect.left))}px,${Math.round(labelTop)}px)`;\n }\n}\n", "import type { Mutation } from \"../types\";\nimport { upsertMutation } from \"./artifacts\";\nimport type {\n ActiveEditorSession,\n EditorArtifacts,\n} from \"./types\";\n\nconst MAX_CONTEXT_CHARS = 180_000;\nconst MAX_CONVERSATION_MESSAGES = 12;\nconst CONTEXT_SELECTORS = [\n \"main\",\n \"header\",\n \"footer\",\n \"section\",\n \"article\",\n \"nav\",\n \"form\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"p\",\n \"button\",\n \"a[href]\",\n \"input\",\n \"select\",\n \"textarea\",\n \"img\",\n \"[role]\",\n \"[data-testid]\",\n].join(\",\");\n\nexport type EditorOperatorMessage = {\n role: \"user\" | \"assistant\";\n content: string;\n};\n\nexport type EditorOperatorSelectedElement = {\n selector: string;\n tag?: string;\n textPreview?: string;\n alternatives?: string[];\n};\n\nexport type EditorOperatorResult = {\n artifacts: EditorArtifacts;\n explanation: string;\n artifactCount: number;\n mergeStrategy: \"append\" | \"replace\";\n};\n\nfunction compactWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nexport function redactEditorContextUrl(value: string, baseUrl?: string): string {\n try {\n const url = new URL(value, baseUrl);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n url.username = \"\";\n url.password = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n }\n return `${url.protocol}[redacted]`;\n } catch {\n return value.split(/[?#]/, 1)[0].slice(0, 500);\n }\n}\n\nfunction safeAttributeEntries(element: Element): Array<[string, string]> {\n return Array.from(element.attributes)\n .filter(({ name }) => {\n const lower = name.toLowerCase();\n return (\n lower === \"id\" ||\n lower === \"class\" ||\n lower === \"href\" ||\n lower === \"src\" ||\n lower === \"alt\" ||\n lower === \"title\" ||\n lower === \"name\" ||\n lower === \"type\" ||\n lower === \"role\" ||\n lower.startsWith(\"aria-\") ||\n lower === \"data-testid\" ||\n lower === \"data-section-id\" ||\n lower === \"data-product-id\"\n );\n })\n .map(({ name, value }) => [\n name,\n name.toLowerCase() === \"href\" || name.toLowerCase() === \"src\"\n ? redactEditorContextUrl(value, element.ownerDocument.baseURI)\n : value.slice(0, 500),\n ]);\n}\n\nfunction serializeElement(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const attributes = safeAttributeEntries(element)\n .map(([name, value]) => `${name}=${JSON.stringify(value)}`)\n .join(\" \");\n const text =\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ? \"\"\n : compactWhitespace(element.textContent ?? \"\").slice(0, 600);\n return `<${tag}${attributes ? ` ${attributes}` : \"\"}>${text}</${tag}>`;\n}\n\nexport function collectEditorDomContext(\n documentLike: Document = document,\n): string {\n const lines = [\n `url=${redactEditorContextUrl(documentLike.location?.href ?? \"\")}`,\n `title=${compactWhitespace(documentLike.title ?? \"\")}`,\n ];\n const seen = new Set<Element>();\n for (const element of Array.from(\n documentLike.querySelectorAll(CONTEXT_SELECTORS),\n )) {\n if (seen.has(element) || element.id === \"apex-editor-host\") continue;\n seen.add(element);\n lines.push(serializeElement(element));\n if (lines.join(\"\\n\").length >= MAX_CONTEXT_CHARS) break;\n }\n return lines.join(\"\\n\").slice(0, MAX_CONTEXT_CHARS);\n}\n\nfunction parseMutation(value: unknown): Mutation | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const mutation = value as Mutation;\n return typeof mutation.selector === \"string\" &&\n typeof mutation.action === \"string\"\n ? mutation\n : null;\n}\n\nfunction appendCode(current: string, generated: string): string {\n if (!generated.trim()) return current;\n if (!current.trim()) return generated;\n return `${current.trimEnd()}\\n\\n${generated.trimStart()}`;\n}\n\nexport function mergeEditorOperatorArtifacts(input: {\n current: EditorArtifacts;\n generatedMutations: unknown;\n generatedCss: unknown;\n generatedJs: unknown;\n mergeStrategy: unknown;\n}): EditorArtifacts {\n const generated = Array.isArray(input.generatedMutations)\n ? input.generatedMutations.map(parseMutation).filter((value): value is Mutation => Boolean(value))\n : [];\n const customCss =\n typeof input.generatedCss === \"string\" ? input.generatedCss : \"\";\n const customJs =\n typeof input.generatedJs === \"string\" ? input.generatedJs : \"\";\n if (input.mergeStrategy === \"replace\") {\n return { mutations: generated, customCss, customJs };\n }\n return {\n mutations: generated.reduce(\n (artifacts, mutation) => upsertMutation(artifacts, mutation),\n input.current,\n ).mutations,\n customCss: appendCode(input.current.customCss, customCss),\n customJs: appendCode(input.current.customJs, customJs),\n };\n}\n\nfunction errorMessage(payload: unknown, status: number): string {\n if (payload && typeof payload === \"object\") {\n const error = (payload as { error?: unknown }).error;\n if (typeof error === \"string\" && error.trim()) return error.trim();\n }\n return `Operator request failed (${status})`;\n}\n\nexport async function runEditorOperatorTurn(input: {\n apiOrigin: string;\n session: ActiveEditorSession;\n variationId: string;\n prompt: string;\n artifacts: EditorArtifacts;\n conversation: EditorOperatorMessage[];\n pageContext?: string;\n signal?: AbortSignal;\n selectedElement?: EditorOperatorSelectedElement | null;\n documentLike?: Document;\n fetchImpl?: typeof fetch;\n}): Promise<EditorOperatorResult> {\n const fetchImpl = input.fetchImpl ?? fetch;\n const response = await fetchImpl(\n new URL(\n `/api/editor-sessions/${encodeURIComponent(input.session.sid)}/operator`,\n input.apiOrigin,\n ),\n {\n method: \"POST\",\n credentials: \"omit\",\n cache: \"no-store\",\n referrerPolicy: \"no-referrer\",\n signal: input.signal,\n headers: {\n Authorization: `Bearer ${input.session.bearer}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n prompt: input.prompt,\n variationId: input.variationId,\n domContext: collectEditorDomContext(input.documentLike),\n pageContext:\n input.pageContext ??\n `Live merchant page: ${redactEditorContextUrl(input.session.targetUrl)}`,\n existingMutations: input.artifacts.mutations,\n existingCustomCss: input.artifacts.customCss,\n existingCustomJs: input.artifacts.customJs,\n conversation: input.conversation.slice(-MAX_CONVERSATION_MESSAGES),\n selectedElement: input.selectedElement ?? undefined,\n }),\n },\n );\n const payload = (await response.json().catch(() => null)) as\n | Record<string, unknown>\n | null;\n if (!response.ok || !payload) {\n throw new Error(errorMessage(payload, response.status));\n }\n const mergeStrategy =\n payload.mergeStrategy === \"replace\" ? \"replace\" : \"append\";\n const artifacts = mergeEditorOperatorArtifacts({\n current: input.artifacts,\n generatedMutations: payload.mutations,\n generatedCss: payload.customCss,\n generatedJs: payload.customJs,\n mergeStrategy,\n });\n const artifactCount =\n (Array.isArray(payload.mutations) ? payload.mutations.length : 0) +\n (typeof payload.customCss === \"string\" && payload.customCss.trim() ? 1 : 0) +\n (typeof payload.customJs === \"string\" && payload.customJs.trim() ? 1 : 0);\n return {\n artifacts,\n explanation:\n typeof payload.explanation === \"string\" && payload.explanation.trim()\n ? payload.explanation.trim()\n : artifactCount\n ? \"Draft treatment created. Review the result before QA.\"\n : \"No draft changes were produced.\",\n artifactCount,\n mergeStrategy,\n };\n}\n", "// Shared visual kit for the on-site editor chrome. Values are the canonical\n// Apex Design System dark tokens (docs/design-system/tokens) redeclared on\n// :host because the shadow root resets inheritance with all:initial.\n\nexport const ICONS = {\n pointer: \"M4 3l7.6 18 2.3-7.4L21 11.5zM13.9 13.9L19 19\",\n undo: \"M9 14L4 9l5-5M4 9h10.5a5.5 5.5 0 015.5 5.5v0a5.5 5.5 0 01-5.5 5.5H11\",\n redo: \"M15 14l5-5-5-5M20 9H9.5A5.5 5.5 0 004 14.5v0A5.5 5.5 0 009.5 20H13\",\n monitor: \"M3 4h18a1 1 0 011 1v11a1 1 0 01-1 1H3a1 1 0 01-1-1V5a1 1 0 011-1zM8 21h8M12 17v4\",\n tablet: \"M6 2h12a2 2 0 012 2v16a2 2 0 01-2 2H6a2 2 0 01-2-2V4a2 2 0 012-2zM12 18h.01\",\n phone: \"M8 2h8a2 2 0 012 2v16a2 2 0 01-2 2H8a2 2 0 01-2-2V4a2 2 0 012-2zM11 18h2\",\n wifiOff: \"M2 2l20 20M8.5 16.5a5 5 0 015.6-1M5 12.5a10 10 0 015.2-2.7M2 8.8a15 15 0 014.2-2.5M16.6 6.6A15 15 0 0122 8.8M12 20h.01\",\n braces: \"M8 3H7a2 2 0 00-2 2v4a2 2 0 01-2 2 2 2 0 012 2v4a2 2 0 002 2h1M16 3h1a2 2 0 012 2v4a2 2 0 002 2 2 2 0 00-2 2v4a2 2 0 01-2 2h-1\",\n collapse: \"M9 3v18M3 5a2 2 0 012-2h14a2 2 0 012 2v14a2 2 0 01-2 2H5a2 2 0 01-2-2zM13 10l3 2-3 2\",\n history: \"M3 12a9 9 0 113 6.7M3 12H1.5M3 12l-1.8 2M12 7v5l3.5 2\",\n send: \"M22 2L11 13M22 2l-7 20-4-9-9-4z\",\n stop: \"M6 6h12v12H6z\",\n cursorBox: \"M3 3h8M3 3v8M21 13v8h-8M9 9l7 7M16 9v7h-7\",\n check: \"M5 13l4 4L19 7\",\n x: \"M18 6L6 18M6 6l12 12\",\n chevD: \"M6 9l6 6 6-6\",\n chevR: \"M9 6l6 6-6 6\",\n refresh: \"M3 12a9 9 0 0114.5-7L21 8M21 3v5h-5M21 12a9 9 0 01-14.5 7L3 16M3 21v-5h5\",\n external: \"M15 3h6v6M21 3l-9 9M10 5H5a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2v-5\",\n code: \"M16 18l6-6-6-6M8 6l-6 6 6 6\",\n clock: \"M12 22a10 10 0 100-20 10 10 0 000 20zM12 7v5l3 2\",\n eye: \"M2 12s4-7 10-7 10 7 10 7-4 7-10 7-10-7-10-7zM12 15a3 3 0 100-6 3 3 0 000 6z\",\n alert: \"M10.3 3.9L1.8 18a2 2 0 001.7 3h17a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0zM12 9v4M12 17h.01\",\n globe: \"M12 2a10 10 0 100 20 10 10 0 000-20zM2 12h20M12 2a15 15 0 010 20M12 2a15 15 0 000 20\",\n play: \"M6 4l14 8-14 8z\",\n dot: \"M12 12h.01\",\n} as const;\n\nexport type IconName = keyof typeof ICONS;\n\nexport function icon(name: IconName, size = 14, extra = \"\"): string {\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" ${extra}><path d=\"${ICONS[name]}\"/></svg>`;\n}\n\nlet operatorMarkId = 0;\n\n// The Apex Operator \"O.\" monogram \u2014 stencil-cut O with a purple accent chip.\nexport function operatorMark(size = 16, color = \"#fff\"): string {\n const id = `apex-op-mark-${++operatorMarkId}`;\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 120 120\" fill=\"none\" aria-hidden=\"true\" style=\"flex-shrink:0\">\n <defs><mask id=\"${id}\"><rect width=\"120\" height=\"120\" fill=\"#fff\"/><rect x=\"0\" y=\"68\" width=\"120\" height=\"6\" fill=\"#000\"/></mask></defs>\n <path d=\"M60 14 C92 14 106 36 106 60 C106 84 92 106 60 106 C28 106 14 84 14 60 C14 36 28 14 60 14 Z M60 38 C46 38 38 48 38 60 C38 72 46 82 60 82 C74 82 82 72 82 60 C82 48 74 38 60 38 Z\" fill=\"${color}\" fill-rule=\"evenodd\" mask=\"url(#${id})\"/>\n <rect x=\"92\" y=\"92\" width=\"14\" height=\"14\" rx=\"2\" fill=\"#5B29FF\"/>\n </svg>`;\n}\n\nexport function esc(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nexport const KIT_CSS = `\n:host {\n --bg0:#08080A;--bg1:#0A0A0C;--raised:#141419;--raised-hi:#1A1A21;--inset:#0B0B0E;\n --border:rgba(255,255,255,0.06);--border-hi:rgba(255,255,255,0.10);--border-px:rgba(255,255,255,0.14);\n --text1:#FAFAFA;--text2:rgba(255,255,255,0.66);--text3:rgba(255,255,255,0.42);--text4:rgba(255,255,255,0.26);\n --purple500:#5B29FF;--purple400:#7C54FF;--purple300:#9B6FFF;--purple200:#C8B4FF;\n --purple-soft:rgba(91,41,255,0.14);--purple-bd:rgba(124,84,255,0.34);\n --positive:#3DD68C;--warning:#FACC15;--negative:#EB5252;--negative-soft:#F39797;\n all:initial;font-family:Inter,system-ui,sans-serif;color:var(--text1);letter-spacing:0;\n position:fixed;inset:0;z-index:2147483647;pointer-events:none;font-size:12.5px;line-height:1.5;\n}\n*{box-sizing:border-box;letter-spacing:0;margin:0;padding:0}\nbutton,input,select,textarea{font:inherit;color:inherit;font-family:inherit}\nbutton{cursor:pointer;background:none;border:none}\nbutton:disabled{cursor:not-allowed}\n:is(button,textarea,input,a):focus-visible{outline:2px solid var(--purple400);outline-offset:2px}\n@keyframes ee-spin{to{transform:rotate(360deg)}}\n@keyframes ee-pulse{0%{transform:scale(0.7);opacity:0.9}100%{transform:scale(1.6);opacity:0}}\n@keyframes ee-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}\n.ee-in{animation:ee-in 160ms ease-out}\n.spin{animation:ee-spin 1s linear infinite}\n@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:0.01ms!important;animation-iteration-count:1!important;transition-duration:0.01ms!important}}\n\n/* Buttons */\n.btn{display:inline-flex;align-items:center;gap:7px;justify-content:center;padding:7px 12px;font-size:13px;font-weight:550;border-radius:8px;border:1px solid transparent;line-height:1.2;white-space:nowrap;transition:background 120ms,border-color 120ms,color 120ms;pointer-events:auto}\n.btn.sm{padding:5px 10px;font-size:12px}\n.btn:disabled{opacity:0.45}\n.btn.primary{background:var(--purple500);color:#fff;border-color:rgba(255,255,255,0.14)}\n.btn.soft{background:var(--purple-soft);color:var(--purple200);border-color:var(--purple-bd)}\n.btn.ghost{background:transparent;color:var(--text2);border-color:var(--border)}\n.btn.ghost:hover{background:var(--raised-hi);color:var(--text1)}\n.btn.bare{background:transparent;color:var(--text2);border-color:transparent}\n.btn.danger{background:rgba(235,82,82,0.14);color:var(--negative-soft);border-color:rgba(235,82,82,0.3)}\n.iconbtn{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid transparent;background:transparent;color:var(--text2);flex-shrink:0;transition:background 120ms,color 120ms;pointer-events:auto}\n.iconbtn:hover{background:var(--raised-hi);color:var(--text1)}\n.iconbtn.active{background:var(--purple-soft);color:var(--purple200);border-color:var(--purple-bd)}\n.iconbtn:disabled{opacity:0.4}\n.iconbtn.xs{width:22px;height:22px}\n\n/* Status dot */\n.dot{position:relative;width:7px;height:7px;flex-shrink:0;display:inline-block}\n.dot i{position:absolute;inset:0;border-radius:50%}\n.dot.ok i{background:var(--positive)}.dot.warn i{background:var(--warning)}.dot.err i{background:var(--negative)}.dot.purple i{background:var(--purple300)}\n.dot b{position:absolute;inset:-3px;border-radius:50%;border:1px solid currentColor}\n.dot.ok b{color:var(--positive)}.dot.warn b{color:var(--warning)}.dot.err b{color:var(--negative)}.dot.purple b{color:var(--purple300)}\n.dot b{animation:ee-pulse 1.4s ease-out infinite}\n\n/* Save chip */\n.save-chip{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:550;padding:4px 9px;border-radius:7px;background:rgba(255,255,255,0.04);border:1px solid var(--border);white-space:nowrap}\n.save-chip.unsaved{color:var(--warning)}\n.save-chip.saving{color:var(--purple200)}\n.save-chip.saved{color:var(--positive)}\n.save-chip.failed,.save-chip.conflict{color:var(--negative-soft);background:rgba(235,82,82,0.10);border-color:rgba(235,82,82,0.25)}\n.save-chip .retry{border:none;background:rgba(255,255,255,0.1);color:#fff;font-size:11.5px;font-weight:600;border-radius:5px;padding:2px 7px;margin-left:2px;pointer-events:auto}\n\n/* Segmented control */\n.seg{display:inline-flex;background:var(--inset);border-radius:8px;padding:2px;gap:2px;border:1px solid var(--border);pointer-events:auto}\n.seg button{display:inline-flex;align-items:center;gap:6px;justify-content:center;padding:5px 11px;border-radius:6px;border:none;background:transparent;color:var(--text3);font-size:12px;font-weight:550;transition:background 120ms,color 120ms}\n.seg button.sm{padding:4px 8px}\n.seg button[aria-checked=\"true\"]{background:var(--raised-hi);color:var(--text1);box-shadow:inset 0 0 0 1px var(--border-px)}\n\n/* Pills & chips */\n.draft-pill{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border-radius:999px;background:rgba(250,204,21,0.10);border:1px solid rgba(250,204,21,0.3);font-size:11px;font-weight:600;color:var(--warning);white-space:nowrap}\n.session-chip{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:550;color:var(--warning);padding:4px 9px;border-radius:7px;border:1px solid rgba(250,204,21,0.35);background:rgba(250,204,21,0.08);white-space:nowrap;font-variant-numeric:tabular-nums}\n.session-chip .extend{border:none;background:rgba(250,204,21,0.16);color:var(--warning);font-size:11.5px;font-weight:600;border-radius:5px;padding:2px 7px;pointer-events:auto}\n.session-note{font-size:11px;color:var(--text4);white-space:nowrap}\n.conn-chip{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:550;white-space:nowrap;color:var(--text3)}\n.conn-chip.offline{color:var(--negative-soft)}\n.conn-chip.connecting{color:var(--warning)}\n.ctx-chip{display:inline-flex;align-items:center;gap:7px;max-width:100%;background:var(--purple-soft);border:1px solid var(--purple-bd);border-radius:8px;padding:5px 8px;font-size:11.5px;color:var(--purple200);font-weight:550}\n.ctx-chip .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ctx-chip .replace{border:none;background:rgba(255,255,255,0.08);color:var(--text2);font-size:10.5px;font-weight:600;border-radius:5px;padding:2px 7px;pointer-events:auto}\n.ctx-chip .clear{border:none;background:none;color:var(--text3);padding:2px;display:inline-flex;pointer-events:auto}\n\n/* Fields */\n.field{width:100%;background:var(--inset);color:var(--text1);border:1px solid var(--border-hi);border-radius:8px;padding:8px 10px;font-size:12.5px;line-height:1.5;outline:none;resize:vertical;pointer-events:auto}\n.field::placeholder{color:rgba(255,255,255,0.28)}\n.field.code{white-space:pre;font-variant-numeric:tabular-nums;min-height:150px}\n.flabel{display:block;font-size:11.5px;font-weight:550;color:var(--text3);margin-bottom:5px}\n.fhint{display:block;font-size:11px;color:var(--text4);margin-top:4px}\n\n/* Banners */\n.banner{display:flex;align-items:center;gap:9px;padding:8px 12px;border-radius:10px;color:var(--text1);font-size:12.5px;box-shadow:0 12px 32px rgba(0,0,0,0.4);pointer-events:auto;max-width:560px}\n.banner .body{flex:1;min-width:0}\n.banner.info{background:linear-gradient(0deg,rgba(91,41,255,0.16),rgba(91,41,255,0.16)),var(--bg1);border:1px solid var(--purple-bd)}\n.banner.info svg{color:var(--purple200)}\n.banner.warn{background:linear-gradient(0deg,rgba(250,204,21,0.10),rgba(250,204,21,0.10)),var(--bg1);border:1px solid rgba(250,204,21,0.35)}\n.banner.warn svg{color:var(--warning)}\n.banner.error{background:linear-gradient(0deg,rgba(235,82,82,0.12),rgba(235,82,82,0.12)),var(--bg1);border:1px solid rgba(235,82,82,0.35)}\n.banner.error svg{color:var(--negative-soft)}\n\n/* Modal */\n.modal-backdrop{position:fixed;inset:0;z-index:300;display:flex;align-items:center;justify-content:center;background:rgba(5,5,8,0.55);backdrop-filter:blur(3px);pointer-events:auto}\n.modal{width:430px;max-width:calc(100vw - 40px);background:var(--bg1);border:1px solid var(--border-px);border-radius:14px;box-shadow:0 32px 80px rgba(0,0,0,0.55);overflow:hidden;color:var(--text1)}\n.modal .m-head{display:flex;gap:10px;align-items:flex-start;padding:18px 18px 0}\n.modal .m-icon{width:30px;height:30px;border-radius:8px;background:rgba(255,255,255,0.05);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.modal .m-icon.warn{color:var(--warning)}.modal .m-icon.purple{color:var(--purple300)}.modal .m-icon.ok{color:var(--positive)}\n.modal .m-title{font-size:15px;font-weight:600;letter-spacing:-0.015em;padding-top:4px}\n.modal .m-body{padding:12px 18px 4px;font-size:13px;line-height:1.6;color:var(--text2)}\n.modal .m-body p{margin:0}\n.modal .m-body p+p{margin-top:10px}\n.modal .m-actions{display:flex;justify-content:flex-end;gap:8px;padding:14px 18px 18px}\n`;\n", "import { EDITOR_DEVICE_FRAME_NAME } from \"../editor-bootstrap\";\nimport type { Mutation } from \"../types\";\nimport { DevicePreview, type DevicePreviewSize } from \"./device-preview\";\nimport { ElementPicker } from \"./picker\";\nimport { elementLabel } from \"./selector\";\nimport type { EditorController } from \"./controller\";\nimport {\n redactEditorContextUrl,\n runEditorOperatorTurn,\n type EditorOperatorMessage,\n} from \"./operator\";\nimport { cloneArtifacts, type EditorArtifacts, type EditorState } from \"./types\";\nimport { KIT_CSS, esc, icon, operatorMark } from \"./view-kit\";\n\nconst DOCK_WIDTH = 352;\nconst RAIL_WIDTH = 52;\nconst SESSION_WARN_SECONDS = 300;\n\nconst VIEW_CSS = `\n.zone{position:fixed;left:0;top:0;bottom:0;right:${DOCK_WIDTH}px;pointer-events:none}\n.zone.rail{right:${RAIL_WIDTH}px}\n.zone.narrow{right:0}\n.page-border{position:absolute;inset:0;pointer-events:none;box-shadow:inset 0 0 0 3px rgba(91,41,255,0.75)}\n.select-banner{position:absolute;top:12px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:9px;padding:7px 12px;background:var(--purple500);color:#fff;border-radius:999px;border:1px solid rgba(255,255,255,0.25);box-shadow:0 12px 32px rgba(91,41,255,0.45);font-size:12.5px;font-weight:600;white-space:nowrap;pointer-events:auto}\n.select-banner button{border:none;background:rgba(255,255,255,0.16);color:#fff;font-size:11.5px;font-weight:600;border-radius:999px;padding:3px 9px}\n.banners{position:absolute;left:50%;transform:translateX(-50%);display:grid;gap:8px;width:max-content;max-width:calc(100% - 24px);pointer-events:none}\n.banners.lower{top:54px}\n.banners:not(.lower){top:12px}\n.orig-chip{position:absolute;bottom:14px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:8px;padding:6px 12px;border-radius:999px;background:rgba(10,10,13,0.92);border:1px solid var(--border-px);color:var(--text2);font-size:12px;font-weight:550;white-space:nowrap;pointer-events:auto}\n.orig-chip svg{color:var(--purple300)}\n.orig-chip button{border:none;background:var(--purple-soft);color:var(--purple200);font-size:11.5px;font-weight:600;border-radius:999px;padding:3px 9px}\n\n.dock{position:fixed;right:0;top:0;bottom:0;width:${DOCK_WIDTH}px;background:var(--bg1);border-left:1px solid var(--border-px);display:flex;flex-direction:column;min-height:0;pointer-events:auto}\n.rail-dock{position:fixed;right:0;top:0;bottom:0;width:${RAIL_WIDTH}px;background:var(--bg1);border-left:1px solid var(--border-px);display:flex;flex-direction:column;align-items:center;gap:10px;padding:12px 0;pointer-events:auto}\n.rail-dock .sep{width:24px;height:1px;background:var(--border)}\n.rail-dock .grow{flex:1}\n\n.id-head{padding:12px 14px 10px;border-bottom:1px solid var(--border);flex-shrink:0}\n.id-row{display:flex;align-items:center;gap:9px}\n.id-meta{flex:1;min-width:0}\n.id-title{font-size:13px;font-weight:600;letter-spacing:-0.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.id-sub{font-size:11px;color:var(--text3);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.id-chips{display:flex;align-items:center;gap:8px;margin-top:10px;flex-wrap:wrap}\n.id-chips .grow{flex:1}\n.id-conn{margin-top:8px}\n\n.var-wrap{position:relative}\n.var-btn{display:flex;align-items:center;gap:8px;padding:5px 9px;background:var(--raised);border:1px solid var(--border-hi);border-radius:8px;color:var(--text1);font-size:12.5px;font-weight:550;max-width:190px;pointer-events:auto}\n.var-btn .vid{width:18px;height:18px;border-radius:5px;background:var(--purple-soft);border:1px solid var(--purple-bd);color:var(--purple200);font-size:10.5px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}\n.var-btn .vname{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.var-menu{position:absolute;top:calc(100% + 6px);left:0;z-index:250;width:248px;background:var(--bg1);border:1px solid var(--border-px);border-radius:10px;box-shadow:0 20px 48px rgba(0,0,0,0.55);padding:5px;pointer-events:auto}\n.var-menu .note{font-size:11px;color:var(--text3);padding:6px 9px 4px}\n.var-item{display:flex;align-items:center;gap:9px;width:100%;text-align:left;padding:8px 9px;border-radius:7px;border:none;background:transparent;color:var(--text1)}\n.var-item[aria-selected=\"true\"]{background:var(--purple-soft)}\n.var-item .vid{width:20px;height:20px;border-radius:5px;flex-shrink:0;background:var(--raised-hi);color:#fff;font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}\n.var-item[aria-selected=\"true\"] .vid{background:var(--purple500)}\n.var-item .meta{flex:1;min-width:0}\n.var-item .n{display:block;font-size:12.5px;font-weight:550;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.var-item .s{display:block;font-size:11px;color:var(--text3)}\n\n.view-row{display:flex;align-items:center;gap:8px;padding:8px 14px;border-bottom:1px solid var(--border);flex-shrink:0}\n.view-row .grow{flex:1}\n.undo-redo{display:flex;gap:2px}\n\n.tabs{display:flex;gap:2px;padding:0 8px;border-bottom:1px solid var(--border);flex-shrink:0}\n.tab{display:inline-flex;align-items:center;gap:6px;padding:9px 10px 8px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text3);font-size:12.5px;font-weight:550;margin-bottom:-1px;transition:color 120ms;pointer-events:auto}\n.tab[aria-selected=\"true\"]{color:var(--text1);border-bottom-color:var(--purple400)}\n.tab .count{font-size:10.5px;font-weight:650;background:var(--raised-hi);color:var(--text3);border-radius:999px;padding:1px 6px}\n.tab[aria-selected=\"true\"] .count{background:var(--purple-soft);color:var(--purple200)}\n\n.panel{flex:1;min-height:0;display:flex;flex-direction:column}\n.foot{display:flex;align-items:center;gap:10px;padding:10px 14px;border-top:1px solid var(--border);flex-shrink:0}\n.foot .grow{flex:1}\n\n/* Operator */\n.op-ctx{padding:10px 14px 8px;border-bottom:1px solid var(--border);flex-shrink:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.op-ctx .lbl{font-size:11.5px;color:var(--text3)}\n.op-ctx .opt{font-size:11.5px;color:var(--text4)}\n.op-thread{flex:1;overflow-y:auto;min-height:0;padding:12px 14px;display:flex;flex-direction:column;gap:10px}\n.op-empty{margin:auto 0;text-align:center;padding:18px 6px}\n.op-empty .mark{width:42px;height:42px;margin:0 auto 12px;border-radius:12px;background:var(--purple-soft);border:1px solid var(--purple-bd);display:flex;align-items:center;justify-content:center}\n.op-empty .t{font-size:13.5px;font-weight:600;color:var(--text1);margin-bottom:5px}\n.op-empty p{font-size:12.5px;color:var(--text3);line-height:1.6;margin:0 0 14px}\n.op-empty .sugs{display:flex;flex-direction:column;gap:6px;align-items:stretch}\n.sug{font-size:12px;color:var(--text2);background:var(--raised);border:1px solid var(--border);border-radius:8px;padding:7px 11px;text-align:left;pointer-events:auto}\n.msg-user{align-self:flex-end;max-width:88%;display:grid;gap:4px;justify-items:end}\n.msg-user .ref{display:inline-flex;align-items:center;gap:5px;font-size:10.5px;color:var(--purple200);background:var(--purple-soft);border:1px solid var(--purple-bd);border-radius:6px;padding:2px 7px}\n.msg-user .bubble{background:var(--purple500);color:#fff;border-radius:12px 12px 3px 12px;padding:8px 11px;font-size:12.5px;line-height:1.5;white-space:pre-wrap;word-break:break-word}\n.op-card{align-self:stretch;border-radius:12px;padding:10px 12px}\n.op-card.working{background:var(--inset);border:1px solid var(--border)}\n.op-card.failed{background:rgba(235,82,82,0.08);border:1px solid rgba(235,82,82,0.3)}\n.op-card.done{background:rgba(61,214,140,0.06);border:1px solid rgba(61,214,140,0.28)}\n.op-card .head{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:600;margin-bottom:7px}\n.op-card.working .head{color:var(--text1);margin-bottom:8px}\n.op-card.failed .head{color:var(--negative-soft);margin-bottom:5px}\n.op-card.done .head{color:var(--positive)}\n.op-card .steps{display:grid;gap:7px}\n.op-card .step{display:flex;align-items:center;gap:9px;font-size:12px}\n.op-card .step.done{color:var(--text3)}\n.op-card .step.cur{color:var(--text1)}\n.op-card .step.todo{color:var(--text4)}\n.op-card .step .idle{width:12px;text-align:center;color:var(--text4)}\n.op-card p{font-size:12px;color:var(--text2);line-height:1.55;margin:0}\n.op-card .items{display:grid;gap:6px}\n.op-card .item{font-size:12px;color:var(--text2);display:flex;gap:8px;align-items:baseline}\n.op-card .item .b{flex:1;line-height:1.45}\n.op-card .item .sel{display:block;font-size:10.5px;color:var(--text4);word-break:break-all}\n.op-card .row{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}\n.op-card .hint{font-size:10.5px;color:var(--text4);margin-top:8px}\n.op-input{padding:10px 14px 12px;border-top:1px solid var(--border);flex-shrink:0}\n.op-input .line{display:flex;gap:8px;align-items:flex-end}\n.op-input textarea{flex:1;min-height:52px;max-height:120px}\n.op-input .send{width:34px;height:34px;flex:0 0 34px;border-radius:8px;background:var(--purple500);color:#fff;display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,0.14);pointer-events:auto}\n.op-input .send:disabled{opacity:0.4}\n.op-input .note{font-size:10.5px;color:var(--text4);margin-top:6px}\n\n/* Code */\n.code-panel{display:flex;flex-direction:column;min-height:0;overflow-y:auto;flex:1}\n.code-head{padding:10px 14px 0;display:flex;align-items:center;gap:8px}\n.code-head .peer{font-size:11px;color:var(--text4)}\n.code-body{padding:12px 14px;display:grid;gap:10px}\n.code-ok{font-size:11.5px;color:var(--text3);display:flex;gap:7px;align-items:center}\n.code-ok svg{color:var(--positive)}\n.js-warn{display:flex;gap:9px;padding:9px 11px;border-radius:9px;background:rgba(250,204,21,0.08);border:1px solid rgba(250,204,21,0.3);font-size:11.5px;line-height:1.55;color:var(--text2)}\n.js-warn svg{color:var(--warning);flex-shrink:0;margin-top:1px}\n.js-warn strong{color:var(--warning);font-weight:600}\n.code-foot{border-top:1px solid var(--border);padding:10px 14px 12px;font-size:11.5px;color:var(--text3);line-height:1.6}\n.code-foot button{border:none;background:none;color:var(--purple200);font-size:11.5px;padding:0;text-decoration:underline;text-underline-offset:2px;pointer-events:auto}\n\n/* Changes */\n.chg-panel{overflow-y:auto;flex:1;min-height:0}\n.chg-head{padding:12px 14px 8px;display:flex;align-items:center;gap:8px}\n.chg-head .t{font-size:13px;font-weight:600;color:var(--text1);flex:1}\n.chg-empty{font-size:12.5px;color:var(--text3);padding:4px 14px 14px;line-height:1.6}\n.chg-list{display:grid;gap:6px;padding:2px 14px 12px}\n.chg-row{display:flex;gap:9px;align-items:flex-start;padding:9px 10px;background:var(--inset);border:1px solid var(--border);border-radius:9px}\n.chg-row .org{margin-top:1px;flex-shrink:0;color:var(--purple300)}\n.chg-row .meta{flex:1;min-width:0}\n.chg-row .l{font-size:12.5px;color:var(--text1);font-weight:550;line-height:1.4;word-break:break-word}\n.chg-row .s{font-size:11px;color:var(--text4);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.chg-art{border-top:1px solid var(--border);padding:10px 14px 12px}\n.chg-art .toggle{display:inline-flex;align-items:center;gap:7px;border:none;background:none;color:var(--text2);font-size:12px;font-weight:550;padding:0;pointer-events:auto}\n.chg-art .json{margin-top:8px;background:var(--inset);border:1px solid var(--border);border-radius:9px;padding:10px 12px;font-size:11px;line-height:1.65;color:var(--text2);white-space:pre-wrap;word-break:break-word;font-variant-numeric:tabular-nums;max-height:280px;overflow:auto}\n.chg-art .note{font-size:11.5px;color:var(--text3);line-height:1.55;margin-top:10px}\n.chg-art .pill-row{margin-top:8px}\n\n/* Boot overlay */\n.boot{position:fixed;inset:0;z-index:400;background:#08080A;display:flex;align-items:center;justify-content:center;pointer-events:auto}\n.boot[hidden]{display:none}\n.boot .box{width:330px;max-width:calc(100vw - 48px)}\n.boot .kicker{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:15px;font-weight:650;letter-spacing:-0.02em}\n.boot .sub{font-size:12.5px;color:var(--text3);margin-bottom:22px}\n.boot .steps{display:grid;gap:12px}\n.boot .step{display:flex;align-items:center;gap:10px;font-size:13px}\n.boot .step.done{color:var(--text3)}\n.boot .step.cur{color:#fff}\n.boot .step.todo{color:var(--text4)}\n.boot .step .idle{width:14px;text-align:center}\n.boot .bar{margin-top:26px;height:3px;border-radius:999px;background:var(--raised-hi);overflow:hidden}\n.boot .bar i{display:block;height:100%;background:var(--purple500);border-radius:999px;transition:width 400ms ease}\n.boot .scope{margin-top:22px;font-size:11.5px;color:var(--text4);line-height:1.6}\n.boot .err{margin-top:18px;font-size:12.5px;color:var(--negative-soft);line-height:1.55}\n\n/* Picker overlay */\n.picker-box{position:fixed;left:0;top:0;border:2px solid var(--purple400);background:rgba(91,41,255,0.08);pointer-events:none;z-index:200}\n.picker-box[data-state=\"hover\"]{border-style:dashed}\n.picker-box[data-state=\"selected\"]{border-style:solid;border-color:var(--purple500)}\n.picker-label{position:fixed;left:0;top:0;padding:3px 8px;border-radius:6px;background:var(--purple500);color:#fff;font-size:11px;font-weight:600;white-space:nowrap;pointer-events:none;z-index:201}\n\n/* Device preview */\n.device{position:fixed;left:0;top:0;bottom:0;right:${DOCK_WIDTH}px;background:var(--bg0);display:flex;align-items:center;justify-content:center;padding:24px;pointer-events:auto;z-index:90}\n.device.narrow{right:0}\n.device[hidden]{display:none}\n.device-shell{display:flex;flex-direction:column;gap:12px;align-items:center;max-width:100%;max-height:100%}\n.device-head{width:min(420px,100%);display:flex;align-items:center;justify-content:space-between;color:var(--text2);font-size:12px}\n.device-frame{border:1px solid var(--border-hi);border-radius:10px;background:#fff;box-shadow:0 24px 64px rgba(0,0,0,0.5);max-width:calc(100% - 8px);max-height:calc(100vh - 140px)}\n.device-fallback{width:390px;max-width:calc(100vw - 48px);padding:16px;background:var(--raised);border:1px solid var(--border-hi);border-radius:10px;color:var(--text2);font-size:12px;line-height:1.6}\n.device-fallback .row{display:flex;gap:8px;margin-top:10px}\n\n/* Narrow viewport: bottom sheet */\n.sheet{position:fixed;left:0;right:0;bottom:0;background:var(--bg1);border-top:1px solid var(--border-px);border-radius:16px 16px 0 0;box-shadow:0 -16px 48px rgba(0,0,0,0.5);display:flex;flex-direction:column;pointer-events:auto;max-height:64vh}\n.sheet .handle{background:none;border:none;padding:8px 0 4px;display:flex;justify-content:center;width:100%;pointer-events:auto}\n.sheet .handle i{width:36px;height:4px;border-radius:999px;background:var(--border-px);display:block}\n.sheet .bar{display:flex;align-items:center;gap:8px;padding:2px 14px 10px;flex-wrap:wrap}\n.sheet .bar .grow{flex:1}\n.sheet .row2{display:flex;align-items:center;gap:8px;padding:0 14px 8px;flex-wrap:wrap}\n`;\n\ntype PanelTab = \"operator\" | \"code\" | \"changes\";\n\ntype ThreadUserMessage = {\n id: number;\n role: \"user\";\n text: string;\n ctxLabel: string | null;\n};\n\ntype ThreadOperatorMessage = {\n id: number;\n role: \"op\";\n phase: \"working\" | \"done\" | \"failed\" | \"save-failed\";\n step: number;\n steps: string[];\n prompt: string;\n ctxSelector: string | null;\n ctxLabel: string | null;\n preArtifacts: EditorArtifacts;\n postArtifacts: EditorArtifacts | null;\n results: Array<{ label: string; target: string }>;\n error: string | null;\n undone: boolean;\n abort: AbortController | null;\n};\n\ntype ThreadMessage = ThreadUserMessage | ThreadOperatorMessage;\n\ntype ChangeEntry = {\n kind: \"mutation\" | \"css\" | \"js\";\n selector: string | null;\n mutationIndex: number | null;\n label: string;\n target: string;\n origin: \"operator\" | \"code\";\n risky: boolean;\n};\n\ntype SaveChipStatus = \"unsaved\" | \"saving\" | \"saved\" | \"failed\" | \"conflict\" | \"loading\";\n\nconst OPERATOR_SUGGESTIONS = [\n \"Make the announcement bar mention free returns\",\n \"Add a trust message below the buy button\",\n \"Make this section more compact\",\n];\n\nfunction mutationLabel(mutation: Mutation): string {\n const target = elementNameFromSelector(mutation.selector);\n switch (mutation.action) {\n case \"text\":\n case \"setText\":\n return `${target}: \u201C${(mutation.text ?? \"\").trim().slice(0, 80)}\u201D`;\n case \"html\":\n return `${target}: content replaced`;\n case \"attribute\": {\n const names = [\n ...(mutation.attribute ? [mutation.attribute.name] : []),\n ...Object.keys(mutation.attributes ?? {}),\n ];\n if (names.includes(\"src\")) return `${target}: image swapped`;\n return `${target}: ${names.join(\", \") || \"attribute\"} changed`;\n }\n case \"style\":\n case \"setStyle\":\n return `${target}: style changed`;\n case \"remove\":\n return `${target}: removed`;\n case \"insertBefore\":\n case \"insertAfter\":\n return `${target}: content added`;\n default:\n return `${target}: updated`;\n }\n}\n\nfunction elementNameFromSelector(selector: string): string {\n const last = selector.split(/[\\s>+~]+/).filter(Boolean).pop() ?? selector;\n return last.slice(0, 60) || \"Element\";\n}\n\nfunction saveChipStatus(state: EditorState): SaveChipStatus {\n if (state.saveState === \"saving\") return \"saving\";\n if (state.saveState === \"saved\") return \"saved\";\n if (state.saveState === \"conflict\") return \"conflict\";\n if (state.saveState === \"error\") return \"failed\";\n if (!state.variation) return \"loading\";\n return \"unsaved\";\n}\n\nfunction saveChipHtml(state: EditorState): string {\n const status = saveChipStatus(state);\n const label =\n status === \"unsaved\" ? \"Unsaved changes\"\n : status === \"saving\" ? \"Saving\u2026\"\n : status === \"saved\" ? \"Saved\"\n : status === \"failed\" ? \"Save failed\"\n : status === \"conflict\" ? \"Conflict\"\n : \"Loading draft\u2026\";\n const iconHtml =\n status === \"saving\" || status === \"loading\" ? icon(\"refresh\", 12, 'class=\"spin\"')\n : status === \"saved\" ? icon(\"check\", 12)\n : status === \"unsaved\" ? icon(\"dot\", 12)\n : icon(\"alert\", 12);\n const retry = status === \"failed\"\n ? `<button type=\"button\" class=\"retry\" data-action=\"retry-save\">Retry</button>`\n : \"\";\n const chipClass = status === \"loading\" ? \"saving\" : status;\n return `<span class=\"save-chip ${chipClass}\" role=\"status\" aria-live=\"polite\">${iconHtml}${label}${retry}</span>`;\n}\n\nfunction changeListFromState(state: EditorState): ChangeEntry[] {\n const items: ChangeEntry[] = state.artifacts.mutations.map((mutation, mutationIndex) => ({\n kind: \"mutation\" as const,\n selector: mutation.selector,\n mutationIndex,\n label: mutationLabel(mutation),\n target: mutation.selector,\n origin: \"operator\" as const,\n risky: false,\n }));\n if (state.artifacts.customCss.trim()) {\n items.push({\n kind: \"css\",\n selector: null,\n mutationIndex: null,\n label: \"Custom CSS\",\n target: `${state.artifacts.customCss.trim().split(\"\\n\").length} lines`,\n origin: \"code\",\n risky: false,\n });\n }\n if (state.artifacts.customJs.trim()) {\n items.push({\n kind: \"js\",\n selector: null,\n mutationIndex: null,\n label: \"Custom JavaScript\",\n target: \"runs when the variation loads\",\n origin: \"code\",\n risky: state.reloadRequired,\n });\n }\n return items;\n}\n\nfunction describeRunChanges(\n before: EditorArtifacts,\n after: EditorArtifacts,\n): Array<{ label: string; target: string }> {\n const beforeKeys = new Set(\n before.mutations.map((mutation) => JSON.stringify(mutation)),\n );\n const results = after.mutations\n .filter((mutation) => !beforeKeys.has(JSON.stringify(mutation)))\n .map((mutation) => ({\n label: mutationLabel(mutation),\n target: mutation.selector,\n }));\n if (after.customCss.trim() !== before.customCss.trim()) {\n results.push({ label: \"Custom CSS updated\", target: \"variation stylesheet\" });\n }\n if (after.customJs.trim() !== before.customJs.trim()) {\n results.push({ label: \"Custom JavaScript updated\", target: \"variation script\" });\n }\n return results;\n}\n\nfunction formatMinutes(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = Math.max(0, Math.floor(seconds % 60));\n return `${m}:${String(s).padStart(2, \"0\")}`;\n}\n\nexport type EditorView = { destroy(): void };\n\nexport function mountEditorView(\n shadow: ShadowRoot,\n controller: EditorController,\n): EditorView {\n const style = document.createElement(\"style\");\n style.textContent = KIT_CSS + VIEW_CSS;\n const chrome = document.createElement(\"div\");\n const zone = document.createElement(\"div\");\n zone.className = \"zone\";\n const box = document.createElement(\"div\");\n box.className = \"picker-box\";\n box.hidden = true;\n const label = document.createElement(\"div\");\n label.className = \"picker-label\";\n label.hidden = true;\n const device = document.createElement(\"div\");\n device.className = \"device\";\n device.hidden = true;\n const boot = document.createElement(\"div\");\n boot.className = \"boot\";\n shadow.append(style, zone, chrome, box, label, device, boot);\n\n const session = controller.session;\n const targetHost = (() => {\n try {\n return new URL(session.targetUrl).host;\n } catch {\n return session.targetOrigin.replace(/^https?:\\/\\//, \"\");\n }\n })();\n const targetPath = (() => {\n try {\n const url = new URL(session.targetUrl);\n return url.pathname + url.search;\n } catch {\n return null;\n }\n })();\n const experimentTitle = session.experimentName?.trim() || \"On-site editor\";\n const dashboardVariationUrl = (variationId: string) =>\n `${controller.apiOrigin}/tests/${encodeURIComponent(session.experimentId)}/variations/${encodeURIComponent(variationId)}`;\n const sessionSecondsLeft = () =>\n Math.max(0, Math.floor((Date.parse(session.expiresAt) - Date.now()) / 1000));\n\n // \u2500\u2500 view-local state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let latestState = controller.getState();\n let panelTab: PanelTab = \"operator\";\n let codeLang: \"css\" | \"js\" = \"css\";\n let collapsed = false;\n let sheetOpen = false;\n let narrow = false;\n let varMenuOpen = false;\n let viewMode: \"variation\" | \"original\" = \"variation\";\n let ctxSelector: string | null = latestState.selectedSelector;\n let ctxLabel: string | null = latestState.selectedElement\n ? elementLabel(latestState.selectedElement)\n : latestState.selectedSelector;\n let devicePick: \"desktop\" | \"tablet\" | \"mobile\" = \"desktop\";\n let conn: \"connected\" | \"offline\" = navigator.onLine === false ? \"offline\" : \"connected\";\n let banner: \"unsupported\" | \"spanav\" | null = null;\n let spaDismissed = false;\n let modal: \"stop\" | \"expired\" | null = null;\n let artifactOpen = false;\n let operatorDraft = \"\";\n let operatorBusy = false;\n let operatorRunPromise: Promise<void> | null = null;\n let variationSwitch = 0;\n let lastSavedAt: number | null = null;\n let sessionWarn = sessionSecondsLeft() <= SESSION_WARN_SECONDS;\n let bootDone = false;\n let messageId = 0;\n const thread: ThreadMessage[] = [];\n const operatorConversation: EditorOperatorMessage[] = [];\n\n const media = typeof window.matchMedia === \"function\"\n ? window.matchMedia(\"(max-width: 759px)\")\n : null;\n narrow = media?.matches ?? false;\n\n const devicePreview = new DevicePreview(\n createDeviceFrame(),\n (deviceState) => {\n controller.setDeviceState(deviceState);\n },\n );\n controller.attachDevicePreview(devicePreview);\n\n function createDeviceFrame(): HTMLIFrameElement {\n device.innerHTML = `<div class=\"device-shell\">\n <div class=\"device-head\"><span class=\"d-title\">Device preview</span><button type=\"button\" class=\"iconbtn\" data-action=\"device-close\" aria-label=\"Close device preview\">${icon(\"x\", 13)}</button></div>\n <iframe class=\"device-frame\" name=\"${EDITOR_DEVICE_FRAME_NAME}\" title=\"Store device preview\"></iframe>\n <div class=\"device-fallback\" hidden>The store blocks device framing. Open this draft on a mobile device or use your browser's device mode.<div class=\"row\"><button type=\"button\" class=\"btn ghost sm\" data-action=\"device-copy\">Copy current URL</button></div></div>\n </div>`;\n return device.querySelector(\"iframe\")!;\n }\n\n const frame = device.querySelector(\"iframe\")!;\n const fallback = device.querySelector<HTMLElement>(\".device-fallback\")!;\n\n const picker = new ElementPicker(\n { box, label },\n (element, selector) => {\n controller.selectElement(element, selector);\n picker.setSelected(element);\n ctxSelector = selector;\n ctxLabel = elementLabel(element);\n panelTab = \"operator\";\n if (narrow) sheetOpen = true;\n render();\n },\n (active) => {\n controller.setPickerActive(active);\n render();\n },\n () => {\n banner = \"unsupported\";\n render();\n },\n );\n\n // \u2500\u2500 html builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const draftPill = (compact: boolean) =>\n `<span class=\"draft-pill\">${icon(\"eye\", 11)}${compact ? \"Draft\" : \"Draft \u2014 not visible to shoppers\"}</span>`;\n\n const connChip = () =>\n conn === \"offline\"\n ? `<span class=\"conn-chip offline\" role=\"status\"><span class=\"dot err\"><i></i><b></b></span>Offline \u2014 reconnecting\u2026</span>`\n : \"\";\n\n const sessionNoteHtml = () => {\n const left = sessionSecondsLeft();\n if (left <= SESSION_WARN_SECONDS) {\n return `<span class=\"session-chip\" title=\"Editing session time remaining\">${icon(\"clock\", 12)}<span data-session-text>Session ends in ${formatMinutes(left)}</span><button type=\"button\" class=\"extend\" data-action=\"extend-session\">Extend</button></span>`;\n }\n return `<span class=\"session-note\" title=\"Editing session time remaining\" data-session-text>Session \u00B7 ${Math.floor(left / 60)} min left</span>`;\n };\n\n const variationSwitcherHtml = (compact: boolean) => {\n const current = latestState.variation;\n const currentName = current?.name || \"Variation\";\n const initial = (currentName.trim()[0] || \"V\").toUpperCase();\n const menu = varMenuOpen\n ? `<div class=\"var-menu ee-in\" role=\"listbox\" aria-label=\"Eligible variations\">\n <div class=\"note\">Switching keeps your saved draft \u2014 nothing is lost.</div>\n ${session.variations.map((variation) => {\n const on = variation.id === current?.id;\n const name = variation.name || variation.slug || \"Variation\";\n const vInitial = (name.trim()[0] || \"V\").toUpperCase();\n return `<button type=\"button\" class=\"var-item\" role=\"option\" aria-selected=\"${on}\" data-action=\"variation-pick\" data-variation=\"${esc(variation.id)}\">\n <span class=\"vid\" aria-hidden=\"true\">${esc(vInitial)}</span>\n <span class=\"meta\"><span class=\"n\">${esc(name)}</span><span class=\"s\">${on ? `${changeListFromState(latestState).length} change${changeListFromState(latestState).length === 1 ? \"\" : \"s\"} in draft` : \"Draft\"}</span></span>\n ${on ? icon(\"check\", 13) : \"\"}\n </button>`;\n }).join(\"\")}\n </div>`\n : \"\";\n return `<div class=\"var-wrap\">\n <button type=\"button\" class=\"var-btn\" data-action=\"variation-open\" aria-haspopup=\"listbox\" aria-expanded=\"${varMenuOpen}\" aria-label=\"Variation: ${esc(currentName)}. Switch variation\">\n <span class=\"vid\" aria-hidden=\"true\">${esc(initial)}</span>\n ${compact ? \"\" : `<span class=\"vname\">${esc(currentName)}</span>`}\n ${icon(\"chevD\", 12)}\n </button>\n ${menu}\n </div>`;\n };\n\n const compareSegHtml = () => {\n const variationName = latestState.variation?.name || \"Variation\";\n return `<div class=\"seg\" role=\"radiogroup\" aria-label=\"Compare original and variation\">\n <button type=\"button\" role=\"radio\" aria-checked=\"${viewMode === \"original\"}\" data-action=\"compare\" data-view=\"original\">Original</button>\n <button type=\"button\" role=\"radio\" aria-checked=\"${viewMode === \"variation\"}\" data-action=\"compare\" data-view=\"variation\">${esc(variationName)}</button>\n </div>`;\n };\n\n const deviceSegHtml = () => `<div class=\"seg\" role=\"radiogroup\" aria-label=\"Preview viewport\">\n <button type=\"button\" class=\"sm\" role=\"radio\" aria-checked=\"${devicePick === \"desktop\"}\" data-action=\"device\" data-device=\"desktop\" title=\"Desktop preview\" aria-label=\"Desktop preview\">${icon(\"monitor\", 13)}</button>\n <button type=\"button\" class=\"sm\" role=\"radio\" aria-checked=\"${devicePick === \"tablet\"}\" data-action=\"device\" data-device=\"tablet\" title=\"Tablet preview \u2014 768px\" aria-label=\"Tablet preview, 768 pixels\">${icon(\"tablet\", 13)}</button>\n <button type=\"button\" class=\"sm\" role=\"radio\" aria-checked=\"${devicePick === \"mobile\"}\" data-action=\"device\" data-device=\"mobile\" title=\"Mobile preview \u2014 390px\" aria-label=\"Mobile preview, 390 pixels\">${icon(\"phone\", 13)}</button>\n </div>`;\n\n const undoRedoHtml = () => `<div class=\"undo-redo\">\n <button type=\"button\" class=\"iconbtn\" data-action=\"undo\" aria-label=\"Undo\" title=\"Undo\" ${latestState.canUndo ? \"\" : \"disabled\"}>${icon(\"undo\", 15)}</button>\n <button type=\"button\" class=\"iconbtn\" data-action=\"redo\" aria-label=\"Redo\" title=\"Redo\" ${latestState.canRedo ? \"\" : \"disabled\"}>${icon(\"redo\", 15)}</button>\n </div>`;\n\n const tabsHtml = () => {\n const count = changeListFromState(latestState).length;\n const tab = (id: PanelTab, labelText: string, iconHtml: string, badge?: number) =>\n `<button type=\"button\" class=\"tab\" role=\"tab\" aria-selected=\"${panelTab === id}\" data-action=\"tab\" data-tab=\"${id}\">${iconHtml}${labelText}${badge ? `<span class=\"count\">${badge}</span>` : \"\"}</button>`;\n return `<div class=\"tabs\" role=\"tablist\" aria-label=\"Editor panels\">\n ${tab(\"operator\", \"Operator\", operatorMark(12, panelTab === \"operator\" ? \"#fff\" : \"rgba(255,255,255,0.55)\"))}\n ${tab(\"code\", \"Code\", icon(\"braces\", 13))}\n ${tab(\"changes\", \"Changes\", icon(\"history\", 13), count)}\n </div>`;\n };\n\n const ctxChipHtml = (inThread: boolean, labelText: string) =>\n `<span class=\"ctx-chip\">${icon(\"cursorBox\", 12)}<span class=\"name\">${esc(labelText)}</span>${inThread ? \"\" : `<button type=\"button\" class=\"replace\" data-action=\"ctx-replace\" aria-label=\"Replace selected element\">Replace</button><button type=\"button\" class=\"clear\" data-action=\"ctx-clear\" aria-label=\"Clear selected element\">${icon(\"x\", 11)}</button>`}</span>`;\n\n const operatorPanelHtml = () => {\n const pickerActive = latestState.pickerActive;\n const ctxBar = ctxSelector && ctxLabel\n ? `<span class=\"lbl\">Talking about</span>${ctxChipHtml(false, ctxLabel)}`\n : `<button type=\"button\" class=\"btn sm ${pickerActive ? \"primary\" : \"soft\"}\" data-action=\"inspect-toggle\">${icon(\"pointer\", 13)}${pickerActive ? \"Click something on the page\u2026\" : \"Point at an element\"}</button><span class=\"opt\">optional \u2014 you can also just describe the change</span>`;\n\n const empty = thread.length === 0;\n const emptyHtml = `<div class=\"op-empty\">\n <div class=\"mark\" aria-hidden=\"true\">${operatorMark(20)}</div>\n <div class=\"t\">What should change on this page?</div>\n <p>Point at an element or just describe it. Operator makes the change on the draft \u2014 you see it on the real page immediately.</p>\n <div class=\"sugs\">${OPERATOR_SUGGESTIONS.map((suggestion) => `<button type=\"button\" class=\"sug\" data-action=\"suggestion\">${esc(suggestion)}</button>`).join(\"\")}</div>\n </div>`;\n\n const messages = thread.map((message) => {\n if (message.role === \"user\") {\n return `<div class=\"msg-user\">${message.ctxLabel ? `<span class=\"ref\">${icon(\"cursorBox\", 10)} ${esc(message.ctxLabel)}</span>` : \"\"}<div class=\"bubble\">${esc(message.text)}</div></div>`;\n }\n if (message.phase === \"working\") {\n return `<div class=\"op-card working ee-in\">\n <div class=\"head\">${operatorMark(13)}<span>Operator</span>${message.abort ? `<button type=\"button\" class=\"btn sm bare\" style=\"margin-left:auto;padding:2px 6px\" data-action=\"op-stop\" data-msg=\"${message.id}\">${icon(\"stop\", 12)}Stop</button>` : \"\"}</div>\n <div class=\"steps\" role=\"status\" aria-live=\"polite\">${message.steps.map((step, index) => {\n const state = index < message.step ? \"done\" : index === message.step ? \"cur\" : \"todo\";\n const mark = state === \"done\" ? icon(\"check\", 12) : state === \"cur\" ? icon(\"refresh\", 12, 'class=\"spin\"') : `<span class=\"idle\">\u00B7</span>`;\n return `<div class=\"step ${state}\">${mark}${esc(step)}</div>`;\n }).join(\"\")}</div>\n </div>`;\n }\n if (message.phase === \"failed\") {\n return `<div class=\"op-card failed ee-in\" role=\"alert\">\n <div class=\"head\">${icon(\"alert\", 13)} Operator couldn't finish</div>\n <p>${esc(message.error ?? \"Something went wrong.\")} Nothing was changed on the draft.</p>\n <div class=\"row\"><button type=\"button\" class=\"btn sm soft\" data-action=\"op-retry\" data-msg=\"${message.id}\">${icon(\"refresh\", 12)}Try again</button></div>\n </div>`;\n }\n if (message.phase === \"save-failed\") {\n return `<div class=\"op-card failed ee-in\" role=\"alert\">\n <div class=\"head\">${icon(\"alert\", 13)} Change applied, but not saved</div>\n <p>${esc(message.error ?? \"The draft could not be saved.\")} The proposed change remains on this page so you can review it and retry saving.</p>\n <div class=\"row\"><button type=\"button\" class=\"btn sm soft\" data-action=\"retry-save\" data-msg=\"${message.id}\">${icon(\"refresh\", 12)}Retry save</button><button type=\"button\" class=\"btn sm bare\" data-action=\"op-all-changes\">${icon(\"history\", 12)}Review changes</button></div>\n </div>`;\n }\n const count = message.results.length;\n const canUndo = canUndoRun(message);\n return `<div class=\"op-card done ee-in\">\n <div class=\"head\">${icon(\"check\", 13)} ${count === 1 ? \"Made 1 change\" : `Made ${count} changes`} \u2014 it's on the page now</div>\n <div class=\"items\">${message.results.map((result) => `<div class=\"item\">${operatorMark(11)}<span class=\"b\">${esc(result.label)}<span class=\"sel\">${esc(result.target)}</span></span></div>`).join(\"\")}</div>\n <div class=\"row\">\n <button type=\"button\" class=\"btn sm ghost\" data-action=\"op-undo-run\" data-msg=\"${message.id}\" ${canUndo ? \"\" : \"disabled\"}>${icon(\"undo\", 12)}${message.undone ? \"Undone\" : \"Undo this\"}</button>\n <button type=\"button\" class=\"btn sm bare\" data-action=\"op-all-changes\">${icon(\"history\", 12)}All changes</button>\n </div>\n <div class=\"hint\">Not right? Just tell Operator what to adjust.</div>\n </div>`;\n }).join(\"\");\n\n const placeholder = ctxLabel\n ? `What should change about the ${ctxLabel.toLowerCase()}?`\n : \"Describe a change\u2026\";\n\n return `<div class=\"panel\" role=\"tabpanel\" aria-label=\"Operator\">\n <div class=\"op-ctx\">${ctxBar}</div>\n <div class=\"op-thread\" data-op-thread>${empty ? emptyHtml : messages}</div>\n <form class=\"op-input\" data-operator-form>\n <div class=\"line\">\n <textarea class=\"field\" data-field=\"operator-prompt\" rows=\"2\" maxlength=\"30000\" placeholder=\"${esc(placeholder)}\" aria-label=\"Describe the change for Operator\" ${operatorBusy ? \"disabled\" : \"\"}>${esc(operatorDraft)}</textarea>\n <button type=\"submit\" class=\"send\" aria-label=\"Send to Operator\" title=\"Send to Operator\" ${operatorBusy || !latestState.variation ? \"disabled\" : \"\"}>${icon(\"send\", 15)}</button>\n </div>\n <div class=\"note\">Operator edits this draft only \u2014 shoppers never see it.</div>\n </form>\n </div>`;\n };\n\n const codePanelHtml = () => {\n const cssBody = `<div class=\"code-body\">\n <label><span class=\"flabel\">CSS on this variation</span>\n <textarea class=\"field code\" data-field=\"css\" rows=\"9\" spellcheck=\"false\" aria-label=\"Custom CSS for this variation\">${esc(latestState.artifacts.customCss)}</textarea>\n <span class=\"fhint\">Scoped to the experiment page. Applies live as you type.</span>\n </label>\n <div class=\"code-ok\">${icon(\"check\", 12)} CSS changes are fully undoable.</div>\n </div>`;\n const jsBody = `<div class=\"code-body\">\n <label><span class=\"flabel\">JavaScript on this variation</span>\n <textarea class=\"field code\" data-field=\"js\" rows=\"9\" spellcheck=\"false\" aria-label=\"Custom JavaScript for this variation\">${esc(latestState.artifacts.customJs)}</textarea>\n </label>\n <div class=\"js-warn\" role=\"note\">${icon(\"alert\", 14)}<span>JavaScript changes the live page directly and <strong>can't be undone by the editor</strong>. Undo removes it from the draft; close and relaunch the editor to fully reset the page.</span></div>\n <div style=\"display:flex;gap:8px\">\n <button type=\"button\" class=\"btn soft\" data-action=\"run-js\">${icon(\"play\", 13)}Run on page</button>\n </div>\n ${latestState.reloadRequired ? `<div class=\"code-ok\" style=\"color:var(--warning)\">${icon(\"alert\", 12, 'style=\"color:var(--warning)\"')} JavaScript ran on this page. Relaunch the editor to fully reset it.</div>` : \"\"}\n </div>`;\n return `<div class=\"code-panel\" role=\"tabpanel\" aria-label=\"Code\">\n <div class=\"code-head\">\n <div class=\"seg\" role=\"radiogroup\" aria-label=\"Code language\">\n <button type=\"button\" role=\"radio\" aria-checked=\"${codeLang === \"css\"}\" data-action=\"code-lang\" data-lang=\"css\">${icon(\"braces\", 13)}CSS</button>\n <button type=\"button\" role=\"radio\" aria-checked=\"${codeLang === \"js\"}\" data-action=\"code-lang\" data-lang=\"js\">${icon(\"code\", 13)}JavaScript</button>\n </div>\n <span class=\"peer\">works without Operator</span>\n </div>\n ${codeLang === \"css\" ? cssBody : jsBody}\n <div class=\"code-foot\">Code and Operator write to the same draft. Operator's changes appear as artifact operations you can inspect under <button type=\"button\" data-action=\"view-artifact\">Changes \u2192 View artifact</button>. Full code authoring also lives in the variation workspace in Apex.</div>\n </div>`;\n };\n\n const changesPanelHtml = () => {\n const items = changeListFromState(latestState);\n const rows = items.map((item, index) => `<div class=\"chg-row\">\n <span class=\"org\" title=\"${item.origin === \"operator\" ? \"Made by Operator\" : \"Custom code\"}\">${item.origin === \"operator\" ? operatorMark(13) : icon(item.kind === \"css\" ? \"braces\" : \"code\", 13)}</span>\n <div class=\"meta\">\n <div class=\"l\">${esc(item.label)}</div>\n <div class=\"s\">${esc(item.target)} \u00B7 ${item.origin === \"operator\" ? \"Operator\" : \"code\"}${item.risky ? \" \u00B7 relaunch the editor to fully revert\" : \"\"}</div>\n </div>\n <button type=\"button\" class=\"iconbtn xs\" data-action=\"chg-remove\" data-kind=\"${item.kind}\" data-index=\"${item.mutationIndex ?? index}\" aria-label=\"Remove change: ${esc(item.label)}\">${icon(\"x\", 11)}</button>\n </div>`).join(\"\");\n const artifactJson = JSON.stringify(\n {\n variation: latestState.variation?.name ?? null,\n artifactHash: latestState.variation?.artifactHash ?? null,\n operations: latestState.artifacts.mutations,\n customCss: latestState.artifacts.customCss || null,\n customJs: latestState.artifacts.customJs || null,\n },\n null,\n 2,\n );\n return `<div class=\"chg-panel\" role=\"tabpanel\" aria-label=\"Changes\">\n <div class=\"chg-head\"><span class=\"t\">${items.length} change${items.length === 1 ? \"\" : \"s\"} in this draft</span>${saveChipHtml(latestState)}</div>\n ${items.length === 0\n ? `<p class=\"chg-empty\">No changes yet. Ask Operator, or add CSS or JavaScript in Code.</p>`\n : `<div class=\"chg-list\">${rows}</div>`}\n <div class=\"chg-art\">\n <button type=\"button\" class=\"toggle\" data-action=\"artifact-toggle\" aria-expanded=\"${artifactOpen}\">${icon(artifactOpen ? \"chevD\" : \"chevR\", 12)}View artifact (JSON)</button>\n ${artifactOpen ? `<div class=\"json ee-in\" aria-label=\"Variation artifact JSON\">${esc(artifactJson)}</div>` : \"\"}\n <div class=\"note\">Drafts save automatically. Nothing is shown to shoppers until the experiment is launched from Apex.</div>\n <div class=\"pill-row\">${draftPill(false)}</div>\n </div>\n </div>`;\n };\n\n const panelBodyHtml = () =>\n panelTab === \"operator\" ? operatorPanelHtml()\n : panelTab === \"code\" ? codePanelHtml()\n : changesPanelHtml();\n\n const dockHtml = () => {\n if (collapsed) {\n return `<div class=\"rail-dock\">\n ${operatorMark(16)}\n <button type=\"button\" class=\"iconbtn\" data-action=\"expand\" aria-label=\"Expand editor panel\">${icon(\"collapse\", 15)}</button>\n <div class=\"sep\"></div>\n <button type=\"button\" class=\"iconbtn ${latestState.pickerActive ? \"active\" : \"\"}\" data-action=\"rail-inspect\" aria-label=\"Point at an element\">${icon(\"pointer\", 15)}</button>\n <div class=\"grow\"></div>\n <span title=\"Connection: ${conn}\"><span class=\"dot ${conn === \"connected\" ? \"ok\" : \"err\"}\"><i></i>${conn === \"connected\" ? \"\" : \"<b></b>\"}</span></span>\n </div>`;\n }\n return `<div class=\"dock\">\n <div class=\"id-head\">\n <div class=\"id-row\">\n ${operatorMark(18)}\n <div class=\"id-meta\">\n <div class=\"id-title\" title=\"${esc(experimentTitle)}\">${esc(experimentTitle)}</div>\n <div class=\"id-sub\">On your store \u00B7 ${esc(targetHost)}</div>\n </div>\n <button type=\"button\" class=\"iconbtn\" data-action=\"collapse\" aria-label=\"Collapse editor panel\">${icon(\"collapse\", 15)}</button>\n </div>\n <div class=\"id-chips\">\n ${variationSwitcherHtml(false)}\n ${draftPill(true)}\n <span class=\"grow\"></span>\n ${saveChipHtml(latestState)}\n </div>\n ${conn !== \"connected\" ? `<div class=\"id-conn\">${connChip()}</div>` : \"\"}\n </div>\n <div class=\"view-row\">\n ${undoRedoHtml()}\n ${compareSegHtml()}\n <span class=\"grow\"></span>\n ${deviceSegHtml()}\n </div>\n ${tabsHtml()}\n ${panelBodyHtml()}\n <div class=\"foot\">\n ${sessionNoteHtml()}\n <span class=\"grow\"></span>\n <button type=\"button\" class=\"btn primary\" data-action=\"done\">${icon(\"check\", 13)}Done</button>\n </div>\n </div>`;\n };\n\n const sheetHtml = () => {\n const barRow = `<div class=\"bar\">\n ${operatorMark(14)}\n ${variationSwitcherHtml(true)}\n ${draftPill(true)}\n <span class=\"grow\"></span>\n ${saveChipHtml(latestState)}\n </div>`;\n if (!sheetOpen) {\n return `<div class=\"sheet\">\n <button type=\"button\" class=\"handle\" data-action=\"sheet-toggle\" aria-label=\"Expand editor\" aria-expanded=\"false\"><i></i></button>\n ${barRow}\n </div>`;\n }\n return `<div class=\"sheet\">\n <button type=\"button\" class=\"handle\" data-action=\"sheet-toggle\" aria-label=\"Collapse editor\" aria-expanded=\"true\"><i></i></button>\n ${barRow}\n <div class=\"row2\">\n ${undoRedoHtml()}\n ${compareSegHtml()}\n ${sessionNoteHtml()}\n <span class=\"grow\"></span>\n <button type=\"button\" class=\"btn primary sm\" data-action=\"done\">${icon(\"check\", 12)}Done</button>\n </div>\n ${tabsHtml()}\n ${panelBodyHtml()}\n </div>`;\n };\n\n const zoneHtml = () => {\n const selectMode = latestState.pickerActive;\n const banners: string[] = [];\n if (banner === \"unsupported\") {\n banners.push(`<div class=\"banner warn ee-in\" role=\"status\">${icon(\"alert\", 14)}<span class=\"body\">That element can't be edited here. Point at an element on the storefront page instead.</span><button type=\"button\" class=\"btn sm ghost\" data-action=\"banner-dismiss\">OK</button></div>`);\n }\n if (banner === \"spanav\") {\n banners.push(`<div class=\"banner info ee-in\" role=\"status\">${icon(\"globe\", 14)}<span class=\"body\">You navigated to ${esc(location.pathname + location.search)}. This variation targets ${esc(targetPath || \"\")}, so changes are paused until you return.</span><button type=\"button\" class=\"btn sm soft\" data-action=\"spa-back\">Back to target page</button><button type=\"button\" class=\"btn sm ghost\" data-action=\"banner-dismiss\">Stay</button></div>`);\n }\n if (conn === \"offline\") {\n banners.push(`<div class=\"banner error ee-in\" role=\"status\">${icon(\"wifiOff\", 14)}<span class=\"body\">Connection lost. Your edits are kept locally and will save when you're back online.</span></div>`);\n }\n return `${selectMode ? `<div class=\"page-border\" aria-hidden=\"true\"></div><div class=\"select-banner ee-in\">${icon(\"pointer\", 13)}Click an element to talk about it<button type=\"button\" data-action=\"back-to-browsing\">Back to browsing \u00B7 Esc</button></div>` : \"\"}\n ${banners.length ? `<div class=\"banners ${selectMode ? \"lower\" : \"\"}\">${banners.join(\"\")}</div>` : \"\"}\n ${viewMode === \"original\" ? `<div class=\"orig-chip ee-in\">${icon(\"eye\", 13)}Viewing the original \u2014 draft changes hidden<button type=\"button\" data-action=\"show-variation\">Show ${esc(latestState.variation?.name || \"variation\")}</button></div>` : \"\"}`;\n };\n\n const modalHtml = () => {\n if (latestState.saveState === \"conflict\") {\n return `<div class=\"modal-backdrop\"><div class=\"modal ee-in\" role=\"dialog\" aria-modal=\"true\" aria-label=\"This draft changed somewhere else\">\n <div class=\"m-head\"><span class=\"m-icon warn\">${icon(\"alert\", 15)}</span><div class=\"m-title\">This draft changed somewhere else</div></div>\n <div class=\"m-body\">\n <p>Someone saved a newer version of <strong style=\"color:var(--text1)\">${esc(latestState.variation?.name || \"this variation\")}</strong> while you were editing \u2014 likely from the Apex dashboard.</p>\n <p>Loading the newer version discards your unsaved edits here. Keeping yours overwrites theirs.</p>\n </div>\n <div class=\"m-actions\"><button type=\"button\" class=\"btn ghost\" data-action=\"conflict-mine\">Keep my version</button><button type=\"button\" class=\"btn primary\" data-action=\"conflict-theirs\">Load newer version</button></div>\n </div></div>`;\n }\n if (modal === \"expired\") {\n const savedAgo = lastSavedAt\n ? `${Math.max(1, Math.round((Date.now() - lastSavedAt) / 1000))} seconds ago`\n : null;\n return `<div class=\"modal-backdrop\"><div class=\"modal ee-in\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Editing session ended\" style=\"width:410px\">\n <div class=\"m-head\"><span class=\"m-icon purple\">${icon(\"clock\", 15)}</span><div class=\"m-title\">Editing session ended</div></div>\n <div class=\"m-body\">\n <p>Sessions are time-limited for security. ${savedAgo ? `Your draft was saved <strong style=\"color:var(--text1)\">${savedAgo}</strong> \u2014 nothing was lost.` : \"Your saved draft is safe in Apex.\"}</p>\n <p>Start a new session from the variation in Apex.</p>\n </div>\n <div class=\"m-actions\"><button type=\"button\" class=\"btn ghost\" data-action=\"expired-close\">Close editor</button><button type=\"button\" class=\"btn primary\" data-action=\"expired-apex\">${icon(\"external\", 13)}Open variation in Apex</button></div>\n </div></div>`;\n }\n if (modal === \"stop\") {\n const items = changeListFromState(latestState);\n return `<div class=\"modal-backdrop\"><div class=\"modal ee-in\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Done editing?\">\n <div class=\"m-head\"><span class=\"m-icon ok\">${icon(\"check\", 15)}</span><div class=\"m-title\">Done editing?</div></div>\n <div class=\"m-body\">\n <p>${items.length} change${items.length === 1 ? \"\" : \"s\"} saved to the ${esc(latestState.variation?.name || \"variation\")} draft. The editor will be removed from the page and the session closed.</p>\n ${items.length ? `<div style=\"margin-top:12px;display:grid;gap:5px\">${items.slice(0, 4).map((item) => `<div style=\"font-size:12px;color:var(--text3);display:flex;gap:7px;align-items:center\">${icon(\"check\", 11, 'style=\"color:var(--positive)\"')} ${esc(item.label)}</div>`).join(\"\")}</div>` : \"\"}\n <p style=\"font-size:12px;color:var(--text3)\">Launching the experiment still happens from Apex \u2014 closing here never starts traffic.</p>\n </div>\n <div class=\"m-actions\"><button type=\"button\" class=\"btn ghost\" data-action=\"modal-keep\">Keep editing</button><button type=\"button\" class=\"btn primary\" data-action=\"modal-save-close\">${icon(\"check\", 13)}Save and close</button></div>\n </div></div>`;\n }\n return \"\";\n };\n\n const bootHtml = () => {\n const step = latestState.variation ? 3 : 2;\n const error = !latestState.variation && latestState.saveState === \"error\";\n const ttlMinutes = Math.max(1, Math.round((Date.parse(session.expiresAt) - Date.now()) / 60000));\n const steps = [\n \"Starting a secure editing session\",\n `Connecting to ${targetHost}`,\n `Loading the ${latestState.variation?.name || \"variation\"} draft`,\n ];\n return `<div class=\"box\">\n <div class=\"kicker\">${operatorMark(22)} Apex</div>\n <div class=\"sub\">On-site editor \u00B7 ${esc(experimentTitle)}</div>\n <div class=\"steps\" role=\"status\" aria-live=\"polite\">${steps.map((stepLabel, index) => {\n const state = index < step ? \"done\" : index === step ? \"cur\" : \"todo\";\n const mark = state === \"done\" ? icon(\"check\", 14, 'style=\"color:var(--positive)\"')\n : state === \"cur\" ? icon(\"refresh\", 14, 'class=\"spin\" style=\"color:var(--purple300)\"')\n : `<span class=\"idle\">\u00B7</span>`;\n return `<div class=\"step ${state}\">${mark}${esc(stepLabel)}</div>`;\n }).join(\"\")}</div>\n <div class=\"bar\"><i style=\"width:${Math.min(100, (step / 3) * 100 + 12)}%\"></i></div>\n ${error ? `<div class=\"err\">${esc(latestState.saveMessage || \"The draft could not be loaded.\")}<div style=\"margin-top:10px\"><button type=\"button\" class=\"btn soft sm\" data-action=\"boot-retry\">Try again</button></div></div>` : \"\"}\n <div class=\"scope\">Session is scoped to this experiment and store, and expires after ${ttlMinutes} minutes. Drafts only \u2014 shoppers never see your edits.</div>\n </div>`;\n };\n\n // \u2500\u2500 render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const render = () => {\n latestState = controller.getState();\n if (!bootDone && latestState.variation) bootDone = true;\n boot.hidden = bootDone;\n if (!bootDone) boot.innerHTML = bootHtml();\n\n const active = shadow.activeElement as HTMLInputElement | HTMLTextAreaElement | null;\n const activeField = active?.dataset?.field;\n const selection = active && \"selectionStart\" in active\n ? [active.selectionStart, active.selectionEnd] as const\n : null;\n\n zone.className = `zone${narrow ? \" narrow\" : collapsed ? \" rail\" : \"\"}`;\n zone.innerHTML = bootDone ? zoneHtml() : \"\";\n device.className = `device${narrow ? \" narrow\" : \"\"}`;\n chrome.innerHTML = bootDone\n ? `${narrow ? sheetHtml() : dockHtml()}${modalHtml()}`\n : \"\";\n (shadow.host as HTMLElement).dataset.apexEditorSheetState = narrow\n ? (sheetOpen ? \"expanded\" : \"collapsed\")\n : \"desktop\";\n\n device.hidden = latestState.deviceState === \"closed\";\n frame.hidden = latestState.deviceState === \"blocked\";\n fallback.hidden = latestState.deviceState !== \"blocked\";\n const deviceTitle = device.querySelector<HTMLElement>(\".d-title\");\n if (deviceTitle) {\n deviceTitle.textContent = devicePick === \"tablet\"\n ? \"Tablet preview \u00B7 768 \u00D7 1024\"\n : \"Mobile preview \u00B7 390 \u00D7 844\";\n }\n\n if (activeField) {\n const next = chrome.querySelector<HTMLInputElement | HTMLTextAreaElement>(`[data-field=\"${activeField}\"]`);\n next?.focus();\n if (next && selection && \"setSelectionRange\" in next) {\n next.setSelectionRange(selection[0], selection[1]);\n }\n }\n scrollThread();\n };\n\n const scrollThread = () => {\n const threadElement = chrome.querySelector<HTMLElement>(\"[data-op-thread]\");\n if (threadElement) threadElement.scrollTop = threadElement.scrollHeight;\n };\n\n const unsubscribe = controller.subscribe(() => render());\n\n const artifactsEqual = (left: EditorArtifacts, right: EditorArtifacts) =>\n JSON.stringify(left) === JSON.stringify(right);\n\n function canUndoRun(message: ThreadOperatorMessage): boolean {\n if (message.phase !== \"done\" || message.undone || !message.postArtifacts) return false;\n const latestApplicable = [...thread].reverse().find(\n (entry): entry is ThreadOperatorMessage => entry.role === \"op\" && entry.phase === \"done\" && !entry.undone,\n );\n return latestApplicable?.id === message.id &&\n artifactsEqual(controller.getState().artifacts, message.postArtifacts);\n }\n\n // \u2500\u2500 operator run \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const startOperatorRun = (prompt: string, runCtxSelector: string | null, runCtxLabel: string | null) => {\n if (!latestState.variation || operatorBusy) return;\n const preArtifacts = cloneArtifacts(controller.getState().artifacts);\n const referencedElement = runCtxSelector\n ? {\n selector: runCtxSelector,\n tag: latestState.selectedSelector === runCtxSelector\n ? latestState.selectedElement?.tagName.toLowerCase()\n : undefined,\n textPreview: latestState.selectedSelector === runCtxSelector\n ? (latestState.selectedElement?.textContent ?? \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200) || undefined\n : undefined,\n }\n : null;\n const abort = new AbortController();\n const userMessage: ThreadUserMessage = {\n id: ++messageId,\n role: \"user\",\n text: prompt,\n ctxLabel: runCtxLabel,\n };\n const opMessage: ThreadOperatorMessage = {\n id: ++messageId,\n role: \"op\",\n phase: \"working\",\n step: 0,\n steps: [\n runCtxLabel ? `Inspecting the ${runCtxLabel.toLowerCase()}` : \"Reading the page\",\n \"Asking Operator to draft the change\",\n \"Applying the change to the draft\",\n ],\n prompt,\n ctxSelector: runCtxSelector,\n ctxLabel: runCtxLabel,\n preArtifacts,\n postArtifacts: null,\n results: [],\n error: null,\n undone: false,\n abort,\n };\n thread.push(userMessage, opMessage);\n operatorConversation.push({ role: \"user\", content: prompt });\n operatorBusy = true;\n if (referencedElement) {\n ctxSelector = null;\n ctxLabel = null;\n picker.setSelected(null);\n controller.clearSelectedElement();\n }\n render();\n\n const stepTimer = setTimeout(() => {\n if (opMessage.phase === \"working\") {\n opMessage.step = 1;\n render();\n }\n }, 600);\n\n const pageContext = [\n `Live merchant page: ${redactEditorContextUrl(session.targetUrl)}`,\n runCtxSelector\n ? `The user selected this element as the request context: selector \"${runCtxSelector}\"${runCtxLabel ? ` (${runCtxLabel})` : \"\"}. Ground the change on it.`\n : \"\",\n ].filter(Boolean).join(\"\\n\");\n\n const runPromise = runEditorOperatorTurn({\n apiOrigin: controller.apiOrigin,\n session,\n variationId: latestState.variation.id,\n prompt,\n artifacts: preArtifacts,\n conversation: operatorConversation.slice(0, -1).slice(-12),\n pageContext,\n signal: abort.signal,\n selectedElement: referencedElement,\n }).then(async (result) => {\n clearTimeout(stepTimer);\n if (opMessage.phase !== \"working\" || abort.signal.aborted) return;\n opMessage.step = 2;\n render();\n if (abort.signal.aborted) return;\n const audit = controller.applyCommandArtifacts(result.artifacts);\n opMessage.postArtifacts = cloneArtifacts(controller.getState().artifacts);\n if (abort.signal.aborted) {\n controller.restoreArtifacts(preArtifacts);\n await controller.saveNow();\n return;\n }\n operatorConversation.push({ role: \"assistant\", content: result.explanation });\n opMessage.abort = null;\n await controller.saveNow();\n const saveState = controller.getState().saveState;\n if (saveState === \"error\" || saveState === \"conflict\") {\n opMessage.phase = \"save-failed\";\n opMessage.abort = null;\n opMessage.results = describeRunChanges(preArtifacts, controller.getState().artifacts);\n opMessage.error = controller.getState().saveMessage;\n return;\n }\n opMessage.phase = \"done\";\n opMessage.abort = null;\n opMessage.postArtifacts = cloneArtifacts(controller.getState().artifacts);\n opMessage.results = describeRunChanges(preArtifacts, controller.getState().artifacts);\n if (!opMessage.results.length) {\n opMessage.results = [{ label: result.explanation, target: \"no page changes\" }];\n }\n if (!audit.ok) {\n opMessage.results.push({\n label: \"One selector needs review \u2014 check the result on the page.\",\n target: audit.repairHint ?? \"selector audit\",\n });\n }\n }).catch((error: unknown) => {\n clearTimeout(stepTimer);\n if (abort.signal.aborted) return;\n opMessage.phase = opMessage.postArtifacts ? \"save-failed\" : \"failed\";\n opMessage.abort = null;\n opMessage.error = error instanceof Error ? error.message : \"Operator could not build the draft.\";\n if (opMessage.postArtifacts) {\n opMessage.results = describeRunChanges(preArtifacts, controller.getState().artifacts);\n }\n }).finally(() => {\n if (abort.signal.aborted) {\n const userIndex = thread.indexOf(userMessage);\n if (userIndex >= 0) thread.splice(userIndex, 2);\n operatorConversation.pop();\n }\n if (operatorRunPromise === runPromise) operatorRunPromise = null;\n operatorBusy = false;\n render();\n });\n operatorRunPromise = runPromise;\n };\n\n const switchVariation = async (variationId: string) => {\n const request = ++variationSwitch;\n for (const message of thread) {\n if (message.role === \"op\" && message.phase === \"working\") message.abort?.abort();\n }\n await operatorRunPromise;\n if (request !== variationSwitch) return;\n await controller.saveNow();\n if (request !== variationSwitch) return;\n const saveState = controller.getState().saveState;\n if (saveState === \"error\" || saveState === \"conflict\") {\n render();\n return;\n }\n ctxSelector = null;\n ctxLabel = null;\n picker.setSelected(null);\n controller.clearSelection();\n thread.length = 0;\n operatorConversation.length = 0;\n viewMode = \"variation\";\n controller.toggleArtifacts(true);\n await controller.selectVariation(variationId);\n render();\n };\n\n const retrySave = async (message: ThreadOperatorMessage | null) => {\n const stillMatchesRun = Boolean(\n message?.postArtifacts && artifactsEqual(controller.getState().artifacts, message.postArtifacts),\n );\n await controller.saveNow();\n const saveState = controller.getState().saveState;\n if (message?.phase === \"save-failed\" && saveState !== \"error\" && saveState !== \"conflict\") {\n message.phase = \"done\";\n message.error = null;\n message.postArtifacts = stillMatchesRun\n ? cloneArtifacts(controller.getState().artifacts)\n : null;\n }\n render();\n };\n\n // \u2500\u2500 event wiring \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const findMessage = (target: HTMLElement): ThreadOperatorMessage | null => {\n const id = Number(target.dataset.msg);\n const message = thread.find((entry) => entry.id === id);\n return message && message.role === \"op\" ? message : null;\n };\n\n const setDevice = (pick: \"desktop\" | \"tablet\" | \"mobile\") => {\n devicePick = pick;\n if (pick === \"desktop\") {\n controller.closeDevicePreview();\n render();\n return;\n }\n const size: DevicePreviewSize = pick === \"tablet\"\n ? { width: 768, height: 1024 }\n : { width: 390, height: 844 };\n frame.style.width = `${size.width}px`;\n frame.style.height = `${size.height}px`;\n controller.openDevicePreview();\n render();\n };\n\n const onChromeClick = (event: Event) => {\n const target = (event.target as Element).closest<HTMLElement>(\"[data-action]\");\n if (!target) {\n if (varMenuOpen) {\n varMenuOpen = false;\n render();\n }\n return;\n }\n const action = target.dataset.action;\n switch (action) {\n case \"collapse\": collapsed = true; render(); break;\n case \"expand\": collapsed = false; render(); break;\n case \"rail-inspect\": collapsed = false; picker.setActive(true); break;\n case \"sheet-toggle\": sheetOpen = !sheetOpen; render(); break;\n case \"variation-open\": varMenuOpen = !varMenuOpen; render(); break;\n case \"variation-pick\": {\n varMenuOpen = false;\n const variationId = target.dataset.variation;\n if (variationId && variationId !== latestState.variation?.id) {\n void switchVariation(variationId);\n }\n render();\n break;\n }\n case \"tab\": panelTab = (target.dataset.tab as PanelTab) ?? \"operator\"; render(); break;\n case \"compare\": {\n const nextView = target.dataset.view === \"original\" ? \"original\" : \"variation\";\n if (nextView !== viewMode) {\n viewMode = nextView;\n controller.toggleArtifacts(nextView === \"variation\");\n }\n render();\n break;\n }\n case \"show-variation\": viewMode = \"variation\"; controller.toggleArtifacts(true); render(); break;\n case \"device\": setDevice((target.dataset.device as \"desktop\" | \"tablet\" | \"mobile\") ?? \"desktop\"); break;\n case \"undo\": controller.undo(); break;\n case \"redo\": controller.redo(); break;\n case \"inspect-toggle\": picker.setActive(!latestState.pickerActive); break;\n case \"back-to-browsing\": picker.setActive(false); break;\n case \"ctx-replace\": picker.setActive(true); break;\n case \"ctx-clear\":\n ctxSelector = null;\n ctxLabel = null;\n picker.setSelected(null);\n controller.clearSelection();\n render();\n break;\n case \"suggestion\": operatorDraft = target.textContent?.trim() ?? \"\"; render(); break;\n case \"op-stop\": findMessage(target)?.abort?.abort(); break;\n case \"op-retry\": {\n const message = findMessage(target);\n if (message) startOperatorRun(message.prompt, message.ctxSelector, message.ctxLabel);\n break;\n }\n case \"op-undo-run\": {\n const message = findMessage(target);\n if (message && canUndoRun(message)) {\n controller.restoreArtifacts(message.preArtifacts);\n message.undone = true;\n render();\n }\n break;\n }\n case \"op-all-changes\": panelTab = \"changes\"; render(); break;\n case \"code-lang\": codeLang = target.dataset.lang === \"js\" ? \"js\" : \"css\"; render(); break;\n case \"run-js\": controller.applyCustomJs(); break;\n case \"view-artifact\": panelTab = \"changes\"; artifactOpen = true; render(); break;\n case \"artifact-toggle\": artifactOpen = !artifactOpen; render(); break;\n case \"chg-remove\": {\n const kind = target.dataset.kind;\n if (kind === \"mutation\") controller.removeMutation(Number(target.dataset.index));\n else if (kind === \"css\") controller.setCustomCss(\"\");\n else if (kind === \"js\") controller.setCustomJs(\"\");\n break;\n }\n case \"retry-save\": void retrySave(findMessage(target)); break;\n case \"extend-session\": void extendSession(); break;\n case \"banner-dismiss\":\n if (banner === \"spanav\") spaDismissed = true;\n banner = null;\n render();\n break;\n case \"spa-back\":\n banner = null;\n spaDismissed = false;\n location.assign(session.targetUrl);\n break;\n case \"done\": modal = \"stop\"; render(); break;\n case \"modal-keep\": modal = null; render(); break;\n case \"modal-save-close\":\n void controller.saveNow().then(() => {\n const saveState = controller.getState().saveState;\n if (saveState !== \"error\" && saveState !== \"conflict\") return controller.exit();\n render();\n }).catch(() => render());\n break;\n case \"conflict-mine\": void controller.resolveConflict(\"mine\"); break;\n case \"conflict-theirs\": void controller.resolveConflict(\"theirs\"); break;\n case \"expired-close\": void controller.exit(); break;\n case \"expired-apex\":\n window.open(dashboardVariationUrl(latestState.variation?.id ?? session.initialVariationId), \"_blank\", \"noopener\");\n break;\n case \"boot-retry\": void controller.selectVariation(session.initialVariationId); break;\n default: break;\n }\n };\n\n chrome.addEventListener(\"click\", onChromeClick);\n zone.addEventListener(\"click\", onChromeClick);\n boot.addEventListener(\"click\", onChromeClick);\n\n chrome.addEventListener(\"input\", (event) => {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n if (target.dataset.field === \"css\") controller.setCustomCss(target.value);\n else if (target.dataset.field === \"js\") controller.setCustomJs(target.value);\n else if (target.dataset.field === \"operator-prompt\") operatorDraft = target.value;\n });\n\n chrome.addEventListener(\"submit\", (event) => {\n const form = (event.target as Element).closest<HTMLFormElement>(\"[data-operator-form]\");\n if (!form) return;\n event.preventDefault();\n const prompt = operatorDraft.trim();\n if (!prompt) return;\n operatorDraft = \"\";\n startOperatorRun(prompt, ctxSelector, ctxLabel);\n });\n\n device.addEventListener(\"click\", (event) => {\n const action = (event.target as Element).closest<HTMLElement>(\"[data-action]\")?.dataset.action;\n if (action === \"device-close\") setDevice(\"desktop\");\n if (action === \"device-copy\") void navigator.clipboard?.writeText(location.href);\n });\n\n const onKeyDown = (event: KeyboardEvent) => {\n const target = event.composedPath()[0];\n const typing =\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n (target instanceof HTMLElement && target.isContentEditable);\n if (event.key === \"Escape\") {\n if (modal === \"stop\") {\n modal = null;\n render();\n return;\n }\n if (latestState.deviceState !== \"closed\") {\n event.preventDefault();\n setDevice(\"desktop\");\n return;\n }\n return;\n }\n if (typing) return;\n if (event.key === \"s\" || event.key === \"S\") {\n picker.setActive(!latestState.pickerActive);\n return;\n }\n if ((event.metaKey || event.ctrlKey) && (event.key === \"z\" || event.key === \"Z\")) {\n event.preventDefault();\n if (event.shiftKey) controller.redo();\n else controller.undo();\n }\n };\n window.addEventListener(\"keydown\", onKeyDown, true);\n\n // \u2500\u2500 session & environment tickers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const extendSession = async () => {\n try {\n const expiresAt = await controller.extendSession();\n if (expiresAt) {\n sessionWarn = sessionSecondsLeft() <= SESSION_WARN_SECONDS;\n render();\n }\n } catch {\n // The footer keeps counting down; expiry handling still applies.\n }\n };\n\n const previousSaveState = { value: latestState.saveState };\n const saveWatch = controller.subscribe((state) => {\n if (state.saveState === \"saved\" && previousSaveState.value !== \"saved\") {\n lastSavedAt = Date.now();\n }\n previousSaveState.value = state.saveState;\n });\n\n const ticker = setInterval(() => {\n const left = sessionSecondsLeft();\n if (left <= 0 && modal !== \"expired\") {\n modal = \"expired\";\n picker.setActive(false);\n render();\n return;\n }\n const warn = left <= SESSION_WARN_SECONDS;\n if (warn !== sessionWarn) {\n sessionWarn = warn;\n render();\n return;\n }\n const node = chrome.querySelector<HTMLElement>(\"[data-session-text]\");\n if (node) {\n node.textContent = warn\n ? `Session ends in ${formatMinutes(left)}`\n : `Session \u00B7 ${Math.floor(left / 60)} min left`;\n }\n if (targetPath && bootDone) {\n const offTarget = location.pathname + location.search !== targetPath;\n if (offTarget && banner !== \"spanav\" && !spaDismissed && banner === null) {\n banner = \"spanav\";\n render();\n } else if (!offTarget && (banner === \"spanav\" || spaDismissed)) {\n if (banner === \"spanav\") banner = null;\n spaDismissed = false;\n render();\n }\n }\n }, 1000);\n\n const onOnline = () => {\n conn = \"connected\";\n render();\n void controller.saveNow();\n };\n const onOffline = () => {\n conn = \"offline\";\n render();\n };\n window.addEventListener(\"online\", onOnline);\n window.addEventListener(\"offline\", onOffline);\n\n const onMediaChange = () => {\n narrow = media?.matches ?? false;\n render();\n };\n media?.addEventListener?.(\"change\", onMediaChange);\n\n render();\n\n return {\n destroy() {\n for (const message of thread) {\n if (message.role === \"op\" && message.phase === \"working\") {\n message.abort?.abort();\n }\n }\n unsubscribe();\n saveWatch();\n clearInterval(ticker);\n picker.destroy();\n devicePreview.close(false);\n window.removeEventListener(\"keydown\", onKeyDown, true);\n window.removeEventListener(\"online\", onOnline);\n window.removeEventListener(\"offline\", onOffline);\n media?.removeEventListener?.(\"change\", onMediaChange);\n style.remove();\n chrome.remove();\n zone.remove();\n box.remove();\n label.remove();\n device.remove();\n boot.remove();\n },\n };\n}\n"],
5
- "mappings": "4cAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,YAAAE,GAAA,2BAAAC,GAAA,UAAAC,KCQO,IAAMC,EAAN,cAA6B,KAAM,CACxC,YACEC,EACSC,EACAC,EACT,CACA,MAAMF,CAAO,EAHJ,YAAAC,EACA,aAAAC,CAGX,CACF,EAIA,SAASC,EAAOC,EAAgD,CAC9D,OAAOA,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EAC7DA,EACA,IACN,CAEA,SAASC,GAAeD,EAAiC,CACvD,IAAME,EAAQH,EAAOC,CAAK,GAAK,CAAC,EAChC,MAAO,CACL,UAAW,MAAM,QAAQE,EAAM,SAAS,EAAIA,EAAM,UAA4C,CAAC,EAC/F,UAAW,OAAOA,EAAM,WAAc,SAAWA,EAAM,UAAY,GACnE,SAAU,OAAOA,EAAM,UAAa,SAAWA,EAAM,SAAW,EAClE,CACF,CAEA,IAAMC,GAAkB,IAAI,IAA0B,CACpD,WAAY,SAAU,OAAQ,UAAW,QAAS,OAAQ,WAC1D,WAAY,aAAc,gBAAiB,eAAgB,eAC3D,gBAAiB,cAAe,iBAAkB,iBACpD,CAAC,EAEYC,EAAN,KAAgB,CACrB,YACmBC,EACAC,EACAC,EAAuB,IAAIC,IAAS,MAAM,GAAGA,CAAI,EAClE,CAHiB,eAAAH,EACA,aAAAC,EACA,eAAAC,CAChB,CAEK,IAAIE,EAAcC,EAA8B,CACtD,IAAMC,EAAM,IAAI,IAAIF,EAAM,KAAK,SAAS,EACxC,OAAIC,GAAaC,EAAI,aAAa,IAAI,cAAeD,CAAW,EACzDC,EAAI,SAAS,CACtB,CAEA,MAAc,QACZA,EACAC,EACkC,CAClC,IAAMC,EAAW,MAAM,KAAK,UAAUF,EAAK,CACzC,GAAGC,EACH,YAAa,OACb,MAAO,WACP,eAAgB,cAChB,QAAS,CACP,cAAe,UAAU,KAAK,QAAQ,MAAM,GAC5C,GAAIA,EAAK,KAAO,CAAE,eAAgB,kBAAmB,EAAI,CAAC,EAC1D,GAAIA,EAAK,SAAW,CAAC,CACvB,CACF,CAAC,EACKd,EAAUC,EAAO,MAAMc,EAAS,KAAK,EAAE,MAAM,IAAM,IAAI,CAAC,EAC9D,GAAI,CAACA,EAAS,IAAMf,GAAS,KAAO,GAClC,MAAM,IAAIH,EACR,OAAOG,GAAS,OAAU,SAAWA,EAAQ,MAAQ,sBAAsBe,EAAS,MAAM,IAC1FA,EAAS,OACTf,CACF,EAEF,OAAOA,GAAW,CAAC,CACrB,CAEA,MAAM,cAAcY,EAGjB,CACD,IAAMZ,EAAU,MAAM,KAAK,QACzB,KAAK,IAAI,wBAAwB,mBAAmB,KAAK,QAAQ,GAAG,CAAC,aAAcY,CAAW,EAC9F,CAAE,OAAQ,KAAM,CAClB,EACMI,EAAYf,EAAOD,EAAQ,SAAS,GAAK,CAAC,EAChD,GAAI,OAAOgB,EAAU,cAAiB,UAAY,CAACA,EAAU,aAC3D,MAAM,IAAInB,EAAe,wDAAyD,IAAKG,CAAO,EAEhG,MAAO,CACL,UAAW,CACT,GAAI,OAAOgB,EAAU,IAAO,SAAWA,EAAU,GAAKJ,EACtD,KAAM,OAAOI,EAAU,MAAS,SAAWA,EAAU,KAAO,YAC5D,aAAcA,EAAU,aACxB,aAAc,OAAOA,EAAU,cAAiB,SAAWA,EAAU,aAAe,IACtF,EACA,UAAWb,GAAeH,EAAQ,SAAS,CAC7C,CACF,CAEA,MAAM,cACJY,EACAK,EACAC,EAMC,CACD,IAAMlB,EAAU,MAAM,KAAK,QACzB,KAAK,IAAI,wBAAwB,mBAAmB,KAAK,QAAQ,GAAG,CAAC,aAAcY,CAAW,EAC9F,CACE,OAAQ,QACR,KAAM,KAAK,UAAU,CAAE,GAAGK,EAAW,kBAAAC,CAAkB,CAAC,CAC1D,CACF,EACA,GAAI,OAAOlB,EAAQ,cAAiB,SAClC,MAAM,IAAIH,EAAe,wDAAyD,IAAKG,CAAO,EAEhG,MAAO,CACL,aAAcA,EAAQ,aACtB,aAAc,OAAOA,EAAQ,cAAiB,SAAWA,EAAQ,aAAe,KAChF,cAAe,MAAM,QAAQA,EAAQ,aAAa,EAC9CA,EAAQ,cACR,CAAC,EACL,UAAWG,GAAeH,EAAQ,SAAS,CAC7C,CACF,CAEA,MAAM,eAAwC,CAC5C,IAAMA,EAAU,MAAM,KAAK,QACzB,KAAK,IAAI,wBAAwB,mBAAmB,KAAK,QAAQ,GAAG,CAAC,SAAS,EAC9E,CAAE,OAAQ,MAAO,CACnB,EACMQ,EAAUP,EAAOD,EAAQ,OAAO,EACtC,OAAO,OAAOQ,GAAS,WAAc,SAAWA,EAAQ,UAAY,IACtE,CAEA,MAAM,QAAwB,CAC5B,MAAM,KAAK,QACT,KAAK,IAAI,wBAAwB,mBAAmB,KAAK,QAAQ,GAAG,CAAC,EAAE,EACvE,CAAE,OAAQ,QAAS,CACrB,CACF,CAGA,MAAM,cAAcW,EAAQ,GAAqC,CAC/D,IAAMN,EAAM,KAAK,IAAI,wBAAwB,mBAAmB,KAAK,QAAQ,GAAG,CAAC,WAAW,EACtFO,EAAa,IAAI,IAAIP,CAAG,EAC9BO,EAAW,aAAa,IAAI,QAAS,OAAO,KAAK,IAAI,EAAG,KAAK,IAAID,EAAO,EAAE,CAAC,CAAC,CAAC,EAC7E,IAAMnB,EAAU,MAAM,KAAK,QAAQoB,EAAW,SAAS,EAAG,CAAE,OAAQ,KAAM,CAAC,EAC3E,GAAI,CAAC,MAAM,QAAQpB,EAAQ,QAAQ,EAAG,MAAO,CAAC,EAC9C,IAAMqB,EAAmC,CAAC,EAC1C,QAAWnB,KAASF,EAAQ,SAAU,CACpC,IAAMsB,EAAUrB,EAAOC,CAAK,EACtBqB,EAAY,OAAOD,GAAS,WAAc,SAAWA,EAAQ,UAAY,GACzEE,EAAc,OAAOF,GAAS,SAAY,SAAWA,EAAQ,QAAU,GACzE,CAACC,GAAa,CAAClB,GAAgB,IAAImB,CAAmC,GAC1EH,EAAS,KAAK,CACZ,UAAAE,EACA,QAASC,EACT,KAAMvB,EAAOqB,GAAS,IAAI,GAAK,CAAC,EAChC,UAAW,OAAOA,GAAS,WAAc,SAAWA,EAAQ,UAAY,IAC1E,CAAC,CACH,CACA,OAAOD,CACT,CAEA,MAAM,gBACJE,EACAE,EACe,CACf,MAAM,KAAK,QACT,KAAK,IAAI,wBAAwB,mBAAmB,KAAK,QAAQ,GAAG,CAAC,WAAW,EAChF,CACE,OAAQ,QACR,KAAM,KAAK,UAAU,CAAE,UAAAF,EAAW,GAAGE,CAAW,CAAC,CACnD,CACF,CACF,CACF,ECxLA,IAAMC,GAAc,4EACdC,GAAiB,0EAEvB,SAASC,GAAUC,EAAuB,CACxC,OAAI,OAAO,IAAQ,KAAe,OAAO,IAAI,QAAW,WAC/C,IAAI,OAAOA,CAAK,EAElBA,EAAM,QAAQ,kBAAoBC,GAAc,KAAKA,CAAS,EAAE,CACzE,CAEA,SAASC,GAAgBC,EAAcH,EAAuB,CAC5D,MAAO,IAAIG,CAAI,KAAKH,EAAM,QAAQ,MAAO,MAAM,EAAE,QAAQ,KAAM,KAAK,CAAC,IACvE,CAEA,SAASI,EAASC,EAAkBC,EAA2B,CAC7D,GAAI,CACF,OAAOA,EAAK,iBAAiBD,CAAQ,EAAE,SAAW,CACpD,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAASE,GAASC,EAAiC,CACjD,IAAMC,EAAKD,EAAQ,GAAG,KAAK,EAC3B,OAAOC,GAAMA,EAAG,QAAU,IAAM,CAACZ,GAAY,KAAKY,CAAE,EAAIA,EAAK,IAC/D,CAEA,SAASC,GAAgBF,EAA0D,CACjF,IAAMG,EAAQ,CAAC,cAAe,YAAa,UAAW,eAAgB,OAAQ,YAAY,EAC1F,QAAWR,KAAQQ,EAAO,CACxB,IAAMX,EAAQQ,EAAQ,aAAaL,CAAI,GAAG,KAAK,EAC/C,GAAIH,GAASA,EAAM,QAAU,IAAK,MAAO,CAAE,KAAAG,EAAM,MAAAH,CAAM,CACzD,CACA,QAAWY,KAAa,MAAM,KAAKJ,EAAQ,UAAU,EACnD,GACEI,EAAU,KAAK,WAAW,OAAO,GACjC,CAACA,EAAU,KAAK,WAAW,YAAY,GACvCA,EAAU,OACVA,EAAU,MAAM,QAAU,KAC1B,CAACf,GAAY,KAAKe,EAAU,KAAK,EAEjC,MAAO,CAAE,KAAMA,EAAU,KAAM,MAAOA,EAAU,KAAM,EAG1D,OAAO,IACT,CAEA,SAASC,GAAcL,EAA4B,CACjD,OAAO,MAAM,KAAKA,EAAQ,SAAS,EAChC,OAAQL,GAASA,EAAK,QAAU,IAAM,CAACL,GAAe,KAAKK,CAAI,CAAC,EAChE,MAAM,EAAG,CAAC,CACf,CAEA,SAASW,GAAQN,EAAkBF,EAA0B,CAC3D,IAAMS,EAAMP,EAAQ,QAAQ,YAAY,EAClCC,EAAKF,GAASC,CAAO,EAC3B,GAAIC,EAAI,CACN,IAAMO,EAAY,IAAIjB,GAAUU,CAAE,CAAC,GACnC,GAAIL,EAASY,EAAWV,CAAI,EAAG,OAAOU,CACxC,CACA,IAAMJ,EAAYF,GAAgBF,CAAO,EACzC,GAAII,EAAW,CACb,IAAMI,EAAY,GAAGD,CAAG,GAAGb,GAAgBU,EAAU,KAAMA,EAAU,KAAK,CAAC,GAC3E,GAAIR,EAASY,EAAWV,CAAI,EAAG,OAAOU,CACxC,CACA,IAAMC,EAAUJ,GAAcL,CAAO,EACrC,GAAIS,EAAQ,OAAQ,CAClB,IAAMD,EAAY,GAAGD,CAAG,IAAIE,EAAQ,IAAIlB,EAAS,EAAE,KAAK,GAAG,CAAC,GAC5D,GAAIK,EAASY,EAAWV,CAAI,EAAG,OAAOU,CACxC,CACA,IAAME,EAASV,EAAQ,cACvB,GAAI,CAACU,EAAQ,OAAOH,EACpB,IAAMI,EAAU,MAAM,KAAKD,EAAO,QAAQ,EAAE,OAAQE,GAAUA,EAAM,UAAYZ,EAAQ,OAAO,EAC/F,OAAOW,EAAQ,OAAS,EACpB,GAAGJ,CAAG,gBAAgBI,EAAQ,QAAQX,CAAO,EAAI,CAAC,IAClDO,CACN,CAEO,SAASM,GACdb,EACAF,EAAmB,SACX,CACR,IAAMgB,EAAgBd,EAAQ,eAAiB,SACzCC,EAAKF,GAASC,CAAO,EAC3B,GAAIC,EAAI,CACN,IAAMO,EAAY,IAAIjB,GAAUU,CAAE,CAAC,GACnC,GAAIL,EAASY,EAAWV,CAAI,EAAG,OAAOU,CACxC,CACA,IAAMO,EAAST,GAAQN,EAASF,CAAI,EACpC,GAAIF,EAASmB,EAAQjB,CAAI,EAAG,OAAOiB,EAEnC,IAAMC,EAAQ,CAACD,CAAM,EACjBE,EAAUjB,EAAQ,cACtB,KAAOiB,GAAWA,IAAYH,EAAc,iBAAmBE,EAAM,OAAS,GAAG,CAC/E,IAAME,EAAOZ,GAAQW,EAASnB,CAAI,EAClCkB,EAAM,QAAQE,CAAI,EAClB,IAAMV,EAAYQ,EAAM,KAAK,KAAK,EAClC,GAAIpB,EAASY,EAAWV,CAAI,EAAG,OAAOU,EACtC,GAAIU,EAAK,WAAW,GAAG,EAAG,MAC1BD,EAAUA,EAAQ,aACpB,CACA,OAAOD,EAAM,KAAK,KAAK,CACzB,CAEO,SAASG,GAAanB,EAA0B,CACrD,IAAMO,EAAMP,EAAQ,QAAQ,YAAY,EAClCoB,EAAYf,GAAcL,CAAO,EAAE,CAAC,EACpCqB,EAAOrB,EAAQ,sBAAsB,EAC3C,MAAO,GAAGO,CAAG,GAAGa,EAAY,IAAIA,CAAS,GAAK,EAAE,IAAI,KAAK,MAAMC,EAAK,KAAK,CAAC,IAAI,KAAK,MAAMA,EAAK,MAAM,CAAC,EACvG,CCnGA,IAAMC,GAAmB,IACnBC,GAAW,GACXC,EAAW,aACXC,GAAgB,8KAChBC,GAAQ,8CACRC,GAAM,kEACNC,GAAa,+CACbC,GAAc,gCACdC,GAAmB,IAAI,IAAoB,CAC/C,OAAQ,OAAQ,UAAW,YAAa,QAAS,WAAY,SAC7D,eAAgB,aAClB,CAAC,EAeD,SAASC,GAAOC,EAAgD,CAC9D,OAAOA,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EAC7DA,EACA,IACN,CAEA,SAASC,EAAOD,EAAwB,CACtC,OAAO,OAAOA,GAAU,SAAWA,EAAM,KAAK,EAAI,EACpD,CAEA,SAASE,GAAiBC,EAAyB,CACjD,GAAI,CACF,IAAMC,EAAW,IAAI,IAAID,CAAM,EAAE,SAAS,YAAY,EACtD,OAAOC,IAAa,aAAeA,EAAS,SAAS,YAAY,GAC/DA,IAAa,aAAeA,IAAa,OAASA,IAAa,OACnE,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAASC,EAAaL,EAAeM,EAAuB,CAC1D,GAAI,CACF,IAAMC,EAAM,IAAI,IAAIP,EAAOM,CAAI,EAC/B,OAAIC,EAAI,WAAa,SAAWA,EAAI,WAAa,SACxC,GAAGA,EAAI,QAAQ,GAAGf,CAAQ,IAEnCe,EAAI,SAAW,GACfA,EAAI,SAAW,GACfA,EAAI,OAAS,GACbA,EAAI,KAAO,GACJA,EAAI,SAAS,EACtB,MAAQ,CACN,OAAOf,CACT,CACF,CAEA,SAASgB,GAAuBR,EAAuB,CACrD,OAAOA,EACJ,QAAQ,0BAA4BO,GAAQF,EAAaE,CAAG,CAAC,EAC7D,QAAQb,GAAOF,CAAQ,EACvB,QAAQG,GAAKH,CAAQ,EACrB,QAAQI,GAAYJ,CAAQ,EAC5B,QAAQK,GAAaL,CAAQ,EAC7B,QAAQ,mFAAqFiB,GAAU,CACtG,IAAMC,EAAYD,EAAM,SAAS,GAAG,EAAI,IAAM,IAC9C,MAAO,GAAGA,EAAM,MAAMC,EAAW,CAAC,EAAE,CAAC,CAAC,GAAGA,CAAS,GAAGlB,CAAQ,EAC/D,CAAC,CACL,CAEA,SAASmB,GAAUX,EAAgBY,EAAQ,EAAGC,EAAM,GAAa,CAC/D,GAAIA,GAAOpB,GAAc,KAAKoB,CAAG,EAAG,OAAOrB,EAC3C,GAAIQ,IAAU,MAAQ,OAAOA,GAAU,UAAY,OAAOA,GAAU,UAAY,OAAOA,GAAU,UAC/F,OAAO,OAAOA,GAAU,SAAWQ,GAAuBR,CAAK,EAAE,MAAM,EAAG,GAAG,EAAIA,EAEnF,GAAI,OAAOA,EAAU,IAAa,OAAO,KACzC,GAAIY,EAAQ,EAAG,MAAO,cACtB,GAAIZ,aAAiB,QAAS,OAAOc,EAAed,CAAK,EACzD,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,MAAM,EAAG,GAAG,EAAE,IAAKe,GAASJ,GAAUI,EAAMH,EAAQ,CAAC,CAAC,EAC7F,GAAI,OAAOZ,GAAU,SAAU,CAC7B,IAAMgB,EAAkC,CAAC,EACzC,OAAW,CAACC,EAAUC,CAAK,IAAK,OAAO,QAAQlB,CAAgC,EAAE,MAAM,EAAG,EAAE,EAC1F,GAAI,CAAEgB,EAAOC,CAAQ,EAAIN,GAAUO,EAAON,EAAQ,EAAGK,CAAQ,CAAG,MAAQ,CAAC,CAE3E,OAAOD,CACT,CACA,MAAO,IAAI,OAAOhB,CAAK,GACzB,CAEA,SAASmB,GAAYC,EAAiC,CAEpD,MADI,CAACA,GACDA,aAAmB,kBAAoBA,aAAmB,qBAC5DA,aAAmB,mBAAqBA,aAAmB,iBAC1DA,aAAmB,aAAeA,EAAQ,kBACpC,IAEDA,EAAQ,aAAe,IAAI,KAAK,EAAE,QAAQ,OAAQ,GAAG,CAC/D,CAEA,SAASN,EAAeM,EAAyD,CAC/E,GAAI,CAACA,EAAS,OAAO,KACrB,IAAIC,EAAsC,KAC1C,GAAI,CACF,IAAMC,EAAMF,EAAQ,sBAAsB,EAC1CC,EAAO,CACL,EAAG,KAAK,MAAMC,EAAI,CAAC,EAAG,EAAG,KAAK,MAAMA,EAAI,CAAC,EACzC,MAAO,KAAK,MAAMA,EAAI,KAAK,EAAG,OAAQ,KAAK,MAAMA,EAAI,MAAM,CAC7D,CACF,MAAQ,CAAC,CACT,MAAO,CACL,SAAUC,GAA8BH,CAAO,EAC/C,IAAKA,EAAQ,QAAQ,YAAY,EACjC,KAAMZ,GAAuBW,GAAYC,CAAO,CAAC,EAAE,MAAM,EAAG,GAAG,GAAK,KACpE,KAAMA,EAAQ,aAAa,MAAM,EACjC,KAAMA,aAAmB,kBAAoBf,EAAae,EAAQ,IAAI,EAAI,KAC1E,KAAMA,EAAQ,aAAa,MAAM,EACjC,KAAMA,EAAQ,aAAa,MAAM,EACjC,KAAAC,CACF,CACF,CAEA,SAASG,GAAqBN,EAAyD,CACrF,MAAO,CACL,GAAGP,GAAUO,CAAK,EAClB,GAAI,OAAOA,EAAM,KAAQ,SAAW,CAAE,IAAKb,EAAaa,EAAM,GAAG,CAAE,EAAI,CAAC,CAC1E,CACF,CAEA,SAASO,GAAWC,EAMlB,CACA,IAAMC,EAAW1B,EAAOyB,EAAK,QAAQ,EACrC,GAAIC,EACF,GAAI,CACF,IAAMP,EAAU,SAAS,cAAcO,CAAQ,EAC/C,OAAOP,EACH,CAAE,GAAI,GAAM,QAAAA,EAAS,KAAM,UAAW,EACtC,CACE,GAAI,GACJ,MAAO,6BACP,WAAY,kGACd,CACN,MAAQ,CACN,MAAO,CACL,GAAI,GACJ,MAAO,qBAAqBO,CAAQ,GACpC,WAAY,4CACd,CACF,CAEF,IAAMC,EAAQ3B,EAAOyB,EAAK,MAAQA,EAAK,gBAAkBA,EAAK,aAAeA,EAAK,SAAS,EAC3F,GAAI,CAACE,EAAO,MAAO,CAAE,GAAI,GAAO,MAAO,kBAAmB,EAC1D,GAAI,CACF,IAAMR,EAAU,SAAS,cAAcQ,CAAK,EAC5C,GAAIR,EAAS,MAAO,CAAE,GAAI,GAAM,QAAAA,EAAS,KAAM,gBAAiB,CAClE,MAAQ,CAAC,CACT,IAAMS,EAAQD,EAAM,YAAY,EAC1BE,EAAa,MAAM,KAAK,SAAS,iBACrC,8EACF,CAAC,EAAE,MAAM,EAAG,GAAG,EAAE,OAAQV,GAAY,CACnC,IAAMW,EAAO,GAAGX,EAAQ,aAAa,YAAY,GAAK,EAAE,IAAIA,EAAQ,aAAa,OAAO,GAAK,EAAE,IAAIA,EAAQ,aAAa,OAAO,GAAK,EAAE,GAAG,YAAY,EACrJ,OAAOD,GAAYC,CAAO,EAAE,YAAY,EAAE,SAASS,CAAK,GAAKE,EAAK,SAASF,CAAK,CAClF,CAAC,EACD,OAAIC,EAAW,SAAW,EAAU,CAAE,GAAI,GAAM,QAASA,EAAW,CAAC,EAAG,KAAM,MAAO,EACjFA,EAAW,OAAS,EACf,CACL,GAAI,GACJ,MAAO,oCACP,WAAY,6FACd,EAEK,CAAE,GAAI,GAAO,MAAO,kBAAmB,CAChD,CAEA,SAASE,GAAchC,EAAiC,CACtD,IAAMiC,EAAQlC,GAAOC,CAAK,EACpB2B,EAAW1B,EAAOgC,GAAO,QAAQ,EACjCC,EAASD,GAAO,OACtB,GAAI,CAACN,GAAY,OAAOO,GAAW,UAAY,CAACpC,GAAiB,IAAIoC,CAAwB,EAAG,OAAO,KACvG,IAAMC,EAAqB,CAAE,SAAAR,EAAU,OAAQO,CAAyB,EACpE,OAAOD,GAAO,MAAS,WAAUE,EAAS,KAAOF,EAAM,MACvD,OAAOA,GAAO,MAAS,WAAUE,EAAS,KAAOF,EAAM,MAC3D,IAAMG,EAAYrC,GAAOkC,GAAO,SAAS,EACrCG,GAAa,OAAOA,EAAU,MAAS,WACxC,OAAOA,EAAU,OAAU,UAAYA,EAAU,QAAU,QAC5DD,EAAS,UAAY,CAAE,KAAMC,EAAU,KAAM,MAAOA,EAAU,KAAM,GAEtE,IAAMC,EAAatC,GAAOkC,GAAO,UAAU,EACvCI,IACFF,EAAS,WAAa,OAAO,YAAY,OAAO,QAAQE,CAAU,EAAE,OAClE,CAAC,CAAC,CAAEnB,CAAK,IAAM,OAAOA,GAAU,UAAYA,IAAU,IACxD,CAAC,GAEH,IAAMoB,EAASvC,GAAOkC,GAAO,MAAM,EACnC,OAAIK,IACFH,EAAS,OAAS,OAAO,YAAY,OAAO,QAAQG,CAAM,EAAE,OAC1D,CAAC,CAAC,CAAEpB,CAAK,IAAM,OAAOA,GAAU,QAClC,CAAC,GAEIiB,CACT,CAEA,SAASI,GAAevC,EAAwC,CAC9D,IAAMiC,EAAQlC,GAAOC,CAAK,EAC1B,GAAI,CAACiC,GAAS,CAAC,MAAM,QAAQA,EAAM,SAAS,EAAG,OAAO,KACtD,IAAMO,EAAYP,EAAM,UAAU,IAAID,EAAa,EACnD,OAAIQ,EAAU,KAAML,GAAaA,IAAa,IAAI,EAAU,KACrD,CACL,UAAWK,EACX,UAAW,OAAOP,EAAM,WAAc,SAAWA,EAAM,UAAY,GACnE,SAAU,OAAOA,EAAM,UAAa,SAAWA,EAAM,SAAW,EAClE,CACF,CAEA,SAASQ,GAAYC,EAAkD,CACrE,MAAO,CAAE,GAAGA,CAAM,CACpB,CAEO,IAAMC,GAAN,KAA4B,CAMjC,YACmBC,EACAC,EAAgC,CAC/C,SAAWtC,GAAQ,SAAS,OAAOA,CAAG,EACtC,OAAQ,IAAM,SAAS,OAAO,EAC9B,KAAM,IAAM,QAAQ,KAAK,EACzB,QAAS,IAAM,QAAQ,QAAQ,CACjC,EACA,CAPiB,gBAAAqC,EACA,gBAAAC,EAPnB,KAAiB,YAA8C,CAAC,EAChE,KAAiB,YAA8C,CAAC,EAChE,KAAQ,eAAsC,KAC9C,KAAQ,oBAAkD,IAUvD,CAEH,OAAc,CACZ,GAAI,KAAK,eAAgB,OACzB,IAAMC,EAAY,IAAI,IACtB,QAAWC,IAAS,CAAC,MAAO,OAAQ,OAAQ,OAAO,EAAY,CAC7D,IAAMC,EAAW,QAAQD,CAAK,EAC9BD,EAAU,IAAIC,EAAOC,CAAQ,EAC7B,QAAQD,CAAK,EAAI,IAAIrB,IAAoB,CACvC,KAAK,YAAY,KAAK,CAAE,MAAAqB,EAAO,KAAMpC,GAAUe,CAAI,EAAG,GAAI,KAAK,IAAI,CAAE,CAAC,EACtE,KAAK,YAAY,OAAO,EAAG,KAAK,IAAI,EAAG,KAAK,YAAY,OAASnC,EAAQ,CAAC,EAC1EyD,EAAS,MAAM,QAAStB,CAAI,CAC9B,CACF,CAKA,GAJA,KAAK,eAAiB,IAAM,CAC1B,OAAW,CAACqB,EAAOC,CAAQ,IAAKF,EAAW,QAAQC,CAAK,EAAIC,EAC5D,KAAK,eAAiB,IACxB,EACI,OAAO,oBAAwB,IACjC,GAAI,CACF,KAAK,oBAAsB,IAAI,oBAAqBC,GAAS,CAC3D,QAAW/B,KAAS+B,EAAK,WAAW,EAClC,KAAK,YAAY,KAAK,CACpB,IAAK/B,EAAM,KACX,KAAMA,EAAM,UACZ,UAAW,KAAK,MAAMA,EAAM,SAAS,EACrC,SAAU,KAAK,MAAMA,EAAM,QAAQ,CACrC,CAAC,EAEH,KAAK,YAAY,OAAO,EAAG,KAAK,IAAI,EAAG,KAAK,YAAY,OAAS3B,EAAQ,CAAC,CAC5E,CAAC,EACD,KAAK,oBAAoB,QAAQ,CAAE,KAAM,WAAY,SAAU,EAAK,CAAC,CACvE,MAAQ,CAAC,CAEb,CAEA,MAAa,CACX,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,WAAW,EACrC,KAAK,oBAAsB,IAC7B,CAEA,MAAM,QAAQ2D,EAA0D,CACtE,IAAMxB,EAAOwB,EAAQ,KACrB,OAAQA,EAAQ,QAAS,CACvB,IAAK,cACH,MAAO,CACL,OAAQ,CACN,GAAI,GACJ,IAAK7C,EAAa,SAAS,IAAI,EAC/B,YAAaA,EAAa,SAAS,IAAI,CACzC,CACF,EACF,IAAK,WACH,MAAO,CAAE,OAAQ,CAAE,GAAI,GAAM,SAAU,KAAK,SAAS,CAAE,CAAE,EAC3D,IAAK,eACH,MAAO,CACL,OAAQ,CACN,GAAI,GACJ,KAAM,KAAK,YAAY,MAAM,GAAG,EAAE,IAC/Ba,GAAUP,GAAUO,CAAK,CAC5B,CACF,CACF,EACF,IAAK,eAAgB,CACnB,IAAMiC,EAASlD,EAAOyB,EAAK,MAAM,EAAE,YAAY,EAI/C,MAAO,CAAE,OAAQ,CAAE,GAAI,GAAM,KAHhB,KAAK,YAAY,MAAM,GAAG,EAAE,IAAIF,EAAoB,EAAE,OAChEN,GAAU,CAACiC,GAAU,KAAK,UAAUjC,CAAK,EAAE,YAAY,EAAE,SAASiC,CAAM,CAC3E,CACkC,CAAE,CACtC,CACA,IAAK,aACH,MAAO,CACL,OAAQ,CACN,GAAI,GACJ,MAAO,2EACP,WAAY,uGACZ,WAAY,CAAE,SAAU,GAAO,OAAQ,yBAA0B,CACnE,CACF,EACF,IAAK,gBACH,MAAO,CAAE,OAAQ,KAAK,iBAAiBzB,CAAI,CAAE,EAC/C,IAAK,QACH,MAAO,CAAE,OAAQ,KAAK,MAAMA,CAAI,CAAE,EACpC,IAAK,OACH,MAAO,CAAE,OAAQ,KAAK,KAAKA,CAAI,CAAE,EACnC,IAAK,iBACH,MAAO,CAAE,OAAQ,KAAK,cAAcA,CAAI,CAAE,EAC5C,IAAK,WACH,MAAO,CAAE,OAAQ,MAAM,KAAK,QAAQA,CAAI,CAAE,EAC5C,IAAK,gBACH,MAAO,CAAE,OAAQ,MAAM,KAAK,aAAaA,CAAI,CAAE,EACjD,IAAK,kBAAmB,CACtB,IAAM0B,EAAYb,GAAeb,EAAK,SAAS,EAC/C,MAAO,CACL,OAAQ0B,EACJX,GAAY,KAAK,WAAW,sBAAsBW,CAAS,CAAC,EAC5D,CAAE,GAAI,GAAO,MAAO,0DAA2D,CACrF,CACF,CACA,IAAK,WAAY,CACf,IAAMC,EAASpD,EAAOyB,EAAK,GAAG,EAC9B,GAAI,CACF,IAAMnB,EAAM,IAAI,IAAI8C,EAAQ,KAAK,WAAW,QAAQ,YAAY,EAChE,OAAI9C,EAAI,SAAW,KAAK,WAAW,QAAQ,aAClC,CAAE,OAAQ,CAAE,GAAI,GAAO,MAAO,oDAAqD,CAAE,EAEvF,CACL,OAAQ,CAAE,GAAI,GAAM,IAAKF,EAAaE,EAAI,SAAS,CAAC,CAAE,EACtD,iBAAkB,IAAM,KAAK,WAAW,SAASA,EAAI,SAAS,CAAC,CACjE,CACF,MAAQ,CACN,MAAO,CAAE,OAAQ,CAAE,GAAI,GAAO,MAAO,wBAAyB,CAAE,CAClE,CACF,CACA,IAAK,SACH,MAAO,CAAE,OAAQ,CAAE,GAAI,EAAK,EAAG,iBAAkB,IAAM,KAAK,WAAW,OAAO,CAAE,EAClF,IAAK,OACH,MAAO,CAAE,OAAQ,CAAE,GAAI,EAAK,EAAG,iBAAkB,IAAM,KAAK,WAAW,KAAK,CAAE,EAChF,IAAK,UACH,MAAO,CAAE,OAAQ,CAAE,GAAI,EAAK,EAAG,iBAAkB,IAAM,KAAK,WAAW,QAAQ,CAAE,CACrF,CACF,CAEQ,UAAoC,CAC1C,IAAM+C,EAAY,CAAC3B,EAAkB4B,IAAkB,MAAM,KAC3D,SAAS,iBAAiB5B,CAAQ,CACpC,EAAE,MAAM,EAAG4B,CAAK,EAAE,IAAIzC,CAAc,EAAE,OAAO,OAAO,EACpD,MAAO,CACL,MAAO,SAAS,MAAQN,GAAuB,SAAS,KAAK,EAAE,MAAM,EAAG,GAAG,EAAI,KAC/E,IAAKH,EAAa,SAAS,IAAI,EAC/B,YAAaA,EAAa,SAAS,IAAI,EACvC,gBAAiB,SAAS,KAAK,aAAe,IAAI,OAClD,SAAUiD,EAAU,WAAY,EAAE,EAClC,YAAaA,EAAU,sDAAuD,EAAE,EAChF,UAAWA,EAAU,qFAAsF,EAAE,EAC7G,aAAc,KAAK,YAAY,OAC/B,aAAc,KAAK,YAAY,MACjC,CACF,CAEQ,MAAM5B,EAAoD,CAChE,IAAM8B,EAAS/B,GAAWC,CAAI,EAC9B,GAAI,CAAC8B,EAAO,IAAM,CAACA,EAAO,QAAS,OAAOA,EAC1C,GAAI,CAAEA,EAAO,QAAQ,eAAe,CAAE,MAAO,SAAU,OAAQ,QAAS,CAAC,CAAG,MAAQ,CAAC,CACrF,OAAIA,EAAO,mBAAmB,YAAaA,EAAO,QAAQ,MAAM,EAC3DA,EAAO,QAAQ,cAAc,IAAI,WAAW,QAAS,CAAE,QAAS,GAAM,WAAY,EAAK,CAAC,CAAC,EACvF,CAAE,GAAI,GAAM,QAAS1C,EAAe0C,EAAO,OAAO,EAAG,iBAAkB,CAAE,KAAMA,EAAO,IAAK,CAAE,CACtG,CAEQ,KAAK9B,EAAoD,CAC/D,IAAM8B,EAAS/B,GAAWC,CAAI,EAC9B,GAAI,CAAC8B,EAAO,IAAM,CAACA,EAAO,QAAS,OAAOA,EAC1C,IAAMxD,EAAQ,OAAO0B,EAAK,OAAU,SAAWA,EAAK,MAAQ,OAAOA,EAAK,OAAS,EAAE,EACnF,GAAI8B,EAAO,mBAAmB,kBAAoBA,EAAO,mBAAmB,qBAAuBA,EAAO,mBAAmB,kBAC3HA,EAAO,QAAQ,MAAM,EACrBA,EAAO,QAAQ,MAAQxD,UACdwD,EAAO,mBAAmB,aAAeA,EAAO,QAAQ,kBACjEA,EAAO,QAAQ,MAAM,EACrBA,EAAO,QAAQ,YAAcxD,MAE7B,OAAO,CAAE,GAAI,GAAO,MAAO,mCAAoC,EAEjE,OAAAwD,EAAO,QAAQ,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CAAC,EAClEA,EAAO,QAAQ,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,EAC5D,CAAE,GAAI,GAAM,QAAS1C,EAAe0C,EAAO,OAAO,EAAG,YAAaxD,EAAM,MAAO,CACxF,CAEQ,cAAc0B,EAAoD,CACxE,IAAM8B,EAAS/B,GAAWC,CAAI,EAC9B,OAAO8B,EAAO,IAAMA,EAAO,QACvB,CAAE,GAAI,GAAM,QAAS1C,EAAe0C,EAAO,OAAO,EAAG,iBAAkB,CAAE,KAAMA,EAAO,IAAK,CAAE,EAC7FA,CACN,CAEA,MAAc,QAAQ9B,EAA6D,CACjF,IAAM+B,EAAU,KAAK,IAAI,IAAK,KAAK,IAAI,OAAO/B,EAAK,SAAS,GAAK,IAAO,IAAM,CAAC,EACzEgC,EAAY,KAAK,IAAI,EAC3B,KAAO,KAAK,IAAI,EAAIA,EAAYD,GAAS,CACvC,IAAMD,EAAS/B,GAAWC,CAAI,EAC9B,GAAI8B,EAAO,IAAMA,EAAO,QACtB,MAAO,CAAE,GAAI,GAAM,QAAS1C,EAAe0C,EAAO,OAAO,EAAG,SAAU,KAAK,IAAI,EAAIE,CAAU,EAE/F,MAAM,IAAI,QAASC,GAAY,WAAWA,EAAS,GAAG,CAAC,CACzD,CACA,MAAO,CAAE,GAAI,GAAO,MAAO,kCAAmC,SAAU,KAAK,IAAI,EAAID,CAAU,CACjG,CAEA,MAAc,aAAahC,EAA6D,CACtF,IAAMkC,EAAa,KAAK,YAAY,OAC9BC,EAAS,KAAK,IAAI,IAAK,KAAK,IAAI,OAAOnC,EAAK,MAAM,GAAK,IAAO,GAAK,CAAC,EACpEQ,EAAS,KAAK,MAAMR,CAAI,EAC9B,MAAM,IAAI,QAASiC,GAAY,WAAWA,EAASE,CAAM,CAAC,EAC1D,IAAMC,EAAU,KAAK,YAAY,MAAMF,CAAU,EAAE,MAAM,GAAG,EAAE,IAAIpC,EAAoB,EACtF,MAAO,CACL,GAAIU,EAAO,GACX,gBAAiBA,EAAO,GACxB,OAAAA,EACA,SAAU2B,EACV,WAAYxD,EAAa,SAAS,IAAI,EACtC,YAAaA,EAAa,SAAS,IAAI,EACvC,gBAAiByD,EAAQ,OAAS,EAClC,uBAAwBA,EAAQ,OAChC,QAAAA,EACA,GAAIA,EAAQ,OAAS,CAAC,EAAI,CACxB,WAAY,wHACd,CACF,CACF,CAEQ,iBAAiBpC,EAAoD,CAC3E,GAAI,CAACxB,GAAiB,KAAK,WAAW,QAAQ,YAAY,EACxD,MAAO,CACL,GAAI,GACJ,MAAO,yDACP,WAAY,0FACd,EAEF,GAAID,EAAOyB,EAAK,IAAI,EAClB,MAAO,CACL,GAAI,GACJ,MAAO,iEACP,WAAY,0HACd,EAEF,IAAMqC,EAAY9D,EAAOyB,EAAK,SAAS,EACvC,GAAIqC,IAAc,iBAChB,MAAO,CAAE,GAAI,GAAM,UAAAA,EAAW,OAAQvD,GAAuB,SAAS,KAAK,EAAE,MAAM,EAAG,GAAG,CAAE,EAE7F,GAAIuD,IAAc,cAChB,MAAO,CAAE,GAAI,GAAM,UAAAA,EAAW,OAAQ1D,EAAa,SAAS,IAAI,CAAE,EAEpE,GAAI0D,IAAc,WAChB,MAAO,CACL,GAAI,GACJ,UAAAA,EACA,OAAQ,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAY,CACjE,EAEF,GAAI,CAAC,iBAAkB,gBAAiB,iBAAiB,EAAE,SAASA,CAAS,EAAG,CAC9E,IAAMpC,EAAW1B,EAAOyB,EAAK,QAAQ,EACrC,GAAI,CAACC,EAAU,MAAO,CAAE,GAAI,GAAO,MAAO,GAAGoC,CAAS,uBAAwB,EAC9E,GAAI,CACF,IAAMC,EAAW,MAAM,KAAK,SAAS,iBAAiBrC,CAAQ,CAAC,EAC/D,OAAIoC,IAAc,iBACT,CAAE,GAAI,GAAM,UAAAA,EAAW,OAAQC,EAAS,OAAS,CAAE,EAExDD,IAAc,gBACT,CAAE,GAAI,GAAM,UAAAA,EAAW,OAAQC,EAAS,MAAO,EAEjD,CAAE,GAAI,GAAM,UAAAD,EAAW,OAAQjD,EAAekD,EAAS,CAAC,GAAK,IAAI,CAAE,CAC5E,MAAQ,CACN,MAAO,CAAE,GAAI,GAAO,MAAO,qCAAsC,CACnE,CACF,CACA,MAAO,CACL,GAAI,GACJ,MAAO,+DACP,WAAY,+FACd,CACF,CACF,EAEaC,GAAN,KAA0B,CAK/B,YACmBC,EACAC,EACjB,CAFiB,SAAAD,EACA,cAAAC,EANnB,KAAQ,QAAU,GAClB,KAAQ,MAA8C,KACtD,KAAQ,QAAU,EAKf,CAEH,OAAc,CACR,KAAK,UACT,KAAK,QAAU,GACf,KAAK,SAAS,MAAM,EACf,KAAK,KAAK,EACjB,CAEA,MAAa,CACX,KAAK,QAAU,GACX,KAAK,OAAO,aAAa,KAAK,KAAK,EACvC,KAAK,MAAQ,KACb,KAAK,SAAS,KAAK,CACrB,CAEA,MAAc,MAAsB,CAClC,GAAI,GAAC,KAAK,SAAW,KAAK,SAC1B,MAAK,QAAU,GACf,GAAI,CACF,IAAMC,EAAW,MAAM,KAAK,IAAI,cAAc,EAC9C,QAAWlB,KAAWkB,EAAU,CAC9B,GAAI,CAAC,KAAK,QAAS,MACnB,IAAIC,EACJ,GAAI,CACFA,EAAY,MAAM,KAAK,SAAS,QAAQnB,CAAO,CACjD,OAASoB,EAAO,CACd,MAAM,KAAK,IAAI,gBAAgBpB,EAAQ,UAAW,CAChD,MAAOoB,aAAiB,MAAQA,EAAM,QAAU,kCAClD,CAAC,EACD,QACF,CAEA,GADA,MAAM,KAAK,IAAI,gBAAgBpB,EAAQ,UAAW,CAAE,OAAQmB,EAAU,MAAO,CAAC,EAC1EA,EAAU,iBAAkB,CAC9B,IAAMnC,EAASmC,EAAU,iBACzB,KAAK,KAAK,EACV,WAAWnC,EAAQ,CAAC,EACpB,KACF,CACF,CACF,OAASoC,EAAO,CACVA,aAAiBC,GAAkB,CAAC,IAAK,IAAK,GAAG,EAAE,SAASD,EAAM,MAAM,GAC1E,KAAK,KAAK,CAEd,QAAE,CACA,KAAK,QAAU,GACX,KAAK,UAAS,KAAK,MAAQ,WAAW,IAAG,CAAQ,KAAK,KAAK,GAAGhF,EAAgB,EACpF,EACF,CACF,ECvjBO,SAASkF,GAAaC,EAAsB,CACjD,IAAMC,EAAM,IAAI,UAAU,EAAE,gBAAgBD,EAAM,WAAW,EAG7D,QAAWE,KAAU,MAAM,KAAKD,EAAI,iBAAiB,QAAQ,CAAC,EAC5DC,EAAO,OAAO,EAIhB,QAAWC,KAAM,MAAM,KAAKF,EAAI,KAAK,iBAAiB,GAAG,CAAC,EACxD,QAAWG,KAAQ,MAAM,KAAKD,EAAG,UAAU,EAAG,CAE5C,GAAIC,EAAK,KAAK,YAAY,EAAE,WAAW,IAAI,EAAG,CAC5CD,EAAG,gBAAgBC,EAAK,IAAI,EAC5B,QACF,CAGiB,CAAC,OAAQ,MAAO,SAAU,aAAc,YAAY,EACxD,SAASA,EAAK,KAAK,YAAY,CAAC,GAC7BA,EAAK,MAAM,QAAQ,OAAQ,EAAE,EAAE,YAAY,EAC/C,WAAW,aAAa,GAChCD,EAAG,gBAAgBC,EAAK,IAAI,CAGlC,CAGF,OAAOH,EAAI,KAAK,SAClB,CCjCA,IAAMI,GAAY,IAAI,IAClBC,GAAY,EAaT,SAASC,GAAYC,EAAgB,CAC1C,GAAIC,KAAc,EAIhB,OAAW,CAACC,EAAUC,CAAQ,IAAKC,GACjC,GAAI,CACF,IAAMC,EAAUH,EAAS,YAAY,EACjCG,EAAQ,QAAUF,GAAUA,EAASE,EAASH,CAAQ,CAC5D,MAAQ,CAER,CAGJD,IAAa,EACb,GAAI,CACF,OAAOD,EAAG,CACZ,QAAE,CAEA,GADAC,IAAa,EACTA,KAAc,EAChB,QAAWC,KAAYE,GAAU,KAAK,EACpC,GAAI,CACFF,EAAS,YAAY,CACvB,MAAQ,CAER,CAGN,CACF,CCzCA,IAAII,GAA+B,SAO5B,SAASC,IAA4B,CAC1C,OAAOC,KAAiB,QAC1B,CCCA,IAAMC,GAAc,qBAwCdC,GAAwC,CAAC,EAEzCC,GAAiB,IAAI,IAAI,CAAC,OAAQ,MAAO,SAAU,aAAc,YAAY,CAAC,EAC9EC,GAA4B,IAAI,IAAI,CACxC,YACA,aACA,YACA,aACA,YACF,CAAC,EAEM,SAASC,GAAwBC,EAAcC,EAA+B,CACnF,IAAMC,EAAiBF,EAAK,KAAK,EAAE,YAAY,EAC/C,GAAI,CAACE,GAAkBA,EAAe,WAAW,IAAI,GAAKA,IAAmB,SAC3E,MAAO,GAET,GAAID,IAAU,MAAQ,CAACJ,GAAe,IAAIK,CAAc,EAAG,MAAO,GAClE,IAAMC,EAAkBF,EAAM,QAAQ,oBAAqB,EAAE,EAAE,YAAY,EAC3E,GAAIE,EAAgB,WAAW,aAAa,EAAG,MAAO,GACtD,GAAI,CAACA,EAAgB,WAAW,OAAO,EAAG,MAAO,GACjD,IAAMC,EAAYD,EAAgB,MAAM,CAAC,EAAE,MAAM,OAAQ,CAAC,EAAE,CAAC,EAC7D,OAAOL,GAA0B,IAAIM,CAAS,CAChD,CAEA,SAASC,GAAqBC,EAAsB,CAClD,IAAMC,EAAYC,GAAaF,CAAI,EACnC,GAAI,CAACG,GAAiB,EAAG,OAAOF,EAChC,IAAMG,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,UAAYH,EACrB,QAAWI,KAAW,MAAM,KAAKD,EAAS,QAAQ,iBAAiB,GAAG,CAAC,EACrE,QAAWE,KAAa,MAAM,KAAKD,EAAQ,UAAU,EAC9CZ,GAAwBa,EAAU,KAAMA,EAAU,KAAK,GAC1DD,EAAQ,gBAAgBC,EAAU,IAAI,EAI5C,OAAOF,EAAS,SAClB,CAEO,SAASG,GAAyBb,EAAsB,CAO7D,GAFI,CAACA,GACDA,EAAK,WAAW,IAAI,GACpBA,EAAK,SAAS,GAAG,EAAG,OAAOA,EAE/B,IAAIc,EAAMd,EAAK,QAAQ,SAAWe,GAAM,IAAMA,EAAE,YAAY,CAAC,EAE7D,OAAID,EAAI,WAAW,KAAK,IAAGA,EAAM,IAAMA,GAChCA,CACT,CAEO,SAASE,GAAeC,EAAoBC,EAAuB,CACxE,OACED,EAAS,OACT,IACAC,EACA,KACCD,EAAS,UAAY,IACtB,KACCA,EAAS,MAAQA,EAAS,MAAQ,GAEvC,CAEO,SAASE,GAAeC,EAAiC,CAC9D,OAAOA,IAAW,gBAAkBA,IAAW,aACjD,CAEA,SAASC,GACPJ,EACAN,EACAW,EAAgC1B,GAC1B,CACN,OAAQqB,EAAS,OAAQ,CACvB,IAAK,OACHK,EAAU,KAAK,CACb,KAAM,UACN,QAAAX,EACA,SAAU,YACV,MAAOA,EAAQ,SACjB,CAAC,EACD,MACF,IAAK,OACL,IAAK,UACHW,EAAU,KAAK,CACb,KAAM,UACN,QAAAX,EACA,SAAU,cACV,MAAOA,EAAQ,WACjB,CAAC,EACD,MACF,IAAK,YAAa,CAChB,IAAMY,EAAQ,IAAI,IACdN,EAAS,WAAWM,EAAM,IAAIN,EAAS,UAAU,IAAI,EACrDA,EAAS,YACX,OAAO,KAAKA,EAAS,UAAU,EAAE,QAASjB,GAASuB,EAAM,IAAIvB,CAAI,CAAC,EAEpEsB,EAAU,KAAK,CACb,KAAM,YACN,QAAAX,EACA,OAAQ,MAAM,KAAKY,CAAK,EAAE,IAAKvB,IAAU,CACvC,KAAAA,EACA,MAAOW,EAAQ,aAAaX,CAAI,CAClC,EAAE,CACJ,CAAC,EACD,KACF,CACA,IAAK,QACL,IAAK,WAAY,CACf,IAAMwB,EAASb,EAAwB,MACjCY,EAAQ,OAAO,KAAKN,EAAS,QAAU,CAAC,CAAC,EAAE,IAAIJ,EAAwB,EAC7ES,EAAU,KAAK,CACb,KAAM,QACN,QAASX,EACT,OAAQY,EAAM,IAAKvB,IAAU,CAC3B,KAAAA,EACA,MAAOwB,EAAM,iBAAiBxB,CAAI,EAClC,SAAUwB,EAAM,oBAAoBxB,CAAI,CAC1C,EAAE,CACJ,CAAC,EACD,KACF,CACA,IAAK,SACHsB,EAAU,KAAK,CACb,KAAM,SACN,QAAAX,EACA,OAAQA,EAAQ,WAChB,YAAaA,EAAQ,WACvB,CAAC,EACD,KACJ,CACF,CAEA,SAASc,GAAgBC,EAAkC,CACzD,OAAQA,EAAS,KAAM,CACrB,IAAK,UACCA,EAAS,WAAa,YACxBA,EAAS,QAAQ,UAAYA,EAAS,OAAS,GAE/CA,EAAS,QAAQ,YAAcA,EAAS,MAE1C,MACF,IAAK,YACH,OAAW,CAAE,KAAA1B,EAAM,MAAAC,CAAM,IAAKyB,EAAS,OACjCzB,IAAU,KAAMyB,EAAS,QAAQ,gBAAgB1B,CAAI,EACpD0B,EAAS,QAAQ,aAAa1B,EAAMC,CAAK,EAEhD,MACF,IAAK,QACH,OAAW,CAAE,KAAAD,EAAM,MAAAC,EAAO,SAAA0B,CAAS,IAAKD,EAAS,OAC3CzB,EAAOyB,EAAS,QAAQ,MAAM,YAAY1B,EAAMC,EAAO0B,CAAQ,EAC9DD,EAAS,QAAQ,MAAM,eAAe1B,CAAI,EAEjD,MACF,IAAK,SACH,GAAI,CAAC0B,EAAS,QAAUA,EAAS,QAAQ,WAAY,OACrD,GAAI,CACFA,EAAS,OAAO,aAAaA,EAAS,QAASA,EAAS,WAAW,CACrE,MAAQ,CACNA,EAAS,OAAO,YAAYA,EAAS,OAAO,CAC9C,CACA,MACF,IAAK,SACH,QAAWE,KAAQF,EAAS,MAAOE,EAAK,YAAY,YAAYA,CAAI,EACpE,KACJ,CACF,CAEO,SAASC,GAAeZ,EAAoBN,EAAwB,CACzE,OAAQM,EAAS,OAAQ,CACvB,IAAK,OACC,OAAOA,EAAS,MAAS,WAAUN,EAAQ,UAAYN,GAAqBY,EAAS,IAAI,GAC7F,MACF,IAAK,OACL,IAAK,UACC,OAAOA,EAAS,MAAS,WAAUN,EAAQ,YAAcM,EAAS,MACtE,MACF,IAAK,YAWH,GAVIA,EAAS,YACP,CAACR,GAAiB,GAClBV,GAAwBkB,EAAS,UAAU,KAAMA,EAAS,UAAU,KAAK,KACvEA,EAAS,UAAU,QAAU,KAC/BN,EAAQ,gBAAgBM,EAAS,UAAU,IAAI,EAE/CN,EAAQ,aAAaM,EAAS,UAAU,KAAMA,EAAS,UAAU,KAAK,GAIxEA,EAAS,WACX,OAAW,CAACjB,EAAMC,CAAK,IAAK,OAAO,QAAQgB,EAAS,UAAU,EACxDR,GAAiB,GAAK,CAACV,GAAwBC,EAAMC,CAAK,IAC1DA,IAAU,KAAMU,EAAQ,gBAAgBX,CAAI,EAC3CW,EAAQ,aAAaX,EAAMC,CAAK,GAGzC,MACF,IAAK,QACL,IAAK,WACH,GAAIgB,EAAS,OACX,OAAW,CAACjB,EAAMC,CAAK,IAAK,OAAO,QAAQgB,EAAS,MAAM,EACvDN,EAAwB,MAAM,YAC7BE,GAAyBb,CAAI,EAC7BC,CACF,EAGJ,MACF,IAAK,SACHU,EAAQ,OAAO,EACf,MACF,IAAK,eACC,OAAOM,EAAS,MAAS,UAC3BN,EAAQ,mBAAmB,cAAeN,GAAqBY,EAAS,IAAI,CAAC,EAE/E,MACF,IAAK,cACC,OAAOA,EAAS,MAAS,UAC3BN,EAAQ,mBAAmB,WAAYN,GAAqBY,EAAS,IAAI,CAAC,EAE5E,KACJ,CACF,CAEO,SAASa,GAAkBnB,EAAkBoB,EAAsB,CACxE,IAAMC,EAASrB,EAAQ,cACvB,OAAKqB,EACE,MAAM,KAAKA,EAAO,iBAAiB,IAAMrC,GAAc,GAAG,CAAC,EAAE,KACjEsC,GAAcA,EAAU,aAAatC,EAAW,IAAMoC,CACzD,EAHoB,EAItB,CAEO,SAASG,GAAaC,EAAaJ,EAAmB,CAC1DI,EAAmB,aAAaxC,GAAaoC,CAAG,CACnD,CAEA,SAASK,GACPnB,EACAN,EACAW,EACAS,EACgB,CAChB,OAAOM,GAAS,IAAM,CACpB,GAAIlB,GAAeF,EAAS,MAAM,EAAG,CACnC,IAAMe,EAASrB,EAAQ,WACvB,GAAI,CAACqB,GAAU,OAAOf,EAAS,MAAS,SAAU,OAAO,KACzD,IAAMqB,EAAkB3B,EAAQ,gBAC1B4B,EAAc5B,EAAQ,YAC5BkB,GAAeZ,EAAUN,CAAO,EAChC,IAAM6B,EAAwB,CAAC,EAC3BC,EAAUxB,EAAS,SAAW,eAC7BqB,EAAkBA,EAAgB,YAAcN,EAAO,WACxDrB,EAAQ,YACN+B,EAAWzB,EAAS,SAAW,eAAiBN,EAAU4B,EAChE,KAAOE,GAAWA,IAAYC,GAC5BF,EAAc,KAAKC,CAAO,EAC1BA,EAAUA,EAAQ,YAEpB,IAAME,EAAmBH,EAAc,OACpCZ,GAA0BA,aAAgB,OAC7C,EACA,OAAIG,GAAKY,EAAiB,QAASC,GAAaV,GAAaU,EAAUb,CAAG,CAAC,EACvES,EAAc,QAAQlB,EAAU,KAAK,CAAE,KAAM,SAAU,MAAOkB,CAAc,CAAC,EAC1EG,EAAiB,CAAC,GAAK,IAChC,CACA,OAAAtB,GAAiBJ,EAAUN,EAASW,CAAS,EAC7CO,GAAeZ,EAAUN,CAAO,EACzB,IACT,CAAC,CACH,CAyBA,SAASkC,GACPC,EACAC,EACAC,EACM,CACN,IAAMC,EAAOF,EAAQ,MAAQ,SAC7BD,EAAU,QAAQ,CAACI,EAAUC,IAAU,CACrC,IAAIC,EACJ,GAAI,CACFA,EAAWH,EAAK,iBAAiBC,EAAS,QAAQ,CACpD,MAAQ,CACNH,EAAQ,SAASG,EAAUC,CAAK,EAChC,MACF,CACA,GAAIC,EAAS,SAAW,EAAG,CACzBL,EAAQ,SAASG,EAAUC,CAAK,EAChC,MACF,CACAC,EAAS,QAASC,GAAY,CAC5B,IAAMC,EAAMC,GAAeL,EAAUC,CAAK,EAC1C,GAAIK,GAAeN,EAAS,MAAM,EAAG,CACnC,GAAIO,GAAkBJ,EAASC,CAAG,EAAG,OACrCI,GAAkCR,EAAUG,EAASL,EAAWM,CAAG,EACnEP,EAAQ,YAAYG,EAAUG,EAASF,CAAK,EAC5C,MACF,CACAO,GAAkCR,EAAUG,EAASL,EAAWM,CAAG,EACnEP,EAAQ,YAAYG,EAAUG,EAASF,CAAK,CAC9C,CAAC,CACH,CAAC,CACH,CAuCO,SAASQ,IAA+D,CAC7E,IAAMC,EAAgC,CAAC,EACvC,MAAO,CACL,MAAMC,EAAWC,EAAU,CAAC,EAAG,CAC7BC,GAA4BF,EAAWC,EAASF,CAAS,CAC3D,EACA,UAAW,CACTI,GAAS,IAAM,CACb,QAASC,EAAIL,EAAU,OAAS,EAAGK,GAAK,EAAGA,GAAK,EAC9CC,GAAgBN,EAAUK,CAAC,CAAC,CAEhC,CAAC,EACDL,EAAU,OAAS,CACrB,EACA,IAAI,eAAgB,CAClB,OAAOA,EAAU,MACnB,CACF,CACF,CCxWO,IAAMO,GAA0C,CACrD,UAAW,CAAC,EACZ,UAAW,GACX,SAAU,EACZ,EAEO,SAASC,EAAeC,EAA6C,CAC1E,MAAO,CACL,UAAWA,EAAU,UAAU,IAAKC,IAAc,CAChD,GAAGA,EACH,UAAWA,EAAS,UAAY,CAAE,GAAGA,EAAS,SAAU,EAAI,OAC5D,WAAYA,EAAS,WAAa,CAAE,GAAGA,EAAS,UAAW,EAAI,OAC/D,OAAQA,EAAS,OAAS,CAAE,GAAGA,EAAS,MAAO,EAAI,MACrD,EAAE,EACF,UAAWD,EAAU,UACrB,SAAUA,EAAU,QACtB,CACF,CCxFA,SAASE,GAAiBC,EAAgBC,EAA0B,CAClE,GAAID,EAAK,WAAaC,EAAM,SAAU,MAAO,GAC7C,IAAMC,EAAc,IAAI,IAAI,CAAC,OAAQ,UAAW,MAAM,CAAC,EACjDC,EAAe,IAAI,IAAI,CAAC,QAAS,UAAU,CAAC,EAElD,OADID,EAAY,IAAIF,EAAK,MAAM,GAAKE,EAAY,IAAID,EAAM,MAAM,GAC5DE,EAAa,IAAIH,EAAK,MAAM,GAAKG,EAAa,IAAIF,EAAM,MAAM,EAAU,GACrED,EAAK,SAAWC,EAAM,MAC/B,CAEO,SAASG,GACdC,EACAC,EACiB,CACjB,GAAIA,EAAS,SAAW,SACtB,MAAO,CACL,GAAGD,EACH,UAAW,CACT,GAAGA,EAAU,UAAU,OAAQE,GAASA,EAAK,WAAaD,EAAS,QAAQ,EAC3EA,CACF,CACF,EAEF,IAAME,EAAYH,EAAU,UACzB,OAAQE,GAAS,EAAEA,EAAK,WAAaD,EAAS,UAAYC,EAAK,SAAW,SAAS,EACnF,IAAKA,IAAU,CAAE,GAAGA,CAAK,EAAE,EACxBE,EAAQD,EAAU,UAAWD,GAASR,GAAiBQ,EAAMD,CAAQ,CAAC,EAC5E,GAAIG,EAAQ,EAAGD,EAAU,KAAKF,CAAQ,WAC5BA,EAAS,SAAW,SAAWA,EAAS,SAAW,aAAeE,EAAUC,CAAK,EAAE,OAC3FD,EAAUC,CAAK,EAAI,CACjB,GAAGD,EAAUC,CAAK,EAClB,GAAGH,EACH,OAAQ,CAAE,GAAGE,EAAUC,CAAK,EAAE,OAAQ,GAAGH,EAAS,MAAO,CAC3D,UACSA,EAAS,SAAW,YAAa,CAC1C,IAAMI,EAAWF,EAAUC,CAAK,EAC1BE,EAAqB,CACzB,GAAID,EAAS,UAAY,CAAE,CAACA,EAAS,UAAU,IAAI,EAAGA,EAAS,UAAU,KAAM,EAAI,CAAC,EACpF,GAAIA,EAAS,YAAc,CAAC,CAC9B,EACME,EAAiB,CACrB,GAAIN,EAAS,UAAY,CAAE,CAACA,EAAS,UAAU,IAAI,EAAGA,EAAS,UAAU,KAAM,EAAI,CAAC,EACpF,GAAIA,EAAS,YAAc,CAAC,CAC9B,EACAE,EAAUC,CAAK,EAAI,CACjB,GAAGC,EACH,GAAGJ,EACH,UAAW,OACX,WAAY,CAAE,GAAGK,EAAoB,GAAGC,CAAe,CACzD,CACF,MACEJ,EAAUC,CAAK,EAAIH,EAErB,MAAO,CAAE,GAAGD,EAAW,UAAAG,CAAU,CACnC,CAEO,SAASK,GACdR,EACAS,EACiB,CACjB,MAAO,CACL,GAAGT,EACH,UAAWA,EAAU,UAAU,OAAQC,GAAaA,EAAS,WAAaQ,CAAQ,CACpF,CACF,CAEO,SAASC,GACdV,EACAI,EACiB,CACjB,MAAO,CACL,GAAGJ,EACH,UAAWA,EAAU,UAAU,OAAO,CAACW,EAAGC,IAAkBA,IAAkBR,CAAK,CACrF,CACF,CAEO,IAAMS,GAAN,KAAsB,CAAtB,cACL,KAAQ,UAA+B,CAAC,EACxC,KAAQ,UAA+B,CAAC,EAExC,KAAKC,EAAgC,CACnC,KAAK,UAAU,KAAKC,EAAeD,CAAO,CAAC,EAC3C,KAAK,UAAY,KAAK,UAAU,MAAM,GAAG,EACzC,KAAK,UAAY,CAAC,CACpB,CAEA,KAAKA,EAAkD,CACrD,IAAMT,EAAW,KAAK,UAAU,IAAI,EACpC,OAAKA,GACL,KAAK,UAAU,KAAKU,EAAeD,CAAO,CAAC,EACpCC,EAAeV,CAAQ,GAFR,IAGxB,CAEA,KAAKS,EAAkD,CACrD,IAAME,EAAO,KAAK,UAAU,IAAI,EAChC,OAAKA,GACL,KAAK,UAAU,KAAKD,EAAeD,CAAO,CAAC,EACpCC,EAAeC,CAAI,GAFR,IAGpB,CAEA,OAAc,CACZ,KAAK,UAAY,CAAC,EAClB,KAAK,UAAY,CAAC,CACpB,CAEA,IAAI,SAAmB,CACrB,OAAO,KAAK,UAAU,OAAS,CACjC,CAEA,IAAI,SAAmB,CACrB,OAAO,KAAK,UAAU,OAAS,CACjC,CACF,ECnGA,IAAMC,GAAgB,wBAChBC,GAAc,IACdC,GAAyB,KA4BlBC,GAAN,KAAuB,CA2B5B,YACWC,EACAC,EACQC,EAAM,IAAIC,EAAUF,EAAWD,CAAO,EACtCI,EAAS,IAAM,SAAS,OAAO,EAChD,CAJS,aAAAJ,EACA,eAAAC,EACQ,SAAAC,EACA,YAAAE,EA9BnB,KAAQ,MAAqB,CAC3B,UAAW,KACX,UAAWC,EAAeC,EAAsB,EAChD,iBAAkB,GAClB,aAAc,GACd,gBAAiB,KACjB,iBAAkB,KAClB,UAAW,OACX,YAAa,KACb,KAAM,MACN,QAAS,GACT,QAAS,GACT,UAAW,GACX,eAAgB,GAChB,YAAa,QACf,EACA,KAAiB,UAAY,IAAI,IACjC,KAAiB,QAAU,IAAIC,GAC/B,KAAQ,cAAmD,KAC3D,KAAQ,cAAsC,KAC9C,KAAQ,UAAkD,KAC1D,KAAQ,UAA2B,QAAQ,QAAQ,EACnD,KAAQ,SAAW,EACnB,KAAQ,iBAAmB,EAC3B,KAAiB,SAAW,IAAI,GAO7B,CAEH,UAAwB,CACtB,OAAO,KAAK,KACd,CAEA,UAAUC,EAAoD,CAC5D,YAAK,UAAU,IAAIA,CAAQ,EAC3BA,EAAS,KAAK,KAAK,EACZ,IAAM,KAAK,UAAU,OAAOA,CAAQ,CAC7C,CAEA,MAAM,YAA4B,CAChC,MAAM,KAAK,gBAAgB,KAAK,QAAQ,kBAAkB,CAC5D,CAEA,MAAM,gBAAgBC,EAAoC,CACxD,IAAMC,EAAU,EAAE,KAAK,iBACvB,KAAK,WAAW,EAChB,KAAK,MAAM,CAAE,UAAW,OAAQ,YAAa,kBAAmB,CAAC,EACjE,GAAI,CACF,IAAMC,EAAS,MAAM,KAAK,IAAI,cAAcF,CAAW,EACvD,GAAIC,IAAY,KAAK,iBAAkB,OACvC,KAAK,QAAQ,MAAM,EACnB,KAAK,UAAY,EACjB,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,UAAWC,EAAO,UAClB,UAAWN,EAAeM,EAAO,SAAS,EAC1C,gBAAiB,KACjB,iBAAkB,KAClB,UAAW,QACX,YAAa,QACb,QAAS,GACT,QAAS,GACT,UAAW,GACX,eAAgB,EAClB,EACA,KAAK,qBAAqB,EAC1B,KAAK,KAAK,CACZ,OAASC,EAAO,CACd,GAAIF,IAAY,KAAK,iBAAkB,OACvC,KAAK,MAAM,CACT,UAAW,QACX,YAAaE,aAAiB,MAAQA,EAAM,QAAU,2BACxD,CAAC,CACH,CACF,CAEA,gBAAgBC,EAAuB,CACrC,KAAK,MAAM,CAAE,aAAcA,CAAO,CAAC,CACrC,CAEA,cAAcC,EAAkBC,EAAwB,CACtD,KAAK,MAAM,CAAE,gBAAiBD,EAAS,iBAAkBC,EAAU,aAAc,EAAM,CAAC,CAC1F,CAEA,gBAAuB,CACrB,KAAK,qBAAqB,CAC5B,CAEA,sBAA6B,CAC3B,KAAK,MAAM,CAAE,gBAAiB,KAAM,iBAAkB,KAAM,aAAc,EAAM,CAAC,CACnF,CAEA,eAAeA,EAAwB,CACrC,KAAK,OAAOC,GAAwB,KAAK,MAAM,UAAWD,CAAQ,CAAC,CACrE,CAEA,eAAeE,EAAqB,CAC9B,CAAC,OAAO,UAAUA,CAAK,GAAKA,EAAQ,GAAKA,GAAS,KAAK,MAAM,UAAU,UAAU,QACrF,KAAK,OAAOC,GAAiB,KAAK,MAAM,UAAWD,CAAK,CAAC,CAC3D,CAEA,iBAAiBE,EAAkC,CACjD,KAAK,OAAOd,EAAec,CAAS,CAAC,CACvC,CAEA,MAAM,eAAwC,CAC5C,IAAMC,EAAY,MAAM,KAAK,IAAI,cAAc,EAC/C,OAAIA,IAAW,KAAK,QAAQ,UAAYA,GACjCA,CACT,CAEA,MAAM,gBAAgBC,EAA0C,CAC9D,IAAMC,EAAY,KAAK,MAAM,UAC7B,GAAI,GAACA,GAAa,KAAK,MAAM,YAAc,YAC3C,IAAID,IAAW,SAAU,CACvB,MAAM,KAAK,gBAAgBC,EAAU,EAAE,EACvC,MACF,CACA,GAAI,CACF,IAAMX,EAAS,MAAM,KAAK,IAAI,cAAcW,EAAU,EAAE,EACxD,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,UAAW,CAAE,GAAGA,EAAW,aAAcX,EAAO,UAAU,YAAa,EACvE,UAAW,OACX,YAAa,iBACf,EACA,KAAK,KAAK,EACV,MAAM,KAAK,QAAQ,CACrB,OAASC,EAAO,CACd,KAAK,MAAM,CACT,UAAW,QACX,YAAaA,aAAiB,MAAQA,EAAM,QAAU,0BACxD,CAAC,CACH,EACF,CAEA,gBAAgBW,EAAwB,CACtC,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,iBAAkBA,CAAQ,EACxD,KAAK,qBAAqB,EAC1B,KAAK,eAAe,OAAO,KAAK,MAAM,UAAWA,CAAO,EACxD,KAAK,KAAK,CACZ,CAEA,QAAQC,EAA8B,CACpC,KAAK,MAAM,CAAE,KAAAA,CAAK,CAAC,CACrB,CAEA,QAAQC,EAAqB,CAC3B,KAAK,eAAe,CAAE,OAAQ,UAAW,KAAMA,CAAM,CAAC,CACxD,CAEA,eAAeA,EAAqB,CAClC,KAAK,eAAe,CAAE,OAAQ,YAAa,WAAY,CAAE,IAAKA,CAAM,CAAE,CAAC,CACzE,CAEA,SAASC,EAAcD,EAAqB,CAC1C,KAAK,eAAe,CAAE,OAAQ,WAAY,OAAQ,CAAE,CAACC,CAAI,EAAGD,CAAM,CAAE,CAAC,CACvE,CAEA,cAAqB,CACnB,KAAK,SAAS,UAAW,MAAM,CACjC,CAEA,gBAAuB,CACrB,KAAK,eAAe,CAAE,OAAQ,QAAS,CAAC,CAC1C,CAEA,aAAaA,EAAqB,CAChC,KAAK,OAAO,CAAE,GAAG,KAAK,MAAM,UAAW,UAAWA,CAAM,CAAC,CAC3D,CAEA,YAAYA,EAAqB,CAC/B,KAAK,OAAO,CAAE,GAAG,KAAK,MAAM,UAAW,SAAUA,CAAM,EAAG,EAAK,EAC/D,KAAK,MAAM,CAAE,UAAW,EAAM,CAAC,CACjC,CAEA,eAAsB,CACpB,IAAME,EAAO,KAAK,MAAM,UAAU,SAAS,KAAK,EAChD,GAAKA,EACL,GAAI,CACF,IAAI,SAAS,GAAGA,CAAI;AAAA,mCAAsC,EAAE,EAC5D,KAAK,MAAM,CACT,UAAW,GACX,eAAgB,GAChB,YAAa,8CACf,CAAC,CACH,OAASf,EAAO,CACd,KAAK,MAAM,CACT,UAAW,QACX,YAAaA,aAAiB,MAAQA,EAAM,QAAU,mBACxD,CAAC,CACH,CACF,CAEA,MAAa,CACX,IAAMgB,EAAW,KAAK,QAAQ,KAAK,KAAK,MAAM,SAAS,EACnDA,GAAU,KAAK,mBAAmBA,CAAQ,CAChD,CAEA,MAAa,CACX,IAAMC,EAAO,KAAK,QAAQ,KAAK,KAAK,MAAM,SAAS,EAC/CA,GAAM,KAAK,mBAAmBA,CAAI,CACxC,CAEA,oBAAoBC,EAAoC,CACtD,KAAK,cAAgBA,CACvB,CAEA,eAAeC,EAAsC,CACnD,KAAK,MAAM,CAAE,YAAAA,CAAY,CAAC,CAC5B,CAEA,mBAA0B,CACxB,KAAK,eAAe,KAClB,KAAK,MAAM,iBAAmB,KAAK,MAAM,UAAY1B,EAAeC,EAAsB,CAC5F,CACF,CAEA,oBAA2B,CACzB,KAAK,eAAe,MAAM,CAC5B,CAEA,WAAW0B,EAAiC,CAC1C,YAAK,SAAS,IAAIA,CAAO,EAClB,IAAM,KAAK,SAAS,OAAOA,CAAO,CAC3C,CAEA,sBAAsBb,EAAkD,CACtE,KAAK,eAAe,SAAS,EAC7B,KAAK,cAAgB,KACrB,SAAS,eAAevB,EAAa,GAAG,OAAO,EAC/C,IAAMqC,EAAed,EAAU,UAAU,IAAKe,GAAa,KAAK,cAAcA,EAAS,QAAQ,CAAC,EAChG,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,iBAAkB,EAAK,EACrD,KAAK,OAAO7B,EAAec,CAAS,CAAC,EACrC,IAAMgB,EAAgBhB,EAAU,UAAU,IAAI,CAACe,EAAUjB,IAAU,CACjE,IAAMmB,EAAcH,EAAahB,CAAK,EAChCoB,EAAa,KAAK,cAAcH,EAAS,QAAQ,EACjDI,GAAiB,KAAK,qBAAqBJ,EAAUE,EAAaC,CAAU,EAClF,MAAO,CACL,MAAApB,EACA,SAAUiB,EAAS,SACnB,OAAQA,EAAS,OACjB,YAAAE,EACA,WAAAC,EACA,eAAAC,GACA,MAAOF,EAAc,EAAI,mBAAqB,IAChD,CACF,CAAC,EACKG,EAAqB,MAAM,KAAK,IAAI,IACxCpB,EAAU,UACP,OAAQe,GAAaA,EAAS,SAAW,QAAQ,EACjD,IAAKA,GAAaA,EAAS,QAAQ,CACxC,CAAC,EACKM,EAAsBD,EAAmB,IAAKxB,GAAa,CAC/D,IAAM0B,EAAW,KAAK,iBAAiB1B,CAAQ,EACzC2B,EAAUD,EAAS,MAAM,EAAG,CAAC,EAAE,IAAK3B,IAAa,CACrD,MAAOA,EAAQ,aAAe,IAAI,KAAK,EAAE,QAAQ,OAAQ,GAAG,EAAE,MAAM,EAAG,GAAG,EAC1E,QAAS,KAAK,UAAUA,CAAO,CACjC,EAAE,EACF,MAAO,CACL,SAAAC,EACA,MAAO0B,EAAS,OAChB,aAAcC,EAAQ,OAAQC,GAAUA,EAAM,OAAO,EAAE,OACvD,QAAAD,CACF,CACF,CAAC,EACKE,EAAST,EAAc,OAAQU,GAAU,CAACA,EAAM,cAAc,EAC9DC,EAAwBN,EAAoB,OAChD,CAACO,EAAOF,IAAUE,EAAQF,EAAM,aAChC,CACF,EACMG,EAAkB,0CAA0C,KAAK7B,EAAU,QAAQ,EACzF,MAAO,CACL,GAAIyB,EAAO,SAAW,EACtB,cAAAT,EACA,mBAAAI,EACA,oBAAAC,EACA,sBAAAM,EACA,0BAA2BX,EAAc,OACtCU,GAAUA,EAAM,SAAW,UAAYA,EAAM,cAChD,EAAE,OACF,gBAAAG,EACA,iBAAkB7B,EAAU,SAAS,KAAK,EAAE,OAAS,EACrD,GAAIyB,EAAO,OACP,CACE,MAAO,8DACP,WAAY,6FACd,EACA,CAAC,CACP,CACF,CAEA,SAAyB,CAEvB,GADA,KAAK,WAAW,EACZ,CAAC,KAAK,MAAM,WAAa,KAAK,MAAM,YAAc,WACpD,OAAO,QAAQ,QAAQ,EAEzB,IAAMnC,EAAc,KAAK,MAAM,UAAU,GACnCwC,EAAmB,KAAK,iBACxBC,EAAS,KAAK,UAAU,KAAK,IACjC,KAAK,YAAYzC,EAAawC,CAAgB,CAChD,EACA,YAAK,UAAYC,EAAO,MAAM,IAAG,EAAY,EACtCA,CACT,CAEA,MAAc,YACZzC,EACA0C,EACe,CACf,GACEA,IAAyB,KAAK,kBAC9B,KAAK,MAAM,WAAW,KAAO1C,GAC7B,KAAK,MAAM,YAAc,WAEzB,OAEF,IAAM2C,EAAe,KAAK,MAAM,UAAU,aACpCC,EAAWhD,EAAe,KAAK,MAAM,SAAS,EAC9CiD,EAAe,KAAK,SAC1B,KAAK,MAAM,CAAE,UAAW,SAAU,YAAa,WAAY,CAAC,EAC5D,GAAI,CACF,IAAMC,EAAS,MAAM,KAAK,IAAI,cAAc9C,EAAa4C,EAAUD,CAAY,EAC/E,GAAID,IAAyB,KAAK,kBAAoB,KAAK,MAAM,WAAW,KAAO1C,EAAa,OAChG,IAAM+C,EAAoBF,IAAiB,KAAK,SAChD,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,UAAW,CACT,GAAG,KAAK,MAAM,UACd,aAAcC,EAAO,aACrB,aAAcA,EAAO,YACvB,EACA,UAAWC,EAAoB,KAAK,MAAM,UAAYnD,EAAekD,EAAO,SAAS,EACrF,UAAWC,EAAoB,OAAS,QACxC,YAAaA,EACT,2BACAD,EAAO,cAAc,CAAC,GAAG,SAAW,OAC1C,EACA,KAAK,KAAK,CACZ,OAAS3C,EAAO,CACd,GAAIuC,IAAyB,KAAK,kBAAoB,KAAK,MAAM,WAAW,KAAO1C,EAAa,OAC5FG,aAAiB6C,GAAkB7C,EAAM,SAAW,IACtD,KAAK,MAAM,CACT,UAAW,WACX,YAAa,+DACf,CAAC,EAED,KAAK,MAAM,CACT,UAAW,QACX,YAAaA,aAAiB,MAAQA,EAAM,QAAU,0BACxD,CAAC,CAEL,CACF,CAEA,MAAM,MAAsB,CAC1B,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,eAAe,MAAM,EAAK,EAC/B,KAAK,eAAe,SAAS,EAC7B,SAAS,eAAehB,EAAa,GAAG,OAAO,EAC/C,GAAI,CACF,OAAO,QAAQ,YACb,CACE,KAAM,qBACN,IAAK,KAAK,QAAQ,IAClB,aAAc,KAAK,QAAQ,aAC3B,YAAa,KAAK,MAAM,WAAW,IAAM,KAAK,QAAQ,kBACxD,EACA,KAAK,SACP,CACF,MAAQ,CAAC,CACT,GAAI,CACF,MAAM,KAAK,YAAY,KAAK,IAAI,OAAO,EAAGE,EAAsB,CAClE,MAAQ,CAAC,CACT,KAAK,OAAO,CACd,CAEA,SAAgB,CACd,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,eAAe,MAAM,EAAK,EAC/B,KAAK,eAAe,SAAS,EAC7B,SAAS,eAAeF,EAAa,GAAG,OAAO,EAC/C,KAAK,UAAU,MAAM,CACvB,CAEQ,eAAe8D,EAAyC,CAC9D,IAAM3C,EAAW,KAAK,MAAM,iBACvBA,GACL,KAAK,OAAO4C,GAAe,KAAK,MAAM,UAAW,CAAE,GAAGD,EAAO,SAAA3C,CAAS,CAAa,CAAC,CACtF,CAEQ,OAAOc,EAAuB+B,EAAc,GAAY,CAC1D,KAAK,MAAM,YAAc,aAC7B,KAAK,QAAQ,KAAK,KAAK,MAAM,SAAS,EACtC,KAAK,UAAY,EACjB,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,UAAWvD,EAAewB,CAAI,EAC9B,UAAW,OACX,YAAa,kBACb,QAAS,KAAK,QAAQ,QACtB,QAAS,KAAK,QAAQ,OACxB,EACI+B,GAAa,KAAK,qBAAqB,EAC3C,KAAK,eAAe,OAAO,KAAK,MAAM,UAAW,KAAK,MAAM,gBAAgB,EAC5E,KAAK,KAAK,EACV,KAAK,aAAa,EACpB,CAEQ,mBAAmBzC,EAAkC,CAC3D,KAAK,UAAY,EACjB,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,UAAAA,EACA,UAAW,OACX,YAAa,kBACb,QAAS,KAAK,QAAQ,QACtB,QAAS,KAAK,QAAQ,QACtB,UAAW,EACb,EACA,KAAK,qBAAqB,EAC1B,KAAK,eAAe,OAAOA,EAAW,KAAK,MAAM,gBAAgB,EACjE,KAAK,KAAK,EACV,KAAK,aAAa,CACpB,CAEQ,sBAA6B,CAInC,GAHA,KAAK,eAAe,SAAS,EAC7B,KAAK,cAAgB,KACrB,SAAS,eAAevB,EAAa,GAAG,OAAO,EAC3C,EAAC,KAAK,MAAM,iBAChB,IAAI,KAAK,MAAM,UAAU,UAAU,KAAK,EAAG,CACzC,IAAMiE,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,GAAKjE,GACXiE,EAAM,YAAc,KAAK,MAAM,UAAU,WACxC,SAAS,MAAQ,SAAS,iBAAiB,YAAYA,CAAK,CAC/D,CACA,KAAK,cAAgBC,GAAiC,EACtD,KAAK,cAAc,MAAM,KAAK,MAAM,UAAU,SAAS,EACzD,CAEQ,cAAqB,CAC3B,KAAK,WAAW,EAChB,KAAK,UAAY,WAAW,IAAG,CAAQ,KAAK,QAAQ,GAAGjE,EAAW,CACpE,CAEQ,YAAmB,CACrB,KAAK,WAAW,aAAa,KAAK,SAAS,EAC/C,KAAK,UAAY,IACnB,CAEQ,MAAMkE,EAAmC,CAC/C,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,GAAGA,CAAM,EACvC,KAAK,KAAK,CACZ,CAEQ,MAAa,CACnB,QAAWvD,KAAY,KAAK,UAAWA,EAAS,KAAK,KAAK,CAC5D,CAEQ,iBAAiBO,EAA6B,CACpD,GAAI,CACF,OAAO,MAAM,KAAK,SAAS,iBAAiBA,CAAQ,CAAC,CACvD,MAAQ,CACN,MAAO,CAAC,CACV,CACF,CAEQ,cAAcA,EAA0B,CAC9C,GAAI,CACF,OAAO,SAAS,iBAAiBA,CAAQ,EAAE,MAC7C,MAAQ,CACN,MAAO,EACT,CACF,CAEQ,UAAUD,EAA2B,CAC3C,GAAI,EAAEA,aAAmB,aAAc,MAAO,GAC9C,IAAM+C,EAAQ,iBAAiB/C,CAAO,EACtC,GAAI+C,EAAM,UAAY,QAAUA,EAAM,aAAe,UAAY,OAAOA,EAAM,OAAO,IAAM,EAAG,MAAO,GACrG,IAAMG,EAAOlD,EAAQ,sBAAsB,EAC3C,OAAOkD,EAAK,MAAQ,GAAKA,EAAK,OAAS,GAAK,EAAQlD,EAAQ,aAAa,KAAK,CAChF,CAEQ,qBACNoB,EACAE,EACAC,EACS,CACT,GAAID,GAAe,EAAG,MAAO,GAC7B,GAAIF,EAAS,SAAW,SAAU,OAAOG,IAAe,EACxD,IAAMI,EAAW,KAAK,iBAAiBP,EAAS,QAAQ,EACxD,GAAI,CAACO,EAAS,OAAQ,MAAO,GAC7B,IAAKP,EAAS,SAAW,QAAUA,EAAS,SAAW,YAAc,OAAOA,EAAS,MAAS,SAC5F,OAAOO,EAAS,MAAO3B,GAAYA,EAAQ,cAAgBoB,EAAS,IAAI,EAE1E,GAAIA,EAAS,SAAW,QAAU,OAAOA,EAAS,MAAS,SAAU,CACnE,IAAM+B,EAAgBC,GAAahC,EAAS,IAAI,EAChD,OAAOO,EAAS,MAAO3B,GAAY,CACjC,IAAMqD,EAAWrD,EAAQ,UAAU,EAAK,EACxC,OAAAqD,EAAS,UAAYF,EACdnD,EAAQ,YAAcqD,EAAS,SACxC,CAAC,CACH,CACA,GAAIjC,EAAS,SAAW,YAAa,CACnC,IAAMkC,EAAa,CACjB,GAAIlC,EAAS,UAAY,CAAE,CAACA,EAAS,UAAU,IAAI,EAAGA,EAAS,UAAU,KAAM,EAAI,CAAC,EACpF,GAAIA,EAAS,YAAc,CAAC,CAC9B,EACA,OAAOO,EAAS,MAAO3B,GAAY,OAAO,QAAQsD,CAAU,EAAE,MAC5D,CAAC,CAAC1C,EAAMD,CAAK,IAAMA,IAAU,KACzB,CAACX,EAAQ,aAAaY,CAAI,EAC1BZ,EAAQ,aAAaY,CAAI,IAAMD,CACrC,CAAC,CACH,CACA,OAAIS,EAAS,SAAW,SAAWA,EAAS,SAAW,WAC9CO,EAAS,MAAO3B,GAAY,OAAO,QAAQoB,EAAS,QAAU,CAAC,CAAC,EAAE,MACvE,CAAC,CAACR,EAAMD,CAAK,IAAOX,EAAwB,MAAM,iBAChDY,EAAK,SAAS,GAAG,EAAIA,EAAOA,EAAK,QAAQ,SAAW2C,GAAW,IAAIA,EAAO,YAAY,CAAC,EAAE,CAC3F,IAAM5C,CACR,CAAC,EAEI,EACT,CAEQ,aAAoB,CAC1B,QAAWO,KAAW,KAAK,SAAUA,EAAQ,EAC7C,KAAK,SAAS,MAAM,CACtB,CAEA,MAAc,YAAesC,EAAqBC,EAA2C,CAC3F,IAAIC,EAA8C,KAClD,GAAI,CACF,OAAO,MAAM,QAAQ,KAAK,CACxBF,EACA,IAAI,QAAoBG,GAAY,CAClCD,EAAQ,WAAW,IAAMC,EAAQ,MAAS,EAAGF,CAAS,CACxD,CAAC,CACH,CAAC,CACH,QAAE,CACIC,GAAO,aAAaA,CAAK,CAC/B,CACF,CACF,ECjlBO,IAAME,GAA2B,6BCCxC,IAAMC,GAAmB,IACnBC,GAAkB,yBAIXC,GAAN,KAAoB,CAMzB,YACmBC,EACAC,EACjB,CAFiB,WAAAD,EACA,aAAAC,EAPnB,KAAQ,QAA6C,KACrD,KAAQ,eAAsE,CAAC,EAC/E,KAAQ,MAA8C,KACtD,KAAQ,UAAoC,IAKzC,CAEH,KAAKC,EAAkC,CACrC,KAAK,MAAM,EAAK,EAChB,KAAK,UAAYA,EACjB,KAAK,cAAc,EACnB,KAAK,QAAQ,SAAS,EACtB,KAAK,MAAM,OAAS,GACpB,KAAK,MAAM,OAAS,IAAM,KAAK,WAAW,EAC1C,KAAK,MAAM,QAAU,IAAM,KAAK,QAAQ,EACxC,IAAMC,EAAM,IAAI,IAAI,SAAS,IAAI,EACjCA,EAAI,KAAO,GACX,KAAK,MAAM,IAAMA,EAAI,SAAS,EAC9B,KAAK,MAAQ,WAAW,IAAM,KAAK,QAAQ,EAAGN,EAAgB,CAChE,CAEA,OAAOK,EAA4BE,EAAU,GAAY,CACvD,KAAK,UAAYA,EAAUF,EAAY,CAAE,UAAW,CAAC,EAAG,UAAW,GAAI,SAAU,EAAG,EACpF,IAAMG,EAAM,KAAK,aAAa,EAC1BA,GAAK,KAAK,MAAMA,EAAK,KAAK,SAAS,CACzC,CAEA,MAAMC,EAAS,GAAY,CACrB,KAAK,OAAO,aAAa,KAAK,KAAK,EACvC,KAAK,MAAQ,KACb,KAAK,SAAS,SAAS,EACvB,KAAK,QAAU,KACf,KAAK,MAAM,OAAS,KACpB,KAAK,MAAM,QAAU,KACrB,KAAK,MAAM,OAAS,GACpB,KAAK,MAAM,gBAAgB,KAAK,EAChC,QAAWC,KAAQ,KAAK,eACtBA,EAAK,QAAQ,MAAM,WAAaA,EAAK,WAEvC,KAAK,eAAiB,CAAC,EACnBD,GAAQ,KAAK,QAAQ,QAAQ,CACnC,CAEQ,YAAmB,CACzB,IAAMD,EAAM,KAAK,aAAa,EAC9B,GAAI,CAACA,GAAK,MAAQ,CAAC,KAAK,UAAW,CACjC,KAAK,QAAQ,EACb,MACF,CACI,KAAK,OAAO,aAAa,KAAK,KAAK,EACvC,KAAK,MAAQ,KACb,KAAK,MAAMA,EAAK,KAAK,SAAS,EAC9B,KAAK,QAAQ,QAAQ,CACvB,CAEQ,cAAgC,CACtC,GAAI,CACF,IAAMA,EAAM,KAAK,MAAM,gBACjBG,EAAW,KAAK,MAAM,eAAe,SAAS,MAAQ,GAC5D,MAAI,CAACH,GAAO,CAACG,GAAYA,IAAa,cAAsB,KACrDH,CACT,MAAQ,CACN,OAAO,IACT,CACF,CAEQ,MAAMA,EAAeH,EAAkC,CAI7D,GAHA,KAAK,SAAS,SAAS,EACvB,KAAK,QAAUO,GAAiC,EAChDJ,EAAI,eAAeP,EAAe,GAAG,OAAO,EACxCI,EAAU,UAAU,KAAK,EAAG,CAC9B,IAAMQ,EAAQL,EAAI,cAAc,OAAO,EACvCK,EAAM,GAAKZ,GACXY,EAAM,YAAcR,EAAU,WAC7BG,EAAI,MAAQA,EAAI,iBAAiB,YAAYK,CAAK,CACrD,CACA,KAAK,QAAQ,MAAMR,EAAU,UAAW,CAAE,KAAMG,CAAI,CAAC,CACvD,CAEQ,eAAsB,CAC5B,IAAMM,EAAa,SAAS,eAAe,kBAAkB,EAC7D,KAAK,eAAiB,MAAM,KAAK,SAAS,MAAM,UAAY,CAAC,CAAC,EAC3D,OAAQC,GAAoCA,aAAmB,aAAeA,IAAYD,CAAU,EACpG,IAAKC,GAAY,CAChB,IAAMC,EAAaD,EAAQ,MAAM,WACjC,OAAAA,EAAQ,MAAM,WAAa,SACpB,CAAE,QAAAA,EAAS,WAAAC,CAAW,CAC/B,CAAC,CACL,CAEQ,SAAgB,CAClB,KAAK,OAAO,aAAa,KAAK,KAAK,EACvC,KAAK,MAAQ,KACb,KAAK,MAAM,OAAS,KACpB,KAAK,MAAM,QAAU,KACrB,KAAK,MAAM,OAAS,GACpB,KAAK,MAAM,gBAAgB,KAAK,EAChC,KAAK,iBAAiB,EACtB,KAAK,QAAQ,SAAS,CACxB,CAEQ,kBAAyB,CAC/B,QAAWN,KAAQ,KAAK,eACtBA,EAAK,QAAQ,MAAM,WAAaA,EAAK,WAEvC,KAAK,eAAiB,CAAC,CACzB,CACF,EChHA,SAASO,GAAcC,EAAkC,CACvD,MAAO,EAAQA,GAAS,QAAQ,mBAAmB,CACrD,CAEA,SAASC,GAAYC,EAAuB,CAC1C,OAAOA,EAAM,aAAa,EAAE,KACzBC,GAASA,aAAgB,SAAWA,EAAK,KAAO,kBACnD,CACF,CAEA,SAASC,GAAkBJ,EAA2B,CACpD,OAAOA,EAAQ,gBAAkB,UAAYA,EAAQ,YAAY,IAAM,QACzE,CAEO,IAAMK,GAAN,KAAoB,CAKzB,YACmBC,EACAC,EACAC,EACAC,EACjB,CAJiB,aAAAH,EACA,cAAAC,EACA,oBAAAC,EACA,mBAAAC,EARnB,KAAQ,OAAS,GACjB,KAAQ,QAA0B,KAClC,KAAQ,SAA2B,KAmCnC,KAAQ,cAAiBP,GAAwB,CAE/C,GADI,CAAC,KAAK,QACND,GAAYC,CAAK,EAAG,OACxB,IAAMQ,EAASR,EAAM,aAAa,EAAE,CAAC,EAC/BF,EAAUU,aAAkB,QAAUA,EAAS,KACjD,CAACV,GAAW,CAACI,GAAkBJ,CAAO,GAAKD,GAAcC,CAAO,IACpE,KAAK,QAAUA,EACf,KAAK,cAAcA,CAAO,EAC5B,EAEA,KAAQ,QAAWE,GAAsB,CAEvC,GADI,CAAC,KAAK,QACND,GAAYC,CAAK,EAAG,OACxB,IAAMQ,EAASR,EAAM,aAAa,EAAE,CAAC,EAC/BF,EAAUU,aAAkB,QAAUA,EAAS,KACrD,GAAKV,EACL,IAAI,CAACI,GAAkBJ,CAAO,GAAKD,GAAcC,CAAO,EAAG,CACpDD,GAAcC,CAAO,IACxBE,EAAM,eAAe,EACrBA,EAAM,yBAAyB,EAC/B,KAAK,gBAAgB,GAEvB,MACF,CACAA,EAAM,eAAe,EACrBA,EAAM,yBAAyB,EAC/B,KAAK,SAAWF,EAChB,KAAK,QAAU,KACf,KAAK,OAAS,GACd,KAAK,cAAcA,CAAO,EAC1B,KAAK,SAASA,EAASW,GAA8BX,CAAO,CAAC,EAC7D,KAAK,eAAe,EAAK,EAC3B,EAEA,KAAQ,UAAaE,GAAyB,CAC5C,GAAIA,EAAM,MAAQ,UAAY,KAAK,OAAQ,CACzCA,EAAM,eAAe,EACrB,KAAK,UAAU,EAAK,EACpB,MACF,CACA,IAAMQ,EAASR,EAAM,OASrB,GAPEQ,aAAkB,kBAClBA,aAAkB,qBAClBA,aAAkB,mBACjBA,aAAkB,aAAeA,EAAO,mBAIvC,CAAC,KAAK,UAAY,CAAC,CAAC,UAAW,YAAa,YAAa,YAAY,EAAE,SAASR,EAAM,GAAG,EAC3F,OAEF,IAAMU,EAAOV,EAAM,MAAQ,UACvB,KAAK,SAAS,cACdA,EAAM,MAAQ,YACZ,KAAK,SAAS,kBACdA,EAAM,MAAQ,YACZ,KAAK,SAAS,uBACd,KAAK,SAAS,mBAClB,CAACU,GAAQ,CAACR,GAAkBQ,CAAI,GAAKb,GAAca,CAAI,IAC3DV,EAAM,eAAe,EACrB,KAAK,SAAWU,EAChB,KAAK,cAAcA,CAAI,EACvB,KAAK,SAASA,EAAMD,GAA8BC,CAAI,CAAC,EACzD,EAEA,KAAQ,QAAU,IAAM,CACtB,KAAK,cAAc,KAAK,OAAS,KAAK,QAAU,KAAK,QAAQ,CAC/D,EA/FE,SAAS,iBAAiB,cAAe,KAAK,cAAe,EAAI,EACjE,SAAS,iBAAiB,QAAS,KAAK,QAAS,EAAI,EACrD,SAAS,iBAAiB,UAAW,KAAK,UAAW,EAAI,EACzD,OAAO,iBAAiB,SAAU,KAAK,QAAS,EAAI,EACpD,OAAO,iBAAiB,SAAU,KAAK,OAAO,CAChD,CAEA,UAAUC,EAAuB,CAC/B,KAAK,OAASA,EACTA,IAAQ,KAAK,QAAU,MAC5B,KAAK,cAAcA,EAAS,KAAK,QAAU,KAAK,QAAQ,EACxD,KAAK,eAAeA,CAAM,CAC5B,CAEA,YAAYb,EAA+B,CACzC,KAAK,SAAWA,EAChB,KAAK,cAAc,KAAK,OAAS,KAAK,QAAUA,CAAO,CACzD,CAEA,SAAgB,CACd,SAAS,oBAAoB,cAAe,KAAK,cAAe,EAAI,EACpE,SAAS,oBAAoB,QAAS,KAAK,QAAS,EAAI,EACxD,SAAS,oBAAoB,UAAW,KAAK,UAAW,EAAI,EAC5D,OAAO,oBAAoB,SAAU,KAAK,QAAS,EAAI,EACvD,OAAO,oBAAoB,SAAU,KAAK,OAAO,CACnD,CAwEQ,cAAcA,EAA+B,CACnD,GAAI,CAACA,GAAS,YAAa,CACzB,KAAK,QAAQ,IAAI,OAAS,GAC1B,KAAK,QAAQ,MAAM,OAAS,GAC5B,MACF,CACA,IAAMc,EAAOd,EAAQ,sBAAsB,EAC3C,GAAIc,EAAK,OAAS,GAAKA,EAAK,QAAU,EAAG,CACvC,KAAK,QAAQ,IAAI,OAAS,GAC1B,KAAK,QAAQ,MAAM,OAAS,GAC5B,MACF,CACA,KAAK,QAAQ,IAAI,OAAS,GAC1B,KAAK,QAAQ,MAAM,OAAS,GAC5B,KAAK,QAAQ,IAAI,QAAQ,MAAQ,KAAK,QAAUd,IAAY,KAAK,SAAW,QAAU,WACtF,KAAK,QAAQ,IAAI,MAAM,UAAY,aAAa,KAAK,MAAMc,EAAK,IAAI,CAAC,MAAM,KAAK,MAAMA,EAAK,GAAG,CAAC,MAC/F,KAAK,QAAQ,IAAI,MAAM,MAAQ,GAAG,KAAK,MAAMA,EAAK,KAAK,CAAC,KACxD,KAAK,QAAQ,IAAI,MAAM,OAAS,GAAG,KAAK,MAAMA,EAAK,MAAM,CAAC,KAC1D,KAAK,QAAQ,MAAM,YAAcC,GAAaf,CAAO,EACrD,IAAMgB,EAAWF,EAAK,KAAO,GAAKA,EAAK,IAAM,GAAKA,EAAK,OAAS,EAChE,KAAK,QAAQ,MAAM,MAAM,UAAY,aAAa,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAK,IAAI,CAAC,CAAC,MAAM,KAAK,MAAME,CAAQ,CAAC,KAChH,CACF,EChJA,IAAMC,GAAoB,KACpBC,GAA4B,GAC5BC,GAAoB,CACxB,OACA,SACA,SACA,UACA,UACA,MACA,OACA,KACA,KACA,KACA,IACA,SACA,UACA,QACA,SACA,WACA,MACA,SACA,eACF,EAAE,KAAK,GAAG,EAqBV,SAASC,GAAkBC,EAAuB,CAChD,OAAOA,EAAM,QAAQ,OAAQ,GAAG,EAAE,KAAK,CACzC,CAEO,SAASC,GAAuBD,EAAeE,EAA0B,CAC9E,GAAI,CACF,IAAMC,EAAM,IAAI,IAAIH,EAAOE,CAAO,EAClC,OAAIC,EAAI,WAAa,SAAWA,EAAI,WAAa,UAC/CA,EAAI,SAAW,GACfA,EAAI,SAAW,GACfA,EAAI,OAAS,GACbA,EAAI,KAAO,GACJA,EAAI,SAAS,GAEf,GAAGA,EAAI,QAAQ,YACxB,MAAQ,CACN,OAAOH,EAAM,MAAM,OAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,EAAG,GAAG,CAC/C,CACF,CAEA,SAASI,GAAqBC,EAA2C,CACvE,OAAO,MAAM,KAAKA,EAAQ,UAAU,EACjC,OAAO,CAAC,CAAE,KAAAC,CAAK,IAAM,CACpB,IAAMC,EAAQD,EAAK,YAAY,EAC/B,OACEC,IAAU,MACVA,IAAU,SACVA,IAAU,QACVA,IAAU,OACVA,IAAU,OACVA,IAAU,SACVA,IAAU,QACVA,IAAU,QACVA,IAAU,QACVA,EAAM,WAAW,OAAO,GACxBA,IAAU,eACVA,IAAU,mBACVA,IAAU,iBAEd,CAAC,EACA,IAAI,CAAC,CAAE,KAAAD,EAAM,MAAAN,CAAM,IAAM,CACxBM,EACAA,EAAK,YAAY,IAAM,QAAUA,EAAK,YAAY,IAAM,MACpDL,GAAuBD,EAAOK,EAAQ,cAAc,OAAO,EAC3DL,EAAM,MAAM,EAAG,GAAG,CACxB,CAAC,CACL,CAEA,SAASQ,GAAiBH,EAA0B,CAClD,IAAMI,EAAMJ,EAAQ,QAAQ,YAAY,EAClCK,EAAaN,GAAqBC,CAAO,EAC5C,IAAI,CAAC,CAACC,EAAMN,CAAK,IAAM,GAAGM,CAAI,IAAI,KAAK,UAAUN,CAAK,CAAC,EAAE,EACzD,KAAK,GAAG,EACLW,EACJN,aAAmB,kBACnBA,aAAmB,qBACnBA,aAAmB,kBACf,GACAN,GAAkBM,EAAQ,aAAe,EAAE,EAAE,MAAM,EAAG,GAAG,EAC/D,MAAO,IAAII,CAAG,GAAGC,EAAa,IAAIA,CAAU,GAAK,EAAE,IAAIC,CAAI,KAAKF,CAAG,GACrE,CAEO,SAASG,GACdC,EAAyB,SACjB,CACR,IAAMC,EAAQ,CACZ,OAAOb,GAAuBY,EAAa,UAAU,MAAQ,EAAE,CAAC,GAChE,SAASd,GAAkBc,EAAa,OAAS,EAAE,CAAC,EACtD,EACME,EAAO,IAAI,IACjB,QAAWV,KAAW,MAAM,KAC1BQ,EAAa,iBAAiBf,EAAiB,CACjD,EACE,GAAI,EAAAiB,EAAK,IAAIV,CAAO,GAAKA,EAAQ,KAAO,sBACxCU,EAAK,IAAIV,CAAO,EAChBS,EAAM,KAAKN,GAAiBH,CAAO,CAAC,EAChCS,EAAM,KAAK;AAAA,CAAI,EAAE,QAAUlB,IAAmB,MAEpD,OAAOkB,EAAM,KAAK;AAAA,CAAI,EAAE,MAAM,EAAGlB,EAAiB,CACpD,CAEA,SAASoB,GAAchB,EAAiC,CACtD,GAAI,CAACA,GAAS,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,EAAG,OAAO,KACxE,IAAMiB,EAAWjB,EACjB,OAAO,OAAOiB,EAAS,UAAa,UAClC,OAAOA,EAAS,QAAW,SACzBA,EACA,IACN,CAEA,SAASC,GAAWC,EAAiBC,EAA2B,CAC9D,OAAKA,EAAU,KAAK,EACfD,EAAQ,KAAK,EACX,GAAGA,EAAQ,QAAQ,CAAC;AAAA;AAAA,EAAOC,EAAU,UAAU,CAAC,GAD3BA,EADED,CAGhC,CAEO,SAASE,GAA6BC,EAMzB,CAClB,IAAMF,EAAY,MAAM,QAAQE,EAAM,kBAAkB,EACpDA,EAAM,mBAAmB,IAAIN,EAAa,EAAE,OAAQhB,GAA6B,EAAQA,CAAM,EAC/F,CAAC,EACCuB,EACJ,OAAOD,EAAM,cAAiB,SAAWA,EAAM,aAAe,GAC1DE,EACJ,OAAOF,EAAM,aAAgB,SAAWA,EAAM,YAAc,GAC9D,OAAIA,EAAM,gBAAkB,UACnB,CAAE,UAAWF,EAAW,UAAAG,EAAW,SAAAC,CAAS,EAE9C,CACL,UAAWJ,EAAU,OACnB,CAACK,EAAWR,IAAaS,GAAeD,EAAWR,CAAQ,EAC3DK,EAAM,OACR,EAAE,UACF,UAAWJ,GAAWI,EAAM,QAAQ,UAAWC,CAAS,EACxD,SAAUL,GAAWI,EAAM,QAAQ,SAAUE,CAAQ,CACvD,CACF,CAEA,SAASG,GAAaC,EAAkBC,EAAwB,CAC9D,GAAID,GAAW,OAAOA,GAAY,SAAU,CAC1C,IAAME,EAASF,EAAgC,MAC/C,GAAI,OAAOE,GAAU,UAAYA,EAAM,KAAK,EAAG,OAAOA,EAAM,KAAK,CACnE,CACA,MAAO,4BAA4BD,CAAM,GAC3C,CAEA,eAAsBE,GAAsBT,EAYV,CAEhC,IAAMU,EAAW,MADCV,EAAM,WAAa,OAEnC,IAAI,IACF,wBAAwB,mBAAmBA,EAAM,QAAQ,GAAG,CAAC,YAC7DA,EAAM,SACR,EACA,CACE,OAAQ,OACR,YAAa,OACb,MAAO,WACP,eAAgB,cAChB,OAAQA,EAAM,OACd,QAAS,CACP,cAAe,UAAUA,EAAM,QAAQ,MAAM,GAC7C,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAU,CACnB,OAAQA,EAAM,OACd,YAAaA,EAAM,YACnB,WAAYV,GAAwBU,EAAM,YAAY,EACtD,YACEA,EAAM,aACN,uBAAuBrB,GAAuBqB,EAAM,QAAQ,SAAS,CAAC,GACxE,kBAAmBA,EAAM,UAAU,UACnC,kBAAmBA,EAAM,UAAU,UACnC,iBAAkBA,EAAM,UAAU,SAClC,aAAcA,EAAM,aAAa,MAAM,CAACzB,EAAyB,EACjE,gBAAiByB,EAAM,iBAAmB,MAC5C,CAAC,CACH,CACF,EACMM,EAAW,MAAMI,EAAS,KAAK,EAAE,MAAM,IAAM,IAAI,EAGvD,GAAI,CAACA,EAAS,IAAM,CAACJ,EACnB,MAAM,IAAI,MAAMD,GAAaC,EAASI,EAAS,MAAM,CAAC,EAExD,IAAMC,EACJL,EAAQ,gBAAkB,UAAY,UAAY,SAC9CH,EAAYJ,GAA6B,CAC7C,QAASC,EAAM,UACf,mBAAoBM,EAAQ,UAC5B,aAAcA,EAAQ,UACtB,YAAaA,EAAQ,SACrB,cAAAK,CACF,CAAC,EACKC,GACH,MAAM,QAAQN,EAAQ,SAAS,EAAIA,EAAQ,UAAU,OAAS,IAC9D,OAAOA,EAAQ,WAAc,UAAYA,EAAQ,UAAU,KAAK,EAAI,EAAI,IACxE,OAAOA,EAAQ,UAAa,UAAYA,EAAQ,SAAS,KAAK,EAAI,EAAI,GACzE,MAAO,CACL,UAAAH,EACA,YACE,OAAOG,EAAQ,aAAgB,UAAYA,EAAQ,YAAY,KAAK,EAChEA,EAAQ,YAAY,KAAK,EACzBM,EACE,wDACA,kCACR,cAAAA,EACA,cAAAD,CACF,CACF,CC3PO,IAAME,GAAQ,CACnB,QAAS,+CACT,KAAM,uEACN,KAAM,qEACN,QAAS,mFACT,OAAQ,8EACR,MAAO,2EACP,QAAS,yHACT,OAAQ,iIACR,SAAU,uFACV,QAAS,wDACT,KAAM,kCACN,KAAM,gBACN,UAAW,4CACX,MAAO,iBACP,EAAG,uBACH,MAAO,eACP,MAAO,eACP,QAAS,2EACT,SAAU,2EACV,KAAM,8BACN,MAAO,mDACP,IAAK,8EACL,MAAO,4FACP,MAAO,uFACP,KAAM,kBACN,IAAK,YACP,EAIO,SAASC,EAAKC,EAAgBC,EAAO,GAAIC,EAAQ,GAAY,CAClE,MAAO,eAAeD,CAAI,aAAaA,CAAI,gJAAgJC,CAAK,aAAaJ,GAAME,CAAI,CAAC,WAC1N,CAEA,IAAIG,GAAiB,EAGd,SAASC,EAAaH,EAAO,GAAII,EAAQ,OAAgB,CAC9D,IAAMC,EAAK,gBAAgB,EAAEH,EAAc,GAC3C,MAAO,eAAeF,CAAI,aAAaA,CAAI;AAAA,sBACvBK,CAAE;AAAA,sMAC8KD,CAAK,oCAAoCC,CAAE;AAAA;AAAA,SAGjP,CAEO,SAASC,EAAIC,EAAuB,CACzC,OAAOA,EACJ,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,CAC3B,CAEO,IAAMC,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EC7CvB,IAAMC,GAAa,IACbC,GAAa,GACbC,GAAuB,IAEvBC,GAAW;AAAA,mDACkCH,EAAU;AAAA,mBAC1CC,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oDAYuBD,EAAU;AAAA,yDACLC,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAyIdD,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0DzDI,GAAuB,CAC3B,iDACA,2CACA,gCACF,EAEA,SAASC,GAAcC,EAA4B,CACjD,IAAMC,EAASC,GAAwBF,EAAS,QAAQ,EACxD,OAAQA,EAAS,OAAQ,CACvB,IAAK,OACL,IAAK,UACH,MAAO,GAAGC,CAAM,YAAOD,EAAS,MAAQ,IAAI,KAAK,EAAE,MAAM,EAAG,EAAE,CAAC,SACjE,IAAK,OACH,MAAO,GAAGC,CAAM,qBAClB,IAAK,YAAa,CAChB,IAAME,EAAQ,CACZ,GAAIH,EAAS,UAAY,CAACA,EAAS,UAAU,IAAI,EAAI,CAAC,EACtD,GAAG,OAAO,KAAKA,EAAS,YAAc,CAAC,CAAC,CAC1C,EACA,OAAIG,EAAM,SAAS,KAAK,EAAU,GAAGF,CAAM,kBACpC,GAAGA,CAAM,KAAKE,EAAM,KAAK,IAAI,GAAK,WAAW,UACtD,CACA,IAAK,QACL,IAAK,WACH,MAAO,GAAGF,CAAM,kBAClB,IAAK,SACH,MAAO,GAAGA,CAAM,YAClB,IAAK,eACL,IAAK,cACH,MAAO,GAAGA,CAAM,kBAClB,QACE,MAAO,GAAGA,CAAM,WACpB,CACF,CAEA,SAASC,GAAwBE,EAA0B,CAEzD,OADaA,EAAS,MAAM,UAAU,EAAE,OAAO,OAAO,EAAE,IAAI,GAAKA,GACrD,MAAM,EAAG,EAAE,GAAK,SAC9B,CAEA,SAASC,GAAeC,EAAoC,CAC1D,OAAIA,EAAM,YAAc,SAAiB,SACrCA,EAAM,YAAc,QAAgB,QACpCA,EAAM,YAAc,WAAmB,WACvCA,EAAM,YAAc,QAAgB,SACnCA,EAAM,UACJ,UADsB,SAE/B,CAEA,SAASC,GAAaD,EAA4B,CAChD,IAAME,EAASH,GAAeC,CAAK,EAC7BG,EACJD,IAAW,UAAY,kBACrBA,IAAW,SAAW,eACtBA,IAAW,QAAU,QACrBA,IAAW,SAAW,cACtBA,IAAW,WAAa,WACxB,sBACEE,EACJF,IAAW,UAAYA,IAAW,UAAYG,EAAK,UAAW,GAAI,cAAc,EAC9EH,IAAW,QAAUG,EAAK,QAAS,EAAE,EACrCH,IAAW,UAAYG,EAAK,MAAO,EAAE,EACrCA,EAAK,QAAS,EAAE,EAKpB,MAAO,0BADWH,IAAW,UAAY,SAAWA,CACV,sCAAsCE,CAAQ,GAAGD,CAAK,GAJlFD,IAAW,SACrB,8EACA,EAEoG,SAC1G,CAEA,SAASI,GAAoBN,EAAmC,CAC9D,IAAMO,EAAuBP,EAAM,UAAU,UAAU,IAAI,CAACN,EAAUc,KAAmB,CACvF,KAAM,WACN,SAAUd,EAAS,SACnB,cAAAc,EACA,MAAOf,GAAcC,CAAQ,EAC7B,OAAQA,EAAS,SACjB,OAAQ,WACR,MAAO,EACT,EAAE,EACF,OAAIM,EAAM,UAAU,UAAU,KAAK,GACjCO,EAAM,KAAK,CACT,KAAM,MACN,SAAU,KACV,cAAe,KACf,MAAO,aACP,OAAQ,GAAGP,EAAM,UAAU,UAAU,KAAK,EAAE,MAAM;AAAA,CAAI,EAAE,MAAM,SAC9D,OAAQ,OACR,MAAO,EACT,CAAC,EAECA,EAAM,UAAU,SAAS,KAAK,GAChCO,EAAM,KAAK,CACT,KAAM,KACN,SAAU,KACV,cAAe,KACf,MAAO,oBACP,OAAQ,gCACR,OAAQ,OACR,MAAOP,EAAM,cACf,CAAC,EAEIO,CACT,CAEA,SAASE,GACPC,EACAC,EAC0C,CAC1C,IAAMC,EAAa,IAAI,IACrBF,EAAO,UAAU,IAAKhB,GAAa,KAAK,UAAUA,CAAQ,CAAC,CAC7D,EACMmB,EAAUF,EAAM,UACnB,OAAQjB,GAAa,CAACkB,EAAW,IAAI,KAAK,UAAUlB,CAAQ,CAAC,CAAC,EAC9D,IAAKA,IAAc,CAClB,MAAOD,GAAcC,CAAQ,EAC7B,OAAQA,EAAS,QACnB,EAAE,EACJ,OAAIiB,EAAM,UAAU,KAAK,IAAMD,EAAO,UAAU,KAAK,GACnDG,EAAQ,KAAK,CAAE,MAAO,qBAAsB,OAAQ,sBAAuB,CAAC,EAE1EF,EAAM,SAAS,KAAK,IAAMD,EAAO,SAAS,KAAK,GACjDG,EAAQ,KAAK,CAAE,MAAO,4BAA6B,OAAQ,kBAAmB,CAAC,EAE1EA,CACT,CAEA,SAASC,GAAcC,EAAyB,CAC9C,IAAMC,EAAI,KAAK,MAAMD,EAAU,EAAE,EAC3BE,EAAI,KAAK,IAAI,EAAG,KAAK,MAAMF,EAAU,EAAE,CAAC,EAC9C,MAAO,GAAGC,CAAC,IAAI,OAAOC,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,EAC3C,CAIO,SAASC,GACdC,EACAC,EACY,CACZ,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,YAAcC,GAAU/B,GAC9B,IAAMgC,EAAS,SAAS,cAAc,KAAK,EACrCC,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,OACjB,IAAMC,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,UAAY,aAChBA,EAAI,OAAS,GACb,IAAMtB,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,eAClBA,EAAM,OAAS,GACf,IAAMuB,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,UAAY,SACnBA,EAAO,OAAS,GAChB,IAAMC,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,OACjBR,EAAO,OAAOE,EAAOG,EAAMD,EAAQE,EAAKtB,EAAOuB,EAAQC,CAAI,EAE3D,IAAMC,EAAUR,EAAW,QACrBS,GAAc,IAAM,CACxB,GAAI,CACF,OAAO,IAAI,IAAID,EAAQ,SAAS,EAAE,IACpC,MAAQ,CACN,OAAOA,EAAQ,aAAa,QAAQ,eAAgB,EAAE,CACxD,CACF,GAAG,EACGE,GAAc,IAAM,CACxB,GAAI,CACF,IAAMC,EAAM,IAAI,IAAIH,EAAQ,SAAS,EACrC,OAAOG,EAAI,SAAWA,EAAI,MAC5B,MAAQ,CACN,OAAO,IACT,CACF,GAAG,EACGC,EAAkBJ,EAAQ,gBAAgB,KAAK,GAAK,iBACpDK,GAAyBC,GAC7B,GAAGd,EAAW,SAAS,UAAU,mBAAmBQ,EAAQ,YAAY,CAAC,eAAe,mBAAmBM,CAAW,CAAC,GACnHC,GAAqB,IACzB,KAAK,IAAI,EAAG,KAAK,OAAO,KAAK,MAAMP,EAAQ,SAAS,EAAI,KAAK,IAAI,GAAK,GAAI,CAAC,EAGzEQ,EAAchB,EAAW,SAAS,EAClCiB,EAAqB,WACrBC,GAAyB,MACzBC,GAAY,GACZC,GAAY,GACZC,EAAS,GACTC,EAAc,GACdC,EAAqC,YACrCC,EAA6BR,EAAY,iBACzCS,EAA0BT,EAAY,gBACtCU,GAAaV,EAAY,eAAe,EACxCA,EAAY,iBACZW,GAA8C,UAC9CC,EAAgC,UAAU,SAAW,GAAQ,UAAY,YACzEC,EAA0C,KAC1CC,GAAe,GACfC,EAAmC,KACnCC,EAAe,GACfC,GAAgB,GAChBC,GAAe,GACfC,GAA2C,KAC3CC,GAAkB,EAClBC,GAA6B,KAC7BC,GAAcvB,GAAmB,GAAK7C,GACtCqE,EAAW,GACXC,GAAY,EACVC,EAA0B,CAAC,EAC3BC,GAAgD,CAAC,EAEjDC,GAAQ,OAAO,OAAO,YAAe,WACvC,OAAO,WAAW,oBAAoB,EACtC,KACJtB,EAASsB,IAAO,SAAW,GAE3B,IAAMC,GAAgB,IAAIC,GACxBC,GAAkB,EACjBC,GAAgB,CACf/C,EAAW,eAAe+C,CAAW,CACvC,CACF,EACA/C,EAAW,oBAAoB4C,EAAa,EAE5C,SAASE,IAAuC,CAC9C,OAAAxC,EAAO,UAAY;AAAA,+KACwJrB,EAAK,IAAK,EAAE,CAAC;AAAA,2CACjJ+D,EAAwB;AAAA;AAAA,YAGxD1C,EAAO,cAAc,QAAQ,CACtC,CAEA,IAAM2C,GAAQ3C,EAAO,cAAc,QAAQ,EACrC4C,GAAW5C,EAAO,cAA2B,kBAAkB,EAE/D6C,EAAS,IAAIC,GACjB,CAAE,IAAA/C,EAAK,MAAAtB,CAAM,EACb,CAACsE,EAAS3E,IAAa,CACrBsB,EAAW,cAAcqD,EAAS3E,CAAQ,EAC1CyE,EAAO,YAAYE,CAAO,EAC1B7B,EAAc9C,EACd+C,EAAWC,GAAa2B,CAAO,EAC/BpC,EAAW,WACPI,IAAQD,GAAY,IACxBkC,EAAO,CACT,EACCC,GAAW,CACVvD,EAAW,gBAAgBuD,CAAM,EACjCD,EAAO,CACT,EACA,IAAM,CACJzB,EAAS,cACTyB,EAAO,CACT,CACF,EAGME,GAAaC,GACjB,4BAA4BxE,EAAK,MAAO,EAAE,CAAC,GAAGwE,EAAU,QAAU,sCAAiC,UAE/FC,GAAW,IACf9B,IAAS,UACL,oIACA,GAEA+B,GAAkB,IAAM,CAC5B,IAAMC,EAAO7C,GAAmB,EAChC,OAAI6C,GAAQ1F,GACH,qEAAqEe,EAAK,QAAS,EAAE,CAAC,2CAA2CS,GAAckE,CAAI,CAAC,kGAEtJ,oGAAiG,KAAK,MAAMA,EAAO,EAAE,CAAC,kBAC/H,EAEMC,GAAyBJ,GAAqB,CAClD,IAAMK,EAAU9C,EAAY,UACtB+C,EAAcD,GAAS,MAAQ,YAC/BE,GAAWD,EAAY,KAAK,EAAE,CAAC,GAAK,KAAK,YAAY,EACrDE,EAAO3C,EACT;AAAA;AAAA,YAEId,EAAQ,WAAW,IAAK0D,GAAc,CACtC,IAAMC,EAAKD,EAAU,KAAOJ,GAAS,GAC/BM,EAAOF,EAAU,MAAQA,EAAU,MAAQ,YAC3CG,GAAYD,EAAK,KAAK,EAAE,CAAC,GAAK,KAAK,YAAY,EACrD,MAAO,uEAAuED,CAAE,kDAAkDG,EAAIJ,EAAU,EAAE,CAAC;AAAA,qDAC1GI,EAAID,CAAQ,CAAC;AAAA,mDACfC,EAAIF,CAAI,CAAC,0BAA0BD,EAAK,GAAGjF,GAAoB8B,CAAW,EAAE,MAAM,UAAU9B,GAAoB8B,CAAW,EAAE,SAAW,EAAI,GAAK,GAAG,YAAc,OAAO;AAAA,gBAC5MmD,EAAKlF,EAAK,QAAS,EAAE,EAAI,EAAE;AAAA,sBAEjC,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,gBAEb,GACJ,MAAO;AAAA,kHACuGqC,CAAW,4BAA4BgD,EAAIP,CAAW,CAAC;AAAA,+CAC1HO,EAAIN,CAAO,CAAC;AAAA,UACjDP,EAAU,GAAK,uBAAuBa,EAAIP,CAAW,CAAC,SAAS;AAAA,UAC/D9E,EAAK,QAAS,EAAE,CAAC;AAAA;AAAA,QAEnBgF,CAAI;AAAA,WAEV,EAEMM,GAAiB,IAAM,CAC3B,IAAMC,EAAgBxD,EAAY,WAAW,MAAQ,YACrD,MAAO;AAAA,yDAC8CO,IAAa,UAAU;AAAA,yDACvBA,IAAa,WAAW,iDAAiD+C,EAAIE,CAAa,CAAC;AAAA,WAElJ,EAEMC,GAAgB,IAAM;AAAA,kEACoC9C,KAAe,SAAS,qGAAqG1C,EAAK,UAAW,EAAE,CAAC;AAAA,kEAChJ0C,KAAe,QAAQ,2HAAsH1C,EAAK,SAAU,EAAE,CAAC;AAAA,kEAC/J0C,KAAe,QAAQ,2HAAsH1C,EAAK,QAAS,EAAE,CAAC;AAAA,UAGxNyF,GAAe,IAAM;AAAA,8FACiE1D,EAAY,QAAU,GAAK,UAAU,IAAI/B,EAAK,OAAQ,EAAE,CAAC;AAAA,8FACzD+B,EAAY,QAAU,GAAK,UAAU,IAAI/B,EAAK,OAAQ,EAAE,CAAC;AAAA,UAG/I0F,GAAW,IAAM,CACrB,IAAMC,EAAQ1F,GAAoB8B,CAAW,EAAE,OACzC6D,EAAM,CAACC,EAAcC,EAAmB/F,EAAkBgG,IAC9D,+DAA+D/D,IAAa6D,CAAE,iCAAiCA,CAAE,KAAK9F,CAAQ,GAAG+F,CAAS,GAAGC,EAAQ,uBAAuBA,CAAK,UAAY,EAAE,YACjM,MAAO;AAAA,QACHH,EAAI,WAAY,WAAYI,EAAa,GAAIhE,IAAa,WAAa,OAAS,wBAAwB,CAAC,CAAC;AAAA,QAC1G4D,EAAI,OAAQ,OAAQ5F,EAAK,SAAU,EAAE,CAAC,CAAC;AAAA,QACvC4F,EAAI,UAAW,UAAW5F,EAAK,UAAW,EAAE,EAAG2F,CAAK,CAAC;AAAA,WAE3D,EAEMM,GAAc,CAACC,EAAmBJ,IACtC,0BAA0B9F,EAAK,YAAa,EAAE,CAAC,sBAAsBqF,EAAIS,CAAS,CAAC,UAAUI,EAAW,GAAK,yNAAyNlG,EAAK,IAAK,EAAE,CAAC,WAAW,UAE1VmG,GAAoB,IAAM,CAC9B,IAAMC,EAAerE,EAAY,aAC3BsE,EAAS9D,GAAeC,EAC1B,yCAAyCyD,GAAY,GAAOzD,CAAQ,CAAC,GACrE,uCAAuC4D,EAAe,UAAY,MAAM,kCAAkCpG,EAAK,UAAW,EAAE,CAAC,GAAGoG,EAAe,oCAAiC,qBAAqB,0FAEnME,EAAQ9C,EAAO,SAAW,EAC1B+C,EAAY;AAAA,6CACuBP,EAAa,EAAE,CAAC;AAAA;AAAA;AAAA,0BAGnC7G,GAAqB,IAAKqH,GAAe,8DAA8DnB,EAAImB,CAAU,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;AAAA,YAG3JC,EAAWjD,EAAO,IAAKkD,GAAY,CACvC,GAAIA,EAAQ,OAAS,OACnB,MAAO,yBAAyBA,EAAQ,SAAW,qBAAqB1G,EAAK,YAAa,EAAE,CAAC,IAAIqF,EAAIqB,EAAQ,QAAQ,CAAC,UAAY,EAAE,uBAAuBrB,EAAIqB,EAAQ,IAAI,CAAC,eAE9K,GAAIA,EAAQ,QAAU,UACpB,MAAO;AAAA,8BACeV,EAAa,EAAE,CAAC,wBAAwBU,EAAQ,MAAQ,sHAAsHA,EAAQ,EAAE,KAAK1G,EAAK,OAAQ,EAAE,CAAC,gBAAkB,EAAE;AAAA,gEAC/L0G,EAAQ,MAAM,IAAI,CAACC,EAAMC,KAAU,CACvF,IAAMjH,EAAQiH,GAAQF,EAAQ,KAAO,OAASE,KAAUF,EAAQ,KAAO,MAAQ,OACzEG,GAAOlH,IAAU,OAASK,EAAK,QAAS,EAAE,EAAIL,IAAU,MAAQK,EAAK,UAAW,GAAI,cAAc,EAAI,iCAC5G,MAAO,oBAAoBL,CAAK,KAAKkH,EAAI,GAAGxB,EAAIsB,CAAI,CAAC,QACvD,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,gBAGf,GAAID,EAAQ,QAAU,SACpB,MAAO;AAAA,8BACe1G,EAAK,QAAS,EAAE,CAAC;AAAA,eAChCqF,EAAIqB,EAAQ,OAAS,uBAAuB,CAAC;AAAA,wGAC4CA,EAAQ,EAAE,KAAK1G,EAAK,UAAW,EAAE,CAAC;AAAA,gBAGpI,GAAI0G,EAAQ,QAAU,cACpB,MAAO;AAAA,8BACe1G,EAAK,QAAS,EAAE,CAAC;AAAA,eAChCqF,EAAIqB,EAAQ,OAAS,+BAA+B,CAAC;AAAA,0GACsCA,EAAQ,EAAE,KAAK1G,EAAK,UAAW,EAAE,CAAC,6FAA6FA,EAAK,UAAW,EAAE,CAAC;AAAA,gBAGtP,IAAM2F,EAAQe,EAAQ,QAAQ,OACxBI,EAAUC,GAAWL,CAAO,EAClC,MAAO;AAAA,4BACe1G,EAAK,QAAS,EAAE,CAAC,IAAI2F,IAAU,EAAI,gBAAkB,QAAQA,CAAK,UAAU;AAAA,6BAC3Ee,EAAQ,QAAQ,IAAKM,GAAW,qBAAqBhB,EAAa,EAAE,CAAC,mBAAmBX,EAAI2B,EAAO,KAAK,CAAC,qBAAqB3B,EAAI2B,EAAO,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,2FAElHN,EAAQ,EAAE,KAAKI,EAAU,GAAK,UAAU,IAAI9G,EAAK,OAAQ,EAAE,CAAC,GAAG0G,EAAQ,OAAS,SAAW,WAAW;AAAA,mFAC9G1G,EAAK,UAAW,EAAE,CAAC;AAAA;AAAA;AAAA,aAIlG,CAAC,EAAE,KAAK,EAAE,EAEJiH,EAAczE,EAChB,gCAAgCA,EAAS,YAAY,CAAC,IACtD,0BAEJ,MAAO;AAAA,4BACiB6D,CAAM;AAAA,8CACYC,EAAQC,EAAYE,CAAQ;AAAA;AAAA;AAAA,yGAG+BpB,EAAI4B,CAAW,CAAC,mDAAmDhE,GAAe,WAAa,EAAE,IAAIoC,EAAIrC,EAAa,CAAC;AAAA,sGAC1HC,IAAgB,CAAClB,EAAY,UAAY,WAAa,EAAE,IAAI/B,EAAK,OAAQ,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,WAKhL,EAEMkH,GAAgB,IAAM,CAC1B,IAAMC,EAAU;AAAA;AAAA,+HAE2G9B,EAAItD,EAAY,UAAU,SAAS,CAAC;AAAA;AAAA;AAAA,6BAGtI/B,EAAK,QAAS,EAAE,CAAC;AAAA,YAEpCoH,EAAS;AAAA;AAAA,qIAEkH/B,EAAItD,EAAY,UAAU,QAAQ,CAAC;AAAA;AAAA,yCAE/H/B,EAAK,QAAS,EAAE,CAAC;AAAA;AAAA,sEAEYA,EAAK,OAAQ,EAAE,CAAC;AAAA;AAAA,QAE9E+B,EAAY,eAAiB,qDAAqD/B,EAAK,QAAS,GAAI,8BAA8B,CAAC,6EAA+E,EAAE;AAAA,YAExN,MAAO;AAAA;AAAA;AAAA,6DAGkDiC,KAAa,KAAK,6CAA6CjC,EAAK,SAAU,EAAE,CAAC;AAAA,6DACjFiC,KAAa,IAAI,4CAA4CjC,EAAK,OAAQ,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,QAIlIiC,KAAa,MAAQkF,EAAUC,CAAM;AAAA;AAAA,WAG3C,EAEMC,GAAmB,IAAM,CAC7B,IAAMnH,EAAQD,GAAoB8B,CAAW,EACvCuF,EAAOpH,EAAM,IAAI,CAACqH,EAAMX,IAAU;AAAA,iCACXW,EAAK,SAAW,WAAa,mBAAqB,aAAa,KAAKA,EAAK,SAAW,WAAavB,EAAa,EAAE,EAAIhG,EAAKuH,EAAK,OAAS,MAAQ,SAAW,OAAQ,EAAE,CAAC;AAAA;AAAA,yBAE7KlC,EAAIkC,EAAK,KAAK,CAAC;AAAA,yBACflC,EAAIkC,EAAK,MAAM,CAAC,SAAMA,EAAK,SAAW,WAAa,WAAa,MAAM,GAAGA,EAAK,MAAQ,4CAA2C,EAAE;AAAA;AAAA,qFAEvEA,EAAK,IAAI,iBAAiBA,EAAK,eAAiBX,CAAK,gCAAgCvB,EAAIkC,EAAK,KAAK,CAAC,KAAKvH,EAAK,IAAK,EAAE,CAAC;AAAA,WAChM,EAAE,KAAK,EAAE,EACVwH,EAAe,KAAK,UACxB,CACE,UAAWzF,EAAY,WAAW,MAAQ,KAC1C,aAAcA,EAAY,WAAW,cAAgB,KACrD,WAAYA,EAAY,UAAU,UAClC,UAAWA,EAAY,UAAU,WAAa,KAC9C,SAAUA,EAAY,UAAU,UAAY,IAC9C,EACA,KACA,CACF,EACA,MAAO;AAAA,8CACmC7B,EAAM,MAAM,UAAUA,EAAM,SAAW,EAAI,GAAK,GAAG,wBAAwBN,GAAamC,CAAW,CAAC;AAAA,QAC1I7B,EAAM,SAAW,EACf,2FACA,yBAAyBoH,CAAI,QAAQ;AAAA;AAAA,4FAE6CvE,CAAY,KAAK/C,EAAK+C,EAAe,QAAU,QAAS,EAAE,CAAC;AAAA,UAC7IA,EAAe,gEAAgEsC,EAAImC,CAAY,CAAC,SAAW,EAAE;AAAA;AAAA,gCAEvFjD,GAAU,EAAK,CAAC;AAAA;AAAA,WAG9C,EAEMkD,GAAgB,IACpBzF,IAAa,WAAamE,GAAkB,EAC1CnE,IAAa,OAASkF,GAAc,EACpCG,GAAiB,EAEfK,GAAW,IACXxF,GACK;AAAA,UACH8D,EAAa,EAAE,CAAC;AAAA,sGAC4EhG,EAAK,WAAY,EAAE,CAAC;AAAA;AAAA,+CAE3E+B,EAAY,aAAe,SAAW,EAAE,iEAAiE/B,EAAK,UAAW,EAAE,CAAC;AAAA;AAAA,mCAExI2C,CAAI,sBAAsBA,IAAS,YAAc,KAAO,KAAK,YAAYA,IAAS,YAAc,GAAK,SAAS;AAAA,cAGtI;AAAA;AAAA;AAAA,YAGCqD,EAAa,EAAE,CAAC;AAAA;AAAA,2CAEeX,EAAI1D,CAAe,CAAC,KAAK0D,EAAI1D,CAAe,CAAC;AAAA,qDACtC0D,EAAI7D,CAAU,CAAC;AAAA;AAAA,4GAE2CxB,EAAK,WAAY,EAAE,CAAC;AAAA;AAAA;AAAA,YAGpH4E,GAAsB,EAAK,CAAC;AAAA,YAC5BL,GAAU,EAAI,CAAC;AAAA;AAAA,YAEf3E,GAAamC,CAAW,CAAC;AAAA;AAAA,UAE3BY,IAAS,YAAc,wBAAwB8B,GAAS,CAAC,SAAW,EAAE;AAAA;AAAA;AAAA,UAGtEgB,GAAa,CAAC;AAAA,UACdH,GAAe,CAAC;AAAA;AAAA,UAEhBE,GAAc,CAAC;AAAA;AAAA,QAEjBE,GAAS,CAAC;AAAA,QACV+B,GAAc,CAAC;AAAA;AAAA,UAEb/C,GAAgB,CAAC;AAAA;AAAA,uEAE4C1E,EAAK,QAAS,EAAE,CAAC;AAAA;AAAA,YAKhF2H,GAAY,IAAM,CACtB,IAAMC,EAAS;AAAA,QACX5B,EAAa,EAAE,CAAC;AAAA,QAChBpB,GAAsB,EAAI,CAAC;AAAA,QAC3BL,GAAU,EAAI,CAAC;AAAA;AAAA,QAEf3E,GAAamC,CAAW,CAAC;AAAA,YAE7B,OAAKI,GAME;AAAA;AAAA,QAEHyF,CAAM;AAAA;AAAA,UAEJnC,GAAa,CAAC;AAAA,UACdH,GAAe,CAAC;AAAA,UAChBZ,GAAgB,CAAC;AAAA;AAAA,0EAE+C1E,EAAK,QAAS,EAAE,CAAC;AAAA;AAAA,QAEnF0F,GAAS,CAAC;AAAA,QACV+B,GAAc,CAAC;AAAA,YAhBV;AAAA;AAAA,UAEHG,CAAM;AAAA,aAgBd,EAEMC,GAAW,IAAM,CACrB,IAAMC,EAAa/F,EAAY,aACzBgG,EAAoB,CAAC,EAC3B,OAAInF,IAAW,eACbmF,EAAQ,KAAK,gDAAgD/H,EAAK,QAAS,EAAE,CAAC,2MAA2M,EAEvR4C,IAAW,UACbmF,EAAQ,KAAK,gDAAgD/H,EAAK,QAAS,EAAE,CAAC,uCAAuCqF,EAAI,SAAS,SAAW,SAAS,MAAM,CAAC,4BAA4BA,EAAI5D,GAAc,EAAE,CAAC,0OAA0O,EAEtbkB,IAAS,WACXoF,EAAQ,KAAK,iDAAiD/H,EAAK,UAAW,EAAE,CAAC,qHAAqH,EAEjM,GAAG8H,EAAa,sFAAsF9H,EAAK,UAAW,EAAE,CAAC,iIAAgI,EAAE;AAAA,MAChQ+H,EAAQ,OAAS,uBAAuBD,EAAa,QAAU,EAAE,KAAKC,EAAQ,KAAK,EAAE,CAAC,SAAW,EAAE;AAAA,MACnGzF,IAAa,WAAa,gCAAgCtC,EAAK,MAAO,EAAE,CAAC,2GAAsGqF,EAAItD,EAAY,WAAW,MAAQ,WAAW,CAAC,kBAAoB,EAAE,EACxP,EAEMiG,GAAY,IAAM,CACtB,GAAIjG,EAAY,YAAc,WAC5B,MAAO;AAAA,wDAC2C/B,EAAK,QAAS,EAAE,CAAC;AAAA;AAAA,mFAEUqF,EAAItD,EAAY,WAAW,MAAQ,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA,oBAMnI,GAAIe,IAAU,UAAW,CACvB,IAAMmF,EAAW7E,GACb,GAAG,KAAK,IAAI,EAAG,KAAK,OAAO,KAAK,IAAI,EAAIA,IAAe,GAAI,CAAC,CAAC,eAC7D,KACJ,MAAO;AAAA,0DAC6CpD,EAAK,QAAS,EAAE,CAAC;AAAA;AAAA,uDAEpBiI,EAAW,2DAA2DA,CAAQ,qCAAkC,mCAAmC;AAAA;AAAA;AAAA,+LAGXjI,EAAK,WAAY,EAAE,CAAC;AAAA,mBAE/M,CACA,GAAI8C,IAAU,OAAQ,CACpB,IAAM5C,EAAQD,GAAoB8B,CAAW,EAC7C,MAAO;AAAA,sDACyC/B,EAAK,QAAS,EAAE,CAAC;AAAA;AAAA,eAExDE,EAAM,MAAM,UAAUA,EAAM,SAAW,EAAI,GAAK,GAAG,iBAAiBmF,EAAItD,EAAY,WAAW,MAAQ,WAAW,CAAC;AAAA,YACtH7B,EAAM,OAAS,qDAAqDA,EAAM,MAAM,EAAG,CAAC,EAAE,IAAKqH,GAAS,0FAA0FvH,EAAK,QAAS,GAAI,+BAA+B,CAAC,IAAIqF,EAAIkC,EAAK,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,SAAW,EAAE;AAAA;AAAA;AAAA,gMAG9GvH,EAAK,QAAS,EAAE,CAAC;AAAA,mBAE7M,CACA,MAAO,EACT,EAEMkI,GAAW,IAAM,CACrB,IAAMvB,EAAO5E,EAAY,UAAY,EAAI,EACnCoG,EAAQ,CAACpG,EAAY,WAAaA,EAAY,YAAc,QAC5DqG,EAAa,KAAK,IAAI,EAAG,KAAK,OAAO,KAAK,MAAM7G,EAAQ,SAAS,EAAI,KAAK,IAAI,GAAK,GAAK,CAAC,EACzF8G,EAAQ,CACZ,oCACA,iBAAiB7G,CAAU,GAC3B,eAAeO,EAAY,WAAW,MAAQ,WAAW,QAC3D,EACA,MAAO;AAAA,4BACiBiE,EAAa,EAAE,CAAC;AAAA,6CACFX,EAAI1D,CAAe,CAAC;AAAA,4DACF0G,EAAM,IAAI,CAACC,EAAW1B,IAAU,CACpF,IAAMjH,EAAQiH,EAAQD,EAAO,OAASC,IAAUD,EAAO,MAAQ,OACzDE,EAAOlH,IAAU,OAASK,EAAK,QAAS,GAAI,+BAA+B,EAC7EL,IAAU,MAAQK,EAAK,UAAW,GAAI,6CAA6C,EACnF,iCACJ,MAAO,oBAAoBL,CAAK,KAAKkH,CAAI,GAAGxB,EAAIiD,CAAS,CAAC,QAC5D,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,yCACwB,KAAK,IAAI,IAAM3B,EAAO,EAAK,IAAM,EAAE,CAAC;AAAA,QACrEwB,EAAQ,oBAAoB9C,EAAItD,EAAY,aAAe,gCAAgC,CAAC,iIAAmI,EAAE;AAAA,6FAC5IqG,CAAU;AAAA,WAErG,EAGM/D,EAAS,IAAM,CACnBtC,EAAchB,EAAW,SAAS,EAC9B,CAACuC,GAAYvB,EAAY,YAAWuB,EAAW,IACnDhC,EAAK,OAASgC,EACTA,IAAUhC,EAAK,UAAY4G,GAAS,GAEzC,IAAM5D,EAASxD,EAAO,cAChByH,EAAcjE,GAAQ,SAAS,MAC/BkE,EAAYlE,GAAU,mBAAoBA,EAC5C,CAACA,EAAO,eAAgBA,EAAO,YAAY,EAC3C,KAEJnD,EAAK,UAAY,OAAOiB,EAAS,UAAYF,GAAY,QAAU,EAAE,GACrEf,EAAK,UAAYmC,EAAWuE,GAAS,EAAI,GACzCxG,EAAO,UAAY,SAASe,EAAS,UAAY,EAAE,GACnDlB,EAAO,UAAYoC,EACf,GAAGlB,EAASuF,GAAU,EAAID,GAAS,CAAC,GAAGM,GAAU,CAAC,GAClD,GACHlH,EAAO,KAAqB,QAAQ,qBAAuBsB,EACvDD,GAAY,WAAa,YAC1B,UAEJd,EAAO,OAASU,EAAY,cAAgB,SAC5CiC,GAAM,OAASjC,EAAY,cAAgB,UAC3CkC,GAAS,OAASlC,EAAY,cAAgB,UAC9C,IAAM0G,EAAcpH,EAAO,cAA2B,UAAU,EAOhE,GANIoH,IACFA,EAAY,YAAc/F,KAAe,SACrC,oCACA,oCAGF6F,EAAa,CACf,IAAMG,EAAOxH,EAAO,cAAsD,gBAAgBqH,CAAW,IAAI,EACzGG,GAAM,MAAM,EACRA,GAAQF,GAAa,sBAAuBE,GAC9CA,EAAK,kBAAkBF,EAAU,CAAC,EAAGA,EAAU,CAAC,CAAC,CAErD,CACAG,GAAa,CACf,EAEMA,GAAe,IAAM,CACzB,IAAMC,EAAgB1H,EAAO,cAA2B,kBAAkB,EACtE0H,IAAeA,EAAc,UAAYA,EAAc,aAC7D,EAEMC,GAAc9H,EAAW,UAAU,IAAMsD,EAAO,CAAC,EAEjDyE,GAAiB,CAACnE,EAAuBoE,IAC7C,KAAK,UAAUpE,CAAI,IAAM,KAAK,UAAUoE,CAAK,EAE/C,SAAShC,GAAWL,EAAyC,CAC3D,OAAIA,EAAQ,QAAU,QAAUA,EAAQ,QAAU,CAACA,EAAQ,cAAsB,GACxD,CAAC,GAAGlD,CAAM,EAAE,QAAQ,EAAE,KAC5CwF,GAA0CA,EAAM,OAAS,MAAQA,EAAM,QAAU,QAAU,CAACA,EAAM,MACrG,GACyB,KAAOtC,EAAQ,IACtCoC,GAAe/H,EAAW,SAAS,EAAE,UAAW2F,EAAQ,aAAa,CACzE,CAGA,IAAMuC,GAAmB,CAACC,EAAgBC,EAA+BC,IAA+B,CACtG,GAAI,CAACrH,EAAY,WAAakB,GAAc,OAC5C,IAAMoG,EAAeC,EAAevI,EAAW,SAAS,EAAE,SAAS,EAC7DwI,EAAoBJ,EACtB,CACE,SAAUA,EACV,IAAKpH,EAAY,mBAAqBoH,EAClCpH,EAAY,iBAAiB,QAAQ,YAAY,EACjD,OACJ,YAAaA,EAAY,mBAAqBoH,IACzCpH,EAAY,iBAAiB,aAAe,IAC1C,QAAQ,OAAQ,GAAG,EACnB,KAAK,EACL,MAAM,EAAG,GAAG,GAAK,MAE1B,EACA,KACEyH,EAAQ,IAAI,gBACZC,EAAiC,CACrC,GAAI,EAAElG,GACN,KAAM,OACN,KAAM2F,EACN,SAAUE,CACZ,EACMM,EAAmC,CACvC,GAAI,EAAEnG,GACN,KAAM,KACN,MAAO,UACP,KAAM,EACN,MAAO,CACL6F,EAAc,kBAAkBA,EAAY,YAAY,CAAC,GAAK,mBAC9D,sCACA,kCACF,EACA,OAAAF,EACA,YAAaC,EACb,SAAUC,EACV,aAAAC,EACA,cAAe,KACf,QAAS,CAAC,EACV,MAAO,KACP,OAAQ,GACR,MAAAG,CACF,EACAhG,EAAO,KAAKiG,EAAaC,CAAS,EAClCjG,GAAqB,KAAK,CAAE,KAAM,OAAQ,QAASyF,CAAO,CAAC,EAC3DjG,GAAe,GACXsG,IACFhH,EAAc,KACdC,EAAW,KACX0B,EAAO,YAAY,IAAI,EACvBnD,EAAW,qBAAqB,GAElCsD,EAAO,EAEP,IAAMsF,EAAY,WAAW,IAAM,CAC7BD,EAAU,QAAU,YACtBA,EAAU,KAAO,EACjBrF,EAAO,EAEX,EAAG,GAAG,EAEAuF,EAAc,CAClB,uBAAuBC,GAAuBtI,EAAQ,SAAS,CAAC,GAChE4H,EACI,oEAAoEA,CAAc,IAAIC,EAAc,KAAKA,CAAW,IAAM,EAAE,6BAC5H,EACN,EAAE,OAAO,OAAO,EAAE,KAAK;AAAA,CAAI,EAErBU,GAAaC,GAAsB,CACvC,UAAWhJ,EAAW,UACtB,QAAAQ,EACA,YAAaQ,EAAY,UAAU,GACnC,OAAAmH,EACA,UAAWG,EACX,aAAc5F,GAAqB,MAAM,EAAG,EAAE,EAAE,MAAM,GAAG,EACzD,YAAAmG,EACA,OAAQJ,EAAM,OACd,gBAAiBD,CACnB,CAAC,EAAE,KAAK,MAAOvC,GAAW,CAKxB,GAJA,aAAa2C,CAAS,EAClBD,EAAU,QAAU,WAAaF,EAAM,OAAO,UAClDE,EAAU,KAAO,EACjBrF,EAAO,EACHmF,EAAM,OAAO,SAAS,OAC1B,IAAMQ,GAAQjJ,EAAW,sBAAsBiG,EAAO,SAAS,EAE/D,GADA0C,EAAU,cAAgBJ,EAAevI,EAAW,SAAS,EAAE,SAAS,EACpEyI,EAAM,OAAO,QAAS,CACxBzI,EAAW,iBAAiBsI,CAAY,EACxC,MAAMtI,EAAW,QAAQ,EACzB,MACF,CACA0C,GAAqB,KAAK,CAAE,KAAM,YAAa,QAASuD,EAAO,WAAY,CAAC,EAC5E0C,EAAU,MAAQ,KAClB,MAAM3I,EAAW,QAAQ,EACzB,IAAMkJ,GAAYlJ,EAAW,SAAS,EAAE,UACxC,GAAIkJ,KAAc,SAAWA,KAAc,WAAY,CACrDP,EAAU,MAAQ,cAClBA,EAAU,MAAQ,KAClBA,EAAU,QAAUtJ,GAAmBiJ,EAActI,EAAW,SAAS,EAAE,SAAS,EACpF2I,EAAU,MAAQ3I,EAAW,SAAS,EAAE,YACxC,MACF,CACA2I,EAAU,MAAQ,OAClBA,EAAU,MAAQ,KAClBA,EAAU,cAAgBJ,EAAevI,EAAW,SAAS,EAAE,SAAS,EACxE2I,EAAU,QAAUtJ,GAAmBiJ,EAActI,EAAW,SAAS,EAAE,SAAS,EAC/E2I,EAAU,QAAQ,SACrBA,EAAU,QAAU,CAAC,CAAE,MAAO1C,EAAO,YAAa,OAAQ,iBAAkB,CAAC,GAE1EgD,GAAM,IACTN,EAAU,QAAQ,KAAK,CACrB,MAAO,iEACP,OAAQM,GAAM,YAAc,gBAC9B,CAAC,CAEL,CAAC,EAAE,MAAO7B,GAAmB,CAC3B,aAAawB,CAAS,EAClB,CAAAH,EAAM,OAAO,UACjBE,EAAU,MAAQA,EAAU,cAAgB,cAAgB,SAC5DA,EAAU,MAAQ,KAClBA,EAAU,MAAQvB,aAAiB,MAAQA,EAAM,QAAU,sCACvDuB,EAAU,gBACZA,EAAU,QAAUtJ,GAAmBiJ,EAActI,EAAW,SAAS,EAAE,SAAS,GAExF,CAAC,EAAE,QAAQ,IAAM,CACf,GAAIyI,EAAM,OAAO,QAAS,CACxB,IAAMU,EAAY1G,EAAO,QAAQiG,CAAW,EACxCS,GAAa,GAAG1G,EAAO,OAAO0G,EAAW,CAAC,EAC9CzG,GAAqB,IAAI,CAC3B,CACIP,KAAuB4G,KAAY5G,GAAqB,MAC5DD,GAAe,GACfoB,EAAO,CACT,CAAC,EACDnB,GAAqB4G,EACvB,EAEMK,GAAkB,MAAOtI,GAAwB,CACrD,IAAMuI,EAAU,EAAEjH,GAClB,QAAWuD,KAAWlD,EAChBkD,EAAQ,OAAS,MAAQA,EAAQ,QAAU,WAAWA,EAAQ,OAAO,MAAM,EAKjF,GAHA,MAAMxD,GACFkH,IAAYjH,KAChB,MAAMpC,EAAW,QAAQ,EACrBqJ,IAAYjH,IAAiB,OACjC,IAAM8G,EAAYlJ,EAAW,SAAS,EAAE,UACxC,GAAIkJ,IAAc,SAAWA,IAAc,WAAY,CACrD5F,EAAO,EACP,MACF,CACA9B,EAAc,KACdC,EAAW,KACX0B,EAAO,YAAY,IAAI,EACvBnD,EAAW,eAAe,EAC1ByC,EAAO,OAAS,EAChBC,GAAqB,OAAS,EAC9BnB,EAAW,YACXvB,EAAW,gBAAgB,EAAI,EAC/B,MAAMA,EAAW,gBAAgBc,CAAW,EAC5CwC,EAAO,CACT,EAEMgG,GAAY,MAAO3D,GAA0C,CACjE,IAAM4D,EAAkB,GACtB5D,GAAS,eAAiBoC,GAAe/H,EAAW,SAAS,EAAE,UAAW2F,EAAQ,aAAa,GAEjG,MAAM3F,EAAW,QAAQ,EACzB,IAAMkJ,EAAYlJ,EAAW,SAAS,EAAE,UACpC2F,GAAS,QAAU,eAAiBuD,IAAc,SAAWA,IAAc,aAC7EvD,EAAQ,MAAQ,OAChBA,EAAQ,MAAQ,KAChBA,EAAQ,cAAgB4D,EACpBhB,EAAevI,EAAW,SAAS,EAAE,SAAS,EAC9C,MAENsD,EAAO,CACT,EAGMkG,GAAejL,GAAsD,CACzE,IAAMuG,EAAK,OAAOvG,EAAO,QAAQ,GAAG,EAC9BoH,EAAUlD,EAAO,KAAMwF,GAAUA,EAAM,KAAOnD,CAAE,EACtD,OAAOa,GAAWA,EAAQ,OAAS,KAAOA,EAAU,IACtD,EAEM8D,GAAaC,GAA0C,CAE3D,GADA/H,GAAa+H,EACTA,IAAS,UAAW,CACtB1J,EAAW,mBAAmB,EAC9BsD,EAAO,EACP,MACF,CACA,IAAMqG,EAA0BD,IAAS,SACrC,CAAE,MAAO,IAAK,OAAQ,IAAK,EAC3B,CAAE,MAAO,IAAK,OAAQ,GAAI,EAC9BzG,GAAM,MAAM,MAAQ,GAAG0G,EAAK,KAAK,KACjC1G,GAAM,MAAM,OAAS,GAAG0G,EAAK,MAAM,KACnC3J,EAAW,kBAAkB,EAC7BsD,EAAO,CACT,EAEMsG,GAAiBC,GAAiB,CACtC,IAAMtL,EAAUsL,EAAM,OAAmB,QAAqB,eAAe,EAC7E,GAAI,CAACtL,EAAQ,CACP+C,IACFA,EAAc,GACdgC,EAAO,GAET,MACF,CAEA,OADe/E,EAAO,QAAQ,OACd,CACd,IAAK,WAAY4C,GAAY,GAAMmC,EAAO,EAAG,MAC7C,IAAK,SAAUnC,GAAY,GAAOmC,EAAO,EAAG,MAC5C,IAAK,eAAgBnC,GAAY,GAAOgC,EAAO,UAAU,EAAI,EAAG,MAChE,IAAK,eAAgB/B,GAAY,CAACA,GAAWkC,EAAO,EAAG,MACvD,IAAK,iBAAkBhC,EAAc,CAACA,EAAagC,EAAO,EAAG,MAC7D,IAAK,iBAAkB,CACrBhC,EAAc,GACd,IAAMR,EAAcvC,EAAO,QAAQ,UAC/BuC,GAAeA,IAAgBE,EAAY,WAAW,IACnDoI,GAAgBtI,CAAW,EAElCwC,EAAO,EACP,KACF,CACA,IAAK,MAAOrC,EAAY1C,EAAO,QAAQ,KAAoB,WAAY+E,EAAO,EAAG,MACjF,IAAK,UAAW,CACd,IAAMwG,EAAWvL,EAAO,QAAQ,OAAS,WAAa,WAAa,YAC/DuL,IAAavI,IACfA,EAAWuI,EACX9J,EAAW,gBAAgB8J,IAAa,WAAW,GAErDxG,EAAO,EACP,KACF,CACA,IAAK,iBAAkB/B,EAAW,YAAavB,EAAW,gBAAgB,EAAI,EAAGsD,EAAO,EAAG,MAC3F,IAAK,SAAUmG,GAAWlL,EAAO,QAAQ,QAA8C,SAAS,EAAG,MACnG,IAAK,OAAQyB,EAAW,KAAK,EAAG,MAChC,IAAK,OAAQA,EAAW,KAAK,EAAG,MAChC,IAAK,iBAAkBmD,EAAO,UAAU,CAACnC,EAAY,YAAY,EAAG,MACpE,IAAK,mBAAoBmC,EAAO,UAAU,EAAK,EAAG,MAClD,IAAK,cAAeA,EAAO,UAAU,EAAI,EAAG,MAC5C,IAAK,YACH3B,EAAc,KACdC,EAAW,KACX0B,EAAO,YAAY,IAAI,EACvBnD,EAAW,eAAe,EAC1BsD,EAAO,EACP,MACF,IAAK,aAAcrB,GAAgB1D,EAAO,aAAa,KAAK,GAAK,GAAI+E,EAAO,EAAG,MAC/E,IAAK,UAAWkG,GAAYjL,CAAM,GAAG,OAAO,MAAM,EAAG,MACrD,IAAK,WAAY,CACf,IAAMoH,EAAU6D,GAAYjL,CAAM,EAC9BoH,GAASuC,GAAiBvC,EAAQ,OAAQA,EAAQ,YAAaA,EAAQ,QAAQ,EACnF,KACF,CACA,IAAK,cAAe,CAClB,IAAMA,EAAU6D,GAAYjL,CAAM,EAC9BoH,GAAWK,GAAWL,CAAO,IAC/B3F,EAAW,iBAAiB2F,EAAQ,YAAY,EAChDA,EAAQ,OAAS,GACjBrC,EAAO,GAET,KACF,CACA,IAAK,iBAAkBrC,EAAW,UAAWqC,EAAO,EAAG,MACvD,IAAK,YAAapC,GAAW3C,EAAO,QAAQ,OAAS,KAAO,KAAO,MAAO+E,EAAO,EAAG,MACpF,IAAK,SAAUtD,EAAW,cAAc,EAAG,MAC3C,IAAK,gBAAiBiB,EAAW,UAAWe,EAAe,GAAMsB,EAAO,EAAG,MAC3E,IAAK,kBAAmBtB,EAAe,CAACA,EAAcsB,EAAO,EAAG,MAChE,IAAK,aAAc,CACjB,IAAMyG,EAAOxL,EAAO,QAAQ,KACxBwL,IAAS,WAAY/J,EAAW,eAAe,OAAOzB,EAAO,QAAQ,KAAK,CAAC,EACtEwL,IAAS,MAAO/J,EAAW,aAAa,EAAE,EAC1C+J,IAAS,MAAM/J,EAAW,YAAY,EAAE,EACjD,KACF,CACA,IAAK,aAAmBsJ,GAAUE,GAAYjL,CAAM,CAAC,EAAG,MACxD,IAAK,iBAAuByL,GAAc,EAAG,MAC7C,IAAK,iBACCnI,IAAW,WAAUC,GAAe,IACxCD,EAAS,KACTyB,EAAO,EACP,MACF,IAAK,WACHzB,EAAS,KACTC,GAAe,GACf,SAAS,OAAOtB,EAAQ,SAAS,EACjC,MACF,IAAK,OAAQuB,EAAQ,OAAQuB,EAAO,EAAG,MACvC,IAAK,aAAcvB,EAAQ,KAAMuB,EAAO,EAAG,MAC3C,IAAK,mBACEtD,EAAW,QAAQ,EAAE,KAAK,IAAM,CACnC,IAAMkJ,EAAYlJ,EAAW,SAAS,EAAE,UACxC,GAAIkJ,IAAc,SAAWA,IAAc,WAAY,OAAOlJ,EAAW,KAAK,EAC9EsD,EAAO,CACT,CAAC,EAAE,MAAM,IAAMA,EAAO,CAAC,EACvB,MACF,IAAK,gBAAsBtD,EAAW,gBAAgB,MAAM,EAAG,MAC/D,IAAK,kBAAwBA,EAAW,gBAAgB,QAAQ,EAAG,MACnE,IAAK,gBAAsBA,EAAW,KAAK,EAAG,MAC9C,IAAK,eACH,OAAO,KAAKa,GAAsBG,EAAY,WAAW,IAAMR,EAAQ,kBAAkB,EAAG,SAAU,UAAU,EAChH,MACF,IAAK,aAAmBR,EAAW,gBAAgBQ,EAAQ,kBAAkB,EAAG,MAChF,QAAS,KACX,CACF,EAEAL,EAAO,iBAAiB,QAASyJ,EAAa,EAC9CxJ,EAAK,iBAAiB,QAASwJ,EAAa,EAC5CrJ,EAAK,iBAAiB,QAASqJ,EAAa,EAE5CzJ,EAAO,iBAAiB,QAAU0J,GAAU,CAC1C,IAAMtL,EAASsL,EAAM,OACjBtL,EAAO,QAAQ,QAAU,MAAOyB,EAAW,aAAazB,EAAO,KAAK,EAC/DA,EAAO,QAAQ,QAAU,KAAMyB,EAAW,YAAYzB,EAAO,KAAK,EAClEA,EAAO,QAAQ,QAAU,oBAAmB0D,GAAgB1D,EAAO,MAC9E,CAAC,EAED4B,EAAO,iBAAiB,SAAW0J,GAAU,CAE3C,GAAI,CADUA,EAAM,OAAmB,QAAyB,sBAAsB,EAC3E,OACXA,EAAM,eAAe,EACrB,IAAM1B,EAASlG,GAAc,KAAK,EAC7BkG,IACLlG,GAAgB,GAChBiG,GAAiBC,EAAQ3G,EAAaC,CAAQ,EAChD,CAAC,EAEDnB,EAAO,iBAAiB,QAAUuJ,GAAU,CAC1C,IAAMI,EAAUJ,EAAM,OAAmB,QAAqB,eAAe,GAAG,QAAQ,OACpFI,IAAW,gBAAgBR,GAAU,SAAS,EAC9CQ,IAAW,eAAoB,UAAU,WAAW,UAAU,SAAS,IAAI,CACjF,CAAC,EAED,IAAMC,GAAaL,GAAyB,CAC1C,IAAMtL,EAASsL,EAAM,aAAa,EAAE,CAAC,EAC/BM,EACJ5L,aAAkB,kBAClBA,aAAkB,qBAClBA,aAAkB,mBACjBA,aAAkB,aAAeA,EAAO,kBAC3C,GAAIsL,EAAM,MAAQ,SAAU,CAC1B,GAAI9H,IAAU,OAAQ,CACpBA,EAAQ,KACRuB,EAAO,EACP,MACF,CACA,GAAItC,EAAY,cAAgB,SAAU,CACxC6I,EAAM,eAAe,EACrBJ,GAAU,SAAS,EACnB,MACF,CACA,MACF,CACA,GAAI,CAAAU,EACJ,IAAIN,EAAM,MAAQ,KAAOA,EAAM,MAAQ,IAAK,CAC1C1G,EAAO,UAAU,CAACnC,EAAY,YAAY,EAC1C,MACF,EACK6I,EAAM,SAAWA,EAAM,WAAaA,EAAM,MAAQ,KAAOA,EAAM,MAAQ,OAC1EA,EAAM,eAAe,EACjBA,EAAM,SAAU7J,EAAW,KAAK,EAC/BA,EAAW,KAAK,GAEzB,EACA,OAAO,iBAAiB,UAAWkK,GAAW,EAAI,EAGlD,IAAMF,GAAgB,SAAY,CAChC,GAAI,CACgB,MAAMhK,EAAW,cAAc,IAE/CsC,GAAcvB,GAAmB,GAAK7C,GACtCoF,EAAO,EAEX,MAAQ,CAER,CACF,EAEM8G,GAAoB,CAAE,MAAOpJ,EAAY,SAAU,EACnDqJ,GAAYrK,EAAW,UAAWpB,GAAU,CAC5CA,EAAM,YAAc,SAAWwL,GAAkB,QAAU,UAC7D/H,GAAc,KAAK,IAAI,GAEzB+H,GAAkB,MAAQxL,EAAM,SAClC,CAAC,EAEK0L,GAAS,YAAY,IAAM,CAC/B,IAAM1G,EAAO7C,GAAmB,EAChC,GAAI6C,GAAQ,GAAK7B,IAAU,UAAW,CACpCA,EAAQ,UACRoB,EAAO,UAAU,EAAK,EACtBG,EAAO,EACP,MACF,CACA,IAAMiH,EAAO3G,GAAQ1F,GACrB,GAAIqM,IAASjI,GAAa,CACxBA,GAAciI,EACdjH,EAAO,EACP,MACF,CACA,IAAMkH,EAAOrK,EAAO,cAA2B,qBAAqB,EAMpE,GALIqK,IACFA,EAAK,YAAcD,EACf,mBAAmB7K,GAAckE,CAAI,CAAC,GACtC,gBAAa,KAAK,MAAMA,EAAO,EAAE,CAAC,aAEpClD,GAAc6B,EAAU,CAC1B,IAAMkI,EAAY,SAAS,SAAW,SAAS,SAAW/J,EACtD+J,GAAa5I,IAAW,UAAY,CAACC,IAAgBD,IAAW,MAClEA,EAAS,SACTyB,EAAO,GACE,CAACmH,IAAc5I,IAAW,UAAYC,MAC3CD,IAAW,WAAUA,EAAS,MAClCC,GAAe,GACfwB,EAAO,EAEX,CACF,EAAG,GAAI,EAEDoH,GAAW,IAAM,CACrB9I,EAAO,YACP0B,EAAO,EACFtD,EAAW,QAAQ,CAC1B,EACM2K,GAAY,IAAM,CACtB/I,EAAO,UACP0B,EAAO,CACT,EACA,OAAO,iBAAiB,SAAUoH,EAAQ,EAC1C,OAAO,iBAAiB,UAAWC,EAAS,EAE5C,IAAMC,GAAgB,IAAM,CAC1BvJ,EAASsB,IAAO,SAAW,GAC3BW,EAAO,CACT,EACA,OAAAX,IAAO,mBAAmB,SAAUiI,EAAa,EAEjDtH,EAAO,EAEA,CACL,SAAU,CACR,QAAWqC,KAAWlD,EAChBkD,EAAQ,OAAS,MAAQA,EAAQ,QAAU,WAC7CA,EAAQ,OAAO,MAAM,EAGzBmC,GAAY,EACZuC,GAAU,EACV,cAAcC,EAAM,EACpBnH,EAAO,QAAQ,EACfP,GAAc,MAAM,EAAK,EACzB,OAAO,oBAAoB,UAAWsH,GAAW,EAAI,EACrD,OAAO,oBAAoB,SAAUQ,EAAQ,EAC7C,OAAO,oBAAoB,UAAWC,EAAS,EAC/ChI,IAAO,sBAAsB,SAAUiI,EAAa,EACpD3K,EAAM,OAAO,EACbE,EAAO,OAAO,EACdC,EAAK,OAAO,EACZC,EAAI,OAAO,EACXtB,EAAM,OAAO,EACbuB,EAAO,OAAO,EACdC,EAAK,OAAO,CACd,CACF,CACF,ChB32CA,IAAMsK,GAAiB,mBACjBC,GAAsB,IAIxBC,GAA4C,KAC5CC,EAA4C,KAC5CC,GAAgC,KAChCC,EAAkD,KAEtD,SAASC,IAA4B,CACnCD,GAAqB,KAAK,EAC1BD,IAAY,QAAQ,EACpBD,GAAkB,QAAQ,EAC1BC,GAAa,KACbC,EAAsB,KACtBF,EAAmB,KACnBD,GAAgB,KAChB,SAAS,eAAeF,EAAc,GAAG,OAAO,CAClD,CAEA,SAASO,EAAWC,EAA+B,CACjD,OAAO,OAAOA,GAAU,UAAYA,EAAM,KAAK,EAAIA,EAAM,KAAK,EAAI,IACpE,CAEA,SAASC,GAAaD,EAAgBE,EAAyC,CAC7E,GAAI,CAACF,GAAS,OAAOA,GAAU,SAAU,OAAO,KAChD,IAAMG,EAASH,EACTI,EAAS,CACb,IAAKL,EAAWI,EAAO,GAAG,EAC1B,OAAQJ,EAAWI,EAAO,MAAM,EAChC,UAAWJ,EAAWI,EAAO,SAAS,EACtC,OAAQJ,EAAWI,EAAO,MAAM,EAChC,aAAcJ,EAAWI,EAAO,YAAY,EAC5C,mBAAoBJ,EAAWI,EAAO,kBAAkB,EACxD,UAAWJ,EAAWI,EAAO,SAAS,EACtC,aAAcJ,EAAWI,EAAO,YAAY,CAC9C,EACA,GACEC,EAAO,MAAQF,GACf,CAACE,EAAO,QACR,CAACA,EAAO,WACR,CAACA,EAAO,QACR,CAACA,EAAO,cACR,CAACA,EAAO,oBACR,CAACA,EAAO,WACR,CAACA,EAAO,cACR,CAAC,OAAO,SAAS,KAAK,MAAMA,EAAO,SAAS,CAAC,GAC7C,KAAK,MAAMA,EAAO,SAAS,GAAK,KAAK,IAAI,EAEzC,OAAO,KAET,IAAMC,EAAgD,CAAC,EACvD,GAAI,MAAM,QAAQF,EAAO,UAAU,EACjC,QAAWG,KAAQH,EAAO,WAAY,CACpC,GAAI,CAACG,GAAQ,OAAOA,GAAS,SAAU,SACvC,IAAMC,EAAYD,EACZE,EAAKT,EAAWQ,EAAU,EAAE,EAC9BC,GACFH,EAAW,KAAK,CACd,GAAAG,EACA,KAAMT,EAAWQ,EAAU,IAAI,EAC/B,KAAMR,EAAWQ,EAAU,IAAI,CACjC,CAAC,CAEL,CAEF,MAAO,CACL,IAAAL,EACA,OAAQE,EAAO,OACf,UAAWA,EAAO,UAClB,OAAQA,EAAO,OACf,aAAcA,EAAO,aACrB,eAAgBL,EAAWI,EAAO,cAAc,EAChD,mBAAoBC,EAAO,mBAC3B,UAAWA,EAAO,UAClB,aAAcA,EAAO,aACrB,WAAAC,CACF,CACF,CAEA,SAASI,GAAgBC,EAAoC,CAC3D,SAAS,eAAelB,EAAc,GAAG,OAAO,EAChD,IAAMmB,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,GAAKnB,GACVmB,EAAK,aAAa,yBAA0B,WAAW,EACvD,IAAMC,EAASD,EAAK,aAAa,CAAE,KAAM,QAAS,CAAC,GAClD,SAAS,MAAQ,SAAS,iBAAiB,YAAYA,CAAI,EAC5Df,GAAaiB,GAAgBD,EAAQF,CAAU,CACjD,CAEA,eAAsBI,GAAMC,EAA4C,CACtE,IAAML,EAAa,IAAI,gBACjBM,EAAU,WAAW,IAAMN,EAAW,MAAM,EAAGjB,EAAmB,EACpEwB,EAAmB,GACvB,GAAI,CACF,IAAMC,EAAc,IAAI,IAAI,gCAAiCH,EAAO,SAAS,EAC7EG,EAAY,aAAa,IAAI,MAAOH,EAAO,GAAG,EAC9C,IAAMI,EAAW,MAAM,MAAMD,EAAY,SAAS,EAAG,CACnD,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,CAAE,MAAOH,EAAO,KAAM,CAAC,EAC5C,MAAO,WACP,YAAa,OACb,eAAgB,cAChB,OAAQL,EAAW,MACrB,CAAC,EACD,GAAI,CAACS,EAAS,GAAI,MAAO,GACzB,IAAMC,EAAW,MAAMD,EAAS,KAAK,EAAE,MAAM,IAAM,IAAI,EAGvD,GAAIC,GAAS,KAAO,GAAM,MAAO,GACjC,IAAMC,EAAUpB,GAAamB,EAAQ,QAASL,EAAO,GAAG,EAExD,GADI,CAACM,GAEH,OAAO,SAAa,KACpBA,EAAQ,eAAiB,SAAS,OAElC,MAAO,GAET3B,GAAgB2B,EAChBJ,EAAmB,GACnB,IAAMK,EAAM,IAAIC,EAAUR,EAAO,UAAWM,CAAO,EACnD1B,EAAmB,IAAI6B,GAAiBH,EAASN,EAAO,UAAWO,CAAG,EACtEb,GAAgBd,CAAgB,EAChC,MAAMA,EAAiB,WAAW,EAClCE,EAAsB,IAAI4B,GACxBH,EACA,IAAII,GAAsB/B,CAAgB,CAC5C,EACAA,EAAiB,WAAW,IAAM,CAChCE,GAAqB,KAAK,EAC1BA,EAAsB,IACxB,CAAC,EACDA,EAAoB,MAAM,EAC1B,GAAI,CACF,OAAO,QAAQ,YACb,CACE,KAAM,wBACN,IAAKwB,EAAQ,IACb,aAAcA,EAAQ,aACtB,YAAaA,EAAQ,kBACvB,EACAN,EAAO,SACT,CACF,MAAQ,CAAC,CACT,MAAO,EACT,MAAQ,CACN,OAAIE,GAAkBnB,GAAoB,EACnC,EACT,QAAE,CACA,aAAakB,CAAO,CACtB,CACF,CAEO,SAASW,IAAqD,CACnE,OAAOjC,EACT,CAEO,IAAMkC,GAAS,CACpB,MAAO9B,EACT",
6
- "names": ["index_exports", "__export", "__test", "getActiveEditorSession", "start", "EditorApiError", "message", "status", "payload", "record", "value", "parseArtifacts", "input", "EDITOR_COMMANDS", "EditorApi", "apiOrigin", "session", "fetchImpl", "args", "path", "variationId", "url", "init", "response", "variation", "artifacts", "expectedPriorHash", "limit", "commandUrl", "commands", "command", "commandId", "commandName", "completion", "UNSTABLE_ID", "UNSTABLE_CLASS", "escapeCss", "value", "character", "quotedAttribute", "name", "isUnique", "selector", "root", "stableId", "element", "id", "stableAttribute", "names", "attribute", "stableClasses", "segment", "tag", "candidate", "classes", "parent", "sameTag", "child", "generateDeterministicSelector", "ownerDocument", "direct", "parts", "current", "part", "elementLabel", "className", "rect", "POLL_INTERVAL_MS", "MAX_LOGS", "REDACTED", "SENSITIVE_KEY", "EMAIL", "JWT", "AUTH_VALUE", "LONG_NUMBER", "MUTATION_ACTIONS", "record", "value", "string", "isLoopbackOrigin", "origin", "hostname", "sanitizedUrl", "base", "url", "sanitizeDiagnosticText", "match", "separator", "cloneSafe", "depth", "key", "elementSummary", "item", "output", "entryKey", "entry", "visibleText", "element", "rect", "box", "generateDeterministicSelector", "sanitizeNetworkEntry", "findTarget", "args", "selector", "query", "lower", "candidates", "aria", "parseMutation", "input", "action", "mutation", "attribute", "attributes", "styles", "parseArtifacts", "mutations", "auditResult", "audit", "EditorCommandExecutor", "controller", "navigation", "originals", "level", "original", "list", "command", "filter", "artifacts", "rawUrl", "summarize", "limit", "target", "timeout", "startedAt", "resolve", "startIndex", "waitMs", "entries", "operation", "elements", "EditorCommandPoller", "api", "executor", "commands", "execution", "error", "EditorApiError", "sanitizeHtml", "html", "doc", "script", "el", "attr", "observers", "muteDepth", "runMuted", "fn", "muteDepth", "observer", "callback", "observers", "pending", "activePolicy", "isStrictJsPolicy", "activePolicy", "INSERT_ATTR", "mutationSnapshots", "URL_ATTRIBUTES", "SAFE_DATA_URL_MEDIA_TYPES", "isSafeMutationAttribute", "name", "value", "normalizedName", "normalizedValue", "mediaType", "sanitizeMutationHtml", "html", "sanitized", "sanitizeHtml", "isStrictJsPolicy", "template", "element", "attribute", "normalizeCssPropertyName", "out", "m", "getMutationKey", "mutation", "index", "isInsertAction", "action", "snapshotMutation", "snapshots", "names", "style", "restoreSnapshot", "snapshot", "priority", "node", "applyToElement", "isInsertDuplicate", "key", "parent", "candidate", "markInserted", "el", "applyTrackedMutationWithSnapshots", "runMuted", "previousSibling", "nextSibling", "insertedNodes", "current", "boundary", "insertedElements", "inserted", "applyMutationsWithSnapshots", "mutations", "options", "snapshots", "root", "mutation", "index", "elements", "element", "key", "getMutationKey", "isInsertAction", "isInsertDuplicate", "applyTrackedMutationWithSnapshots", "createMutationApplicationContext", "snapshots", "mutations", "options", "applyMutationsWithSnapshots", "runMuted", "i", "restoreSnapshot", "EMPTY_EDITOR_ARTIFACTS", "cloneArtifacts", "artifacts", "mutation", "sameMutationSlot", "left", "right", "textActions", "styleActions", "upsertMutation", "artifacts", "mutation", "item", "mutations", "index", "previous", "previousAttributes", "nextAttributes", "removeSelectorMutations", "selector", "removeMutationAt", "_", "mutationIndex", "ArtifactHistory", "current", "cloneArtifacts", "next", "EDITOR_CSS_ID", "AUTOSAVE_MS", "EXIT_REVOKE_TIMEOUT_MS", "EditorController", "session", "apiOrigin", "api", "EditorApi", "reload", "cloneArtifacts", "EMPTY_EDITOR_ARTIFACTS", "ArtifactHistory", "listener", "variationId", "request", "loaded", "error", "active", "element", "selector", "removeSelectorMutations", "index", "removeMutationAt", "artifacts", "expiresAt", "choice", "variation", "enabled", "dock", "value", "name", "code", "previous", "next", "devicePreview", "deviceState", "cleanup", "beforeCounts", "mutation", "mutationAudit", "beforeCount", "afterCount", "effectVerified", "generatedSelectors", "generatedVisibility", "elements", "matches", "match", "failed", "entry", "visibleGeneratedCount", "total", "networkRequired", "variationRequest", "queued", "saveVariationRequest", "expectedHash", "snapshot", "saveRevision", "result", "changedDuringSave", "EditorApiError", "input", "upsertMutation", "applyVisual", "style", "createMutationApplicationContext", "patch", "rect", "sanitizedHtml", "sanitizeHtml", "expected", "attributes", "letter", "promise", "timeoutMs", "timer", "resolve", "EDITOR_DEVICE_FRAME_NAME", "FRAME_TIMEOUT_MS", "DEVICE_STYLE_ID", "DevicePreview", "frame", "onState", "artifacts", "url", "enabled", "doc", "notify", "item", "frameUrl", "createMutationApplicationContext", "style", "editorHost", "element", "visibility", "editorElement", "element", "editorEvent", "event", "item", "selectableElement", "ElementPicker", "overlay", "onSelect", "onActiveChange", "onUnsupported", "target", "generateDeterministicSelector", "next", "active", "rect", "elementLabel", "labelTop", "MAX_CONTEXT_CHARS", "MAX_CONVERSATION_MESSAGES", "CONTEXT_SELECTORS", "compactWhitespace", "value", "redactEditorContextUrl", "baseUrl", "url", "safeAttributeEntries", "element", "name", "lower", "serializeElement", "tag", "attributes", "text", "collectEditorDomContext", "documentLike", "lines", "seen", "parseMutation", "mutation", "appendCode", "current", "generated", "mergeEditorOperatorArtifacts", "input", "customCss", "customJs", "artifacts", "upsertMutation", "errorMessage", "payload", "status", "error", "runEditorOperatorTurn", "response", "mergeStrategy", "artifactCount", "ICONS", "icon", "name", "size", "extra", "operatorMarkId", "operatorMark", "color", "id", "esc", "value", "KIT_CSS", "DOCK_WIDTH", "RAIL_WIDTH", "SESSION_WARN_SECONDS", "VIEW_CSS", "OPERATOR_SUGGESTIONS", "mutationLabel", "mutation", "target", "elementNameFromSelector", "names", "selector", "saveChipStatus", "state", "saveChipHtml", "status", "label", "iconHtml", "icon", "changeListFromState", "items", "mutationIndex", "describeRunChanges", "before", "after", "beforeKeys", "results", "formatMinutes", "seconds", "m", "s", "mountEditorView", "shadow", "controller", "style", "KIT_CSS", "chrome", "zone", "box", "device", "boot", "session", "targetHost", "targetPath", "url", "experimentTitle", "dashboardVariationUrl", "variationId", "sessionSecondsLeft", "latestState", "panelTab", "codeLang", "collapsed", "sheetOpen", "narrow", "varMenuOpen", "viewMode", "ctxSelector", "ctxLabel", "elementLabel", "devicePick", "conn", "banner", "spaDismissed", "modal", "artifactOpen", "operatorDraft", "operatorBusy", "operatorRunPromise", "variationSwitch", "lastSavedAt", "sessionWarn", "bootDone", "messageId", "thread", "operatorConversation", "media", "devicePreview", "DevicePreview", "createDeviceFrame", "deviceState", "EDITOR_DEVICE_FRAME_NAME", "frame", "fallback", "picker", "ElementPicker", "element", "render", "active", "draftPill", "compact", "connChip", "sessionNoteHtml", "left", "variationSwitcherHtml", "current", "currentName", "initial", "menu", "variation", "on", "name", "vInitial", "esc", "compareSegHtml", "variationName", "deviceSegHtml", "undoRedoHtml", "tabsHtml", "count", "tab", "id", "labelText", "badge", "operatorMark", "ctxChipHtml", "inThread", "operatorPanelHtml", "pickerActive", "ctxBar", "empty", "emptyHtml", "suggestion", "messages", "message", "step", "index", "mark", "canUndo", "canUndoRun", "result", "placeholder", "codePanelHtml", "cssBody", "jsBody", "changesPanelHtml", "rows", "item", "artifactJson", "panelBodyHtml", "dockHtml", "sheetHtml", "barRow", "zoneHtml", "selectMode", "banners", "modalHtml", "savedAgo", "bootHtml", "error", "ttlMinutes", "steps", "stepLabel", "activeField", "selection", "deviceTitle", "next", "scrollThread", "threadElement", "unsubscribe", "artifactsEqual", "right", "entry", "startOperatorRun", "prompt", "runCtxSelector", "runCtxLabel", "preArtifacts", "cloneArtifacts", "referencedElement", "abort", "userMessage", "opMessage", "stepTimer", "pageContext", "redactEditorContextUrl", "runPromise", "runEditorOperatorTurn", "audit", "saveState", "userIndex", "switchVariation", "request", "retrySave", "stillMatchesRun", "findMessage", "setDevice", "pick", "size", "onChromeClick", "event", "nextView", "kind", "extendSession", "action", "onKeyDown", "typing", "previousSaveState", "saveWatch", "ticker", "warn", "node", "offTarget", "onOnline", "onOffline", "onMediaChange", "EDITOR_HOST_ID", "EXCHANGE_TIMEOUT_MS", "activeSession", "activeController", "activeView", "activeCommandPoller", "cleanupActiveEditor", "readString", "value", "parseSession", "sid", "record", "parsed", "variations", "item", "variation", "id", "mountEditorHost", "controller", "host", "shadow", "mountEditorView", "start", "launch", "timeout", "ownsActiveEditor", "exchangeUrl", "response", "payload", "session", "api", "EditorApi", "EditorController", "EditorCommandPoller", "EditorCommandExecutor", "getActiveEditorSession", "__test"]
3
+ "sources": ["../src/editor/index.ts", "../src/editor/publication-result.ts", "../src/editor/api.ts", "../src/editor/selector.ts", "../src/editor/command-runtime.ts", "../src/sanitize.ts", "../src/observer-mute.ts", "../src/shadow.ts", "../src/reassert-sentinel.ts", "../src/money.ts", "../src/mutate.ts", "../src/editor/types.ts", "../src/editor/artifacts.ts", "../src/editor/controller.ts", "../src/editor-bootstrap.ts", "../src/editor/device-preview.ts", "../src/editor/picker.ts", "../src/editor/operator.ts", "../src/editor/view-kit.ts", "../src/editor/view.ts"],
4
+ "sourcesContent": ["import type { EditorLaunchHint } from \"../editor-bootstrap\";\nimport type { ActiveEditorSession } from \"./types\";\nimport { EditorApi } from \"./api\";\nimport { EditorCommandExecutor, EditorCommandPoller } from \"./command-runtime\";\nimport { EditorController } from \"./controller\";\nimport { mountEditorView, type EditorView } from \"./view\";\n\nconst EDITOR_HOST_ID = \"apex-editor-host\";\nconst EXCHANGE_TIMEOUT_MS = 10_000;\n\nexport type { ActiveEditorSession } from \"./types\";\n\nlet activeSession: ActiveEditorSession | null = null;\nlet activeController: EditorController | null = null;\nlet activeView: EditorView | null = null;\nlet activeCommandPoller: EditorCommandPoller | null = null;\n\nfunction cleanupActiveEditor(): void {\n activeCommandPoller?.stop();\n activeView?.destroy();\n activeController?.destroy();\n activeView = null;\n activeCommandPoller = null;\n activeController = null;\n activeSession = null;\n document.getElementById(EDITOR_HOST_ID)?.remove();\n}\n\nfunction readString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction parseSession(value: unknown, sid: string): ActiveEditorSession | null {\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n const parsed = {\n sid: readString(record.sid),\n bearer: readString(record.bearer),\n expiresAt: readString(record.expiresAt),\n shopId: readString(record.shopId),\n experimentId: readString(record.experimentId),\n initialVariationId: readString(record.initialVariationId),\n targetUrl: readString(record.targetUrl),\n targetOrigin: readString(record.targetOrigin),\n };\n if (\n parsed.sid !== sid ||\n !parsed.bearer ||\n !parsed.expiresAt ||\n !parsed.shopId ||\n !parsed.experimentId ||\n !parsed.initialVariationId ||\n !parsed.targetUrl ||\n !parsed.targetOrigin ||\n !Number.isFinite(Date.parse(parsed.expiresAt)) ||\n Date.parse(parsed.expiresAt) <= Date.now()\n ) {\n return null;\n }\n const variations: ActiveEditorSession[\"variations\"] = [];\n if (Array.isArray(record.variations)) {\n for (const item of record.variations) {\n if (!item || typeof item !== \"object\") continue;\n const variation = item as Record<string, unknown>;\n const id = readString(variation.id);\n if (id) {\n variations.push({\n id,\n name: readString(variation.name),\n slug: readString(variation.slug),\n });\n }\n }\n }\n return {\n sid,\n bearer: parsed.bearer,\n expiresAt: parsed.expiresAt,\n shopId: parsed.shopId,\n experimentId: parsed.experimentId,\n experimentName: readString(record.experimentName),\n experimentStatus: readString(record.experimentStatus),\n initialVariationId: parsed.initialVariationId,\n targetUrl: parsed.targetUrl,\n targetOrigin: parsed.targetOrigin,\n variations,\n };\n}\n\nfunction mountEditorHost(controller: EditorController): void {\n document.getElementById(EDITOR_HOST_ID)?.remove();\n const host = document.createElement(\"div\");\n host.id = EDITOR_HOST_ID;\n host.setAttribute(\"data-apex-editor-state\", \"connected\");\n const shadow = host.attachShadow({ mode: \"closed\" });\n (document.body || document.documentElement).appendChild(host);\n activeView = mountEditorView(shadow, controller);\n}\n\nexport async function start(launch: EditorLaunchHint): Promise<boolean> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), EXCHANGE_TIMEOUT_MS);\n let ownsActiveEditor = false;\n try {\n const exchangeUrl = new URL(\"/api/editor-sessions/exchange\", launch.apiOrigin);\n exchangeUrl.searchParams.set(\"sid\", launch.sid);\n const response = await fetch(exchangeUrl.toString(), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ token: launch.token }),\n cache: \"no-store\",\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n signal: controller.signal,\n });\n if (!response.ok) return false;\n const payload = (await response.json().catch(() => null)) as\n | { ok?: unknown; session?: unknown }\n | null;\n if (payload?.ok !== true) return false;\n const session = parseSession(payload.session, launch.sid);\n if (!session) return false;\n if (\n typeof location !== \"undefined\" &&\n session.targetOrigin !== location.origin\n ) {\n return false;\n }\n activeSession = session;\n ownsActiveEditor = true;\n const api = new EditorApi(launch.apiOrigin, session);\n activeController = new EditorController(session, launch.apiOrigin, api);\n mountEditorHost(activeController);\n await activeController.initialize();\n activeCommandPoller = new EditorCommandPoller(\n api,\n new EditorCommandExecutor(activeController),\n );\n activeController.addCleanup(() => {\n activeCommandPoller?.stop();\n activeCommandPoller = null;\n });\n activeCommandPoller.start();\n try {\n window.opener?.postMessage(\n {\n type: \"apex:editor-connected\",\n sid: session.sid,\n experimentId: session.experimentId,\n variationId: session.initialVariationId,\n },\n launch.apiOrigin,\n );\n } catch {}\n return true;\n } catch {\n if (ownsActiveEditor) cleanupActiveEditor();\n return false;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport function getActiveEditorSession(): ActiveEditorSession | null {\n return activeSession;\n}\n\nexport const __test = {\n reset: cleanupActiveEditor,\n};\n", "export type PublicationStatus = \"ok\" | \"pending\" | \"warning\" | \"failed\";\n\nexport type VariationSaveOutcome = {\n saved: boolean;\n artifactHash: string | null;\n publication: {\n status: PublicationStatus;\n code: string;\n message: string;\n } | null;\n};\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function parseVariationSaveOutcome(\n value: unknown,\n): VariationSaveOutcome | null {\n const payload = record(value);\n if (!payload || typeof payload.saved !== \"boolean\") return null;\n if (!payload.saved) {\n return payload.publication === null\n ? { saved: false, artifactHash: null, publication: null }\n : null;\n }\n if (\n typeof payload.artifact_hash !== \"string\" ||\n !payload.artifact_hash.trim()\n ) {\n return null;\n }\n const publication = record(payload.publication);\n if (\n !publication ||\n (publication.status !== \"ok\" &&\n publication.status !== \"pending\" &&\n publication.status !== \"warning\" &&\n publication.status !== \"failed\") ||\n typeof publication.code !== \"string\" ||\n !publication.code ||\n typeof publication.message !== \"string\" ||\n !publication.message\n ) {\n return null;\n }\n return {\n saved: true,\n artifactHash: payload.artifact_hash,\n publication: {\n status: publication.status,\n code: publication.code,\n message: publication.message,\n },\n };\n}\n", "import type {\n ActiveEditorSession,\n ClaimedEditorCommand,\n EditorArtifacts,\n EditorBrowserCommand,\n EditorVariation,\n} from \"./types\";\nimport {\n parseVariationSaveOutcome,\n type VariationSaveOutcome,\n} from \"./publication-result\";\n\nexport class EditorApiError extends Error {\n readonly outcome: VariationSaveOutcome | null;\n\n constructor(\n message: string,\n readonly status: number,\n readonly payload?: Record<string, unknown> | null,\n ) {\n super(message);\n this.outcome = parseVariationSaveOutcome(payload);\n }\n}\n\ntype FetchLike = typeof fetch;\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n}\n\nfunction parseArtifacts(value: unknown): EditorArtifacts {\n const input = record(value) ?? {};\n return {\n mutations: Array.isArray(input.mutations) ? input.mutations as EditorArtifacts[\"mutations\"] : [],\n customCss: typeof input.customCss === \"string\" ? input.customCss : \"\",\n customJs: typeof input.customJs === \"string\" ? input.customJs : \"\",\n };\n}\n\nconst EDITOR_COMMANDS = new Set<EditorBrowserCommand>([\n \"navigate\", \"reload\", \"back\", \"forward\", \"click\", \"type\", \"wait_for\",\n \"snapshot\", \"screenshot\", \"eval_readonly\", \"console_logs\", \"network_logs\",\n \"network_probe\", \"current_url\", \"select_element\", \"apply_artifacts\",\n]);\n\nexport class EditorApi {\n constructor(\n private readonly apiOrigin: string,\n private readonly session: ActiveEditorSession,\n private readonly fetchImpl: FetchLike = (...args) => fetch(...args),\n ) {}\n\n private url(path: string, variationId?: string): string {\n const url = new URL(path, this.apiOrigin);\n if (variationId) url.searchParams.set(\"variationId\", variationId);\n return url.toString();\n }\n\n private async request(\n url: string,\n init: RequestInit,\n ): Promise<Record<string, unknown>> {\n const response = await this.fetchImpl(url, {\n ...init,\n credentials: \"omit\",\n cache: \"no-store\",\n referrerPolicy: \"no-referrer\",\n headers: {\n Authorization: `Bearer ${this.session.bearer}`,\n ...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(init.headers ?? {}),\n },\n });\n const payload = record(await response.json().catch(() => null));\n if (!response.ok || payload?.ok === false) {\n throw new EditorApiError(\n typeof payload?.error === \"string\" ? payload.error : `Editor API failed (${response.status})`,\n response.status,\n payload,\n );\n }\n return payload ?? {};\n }\n\n async loadArtifacts(variationId: string): Promise<{\n variation: EditorVariation;\n artifacts: EditorArtifacts;\n }> {\n const payload = await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/artifacts`, variationId),\n { method: \"GET\" },\n );\n const variation = record(payload.variation) ?? {};\n if (typeof variation.artifactHash !== \"string\" || !variation.artifactHash) {\n throw new EditorApiError(\"Editor load response did not include an artifact hash\", 500, payload);\n }\n return {\n variation: {\n id: typeof variation.id === \"string\" ? variation.id : variationId,\n name: typeof variation.name === \"string\" ? variation.name : \"Variation\",\n artifactHash: variation.artifactHash,\n reviewStatus: typeof variation.reviewStatus === \"string\" ? variation.reviewStatus : null,\n },\n artifacts: parseArtifacts(payload.artifacts),\n };\n }\n\n async saveArtifacts(\n variationId: string,\n artifacts: EditorArtifacts,\n expectedPriorHash: string,\n ): Promise<{\n artifactHash: string;\n reviewStatus: string | null;\n outcome: VariationSaveOutcome;\n warningIssues: Array<{ code?: string; message?: string }>;\n artifacts: EditorArtifacts;\n }> {\n const payload = await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/artifacts`, variationId),\n {\n method: \"PATCH\",\n body: JSON.stringify({ ...artifacts, expectedPriorHash }),\n },\n );\n const parsedOutcome = parseVariationSaveOutcome(payload);\n const hasPublicationOutcomeFields =\n Object.prototype.hasOwnProperty.call(payload, \"saved\") ||\n Object.prototype.hasOwnProperty.call(payload, \"artifact_hash\") ||\n Object.prototype.hasOwnProperty.call(payload, \"publication\");\n const legacyArtifactHash =\n typeof payload.artifactHash === \"string\" && payload.artifactHash.trim()\n ? payload.artifactHash\n : null;\n const outcome =\n parsedOutcome ??\n (!hasPublicationOutcomeFields\n ? {\n saved: true,\n artifactHash: legacyArtifactHash,\n publication: {\n status: \"ok\" as const,\n code: \"variation_saved\",\n message: \"Saved\",\n },\n }\n : null);\n if (!outcome?.saved || !outcome.artifactHash) {\n throw new EditorApiError(\"Editor save response did not include a complete publication outcome\", 500, payload);\n }\n return {\n artifactHash: outcome.artifactHash,\n reviewStatus: typeof payload.reviewStatus === \"string\" ? payload.reviewStatus : null,\n outcome,\n warningIssues: Array.isArray(payload.warningIssues)\n ? payload.warningIssues as Array<{ code?: string; message?: string }>\n : [],\n artifacts: parseArtifacts(payload.artifacts),\n };\n }\n\n async extendSession(): Promise<string | null> {\n const payload = await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/extend`),\n { method: \"POST\" },\n );\n const session = record(payload.session);\n return typeof session?.expiresAt === \"string\" ? session.expiresAt : null;\n }\n\n async revoke(): Promise<void> {\n await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}`),\n { method: \"DELETE\" },\n );\n }\n\n\n async claimCommands(limit = 10): Promise<ClaimedEditorCommand[]> {\n const url = this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/commands`);\n const commandUrl = new URL(url);\n commandUrl.searchParams.set(\"limit\", String(Math.max(1, Math.min(limit, 20))));\n const payload = await this.request(commandUrl.toString(), { method: \"GET\" });\n if (!Array.isArray(payload.commands)) return [];\n const commands: ClaimedEditorCommand[] = [];\n for (const value of payload.commands) {\n const command = record(value);\n const commandId = typeof command?.commandId === \"string\" ? command.commandId : \"\";\n const commandName = typeof command?.command === \"string\" ? command.command : \"\";\n if (!commandId || !EDITOR_COMMANDS.has(commandName as EditorBrowserCommand)) continue;\n commands.push({\n commandId,\n command: commandName as EditorBrowserCommand,\n args: record(command?.args) ?? {},\n expiresAt: typeof command?.expiresAt === \"string\" ? command.expiresAt : null,\n });\n }\n return commands;\n }\n\n async completeCommand(\n commandId: string,\n completion: { result: Record<string, unknown> } | { error: string },\n ): Promise<void> {\n await this.request(\n this.url(`/api/editor-sessions/${encodeURIComponent(this.session.sid)}/commands`),\n {\n method: \"PATCH\",\n body: JSON.stringify({ commandId, ...completion }),\n },\n );\n }\n}\n", "const UNSTABLE_ID = /(?:^|[-_])(react|vue|ember|svelte|uid|uuid|random|generated)[-_]?|\\d{5,}/i;\nconst UNSTABLE_CLASS = /^(active|current|selected|hover|focus|open|closed|js-|is-|has-)|\\d{4,}/i;\n\nfunction escapeCss(value: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(value);\n }\n return value.replace(/[^a-zA-Z0-9_-]/g, (character) => `\\\\${character}`);\n}\n\nfunction quotedAttribute(name: string, value: string): string {\n return `[${name}=\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"]`;\n}\n\nfunction isUnique(selector: string, root: ParentNode): boolean {\n try {\n return root.querySelectorAll(selector).length === 1;\n } catch {\n return false;\n }\n}\n\nfunction stableId(element: Element): string | null {\n const id = element.id.trim();\n return id && id.length <= 80 && !UNSTABLE_ID.test(id) ? id : null;\n}\n\nfunction stableAttribute(element: Element): { name: string; value: string } | null {\n const names = [\"data-testid\", \"data-test\", \"data-cy\", \"data-drip-id\", \"name\", \"aria-label\"];\n for (const name of names) {\n const value = element.getAttribute(name)?.trim();\n if (value && value.length <= 120) return { name, value };\n }\n for (const attribute of Array.from(element.attributes)) {\n if (\n attribute.name.startsWith(\"data-\") &&\n !attribute.name.startsWith(\"data-react\") &&\n attribute.value &&\n attribute.value.length <= 120 &&\n !UNSTABLE_ID.test(attribute.value)\n ) {\n return { name: attribute.name, value: attribute.value };\n }\n }\n return null;\n}\n\nfunction stableClasses(element: Element): string[] {\n return Array.from(element.classList)\n .filter((name) => name.length <= 64 && !UNSTABLE_CLASS.test(name))\n .slice(0, 2);\n}\n\nfunction segment(element: Element, root: ParentNode): string {\n const tag = element.tagName.toLowerCase();\n const id = stableId(element);\n if (id) {\n const candidate = `#${escapeCss(id)}`;\n if (isUnique(candidate, root)) return candidate;\n }\n const attribute = stableAttribute(element);\n if (attribute) {\n const candidate = `${tag}${quotedAttribute(attribute.name, attribute.value)}`;\n if (isUnique(candidate, root)) return candidate;\n }\n const classes = stableClasses(element);\n if (classes.length) {\n const candidate = `${tag}.${classes.map(escapeCss).join(\".\")}`;\n if (isUnique(candidate, root)) return candidate;\n }\n const parent = element.parentElement;\n if (!parent) return tag;\n const sameTag = Array.from(parent.children).filter((child) => child.tagName === element.tagName);\n return sameTag.length > 1\n ? `${tag}:nth-of-type(${sameTag.indexOf(element) + 1})`\n : tag;\n}\n\nexport function generateDeterministicSelector(\n element: Element,\n root: ParentNode = document,\n): string {\n const ownerDocument = element.ownerDocument ?? document;\n const id = stableId(element);\n if (id) {\n const candidate = `#${escapeCss(id)}`;\n if (isUnique(candidate, root)) return candidate;\n }\n const direct = segment(element, root);\n if (isUnique(direct, root)) return direct;\n\n const parts = [direct];\n let current = element.parentElement;\n while (current && current !== ownerDocument.documentElement && parts.length < 5) {\n const part = segment(current, root);\n parts.unshift(part);\n const candidate = parts.join(\" > \");\n if (isUnique(candidate, root)) return candidate;\n if (part.startsWith(\"#\")) break;\n current = current.parentElement;\n }\n return parts.join(\" > \");\n}\n\nexport function elementLabel(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const className = stableClasses(element)[0];\n const rect = element.getBoundingClientRect();\n return `${tag}${className ? `.${className}` : \"\"} ${Math.round(rect.width)}x${Math.round(rect.height)}`;\n}\n", "import type { Mutation, MutationAction } from \"../types\";\nimport { EditorApi, EditorApiError } from \"./api\";\nimport type { ArtifactCommandAudit, EditorController } from \"./controller\";\nimport { generateDeterministicSelector } from \"./selector\";\nimport type {\n ClaimedEditorCommand,\n EditorArtifacts,\n EditorBrowserCommand,\n} from \"./types\";\n\nconst POLL_INTERVAL_MS = 900;\nconst MAX_LOGS = 80;\nconst REDACTED = \"[redacted]\";\nconst SENSITIVE_KEY = /(?:account|address|auth(?:orization)?|bearer|card|cookie|credential|customer|cvv|email|name|pass(?:word|wd)?|payment|phone|postal|secret|session|ssn|token|user|value|zip)/i;\nconst EMAIL = /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi;\nconst JWT = /\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\b/g;\nconst AUTH_VALUE = /\\b(?:bearer|basic)\\s+[A-Za-z0-9._~+\\/-]+=*/gi;\nconst LONG_NUMBER = /\\b(?:\\+?\\d[\\d .()-]{6,}\\d)\\b/g;\nconst MUTATION_ACTIONS = new Set<MutationAction>([\n \"html\", \"text\", \"setText\", \"attribute\", \"style\", \"setStyle\", \"remove\",\n \"insertBefore\", \"insertAfter\",\n]);\n\nexport type EditorCommandResult = { ok: boolean; [key: string]: unknown };\ntype CommandExecution = {\n result: EditorCommandResult;\n afterAcknowledge?: () => void;\n};\n\ntype NavigationActions = {\n navigate(url: string): void;\n reload(): void;\n back(): void;\n forward(): void;\n};\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n}\n\nfunction string(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction isLoopbackOrigin(origin: string): boolean {\n try {\n const hostname = new URL(origin).hostname.toLowerCase();\n return hostname === \"localhost\" || hostname.endsWith(\".localhost\") ||\n hostname === \"127.0.0.1\" || hostname === \"::1\" || hostname === \"[::1]\";\n } catch {\n return false;\n }\n}\n\nfunction sanitizedUrl(value: string, base?: string): string {\n try {\n const url = new URL(value, base);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return `${url.protocol}${REDACTED}`;\n }\n url.username = \"\";\n url.password = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n } catch {\n return REDACTED;\n }\n}\n\nfunction sanitizeDiagnosticText(value: string): string {\n return value\n .replace(/https?:\\/\\/[^\\s\"'<>]+/gi, (url) => sanitizedUrl(url))\n .replace(EMAIL, REDACTED)\n .replace(JWT, REDACTED)\n .replace(AUTH_VALUE, REDACTED)\n .replace(LONG_NUMBER, REDACTED)\n .replace(/\\b(?:api[-_]?key|authorization|cookie|password|secret|token)\\s*[:=]\\s*[^\\s,;]+/gi, (match) => {\n const separator = match.includes(\":\") ? \":\" : \"=\";\n return `${match.split(separator, 1)[0]}${separator}${REDACTED}`;\n });\n}\n\nfunction cloneSafe(value: unknown, depth = 0, key = \"\"): unknown {\n if (key && SENSITIVE_KEY.test(key)) return REDACTED;\n if (value === null || typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return typeof value === \"string\" ? sanitizeDiagnosticText(value).slice(0, 500) : value;\n }\n if (typeof value === \"undefined\") return null;\n if (depth > 4) return \"[truncated]\";\n if (value instanceof Element) return elementSummary(value);\n if (Array.isArray(value)) return value.slice(0, 120).map((item) => cloneSafe(item, depth + 1));\n if (typeof value === \"object\") {\n const output: Record<string, unknown> = {};\n for (const [entryKey, entry] of Object.entries(value as Record<string, unknown>).slice(0, 80)) {\n try { output[entryKey] = cloneSafe(entry, depth + 1, entryKey); } catch {}\n }\n return output;\n }\n return `[${typeof value}]`;\n}\n\nfunction visibleText(element: Element | null): string {\n if (!element) return \"\";\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement || element instanceof HTMLFormElement ||\n (element instanceof HTMLElement && element.isContentEditable)) {\n return \"\";\n }\n return (element.textContent ?? \"\").trim().replace(/\\s+/g, \" \");\n}\n\nfunction elementSummary(element: Element | null): Record<string, unknown> | null {\n if (!element) return null;\n let rect: Record<string, number> | null = null;\n try {\n const box = element.getBoundingClientRect();\n rect = {\n x: Math.round(box.x), y: Math.round(box.y),\n width: Math.round(box.width), height: Math.round(box.height),\n };\n } catch {}\n return {\n selector: generateDeterministicSelector(element),\n tag: element.tagName.toLowerCase(),\n text: sanitizeDiagnosticText(visibleText(element)).slice(0, 220) || null,\n role: element.getAttribute(\"role\"),\n href: element instanceof HTMLAnchorElement ? sanitizedUrl(element.href) : null,\n name: element.getAttribute(\"name\"),\n type: element.getAttribute(\"type\"),\n rect,\n };\n}\n\nfunction sanitizeNetworkEntry(entry: Record<string, unknown>): Record<string, unknown> {\n return {\n ...cloneSafe(entry) as Record<string, unknown>,\n ...(typeof entry.url === \"string\" ? { url: sanitizedUrl(entry.url) } : {}),\n };\n}\n\nfunction findTarget(args: Record<string, unknown>): {\n ok: boolean;\n element?: Element;\n mode?: string;\n error?: string;\n repairHint?: string;\n} {\n const selector = string(args.selector);\n if (selector) {\n try {\n const element = document.querySelector(selector);\n return element\n ? { ok: true, element, mode: \"selector\" }\n : {\n ok: false,\n error: \"Selector target not found.\",\n repairHint: \"Call browser_snapshot or browser_select_element to find a selector that exists on the live page.\",\n };\n } catch {\n return {\n ok: false,\n error: `Invalid selector: ${selector}`,\n repairHint: \"Pass visible text or a valid CSS selector.\",\n };\n }\n }\n const query = string(args.text ?? args.selectorOrText ?? args.instruction ?? args.condition);\n if (!query) return { ok: false, error: \"Target not found\" };\n try {\n const element = document.querySelector(query);\n if (element) return { ok: true, element, mode: \"selectorOrText\" };\n } catch {}\n const lower = query.toLowerCase();\n const candidates = Array.from(document.querySelectorAll(\n \"button,a,input,textarea,select,label,[role='button'],[onclick],[data-testid]\",\n )).slice(0, 350).filter((element) => {\n const aria = `${element.getAttribute(\"aria-label\") ?? \"\"} ${element.getAttribute(\"title\") ?? \"\"} ${element.getAttribute(\"value\") ?? \"\"}`.toLowerCase();\n return visibleText(element).toLowerCase().includes(lower) || aria.includes(lower);\n });\n if (candidates.length === 1) return { ok: true, element: candidates[0], mode: \"text\" };\n if (candidates.length > 1) {\n return {\n ok: false,\n error: \"Browser target text is ambiguous.\",\n repairHint: \"Pass the exact selector from browser_snapshot/browser_select_element instead of loose text.\",\n };\n }\n return { ok: false, error: \"Target not found\" };\n}\n\nfunction parseMutation(value: unknown): Mutation | null {\n const input = record(value);\n const selector = string(input?.selector);\n const action = input?.action;\n if (!selector || typeof action !== \"string\" || !MUTATION_ACTIONS.has(action as MutationAction)) return null;\n const mutation: Mutation = { selector, action: action as MutationAction };\n if (typeof input?.html === \"string\") mutation.html = input.html;\n if (typeof input?.text === \"string\") mutation.text = input.text;\n const attribute = record(input?.attribute);\n if (attribute && typeof attribute.name === \"string\" &&\n (typeof attribute.value === \"string\" || attribute.value === null)) {\n mutation.attribute = { name: attribute.name, value: attribute.value };\n }\n const attributes = record(input?.attributes);\n if (attributes) {\n mutation.attributes = Object.fromEntries(Object.entries(attributes).filter(\n ([, entry]) => typeof entry === \"string\" || entry === null,\n )) as Record<string, string | null>;\n }\n const styles = record(input?.styles);\n if (styles) {\n mutation.styles = Object.fromEntries(Object.entries(styles).filter(\n ([, entry]) => typeof entry === \"string\",\n )) as Record<string, string>;\n }\n return mutation;\n}\n\nfunction parseArtifacts(value: unknown): EditorArtifacts | null {\n const input = record(value);\n if (!input || !Array.isArray(input.mutations)) return null;\n const mutations = input.mutations.map(parseMutation);\n if (mutations.some((mutation) => mutation === null)) return null;\n return {\n mutations: mutations as Mutation[],\n customCss: typeof input.customCss === \"string\" ? input.customCss : \"\",\n customJs: typeof input.customJs === \"string\" ? input.customJs : \"\",\n };\n}\n\nfunction auditResult(audit: ArtifactCommandAudit): EditorCommandResult {\n return { ...audit };\n}\n\nexport class EditorCommandExecutor {\n private readonly consoleLogs: Array<Record<string, unknown>> = [];\n private readonly networkLogs: Array<Record<string, unknown>> = [];\n private restoreConsole: (() => void) | null = null;\n private performanceObserver: PerformanceObserver | null = null;\n\n constructor(\n private readonly controller: EditorController,\n private readonly navigation: NavigationActions = {\n navigate: (url) => location.assign(url),\n reload: () => location.reload(),\n back: () => history.back(),\n forward: () => history.forward(),\n },\n ) {}\n\n start(): void {\n if (this.restoreConsole) return;\n const originals = new Map<\"log\" | \"info\" | \"warn\" | \"error\", (...args: unknown[]) => void>();\n for (const level of [\"log\", \"info\", \"warn\", \"error\"] as const) {\n const original = console[level];\n originals.set(level, original);\n console[level] = (...args: unknown[]) => {\n this.consoleLogs.push({ level, args: cloneSafe(args), ts: Date.now() });\n this.consoleLogs.splice(0, Math.max(0, this.consoleLogs.length - MAX_LOGS));\n original.apply(console, args);\n };\n }\n this.restoreConsole = () => {\n for (const [level, original] of originals) console[level] = original;\n this.restoreConsole = null;\n };\n if (typeof PerformanceObserver !== \"undefined\") {\n try {\n this.performanceObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.networkLogs.push({\n url: entry.name,\n type: entry.entryType,\n startTime: Math.round(entry.startTime),\n duration: Math.round(entry.duration),\n });\n }\n this.networkLogs.splice(0, Math.max(0, this.networkLogs.length - MAX_LOGS));\n });\n this.performanceObserver.observe({ type: \"resource\", buffered: true });\n } catch {}\n }\n }\n\n stop(): void {\n this.restoreConsole?.();\n this.performanceObserver?.disconnect();\n this.performanceObserver = null;\n }\n\n async execute(command: ClaimedEditorCommand): Promise<CommandExecution> {\n const args = command.args;\n switch (command.command) {\n case \"current_url\":\n return {\n result: {\n ok: true,\n url: sanitizedUrl(location.href),\n originalUrl: sanitizedUrl(location.href),\n },\n };\n case \"snapshot\":\n return { result: { ok: true, snapshot: this.snapshot() } };\n case \"console_logs\":\n return {\n result: {\n ok: true,\n logs: this.consoleLogs.slice(-50).map(\n (entry) => cloneSafe(entry) as Record<string, unknown>,\n ),\n },\n };\n case \"network_logs\": {\n const filter = string(args.filter).toLowerCase();\n const logs = this.networkLogs.slice(-80).map(sanitizeNetworkEntry).filter(\n (entry) => !filter || JSON.stringify(entry).toLowerCase().includes(filter),\n );\n return { result: { ok: true, logs } };\n }\n case \"screenshot\":\n return {\n result: {\n ok: false,\n error: \"Live-page screenshot capture is unsupported in the merchant SDK runtime.\",\n repairHint: \"Use browser_snapshot for DOM evidence or capture the store tab through the connected browser runner.\",\n screenshot: { captured: false, reason: \"unsupported_live_origin\" },\n },\n };\n case \"eval_readonly\":\n return { result: this.evaluateReadonly(args) };\n case \"click\":\n return { result: this.click(args) };\n case \"type\":\n return { result: this.type(args) };\n case \"select_element\":\n return { result: this.selectElement(args) };\n case \"wait_for\":\n return { result: await this.waitFor(args) };\n case \"network_probe\":\n return { result: await this.networkProbe(args) };\n case \"apply_artifacts\": {\n const artifacts = parseArtifacts(args.artifacts);\n return {\n result: artifacts\n ? auditResult(this.controller.applyCommandArtifacts(artifacts))\n : { ok: false, error: \"apply_artifacts requires a valid full artifact snapshot.\" },\n };\n }\n case \"navigate\": {\n const rawUrl = string(args.url);\n try {\n const url = new URL(rawUrl, this.controller.session.targetOrigin);\n if (url.origin !== this.controller.session.targetOrigin) {\n return { result: { ok: false, error: \"Navigation must stay on the editor session origin.\" } };\n }\n return {\n result: { ok: true, url: sanitizedUrl(url.toString()) },\n afterAcknowledge: () => this.navigation.navigate(url.toString()),\n };\n } catch {\n return { result: { ok: false, error: \"Invalid navigation URL\" } };\n }\n }\n case \"reload\":\n return { result: { ok: true }, afterAcknowledge: () => this.navigation.reload() };\n case \"back\":\n return { result: { ok: true }, afterAcknowledge: () => this.navigation.back() };\n case \"forward\":\n return { result: { ok: true }, afterAcknowledge: () => this.navigation.forward() };\n }\n }\n\n private snapshot(): Record<string, unknown> {\n const summarize = (selector: string, limit: number) => Array.from(\n document.querySelectorAll(selector),\n ).slice(0, limit).map(elementSummary).filter(Boolean);\n return {\n title: document.title ? sanitizeDiagnosticText(document.title).slice(0, 220) : null,\n url: sanitizedUrl(location.href),\n originalUrl: sanitizedUrl(location.href),\n bodyTextLength: (document.body.textContent ?? \"\").length,\n headings: summarize(\"h1,h2,h3\", 18),\n interactive: summarize(\"button,a,input,textarea,select,[role='button'],form\", 45),\n generated: summarize(\"[data-drip-preview-generated], [class*='apex-'], [class*='abt-'], [class*='drip-']\", 20),\n consoleCount: this.consoleLogs.length,\n networkCount: this.networkLogs.length,\n };\n }\n\n private click(args: Record<string, unknown>): EditorCommandResult {\n const target = findTarget(args);\n if (!target.ok || !target.element) return target as EditorCommandResult;\n try { target.element.scrollIntoView({ block: \"center\", inline: \"center\" }); } catch {}\n if (target.element instanceof HTMLElement) target.element.click();\n else target.element.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n return { ok: true, element: elementSummary(target.element), targetResolution: { mode: target.mode } };\n }\n\n private type(args: Record<string, unknown>): EditorCommandResult {\n const target = findTarget(args);\n if (!target.ok || !target.element) return target as EditorCommandResult;\n const value = typeof args.value === \"string\" ? args.value : String(args.value ?? \"\");\n if (target.element instanceof HTMLInputElement || target.element instanceof HTMLTextAreaElement || target.element instanceof HTMLSelectElement) {\n target.element.focus();\n target.element.value = value;\n } else if (target.element instanceof HTMLElement && target.element.isContentEditable) {\n target.element.focus();\n target.element.textContent = value;\n } else {\n return { ok: false, error: \"Target does not accept text input\" };\n }\n target.element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: true, element: elementSummary(target.element), valueLength: value.length };\n }\n\n private selectElement(args: Record<string, unknown>): EditorCommandResult {\n const target = findTarget(args);\n return target.ok && target.element\n ? { ok: true, element: elementSummary(target.element), targetResolution: { mode: target.mode } }\n : target as EditorCommandResult;\n }\n\n private async waitFor(args: Record<string, unknown>): Promise<EditorCommandResult> {\n const timeout = Math.max(100, Math.min(Number(args.timeoutMs) || 5_000, 15_000));\n const startedAt = Date.now();\n while (Date.now() - startedAt < timeout) {\n const target = findTarget(args);\n if (target.ok && target.element) {\n return { ok: true, element: elementSummary(target.element), waitedMs: Date.now() - startedAt };\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return { ok: false, error: \"Target not found before timeout\", waitedMs: Date.now() - startedAt };\n }\n\n private async networkProbe(args: Record<string, unknown>): Promise<EditorCommandResult> {\n const startIndex = this.networkLogs.length;\n const waitMs = Math.max(250, Math.min(Number(args.waitMs) || 2_000, 8_000));\n const action = this.click(args);\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n const entries = this.networkLogs.slice(startIndex).slice(-30).map(sanitizeNetworkEntry);\n return {\n ok: action.ok,\n attemptedAction: action.ok,\n action,\n waitedMs: waitMs,\n currentUrl: sanitizedUrl(location.href),\n originalUrl: sanitizedUrl(location.href),\n networkObserved: entries.length > 0,\n successfulRequestCount: entries.length,\n entries,\n ...(entries.length ? {} : {\n repairHint: \"No resource request was observed after the action. Inspect the handler and selector, then retry browser_network_probe.\",\n }),\n };\n }\n\n private evaluateReadonly(args: Record<string, unknown>): EditorCommandResult {\n if (!isLoopbackOrigin(this.controller.session.targetOrigin)) {\n return {\n ok: false,\n error: \"eval_readonly is unsupported on live merchant origins.\",\n repairHint: \"Use browser_snapshot, browser_select_element, or another allowlisted inspection command.\",\n };\n }\n if (string(args.code)) {\n return {\n ok: false,\n error: \"JavaScript evaluation is disabled in the merchant SDK runtime.\",\n repairHint: \"Pass an allowlisted operation: document_title, current_url, viewport, element_exists, element_count, or element_summary.\",\n };\n }\n const operation = string(args.operation);\n if (operation === \"document_title\") {\n return { ok: true, operation, result: sanitizeDiagnosticText(document.title).slice(0, 220) };\n }\n if (operation === \"current_url\") {\n return { ok: true, operation, result: sanitizedUrl(location.href) };\n }\n if (operation === \"viewport\") {\n return {\n ok: true,\n operation,\n result: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n if ([\"element_exists\", \"element_count\", \"element_summary\"].includes(operation)) {\n const selector = string(args.selector);\n if (!selector) return { ok: false, error: `${operation} requires a selector.` };\n try {\n const elements = Array.from(document.querySelectorAll(selector));\n if (operation === \"element_exists\") {\n return { ok: true, operation, result: elements.length > 0 };\n }\n if (operation === \"element_count\") {\n return { ok: true, operation, result: elements.length };\n }\n return { ok: true, operation, result: elementSummary(elements[0] ?? null) };\n } catch {\n return { ok: false, error: \"The inspection selector is invalid.\" };\n }\n }\n return {\n ok: false,\n error: \"eval_readonly requires an allowlisted declarative operation.\",\n repairHint: \"Use document_title, current_url, viewport, element_exists, element_count, or element_summary.\",\n };\n }\n}\n\nexport class EditorCommandPoller {\n private running = false;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private polling = false;\n\n constructor(\n private readonly api: EditorApi,\n private readonly executor: EditorCommandExecutor,\n ) {}\n\n start(): void {\n if (this.running) return;\n this.running = true;\n this.executor.start();\n void this.poll();\n }\n\n stop(): void {\n this.running = false;\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.executor.stop();\n }\n\n private async poll(): Promise<void> {\n if (!this.running || this.polling) return;\n this.polling = true;\n try {\n const commands = await this.api.claimCommands();\n for (const command of commands) {\n if (!this.running) break;\n let execution: CommandExecution;\n try {\n execution = await this.executor.execute(command);\n } catch (error) {\n await this.api.completeCommand(command.commandId, {\n error: error instanceof Error ? error.message : \"Browser command execution failed\",\n });\n continue;\n }\n await this.api.completeCommand(command.commandId, { result: execution.result });\n if (execution.afterAcknowledge) {\n const action = execution.afterAcknowledge;\n this.stop();\n setTimeout(action, 0);\n break;\n }\n }\n } catch (error) {\n if (error instanceof EditorApiError && [401, 403, 410].includes(error.status)) {\n this.stop();\n }\n } finally {\n this.polling = false;\n if (this.running) this.timer = setTimeout(() => void this.poll(), POLL_INTERVAL_MS);\n }\n }\n}\n", "const URL_ATTRIBUTES = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\"]);\nconst SAFE_DATA_URL_MEDIA_TYPES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/avif\",\n]);\n\nexport function isSafeMutationAttribute(name: string, value: string | null): boolean {\n const normalizedName = name.trim().toLowerCase();\n if (!normalizedName) return false;\n if (value === null) return true;\n if (normalizedName.startsWith(\"on\") || normalizedName === \"srcdoc\") return false;\n if (!URL_ATTRIBUTES.has(normalizedName)) return true;\n const normalizedValue = value.replace(/[\\u0000-\\u0020]+/g, \"\").toLowerCase();\n if (normalizedValue.startsWith(\"javascript:\")) return false;\n if (!normalizedValue.startsWith(\"data:\")) return true;\n const mediaType = normalizedValue.slice(5).split(/[;,]/, 1)[0];\n return SAFE_DATA_URL_MEDIA_TYPES.has(mediaType);\n}\n\n/**\n * Lightweight HTML sanitizer using the browser's DOMParser.\n * Strips <script> tags, on* event handlers, and javascript: URLs.\n */\nexport function sanitizeHtml(html: string): string {\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n\n // Remove all <script> elements\n for (const script of Array.from(doc.querySelectorAll(\"script\"))) {\n script.remove();\n }\n\n // Walk every element to strip dangerous attributes\n for (const el of Array.from(doc.body.querySelectorAll(\"*\"))) {\n for (const attr of Array.from(el.attributes)) {\n if (!isSafeMutationAttribute(attr.name, attr.value)) {\n el.removeAttribute(attr.name);\n }\n }\n }\n\n return doc.body.innerHTML;\n}\n", "const observers = new Map<MutationObserver, MutationCallback | undefined>();\nlet muteDepth = 0;\n\nexport function registerMutedObserver(\n observer: MutationObserver,\n callback?: MutationCallback,\n): void {\n observers.set(observer, callback);\n}\n\nexport function unregisterMutedObserver(observer: MutationObserver): void {\n observers.delete(observer);\n}\n\nexport function runMuted<T>(fn: () => T): T {\n if (muteDepth === 0) {\n // Deliver records queued BEFORE the muted write to their handlers: a\n // real storefront change in the same task must not be discarded along\n // with the SDK's own write records when the queue drains below.\n for (const [observer, callback] of observers) {\n try {\n const pending = observer.takeRecords();\n if (pending.length && callback) callback(pending, observer);\n } catch {\n // A disconnected or test-double observer must not block SDK writes.\n }\n }\n }\n muteDepth += 1;\n try {\n return fn();\n } finally {\n muteDepth -= 1;\n if (muteDepth === 0) {\n for (const observer of observers.keys()) {\n try {\n observer.takeRecords();\n } catch {\n // A disconnected or test-double observer must not block SDK writes.\n }\n }\n }\n }\n}\n\n", "type ShadowHost = Element & { shadowRoot: ShadowRoot };\n\nconst hosts = new Set<ShadowHost>();\nconst rootObservers = new Map<ShadowRoot, MutationObserver>();\nconst listeners = new Set<(records: MutationRecord[], root: ShadowRoot) => void>();\nlet initialized = false;\n\nfunction registerSubtree(root: ParentNode): void {\n const candidates: Element[] = [];\n if (typeof Element === \"function\" && root instanceof Element) candidates.push(root);\n root.querySelectorAll?.(\"*\")?.forEach((element) => candidates.push(element));\n for (const element of candidates) {\n if (!element.shadowRoot) continue;\n const host = element as ShadowHost;\n if (!hosts.has(host)) {\n hosts.add(host);\n observeRoot(host.shadowRoot);\n }\n registerSubtree(host.shadowRoot);\n }\n}\n\nfunction observeRoot(root: ShadowRoot): void {\n if (typeof MutationObserver === \"undefined\" || rootObservers.has(root)) return;\n const rootObserver = new MutationObserver((records) => {\n for (const record of records) {\n record.addedNodes.forEach((node) => {\n if (typeof Element === \"function\" && node instanceof Element) registerSubtree(node);\n });\n }\n listeners.forEach((listener) => listener(records, root));\n });\n rootObserver.observe(root, { attributes: true, characterData: true, childList: true, subtree: true });\n rootObservers.set(root, rootObserver);\n}\n\nfunction pruneHosts(): void {\n for (const host of hosts) {\n if (!host.isConnected) {\n rootObservers.get(host.shadowRoot)?.disconnect();\n rootObservers.delete(host.shadowRoot);\n hosts.delete(host);\n }\n }\n}\n\nfunction initializeShadowDomSupport(): void {\n if (initialized || typeof document === \"undefined\") return;\n initialized = true;\n registerSubtree(document);\n if (typeof MutationObserver === \"undefined\" || !document.documentElement) return;\n const documentObserver = new MutationObserver((records) => {\n pruneHosts();\n for (const record of records) {\n record.addedNodes.forEach((node) => {\n if (typeof Element === \"function\" && node instanceof Element) registerSubtree(node);\n });\n }\n });\n documentObserver.observe(document.documentElement, { childList: true, subtree: true });\n}\n\nfunction hostsInDocumentOrder(): ShadowHost[] {\n return Array.from(hosts).sort((a, b) => {\n const position = a.compareDocumentPosition(b);\n if (position & Node.DOCUMENT_POSITION_DISCONNECTED) return 0;\n return position & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n}\n\nexport function queryAllDeep(selector: string): Element[] {\n const documentMatches = Array.from(document.querySelectorAll(selector));\n if (documentMatches.length > 0) return documentMatches;\n initializeShadowDomSupport();\n pruneHosts();\n // Re-walk the document on every miss: attachShadow on an already-inserted\n // element produces no mutation record, so the observers cannot see it.\n registerSubtree(document);\n if (hosts.size === 0) return documentMatches;\n\n const matches: Element[] = [];\n for (const host of hostsInDocumentOrder()) {\n host.shadowRoot.querySelectorAll(selector).forEach((el) => matches.push(el));\n }\n return matches;\n}\n\nexport function shadowRootFor(element: Element): ShadowRoot | null {\n if (typeof element.getRootNode !== \"function\") return null;\n const root = element.getRootNode();\n return typeof ShadowRoot === \"function\" && root instanceof ShadowRoot ? root : null;\n}\n\nexport function onShadowMutations(\n listener: (records: MutationRecord[], root: ShadowRoot) => void,\n): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n", "import type { Mutation } from \"./types\";\nimport { matchesOriginalInnerHtmlSnapshot, normalizeCssPropertyName } from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { onShadowMutations, shadowRootFor } from \"./shadow\";\n\ntype Entry = {\n el: Element;\n mutation: Mutation;\n artifactId?: string;\n journalSeq?: number;\n ownerKeys: Set<string>;\n requiresOwner: boolean;\n experimentId?: string;\n variationId?: string;\n appliedAt: number;\n apply: (element: Element, mutation: Mutation) => void;\n times: number[];\n stopped: boolean;\n shadowRoot?: ShadowRoot;\n shadowIndex?: number;\n appliedNodes?: ChildNode[];\n appliedStyles?: Array<[string, string]>;\n};\n\ntype TreatedRoot = {\n entries: Entry[];\n observer: MutationObserver;\n};\n\n// For html treatments, remember the nodes the treatment put in place and\n// attribute subtree changes: a framework hydration revert either replaces\n// them wholesale or restores the pre-treatment original content in place\n// (React/Vue reconciliation), while variant-owned widget activity (a\n// carousel adding slides, a countdown updating text, variation JS appending\n// state) evolves the applied content into something the original never had.\n// Wholesale replaces reassert at any time; in-place full restores reassert\n// within the hydration window; everything else is treated as variant-owned.\n// Partial in-place patches that do not restore the full original are not\n// separable from widget writes \u2014 sites that hit that corner integrate via\n// the drip:hydrated event / hold() API.\nconst IN_PLACE_REVERT_WINDOW_MS = 10_000;\n\nfunction captureAppliedNodes(entry: Entry): void {\n if (entry.mutation.action === \"html\") {\n entry.appliedNodes = Array.from(entry.el.childNodes);\n } else if (entry.mutation.action === \"style\" || entry.mutation.action === \"setStyle\") {\n const style = (entry.el as HTMLElement).style;\n entry.appliedStyles = Object.keys(entry.mutation.styles ?? {}).map((name) => [\n name = normalizeCssPropertyName(name),\n style.getPropertyValue(name),\n ]);\n }\n}\n\nfunction variantContentSurvives(entry: Entry, needsDeepCheck: boolean): boolean {\n const surviving = (entry.appliedNodes ?? []).some(\n (node) => node.isConnected && entry.el.contains(node),\n );\n if (!surviving) return false;\n if (Date.now() - entry.appliedAt > IN_PLACE_REVERT_WINDOW_MS) return true;\n if (!needsDeepCheck) return true;\n // Any captured pre-state counts as a revert target: the server original,\n // or \u2014 with stacked html treatments \u2014 an earlier treatment's content.\n return !matchesOriginalInnerHtmlSnapshot(entry.el, entry.el.innerHTML);\n}\n\nconst pending = new Set<Entry>();\nconst deepChecks = new Set<Entry>();\nconst roots = new Map<Element, TreatedRoot>();\nlet frame: number | null = null;\nlet stopShadowListener: (() => void) | null = null;\n\nfunction perf(): Record<string, unknown> | null {\n if (typeof window === \"undefined\") return null;\n const target = window as Window & { __dripPerf?: Record<string, unknown> };\n return target.__dripPerf = target.__dripPerf ?? {};\n}\n\nfunction matches(entry: Entry, record: MutationRecord): boolean {\n if (!entry.el.isConnected) return false;\n const action = entry.mutation.action;\n if (action === \"style\" || action === \"setStyle\") {\n if (record.type !== \"attributes\" || record.target !== entry.el || record.attributeName !== \"style\") return false;\n const style = (entry.el as HTMLElement).style;\n return entry.appliedStyles!.some(\n ([name, value]) => style.getPropertyValue(name) !== value,\n );\n }\n if (action === \"attribute\") {\n if (record.type !== \"attributes\" || record.target !== entry.el || !record.attributeName) return false;\n const expected = record.attributeName === entry.mutation.attribute?.name\n ? entry.mutation.attribute.value\n : entry.mutation.attributes?.[record.attributeName];\n return expected !== undefined && entry.el.getAttribute(record.attributeName) !== expected;\n }\n if (action === \"html\") return true;\n return record.type !== \"attributes\" && entry.el.textContent !== entry.mutation.text;\n}\n\nfunction markPending(entry: Entry): void {\n pending.add(entry);\n if (entry.mutation.action === \"html\") deepChecks.add(entry);\n}\n\nfunction schedule(): void {\n if (frame !== null) return;\n frame = requestAnimationFrame(() => {\n frame = null;\n const now = Date.now();\n for (const entry of pending) {\n if (entry.stopped || (entry.requiresOwner && entry.ownerKeys.size === 0)) continue;\n entry.times = entry.times.filter((at) => now - at < 10_000);\n if (entry.times.length === 12) {\n entry.stopped = true;\n const metrics = perf();\n if (metrics) metrics.reassert_loop_detected = true;\n continue;\n }\n if (entry.mutation.action === \"html\" && variantContentSurvives(entry, deepChecks.has(entry))) {\n // The change came from inside the still-applied treatment; erasing\n // it would destroy legitimate widget state. Track the evolved\n // subtree instead of reasserting the original static HTML.\n captureAppliedNodes(entry);\n continue;\n }\n entry.times.push(now);\n runMuted(() => entry.apply(entry.el, entry.mutation));\n captureAppliedNodes(entry);\n const metrics = perf();\n if (metrics) metrics.reapply_count = (Number(metrics.reapply_count) || 0) + 1;\n if (entry.mutation.action === \"html\") {\n document.dispatchEvent(new CustomEvent(\"drip:mutation-reapplied\", { detail: {\n experimentId: entry.experimentId,\n variationId: entry.variationId,\n selector: entry.mutation.selector,\n action: entry.mutation.action,\n } }));\n }\n }\n pending.clear();\n deepChecks.clear();\n });\n}\n\nfunction canResurrectViaShadow(treated: TreatedRoot): boolean {\n return treated.entries.some(\n (entry) => !entry.stopped && entry.shadowRoot !== undefined && entry.shadowRoot.host.isConnected,\n );\n}\n\nfunction observe(element: Element): void {\n if (typeof MutationObserver === \"undefined\" || roots.has(element)) return;\n for (const [treatedRoot, treated] of roots) {\n if (treatedRoot.isConnected) continue;\n // A disconnected root whose entries live in a still-connected shadow root\n // stays registered: the shadow listener re-locates those entries on a\n // later widget re-render, and this sweep would otherwise drop a sibling\n // entry whose replacement was not findable in the same mutation batch.\n if (canResurrectViaShadow(treated)) continue;\n treated.observer.disconnect();\n unregisterMutedObserver(treated.observer);\n roots.delete(treatedRoot);\n }\n const entries: Entry[] = [];\n const onRecords: MutationCallback = (records) => {\n for (const record of records) {\n for (const entry of entries) {\n if (!entry.stopped && matches(entry, record)) markPending(entry);\n }\n }\n if (pending.size) schedule();\n };\n const observer = new MutationObserver(onRecords);\n roots.set(element, { entries, observer });\n registerMutedObserver(observer, onRecords);\n observer.observe(element, { attributes: true, characterData: true, childList: true, subtree: true });\n}\n\nfunction ensureShadowObserver(): void {\n stopShadowListener ??= onShadowMutations((_records, root) => {\n for (const [rootElement, treated] of Array.from(roots.entries())) {\n for (const entry of Array.from(treated.entries)) {\n if (entry.stopped || entry.shadowRoot !== root || entry.el.isConnected) continue;\n try {\n const candidates = Array.from(root.querySelectorAll(entry.mutation.selector));\n const replacement = candidates[entry.shadowIndex ?? 0];\n if (!replacement || replacement === entry.el) continue;\n // Migrate the entry to the replacement's root (mirrors\n // replayReassertSentinelEntry): an entry left keyed under the\n // disconnected element is purged by the next observe() sweep.\n const index = treated.entries.indexOf(entry);\n if (index >= 0) removeEntry(treated.entries, index);\n if (treated.entries.length === 0) {\n treated.observer.disconnect();\n unregisterMutedObserver(treated.observer);\n roots.delete(rootElement);\n }\n observe(replacement);\n entry.el = replacement;\n entry.shadowIndex = candidates.indexOf(replacement);\n roots.get(replacement)?.entries.push(entry);\n markPending(entry);\n } catch {}\n }\n }\n if (pending.size) schedule();\n });\n}\n\nexport function trackAppliedMutation(\n element: Element,\n mutation: Mutation,\n context: {\n experimentId?: string;\n variationId?: string;\n journalSeq?: number;\n artifactId?: string;\n ownerKeys?: readonly string[];\n },\n apply: (element: Element, mutation: Mutation) => void,\n): void {\n if (mutation.action === \"remove\" || mutation.action === \"insertBefore\" || mutation.action === \"insertAfter\") return;\n observe(element);\n const entries = roots.get(element)?.entries;\n if (!entries) return;\n const shadowRoot = shadowRootFor(element);\n if (shadowRoot) ensureShadowObserver();\n const existing = entries.find((entry) => context.journalSeq !== undefined\n ? entry.journalSeq === context.journalSeq\n : entry.mutation === mutation);\n if (existing) {\n context.ownerKeys?.forEach((ownerKey) => existing.ownerKeys.add(ownerKey));\n Object.assign(existing, {\n experimentId: context.experimentId,\n variationId: context.variationId,\n journalSeq: context.journalSeq,\n artifactId: context.artifactId,\n appliedAt: Date.now(),\n apply,\n });\n captureAppliedNodes(existing);\n } else {\n const entry: Entry = {\n el: element,\n mutation,\n experimentId: context.experimentId,\n variationId: context.variationId,\n journalSeq: context.journalSeq,\n artifactId: context.artifactId,\n ownerKeys: new Set(context.ownerKeys ?? []),\n requiresOwner: context.ownerKeys !== undefined,\n appliedAt: Date.now(),\n apply,\n times: [],\n stopped: false,\n shadowRoot: shadowRoot ?? undefined,\n shadowIndex: shadowRoot\n ? Array.from(shadowRoot.querySelectorAll(mutation.selector)).indexOf(element)\n : undefined,\n };\n captureAppliedNodes(entry);\n entries.push(entry);\n }\n}\n\nfunction removeEntry(entries: Entry[], index: number): void {\n const [entry] = entries.splice(index, 1);\n pending.delete(entry);\n deepChecks.delete(entry);\n}\n\nexport function addReassertSentinelOwners(\n existingOwnerKeys: ReadonlySet<string>,\n ownerKeys: readonly string[],\n artifactId?: string,\n): void {\n if (!existingOwnerKeys.size || !ownerKeys.length) return;\n for (const { entries } of roots.values()) {\n for (const entry of entries) {\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (!Array.from(existingOwnerKeys).some((ownerKey) => entry.ownerKeys.has(ownerKey))) continue;\n ownerKeys.forEach((ownerKey) => entry.ownerKeys.add(ownerKey));\n }\n }\n}\n\nexport function resetReassertSentinelForOwner(\n ownerKey: string,\n artifactId?: string,\n): void {\n for (const [element, root] of Array.from(roots.entries())) {\n for (let index = root.entries.length - 1; index >= 0; index -= 1) {\n const entry = root.entries[index];\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (!entry.ownerKeys.delete(ownerKey)) continue;\n if (entry.requiresOwner && entry.ownerKeys.size === 0) removeEntry(root.entries, index);\n }\n if (root.entries.length) continue;\n root.observer.disconnect();\n unregisterMutedObserver(root.observer);\n roots.delete(element);\n }\n if (roots.size === 0 && frame !== null) {\n cancelAnimationFrame(frame);\n frame = null;\n pending.clear();\n deepChecks.clear();\n }\n}\n\nexport function replayReassertSentinelEntry(\n journalSeq: number,\n element: Element,\n): void {\n for (const [currentElement, root] of Array.from(roots.entries())) {\n const index = root.entries.findIndex((entry) => entry.journalSeq === journalSeq);\n if (index < 0) continue;\n const entry = root.entries[index];\n if (entry.el === element) {\n entry.appliedAt = Date.now();\n captureAppliedNodes(entry);\n return;\n }\n removeEntry(root.entries, index);\n if (root.entries.length === 0) {\n root.observer.disconnect();\n unregisterMutedObserver(root.observer);\n roots.delete(currentElement);\n }\n observe(element);\n entry.el = element;\n entry.appliedAt = Date.now();\n entry.times = [];\n entry.stopped = false;\n captureAppliedNodes(entry);\n roots.get(element)?.entries.push(entry);\n return;\n }\n}\n\nexport function resetReassertSentinel(): void {\n if (frame !== null) cancelAnimationFrame(frame);\n frame = null;\n pending.clear();\n deepChecks.clear();\n for (const { observer } of roots.values()) {\n observer.disconnect();\n unregisterMutedObserver(observer);\n }\n roots.clear();\n}\n", "export type MoneyConvention = {\n decimal: \".\" | \",\";\n group: string;\n decimals: number;\n minorUnits: number;\n};\n\nexport type DisplayedMoney = {\n cents: number;\n convention: MoneyConvention;\n start: number;\n end: number;\n};\n\nexport type CurrencyToken = {\n symbol: string;\n cents: number;\n raw: string;\n};\n\n/** Extract marked displayed prices without treating ordinary numbers as money. */\nexport function extractCurrencyTokens(text: string): CurrencyToken[] {\n const tokens: CurrencyToken[] = [];\n const amount = String.raw`\\d(?:[\\d.,\\u00a0 ]*\\d)?`;\n const symbol = String.raw`[$\\u20ac\\u00a3\\u00a5\\u20b9]`;\n const pattern = new RegExp(\n String.raw`(?:(${symbol})\\s*(${amount})|(?:^|([^A-Z]))([A-Z]{3})\\s*(${amount})|(${amount})\\s*(${symbol}|[A-Z]{3}|kr)(?![A-Za-z]))`,\n \"g\",\n );\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(text)) !== null) {\n const consumedPrefix = match[3] ?? \"\";\n const raw = match[0].slice(consumedPrefix.length);\n const marker = match[1] ?? match[4] ?? match[7];\n const displayedAmount = match[2] ?? match[5] ?? match[6];\n if (/^[A-Z]{3}$/.test(marker) && !ISO_4217_CURRENCY_CODE_SET.has(marker)) {\n continue;\n }\n const parsed = parseDisplayedCents(displayedAmount);\n if (parsed) tokens.push({\n symbol: marker,\n cents: parsed.cents,\n raw,\n });\n }\n return tokens;\n}\nexport const ISO_4217_CURRENCY_CODES =\n `AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BOV BRL BSD BTN BWP BYN BZD CAD CDF CHE CHF CHW CLF CLP CNY COP COU CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HRK HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MXV MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD USN UYI UYU UYW UZS VES VND VUV WST XAF XCD XCG XDR XOF XPF XSU YER ZAR ZMW ZWG`.split(\n \" \",\n );\nconst ISO_4217_CURRENCY_CODE_SET = new Set(ISO_4217_CURRENCY_CODES);\n\n// Precision is a read-compatibility contract as well as a write-time concern.\n// Keep withdrawn codes that can exist on stored shops/experiments here even\n// though the assigned-code set above intentionally rejects them on new writes.\nconst ISO_4217_PRECISION_CODE_SET = new Set([\n ...ISO_4217_CURRENCY_CODES,\n \"CUC\",\n \"SLL\",\n \"ZWL\",\n]);\n\n/** Returns whether a code is currently active in ISO 4217. */\nexport function isIso4217CurrencyCode(currencyCode: string): boolean {\n return ISO_4217_CURRENCY_CODE_SET.has(currencyCode.trim().toUpperCase());\n}\n\nconst ZERO_DECIMAL_CURRENCIES = new Set(\n `BIF CLP DJF GNF ISK JPY KMF KRW PYG RWF UGX UYI VND VUV XAF XOF XPF`.split(\n \" \",\n ),\n);\nconst THREE_DECIMAL_CURRENCIES = new Set(\n `BHD IQD JOD KWD LYD OMR TND`.split(\" \"),\n);\n\n/** Authoritative ISO-4217 minor-unit exponent for editor-supported currencies. */\nexport function currencyExponent(currencyCode: string): number {\n if (!ISO_4217_PRECISION_CODE_SET.has(currencyCode)) {\n throw new RangeError(\n `Unknown ISO-4217 currency precision: ${currencyCode}`,\n );\n }\n if (ZERO_DECIMAL_CURRENCIES.has(currencyCode)) return 0;\n if (THREE_DECIMAL_CURRENCIES.has(currencyCode)) return 3;\n if (currencyCode === \"CLF\" || currencyCode === \"UYW\") return 4;\n return 2;\n}\nexport function parseDisplayedCents(text: string, minorUnits = 2): DisplayedMoney | null {\n const pattern = /\\d(?:[\\d.,\\u00a0 ]*\\d)?/g;\n const match = pattern.exec(text);\n if (!match || pattern.exec(text)) return null;\n const raw = match[0];\n const compact = raw.replace(/[ \\u00a0]/g, \"\");\n const separator = Math.max(compact.lastIndexOf(\".\"), compact.lastIndexOf(\",\"));\n const trailing = separator < 0 ? 0 : compact.length - separator - 1;\n const separatorCharacter = separator < 0 ? \"\" : compact[separator];\n const repeatedSeparator =\n separatorCharacter !== \"\" && compact.indexOf(separatorCharacter) !== separator;\n const hasOtherSeparator =\n separatorCharacter === \",\"\n ? compact.includes(\".\")\n : separatorCharacter === \".\" && compact.includes(\",\");\n // A lone comma before exactly three digits can be either a decimal mark or\n // a thousands separator in a three-decimal currency. Fail closed unless\n // another separator provides enough evidence to select one convention.\n if (\n minorUnits === 3 &&\n trailing === 3 &&\n separatorCharacter === \",\" &&\n !repeatedSeparator &&\n !hasOtherSeparator\n ) {\n return null;\n }\n // Scaled-currency themes can omit a zero fractional part. Preserve a\n // comma-separated three-digit group as a whole amount unless another\n // separator makes the fractional convention explicit.\n const groupedWhole =\n trailing === 3 &&\n minorUnits !== 2 &&\n !hasOtherSeparator &&\n (separatorCharacter === \",\" || repeatedSeparator);\n const decimals =\n trailing && trailing <= minorUnits && !groupedWhole ? trailing : 0;\n\n const visibleDecimal = decimals ? compact[separator] as \".\" | \",\" : null;\n const groupMatch = raw.slice(0, visibleDecimal ? raw.lastIndexOf(visibleDecimal) : raw.length).match(/[.,\\u00a0 ]/);\n const group = groupMatch?.[0] ?? \"\";\n // When the display has grouping but no decimals (for example `1.299`),\n // preserve the locale's opposite separator for a treatment that introduces\n // a fractional amount. Reusing the group separator would produce `1.149.95`.\n const decimal = visibleDecimal ?? (group === \".\" ? \",\" : \".\");\n const majorText = (decimals ? compact.slice(0, separator) : compact).replace(/[.,]/g, \"\");\n const fraction = decimals ? compact.slice(separator + 1) : \"\";\n const scale = 10 ** minorUnits;\n const cents = Number(majorText) * scale + Number((fraction + \"0\".repeat(minorUnits)).slice(0, minorUnits) || 0);\n return {\n cents,\n convention: { decimal, group, decimals, minorUnits },\n start: match.index,\n end: match.index + raw.length,\n };\n}\nexport function formatCentsLike(cents: number, convention: MoneyConvention): string {\n const scale = 10 ** convention.minorUnits;\n let major = String(Math.floor(cents / scale));\n if (convention.group) major = major.replace(/\\B(?=(\\d{3})+(?!\\d))/g, convention.group);\n const remainder = cents % scale;\n const decimals = convention.decimals || (remainder ? convention.minorUnits : 0);\n return decimals\n ? major + convention.decimal + String(remainder).padStart(convention.minorUnits, \"0\").slice(0, decimals)\n : major;\n}\n", "import { Mutation, MutationAction } from \"./types\";\nimport { isSafeMutationAttribute, sanitizeHtml } from \"./sanitize\";\nimport { runMuted } from \"./observer-mute\";\nimport {\n addReassertSentinelOwners,\n replayReassertSentinelEntry,\n resetReassertSentinel,\n resetReassertSentinelForOwner,\n} from \"./reassert-sentinel\";\nimport { extractCurrencyTokens, type CurrencyToken } from \"./money\";\nimport { queryAllDeep } from \"./shadow\";\n\nexport type ApplyOptions = {\n root?: Document | HTMLElement;\n artifactId?: string;\n epoch?: number;\n ownerKeys?: readonly string[];\n onApplied?: (mutation: Mutation, element: Element, index: number, journalSeq?: number) => void;\n onMiss?: (mutation: Mutation, index: number) => void;\n preservePrices?: boolean;\n priceTestExempt?: boolean;\n onPricePreservationViolation?: (input: {\n mutation: Mutation;\n selector: string;\n originalPriceTokens: CurrencyToken[];\n }) => void;\n};\n\nconst INSERT_ATTR = \"data-drip-inserted\";\n\ntype ElementReference = { deref: () => Element | undefined };\n\ntype ElementBaseline = {\n attributeValues: Map<string, string | null>;\n contentTouched: boolean;\n innerHTML?: string;\n textContent?: string | null;\n styleAttributeTouched: boolean;\n styleAttributeValue: string | null;\n styleValues: Map<string, { value: string; priority: string }>;\n parent: Node | null;\n nextSibling: Node | null;\n};\n\nexport type MutationJournalEntry = {\n seq: number;\n artifactId: string;\n owners: Set<string>;\n target: { selector: string; index: number; el: ElementReference };\n mutation: Mutation;\n epoch: number;\n kind: \"mutation\" | \"insert\" | \"adopt-insert\";\n insertKey?: string;\n nodes?: Node[];\n state: \"applied\" | \"invalidated\";\n};\n\ntype MutationJournal = {\n entries: MutationJournalEntry[];\n baselines: WeakMap<Element, ElementBaseline>;\n fallbackArtifactId: string;\n};\n\nlet journalSequence = 0;\nlet applicationContextSequence = 0;\n// Sequence order is the treatment order. A rollback restores one baseline,\n// removes dead entries, and replays every surviving entry in this order.\nconst mutationJournal: MutationJournal = {\n entries: [],\n baselines: new WeakMap(),\n fallbackArtifactId: \"runtime\",\n};\n\n// Reassertion bypasses the normal application chokepoint, so remember mutation\n// objects rejected by the price guard and never replay them later.\nconst priceRejectedMutations = new WeakSet<Mutation>();\n\nexport { isSafeMutationAttribute } from \"./sanitize\";\n\nfunction sanitizeMutationHtml(html: string): string {\n return sanitizeHtml(html);\n}\n\nexport function normalizeCssPropertyName(name: string): string {\n // Prefer CSS syntax (kebab-case) because it works with:\n // - HTMLElement.style.setProperty(...)\n // - inline style rewriting at the edge worker\n // But accept common JS-style camelCase keys for developer ergonomics.\n if (!name) return name;\n if (name.startsWith(\"--\")) return name; // custom properties\n if (name.includes(\"-\")) return name; // already kebab-case\n\n let out = name.replace(/[A-Z]/g, (m) => \"-\" + m.toLowerCase());\n // Special-case msTransform -> -ms-transform\n if (out.startsWith(\"ms-\")) out = \"-\" + out;\n return out;\n}\n\nexport function getMutationKey(mutation: Mutation, index: number): string {\n return (\n mutation.action +\n \":\" +\n index +\n \":\" +\n (mutation.selector || \"\") +\n \":\" +\n (mutation.html || mutation.text || \"\")\n );\n}\n\nexport function isInsertAction(action: MutationAction): boolean {\n return action === \"insertBefore\" || action === \"insertAfter\";\n}\n\nfunction elementReference(element: Element): ElementReference {\n const WeakRefClass = (globalThis as typeof globalThis & {\n WeakRef?: new (value: Element) => ElementReference;\n }).WeakRef;\n return WeakRefClass ? new WeakRefClass(element) : { deref: () => element };\n}\n\nfunction mutationAttributeNames(mutation: Mutation): string[] {\n const names = new Set<string>();\n if (mutation.attribute) names.add(mutation.attribute.name);\n Object.keys(mutation.attributes ?? {}).forEach((name) => names.add(name));\n return Array.from(names);\n}\n\nfunction canonicalAttributeName(element: Element, name: string): string {\n const namespace = element.namespaceURI;\n return namespace === null || namespace === \"http://www.w3.org/1999/xhtml\"\n ? name.trim().toLowerCase()\n : name;\n}\n\nfunction isContentMutation(mutation: Mutation): boolean {\n return mutation.action === \"html\" || mutation.action === \"text\" || mutation.action === \"setText\";\n}\n\nfunction mutationStyleNames(mutation: Mutation): string[] {\n if (mutation.action !== \"style\" && mutation.action !== \"setStyle\") return [];\n return Object.keys(mutation.styles ?? {}).map(normalizeCssPropertyName);\n}\n\nfunction captureElementBaseline(\n journal: MutationJournal,\n element: Element,\n mutation: Mutation,\n): ElementBaseline {\n let baseline = journal.baselines.get(element);\n if (!baseline) {\n baseline = {\n attributeValues: new Map(),\n contentTouched: false,\n styleAttributeTouched: false,\n styleAttributeValue: null,\n styleValues: new Map(),\n parent: element.parentNode,\n nextSibling: element.nextSibling,\n };\n journal.baselines.set(element, baseline);\n }\n\n const attributeNames = mutationAttributeNames(mutation)\n .map((name) => canonicalAttributeName(element, name));\n const styleNames = mutationStyleNames(mutation);\n let capturedStyleAliasNow = false;\n if ((!baseline.styleAttributeTouched) &&\n (styleNames.length > 0 || attributeNames.includes(\"style\"))) {\n baseline.styleAttributeValue = element.getAttribute(\"style\");\n baseline.styleAttributeTouched = true;\n capturedStyleAliasNow = true;\n }\n for (const name of attributeNames) {\n if (!baseline.attributeValues.has(name)) {\n baseline.attributeValues.set(\n name,\n name === \"style\" && baseline.styleAttributeTouched\n ? baseline.styleAttributeValue\n : element.getAttribute(name),\n );\n }\n }\n if (styleNames.length > 0) {\n let originalStyle: CSSStyleDeclaration;\n if (capturedStyleAliasNow) {\n // This CSSOM is still pristine: the current style mutation has not run.\n // It also keeps non-DOM Element mocks useful when their attribute and\n // CSSStyleDeclaration views are not wired together like a browser's.\n originalStyle = (element as HTMLElement).style;\n } else if (baseline.styleAttributeTouched) {\n const originalStyleElement = document.createElement(\"div\");\n const originalStyleAttribute = baseline.styleAttributeValue;\n if (originalStyleAttribute !== null && originalStyleAttribute !== undefined) {\n originalStyleElement.setAttribute(\"style\", originalStyleAttribute);\n }\n originalStyle = originalStyleElement.style;\n } else {\n originalStyle = (element as HTMLElement).style;\n }\n for (const name of styleNames) {\n if (!baseline.styleValues.has(name)) {\n baseline.styleValues.set(name, {\n value: originalStyle.getPropertyValue(name),\n priority: originalStyle.getPropertyPriority(name),\n });\n }\n }\n }\n if (\n !baseline.contentTouched &&\n isContentMutation(mutation)\n ) {\n if (typeof element.innerHTML === \"string\") baseline.innerHTML = element.innerHTML;\n baseline.textContent = element.textContent;\n baseline.contentTouched = true;\n }\n return baseline;\n}\n\ntype BaselineRestoreScope = {\n attributes: Set<string>;\n content: boolean;\n position: boolean;\n styles: Set<string>;\n};\n\nfunction restoreScopeForEntry(\n scope: BaselineRestoreScope,\n element: Element,\n entry: MutationJournalEntry,\n): void {\n if (entry.kind !== \"mutation\") return;\n scope.position = true;\n if (isContentMutation(entry.mutation)) scope.content = true;\n mutationAttributeNames(entry.mutation)\n .forEach((name) => scope.attributes.add(canonicalAttributeName(element, name)));\n mutationStyleNames(entry.mutation).forEach((name) => scope.styles.add(name));\n}\n\nfunction restoreElementBaseline(\n element: Element,\n baseline: ElementBaseline,\n scope: BaselineRestoreScope,\n): void {\n if (scope.position && baseline.parent && !element.parentNode) {\n try {\n baseline.parent.insertBefore(element, baseline.nextSibling);\n } catch {\n baseline.parent.appendChild(element);\n }\n }\n if (scope.content && baseline.contentTouched) {\n if (baseline.innerHTML !== undefined) element.innerHTML = baseline.innerHTML;\n else if (baseline.textContent !== undefined) element.textContent = baseline.textContent;\n }\n const style = (element as HTMLElement).style;\n for (const name of scope.styles) {\n const valueAndPriority = baseline.styleValues.get(name);\n if (!valueAndPriority) continue;\n const { value, priority } = valueAndPriority;\n if (value) style.setProperty(name, value, priority);\n else style.removeProperty(name);\n }\n // Restore attributes after CSSOM properties so a tracked `style` attribute\n // preserves its pristine spelling as well as its pristine declarations.\n for (const name of scope.attributes) {\n if (!baseline.attributeValues.has(name)) continue;\n const value = baseline.attributeValues.get(name);\n if (value === null) element.removeAttribute(name);\n else if (value !== undefined) element.setAttribute(name, value);\n }\n}\n\nfunction artifactIdentity(\n journal: MutationJournal,\n ownerKeys: readonly string[],\n artifactId?: string,\n): string {\n return artifactId ?? ownerKeys[0] ?? journal.fallbackArtifactId;\n}\n\nfunction appendJournalEntry(\n journal: MutationJournal,\n mutation: Mutation,\n element: Element,\n targetIndex: number,\n ownerKeys: readonly string[],\n artifactId: string | undefined,\n kind: MutationJournalEntry[\"kind\"],\n epoch: number,\n insertKey?: string,\n nodes?: Node[],\n): MutationJournalEntry {\n const entry: MutationJournalEntry = {\n seq: ++journalSequence,\n artifactId: artifactIdentity(journal, ownerKeys, artifactId),\n owners: new Set(ownerKeys),\n target: {\n selector: mutation.selector,\n index: targetIndex,\n el: elementReference(element),\n },\n mutation,\n epoch,\n kind,\n insertKey,\n nodes,\n state: \"applied\",\n };\n journal.entries.push(entry);\n return entry;\n}\n\nexport function applyToElement(mutation: Mutation, element: Element): void {\n switch (mutation.action) {\n case \"html\":\n if (typeof mutation.html === \"string\") element.innerHTML = sanitizeMutationHtml(mutation.html);\n break;\n case \"text\":\n case \"setText\":\n if (typeof mutation.text === \"string\") element.textContent = mutation.text;\n break;\n case \"attribute\":\n if (mutation.attribute) {\n if (isSafeMutationAttribute(mutation.attribute.name, mutation.attribute.value)) {\n if (mutation.attribute.value === null) {\n element.removeAttribute(mutation.attribute.name);\n } else {\n element.setAttribute(mutation.attribute.name, mutation.attribute.value);\n }\n }\n }\n if (mutation.attributes) {\n for (const [name, value] of Object.entries(mutation.attributes)) {\n if (!isSafeMutationAttribute(name, value)) continue;\n if (value === null) element.removeAttribute(name);\n else element.setAttribute(name, value);\n }\n }\n break;\n case \"style\":\n case \"setStyle\":\n if (mutation.styles) {\n for (const [name, value] of Object.entries(mutation.styles)) {\n (element as HTMLElement).style.setProperty(\n normalizeCssPropertyName(name),\n value,\n );\n }\n }\n break;\n case \"remove\":\n element.remove();\n break;\n case \"insertBefore\":\n if (typeof mutation.html === \"string\") {\n element.insertAdjacentHTML(\"beforebegin\", sanitizeMutationHtml(mutation.html));\n }\n break;\n case \"insertAfter\":\n if (typeof mutation.html === \"string\") {\n element.insertAdjacentHTML(\"afterend\", sanitizeMutationHtml(mutation.html));\n }\n break;\n }\n}\n\nexport function isInsertDuplicate(element: Element, key: string): boolean {\n const parent = element.parentElement;\n if (!parent) return false;\n return Array.from(parent.querySelectorAll(\"[\" + INSERT_ATTR + \"]\")).some(\n (candidate) => candidate.getAttribute(INSERT_ATTR) === key,\n );\n}\n\nexport function markInserted(el: Element, key: string): void {\n (el as HTMLElement).setAttribute(INSERT_ATTR, key);\n}\n\nfunction collectInsertedNodes(mutation: Mutation, element: Element): Node[] {\n const parent = element.parentNode;\n if (!parent || typeof mutation.html !== \"string\") return [];\n const previousSibling = element.previousSibling;\n const nextSibling = element.nextSibling;\n applyToElement(mutation, element);\n const nodes: Node[] = [];\n let current = mutation.action === \"insertBefore\"\n ? (previousSibling ? previousSibling.nextSibling : parent.firstChild)\n : element.nextSibling;\n const boundary = mutation.action === \"insertBefore\" ? element : nextSibling;\n while (current && current !== boundary) {\n nodes.push(current);\n current = current.nextSibling;\n }\n return nodes;\n}\n\nfunction insertedElements(nodes: readonly Node[]): Element[] {\n return nodes.filter((node): node is Element => node instanceof Element);\n}\n\nfunction adoptedInsertNodes(\n journal: MutationJournal,\n element: Element,\n key: string,\n): Node[] {\n for (let index = journal.entries.length - 1; index >= 0; index -= 1) {\n const entry = journal.entries[index];\n if (\n entry.insertKey === key &&\n entry.target.el.deref() === element &&\n entry.nodes?.some((node) => node.parentNode)\n ) {\n return entry.nodes;\n }\n }\n const parent = element.parentElement;\n if (!parent) return [];\n return Array.from(parent.querySelectorAll(\"[\" + INSERT_ATTR + \"]\")).filter(\n (candidate) => candidate.getAttribute(INSERT_ATTR) === key,\n );\n}\n\nfunction applyTrackedMutationWithJournal(\n mutation: Mutation,\n element: Element,\n journal: MutationJournal,\n key?: string,\n ownerKeys: readonly string[] = [],\n artifactId?: string,\n targetIndex = 0,\n epoch = 0,\n): { inserted: Element | null; entry?: MutationJournalEntry } {\n return runMuted(() => {\n captureElementBaseline(journal, element, mutation);\n if (isInsertAction(mutation.action)) {\n const nodes = collectInsertedNodes(mutation, element);\n const elements = insertedElements(nodes);\n if (key) elements.forEach((inserted) => markInserted(inserted, key));\n if (!nodes.length) return { inserted: null };\n const entry = appendJournalEntry(\n journal,\n mutation,\n element,\n targetIndex,\n ownerKeys,\n artifactId,\n \"insert\",\n epoch,\n key,\n nodes,\n );\n return { inserted: elements[0] ?? null, entry };\n }\n const entry = appendJournalEntry(\n journal,\n mutation,\n element,\n targetIndex,\n ownerKeys,\n artifactId,\n \"mutation\",\n epoch,\n );\n applyToElement(mutation, element);\n return { inserted: null, entry };\n });\n}\n\nexport function applyTrackedMutation(\n mutation: Mutation,\n element: Element,\n key?: string,\n ownerKeys: readonly string[] = [],\n artifactId?: string,\n onJournal?: (entry: MutationJournalEntry) => void,\n epoch = 0,\n): Element | null {\n let targetIndex = 0;\n try {\n targetIndex = queryAllDeep(mutation.selector).indexOf(element);\n if (targetIndex < 0) targetIndex = 0;\n } catch {}\n if (key && isInsertAction(mutation.action) && isInsertDuplicate(element, key)) {\n const nodes = adoptedInsertNodes(mutationJournal, element, key);\n const entry = appendJournalEntry(\n mutationJournal,\n mutation,\n element,\n targetIndex,\n ownerKeys,\n artifactId,\n \"adopt-insert\",\n epoch,\n key,\n nodes,\n );\n onJournal?.(entry);\n return insertedElements(nodes)[0] ?? null;\n }\n const result = applyTrackedMutationWithJournal(\n mutation,\n element,\n mutationJournal,\n key,\n ownerKeys,\n artifactId,\n targetIndex,\n epoch,\n );\n if (result.entry) onJournal?.(result.entry);\n return result.inserted;\n}\n\n/** Reject a just-applied guarded mutation without disturbing earlier treatments. */\nexport function rejectTrackedMutation(\n entry: MutationJournalEntry | undefined,\n element: Element,\n innerHTML: string,\n): void {\n runMuted(() => { element.innerHTML = innerHTML; });\n if (!entry) return;\n priceRejectedMutations.add(entry.mutation);\n entry.state = \"invalidated\";\n mutationJournal.entries = mutationJournal.entries.filter((candidate) => candidate !== entry);\n // Fail closed at mutation level: a price-violating mutation is suppressed on\n // every element, so already-applied sibling targets roll back instead of\n // drifting outside reassert coverage.\n const doomed = new Set(\n mutationJournal.entries.filter((candidate) => candidate.mutation === entry.mutation),\n );\n for (const candidate of doomed) candidate.state = \"invalidated\";\n if (doomed.size > 0) rollbackJournalEntries(mutationJournal, doomed);\n}\n\n// The sentinel treats the baseline and earlier journal values as framework\n// restore targets. Other content can be variant-owned widget state.\nexport function matchesOriginalInnerHtmlSnapshot(element: Element, current: string): boolean {\n if (mutationJournal.baselines.get(element)?.innerHTML === current) return true;\n for (const entry of mutationJournal.entries) {\n if (entry.target.el.deref() !== element || entry.mutation.action !== \"html\") continue;\n if (typeof entry.mutation.html === \"string\" && sanitizeMutationHtml(entry.mutation.html) === current) {\n return true;\n }\n }\n return false;\n}\n\nfunction applyPriceGuardedMutation(\n mutation: Mutation,\n element: Element,\n journal: MutationJournal,\n key: string,\n options: ApplyOptions,\n index: number,\n targetIndex: number,\n): void {\n const guardedPrices = extractCurrencyTokens(element.textContent ?? \"\");\n const guardedSnapshot = guardedPrices.length > 0 ? element.innerHTML : null;\n const result = applyTrackedMutationWithJournal(\n mutation,\n element,\n journal,\n key,\n options.ownerKeys,\n options.artifactId,\n targetIndex,\n options.epoch ?? 0,\n );\n if (guardedSnapshot !== null) {\n const remaining = extractCurrencyTokens(element.textContent ?? \"\");\n const preserved = guardedPrices.every((token) =>\n remaining.some((candidate) =>\n candidate.symbol === token.symbol && candidate.cents === token.cents));\n if (!preserved) {\n rejectTrackedMutation(result.entry, element, guardedSnapshot);\n options.onPricePreservationViolation?.({\n mutation,\n selector: mutation.selector,\n originalPriceTokens: guardedPrices,\n });\n return;\n }\n }\n options.onApplied?.(mutation, element, index, result.entry?.seq);\n}\n\nfunction applyMutationsWithJournal(\n mutations: Mutation[],\n options: ApplyOptions,\n journal: MutationJournal,\n): void {\n const root = options.root || document;\n mutations.forEach((mutation, index) => {\n let elements: Element[];\n try {\n elements = root === document\n ? queryAllDeep(mutation.selector)\n : Array.from(root.querySelectorAll(mutation.selector));\n } catch {\n options.onMiss?.(mutation, index);\n return;\n }\n if (elements.length === 0) {\n options.onMiss?.(mutation, index);\n return;\n }\n elements.forEach((element, targetIndex) => {\n const key = getMutationKey(mutation, index);\n if (isInsertAction(mutation.action)) {\n if (isInsertDuplicate(element, key)) {\n const entry = appendJournalEntry(\n journal,\n mutation,\n element,\n targetIndex,\n options.ownerKeys ?? [],\n options.artifactId,\n \"adopt-insert\",\n options.epoch ?? 0,\n key,\n adoptedInsertNodes(journal, element, key),\n );\n options.onApplied?.(mutation, element, index, entry.seq);\n return;\n }\n const result = applyTrackedMutationWithJournal(\n mutation,\n element,\n journal,\n key,\n options.ownerKeys,\n options.artifactId,\n targetIndex,\n options.epoch ?? 0,\n );\n options.onApplied?.(mutation, element, index, result.entry?.seq);\n return;\n }\n // Content changes are guarded; hiding or styling a price element can be\n // a legitimate compare-at-price treatment and is intentionally allowed.\n const priceBearingContent = mutation.action === \"html\"\n || mutation.action === \"text\"\n || mutation.action === \"setText\";\n if (options.preservePrices && !options.priceTestExempt && priceBearingContent) {\n applyPriceGuardedMutation(mutation, element, journal, key, options, index, targetIndex);\n return;\n }\n const result = applyTrackedMutationWithJournal(\n mutation,\n element,\n journal,\n key,\n options.ownerKeys,\n options.artifactId,\n targetIndex,\n options.epoch ?? 0,\n );\n options.onApplied?.(mutation, element, index, result.entry?.seq);\n });\n });\n}\n\nexport function applyMutations(mutations: Mutation[], options: ApplyOptions = {}): void {\n applyMutationsWithJournal(mutations, options, mutationJournal);\n}\n\nexport function reassertNonStructuralMutations(mutations: Mutation[], options: ApplyOptions = {}): void {\n const root = options.root || document;\n mutations.forEach((mutation, index) => {\n if (\n isInsertAction(mutation.action)\n || mutation.action === \"remove\"\n || priceRejectedMutations.has(mutation)\n ) return;\n const elements = root === document\n ? queryAllDeep(mutation.selector)\n : Array.from(root.querySelectorAll(mutation.selector));\n elements.forEach((element) => {\n runMuted(() => applyToElement(mutation, element));\n options.onApplied?.(mutation, element, index);\n });\n });\n}\n\nfunction resolveJournalTarget(\n journal: MutationJournal,\n entry: MutationJournalEntry,\n): Element | undefined {\n const current = entry.target.el.deref();\n if (current && (entry.mutation.action === \"remove\" || current.isConnected !== false)) {\n return current;\n }\n try {\n const replacement = queryAllDeep(entry.target.selector)[entry.target.index];\n if (replacement) {\n captureElementBaseline(journal, replacement, entry.mutation);\n entry.target.el = elementReference(replacement);\n return replacement;\n }\n } catch {}\n return current;\n}\n\nfunction replayInsertEntry(\n journal: MutationJournal,\n entry: MutationJournalEntry,\n element: Element,\n): void {\n const key = entry.insertKey;\n if (key && isInsertDuplicate(element, key)) {\n entry.nodes = adoptedInsertNodes(journal, element, key);\n entry.kind = \"adopt-insert\";\n entry.state = \"applied\";\n return;\n }\n const nodes = collectInsertedNodes(entry.mutation, element);\n if (key) insertedElements(nodes).forEach((inserted) => markInserted(inserted, key));\n entry.nodes = nodes;\n entry.kind = \"insert\";\n entry.state = \"applied\";\n}\n\nfunction replayTouchedTargets(\n journal: MutationJournal,\n touched: Set<Element>,\n restoreScopes: Map<Element, BaselineRestoreScope>,\n): void {\n for (const [element, scope] of restoreScopes) {\n const baseline = journal.baselines.get(element);\n if (baseline) restoreElementBaseline(element, baseline, scope);\n }\n for (const entry of journal.entries) {\n const element = resolveJournalTarget(journal, entry);\n if (!element || !touched.has(element)) continue;\n if (entry.kind === \"insert\" || entry.kind === \"adopt-insert\") {\n replayInsertEntry(journal, entry, element);\n } else {\n applyToElement(entry.mutation, element);\n entry.state = \"applied\";\n replayReassertSentinelEntry(entry.seq, element);\n }\n }\n}\n\nfunction addRestoreScope(\n scopes: Map<Element, BaselineRestoreScope>,\n element: Element,\n entry: MutationJournalEntry,\n): void {\n let scope = scopes.get(element);\n if (!scope) {\n scope = { attributes: new Set(), content: false, position: false, styles: new Set() };\n scopes.set(element, scope);\n }\n restoreScopeForEntry(scope, element, entry);\n}\n\nfunction pruneElementBaseline(journal: MutationJournal, element: Element): void {\n const baseline = journal.baselines.get(element);\n if (!baseline) return;\n const remaining = journal.entries.filter((entry) => entry.target.el.deref() === element);\n if (remaining.length === 0) {\n journal.baselines.delete(element);\n return;\n }\n const contentNeeded = remaining.some((entry) =>\n entry.kind === \"mutation\" && isContentMutation(entry.mutation));\n if (!contentNeeded) {\n baseline.contentTouched = false;\n delete baseline.innerHTML;\n delete baseline.textContent;\n }\n const attributeNames = new Set(remaining.flatMap((entry) =>\n entry.kind === \"mutation\"\n ? mutationAttributeNames(entry.mutation).map((name) => canonicalAttributeName(element, name))\n : []));\n for (const name of baseline.attributeValues.keys()) {\n if (!attributeNames.has(name)) baseline.attributeValues.delete(name);\n }\n const styleNames = new Set(remaining.flatMap((entry) =>\n entry.kind === \"mutation\" ? mutationStyleNames(entry.mutation) : []));\n for (const name of baseline.styleValues.keys()) {\n if (!styleNames.has(name)) baseline.styleValues.delete(name);\n }\n if (!attributeNames.has(\"style\") && styleNames.size === 0) {\n baseline.styleAttributeTouched = false;\n baseline.styleAttributeValue = null;\n }\n}\n\nfunction rollbackJournalEntries(\n journal: MutationJournal,\n doomed: Set<MutationJournalEntry>,\n options: { preserveReplacementTargets?: boolean } = {},\n): void {\n if (doomed.size === 0) return;\n const touched = new Set<Element>();\n const restoreScopes = new Map<Element, BaselineRestoreScope>();\n for (const entry of doomed) {\n // A teardown owns the exact node Apex mutated, not a later framework node\n // that happens to match the same selector/index. SPA frameworks commonly\n // replace route subtrees before reInit() reconciles Page activation. Using\n // resolveJournalTarget() here would adopt that replacement and restore the\n // old route's baseline into it (innerHTML/textContent included), detaching\n // the framework's listeners. When the selector now resolves to a different\n // node, the disconnected target has been retired and needs no rollback.\n const element = options.preserveReplacementTargets\n ? entry.target.el.deref()\n : resolveJournalTarget(journal, entry);\n let supersededByFrameworkNode = false;\n if (options.preserveReplacementTargets && element?.isConnected === false) {\n try {\n const current = document.querySelectorAll(entry.target.selector)[entry.target.index];\n supersededByFrameworkNode = Boolean(current && current !== element);\n } catch {}\n }\n if (element && !supersededByFrameworkNode) {\n touched.add(element);\n addRestoreScope(restoreScopes, element, entry);\n }\n }\n for (let index = journal.entries.length - 1; index >= 0; index -= 1) {\n if (doomed.has(journal.entries[index])) journal.entries.splice(index, 1);\n }\n runMuted(() => {\n for (const entry of doomed) {\n for (const node of entry.nodes ?? []) {\n const survives = journal.entries.some((candidate) => candidate.nodes?.includes(node));\n if (!survives) node.parentNode?.removeChild(node);\n }\n }\n replayTouchedTargets(journal, touched, restoreScopes);\n });\n touched.forEach((element) => pruneElementBaseline(journal, element));\n}\n\nfunction resetJournal(journal: MutationJournal): void {\n const doomed = new Set(journal.entries);\n rollbackJournalEntries(journal, doomed);\n journal.baselines = new WeakMap();\n}\n\nexport function resetAppliedMutations(): void {\n resetReassertSentinel();\n resetJournal(mutationJournal);\n}\n\nexport function resetAppliedMutationsForOwner(\n ownerKey: string,\n artifactId?: string,\n options: { preserveReplacementTargets?: boolean } = {},\n): void {\n const doomed = new Set<MutationJournalEntry>();\n for (const entry of mutationJournal.entries) {\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (!entry.owners.delete(ownerKey)) continue;\n if (entry.owners.size === 0) doomed.add(entry);\n }\n resetReassertSentinelForOwner(ownerKey, artifactId);\n rollbackJournalEntries(mutationJournal, doomed, options);\n}\n\nexport function addAppliedMutationOwners(\n existingOwnerKeys: ReadonlySet<string>,\n ownerKeys: readonly string[],\n artifactId?: string,\n): void {\n if (existingOwnerKeys.size === 0 || ownerKeys.length === 0) return;\n for (const entry of mutationJournal.entries) {\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (\n !Array.from(existingOwnerKeys).some((ownerKey) =>\n entry.owners.has(ownerKey)\n )\n ) continue;\n ownerKeys.forEach((ownerKey) => entry.owners.add(ownerKey));\n }\n addReassertSentinelOwners(existingOwnerKeys, ownerKeys, artifactId);\n}\n\nexport function invalidateArtifact(artifactId: string): void {\n mutationJournal.entries.forEach((entry) => {\n if (entry.artifactId === artifactId) entry.state = \"invalidated\";\n });\n}\n\nexport function replayArtifact(artifactId: string): void {\n const selected = mutationJournal.entries.filter((entry) => entry.artifactId === artifactId);\n if (!selected.length) return;\n const touched = new Set<Element>();\n const restoreScopes = new Map<Element, BaselineRestoreScope>();\n for (const entry of selected) {\n entry.state = \"invalidated\";\n const element = resolveJournalTarget(mutationJournal, entry);\n if (element) {\n touched.add(element);\n addRestoreScope(restoreScopes, element, entry);\n }\n }\n runMuted(() => replayTouchedTargets(mutationJournal, touched, restoreScopes));\n}\n\nexport function replayForOwner(ownerKey: string): void {\n const artifactIds = new Set(\n mutationJournal.entries\n .filter((entry) => entry.owners.has(ownerKey))\n .map((entry) => entry.artifactId),\n );\n artifactIds.forEach(replayArtifact);\n}\n\nexport type MutationApplicationContext = {\n apply: (mutations: Mutation[], options?: ApplyOptions) => void;\n rollback: () => void;\n readonly snapshotCount: number;\n};\n\n/**\n * Owns only the journal entries created through this context. Rollback\n * restores its baseline without touching shopper assignment entries.\n */\nexport function createMutationApplicationContext(): MutationApplicationContext {\n const journal: MutationJournal = {\n entries: [],\n baselines: new WeakMap(),\n fallbackArtifactId: \"context-\" + ++applicationContextSequence,\n };\n return {\n apply(mutations, options = {}) {\n applyMutationsWithJournal(mutations, options, journal);\n },\n rollback() {\n resetJournal(journal);\n },\n get snapshotCount() {\n return journal.entries.length;\n },\n };\n}\n\n/** @internal \u2014 exposed for unit testing only. Tree-shaken from production build. */\nexport const __test = {\n baselineAttributeNames(element: Element): string[] {\n return Array.from(mutationJournal.baselines.get(element)?.attributeValues.keys() ?? []);\n },\n normalizeCssPropertyName,\n};\n\nexport function observeSpaNavigation(onChange: () => void): () => void {\n let lastUrl = location.href;\n const notify = () => {\n if (lastUrl !== location.href) {\n lastUrl = location.href;\n onChange();\n }\n };\n const wrap = (method: \"pushState\" | \"replaceState\") => {\n const original = history[method];\n history[method] = function (...args: Parameters<History[\"pushState\"]>) {\n const ret = original.apply(this, args);\n notify();\n return ret;\n };\n return () => {\n history[method] = original;\n };\n };\n const restorePush = wrap(\"pushState\");\n const restoreReplace = wrap(\"replaceState\");\n window.addEventListener(\"popstate\", notify);\n return () => {\n restorePush();\n restoreReplace();\n window.removeEventListener(\"popstate\", notify);\n };\n}\n", "import type { Mutation } from \"../types\";\n\nexport type ActiveEditorSession = {\n sid: string;\n bearer: string;\n expiresAt: string;\n shopId: string;\n experimentId: string;\n experimentName?: string | null;\n experimentStatus?: string | null;\n initialVariationId: string;\n targetUrl: string;\n targetOrigin: string;\n variations: Array<{ id: string; name?: string | null; slug?: string | null }>;\n};\n\nexport type EditorArtifacts = {\n mutations: Mutation[];\n customCss: string;\n customJs: string;\n};\n\nexport type EditorVariation = {\n id: string;\n name: string;\n artifactHash: string;\n reviewStatus: string | null;\n};\n\nexport type EditorBrowserCommand =\n | \"navigate\"\n | \"reload\"\n | \"back\"\n | \"forward\"\n | \"click\"\n | \"type\"\n | \"wait_for\"\n | \"snapshot\"\n | \"screenshot\"\n | \"eval_readonly\"\n | \"console_logs\"\n | \"network_logs\"\n | \"network_probe\"\n | \"current_url\"\n | \"select_element\"\n | \"apply_artifacts\";\n\nexport type ClaimedEditorCommand = {\n commandId: string;\n command: EditorBrowserCommand;\n args: Record<string, unknown>;\n expiresAt: string | null;\n};\n\nexport type EditorSaveState =\n | \"idle\"\n | \"saving\"\n | \"saved\"\n | \"pending\"\n | \"warning\"\n | \"publication_failed\"\n | \"conflict\"\n | \"error\";\n\nexport type EditorDeviceState = \"closed\" | \"loading\" | \"active\" | \"blocked\";\n\nexport type EditorState = {\n variation: EditorVariation | null;\n artifacts: EditorArtifacts;\n artifactsEnabled: boolean;\n pickerActive: boolean;\n selectedElement: Element | null;\n selectedSelector: string | null;\n saveState: EditorSaveState;\n saveMessage: string | null;\n dock: \"top\" | \"bottom\";\n canUndo: boolean;\n canRedo: boolean;\n jsApplied: boolean;\n reloadRequired: boolean;\n deviceState: EditorDeviceState;\n};\n\nexport const EMPTY_EDITOR_ARTIFACTS: EditorArtifacts = {\n mutations: [],\n customCss: \"\",\n customJs: \"\",\n};\n\nexport function cloneArtifacts(artifacts: EditorArtifacts): EditorArtifacts {\n return {\n mutations: artifacts.mutations.map((mutation) => ({\n ...mutation,\n attribute: mutation.attribute ? { ...mutation.attribute } : undefined,\n attributes: mutation.attributes ? { ...mutation.attributes } : undefined,\n styles: mutation.styles ? { ...mutation.styles } : undefined,\n })),\n customCss: artifacts.customCss,\n customJs: artifacts.customJs,\n };\n}\n", "import type { Mutation } from \"../types\";\nimport { cloneArtifacts, type EditorArtifacts } from \"./types\";\n\nfunction sameMutationSlot(left: Mutation, right: Mutation): boolean {\n if (left.selector !== right.selector) return false;\n const textActions = new Set([\"text\", \"setText\", \"html\"]);\n const styleActions = new Set([\"style\", \"setStyle\"]);\n if (textActions.has(left.action) && textActions.has(right.action)) return true;\n if (styleActions.has(left.action) && styleActions.has(right.action)) return true;\n return left.action === right.action;\n}\n\nexport function upsertMutation(\n artifacts: EditorArtifacts,\n mutation: Mutation,\n): EditorArtifacts {\n if (mutation.action === \"remove\") {\n return {\n ...artifacts,\n mutations: [\n ...artifacts.mutations.filter((item) => item.selector !== mutation.selector),\n mutation,\n ],\n };\n }\n const mutations = artifacts.mutations\n .filter((item) => !(item.selector === mutation.selector && item.action === \"remove\"))\n .map((item) => ({ ...item }));\n const index = mutations.findIndex((item) => sameMutationSlot(item, mutation));\n if (index < 0) mutations.push(mutation);\n else if ((mutation.action === \"style\" || mutation.action === \"setStyle\") && mutations[index].styles) {\n mutations[index] = {\n ...mutations[index],\n ...mutation,\n styles: { ...mutations[index].styles, ...mutation.styles },\n };\n } else if (mutation.action === \"attribute\") {\n const previous = mutations[index];\n const previousAttributes = {\n ...(previous.attribute ? { [previous.attribute.name]: previous.attribute.value } : {}),\n ...(previous.attributes ?? {}),\n };\n const nextAttributes = {\n ...(mutation.attribute ? { [mutation.attribute.name]: mutation.attribute.value } : {}),\n ...(mutation.attributes ?? {}),\n };\n mutations[index] = {\n ...previous,\n ...mutation,\n attribute: undefined,\n attributes: { ...previousAttributes, ...nextAttributes },\n };\n } else {\n mutations[index] = mutation;\n }\n return { ...artifacts, mutations };\n}\n\nexport function removeSelectorMutations(\n artifacts: EditorArtifacts,\n selector: string,\n): EditorArtifacts {\n return {\n ...artifacts,\n mutations: artifacts.mutations.filter((mutation) => mutation.selector !== selector),\n };\n}\n\nexport function removeMutationAt(\n artifacts: EditorArtifacts,\n index: number,\n): EditorArtifacts {\n return {\n ...artifacts,\n mutations: artifacts.mutations.filter((_, mutationIndex) => mutationIndex !== index),\n };\n}\n\nexport class ArtifactHistory {\n private undoStack: EditorArtifacts[] = [];\n private redoStack: EditorArtifacts[] = [];\n\n push(current: EditorArtifacts): void {\n this.undoStack.push(cloneArtifacts(current));\n this.undoStack = this.undoStack.slice(-50);\n this.redoStack = [];\n }\n\n undo(current: EditorArtifacts): EditorArtifacts | null {\n const previous = this.undoStack.pop();\n if (!previous) return null;\n this.redoStack.push(cloneArtifacts(current));\n return cloneArtifacts(previous);\n }\n\n redo(current: EditorArtifacts): EditorArtifacts | null {\n const next = this.redoStack.pop();\n if (!next) return null;\n this.undoStack.push(cloneArtifacts(current));\n return cloneArtifacts(next);\n }\n\n reset(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n}\n", "import { createMutationApplicationContext, type MutationApplicationContext } from \"../mutate\";\nimport { isSafeMutationAttribute, sanitizeHtml } from \"../sanitize\";\nimport type { Mutation } from \"../types\";\nimport { EditorApi, EditorApiError } from \"./api\";\nimport { ArtifactHistory, removeMutationAt, removeSelectorMutations, upsertMutation } from \"./artifacts\";\nimport { DevicePreview } from \"./device-preview\";\nimport {\n cloneArtifacts,\n EMPTY_EDITOR_ARTIFACTS,\n type ActiveEditorSession,\n type EditorArtifacts,\n type EditorDeviceState,\n type EditorState,\n} from \"./types\";\n\nconst EDITOR_CSS_ID = \"apex-editor-draft-css\";\nconst AUTOSAVE_MS = 700;\nconst EXIT_REVOKE_TIMEOUT_MS = 1_500;\nconst NON_LIVE_EDITOR_STATUSES = new Set([\"draft\", \"awaiting_client_approval\", \"changes_requested\", \"client_approved\", \"qa\", \"ready_to_launch\", \"paused\", \"completed\"]);\n\nexport type ArtifactCommandAudit = {\n ok: boolean;\n mutationAudit: Array<{\n index: number;\n selector: string;\n action: string;\n beforeCount: number;\n afterCount: number;\n effectVerified: boolean;\n error: string | null;\n }>;\n generatedSelectors: string[];\n generatedVisibility: Array<{\n selector: string;\n count: number;\n visibleCount: number;\n matches: Array<{ text: string; visible: boolean }>;\n }>;\n visibleGeneratedCount: number;\n hiddenEffectVerifiedCount: number;\n networkRequired: boolean;\n customJsDeferred: boolean;\n error?: string;\n repairHint?: string;\n};\n\nexport class EditorController {\n private state: EditorState = {\n variation: null,\n artifacts: cloneArtifacts(EMPTY_EDITOR_ARTIFACTS),\n artifactsEnabled: true,\n pickerActive: false,\n selectedElement: null,\n selectedSelector: null,\n saveState: \"idle\",\n saveMessage: null,\n dock: \"top\",\n canUndo: false,\n canRedo: false,\n jsApplied: false,\n reloadRequired: false,\n deviceState: \"closed\",\n };\n private readonly listeners = new Set<(state: EditorState) => void>();\n private readonly history = new ArtifactHistory();\n private visualContext: MutationApplicationContext | null = null;\n private devicePreview: DevicePreview | null = null;\n private saveTimer: ReturnType<typeof setTimeout> | null = null;\n private saveQueue: Promise<void> = Promise.resolve();\n private revision = 0;\n private variationRequest = 0;\n private liveSaveConfirmed = false;\n private readonly cleanups = new Set<() => void>();\n\n constructor(\n readonly session: ActiveEditorSession,\n readonly apiOrigin: string,\n private readonly api = new EditorApi(apiOrigin, session),\n private readonly reload = () => location.reload(),\n private readonly confirmLiveSave = (message: string) => window.confirm(message),\n ) {}\n\n getState(): EditorState {\n return this.state;\n }\n\n subscribe(listener: (state: EditorState) => void): () => void {\n this.listeners.add(listener);\n listener(this.state);\n return () => this.listeners.delete(listener);\n }\n\n async initialize(): Promise<void> {\n await this.selectVariation(this.session.initialVariationId);\n }\n\n async selectVariation(variationId: string): Promise<void> {\n if (this.state.variation?.id !== variationId) {\n this.liveSaveConfirmed = false;\n }\n const request = ++this.variationRequest;\n this.cancelSave();\n this.patch({ saveState: \"idle\", saveMessage: \"Loading draft...\" });\n try {\n const loaded = await this.api.loadArtifacts(variationId);\n if (request !== this.variationRequest) return;\n this.history.reset();\n this.revision += 1;\n this.state = {\n ...this.state,\n variation: loaded.variation,\n artifacts: cloneArtifacts(loaded.artifacts),\n selectedElement: null,\n selectedSelector: null,\n saveState: \"saved\",\n saveMessage: \"Saved\",\n canUndo: false,\n canRedo: false,\n jsApplied: false,\n reloadRequired: false,\n };\n this.applyVisualArtifacts();\n this.emit();\n } catch (error) {\n if (request !== this.variationRequest) return;\n this.patch({\n saveState: \"error\",\n saveMessage: error instanceof Error ? error.message : \"Draft could not be loaded\",\n });\n }\n }\n\n setPickerActive(active: boolean): void {\n this.patch({ pickerActive: active });\n }\n\n selectElement(element: Element, selector: string): void {\n this.patch({ selectedElement: element, selectedSelector: selector, pickerActive: false });\n }\n\n clearSelection(): void {\n this.clearSelectedElement();\n }\n\n clearSelectedElement(): void {\n this.patch({ selectedElement: null, selectedSelector: null, pickerActive: false });\n }\n\n removeSelector(selector: string): void {\n this.commit(removeSelectorMutations(this.state.artifacts, selector));\n }\n\n removeMutation(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this.state.artifacts.mutations.length) return;\n this.commit(removeMutationAt(this.state.artifacts, index));\n }\n\n restoreArtifacts(artifacts: EditorArtifacts): void {\n this.commit(cloneArtifacts(artifacts));\n }\n\n async extendSession(): Promise<string | null> {\n const expiresAt = await this.api.extendSession();\n if (expiresAt) this.session.expiresAt = expiresAt;\n return expiresAt;\n }\n\n async resolveConflict(choice: \"mine\" | \"theirs\"): Promise<void> {\n const variation = this.state.variation;\n if (!variation || this.state.saveState !== \"conflict\") return;\n if (choice === \"theirs\") {\n await this.selectVariation(variation.id);\n return;\n }\n try {\n const loaded = await this.api.loadArtifacts(variation.id);\n this.state = {\n ...this.state,\n variation: { ...variation, artifactHash: loaded.variation.artifactHash },\n saveState: \"idle\",\n saveMessage: \"Unsaved changes\",\n };\n this.emit();\n await this.saveNow();\n } catch (error) {\n this.patch({\n saveState: \"error\",\n saveMessage: error instanceof Error ? error.message : \"Draft could not be saved\",\n });\n }\n }\n\n toggleArtifacts(enabled: boolean): void {\n this.state = { ...this.state, artifactsEnabled: enabled };\n this.applyVisualArtifacts();\n this.devicePreview?.update(this.state.artifacts, enabled);\n this.emit();\n }\n\n setDock(dock: \"top\" | \"bottom\"): void {\n this.patch({ dock });\n }\n\n setText(value: string): void {\n this.mutateSelected({ action: \"setText\", text: value });\n }\n\n setImageSource(value: string): void {\n this.mutateSelected({ action: \"attribute\", attributes: { src: value } });\n }\n\n setStyle(name: string, value: string): void {\n this.mutateSelected({ action: \"setStyle\", styles: { [name]: value } });\n }\n\n hideSelected(): void {\n this.setStyle(\"display\", \"none\");\n }\n\n removeSelected(): void {\n this.mutateSelected({ action: \"remove\" });\n }\n\n setCustomCss(value: string): void {\n this.commit({ ...this.state.artifacts, customCss: value });\n }\n\n setCustomJs(value: string): void {\n this.commit({ ...this.state.artifacts, customJs: value }, false);\n this.patch({ jsApplied: false });\n }\n\n applyCustomJs(): void {\n const code = this.state.artifacts.customJs.trim();\n if (!code) return;\n try {\n new Function(`${code}\\n//# sourceURL=apex-editor-draft.js`)();\n this.patch({\n jsApplied: true,\n reloadRequired: true,\n saveMessage: \"JavaScript applied. Reload required to undo.\",\n });\n } catch (error) {\n this.patch({\n saveState: \"error\",\n saveMessage: error instanceof Error ? error.message : \"JavaScript failed\",\n });\n }\n }\n\n undo(): void {\n const previous = this.history.undo(this.state.artifacts);\n if (previous) this.replaceFromHistory(previous);\n }\n\n redo(): void {\n const next = this.history.redo(this.state.artifacts);\n if (next) this.replaceFromHistory(next);\n }\n\n attachDevicePreview(devicePreview: DevicePreview): void {\n this.devicePreview = devicePreview;\n }\n\n setDeviceState(deviceState: EditorDeviceState): void {\n this.patch({ deviceState });\n }\n\n openDevicePreview(): void {\n this.devicePreview?.open(\n this.state.artifactsEnabled ? this.state.artifacts : cloneArtifacts(EMPTY_EDITOR_ARTIFACTS),\n );\n }\n\n closeDevicePreview(): void {\n this.devicePreview?.close();\n }\n\n addCleanup(cleanup: () => void): () => void {\n this.cleanups.add(cleanup);\n return () => this.cleanups.delete(cleanup);\n }\n\n applyCommandArtifacts(artifacts: EditorArtifacts): ArtifactCommandAudit {\n this.visualContext?.rollback();\n this.visualContext = null;\n document.getElementById(EDITOR_CSS_ID)?.remove();\n const beforeCounts = artifacts.mutations.map((mutation) => this.selectorCount(mutation.selector));\n this.state = { ...this.state, artifactsEnabled: true };\n this.commit(cloneArtifacts(artifacts));\n const mutationAudit = artifacts.mutations.map((mutation, index) => {\n const beforeCount = beforeCounts[index];\n const afterCount = this.selectorCount(mutation.selector);\n const effectVerified = this.verifyMutationEffect(mutation, beforeCount, afterCount);\n return {\n index,\n selector: mutation.selector,\n action: mutation.action,\n beforeCount,\n afterCount,\n effectVerified,\n error: beforeCount < 0 ? \"Invalid selector\" : null,\n };\n });\n const generatedSelectors = Array.from(new Set(\n artifacts.mutations\n .filter((mutation) => mutation.action !== \"remove\")\n .map((mutation) => mutation.selector),\n ));\n const generatedVisibility = generatedSelectors.map((selector) => {\n const elements = this.selectorElements(selector);\n const matches = elements.slice(0, 8).map((element) => ({\n text: (element.textContent ?? \"\").trim().replace(/\\s+/g, \" \").slice(0, 240),\n visible: this.isVisible(element),\n }));\n return {\n selector,\n count: elements.length,\n visibleCount: matches.filter((match) => match.visible).length,\n matches,\n };\n });\n const failed = mutationAudit.filter((entry) => !entry.effectVerified);\n const visibleGeneratedCount = generatedVisibility.reduce(\n (total, entry) => total + entry.visibleCount,\n 0,\n );\n const networkRequired = /\\b(?:fetch|XMLHttpRequest|sendBeacon)\\b/.test(artifacts.customJs);\n return {\n ok: failed.length === 0,\n mutationAudit,\n generatedSelectors,\n generatedVisibility,\n visibleGeneratedCount,\n hiddenEffectVerifiedCount: mutationAudit.filter(\n (entry) => entry.action === \"remove\" && entry.effectVerified,\n ).length,\n networkRequired,\n customJsDeferred: artifacts.customJs.trim().length > 0,\n ...(failed.length\n ? {\n error: \"One or more mutation selectors did not match the live page.\",\n repairHint: \"Inspect the current browser snapshot, choose a selector that exists, and reapply the draft.\",\n }\n : {}),\n };\n }\n\n saveNow(): Promise<void> {\n this.cancelSave();\n if (!this.state.variation || this.state.saveState === \"conflict\") {\n return Promise.resolve();\n }\n const variationId = this.state.variation.id;\n const variationRequest = this.variationRequest;\n const queued = this.saveQueue.then(() =>\n this.performSave(variationId, variationRequest),\n );\n this.saveQueue = queued.catch(() => undefined);\n return queued;\n }\n\n private async performSave(\n variationId: string,\n saveVariationRequest: number,\n ): Promise<void> {\n if (\n saveVariationRequest !== this.variationRequest ||\n this.state.variation?.id !== variationId ||\n this.state.saveState === \"conflict\"\n ) {\n return;\n }\n const expectedHash = this.state.variation.artifactHash;\n const snapshot = cloneArtifacts(this.state.artifacts);\n const saveRevision = this.revision;\n if (\n !NON_LIVE_EDITOR_STATUSES.has(this.session.experimentStatus ?? \"\") &&\n !this.liveSaveConfirmed\n ) {\n const confirmed = this.confirmLiveSave(\n \"This test is live. Saving publishes this treatment to real visitors, and the result will span both treatment versions. Save now?\",\n );\n if (!confirmed) {\n this.patch({\n saveState: \"idle\",\n saveMessage: \"Live save cancelled. Your changes are still unsaved.\",\n });\n return;\n }\n this.liveSaveConfirmed = true;\n }\n this.patch({ saveState: \"saving\", saveMessage: \"Saving...\" });\n try {\n const result = await this.api.saveArtifacts(variationId, snapshot, expectedHash);\n if (saveVariationRequest !== this.variationRequest || this.state.variation?.id !== variationId) return;\n const changedDuringSave = saveRevision !== this.revision;\n this.state = {\n ...this.state,\n variation: {\n ...this.state.variation!,\n artifactHash: result.artifactHash,\n reviewStatus: result.reviewStatus,\n },\n artifacts: changedDuringSave ? this.state.artifacts : cloneArtifacts(result.artifacts),\n saveState: changedDuringSave\n ? \"idle\"\n : result.outcome.publication?.status === \"pending\"\n ? \"pending\"\n : result.outcome.publication?.status === \"warning\"\n ? \"warning\"\n : \"saved\",\n saveMessage: changedDuringSave\n ? \"Saving latest changes...\"\n : result.outcome.publication?.status === \"pending\"\n ? result.warningIssues[0]?.message ??\n \"Saved. Storefront publication is pending and will retry automatically.\"\n : result.outcome.publication?.status === \"warning\"\n ? result.outcome.publication.message\n : result.warningIssues[0]?.message ?? \"Saved\",\n };\n this.emit();\n } catch (error) {\n if (saveVariationRequest !== this.variationRequest || this.state.variation?.id !== variationId) return;\n if (\n error instanceof EditorApiError &&\n error.outcome?.saved === true &&\n error.outcome.artifactHash\n ) {\n this.state = {\n ...this.state,\n variation: {\n ...this.state.variation!,\n artifactHash: error.outcome.artifactHash,\n reviewStatus:\n typeof error.payload?.reviewStatus === \"string\"\n ? error.payload.reviewStatus\n : this.state.variation!.reviewStatus,\n },\n saveState:\n error.outcome.publication?.status === \"pending\"\n ? \"pending\"\n : error.outcome.publication?.status === \"warning\"\n ? \"warning\"\n : \"publication_failed\",\n saveMessage: error.outcome.publication?.message ?? error.message,\n };\n this.emit();\n } else if (error instanceof EditorApiError && error.status === 409) {\n this.patch({\n saveState: \"conflict\",\n saveMessage: \"Draft changed elsewhere. Reload this variation before saving.\",\n });\n } else {\n this.patch({\n saveState: \"error\",\n saveMessage: error instanceof Error ? error.message : \"Draft could not be saved\",\n });\n }\n }\n }\n\n async exit(): Promise<void> {\n this.cancelSave();\n this.runCleanups();\n this.devicePreview?.close(false);\n this.visualContext?.rollback();\n document.getElementById(EDITOR_CSS_ID)?.remove();\n try {\n window.opener?.postMessage(\n {\n type: \"apex:editor-exited\",\n sid: this.session.sid,\n experimentId: this.session.experimentId,\n variationId: this.state.variation?.id ?? this.session.initialVariationId,\n },\n this.apiOrigin,\n );\n } catch {}\n try {\n await this.withTimeout(this.api.revoke(), EXIT_REVOKE_TIMEOUT_MS);\n } catch {}\n this.reload();\n }\n\n destroy(): void {\n this.cancelSave();\n this.runCleanups();\n this.devicePreview?.close(false);\n this.visualContext?.rollback();\n document.getElementById(EDITOR_CSS_ID)?.remove();\n this.listeners.clear();\n }\n\n private mutateSelected(input: Omit<Mutation, \"selector\">): void {\n const selector = this.state.selectedSelector;\n if (!selector) return;\n this.commit(upsertMutation(this.state.artifacts, { ...input, selector } as Mutation));\n }\n\n private commit(next: EditorArtifacts, applyVisual = true): void {\n if (this.state.saveState === \"conflict\") return;\n this.history.push(this.state.artifacts);\n this.revision += 1;\n this.state = {\n ...this.state,\n artifacts: cloneArtifacts(next),\n saveState: \"idle\",\n saveMessage: \"Unsaved changes\",\n canUndo: this.history.canUndo,\n canRedo: this.history.canRedo,\n };\n if (applyVisual) this.applyVisualArtifacts();\n this.devicePreview?.update(this.state.artifacts, this.state.artifactsEnabled);\n this.emit();\n this.scheduleSave();\n }\n\n private replaceFromHistory(artifacts: EditorArtifacts): void {\n this.revision += 1;\n this.state = {\n ...this.state,\n artifacts,\n saveState: \"idle\",\n saveMessage: \"Unsaved changes\",\n canUndo: this.history.canUndo,\n canRedo: this.history.canRedo,\n jsApplied: false,\n };\n this.applyVisualArtifacts();\n this.devicePreview?.update(artifacts, this.state.artifactsEnabled);\n this.emit();\n this.scheduleSave();\n }\n\n private applyVisualArtifacts(): void {\n this.visualContext?.rollback();\n this.visualContext = null;\n document.getElementById(EDITOR_CSS_ID)?.remove();\n if (!this.state.artifactsEnabled) return;\n if (this.state.artifacts.customCss.trim()) {\n const style = document.createElement(\"style\");\n style.id = EDITOR_CSS_ID;\n style.textContent = this.state.artifacts.customCss;\n (document.head || document.documentElement).appendChild(style);\n }\n this.visualContext = createMutationApplicationContext();\n this.visualContext.apply(this.state.artifacts.mutations);\n }\n\n private scheduleSave(): void {\n this.cancelSave();\n this.saveTimer = setTimeout(() => void this.saveNow(), AUTOSAVE_MS);\n }\n\n private cancelSave(): void {\n if (this.saveTimer) clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n private patch(patch: Partial<EditorState>): void {\n this.state = { ...this.state, ...patch };\n this.emit();\n }\n\n private emit(): void {\n for (const listener of this.listeners) listener(this.state);\n }\n\n private selectorElements(selector: string): Element[] {\n try {\n return Array.from(document.querySelectorAll(selector));\n } catch {\n return [];\n }\n }\n\n private selectorCount(selector: string): number {\n try {\n return document.querySelectorAll(selector).length;\n } catch {\n return -1;\n }\n }\n\n private isVisible(element: Element): boolean {\n if (!(element instanceof HTMLElement)) return true;\n const style = getComputedStyle(element);\n if (style.display === \"none\" || style.visibility === \"hidden\" || Number(style.opacity) === 0) return false;\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0 || Boolean(element.textContent?.trim());\n }\n\n private verifyMutationEffect(\n mutation: Mutation,\n beforeCount: number,\n afterCount: number,\n ): boolean {\n if (beforeCount <= 0) return false;\n if (mutation.action === \"remove\") return afterCount === 0;\n const elements = this.selectorElements(mutation.selector);\n if (!elements.length) return false;\n if ((mutation.action === \"text\" || mutation.action === \"setText\") && typeof mutation.text === \"string\") {\n return elements.every((element) => element.textContent === mutation.text);\n }\n if (mutation.action === \"html\" && typeof mutation.html === \"string\") {\n const sanitizedHtml = sanitizeHtml(mutation.html);\n return elements.every((element) => {\n const expected = element.cloneNode(false) as Element;\n expected.innerHTML = sanitizedHtml;\n return element.innerHTML === expected.innerHTML;\n });\n }\n if (mutation.action === \"attribute\") {\n const attributes = {\n ...(mutation.attribute ? { [mutation.attribute.name]: mutation.attribute.value } : {}),\n ...(mutation.attributes ?? {}),\n };\n const requestedAttributes = Object.entries(attributes);\n const safeAttributes = requestedAttributes.filter(\n ([name, value]) => isSafeMutationAttribute(name, value),\n );\n // A mutation whose every requested attribute was dropped as unsafe wrote\n // nothing \u2014 it must not verify as success vacuously.\n if (requestedAttributes.length > 0 && safeAttributes.length === 0) return false;\n return elements.every((element) => safeAttributes.every(\n ([name, value]) => value === null\n ? !element.hasAttribute(name)\n : element.getAttribute(name) === value,\n ));\n }\n if (mutation.action === \"style\" || mutation.action === \"setStyle\") {\n return elements.every((element) => Object.entries(mutation.styles ?? {}).every(\n ([name, value]) => (element as HTMLElement).style.getPropertyValue(\n name.includes(\"-\") ? name : name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),\n ) === value,\n ));\n }\n return true;\n }\n\n private runCleanups(): void {\n for (const cleanup of this.cleanups) cleanup();\n this.cleanups.clear();\n }\n\n private async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T | undefined> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n return await Promise.race([\n promise,\n new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), timeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n}\n", "export const EDITOR_FRAGMENT_KEY = \"apex-editor\";\nexport const EDITOR_BUNDLE_FILENAME = \"editor.js\";\nexport const EDITOR_DEVICE_FRAME_NAME = \"apex-editor-device-preview\";\nconst EDITOR_SCRIPT_ID = \"drip-editor-bundle\";\nconst EDITOR_LOAD_TIMEOUT_MS = 10_000;\n\nexport type EditorLaunchHint = {\n token: string;\n sid: string;\n apiOrigin: string;\n};\n\ntype LocationLike = Pick<Location, \"hash\" | \"href\">;\ntype HistoryLike = Pick<History, \"replaceState\" | \"state\">;\n\nexport type EditorBundleApi = {\n start: (launch: EditorLaunchHint) => boolean | Promise<boolean>;\n};\n\ntype EditorGlobal = typeof globalThis & {\n ApexEditor?: EditorBundleApi;\n};\n\nlet editorState: \"idle\" | \"starting\" | \"active\" = \"idle\";\n\nexport function isEditorDevicePreview(windowLike: Pick<Window, \"name\"> = window): boolean {\n return windowLike.name === EDITOR_DEVICE_FRAME_NAME;\n}\n\nfunction decodeBase64Url(value: string): string | null {\n try {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n return atob(padded);\n } catch {\n return null;\n }\n}\n\nfunction normalizeApiOrigin(value: unknown): string | null {\n if (typeof value !== \"string\" || !value.trim()) return null;\n try {\n const url = new URL(value);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return null;\n return url.origin;\n } catch {\n return null;\n }\n}\n\nexport function decodeEditorLaunchToken(token: string): Omit<EditorLaunchHint, \"token\"> | null {\n const encodedPayload = token.split(\".\", 1)[0];\n if (!encodedPayload) return null;\n const decoded = decodeBase64Url(encodedPayload);\n if (!decoded) return null;\n try {\n const payload = JSON.parse(decoded) as Record<string, unknown>;\n const sid = typeof payload.sid === \"string\" ? payload.sid.trim() : \"\";\n const apiOrigin = normalizeApiOrigin(payload.apiOrigin ?? payload.api_origin);\n if (payload.aud !== \"apex-editor-exchange\" || !sid || !apiOrigin) return null;\n return { sid, apiOrigin };\n } catch {\n return null;\n }\n}\n\nexport function consumeEditorLaunchFragment(\n locationLike: LocationLike = location,\n historyLike: HistoryLike = history,\n): EditorLaunchHint | null {\n if (!locationLike.hash || locationLike.hash.length < 2) return null;\n const params = new URLSearchParams(locationLike.hash.slice(1));\n const encodedToken = params.get(EDITOR_FRAGMENT_KEY);\n if (!encodedToken) return null;\n\n const token = encodedToken.trim();\n const hint = decodeEditorLaunchToken(token);\n params.delete(EDITOR_FRAGMENT_KEY);\n\n try {\n const cleanUrl = new URL(locationLike.href);\n const remainingHash = params.toString();\n cleanUrl.hash = remainingHash ? `#${remainingHash}` : \"\";\n historyLike.replaceState(historyLike.state ?? null, \"\", cleanUrl.toString());\n } catch {\n return null;\n }\n\n return hint ? { token, ...hint } : null;\n}\n\nexport function resolveEditorBundleUrl(input: {\n configuredUrl?: string;\n scriptSrc?: string;\n pageUrl?: string;\n}): string | null {\n const baseUrl = input.scriptSrc || input.pageUrl;\n if (input.configuredUrl) {\n try {\n const url = new URL(input.configuredUrl, baseUrl);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.toString() : null;\n } catch {\n return null;\n }\n }\n if (!input.scriptSrc) return null;\n try {\n const scriptUrl = new URL(input.scriptSrc, input.pageUrl);\n if (/^\\/sdk\\/[^/]+\\/[^/]+\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, EDITOR_BUNDLE_FILENAME);\n } else if (/\\/drip(?:\\.live|\\.heatmap|\\.debug)?\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, EDITOR_BUNDLE_FILENAME);\n } else {\n scriptUrl.pathname = `/${EDITOR_BUNDLE_FILENAME}`;\n }\n scriptUrl.search = \"\";\n scriptUrl.hash = \"\";\n return scriptUrl.toString();\n } catch {\n return null;\n }\n}\n\nexport function loadEditorBundle(\n bundleUrl: string,\n documentLike: Document = document,\n timeoutMs = EDITOR_LOAD_TIMEOUT_MS,\n): Promise<EditorBundleApi> {\n return new Promise((resolve, reject) => {\n const existing = documentLike.getElementById(EDITOR_SCRIPT_ID);\n existing?.remove();\n\n const script = documentLike.createElement(\"script\");\n script.id = EDITOR_SCRIPT_ID;\n script.src = bundleUrl;\n script.async = true;\n script.crossOrigin = \"anonymous\";\n\n const timeout = setTimeout(() => {\n script.remove();\n reject(new Error(\"Editor bundle load timed out\"));\n }, timeoutMs);\n const finish = (error?: Error) => {\n clearTimeout(timeout);\n if (error) {\n script.remove();\n reject(error);\n return;\n }\n const editorGlobal = globalThis as EditorGlobal;\n const api = editorGlobal.ApexEditor;\n try {\n editorGlobal.ApexEditor = undefined;\n } catch {}\n if (!api || typeof api.start !== \"function\") {\n reject(new Error(\"Editor bundle did not expose a start function\"));\n return;\n }\n resolve(api);\n };\n script.onload = () => finish();\n script.onerror = () => finish(new Error(\"Editor bundle failed to load\"));\n (documentLike.head || documentLike.documentElement).appendChild(script);\n });\n}\n\nexport function interceptEditorLaunch(input: {\n configuredBundleUrl?: string;\n scriptSrc?: string;\n pageUrl?: string;\n onBeforeLoad?: () => void;\n onFailure: () => void;\n loadBundle?: (url: string) => Promise<EditorBundleApi>;\n locationLike?: LocationLike;\n historyLike?: HistoryLike;\n}): boolean {\n if (editorState !== \"idle\") return true;\n const launch = consumeEditorLaunchFragment(input.locationLike, input.historyLike);\n if (!launch) return false;\n\n editorState = \"starting\";\n input.onBeforeLoad?.();\n const bundleUrl = resolveEditorBundleUrl({\n configuredUrl: input.configuredBundleUrl,\n scriptSrc: input.scriptSrc,\n pageUrl: input.pageUrl,\n });\n const fail = () => {\n editorState = \"idle\";\n input.onFailure();\n };\n if (!bundleUrl) {\n Promise.resolve().then(fail);\n return true;\n }\n\n const loader = input.loadBundle ?? ((url: string) => loadEditorBundle(url));\n loader(bundleUrl)\n .then((api) => api.start(launch))\n .then((active) => {\n if (active) editorState = \"active\";\n else fail();\n })\n .catch(fail);\n return true;\n}\n\nexport const __test = {\n getState: () => editorState,\n resetState: () => {\n editorState = \"idle\";\n },\n};\n", "import { createMutationApplicationContext, type MutationApplicationContext } from \"../mutate\";\nimport type { EditorArtifacts, EditorDeviceState } from \"./types\";\n\nconst FRAME_TIMEOUT_MS = 5_000;\nconst DEVICE_STYLE_ID = \"apex-editor-device-css\";\n\nexport type DevicePreviewSize = { width: number; height: number };\n\nexport class DevicePreview {\n private context: MutationApplicationContext | null = null;\n private hiddenChildren: Array<{ element: HTMLElement; visibility: string }> = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private artifacts: EditorArtifacts | null = null;\n\n constructor(\n private readonly frame: HTMLIFrameElement,\n private readonly onState: (state: EditorDeviceState) => void,\n ) {}\n\n open(artifacts: EditorArtifacts): void {\n this.close(false);\n this.artifacts = artifacts;\n this.hideStorePage();\n this.onState(\"loading\");\n this.frame.hidden = false;\n this.frame.onload = () => this.handleLoad();\n this.frame.onerror = () => this.blocked();\n const url = new URL(location.href);\n url.hash = \"\";\n this.frame.src = url.toString();\n this.timer = setTimeout(() => this.blocked(), FRAME_TIMEOUT_MS);\n }\n\n update(artifacts: EditorArtifacts, enabled = true): void {\n this.artifacts = enabled ? artifacts : { mutations: [], customCss: \"\", customJs: \"\" };\n const doc = this.readDocument();\n if (doc) this.apply(doc, this.artifacts);\n }\n\n close(notify = true): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.context?.rollback();\n this.context = null;\n this.frame.onload = null;\n this.frame.onerror = null;\n this.frame.hidden = true;\n this.frame.removeAttribute(\"src\");\n for (const item of this.hiddenChildren) {\n item.element.style.visibility = item.visibility;\n }\n this.hiddenChildren = [];\n if (notify) this.onState(\"closed\");\n }\n\n private handleLoad(): void {\n const doc = this.readDocument();\n if (!doc?.body || !this.artifacts) {\n this.blocked();\n return;\n }\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.apply(doc, this.artifacts);\n this.onState(\"active\");\n }\n\n private readDocument(): Document | null {\n try {\n const doc = this.frame.contentDocument;\n const frameUrl = this.frame.contentWindow?.location.href ?? \"\";\n if (!doc || !frameUrl || frameUrl === \"about:blank\") return null;\n return doc;\n } catch {\n return null;\n }\n }\n\n private apply(doc: Document, artifacts: EditorArtifacts): void {\n this.context?.rollback();\n this.context = createMutationApplicationContext();\n doc.getElementById(DEVICE_STYLE_ID)?.remove();\n if (artifacts.customCss.trim()) {\n const style = doc.createElement(\"style\");\n style.id = DEVICE_STYLE_ID;\n style.textContent = artifacts.customCss;\n (doc.head || doc.documentElement).appendChild(style);\n }\n this.context.apply(artifacts.mutations, { root: doc });\n }\n\n private hideStorePage(): void {\n const editorHost = document.getElementById(\"apex-editor-host\");\n this.hiddenChildren = Array.from(document.body?.children ?? [])\n .filter((element): element is HTMLElement => element instanceof HTMLElement && element !== editorHost)\n .map((element) => {\n const visibility = element.style.visibility;\n element.style.visibility = \"hidden\";\n return { element, visibility };\n });\n }\n\n private blocked(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.frame.onload = null;\n this.frame.onerror = null;\n this.frame.hidden = true;\n this.frame.removeAttribute(\"src\");\n this.restoreStorePage();\n this.onState(\"blocked\");\n }\n\n private restoreStorePage(): void {\n for (const item of this.hiddenChildren) {\n item.element.style.visibility = item.visibility;\n }\n this.hiddenChildren = [];\n }\n}\n", "import { elementLabel, generateDeterministicSelector } from \"./selector\";\n\ntype PickerOverlay = {\n box: HTMLElement;\n label: HTMLElement;\n};\n\nfunction editorElement(element: Element | null): boolean {\n return Boolean(element?.closest(\"#apex-editor-host\"));\n}\n\nfunction editorEvent(event: Event): boolean {\n return event.composedPath().some(\n (item) => item instanceof Element && item.id === \"apex-editor-host\",\n );\n}\n\nfunction selectableElement(element: Element): boolean {\n return element.ownerDocument === document && element.getRootNode() === document;\n}\n\nexport class ElementPicker {\n private active = false;\n private hovered: Element | null = null;\n private selected: Element | null = null;\n\n constructor(\n private readonly overlay: PickerOverlay,\n private readonly onSelect: (element: Element, selector: string) => void,\n private readonly onActiveChange: (active: boolean) => void,\n private readonly onUnsupported?: () => void,\n ) {\n document.addEventListener(\"pointermove\", this.onPointerMove, true);\n document.addEventListener(\"click\", this.onClick, true);\n document.addEventListener(\"keydown\", this.onKeyDown, true);\n window.addEventListener(\"scroll\", this.refresh, true);\n window.addEventListener(\"resize\", this.refresh);\n }\n\n setActive(active: boolean): void {\n this.active = active;\n if (!active) this.hovered = null;\n this.renderOverlay(active ? this.hovered : this.selected);\n this.onActiveChange(active);\n }\n\n setSelected(element: Element | null): void {\n this.selected = element;\n this.renderOverlay(this.active ? this.hovered : element);\n }\n\n destroy(): void {\n document.removeEventListener(\"pointermove\", this.onPointerMove, true);\n document.removeEventListener(\"click\", this.onClick, true);\n document.removeEventListener(\"keydown\", this.onKeyDown, true);\n window.removeEventListener(\"scroll\", this.refresh, true);\n window.removeEventListener(\"resize\", this.refresh);\n }\n\n private onPointerMove = (event: PointerEvent) => {\n if (!this.active) return;\n if (editorEvent(event)) return;\n const target = event.composedPath()[0];\n const element = target instanceof Element ? target : null;\n if (!element || !selectableElement(element) || editorElement(element)) return;\n this.hovered = element;\n this.renderOverlay(element);\n };\n\n private onClick = (event: MouseEvent) => {\n if (!this.active) return;\n if (editorEvent(event)) return;\n const target = event.composedPath()[0];\n const element = target instanceof Element ? target : null;\n if (!element) return;\n if (!selectableElement(element) || editorElement(element)) {\n if (!editorElement(element)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.onUnsupported?.();\n }\n return;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n this.selected = element;\n this.hovered = null;\n this.active = false;\n this.renderOverlay(element);\n this.onSelect(element, generateDeterministicSelector(element));\n this.onActiveChange(false);\n };\n\n private onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && this.active) {\n event.preventDefault();\n this.setActive(false);\n return;\n }\n const target = event.target;\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n (target instanceof HTMLElement && target.isContentEditable)\n ) {\n return;\n }\n if (!this.selected || ![\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(event.key)) {\n return;\n }\n const next = event.key === \"ArrowUp\"\n ? this.selected.parentElement\n : event.key === \"ArrowDown\"\n ? this.selected.firstElementChild\n : event.key === \"ArrowLeft\"\n ? this.selected.previousElementSibling\n : this.selected.nextElementSibling;\n if (!next || !selectableElement(next) || editorElement(next)) return;\n event.preventDefault();\n this.selected = next;\n this.renderOverlay(next);\n this.onSelect(next, generateDeterministicSelector(next));\n };\n\n private refresh = () => {\n this.renderOverlay(this.active ? this.hovered : this.selected);\n };\n\n private renderOverlay(element: Element | null): void {\n if (!element?.isConnected) {\n this.overlay.box.hidden = true;\n this.overlay.label.hidden = true;\n return;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n this.overlay.box.hidden = true;\n this.overlay.label.hidden = true;\n return;\n }\n this.overlay.box.hidden = false;\n this.overlay.label.hidden = false;\n this.overlay.box.dataset.state = this.active && element !== this.selected ? \"hover\" : \"selected\";\n this.overlay.box.style.transform = `translate(${Math.round(rect.left)}px,${Math.round(rect.top)}px)`;\n this.overlay.box.style.width = `${Math.round(rect.width)}px`;\n this.overlay.box.style.height = `${Math.round(rect.height)}px`;\n this.overlay.label.textContent = elementLabel(element);\n const labelTop = rect.top >= 28 ? rect.top - 24 : rect.bottom + 4;\n this.overlay.label.style.transform = `translate(${Math.max(4, Math.round(rect.left))}px,${Math.round(labelTop)}px)`;\n }\n}\n", "import type { Mutation } from \"../types\";\nimport { upsertMutation } from \"./artifacts\";\nimport type {\n ActiveEditorSession,\n EditorArtifacts,\n} from \"./types\";\n\nconst MAX_CONTEXT_CHARS = 180_000;\nconst MAX_CONVERSATION_MESSAGES = 12;\nconst CONTEXT_SELECTORS = [\n \"main\",\n \"header\",\n \"footer\",\n \"section\",\n \"article\",\n \"nav\",\n \"form\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"p\",\n \"button\",\n \"a[href]\",\n \"input\",\n \"select\",\n \"textarea\",\n \"img\",\n \"[role]\",\n \"[data-testid]\",\n].join(\",\");\n\nexport type EditorOperatorMessage = {\n role: \"user\" | \"assistant\";\n content: string;\n};\n\nexport type EditorOperatorSelectedElement = {\n selector: string;\n tag?: string;\n textPreview?: string;\n alternatives?: string[];\n};\n\nexport type EditorOperatorResult = {\n artifacts: EditorArtifacts;\n explanation: string;\n artifactCount: number;\n mergeStrategy: \"append\" | \"replace\";\n};\n\nfunction compactWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nexport function redactEditorContextUrl(value: string, baseUrl?: string): string {\n try {\n const url = new URL(value, baseUrl);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n url.username = \"\";\n url.password = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n }\n return `${url.protocol}[redacted]`;\n } catch {\n return value.split(/[?#]/, 1)[0].slice(0, 500);\n }\n}\n\nfunction safeAttributeEntries(element: Element): Array<[string, string]> {\n return Array.from(element.attributes)\n .filter(({ name }) => {\n const lower = name.toLowerCase();\n return (\n lower === \"id\" ||\n lower === \"class\" ||\n lower === \"href\" ||\n lower === \"src\" ||\n lower === \"alt\" ||\n lower === \"title\" ||\n lower === \"name\" ||\n lower === \"type\" ||\n lower === \"role\" ||\n lower.startsWith(\"aria-\") ||\n lower === \"data-testid\" ||\n lower === \"data-section-id\" ||\n lower === \"data-product-id\"\n );\n })\n .map(({ name, value }) => [\n name,\n name.toLowerCase() === \"href\" || name.toLowerCase() === \"src\"\n ? redactEditorContextUrl(value, element.ownerDocument.baseURI)\n : value.slice(0, 500),\n ]);\n}\n\nfunction serializeElement(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const attributes = safeAttributeEntries(element)\n .map(([name, value]) => `${name}=${JSON.stringify(value)}`)\n .join(\" \");\n const text =\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ? \"\"\n : compactWhitespace(element.textContent ?? \"\").slice(0, 600);\n return `<${tag}${attributes ? ` ${attributes}` : \"\"}>${text}</${tag}>`;\n}\n\nexport function collectEditorDomContext(\n documentLike: Document = document,\n): string {\n const lines = [\n `url=${redactEditorContextUrl(documentLike.location?.href ?? \"\")}`,\n `title=${compactWhitespace(documentLike.title ?? \"\")}`,\n ];\n const seen = new Set<Element>();\n for (const element of Array.from(\n documentLike.querySelectorAll(CONTEXT_SELECTORS),\n )) {\n if (seen.has(element) || element.id === \"apex-editor-host\") continue;\n seen.add(element);\n lines.push(serializeElement(element));\n if (lines.join(\"\\n\").length >= MAX_CONTEXT_CHARS) break;\n }\n return lines.join(\"\\n\").slice(0, MAX_CONTEXT_CHARS);\n}\n\nfunction parseMutation(value: unknown): Mutation | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const mutation = value as Mutation;\n return typeof mutation.selector === \"string\" &&\n typeof mutation.action === \"string\"\n ? mutation\n : null;\n}\n\nfunction appendCode(current: string, generated: string): string {\n if (!generated.trim()) return current;\n if (!current.trim()) return generated;\n return `${current.trimEnd()}\\n\\n${generated.trimStart()}`;\n}\n\nexport function mergeEditorOperatorArtifacts(input: {\n current: EditorArtifacts;\n generatedMutations: unknown;\n generatedCss: unknown;\n generatedJs: unknown;\n mergeStrategy: unknown;\n}): EditorArtifacts {\n const generated = Array.isArray(input.generatedMutations)\n ? input.generatedMutations.map(parseMutation).filter((value): value is Mutation => Boolean(value))\n : [];\n const customCss =\n typeof input.generatedCss === \"string\" ? input.generatedCss : \"\";\n const customJs =\n typeof input.generatedJs === \"string\" ? input.generatedJs : \"\";\n if (input.mergeStrategy === \"replace\") {\n return { mutations: generated, customCss, customJs };\n }\n return {\n mutations: generated.reduce(\n (artifacts, mutation) => upsertMutation(artifacts, mutation),\n input.current,\n ).mutations,\n customCss: appendCode(input.current.customCss, customCss),\n customJs: appendCode(input.current.customJs, customJs),\n };\n}\n\nfunction errorMessage(payload: unknown, status: number): string {\n if (payload && typeof payload === \"object\") {\n const error = (payload as { error?: unknown }).error;\n if (typeof error === \"string\" && error.trim()) return error.trim();\n }\n return `Operator request failed (${status})`;\n}\n\nexport async function runEditorOperatorTurn(input: {\n apiOrigin: string;\n session: ActiveEditorSession;\n variationId: string;\n prompt: string;\n artifacts: EditorArtifacts;\n conversation: EditorOperatorMessage[];\n pageContext?: string;\n signal?: AbortSignal;\n selectedElement?: EditorOperatorSelectedElement | null;\n documentLike?: Document;\n fetchImpl?: typeof fetch;\n}): Promise<EditorOperatorResult> {\n const fetchImpl = input.fetchImpl ?? fetch;\n const response = await fetchImpl(\n new URL(\n `/api/editor-sessions/${encodeURIComponent(input.session.sid)}/operator`,\n input.apiOrigin,\n ),\n {\n method: \"POST\",\n credentials: \"omit\",\n cache: \"no-store\",\n referrerPolicy: \"no-referrer\",\n signal: input.signal,\n headers: {\n Authorization: `Bearer ${input.session.bearer}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n prompt: input.prompt,\n variationId: input.variationId,\n domContext: collectEditorDomContext(input.documentLike),\n pageContext:\n input.pageContext ??\n `Live merchant page: ${redactEditorContextUrl(input.session.targetUrl)}`,\n existingMutations: input.artifacts.mutations,\n existingCustomCss: input.artifacts.customCss,\n existingCustomJs: input.artifacts.customJs,\n conversation: input.conversation.slice(-MAX_CONVERSATION_MESSAGES),\n selectedElement: input.selectedElement ?? undefined,\n }),\n },\n );\n const payload = (await response.json().catch(() => null)) as\n | Record<string, unknown>\n | null;\n if (!response.ok || !payload) {\n throw new Error(errorMessage(payload, response.status));\n }\n const mergeStrategy =\n payload.mergeStrategy === \"replace\" ? \"replace\" : \"append\";\n const artifacts = mergeEditorOperatorArtifacts({\n current: input.artifacts,\n generatedMutations: payload.mutations,\n generatedCss: payload.customCss,\n generatedJs: payload.customJs,\n mergeStrategy,\n });\n const artifactCount =\n (Array.isArray(payload.mutations) ? payload.mutations.length : 0) +\n (typeof payload.customCss === \"string\" && payload.customCss.trim() ? 1 : 0) +\n (typeof payload.customJs === \"string\" && payload.customJs.trim() ? 1 : 0);\n return {\n artifacts,\n explanation:\n typeof payload.explanation === \"string\" && payload.explanation.trim()\n ? payload.explanation.trim()\n : artifactCount\n ? \"Draft treatment created. Review the result before QA.\"\n : \"No draft changes were produced.\",\n artifactCount,\n mergeStrategy,\n };\n}\n", "// Shared visual kit for the on-site editor chrome. Values are the canonical\n// Apex Design System dark tokens (docs/design-system/tokens) redeclared on\n// :host because the shadow root resets inheritance with all:initial.\n\nexport const ICONS = {\n pointer: \"M4 3l7.6 18 2.3-7.4L21 11.5zM13.9 13.9L19 19\",\n undo: \"M9 14L4 9l5-5M4 9h10.5a5.5 5.5 0 015.5 5.5v0a5.5 5.5 0 01-5.5 5.5H11\",\n redo: \"M15 14l5-5-5-5M20 9H9.5A5.5 5.5 0 004 14.5v0A5.5 5.5 0 009.5 20H13\",\n monitor: \"M3 4h18a1 1 0 011 1v11a1 1 0 01-1 1H3a1 1 0 01-1-1V5a1 1 0 011-1zM8 21h8M12 17v4\",\n tablet: \"M6 2h12a2 2 0 012 2v16a2 2 0 01-2 2H6a2 2 0 01-2-2V4a2 2 0 012-2zM12 18h.01\",\n phone: \"M8 2h8a2 2 0 012 2v16a2 2 0 01-2 2H8a2 2 0 01-2-2V4a2 2 0 012-2zM11 18h2\",\n wifiOff: \"M2 2l20 20M8.5 16.5a5 5 0 015.6-1M5 12.5a10 10 0 015.2-2.7M2 8.8a15 15 0 014.2-2.5M16.6 6.6A15 15 0 0122 8.8M12 20h.01\",\n braces: \"M8 3H7a2 2 0 00-2 2v4a2 2 0 01-2 2 2 2 0 012 2v4a2 2 0 002 2h1M16 3h1a2 2 0 012 2v4a2 2 0 002 2 2 2 0 00-2 2v4a2 2 0 01-2 2h-1\",\n collapse: \"M9 3v18M3 5a2 2 0 012-2h14a2 2 0 012 2v14a2 2 0 01-2 2H5a2 2 0 01-2-2zM13 10l3 2-3 2\",\n history: \"M3 12a9 9 0 113 6.7M3 12H1.5M3 12l-1.8 2M12 7v5l3.5 2\",\n send: \"M22 2L11 13M22 2l-7 20-4-9-9-4z\",\n stop: \"M6 6h12v12H6z\",\n cursorBox: \"M3 3h8M3 3v8M21 13v8h-8M9 9l7 7M16 9v7h-7\",\n check: \"M5 13l4 4L19 7\",\n x: \"M18 6L6 18M6 6l12 12\",\n chevD: \"M6 9l6 6 6-6\",\n chevR: \"M9 6l6 6-6 6\",\n refresh: \"M3 12a9 9 0 0114.5-7L21 8M21 3v5h-5M21 12a9 9 0 01-14.5 7L3 16M3 21v-5h5\",\n external: \"M15 3h6v6M21 3l-9 9M10 5H5a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2v-5\",\n code: \"M16 18l6-6-6-6M8 6l-6 6 6 6\",\n clock: \"M12 22a10 10 0 100-20 10 10 0 000 20zM12 7v5l3 2\",\n eye: \"M2 12s4-7 10-7 10 7 10 7-4 7-10 7-10-7-10-7zM12 15a3 3 0 100-6 3 3 0 000 6z\",\n alert: \"M10.3 3.9L1.8 18a2 2 0 001.7 3h17a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0zM12 9v4M12 17h.01\",\n globe: \"M12 2a10 10 0 100 20 10 10 0 000-20zM2 12h20M12 2a15 15 0 010 20M12 2a15 15 0 000 20\",\n play: \"M6 4l14 8-14 8z\",\n dot: \"M12 12h.01\",\n} as const;\n\nexport type IconName = keyof typeof ICONS;\n\nexport function icon(name: IconName, size = 14, extra = \"\"): string {\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" ${extra}><path d=\"${ICONS[name]}\"/></svg>`;\n}\n\nlet operatorMarkId = 0;\n\n// The Apex Operator \"O.\" monogram \u2014 stencil-cut O with a purple accent chip.\nexport function operatorMark(size = 16, color = \"#fff\"): string {\n const id = `apex-op-mark-${++operatorMarkId}`;\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 120 120\" fill=\"none\" aria-hidden=\"true\" style=\"flex-shrink:0\">\n <defs><mask id=\"${id}\"><rect width=\"120\" height=\"120\" fill=\"#fff\"/><rect x=\"0\" y=\"68\" width=\"120\" height=\"6\" fill=\"#000\"/></mask></defs>\n <path d=\"M60 14 C92 14 106 36 106 60 C106 84 92 106 60 106 C28 106 14 84 14 60 C14 36 28 14 60 14 Z M60 38 C46 38 38 48 38 60 C38 72 46 82 60 82 C74 82 82 72 82 60 C82 48 74 38 60 38 Z\" fill=\"${color}\" fill-rule=\"evenodd\" mask=\"url(#${id})\"/>\n <rect x=\"92\" y=\"92\" width=\"14\" height=\"14\" rx=\"2\" fill=\"#5B29FF\"/>\n </svg>`;\n}\n\nexport function esc(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nexport const KIT_CSS = `\n:host {\n --bg0:#08080A;--bg1:#0A0A0C;--raised:#141419;--raised-hi:#1A1A21;--inset:#0B0B0E;\n --border:rgba(255,255,255,0.06);--border-hi:rgba(255,255,255,0.10);--border-px:rgba(255,255,255,0.14);\n --text1:#FAFAFA;--text2:rgba(255,255,255,0.66);--text3:rgba(255,255,255,0.42);--text4:rgba(255,255,255,0.26);\n --purple500:#5B29FF;--purple400:#7C54FF;--purple300:#9B6FFF;--purple200:#C8B4FF;\n --purple-soft:rgba(91,41,255,0.14);--purple-bd:rgba(124,84,255,0.34);\n --positive:#3DD68C;--warning:#FACC15;--negative:#EB5252;--negative-soft:#F39797;\n all:initial;font-family:Inter,system-ui,sans-serif;color:var(--text1);letter-spacing:0;\n position:fixed;inset:0;z-index:2147483647;pointer-events:none;font-size:12.5px;line-height:1.5;\n}\n*{box-sizing:border-box;letter-spacing:0;margin:0;padding:0}\nbutton,input,select,textarea{font:inherit;color:inherit;font-family:inherit}\nbutton{cursor:pointer;background:none;border:none}\nbutton:disabled{cursor:not-allowed}\n:is(button,textarea,input,a):focus-visible{outline:2px solid var(--purple400);outline-offset:2px}\n@keyframes ee-spin{to{transform:rotate(360deg)}}\n@keyframes ee-pulse{0%{transform:scale(0.7);opacity:0.9}100%{transform:scale(1.6);opacity:0}}\n@keyframes ee-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}\n.ee-in{animation:ee-in 160ms ease-out}\n.spin{animation:ee-spin 1s linear infinite}\n@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:0.01ms!important;animation-iteration-count:1!important;transition-duration:0.01ms!important}}\n\n/* Buttons */\n.btn{display:inline-flex;align-items:center;gap:7px;justify-content:center;padding:7px 12px;font-size:13px;font-weight:550;border-radius:8px;border:1px solid transparent;line-height:1.2;white-space:nowrap;transition:background 120ms,border-color 120ms,color 120ms;pointer-events:auto}\n.btn.sm{padding:5px 10px;font-size:12px}\n.btn:disabled{opacity:0.45}\n.btn.primary{background:var(--purple500);color:#fff;border-color:rgba(255,255,255,0.14)}\n.btn.soft{background:var(--purple-soft);color:var(--purple200);border-color:var(--purple-bd)}\n.btn.ghost{background:transparent;color:var(--text2);border-color:var(--border)}\n.btn.ghost:hover{background:var(--raised-hi);color:var(--text1)}\n.btn.bare{background:transparent;color:var(--text2);border-color:transparent}\n.btn.danger{background:rgba(235,82,82,0.14);color:var(--negative-soft);border-color:rgba(235,82,82,0.3)}\n.iconbtn{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid transparent;background:transparent;color:var(--text2);flex-shrink:0;transition:background 120ms,color 120ms;pointer-events:auto}\n.iconbtn:hover{background:var(--raised-hi);color:var(--text1)}\n.iconbtn.active{background:var(--purple-soft);color:var(--purple200);border-color:var(--purple-bd)}\n.iconbtn:disabled{opacity:0.4}\n.iconbtn.xs{width:22px;height:22px}\n\n/* Status dot */\n.dot{position:relative;width:7px;height:7px;flex-shrink:0;display:inline-block}\n.dot i{position:absolute;inset:0;border-radius:50%}\n.dot.ok i{background:var(--positive)}.dot.warn i{background:var(--warning)}.dot.err i{background:var(--negative)}.dot.purple i{background:var(--purple300)}\n.dot b{position:absolute;inset:-3px;border-radius:50%;border:1px solid currentColor}\n.dot.ok b{color:var(--positive)}.dot.warn b{color:var(--warning)}.dot.err b{color:var(--negative)}.dot.purple b{color:var(--purple300)}\n.dot b{animation:ee-pulse 1.4s ease-out infinite}\n\n/* Save chip */\n.save-chip{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:550;padding:4px 9px;border-radius:7px;background:rgba(255,255,255,0.04);border:1px solid var(--border);white-space:nowrap}\n.save-chip.unsaved{color:var(--warning)}\n.save-chip.saving{color:var(--purple200)}\n.save-chip.saved{color:var(--positive)}\n.save-chip.pending,.save-chip.warning{color:var(--warning);background:rgba(245,166,35,0.10);border-color:rgba(245,166,35,0.25)}\n.save-chip.failed,.save-chip.publication-failed,.save-chip.conflict{color:var(--negative-soft);background:rgba(235,82,82,0.10);border-color:rgba(235,82,82,0.25)}\n.save-chip .retry{border:none;background:rgba(255,255,255,0.1);color:#fff;font-size:11.5px;font-weight:600;border-radius:5px;padding:2px 7px;margin-left:2px;pointer-events:auto}\n\n/* Segmented control */\n.seg{display:inline-flex;background:var(--inset);border-radius:8px;padding:2px;gap:2px;border:1px solid var(--border);pointer-events:auto}\n.seg button{display:inline-flex;align-items:center;gap:6px;justify-content:center;padding:5px 11px;border-radius:6px;border:none;background:transparent;color:var(--text3);font-size:12px;font-weight:550;transition:background 120ms,color 120ms}\n.seg button.sm{padding:4px 8px}\n.seg button[aria-checked=\"true\"]{background:var(--raised-hi);color:var(--text1);box-shadow:inset 0 0 0 1px var(--border-px)}\n\n/* Pills & chips */\n.draft-pill{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border-radius:999px;background:rgba(250,204,21,0.10);border:1px solid rgba(250,204,21,0.3);font-size:11px;font-weight:600;color:var(--warning);white-space:nowrap}\n.session-chip{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:550;color:var(--warning);padding:4px 9px;border-radius:7px;border:1px solid rgba(250,204,21,0.35);background:rgba(250,204,21,0.08);white-space:nowrap;font-variant-numeric:tabular-nums}\n.session-chip .extend{border:none;background:rgba(250,204,21,0.16);color:var(--warning);font-size:11.5px;font-weight:600;border-radius:5px;padding:2px 7px;pointer-events:auto}\n.session-note{font-size:11px;color:var(--text4);white-space:nowrap}\n.conn-chip{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:550;white-space:nowrap;color:var(--text3)}\n.conn-chip.offline{color:var(--negative-soft)}\n.conn-chip.connecting{color:var(--warning)}\n.ctx-chip{display:inline-flex;align-items:center;gap:7px;max-width:100%;background:var(--purple-soft);border:1px solid var(--purple-bd);border-radius:8px;padding:5px 8px;font-size:11.5px;color:var(--purple200);font-weight:550}\n.ctx-chip .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ctx-chip .replace{border:none;background:rgba(255,255,255,0.08);color:var(--text2);font-size:10.5px;font-weight:600;border-radius:5px;padding:2px 7px;pointer-events:auto}\n.ctx-chip .clear{border:none;background:none;color:var(--text3);padding:2px;display:inline-flex;pointer-events:auto}\n\n/* Fields */\n.field{width:100%;background:var(--inset);color:var(--text1);border:1px solid var(--border-hi);border-radius:8px;padding:8px 10px;font-size:12.5px;line-height:1.5;outline:none;resize:vertical;pointer-events:auto}\n.field::placeholder{color:rgba(255,255,255,0.28)}\n.field.code{white-space:pre;font-variant-numeric:tabular-nums;min-height:150px}\n.flabel{display:block;font-size:11.5px;font-weight:550;color:var(--text3);margin-bottom:5px}\n.fhint{display:block;font-size:11px;color:var(--text4);margin-top:4px}\n\n/* Banners */\n.banner{display:flex;align-items:center;gap:9px;padding:8px 12px;border-radius:10px;color:var(--text1);font-size:12.5px;box-shadow:0 12px 32px rgba(0,0,0,0.4);pointer-events:auto;max-width:560px}\n.banner .body{flex:1;min-width:0}\n.banner.info{background:linear-gradient(0deg,rgba(91,41,255,0.16),rgba(91,41,255,0.16)),var(--bg1);border:1px solid var(--purple-bd)}\n.banner.info svg{color:var(--purple200)}\n.banner.warn{background:linear-gradient(0deg,rgba(250,204,21,0.10),rgba(250,204,21,0.10)),var(--bg1);border:1px solid rgba(250,204,21,0.35)}\n.banner.warn svg{color:var(--warning)}\n.banner.error{background:linear-gradient(0deg,rgba(235,82,82,0.12),rgba(235,82,82,0.12)),var(--bg1);border:1px solid rgba(235,82,82,0.35)}\n.banner.error svg{color:var(--negative-soft)}\n\n/* Modal */\n.modal-backdrop{position:fixed;inset:0;z-index:300;display:flex;align-items:center;justify-content:center;background:rgba(5,5,8,0.55);backdrop-filter:blur(3px);pointer-events:auto}\n.modal{width:430px;max-width:calc(100vw - 40px);background:var(--bg1);border:1px solid var(--border-px);border-radius:14px;box-shadow:0 32px 80px rgba(0,0,0,0.55);overflow:hidden;color:var(--text1)}\n.modal .m-head{display:flex;gap:10px;align-items:flex-start;padding:18px 18px 0}\n.modal .m-icon{width:30px;height:30px;border-radius:8px;background:rgba(255,255,255,0.05);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.modal .m-icon.warn{color:var(--warning)}.modal .m-icon.purple{color:var(--purple300)}.modal .m-icon.ok{color:var(--positive)}\n.modal .m-title{font-size:15px;font-weight:600;letter-spacing:-0.015em;padding-top:4px}\n.modal .m-body{padding:12px 18px 4px;font-size:13px;line-height:1.6;color:var(--text2)}\n.modal .m-body p{margin:0}\n.modal .m-body p+p{margin-top:10px}\n.modal .m-actions{display:flex;justify-content:flex-end;gap:8px;padding:14px 18px 18px}\n`;\n", "import { EDITOR_DEVICE_FRAME_NAME } from \"../editor-bootstrap\";\nimport type { Mutation } from \"../types\";\nimport { DevicePreview, type DevicePreviewSize } from \"./device-preview\";\nimport { ElementPicker } from \"./picker\";\nimport { elementLabel } from \"./selector\";\nimport type { EditorController } from \"./controller\";\nimport {\n redactEditorContextUrl,\n runEditorOperatorTurn,\n type EditorOperatorMessage,\n} from \"./operator\";\nimport { cloneArtifacts, type EditorArtifacts, type EditorState } from \"./types\";\nimport { KIT_CSS, esc, icon, operatorMark } from \"./view-kit\";\n\nconst DOCK_WIDTH = 352;\nconst RAIL_WIDTH = 52;\nconst SESSION_WARN_SECONDS = 300;\n\nconst VIEW_CSS = `\n.zone{position:fixed;left:0;top:0;bottom:0;right:${DOCK_WIDTH}px;pointer-events:none}\n.zone.rail{right:${RAIL_WIDTH}px}\n.zone.narrow{right:0}\n.page-border{position:absolute;inset:0;pointer-events:none;box-shadow:inset 0 0 0 3px rgba(91,41,255,0.75)}\n.select-banner{position:absolute;top:12px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:9px;padding:7px 12px;background:var(--purple500);color:#fff;border-radius:999px;border:1px solid rgba(255,255,255,0.25);box-shadow:0 12px 32px rgba(91,41,255,0.45);font-size:12.5px;font-weight:600;white-space:nowrap;pointer-events:auto}\n.select-banner button{border:none;background:rgba(255,255,255,0.16);color:#fff;font-size:11.5px;font-weight:600;border-radius:999px;padding:3px 9px}\n.banners{position:absolute;left:50%;transform:translateX(-50%);display:grid;gap:8px;width:max-content;max-width:calc(100% - 24px);pointer-events:none}\n.banners.lower{top:54px}\n.banners:not(.lower){top:12px}\n.orig-chip{position:absolute;bottom:14px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:8px;padding:6px 12px;border-radius:999px;background:rgba(10,10,13,0.92);border:1px solid var(--border-px);color:var(--text2);font-size:12px;font-weight:550;white-space:nowrap;pointer-events:auto}\n.orig-chip svg{color:var(--purple300)}\n.orig-chip button{border:none;background:var(--purple-soft);color:var(--purple200);font-size:11.5px;font-weight:600;border-radius:999px;padding:3px 9px}\n\n.dock{position:fixed;right:0;top:0;bottom:0;width:${DOCK_WIDTH}px;background:var(--bg1);border-left:1px solid var(--border-px);display:flex;flex-direction:column;min-height:0;pointer-events:auto}\n.rail-dock{position:fixed;right:0;top:0;bottom:0;width:${RAIL_WIDTH}px;background:var(--bg1);border-left:1px solid var(--border-px);display:flex;flex-direction:column;align-items:center;gap:10px;padding:12px 0;pointer-events:auto}\n.rail-dock .sep{width:24px;height:1px;background:var(--border)}\n.rail-dock .grow{flex:1}\n\n.id-head{padding:12px 14px 10px;border-bottom:1px solid var(--border);flex-shrink:0}\n.id-row{display:flex;align-items:center;gap:9px}\n.id-meta{flex:1;min-width:0}\n.id-title{font-size:13px;font-weight:600;letter-spacing:-0.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.id-sub{font-size:11px;color:var(--text3);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.id-chips{display:flex;align-items:center;gap:8px;margin-top:10px;flex-wrap:wrap}\n.id-chips .grow{flex:1}\n.id-conn{margin-top:8px}\n\n.var-wrap{position:relative}\n.var-btn{display:flex;align-items:center;gap:8px;padding:5px 9px;background:var(--raised);border:1px solid var(--border-hi);border-radius:8px;color:var(--text1);font-size:12.5px;font-weight:550;max-width:190px;pointer-events:auto}\n.var-btn .vid{width:18px;height:18px;border-radius:5px;background:var(--purple-soft);border:1px solid var(--purple-bd);color:var(--purple200);font-size:10.5px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}\n.var-btn .vname{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.var-menu{position:absolute;top:calc(100% + 6px);left:0;z-index:250;width:248px;background:var(--bg1);border:1px solid var(--border-px);border-radius:10px;box-shadow:0 20px 48px rgba(0,0,0,0.55);padding:5px;pointer-events:auto}\n.var-menu .note{font-size:11px;color:var(--text3);padding:6px 9px 4px}\n.var-item{display:flex;align-items:center;gap:9px;width:100%;text-align:left;padding:8px 9px;border-radius:7px;border:none;background:transparent;color:var(--text1)}\n.var-item[aria-selected=\"true\"]{background:var(--purple-soft)}\n.var-item .vid{width:20px;height:20px;border-radius:5px;flex-shrink:0;background:var(--raised-hi);color:#fff;font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}\n.var-item[aria-selected=\"true\"] .vid{background:var(--purple500)}\n.var-item .meta{flex:1;min-width:0}\n.var-item .n{display:block;font-size:12.5px;font-weight:550;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.var-item .s{display:block;font-size:11px;color:var(--text3)}\n\n.view-row{display:flex;align-items:center;gap:8px;padding:8px 14px;border-bottom:1px solid var(--border);flex-shrink:0}\n.view-row .grow{flex:1}\n.undo-redo{display:flex;gap:2px}\n\n.tabs{display:flex;gap:2px;padding:0 8px;border-bottom:1px solid var(--border);flex-shrink:0}\n.tab{display:inline-flex;align-items:center;gap:6px;padding:9px 10px 8px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text3);font-size:12.5px;font-weight:550;margin-bottom:-1px;transition:color 120ms;pointer-events:auto}\n.tab[aria-selected=\"true\"]{color:var(--text1);border-bottom-color:var(--purple400)}\n.tab .count{font-size:10.5px;font-weight:650;background:var(--raised-hi);color:var(--text3);border-radius:999px;padding:1px 6px}\n.tab[aria-selected=\"true\"] .count{background:var(--purple-soft);color:var(--purple200)}\n\n.panel{flex:1;min-height:0;display:flex;flex-direction:column}\n.foot{display:flex;align-items:center;gap:10px;padding:10px 14px;border-top:1px solid var(--border);flex-shrink:0}\n.foot .grow{flex:1}\n\n/* Operator */\n.op-ctx{padding:10px 14px 8px;border-bottom:1px solid var(--border);flex-shrink:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.op-ctx .lbl{font-size:11.5px;color:var(--text3)}\n.op-ctx .opt{font-size:11.5px;color:var(--text4)}\n.op-thread{flex:1;overflow-y:auto;min-height:0;padding:12px 14px;display:flex;flex-direction:column;gap:10px}\n.op-empty{margin:auto 0;text-align:center;padding:18px 6px}\n.op-empty .mark{width:42px;height:42px;margin:0 auto 12px;border-radius:12px;background:var(--purple-soft);border:1px solid var(--purple-bd);display:flex;align-items:center;justify-content:center}\n.op-empty .t{font-size:13.5px;font-weight:600;color:var(--text1);margin-bottom:5px}\n.op-empty p{font-size:12.5px;color:var(--text3);line-height:1.6;margin:0 0 14px}\n.op-empty .sugs{display:flex;flex-direction:column;gap:6px;align-items:stretch}\n.sug{font-size:12px;color:var(--text2);background:var(--raised);border:1px solid var(--border);border-radius:8px;padding:7px 11px;text-align:left;pointer-events:auto}\n.msg-user{align-self:flex-end;max-width:88%;display:grid;gap:4px;justify-items:end}\n.msg-user .ref{display:inline-flex;align-items:center;gap:5px;font-size:10.5px;color:var(--purple200);background:var(--purple-soft);border:1px solid var(--purple-bd);border-radius:6px;padding:2px 7px}\n.msg-user .bubble{background:var(--purple500);color:#fff;border-radius:12px 12px 3px 12px;padding:8px 11px;font-size:12.5px;line-height:1.5;white-space:pre-wrap;word-break:break-word}\n.op-card{align-self:stretch;border-radius:12px;padding:10px 12px}\n.op-card.working{background:var(--inset);border:1px solid var(--border)}\n.op-card.failed{background:rgba(235,82,82,0.08);border:1px solid rgba(235,82,82,0.3)}\n.op-card.done{background:rgba(61,214,140,0.06);border:1px solid rgba(61,214,140,0.28)}\n.op-card .head{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:600;margin-bottom:7px}\n.op-card.working .head{color:var(--text1);margin-bottom:8px}\n.op-card.failed .head{color:var(--negative-soft);margin-bottom:5px}\n.op-card.done .head{color:var(--positive)}\n.op-card .steps{display:grid;gap:7px}\n.op-card .step{display:flex;align-items:center;gap:9px;font-size:12px}\n.op-card .step.done{color:var(--text3)}\n.op-card .step.cur{color:var(--text1)}\n.op-card .step.todo{color:var(--text4)}\n.op-card .step .idle{width:12px;text-align:center;color:var(--text4)}\n.op-card p{font-size:12px;color:var(--text2);line-height:1.55;margin:0}\n.op-card .items{display:grid;gap:6px}\n.op-card .item{font-size:12px;color:var(--text2);display:flex;gap:8px;align-items:baseline}\n.op-card .item .b{flex:1;line-height:1.45}\n.op-card .item .sel{display:block;font-size:10.5px;color:var(--text4);word-break:break-all}\n.op-card .row{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}\n.op-card .hint{font-size:10.5px;color:var(--text4);margin-top:8px}\n.op-input{padding:10px 14px 12px;border-top:1px solid var(--border);flex-shrink:0}\n.op-input .line{display:flex;gap:8px;align-items:flex-end}\n.op-input textarea{flex:1;min-height:52px;max-height:120px}\n.op-input .send{width:34px;height:34px;flex:0 0 34px;border-radius:8px;background:var(--purple500);color:#fff;display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,0.14);pointer-events:auto}\n.op-input .send:disabled{opacity:0.4}\n.op-input .note{font-size:10.5px;color:var(--text4);margin-top:6px}\n\n/* Code */\n.code-panel{display:flex;flex-direction:column;min-height:0;overflow-y:auto;flex:1}\n.code-head{padding:10px 14px 0;display:flex;align-items:center;gap:8px}\n.code-head .peer{font-size:11px;color:var(--text4)}\n.code-body{padding:12px 14px;display:grid;gap:10px}\n.code-ok{font-size:11.5px;color:var(--text3);display:flex;gap:7px;align-items:center}\n.code-ok svg{color:var(--positive)}\n.js-warn{display:flex;gap:9px;padding:9px 11px;border-radius:9px;background:rgba(250,204,21,0.08);border:1px solid rgba(250,204,21,0.3);font-size:11.5px;line-height:1.55;color:var(--text2)}\n.js-warn svg{color:var(--warning);flex-shrink:0;margin-top:1px}\n.js-warn strong{color:var(--warning);font-weight:600}\n.code-foot{border-top:1px solid var(--border);padding:10px 14px 12px;font-size:11.5px;color:var(--text3);line-height:1.6}\n.code-foot button{border:none;background:none;color:var(--purple200);font-size:11.5px;padding:0;text-decoration:underline;text-underline-offset:2px;pointer-events:auto}\n\n/* Changes */\n.chg-panel{overflow-y:auto;flex:1;min-height:0}\n.chg-head{padding:12px 14px 8px;display:flex;align-items:center;gap:8px}\n.chg-head .t{font-size:13px;font-weight:600;color:var(--text1);flex:1}\n.chg-empty{font-size:12.5px;color:var(--text3);padding:4px 14px 14px;line-height:1.6}\n.chg-list{display:grid;gap:6px;padding:2px 14px 12px}\n.chg-row{display:flex;gap:9px;align-items:flex-start;padding:9px 10px;background:var(--inset);border:1px solid var(--border);border-radius:9px}\n.chg-row .org{margin-top:1px;flex-shrink:0;color:var(--purple300)}\n.chg-row .meta{flex:1;min-width:0}\n.chg-row .l{font-size:12.5px;color:var(--text1);font-weight:550;line-height:1.4;word-break:break-word}\n.chg-row .s{font-size:11px;color:var(--text4);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.chg-art{border-top:1px solid var(--border);padding:10px 14px 12px}\n.chg-art .toggle{display:inline-flex;align-items:center;gap:7px;border:none;background:none;color:var(--text2);font-size:12px;font-weight:550;padding:0;pointer-events:auto}\n.chg-art .json{margin-top:8px;background:var(--inset);border:1px solid var(--border);border-radius:9px;padding:10px 12px;font-size:11px;line-height:1.65;color:var(--text2);white-space:pre-wrap;word-break:break-word;font-variant-numeric:tabular-nums;max-height:280px;overflow:auto}\n.chg-art .note{font-size:11.5px;color:var(--text3);line-height:1.55;margin-top:10px}\n.chg-art .pill-row{margin-top:8px}\n\n/* Boot overlay */\n.boot{position:fixed;inset:0;z-index:400;background:#08080A;display:flex;align-items:center;justify-content:center;pointer-events:auto}\n.boot[hidden]{display:none}\n.boot .box{width:330px;max-width:calc(100vw - 48px)}\n.boot .kicker{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:15px;font-weight:650;letter-spacing:-0.02em}\n.boot .sub{font-size:12.5px;color:var(--text3);margin-bottom:22px}\n.boot .steps{display:grid;gap:12px}\n.boot .step{display:flex;align-items:center;gap:10px;font-size:13px}\n.boot .step.done{color:var(--text3)}\n.boot .step.cur{color:#fff}\n.boot .step.todo{color:var(--text4)}\n.boot .step .idle{width:14px;text-align:center}\n.boot .bar{margin-top:26px;height:3px;border-radius:999px;background:var(--raised-hi);overflow:hidden}\n.boot .bar i{display:block;height:100%;background:var(--purple500);border-radius:999px;transition:width 400ms ease}\n.boot .scope{margin-top:22px;font-size:11.5px;color:var(--text4);line-height:1.6}\n.boot .err{margin-top:18px;font-size:12.5px;color:var(--negative-soft);line-height:1.55}\n\n/* Picker overlay */\n.picker-box{position:fixed;left:0;top:0;border:2px solid var(--purple400);background:rgba(91,41,255,0.08);pointer-events:none;z-index:200}\n.picker-box[data-state=\"hover\"]{border-style:dashed}\n.picker-box[data-state=\"selected\"]{border-style:solid;border-color:var(--purple500)}\n.picker-label{position:fixed;left:0;top:0;padding:3px 8px;border-radius:6px;background:var(--purple500);color:#fff;font-size:11px;font-weight:600;white-space:nowrap;pointer-events:none;z-index:201}\n\n/* Device preview */\n.device{position:fixed;left:0;top:0;bottom:0;right:${DOCK_WIDTH}px;background:var(--bg0);display:flex;align-items:center;justify-content:center;padding:24px;pointer-events:auto;z-index:90}\n.device.narrow{right:0}\n.device[hidden]{display:none}\n.device-shell{display:flex;flex-direction:column;gap:12px;align-items:center;max-width:100%;max-height:100%}\n.device-head{width:min(420px,100%);display:flex;align-items:center;justify-content:space-between;color:var(--text2);font-size:12px}\n.device-frame{border:1px solid var(--border-hi);border-radius:10px;background:#fff;box-shadow:0 24px 64px rgba(0,0,0,0.5);max-width:calc(100% - 8px);max-height:calc(100vh - 140px)}\n.device-fallback{width:390px;max-width:calc(100vw - 48px);padding:16px;background:var(--raised);border:1px solid var(--border-hi);border-radius:10px;color:var(--text2);font-size:12px;line-height:1.6}\n.device-fallback .row{display:flex;gap:8px;margin-top:10px}\n\n/* Narrow viewport: bottom sheet */\n.sheet{position:fixed;left:0;right:0;bottom:0;background:var(--bg1);border-top:1px solid var(--border-px);border-radius:16px 16px 0 0;box-shadow:0 -16px 48px rgba(0,0,0,0.5);display:flex;flex-direction:column;pointer-events:auto;max-height:64vh}\n.sheet .handle{background:none;border:none;padding:8px 0 4px;display:flex;justify-content:center;width:100%;pointer-events:auto}\n.sheet .handle i{width:36px;height:4px;border-radius:999px;background:var(--border-px);display:block}\n.sheet .bar{display:flex;align-items:center;gap:8px;padding:2px 14px 10px;flex-wrap:wrap}\n.sheet .bar .grow{flex:1}\n.sheet .row2{display:flex;align-items:center;gap:8px;padding:0 14px 8px;flex-wrap:wrap}\n`;\n\ntype PanelTab = \"operator\" | \"code\" | \"changes\";\n\ntype ThreadUserMessage = {\n id: number;\n role: \"user\";\n text: string;\n ctxLabel: string | null;\n};\n\ntype ThreadOperatorMessage = {\n id: number;\n role: \"op\";\n phase: \"working\" | \"done\" | \"failed\" | \"save-failed\" | \"publication-failed\";\n step: number;\n steps: string[];\n prompt: string;\n ctxSelector: string | null;\n ctxLabel: string | null;\n preArtifacts: EditorArtifacts;\n postArtifacts: EditorArtifacts | null;\n results: Array<{ label: string; target: string }>;\n error: string | null;\n undone: boolean;\n abort: AbortController | null;\n};\n\ntype ThreadMessage = ThreadUserMessage | ThreadOperatorMessage;\n\ntype ChangeEntry = {\n kind: \"mutation\" | \"css\" | \"js\";\n selector: string | null;\n mutationIndex: number | null;\n label: string;\n target: string;\n origin: \"operator\" | \"code\";\n risky: boolean;\n};\n\ntype SaveChipStatus =\n | \"unsaved\"\n | \"saving\"\n | \"saved\"\n | \"pending\"\n | \"warning\"\n | \"publication-failed\"\n | \"failed\"\n | \"conflict\"\n | \"loading\";\n\nconst OPERATOR_SUGGESTIONS = [\n \"Make the announcement bar mention free returns\",\n \"Add a trust message below the buy button\",\n \"Make this section more compact\",\n];\n\nfunction mutationLabel(mutation: Mutation): string {\n const target = elementNameFromSelector(mutation.selector);\n switch (mutation.action) {\n case \"text\":\n case \"setText\":\n return `${target}: \u201C${(mutation.text ?? \"\").trim().slice(0, 80)}\u201D`;\n case \"html\":\n return `${target}: content replaced`;\n case \"attribute\": {\n const names = [\n ...(mutation.attribute ? [mutation.attribute.name] : []),\n ...Object.keys(mutation.attributes ?? {}),\n ];\n if (names.includes(\"src\")) return `${target}: image swapped`;\n return `${target}: ${names.join(\", \") || \"attribute\"} changed`;\n }\n case \"style\":\n case \"setStyle\":\n return `${target}: style changed`;\n case \"remove\":\n return `${target}: removed`;\n case \"insertBefore\":\n case \"insertAfter\":\n return `${target}: content added`;\n default:\n return `${target}: updated`;\n }\n}\n\nfunction elementNameFromSelector(selector: string): string {\n const last = selector.split(/[\\s>+~]+/).filter(Boolean).pop() ?? selector;\n return last.slice(0, 60) || \"Element\";\n}\n\nfunction saveChipStatus(state: EditorState): SaveChipStatus {\n if (state.saveState === \"saving\") return \"saving\";\n if (state.saveState === \"saved\") return \"saved\";\n if (state.saveState === \"pending\") return \"pending\";\n if (state.saveState === \"warning\") return \"warning\";\n if (state.saveState === \"publication_failed\") return \"publication-failed\";\n if (state.saveState === \"conflict\") return \"conflict\";\n if (state.saveState === \"error\") return \"failed\";\n if (!state.variation) return \"loading\";\n return \"unsaved\";\n}\n\nfunction saveChipHtml(state: EditorState): string {\n const status = saveChipStatus(state);\n const label =\n status === \"unsaved\" ? \"Unsaved changes\"\n : status === \"saving\" ? \"Saving\u2026\"\n : status === \"saved\" ? \"Saved\"\n : status === \"pending\" ? \"Saved \u2014 publication pending\"\n : status === \"warning\" ? \"Saved \u2014 publication warning\"\n : status === \"publication-failed\" ? \"Saved \u2014 publication failed\"\n : status === \"failed\" ? \"Save failed\"\n : status === \"conflict\" ? \"Conflict\"\n : \"Loading draft\u2026\";\n const iconHtml =\n status === \"saving\" || status === \"loading\" ? icon(\"refresh\", 12, 'class=\"spin\"')\n : status === \"saved\" ? icon(\"check\", 12)\n : status === \"pending\" || status === \"warning\" ? icon(\"alert\", 12)\n : status === \"unsaved\" ? icon(\"dot\", 12)\n : icon(\"alert\", 12);\n const retry = status === \"failed\" || status === \"publication-failed\"\n ? `<button type=\"button\" class=\"retry\" data-action=\"retry-save\">Retry</button>`\n : \"\";\n const chipClass = status === \"loading\" ? \"saving\" : status;\n return `<span class=\"save-chip ${chipClass}\" role=\"status\" aria-live=\"polite\">${iconHtml}${label}${retry}</span>`;\n}\n\nfunction changeListFromState(state: EditorState): ChangeEntry[] {\n const items: ChangeEntry[] = state.artifacts.mutations.map((mutation, mutationIndex) => ({\n kind: \"mutation\" as const,\n selector: mutation.selector,\n mutationIndex,\n label: mutationLabel(mutation),\n target: mutation.selector,\n origin: \"operator\" as const,\n risky: false,\n }));\n if (state.artifacts.customCss.trim()) {\n items.push({\n kind: \"css\",\n selector: null,\n mutationIndex: null,\n label: \"Custom CSS\",\n target: `${state.artifacts.customCss.trim().split(\"\\n\").length} lines`,\n origin: \"code\",\n risky: false,\n });\n }\n if (state.artifacts.customJs.trim()) {\n items.push({\n kind: \"js\",\n selector: null,\n mutationIndex: null,\n label: \"Custom JavaScript\",\n target: \"runs when the variation loads\",\n origin: \"code\",\n risky: state.reloadRequired,\n });\n }\n return items;\n}\n\nfunction describeRunChanges(\n before: EditorArtifacts,\n after: EditorArtifacts,\n): Array<{ label: string; target: string }> {\n const beforeKeys = new Set(\n before.mutations.map((mutation) => JSON.stringify(mutation)),\n );\n const results = after.mutations\n .filter((mutation) => !beforeKeys.has(JSON.stringify(mutation)))\n .map((mutation) => ({\n label: mutationLabel(mutation),\n target: mutation.selector,\n }));\n if (after.customCss.trim() !== before.customCss.trim()) {\n results.push({ label: \"Custom CSS updated\", target: \"variation stylesheet\" });\n }\n if (after.customJs.trim() !== before.customJs.trim()) {\n results.push({ label: \"Custom JavaScript updated\", target: \"variation script\" });\n }\n return results;\n}\n\nfunction formatMinutes(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = Math.max(0, Math.floor(seconds % 60));\n return `${m}:${String(s).padStart(2, \"0\")}`;\n}\n\nexport type EditorView = { destroy(): void };\n\nexport function mountEditorView(\n shadow: ShadowRoot,\n controller: EditorController,\n): EditorView {\n const style = document.createElement(\"style\");\n style.textContent = KIT_CSS + VIEW_CSS;\n const chrome = document.createElement(\"div\");\n const zone = document.createElement(\"div\");\n zone.className = \"zone\";\n const box = document.createElement(\"div\");\n box.className = \"picker-box\";\n box.hidden = true;\n const label = document.createElement(\"div\");\n label.className = \"picker-label\";\n label.hidden = true;\n const device = document.createElement(\"div\");\n device.className = \"device\";\n device.hidden = true;\n const boot = document.createElement(\"div\");\n boot.className = \"boot\";\n shadow.append(style, zone, chrome, box, label, device, boot);\n\n const session = controller.session;\n const targetHost = (() => {\n try {\n return new URL(session.targetUrl).host;\n } catch {\n return session.targetOrigin.replace(/^https?:\\/\\//, \"\");\n }\n })();\n const targetPath = (() => {\n try {\n const url = new URL(session.targetUrl);\n return url.pathname + url.search;\n } catch {\n return null;\n }\n })();\n const experimentTitle = session.experimentName?.trim() || \"On-site editor\";\n const dashboardVariationUrl = (variationId: string) =>\n `${controller.apiOrigin}/tests/${encodeURIComponent(session.experimentId)}/variations/${encodeURIComponent(variationId)}`;\n const sessionSecondsLeft = () =>\n Math.max(0, Math.floor((Date.parse(session.expiresAt) - Date.now()) / 1000));\n\n // \u2500\u2500 view-local state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let latestState = controller.getState();\n let panelTab: PanelTab = \"operator\";\n let codeLang: \"css\" | \"js\" = \"css\";\n let collapsed = false;\n let sheetOpen = false;\n let narrow = false;\n let varMenuOpen = false;\n let viewMode: \"variation\" | \"original\" = \"variation\";\n let ctxSelector: string | null = latestState.selectedSelector;\n let ctxLabel: string | null = latestState.selectedElement\n ? elementLabel(latestState.selectedElement)\n : latestState.selectedSelector;\n let devicePick: \"desktop\" | \"tablet\" | \"mobile\" = \"desktop\";\n let conn: \"connected\" | \"offline\" = navigator.onLine === false ? \"offline\" : \"connected\";\n let banner: \"unsupported\" | \"spanav\" | null = null;\n let spaDismissed = false;\n let modal: \"stop\" | \"expired\" | null = null;\n let artifactOpen = false;\n let operatorDraft = \"\";\n let operatorBusy = false;\n let operatorRunPromise: Promise<void> | null = null;\n let variationSwitch = 0;\n let lastSavedAt: number | null = null;\n let sessionWarn = sessionSecondsLeft() <= SESSION_WARN_SECONDS;\n let bootDone = false;\n let messageId = 0;\n const thread: ThreadMessage[] = [];\n const operatorConversation: EditorOperatorMessage[] = [];\n\n const media = typeof window.matchMedia === \"function\"\n ? window.matchMedia(\"(max-width: 759px)\")\n : null;\n narrow = media?.matches ?? false;\n\n const devicePreview = new DevicePreview(\n createDeviceFrame(),\n (deviceState) => {\n controller.setDeviceState(deviceState);\n },\n );\n controller.attachDevicePreview(devicePreview);\n\n function createDeviceFrame(): HTMLIFrameElement {\n device.innerHTML = `<div class=\"device-shell\">\n <div class=\"device-head\"><span class=\"d-title\">Device preview</span><button type=\"button\" class=\"iconbtn\" data-action=\"device-close\" aria-label=\"Close device preview\">${icon(\"x\", 13)}</button></div>\n <iframe class=\"device-frame\" name=\"${EDITOR_DEVICE_FRAME_NAME}\" title=\"Store device preview\"></iframe>\n <div class=\"device-fallback\" hidden>The store blocks device framing. Open this draft on a mobile device or use your browser's device mode.<div class=\"row\"><button type=\"button\" class=\"btn ghost sm\" data-action=\"device-copy\">Copy current URL</button></div></div>\n </div>`;\n return device.querySelector(\"iframe\")!;\n }\n\n const frame = device.querySelector(\"iframe\")!;\n const fallback = device.querySelector<HTMLElement>(\".device-fallback\")!;\n\n const picker = new ElementPicker(\n { box, label },\n (element, selector) => {\n controller.selectElement(element, selector);\n picker.setSelected(element);\n ctxSelector = selector;\n ctxLabel = elementLabel(element);\n panelTab = \"operator\";\n if (narrow) sheetOpen = true;\n render();\n },\n (active) => {\n controller.setPickerActive(active);\n render();\n },\n () => {\n banner = \"unsupported\";\n render();\n },\n );\n\n // \u2500\u2500 html builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const draftPill = (compact: boolean) =>\n `<span class=\"draft-pill\">${icon(\"eye\", 11)}${compact ? \"Draft\" : \"Draft \u2014 not visible to shoppers\"}</span>`;\n\n const connChip = () =>\n conn === \"offline\"\n ? `<span class=\"conn-chip offline\" role=\"status\"><span class=\"dot err\"><i></i><b></b></span>Offline \u2014 reconnecting\u2026</span>`\n : \"\";\n\n const sessionNoteHtml = () => {\n const left = sessionSecondsLeft();\n if (left <= SESSION_WARN_SECONDS) {\n return `<span class=\"session-chip\" title=\"Editing session time remaining\">${icon(\"clock\", 12)}<span data-session-text>Session ends in ${formatMinutes(left)}</span><button type=\"button\" class=\"extend\" data-action=\"extend-session\">Extend</button></span>`;\n }\n return `<span class=\"session-note\" title=\"Editing session time remaining\" data-session-text>Session \u00B7 ${Math.floor(left / 60)} min left</span>`;\n };\n\n const variationSwitcherHtml = (compact: boolean) => {\n const current = latestState.variation;\n const currentName = current?.name || \"Variation\";\n const initial = (currentName.trim()[0] || \"V\").toUpperCase();\n const menu = varMenuOpen\n ? `<div class=\"var-menu ee-in\" role=\"listbox\" aria-label=\"Eligible variations\">\n <div class=\"note\">Switching keeps your saved draft \u2014 nothing is lost.</div>\n ${session.variations.map((variation) => {\n const on = variation.id === current?.id;\n const name = variation.name || variation.slug || \"Variation\";\n const vInitial = (name.trim()[0] || \"V\").toUpperCase();\n return `<button type=\"button\" class=\"var-item\" role=\"option\" aria-selected=\"${on}\" data-action=\"variation-pick\" data-variation=\"${esc(variation.id)}\">\n <span class=\"vid\" aria-hidden=\"true\">${esc(vInitial)}</span>\n <span class=\"meta\"><span class=\"n\">${esc(name)}</span><span class=\"s\">${on ? `${changeListFromState(latestState).length} change${changeListFromState(latestState).length === 1 ? \"\" : \"s\"} in draft` : \"Draft\"}</span></span>\n ${on ? icon(\"check\", 13) : \"\"}\n </button>`;\n }).join(\"\")}\n </div>`\n : \"\";\n return `<div class=\"var-wrap\">\n <button type=\"button\" class=\"var-btn\" data-action=\"variation-open\" aria-haspopup=\"listbox\" aria-expanded=\"${varMenuOpen}\" aria-label=\"Variation: ${esc(currentName)}. Switch variation\">\n <span class=\"vid\" aria-hidden=\"true\">${esc(initial)}</span>\n ${compact ? \"\" : `<span class=\"vname\">${esc(currentName)}</span>`}\n ${icon(\"chevD\", 12)}\n </button>\n ${menu}\n </div>`;\n };\n\n const compareSegHtml = () => {\n const variationName = latestState.variation?.name || \"Variation\";\n return `<div class=\"seg\" role=\"radiogroup\" aria-label=\"Compare original and variation\">\n <button type=\"button\" role=\"radio\" aria-checked=\"${viewMode === \"original\"}\" data-action=\"compare\" data-view=\"original\">Original</button>\n <button type=\"button\" role=\"radio\" aria-checked=\"${viewMode === \"variation\"}\" data-action=\"compare\" data-view=\"variation\">${esc(variationName)}</button>\n </div>`;\n };\n\n const deviceSegHtml = () => `<div class=\"seg\" role=\"radiogroup\" aria-label=\"Preview viewport\">\n <button type=\"button\" class=\"sm\" role=\"radio\" aria-checked=\"${devicePick === \"desktop\"}\" data-action=\"device\" data-device=\"desktop\" title=\"Desktop preview\" aria-label=\"Desktop preview\">${icon(\"monitor\", 13)}</button>\n <button type=\"button\" class=\"sm\" role=\"radio\" aria-checked=\"${devicePick === \"tablet\"}\" data-action=\"device\" data-device=\"tablet\" title=\"Tablet preview \u2014 768px\" aria-label=\"Tablet preview, 768 pixels\">${icon(\"tablet\", 13)}</button>\n <button type=\"button\" class=\"sm\" role=\"radio\" aria-checked=\"${devicePick === \"mobile\"}\" data-action=\"device\" data-device=\"mobile\" title=\"Mobile preview \u2014 390px\" aria-label=\"Mobile preview, 390 pixels\">${icon(\"phone\", 13)}</button>\n </div>`;\n\n const undoRedoHtml = () => `<div class=\"undo-redo\">\n <button type=\"button\" class=\"iconbtn\" data-action=\"undo\" aria-label=\"Undo\" title=\"Undo\" ${latestState.canUndo ? \"\" : \"disabled\"}>${icon(\"undo\", 15)}</button>\n <button type=\"button\" class=\"iconbtn\" data-action=\"redo\" aria-label=\"Redo\" title=\"Redo\" ${latestState.canRedo ? \"\" : \"disabled\"}>${icon(\"redo\", 15)}</button>\n </div>`;\n\n const tabsHtml = () => {\n const count = changeListFromState(latestState).length;\n const tab = (id: PanelTab, labelText: string, iconHtml: string, badge?: number) =>\n `<button type=\"button\" class=\"tab\" role=\"tab\" aria-selected=\"${panelTab === id}\" data-action=\"tab\" data-tab=\"${id}\">${iconHtml}${labelText}${badge ? `<span class=\"count\">${badge}</span>` : \"\"}</button>`;\n return `<div class=\"tabs\" role=\"tablist\" aria-label=\"Editor panels\">\n ${tab(\"operator\", \"Operator\", operatorMark(12, panelTab === \"operator\" ? \"#fff\" : \"rgba(255,255,255,0.55)\"))}\n ${tab(\"code\", \"Code\", icon(\"braces\", 13))}\n ${tab(\"changes\", \"Changes\", icon(\"history\", 13), count)}\n </div>`;\n };\n\n const ctxChipHtml = (inThread: boolean, labelText: string) =>\n `<span class=\"ctx-chip\">${icon(\"cursorBox\", 12)}<span class=\"name\">${esc(labelText)}</span>${inThread ? \"\" : `<button type=\"button\" class=\"replace\" data-action=\"ctx-replace\" aria-label=\"Replace selected element\">Replace</button><button type=\"button\" class=\"clear\" data-action=\"ctx-clear\" aria-label=\"Clear selected element\">${icon(\"x\", 11)}</button>`}</span>`;\n\n const operatorPanelHtml = () => {\n const pickerActive = latestState.pickerActive;\n const ctxBar = ctxSelector && ctxLabel\n ? `<span class=\"lbl\">Talking about</span>${ctxChipHtml(false, ctxLabel)}`\n : `<button type=\"button\" class=\"btn sm ${pickerActive ? \"primary\" : \"soft\"}\" data-action=\"inspect-toggle\">${icon(\"pointer\", 13)}${pickerActive ? \"Click something on the page\u2026\" : \"Point at an element\"}</button><span class=\"opt\">optional \u2014 you can also just describe the change</span>`;\n\n const empty = thread.length === 0;\n const emptyHtml = `<div class=\"op-empty\">\n <div class=\"mark\" aria-hidden=\"true\">${operatorMark(20)}</div>\n <div class=\"t\">What should change on this page?</div>\n <p>Point at an element or just describe it. Operator makes the change on the draft \u2014 you see it on the real page immediately.</p>\n <div class=\"sugs\">${OPERATOR_SUGGESTIONS.map((suggestion) => `<button type=\"button\" class=\"sug\" data-action=\"suggestion\">${esc(suggestion)}</button>`).join(\"\")}</div>\n </div>`;\n\n const messages = thread.map((message) => {\n if (message.role === \"user\") {\n return `<div class=\"msg-user\">${message.ctxLabel ? `<span class=\"ref\">${icon(\"cursorBox\", 10)} ${esc(message.ctxLabel)}</span>` : \"\"}<div class=\"bubble\">${esc(message.text)}</div></div>`;\n }\n if (message.phase === \"working\") {\n return `<div class=\"op-card working ee-in\">\n <div class=\"head\">${operatorMark(13)}<span>Operator</span>${message.abort ? `<button type=\"button\" class=\"btn sm bare\" style=\"margin-left:auto;padding:2px 6px\" data-action=\"op-stop\" data-msg=\"${message.id}\">${icon(\"stop\", 12)}Stop</button>` : \"\"}</div>\n <div class=\"steps\" role=\"status\" aria-live=\"polite\">${message.steps.map((step, index) => {\n const state = index < message.step ? \"done\" : index === message.step ? \"cur\" : \"todo\";\n const mark = state === \"done\" ? icon(\"check\", 12) : state === \"cur\" ? icon(\"refresh\", 12, 'class=\"spin\"') : `<span class=\"idle\">\u00B7</span>`;\n return `<div class=\"step ${state}\">${mark}${esc(step)}</div>`;\n }).join(\"\")}</div>\n </div>`;\n }\n if (message.phase === \"failed\") {\n return `<div class=\"op-card failed ee-in\" role=\"alert\">\n <div class=\"head\">${icon(\"alert\", 13)} Operator couldn't finish</div>\n <p>${esc(message.error ?? \"Something went wrong.\")} Nothing was changed on the draft.</p>\n <div class=\"row\"><button type=\"button\" class=\"btn sm soft\" data-action=\"op-retry\" data-msg=\"${message.id}\">${icon(\"refresh\", 12)}Try again</button></div>\n </div>`;\n }\n if (message.phase === \"save-failed\") {\n return `<div class=\"op-card failed ee-in\" role=\"alert\">\n <div class=\"head\">${icon(\"alert\", 13)} Change applied, but not saved</div>\n <p>${esc(message.error ?? \"The draft could not be saved.\")} The proposed change remains on this page so you can review it and retry saving.</p>\n <div class=\"row\"><button type=\"button\" class=\"btn sm soft\" data-action=\"retry-save\" data-msg=\"${message.id}\">${icon(\"refresh\", 12)}Retry save</button><button type=\"button\" class=\"btn sm bare\" data-action=\"op-all-changes\">${icon(\"history\", 12)}Review changes</button></div>\n </div>`;\n }\n if (message.phase === \"publication-failed\") {\n return `<div class=\"op-card failed ee-in\" role=\"alert\">\n <div class=\"head\">${icon(\"alert\", 13)} Change saved, but publication failed</div>\n <p>${esc(message.error ?? \"Storefront publication failed.\")} The change is saved in Apex. Keep the editor open and retry publication.</p>\n <div class=\"row\"><button type=\"button\" class=\"btn sm soft\" data-action=\"retry-save\" data-msg=\"${message.id}\">${icon(\"refresh\", 12)}Retry publication</button><button type=\"button\" class=\"btn sm bare\" data-action=\"op-all-changes\">${icon(\"history\", 12)}Review changes</button></div>\n </div>`;\n }\n const count = message.results.length;\n const canUndo = canUndoRun(message);\n return `<div class=\"op-card done ee-in\">\n <div class=\"head\">${icon(\"check\", 13)} ${count === 1 ? \"Made 1 change\" : `Made ${count} changes`} \u2014 it's on the page now</div>\n <div class=\"items\">${message.results.map((result) => `<div class=\"item\">${operatorMark(11)}<span class=\"b\">${esc(result.label)}<span class=\"sel\">${esc(result.target)}</span></span></div>`).join(\"\")}</div>\n <div class=\"row\">\n <button type=\"button\" class=\"btn sm ghost\" data-action=\"op-undo-run\" data-msg=\"${message.id}\" ${canUndo ? \"\" : \"disabled\"}>${icon(\"undo\", 12)}${message.undone ? \"Undone\" : \"Undo this\"}</button>\n <button type=\"button\" class=\"btn sm bare\" data-action=\"op-all-changes\">${icon(\"history\", 12)}All changes</button>\n </div>\n <div class=\"hint\">Not right? Just tell Operator what to adjust.</div>\n </div>`;\n }).join(\"\");\n\n const placeholder = ctxLabel\n ? `What should change about the ${ctxLabel.toLowerCase()}?`\n : \"Describe a change\u2026\";\n\n return `<div class=\"panel\" role=\"tabpanel\" aria-label=\"Operator\">\n <div class=\"op-ctx\">${ctxBar}</div>\n <div class=\"op-thread\" data-op-thread>${empty ? emptyHtml : messages}</div>\n <form class=\"op-input\" data-operator-form>\n <div class=\"line\">\n <textarea class=\"field\" data-field=\"operator-prompt\" rows=\"2\" maxlength=\"30000\" placeholder=\"${esc(placeholder)}\" aria-label=\"Describe the change for Operator\" ${operatorBusy ? \"disabled\" : \"\"}>${esc(operatorDraft)}</textarea>\n <button type=\"submit\" class=\"send\" aria-label=\"Send to Operator\" title=\"Send to Operator\" ${operatorBusy || !latestState.variation ? \"disabled\" : \"\"}>${icon(\"send\", 15)}</button>\n </div>\n <div class=\"note\">Operator edits this draft only \u2014 shoppers never see it.</div>\n </form>\n </div>`;\n };\n\n const codePanelHtml = () => {\n const cssBody = `<div class=\"code-body\">\n <label><span class=\"flabel\">CSS on this variation</span>\n <textarea class=\"field code\" data-field=\"css\" rows=\"9\" spellcheck=\"false\" aria-label=\"Custom CSS for this variation\">${esc(latestState.artifacts.customCss)}</textarea>\n <span class=\"fhint\">Scoped to the experiment page. Applies live as you type.</span>\n </label>\n <div class=\"code-ok\">${icon(\"check\", 12)} CSS changes are fully undoable.</div>\n </div>`;\n const jsBody = `<div class=\"code-body\">\n <label><span class=\"flabel\">JavaScript on this variation</span>\n <textarea class=\"field code\" data-field=\"js\" rows=\"9\" spellcheck=\"false\" aria-label=\"Custom JavaScript for this variation\">${esc(latestState.artifacts.customJs)}</textarea>\n </label>\n <div class=\"js-warn\" role=\"note\">${icon(\"alert\", 14)}<span>JavaScript changes the live page directly and <strong>can't be undone by the editor</strong>. Undo removes it from the draft; close and relaunch the editor to fully reset the page.</span></div>\n <div style=\"display:flex;gap:8px\">\n <button type=\"button\" class=\"btn soft\" data-action=\"run-js\">${icon(\"play\", 13)}Run on page</button>\n </div>\n ${latestState.reloadRequired ? `<div class=\"code-ok\" style=\"color:var(--warning)\">${icon(\"alert\", 12, 'style=\"color:var(--warning)\"')} JavaScript ran on this page. Relaunch the editor to fully reset it.</div>` : \"\"}\n </div>`;\n return `<div class=\"code-panel\" role=\"tabpanel\" aria-label=\"Code\">\n <div class=\"code-head\">\n <div class=\"seg\" role=\"radiogroup\" aria-label=\"Code language\">\n <button type=\"button\" role=\"radio\" aria-checked=\"${codeLang === \"css\"}\" data-action=\"code-lang\" data-lang=\"css\">${icon(\"braces\", 13)}CSS</button>\n <button type=\"button\" role=\"radio\" aria-checked=\"${codeLang === \"js\"}\" data-action=\"code-lang\" data-lang=\"js\">${icon(\"code\", 13)}JavaScript</button>\n </div>\n <span class=\"peer\">works without Operator</span>\n </div>\n ${codeLang === \"css\" ? cssBody : jsBody}\n <div class=\"code-foot\">Code and Operator write to the same draft. Operator's changes appear as artifact operations you can inspect under <button type=\"button\" data-action=\"view-artifact\">Changes \u2192 View artifact</button>. Full code authoring also lives in the variation workspace in Apex.</div>\n </div>`;\n };\n\n const changesPanelHtml = () => {\n const items = changeListFromState(latestState);\n const rows = items.map((item, index) => `<div class=\"chg-row\">\n <span class=\"org\" title=\"${item.origin === \"operator\" ? \"Made by Operator\" : \"Custom code\"}\">${item.origin === \"operator\" ? operatorMark(13) : icon(item.kind === \"css\" ? \"braces\" : \"code\", 13)}</span>\n <div class=\"meta\">\n <div class=\"l\">${esc(item.label)}</div>\n <div class=\"s\">${esc(item.target)} \u00B7 ${item.origin === \"operator\" ? \"Operator\" : \"code\"}${item.risky ? \" \u00B7 relaunch the editor to fully revert\" : \"\"}</div>\n </div>\n <button type=\"button\" class=\"iconbtn xs\" data-action=\"chg-remove\" data-kind=\"${item.kind}\" data-index=\"${item.mutationIndex ?? index}\" aria-label=\"Remove change: ${esc(item.label)}\">${icon(\"x\", 11)}</button>\n </div>`).join(\"\");\n const artifactJson = JSON.stringify(\n {\n variation: latestState.variation?.name ?? null,\n artifactHash: latestState.variation?.artifactHash ?? null,\n operations: latestState.artifacts.mutations,\n customCss: latestState.artifacts.customCss || null,\n customJs: latestState.artifacts.customJs || null,\n },\n null,\n 2,\n );\n return `<div class=\"chg-panel\" role=\"tabpanel\" aria-label=\"Changes\">\n <div class=\"chg-head\"><span class=\"t\">${items.length} change${items.length === 1 ? \"\" : \"s\"} in this draft</span>${saveChipHtml(latestState)}</div>\n ${items.length === 0\n ? `<p class=\"chg-empty\">No changes yet. Ask Operator, or add CSS or JavaScript in Code.</p>`\n : `<div class=\"chg-list\">${rows}</div>`}\n <div class=\"chg-art\">\n <button type=\"button\" class=\"toggle\" data-action=\"artifact-toggle\" aria-expanded=\"${artifactOpen}\">${icon(artifactOpen ? \"chevD\" : \"chevR\", 12)}View artifact (JSON)</button>\n ${artifactOpen ? `<div class=\"json ee-in\" aria-label=\"Variation artifact JSON\">${esc(artifactJson)}</div>` : \"\"}\n <div class=\"note\">Drafts save automatically. Nothing is shown to shoppers until the experiment is launched from Apex.</div>\n <div class=\"pill-row\">${draftPill(false)}</div>\n </div>\n </div>`;\n };\n\n const panelBodyHtml = () =>\n panelTab === \"operator\" ? operatorPanelHtml()\n : panelTab === \"code\" ? codePanelHtml()\n : changesPanelHtml();\n\n const dockHtml = () => {\n if (collapsed) {\n return `<div class=\"rail-dock\">\n ${operatorMark(16)}\n <button type=\"button\" class=\"iconbtn\" data-action=\"expand\" aria-label=\"Expand editor panel\">${icon(\"collapse\", 15)}</button>\n <div class=\"sep\"></div>\n <button type=\"button\" class=\"iconbtn ${latestState.pickerActive ? \"active\" : \"\"}\" data-action=\"rail-inspect\" aria-label=\"Point at an element\">${icon(\"pointer\", 15)}</button>\n <div class=\"grow\"></div>\n <span title=\"Connection: ${conn}\"><span class=\"dot ${conn === \"connected\" ? \"ok\" : \"err\"}\"><i></i>${conn === \"connected\" ? \"\" : \"<b></b>\"}</span></span>\n </div>`;\n }\n return `<div class=\"dock\">\n <div class=\"id-head\">\n <div class=\"id-row\">\n ${operatorMark(18)}\n <div class=\"id-meta\">\n <div class=\"id-title\" title=\"${esc(experimentTitle)}\">${esc(experimentTitle)}</div>\n <div class=\"id-sub\">On your store \u00B7 ${esc(targetHost)}</div>\n </div>\n <button type=\"button\" class=\"iconbtn\" data-action=\"collapse\" aria-label=\"Collapse editor panel\">${icon(\"collapse\", 15)}</button>\n </div>\n <div class=\"id-chips\">\n ${variationSwitcherHtml(false)}\n ${draftPill(true)}\n <span class=\"grow\"></span>\n ${saveChipHtml(latestState)}\n </div>\n ${conn !== \"connected\" ? `<div class=\"id-conn\">${connChip()}</div>` : \"\"}\n </div>\n <div class=\"view-row\">\n ${undoRedoHtml()}\n ${compareSegHtml()}\n <span class=\"grow\"></span>\n ${deviceSegHtml()}\n </div>\n ${tabsHtml()}\n ${panelBodyHtml()}\n <div class=\"foot\">\n ${sessionNoteHtml()}\n <span class=\"grow\"></span>\n <button type=\"button\" class=\"btn primary\" data-action=\"done\">${icon(\"check\", 13)}Done</button>\n </div>\n </div>`;\n };\n\n const sheetHtml = () => {\n const barRow = `<div class=\"bar\">\n ${operatorMark(14)}\n ${variationSwitcherHtml(true)}\n ${draftPill(true)}\n <span class=\"grow\"></span>\n ${saveChipHtml(latestState)}\n </div>`;\n if (!sheetOpen) {\n return `<div class=\"sheet\">\n <button type=\"button\" class=\"handle\" data-action=\"sheet-toggle\" aria-label=\"Expand editor\" aria-expanded=\"false\"><i></i></button>\n ${barRow}\n </div>`;\n }\n return `<div class=\"sheet\">\n <button type=\"button\" class=\"handle\" data-action=\"sheet-toggle\" aria-label=\"Collapse editor\" aria-expanded=\"true\"><i></i></button>\n ${barRow}\n <div class=\"row2\">\n ${undoRedoHtml()}\n ${compareSegHtml()}\n ${sessionNoteHtml()}\n <span class=\"grow\"></span>\n <button type=\"button\" class=\"btn primary sm\" data-action=\"done\">${icon(\"check\", 12)}Done</button>\n </div>\n ${tabsHtml()}\n ${panelBodyHtml()}\n </div>`;\n };\n\n const zoneHtml = () => {\n const selectMode = latestState.pickerActive;\n const banners: string[] = [];\n if (banner === \"unsupported\") {\n banners.push(`<div class=\"banner warn ee-in\" role=\"status\">${icon(\"alert\", 14)}<span class=\"body\">That element can't be edited here. Point at an element on the storefront page instead.</span><button type=\"button\" class=\"btn sm ghost\" data-action=\"banner-dismiss\">OK</button></div>`);\n }\n if (banner === \"spanav\") {\n banners.push(`<div class=\"banner info ee-in\" role=\"status\">${icon(\"globe\", 14)}<span class=\"body\">You navigated to ${esc(location.pathname + location.search)}. This variation targets ${esc(targetPath || \"\")}, so changes are paused until you return.</span><button type=\"button\" class=\"btn sm soft\" data-action=\"spa-back\">Back to target page</button><button type=\"button\" class=\"btn sm ghost\" data-action=\"banner-dismiss\">Stay</button></div>`);\n }\n if (conn === \"offline\") {\n banners.push(`<div class=\"banner error ee-in\" role=\"status\">${icon(\"wifiOff\", 14)}<span class=\"body\">Connection lost. Your edits are kept locally and will save when you're back online.</span></div>`);\n }\n return `${selectMode ? `<div class=\"page-border\" aria-hidden=\"true\"></div><div class=\"select-banner ee-in\">${icon(\"pointer\", 13)}Click an element to talk about it<button type=\"button\" data-action=\"back-to-browsing\">Back to browsing \u00B7 Esc</button></div>` : \"\"}\n ${banners.length ? `<div class=\"banners ${selectMode ? \"lower\" : \"\"}\">${banners.join(\"\")}</div>` : \"\"}\n ${viewMode === \"original\" ? `<div class=\"orig-chip ee-in\">${icon(\"eye\", 13)}Viewing the original \u2014 draft changes hidden<button type=\"button\" data-action=\"show-variation\">Show ${esc(latestState.variation?.name || \"variation\")}</button></div>` : \"\"}`;\n };\n\n const modalHtml = () => {\n if (latestState.saveState === \"conflict\") {\n return `<div class=\"modal-backdrop\"><div class=\"modal ee-in\" role=\"dialog\" aria-modal=\"true\" aria-label=\"This draft changed somewhere else\">\n <div class=\"m-head\"><span class=\"m-icon warn\">${icon(\"alert\", 15)}</span><div class=\"m-title\">This draft changed somewhere else</div></div>\n <div class=\"m-body\">\n <p>Someone saved a newer version of <strong style=\"color:var(--text1)\">${esc(latestState.variation?.name || \"this variation\")}</strong> while you were editing \u2014 likely from the Apex dashboard.</p>\n <p>Loading the newer version discards your unsaved edits here. Keeping yours overwrites theirs.</p>\n </div>\n <div class=\"m-actions\"><button type=\"button\" class=\"btn ghost\" data-action=\"conflict-mine\">Keep my version</button><button type=\"button\" class=\"btn primary\" data-action=\"conflict-theirs\">Load newer version</button></div>\n </div></div>`;\n }\n if (modal === \"expired\") {\n const savedAgo = lastSavedAt\n ? `${Math.max(1, Math.round((Date.now() - lastSavedAt) / 1000))} seconds ago`\n : null;\n return `<div class=\"modal-backdrop\"><div class=\"modal ee-in\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Editing session ended\" style=\"width:410px\">\n <div class=\"m-head\"><span class=\"m-icon purple\">${icon(\"clock\", 15)}</span><div class=\"m-title\">Editing session ended</div></div>\n <div class=\"m-body\">\n <p>Sessions are time-limited for security. ${savedAgo ? `Your draft was saved <strong style=\"color:var(--text1)\">${savedAgo}</strong> \u2014 nothing was lost.` : \"Your saved draft is safe in Apex.\"}</p>\n <p>Start a new session from the variation in Apex.</p>\n </div>\n <div class=\"m-actions\"><button type=\"button\" class=\"btn ghost\" data-action=\"expired-close\">Close editor</button><button type=\"button\" class=\"btn primary\" data-action=\"expired-apex\">${icon(\"external\", 13)}Open variation in Apex</button></div>\n </div></div>`;\n }\n if (modal === \"stop\") {\n const items = changeListFromState(latestState);\n return `<div class=\"modal-backdrop\"><div class=\"modal ee-in\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Done editing?\">\n <div class=\"m-head\"><span class=\"m-icon ok\">${icon(\"check\", 15)}</span><div class=\"m-title\">Done editing?</div></div>\n <div class=\"m-body\">\n <p>${items.length} change${items.length === 1 ? \"\" : \"s\"} saved to the ${esc(latestState.variation?.name || \"variation\")} draft. The editor will be removed from the page and the session closed.</p>\n ${items.length ? `<div style=\"margin-top:12px;display:grid;gap:5px\">${items.slice(0, 4).map((item) => `<div style=\"font-size:12px;color:var(--text3);display:flex;gap:7px;align-items:center\">${icon(\"check\", 11, 'style=\"color:var(--positive)\"')} ${esc(item.label)}</div>`).join(\"\")}</div>` : \"\"}\n <p style=\"font-size:12px;color:var(--text3)\">Launching the experiment still happens from Apex \u2014 closing here never starts traffic.</p>\n </div>\n <div class=\"m-actions\"><button type=\"button\" class=\"btn ghost\" data-action=\"modal-keep\">Keep editing</button><button type=\"button\" class=\"btn primary\" data-action=\"modal-save-close\">${icon(\"check\", 13)}Save and close</button></div>\n </div></div>`;\n }\n return \"\";\n };\n\n const bootHtml = () => {\n const step = latestState.variation ? 3 : 2;\n const error = !latestState.variation && latestState.saveState === \"error\";\n const ttlMinutes = Math.max(1, Math.round((Date.parse(session.expiresAt) - Date.now()) / 60000));\n const steps = [\n \"Starting a secure editing session\",\n `Connecting to ${targetHost}`,\n `Loading the ${latestState.variation?.name || \"variation\"} draft`,\n ];\n return `<div class=\"box\">\n <div class=\"kicker\">${operatorMark(22)} Apex</div>\n <div class=\"sub\">On-site editor \u00B7 ${esc(experimentTitle)}</div>\n <div class=\"steps\" role=\"status\" aria-live=\"polite\">${steps.map((stepLabel, index) => {\n const state = index < step ? \"done\" : index === step ? \"cur\" : \"todo\";\n const mark = state === \"done\" ? icon(\"check\", 14, 'style=\"color:var(--positive)\"')\n : state === \"cur\" ? icon(\"refresh\", 14, 'class=\"spin\" style=\"color:var(--purple300)\"')\n : `<span class=\"idle\">\u00B7</span>`;\n return `<div class=\"step ${state}\">${mark}${esc(stepLabel)}</div>`;\n }).join(\"\")}</div>\n <div class=\"bar\"><i style=\"width:${Math.min(100, (step / 3) * 100 + 12)}%\"></i></div>\n ${error ? `<div class=\"err\">${esc(latestState.saveMessage || \"The draft could not be loaded.\")}<div style=\"margin-top:10px\"><button type=\"button\" class=\"btn soft sm\" data-action=\"boot-retry\">Try again</button></div></div>` : \"\"}\n <div class=\"scope\">Session is scoped to this experiment and store, and expires after ${ttlMinutes} minutes. Drafts only \u2014 shoppers never see your edits.</div>\n </div>`;\n };\n\n // \u2500\u2500 render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const render = () => {\n latestState = controller.getState();\n if (!bootDone && latestState.variation) bootDone = true;\n boot.hidden = bootDone;\n if (!bootDone) boot.innerHTML = bootHtml();\n\n const active = shadow.activeElement as HTMLInputElement | HTMLTextAreaElement | null;\n const activeField = active?.dataset?.field;\n const selection = active && \"selectionStart\" in active\n ? [active.selectionStart, active.selectionEnd] as const\n : null;\n\n zone.className = `zone${narrow ? \" narrow\" : collapsed ? \" rail\" : \"\"}`;\n zone.innerHTML = bootDone ? zoneHtml() : \"\";\n device.className = `device${narrow ? \" narrow\" : \"\"}`;\n chrome.innerHTML = bootDone\n ? `${narrow ? sheetHtml() : dockHtml()}${modalHtml()}`\n : \"\";\n (shadow.host as HTMLElement).dataset.apexEditorSheetState = narrow\n ? (sheetOpen ? \"expanded\" : \"collapsed\")\n : \"desktop\";\n\n device.hidden = latestState.deviceState === \"closed\";\n frame.hidden = latestState.deviceState === \"blocked\";\n fallback.hidden = latestState.deviceState !== \"blocked\";\n const deviceTitle = device.querySelector<HTMLElement>(\".d-title\");\n if (deviceTitle) {\n deviceTitle.textContent = devicePick === \"tablet\"\n ? \"Tablet preview \u00B7 768 \u00D7 1024\"\n : \"Mobile preview \u00B7 390 \u00D7 844\";\n }\n\n if (activeField) {\n const next = chrome.querySelector<HTMLInputElement | HTMLTextAreaElement>(`[data-field=\"${activeField}\"]`);\n next?.focus();\n if (next && selection && \"setSelectionRange\" in next) {\n next.setSelectionRange(selection[0], selection[1]);\n }\n }\n scrollThread();\n };\n\n const scrollThread = () => {\n const threadElement = chrome.querySelector<HTMLElement>(\"[data-op-thread]\");\n if (threadElement) threadElement.scrollTop = threadElement.scrollHeight;\n };\n\n const unsubscribe = controller.subscribe(() => render());\n\n const artifactsEqual = (left: EditorArtifacts, right: EditorArtifacts) =>\n JSON.stringify(left) === JSON.stringify(right);\n\n function canUndoRun(message: ThreadOperatorMessage): boolean {\n if (message.phase !== \"done\" || message.undone || !message.postArtifacts) return false;\n const latestApplicable = [...thread].reverse().find(\n (entry): entry is ThreadOperatorMessage => entry.role === \"op\" && entry.phase === \"done\" && !entry.undone,\n );\n return latestApplicable?.id === message.id &&\n artifactsEqual(controller.getState().artifacts, message.postArtifacts);\n }\n\n // \u2500\u2500 operator run \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const startOperatorRun = (prompt: string, runCtxSelector: string | null, runCtxLabel: string | null) => {\n if (!latestState.variation || operatorBusy) return;\n const preArtifacts = cloneArtifacts(controller.getState().artifacts);\n const referencedElement = runCtxSelector\n ? {\n selector: runCtxSelector,\n tag: latestState.selectedSelector === runCtxSelector\n ? latestState.selectedElement?.tagName.toLowerCase()\n : undefined,\n textPreview: latestState.selectedSelector === runCtxSelector\n ? (latestState.selectedElement?.textContent ?? \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200) || undefined\n : undefined,\n }\n : null;\n const abort = new AbortController();\n const userMessage: ThreadUserMessage = {\n id: ++messageId,\n role: \"user\",\n text: prompt,\n ctxLabel: runCtxLabel,\n };\n const opMessage: ThreadOperatorMessage = {\n id: ++messageId,\n role: \"op\",\n phase: \"working\",\n step: 0,\n steps: [\n runCtxLabel ? `Inspecting the ${runCtxLabel.toLowerCase()}` : \"Reading the page\",\n \"Asking Operator to draft the change\",\n \"Applying the change to the draft\",\n ],\n prompt,\n ctxSelector: runCtxSelector,\n ctxLabel: runCtxLabel,\n preArtifacts,\n postArtifacts: null,\n results: [],\n error: null,\n undone: false,\n abort,\n };\n thread.push(userMessage, opMessage);\n operatorConversation.push({ role: \"user\", content: prompt });\n operatorBusy = true;\n if (referencedElement) {\n ctxSelector = null;\n ctxLabel = null;\n picker.setSelected(null);\n controller.clearSelectedElement();\n }\n render();\n\n const stepTimer = setTimeout(() => {\n if (opMessage.phase === \"working\") {\n opMessage.step = 1;\n render();\n }\n }, 600);\n\n const pageContext = [\n `Live merchant page: ${redactEditorContextUrl(session.targetUrl)}`,\n runCtxSelector\n ? `The user selected this element as the request context: selector \"${runCtxSelector}\"${runCtxLabel ? ` (${runCtxLabel})` : \"\"}. Ground the change on it.`\n : \"\",\n ].filter(Boolean).join(\"\\n\");\n\n const runPromise = runEditorOperatorTurn({\n apiOrigin: controller.apiOrigin,\n session,\n variationId: latestState.variation.id,\n prompt,\n artifacts: preArtifacts,\n conversation: operatorConversation.slice(0, -1).slice(-12),\n pageContext,\n signal: abort.signal,\n selectedElement: referencedElement,\n }).then(async (result) => {\n clearTimeout(stepTimer);\n if (opMessage.phase !== \"working\" || abort.signal.aborted) return;\n opMessage.step = 2;\n render();\n if (abort.signal.aborted) return;\n const audit = controller.applyCommandArtifacts(result.artifacts);\n opMessage.postArtifacts = cloneArtifacts(controller.getState().artifacts);\n if (abort.signal.aborted) {\n controller.restoreArtifacts(preArtifacts);\n await controller.saveNow();\n return;\n }\n operatorConversation.push({ role: \"assistant\", content: result.explanation });\n opMessage.abort = null;\n await controller.saveNow();\n const saveState = controller.getState().saveState;\n if (\n saveState === \"error\" ||\n saveState === \"conflict\" ||\n saveState === \"publication_failed\"\n ) {\n opMessage.phase =\n saveState === \"publication_failed\"\n ? \"publication-failed\"\n : \"save-failed\";\n opMessage.abort = null;\n opMessage.results = describeRunChanges(preArtifacts, controller.getState().artifacts);\n opMessage.error = controller.getState().saveMessage;\n return;\n }\n opMessage.phase = \"done\";\n opMessage.abort = null;\n opMessage.postArtifacts = cloneArtifacts(controller.getState().artifacts);\n opMessage.results = describeRunChanges(preArtifacts, controller.getState().artifacts);\n if (!opMessage.results.length) {\n opMessage.results = [{ label: result.explanation, target: \"no page changes\" }];\n }\n if (!audit.ok) {\n opMessage.results.push({\n label: \"One selector needs review \u2014 check the result on the page.\",\n target: audit.repairHint ?? \"selector audit\",\n });\n }\n }).catch((error: unknown) => {\n clearTimeout(stepTimer);\n if (abort.signal.aborted) return;\n opMessage.phase = opMessage.postArtifacts ? \"save-failed\" : \"failed\";\n opMessage.abort = null;\n opMessage.error = error instanceof Error ? error.message : \"Operator could not build the draft.\";\n if (opMessage.postArtifacts) {\n opMessage.results = describeRunChanges(preArtifacts, controller.getState().artifacts);\n }\n }).finally(() => {\n if (abort.signal.aborted) {\n const userIndex = thread.indexOf(userMessage);\n if (userIndex >= 0) thread.splice(userIndex, 2);\n operatorConversation.pop();\n }\n if (operatorRunPromise === runPromise) operatorRunPromise = null;\n operatorBusy = false;\n render();\n });\n operatorRunPromise = runPromise;\n };\n\n const switchVariation = async (variationId: string) => {\n const request = ++variationSwitch;\n for (const message of thread) {\n if (message.role === \"op\" && message.phase === \"working\") message.abort?.abort();\n }\n await operatorRunPromise;\n if (request !== variationSwitch) return;\n await controller.saveNow();\n if (request !== variationSwitch) return;\n const saveState = controller.getState().saveState;\n if (saveState === \"error\" || saveState === \"conflict\") {\n render();\n return;\n }\n ctxSelector = null;\n ctxLabel = null;\n picker.setSelected(null);\n controller.clearSelection();\n thread.length = 0;\n operatorConversation.length = 0;\n viewMode = \"variation\";\n controller.toggleArtifacts(true);\n await controller.selectVariation(variationId);\n render();\n };\n\n const retrySave = async (message: ThreadOperatorMessage | null) => {\n const stillMatchesRun = Boolean(\n message?.postArtifacts && artifactsEqual(controller.getState().artifacts, message.postArtifacts),\n );\n await controller.saveNow();\n const saveState = controller.getState().saveState;\n if (\n (message?.phase === \"save-failed\" ||\n message?.phase === \"publication-failed\") &&\n saveState !== \"error\" &&\n saveState !== \"conflict\" &&\n saveState !== \"publication_failed\"\n ) {\n message.phase = \"done\";\n message.error = null;\n message.postArtifacts = stillMatchesRun\n ? cloneArtifacts(controller.getState().artifacts)\n : null;\n }\n render();\n };\n\n // \u2500\u2500 event wiring \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const findMessage = (target: HTMLElement): ThreadOperatorMessage | null => {\n const id = Number(target.dataset.msg);\n const message = thread.find((entry) => entry.id === id);\n return message && message.role === \"op\" ? message : null;\n };\n\n const setDevice = (pick: \"desktop\" | \"tablet\" | \"mobile\") => {\n devicePick = pick;\n if (pick === \"desktop\") {\n controller.closeDevicePreview();\n render();\n return;\n }\n const size: DevicePreviewSize = pick === \"tablet\"\n ? { width: 768, height: 1024 }\n : { width: 390, height: 844 };\n frame.style.width = `${size.width}px`;\n frame.style.height = `${size.height}px`;\n controller.openDevicePreview();\n render();\n };\n\n const onChromeClick = (event: Event) => {\n const target = (event.target as Element).closest<HTMLElement>(\"[data-action]\");\n if (!target) {\n if (varMenuOpen) {\n varMenuOpen = false;\n render();\n }\n return;\n }\n const action = target.dataset.action;\n switch (action) {\n case \"collapse\": collapsed = true; render(); break;\n case \"expand\": collapsed = false; render(); break;\n case \"rail-inspect\": collapsed = false; picker.setActive(true); break;\n case \"sheet-toggle\": sheetOpen = !sheetOpen; render(); break;\n case \"variation-open\": varMenuOpen = !varMenuOpen; render(); break;\n case \"variation-pick\": {\n varMenuOpen = false;\n const variationId = target.dataset.variation;\n if (variationId && variationId !== latestState.variation?.id) {\n void switchVariation(variationId);\n }\n render();\n break;\n }\n case \"tab\": panelTab = (target.dataset.tab as PanelTab) ?? \"operator\"; render(); break;\n case \"compare\": {\n const nextView = target.dataset.view === \"original\" ? \"original\" : \"variation\";\n if (nextView !== viewMode) {\n viewMode = nextView;\n controller.toggleArtifacts(nextView === \"variation\");\n }\n render();\n break;\n }\n case \"show-variation\": viewMode = \"variation\"; controller.toggleArtifacts(true); render(); break;\n case \"device\": setDevice((target.dataset.device as \"desktop\" | \"tablet\" | \"mobile\") ?? \"desktop\"); break;\n case \"undo\": controller.undo(); break;\n case \"redo\": controller.redo(); break;\n case \"inspect-toggle\": picker.setActive(!latestState.pickerActive); break;\n case \"back-to-browsing\": picker.setActive(false); break;\n case \"ctx-replace\": picker.setActive(true); break;\n case \"ctx-clear\":\n ctxSelector = null;\n ctxLabel = null;\n picker.setSelected(null);\n controller.clearSelection();\n render();\n break;\n case \"suggestion\": operatorDraft = target.textContent?.trim() ?? \"\"; render(); break;\n case \"op-stop\": findMessage(target)?.abort?.abort(); break;\n case \"op-retry\": {\n const message = findMessage(target);\n if (message) startOperatorRun(message.prompt, message.ctxSelector, message.ctxLabel);\n break;\n }\n case \"op-undo-run\": {\n const message = findMessage(target);\n if (message && canUndoRun(message)) {\n controller.restoreArtifacts(message.preArtifacts);\n message.undone = true;\n render();\n }\n break;\n }\n case \"op-all-changes\": panelTab = \"changes\"; render(); break;\n case \"code-lang\": codeLang = target.dataset.lang === \"js\" ? \"js\" : \"css\"; render(); break;\n case \"run-js\": controller.applyCustomJs(); break;\n case \"view-artifact\": panelTab = \"changes\"; artifactOpen = true; render(); break;\n case \"artifact-toggle\": artifactOpen = !artifactOpen; render(); break;\n case \"chg-remove\": {\n const kind = target.dataset.kind;\n if (kind === \"mutation\") controller.removeMutation(Number(target.dataset.index));\n else if (kind === \"css\") controller.setCustomCss(\"\");\n else if (kind === \"js\") controller.setCustomJs(\"\");\n break;\n }\n case \"retry-save\": void retrySave(findMessage(target)); break;\n case \"extend-session\": void extendSession(); break;\n case \"banner-dismiss\":\n if (banner === \"spanav\") spaDismissed = true;\n banner = null;\n render();\n break;\n case \"spa-back\":\n banner = null;\n spaDismissed = false;\n location.assign(session.targetUrl);\n break;\n case \"done\": modal = \"stop\"; render(); break;\n case \"modal-keep\": modal = null; render(); break;\n case \"modal-save-close\":\n void controller.saveNow().then(() => {\n const saveState = controller.getState().saveState;\n if (\n saveState !== \"error\" &&\n saveState !== \"conflict\" &&\n saveState !== \"publication_failed\"\n ) {\n return controller.exit();\n }\n render();\n }).catch(() => render());\n break;\n case \"conflict-mine\": void controller.resolveConflict(\"mine\"); break;\n case \"conflict-theirs\": void controller.resolveConflict(\"theirs\"); break;\n case \"expired-close\": void controller.exit(); break;\n case \"expired-apex\":\n window.open(dashboardVariationUrl(latestState.variation?.id ?? session.initialVariationId), \"_blank\", \"noopener\");\n break;\n case \"boot-retry\": void controller.selectVariation(session.initialVariationId); break;\n default: break;\n }\n };\n\n chrome.addEventListener(\"click\", onChromeClick);\n zone.addEventListener(\"click\", onChromeClick);\n boot.addEventListener(\"click\", onChromeClick);\n\n chrome.addEventListener(\"input\", (event) => {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n if (target.dataset.field === \"css\") controller.setCustomCss(target.value);\n else if (target.dataset.field === \"js\") controller.setCustomJs(target.value);\n else if (target.dataset.field === \"operator-prompt\") operatorDraft = target.value;\n });\n\n chrome.addEventListener(\"submit\", (event) => {\n const form = (event.target as Element).closest<HTMLFormElement>(\"[data-operator-form]\");\n if (!form) return;\n event.preventDefault();\n const prompt = operatorDraft.trim();\n if (!prompt) return;\n operatorDraft = \"\";\n startOperatorRun(prompt, ctxSelector, ctxLabel);\n });\n\n device.addEventListener(\"click\", (event) => {\n const action = (event.target as Element).closest<HTMLElement>(\"[data-action]\")?.dataset.action;\n if (action === \"device-close\") setDevice(\"desktop\");\n if (action === \"device-copy\") void navigator.clipboard?.writeText(location.href);\n });\n\n const onKeyDown = (event: KeyboardEvent) => {\n const target = event.composedPath()[0];\n const typing =\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n (target instanceof HTMLElement && target.isContentEditable);\n if (event.key === \"Escape\") {\n if (modal === \"stop\") {\n modal = null;\n render();\n return;\n }\n if (latestState.deviceState !== \"closed\") {\n event.preventDefault();\n setDevice(\"desktop\");\n return;\n }\n return;\n }\n if (typing) return;\n if (event.key === \"s\" || event.key === \"S\") {\n picker.setActive(!latestState.pickerActive);\n return;\n }\n if ((event.metaKey || event.ctrlKey) && (event.key === \"z\" || event.key === \"Z\")) {\n event.preventDefault();\n if (event.shiftKey) controller.redo();\n else controller.undo();\n }\n };\n window.addEventListener(\"keydown\", onKeyDown, true);\n\n // \u2500\u2500 session & environment tickers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const extendSession = async () => {\n try {\n const expiresAt = await controller.extendSession();\n if (expiresAt) {\n sessionWarn = sessionSecondsLeft() <= SESSION_WARN_SECONDS;\n render();\n }\n } catch {\n // The footer keeps counting down; expiry handling still applies.\n }\n };\n\n const previousSaveState = { value: latestState.saveState };\n const saveWatch = controller.subscribe((state) => {\n if (state.saveState === \"saved\" && previousSaveState.value !== \"saved\") {\n lastSavedAt = Date.now();\n }\n previousSaveState.value = state.saveState;\n });\n\n const ticker = setInterval(() => {\n const left = sessionSecondsLeft();\n if (left <= 0 && modal !== \"expired\") {\n modal = \"expired\";\n picker.setActive(false);\n render();\n return;\n }\n const warn = left <= SESSION_WARN_SECONDS;\n if (warn !== sessionWarn) {\n sessionWarn = warn;\n render();\n return;\n }\n const node = chrome.querySelector<HTMLElement>(\"[data-session-text]\");\n if (node) {\n node.textContent = warn\n ? `Session ends in ${formatMinutes(left)}`\n : `Session \u00B7 ${Math.floor(left / 60)} min left`;\n }\n if (targetPath && bootDone) {\n const offTarget = location.pathname + location.search !== targetPath;\n if (offTarget && banner !== \"spanav\" && !spaDismissed && banner === null) {\n banner = \"spanav\";\n render();\n } else if (!offTarget && (banner === \"spanav\" || spaDismissed)) {\n if (banner === \"spanav\") banner = null;\n spaDismissed = false;\n render();\n }\n }\n }, 1000);\n\n const onOnline = () => {\n conn = \"connected\";\n render();\n void controller.saveNow();\n };\n const onOffline = () => {\n conn = \"offline\";\n render();\n };\n window.addEventListener(\"online\", onOnline);\n window.addEventListener(\"offline\", onOffline);\n\n const onMediaChange = () => {\n narrow = media?.matches ?? false;\n render();\n };\n media?.addEventListener?.(\"change\", onMediaChange);\n\n render();\n\n return {\n destroy() {\n for (const message of thread) {\n if (message.role === \"op\" && message.phase === \"working\") {\n message.abort?.abort();\n }\n }\n unsubscribe();\n saveWatch();\n clearInterval(ticker);\n picker.destroy();\n devicePreview.close(false);\n window.removeEventListener(\"keydown\", onKeyDown, true);\n window.removeEventListener(\"online\", onOnline);\n window.removeEventListener(\"offline\", onOffline);\n media?.removeEventListener?.(\"change\", onMediaChange);\n style.remove();\n chrome.remove();\n zone.remove();\n box.remove();\n label.remove();\n device.remove();\n boot.remove();\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["index_exports", "__export", "__test", "getActiveEditorSession", "start", "record", "value", "parseVariationSaveOutcome", "payload", "publication", "EditorApiError", "message", "status", "payload", "parseVariationSaveOutcome", "record", "value", "parseArtifacts", "input", "EDITOR_COMMANDS", "EditorApi", "apiOrigin", "session", "fetchImpl", "args", "path", "variationId", "url", "init", "response", "variation", "artifacts", "expectedPriorHash", "parsedOutcome", "hasPublicationOutcomeFields", "legacyArtifactHash", "outcome", "limit", "commandUrl", "commands", "command", "commandId", "commandName", "completion", "UNSTABLE_ID", "UNSTABLE_CLASS", "escapeCss", "value", "character", "quotedAttribute", "name", "isUnique", "selector", "root", "stableId", "element", "id", "stableAttribute", "names", "attribute", "stableClasses", "segment", "tag", "candidate", "classes", "parent", "sameTag", "child", "generateDeterministicSelector", "ownerDocument", "direct", "parts", "current", "part", "elementLabel", "className", "rect", "POLL_INTERVAL_MS", "MAX_LOGS", "REDACTED", "SENSITIVE_KEY", "EMAIL", "JWT", "AUTH_VALUE", "LONG_NUMBER", "MUTATION_ACTIONS", "record", "value", "string", "isLoopbackOrigin", "origin", "hostname", "sanitizedUrl", "base", "url", "sanitizeDiagnosticText", "match", "separator", "cloneSafe", "depth", "key", "elementSummary", "item", "output", "entryKey", "entry", "visibleText", "element", "rect", "box", "generateDeterministicSelector", "sanitizeNetworkEntry", "findTarget", "args", "selector", "query", "lower", "candidates", "aria", "parseMutation", "input", "action", "mutation", "attribute", "attributes", "styles", "parseArtifacts", "mutations", "auditResult", "audit", "EditorCommandExecutor", "controller", "navigation", "originals", "level", "original", "list", "command", "filter", "artifacts", "rawUrl", "summarize", "limit", "target", "timeout", "startedAt", "resolve", "startIndex", "waitMs", "entries", "operation", "elements", "EditorCommandPoller", "api", "executor", "commands", "execution", "error", "EditorApiError", "URL_ATTRIBUTES", "SAFE_DATA_URL_MEDIA_TYPES", "isSafeMutationAttribute", "name", "value", "normalizedName", "normalizedValue", "mediaType", "sanitizeHtml", "html", "doc", "script", "el", "attr", "observers", "muteDepth", "registerMutedObserver", "observer", "callback", "unregisterMutedObserver", "runMuted", "fn", "pending", "hosts", "rootObservers", "listeners", "initialized", "registerSubtree", "root", "candidates", "element", "host", "observeRoot", "rootObserver", "records", "record", "node", "listener", "pruneHosts", "initializeShadowDomSupport", "hostsInDocumentOrder", "a", "b", "position", "queryAllDeep", "selector", "documentMatches", "matches", "el", "IN_PLACE_REVERT_WINDOW_MS", "captureAppliedNodes", "entry", "style", "name", "normalizeCssPropertyName", "variantContentSurvives", "needsDeepCheck", "node", "matchesOriginalInnerHtmlSnapshot", "pending", "deepChecks", "roots", "frame", "perf", "target", "matches", "entry", "record", "action", "style", "name", "value", "expected", "markPending", "pending", "deepChecks", "schedule", "frame", "now", "at", "metrics", "variantContentSurvives", "captureAppliedNodes", "runMuted", "canResurrectViaShadow", "treated", "observe", "element", "roots", "treatedRoot", "unregisterMutedObserver", "entries", "onRecords", "records", "observer", "registerMutedObserver", "removeEntry", "entries", "index", "entry", "pending", "deepChecks", "replayReassertSentinelEntry", "journalSeq", "element", "currentElement", "root", "roots", "index", "entry", "captureAppliedNodes", "removeEntry", "unregisterMutedObserver", "observe", "extractCurrencyTokens", "text", "tokens", "amount", "symbol", "pattern", "match", "consumedPrefix", "raw", "marker", "displayedAmount", "ISO_4217_CURRENCY_CODE_SET", "parsed", "parseDisplayedCents", "ISO_4217_CURRENCY_CODES", "ISO_4217_PRECISION_CODE_SET", "ZERO_DECIMAL_CURRENCIES", "THREE_DECIMAL_CURRENCIES", "parseDisplayedCents", "text", "minorUnits", "pattern", "match", "raw", "compact", "separator", "trailing", "separatorCharacter", "repeatedSeparator", "hasOtherSeparator", "groupedWhole", "decimals", "visibleDecimal", "group", "decimal", "majorText", "fraction", "scale", "INSERT_ATTR", "journalSequence", "applicationContextSequence", "mutationJournal", "priceRejectedMutations", "sanitizeMutationHtml", "html", "sanitizeHtml", "normalizeCssPropertyName", "name", "out", "m", "getMutationKey", "mutation", "index", "isInsertAction", "action", "elementReference", "element", "WeakRefClass", "mutationAttributeNames", "names", "canonicalAttributeName", "namespace", "isContentMutation", "mutationStyleNames", "captureElementBaseline", "journal", "baseline", "attributeNames", "styleNames", "capturedStyleAliasNow", "originalStyle", "originalStyleElement", "originalStyleAttribute", "restoreScopeForEntry", "scope", "entry", "restoreElementBaseline", "style", "valueAndPriority", "value", "priority", "artifactIdentity", "ownerKeys", "artifactId", "appendJournalEntry", "targetIndex", "kind", "epoch", "insertKey", "nodes", "applyToElement", "isSafeMutationAttribute", "isInsertDuplicate", "key", "parent", "candidate", "markInserted", "el", "collectInsertedNodes", "previousSibling", "nextSibling", "current", "boundary", "insertedElements", "node", "adoptedInsertNodes", "applyTrackedMutationWithJournal", "runMuted", "elements", "inserted", "rejectTrackedMutation", "entry", "element", "innerHTML", "runMuted", "priceRejectedMutations", "mutationJournal", "candidate", "doomed", "rollbackJournalEntries", "matchesOriginalInnerHtmlSnapshot", "current", "sanitizeMutationHtml", "applyPriceGuardedMutation", "mutation", "journal", "key", "options", "index", "targetIndex", "guardedPrices", "extractCurrencyTokens", "guardedSnapshot", "result", "applyTrackedMutationWithJournal", "remaining", "token", "applyMutationsWithJournal", "mutations", "root", "elements", "queryAllDeep", "getMutationKey", "isInsertAction", "isInsertDuplicate", "appendJournalEntry", "adoptedInsertNodes", "priceBearingContent", "resolveJournalTarget", "journal", "entry", "current", "replacement", "queryAllDeep", "captureElementBaseline", "elementReference", "replayInsertEntry", "element", "key", "isInsertDuplicate", "adoptedInsertNodes", "nodes", "collectInsertedNodes", "insertedElements", "inserted", "markInserted", "replayTouchedTargets", "touched", "restoreScopes", "scope", "baseline", "restoreElementBaseline", "applyToElement", "replayReassertSentinelEntry", "addRestoreScope", "scopes", "restoreScopeForEntry", "pruneElementBaseline", "remaining", "isContentMutation", "attributeNames", "mutationAttributeNames", "name", "canonicalAttributeName", "styleNames", "mutationStyleNames", "rollbackJournalEntries", "doomed", "options", "supersededByFrameworkNode", "index", "runMuted", "node", "candidate", "resetJournal", "createMutationApplicationContext", "journal", "applicationContextSequence", "mutations", "options", "applyMutationsWithJournal", "resetJournal", "EMPTY_EDITOR_ARTIFACTS", "cloneArtifacts", "artifacts", "mutation", "sameMutationSlot", "left", "right", "textActions", "styleActions", "upsertMutation", "artifacts", "mutation", "item", "mutations", "index", "previous", "previousAttributes", "nextAttributes", "removeSelectorMutations", "selector", "removeMutationAt", "_", "mutationIndex", "ArtifactHistory", "current", "cloneArtifacts", "next", "EDITOR_CSS_ID", "AUTOSAVE_MS", "EXIT_REVOKE_TIMEOUT_MS", "NON_LIVE_EDITOR_STATUSES", "EditorController", "session", "apiOrigin", "api", "EditorApi", "reload", "confirmLiveSave", "message", "cloneArtifacts", "EMPTY_EDITOR_ARTIFACTS", "ArtifactHistory", "listener", "variationId", "request", "loaded", "error", "active", "element", "selector", "removeSelectorMutations", "index", "removeMutationAt", "artifacts", "expiresAt", "choice", "variation", "enabled", "dock", "value", "name", "code", "previous", "next", "devicePreview", "deviceState", "cleanup", "beforeCounts", "mutation", "mutationAudit", "beforeCount", "afterCount", "effectVerified", "generatedSelectors", "generatedVisibility", "elements", "matches", "match", "failed", "entry", "visibleGeneratedCount", "total", "networkRequired", "variationRequest", "queued", "saveVariationRequest", "expectedHash", "snapshot", "saveRevision", "result", "changedDuringSave", "EditorApiError", "input", "upsertMutation", "applyVisual", "style", "createMutationApplicationContext", "patch", "rect", "sanitizedHtml", "sanitizeHtml", "expected", "attributes", "requestedAttributes", "safeAttributes", "isSafeMutationAttribute", "letter", "promise", "timeoutMs", "timer", "resolve", "EDITOR_DEVICE_FRAME_NAME", "FRAME_TIMEOUT_MS", "DEVICE_STYLE_ID", "DevicePreview", "frame", "onState", "artifacts", "url", "enabled", "doc", "notify", "item", "frameUrl", "createMutationApplicationContext", "style", "editorHost", "element", "visibility", "editorElement", "element", "editorEvent", "event", "item", "selectableElement", "ElementPicker", "overlay", "onSelect", "onActiveChange", "onUnsupported", "target", "generateDeterministicSelector", "next", "active", "rect", "elementLabel", "labelTop", "MAX_CONTEXT_CHARS", "MAX_CONVERSATION_MESSAGES", "CONTEXT_SELECTORS", "compactWhitespace", "value", "redactEditorContextUrl", "baseUrl", "url", "safeAttributeEntries", "element", "name", "lower", "serializeElement", "tag", "attributes", "text", "collectEditorDomContext", "documentLike", "lines", "seen", "parseMutation", "mutation", "appendCode", "current", "generated", "mergeEditorOperatorArtifacts", "input", "customCss", "customJs", "artifacts", "upsertMutation", "errorMessage", "payload", "status", "error", "runEditorOperatorTurn", "response", "mergeStrategy", "artifactCount", "ICONS", "icon", "name", "size", "extra", "operatorMarkId", "operatorMark", "color", "id", "esc", "value", "KIT_CSS", "DOCK_WIDTH", "RAIL_WIDTH", "SESSION_WARN_SECONDS", "VIEW_CSS", "OPERATOR_SUGGESTIONS", "mutationLabel", "mutation", "target", "elementNameFromSelector", "names", "selector", "saveChipStatus", "state", "saveChipHtml", "status", "label", "iconHtml", "icon", "changeListFromState", "items", "mutationIndex", "describeRunChanges", "before", "after", "beforeKeys", "results", "formatMinutes", "seconds", "m", "s", "mountEditorView", "shadow", "controller", "style", "KIT_CSS", "chrome", "zone", "box", "device", "boot", "session", "targetHost", "targetPath", "url", "experimentTitle", "dashboardVariationUrl", "variationId", "sessionSecondsLeft", "latestState", "panelTab", "codeLang", "collapsed", "sheetOpen", "narrow", "varMenuOpen", "viewMode", "ctxSelector", "ctxLabel", "elementLabel", "devicePick", "conn", "banner", "spaDismissed", "modal", "artifactOpen", "operatorDraft", "operatorBusy", "operatorRunPromise", "variationSwitch", "lastSavedAt", "sessionWarn", "bootDone", "messageId", "thread", "operatorConversation", "media", "devicePreview", "DevicePreview", "createDeviceFrame", "deviceState", "EDITOR_DEVICE_FRAME_NAME", "frame", "fallback", "picker", "ElementPicker", "element", "render", "active", "draftPill", "compact", "connChip", "sessionNoteHtml", "left", "variationSwitcherHtml", "current", "currentName", "initial", "menu", "variation", "on", "name", "vInitial", "esc", "compareSegHtml", "variationName", "deviceSegHtml", "undoRedoHtml", "tabsHtml", "count", "tab", "id", "labelText", "badge", "operatorMark", "ctxChipHtml", "inThread", "operatorPanelHtml", "pickerActive", "ctxBar", "empty", "emptyHtml", "suggestion", "messages", "message", "step", "index", "mark", "canUndo", "canUndoRun", "result", "placeholder", "codePanelHtml", "cssBody", "jsBody", "changesPanelHtml", "rows", "item", "artifactJson", "panelBodyHtml", "dockHtml", "sheetHtml", "barRow", "zoneHtml", "selectMode", "banners", "modalHtml", "savedAgo", "bootHtml", "error", "ttlMinutes", "steps", "stepLabel", "activeField", "selection", "deviceTitle", "next", "scrollThread", "threadElement", "unsubscribe", "artifactsEqual", "right", "entry", "startOperatorRun", "prompt", "runCtxSelector", "runCtxLabel", "preArtifacts", "cloneArtifacts", "referencedElement", "abort", "userMessage", "opMessage", "stepTimer", "pageContext", "redactEditorContextUrl", "runPromise", "runEditorOperatorTurn", "audit", "saveState", "userIndex", "switchVariation", "request", "retrySave", "stillMatchesRun", "findMessage", "setDevice", "pick", "size", "onChromeClick", "event", "nextView", "kind", "extendSession", "action", "onKeyDown", "typing", "previousSaveState", "saveWatch", "ticker", "warn", "node", "offTarget", "onOnline", "onOffline", "onMediaChange", "EDITOR_HOST_ID", "EXCHANGE_TIMEOUT_MS", "activeSession", "activeController", "activeView", "activeCommandPoller", "cleanupActiveEditor", "readString", "value", "parseSession", "sid", "record", "parsed", "variations", "item", "variation", "id", "mountEditorHost", "controller", "host", "shadow", "mountEditorView", "start", "launch", "timeout", "ownsActiveEditor", "exchangeUrl", "response", "payload", "session", "api", "EditorApi", "EditorController", "EditorCommandPoller", "EditorCommandExecutor", "getActiveEditorSession", "__test"]
7
7
  }