@ianmenethil/zp-observer 6.0.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 (65) hide show
  1. package/LICENSE +21 -0
  2. package/PRIVACY.md +67 -0
  3. package/README.md +284 -0
  4. package/dist/auto-patch.cjs +171 -0
  5. package/dist/auto-patch.cjs.map +7 -0
  6. package/dist/auto-patch.mjs +148 -0
  7. package/dist/auto-patch.mjs.map +7 -0
  8. package/dist/session.cjs +1186 -0
  9. package/dist/session.cjs.map +7 -0
  10. package/dist/session.mjs +1163 -0
  11. package/dist/session.mjs.map +7 -0
  12. package/dist/types/auto-patch.d.ts +9 -0
  13. package/dist/types/auto-patch.d.ts.map +1 -0
  14. package/dist/types/core/beacon.d.ts +6 -0
  15. package/dist/types/core/beacon.d.ts.map +1 -0
  16. package/dist/types/core/detection.d.ts +34 -0
  17. package/dist/types/core/detection.d.ts.map +1 -0
  18. package/dist/types/core/event-bus.d.ts +21 -0
  19. package/dist/types/core/event-bus.d.ts.map +1 -0
  20. package/dist/types/core/experimental.d.ts +35 -0
  21. package/dist/types/core/experimental.d.ts.map +1 -0
  22. package/dist/types/core/heartbeat.d.ts +32 -0
  23. package/dist/types/core/heartbeat.d.ts.map +1 -0
  24. package/dist/types/core/lifecycle.d.ts +31 -0
  25. package/dist/types/core/lifecycle.d.ts.map +1 -0
  26. package/dist/types/core/observer.d.ts +10 -0
  27. package/dist/types/core/observer.d.ts.map +1 -0
  28. package/dist/types/core/outbox.d.ts +20 -0
  29. package/dist/types/core/outbox.d.ts.map +1 -0
  30. package/dist/types/core/random.d.ts +8 -0
  31. package/dist/types/core/random.d.ts.map +1 -0
  32. package/dist/types/core/shortcode.d.ts +17 -0
  33. package/dist/types/core/shortcode.d.ts.map +1 -0
  34. package/dist/types/core/types.d.ts +292 -0
  35. package/dist/types/core/types.d.ts.map +1 -0
  36. package/dist/types/diagnostics/preflight.d.ts +17 -0
  37. package/dist/types/diagnostics/preflight.d.ts.map +1 -0
  38. package/dist/types/index.d.ts +41 -0
  39. package/dist/types/index.d.ts.map +1 -0
  40. package/dist/types/integration/devicefp-bridge.d.ts +31 -0
  41. package/dist/types/integration/devicefp-bridge.d.ts.map +1 -0
  42. package/dist/types/integration/hpp-bridge.d.ts +13 -0
  43. package/dist/types/integration/hpp-bridge.d.ts.map +1 -0
  44. package/dist/types/integration/zenpay-auto-patch.d.ts +28 -0
  45. package/dist/types/integration/zenpay-auto-patch.d.ts.map +1 -0
  46. package/dist/types/outcome.d.ts +20 -0
  47. package/dist/types/outcome.d.ts.map +1 -0
  48. package/dist/types/session.d.ts +54 -0
  49. package/dist/types/session.d.ts.map +1 -0
  50. package/dist/types/transport/callback-transport.d.ts +17 -0
  51. package/dist/types/transport/callback-transport.d.ts.map +1 -0
  52. package/dist/types/transport/http-transport.d.ts +30 -0
  53. package/dist/types/transport/http-transport.d.ts.map +1 -0
  54. package/dist/types/umd.d.ts +16 -0
  55. package/dist/types/umd.d.ts.map +1 -0
  56. package/dist/zp-observer.cjs +1375 -0
  57. package/dist/zp-observer.cjs.map +7 -0
  58. package/dist/zp-observer.js +1377 -0
  59. package/dist/zp-observer.js.map +7 -0
  60. package/dist/zp-observer.min.js +2 -0
  61. package/dist/zp-observer.min.js.map +7 -0
  62. package/dist/zp-observer.min.obf.js +1 -0
  63. package/dist/zp-observer.mjs +1352 -0
  64. package/dist/zp-observer.mjs.map +7 -0
  65. package/package.json +91 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/core/detection.ts", "../src/core/beacon.ts", "../src/core/experimental.ts", "../src/core/heartbeat.ts", "../src/core/lifecycle.ts", "../src/core/shortcode.ts", "../src/core/random.ts", "../src/core/event-bus.ts", "../src/core/outbox.ts", "../src/core/observer.ts", "../src/transport/http-transport.ts", "../src/transport/callback-transport.ts", "../src/integration/zenpay-auto-patch.ts", "../src/integration/hpp-bridge.ts", "../src/integration/devicefp-bridge.ts", "../src/diagnostics/preflight.ts", "../src/outcome.ts", "../src/core/types.ts"],
4
+ "sourcesContent": ["/**\n * @ianmenethil/zp-observer \u2014 public entry (v6)\n *\n * Telemetry bridge for Zenith hosted checkout. Tracks the full payment\n * lifecycle: session init, device fingerprint, HPP detection, modal open,\n * heartbeats, close, and merchant-reported outcomes \u2014 all correlated by\n * a single `correlationId`.\n */\n\nimport { createObserver } from './core/observer.js';\nimport { httpTransport } from './transport/http-transport.js';\nimport { callbackTransport } from './transport/callback-transport.js';\nimport { installZenPayAutoPatch } from './integration/zenpay-auto-patch.js';\nimport { installHPPBridge } from './integration/hpp-bridge.js';\nimport { installDeviceFPBridge } from './integration/devicefp-bridge.js';\nimport { preflight } from './diagnostics/preflight.js';\nimport { reportOutcome } from './outcome.js';\nimport { VERSION } from './core/types.js';\n\nexport {\n\tcreateObserver,\n\thttpTransport,\n\tcallbackTransport,\n\tinstallZenPayAutoPatch,\n\tinstallHPPBridge,\n\tinstallDeviceFPBridge,\n\tpreflight,\n\treportOutcome,\n\tVERSION,\n};\n\nexport type {\n\tCloseEvent,\n\tCloseReason,\n\tCreateObserverOptions,\n\tDiagnosticDump,\n\tDiagnosticEvent,\n\tExperimentalOptions,\n\tHeartbeatEvent,\n\tHppConfigInvalidEvent,\n\tHppIframeLoadedEvent,\n\tHppInitEvent,\n\tObserver,\n\tObserverDiagnostics,\n\tObserverEvent,\n\tObserverState,\n\tOpenEvent,\n\tOutcomeEvent,\n\tPersistenceMode,\n\tPreflightReport,\n\tSessionInitEvent,\n\tTransport,\n\tTransportResult,\n\tTransportState,\n\tUIState,\n} from './core/types.js';\n\nexport type { HttpTransportOptions } from './transport/http-transport.js';\nexport type { CallbackTransportOptions } from './transport/callback-transport.js';\nexport type { AutoPatchHandle, AutoPatchOptions } from './integration/zenpay-auto-patch.js';\nexport type { CreateSessionOptions, ZenPaySession } from './session.js';\nexport type { ReportOutcomeOptions } from './outcome.js';\nexport type { DeviceFPBridgeOptions, DeviceFPHooks } from './integration/devicefp-bridge.js';\n\ndeclare global {\n\tinterface Window {\n\t\tZPObserver?: {\n\t\t\tcreateObserver: typeof createObserver;\n\t\t\thttpTransport: typeof httpTransport;\n\t\t\tcallbackTransport: typeof callbackTransport;\n\t\t\tinstallZenPayAutoPatch: typeof installZenPayAutoPatch;\n\t\t\tinstallHPPBridge: typeof installHPPBridge;\n\t\t\tinstallDeviceFPBridge: typeof installDeviceFPBridge;\n\t\t\tpreflight: typeof preflight;\n\t\t\treportOutcome: typeof reportOutcome;\n\t\t\tVERSION: typeof VERSION;\n\t\t};\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.ZPObserver = {\n\t\tcreateObserver,\n\t\thttpTransport,\n\t\tcallbackTransport,\n\t\tinstallZenPayAutoPatch,\n\t\tinstallHPPBridge,\n\t\tinstallDeviceFPBridge,\n\t\tpreflight,\n\t\treportOutcome,\n\t\tVERSION,\n\t};\n}\n", "/**\n * Iframe detection and removal tracking.\n *\n * The ZenPay hosted checkout injects an iframe into the parent DOM when\n * the user triggers a payment. We need to know:\n * 1. When the iframe appears (\u2192 \"open\" event)\n * 2. When the iframe is removed (\u2192 \"user.modal_closed\")\n *\n * Signals, in order of reliability:\n * - Poll + querySelector (primary; works for every plugin version)\n * - MutationObserver on body (cheap removal detection)\n * - Bootstrap `hidden.bs.modal` (only when plugin uses Bootstrap modals)\n */\n\nexport const DEFAULT_IFRAME_SELECTORS = [\n\t'iframe.zp-payment-frame',\n\t'iframe[src*=\"zenithpayments\"]',\n\t'iframe[src*=\"travelpay\"]',\n\t'.modal-payment iframe',\n\t'div.modal.show iframe',\n] as const;\n\ninterface DetectionHandle {\n\tstop(): void;\n}\n\ninterface DetectionHooks {\n\t/** Called once, when the iframe is first located. */\n\tonFound(iframe: HTMLIFrameElement): void;\n\t/** Called if the iframe is removed from the DOM after detection. */\n\tonRemoved(): void;\n\t/** Called if Bootstrap's `hidden.bs.modal` fires on a containing modal. */\n\tonBootstrapHidden(): void;\n\t/** Called if detection times out without finding an iframe. */\n\tonTimeout(): void;\n}\n\nexport function startDetection(\n\thooks: DetectionHooks,\n\topts: {\n\t\tselectors: readonly string[];\n\t\tintervalMs: number;\n\t\ttimeoutMs: number;\n\t},\n): DetectionHandle {\n\tif (typeof document === 'undefined') {\n\t\treturn { stop() {} };\n\t}\n\n\tlet stopped = false;\n\tlet pollTimer: ReturnType<typeof setInterval> | null = null;\n\tlet mutationObserver: MutationObserver | null = null;\n\tlet bootstrapHandler: ((e: Event) => void) | null = null;\n\tconst startedAt = Date.now();\n\n\tconst findIframe = (): HTMLIFrameElement | null => {\n\t\tfor (const selector of opts.selectors) {\n\t\t\tconst el = document.querySelector(selector);\n\t\t\tif (el instanceof HTMLIFrameElement) return el;\n\t\t}\n\t\treturn null;\n\t};\n\n\tconst stopPolling = () => {\n\t\tif (pollTimer !== null) {\n\t\t\tclearInterval(pollTimer);\n\t\t\tpollTimer = null;\n\t\t}\n\t};\n\n\tconst watchForRemoval = (iframe: HTMLIFrameElement) => {\n\t\tif (typeof MutationObserver === 'undefined' || !document.body) return;\n\n\t\tmutationObserver = new MutationObserver((mutations) => {\n\t\t\tfor (const m of mutations) {\n\t\t\t\tfor (const node of Array.from(m.removedNodes)) {\n\t\t\t\t\tif (node === iframe || (node instanceof Node && node.contains(iframe))) {\n\t\t\t\t\t\thooks.onRemoved();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tmutationObserver.observe(document.body, { childList: true, subtree: true });\n\t};\n\n\tconst watchBootstrapModal = () => {\n\t\t// ZenPay v3 wraps the iframe in a Bootstrap modal and fires\n\t\t// `hidden.bs.modal` on close. jQuery delegates bubble to document.\n\t\tif (typeof document.addEventListener !== 'function') return;\n\n\t\tbootstrapHandler = () => hooks.onBootstrapHidden();\n\n\t\t// Listen on document \u2014 Bootstrap events bubble there via jQuery.\n\t\tdocument.addEventListener('hidden.bs.modal' as 'click', bootstrapHandler, true);\n\t};\n\n\tconst onFound = (iframe: HTMLIFrameElement) => {\n\t\tstopPolling();\n\t\twatchForRemoval(iframe);\n\t\twatchBootstrapModal();\n\t\thooks.onFound(iframe);\n\t};\n\n\t// Immediate check in case the iframe is already present.\n\tconst existing = findIframe();\n\tif (existing) {\n\t\tqueueMicrotask(() => {\n\t\t\tif (!stopped) onFound(existing);\n\t\t});\n\t} else {\n\t\tpollTimer = setInterval(() => {\n\t\t\tif (stopped) return;\n\t\t\tif (Date.now() - startedAt > opts.timeoutMs) {\n\t\t\t\tstopPolling();\n\t\t\t\thooks.onTimeout();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst found = findIframe();\n\t\t\tif (found) onFound(found);\n\t\t}, opts.intervalMs);\n\t}\n\n\treturn {\n\t\tstop() {\n\t\t\tstopped = true;\n\t\t\tstopPolling();\n\t\t\tif (mutationObserver) {\n\t\t\t\tmutationObserver.disconnect();\n\t\t\t\tmutationObserver = null;\n\t\t\t}\n\t\t\tif (bootstrapHandler) {\n\t\t\t\tdocument.removeEventListener(\n\t\t\t\t\t'hidden.bs.modal' as 'click',\n\t\t\t\t\tbootstrapHandler,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tbootstrapHandler = null;\n\t\t\t}\n\t\t},\n\t};\n}\n", "/**\n * Shared sendBeacon helper \u2014 fire-and-forget JSON POST.\n * Returns true if the beacon was queued, false otherwise.\n */\n\nconst JSON_TYPE = 'application/json';\n\nexport function postJsonBeacon(url: string, body: unknown): boolean {\n\tif (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') {\n\t\treturn false;\n\t}\n\ttry {\n\t\tconst blob = new Blob([JSON.stringify(body)], { type: JSON_TYPE });\n\t\treturn navigator.sendBeacon(url, blob);\n\t} catch {\n\t\treturn false;\n\t}\n}\n", "/**\n * Opt-in browser instrumentation for lab / production A-B testing.\n * Each flag installs a narrow listener or one-shot read. Nothing here ends\n * the session \u2014 use onDiagnostic + optional beacon URL to see what fires.\n */\n\nimport type { DiagnosticEvent, ExperimentalOptions } from './types.js';\nimport { postJsonBeacon } from './beacon.js';\n\nexport function hasGlobalExperimentalFeatures(exp?: ExperimentalOptions): boolean {\n\tif (!exp) return false;\n\treturn !!(\n\t\texp.pageLifecycleBeaconUrl ||\n\t\texp.captureWasDiscarded ||\n\t\texp.capturePageShow ||\n\t\texp.captureWindowFocus ||\n\t\texp.captureVisibilityDetail ||\n\t\texp.captureFreezeResume ||\n\t\texp.capturePerformanceEntries\n\t);\n}\n\nexport function hasIframeExperimentalFeatures(exp?: ExperimentalOptions): boolean {\n\tif (!exp) return false;\n\treturn !!(exp.captureIframeResize || exp.captureIframeSrcChanges);\n}\n\nfunction logDiag(debug: boolean, ...args: unknown[]): void {\n\tif (debug && typeof console !== 'undefined') {\n\t\tconsole.log('[ZPObserver/experimental]', ...args);\n\t}\n}\n\nfunction captureUserActivation():\n| { hasBeenActive: boolean; isActive: boolean }\n\t| undefined {\n\ttry {\n\t\tconst ua = typeof navigator !== 'undefined' ? navigator.userActivation : undefined;\n\t\tif (!ua) return undefined;\n\t\treturn {\n\t\t\thasBeenActive: ua.hasBeenActive ?? false,\n\t\t\tisActive: ua.isActive ?? false,\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction readNavigationDetail(): {\n\twasDiscarded: boolean | null;\n\tredirectCount: number | null;\n\ttransferSize: number | null;\n\ttype: string | null;\n} | null {\n\ttry {\n\t\tconst entries = performance.getEntriesByType('navigation');\n\t\tconst nav = entries[0] as PerformanceNavigationTiming | undefined;\n\t\tif (!nav) return null;\n\t\tconst wasDiscarded =\n\t\t\t'wasDiscarded' in nav ? Boolean((nav as PerformanceNavigationTiming & { wasDiscarded?: boolean }).wasDiscarded) : null;\n\t\treturn {\n\t\t\twasDiscarded,\n\t\t\tredirectCount: nav.redirectCount ?? null,\n\t\t\ttransferSize: nav.transferSize ?? null,\n\t\t\ttype: nav.type ?? null,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function readOpenExperimentalFields(\n\texp: ExperimentalOptions | undefined,\n): {\n\tuserActivation?: { hasBeenActive: boolean; isActive: boolean };\n\tnavigationDetail?: {\n\t\twasDiscarded: boolean | null;\n\t\tredirectCount: number | null;\n\t\ttransferSize: number | null;\n\t\ttype: string | null;\n\t};\n} {\n\tif (!exp) return {};\n\tconst out: {\n\t\tuserActivation?: { hasBeenActive: boolean; isActive: boolean };\n\t\tnavigationDetail?: {\n\t\t\twasDiscarded: boolean | null;\n\t\t\tredirectCount: number | null;\n\t\t\ttransferSize: number | null;\n\t\t\ttype: string | null;\n\t\t};\n\t} = {};\n\tif (exp.captureUserActivation) {\n\t\tconst ua = captureUserActivation();\n\t\tif (ua) out.userActivation = ua;\n\t}\n\tif (exp.captureNavigationTimingDetail) {\n\t\tconst nav = readNavigationDetail();\n\t\tif (nav) out.navigationDetail = nav;\n\t}\n\treturn out;\n}\n\ninterface ExperimentalRuntimeContext {\n\tsessionId: string;\n\texperimental: ExperimentalOptions;\n\tonDiagnostic: (e: DiagnosticEvent) => void;\n\tdebug: boolean;\n\tgetNavigationType: () => string | null;\n}\n\nexport function installGlobalExperimental(ctx: ExperimentalRuntimeContext): { stop(): void } {\n\tconst { experimental: exp, onDiagnostic, debug, sessionId, getNavigationType } = ctx;\n\tconst stops: Array<() => void> = [];\n\n\tconst beaconUrl = exp.pageLifecycleBeaconUrl;\n\tconst fireBeacon = (phase: 'navigation' | 'pageshow' | 'pagehide', extra: Record<string, unknown>) => {\n\t\tif (!beaconUrl) return;\n\t\tconst payload = { phase, sessionId, timestamp: Date.now(), ...extra };\n\t\tconst ok = postJsonBeacon(beaconUrl, payload);\n\t\tonDiagnostic({ kind: 'exp.page_lifecycle_beacon', phase, ok, timestamp: Date.now() });\n\t\tlogDiag(debug, 'pageLifecycleBeacon', phase, ok);\n\t};\n\n\tif (beaconUrl) {\n\t\tfireBeacon('navigation', { navType: getNavigationType() });\n\t}\n\n\tif (exp.captureWasDiscarded) {\n\t\tconst nav = readNavigationDetail();\n\t\tconst wasDiscarded = nav?.wasDiscarded ?? null;\n\t\tonDiagnostic({ kind: 'exp.was_discarded', wasDiscarded, timestamp: Date.now() });\n\t\tlogDiag(debug, 'wasDiscarded', wasDiscarded);\n\t}\n\n\tif ((exp.capturePageShow || beaconUrl) && typeof window !== 'undefined') {\n\t\tconst handler = (ev: PageTransitionEvent) => {\n\t\t\tconst persisted = ev.persisted === true;\n\t\t\tif (exp.capturePageShow) {\n\t\t\t\tonDiagnostic({\n\t\t\t\t\tkind: 'exp.pageshow',\n\t\t\t\t\tpersisted,\n\t\t\t\t\tnavigationType: getNavigationType(),\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t\tlogDiag(debug, 'pageshow', { persisted });\n\t\t\t}\n\t\t\tif (beaconUrl) fireBeacon('pageshow', { persisted });\n\t\t};\n\t\twindow.addEventListener('pageshow', handler, { passive: true });\n\t\tstops.push(() => window.removeEventListener('pageshow', handler));\n\t}\n\n\tif (beaconUrl && typeof window !== 'undefined') {\n\t\tconst ph = (ev: PageTransitionEvent) => {\n\t\t\tfireBeacon('pagehide', { persisted: ev.persisted === true });\n\t\t};\n\t\twindow.addEventListener('pagehide', ph, { passive: true });\n\t\tstops.push(() => window.removeEventListener('pagehide', ph));\n\t}\n\n\tif (exp.captureWindowFocus && typeof window !== 'undefined') {\n\t\tconst onF = () => {\n\t\t\tonDiagnostic({ kind: 'exp.window_focus', timestamp: Date.now() });\n\t\t\tlogDiag(debug, 'window focus');\n\t\t};\n\t\tconst onB = () => {\n\t\t\tonDiagnostic({ kind: 'exp.window_blur', timestamp: Date.now() });\n\t\t\tlogDiag(debug, 'window blur');\n\t\t};\n\t\twindow.addEventListener('focus', onF, { passive: true });\n\t\twindow.addEventListener('blur', onB, { passive: true });\n\t\tstops.push(() => {\n\t\t\twindow.removeEventListener('focus', onF);\n\t\t\twindow.removeEventListener('blur', onB);\n\t\t});\n\t}\n\n\tif (exp.captureVisibilityDetail && typeof document !== 'undefined') {\n\t\tlet lastState = document.visibilityState ?? 'visible';\n\t\tlet lastChangeAt = Date.now();\n\t\tconst handler = () => {\n\t\t\tconst now = Date.now();\n\t\t\tconst curr = document.visibilityState ?? 'visible';\n\t\t\tconst prev = lastState;\n\t\t\tlastState = curr;\n\t\t\tconst deltaMs = now - lastChangeAt;\n\t\t\tlastChangeAt = now;\n\t\t\tconst hasFocus =\n\t\t\t\ttypeof document.hasFocus === 'function' ? document.hasFocus() : null;\n\t\t\tconst onLine =\n\t\t\t\ttypeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean'\n\t\t\t\t\t? navigator.onLine\n\t\t\t\t\t: null;\n\t\t\tonDiagnostic({\n\t\t\t\tkind: 'exp.visibility_detail',\n\t\t\t\tprevState: prev,\n\t\t\t\tcurrState: curr,\n\t\t\t\tprevStateDurationMs: deltaMs,\n\t\t\t\thasFocus,\n\t\t\t\tonLine,\n\t\t\t\ttimestamp: now,\n\t\t\t});\n\t\t\tlogDiag(debug, 'visibility_detail', { prev, curr, hasFocus, onLine });\n\t\t};\n\t\tdocument.addEventListener('visibilitychange', handler, { passive: true });\n\t\tstops.push(() => document.removeEventListener('visibilitychange', handler));\n\t}\n\n\tif (exp.captureFreezeResume && typeof document !== 'undefined') {\n\t\tconst onFreeze = () => {\n\t\t\tonDiagnostic({ kind: 'exp.freeze', timestamp: Date.now() });\n\t\t\tlogDiag(debug, 'freeze');\n\t\t};\n\t\tconst onResume = () => {\n\t\t\tonDiagnostic({ kind: 'exp.resume', timestamp: Date.now() });\n\t\t\tlogDiag(debug, 'resume');\n\t\t};\n\t\ttry {\n\t\t\tdocument.addEventListener('freeze', onFreeze, { passive: true });\n\t\t\tdocument.addEventListener('resume', onResume, { passive: true });\n\t\t\tstops.push(() => {\n\t\t\t\tdocument.removeEventListener('freeze', onFreeze);\n\t\t\t\tdocument.removeEventListener('resume', onResume);\n\t\t\t});\n\t\t} catch {\n\t\t\tlogDiag(debug, 'freeze/resume not supported');\n\t\t}\n\t}\n\n\tif (exp.capturePerformanceEntries && typeof PerformanceObserver !== 'undefined') {\n\t\tconst types = exp.perfEntryTypes ?? ['longtask', 'largest-contentful-paint'];\n\t\tconst emitPerf = (entry: PerformanceEntry) => {\n\t\t\tif (entry.entryType === 'longtask') {\n\t\t\t\tonDiagnostic({\n\t\t\t\t\tkind: 'exp.perf_entry',\n\t\t\t\t\tentryType: entry.entryType,\n\t\t\t\t\tname: entry.name,\n\t\t\t\t\tstartTime: entry.startTime,\n\t\t\t\t\tduration: entry.duration,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t} else if (entry.entryType === 'largest-contentful-paint') {\n\t\t\tconst lcp = entry as PerformanceEntry & { size?: number; url?: string };\n\t\t\tonDiagnostic({\n\t\t\t\tkind: 'exp.perf_entry',\n\t\t\t\tentryType: entry.entryType,\n\t\t\t\tname: entry.name,\n\t\t\t\tstartTime: entry.startTime,\n\t\t\t\t...(lcp.size !== undefined && { size: lcp.size }),\n\t\t\t\t...(lcp.url !== undefined && { url: lcp.url }),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t\t} else {\n\t\t\t\tonDiagnostic({\n\t\t\t\t\tkind: 'exp.perf_entry',\n\t\t\t\t\tentryType: entry.entryType,\n\t\t\t\t\tname: entry.name,\n\t\t\t\t\tstartTime: entry.startTime,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\t\t\tlogDiag(debug, 'perf', entry.entryType, entry.name);\n\t\t};\n\t\tfor (const t of types) {\n\t\t\ttry {\n\t\t\t\tconst obs = new PerformanceObserver((list) => {\n\t\t\t\t\tfor (const entry of list.getEntries()) emitPerf(entry);\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tobs.observe({ type: t, buffered: true });\n\t\t\t\t} catch {\n\t\t\t\t\tobs.observe({ entryTypes: [t] });\n\t\t\t\t}\n\t\t\t\tstops.push(() => obs.disconnect());\n\t\t\t} catch (err) {\n\t\t\t\tlogDiag(debug, 'PerformanceObserver failed for', t, err);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tstop() {\n\t\t\tfor (const s of stops) s();\n\t\t},\n\t};\n}\n\nexport function installIframeExperimental(\n\tiframe: HTMLIFrameElement,\n\tctx: ExperimentalRuntimeContext,\n): { stop(): void } {\n\tconst { experimental: exp, onDiagnostic, debug } = ctx;\n\tconst stops: Array<() => void> = [];\n\n\tif (exp.captureIframeResize && typeof ResizeObserver !== 'undefined') {\n\t\tconst ro = new ResizeObserver((entries) => {\n\t\t\tconst e = entries[entries.length - 1];\n\t\t\tif (!e) return;\n\t\t\tconst { width, height } = e.contentRect;\n\t\t\tonDiagnostic({\n\t\t\t\tkind: 'exp.iframe_resize',\n\t\t\t\twidth: Math.round(width),\n\t\t\t\theight: Math.round(height),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t\tlogDiag(debug, 'iframe_resize', width, height);\n\t\t});\n\t\tro.observe(iframe);\n\t\tstops.push(() => ro.disconnect());\n\t}\n\n\tif (exp.captureIframeSrcChanges && typeof MutationObserver !== 'undefined') {\n\t\tlet prev = iframe.src || null;\n\t\tconst mo = new MutationObserver(() => {\n\t\t\tconst cur = iframe.src || '';\n\t\t\tif (cur !== prev) {\n\t\t\t\tonDiagnostic({\n\t\t\t\t\tkind: 'exp.iframe_src',\n\t\t\t\t\tpreviousSrc: prev,\n\t\t\t\t\tcurrentSrc: cur,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t\tlogDiag(debug, 'iframe_src', prev, cur);\n\t\t\t\tprev = cur || null;\n\t\t\t}\n\t\t});\n\t\tmo.observe(iframe, { attributes: true, attributeFilter: ['src'] });\n\t\tstops.push(() => mo.disconnect());\n\t}\n\n\treturn {\n\t\tstop() {\n\t\t\tfor (const s of stops) s();\n\t\t},\n\t};\n}\n", "/**\n * Application-level heartbeat.\n *\n * Browsers expose no ping/pong control frames to JS, so we run our own.\n * The heartbeat goes through the event bus so `beforeSend` is applied\n * centrally. The transport handles the actual send.\n *\n * Mirrors the 2025-10-27 bugfix in the v1.2 experimental observer: a failed\n * response increments `missedBeats`; threshold breach triggers abandonment.\n */\n\nimport type { HeartbeatEvent, ObserverEvent } from './types.js';\n\ninterface HeartbeatHooks {\n\tonTick(sequence: number, missedBeats: number): void;\n\tonAbandoned(missedBeats: number): void;\n}\n\nexport interface HeartbeatHandle {\n\tstop(): void;\n\theartbeatCount(): number;\n\tmissedBeats(): number;\n}\n\ninterface HeartbeatSender {\n\tsendHeartbeat(event: ObserverEvent): Promise<{ ok: boolean; status?: number }>;\n}\n\nexport function startHeartbeat(\n\tsessionId: string,\n\tcorrelationId: string,\n\tgetMetadata: () => Record<string, unknown>,\n\tsender: HeartbeatSender,\n\thooks: HeartbeatHooks,\n\topts: {\n\t\tintervalMs: number;\n\t\tmissThreshold: number;\n\t},\n): HeartbeatHandle {\n\tlet sequence = 0;\n\tlet missed = 0;\n\tlet abandoned = false;\n\tlet timer: ReturnType<typeof setInterval> | null = null;\n\n\tconst tick = () => {\n\t\tif (abandoned) return;\n\t\tsequence += 1;\n\n\t\tconst ev: HeartbeatEvent = {\n\t\t\tkind: 'heartbeat',\n\t\t\tsessionId,\n\t\t\tcorrelationId,\n\t\t\ttimestamp: Date.now(),\n\t\t\tsequence,\n\t\t\tmissedBeats: missed,\n\t\t\tmetadata: getMetadata(),\n\t\t};\n\n\t\tvoid sender.sendHeartbeat(ev).then((result) => {\n\t\t\tif (result.ok) {\n\t\t\t\tmissed = 0;\n\t\t\t} else {\n\t\t\t\tmissed += 1;\n\t\t\t\tif (missed >= opts.missThreshold && !abandoned) {\n\t\t\t\t\tabandoned = true;\n\t\t\t\t\thooks.onAbandoned(missed);\n\t\t\t\t}\n\t\t\t}\n\t\t\thooks.onTick(sequence, missed);\n\t\t}).catch(() => {\n\t\t\tmissed += 1;\n\t\t\tif (missed >= opts.missThreshold && !abandoned) {\n\t\t\t\tabandoned = true;\n\t\t\t\thooks.onAbandoned(missed);\n\t\t\t}\n\t\t\thooks.onTick(sequence, missed);\n\t\t});\n\t};\n\n\ttimer = setInterval(tick, opts.intervalMs);\n\n\treturn {\n\t\tstop() {\n\t\t\tabandoned = true;\n\t\t\tif (timer !== null) {\n\t\t\t\tclearInterval(timer);\n\t\t\t\ttimer = null;\n\t\t\t}\n\t\t},\n\t\theartbeatCount: () => sequence,\n\t\tmissedBeats: () => missed,\n\t};\n}\n", "/**\n * Page lifecycle signals.\n *\n * Per the browser-lifecycle handbook:\n * - `visibilitychange` is the primary signal for \"user left active view\".\n * - `pagehide` is the fallback for dismissal + bfcache, with `event.persisted`.\n * - `unload` is unreliable and deliberately not used.\n * - `navigator.onLine` is a UX hint only, not used for correctness.\n */\n\ninterface LifecycleHooks {\n\t/** visibilityState transitioned to \"hidden\". */\n\tonHidden(): void;\n\t/** visibilityState transitioned back to \"visible\". */\n\tonVisible(): void;\n\t/** pagehide fired. `persisted` means the page is in bfcache. */\n\tonPageHide(persisted: boolean): void;\n}\n\ninterface LifecycleHandle {\n\tstop(): void;\n}\n\nexport function installPageLifecycle(hooks: LifecycleHooks): LifecycleHandle {\n\tif (typeof document === 'undefined' || typeof window === 'undefined') {\n\t\treturn { stop() {} };\n\t}\n\n\tconst visibilityHandler = () => {\n\t\tif (document.visibilityState === 'hidden') hooks.onHidden();\n\t\telse if (document.visibilityState === 'visible') hooks.onVisible();\n\t};\n\n\tconst pageHideHandler = (event: Event) => {\n\t\tconst persisted = (event as PageTransitionEvent).persisted === true;\n\t\thooks.onPageHide(persisted);\n\t};\n\n\tdocument.addEventListener('visibilitychange', visibilityHandler);\n\twindow.addEventListener('pagehide', pageHideHandler);\n\n\treturn {\n\t\tstop() {\n\t\t\tdocument.removeEventListener('visibilitychange', visibilityHandler);\n\t\t\twindow.removeEventListener('pagehide', pageHideHandler);\n\t\t},\n\t};\n}\n\n/**\n * Attach an IntersectionObserver to the iframe so we know if it is actually\n * on-screen (not just in the DOM). Useful when a merchant page scrolls the\n * modal out of view but leaves it mounted.\n */\nexport function observeIframeVisibility(\n\tiframe: HTMLIFrameElement,\n\tonChange: (visible: boolean) => void,\n): { stop(): void } {\n\tif (typeof IntersectionObserver === 'undefined') {\n\t\treturn { stop() {} };\n\t}\n\n\tconst io = new IntersectionObserver(\n\t\t(entries) => {\n\t\t\tconst entry = entries[entries.length - 1];\n\t\t\tif (entry) onChange(entry.isIntersecting);\n\t\t},\n\t\t{ threshold: 0.01 },\n\t);\n\tio.observe(iframe);\n\n\treturn {\n\t\tstop() {\n\t\t\tio.disconnect();\n\t\t},\n\t};\n}\n", "/**\n * Shortcode pattern \u2014 WAF-safe callback passing to ZenPay.\n *\n * Problem: passing a function object to ZenPay's `onPluginClose` causes the\n * function source to appear in URL query strings, which trips WAFs.\n *\n * Solution: register the callback as a global under a unique name and pass\n * the STRING \"window.zpcb_xxx\" instead. ZenPay invokes `window[name]()` which\n * resolves at runtime but never leaks code into the URL.\n */\n\nconst PREFIX = 'zpcb_';\n\n/** Build a unique, WAF-safe global name. Uses crypto when available. */\nexport function generateShortcodeName(): string {\n\tconst ts = Date.now().toString(36);\n\n\tif (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n\t\tconst buf = new Uint32Array(2);\n\t\tcrypto.getRandomValues(buf);\n\t\treturn `${PREFIX}${ts}_${buf[0]!.toString(36)}${buf[1]!.toString(36)}`;\n\t}\n\n\tconst rand = Math.floor(Math.random() * 0xffffffff).toString(36);\n\treturn `${PREFIX}${ts}_${rand}`;\n}\n\n/** Register `fn` as `window[name]`. Returns the string to pass to ZenPay. */\nexport function registerShortcode(name: string, fn: () => void): string {\n\tif (typeof window !== 'undefined') {\n\t\t(window as unknown as Record<string, unknown>)[name] = fn;\n\t}\n\treturn `window.${name}`;\n}\n\n/** Remove a previously registered shortcode. Safe to call twice. */\nexport function unregisterShortcode(name: string): void {\n\tif (typeof window !== 'undefined') {\n\t\ttry {\n\t\t\tdelete (window as unknown as Record<string, unknown>)[name];\n\t\t} catch {\n\t\t\t(window as unknown as Record<string, unknown>)[name] = undefined;\n\t\t}\n\t}\n}\n", "/**\n * Shared random helpers \u2014 UUID generation for correlation IDs.\n *\n * Uses `crypto.randomUUID()` when available (all modern browsers, Node 19+),\n * with a `Math.random` fallback for older environments.\n */\n\nfunction fallbackUUID(): string {\n\t// RFC 4122 version 4 UUID via Math.random\n\tconst hex = '0123456789abcdef';\n\tconst template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n\tlet result = '';\n\tfor (const ch of template) {\n\t\tif (ch === '-') {\n\t\t\tresult += '-';\n\t\t} else if (ch === '4') {\n\t\t\tresult += '4';\n\t\t} else if (ch === 'y') {\n\t\t\tresult += hex[(Math.random() * 16) | 0]!;\n\t\t} else {\n\t\t\tresult += hex[(Math.random() * 16) | 0]!;\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function generateUUID(): string {\n\tif (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n\t\treturn crypto.randomUUID();\n\t}\n\treturn fallbackUUID();\n}\n", "/**\n * Typed event bus \u2014 the dispatch layer between `observer.emit()` and `Transport.send()`.\n *\n * Responsibilities:\n * 1. Run every event through `beforeSend` (drop / mutate).\n * 2. Optionally persist non-heartbeat events to an outbox before sending.\n * 3. Delegate to `Transport.send()` and handle the result.\n * 4. Count missed beats for heartbeat events (delegated from the heartbeat timer).\n */\n\nimport type { ObserverEvent, Transport, TransportResult } from './types.js';\nimport type { Outbox } from './outbox.js';\n\nexport interface EventBus {\n\t/** Push a domain event onto the bus. Fire-and-forget from the caller's POV. */\n\temit(event: ObserverEvent): void;\n\n\t/** Send a heartbeat and return the transport result (used by the heartbeat timer). */\n\tsendHeartbeat(event: ObserverEvent): Promise<TransportResult>;\n\n\t/** Drain persisted events for a given session. */\n\tdrain(sessionId: string): void;\n}\n\nexport function createEventBus(\n\ttransport: Transport,\n\tbeforeSend: ((event: ObserverEvent) => ObserverEvent | null) | undefined,\n\toutbox: Outbox | null,\n): EventBus {\n\tfunction applyBeforeSend(ev: ObserverEvent): ObserverEvent | null {\n\t\tif (!beforeSend) return ev;\n\t\ttry {\n\t\t\treturn beforeSend(ev);\n\t\t} catch {\n\t\t\treturn ev;\n\t\t}\n\t}\n\n\tfunction sendViaTransport(ev: ObserverEvent): Promise<TransportResult> {\n\t\treturn transport.send(ev).catch(() => ({ ok: false }));\n\t}\n\n\tconst bus: EventBus = {\n\t\temit(ev) {\n\t\t\tconst filtered = applyBeforeSend(ev);\n\t\t\tif (!filtered) return;\n\n\t\t\tif (outbox && ev.kind !== 'heartbeat') {\n\t\t\t\toutbox.push(filtered);\n\t\t\t}\n\n\t\t\t// Fire-and-forget for non-heartbeat events.\n\t\t\tvoid sendViaTransport(filtered).then((result) => {\n\t\t\t\tif (result.ok && outbox && ev.kind !== 'heartbeat') {\n\t\t\t\t\toutbox.remove(filtered);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tasync sendHeartbeat(ev) {\n\t\t\tconst filtered = applyBeforeSend(ev);\n\t\t\tif (!filtered) return { ok: true };\n\n\t\t\tconst result = await sendViaTransport(filtered);\n\t\t\treturn result;\n\t\t},\n\n\t\tdrain(sessionId) {\n\t\t\tif (!outbox) return;\n\t\t\tconst pending = outbox.drain(sessionId);\n\t\t\tfor (const ev of pending) {\n\t\t\t\tvoid sendViaTransport(ev).then((result) => {\n\t\t\t\t\tif (result.ok) outbox.remove(ev);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t};\n\n\treturn bus;\n}\n", "/**\n * localStorage outbox for at-least-once delivery of non-heartbeat events.\n *\n * When `persistence: 'localStorage'` is set, every non-heartbeat event is\n * written to a ring buffer before sending. On successful send, the entry is\n * removed. On next `start()`, pending entries for the matching sessionId are\n * drained and re-sent.\n *\n * Caps at 64 entries to bound storage. If localStorage is unavailable (private\n * mode, quota exceeded), surfaces `system.persistence_unavailable` via the\n * `onUnavailable` callback so the integrator can downgrade to `'memory'`.\n */\n\nimport type { ObserverEvent } from './types.js';\n\nconst STORAGE_KEY = '__zpobs_outbox_v1';\nconst MAX_ENTRIES = 64;\n\ninterface OutboxEntry {\n\tsessionId: string;\n\tcorrelationId: string;\n\tevent: ObserverEvent;\n}\n\nexport interface Outbox {\n\tpush(event: ObserverEvent): void;\n\tremove(event: ObserverEvent): void;\n\tdrain(sessionId: string): ObserverEvent[];\n}\n\nexport function createOutbox(\n\tonUnavailable: (error: string) => void,\n): Outbox | null {\n\tif (typeof localStorage === 'undefined') {\n\t\treturn null;\n\t}\n\n\tfunction readAll(): OutboxEntry[] {\n\t\ttry {\n\t\t\tconst raw = localStorage.getItem(STORAGE_KEY);\n\t\t\tif (!raw) return [];\n\t\t\tconst parsed: unknown = JSON.parse(raw);\n\t\t\tif (!Array.isArray(parsed)) return [];\n\t\t\treturn parsed as OutboxEntry[];\n\t\t} catch {\n\t\t\tonUnavailable('Failed to read outbox from localStorage');\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tfunction writeAll(entries: OutboxEntry[]): boolean {\n\t\ttry {\n\t\t\tconst trimmed = entries.slice(-MAX_ENTRIES);\n\t\t\tlocalStorage.setItem(STORAGE_KEY, JSON.stringify(trimmed));\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tonUnavailable(\n\t\t\t\terr instanceof Error ? err.message : 'localStorage write failed (quota or private mode)',\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn {\n\t\tpush(event) {\n\t\t\tconst entries = readAll();\n\t\t\tentries.push({ sessionId: event.sessionId, correlationId: event.correlationId, event });\n\t\t\twriteAll(entries);\n\t\t},\n\n\t\tremove(event) {\n\t\t\tconst entries = readAll();\n\t\t\tconst filtered = entries.filter(\n\t\t\t\t(e) =>\n\t\t\t\t\t!(e.event.kind === event.kind &&\n\t\t\t\t\t\te.event.timestamp === event.timestamp &&\n\t\t\t\t\t\te.event.sessionId === event.sessionId),\n\t\t\t);\n\t\t\twriteAll(filtered);\n\t\t},\n\n\t\tdrain(targetSessionId) {\n\t\t\tconst entries = readAll();\n\t\t\tconst match = entries.filter((e) => e.sessionId === targetSessionId);\n\t\t\tconst rest = entries.filter((e) => e.sessionId !== targetSessionId);\n\t\t\twriteAll(rest);\n\t\t\treturn match.map((e) => e.event);\n\t\t},\n\t};\n}\n", "/**\n * createObserver \u2014 the public factory (v6).\n *\n * Wires detection + lifecycle + heartbeat + shortcode + event bus + outbox\n * against a Transport. The only concrete behaviour here is orchestration;\n * every external side effect is delegated.\n */\n\nimport { startDetection, DEFAULT_IFRAME_SELECTORS } from './detection.js';\nimport {\n\thasGlobalExperimentalFeatures,\n\thasIframeExperimentalFeatures,\n\tinstallGlobalExperimental,\n\tinstallIframeExperimental,\n\treadOpenExperimentalFields,\n} from './experimental.js';\nimport { startHeartbeat, type HeartbeatHandle } from './heartbeat.js';\nimport { installPageLifecycle, observeIframeVisibility } from './lifecycle.js';\nimport {\n\tgenerateShortcodeName,\n\tregisterShortcode,\n\tunregisterShortcode,\n} from './shortcode.js';\nimport { generateUUID } from './random.js';\nimport { createEventBus, type EventBus } from './event-bus.js';\nimport { createOutbox } from './outbox.js';\nimport type {\n\tCloseEvent,\n\tCloseReason,\n\tCreateObserverOptions,\n\tDiagnosticDump,\n\tDiagnosticEvent,\n\tExperimentalOptions,\n\tObserver,\n\tObserverDiagnostics,\n\tObserverEvent,\n\tObserverState,\n\tOpenEvent,\n\tTransportState,\n\tUIState,\n} from './types.js';\n\nfunction getNavigationType(): string | null {\n\ttry {\n\t\tconst entries = performance.getEntriesByType('navigation');\n\t\tconst entry = entries[0] as PerformanceNavigationTiming | undefined;\n\t\treturn entry?.type ?? null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction logDebug(enabled: boolean, ...args: unknown[]): void {\n\tif (enabled && typeof console !== 'undefined') {\n\t\tconsole.log('[ZPObserver]', ...args);\n\t}\n}\n\nexport function createObserver(options: CreateObserverOptions): Observer {\n\tif (!options || typeof options !== 'object') {\n\t\tthrow new Error('[ZPObserver] createObserver(options) requires an options object');\n\t}\n\tif (!options.sessionId || typeof options.sessionId !== 'string') {\n\t\tthrow new Error('[ZPObserver] options.sessionId is required');\n\t}\n\tif (!options.transport) {\n\t\tthrow new Error('[ZPObserver] options.transport is required');\n\t}\n\n\tconst sessionId = options.sessionId;\n\tconst correlationId = options.correlationId ?? generateUUID();\n\tconst transport = options.transport;\n\tconst metadata = options.metadata ?? {};\n\tconst beforeSend = options.beforeSend;\n\tconst heartbeatMs = options.heartbeatMs ?? 5000;\n\tconst missThreshold = options.heartbeatMissThreshold ?? 3;\n\tconst idleTimeoutMs = options.idleTimeoutMs ?? 15 * 60 * 1000;\n\tconst detectionIntervalMs = options.detectionIntervalMs ?? 100;\n\tconst detectionTimeoutMs = options.detectionTimeoutMs ?? 30_000;\n\tconst iframeSelectors = options.iframeSelectors ?? Array.from(DEFAULT_IFRAME_SELECTORS);\n\tconst debug = options.debug === true;\n\tconst experimental: ExperimentalOptions | undefined = options.experimental;\n\tconst diagMax = experimental?.diagnosticsMax ?? 50;\n\tconst diagnosticsBuffer: DiagnosticEvent[] = [];\n\tconst recentEvents: ObserverEvent[] = [];\n\tconst eventsMax = 50;\n\n\t// State\n\tlet uiState: UIState = 'IDLE';\n\tlet transportState: TransportState = 'CONNECTED';\n\tlet isActive = false;\n\tlet startedAtMs = 0;\n\tlet iframeEl: HTMLIFrameElement | null = null;\n\tlet closed = false;\n\n\t// Handles\n\tlet detectionHandle: { stop(): void } | null = null;\n\tlet lifecycleHandle: { stop(): void } | null = null;\n\tlet visibilityHandle: { stop(): void } | null = null;\n\tlet heartbeat: HeartbeatHandle | null = null;\n\tlet idleTimer: ReturnType<typeof setTimeout> | null = null;\n\tlet experimentalGlobalHandle: { stop(): void } | null = null;\n\tlet experimentalIframeHandle: { stop(): void } | null = null;\n\n\t// Shortcode\n\tconst shortcodeName = generateShortcodeName();\n\tconst shortcode = registerShortcode(shortcodeName, () => {\n\t\tlogDebug(debug, `shortcode invoked: ${shortcodeName}`);\n\t\tstop('user.callback_invoked');\n\t});\n\n\tconst emitDiagnostic = (e: DiagnosticEvent) => {\n\t\tdiagnosticsBuffer.push(e);\n\t\twhile (diagnosticsBuffer.length > diagMax) diagnosticsBuffer.shift();\n\t\toptions.onDiagnostic?.(e);\n\t\tlogDebug(debug, 'diagnostic', e);\n\t};\n\n\t// Outbox\n\tconst outbox = options.persistence === 'localStorage'\n\t\t? createOutbox((error: string) => {\n\t\t\temitDiagnostic({ kind: 'system.persistence_unavailable', error, timestamp: Date.now() });\n\t\t})\n\t\t: null;\n\n\t// Event bus (centralizes beforeSend + transport.send + outbox)\n\tconst bus: EventBus = createEventBus(transport, beforeSend, outbox);\n\n\tconst trackEvent = (ev: ObserverEvent) => {\n\t\trecentEvents.push(ev);\n\t\twhile (recentEvents.length > eventsMax) recentEvents.shift();\n\t};\n\n\t// Public emit \u2014 all events route through the bus.\n\tconst emit = (event: ObserverEvent) => {\n\t\ttrackEvent(event);\n\t\tbus.emit(event);\n\t};\n\n\tconst getMetadata = (): Record<string, unknown> => {\n\t\tconst base: Record<string, unknown> = { ...metadata };\n\t\tif (experimental?.attachDiagnosticsToHeartbeat) {\n\t\t\tbase.zpObserverDiagnostics = diagnosticsBuffer.slice();\n\t\t}\n\t\treturn base;\n\t};\n\n\tconst resetIdleTimer = () => {\n\t\tif (idleTimeoutMs <= 0) return;\n\t\tif (idleTimer !== null) clearTimeout(idleTimer);\n\t\tidleTimer = setTimeout(() => {\n\t\t\tlogDebug(debug, 'idle timeout reached');\n\t\t\tstop('system.idle_timeout');\n\t\t}, idleTimeoutMs);\n\t};\n\n\tconst sendOpen = (iframe: HTMLIFrameElement) => {\n\t\tconst openExtras = readOpenExperimentalFields(experimental);\n\t\tconst ev: OpenEvent = {\n\t\t\tkind: 'open',\n\t\t\tsessionId,\n\t\t\tcorrelationId,\n\t\t\ttimestamp: Date.now(),\n\t\t\tiframeSrc: iframe.src || null,\n\t\t\tuserAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n\t\t\tscreenWidth: typeof screen !== 'undefined' ? screen.width : 0,\n\t\t\tscreenHeight: typeof screen !== 'undefined' ? screen.height : 0,\n\t\t\tnavigationType: getNavigationType(),\n\t\t\tmetadata: getMetadata(),\n\t\t\t...openExtras,\n\t\t};\n\n\t\temit(ev);\n\t};\n\n\tconst sendClose = (reason: CloseReason, wasPersisted: boolean | null) => {\n\t\tconst hbCount = heartbeat?.heartbeatCount() ?? 0;\n\t\tconst missed = heartbeat?.missedBeats() ?? 0;\n\n\t\tconst ev: CloseEvent = {\n\t\t\tkind: 'close',\n\t\t\tsessionId,\n\t\t\tcorrelationId,\n\t\t\ttimestamp: Date.now(),\n\t\t\treason,\n\t\t\telapsedMs: startedAtMs ? Date.now() - startedAtMs : 0,\n\t\t\theartbeatCount: hbCount,\n\t\t\tmissedBeats: missed,\n\t\t\twasPersisted,\n\t\t\tmetadata: getMetadata(),\n\t\t};\n\n\t\temit(ev);\n\t};\n\n\t// Public: start\n\tconst start = () => {\n\t\tif (isActive) {\n\t\t\tlogDebug(debug, 'start() called while already active \u2014 ignoring');\n\t\t\treturn;\n\t\t}\n\t\tisActive = true;\n\t\tclosed = false;\n\t\tstartedAtMs = Date.now();\n\t\tuiState = 'DETECTING';\n\n\t\t// Drain persisted outbox for this session before sending live events.\n\t\tbus.drain(sessionId);\n\n\t\t// Emit session_init as the first domain event.\n\t\temit({\n\t\t\tkind: 'payment.session_init',\n\t\t\tsessionId,\n\t\t\tcorrelationId,\n\t\t\ttimestamp: Date.now(),\n\t\t\tmetadata: getMetadata(),\n\t\t});\n\n\t\tif (hasGlobalExperimentalFeatures(experimental) && experimental) {\n\t\t\texperimentalGlobalHandle = installGlobalExperimental({\n\t\t\t\tsessionId,\n\t\t\t\texperimental,\n\t\t\t\tonDiagnostic: emitDiagnostic,\n\t\t\t\tdebug,\n\t\t\t\tgetNavigationType,\n\t\t\t});\n\t\t}\n\n\t\tlifecycleHandle = installPageLifecycle({\n\t\t\tonHidden: () => {\n\t\t\t\tif (uiState === 'ACTIVE_MODAL_VISIBLE') uiState = 'BACKGROUND_HIDDEN';\n\t\t\t},\n\t\t\tonVisible: () => {\n\t\t\t\tif (uiState === 'BACKGROUND_HIDDEN') uiState = 'ACTIVE_MODAL_VISIBLE';\n\t\t\t},\n\t\t\tonPageHide: (persisted) => {\n\t\t\t\tif (!closed) stopInternal('page.pagehide', persisted);\n\t\t\t},\n\t\t});\n\n\t\tdetectionHandle = startDetection(\n\t\t\t{\n\t\t\t\tonFound: (iframe) => {\n\t\t\t\t\tiframeEl = iframe;\n\t\t\t\t\tuiState = 'ACTIVE_MODAL_VISIBLE';\n\t\t\t\t\tlogDebug(debug, 'iframe detected:', iframe.src);\n\n\t\t\t\t\tsendOpen(iframe);\n\n\t\t\t\t\theartbeat = startHeartbeat(\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tcorrelationId,\n\t\t\t\t\t\tgetMetadata,\n\t\t\t\t\t\tbus,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tonTick: (_seq, missed) => {\n\t\t\t\t\t\t\t\ttransportState =\n\t\t\t\t\t\t\t\t\tmissed === 0\n\t\t\t\t\t\t\t\t\t\t? 'CONNECTED'\n\t\t\t\t\t\t\t\t\t\t: missed < missThreshold\n\t\t\t\t\t\t\t\t\t\t\t? 'HEARTBEAT_LATE'\n\t\t\t\t\t\t\t\t\t\t\t: 'DISCONNECTED';\n\t\t\t\t\t\t\t\tif (missed === 0) resetIdleTimer();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tonAbandoned: () => {\n\t\t\t\t\t\t\t\ttransportState = 'DISCONNECTED';\n\t\t\t\t\t\t\t\tif (!closed) stop('system.network_abandoned');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ intervalMs: heartbeatMs, missThreshold },\n\t\t\t\t\t);\n\n\t\t\t\t\tvisibilityHandle = observeIframeVisibility(iframe, (visible) => {\n\t\t\t\t\t\tlogDebug(debug, 'iframe visibility:', visible);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (hasIframeExperimentalFeatures(experimental) && experimental) {\n\t\t\t\t\t\texperimentalIframeHandle = installIframeExperimental(iframe, {\n\t\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t\texperimental,\n\t\t\t\t\t\t\tonDiagnostic: emitDiagnostic,\n\t\t\t\t\t\t\tdebug,\n\t\t\t\t\t\t\tgetNavigationType,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tresetIdleTimer();\n\t\t\t\t},\n\t\t\t\tonRemoved: () => {\n\t\t\t\t\tif (!closed) stop('user.modal_closed');\n\t\t\t\t},\n\t\t\t\tonBootstrapHidden: () => {\n\t\t\t\t\tif (!closed) stop('user.modal_closed');\n\t\t\t\t},\n\t\t\t\tonTimeout: () => {\n\t\t\t\t\tlogDebug(debug, 'detection timeout \u2014 no iframe found');\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tselectors: iframeSelectors,\n\t\t\t\tintervalMs: detectionIntervalMs,\n\t\t\t\ttimeoutMs: detectionTimeoutMs,\n\t\t\t},\n\t\t);\n\n\t\tlogDebug(debug, `started session ${sessionId}, correlationId=${correlationId}, shortcode=${shortcode}`);\n\t};\n\n\tconst stopInternal = (reason: CloseReason, wasPersisted: boolean | null) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tisActive = false;\n\t\tuiState = 'DISMISSED';\n\n\t\tlogDebug(debug, `stopping: ${reason}`);\n\n\t\tif (detectionHandle) {\n\t\t\tdetectionHandle.stop();\n\t\t\tdetectionHandle = null;\n\t\t}\n\t\tif (heartbeat) {\n\t\t\theartbeat.stop();\n\t\t\theartbeat = null;\n\t\t}\n\t\tif (visibilityHandle) {\n\t\t\tvisibilityHandle.stop();\n\t\t\tvisibilityHandle = null;\n\t\t}\n\t\tif (experimentalIframeHandle) {\n\t\t\texperimentalIframeHandle.stop();\n\t\t\texperimentalIframeHandle = null;\n\t\t}\n\t\tif (idleTimer !== null) {\n\t\t\tclearTimeout(idleTimer);\n\t\t\tidleTimer = null;\n\t\t}\n\t\tif (lifecycleHandle) {\n\t\t\tlifecycleHandle.stop();\n\t\t\tlifecycleHandle = null;\n\t\t}\n\t\tif (experimentalGlobalHandle) {\n\t\t\texperimentalGlobalHandle.stop();\n\t\t\texperimentalGlobalHandle = null;\n\t\t}\n\n\t\tsendClose(reason, wasPersisted);\n\t\tunregisterShortcode(shortcodeName);\n\t};\n\n\t// Public: stop\n\tconst stop = (reason: CloseReason = 'user.manual_close') => {\n\t\tstopInternal(reason, null);\n\t};\n\n\tconst getState = (): ObserverState => ({\n\t\tui: uiState,\n\t\ttransport: transportState,\n\t\tsessionId,\n\t\tcorrelationId,\n\t\tshortcode,\n\t\tisActive,\n\t\tiframeDetected: iframeEl !== null,\n\t\theartbeatCount: heartbeat?.heartbeatCount() ?? 0,\n\t\tmissedBeats: heartbeat?.missedBeats() ?? 0,\n\t\telapsedMs: startedAtMs ? Date.now() - startedAtMs : 0,\n\t});\n\n\tconst diagnostics: ObserverDiagnostics = {\n\t\tdump(): DiagnosticDump {\n\t\t\treturn {\n\t\t\t\tsessionId,\n\t\t\t\tcorrelationId,\n\t\t\t\tstate: getState(),\n\t\t\t\trecentEvents: recentEvents.slice(),\n\t\t\t\tdiagnostics: diagnosticsBuffer.slice(),\n\t\t\t\tconfiguredTransport: transport.constructor?.name ?? 'custom',\n\t\t\t\tversion: '6.0.0',\n\t\t\t};\n\t\t},\n\t};\n\n\treturn { sessionId, correlationId, shortcode, start, stop, getState, emit, diagnostics };\n}\n", "/**\n * Default HTTP transport (v6).\n *\n * `send(event)` is the primary write path \u2014 dispatches based on event kind.\n * `sendOpen` / `sendHeartbeat` / `sendClose` are retained as thin delegators\n * for backward compatibility with v5 consumers.\n *\n * Strategies:\n * - heartbeat \u2192 fetch POST with AbortController timeout (needs status code)\n * - everything else \u2192 navigator.sendBeacon, with fetch({keepalive:true}) fallback\n */\n\nimport { postJsonBeacon } from '../core/beacon.js';\nimport type { ObserverEvent, Transport } from '../core/types.js';\n\nexport interface HttpTransportOptions {\n\t/** Endpoint for the single `open` beacon. */\n\topenUrl: string;\n\t/** Endpoint for periodic heartbeat POSTs. */\n\taliveUrl: string;\n\t/** Endpoint for the final `close` beacon. */\n\tcloseUrl: string;\n\n\t/** Optional endpoint for domain events (falls back to aliveUrl). */\n\teventUrl?: string;\n\n\t/** Static headers applied to heartbeats. sendBeacon cannot set headers. */\n\theaders?: Record<string, string> | (() => Record<string, string>);\n\n\t/** Override fetch (useful for tests / custom retry wrappers). */\n\tfetch?: typeof fetch;\n\n\t/** Heartbeat request timeout. Default 8000ms. */\n\theartbeatTimeoutMs?: number;\n}\n\nfunction resolveHeaders(\n\th: HttpTransportOptions['headers'],\n): Record<string, string> {\n\tif (!h) return {};\n\treturn typeof h === 'function' ? h() : h;\n}\n\nfunction postKeepalive(\n\tfetchImpl: typeof fetch,\n\turl: string,\n\tbody: unknown,\n\theaders: Record<string, string>,\n): void {\n\ttry {\n\t\tvoid fetchImpl(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json', ...headers },\n\t\t\tbody: JSON.stringify(body),\n\t\t\tkeepalive: true,\n\t\t\tcredentials: 'include',\n\t\t}).catch(() => {\n\t\t\t// Best-effort; no recourse during dismissal.\n\t\t});\n\t} catch {\n\t\t// ignore\n\t}\n}\n\nfunction urlForEvent(\n\tevent: ObserverEvent,\n\topts: HttpTransportOptions,\n): string {\n\tswitch (event.kind) {\n\t\tcase 'open':\n\t\tcase 'payment.modal_opened':\n\t\t\treturn opts.openUrl;\n\t\tcase 'heartbeat':\n\t\t\treturn opts.aliveUrl;\n\t\tcase 'close':\n\t\t\treturn opts.closeUrl;\n\t\tdefault:\n\t\t\treturn opts.eventUrl ?? opts.aliveUrl;\n\t}\n}\n\nexport function httpTransport(opts: HttpTransportOptions): Transport {\n\tif (!opts || typeof opts !== 'object') {\n\t\tthrow new Error('[ZPObserver] httpTransport requires options');\n\t}\n\tif (!opts.openUrl || !opts.aliveUrl || !opts.closeUrl) {\n\t\tthrow new Error(\n\t\t\t'[ZPObserver] httpTransport requires openUrl, aliveUrl, and closeUrl',\n\t\t);\n\t}\n\n\tconst fetchImpl = opts.fetch ?? (typeof fetch !== 'undefined' ? fetch.bind(globalThis) : undefined);\n\tconst hbTimeoutMs = opts.heartbeatTimeoutMs ?? 8000;\n\n\tconst transport: Transport = {\n\t\tasync send(event) {\n\t\t\tconst url = urlForEvent(event, opts);\n\n\t\t\tif (event.kind === 'heartbeat') {\n\t\t\t\tif (!fetchImpl) return { ok: false };\n\n\t\t\t\tconst controller =\n\t\t\t\t\ttypeof AbortController !== 'undefined' ? new AbortController() : null;\n\t\t\t\tconst timer = controller\n\t\t\t\t\t? setTimeout(() => controller.abort(), hbTimeoutMs)\n\t\t\t\t\t: null;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await fetchImpl(url, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: { 'Content-Type': 'application/json', ...resolveHeaders(opts.headers) },\n\t\t\t\t\t\tbody: JSON.stringify(event),\n\t\t\t\t\t\tcredentials: 'include',\n\t\t\t\t\t\t...(controller ? { signal: controller.signal } : {}),\n\t\t\t\t\t});\n\t\t\t\t\treturn { ok: res.ok, status: res.status };\n\t\t\t\t} catch {\n\t\t\t\t\treturn { ok: false };\n\t\t\t\t} finally {\n\t\t\t\t\tif (timer !== null) clearTimeout(timer);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Non-heartbeat: sendBeacon first, fetch keepalive fallback.\n\t\t\tif (postJsonBeacon(url, event)) return { ok: true };\n\t\t\tif (fetchImpl) {\n\t\t\t\tpostKeepalive(fetchImpl, url, event, resolveHeaders(opts.headers));\n\t\t\t}\n\t\t\treturn { ok: true };\n\t\t},\n\n\t\tsendOpen(event) {\n\t\t\tvoid transport.send(event);\n\t\t},\n\n\t\tsendHeartbeat(event) {\n\t\t\treturn transport.send(event);\n\t\t},\n\n\t\tsendClose(event) {\n\t\t\tvoid transport.send(event);\n\t\t},\n\t};\n\n\treturn transport;\n}\n", "/**\n * Callback transport \u2014 bring-your-own-sink (v6).\n *\n * For integrators who want full control over how and where events go.\n * `send(event)` is the primary path; `sendOpen` / `sendHeartbeat` / `sendClose`\n * are thin delegators for backward compatibility.\n */\n\nimport type {\n\tObserverEvent,\n\tTransport,\n\tTransportResult,\n} from '../core/types.js';\n\nexport interface CallbackTransportOptions {\n\tonOpen?: (event: ObserverEvent) => void;\n\tonHeartbeat?: (event: ObserverEvent) => Promise<TransportResult> | TransportResult;\n\tonClose?: (event: ObserverEvent) => void;\n\t/** Generic callback for domain events that don't match open/heartbeat/close. */\n\tonEvent?: (event: ObserverEvent) => Promise<TransportResult> | TransportResult;\n}\n\nexport function callbackTransport(opts: CallbackTransportOptions = {}): Transport {\n\tconst transport: Transport = {\n\t\tasync send(event) {\n\t\t\tswitch (event.kind) {\n\t\t\t\tcase 'open':\n\t\t\t\tcase 'payment.modal_opened': {\n\t\t\t\t\ttry {\n\t\t\t\t\t\topts.onOpen?.(event);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Swallow \u2014 transport errors must not break the observer.\n\t\t\t\t\t}\n\t\t\t\t\treturn { ok: true };\n\t\t\t\t}\n\t\t\t\tcase 'heartbeat': {\n\t\t\t\t\tif (!opts.onHeartbeat) return { ok: true };\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await opts.onHeartbeat(event);\n\t\t\t\t\t\treturn result ?? { ok: true };\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn { ok: false };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcase 'close': {\n\t\t\t\t\ttry {\n\t\t\t\t\t\topts.onClose?.(event);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// ignore\n\t\t\t\t\t}\n\t\t\t\t\treturn { ok: true };\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tif (!opts.onEvent) return { ok: true };\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await opts.onEvent(event);\n\t\t\t\t\t\treturn result ?? { ok: true };\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn { ok: false };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tsendOpen(event) {\n\t\t\tvoid transport.send(event);\n\t\t},\n\n\t\tsendHeartbeat(event) {\n\t\t\treturn transport.send(event);\n\t\t},\n\n\t\tsendClose(event) {\n\t\t\tvoid transport.send(event);\n\t\t},\n\t};\n\n\treturn transport;\n}\n", "/**\n * ZenPay plugin auto-patch (v6).\n *\n * One-line integration: detects the ZenPay plugin and rewrites its\n * `onPluginClose` at invocation time to use our shortcode. Emits\n * `payment.hpp_init` domain events when the plugin is invoked so the\n * observer's event stream captures HPP lifecycle.\n *\n * Supports:\n * - v3: jQuery plugin `$.fn.zpPayment`\n * - v5: global `window.ZenPay` (class or factory)\n *\n * If neither is present at install time, we set a short-lived polling\n * watch (plugins are typically loaded via <script> before first payment).\n */\n\nimport type { Observer } from '../core/types.js';\n\ninterface JQueryLike {\n\tfn: { zpPayment?: unknown };\n}\n\ninterface ZPOptions {\n\tonPluginClose?: unknown;\n\t[key: string]: unknown;\n}\n\ntype PluginFn = (this: unknown, opts?: ZPOptions) => unknown;\n\nexport interface AutoPatchHandle {\n\tuninstall(): void;\n\tisPatched(): boolean;\n}\n\nexport interface AutoPatchOptions {\n\tpollIntervalMs?: number;\n\tpollTimeoutMs?: number;\n\tchainExisting?: boolean;\n\tdebug?: boolean;\n}\n\nfunction logDebug(enabled: boolean, ...args: unknown[]): void {\n\tif (enabled && typeof console !== 'undefined') {\n\t\tconsole.log('[ZPObserver/auto-patch]', ...args);\n\t}\n}\n\nfunction resolveAndCallWindowPath(windowPath: string): void {\n\tconst path = windowPath.replace(/^window\\./, '').split('.');\n\tlet ref: unknown = window;\n\tfor (const part of path) {\n\t\tif (ref && typeof ref === 'object' && part in ref) {\n\t\t\tref = (ref as Record<string, unknown>)[part];\n\t\t} else {\n\t\t\tref = undefined;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (typeof ref === 'function') (ref as () => void)();\n}\n\nfunction wrapOptions(\n\topts: ZPOptions | undefined,\n\tshortcode: string,\n\tchainExisting: boolean,\n): ZPOptions {\n\tconst next: ZPOptions = { ...(opts ?? {}) };\n\tconst existing = next.onPluginClose;\n\n\tif (chainExisting && existing != null) {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tconst wrapperName = `__zpobs_chain_${Date.now().toString(36)}`;\n\t\t\t(window as unknown as Record<string, unknown>)[wrapperName] = () => {\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof existing === 'function') {\n\t\t\t\t\t\t(existing as () => void)();\n\t\t\t\t\t} else if (typeof existing === 'string') {\n\t\t\t\t\t\tresolveAndCallWindowPath(existing);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tresolveAndCallWindowPath(shortcode);\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t};\n\t\t\tnext.onPluginClose = `window.${wrapperName}`;\n\t\t\treturn next;\n\t\t}\n\t}\n\n\tnext.onPluginClose = shortcode;\n\treturn next;\n}\n\nfunction patchJQueryPlugin(\n\t$: JQueryLike,\n\tshortcode: string,\n\tchainExisting: boolean,\n\tdebug: boolean,\n\tonInvoke: () => void,\n): boolean {\n\tconst original = $.fn.zpPayment as PluginFn | undefined;\n\tif (typeof original !== 'function' || (original as { __zpobsPatched?: boolean }).__zpobsPatched) {\n\t\treturn false;\n\t}\n\n\tconst patched: PluginFn & { __zpobsPatched?: boolean } = function (\n\t\tthis: unknown,\n\t\topts?: ZPOptions,\n\t) {\n\t\tonInvoke();\n\t\treturn original.call(this, wrapOptions(opts, shortcode, chainExisting));\n\t};\n\tpatched.__zpobsPatched = true;\n\t$.fn.zpPayment = patched;\n\n\tlogDebug(debug, 'patched $.fn.zpPayment');\n\treturn true;\n}\n\nfunction patchZenPayGlobal(\n\tshortcode: string,\n\tchainExisting: boolean,\n\tdebug: boolean,\n\tonInvoke: () => void,\n): boolean {\n\tconst w = window as unknown as {\n\t\tZenPay?: (new (opts?: ZPOptions) => unknown) | ((opts?: ZPOptions) => unknown);\n\t};\n\tconst original = w.ZenPay;\n\tif (typeof original !== 'function' || (original as { __zpobsPatched?: boolean }).__zpobsPatched) {\n\t\treturn false;\n\t}\n\n\tconst handler: ProxyHandler<typeof original> = {\n\t\tconstruct(target, args) {\n\t\t\tonInvoke();\n\t\t\tconst [first, ...rest] = args as [ZPOptions | undefined, ...unknown[]];\n\t\t\tconst wrapped = wrapOptions(first, shortcode, chainExisting);\n\t\t\treturn Reflect.construct(target, [wrapped, ...rest]) as object;\n\t\t},\n\t\tapply(target, thisArg, args) {\n\t\t\tonInvoke();\n\t\t\tconst [first, ...rest] = args as [ZPOptions | undefined, ...unknown[]];\n\t\t\tconst wrapped = wrapOptions(first, shortcode, chainExisting);\n\t\t\treturn Reflect.apply(target as (...a: unknown[]) => unknown, thisArg, [\n\t\t\t\twrapped,\n\t\t\t\t...rest,\n\t\t\t]);\n\t\t},\n\t};\n\n\tconst patched = new Proxy(original, handler) as typeof original & {\n\t\t__zpobsPatched?: boolean;\n\t};\n\tpatched.__zpobsPatched = true;\n\tw.ZenPay = patched;\n\n\tlogDebug(debug, 'patched window.ZenPay');\n\treturn true;\n}\n\nexport function installZenPayAutoPatch(\n\tobserver: Pick<Observer, 'sessionId' | 'correlationId' | 'shortcode' | 'emit'>,\n\toptions: AutoPatchOptions = {},\n): AutoPatchHandle {\n\tif (typeof window === 'undefined') {\n\t\treturn { uninstall() {}, isPatched: () => false };\n\t}\n\n\tconst pollIntervalMs = options.pollIntervalMs ?? 200;\n\tconst pollTimeoutMs = options.pollTimeoutMs ?? 30_000;\n\tconst chainExisting = options.chainExisting !== false;\n\tconst debug = options.debug === true;\n\n\tlet patched = false;\n\tconst shortcode = observer.shortcode;\n\tconst w = window as unknown as { jQuery?: JQueryLike; $?: JQueryLike };\n\n\tconst emitHppInit = () => {\n\t\tobserver.emit({\n\t\t\tkind: 'payment.hpp_init',\n\t\t\tsessionId: observer.sessionId,\n\t\t\tcorrelationId: observer.correlationId,\n\t\t\ttimestamp: Date.now(),\n\t\t\tmetadata: {},\n\t\t});\n\t};\n\n\tconst tryPatch = (): boolean => {\n\t\tlet didSomething = false;\n\n\t\tconst jq = w.jQuery ?? w.$;\n\t\tif (jq && typeof jq === 'object' && 'fn' in jq) {\n\t\t\tif (patchJQueryPlugin(jq, shortcode, chainExisting, debug, emitHppInit)) didSomething = true;\n\t\t}\n\n\t\tif ('ZenPay' in window) {\n\t\t\tif (patchZenPayGlobal(shortcode, chainExisting, debug, emitHppInit)) didSomething = true;\n\t\t}\n\n\t\tif (didSomething) patched = true;\n\t\treturn didSomething;\n\t};\n\n\ttryPatch();\n\n\tconst startedAt = Date.now();\n\tlet pollTimer: ReturnType<typeof setInterval> | null = setInterval(() => {\n\t\tif (Date.now() - startedAt > pollTimeoutMs) {\n\t\t\tif (pollTimer !== null) {\n\t\t\t\tclearInterval(pollTimer);\n\t\t\t\tpollTimer = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\ttryPatch();\n\t}, pollIntervalMs);\n\n\treturn {\n\t\tuninstall() {\n\t\t\tif (pollTimer !== null) {\n\t\t\t\tclearInterval(pollTimer);\n\t\t\t\tpollTimer = null;\n\t\t\t}\n\t\t},\n\t\tisPatched: () => patched,\n\t};\n}\n", "/**\n * HPP-TS observation bridge \u2014 wraps `window.onPaymentPluginLoaded`.\n *\n * HPP-TS v5 exposes `window.onPaymentPluginLoaded` (lines 794-823) as a\n * callback that fires when the payment iframe has loaded. This bridge wraps\n * it to emit `payment.hpp_iframe_loaded` through the observer without\n * modifying HPP-TS source.\n */\nimport type { Observer } from '../core/types.js';\n\nexport function installHPPBridge(\n\tobserver: Pick<Observer, 'sessionId' | 'correlationId' | 'emit'>,\n): { uninstall(): void } {\n\tif (typeof window === 'undefined') {\n\t\treturn { uninstall() {} };\n\t}\n\n\tconst w = window as unknown as {\n\t\tonPaymentPluginLoaded?: (() => void) | null;\n\t};\n\n\tconst original = w.onPaymentPluginLoaded;\n\n\tconst wrapper = () => {\n\t\ttry {\n\t\t\tobserver.emit({\n\t\t\t\tkind: 'payment.hpp_iframe_loaded',\n\t\t\t\tsessionId: observer.sessionId,\n\t\t\t\tcorrelationId: observer.correlationId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tmetadata: {},\n\t\t\t});\n\t\t} catch {\n\t\t\t// Don't let observer emit errors block the original callback.\n\t\t}\n\n\t\tif (typeof original === 'function') {\n\t\t\ttry {\n\t\t\t\toriginal();\n\t\t\t} catch {\n\t\t\t\t// Don't let a broken original callback block the observer.\n\t\t\t}\n\t\t}\n\t};\n\n\tw.onPaymentPluginLoaded = wrapper;\n\n\treturn {\n\t\tuninstall() {\n\t\t\tw.onPaymentPluginLoaded = original ?? null;\n\t\t},\n\t};\n}\n", "/**\n * DEVICEFP \u2192 OBSERVER bridge.\n *\n * Returns typed hook functions that the integrator spreads into DEVICEFP's\n * `captureThumbmark()` options. Each hook emits a domain event through the\n * observer and then calls the original integrator callback (if provided).\n *\n * Usage:\n * const bridge = installDeviceFPBridge(observer);\n * await captureThumbmark({\n * apiKey: '...',\n * onSuccess: bridge.onSucceeded,\n * onError: bridge.onFailed,\n * onCacheHit: bridge.onCacheHit,\n * });\n */\n\nimport type { Observer } from '../core/types.js';\n\nexport interface DeviceFPBridgeOptions {\n\tonFingerprintStarted?: (attempt: number) => void;\n\tonFingerprintCacheHit?: (age: number) => void;\n\tonFingerprintSucceeded?: () => void;\n\tonFingerprintFailed?: (error: string, attempt: number) => void;\n}\n\nexport interface DeviceFPHooks {\n\tonFingerprintStarted: (attempt: number) => void;\n\tonFingerprintCacheHit: (age: number) => void;\n\tonFingerprintSucceeded: () => void;\n\tonFingerprintFailed: (error: string, attempt: number) => void;\n}\n\nexport function installDeviceFPBridge(\n\tobserver: Pick<Observer, 'sessionId' | 'correlationId' | 'emit'>,\n\toptions: DeviceFPBridgeOptions = {},\n): DeviceFPHooks {\n\tconst emit = observer.emit.bind(observer);\n\tconst { sessionId, correlationId } = observer;\n\n\treturn {\n\t\tonFingerprintStarted(attempt: number) {\n\t\t\temit({\n\t\t\t\tkind: 'payment.fingerprint_started',\n\t\t\t\tsessionId,\n\t\t\t\tcorrelationId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tattempt,\n\t\t\t\tmetadata: {},\n\t\t\t});\n\t\t\toptions.onFingerprintStarted?.(attempt);\n\t\t},\n\n\t\tonFingerprintCacheHit(age: number) {\n\t\t\temit({\n\t\t\t\tkind: 'payment.fingerprint_cache_hit',\n\t\t\t\tsessionId,\n\t\t\t\tcorrelationId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tage,\n\t\t\t\tmetadata: {},\n\t\t\t});\n\t\t\toptions.onFingerprintCacheHit?.(age);\n\t\t},\n\n\t\tonFingerprintSucceeded() {\n\t\t\temit({\n\t\t\t\tkind: 'payment.fingerprint_succeeded',\n\t\t\t\tsessionId,\n\t\t\t\tcorrelationId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tmetadata: {},\n\t\t\t});\n\t\t\toptions.onFingerprintSucceeded?.();\n\t\t},\n\n\t\tonFingerprintFailed(error: string, attempt: number) {\n\t\t\temit({\n\t\t\t\tkind: 'payment.fingerprint_failed',\n\t\t\t\tsessionId,\n\t\t\t\tcorrelationId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\terror,\n\t\t\t\tattempt,\n\t\t\t\tmetadata: {},\n\t\t\t});\n\t\t\toptions.onFingerprintFailed?.(error, attempt);\n\t\t},\n\t};\n}\n", "/**\n * Merchant-facing preflight validator.\n *\n * Sends a single `payment.preflight` event to the configured transport,\n * checks CORS, response code, latency, and reports structural errors.\n * Integrators print the report during development to verify their\n * telemetry pipeline is wired correctly.\n */\n\nimport type { ObserverEvent, PreflightReport, Transport } from '../core/types.js';\n\ninterface PreflightOptions {\n\ttransport: Transport;\n\t/** Optional sample event data to include in validation. */\n\tsample?: Partial<ObserverEvent>;\n}\n\nexport async function preflight(options: PreflightOptions): Promise<PreflightReport> {\n\tconst { transport, sample } = options;\n\n\tconst sampleEvent: ObserverEvent = {\n\t\tkind: 'payment.preflight',\n\t\tsessionId: sample?.sessionId ?? '__preflight__',\n\t\tcorrelationId: sample?.correlationId ?? '__preflight_cid__',\n\t\ttimestamp: Date.now(),\n\t\tmetadata: sample?.metadata ?? {},\n\t};\n\n\tconst startedAt = performance.now();\n\tlet status: number | undefined;\n\tlet corsError = false;\n\tlet networkError: string | null = null;\n\tconst beaconSupported = typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\n\n\ttry {\n\t\tconst result = await transport.send(sampleEvent);\n\t\tstatus = result.status;\n\t\tif (!result.ok && result.status === undefined) {\n\t\t\tnetworkError = 'Transport returned ok:false with no status (possible CORS or network block)';\n\t\t}\n\t} catch (err) {\n\t\tnetworkError = err instanceof Error ? err.message : 'Unknown transport error';\n\t\tif (networkError.toLowerCase().includes('cors') || networkError.toLowerCase().includes('networkerror')) {\n\t\t\tcorsError = true;\n\t\t}\n\t}\n\n\tconst latencyMs = Math.round(performance.now() - startedAt);\n\n\treturn {\n\t\tok: status !== undefined && status >= 200 && status < 300 && networkError === null,\n\t\tendpoint: 'transport.send',\n\t\tstatus,\n\t\tlatencyMs,\n\t\tcorsError,\n\t\tnetworkError,\n\t\tbeaconSupported,\n\t};\n}\n", "/**\n * Cross-page outcome reporting.\n *\n * The merchant's \"thank you\" / \"decline\" / \"error\" page is the authoritative\n * outcome source. `reportOutcome` sends a single `payment.outcome` event\n * without needing a live Observer instance \u2014 just enough to POST the result.\n *\n * Convention: the HPP backend forwards `correlationId` in the redirect URL\n * as `?cid=<uuid>`. The return page reads it and calls `reportOutcome`.\n */\n\nimport type { PaymentOutcome, Transport } from './core/types.js';\n\nexport interface ReportOutcomeOptions {\n\tcorrelationId: string;\n\tsessionId: string;\n\toutcome: PaymentOutcome;\n\ttransport: Transport;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport function reportOutcome(options: ReportOutcomeOptions): void {\n\tconst { correlationId, sessionId, outcome, transport, metadata } = options;\n\n\tconst event = {\n\t\tkind: 'payment.outcome' as const,\n\t\tsessionId,\n\t\tcorrelationId,\n\t\ttimestamp: Date.now(),\n\t\toutcome,\n\t\tmetadata: metadata ?? {},\n\t};\n\n\tvoid transport.send(event);\n}\n", "/**\n * Shared types for @ianmenethil/zp-observer\n *\n * v6 extends the three-event telemetry model (open / heartbeat / close) into a\n * domain event bus that carries signal from the full payment stack: device\n * fingerprint, HPP lifecycle, and merchant-reported outcomes \u2014 all correlated\n * by a single `correlationId`.\n */\n\nexport const VERSION = '6.0.0' as const;\n\n// ---- Close reasons (unchanged) -------------------------------------------\n\nexport type CloseReason =\n\t| 'user.callback_invoked'\n\t| 'user.modal_closed'\n\t| 'user.manual_close'\n\t| 'system.idle_timeout'\n\t| 'system.network_abandoned'\n\t| 'page.pagehide';\n\n// ---- Payment outcome -----------------------------------------------------\n\nexport type PaymentOutcome = 'success' | 'declined' | 'abandoned' | 'error' | 'unknown';\n\n// ---- Open event ----------------------------------------------------------\n\nexport interface OpenEvent {\n\tkind: 'open';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tiframeSrc: string | null;\n\tuserAgent: string;\n\tscreenWidth: number;\n\tscreenHeight: number;\n\tnavigationType: string | null;\n\tmetadata: Record<string, unknown>;\n\tuserActivation?: { hasBeenActive: boolean; isActive: boolean };\n\tnavigationDetail?: {\n\t\twasDiscarded: boolean | null;\n\t\tredirectCount: number | null;\n\t\ttransferSize: number | null;\n\t\ttype: string | null;\n\t};\n}\n\n// ---- Heartbeat event -----------------------------------------------------\n\nexport interface HeartbeatEvent {\n\tkind: 'heartbeat';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tsequence: number;\n\tmissedBeats: number;\n\tmetadata: Record<string, unknown>;\n}\n\n// ---- Close event ---------------------------------------------------------\n\nexport interface CloseEvent {\n\tkind: 'close';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\treason: CloseReason;\n\telapsedMs: number;\n\theartbeatCount: number;\n\tmissedBeats: number;\n\twasPersisted: boolean | null;\n\tmetadata: Record<string, unknown>;\n}\n\n// ---- Domain events (new in v6) -------------------------------------------\n\nexport interface SessionInitEvent {\n\tkind: 'payment.session_init';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface FingerprintStartedEvent {\n\tkind: 'payment.fingerprint_started';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tattempt: number;\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface FingerprintCacheHitEvent {\n\tkind: 'payment.fingerprint_cache_hit';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tage: number;\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface FingerprintSucceededEvent {\n\tkind: 'payment.fingerprint_succeeded';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface FingerprintFailedEvent {\n\tkind: 'payment.fingerprint_failed';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\terror: string;\n\tattempt: number;\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface HppInitEvent {\n\tkind: 'payment.hpp_init';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface HppIframeLoadedEvent {\n\tkind: 'payment.hpp_iframe_loaded';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface HppConfigInvalidEvent {\n\tkind: 'payment.hpp_config_invalid';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\terrors: string[];\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface ModalOpenedEvent {\n\tkind: 'payment.modal_opened';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tiframeSrc: string | null;\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface OutcomeEvent {\n\tkind: 'payment.outcome';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\toutcome: PaymentOutcome;\n\tmetadata: Record<string, unknown>;\n}\n\nexport interface PreflightEvent {\n\tkind: 'payment.preflight';\n\tsessionId: string;\n\tcorrelationId: string;\n\ttimestamp: number;\n\tmetadata: Record<string, unknown>;\n}\n\n// ---- ObserverEvent union -------------------------------------------------\n\nexport type ObserverEvent =\n\t| OpenEvent\n\t| HeartbeatEvent\n\t| CloseEvent\n\t| SessionInitEvent\n\t| FingerprintStartedEvent\n\t| FingerprintCacheHitEvent\n\t| FingerprintSucceededEvent\n\t| FingerprintFailedEvent\n\t| HppInitEvent\n\t| HppIframeLoadedEvent\n\t| HppConfigInvalidEvent\n\t| ModalOpenedEvent\n\t| OutcomeEvent\n\t| PreflightEvent;\n\n// ---- Diagnostic events ---------------------------------------------------\n\nexport type DiagnosticEvent =\n\t| { kind: 'exp.pageshow'; persisted: boolean; navigationType: string | null; timestamp: number }\n\t| { kind: 'exp.freeze'; timestamp: number }\n\t| { kind: 'exp.resume'; timestamp: number }\n\t| { kind: 'exp.window_focus'; timestamp: number }\n\t| { kind: 'exp.window_blur'; timestamp: number }\n\t| {\n\t\t\tkind: 'exp.visibility_detail';\n\t\t\tprevState: string;\n\t\t\tcurrState: string;\n\t\t\tprevStateDurationMs: number;\n\t\t\thasFocus: boolean | null;\n\t\t\tonLine: boolean | null;\n\t\t\ttimestamp: number;\n\t }\n\t| {\n\t\t\tkind: 'exp.perf_entry';\n\t\t\tentryType: string;\n\t\t\tname: string;\n\t\t\tstartTime: number;\n\t\t\tduration?: number;\n\t\t\tsize?: number;\n\t\t\turl?: string;\n\t\t\ttimestamp: number;\n\t }\n\t| { kind: 'exp.iframe_resize'; width: number; height: number; timestamp: number }\n\t| {\n\t\t\tkind: 'exp.iframe_src';\n\t\t\tpreviousSrc: string | null;\n\t\t\tcurrentSrc: string;\n\t\t\ttimestamp: number;\n\t }\n\t| {\n\t\t\tkind: 'exp.page_lifecycle_beacon';\n\t\t\tphase: 'navigation' | 'pageshow' | 'pagehide';\n\t\t\tok: boolean;\n\t\t\ttimestamp: number;\n\t }\n\t| { kind: 'exp.was_discarded'; wasDiscarded: boolean | null; timestamp: number }\n\t| { kind: 'system.persistence_unavailable'; error: string; timestamp: number };\n\n// ---- Experimental options ------------------------------------------------\n\nexport interface ExperimentalOptions {\n\tcaptureUserActivation?: boolean;\n\tcaptureNavigationTimingDetail?: boolean;\n\tcaptureWasDiscarded?: boolean;\n\tcapturePageShow?: boolean;\n\tcaptureWindowFocus?: boolean;\n\tcaptureVisibilityDetail?: boolean;\n\tcaptureFreezeResume?: boolean;\n\tcapturePerformanceEntries?: boolean;\n\tperfEntryTypes?: readonly ('longtask' | 'largest-contentful-paint')[];\n\tcaptureIframeResize?: boolean;\n\tcaptureIframeSrcChanges?: boolean;\n\tpageLifecycleBeaconUrl?: string;\n\tattachDiagnosticsToHeartbeat?: boolean;\n\tdiagnosticsMax?: number;\n}\n\n// ---- Transport -----------------------------------------------------------\n\nexport interface TransportResult {\n\tok: boolean;\n\tstatus?: number;\n}\n\nexport interface Transport {\n\t/** Generic write path \u2014 handles any ObserverEvent. */\n\tsend(event: ObserverEvent): Promise<TransportResult>;\n\n\t/** Fire-and-forget delegator for open events. */\n\tsendOpen(event: OpenEvent): void;\n\n\t/** Response-aware delegator for heartbeats. */\n\tsendHeartbeat(event: HeartbeatEvent): Promise<TransportResult>;\n\n\t/** Dismissal-safe delegator for close events. */\n\tsendClose(event: CloseEvent): void;\n}\n\n// ---- Observer state ------------------------------------------------------\n\nexport type UIState =\n\t| 'IDLE'\n\t| 'DETECTING'\n\t| 'ACTIVE_MODAL_VISIBLE'\n\t| 'BACKGROUND_HIDDEN'\n\t| 'DISMISSED';\n\nexport type TransportState =\n\t| 'CONNECTED'\n\t| 'HEARTBEAT_LATE'\n\t| 'DISCONNECTED';\n\nexport interface ObserverState {\n\tui: UIState;\n\ttransport: TransportState;\n\tsessionId: string;\n\tcorrelationId: string;\n\tshortcode: string;\n\tisActive: boolean;\n\tiframeDetected: boolean;\n\theartbeatCount: number;\n\tmissedBeats: number;\n\telapsedMs: number;\n}\n\n// ---- Persistence ---------------------------------------------------------\n\nexport type PersistenceMode = 'memory' | 'localStorage';\n\n// ---- Observer diagnostics ------------------------------------------------\n\nexport interface DiagnosticDump {\n\tsessionId: string;\n\tcorrelationId: string;\n\tstate: ObserverState;\n\trecentEvents: ObserverEvent[];\n\tdiagnostics: DiagnosticEvent[];\n\tconfiguredTransport: string;\n\tversion: string;\n}\n\nexport interface ObserverDiagnostics {\n\tdump(): DiagnosticDump;\n}\n\n// ---- Observer ------------------------------------------------------------\n\nexport interface Observer {\n\treadonly sessionId: string;\n\treadonly correlationId: string;\n\treadonly shortcode: string;\n\treadonly diagnostics: ObserverDiagnostics;\n\n\tstart(): void;\n\tstop(reason?: CloseReason): void;\n\tgetState(): ObserverState;\n\n\t/** Push a domain event onto the bus and through the transport. */\n\temit(event: ObserverEvent): void;\n}\n\n// ---- CreateObserver options ----------------------------------------------\n\nexport interface CreateObserverOptions {\n\tsessionId: string;\n\ttransport: Transport;\n\tcorrelationId?: string;\n\tmetadata?: Record<string, unknown>;\n\tbeforeSend?: (event: ObserverEvent) => ObserverEvent | null;\n\theartbeatMs?: number;\n\theartbeatMissThreshold?: number;\n\tidleTimeoutMs?: number;\n\tdetectionIntervalMs?: number;\n\tdetectionTimeoutMs?: number;\n\tiframeSelectors?: string[];\n\tdebug?: boolean;\n\texperimental?: ExperimentalOptions;\n\tonDiagnostic?: (event: DiagnosticEvent) => void;\n\tpersistence?: PersistenceMode;\n}\n\n// ---- Preflight -----------------------------------------------------------\n\nexport interface PreflightReport {\n\tok: boolean;\n\tendpoint: string;\n\tstatus: number | undefined;\n\tlatencyMs: number;\n\tcorsError: boolean;\n\tnetworkError: string | null;\n\tbeaconSupported: boolean;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACcO,IAAM,2BAA2B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAiBO,SAAS,eACf,OACA,MAKkB;AAClB,MAAI,OAAO,aAAa,aAAa;AACpC,WAAO,EAAE,OAAO;AAAA,IAAC,EAAE;AAAA,EACpB;AAEA,MAAI,UAAU;AACd,MAAI,YAAmD;AACvD,MAAI,mBAA4C;AAChD,MAAI,mBAAgD;AACpD,QAAM,YAAY,KAAK,IAAI;AAE3B,QAAM,aAAa,MAAgC;AAClD,eAAW,YAAY,KAAK,WAAW;AACtC,YAAM,KAAK,SAAS,cAAc,QAAQ;AAC1C,UAAI,cAAc,kBAAmB,QAAO;AAAA,IAC7C;AACA,WAAO;AAAA,EACR;AAEA,QAAM,cAAc,MAAM;AACzB,QAAI,cAAc,MAAM;AACvB,oBAAc,SAAS;AACvB,kBAAY;AAAA,IACb;AAAA,EACD;AAEA,QAAM,kBAAkB,CAAC,WAA8B;AACtD,QAAI,OAAO,qBAAqB,eAAe,CAAC,SAAS,KAAM;AAE/D,uBAAmB,IAAI,iBAAiB,CAAC,cAAc;AACtD,iBAAW,KAAK,WAAW;AAC1B,mBAAW,QAAQ,MAAM,KAAK,EAAE,YAAY,GAAG;AAC9C,cAAI,SAAS,UAAW,gBAAgB,QAAQ,KAAK,SAAS,MAAM,GAAI;AACvE,kBAAM,UAAU;AAChB;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC;AAED,qBAAiB,QAAQ,SAAS,MAAM,EAAE,WAAW,MAAM,SAAS,KAAK,CAAC;AAAA,EAC3E;AAEA,QAAM,sBAAsB,MAAM;AAGjC,QAAI,OAAO,SAAS,qBAAqB,WAAY;AAErD,uBAAmB,MAAM,MAAM,kBAAkB;AAGjD,aAAS,iBAAiB,mBAA8B,kBAAkB,IAAI;AAAA,EAC/E;AAEA,QAAM,UAAU,CAAC,WAA8B;AAC9C,gBAAY;AACZ,oBAAgB,MAAM;AACtB,wBAAoB;AACpB,UAAM,QAAQ,MAAM;AAAA,EACrB;AAGA,QAAM,WAAW,WAAW;AAC5B,MAAI,UAAU;AACb,mBAAe,MAAM;AACpB,UAAI,CAAC,QAAS,SAAQ,QAAQ;AAAA,IAC/B,CAAC;AAAA,EACF,OAAO;AACN,gBAAY,YAAY,MAAM;AAC7B,UAAI,QAAS;AACb,UAAI,KAAK,IAAI,IAAI,YAAY,KAAK,WAAW;AAC5C,oBAAY;AACZ,cAAM,UAAU;AAChB;AAAA,MACD;AACA,YAAM,QAAQ,WAAW;AACzB,UAAI,MAAO,SAAQ,KAAK;AAAA,IACzB,GAAG,KAAK,UAAU;AAAA,EACnB;AAEA,SAAO;AAAA,IACN,OAAO;AACN,gBAAU;AACV,kBAAY;AACZ,UAAI,kBAAkB;AACrB,yBAAiB,WAAW;AAC5B,2BAAmB;AAAA,MACpB;AACA,UAAI,kBAAkB;AACrB,iBAAS;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACD;AACA,2BAAmB;AAAA,MACpB;AAAA,IACD;AAAA,EACD;AACD;;;ACzIA,IAAM,YAAY;AAEX,SAAS,eAAe,KAAa,MAAwB;AACnE,MAAI,OAAO,cAAc,eAAe,OAAO,UAAU,eAAe,YAAY;AACnF,WAAO;AAAA,EACR;AACA,MAAI;AACH,UAAM,OAAO,IAAI,KAAK,CAAC,KAAK,UAAU,IAAI,CAAC,GAAG,EAAE,MAAM,UAAU,CAAC;AACjE,WAAO,UAAU,WAAW,KAAK,IAAI;AAAA,EACtC,QAAQ;AACP,WAAO;AAAA,EACR;AACD;;;ACRO,SAAS,8BAA8B,KAAoC;AACjF,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,CAAC,EACP,IAAI,0BACJ,IAAI,uBACJ,IAAI,mBACJ,IAAI,sBACJ,IAAI,2BACJ,IAAI,uBACJ,IAAI;AAEN;AAEO,SAAS,8BAA8B,KAAoC;AACjF,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,CAAC,EAAE,IAAI,uBAAuB,IAAI;AAC1C;AAEA,SAAS,QAAQ,UAAmB,MAAuB;AAC1D,MAAI,SAAS,OAAO,YAAY,aAAa;AAC5C,YAAQ,IAAI,6BAA6B,GAAG,IAAI;AAAA,EACjD;AACD;AAEA,SAAS,wBAEI;AACZ,MAAI;AACH,UAAM,KAAK,OAAO,cAAc,cAAc,UAAU,iBAAiB;AACzE,QAAI,CAAC,GAAI,QAAO;AAChB,WAAO;AAAA,MACN,eAAe,GAAG,iBAAiB;AAAA,MACnC,UAAU,GAAG,YAAY;AAAA,IAC1B;AAAA,EACD,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,uBAKA;AACR,MAAI;AACH,UAAM,UAAU,YAAY,iBAAiB,YAAY;AACzD,UAAM,MAAM,QAAQ,CAAC;AACrB,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,eACL,kBAAkB,MAAM,QAAS,IAAiE,YAAY,IAAI;AACnH,WAAO;AAAA,MACN;AAAA,MACA,eAAe,IAAI,iBAAiB;AAAA,MACpC,cAAc,IAAI,gBAAgB;AAAA,MAClC,MAAM,IAAI,QAAQ;AAAA,IACnB;AAAA,EACD,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEO,SAAS,2BACf,KASC;AACD,MAAI,CAAC,IAAK,QAAO,CAAC;AAClB,QAAM,MAQF,CAAC;AACL,MAAI,IAAI,uBAAuB;AAC9B,UAAM,KAAK,sBAAsB;AACjC,QAAI,GAAI,KAAI,iBAAiB;AAAA,EAC9B;AACA,MAAI,IAAI,+BAA+B;AACtC,UAAM,MAAM,qBAAqB;AACjC,QAAI,IAAK,KAAI,mBAAmB;AAAA,EACjC;AACA,SAAO;AACR;AAUO,SAAS,0BAA0B,KAAmD;AAC5F,QAAM,EAAE,cAAc,KAAK,cAAc,OAAO,WAAW,mBAAAA,mBAAkB,IAAI;AACjF,QAAM,QAA2B,CAAC;AAElC,QAAM,YAAY,IAAI;AACtB,QAAM,aAAa,CAAC,OAA+C,UAAmC;AACrG,QAAI,CAAC,UAAW;AAChB,UAAM,UAAU,EAAE,OAAO,WAAW,WAAW,KAAK,IAAI,GAAG,GAAG,MAAM;AACpE,UAAM,KAAK,eAAe,WAAW,OAAO;AAC5C,iBAAa,EAAE,MAAM,6BAA6B,OAAO,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;AACpF,YAAQ,OAAO,uBAAuB,OAAO,EAAE;AAAA,EAChD;AAEA,MAAI,WAAW;AACd,eAAW,cAAc,EAAE,SAASA,mBAAkB,EAAE,CAAC;AAAA,EAC1D;AAEA,MAAI,IAAI,qBAAqB;AAC5B,UAAM,MAAM,qBAAqB;AACjC,UAAM,eAAe,KAAK,gBAAgB;AAC1C,iBAAa,EAAE,MAAM,qBAAqB,cAAc,WAAW,KAAK,IAAI,EAAE,CAAC;AAC/E,YAAQ,OAAO,gBAAgB,YAAY;AAAA,EAC5C;AAEA,OAAK,IAAI,mBAAmB,cAAc,OAAO,WAAW,aAAa;AACxE,UAAM,UAAU,CAAC,OAA4B;AAC5C,YAAM,YAAY,GAAG,cAAc;AACnC,UAAI,IAAI,iBAAiB;AACxB,qBAAa;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,UACA,gBAAgBA,mBAAkB;AAAA,UAClC,WAAW,KAAK,IAAI;AAAA,QACrB,CAAC;AACD,gBAAQ,OAAO,YAAY,EAAE,UAAU,CAAC;AAAA,MACzC;AACA,UAAI,UAAW,YAAW,YAAY,EAAE,UAAU,CAAC;AAAA,IACpD;AACA,WAAO,iBAAiB,YAAY,SAAS,EAAE,SAAS,KAAK,CAAC;AAC9D,UAAM,KAAK,MAAM,OAAO,oBAAoB,YAAY,OAAO,CAAC;AAAA,EACjE;AAEA,MAAI,aAAa,OAAO,WAAW,aAAa;AAC/C,UAAM,KAAK,CAAC,OAA4B;AACvC,iBAAW,YAAY,EAAE,WAAW,GAAG,cAAc,KAAK,CAAC;AAAA,IAC5D;AACA,WAAO,iBAAiB,YAAY,IAAI,EAAE,SAAS,KAAK,CAAC;AACzD,UAAM,KAAK,MAAM,OAAO,oBAAoB,YAAY,EAAE,CAAC;AAAA,EAC5D;AAEA,MAAI,IAAI,sBAAsB,OAAO,WAAW,aAAa;AAC5D,UAAM,MAAM,MAAM;AACjB,mBAAa,EAAE,MAAM,oBAAoB,WAAW,KAAK,IAAI,EAAE,CAAC;AAChE,cAAQ,OAAO,cAAc;AAAA,IAC9B;AACA,UAAM,MAAM,MAAM;AACjB,mBAAa,EAAE,MAAM,mBAAmB,WAAW,KAAK,IAAI,EAAE,CAAC;AAC/D,cAAQ,OAAO,aAAa;AAAA,IAC7B;AACA,WAAO,iBAAiB,SAAS,KAAK,EAAE,SAAS,KAAK,CAAC;AACvD,WAAO,iBAAiB,QAAQ,KAAK,EAAE,SAAS,KAAK,CAAC;AACtD,UAAM,KAAK,MAAM;AAChB,aAAO,oBAAoB,SAAS,GAAG;AACvC,aAAO,oBAAoB,QAAQ,GAAG;AAAA,IACvC,CAAC;AAAA,EACF;AAEA,MAAI,IAAI,2BAA2B,OAAO,aAAa,aAAa;AACnE,QAAI,YAAY,SAAS,mBAAmB;AAC5C,QAAI,eAAe,KAAK,IAAI;AAC5B,UAAM,UAAU,MAAM;AACrB,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,OAAO,SAAS,mBAAmB;AACzC,YAAM,OAAO;AACb,kBAAY;AACZ,YAAM,UAAU,MAAM;AACtB,qBAAe;AACf,YAAM,WACL,OAAO,SAAS,aAAa,aAAa,SAAS,SAAS,IAAI;AACjE,YAAM,SACL,OAAO,cAAc,eAAe,OAAO,UAAU,WAAW,YAC7D,UAAU,SACV;AACJ,mBAAa;AAAA,QACZ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,WAAW;AAAA,QACX,qBAAqB;AAAA,QACrB;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACZ,CAAC;AACD,cAAQ,OAAO,qBAAqB,EAAE,MAAM,MAAM,UAAU,OAAO,CAAC;AAAA,IACrE;AACA,aAAS,iBAAiB,oBAAoB,SAAS,EAAE,SAAS,KAAK,CAAC;AACxE,UAAM,KAAK,MAAM,SAAS,oBAAoB,oBAAoB,OAAO,CAAC;AAAA,EAC3E;AAEA,MAAI,IAAI,uBAAuB,OAAO,aAAa,aAAa;AAC/D,UAAM,WAAW,MAAM;AACtB,mBAAa,EAAE,MAAM,cAAc,WAAW,KAAK,IAAI,EAAE,CAAC;AAC1D,cAAQ,OAAO,QAAQ;AAAA,IACxB;AACA,UAAM,WAAW,MAAM;AACtB,mBAAa,EAAE,MAAM,cAAc,WAAW,KAAK,IAAI,EAAE,CAAC;AAC1D,cAAQ,OAAO,QAAQ;AAAA,IACxB;AACA,QAAI;AACH,eAAS,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC/D,eAAS,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC/D,YAAM,KAAK,MAAM;AAChB,iBAAS,oBAAoB,UAAU,QAAQ;AAC/C,iBAAS,oBAAoB,UAAU,QAAQ;AAAA,MAChD,CAAC;AAAA,IACF,QAAQ;AACP,cAAQ,OAAO,6BAA6B;AAAA,IAC7C;AAAA,EACD;AAEA,MAAI,IAAI,6BAA6B,OAAO,wBAAwB,aAAa;AAChF,UAAM,QAAQ,IAAI,kBAAkB,CAAC,YAAY,0BAA0B;AAC3E,UAAM,WAAW,CAAC,UAA4B;AAC7C,UAAI,MAAM,cAAc,YAAY;AACnC,qBAAa;AAAA,UACZ,MAAM;AAAA,UACN,WAAW,MAAM;AAAA,UACjB,MAAM,MAAM;AAAA,UACZ,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM;AAAA,UAChB,WAAW,KAAK,IAAI;AAAA,QACrB,CAAC;AAAA,MACF,WAAW,MAAM,cAAc,4BAA4B;AAC3D,cAAM,MAAM;AACZ,qBAAa;AAAA,UACZ,MAAM;AAAA,UACN,WAAW,MAAM;AAAA,UACjB,MAAM,MAAM;AAAA,UACZ,WAAW,MAAM;AAAA,UACjB,GAAI,IAAI,SAAS,UAAa,EAAE,MAAM,IAAI,KAAK;AAAA,UAC/C,GAAI,IAAI,QAAQ,UAAa,EAAE,KAAK,IAAI,IAAI;AAAA,UAC5C,WAAW,KAAK,IAAI;AAAA,QACrB,CAAC;AAAA,MACD,OAAO;AACN,qBAAa;AAAA,UACZ,MAAM;AAAA,UACN,WAAW,MAAM;AAAA,UACjB,MAAM,MAAM;AAAA,UACZ,WAAW,MAAM;AAAA,UACjB,WAAW,KAAK,IAAI;AAAA,QACrB,CAAC;AAAA,MACF;AACA,cAAQ,OAAO,QAAQ,MAAM,WAAW,MAAM,IAAI;AAAA,IACnD;AACA,eAAW,KAAK,OAAO;AACtB,UAAI;AACH,cAAM,MAAM,IAAI,oBAAoB,CAAC,SAAS;AAC7C,qBAAW,SAAS,KAAK,WAAW,EAAG,UAAS,KAAK;AAAA,QACtD,CAAC;AACD,YAAI;AACH,cAAI,QAAQ,EAAE,MAAM,GAAG,UAAU,KAAK,CAAC;AAAA,QACxC,QAAQ;AACP,cAAI,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;AAAA,QAChC;AACA,cAAM,KAAK,MAAM,IAAI,WAAW,CAAC;AAAA,MAClC,SAAS,KAAK;AACb,gBAAQ,OAAO,kCAAkC,GAAG,GAAG;AAAA,MACxD;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AAAA,IACN,OAAO;AACN,iBAAW,KAAK,MAAO,GAAE;AAAA,IAC1B;AAAA,EACD;AACD;AAEO,SAAS,0BACf,QACA,KACmB;AACnB,QAAM,EAAE,cAAc,KAAK,cAAc,MAAM,IAAI;AACnD,QAAM,QAA2B,CAAC;AAElC,MAAI,IAAI,uBAAuB,OAAO,mBAAmB,aAAa;AACrE,UAAM,KAAK,IAAI,eAAe,CAAC,YAAY;AAC1C,YAAM,IAAI,QAAQ,QAAQ,SAAS,CAAC;AACpC,UAAI,CAAC,EAAG;AACR,YAAM,EAAE,OAAO,OAAO,IAAI,EAAE;AAC5B,mBAAa;AAAA,QACZ,MAAM;AAAA,QACN,OAAO,KAAK,MAAM,KAAK;AAAA,QACvB,QAAQ,KAAK,MAAM,MAAM;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACrB,CAAC;AACD,cAAQ,OAAO,iBAAiB,OAAO,MAAM;AAAA,IAC9C,CAAC;AACD,OAAG,QAAQ,MAAM;AACjB,UAAM,KAAK,MAAM,GAAG,WAAW,CAAC;AAAA,EACjC;AAEA,MAAI,IAAI,2BAA2B,OAAO,qBAAqB,aAAa;AAC3E,QAAI,OAAO,OAAO,OAAO;AACzB,UAAM,KAAK,IAAI,iBAAiB,MAAM;AACrC,YAAM,MAAM,OAAO,OAAO;AAC1B,UAAI,QAAQ,MAAM;AACjB,qBAAa;AAAA,UACZ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,UACZ,WAAW,KAAK,IAAI;AAAA,QACrB,CAAC;AACD,gBAAQ,OAAO,cAAc,MAAM,GAAG;AACtC,eAAO,OAAO;AAAA,MACf;AAAA,IACD,CAAC;AACD,OAAG,QAAQ,QAAQ,EAAE,YAAY,MAAM,iBAAiB,CAAC,KAAK,EAAE,CAAC;AACjE,UAAM,KAAK,MAAM,GAAG,WAAW,CAAC;AAAA,EACjC;AAEA,SAAO;AAAA,IACN,OAAO;AACN,iBAAW,KAAK,MAAO,GAAE;AAAA,IAC1B;AAAA,EACD;AACD;;;ACpTO,SAAS,eACf,WACA,eACA,aACA,QACA,OACA,MAIkB;AAClB,MAAI,WAAW;AACf,MAAI,SAAS;AACb,MAAI,YAAY;AAChB,MAAI,QAA+C;AAEnD,QAAM,OAAO,MAAM;AAClB,QAAI,UAAW;AACf,gBAAY;AAEZ,UAAM,KAAqB;AAAA,MAC1B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,MACA,aAAa;AAAA,MACb,UAAU,YAAY;AAAA,IACvB;AAEA,SAAK,OAAO,cAAc,EAAE,EAAE,KAAK,CAAC,WAAW;AAC9C,UAAI,OAAO,IAAI;AACd,iBAAS;AAAA,MACV,OAAO;AACN,kBAAU;AACV,YAAI,UAAU,KAAK,iBAAiB,CAAC,WAAW;AAC/C,sBAAY;AACZ,gBAAM,YAAY,MAAM;AAAA,QACzB;AAAA,MACD;AACA,YAAM,OAAO,UAAU,MAAM;AAAA,IAC9B,CAAC,EAAE,MAAM,MAAM;AACd,gBAAU;AACV,UAAI,UAAU,KAAK,iBAAiB,CAAC,WAAW;AAC/C,oBAAY;AACZ,cAAM,YAAY,MAAM;AAAA,MACzB;AACA,YAAM,OAAO,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACF;AAEA,UAAQ,YAAY,MAAM,KAAK,UAAU;AAEzC,SAAO;AAAA,IACN,OAAO;AACN,kBAAY;AACZ,UAAI,UAAU,MAAM;AACnB,sBAAc,KAAK;AACnB,gBAAQ;AAAA,MACT;AAAA,IACD;AAAA,IACA,gBAAgB,MAAM;AAAA,IACtB,aAAa,MAAM;AAAA,EACpB;AACD;;;ACrEO,SAAS,qBAAqB,OAAwC;AAC5E,MAAI,OAAO,aAAa,eAAe,OAAO,WAAW,aAAa;AACrE,WAAO,EAAE,OAAO;AAAA,IAAC,EAAE;AAAA,EACpB;AAEA,QAAM,oBAAoB,MAAM;AAC/B,QAAI,SAAS,oBAAoB,SAAU,OAAM,SAAS;AAAA,aACjD,SAAS,oBAAoB,UAAW,OAAM,UAAU;AAAA,EAClE;AAEA,QAAM,kBAAkB,CAAC,UAAiB;AACzC,UAAM,YAAa,MAA8B,cAAc;AAC/D,UAAM,WAAW,SAAS;AAAA,EAC3B;AAEA,WAAS,iBAAiB,oBAAoB,iBAAiB;AAC/D,SAAO,iBAAiB,YAAY,eAAe;AAEnD,SAAO;AAAA,IACN,OAAO;AACN,eAAS,oBAAoB,oBAAoB,iBAAiB;AAClE,aAAO,oBAAoB,YAAY,eAAe;AAAA,IACvD;AAAA,EACD;AACD;AAOO,SAAS,wBACf,QACA,UACmB;AACnB,MAAI,OAAO,yBAAyB,aAAa;AAChD,WAAO,EAAE,OAAO;AAAA,IAAC,EAAE;AAAA,EACpB;AAEA,QAAM,KAAK,IAAI;AAAA,IACd,CAAC,YAAY;AACZ,YAAM,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AACxC,UAAI,MAAO,UAAS,MAAM,cAAc;AAAA,IACzC;AAAA,IACA,EAAE,WAAW,KAAK;AAAA,EACnB;AACA,KAAG,QAAQ,MAAM;AAEjB,SAAO;AAAA,IACN,OAAO;AACN,SAAG,WAAW;AAAA,IACf;AAAA,EACD;AACD;;;ACjEA,IAAM,SAAS;AAGR,SAAS,wBAAgC;AAC/C,QAAM,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE;AAEjC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,oBAAoB,YAAY;AAClF,UAAM,MAAM,IAAI,YAAY,CAAC;AAC7B,WAAO,gBAAgB,GAAG;AAC1B,WAAO,GAAG,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,EAAG,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,EAAG,SAAS,EAAE,CAAC;AAAA,EACrE;AAEA,QAAM,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,UAAU,EAAE,SAAS,EAAE;AAC/D,SAAO,GAAG,MAAM,GAAG,EAAE,IAAI,IAAI;AAC9B;AAGO,SAAS,kBAAkB,MAAc,IAAwB;AACvE,MAAI,OAAO,WAAW,aAAa;AAClC,IAAC,OAA8C,IAAI,IAAI;AAAA,EACxD;AACA,SAAO,UAAU,IAAI;AACtB;AAGO,SAAS,oBAAoB,MAAoB;AACvD,MAAI,OAAO,WAAW,aAAa;AAClC,QAAI;AACH,aAAQ,OAA8C,IAAI;AAAA,IAC3D,QAAQ;AACP,MAAC,OAA8C,IAAI,IAAI;AAAA,IACxD;AAAA,EACD;AACD;;;ACrCA,SAAS,eAAuB;AAE/B,QAAM,MAAM;AACZ,QAAM,WAAW;AACjB,MAAI,SAAS;AACb,aAAW,MAAM,UAAU;AAC1B,QAAI,OAAO,KAAK;AACf,gBAAU;AAAA,IACX,WAAW,OAAO,KAAK;AACtB,gBAAU;AAAA,IACX,WAAW,OAAO,KAAK;AACtB,gBAAU,IAAK,KAAK,OAAO,IAAI,KAAM,CAAC;AAAA,IACvC,OAAO;AACN,gBAAU,IAAK,KAAK,OAAO,IAAI,KAAM,CAAC;AAAA,IACvC;AAAA,EACD;AACA,SAAO;AACR;AAEO,SAAS,eAAuB;AACtC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC7E,WAAO,OAAO,WAAW;AAAA,EAC1B;AACA,SAAO,aAAa;AACrB;;;ACPO,SAAS,eACf,WACA,YACA,QACW;AACX,WAAS,gBAAgB,IAAyC;AACjE,QAAI,CAAC,WAAY,QAAO;AACxB,QAAI;AACH,aAAO,WAAW,EAAE;AAAA,IACrB,QAAQ;AACP,aAAO;AAAA,IACR;AAAA,EACD;AAEA,WAAS,iBAAiB,IAA6C;AACtE,WAAO,UAAU,KAAK,EAAE,EAAE,MAAM,OAAO,EAAE,IAAI,MAAM,EAAE;AAAA,EACtD;AAEA,QAAM,MAAgB;AAAA,IACrB,KAAK,IAAI;AACR,YAAM,WAAW,gBAAgB,EAAE;AACnC,UAAI,CAAC,SAAU;AAEf,UAAI,UAAU,GAAG,SAAS,aAAa;AACtC,eAAO,KAAK,QAAQ;AAAA,MACrB;AAGA,WAAK,iBAAiB,QAAQ,EAAE,KAAK,CAAC,WAAW;AAChD,YAAI,OAAO,MAAM,UAAU,GAAG,SAAS,aAAa;AACnD,iBAAO,OAAO,QAAQ;AAAA,QACvB;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IAEA,MAAM,cAAc,IAAI;AACvB,YAAM,WAAW,gBAAgB,EAAE;AACnC,UAAI,CAAC,SAAU,QAAO,EAAE,IAAI,KAAK;AAEjC,YAAM,SAAS,MAAM,iBAAiB,QAAQ;AAC9C,aAAO;AAAA,IACR;AAAA,IAEA,MAAM,WAAW;AAChB,UAAI,CAAC,OAAQ;AACb,YAAM,UAAU,OAAO,MAAM,SAAS;AACtC,iBAAW,MAAM,SAAS;AACzB,aAAK,iBAAiB,EAAE,EAAE,KAAK,CAAC,WAAW;AAC1C,cAAI,OAAO,GAAI,QAAO,OAAO,EAAE;AAAA,QAChC,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AACR;;;AChEA,IAAM,cAAc;AACpB,IAAM,cAAc;AAcb,SAAS,aACf,eACgB;AAChB,MAAI,OAAO,iBAAiB,aAAa;AACxC,WAAO;AAAA,EACR;AAEA,WAAS,UAAyB;AACjC,QAAI;AACH,YAAM,MAAM,aAAa,QAAQ,WAAW;AAC5C,UAAI,CAAC,IAAK,QAAO,CAAC;AAClB,YAAM,SAAkB,KAAK,MAAM,GAAG;AACtC,UAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,aAAO;AAAA,IACR,QAAQ;AACP,oBAAc,yCAAyC;AACvD,aAAO,CAAC;AAAA,IACT;AAAA,EACD;AAEA,WAAS,SAAS,SAAiC;AAClD,QAAI;AACH,YAAM,UAAU,QAAQ,MAAM,CAAC,WAAW;AAC1C,mBAAa,QAAQ,aAAa,KAAK,UAAU,OAAO,CAAC;AACzD,aAAO;AAAA,IACR,SAAS,KAAK;AACb;AAAA,QACC,eAAe,QAAQ,IAAI,UAAU;AAAA,MACtC;AACA,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AAAA,IACN,KAAK,OAAO;AACX,YAAM,UAAU,QAAQ;AACxB,cAAQ,KAAK,EAAE,WAAW,MAAM,WAAW,eAAe,MAAM,eAAe,MAAM,CAAC;AACtF,eAAS,OAAO;AAAA,IACjB;AAAA,IAEA,OAAO,OAAO;AACb,YAAM,UAAU,QAAQ;AACxB,YAAM,WAAW,QAAQ;AAAA,QACxB,CAAC,MACA,EAAE,EAAE,MAAM,SAAS,MAAM,QACxB,EAAE,MAAM,cAAc,MAAM,aAC5B,EAAE,MAAM,cAAc,MAAM;AAAA,MAC/B;AACA,eAAS,QAAQ;AAAA,IAClB;AAAA,IAEA,MAAM,iBAAiB;AACtB,YAAM,UAAU,QAAQ;AACxB,YAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,cAAc,eAAe;AACnE,YAAM,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,cAAc,eAAe;AAClE,eAAS,IAAI;AACb,aAAO,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,IAChC;AAAA,EACD;AACD;;;AC/CA,SAAS,oBAAmC;AAC3C,MAAI;AACH,UAAM,UAAU,YAAY,iBAAiB,YAAY;AACzD,UAAM,QAAQ,QAAQ,CAAC;AACvB,WAAO,OAAO,QAAQ;AAAA,EACvB,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,SAAS,YAAqB,MAAuB;AAC7D,MAAI,WAAW,OAAO,YAAY,aAAa;AAC9C,YAAQ,IAAI,gBAAgB,GAAG,IAAI;AAAA,EACpC;AACD;AAEO,SAAS,eAAe,SAA0C;AACxE,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC5C,UAAM,IAAI,MAAM,iEAAiE;AAAA,EAClF;AACA,MAAI,CAAC,QAAQ,aAAa,OAAO,QAAQ,cAAc,UAAU;AAChE,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC7D;AACA,MAAI,CAAC,QAAQ,WAAW;AACvB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC7D;AAEA,QAAM,YAAY,QAAQ;AAC1B,QAAM,gBAAgB,QAAQ,iBAAiB,aAAa;AAC5D,QAAM,YAAY,QAAQ;AAC1B,QAAM,WAAW,QAAQ,YAAY,CAAC;AACtC,QAAM,aAAa,QAAQ;AAC3B,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,gBAAgB,QAAQ,0BAA0B;AACxD,QAAM,gBAAgB,QAAQ,iBAAiB,KAAK,KAAK;AACzD,QAAM,sBAAsB,QAAQ,uBAAuB;AAC3D,QAAM,qBAAqB,QAAQ,sBAAsB;AACzD,QAAM,kBAAkB,QAAQ,mBAAmB,MAAM,KAAK,wBAAwB;AACtF,QAAM,QAAQ,QAAQ,UAAU;AAChC,QAAM,eAAgD,QAAQ;AAC9D,QAAM,UAAU,cAAc,kBAAkB;AAChD,QAAM,oBAAuC,CAAC;AAC9C,QAAM,eAAgC,CAAC;AACvC,QAAM,YAAY;AAGlB,MAAI,UAAmB;AACvB,MAAI,iBAAiC;AACrC,MAAI,WAAW;AACf,MAAI,cAAc;AAClB,MAAI,WAAqC;AACzC,MAAI,SAAS;AAGb,MAAI,kBAA2C;AAC/C,MAAI,kBAA2C;AAC/C,MAAI,mBAA4C;AAChD,MAAI,YAAoC;AACxC,MAAI,YAAkD;AACtD,MAAI,2BAAoD;AACxD,MAAI,2BAAoD;AAGxD,QAAM,gBAAgB,sBAAsB;AAC5C,QAAM,YAAY,kBAAkB,eAAe,MAAM;AACxD,aAAS,OAAO,sBAAsB,aAAa,EAAE;AACrD,SAAK,uBAAuB;AAAA,EAC7B,CAAC;AAED,QAAM,iBAAiB,CAAC,MAAuB;AAC9C,sBAAkB,KAAK,CAAC;AACxB,WAAO,kBAAkB,SAAS,QAAS,mBAAkB,MAAM;AACnE,YAAQ,eAAe,CAAC;AACxB,aAAS,OAAO,cAAc,CAAC;AAAA,EAChC;AAGA,QAAM,SAAS,QAAQ,gBAAgB,iBACpC,aAAa,CAAC,UAAkB;AACjC,mBAAe,EAAE,MAAM,kCAAkC,OAAO,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EACxF,CAAC,IACC;AAGH,QAAM,MAAgB,eAAe,WAAW,YAAY,MAAM;AAElE,QAAM,aAAa,CAAC,OAAsB;AACzC,iBAAa,KAAK,EAAE;AACpB,WAAO,aAAa,SAAS,UAAW,cAAa,MAAM;AAAA,EAC5D;AAGA,QAAM,OAAO,CAAC,UAAyB;AACtC,eAAW,KAAK;AAChB,QAAI,KAAK,KAAK;AAAA,EACf;AAEA,QAAM,cAAc,MAA+B;AAClD,UAAM,OAAgC,EAAE,GAAG,SAAS;AACpD,QAAI,cAAc,8BAA8B;AAC/C,WAAK,wBAAwB,kBAAkB,MAAM;AAAA,IACtD;AACA,WAAO;AAAA,EACR;AAEA,QAAM,iBAAiB,MAAM;AAC5B,QAAI,iBAAiB,EAAG;AACxB,QAAI,cAAc,KAAM,cAAa,SAAS;AAC9C,gBAAY,WAAW,MAAM;AAC5B,eAAS,OAAO,sBAAsB;AACtC,WAAK,qBAAqB;AAAA,IAC3B,GAAG,aAAa;AAAA,EACjB;AAEA,QAAM,WAAW,CAAC,WAA8B;AAC/C,UAAM,aAAa,2BAA2B,YAAY;AAC1D,UAAM,KAAgB;AAAA,MACrB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,OAAO,OAAO;AAAA,MACzB,WAAW,OAAO,cAAc,cAAc,UAAU,YAAY;AAAA,MACpE,aAAa,OAAO,WAAW,cAAc,OAAO,QAAQ;AAAA,MAC5D,cAAc,OAAO,WAAW,cAAc,OAAO,SAAS;AAAA,MAC9D,gBAAgB,kBAAkB;AAAA,MAClC,UAAU,YAAY;AAAA,MACtB,GAAG;AAAA,IACJ;AAEA,SAAK,EAAE;AAAA,EACR;AAEA,QAAM,YAAY,CAAC,QAAqB,iBAAiC;AACxE,UAAM,UAAU,WAAW,eAAe,KAAK;AAC/C,UAAM,SAAS,WAAW,YAAY,KAAK;AAE3C,UAAM,KAAiB;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,MACA,WAAW,cAAc,KAAK,IAAI,IAAI,cAAc;AAAA,MACpD,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb;AAAA,MACA,UAAU,YAAY;AAAA,IACvB;AAEA,SAAK,EAAE;AAAA,EACR;AAGA,QAAM,QAAQ,MAAM;AACnB,QAAI,UAAU;AACb,eAAS,OAAO,qDAAgD;AAChE;AAAA,IACD;AACA,eAAW;AACX,aAAS;AACT,kBAAc,KAAK,IAAI;AACvB,cAAU;AAGV,QAAI,MAAM,SAAS;AAGnB,SAAK;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,UAAU,YAAY;AAAA,IACvB,CAAC;AAED,QAAI,8BAA8B,YAAY,KAAK,cAAc;AAChE,iCAA2B,0BAA0B;AAAA,QACpD;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd;AAAA,QACA;AAAA,MACD,CAAC;AAAA,IACF;AAEA,sBAAkB,qBAAqB;AAAA,MACtC,UAAU,MAAM;AACf,YAAI,YAAY,uBAAwB,WAAU;AAAA,MACnD;AAAA,MACA,WAAW,MAAM;AAChB,YAAI,YAAY,oBAAqB,WAAU;AAAA,MAChD;AAAA,MACA,YAAY,CAAC,cAAc;AAC1B,YAAI,CAAC,OAAQ,cAAa,iBAAiB,SAAS;AAAA,MACrD;AAAA,IACD,CAAC;AAED,sBAAkB;AAAA,MACjB;AAAA,QACC,SAAS,CAAC,WAAW;AACpB,qBAAW;AACX,oBAAU;AACV,mBAAS,OAAO,oBAAoB,OAAO,GAAG;AAE9C,mBAAS,MAAM;AAEf,sBAAY;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,cACC,QAAQ,CAAC,MAAM,WAAW;AACzB,iCACC,WAAW,IACR,cACA,SAAS,gBACR,mBACA;AACL,oBAAI,WAAW,EAAG,gBAAe;AAAA,cAClC;AAAA,cACA,aAAa,MAAM;AAClB,iCAAiB;AACjB,oBAAI,CAAC,OAAQ,MAAK,0BAA0B;AAAA,cAC7C;AAAA,YACD;AAAA,YACA,EAAE,YAAY,aAAa,cAAc;AAAA,UAC1C;AAEA,6BAAmB,wBAAwB,QAAQ,CAAC,YAAY;AAC/D,qBAAS,OAAO,sBAAsB,OAAO;AAAA,UAC9C,CAAC;AAED,cAAI,8BAA8B,YAAY,KAAK,cAAc;AAChE,uCAA2B,0BAA0B,QAAQ;AAAA,cAC5D;AAAA,cACA;AAAA,cACA,cAAc;AAAA,cACd;AAAA,cACA;AAAA,YACD,CAAC;AAAA,UACF;AAEA,yBAAe;AAAA,QAChB;AAAA,QACA,WAAW,MAAM;AAChB,cAAI,CAAC,OAAQ,MAAK,mBAAmB;AAAA,QACtC;AAAA,QACA,mBAAmB,MAAM;AACxB,cAAI,CAAC,OAAQ,MAAK,mBAAmB;AAAA,QACtC;AAAA,QACA,WAAW,MAAM;AAChB,mBAAS,OAAO,0CAAqC;AAAA,QACtD;AAAA,MACD;AAAA,MACA;AAAA,QACC,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACZ;AAAA,IACD;AAEA,aAAS,OAAO,mBAAmB,SAAS,mBAAmB,aAAa,eAAe,SAAS,EAAE;AAAA,EACvG;AAEA,QAAM,eAAe,CAAC,QAAqB,iBAAiC;AAC3E,QAAI,OAAQ;AACZ,aAAS;AACT,eAAW;AACX,cAAU;AAEV,aAAS,OAAO,aAAa,MAAM,EAAE;AAErC,QAAI,iBAAiB;AACpB,sBAAgB,KAAK;AACrB,wBAAkB;AAAA,IACnB;AACA,QAAI,WAAW;AACd,gBAAU,KAAK;AACf,kBAAY;AAAA,IACb;AACA,QAAI,kBAAkB;AACrB,uBAAiB,KAAK;AACtB,yBAAmB;AAAA,IACpB;AACA,QAAI,0BAA0B;AAC7B,+BAAyB,KAAK;AAC9B,iCAA2B;AAAA,IAC5B;AACA,QAAI,cAAc,MAAM;AACvB,mBAAa,SAAS;AACtB,kBAAY;AAAA,IACb;AACA,QAAI,iBAAiB;AACpB,sBAAgB,KAAK;AACrB,wBAAkB;AAAA,IACnB;AACA,QAAI,0BAA0B;AAC7B,+BAAyB,KAAK;AAC9B,iCAA2B;AAAA,IAC5B;AAEA,cAAU,QAAQ,YAAY;AAC9B,wBAAoB,aAAa;AAAA,EAClC;AAGA,QAAM,OAAO,CAAC,SAAsB,wBAAwB;AAC3D,iBAAa,QAAQ,IAAI;AAAA,EAC1B;AAEA,QAAM,WAAW,OAAsB;AAAA,IACtC,IAAI;AAAA,IACJ,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,aAAa;AAAA,IAC7B,gBAAgB,WAAW,eAAe,KAAK;AAAA,IAC/C,aAAa,WAAW,YAAY,KAAK;AAAA,IACzC,WAAW,cAAc,KAAK,IAAI,IAAI,cAAc;AAAA,EACrD;AAEA,QAAM,cAAmC;AAAA,IACxC,OAAuB;AACtB,aAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,cAAc,aAAa,MAAM;AAAA,QACjC,aAAa,kBAAkB,MAAM;AAAA,QACrC,qBAAqB,UAAU,aAAa,QAAQ;AAAA,QACpD,SAAS;AAAA,MACV;AAAA,IACD;AAAA,EACD;AAEA,SAAO,EAAE,WAAW,eAAe,WAAW,OAAO,MAAM,UAAU,MAAM,YAAY;AACxF;;;AC1VA,SAAS,eACR,GACyB;AACzB,MAAI,CAAC,EAAG,QAAO,CAAC;AAChB,SAAO,OAAO,MAAM,aAAa,EAAE,IAAI;AACxC;AAEA,SAAS,cACR,WACA,KACA,MACA,SACO;AACP,MAAI;AACH,SAAK,UAAU,KAAK;AAAA,MACnB,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,QAAQ;AAAA,MAC1D,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,WAAW;AAAA,MACX,aAAa;AAAA,IACd,CAAC,EAAE,MAAM,MAAM;AAAA,IAEf,CAAC;AAAA,EACF,QAAQ;AAAA,EAER;AACD;AAEA,SAAS,YACR,OACA,MACS;AACT,UAAQ,MAAM,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACJ,aAAO,KAAK;AAAA,IACb,KAAK;AACJ,aAAO,KAAK;AAAA,IACb,KAAK;AACJ,aAAO,KAAK;AAAA,IACb;AACC,aAAO,KAAK,YAAY,KAAK;AAAA,EAC/B;AACD;AAEO,SAAS,cAAc,MAAuC;AACpE,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACtC,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC9D;AACA,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,UAAU;AACtD,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,QAAM,YAAY,KAAK,UAAU,OAAO,UAAU,cAAc,MAAM,KAAK,UAAU,IAAI;AACzF,QAAM,cAAc,KAAK,sBAAsB;AAE/C,QAAM,YAAuB;AAAA,IAC5B,MAAM,KAAK,OAAO;AACjB,YAAM,MAAM,YAAY,OAAO,IAAI;AAEnC,UAAI,MAAM,SAAS,aAAa;AAC/B,YAAI,CAAC,UAAW,QAAO,EAAE,IAAI,MAAM;AAEnC,cAAM,aACL,OAAO,oBAAoB,cAAc,IAAI,gBAAgB,IAAI;AAClE,cAAM,QAAQ,aACX,WAAW,MAAM,WAAW,MAAM,GAAG,WAAW,IAChD;AAEH,YAAI;AACH,gBAAM,MAAM,MAAM,UAAU,KAAK;AAAA,YAChC,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,eAAe,KAAK,OAAO,EAAE;AAAA,YAC/E,MAAM,KAAK,UAAU,KAAK;AAAA,YAC1B,aAAa;AAAA,YACb,GAAI,aAAa,EAAE,QAAQ,WAAW,OAAO,IAAI,CAAC;AAAA,UACnD,CAAC;AACD,iBAAO,EAAE,IAAI,IAAI,IAAI,QAAQ,IAAI,OAAO;AAAA,QACzC,QAAQ;AACP,iBAAO,EAAE,IAAI,MAAM;AAAA,QACpB,UAAE;AACD,cAAI,UAAU,KAAM,cAAa,KAAK;AAAA,QACvC;AAAA,MACD;AAGA,UAAI,eAAe,KAAK,KAAK,EAAG,QAAO,EAAE,IAAI,KAAK;AAClD,UAAI,WAAW;AACd,sBAAc,WAAW,KAAK,OAAO,eAAe,KAAK,OAAO,CAAC;AAAA,MAClE;AACA,aAAO,EAAE,IAAI,KAAK;AAAA,IACnB;AAAA,IAEA,SAAS,OAAO;AACf,WAAK,UAAU,KAAK,KAAK;AAAA,IAC1B;AAAA,IAEA,cAAc,OAAO;AACpB,aAAO,UAAU,KAAK,KAAK;AAAA,IAC5B;AAAA,IAEA,UAAU,OAAO;AAChB,WAAK,UAAU,KAAK,KAAK;AAAA,IAC1B;AAAA,EACD;AAEA,SAAO;AACR;;;AC3HO,SAAS,kBAAkB,OAAiC,CAAC,GAAc;AACjF,QAAM,YAAuB;AAAA,IAC5B,MAAM,KAAK,OAAO;AACjB,cAAQ,MAAM,MAAM;AAAA,QACnB,KAAK;AAAA,QACL,KAAK,wBAAwB;AAC5B,cAAI;AACH,iBAAK,SAAS,KAAK;AAAA,UACpB,QAAQ;AAAA,UAER;AACA,iBAAO,EAAE,IAAI,KAAK;AAAA,QACnB;AAAA,QACA,KAAK,aAAa;AACjB,cAAI,CAAC,KAAK,YAAa,QAAO,EAAE,IAAI,KAAK;AACzC,cAAI;AACH,kBAAM,SAAS,MAAM,KAAK,YAAY,KAAK;AAC3C,mBAAO,UAAU,EAAE,IAAI,KAAK;AAAA,UAC7B,QAAQ;AACP,mBAAO,EAAE,IAAI,MAAM;AAAA,UACpB;AAAA,QACD;AAAA,QACA,KAAK,SAAS;AACb,cAAI;AACH,iBAAK,UAAU,KAAK;AAAA,UACrB,QAAQ;AAAA,UAER;AACA,iBAAO,EAAE,IAAI,KAAK;AAAA,QACnB;AAAA,QACA,SAAS;AACR,cAAI,CAAC,KAAK,QAAS,QAAO,EAAE,IAAI,KAAK;AACrC,cAAI;AACH,kBAAM,SAAS,MAAM,KAAK,QAAQ,KAAK;AACvC,mBAAO,UAAU,EAAE,IAAI,KAAK;AAAA,UAC7B,QAAQ;AACP,mBAAO,EAAE,IAAI,MAAM;AAAA,UACpB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IAEA,SAAS,OAAO;AACf,WAAK,UAAU,KAAK,KAAK;AAAA,IAC1B;AAAA,IAEA,cAAc,OAAO;AACpB,aAAO,UAAU,KAAK,KAAK;AAAA,IAC5B;AAAA,IAEA,UAAU,OAAO;AAChB,WAAK,UAAU,KAAK,KAAK;AAAA,IAC1B;AAAA,EACD;AAEA,SAAO;AACR;;;ACrCA,SAASC,UAAS,YAAqB,MAAuB;AAC7D,MAAI,WAAW,OAAO,YAAY,aAAa;AAC9C,YAAQ,IAAI,2BAA2B,GAAG,IAAI;AAAA,EAC/C;AACD;AAEA,SAAS,yBAAyB,YAA0B;AAC3D,QAAM,OAAO,WAAW,QAAQ,aAAa,EAAE,EAAE,MAAM,GAAG;AAC1D,MAAI,MAAe;AACnB,aAAW,QAAQ,MAAM;AACxB,QAAI,OAAO,OAAO,QAAQ,YAAY,QAAQ,KAAK;AAClD,YAAO,IAAgC,IAAI;AAAA,IAC5C,OAAO;AACN,YAAM;AACN;AAAA,IACD;AAAA,EACD;AACA,MAAI,OAAO,QAAQ,WAAY,CAAC,IAAmB;AACpD;AAEA,SAAS,YACR,MACA,WACA,eACY;AACZ,QAAM,OAAkB,EAAE,GAAI,QAAQ,CAAC,EAAG;AAC1C,QAAM,WAAW,KAAK;AAEtB,MAAI,iBAAiB,YAAY,MAAM;AACtC,QAAI,OAAO,WAAW,aAAa;AAClC,YAAM,cAAc,iBAAiB,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAC5D,MAAC,OAA8C,WAAW,IAAI,MAAM;AACnE,YAAI;AACH,cAAI,OAAO,aAAa,YAAY;AACnC,YAAC,SAAwB;AAAA,UAC1B,WAAW,OAAO,aAAa,UAAU;AACxC,qCAAyB,QAAQ;AAAA,UAClC;AAAA,QACD,QAAQ;AAAA,QAER;AACA,YAAI;AACH,mCAAyB,SAAS;AAAA,QACnC,QAAQ;AAAA,QAER;AAAA,MACD;AACA,WAAK,gBAAgB,UAAU,WAAW;AAC1C,aAAO;AAAA,IACR;AAAA,EACD;AAEA,OAAK,gBAAgB;AACrB,SAAO;AACR;AAEA,SAAS,kBACR,GACA,WACA,eACA,OACA,UACU;AACV,QAAM,WAAW,EAAE,GAAG;AACtB,MAAI,OAAO,aAAa,cAAe,SAA0C,gBAAgB;AAChG,WAAO;AAAA,EACR;AAEA,QAAM,UAAmD,SAExD,MACC;AACD,aAAS;AACT,WAAO,SAAS,KAAK,MAAM,YAAY,MAAM,WAAW,aAAa,CAAC;AAAA,EACvE;AACA,UAAQ,iBAAiB;AACzB,IAAE,GAAG,YAAY;AAEjB,EAAAA,UAAS,OAAO,wBAAwB;AACxC,SAAO;AACR;AAEA,SAAS,kBACR,WACA,eACA,OACA,UACU;AACV,QAAM,IAAI;AAGV,QAAM,WAAW,EAAE;AACnB,MAAI,OAAO,aAAa,cAAe,SAA0C,gBAAgB;AAChG,WAAO;AAAA,EACR;AAEA,QAAM,UAAyC;AAAA,IAC9C,UAAU,QAAQ,MAAM;AACvB,eAAS;AACT,YAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,YAAM,UAAU,YAAY,OAAO,WAAW,aAAa;AAC3D,aAAO,QAAQ,UAAU,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC;AAAA,IACpD;AAAA,IACA,MAAM,QAAQ,SAAS,MAAM;AAC5B,eAAS;AACT,YAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,YAAM,UAAU,YAAY,OAAO,WAAW,aAAa;AAC3D,aAAO,QAAQ,MAAM,QAAwC,SAAS;AAAA,QACrE;AAAA,QACA,GAAG;AAAA,MACJ,CAAC;AAAA,IACF;AAAA,EACD;AAEA,QAAM,UAAU,IAAI,MAAM,UAAU,OAAO;AAG3C,UAAQ,iBAAiB;AACzB,IAAE,SAAS;AAEX,EAAAA,UAAS,OAAO,uBAAuB;AACvC,SAAO;AACR;AAEO,SAAS,uBACf,UACA,UAA4B,CAAC,GACX;AAClB,MAAI,OAAO,WAAW,aAAa;AAClC,WAAO,EAAE,YAAY;AAAA,IAAC,GAAG,WAAW,MAAM,MAAM;AAAA,EACjD;AAEA,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,gBAAgB,QAAQ,kBAAkB;AAChD,QAAM,QAAQ,QAAQ,UAAU;AAEhC,MAAI,UAAU;AACd,QAAM,YAAY,SAAS;AAC3B,QAAM,IAAI;AAEV,QAAM,cAAc,MAAM;AACzB,aAAS,KAAK;AAAA,MACb,MAAM;AAAA,MACN,WAAW,SAAS;AAAA,MACpB,eAAe,SAAS;AAAA,MACxB,WAAW,KAAK,IAAI;AAAA,MACpB,UAAU,CAAC;AAAA,IACZ,CAAC;AAAA,EACF;AAEA,QAAM,WAAW,MAAe;AAC/B,QAAI,eAAe;AAEnB,UAAM,KAAK,EAAE,UAAU,EAAE;AACzB,QAAI,MAAM,OAAO,OAAO,YAAY,QAAQ,IAAI;AAC/C,UAAI,kBAAkB,IAAI,WAAW,eAAe,OAAO,WAAW,EAAG,gBAAe;AAAA,IACzF;AAEA,QAAI,YAAY,QAAQ;AACvB,UAAI,kBAAkB,WAAW,eAAe,OAAO,WAAW,EAAG,gBAAe;AAAA,IACrF;AAEA,QAAI,aAAc,WAAU;AAC5B,WAAO;AAAA,EACR;AAEA,WAAS;AAET,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,YAAmD,YAAY,MAAM;AACxE,QAAI,KAAK,IAAI,IAAI,YAAY,eAAe;AAC3C,UAAI,cAAc,MAAM;AACvB,sBAAc,SAAS;AACvB,oBAAY;AAAA,MACb;AACA;AAAA,IACD;AACA,aAAS;AAAA,EACV,GAAG,cAAc;AAEjB,SAAO;AAAA,IACN,YAAY;AACX,UAAI,cAAc,MAAM;AACvB,sBAAc,SAAS;AACvB,oBAAY;AAAA,MACb;AAAA,IACD;AAAA,IACA,WAAW,MAAM;AAAA,EAClB;AACD;;;AC7NO,SAAS,iBACf,UACwB;AACxB,MAAI,OAAO,WAAW,aAAa;AAClC,WAAO,EAAE,YAAY;AAAA,IAAC,EAAE;AAAA,EACzB;AAEA,QAAM,IAAI;AAIV,QAAM,WAAW,EAAE;AAEnB,QAAM,UAAU,MAAM;AACrB,QAAI;AACH,eAAS,KAAK;AAAA,QACb,MAAM;AAAA,QACN,WAAW,SAAS;AAAA,QACpB,eAAe,SAAS;AAAA,QACxB,WAAW,KAAK,IAAI;AAAA,QACpB,UAAU,CAAC;AAAA,MACZ,CAAC;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,QAAI,OAAO,aAAa,YAAY;AACnC,UAAI;AACH,iBAAS;AAAA,MACV,QAAQ;AAAA,MAER;AAAA,IACD;AAAA,EACD;AAEA,IAAE,wBAAwB;AAE1B,SAAO;AAAA,IACN,YAAY;AACX,QAAE,wBAAwB,YAAY;AAAA,IACvC;AAAA,EACD;AACD;;;ACnBO,SAAS,sBACf,UACA,UAAiC,CAAC,GAClB;AAChB,QAAM,OAAO,SAAS,KAAK,KAAK,QAAQ;AACxC,QAAM,EAAE,WAAW,cAAc,IAAI;AAErC,SAAO;AAAA,IACN,qBAAqB,SAAiB;AACrC,WAAK;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB;AAAA,QACA,UAAU,CAAC;AAAA,MACZ,CAAC;AACD,cAAQ,uBAAuB,OAAO;AAAA,IACvC;AAAA,IAEA,sBAAsB,KAAa;AAClC,WAAK;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB;AAAA,QACA,UAAU,CAAC;AAAA,MACZ,CAAC;AACD,cAAQ,wBAAwB,GAAG;AAAA,IACpC;AAAA,IAEA,yBAAyB;AACxB,WAAK;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,UAAU,CAAC;AAAA,MACZ,CAAC;AACD,cAAQ,yBAAyB;AAAA,IAClC;AAAA,IAEA,oBAAoB,OAAe,SAAiB;AACnD,WAAK;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,QACA,UAAU,CAAC;AAAA,MACZ,CAAC;AACD,cAAQ,sBAAsB,OAAO,OAAO;AAAA,IAC7C;AAAA,EACD;AACD;;;ACxEA,eAAsB,UAAU,SAAqD;AACpF,QAAM,EAAE,WAAW,OAAO,IAAI;AAE9B,QAAM,cAA6B;AAAA,IAClC,MAAM;AAAA,IACN,WAAW,QAAQ,aAAa;AAAA,IAChC,eAAe,QAAQ,iBAAiB;AAAA,IACxC,WAAW,KAAK,IAAI;AAAA,IACpB,UAAU,QAAQ,YAAY,CAAC;AAAA,EAChC;AAEA,QAAM,YAAY,YAAY,IAAI;AAClC,MAAI;AACJ,MAAI,YAAY;AAChB,MAAI,eAA8B;AAClC,QAAM,kBAAkB,OAAO,cAAc,eAAe,OAAO,UAAU,eAAe;AAE5F,MAAI;AACH,UAAM,SAAS,MAAM,UAAU,KAAK,WAAW;AAC/C,aAAS,OAAO;AAChB,QAAI,CAAC,OAAO,MAAM,OAAO,WAAW,QAAW;AAC9C,qBAAe;AAAA,IAChB;AAAA,EACD,SAAS,KAAK;AACb,mBAAe,eAAe,QAAQ,IAAI,UAAU;AACpD,QAAI,aAAa,YAAY,EAAE,SAAS,MAAM,KAAK,aAAa,YAAY,EAAE,SAAS,cAAc,GAAG;AACvG,kBAAY;AAAA,IACb;AAAA,EACD;AAEA,QAAM,YAAY,KAAK,MAAM,YAAY,IAAI,IAAI,SAAS;AAE1D,SAAO;AAAA,IACN,IAAI,WAAW,UAAa,UAAU,OAAO,SAAS,OAAO,iBAAiB;AAAA,IAC9E,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;ACrCO,SAAS,cAAc,SAAqC;AAClE,QAAM,EAAE,eAAe,WAAW,SAAS,WAAW,SAAS,IAAI;AAEnE,QAAM,QAAQ;AAAA,IACb,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAI;AAAA,IACpB;AAAA,IACA,UAAU,YAAY,CAAC;AAAA,EACxB;AAEA,OAAK,UAAU,KAAK,KAAK;AAC1B;;;ACzBO,IAAM,UAAU;;;AlBuEvB,IAAI,OAAO,WAAW,aAAa;AAClC,SAAO,aAAa;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;",
6
+ "names": ["getNavigationType", "logDebug"]
7
+ }