@lumen-stack/react 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../core/src/errors.ts","../../core/src/client.ts","../../core/src/capture-screenshot.ts","../../core/src/capture-runtime.ts","../../core/src/capture-context.ts","../../core/src/record-audio.ts","../../core/src/record-video.ts","../src/context.ts","../src/AnnotationLayer.tsx","../src/CaptureModal.tsx","../src/trigger/autoDetectAvoid.ts","../src/trigger/useCollisionInsets.ts","../src/trigger/useViewportKeyboard.ts","../src/trigger/FloatingTrigger.tsx","../src/trigger/InlineTrigger.tsx","../src/trigger/NotchTrigger.tsx","../src/trigger/types.ts","../src/trigger/theme.ts","../src/trigger/useHideOn.ts","../src/trigger/useNativeShell.ts","../src/trigger/useRemoteConfig.ts","../src/LumenProvider.tsx","../src/FeedbackButton.tsx"],"names":["LumenError","message","code","status","LumenOriginError","LumenRateLimitError","retryAfter","LumenNetworkError","DEFAULT_API_URL","SUBMIT_PATH","RETRYABLE_STATUSES","LumenClient","config","payload","options","url","body","#buildFormData","lastError","attempt","wait","#sendOnce","e","fd","amplitude","context","screenshotFilename","resolve","reject","xhr","onUploadProgress","signal","onAbort","parseError","parsed","blob","ms","r","text","obj","DEFAULT_MAX_SCALE","MAX_SCREENSHOT_BYTES","captureScreen","assertBrowser","mode","normalizeProviderResult","captureDisplayMedia","captureDom","domError","canUseDisplayMedia","result","uniq","createManualCaptureResult","warnings","viewport","currentViewport","html2canvas","loadHtml2Canvas","target","scale","collectDomWarnings","canvas","el","encodeCanvas","stream","video","waitForVideoFrame","ctx","track","normalized","crossOriginImages","img","src","canvasToBlob","working","ratio","next","quality","type","visual","done","fail","start","MAX_WAIT_MS","values","consoleBuf","networkBuf","installed","ignoreUrlPrefix","installRuntimeCapture","patchConsole","patchFetch","patchXhr","readRuntimeCapture","pushBounded","buf","entry","safeStringify","args","out","arg","replacer","joined","_key","value","levels","level","original","isIgnored","originalFetch","input","init","method","started","res","truncate","OriginalXHR","originalOpen","originalSend","rest","meta","onDone","s","captureContext","capture","toCaptureMetadata","runtime","snapshotDevice","device","recordAudio","maxSeconds","mimeType","m","recorder","chunks","timeoutId","release","durationMs","finalType","recordVideo","videoTrack","LumenContext","createContext","useLumen","useContext","AnnotationLayer","screenshot","tool","color","strokeWidth","onDrawingChange","ref","baseCanvasRef","useRef","overlayCanvasRef","containerRef","imageBitmap","setImageBitmap","useState","annotations","setAnnotations","draftRef","isDrawingRef","lastSampleAtRef","rafPendingRef","useEffect","cancelled","decoded","bm","base","overlay","redraw","useImperativeHandle","cur","draft","all","anno","drawAnno","clientToCanvas","c","rect","sx","sy","scheduleDraftPaint","onPointerDown","p","onPointerMove","last","dist2","now","elapsed","onPointerUp","dx","dy","jsxs","jsx","a","x","y","w","h","drawSmoothPath","from","to","width","angle","head","points","first","second","i","mx","my","VOICE_MAX_SECONDS","VIDEO_MAX_SECONDS","SWATCHES","STROKE_SIZES","CATEGORIES","METHODS","CaptureModal","client","isOpen","closeCapture","user","step","setStep","setMethod","phase","setPhase","submitting","setSubmitting","progress","setProgress","flattenedShot","setFlattenedShot","wasAnnotated","setWasAnnotated","setTool","strokeColor","setStrokeColor","setStrokeWidth","setText","category","setCategory","submitterEmail","setSubmitterEmail","setRecorder","audio","setAudio","recordSecs","setRecordSecs","videoRecorder","setVideoRecorder","setVideo","drawing","setDrawing","annotationRef","modalRef","previouslyFocusedRef","captureCancelledRef","html","prevOverflow","prevPaddingRight","scrollbar","restored","restore","onKey","root","focusables","getFocusable","active","onPaste","file","item","acceptManualScreenshot","id","sec","finishRecording","runCapture","showCaptureWarnings","selectMethod","discardVideo","startVideo","toast","j","startRecording","le","discardRecording","pe","finishVideo","handle","captured","goNext","flat","submit","goBack","trimmed","captureResult","flatScreenshot","T","fraction","onBackdropMouseDown","uploadingPct","isVideoMethod","nextDisabled","nextLabel","SheetGrabber","Stepper","Fragment","ToolButton","captureLabel","Waveform","AudioPreview","steps","label","onClick","onDismiss","startYRef","startTimeRef","targetRef","dt","velocity","canvasRef","dpr","cssWidth","cssHeight","AudioCtor","audioCtx","source","analyser","data","BARS","GAP","MIN_H","barW","radius","raf","frame","bucketSize","getCssVar","peak","v","roundRectPath","anyCtx","setUrl","u","name","FOCUSABLE_SELECTOR","detectBottomFloor","probeY","probeXs","seen","tallest","stack","cs","measureExplicitAvoidForSide","selectors","side","selector","nodes","node","overlap","useCollisionInsets","insets","setInsets","lastRef","avoidKey","avoidToKey","placement","offsetX","offsetY","measure","xSide","yExtra","xExtra","prev","schedule","ro","mo","vv","avoid","useViewportKeyboard","enabled","open","setOpen","KEYBOARD_THRESHOLD","check","shrink","FloatingTrigger","portalTarget","hidden","setTarget","buttonRef","keyboardOpen","useOcclusionWarning","sideY","sideX","yPx","xPx","style","createPortal","warnedRef","t","cx","cy","ourZ","parseZ","candidate","z","n","InlineTrigger","mount","icon","NotchTrigger","expanded","setExpanded","dragStartRef","className","onPointerCancel","resolveNotchConfig","cfg","resolveFloatingConfig","VAR_MAP","useApplyTheme","theme","instanceId","useId","attr","slug","previous","cssVar","key","k","PATCH_FLAG","EVENT_NAME","ensureHistoryPatch","dispatch","origPush","origReplace","useHideOn","predicate","setHidden","evaluate","NATIVE_UA_TOKENS","useNativeShell","native","setNative","wk","ua","STORAGE_PREFIX","STORAGE_TTL_MS","useRemoteConfig","apiKey","apiUrl","state","setState","cached","readCache","triggerEnabled","controller","trigger","parseTrigger","writeCache","VALID_PLACEMENTS","VALID_EDGES","raw","LumenProvider","floatingButton","hideOn","onOpenChange","children","setIsOpen","isSubmitting","error","useMemo","ee","onOpenChangeRef","prevIsOpenRef","useCallback","close","isNativeShell","hideTrigger","remote","effectiveTrigger","resolveEffectiveTrigger","FeedbackButton","variant","floating","openCapture","cls"],"mappings":"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","file":"index.js","sourcesContent":["export class LumenError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status?: number,\n ) {\n super(message);\n this.name = \"LumenError\";\n }\n}\n\nexport class LumenOriginError extends LumenError {\n constructor() {\n super(\n \"Origin not allowed. Add this origin in your Lumen project settings.\",\n \"ORIGIN_NOT_ALLOWED\",\n 403,\n );\n this.name = \"LumenOriginError\";\n }\n}\n\nexport class LumenRateLimitError extends LumenError {\n constructor(public readonly retryAfter: number) {\n super(\n `Rate limited — retry after ${retryAfter}s.`,\n \"RATE_LIMITED\",\n 429,\n );\n this.name = \"LumenRateLimitError\";\n }\n}\n\nexport class LumenNetworkError extends LumenError {\n constructor(message: string) {\n super(message, \"NETWORK_ERROR\");\n this.name = \"LumenNetworkError\";\n }\n}\n","import type {\n AmplitudeIdentity,\n LumenClientConfig,\n LumenUser,\n SubmitOptions,\n SubmitPayload,\n SubmitResult,\n} from \"./types\";\nimport {\n LumenError,\n LumenNetworkError,\n LumenOriginError,\n LumenRateLimitError,\n} from \"./errors\";\n\nconst DEFAULT_API_URL = \"https://shakebugs.vercel.app\";\nconst SUBMIT_PATH = \"/api/v1/sdk/submit\";\n\nconst RETRYABLE_STATUSES = new Set([502, 503, 504]);\n\nexport class LumenClient {\n readonly apiKey: string;\n readonly apiUrl: string;\n user: LumenUser | undefined;\n amplitude: AmplitudeIdentity | undefined;\n\n constructor(config: LumenClientConfig) {\n if (!config.apiKey || !config.apiKey.startsWith(\"lk_pub_\")) {\n throw new LumenError(\n \"Invalid Lumen apiKey — expected a key starting with `lk_pub_`.\",\n \"INVALID_API_KEY\",\n );\n }\n this.apiKey = config.apiKey;\n this.apiUrl = (config.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n this.user = config.user;\n this.amplitude = config.amplitude;\n }\n\n /**\n * Submit a feedback payload. Uses XHR (not fetch) so we can surface\n * upload-progress events to the UI. Retries up to 2 times on 5xx /\n * network errors with exponential backoff.\n */\n async submit(\n payload: SubmitPayload,\n options: SubmitOptions = {},\n ): Promise<SubmitResult> {\n const url = `${this.apiUrl}${SUBMIT_PATH}`;\n const body = this.#buildFormData(payload);\n\n let lastError: unknown = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n if (attempt > 0) {\n await wait(2 ** attempt * 250);\n }\n try {\n return await this.#sendOnce(url, body, options);\n } catch (e) {\n lastError = e;\n // Don't retry deterministic client errors.\n if (\n e instanceof LumenOriginError ||\n e instanceof LumenRateLimitError\n ) {\n throw e;\n }\n if (\n e instanceof LumenError &&\n typeof e.status === \"number\" &&\n !RETRYABLE_STATUSES.has(e.status)\n ) {\n throw e;\n }\n }\n }\n if (lastError instanceof Error) throw lastError;\n throw new LumenNetworkError(\"Submit failed after 3 attempts.\");\n }\n\n #buildFormData(payload: SubmitPayload): FormData {\n const fd = new FormData();\n if (payload.rawText) fd.append(\"rawText\", payload.rawText);\n if (payload.category) fd.append(\"category\", payload.category);\n if (payload.submitterEmail) fd.append(\"submitterEmail\", payload.submitterEmail);\n if (payload.submitterFingerprint) {\n fd.append(\"submitterFingerprint\", payload.submitterFingerprint);\n }\n // Inject the configured Amplitude identity into the context channel\n // (unless the caller already set one on the payload). These are\n // analytics ids, not PII — the server reads them to pull the user's\n // event timeline during enrichment.\n const amplitude = payload.context.amplitude ?? this.amplitude;\n const context = amplitude\n ? { ...payload.context, amplitude }\n : payload.context;\n fd.append(\"context\", JSON.stringify(context));\n if (payload.screenshot) {\n fd.append(\n \"screenshot\",\n payload.screenshot,\n screenshotFilename(payload.screenshot),\n );\n }\n if (payload.audio) {\n fd.append(\"audio\", payload.audio, \"audio\");\n }\n if (payload.audioDurationMs != null) {\n fd.append(\"audioDurationMs\", String(payload.audioDurationMs));\n }\n if (payload.video) {\n fd.append(\"video\", payload.video, \"video\");\n }\n if (payload.videoDurationMs != null) {\n fd.append(\"videoDurationMs\", String(payload.videoDurationMs));\n }\n // `user` (id/email/name) is intentionally NOT sent. The server has\n // never read these fields, so transmitting them just leaks PII over\n // the wire for no benefit. The `LumenUser` type stays in the public\n // API as a no-op until a future release adds an authenticated\n // identity flow that the server can actually trust.\n return fd;\n }\n\n #sendOnce(\n url: string,\n body: FormData,\n options: SubmitOptions,\n ): Promise<SubmitResult> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url, true);\n xhr.setRequestHeader(\"X-Lumen-Api-Key\", this.apiKey);\n xhr.responseType = \"text\";\n\n const { onUploadProgress, signal } = options;\n\n if (onUploadProgress) {\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable && e.total > 0) {\n onUploadProgress(Math.min(1, e.loaded / e.total));\n }\n });\n }\n\n const onAbort = () => {\n xhr.abort();\n reject(new LumenNetworkError(\"Submit aborted.\"));\n };\n if (signal) {\n if (signal.aborted) {\n reject(new LumenNetworkError(\"Submit aborted.\"));\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n xhr.addEventListener(\"load\", () => {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n\n if (xhr.status === 403) {\n reject(new LumenOriginError());\n return;\n }\n if (xhr.status === 429) {\n const retryAfter = Number(xhr.getResponseHeader(\"Retry-After\")) || 60;\n reject(new LumenRateLimitError(retryAfter));\n return;\n }\n if (xhr.status < 200 || xhr.status >= 300) {\n reject(\n new LumenError(\n parseError(xhr.responseText) ?? `HTTP ${xhr.status}`,\n \"HTTP_ERROR\",\n xhr.status,\n ),\n );\n return;\n }\n try {\n const parsed = JSON.parse(xhr.responseText) as SubmitResult;\n resolve(parsed);\n } catch {\n reject(new LumenError(\"Malformed response from server.\", \"BAD_RESPONSE\"));\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n reject(new LumenNetworkError(\"Network error during submit.\"));\n });\n\n xhr.send(body);\n });\n }\n}\n\nfunction screenshotFilename(blob: Blob): string {\n const ext =\n blob.type === \"image/jpeg\"\n ? \"jpg\"\n : blob.type === \"image/webp\"\n ? \"webp\"\n : \"png\";\n return `screenshot.${ext}`;\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction parseError(text: string): string | null {\n try {\n const obj = JSON.parse(text) as { error?: string; message?: string };\n return obj.error ?? obj.message ?? null;\n } catch {\n return text || null;\n }\n}\n","import { LumenError } from \"./errors\";\nimport type {\n CaptureResult,\n ScreenshotCaptureOptions,\n} from \"./types\";\n\nconst DEFAULT_MAX_SCALE = 2;\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\n\ntype Html2Canvas = typeof import(\"html2canvas-pro\").default;\n\nlet html2canvasForTest: Html2Canvas | null = null;\n\nexport function __setHtml2CanvasForTest(renderer: Html2Canvas | null): void {\n html2canvasForTest = renderer;\n}\n\n/**\n * Capture the visible app screen with method/platform metadata.\n *\n * `mode: \"auto\"` keeps the no-permission DOM path first, then falls\n * back to the browser Screen Capture API if DOM rendering fails.\n * Hosts that need native-quality pixels can pass a custom provider.\n */\nexport async function captureScreen(\n options: ScreenshotCaptureOptions = {},\n): Promise<CaptureResult> {\n assertBrowser();\n\n const mode = options.mode ?? \"auto\";\n\n if (options.provider && (mode === \"auto\" || mode === \"custom\")) {\n try {\n return normalizeProviderResult(await options.provider(), options);\n } catch (e) {\n if (mode === \"custom\") throw e;\n // In auto mode a broken custom provider should not strand web apps.\n options.onWarning?.([\n \"Custom capture provider failed; falling back to browser DOM capture.\",\n ]);\n }\n }\n\n if (mode === \"manual\") {\n throw new LumenError(\n \"Manual screenshot upload is required for this capture mode.\",\n \"MANUAL_CAPTURE_REQUIRED\",\n );\n }\n\n if (mode === \"true-screen\") {\n return captureDisplayMedia(options);\n }\n\n if (mode === \"dom\") {\n return captureDom(options);\n }\n\n if (mode === \"custom\") {\n throw new LumenError(\n \"`capture.provider` is required when capture mode is `custom`.\",\n \"CAPTURE_PROVIDER_REQUIRED\",\n );\n }\n\n try {\n return await captureDom(options);\n } catch (domError) {\n if (canUseDisplayMedia()) {\n const result = await captureDisplayMedia(options);\n result.warnings = uniq([\n \"DOM screenshot failed; used browser screen permission fallback.\",\n ...result.warnings,\n ]);\n options.onWarning?.(result.warnings);\n return result;\n }\n throw domError;\n }\n}\n\n/**\n * Back-compatible wrapper kept for existing integrations.\n * New code should prefer `captureScreen()` so capture quality metadata\n * can be stored with the feedback.\n */\nexport async function captureScreenshot(\n target?: HTMLElement,\n): Promise<Blob> {\n const result = await captureScreen({ target, mode: \"auto\" });\n return result.blob;\n}\n\nexport function createManualCaptureResult(\n blob: Blob,\n warnings: string[] = [],\n): CaptureResult {\n assertBrowser();\n const viewport = currentViewport();\n return {\n blob,\n method: \"manual-upload\",\n platform: \"web\",\n viewport,\n pixelRatio: window.devicePixelRatio ?? 1,\n warnings: uniq(warnings),\n };\n}\n\nasync function captureDom(\n options: ScreenshotCaptureOptions,\n): Promise<CaptureResult> {\n const html2canvas = await loadHtml2Canvas();\n\n const target = options.target ?? document.documentElement;\n const viewport = currentViewport();\n const scale = Math.max(\n 1,\n Math.min(window.devicePixelRatio ?? 1, options.maxScale ?? DEFAULT_MAX_SCALE),\n );\n const warnings = collectDomWarnings(target);\n\n const canvas = await html2canvas(target, {\n backgroundColor: null,\n logging: false,\n useCORS: true,\n allowTaint: false,\n width: viewport.width,\n height: viewport.height,\n windowWidth: viewport.width,\n windowHeight: viewport.height,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n x: window.scrollX,\n y: window.scrollY,\n scale,\n ignoreElements: (el) =>\n el instanceof HTMLElement &&\n (el.dataset.lumenCaptureIgnore === \"true\" ||\n Boolean(el.closest(\"[data-lumen-capture-ignore='true']\"))),\n });\n\n const blob = await encodeCanvas(canvas, warnings);\n const result = {\n blob,\n method: \"web-dom\",\n platform: \"web\",\n viewport,\n pixelRatio: scale,\n warnings: uniq(warnings),\n } satisfies CaptureResult;\n if (result.warnings.length > 0) options.onWarning?.(result.warnings);\n return result;\n}\n\nasync function loadHtml2Canvas(): Promise<Html2Canvas> {\n if (html2canvasForTest) return html2canvasForTest;\n const { default: html2canvas } = await import(\"html2canvas-pro\");\n return html2canvas;\n}\n\nasync function captureDisplayMedia(\n options: ScreenshotCaptureOptions,\n): Promise<CaptureResult> {\n if (!canUseDisplayMedia()) {\n throw new LumenError(\n \"Browser screen capture is unavailable in this environment.\",\n \"DISPLAY_MEDIA_UNAVAILABLE\",\n );\n }\n\n const stream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n audio: false,\n });\n\n try {\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n video.srcObject = stream;\n await waitForVideoFrame(video);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new LumenError(\n \"Could not create a drawing context for screen capture.\",\n \"CANVAS_CONTEXT_UNAVAILABLE\",\n );\n }\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n const viewport = currentViewport();\n const warnings = [\n \"Browser screen capture uses the window or tab selected by the user.\",\n ];\n const blob = await encodeCanvas(canvas, warnings);\n const result = {\n blob,\n method: \"web-display-media\",\n platform: \"web\",\n viewport,\n pixelRatio:\n viewport.width > 0 ? canvas.width / viewport.width : undefined,\n warnings: uniq(warnings),\n } satisfies CaptureResult;\n options.onWarning?.(result.warnings);\n return result;\n } finally {\n for (const track of stream.getTracks()) track.stop();\n }\n}\n\nfunction normalizeProviderResult(\n result: CaptureResult,\n options: ScreenshotCaptureOptions,\n): CaptureResult {\n const viewport = currentViewport();\n const normalized = {\n ...result,\n method: result.method ?? \"custom\",\n platform: result.platform ?? \"custom\",\n viewport: result.viewport ?? viewport,\n pixelRatio: result.pixelRatio ?? window.devicePixelRatio ?? 1,\n warnings: uniq(result.warnings ?? []),\n } satisfies CaptureResult;\n if (normalized.warnings.length > 0) options.onWarning?.(normalized.warnings);\n return normalized;\n}\n\nfunction collectDomWarnings(target: HTMLElement): string[] {\n const warnings = new Set<string>();\n\n if (target.querySelector(\"iframe\")) {\n warnings.add(\"Embedded iframes may be blank or incomplete in DOM capture.\");\n }\n if (target.querySelector(\"video\")) {\n warnings.add(\"Video frames may be blank or stale in DOM capture.\");\n }\n if (target.querySelector(\"canvas\")) {\n warnings.add(\"Canvas/WebGL content may be blank if it is cross-origin tainted.\");\n }\n if (document.fonts && document.fonts.status !== \"loaded\") {\n warnings.add(\"Web fonts were still loading when the screenshot was captured.\");\n }\n\n let crossOriginImages = 0;\n for (const img of Array.from(target.querySelectorAll(\"img\"))) {\n const src = img.currentSrc || img.src;\n if (!src) continue;\n try {\n const url = new URL(src, window.location.href);\n if (url.origin !== window.location.origin && !img.crossOrigin) {\n crossOriginImages += 1;\n }\n } catch {\n // Invalid image URLs are ignored here; html2canvas will handle them.\n }\n }\n if (crossOriginImages > 0) {\n warnings.add(\n `${crossOriginImages} cross-origin image${crossOriginImages === 1 ? \"\" : \"s\"} without CORS may be omitted from the screenshot.`,\n );\n }\n\n return Array.from(warnings);\n}\n\nasync function encodeCanvas(\n canvas: HTMLCanvasElement,\n warnings: string[],\n): Promise<Blob> {\n let blob = await canvasToBlob(canvas, \"image/png\", 0.92);\n if (blob.size <= MAX_SCREENSHOT_BYTES) return blob;\n\n warnings.push(\"Screenshot exceeded the upload cap and was compressed.\");\n\n // Progressively downscale + re-encode until we're under the cap, or until\n // the image is too small to be useful. Without this loop a very large\n // screenshot from a 4K monitor at 2x DPR could still exceed the cap after\n // a single pass and silently fail to upload server-side.\n let working = canvas;\n let attempt = 0;\n while (blob.size > MAX_SCREENSHOT_BYTES && attempt < 6) {\n const ratio = Math.max(\n 0.35,\n Math.min(0.95, Math.sqrt(MAX_SCREENSHOT_BYTES / blob.size) * 0.9),\n );\n const next = document.createElement(\"canvas\");\n next.width = Math.max(1, Math.round(working.width * ratio));\n next.height = Math.max(1, Math.round(working.height * ratio));\n const ctx = next.getContext(\"2d\");\n if (!ctx) return blob;\n ctx.drawImage(working, 0, 0, next.width, next.height);\n working = next;\n\n for (const quality of [0.86, 0.74, 0.62, 0.5]) {\n blob = await canvasToBlob(working, \"image/jpeg\", quality);\n if (blob.size <= MAX_SCREENSHOT_BYTES) return blob;\n }\n\n attempt += 1;\n if (next.width < 480 || next.height < 320) break;\n }\n\n if (blob.size > MAX_SCREENSHOT_BYTES) {\n warnings.push(\n \"Screenshot remained large after compression; upload may be rejected.\",\n );\n }\n return blob;\n}\n\nfunction canvasToBlob(\n canvas: HTMLCanvasElement,\n type: \"image/png\" | \"image/jpeg\",\n quality: number,\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new LumenError(\"Could not encode screenshot.\", \"ENCODE_FAILED\"));\n return;\n }\n resolve(blob);\n },\n type,\n quality,\n );\n });\n}\n\nfunction currentViewport(): { width: number; height: number } {\n const visual = window.visualViewport;\n return {\n width: Math.round(visual?.width ?? window.innerWidth),\n height: Math.round(visual?.height ?? window.innerHeight),\n };\n}\n\nfunction canUseDisplayMedia(): boolean {\n return Boolean(navigator.mediaDevices?.getDisplayMedia);\n}\n\nasync function waitForVideoFrame(video: HTMLVideoElement): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const done = () => resolve();\n const fail = () =>\n reject(new LumenError(\"Could not read screen capture video.\", \"VIDEO_FAILED\"));\n video.addEventListener(\"loadedmetadata\", done, { once: true });\n video.addEventListener(\"error\", fail, { once: true });\n void video.play().catch(fail);\n });\n\n // Wait until the browser actually reports a non-zero frame size. We poll\n // via rAF (cheap, paints-aligned) with a hard cap so a stalled stream\n // can't hang the capture flow.\n const start = performance.now();\n const MAX_WAIT_MS = 1500;\n while (video.videoWidth === 0 || video.videoHeight === 0) {\n if (performance.now() - start > MAX_WAIT_MS) {\n throw new LumenError(\n \"Screen capture did not produce a frame in time.\",\n \"VIDEO_TIMEOUT\",\n );\n }\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n }\n}\n\nfunction assertBrowser(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new LumenError(\n \"Screenshot capture can only run in the browser.\",\n \"INVALID_ENV\",\n );\n }\n}\n\nfunction uniq(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean)));\n}\n","/**\n * Lightweight runtime capture: console + fetch/XHR ring buffers.\n *\n * Patched lazily on first install; idempotent. The buffers are drained\n * (not cleared) when `readRuntimeCapture()` is called so multiple\n * submissions in one session each get the latest tail.\n *\n * Keep this file dependency-free and small — it sits on every host\n * page's main bundle.\n */\n\nconst MAX_ENTRIES = 200;\nconst MAX_STRING = 4096;\n\ntype ConsoleLevel = \"log\" | \"info\" | \"warn\" | \"error\" | \"debug\";\n\nexport interface ConsoleEntry {\n level: ConsoleLevel;\n ts: number;\n message: string;\n}\n\nexport interface NetworkEntry {\n type: \"fetch\" | \"xhr\";\n method: string;\n url: string;\n status: number;\n ok: boolean;\n durationMs: number;\n ts: number;\n error?: string;\n}\n\nconst consoleBuf: ConsoleEntry[] = [];\nconst networkBuf: NetworkEntry[] = [];\n\nlet installed = false;\nlet ignoreUrlPrefix: string | null = null;\n\nexport interface InstallRuntimeCaptureOptions {\n /**\n * Requests to URLs starting with this prefix are skipped — prevents\n * the SDK from logging its own submit/config calls in a recursive\n * loop and from leaking apiKey headers into the buffer.\n */\n ignoreUrlPrefix?: string;\n}\n\nexport function installRuntimeCapture(\n options: InstallRuntimeCaptureOptions = {},\n): void {\n if (installed) return;\n if (typeof window === \"undefined\") return;\n installed = true;\n ignoreUrlPrefix = options.ignoreUrlPrefix ?? null;\n patchConsole();\n patchFetch();\n patchXhr();\n}\n\nexport function readRuntimeCapture(): {\n consoleLog: ConsoleEntry[];\n networkLog: NetworkEntry[];\n} {\n return {\n consoleLog: consoleBuf.slice(),\n networkLog: networkBuf.slice(),\n };\n}\n\nfunction pushBounded<T>(buf: T[], entry: T): void {\n buf.push(entry);\n if (buf.length > MAX_ENTRIES) buf.splice(0, buf.length - MAX_ENTRIES);\n}\n\nfunction safeStringify(args: unknown[]): string {\n const out: string[] = [];\n for (const arg of args) {\n if (typeof arg === \"string\") {\n out.push(arg);\n continue;\n }\n if (arg instanceof Error) {\n out.push(`${arg.name}: ${arg.message}${arg.stack ? `\\n${arg.stack}` : \"\"}`);\n continue;\n }\n try {\n out.push(JSON.stringify(arg, replacer));\n } catch {\n out.push(String(arg));\n }\n }\n const joined = out.join(\" \");\n return joined.length > MAX_STRING\n ? joined.slice(0, MAX_STRING) + \"…[truncated]\"\n : joined;\n}\n\n// Drops common circular refs (DOM nodes, React fibers) so JSON.stringify\n// doesn't throw and the buffer stays small.\nfunction replacer(_key: string, value: unknown): unknown {\n if (value instanceof Element) return `[Element ${(value as Element).tagName}]`;\n if (typeof value === \"function\") return \"[Function]\";\n return value;\n}\n\nfunction patchConsole(): void {\n const target = window.console;\n if (!target) return;\n const levels: ConsoleLevel[] = [\"log\", \"info\", \"warn\", \"error\", \"debug\"];\n for (const level of levels) {\n const original = target[level]?.bind(target);\n if (!original) continue;\n target[level] = (...args: unknown[]) => {\n try {\n pushBounded(consoleBuf, {\n level,\n ts: Date.now(),\n message: safeStringify(args),\n });\n } catch {\n // Never let our interception throw into the host app.\n }\n original(...args);\n };\n }\n}\n\nfunction isIgnored(url: string): boolean {\n if (!ignoreUrlPrefix) return false;\n return url.startsWith(ignoreUrlPrefix);\n}\n\nfunction patchFetch(): void {\n const originalFetch = window.fetch;\n if (typeof originalFetch !== \"function\") return;\n window.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n const method = (init?.method ?? (input instanceof Request ? input.method : \"GET\")).toUpperCase();\n if (isIgnored(url)) {\n return originalFetch.call(window, input as RequestInfo, init);\n }\n const started = performance.now();\n try {\n const res = await originalFetch.call(window, input as RequestInfo, init);\n pushBounded(networkBuf, {\n type: \"fetch\",\n method,\n url: truncate(url),\n status: res.status,\n ok: res.ok,\n durationMs: Math.round(performance.now() - started),\n ts: Date.now(),\n });\n return res;\n } catch (e) {\n pushBounded(networkBuf, {\n type: \"fetch\",\n method,\n url: truncate(url),\n status: 0,\n ok: false,\n durationMs: Math.round(performance.now() - started),\n ts: Date.now(),\n error: e instanceof Error ? e.message : \"fetch error\",\n });\n throw e;\n }\n } as typeof window.fetch;\n}\n\nfunction patchXhr(): void {\n const OriginalXHR = window.XMLHttpRequest;\n if (!OriginalXHR) return;\n const originalOpen = OriginalXHR.prototype.open;\n const originalSend = OriginalXHR.prototype.send;\n\n OriginalXHR.prototype.open = function patchedOpen(\n this: XMLHttpRequest & { __lumen?: { method: string; url: string; t: number } },\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n this.__lumen = {\n method: String(method).toUpperCase(),\n url: typeof url === \"string\" ? url : url.toString(),\n t: 0,\n };\n // @ts-expect-error variadic passthrough\n return originalOpen.call(this, method, url, ...rest);\n } as typeof OriginalXHR.prototype.open;\n\n OriginalXHR.prototype.send = function patchedSend(\n this: XMLHttpRequest & { __lumen?: { method: string; url: string; t: number } },\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const meta = this.__lumen;\n if (meta && !isIgnored(meta.url)) {\n meta.t = performance.now();\n const onDone = () => {\n try {\n pushBounded(networkBuf, {\n type: \"xhr\",\n method: meta.method,\n url: truncate(meta.url),\n status: this.status,\n ok: this.status >= 200 && this.status < 400,\n durationMs: Math.round(performance.now() - meta.t),\n ts: Date.now(),\n });\n } catch {\n // ignore\n }\n this.removeEventListener(\"loadend\", onDone);\n };\n this.addEventListener(\"loadend\", onDone);\n }\n return originalSend.call(this, body ?? null);\n } as typeof OriginalXHR.prototype.send;\n}\n\nfunction truncate(s: string): string {\n return s.length > 512 ? s.slice(0, 512) + \"…\" : s;\n}\n","import { readRuntimeCapture } from \"./capture-runtime\";\nimport type {\n CapturedContext,\n CaptureMetadata,\n CaptureResult,\n DeviceContext,\n} from \"./types\";\n\n/**\n * Snapshot of basic page context at submit-time.\n *\n * Console + network logs are sourced from the runtime ring buffer when\n * `installRuntimeCapture()` has been called by the host (the React\n * provider does this on mount). When the host hasn't installed\n * interception the buffer is empty and the legacy `[]` is sent — same\n * shape, no migration impact.\n */\nexport function captureContext(\n capture?: CaptureResult | CaptureMetadata,\n): CapturedContext {\n if (typeof window === \"undefined\") {\n return {\n url: \"\",\n userAgent: \"\",\n viewport: { width: 0, height: 0 },\n capture: toCaptureMetadata(capture),\n consoleLog: [],\n networkLog: [],\n };\n }\n\n const runtime = readRuntimeCapture();\n return {\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n capture: toCaptureMetadata(capture),\n device: snapshotDevice(),\n consoleLog: runtime.consoleLog,\n networkLog: runtime.networkLog,\n };\n}\n\nfunction snapshotDevice(): DeviceContext {\n const device: DeviceContext = {};\n try {\n device.screen = {\n width: window.screen?.width ?? 0,\n height: window.screen?.height ?? 0,\n };\n device.pixelRatio = window.devicePixelRatio ?? 1;\n device.language = navigator.language;\n device.languages = Array.from(navigator.languages ?? []);\n device.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n device.colorScheme = window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n device.referrer = document.referrer || undefined;\n device.title = document.title || undefined;\n device.online = navigator.onLine;\n const nav = performance.getEntriesByType(\"navigation\")[0] as\n | PerformanceNavigationTiming\n | undefined;\n if (nav) {\n device.uptimeMs = Math.round(performance.now());\n }\n } catch {\n // Best-effort snapshot — don't block submit on a missing API.\n }\n return device;\n}\n\nfunction toCaptureMetadata(\n capture?: CaptureResult | CaptureMetadata,\n): CaptureMetadata | undefined {\n if (!capture) return undefined;\n return {\n method: capture.method,\n platform: capture.platform,\n viewport: capture.viewport,\n pixelRatio: capture.pixelRatio,\n warnings: capture.warnings,\n };\n}\n","import { LumenError } from \"./errors\";\n\nexport interface AudioRecording {\n blob: Blob;\n durationMs: number;\n mimeType: string;\n}\n\nexport interface RecorderHandle {\n /** Stop recording and resolve with the recorded blob. */\n stop: () => Promise<AudioRecording>;\n /** Cancel without producing a blob; releases the mic immediately. */\n cancel: () => void;\n /** Stream object (use to render a live waveform in Phase 2). */\n stream: MediaStream;\n}\n\n/**\n * Start a MediaRecorder. Caller is responsible for stopping/canceling.\n * Auto-stops after `maxSeconds` seconds to avoid runaway recordings.\n */\nexport async function recordAudio(\n maxSeconds = 60,\n): Promise<RecorderHandle> {\n if (typeof window === \"undefined\" || !navigator.mediaDevices) {\n throw new LumenError(\n \"Audio recording requires a browser with MediaDevices.\",\n \"INVALID_ENV\",\n );\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch {\n throw new LumenError(\n \"Microphone access denied or unavailable.\",\n \"MIC_DENIED\",\n );\n }\n\n // Pick the first MIME type supported by the browser; webm/opus on\n // Chromium, mp4/aac on Safari, ogg on Firefox.\n const candidates = [\n \"audio/webm;codecs=opus\",\n \"audio/webm\",\n \"audio/mp4\",\n \"audio/ogg;codecs=opus\",\n ];\n const mimeType =\n candidates.find((m) => MediaRecorder.isTypeSupported(m)) ?? \"\";\n\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n const chunks: Blob[] = [];\n const start = performance.now();\n let timeoutId: number | null = null;\n\n recorder.addEventListener(\"dataavailable\", (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n });\n\n recorder.start();\n timeoutId = window.setTimeout(() => {\n if (recorder.state !== \"inactive\") recorder.stop();\n }, maxSeconds * 1000);\n\n function release() {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n timeoutId = null;\n for (const track of stream.getTracks()) track.stop();\n }\n\n return {\n stream,\n cancel() {\n try {\n if (recorder.state !== \"inactive\") recorder.stop();\n } catch {\n /* ignore */\n }\n release();\n },\n stop(): Promise<AudioRecording> {\n return new Promise((resolve, reject) => {\n if (recorder.state === \"inactive\") {\n release();\n reject(new LumenError(\"Recorder already stopped.\", \"RECORDER_STOPPED\"));\n return;\n }\n recorder.addEventListener(\n \"stop\",\n () => {\n const durationMs = performance.now() - start;\n const finalType = recorder.mimeType || mimeType || \"audio/webm\";\n const blob = new Blob(chunks, { type: finalType });\n release();\n resolve({ blob, durationMs, mimeType: finalType });\n },\n { once: true },\n );\n recorder.stop();\n });\n },\n };\n}\n","import { LumenError } from \"./errors\";\n\nexport interface VideoRecording {\n blob: Blob;\n durationMs: number;\n mimeType: string;\n}\n\nexport interface VideoRecorderHandle {\n /** Stop recording and resolve with the recorded blob. */\n stop: () => Promise<VideoRecording>;\n /** Cancel without producing a blob; releases the screen capture. */\n cancel: () => void;\n /** The screen-capture stream (use to render a live preview). */\n stream: MediaStream;\n}\n\n/**\n * Record the screen via the browser Screen Capture API + MediaRecorder.\n * Mirrors {@link recordAudio} but over `getDisplayMedia`. The user picks a\n * tab / window / screen in the browser's native picker; if they cancel the\n * picker this rejects with `SCREEN_DENIED`.\n *\n * Auto-stops after `maxSeconds`. The browser also surfaces its own \"Stop\n * sharing\" control — we listen for the track ending so that path resolves\n * the recording too.\n */\nexport async function recordVideo(\n maxSeconds = 60,\n): Promise<VideoRecorderHandle> {\n if (\n typeof window === \"undefined\" ||\n !navigator.mediaDevices ||\n typeof navigator.mediaDevices.getDisplayMedia !== \"function\"\n ) {\n throw new LumenError(\n \"Screen recording requires a browser with getDisplayMedia.\",\n \"INVALID_ENV\",\n );\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n // Capture system/tab audio when the user opts in via the picker.\n audio: true,\n });\n } catch {\n throw new LumenError(\n \"Screen capture was denied or cancelled.\",\n \"SCREEN_DENIED\",\n );\n }\n\n // VP9/VP8 webm on Chromium; mp4 on Safari.\n const candidates = [\n \"video/webm;codecs=vp9,opus\",\n \"video/webm;codecs=vp8,opus\",\n \"video/webm\",\n \"video/mp4\",\n ];\n const mimeType =\n candidates.find((m) => MediaRecorder.isTypeSupported(m)) ?? \"\";\n\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n const chunks: Blob[] = [];\n const start = performance.now();\n let timeoutId: number | null = null;\n\n recorder.addEventListener(\"dataavailable\", (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n });\n\n recorder.start();\n timeoutId = window.setTimeout(() => {\n if (recorder.state !== \"inactive\") recorder.stop();\n }, maxSeconds * 1000);\n\n // The user can end the share from the browser's own UI — treat that as\n // a stop so the in-flight recording still resolves.\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n videoTrack.addEventListener(\"ended\", () => {\n if (recorder.state !== \"inactive\") recorder.stop();\n });\n }\n\n function release() {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n timeoutId = null;\n for (const track of stream.getTracks()) track.stop();\n }\n\n return {\n stream,\n cancel() {\n try {\n if (recorder.state !== \"inactive\") recorder.stop();\n } catch {\n /* ignore */\n }\n release();\n },\n stop(): Promise<VideoRecording> {\n return new Promise((resolve, reject) => {\n if (recorder.state === \"inactive\") {\n release();\n reject(new LumenError(\"Recorder already stopped.\", \"RECORDER_STOPPED\"));\n return;\n }\n recorder.addEventListener(\n \"stop\",\n () => {\n const durationMs = performance.now() - start;\n const finalType = recorder.mimeType || mimeType || \"video/webm\";\n const blob = new Blob(chunks, { type: finalType });\n release();\n resolve({ blob, durationMs, mimeType: finalType });\n },\n { once: true },\n );\n recorder.stop();\n });\n },\n };\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type {\n LumenClient,\n ScreenshotCaptureOptions,\n LumenUser,\n SubmitOptions,\n SubmitPayload,\n SubmitResult,\n} from \"@lumen-stack/core\";\n\nexport interface LumenContextValue {\n client: LumenClient;\n user: LumenUser | undefined;\n\n // v2 surface\n open: () => void;\n close: () => void;\n isOpen: boolean;\n /** Pass-through to client.submit — for headless hosts that build their own payload. */\n submit: (\n payload: SubmitPayload,\n options?: SubmitOptions,\n ) => Promise<SubmitResult>;\n /** Best-effort: true when running inside a native shell (RN WebView, Capacitor, …). */\n isNativeShell: boolean;\n /** Capture options from <LumenProvider>. */\n capture: ScreenshotCaptureOptions | undefined;\n\n // Back-compat aliases (kept; do not remove).\n openCapture: () => void;\n closeCapture: () => void;\n isSubmitting: boolean;\n error: Error | null;\n}\n\nexport const LumenContext = createContext<LumenContextValue | null>(null);\n\nexport function useLumen(): LumenContextValue {\n const ctx = useContext(LumenContext);\n if (!ctx) {\n throw new Error(\"useLumen() must be used inside <LumenProvider>.\");\n }\n return ctx;\n}\n","\"use client\";\n\nimport { useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport * as React from \"react\";\n\nexport type AnnotationTool = \"arrow\" | \"rect\" | \"freehand\";\n\ninterface ArrowAnno {\n kind: \"arrow\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n color: string;\n width: number;\n}\ninterface RectAnno {\n kind: \"rect\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n color: string;\n width: number;\n}\ninterface FreehandAnno {\n kind: \"freehand\";\n points: Array<{ x: number; y: number }>;\n color: string;\n width: number;\n}\ntype Annotation = ArrowAnno | RectAnno | FreehandAnno;\n\nconst HISTORY_LIMIT = 50;\n\nexport interface AnnotationLayerHandle {\n flatten: () => Promise<Blob>;\n reset: () => void;\n undo: () => void;\n hasAnnotations: () => boolean;\n}\n\nexport interface AnnotationLayerProps {\n screenshot: Blob;\n tool: AnnotationTool;\n /** Stroke color (CSS color). Default red-500. */\n color?: string;\n /** Stroke width in bitmap px. Default 4. */\n strokeWidth?: number;\n /** Called when the user starts/stops drawing — used by the modal to\n * lock its scrollable body during a stroke. */\n onDrawingChange?: (drawing: boolean) => void;\n}\n\n// forwardRef so the parent (CaptureModal) can call flatten() imperatively.\n// React 18 does NOT forward `ref` to plain function components — it must be\n// declared with forwardRef. React 19 deprecated forwardRef but still supports\n// it, so this is safe across both major versions.\nexport const AnnotationLayer = React.forwardRef<\n AnnotationLayerHandle,\n AnnotationLayerProps\n>(function AnnotationLayer({\n screenshot,\n tool,\n color = \"rgb(239, 68, 68)\",\n strokeWidth = 4,\n onDrawingChange,\n}, ref) {\n const baseCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const overlayCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [imageBitmap, setImageBitmap] = useState<ImageBitmap | null>(null);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const draftRef = useRef<Annotation | null>(null);\n const isDrawingRef = useRef(false);\n const lastSampleAtRef = useRef(0);\n const rafPendingRef = useRef(false);\n\n // Decode the screenshot once into a bitmap so we can redraw cheaply.\n // In React Strict Mode the effect runs twice on mount — we must close\n // the second-run bitmap and free both via .close() on unmount so we\n // don't leak GPU memory across repeated capture sessions.\n useEffect(() => {\n let cancelled = false;\n let decoded: ImageBitmap | null = null;\n (async () => {\n try {\n const bm = await createImageBitmap(screenshot);\n if (cancelled) {\n bm.close?.();\n return;\n }\n decoded = bm;\n setImageBitmap(bm);\n } catch {\n // Decoding failure leaves the layer in its loading state; the\n // surrounding modal will surface the error via toast on submit.\n }\n })();\n return () => {\n cancelled = true;\n decoded?.close?.();\n };\n }, [screenshot]);\n\n // Size + paint base canvas exactly once per bitmap.\n useEffect(() => {\n if (!imageBitmap) return;\n const base = baseCanvasRef.current;\n const overlay = overlayCanvasRef.current;\n if (!base || !overlay) return;\n base.width = imageBitmap.width;\n base.height = imageBitmap.height;\n overlay.width = imageBitmap.width;\n overlay.height = imageBitmap.height;\n const ctx = base.getContext(\"2d\");\n if (!ctx) return;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(imageBitmap, 0, 0);\n }, [imageBitmap]);\n\n // Repaint the OVERLAY only when annotations change. Base canvas is\n // never touched after the initial draw.\n useEffect(() => {\n const overlay = overlayCanvasRef.current;\n if (!overlay) return;\n redraw(overlay, annotations, draftRef.current);\n }, [annotations]);\n\n useImperativeHandle(\n ref,\n (): AnnotationLayerHandle => ({\n hasAnnotations: () => annotations.length > 0,\n reset: () => setAnnotations([]),\n undo: () =>\n setAnnotations((cur) =>\n cur.length === 0 ? cur : cur.slice(0, -1),\n ),\n async flatten() {\n // Mid-stroke at submit time: bake the live draft so the user\n // doesn't lose the annotation they were drawing when they clicked\n // Send.\n const draft = draftRef.current;\n const all = draft ? [...annotations, draft] : annotations;\n // No annotations → no re-encode. A 2MB PNG screenshot through\n // canvas.toBlob can take 100-300ms on a phone for zero benefit.\n if (all.length === 0) return screenshot;\n if (!imageBitmap) return screenshot;\n const out = document.createElement(\"canvas\");\n out.width = imageBitmap.width;\n out.height = imageBitmap.height;\n const ctx = out.getContext(\"2d\");\n if (!ctx) return screenshot;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(imageBitmap, 0, 0);\n for (const anno of all) drawAnno(ctx, anno);\n // JPEG q=0.85: ~4-10× smaller than PNG for screenshot content,\n // which dominates submit time on slow uplinks. Annotations are\n // simple shapes that survive JPEG without visible artifacts.\n return await new Promise<Blob>((resolve) => {\n out.toBlob(\n (blob) => {\n resolve(blob ?? screenshot);\n },\n \"image/jpeg\",\n 0.85,\n );\n });\n },\n }),\n [annotations, imageBitmap, screenshot],\n );\n\n function clientToCanvas(\n e: React.PointerEvent<HTMLCanvasElement>,\n ): { x: number; y: number } {\n const c = overlayCanvasRef.current;\n if (!c) return { x: 0, y: 0 };\n const rect = c.getBoundingClientRect();\n const sx = c.width / Math.max(rect.width, 1);\n const sy = c.height / Math.max(rect.height, 1);\n return {\n x: (e.clientX - rect.left) * sx,\n y: (e.clientY - rect.top) * sy,\n };\n }\n\n function scheduleDraftPaint() {\n if (rafPendingRef.current) return;\n rafPendingRef.current = true;\n requestAnimationFrame(() => {\n rafPendingRef.current = false;\n const overlay = overlayCanvasRef.current;\n if (!overlay) return;\n redraw(overlay, annotations, draftRef.current);\n });\n }\n\n function onPointerDown(e: React.PointerEvent<HTMLCanvasElement>) {\n if (e.button !== undefined && e.button !== 0) return;\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // iOS Safari can throw NotSupportedError if the pointer is already\n // captured by an ancestor (e.g. the sheet grabber's drag handler).\n // Swallow — capture is a nice-to-have for off-canvas tracking; the\n // stroke still works without it.\n }\n isDrawingRef.current = true;\n onDrawingChange?.(true);\n const p = clientToCanvas(e);\n if (tool === \"arrow\") {\n draftRef.current = { kind: \"arrow\", from: p, to: p, color, width: strokeWidth };\n } else if (tool === \"rect\") {\n draftRef.current = { kind: \"rect\", from: p, to: p, color, width: strokeWidth };\n } else {\n draftRef.current = {\n kind: \"freehand\",\n points: [p],\n color,\n width: strokeWidth,\n };\n }\n lastSampleAtRef.current = performance.now();\n scheduleDraftPaint();\n }\n\n function onPointerMove(e: React.PointerEvent<HTMLCanvasElement>) {\n if (!isDrawingRef.current || !draftRef.current) return;\n const p = clientToCanvas(e);\n const draft = draftRef.current;\n if (draft.kind === \"arrow\" || draft.kind === \"rect\") {\n draft.to = p;\n } else {\n const last = draft.points[draft.points.length - 1];\n const dist2 = last\n ? (last.x - p.x) ** 2 + (last.y - p.y) ** 2\n : Infinity;\n const now = performance.now();\n const elapsed = now - lastSampleAtRef.current;\n // Sample if we've moved ≥ 4 bitmap-px OR ≥ 16ms passed (handles\n // very slow strokes where a single point would otherwise stall).\n if (dist2 > 16 || elapsed > 16) {\n draft.points.push(p);\n lastSampleAtRef.current = now;\n }\n }\n scheduleDraftPaint();\n }\n\n function onPointerUp() {\n if (!isDrawingRef.current) return;\n isDrawingRef.current = false;\n onDrawingChange?.(false);\n const draft = draftRef.current;\n draftRef.current = null;\n if (!draft) return;\n if (draft.kind === \"arrow\" || draft.kind === \"rect\") {\n const dx = draft.to.x - draft.from.x;\n const dy = draft.to.y - draft.from.y;\n if (dx * dx + dy * dy < 16) {\n // Tap — discard. Force a clean overlay repaint so the empty\n // draft doesn't linger.\n const overlay = overlayCanvasRef.current;\n if (overlay) redraw(overlay, annotations, null);\n return;\n }\n } else if (draft.points.length < 2) {\n const overlay = overlayCanvasRef.current;\n if (overlay) redraw(overlay, annotations, null);\n return;\n }\n setAnnotations((cur) => [...cur, draft].slice(-HISTORY_LIMIT));\n }\n\n return (\n <div ref={containerRef} className=\"lumen-annotate-frame\">\n <canvas ref={baseCanvasRef} />\n <canvas\n ref={overlayCanvasRef}\n className=\"lumen-annotate-overlay\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n />\n </div>\n );\n});\n\nfunction redraw(\n canvas: HTMLCanvasElement,\n annotations: Annotation[],\n draft: Annotation | null,\n) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n for (const a of annotations) drawAnno(ctx, a);\n if (draft) drawAnno(ctx, draft);\n}\n\nfunction drawAnno(ctx: CanvasRenderingContext2D, anno: Annotation) {\n ctx.save();\n ctx.strokeStyle = anno.color;\n ctx.fillStyle = anno.color;\n ctx.lineWidth = anno.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n if (anno.kind === \"rect\") {\n const x = Math.min(anno.from.x, anno.to.x);\n const y = Math.min(anno.from.y, anno.to.y);\n const w = Math.abs(anno.to.x - anno.from.x);\n const h = Math.abs(anno.to.y - anno.from.y);\n ctx.strokeRect(x, y, w, h);\n } else if (anno.kind === \"freehand\") {\n drawSmoothPath(ctx, anno.points);\n } else {\n const { from, to, width } = anno;\n ctx.beginPath();\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n ctx.stroke();\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\n const head = Math.max(12, width * 4);\n ctx.beginPath();\n ctx.moveTo(to.x, to.y);\n ctx.lineTo(\n to.x - head * Math.cos(angle - Math.PI / 7),\n to.y - head * Math.sin(angle - Math.PI / 7),\n );\n ctx.lineTo(\n to.x - head * Math.cos(angle + Math.PI / 7),\n to.y - head * Math.sin(angle + Math.PI / 7),\n );\n ctx.closePath();\n ctx.fill();\n }\n\n ctx.restore();\n}\n\n/**\n * Draw a polyline as quadratic curves through midpoints. Each pair of\n * adjacent points contributes one curve where the original point is\n * the control point and the midpoint to the next is the end. This is\n * the standard \"midpoint smoothing\" trick — zero-dep, single pass.\n */\nfunction drawSmoothPath(\n ctx: CanvasRenderingContext2D,\n points: ReadonlyArray<{ x: number; y: number }>,\n) {\n if (points.length === 0) return;\n ctx.beginPath();\n const first = points[0];\n if (!first) return;\n ctx.moveTo(first.x, first.y);\n if (points.length === 1) {\n // Single dot — render a small filled circle so a tap is visible.\n ctx.arc(first.x, first.y, ctx.lineWidth / 2, 0, Math.PI * 2);\n ctx.fill();\n return;\n }\n if (points.length === 2) {\n const second = points[1]!;\n ctx.lineTo(second.x, second.y);\n ctx.stroke();\n return;\n }\n for (let i = 1; i < points.length - 1; i++) {\n const p = points[i]!;\n const next = points[i + 1]!;\n const mx = (p.x + next.x) / 2;\n const my = (p.y + next.y) / 2;\n ctx.quadraticCurveTo(p.x, p.y, mx, my);\n }\n // Final segment to the last point.\n const last = points[points.length - 1]!;\n ctx.lineTo(last.x, last.y);\n ctx.stroke();\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n captureContext,\n captureScreen,\n createManualCaptureResult,\n recordAudio,\n recordVideo,\n type CaptureResult,\n type FeedbackCategory,\n type RecorderHandle,\n type ScreenshotCaptureMode,\n type VideoRecorderHandle,\n} from \"@lumen-stack/core\";\n\nimport { useLumen } from \"./context\";\nimport {\n AnnotationLayer,\n type AnnotationLayerHandle,\n type AnnotationTool,\n} from \"./AnnotationLayer\";\n\nconst VOICE_MAX_SECONDS = 60;\nconst VIDEO_MAX_SECONDS = 60;\n\nconst SWATCHES: ReadonlyArray<{ label: string; value: string }> = [\n { label: \"Red\", value: \"rgb(239, 68, 68)\" },\n { label: \"Amber\", value: \"rgb(245, 158, 11)\" },\n { label: \"Blue\", value: \"rgb(59, 130, 246)\" },\n { label: \"Green\", value: \"rgb(34, 197, 94)\" },\n { label: \"Neutral\", value: \"rgb(244, 244, 245)\" },\n];\n\nconst STROKE_SIZES: ReadonlyArray<{ label: string; value: number; dot: number }> = [\n { label: \"Small\", value: 2, dot: 6 },\n { label: \"Medium\", value: 4, dot: 9 },\n { label: \"Large\", value: 6, dot: 12 },\n];\n\nconst CATEGORIES: ReadonlyArray<{ value: FeedbackCategory; label: string }> = [\n { value: \"bug\", label: \"Bug\" },\n { value: \"feature\", label: \"Idea\" },\n { value: \"other\", label: \"Other\" },\n];\n\ntype CaptureMethod = \"shot\" | \"screen\" | \"video\";\n\nconst METHODS: ReadonlyArray<{ value: CaptureMethod; label: string; hint: string }> = [\n { value: \"shot\", label: \"Screenshot\", hint: \"This page, instantly\" },\n { value: \"screen\", label: \"Screen\", hint: \"Pick a window or tab\" },\n { value: \"video\", label: \"Video\", hint: \"Record up to 60s\" },\n];\n\ntype Step = 1 | 2 | 3;\n\n// Capture sub-state, independent of the wizard step. The annotated artifact\n// lives on `ready`. `idle` = step 1 with nothing captured yet.\ntype Phase =\n | { kind: \"idle\" }\n | { kind: \"capturing\" }\n | { kind: \"manual\"; error?: string }\n | { kind: \"ready\"; capture: CaptureResult };\n\nexport function CaptureModal() {\n const { client, isOpen, closeCapture, user, capture } = useLumen();\n const [step, setStep] = useState<Step>(1);\n const [method, setMethod] = useState<CaptureMethod | null>(null);\n const [phase, setPhase] = useState<Phase>({ kind: \"idle\" });\n const [submitting, setSubmitting] = useState(false);\n const [progress, setProgress] = useState(0);\n // The annotated screenshot is flattened when leaving step 1 (the only step\n // where AnnotationLayer is mounted) and stashed here, because submit() runs\n // on step 3 where the annotator — and its ref — no longer exist.\n const [flattenedShot, setFlattenedShot] = useState<Blob | null>(null);\n const [wasAnnotated, setWasAnnotated] = useState(false);\n\n const [tool, setTool] = useState<AnnotationTool>(\"arrow\");\n const [strokeColor, setStrokeColor] = useState<string>(SWATCHES[0]!.value);\n const [strokeWidth, setStrokeWidth] = useState<number>(STROKE_SIZES[1]!.value);\n const [text, setText] = useState(\"\");\n const [category, setCategory] = useState<FeedbackCategory>(\"bug\");\n const [submitterEmail, setSubmitterEmail] = useState(user?.email ?? \"\");\n const [recorder, setRecorder] = useState<RecorderHandle | null>(null);\n const [audio, setAudio] = useState<{ blob: Blob; durationMs: number } | null>(\n null,\n );\n const [recordSecs, setRecordSecs] = useState(0);\n const [videoRecorder, setVideoRecorder] =\n useState<VideoRecorderHandle | null>(null);\n const [video, setVideo] = useState<{ blob: Blob; durationMs: number } | null>(\n null,\n );\n const [drawing, setDrawing] = useState(false);\n const annotationRef = useRef<AnnotationLayerHandle>(null);\n const modalRef = useRef<HTMLDivElement | null>(null);\n const previouslyFocusedRef = useRef<HTMLElement | null>(null);\n\n // Cancellation flag for in-flight captures — survives a Strict-Mode double\n // mount or a fast re-open so a stale capture can't stomp the latest phase.\n const captureCancelledRef = useRef(false);\n\n // Reset everything when the modal opens. No auto-capture: the user picks a\n // method deliberately (capture used to fire the instant the modal opened).\n useEffect(() => {\n if (!isOpen) return;\n captureCancelledRef.current = false;\n setStep(1);\n setMethod(null);\n setText(\"\");\n setAudio(null);\n setRecordSecs(0);\n setVideo(null);\n setSubmitting(false);\n setProgress(0);\n setFlattenedShot(null);\n setWasAnnotated(false);\n setVideoRecorder((cur) => {\n cur?.cancel();\n return null;\n });\n // Honor a host that forces manual upload (e.g. native shells / no DOM).\n setPhase(capture?.mode === \"manual\" ? { kind: \"manual\" } : { kind: \"idle\" });\n return () => {\n captureCancelledRef.current = true;\n };\n }, [isOpen, capture]);\n\n // Body scroll-lock + remember/restore focus while the modal is open.\n // Restore is wired through pagehide as well, so a navigation or a host\n // app crash while the modal is open can't leave the page unscrollable.\n useEffect(() => {\n if (!isOpen) return;\n previouslyFocusedRef.current =\n (document.activeElement as HTMLElement | null) ?? null;\n const html = document.documentElement;\n const prevOverflow = html.style.overflow;\n const prevPaddingRight = html.style.paddingRight;\n const scrollbar = window.innerWidth - html.clientWidth;\n html.style.overflow = \"hidden\";\n if (scrollbar > 0) html.style.paddingRight = `${scrollbar}px`;\n let restored = false;\n const restore = () => {\n if (restored) return;\n restored = true;\n html.style.overflow = prevOverflow;\n html.style.paddingRight = prevPaddingRight;\n try {\n previouslyFocusedRef.current?.focus?.();\n } catch {\n // focus() can throw if the prior element was removed from DOM.\n }\n };\n window.addEventListener(\"pagehide\", restore);\n return () => {\n window.removeEventListener(\"pagehide\", restore);\n restore();\n };\n }, [isOpen]);\n\n // ESC to close. Tab/Shift-Tab focus trap.\n useEffect(() => {\n if (!isOpen) return;\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n closeCapture();\n return;\n }\n if (e.key !== \"Tab\") return;\n const root = modalRef.current;\n if (!root) return;\n const focusables = getFocusable(root);\n if (focusables.length === 0) return;\n const first = focusables[0]!;\n const last = focusables[focusables.length - 1]!;\n const active = document.activeElement as HTMLElement | null;\n if (e.shiftKey && (active === first || !root.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [isOpen, closeCapture]);\n\n // Paste-to-upload while on the manual-capture fallback.\n useEffect(() => {\n if (!isOpen || phase.kind !== \"manual\") return;\n function onPaste(e: ClipboardEvent) {\n const items = Array.from(e.clipboardData?.items ?? []);\n const image = items.find((item) => item.type.startsWith(\"image/\"));\n const file = image?.getAsFile();\n if (!file) return;\n e.preventDefault();\n acceptManualScreenshot(file);\n }\n window.addEventListener(\"paste\", onPaste);\n return () => window.removeEventListener(\"paste\", onPaste);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, phase.kind]);\n\n // Voice record timer.\n useEffect(() => {\n if (!recorder) return;\n const start = Date.now();\n const id = window.setInterval(() => {\n const sec = Math.floor((Date.now() - start) / 1000);\n setRecordSecs(sec);\n if (sec >= VOICE_MAX_SECONDS) finishRecording();\n }, 250);\n return () => window.clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder]);\n\n if (!isOpen) return null;\n\n // ── Capture ───────────────────────────────────────────────────────────\n async function runCapture(mode: ScreenshotCaptureMode): Promise<boolean> {\n captureCancelledRef.current = false;\n setPhase({ kind: \"capturing\" });\n try {\n const result = await captureScreen({\n ...capture,\n mode,\n target: capture?.target ?? document.documentElement,\n });\n if (captureCancelledRef.current) return false;\n showCaptureWarnings(result);\n setPhase({ kind: \"ready\", capture: result });\n return true;\n } catch (e) {\n if (captureCancelledRef.current) return false;\n setPhase({\n kind: \"manual\",\n error:\n e instanceof Error\n ? e.message\n : \"Automatic screenshot capture was unavailable.\",\n });\n return false;\n }\n }\n\n async function selectMethod(m: CaptureMethod) {\n setMethod(m);\n // A fresh capture invalidates any previously-flattened annotation.\n setFlattenedShot(null);\n if (m !== \"video\") discardVideo();\n if (m === \"shot\") {\n await runCapture(capture?.mode ?? \"auto\");\n } else if (m === \"screen\") {\n await runCapture(\"true-screen\");\n } else {\n // Video still needs a screenshot poster for the required `screenshot`\n // field. Grab a DOM shot first, then start recording.\n const ok = await runCapture(capture?.mode ?? \"auto\");\n if (ok) await startVideo();\n }\n }\n\n function acceptManualScreenshot(file: Blob) {\n if (!file.type.startsWith(\"image/\")) {\n toast.error(\"Choose a PNG, JPEG, or WebP screenshot.\");\n return;\n }\n const result = createManualCaptureResult(file, [\n \"Manual screenshot upload used.\",\n ]);\n setPhase({ kind: \"ready\", capture: result });\n }\n\n function showCaptureWarnings(result: CaptureResult) {\n if (result.warnings.length === 0) return;\n toast.warning(\n \"Screenshot captured, but iframe, video, canvas, or cross-origin content may be incomplete.\",\n );\n }\n\n // ── Voice ─────────────────────────────────────────────────────────────\n async function startRecording() {\n try {\n const r = await recordAudio(VOICE_MAX_SECONDS);\n setRecorder(r);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Microphone unavailable\");\n }\n }\n async function finishRecording() {\n if (!recorder) return;\n try {\n const result = await recorder.stop();\n setAudio({ blob: result.blob, durationMs: result.durationMs });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not stop recording\");\n } finally {\n setRecorder(null);\n }\n }\n function discardRecording() {\n recorder?.cancel();\n setRecorder(null);\n setAudio(null);\n setRecordSecs(0);\n }\n\n // ── Screen recording ──────────────────────────────────────────────────\n async function startVideo() {\n try {\n const r = await recordVideo(VIDEO_MAX_SECONDS);\n setVideoRecorder(r);\n r.stream.getVideoTracks()[0]?.addEventListener(\"ended\", () => {\n void finishVideo();\n });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Screen capture unavailable\");\n }\n }\n async function finishVideo() {\n if (!videoRecorder) return;\n const handle = videoRecorder;\n setVideoRecorder(null);\n try {\n const result = await handle.stop();\n setVideo({ blob: result.blob, durationMs: result.durationMs });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not stop recording\");\n }\n }\n function discardVideo() {\n videoRecorder?.cancel();\n setVideoRecorder(null);\n setVideo(null);\n }\n\n // ── Navigation ────────────────────────────────────────────────────────\n const captured = phase.kind === \"ready\";\n async function goNext() {\n if (step === 1) {\n // Finalize a still-running recording before advancing so its blob is\n // ready by submit (awaited — not fire-and-forget).\n if (videoRecorder) await finishVideo();\n // Flatten the annotation now, while AnnotationLayer is still mounted.\n if (phase.kind === \"ready\") {\n const flat = await annotationRef.current?.flatten();\n setFlattenedShot(flat ?? phase.capture.blob);\n setWasAnnotated(flat != null && flat !== phase.capture.blob);\n }\n setStep(2);\n } else if (step === 2) {\n setStep(3);\n } else {\n await submit();\n }\n }\n function goBack() {\n if (step > 1) setStep((s) => (s - 1) as Step);\n }\n\n async function submit() {\n if (phase.kind !== \"ready\") return;\n const trimmed = text.trim();\n const { capture: captureResult } = phase;\n setSubmitting(true);\n setProgress(0);\n try {\n // Use the annotation flattened when we left step 1; AnnotationLayer is\n // unmounted by now so we can't re-flatten here.\n const flatScreenshot = flattenedShot ?? captureResult.blob;\n const result = await client.submit(\n {\n rawText: trimmed.length > 0 ? trimmed : undefined,\n category,\n submitterEmail: submitterEmail.trim() || undefined,\n screenshot: flatScreenshot,\n audio: audio?.blob,\n audioDurationMs: audio?.durationMs,\n video: video?.blob,\n videoDurationMs: video?.durationMs,\n context: captureContext(captureResult),\n },\n {\n onUploadProgress: (fraction) => setProgress(Math.min(0.95, fraction)),\n },\n );\n setProgress(1);\n toast.success(\"Feedback sent — thank you.\");\n void result.id;\n closeCapture();\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not submit feedback\");\n setSubmitting(false);\n }\n }\n\n function onBackdropMouseDown(e: React.MouseEvent<HTMLDivElement>) {\n if (e.target === e.currentTarget && !submitting) closeCapture();\n }\n\n const uploadingPct = Math.round(progress * 100);\n const isVideoMethod = method === \"video\";\n const nextDisabled =\n (step === 1 && !captured) || submitting;\n const nextLabel =\n step < 3\n ? \"Next\"\n : submitting\n ? uploadingPct < 95\n ? `Uploading ${uploadingPct}%…`\n : \"Almost done…\"\n : \"Send feedback\";\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Send feedback\"\n className=\"lumen-modal-backdrop\"\n data-lumen-capture-ignore=\"true\"\n onMouseDown={onBackdropMouseDown}\n >\n <div\n ref={modalRef}\n className=\"lumen-modal\"\n data-lumen-drawing={drawing ? \"true\" : undefined}\n >\n <SheetGrabber onDismiss={closeCapture} />\n\n <header className=\"lumen-modal-header\">\n <h2 className=\"lumen-modal-title\">\n <span className=\"lumen-modal-title-dot\" aria-hidden=\"true\" />\n Send feedback\n </h2>\n <button\n type=\"button\"\n onClick={closeCapture}\n className=\"lumen-icon-btn\"\n aria-label=\"Close\"\n >\n ×\n </button>\n </header>\n\n <Stepper step={step} />\n\n <div className=\"lumen-modal-body\">\n {/* ── STEP 1 — Capture ── */}\n {step === 1 ? (\n <div className=\"lumen-pane\">\n <div\n className=\"lumen-method\"\n role=\"group\"\n aria-label=\"Capture method\"\n >\n {METHODS.map((m) => (\n <button\n key={m.value}\n type=\"button\"\n className=\"lumen-method-btn\"\n aria-pressed={method === m.value}\n onClick={() => selectMethod(m.value)}\n disabled={phase.kind === \"capturing\"}\n >\n <span className=\"lumen-method-label\">{m.label}</span>\n <span className=\"lumen-method-hint\">{m.hint}</span>\n </button>\n ))}\n </div>\n\n {phase.kind === \"idle\" ? (\n <div className=\"lumen-cap-empty\">\n <p>\n Pick a capture method above — nothing is captured until you\n choose, so take your time positioning the screen.\n </p>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => setPhase({ kind: \"manual\" })}\n >\n Or upload a screenshot\n </button>\n </div>\n ) : null}\n\n {phase.kind === \"capturing\" ? (\n <p className=\"lumen-status\">\n <span className=\"lumen-spinner\" aria-hidden=\"true\" />\n Capturing…\n </p>\n ) : null}\n\n {phase.kind === \"manual\" ? (\n <div className=\"lumen-manual-capture\">\n <p className=\"lumen-status\">\n {phase.error\n ? \"Automatic capture was unavailable. Upload or paste a screenshot to continue.\"\n : \"Upload or paste a screenshot to continue.\"}\n </p>\n <label className=\"lumen-manual-drop\">\n <span>Choose or paste a screenshot</span>\n <input\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp\"\n onChange={(e) => {\n const file = e.currentTarget.files?.[0];\n if (file) acceptManualScreenshot(file);\n e.currentTarget.value = \"\";\n }}\n />\n </label>\n </div>\n ) : null}\n\n {phase.kind === \"ready\" ? (\n <>\n {!isVideoMethod ? (\n <div className=\"lumen-toolbar\">\n <div\n className=\"lumen-segmented\"\n role=\"group\"\n aria-label=\"Annotation tool\"\n >\n <ToolButton\n label=\"Arrow\"\n active={tool === \"arrow\"}\n onClick={() => setTool(\"arrow\")}\n />\n <ToolButton\n label=\"Box\"\n active={tool === \"rect\"}\n onClick={() => setTool(\"rect\")}\n />\n <ToolButton\n label=\"Draw\"\n active={tool === \"freehand\"}\n onClick={() => setTool(\"freehand\")}\n />\n </div>\n <span className=\"lumen-toolbar-sep\" />\n <div\n className=\"lumen-swatches\"\n role=\"group\"\n aria-label=\"Color\"\n >\n {SWATCHES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n className=\"lumen-swatch\"\n style={{ background: s.value }}\n aria-label={s.label}\n aria-pressed={strokeColor === s.value}\n onClick={() => setStrokeColor(s.value)}\n />\n ))}\n </div>\n <div\n className=\"lumen-stroke-sizes\"\n role=\"group\"\n aria-label=\"Stroke width\"\n >\n {STROKE_SIZES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n className=\"lumen-stroke-size\"\n aria-label={s.label}\n aria-pressed={strokeWidth === s.value}\n onClick={() => setStrokeWidth(s.value)}\n >\n <span\n className=\"lumen-stroke-size-dot\"\n style={{ width: s.dot, height: s.dot }}\n />\n </button>\n ))}\n </div>\n <span className=\"lumen-toolbar-spacer\" />\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => annotationRef.current?.undo()}\n >\n Undo\n </button>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => annotationRef.current?.reset()}\n >\n Clear\n </button>\n </div>\n ) : null}\n\n <div className=\"lumen-annotate\">\n <AnnotationLayer\n ref={annotationRef}\n screenshot={phase.capture.blob}\n tool={tool}\n color={strokeColor}\n strokeWidth={strokeWidth}\n onDrawingChange={setDrawing}\n />\n </div>\n\n <div className=\"lumen-cap-actions\">\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => method && selectMethod(method)}\n >\n {isVideoMethod ? \"↻ Re-record\" : \"↻ Recapture\"}\n </button>\n {isVideoMethod ? (\n videoRecorder ? (\n <span className=\"lumen-recording\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n <span className=\"lumen-rec-time\">Recording…</span>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={finishVideo}\n >\n Stop\n </button>\n </span>\n ) : video ? (\n <span className=\"lumen-cap-note\">\n ✓ {Math.round(video.durationMs / 1000)}s recorded\n </span>\n ) : null\n ) : (\n <span className=\"lumen-cap-note\">\n {captureLabel(method)} captured · switch method above\n anytime\n </span>\n )}\n </div>\n </>\n ) : null}\n </div>\n ) : null}\n\n {/* ── STEP 2 — Describe ── */}\n {step === 2 ? (\n <div className=\"lumen-pane lumen-form\">\n <label className=\"lumen-label\">\n <span>What happened?</span>\n <textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n rows={3}\n placeholder=\"Describe the issue or idea…\"\n className=\"lumen-input\"\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n </label>\n\n <div className=\"lumen-label\">\n <span>Add a voice note (optional)</span>\n <div className=\"lumen-audio-row\">\n {!recorder && !audio ? (\n <button\n type=\"button\"\n onClick={startRecording}\n className=\"lumen-btn-ghost\"\n >\n Record voice note\n </button>\n ) : null}\n {recorder ? (\n <>\n <span className=\"lumen-recording\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n <Waveform stream={recorder.stream} />\n <span className=\"lumen-rec-time\">\n {recordSecs}s / {VOICE_MAX_SECONDS}s\n </span>\n </span>\n <button\n type=\"button\"\n onClick={finishRecording}\n className=\"lumen-btn-ghost\"\n >\n Stop\n </button>\n <button\n type=\"button\"\n onClick={discardRecording}\n className=\"lumen-btn-ghost\"\n >\n Cancel\n </button>\n </>\n ) : null}\n {audio && !recorder ? (\n <>\n <AudioPreview\n blob={audio.blob}\n durationMs={audio.durationMs}\n />\n <button\n type=\"button\"\n onClick={() => setAudio(null)}\n className=\"lumen-btn-ghost\"\n >\n Remove\n </button>\n </>\n ) : null}\n </div>\n </div>\n\n <div className=\"lumen-label\">\n <span>Category</span>\n <div\n className=\"lumen-category\"\n role=\"group\"\n aria-label=\"Feedback category\"\n >\n {CATEGORIES.map((c) => (\n <button\n key={c.value}\n type=\"button\"\n className=\"lumen-category-opt\"\n aria-pressed={category === c.value}\n onClick={() => setCategory(c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n </div>\n\n <label className=\"lumen-label\">\n <span>Your email (optional)</span>\n <input\n type=\"email\"\n value={submitterEmail}\n onChange={(e) => setSubmitterEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className=\"lumen-input\"\n />\n </label>\n </div>\n ) : null}\n\n {/* ── STEP 3 — Review ── */}\n {step === 3 ? (\n <div className=\"lumen-pane lumen-review\">\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Capture</span>\n <span className=\"lumen-review-v\">\n {captureLabel(method)}\n {wasAnnotated ? \" · annotated\" : \"\"}\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(1)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Category</span>\n <span className=\"lumen-review-v\">\n <span className=\"lumen-chip\">\n {CATEGORIES.find((c) => c.value === category)?.label}\n </span>\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(2)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Description</span>\n <span className=\"lumen-review-v\">\n {text.trim() ? (\n text.trim()\n ) : (\n <span className=\"lumen-muted-empty\">—</span>\n )}\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(2)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Material</span>\n <span className=\"lumen-review-v lumen-attach-row\">\n {audio ? (\n <span className=\"lumen-attach\">\n 🎙 Voice {Math.round(audio.durationMs / 1000)}s\n <button\n type=\"button\"\n className=\"lumen-att-x\"\n aria-label=\"Remove voice note\"\n onClick={() => setAudio(null)}\n >\n ×\n </button>\n </span>\n ) : null}\n {video ? (\n <span className=\"lumen-attach\">\n ▶ Video {Math.round(video.durationMs / 1000)}s\n <button\n type=\"button\"\n className=\"lumen-att-x\"\n aria-label=\"Remove video\"\n onClick={discardVideo}\n >\n ×\n </button>\n </span>\n ) : null}\n {submitterEmail.trim() ? (\n <span className=\"lumen-attach\">✉ {submitterEmail.trim()}</span>\n ) : null}\n {!audio && !recorder ? (\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={() => {\n setStep(2);\n void startRecording();\n }}\n >\n + Voice note\n </button>\n ) : null}\n {videoRecorder ? (\n <>\n <span className=\"lumen-attach\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n Recording…\n </span>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={finishVideo}\n >\n Stop\n </button>\n </>\n ) : !video ? (\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={startVideo}\n >\n + Screen recording\n </button>\n ) : null}\n </span>\n </div>\n </div>\n ) : null}\n </div>\n\n <footer className=\"lumen-modal-footer\">\n {submitting ? (\n <div\n className=\"lumen-progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={uploadingPct}\n >\n <div\n className=\"lumen-progress-fill\"\n style={{ width: `${uploadingPct}%` }}\n />\n </div>\n ) : null}\n <div className=\"lumen-modal-actions\">\n <button\n type=\"button\"\n onClick={step === 1 ? closeCapture : goBack}\n className=\"lumen-btn-ghost\"\n disabled={submitting}\n >\n {step === 1 ? \"Cancel\" : \"Back\"}\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n className=\"lumen-btn-primary\"\n disabled={nextDisabled}\n >\n {nextLabel}\n </button>\n </div>\n </footer>\n </div>\n </div>\n );\n}\n\nfunction captureLabel(method: CaptureMethod | null): string {\n if (method === \"video\") return \"Screen recording\";\n if (method === \"screen\") return \"Screen capture\";\n return \"Screenshot\";\n}\n\nfunction Stepper({ step }: { step: Step }) {\n const steps = [\n { n: 1, label: \"Capture\" },\n { n: 2, label: \"Describe\" },\n { n: 3, label: \"Review\" },\n ] as const;\n return (\n <div className=\"lumen-stepper\" aria-hidden=\"true\">\n {steps.map((s, i) => (\n <div\n key={s.n}\n className={\n \"lumen-step\" +\n (step === s.n ? \" lumen-step-active\" : \"\") +\n (step > s.n ? \" lumen-step-done\" : \"\")\n }\n >\n <span className=\"lumen-step-num\">{s.n}</span>\n <span className=\"lumen-step-lbl\">{s.label}</span>\n {i < steps.length - 1 ? <span className=\"lumen-step-bar\" /> : null}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ToolButton({\n label,\n active,\n onClick,\n}: {\n label: string;\n active: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"lumen-tool\"\n aria-pressed={active}\n >\n {label}\n </button>\n );\n}\n\n/** Mobile sheet drag-to-dismiss handle. Hidden on ≥ 640px via CSS. */\nfunction SheetGrabber({ onDismiss }: { onDismiss: () => void }) {\n const startYRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n const targetRef = useRef<HTMLElement | null>(null);\n\n function onPointerDown(e: React.PointerEvent<HTMLDivElement>) {\n e.currentTarget.setPointerCapture(e.pointerId);\n startYRef.current = e.clientY;\n startTimeRef.current = performance.now();\n targetRef.current = e.currentTarget.parentElement;\n }\n function onPointerMove(e: React.PointerEvent<HTMLDivElement>) {\n if (startYRef.current == null || !targetRef.current) return;\n const dy = Math.max(0, e.clientY - startYRef.current);\n targetRef.current.style.transform = `translateY(${dy}px)`;\n }\n function onPointerUp(e: React.PointerEvent<HTMLDivElement>) {\n if (startYRef.current == null || !targetRef.current) return;\n const dy = Math.max(0, e.clientY - startYRef.current);\n const dt = Math.max(1, performance.now() - startTimeRef.current);\n const velocity = dy / dt;\n targetRef.current.style.transform = \"\";\n targetRef.current.style.transition = \"\";\n startYRef.current = null;\n if (dy > 80 || velocity > 0.6) onDismiss();\n }\n\n return (\n <div\n className=\"lumen-modal-grabber\"\n aria-hidden=\"true\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n />\n );\n}\n\n/** Live mic level visualisation. Reads time-domain samples from the\n * recorder stream and renders a centred series of rounded bars that\n * ease toward each new amplitude. AudioContext + AnalyserNode are torn\n * down on unmount so the mic isn't held open by a stale graph. */\nfunction Waveform({ stream }: { stream: MediaStream }) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n const cssWidth = canvas.clientWidth || 88;\n const cssHeight = canvas.clientHeight || 22;\n canvas.width = Math.round(cssWidth * dpr);\n canvas.height = Math.round(cssHeight * dpr);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.scale(dpr, dpr);\n\n const AudioCtor: typeof AudioContext | undefined =\n window.AudioContext ??\n (window as unknown as { webkitAudioContext?: typeof AudioContext })\n .webkitAudioContext;\n if (!AudioCtor) return;\n const audioCtx = new AudioCtor();\n const source = audioCtx.createMediaStreamSource(stream);\n const analyser = audioCtx.createAnalyser();\n analyser.fftSize = 1024;\n analyser.smoothingTimeConstant = 0.6;\n source.connect(analyser);\n const data = new Uint8Array(analyser.fftSize);\n\n const BARS = 18;\n const GAP = 3;\n const MIN_H = 3;\n const barW = Math.max(2, (cssWidth - GAP * (BARS - 1)) / BARS);\n const radius = Math.min(barW / 2, 3);\n const levels = new Array<number>(BARS).fill(0);\n\n let raf = 0;\n let cancelled = false;\n function frame() {\n if (cancelled) return;\n analyser.getByteTimeDomainData(data);\n const bucketSize = Math.floor(data.length / BARS);\n ctx!.clearRect(0, 0, cssWidth, cssHeight);\n ctx!.fillStyle = getCssVar(\"--lumen-danger\") || \"rgb(239,68,68)\";\n for (let i = 0; i < BARS; i++) {\n let peak = 0;\n for (let j = 0; j < bucketSize; j++) {\n const v = Math.abs((data[i * bucketSize + j] ?? 128) - 128);\n if (v > peak) peak = v;\n }\n const target = Math.min(1, (peak / 128) * 1.8);\n const cur = levels[i] ?? 0;\n levels[i] = target > cur ? target : cur + (target - cur) * 0.35;\n const h = Math.max(MIN_H, levels[i]! * cssHeight);\n const x = i * (barW + GAP);\n const y = (cssHeight - h) / 2;\n roundRectPath(ctx!, x, y, barW, h, radius);\n ctx!.fill();\n }\n raf = requestAnimationFrame(frame);\n }\n raf = requestAnimationFrame(frame);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(raf);\n try {\n source.disconnect();\n } catch {\n /* ignore */\n }\n void audioCtx.close();\n };\n }, [stream]);\n\n return <canvas ref={canvasRef} className=\"lumen-waveform\" aria-hidden=\"true\" />;\n}\n\n/** Trace a rounded-rect path. Uses native `roundRect` when present and\n * falls back to manual arcs for older Safari/Firefox. */\nfunction roundRectPath(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): void {\n const radius = Math.min(r, w / 2, h / 2);\n ctx.beginPath();\n const anyCtx = ctx as CanvasRenderingContext2D & {\n roundRect?: (x: number, y: number, w: number, h: number, r: number) => void;\n };\n if (typeof anyCtx.roundRect === \"function\") {\n anyCtx.roundRect(x, y, w, h, radius);\n return;\n }\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n}\n\n/** Preview the recorded clip with a native <audio> element. ObjectURL is\n * revoked on unmount/swap to avoid leaking the blob into memory. */\nfunction AudioPreview({ blob, durationMs }: { blob: Blob; durationMs: number }) {\n const [url, setUrl] = useState<string>(\"\");\n useEffect(() => {\n const u = URL.createObjectURL(blob);\n setUrl(u);\n return () => {\n URL.revokeObjectURL(u);\n };\n }, [blob]);\n return (\n <div className=\"lumen-audio-preview\">\n <audio controls preload=\"metadata\" src={url} className=\"lumen-audio-el\" />\n <span className=\"lumen-audio-meta\">{Math.round(durationMs / 1000)}s</span>\n </div>\n );\n}\n\nfunction getCssVar(name: string): string {\n if (typeof window === \"undefined\") return \"\";\n return getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n}\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction getFocusable(root: HTMLElement): HTMLElement[] {\n return Array.from(\n root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((el) => !el.hasAttribute(\"disabled\") && el.offsetParent !== null);\n}\n","/**\n * Heuristic floor detector. Returns the height (px) of the tallest\n * full-width fixed element anchored near the bottom of the viewport\n * (e.g. a tab bar). 0 if nothing matches.\n *\n * Cheap by design: probes `elementsFromPoint` at three x positions,\n * walks up parents, dedupes. O(small constant) — the spec's literal\n * `querySelectorAll('*')` would be O(DOM) per measurement.\n */\nexport function detectBottomFloor(): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const w = window.innerWidth;\n const h = window.innerHeight;\n if (w === 0 || h === 0) return 0;\n\n const probeY = h - 4;\n const probeXs = [Math.round(w * 0.1), Math.round(w * 0.5), Math.round(w * 0.9)];\n const seen = new Set<Element>();\n let tallest = 0;\n\n for (const x of probeXs) {\n const stack = document.elementsFromPoint(x, probeY);\n for (const el of stack) {\n if (seen.has(el)) continue;\n seen.add(el);\n const cs = window.getComputedStyle(el);\n if (cs.position !== \"fixed\" && cs.position !== \"sticky\") continue;\n const rect = el.getBoundingClientRect();\n // Anchored at bottom: rect.bottom is within ~8px of viewport bottom.\n if (rect.bottom < h - 8) continue;\n if (rect.bottom > h + 8) continue;\n // Full-width-ish: at least 60% of the viewport.\n if (rect.width < w * 0.6) continue;\n if (rect.height > tallest) tallest = rect.height;\n }\n }\n return tallest;\n}\n\n/**\n * Measure the bottom-overlap of every node matching the given selectors.\n * Returns the tallest overlap.\n */\nexport function measureExplicitAvoid(selectors: string[]): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const h = window.innerHeight;\n let tallest = 0;\n for (const selector of selectors) {\n let nodes: NodeListOf<Element>;\n try {\n nodes = document.querySelectorAll(selector);\n } catch {\n continue;\n }\n for (const node of Array.from(nodes)) {\n const rect = node.getBoundingClientRect();\n if (rect.height === 0 || rect.width === 0) continue;\n // Bottom-overlap = how far the node extends above the bottom edge,\n // assuming it's anchored to the bottom (rect.bottom near h).\n if (rect.bottom < h - 8) continue;\n const overlap = Math.max(0, h - rect.top);\n if (overlap > tallest) tallest = overlap;\n }\n }\n return tallest;\n}\n\n/**\n * Same idea as measureExplicitAvoid but for any of the four edges.\n * Returns inset to add for the given side.\n */\nexport function measureExplicitAvoidForSide(\n selectors: string[],\n side: \"top\" | \"bottom\" | \"left\" | \"right\",\n): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const w = window.innerWidth;\n const h = window.innerHeight;\n let tallest = 0;\n for (const selector of selectors) {\n let nodes: NodeListOf<Element>;\n try {\n nodes = document.querySelectorAll(selector);\n } catch {\n continue;\n }\n for (const node of Array.from(nodes)) {\n const rect = node.getBoundingClientRect();\n if (rect.height === 0 || rect.width === 0) continue;\n let overlap = 0;\n switch (side) {\n case \"bottom\":\n if (rect.bottom < h - 8) break;\n overlap = Math.max(0, h - rect.top);\n break;\n case \"top\":\n if (rect.top > 8) break;\n overlap = Math.max(0, rect.bottom);\n break;\n case \"left\":\n if (rect.left > 8) break;\n overlap = Math.max(0, rect.right);\n break;\n case \"right\":\n if (rect.right < w - 8) break;\n overlap = Math.max(0, w - rect.left);\n break;\n }\n if (overlap > tallest) tallest = overlap;\n }\n }\n return tallest;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport {\n detectBottomFloor,\n measureExplicitAvoidForSide,\n} from \"./autoDetectAvoid\";\nimport type { ResolvedFloatingConfig } from \"./types\";\n\nexport interface CollisionInsets {\n bottom: number;\n right: number;\n left: number;\n top: number;\n}\n\n/**\n * Computes the inset (px, before safe-area) the floating trigger needs\n * for its anchored corner. Subscribes to:\n * - ResizeObserver on documentElement\n * - MutationObserver on document.body (childList/attributes)\n * - visualViewport resize/scroll\n *\n * All callbacks coalesce into a single rAF measure to avoid feedback\n * loops where our CSS-var write triggers the next observer fire.\n */\nexport function useCollisionInsets(\n config: ResolvedFloatingConfig,\n): CollisionInsets {\n const [insets, setInsets] = useState<CollisionInsets>(() => ({\n bottom: config.offset.y,\n right: config.offset.x,\n left: config.offset.x,\n top: config.offset.y,\n }));\n\n // Hold the latest insets in a ref so the rAF body can compare without\n // capturing stale state.\n const lastRef = useRef(insets);\n\n // Stable identifier for the avoid array so the effect doesn't re-run\n // every render when callers pass an inline array.\n const avoidKey = avoidToKey(config.avoid);\n const placement = config.placement;\n const offsetX = config.offset.x;\n const offsetY = config.offset.y;\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let raf = 0;\n let cancelled = false;\n\n const measure = () => {\n raf = 0;\n if (cancelled) return;\n\n const side = placement[0] === \"b\" ? \"bottom\" : \"top\";\n const xSide = placement[1] === \"r\" ? \"right\" : \"left\";\n\n let yExtra = 0;\n let xExtra = 0;\n if (config.avoid === \"auto\" && side === \"bottom\") {\n yExtra = detectBottomFloor();\n } else if (Array.isArray(config.avoid)) {\n yExtra = measureExplicitAvoidForSide(config.avoid, side);\n xExtra = measureExplicitAvoidForSide(config.avoid, xSide);\n }\n\n const next: CollisionInsets = {\n bottom: side === \"bottom\" ? offsetY + yExtra : 0,\n top: side === \"top\" ? offsetY + yExtra : 0,\n right: xSide === \"right\" ? offsetX + xExtra : 0,\n left: xSide === \"left\" ? offsetX + xExtra : 0,\n };\n const prev = lastRef.current;\n if (\n next.bottom !== prev.bottom ||\n next.top !== prev.top ||\n next.right !== prev.right ||\n next.left !== prev.left\n ) {\n lastRef.current = next;\n setInsets(next);\n }\n };\n\n const schedule = () => {\n if (raf) return;\n raf = window.requestAnimationFrame(measure);\n };\n\n schedule();\n\n const ro =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(schedule)\n : null;\n ro?.observe(document.documentElement);\n\n const mo =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(schedule)\n : null;\n mo?.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"hidden\"],\n });\n\n window.addEventListener(\"resize\", schedule);\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", schedule);\n vv?.addEventListener(\"scroll\", schedule);\n\n return () => {\n cancelled = true;\n if (raf) window.cancelAnimationFrame(raf);\n ro?.disconnect();\n mo?.disconnect();\n window.removeEventListener(\"resize\", schedule);\n vv?.removeEventListener(\"resize\", schedule);\n vv?.removeEventListener(\"scroll\", schedule);\n };\n // `config.avoid` is captured via avoidKey; safe to ignore in deps.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [placement, offsetX, offsetY, avoidKey]);\n\n return insets;\n}\n\nfunction avoidToKey(avoid: string[] | false | \"auto\"): string {\n if (avoid === false) return \"false\";\n if (avoid === \"auto\") return \"auto\";\n return avoid.join(\"|\");\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * True when the on-screen keyboard is likely visible (visualViewport has\n * shrunk by >100px). Touch devices only — desktop never returns true.\n */\nexport function useViewportKeyboard(enabled: boolean): boolean {\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n if (!enabled) {\n setOpen(false);\n return;\n }\n if (typeof window === \"undefined\") return;\n const vv = window.visualViewport;\n if (!vv) return;\n if (\n typeof window.matchMedia !== \"function\" ||\n !window.matchMedia(\"(pointer: coarse)\").matches\n ) {\n return;\n }\n\n const KEYBOARD_THRESHOLD = 100;\n let raf = 0;\n const check = () => {\n raf = 0;\n const shrink = window.innerHeight - vv.height;\n setOpen(shrink > KEYBOARD_THRESHOLD);\n };\n const schedule = () => {\n if (raf) return;\n raf = window.requestAnimationFrame(check);\n };\n\n schedule();\n vv.addEventListener(\"resize\", schedule);\n vv.addEventListener(\"scroll\", schedule);\n return () => {\n if (raf) window.cancelAnimationFrame(raf);\n vv.removeEventListener(\"resize\", schedule);\n vv.removeEventListener(\"scroll\", schedule);\n };\n }, [enabled]);\n\n return open;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport * as React from \"react\";\n\nimport { useCollisionInsets } from \"./useCollisionInsets\";\nimport { useViewportKeyboard } from \"./useViewportKeyboard\";\nimport type { ResolvedFloatingConfig } from \"./types\";\n\nexport interface FloatingTriggerProps {\n config: ResolvedFloatingConfig;\n portalTarget?: HTMLElement;\n hidden: boolean;\n onClick: () => void;\n}\n\nexport function FloatingTrigger({\n config,\n portalTarget,\n hidden,\n onClick,\n}: FloatingTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const insets = useCollisionInsets(config);\n const keyboardOpen = useViewportKeyboard(config.hideOnKeyboard);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setTarget(portalTarget ?? document.body);\n }, [portalTarget]);\n\n useOcclusionWarning(buttonRef, !hidden && !keyboardOpen);\n\n if (!target) return null;\n\n const placement = config.placement;\n const sideY = placement[0] === \"b\" ? \"bottom\" : \"top\";\n const sideX = placement[1] === \"r\" ? \"right\" : \"left\";\n\n const yPx = sideY === \"bottom\" ? insets.bottom : insets.top;\n const xPx = sideX === \"right\" ? insets.right : insets.left;\n\n const style: React.CSSProperties = {\n position: \"fixed\",\n [sideY]: config.safeArea\n ? `calc(${yPx}px + env(safe-area-inset-${sideY}, 0px))`\n : `${yPx}px`,\n [sideX]: config.safeArea\n ? `calc(${xPx}px + env(safe-area-inset-${sideX}, 0px))`\n : `${xPx}px`,\n zIndex: config.zIndex,\n opacity: hidden || keyboardOpen ? 0 : 1,\n pointerEvents: hidden || keyboardOpen ? \"none\" : \"auto\",\n transition: \"opacity 160ms ease\",\n };\n\n return createPortal(\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"lumen-btn lumen-btn-primary lumen-btn-floating\"\n style={style}\n aria-label={config.label}\n aria-hidden={hidden || keyboardOpen ? true : undefined}\n tabIndex={hidden || keyboardOpen ? -1 : 0}\n onClick={onClick}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n {config.icon}\n <span>{config.label}</span>\n </button>,\n target,\n );\n}\n\n/**\n * Dev-only: after the first stable measurement, sample the trigger's\n * center point and warn once if a higher-z-index element overlaps it.\n */\nfunction useOcclusionWarning(\n ref: React.RefObject<HTMLButtonElement | null>,\n active: boolean,\n) {\n const warnedRef = useRef(false);\n\n useEffect(() => {\n if (process.env.NODE_ENV === \"production\") return;\n if (!active) return;\n if (warnedRef.current) return;\n if (typeof window === \"undefined\") return;\n\n const t = window.setTimeout(() => {\n const el = ref.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const stack = document.elementsFromPoint(cx, cy);\n const ourZ = parseZ(window.getComputedStyle(el).zIndex);\n for (const candidate of stack) {\n if (candidate === el || el.contains(candidate)) continue;\n const cz = parseZ(window.getComputedStyle(candidate).zIndex);\n if (cz > ourZ) {\n warnedRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\"[lumen] trigger is occluded by\", candidate);\n break;\n }\n }\n }, 250);\n return () => window.clearTimeout(t);\n }, [active, ref]);\n}\n\nfunction parseZ(z: string): number {\n const n = parseInt(z, 10);\n return Number.isNaN(n) ? 0 : n;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { ReactNode, RefObject } from \"react\";\n\nexport interface InlineTriggerProps {\n mount: HTMLElement | RefObject<HTMLElement | null>;\n label: string;\n icon?: ReactNode;\n onClick: () => void;\n}\n\nexport function InlineTrigger({\n mount,\n label,\n icon,\n onClick,\n}: InlineTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const el =\n mount instanceof HTMLElement ? mount : (mount.current ?? null);\n setTarget(el);\n }, [mount]);\n\n if (!target) return null;\n\n return createPortal(\n <button\n type=\"button\"\n className=\"lumen-btn lumen-btn-primary\"\n onClick={onClick}\n aria-label={label}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n {icon}\n <span>{label}</span>\n </button>,\n target,\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type { ResolvedNotchConfig } from \"./types\";\n\nexport interface NotchTriggerProps {\n config: ResolvedNotchConfig;\n portalTarget?: HTMLElement;\n hidden: boolean;\n onClick: () => void;\n}\n\n/**\n * Edge-anchored notch. The resting state is a small tab on a screen\n * edge; on hover/tap it expands and opens the capture modal. A short\n * drag away from the edge (>16px) also opens, mimicking the iOS\n * Dynamic-Island pull gesture.\n *\n * Top edge → drag down. Right edge → drag left. Etc.\n */\nexport function NotchTrigger({\n config,\n portalTarget,\n hidden,\n onClick,\n}: NotchTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n const [expanded, setExpanded] = useState(false);\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setTarget(portalTarget ?? document.body);\n }, [portalTarget]);\n\n if (!target) return null;\n\n const className = `lumen-notch lumen-notch-${config.edge}${\n expanded ? \" lumen-notch-expanded\" : \"\"\n }`;\n\n function onPointerDown(e: React.PointerEvent<HTMLButtonElement>) {\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n setExpanded(true);\n e.currentTarget.setPointerCapture(e.pointerId);\n }\n function onPointerMove(e: React.PointerEvent<HTMLButtonElement>) {\n const start = dragStartRef.current;\n if (!start) return;\n const dx = e.clientX - start.x;\n const dy = e.clientY - start.y;\n const triggered =\n (config.edge === \"top\" && dy > 16) ||\n (config.edge === \"bottom\" && dy < -16) ||\n (config.edge === \"right\" && dx < -16) ||\n (config.edge === \"left\" && dx > 16);\n if (triggered) {\n dragStartRef.current = null;\n onClick();\n }\n }\n function onPointerUp() {\n dragStartRef.current = null;\n setExpanded(false);\n }\n function onPointerCancel() {\n dragStartRef.current = null;\n setExpanded(false);\n }\n\n return createPortal(\n <button\n type=\"button\"\n className={className}\n style={{\n zIndex: config.zIndex,\n opacity: hidden ? 0 : 1,\n pointerEvents: hidden ? \"none\" : \"auto\",\n }}\n aria-label={config.label}\n aria-hidden={hidden ? true : undefined}\n tabIndex={hidden ? -1 : 0}\n onClick={onClick}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n onMouseEnter={() => setExpanded(true)}\n onMouseLeave={() => setExpanded(false)}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n <span className=\"lumen-notch-handle\" aria-hidden=\"true\" />\n <span className=\"lumen-notch-label\">{config.icon}{config.label}</span>\n </button>,\n target,\n );\n}\n","import type { ReactNode, RefObject } from \"react\";\n\nexport type LumenTriggerPlacement = \"br\" | \"bl\" | \"tr\" | \"tl\";\n\nexport interface FloatingTriggerConfig {\n kind: \"floating\";\n placement?: LumenTriggerPlacement;\n offset?: { x?: number; y?: number };\n safeArea?: boolean;\n /** Selectors to clear; pass `false` to disable auto-detect entirely. */\n avoid?: string | string[] | false;\n hideOnKeyboard?: boolean;\n zIndex?: number;\n label?: string;\n icon?: ReactNode;\n}\n\nexport type NotchEdge = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface NotchTriggerConfig {\n kind: \"notch\";\n edge?: NotchEdge;\n label?: string;\n icon?: ReactNode;\n /** z-index for the notch tab. Default 2147483600. */\n zIndex?: number;\n}\n\nexport interface ResolvedNotchConfig {\n kind: \"notch\";\n edge: NotchEdge;\n label: string;\n icon: ReactNode | undefined;\n zIndex: number;\n}\n\nexport function resolveNotchConfig(\n cfg: NotchTriggerConfig,\n): ResolvedNotchConfig {\n return {\n kind: \"notch\",\n edge: cfg.edge ?? \"top\",\n label: cfg.label ?? \"Feedback\",\n icon: cfg.icon,\n zIndex: cfg.zIndex ?? 2147483600,\n };\n}\n\nexport interface HeadlessTriggerConfig {\n kind: \"headless\";\n}\n\nexport interface InlineTriggerConfig {\n kind: \"inline\";\n mount: HTMLElement | RefObject<HTMLElement | null>;\n label?: string;\n icon?: ReactNode;\n}\n\nexport type LumenTrigger =\n | FloatingTriggerConfig\n | NotchTriggerConfig\n | HeadlessTriggerConfig\n | InlineTriggerConfig;\n\nexport type LumenTheme =\n | \"auto\"\n | \"light\"\n | \"dark\"\n | {\n background?: string;\n foreground?: string;\n accent?: string;\n radius?: string;\n };\n\nexport interface ResolvedFloatingConfig {\n kind: \"floating\";\n placement: LumenTriggerPlacement;\n offset: { x: number; y: number };\n safeArea: boolean;\n avoid: string[] | false | \"auto\";\n hideOnKeyboard: boolean;\n zIndex: number;\n label: string;\n icon: ReactNode | undefined;\n}\n\nexport function resolveFloatingConfig(\n cfg: FloatingTriggerConfig,\n): ResolvedFloatingConfig {\n return {\n kind: \"floating\",\n placement: cfg.placement ?? \"br\",\n offset: { x: cfg.offset?.x ?? 16, y: cfg.offset?.y ?? 16 },\n safeArea: cfg.safeArea ?? true,\n avoid:\n cfg.avoid === false\n ? false\n : cfg.avoid == null\n ? \"auto\"\n : Array.isArray(cfg.avoid)\n ? cfg.avoid\n : [cfg.avoid],\n hideOnKeyboard: cfg.hideOnKeyboard ?? true,\n zIndex: cfg.zIndex ?? 2147483600,\n label: cfg.label ?? \"Feedback\",\n icon: cfg.icon,\n };\n}\n","\"use client\";\n\nimport { useEffect, useId } from \"react\";\nimport type { LumenTheme } from \"./types\";\n\nconst VAR_MAP: Record<string, keyof Extract<LumenTheme, object>> = {\n \"--lumen-bg\": \"background\",\n \"--lumen-fg\": \"foreground\",\n \"--lumen-primary\": \"accent\",\n \"--lumen-radius\": \"radius\",\n};\n\n/**\n * Applies the theme by writing CSS variables to <html> (so they reach\n * the portaled CaptureModal) and toggling a data attribute for explicit\n * light/dark. Cleanup restores prior values on unmount.\n *\n * The instance id scopes attribute cleanup so two providers don't\n * stomp each other.\n */\nexport function useApplyTheme(theme: LumenTheme | undefined): void {\n const instanceId = useId();\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const attr = `data-lumen-theme-${slug(instanceId)}`;\n const previous: Record<string, string | null> = {};\n\n if (theme === \"auto\" || theme == null) {\n // Default: rely on prefers-color-scheme already in styles.css.\n root.removeAttribute(\"data-lumen-theme\");\n } else if (theme === \"light\" || theme === \"dark\") {\n previous[\"data-lumen-theme\"] = root.getAttribute(\"data-lumen-theme\");\n root.setAttribute(\"data-lumen-theme\", theme);\n } else {\n for (const [cssVar, key] of Object.entries(VAR_MAP)) {\n const v = theme[key as keyof typeof theme];\n if (typeof v === \"string\" && v.length > 0) {\n previous[cssVar] = root.style.getPropertyValue(cssVar) || null;\n root.style.setProperty(cssVar, v);\n }\n }\n }\n root.setAttribute(attr, \"\");\n\n return () => {\n root.removeAttribute(attr);\n for (const [k, v] of Object.entries(previous)) {\n if (k.startsWith(\"--\")) {\n if (v) root.style.setProperty(k, v);\n else root.style.removeProperty(k);\n } else if (v == null) {\n root.removeAttribute(k);\n } else {\n root.setAttribute(k, v);\n }\n }\n };\n }, [theme, instanceId]);\n}\n\nfunction slug(s: string): string {\n return s.replace(/[^a-zA-Z0-9]/g, \"\");\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst PATCH_FLAG = Symbol.for(\"lumen.history.patched\");\nconst EVENT_NAME = \"lumen:locationchange\";\n\ninterface PatchedWindow extends Window {\n [PATCH_FLAG]?: true;\n}\n\n/**\n * Idempotent global patch: monkey-patches pushState/replaceState exactly\n * once per window so any number of LumenProvider instances (and React\n * StrictMode double-mounts) can subscribe without stacking patches.\n */\nfunction ensureHistoryPatch(): void {\n if (typeof window === \"undefined\") return;\n const w = window as PatchedWindow;\n if (w[PATCH_FLAG]) return;\n w[PATCH_FLAG] = true;\n\n const dispatch = () => window.dispatchEvent(new Event(EVENT_NAME));\n\n const origPush = history.pushState;\n history.pushState = function (...args: Parameters<History[\"pushState\"]>) {\n const r = origPush.apply(this, args);\n dispatch();\n return r;\n };\n const origReplace = history.replaceState;\n history.replaceState = function (\n ...args: Parameters<History[\"replaceState\"]>\n ) {\n const r = origReplace.apply(this, args);\n dispatch();\n return r;\n };\n window.addEventListener(\"popstate\", dispatch);\n}\n\n/**\n * Returns true when `predicate(location)` returns true for the current\n * location. Re-evaluates on history changes.\n */\nexport function useHideOn(\n predicate: ((location: { pathname: string }) => boolean) | undefined,\n): boolean {\n const [hidden, setHidden] = useState(false);\n\n useEffect(() => {\n if (!predicate) {\n setHidden(false);\n return;\n }\n if (typeof window === \"undefined\") return;\n ensureHistoryPatch();\n\n const evaluate = () => {\n try {\n setHidden(!!predicate({ pathname: window.location.pathname }));\n } catch {\n setHidden(false);\n }\n };\n evaluate();\n window.addEventListener(EVENT_NAME, evaluate);\n window.addEventListener(\"popstate\", evaluate);\n return () => {\n window.removeEventListener(EVENT_NAME, evaluate);\n window.removeEventListener(\"popstate\", evaluate);\n };\n }, [predicate]);\n\n return hidden;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst NATIVE_UA_TOKENS = [\n \"wv\", // generic Android WebView\n \"Capacitor\",\n \"Cordova\",\n \"Expo\",\n \"FBAN\",\n \"FBAV\",\n \"Instagram\",\n \"Line/\",\n \"Twitter\",\n];\n\n/**\n * Best-effort detection of a native shell (RN WebView, Capacitor,\n * Cordova, social-app webviews). Reported via context so hosts can\n * branch their own UI; we never auto-hide based on it.\n */\nexport function useNativeShell(): boolean {\n const [native, setNative] = useState(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const w = window as unknown as Record<string, unknown>;\n if (w.ReactNativeWebView) {\n setNative(true);\n return;\n }\n const wk = w.webkit as { messageHandlers?: unknown } | undefined;\n if (wk && wk.messageHandlers) {\n setNative(true);\n return;\n }\n const ua = navigator.userAgent || \"\";\n if (NATIVE_UA_TOKENS.some((t) => ua.includes(t))) {\n setNative(true);\n }\n }, []);\n\n return native;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport type { LumenTrigger, NotchEdge, LumenTriggerPlacement } from \"./types\";\n\nconst STORAGE_PREFIX = \"lumen.config.v1.\";\nconst STORAGE_TTL_MS = 60 * 60 * 1000; // 1h\n\ninterface CachedEntry {\n fetchedAt: number;\n trigger: LumenTrigger;\n}\n\nexport interface RemoteConfigState {\n /** Trigger from the remote config; null while loading and no cache. */\n trigger: LumenTrigger | null;\n /** Whether the SDK should render any trigger at all. */\n enabled: boolean;\n /** True until either localStorage or the network has answered. */\n loading: boolean;\n}\n\n/**\n * Fetches `/api/v1/sdk/config?apiKey=…` and caches the result in\n * localStorage so the trigger can render instantly on subsequent loads.\n *\n * Returns immediately from the cache, then revalidates in the\n * background. Falls back to `null` (caller will use its built-in\n * default) on every error path so a flaky config endpoint can never\n * break the host page.\n */\nexport function useRemoteConfig(\n apiKey: string,\n apiUrl: string,\n): RemoteConfigState {\n const [state, setState] = useState<RemoteConfigState>(() => ({\n trigger: null,\n enabled: true,\n loading: true,\n }));\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const cached = readCache(apiKey);\n if (cached) {\n setState({\n trigger: cached.trigger,\n enabled: triggerEnabled(cached.trigger),\n loading: false,\n });\n }\n\n const controller = new AbortController();\n // Hard timeout: the SDK can't hold its loading state hostage to a\n // slow or hung /sdk/config endpoint. After 5s we abort and resolve\n // to a sensible default so the host page never sees a broken widget.\n const timeoutId = window.setTimeout(() => controller.abort(), 5000);\n const url = `${apiUrl.replace(/\\/$/, \"\")}/api/v1/sdk/config?apiKey=${encodeURIComponent(apiKey)}`;\n fetch(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n signal: controller.signal,\n })\n .then(async (res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const body = (await res.json()) as { trigger?: unknown };\n const trigger = parseTrigger(body.trigger);\n if (!trigger) throw new Error(\"Malformed config response\");\n writeCache(apiKey, trigger);\n setState({\n trigger,\n enabled: triggerEnabled(trigger),\n loading: false,\n });\n })\n .catch(() => {\n // Network/parse errors fall through to defaults — never block.\n setState((prev) =>\n prev.loading\n ? { trigger: null, enabled: true, loading: false }\n : prev,\n );\n })\n .finally(() => window.clearTimeout(timeoutId));\n\n return () => {\n window.clearTimeout(timeoutId);\n controller.abort();\n };\n }, [apiKey, apiUrl]);\n\n return state;\n}\n\nfunction triggerEnabled(t: LumenTrigger): boolean {\n // The SDK type doesn't carry `enabled` directly because hosts that\n // build a trigger inline would never need it; the *remote* type does\n // ship it as the on/off toggle and we encode that here as the\n // headless variant.\n return t.kind !== \"headless\";\n}\n\nconst VALID_PLACEMENTS: readonly LumenTriggerPlacement[] = [\n \"br\",\n \"bl\",\n \"tr\",\n \"tl\",\n];\nconst VALID_EDGES: readonly NotchEdge[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\n/**\n * Defensive parser for the remote config payload. Exported for tests;\n * the hook uses it internally. Returns null when the shape is bad so\n * the caller can fall back to defaults instead of rendering garbage.\n */\nexport function parseTrigger(raw: unknown): LumenTrigger | null {\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n\n // The dashboard ships `enabled` as the on/off toggle — when off,\n // collapse to a headless trigger so the SDK renders nothing.\n if (r.enabled === false) return { kind: \"headless\" };\n\n const label = typeof r.label === \"string\" ? r.label : \"Feedback\";\n\n if (r.kind === \"floating\") {\n const placement =\n VALID_PLACEMENTS.find((p) => p === r.placement) ?? \"br\";\n return { kind: \"floating\", placement, label };\n }\n if (r.kind === \"notch\") {\n const edge = VALID_EDGES.find((e) => e === r.edge) ?? \"top\";\n return { kind: \"notch\", edge, label };\n }\n return null;\n}\n\nfunction readCache(apiKey: string): CachedEntry | null {\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + apiKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as CachedEntry;\n if (\n typeof parsed?.fetchedAt !== \"number\" ||\n Date.now() - parsed.fetchedAt > STORAGE_TTL_MS\n ) {\n return null;\n }\n const trigger = parseTrigger(parsed.trigger);\n return trigger ? { fetchedAt: parsed.fetchedAt, trigger } : null;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(apiKey: string, trigger: LumenTrigger): void {\n try {\n window.localStorage.setItem(\n STORAGE_PREFIX + apiKey,\n JSON.stringify({ fetchedAt: Date.now(), trigger }),\n );\n } catch {\n // Quota / private mode — fail silent.\n }\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport * as React from \"react\";\nimport {\n installRuntimeCapture,\n LumenClient,\n type AmplitudeIdentity,\n type LumenUser,\n type ScreenshotCaptureOptions,\n} from \"@lumen-stack/core\";\n\nimport { LumenContext, type LumenContextValue } from \"./context\";\nimport { CaptureModal } from \"./CaptureModal\";\nimport { FloatingTrigger } from \"./trigger/FloatingTrigger\";\nimport { InlineTrigger } from \"./trigger/InlineTrigger\";\nimport { NotchTrigger } from \"./trigger/NotchTrigger\";\nimport {\n resolveFloatingConfig,\n resolveNotchConfig,\n type LumenTheme,\n type LumenTrigger,\n} from \"./trigger/types\";\nimport { useApplyTheme } from \"./trigger/theme\";\nimport { useHideOn } from \"./trigger/useHideOn\";\nimport { useNativeShell } from \"./trigger/useNativeShell\";\nimport { useRemoteConfig } from \"./trigger/useRemoteConfig\";\n\nconst DEFAULT_API_URL = \"https://shakebugs.vercel.app\";\n\nexport interface LumenProviderProps {\n apiKey: string;\n /** Override the dashboard origin. Defaults to https://shakebugs.vercel.app. */\n apiUrl?: string;\n user?: LumenUser;\n /**\n * Amplitude analytics identity for the current user. When set and the\n * project has the Amplitude integration enabled, Lumen pulls this user's\n * recent event timeline at enrichment time so the AI triage understands\n * what they did before reporting. Pass what your Amplitude instance holds:\n * `amplitude={{ userId: amp.getUserId(), deviceId: amp.getDeviceId(), sessionId: String(amp.getSessionId()) }}`.\n */\n amplitude?: AmplitudeIdentity;\n /**\n * @deprecated Use `trigger` instead. `floatingButton={false}` is\n * equivalent to `trigger={{ kind: \"headless\" }}`.\n */\n floatingButton?: boolean;\n /**\n * Trigger configuration. When omitted the SDK fetches the dashboard's\n * widget config from `/api/v1/sdk/config` and renders that. Pass a\n * value here to override the dashboard config locally.\n */\n trigger?: LumenTrigger;\n /** Hide the trigger on certain routes. Modal stays open if already open. */\n hideOn?: (location: { pathname: string }) => boolean;\n theme?: LumenTheme;\n /** Where to portal the floating trigger. Defaults to document.body. */\n portalTarget?: HTMLElement;\n /** Screenshot capture behavior and optional native/custom provider. */\n capture?: ScreenshotCaptureOptions;\n /**\n * Called exactly once whenever the Lumen sheet opens (`true`) or closes\n * (`false`). Never fires on the initial mount. Correct across all trigger\n * types. No spurious `false` during the 3-step capture wizard — `isOpen`\n * stays `true` throughout.\n *\n * Use this to hide/show native UI in a WebView host. Two complementary\n * approaches work together:\n *\n * **Option A — React prop (same-process host):**\n * ```tsx\n * <LumenProvider\n * onOpenChange={(open) => tabBarRef.current?.setVisible(!open)}\n * >\n * ```\n *\n * **Option B — MutationObserver (injected JS from native shell):**\n * While Lumen is open, `document.body` carries `data-lumen-open=\"true\"`.\n * Observe it from React Native / Capacitor / Electron:\n * ```tsx\n * // React Native (App.tsx)\n * <WebView\n * injectedJavaScript={`\n * const obs = new MutationObserver(() => {\n * const open = document.body.hasAttribute('data-lumen-open');\n * window.ReactNativeWebView.postMessage(\n * JSON.stringify({ type: 'lumen:openChange', open })\n * );\n * });\n * obs.observe(document.body, {\n * attributes: true,\n * attributeFilter: ['data-lumen-open'],\n * });\n * `}\n * onMessage={(e) => {\n * const { type, open } = JSON.parse(e.nativeEvent.data);\n * if (type === 'lumen:openChange') setTabBarVisible(!open);\n * }}\n * />\n * ```\n */\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}\n\nexport function LumenProvider({\n apiKey,\n apiUrl,\n user,\n amplitude,\n floatingButton = true,\n trigger,\n hideOn,\n theme,\n portalTarget,\n capture,\n onOpenChange,\n children,\n}: LumenProviderProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [isSubmitting] = useState(false);\n const [error] = useState<Error | null>(null);\n\n const client = useMemo(\n () => new LumenClient({ apiKey, apiUrl, user, amplitude }),\n [\n apiKey,\n apiUrl,\n user?.id,\n user?.email,\n user?.name,\n amplitude?.userId,\n amplitude?.deviceId,\n amplitude?.sessionId,\n ],\n );\n\n // Patches console + fetch + XHR on mount. Idempotent — safe under\n // Strict Mode double-invocation, and a no-op on the server.\n useEffect(() => {\n installRuntimeCapture({\n ignoreUrlPrefix: (apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, \"\"),\n });\n }, [apiUrl]);\n\n // ── onOpenChange + data-lumen-open DOM attribute ─────────────────────────\n // Kept in two separate effects so the DOM attribute (which needs a cleanup\n // to survive Strict-Mode's fake-unmount cycle) and the callback (which must\n // fire exactly once per transition) stay independent.\n\n // Stable ref so inline callbacks never cause stale-closure problems.\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n\n // DOM attribute — readable by MutationObserver from injected WebView JS.\n // cleanup runs on Strict-Mode teardown AND real unmount, so the attribute\n // is always removed when this effect version is discarded.\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n if (isOpen) {\n document.body.setAttribute(\"data-lumen-open\", \"true\");\n } else {\n document.body.removeAttribute(\"data-lumen-open\");\n }\n return () => {\n document.body.removeAttribute(\"data-lumen-open\");\n };\n }, [isOpen]);\n\n // Callback — fires exactly once per real open/close transition.\n // prevIsOpenRef starts as null so the initial false on mount is skipped.\n // The `=== isOpen` guard prevents double-fire under Strict-Mode re-runs.\n const prevIsOpenRef = useRef<boolean | null>(null);\n useEffect(() => {\n if (prevIsOpenRef.current === isOpen) return;\n const prev = prevIsOpenRef.current;\n prevIsOpenRef.current = isOpen;\n if (prev === null) return; // initial mount — no transition yet\n onOpenChangeRef.current?.(isOpen);\n }, [isOpen]);\n // ─────────────────────────────────────────────────────────────────────────\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const submit = useCallback(client.submit.bind(client), [client]);\n\n const isNativeShell = useNativeShell();\n const hideTrigger = useHideOn(hideOn);\n useApplyTheme(theme);\n\n // Remote config: only fetched when the host hasn't pinned a trigger.\n // Passing the same apiUrl the LumenClient resolves to keeps the two\n // calls in lockstep.\n const remote = useRemoteConfig(\n trigger ? \"\" : apiKey,\n apiUrl ?? DEFAULT_API_URL,\n );\n\n const value = useMemo<LumenContextValue>(\n () => ({\n client,\n user,\n isOpen,\n isSubmitting,\n error,\n open,\n close,\n openCapture: open,\n closeCapture: close,\n submit,\n isNativeShell,\n capture,\n }),\n [\n client,\n user,\n isOpen,\n isSubmitting,\n error,\n open,\n close,\n submit,\n isNativeShell,\n capture,\n ],\n );\n\n const effectiveTrigger = resolveEffectiveTrigger({\n explicit: trigger,\n remote: remote.trigger,\n remoteLoading: remote.loading,\n floatingButton,\n });\n\n return (\n <LumenContext.Provider value={value}>\n {children}\n {effectiveTrigger?.kind === \"floating\" ? (\n <FloatingTrigger\n config={resolveFloatingConfig(effectiveTrigger)}\n portalTarget={portalTarget}\n hidden={hideTrigger}\n onClick={open}\n />\n ) : null}\n {effectiveTrigger?.kind === \"notch\" ? (\n <NotchTrigger\n config={resolveNotchConfig(effectiveTrigger)}\n portalTarget={portalTarget}\n hidden={hideTrigger}\n onClick={open}\n />\n ) : null}\n {effectiveTrigger?.kind === \"inline\" ? (\n <InlineTrigger\n mount={effectiveTrigger.mount}\n label={effectiveTrigger.label ?? \"Feedback\"}\n icon={effectiveTrigger.icon}\n onClick={open}\n />\n ) : null}\n <CaptureModal />\n </LumenContext.Provider>\n );\n}\n\n/**\n * Trigger resolution precedence:\n * 1. Explicit `trigger` prop wins (host opt-out from remote).\n * 2. `floatingButton={false}` → headless (legacy escape hatch).\n * 3. Remote config from /api/v1/sdk/config.\n * 4. While remote is still loading without a cached value, render\n * nothing (avoids a flash of the default in the wrong place).\n * 5. If remote ultimately fails, fall back to the floating default\n * so the host always has *something*.\n */\nfunction resolveEffectiveTrigger(args: {\n explicit: LumenTrigger | undefined;\n remote: LumenTrigger | null;\n remoteLoading: boolean;\n floatingButton: boolean;\n}): LumenTrigger | null {\n if (args.explicit) return args.explicit;\n if (args.floatingButton === false) return { kind: \"headless\" };\n if (args.remote) return args.remote;\n if (args.remoteLoading) return null;\n return { kind: \"floating\" };\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useLumen } from \"./context\";\n\nexport interface FeedbackButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"default\" | \"ghost\" | \"outline\";\n /** Render fixed in the bottom-right corner. */\n floating?: boolean;\n}\n\nexport function FeedbackButton({\n variant = \"default\",\n floating = false,\n className,\n children = \"Feedback\",\n onClick,\n ...rest\n}: FeedbackButtonProps) {\n const { openCapture } = useLumen();\n const cls = [\n \"lumen-btn\",\n variant === \"default\" ? \"lumen-btn-primary\" : null,\n variant === \"ghost\" ? \"lumen-btn-ghost\" : null,\n variant === \"outline\" ? \"lumen-btn-outline\" : null,\n floating ? \"lumen-btn-floating\" : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n type=\"button\"\n className={cls}\n onClick={(e) => {\n onClick?.(e);\n if (!e.defaultPrevented) openCapture();\n }}\n {...rest}\n >\n {children}\n </button>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../core/src/errors.ts","../../core/src/client.ts","../../core/src/capture-screenshot.ts","../../core/src/capture-runtime.ts","../../core/src/capture-context.ts","../../core/src/native-bridge.ts","../../core/src/dom-contract.ts","../../core/src/record-audio.ts","../../core/src/record-video.ts","../src/context.ts","../src/AnnotationLayer.tsx","../src/CaptureModal.tsx","../src/trigger/autoDetectAvoid.ts","../src/trigger/useCollisionInsets.ts","../src/trigger/useViewportKeyboard.ts","../src/trigger/FloatingTrigger.tsx","../src/trigger/InlineTrigger.tsx","../src/trigger/NotchTrigger.tsx","../src/trigger/types.ts","../src/trigger/theme.ts","../src/trigger/useHideOn.ts","../src/trigger/useNativeShell.ts","../src/trigger/useRemoteConfig.ts","../src/trigger/useShakeToOpen.ts","../src/LumenProvider.tsx","../src/FeedbackButton.tsx"],"names":["LumenError","message","code","status","LumenOriginError","LumenRateLimitError","retryAfter","LumenNetworkError","DEFAULT_API_URL","SUBMIT_PATH","RETRYABLE_STATUSES","LumenClient","config","payload","options","url","body","#buildFormData","lastError","attempt","wait","#sendOnce","e","fd","amplitude","context","screenshotFilename","resolve","reject","xhr","onUploadProgress","signal","onAbort","parseError","parsed","blob","ms","r","text","obj","DEFAULT_MAX_SCALE","MAX_SCREENSHOT_BYTES","captureScreen","assertBrowser","mode","normalizeProviderResult","captureDisplayMedia","captureDom","domError","canUseDisplayMedia","result","uniq","createManualCaptureResult","warnings","viewport","currentViewport","html2canvas","loadHtml2Canvas","target","scale","collectDomWarnings","canvas","el","encodeCanvas","stream","video","waitForVideoFrame","ctx","track","normalized","crossOriginImages","img","src","canvasToBlob","working","ratio","next","quality","type","visual","done","fail","start","MAX_WAIT_MS","values","consoleBuf","networkBuf","installed","ignoreUrlPrefix","installRuntimeCapture","patchConsole","patchFetch","patchXhr","readRuntimeCapture","pushBounded","buf","entry","safeStringify","args","out","arg","replacer","joined","_key","value","levels","level","original","isIgnored","originalFetch","input","init","method","started","res","truncate","OriginalXHR","originalOpen","originalSend","rest","meta","onDone","s","captureContext","capture","toCaptureMetadata","runtime","snapshotDevice","device","LUMEN_SHAKE_MESSAGE","DEFAULT_TIMEOUT_MS","DEFAULT_CAPTURE_SETTLE_MS","DEFAULT_CONCEAL","createNativeCaptureProvider","registry","ensureRegistry","send","defaultSend","timeoutMs","captureSettleMs","id","newRequestId","restore","conceal","settleAfterConceal","response","timer","dataUrlToBlob","platform","detectPlatform","request","rn","dataUrl","pixelRatio","error","onMessage","event","data","parseMessage","selector","hidden","prev","nextAnimationFrame","ua","match","mime","isBase64","binary","bytes","i","LUMEN_ROOT_SELECTOR","LUMEN_MARKER_SELECTOR","isLumenEventTarget","path","isLumenNode","recordAudio","maxSeconds","mimeType","m","recorder","chunks","timeoutId","release","durationMs","finalType","recordVideo","videoTrack","LumenContext","createContext","useLumen","useContext","AnnotationLayer","screenshot","tool","color","strokeWidth","onDrawingChange","ref","baseCanvasRef","useRef","overlayCanvasRef","containerRef","imageBitmap","setImageBitmap","useState","annotations","setAnnotations","draftRef","isDrawingRef","lastSampleAtRef","rafPendingRef","useEffect","cancelled","decoded","bm","base","overlay","redraw","useImperativeHandle","cur","draft","all","anno","drawAnno","clientToCanvas","c","rect","sx","sy","scheduleDraftPaint","onPointerDown","p","onPointerMove","last","dist2","now","elapsed","onPointerUp","dx","dy","jsxs","jsx","x","y","w","h","drawSmoothPath","from","to","width","angle","head","points","first","second","mx","my","VOICE_MAX_SECONDS","VIDEO_MAX_SECONDS","SWATCHES","STROKE_SIZES","CATEGORIES","METHODS","CaptureModal","client","isOpen","closeCapture","user","initialCapture","initialCaptureError","step","setStep","setMethod","phase","setPhase","submitting","setSubmitting","progress","setProgress","flattenedShot","setFlattenedShot","wasAnnotated","setWasAnnotated","setTool","strokeColor","setStrokeColor","setStrokeWidth","setText","category","setCategory","submitterEmail","setSubmitterEmail","setRecorder","audio","setAudio","recordSecs","setRecordSecs","videoRecorder","setVideoRecorder","setVideo","drawing","setDrawing","annotationRef","modalRef","previouslyFocusedRef","captureCancelledRef","html","prevOverflow","prevPaddingRight","scrollbar","restored","onKey","root","focusables","getFocusable","active","onPaste","file","item","acceptManualScreenshot","sec","finishRecording","runCapture","C","showCaptureWarnings","selectMethod","discardVideo","startVideo","toast","J","startRecording","_e","discardRecording","Ne","finishVideo","handle","captured","goNext","flat","submit","goBack","trimmed","captureResult","flatScreenshot","_","fraction","onBackdropMouseDown","uploadingPct","isVideoMethod","nextDisabled","nextLabel","SheetGrabber","Stepper","Fragment","ToolButton","captureLabel","Waveform","AudioPreview","steps","label","onClick","onDismiss","startYRef","startTimeRef","targetRef","dt","velocity","canvasRef","dpr","cssWidth","cssHeight","AudioCtor","audioCtx","source","analyser","BARS","GAP","MIN_H","barW","radius","raf","frame","bucketSize","getCssVar","peak","j","v","roundRectPath","anyCtx","setUrl","u","name","FOCUSABLE_SELECTOR","detectBottomFloor","probeY","probeXs","seen","tallest","stack","cs","measureExplicitAvoidForSide","selectors","side","nodes","node","overlap","useCollisionInsets","insets","setInsets","lastRef","avoidKey","avoidToKey","placement","offsetX","offsetY","measure","xSide","yExtra","xExtra","schedule","ro","mo","vv","avoid","useViewportKeyboard","enabled","open","setOpen","KEYBOARD_THRESHOLD","check","shrink","FloatingTrigger","portalTarget","setTarget","buttonRef","keyboardOpen","useOcclusionWarning","sideY","sideX","yPx","xPx","style","createPortal","warnedRef","t","cx","cy","ourZ","parseZ","candidate","z","n","InlineTrigger","mount","icon","NotchTrigger","onActivatePointerDown","expanded","setExpanded","dragStartRef","className","onPointerCancel","resolveNotchConfig","cfg","resolveFloatingConfig","VAR_MAP","useApplyTheme","theme","instanceId","useId","attr","slug","previous","cssVar","key","k","PATCH_FLAG","EVENT_NAME","ensureHistoryPatch","dispatch","origPush","origReplace","useHideOn","predicate","setHidden","evaluate","NATIVE_UA_TOKENS","useNativeShell","native","setNative","wk","STORAGE_PREFIX","STORAGE_TTL_MS","useRemoteConfig","apiKey","apiUrl","state","setState","cached","readCache","triggerEnabled","controller","trigger","parseTrigger","shake","parseShake","writeCache","VALID_PLACEMENTS","VALID_EDGES","raw","isShakeMessage","me","createMotionShakeDetector","threshold","neededHits","windowMs","throttleMs","hits","delta","useShakeToOpen","onShake","lastFire","COOLDOWN_MS","fire","detector","onMotion","a","hasMotion","LumenProvider","floatingButton","hideOn","shakeToOpen","onOpenChange","beforeOpen","onTriggerActivate","children","setIsOpen","isOpening","setIsOpening","setInitialCapture","setInitialCaptureError","isSubmitting","openingRef","triggerPreparedRef","triggerPreparePromiseRef","useMemo","ne","onOpenChangeRef","prevIsOpenRef","beforeOpenRef","onTriggerActivateRef","prepareTriggerOpen","useCallback","close","isNativeShell","hideTrigger","remote","effectiveShake","effectiveTrigger","resolveEffectiveTrigger","FeedbackButton","variant","floating","openCapture","cls"],"mappings":"gQAAO,IAAMA,CAAAA,CAAN,cAAyB,KAAM,CACpC,WAAA,CACEC,EACgBC,CAAAA,CACAC,CAAAA,CAChB,CACA,KAAA,CAAMF,CAAO,CAAA,CAHG,KAAA,IAAA,CAAAC,CAAAA,CACA,KAAA,MAAA,CAAAC,CAAAA,CAGhB,KAAK,IAAA,CAAO,aACd,CALkB,IAAA,CACA,MAKpB,CAAA,CAEaC,GAAN,cAA+BJ,CAAW,CAC/C,WAAA,EAAc,CACZ,MACE,qEAAA,CACA,oBAAA,CACA,GACF,CAAA,CACA,IAAA,CAAK,IAAA,CAAO,mBACd,CACF,CAAA,CAEaK,GAAN,cAAkCL,CAAW,CAClD,WAAA,CAA4BM,CAAAA,CAAoB,CAC9C,KAAA,CACE,CAAA,gCAAA,EAA8BA,CAAU,KACxC,cAAA,CACA,GACF,EAL0B,IAAA,CAAA,UAAA,CAAAA,EAM1B,IAAA,CAAK,IAAA,CAAO,sBACd,CAP4B,UAQ9B,CAAA,CAEaC,GAAN,cAAgCP,CAAW,CAChD,WAAA,CAAYC,CAAAA,CAAiB,CAC3B,KAAA,CAAMA,CAAAA,CAAS,eAAe,CAAA,CAC9B,IAAA,CAAK,IAAA,CAAO,oBACd,CACF,CAAA,CCvBMO,EAAAA,CAAkB,8BAAA,CAClBC,EAAAA,CAAc,oBAAA,CAEdC,GAAqB,IAAI,GAAA,CAAI,CAAC,GAAA,CAAK,GAAA,CAAK,GAAG,CAAC,CAAA,CAErCC,EAAAA,CAAN,KAAkB,CACd,MAAA,CACA,OACT,IAAA,CACA,SAAA,CAEA,WAAA,CAAYC,CAAAA,CAA2B,CACrC,GAAI,CAACA,CAAAA,CAAO,MAAA,EAAU,CAACA,CAAAA,CAAO,MAAA,CAAO,WAAW,SAAS,CAAA,CACvD,MAAM,IAAIZ,CAAAA,CACR,qEAAA,CACA,iBACF,CAAA,CAEF,IAAA,CAAK,OAASY,CAAAA,CAAO,MAAA,CACrB,KAAK,MAAA,CAAA,CAAUA,CAAAA,CAAO,MAAA,EAAUJ,EAAAA,EAAiB,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAClE,IAAA,CAAK,KAAOI,CAAAA,CAAO,IAAA,CACnB,KAAK,SAAA,CAAYA,CAAAA,CAAO,UAC1B,CAOA,MAAM,MAAA,CACJC,EACAC,CAAAA,CAAyB,GACF,CACvB,IAAMC,EAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAGN,EAAW,CAAA,CAAA,CAClCO,EAAO,IAAA,CAAKC,EAAAA,CAAeJ,CAAO,CAAA,CAEpCK,CAAAA,CAAqB,KACzB,IAAA,IAASC,CAAAA,CAAU,CAAA,CAAGA,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAAA,CAAW,CACxCA,CAAAA,CAAU,CAAA,EACZ,MAAMC,EAAAA,CAAK,CAAA,EAAKD,EAAU,GAAG,CAAA,CAE/B,GAAI,CACF,OAAO,MAAM,KAAKE,EAAAA,CAAUN,CAAAA,CAAKC,CAAAA,CAAMF,CAAO,CAChD,CAAA,MAASQ,EAAG,CASV,GARAJ,CAAAA,CAAYI,CAAAA,CAGVA,CAAAA,YAAalB,EAAAA,EACbkB,aAAajB,EAAAA,EAKbiB,CAAAA,YAAatB,GACb,OAAOsB,CAAAA,CAAE,QAAW,QAAA,EACpB,CAACZ,EAAAA,CAAmB,GAAA,CAAIY,CAAAA,CAAE,MAAM,EAEhC,MAAMA,CAEV,CACF,CACA,MAAIJ,aAAqB,KAAA,CAAaA,CAAAA,CAChC,IAAIX,EAAAA,CAAkB,iCAAiC,CAC/D,CAEAU,EAAAA,CAAeJ,CAAAA,CAAkC,CAC/C,IAAMU,CAAAA,CAAK,IAAI,QAAA,CACXV,CAAAA,CAAQ,OAAA,EAASU,CAAAA,CAAG,MAAA,CAAO,SAAA,CAAWV,EAAQ,OAAO,CAAA,CACrDA,EAAQ,QAAA,EAAUU,CAAAA,CAAG,OAAO,UAAA,CAAYV,CAAAA,CAAQ,QAAQ,CAAA,CACxDA,CAAAA,CAAQ,cAAA,EAAgBU,EAAG,MAAA,CAAO,gBAAA,CAAkBV,EAAQ,cAAc,CAAA,CAC1EA,EAAQ,oBAAA,EACVU,CAAAA,CAAG,MAAA,CAAO,sBAAA,CAAwBV,CAAAA,CAAQ,oBAAoB,EAMhE,IAAMW,CAAAA,CAAYX,EAAQ,OAAA,CAAQ,SAAA,EAAa,KAAK,SAAA,CAC9CY,CAAAA,CAAUD,CAAAA,CACZ,CAAE,GAAGX,CAAAA,CAAQ,QAAS,SAAA,CAAAW,CAAU,EAChCX,CAAAA,CAAQ,OAAA,CACZ,OAAAU,CAAAA,CAAG,MAAA,CAAO,SAAA,CAAW,IAAA,CAAK,SAAA,CAAUE,CAAO,CAAC,CAAA,CACxCZ,CAAAA,CAAQ,UAAA,EACVU,CAAAA,CAAG,MAAA,CACD,YAAA,CACAV,EAAQ,UAAA,CACRa,EAAAA,CAAmBb,CAAAA,CAAQ,UAAU,CACvC,CAAA,CAEEA,EAAQ,KAAA,EACVU,CAAAA,CAAG,OAAO,OAAA,CAASV,CAAAA,CAAQ,MAAO,OAAO,CAAA,CAEvCA,CAAAA,CAAQ,eAAA,EAAmB,IAAA,EAC7BU,CAAAA,CAAG,OAAO,iBAAA,CAAmB,MAAA,CAAOV,EAAQ,eAAe,CAAC,EAE1DA,CAAAA,CAAQ,KAAA,EACVU,CAAAA,CAAG,MAAA,CAAO,OAAA,CAASV,CAAAA,CAAQ,MAAO,OAAO,CAAA,CAEvCA,EAAQ,eAAA,EAAmB,IAAA,EAC7BU,EAAG,MAAA,CAAO,iBAAA,CAAmB,MAAA,CAAOV,CAAAA,CAAQ,eAAe,CAAC,EAOvDU,CACT,CAEAF,EAAAA,CACEN,CAAAA,CACAC,CAAAA,CACAF,CAAAA,CACuB,CACvB,OAAO,IAAI,OAAA,CAAQ,CAACa,CAAAA,CAASC,CAAAA,GAAW,CACtC,IAAMC,CAAAA,CAAM,IAAI,cAAA,CAChBA,CAAAA,CAAI,KAAK,MAAA,CAAQd,CAAAA,CAAK,IAAI,CAAA,CAC1Bc,CAAAA,CAAI,gBAAA,CAAiB,kBAAmB,IAAA,CAAK,MAAM,EACnDA,CAAAA,CAAI,YAAA,CAAe,OAEnB,GAAM,CAAE,gBAAA,CAAAC,CAAAA,CAAkB,MAAA,CAAAC,CAAO,EAAIjB,CAAAA,CAEjCgB,CAAAA,EACFD,EAAI,MAAA,CAAO,gBAAA,CAAiB,WAAaP,CAAAA,EAAM,CACzCA,CAAAA,CAAE,gBAAA,EAAoBA,CAAAA,CAAE,KAAA,CAAQ,GAClCQ,CAAAA,CAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGR,CAAAA,CAAE,MAAA,CAASA,EAAE,KAAK,CAAC,EAEpD,CAAC,CAAA,CAGH,IAAMU,EAAU,IAAM,CACpBH,EAAI,KAAA,EAAA,CACJD,EAAO,IAAIrB,EAAAA,CAAkB,iBAAiB,CAAC,EACjD,CAAA,CACA,GAAIwB,CAAAA,CAAQ,CACV,GAAIA,CAAAA,CAAO,OAAA,CAAS,CAClBH,CAAAA,CAAO,IAAIrB,EAAAA,CAAkB,iBAAiB,CAAC,CAAA,CAC/C,MACF,CACAwB,CAAAA,CAAO,iBAAiB,OAAA,CAASC,CAAAA,CAAS,CAAE,IAAA,CAAM,IAAK,CAAC,EAC1D,CAEAH,CAAAA,CAAI,iBAAiB,MAAA,CAAQ,IAAM,CAGjC,GAFIE,CAAAA,EAAQA,EAAO,mBAAA,CAAoB,OAAA,CAASC,CAAO,CAAA,CAEnDH,CAAAA,CAAI,MAAA,GAAW,IAAK,CACtBD,CAAAA,CAAO,IAAIxB,EAAkB,CAAA,CAC7B,MACF,CACA,GAAIyB,CAAAA,CAAI,MAAA,GAAW,GAAA,CAAK,CACtB,IAAMvB,CAAAA,CAAa,MAAA,CAAOuB,EAAI,iBAAA,CAAkB,aAAa,CAAC,CAAA,EAAK,EAAA,CACnED,CAAAA,CAAO,IAAIvB,EAAAA,CAAoBC,CAAU,CAAC,CAAA,CAC1C,MACF,CACA,GAAIuB,CAAAA,CAAI,OAAS,GAAA,EAAOA,CAAAA,CAAI,MAAA,EAAU,GAAA,CAAK,CACzCD,CAAAA,CACE,IAAI5B,CAAAA,CACFiC,EAAAA,CAAWJ,CAAAA,CAAI,YAAY,CAAA,EAAK,CAAA,KAAA,EAAQA,EAAI,MAAM,CAAA,CAAA,CAClD,YAAA,CACAA,CAAAA,CAAI,MACN,CACF,EACA,MACF,CACA,GAAI,CACF,IAAMK,EAAS,IAAA,CAAK,KAAA,CAAML,CAAAA,CAAI,YAAY,CAAA,CAC1CF,CAAAA,CAAQO,CAAM,EAChB,CAAA,KAAQ,CACNN,CAAAA,CAAO,IAAI5B,EAAW,iCAAA,CAAmC,cAAc,CAAC,EAC1E,CACF,CAAC,EAED6B,CAAAA,CAAI,gBAAA,CAAiB,QAAS,IAAM,CAC9BE,GAAQA,CAAAA,CAAO,mBAAA,CAAoB,OAAA,CAASC,CAAO,CAAA,CACvDJ,CAAAA,CAAO,IAAIrB,EAAAA,CAAkB,8BAA8B,CAAC,EAC9D,CAAC,EAEDsB,CAAAA,CAAI,IAAA,CAAKb,CAAI,EACf,CAAC,CACH,CACF,CAAA,CAEA,SAASU,GAAmBS,CAAAA,CAAoB,CAO9C,OAAO,CAAA,WAAA,EALLA,CAAAA,CAAK,IAAA,GAAS,YAAA,CACV,KAAA,CACAA,CAAAA,CAAK,OAAS,YAAA,CACZ,MAAA,CACA,KACgB,CAAA,CAC1B,CAEA,SAASf,EAAAA,CAAKgB,CAAAA,CAA2B,CACvC,OAAO,IAAI,OAAA,CAASC,GAAM,UAAA,CAAWA,CAAAA,CAAGD,CAAE,CAAC,CAC7C,CAEA,SAASH,EAAAA,CAAWK,CAAAA,CAA6B,CAC/C,GAAI,CACF,IAAMC,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAMD,CAAI,CAAA,CAC3B,OAAOC,EAAI,KAAA,EAASA,CAAAA,CAAI,OAAA,EAAW,IACrC,CAAA,KAAQ,CACN,OAAOD,CAAAA,EAAQ,IACjB,CACF,CCpNA,IAAME,GAAoB,CAAA,CACpBC,EAAAA,CAAuB,CAAA,CAAI,IAAA,CAAO,IAAA,CAiBxC,eAAsBC,GACpB5B,CAAAA,CAAoC,GACZ,CACxB6B,EAAAA,GAEA,IAAMC,CAAAA,CAAO9B,CAAAA,CAAQ,IAAA,EAAQ,MAAA,CAE7B,GAAIA,EAAQ,QAAA,GAAa8B,CAAAA,GAAS,QAAUA,CAAAA,GAAS,QAAA,CAAA,CACnD,GAAI,CACF,OAAOC,EAAAA,CAAwB,MAAM/B,CAAAA,CAAQ,QAAA,GAAYA,CAAO,CAClE,OAASQ,CAAAA,CAAG,CACV,GAAIsB,CAAAA,GAAS,QAAA,CAAU,MAAMtB,CAAAA,CAE7BR,CAAAA,CAAQ,SAAA,GAAY,CAClB,sEACF,CAAC,EACH,CAGF,GAAI8B,IAAS,QAAA,CACX,MAAM,IAAI5C,CAAAA,CACR,6DAAA,CACA,yBACF,EAGF,GAAI4C,CAAAA,GAAS,cACX,OAAOE,EAAAA,CAAoBhC,CAAO,CAAA,CAGpC,GAAI8B,CAAAA,GAAS,KAAA,CACX,OAAOG,EAAAA,CAAWjC,CAAO,CAAA,CAG3B,GAAI8B,IAAS,QAAA,CACX,MAAM,IAAI5C,CAAAA,CACR,+DAAA,CACA,2BACF,CAAA,CAGF,GAAI,CACF,OAAO,MAAM+C,EAAAA,CAAWjC,CAAO,CACjC,CAAA,MAASkC,CAAAA,CAAU,CACjB,GAAIC,EAAAA,EAAAA,CAAsB,CACxB,IAAMC,CAAAA,CAAS,MAAMJ,EAAAA,CAAoBhC,CAAO,EAChD,OAAAoC,CAAAA,CAAO,SAAWC,EAAAA,CAAK,CACrB,iEAAA,CACA,GAAGD,CAAAA,CAAO,QACZ,CAAC,CAAA,CACDpC,CAAAA,CAAQ,YAAYoC,CAAAA,CAAO,QAAQ,EAC5BA,CACT,CACA,MAAMF,CACR,CACF,CAcO,SAASI,EAAAA,CACdjB,CAAAA,CACAkB,EAAqB,EAAA,CACN,CACfV,EAAAA,EAAAA,CACA,IAAMW,CAAAA,CAAWC,EAAAA,EAAAA,CACjB,OAAO,CACL,IAAA,CAAApB,CAAAA,CACA,MAAA,CAAQ,eAAA,CACR,QAAA,CAAU,MACV,QAAA,CAAAmB,CAAAA,CACA,UAAA,CAAY,MAAA,CAAO,gBAAA,EAAoB,CAAA,CACvC,SAAUH,EAAAA,CAAKE,CAAQ,CACzB,CACF,CAEA,eAAeN,EAAAA,CACbjC,CAAAA,CACwB,CACxB,IAAM0C,CAAAA,CAAc,MAAMC,IAAAA,CAEpBC,CAAAA,CAAS5C,EAAQ,MAAA,EAAU,QAAA,CAAS,gBACpCwC,CAAAA,CAAWC,EAAAA,EAAAA,CACXI,CAAAA,CAAQ,IAAA,CAAK,GAAA,CACjB,EACA,IAAA,CAAK,GAAA,CAAI,OAAO,gBAAA,EAAoB,CAAA,CAAG7C,EAAQ,QAAA,EAAY0B,EAAiB,CAC9E,CAAA,CACMa,CAAAA,CAAWO,EAAAA,CAAmBF,CAAM,CAAA,CAEpCG,CAAAA,CAAS,MAAML,CAAAA,CAAYE,CAAAA,CAAQ,CACvC,gBAAiB,IAAA,CACjB,OAAA,CAAS,KAAA,CACT,OAAA,CAAS,IAAA,CACT,UAAA,CAAY,MACZ,KAAA,CAAOJ,CAAAA,CAAS,MAChB,MAAA,CAAQA,CAAAA,CAAS,OACjB,WAAA,CAAaA,CAAAA,CAAS,KAAA,CACtB,YAAA,CAAcA,CAAAA,CAAS,MAAA,CACvB,QAAS,MAAA,CAAO,OAAA,CAChB,QAAS,MAAA,CAAO,OAAA,CAChB,EAAG,MAAA,CAAO,OAAA,CACV,CAAA,CAAG,MAAA,CAAO,OAAA,CACV,KAAA,CAAAK,EACA,cAAA,CAAiBG,CAAAA,EACfA,aAAc,WAAA,GACbA,CAAAA,CAAG,QAAQ,kBAAA,GAAuB,MAAA,EACjC,CAAA,CAAQA,CAAAA,CAAG,OAAA,CAAQ,oCAAoC,CAAA,CAC7D,CAAC,EAGKZ,CAAAA,CAAS,CACb,KAFW,MAAMa,EAAAA,CAAaF,CAAAA,CAAQR,CAAQ,CAAA,CAG9C,MAAA,CAAQ,UACR,QAAA,CAAU,KAAA,CACV,SAAAC,CAAAA,CACA,UAAA,CAAYK,EACZ,QAAA,CAAUR,EAAAA,CAAKE,CAAQ,CACzB,CAAA,CACA,OAAIH,EAAO,QAAA,CAAS,MAAA,CAAS,GAAGpC,CAAAA,CAAQ,SAAA,GAAYoC,EAAO,QAAQ,CAAA,CAC5DA,CACT,CAEA,eAAeO,EAAAA,EAAwC,CAErD,GAAM,CAAE,QAASD,CAAY,CAAA,CAAI,MAAM,OAAO,iBAAiB,CAAA,CAC/D,OAAOA,CACT,CAEA,eAAeV,EAAAA,CACbhC,CAAAA,CACwB,CACxB,GAAI,CAACmC,EAAAA,GACH,MAAM,IAAIjD,CAAAA,CACR,4DAAA,CACA,2BACF,CAAA,CAGF,IAAMgE,CAAAA,CAAS,MAAM,UAAU,YAAA,CAAa,eAAA,CAAgB,CAC1D,KAAA,CAAO,IAAA,CACP,KAAA,CAAO,KACT,CAAC,CAAA,CAED,GAAI,CACF,IAAMC,EAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,CAC5CA,CAAAA,CAAM,KAAA,CAAQ,CAAA,CAAA,CACdA,CAAAA,CAAM,WAAA,CAAc,GACpBA,CAAAA,CAAM,SAAA,CAAYD,EAClB,MAAME,EAAAA,CAAkBD,CAAK,CAAA,CAE7B,IAAMJ,CAAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,EAC9CA,CAAAA,CAAO,KAAA,CAAQI,EAAM,UAAA,CACrBJ,CAAAA,CAAO,OAASI,CAAAA,CAAM,WAAA,CACtB,IAAME,CAAAA,CAAMN,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAClC,GAAI,CAACM,CAAAA,CACH,MAAM,IAAInE,CAAAA,CACR,wDAAA,CACA,4BACF,CAAA,CAEFmE,CAAAA,CAAI,SAAA,CAAUF,EAAO,CAAA,CAAG,CAAA,CAAGJ,EAAO,KAAA,CAAOA,CAAAA,CAAO,MAAM,CAAA,CAEtD,IAAMP,CAAAA,CAAWC,EAAAA,EAAAA,CACXF,CAAAA,CAAW,CACf,qEACF,CAAA,CAEMH,EAAS,CACb,IAAA,CAFW,MAAMa,EAAAA,CAAaF,CAAAA,CAAQR,CAAQ,CAAA,CAG9C,MAAA,CAAQ,mBAAA,CACR,SAAU,KAAA,CACV,QAAA,CAAAC,CAAAA,CACA,UAAA,CACEA,CAAAA,CAAS,KAAA,CAAQ,EAAIO,CAAAA,CAAO,KAAA,CAAQP,CAAAA,CAAS,KAAA,CAAQ,KAAA,CAAA,CACvD,QAAA,CAAUH,GAAKE,CAAQ,CACzB,EACA,OAAAvC,CAAAA,CAAQ,YAAYoC,CAAAA,CAAO,QAAQ,CAAA,CAC5BA,CACT,CAAA,OAAA,CACE,QAAWkB,CAAAA,IAASJ,CAAAA,CAAO,WAAA,CAAaI,CAAAA,CAAM,OAChD,CACF,CAEA,SAASvB,EAAAA,CACPK,CAAAA,CACApC,EACe,CACf,IAAMwC,EAAWC,EAAAA,EAAAA,CACXc,EAAa,CACjB,GAAGnB,CAAAA,CACH,MAAA,CAAQA,CAAAA,CAAO,MAAA,EAAU,SACzB,QAAA,CAAUA,CAAAA,CAAO,UAAY,QAAA,CAC7B,QAAA,CAAUA,EAAO,QAAA,EAAYI,CAAAA,CAC7B,UAAA,CAAYJ,CAAAA,CAAO,UAAA,EAAc,MAAA,CAAO,kBAAoB,CAAA,CAC5D,QAAA,CAAUC,GAAKD,CAAAA,CAAO,QAAA,EAAY,EAAE,CACtC,CAAA,CACA,OAAImB,CAAAA,CAAW,QAAA,CAAS,OAAS,CAAA,EAAGvD,CAAAA,CAAQ,YAAYuD,CAAAA,CAAW,QAAQ,EACpEA,CACT,CAEA,SAAST,EAAAA,CAAmBF,CAAAA,CAA+B,CACzD,IAAML,CAAAA,CAAW,IAAI,IAEjBK,CAAAA,CAAO,aAAA,CAAc,QAAQ,CAAA,EAC/BL,CAAAA,CAAS,GAAA,CAAI,6DAA6D,CAAA,CAExEK,CAAAA,CAAO,cAAc,OAAO,CAAA,EAC9BL,CAAAA,CAAS,GAAA,CAAI,oDAAoD,CAAA,CAE/DK,EAAO,aAAA,CAAc,QAAQ,CAAA,EAC/BL,CAAAA,CAAS,GAAA,CAAI,kEAAkE,EAE7E,QAAA,CAAS,KAAA,EAAS,SAAS,KAAA,CAAM,MAAA,GAAW,UAC9CA,CAAAA,CAAS,GAAA,CAAI,gEAAgE,CAAA,CAG/E,IAAIiB,CAAAA,CAAoB,EACxB,IAAA,IAAWC,CAAAA,IAAO,MAAM,IAAA,CAAKb,CAAAA,CAAO,iBAAiB,KAAK,CAAC,CAAA,CAAG,CAC5D,IAAMc,CAAAA,CAAMD,EAAI,UAAA,EAAcA,CAAAA,CAAI,IAClC,GAAKC,CAAAA,CACL,GAAI,CACU,IAAI,GAAA,CAAIA,CAAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CACrC,MAAA,GAAW,MAAA,CAAO,QAAA,CAAS,MAAA,EAAU,CAACD,EAAI,WAAA,GAChDD,CAAAA,EAAqB,CAAA,EAEzB,CAAA,KAAQ,CAER,CACF,CACA,OAAIA,CAAAA,CAAoB,GACtBjB,CAAAA,CAAS,GAAA,CACP,GAAGiB,CAAiB,CAAA,mBAAA,EAAsBA,CAAAA,GAAsB,CAAA,CAAI,EAAA,CAAK,GAAG,mDAC9E,CAAA,CAGK,KAAA,CAAM,KAAKjB,CAAQ,CAC5B,CAEA,eAAeU,EAAAA,CACbF,CAAAA,CACAR,CAAAA,CACe,CACf,IAAIlB,EAAO,MAAMsC,EAAAA,CAAaZ,EAAQ,WAAA,CAAa,GAAI,EACvD,GAAI1B,CAAAA,CAAK,IAAA,EAAQM,EAAAA,CAAsB,OAAON,CAAAA,CAE9CkB,EAAS,IAAA,CAAK,wDAAwD,CAAA,CAMtE,IAAIqB,CAAAA,CAAUb,CAAAA,CACV1C,EAAU,CAAA,CACd,KAAOgB,CAAAA,CAAK,IAAA,CAAOM,EAAAA,EAAwBtB,CAAAA,CAAU,GAAG,CACtD,IAAMwD,EAAQ,IAAA,CAAK,GAAA,CACjB,IACA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAM,IAAA,CAAK,IAAA,CAAKlC,EAAAA,CAAuBN,EAAK,IAAI,CAAA,CAAI,EAAG,CAClE,CAAA,CACMyC,EAAO,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC5CA,CAAAA,CAAK,KAAA,CAAQ,KAAK,GAAA,CAAI,CAAA,CAAG,KAAK,KAAA,CAAMF,CAAAA,CAAQ,MAAQC,CAAK,CAAC,CAAA,CAC1DC,CAAAA,CAAK,MAAA,CAAS,IAAA,CAAK,IAAI,CAAA,CAAG,IAAA,CAAK,MAAMF,CAAAA,CAAQ,MAAA,CAASC,CAAK,CAAC,CAAA,CAC5D,IAAMR,CAAAA,CAAMS,CAAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAChC,GAAI,CAACT,CAAAA,CAAK,OAAOhC,EACjBgC,CAAAA,CAAI,SAAA,CAAUO,CAAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAK,MAAOA,CAAAA,CAAK,MAAM,EACpDF,CAAAA,CAAUE,CAAAA,CAEV,QAAWC,CAAAA,IAAW,CAAC,GAAA,CAAM,GAAA,CAAM,GAAA,CAAM,EAAG,EAE1C,GADA1C,CAAAA,CAAO,MAAMsC,EAAAA,CAAaC,CAAAA,CAAS,aAAcG,CAAO,CAAA,CACpD1C,CAAAA,CAAK,IAAA,EAAQM,EAAAA,CAAsB,OAAON,EAIhD,GADAhB,CAAAA,EAAW,CAAA,CACPyD,CAAAA,CAAK,KAAA,CAAQ,GAAA,EAAOA,EAAK,MAAA,CAAS,GAAA,CAAK,KAC7C,CAEA,OAAIzC,CAAAA,CAAK,KAAOM,EAAAA,EACdY,CAAAA,CAAS,KACP,sEACF,CAAA,CAEKlB,CACT,CAEA,SAASsC,EAAAA,CACPZ,CAAAA,CACAiB,CAAAA,CACAD,CAAAA,CACe,CACf,OAAO,IAAI,QAAQ,CAAClD,CAAAA,CAASC,IAAW,CACtCiC,CAAAA,CAAO,MAAA,CACJ1B,CAAAA,EAAS,CACR,GAAI,CAACA,CAAAA,CAAM,CACTP,EAAO,IAAI5B,CAAAA,CAAW,+BAAgC,eAAe,CAAC,CAAA,CACtE,MACF,CACA2B,CAAAA,CAAQQ,CAAI,EACd,CAAA,CACA2C,EACAD,CACF,EACF,CAAC,CACH,CAEA,SAAStB,EAAAA,EAAqD,CAC5D,IAAMwB,EAAS,MAAA,CAAO,cAAA,CACtB,OAAO,CACL,KAAA,CAAO,KAAK,KAAA,CAAMA,CAAAA,EAAQ,KAAA,EAAS,MAAA,CAAO,UAAU,CAAA,CACpD,OAAQ,IAAA,CAAK,KAAA,CAAMA,GAAQ,MAAA,EAAU,MAAA,CAAO,WAAW,CACzD,CACF,CAEA,SAAS9B,EAAAA,EAA8B,CACrC,OAAO,CAAA,CAAQ,UAAU,YAAA,EAAc,eACzC,CAEA,eAAeiB,EAAAA,CAAkBD,CAAAA,CAAwC,CACvE,MAAM,IAAI,QAAc,CAACtC,CAAAA,CAASC,CAAAA,GAAW,CAC3C,IAAMoD,CAAAA,CAAO,IAAMrD,CAAAA,EAAAA,CACbsD,CAAAA,CAAO,IACXrD,CAAAA,CAAO,IAAI5B,EAAW,sCAAA,CAAwC,cAAc,CAAC,CAAA,CAC/EiE,CAAAA,CAAM,iBAAiB,gBAAA,CAAkBe,CAAAA,CAAM,CAAE,IAAA,CAAM,IAAK,CAAC,EAC7Df,CAAAA,CAAM,gBAAA,CAAiB,QAASgB,CAAAA,CAAM,CAAE,KAAM,IAAK,CAAC,CAAA,CAC/ChB,CAAAA,CAAM,IAAA,EAAA,CAAO,MAAMgB,CAAI,EAC9B,CAAC,CAAA,CAKD,IAAMC,EAAQ,WAAA,CAAY,GAAA,EAAA,CACpBC,CAAAA,CAAc,IAAA,CACpB,KAAOlB,EAAM,UAAA,GAAe,CAAA,EAAKA,EAAM,WAAA,GAAgB,CAAA,EAAG,CACxD,GAAI,WAAA,CAAY,GAAA,EAAA,CAAQiB,CAAAA,CAAQC,CAAAA,CAC9B,MAAM,IAAInF,CAAAA,CACR,kDACA,eACF,CAAA,CAEF,MAAM,IAAI,OAAA,CAAe2B,CAAAA,EACvB,qBAAA,CAAsB,IAAMA,CAAAA,EAAS,CACvC,EACF,CACF,CAEA,SAASgB,IAAsB,CAC7B,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,SAAa,GAAA,CACvD,MAAM,IAAI3C,CAAAA,CACR,iDAAA,CACA,aACF,CAEJ,CAEA,SAASmD,EAAAA,CAAKiC,CAAAA,CAA4B,CACxC,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAIA,CAAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAC,CACnD,CClWA,IAAMC,EAAAA,CAA6B,EAAA,CAC7BC,EAAAA,CAA6B,EAAA,CAE/BC,EAAAA,CAAY,MACZC,EAAAA,CAAiC,IAAA,CAW9B,SAASC,EAAAA,CACd3E,CAAAA,CAAwC,GAClC,CACFyE,EAAAA,EACA,OAAO,MAAA,CAAW,GAAA,GACtBA,GAAY,IAAA,CACZC,EAAAA,CAAkB1E,CAAAA,CAAQ,eAAA,EAAmB,IAAA,CAC7C4E,EAAAA,GACAC,EAAAA,EAAAA,CACAC,IAAAA,EACF,CAEO,SAASC,EAAAA,EAGd,CACA,OAAO,CACL,UAAA,CAAYR,EAAAA,CAAW,OAAA,CACvB,UAAA,CAAYC,EAAAA,CAAW,KAAA,EACzB,CACF,CAEA,SAASQ,EAAAA,CAAeC,CAAAA,CAAUC,CAAAA,CAAgB,CAChDD,CAAAA,CAAI,KAAKC,CAAK,CAAA,CACVD,EAAI,MAAA,CAAS,GAAA,EAAaA,EAAI,MAAA,CAAO,CAAA,CAAGA,CAAAA,CAAI,MAAA,CAAS,GAAW,EACtE,CAEA,SAASE,EAAAA,CAAcC,EAAyB,CAC9C,IAAMC,EAAgB,EAAA,CACtB,IAAA,IAAWC,CAAAA,IAAOF,CAAAA,CAAM,CACtB,GAAI,OAAOE,CAAAA,EAAQ,SAAU,CAC3BD,CAAAA,CAAI,KAAKC,CAAG,CAAA,CACZ,QACF,CACA,GAAIA,CAAAA,YAAe,MAAO,CACxBD,CAAAA,CAAI,IAAA,CAAK,CAAA,EAAGC,CAAAA,CAAI,IAAI,KAAKA,CAAAA,CAAI,OAAO,CAAA,EAAGA,CAAAA,CAAI,KAAA,CAAQ;AAAKA,EAAAA,CAAAA,CAAI,KAAK,CAAA,CAAA,CAAK,EAAE,CAAA,CAAE,EAC1E,QACF,CACA,GAAI,CACFD,CAAAA,CAAI,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUC,EAAKC,EAAQ,CAAC,EACxC,CAAA,KAAQ,CACNF,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAOC,CAAG,CAAC,EACtB,CACF,CACA,IAAME,CAAAA,CAASH,CAAAA,CAAI,IAAA,CAAK,GAAG,EAC3B,OAAOG,CAAAA,CAAO,MAAA,CAAS,IAAA,CACnBA,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAG,IAAU,EAAI,mBAAA,CAC9BA,CACN,CAIA,SAASD,EAAAA,CAASE,CAAAA,CAAcC,CAAAA,CAAyB,CACvD,OAAIA,CAAAA,YAAiB,OAAA,CAAgB,CAAA,SAAA,EAAaA,CAAAA,CAAkB,OAAO,CAAA,CAAA,CAAA,CACvE,OAAOA,CAAAA,EAAU,WAAmB,YAAA,CACjCA,CACT,CAEA,SAASd,IAAqB,CAC5B,IAAMhC,CAAAA,CAAS,MAAA,CAAO,QACtB,GAAI,CAACA,CAAAA,CAAQ,OACb,IAAM+C,CAAAA,CAAyB,CAAC,KAAA,CAAO,OAAQ,MAAA,CAAQ,OAAA,CAAS,OAAO,CAAA,CACvE,IAAA,IAAWC,CAAAA,IAASD,CAAAA,CAAQ,CAC1B,IAAME,CAAAA,CAAWjD,CAAAA,CAAOgD,CAAK,CAAA,EAAG,IAAA,CAAKhD,CAAM,CAAA,CACtCiD,CAAAA,GACLjD,EAAOgD,CAAK,CAAA,CAAI,CAAA,GAAIR,CAAAA,GAAoB,CACtC,GAAI,CACFJ,EAAAA,CAAYT,EAAAA,CAAY,CACtB,KAAA,CAAAqB,CAAAA,CACA,EAAA,CAAI,IAAA,CAAK,GAAA,EAAA,CACT,OAAA,CAAST,EAAAA,CAAcC,CAAI,CAC7B,CAAC,EACH,CAAA,KAAQ,CAER,CACAS,CAAAA,CAAS,GAAGT,CAAI,EAClB,CAAA,EACF,CACF,CAEA,SAASU,EAAAA,CAAU7F,CAAAA,CAAsB,CACvC,OAAKyE,EAAAA,CACEzE,CAAAA,CAAI,UAAA,CAAWyE,EAAe,EADR,KAE/B,CAEA,SAASG,EAAAA,EAAmB,CAC1B,IAAMkB,CAAAA,CAAgB,MAAA,CAAO,KAAA,CACzB,OAAOA,CAAAA,EAAkB,UAAA,GAC7B,MAAA,CAAO,MAAQ,eACbC,CAAAA,CACAC,CAAAA,CACmB,CACnB,IAAMhG,CAAAA,CACJ,OAAO+F,CAAAA,EAAU,SACbA,CAAAA,CACAA,CAAAA,YAAiB,GAAA,CACfA,CAAAA,CAAM,QAAA,EAAA,CACNA,CAAAA,CAAM,GAAA,CACRE,GAAUD,CAAAA,EAAM,MAAA,GAAWD,CAAAA,YAAiB,OAAA,CAAUA,EAAM,MAAA,CAAS,KAAA,CAAA,EAAQ,WAAA,EAAA,CACnF,GAAIF,EAAAA,CAAU7F,CAAG,CAAA,CACf,OAAO8F,CAAAA,CAAc,IAAA,CAAK,MAAA,CAAQC,CAAAA,CAAsBC,CAAI,CAAA,CAE9D,IAAME,CAAAA,CAAU,WAAA,CAAY,GAAA,EAAA,CAC5B,GAAI,CACF,IAAMC,CAAAA,CAAM,MAAML,CAAAA,CAAc,IAAA,CAAK,MAAA,CAAQC,CAAAA,CAAsBC,CAAI,CAAA,CACvE,OAAAjB,EAAAA,CAAYR,EAAAA,CAAY,CACtB,IAAA,CAAM,QACN,MAAA,CAAA0B,CAAAA,CACA,GAAA,CAAKG,EAAAA,CAASpG,CAAG,CAAA,CACjB,MAAA,CAAQmG,CAAAA,CAAI,MAAA,CACZ,EAAA,CAAIA,CAAAA,CAAI,EAAA,CACR,UAAA,CAAY,KAAK,KAAA,CAAM,WAAA,CAAY,GAAA,EAAA,CAAQD,CAAO,CAAA,CAClD,EAAA,CAAI,IAAA,CAAK,KACX,CAAC,CAAA,CACMC,CACT,CAAA,MAAS5F,CAAAA,CAAG,CACV,MAAAwE,GAAYR,EAAAA,CAAY,CACtB,IAAA,CAAM,OAAA,CACN,OAAA0B,CAAAA,CACA,GAAA,CAAKG,EAAAA,CAASpG,CAAG,EACjB,MAAA,CAAQ,CAAA,CACR,EAAA,CAAI,KAAA,CACJ,UAAA,CAAY,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,KAAA,CAAQkG,CAAO,CAAA,CAClD,EAAA,CAAI,KAAK,GAAA,EAAA,CACT,KAAA,CAAO3F,CAAAA,YAAa,MAAQA,CAAAA,CAAE,OAAA,CAAU,aAC1C,CAAC,CAAA,CACKA,CACR,CACF,CAAA,EACF,CAEA,SAASsE,EAAAA,EAAiB,CACxB,IAAMwB,EAAc,MAAA,CAAO,cAAA,CAC3B,GAAI,CAACA,EAAa,OAClB,IAAMC,CAAAA,CAAeD,CAAAA,CAAY,SAAA,CAAU,IAAA,CACrCE,CAAAA,CAAeF,CAAAA,CAAY,UAAU,IAAA,CAE3CA,CAAAA,CAAY,SAAA,CAAU,IAAA,CAAO,SAE3BJ,CAAAA,CACAjG,CAAAA,CAAAA,GACGwG,CAAAA,CACH,CACA,OAAA,IAAA,CAAK,OAAA,CAAU,CACb,MAAA,CAAQ,MAAA,CAAOP,CAAM,CAAA,CAAE,aAAA,CACvB,GAAA,CAAK,OAAOjG,CAAAA,EAAQ,SAAWA,CAAAA,CAAMA,CAAAA,CAAI,QAAA,EAAA,CACzC,EAAG,CACL,CAAA,CAEOsG,CAAAA,CAAa,IAAA,CAAK,IAAA,CAAML,CAAAA,CAAQjG,CAAAA,CAAK,GAAGwG,CAAI,CACrD,CAAA,CAEAH,CAAAA,CAAY,SAAA,CAAU,IAAA,CAAO,SAE3BpG,CAAAA,CACA,CACA,IAAMwG,CAAAA,CAAO,IAAA,CAAK,OAAA,CAClB,GAAIA,CAAAA,EAAQ,CAACZ,EAAAA,CAAUY,CAAAA,CAAK,GAAG,CAAA,CAAG,CAChCA,CAAAA,CAAK,CAAA,CAAI,YAAY,GAAA,EAAA,CACrB,IAAMC,CAAAA,CAAS,IAAM,CACnB,GAAI,CACF3B,EAAAA,CAAYR,EAAAA,CAAY,CACtB,IAAA,CAAM,KAAA,CACN,OAAQkC,CAAAA,CAAK,MAAA,CACb,GAAA,CAAKL,EAAAA,CAASK,CAAAA,CAAK,GAAG,CAAA,CACtB,MAAA,CAAQ,KAAK,MAAA,CACb,EAAA,CAAI,IAAA,CAAK,MAAA,EAAU,GAAA,EAAO,IAAA,CAAK,MAAA,CAAS,GAAA,CACxC,WAAY,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,GAAQA,CAAAA,CAAK,CAAC,CAAA,CACjD,EAAA,CAAI,KAAK,GAAA,EACX,CAAC,EACH,CAAA,KAAQ,CAER,CACA,IAAA,CAAK,oBAAoB,SAAA,CAAWC,CAAM,EAC5C,CAAA,CACA,KAAK,gBAAA,CAAiB,SAAA,CAAWA,CAAM,EACzC,CACA,OAAOH,CAAAA,CAAa,IAAA,CAAK,IAAA,CAAMtG,CAAAA,EAAQ,IAAI,CAC7C,EACF,CAEA,SAASmG,EAAAA,CAASO,CAAAA,CAAmB,CACnC,OAAOA,CAAAA,CAAE,MAAA,CAAS,GAAA,CAAMA,CAAAA,CAAE,MAAM,CAAA,CAAG,GAAG,CAAA,CAAI,QAAA,CAAMA,CAClD,CCtNO,SAASC,EAAAA,CACdC,EACiB,CACjB,GAAI,OAAO,MAAA,CAAW,GAAA,CACpB,OAAO,CACL,GAAA,CAAK,GACL,SAAA,CAAW,EAAA,CACX,QAAA,CAAU,CAAE,KAAA,CAAO,CAAA,CAAG,MAAA,CAAQ,CAAE,EAChC,OAAA,CAASC,EAAAA,CAAkBD,CAAO,CAAA,CAClC,WAAY,EAAA,CACZ,UAAA,CAAY,EACd,CAAA,CAGF,IAAME,CAAAA,CAAUjC,EAAAA,EAAAA,CAChB,OAAO,CACL,GAAA,CAAK,OAAO,QAAA,CAAS,IAAA,CACrB,SAAA,CAAW,SAAA,CAAU,SAAA,CACrB,QAAA,CAAU,CACR,KAAA,CAAO,OAAO,UAAA,CACd,MAAA,CAAQ,MAAA,CAAO,WACjB,CAAA,CACA,OAAA,CAASgC,EAAAA,CAAkBD,CAAO,EAClC,MAAA,CAAQG,EAAAA,EAAAA,CACR,UAAA,CAAYD,EAAQ,UAAA,CACpB,UAAA,CAAYA,CAAAA,CAAQ,UACtB,CACF,CAEA,SAASC,EAAAA,EAAgC,CACvC,IAAMC,CAAAA,CAAwB,EAAA,CAC9B,GAAI,CACFA,CAAAA,CAAO,MAAA,CAAS,CACd,KAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAS,EAC/B,MAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAU,CACnC,CAAA,CACAA,CAAAA,CAAO,UAAA,CAAa,OAAO,gBAAA,EAAoB,CAAA,CAC/CA,CAAAA,CAAO,QAAA,CAAW,UAAU,QAAA,CAC5BA,CAAAA,CAAO,SAAA,CAAY,KAAA,CAAM,KAAK,SAAA,CAAU,SAAA,EAAa,EAAE,CAAA,CACvDA,CAAAA,CAAO,QAAA,CAAW,IAAA,CAAK,gBAAA,CAAiB,eAAA,EAAA,CAAkB,QAAA,CAC1DA,EAAO,WAAA,CAAc,MAAA,CAAO,UAAA,GAAa,8BAA8B,EAAE,OAAA,CACrE,MAAA,CACA,OAAA,CACJA,CAAAA,CAAO,QAAA,CAAW,QAAA,CAAS,QAAA,EAAY,KAAA,CAAA,CACvCA,EAAO,KAAA,CAAQ,QAAA,CAAS,KAAA,EAAS,KAAA,CAAA,CACjCA,EAAO,MAAA,CAAS,SAAA,CAAU,MAAA,CACd,WAAA,CAAY,iBAAiB,YAAY,CAAA,CAAE,CAAC,CAAA,GAItDA,CAAAA,CAAO,QAAA,CAAW,IAAA,CAAK,KAAA,CAAM,YAAY,GAAA,EAAK,CAAA,EAElD,CAAA,KAAQ,CAER,CACA,OAAOA,CACT,CAEA,SAASH,EAAAA,CACPD,CAAAA,CAC6B,CAC7B,GAAKA,CAAAA,CACL,OAAO,CACL,OAAQA,CAAAA,CAAQ,MAAA,CAChB,QAAA,CAAUA,CAAAA,CAAQ,SAClB,QAAA,CAAUA,CAAAA,CAAQ,QAAA,CAClB,UAAA,CAAYA,EAAQ,UAAA,CACpB,QAAA,CAAUA,CAAAA,CAAQ,QACpB,CACF,CCTO,IAAMK,EAAAA,CAAsB,cAqC7BC,EAAAA,CAAqB,GAAA,CACrBC,EAAAA,CAA4B,EAAA,CAC5BC,EAAAA,CACJ,wDAMK,SAASC,EAAAA,CACdvH,EAAwC,EAAA,CACb,CAC3B,OAAO,gBAA+D,CACpE,GAAI,OAAO,OAAW,GAAA,CACpB,MAAM,IAAId,CAAAA,CACR,2DACA,aACF,CAAA,CAGF,IAAMsI,CAAAA,CAAWC,IAAAA,CACXC,CAAAA,CAAO1H,CAAAA,CAAQ,IAAA,EAAQ2H,EAAAA,CACvBC,CAAAA,CAAY5H,CAAAA,CAAQ,SAAA,EAAaoH,GACjCS,CAAAA,CACJ7H,CAAAA,CAAQ,eAAA,EAAmBqH,EAAAA,CACvBS,CAAAA,CAAKC,EAAAA,EAAAA,CAELC,CAAAA,CAAUC,GACdjI,CAAAA,CAAQ,eAAA,GAAoB,MAAA,CACxBsH,EAAAA,CACAtH,CAAAA,CAAQ,eACd,CAAA,CACA,GAAI,CACF,MAAMkI,EAAAA,CAAmBL,CAAe,CAAA,CAExC,IAAMM,CAAAA,CAAW,MAAM,IAAI,OAAA,CACzB,CAACtH,CAAAA,CAASC,CAAAA,GAAW,CACnB,IAAMsH,CAAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,IAAM,CACpCZ,CAAAA,CAAS,OAAA,CAAQ,MAAA,CAAOM,CAAE,CAAA,CAC1BhH,CAAAA,CACE,IAAI5B,CAAAA,CACF,yDACA,wBACF,CACF,EACF,CAAA,CAAG0I,CAAS,CAAA,CAEZJ,CAAAA,CAAS,OAAA,CAAQ,IAAIM,CAAAA,CAAI,CACvB,OAAA,CAAUvG,CAAAA,EAAM,CACd,MAAA,CAAO,YAAA,CAAa6G,CAAK,CAAA,CACzBvH,EAAQU,CAAC,EACX,CAAA,CACA,MAAA,CAASf,CAAAA,EAAM,CACb,MAAA,CAAO,YAAA,CAAa4H,CAAK,CAAA,CACzBtH,CAAAA,CAAON,CAAC,EACV,CACF,CAAC,CAAA,CAED,GAAI,CACFkH,CAAAA,CAAK,CAAE,IAAA,CAAM,uBAAA,CAAyB,EAAA,CAAAI,CAAAA,CAAI,kBAAA,CAAoB,CAAA,CAAK,CAAC,EACtE,CAAA,KAAY,CACVN,CAAAA,CAAS,QAAQ,MAAA,CAAOM,CAAE,CAAA,CAC1B,MAAA,CAAO,aAAaM,CAAK,CAAA,CACzBtH,CAAAA,CACE,IAAI5B,CAAAA,CACF,qDAAA,CACA,4BACF,CACF,EAEF,CACF,CACF,CAAA,CAEA,GAAIiJ,CAAAA,CAAS,KAAA,EAAS,CAACA,CAAAA,CAAS,QAC9B,MAAM,IAAIjJ,CAAAA,CACRiJ,CAAAA,CAAS,KAAA,EAAS,sCAAA,CAClB,uBACF,CAAA,CAGF,IAAM9G,CAAAA,CAAOgH,EAAAA,CAAcF,CAAAA,CAAS,OAAO,EACrCG,CAAAA,CAAWtI,CAAAA,CAAQ,QAAA,EAAYuI,EAAAA,GAIrC,OAAO,CACL,IAAA,CAAAlH,CAAAA,CACA,MAAA,CAJAiH,CAAAA,GAAa,SAAA,CAAY,gBAAA,CAAmB,aAK5C,QAAA,CAAAA,CAAAA,CACA,QAAA,CAAU,CACR,KAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA,CACnC,MAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,WAAW,CACvC,CAAA,CACA,WAAYH,CAAAA,CAAS,UAAA,EAAc,MAAA,CAAO,gBAAA,EAAoB,EAC9D,QAAA,CAAU,EACZ,CACF,QAAA,CACEH,CAAAA,GACF,CACF,CACF,CAGA,SAASL,EAAAA,CAAYa,EAAqC,CACxD,IAAMC,CAAAA,CAAK,MAAA,CAAO,mBAClB,GAAI,CAACA,CAAAA,EAAI,WAAA,CACP,MAAM,IAAIvJ,CAAAA,CACR,iEAAA,CACA,4BACF,CAAA,CAEFuJ,CAAAA,CAAG,WAAA,CAAY,IAAA,CAAK,UAAUD,CAAO,CAAC,EACxC,CAEA,SAASf,EAAAA,EAAwC,CAC/C,GAAI,MAAA,CAAO,qBAAsB,OAAO,MAAA,CAAO,oBAAA,CAE/C,IAAMD,CAAAA,CAAkC,CACtC,OAAA,CAAS,IAAI,IACb,OAAA,CAAQM,CAAAA,CAAIY,CAAAA,CAASC,CAAAA,CAAY,CAC/B,IAAMzD,CAAAA,CAAQsC,CAAAA,CAAS,QAAQ,GAAA,CAAIM,CAAE,CAAA,CAChC5C,CAAAA,GACLsC,CAAAA,CAAS,OAAA,CAAQ,MAAA,CAAOM,CAAE,EAC1B5C,CAAAA,CAAM,OAAA,CAAQ,CAAE,IAAA,CAAM,yBAA0B,EAAA,CAAA4C,CAAAA,CAAI,OAAA,CAAAY,CAAAA,CAAS,WAAAC,CAAW,CAAC,CAAA,EAC3E,CAAA,CACA,MAAA,CAAOb,CAAAA,CAAIc,CAAAA,CAAO,CAChB,IAAM1D,CAAAA,CAAQsC,CAAAA,CAAS,OAAA,CAAQ,GAAA,CAAIM,CAAE,CAAA,CAChC5C,CAAAA,GACLsC,CAAAA,CAAS,QAAQ,MAAA,CAAOM,CAAE,CAAA,CAC1B5C,CAAAA,CAAM,OAAA,CAAQ,CAAE,IAAA,CAAM,wBAAA,CAA0B,GAAA4C,CAAAA,CAAI,KAAA,CAAAc,CAAM,CAAC,GAC7D,CACF,CAAA,CAIMC,CAAAA,CAAaC,CAAAA,EAAwB,CACzC,IAAMC,CAAAA,CAAOC,EAAAA,CAAaF,CAAAA,CAAM,IAAI,CAAA,CACpC,GAAI,CAACC,GAAQA,CAAAA,CAAK,IAAA,GAAS,wBAAA,CAA0B,OACrD,IAAM7D,CAAAA,CAAQsC,CAAAA,CAAS,OAAA,CAAQ,IAAIuB,CAAAA,CAAK,EAAE,CAAA,CACrC7D,CAAAA,GACLsC,CAAAA,CAAS,OAAA,CAAQ,MAAA,CAAOuB,CAAAA,CAAK,EAAE,CAAA,CAC/B7D,CAAAA,CAAM,OAAA,CAAQ6D,CAAI,GACpB,CAAA,CACA,OAAA,MAAA,CAAO,gBAAA,CAAiB,UAAWF,CAAS,CAAA,CAC5C,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAWA,CAA0B,CAAA,CAE/D,MAAA,CAAO,qBAAuBrB,CAAAA,CACvBA,CACT,CAEA,SAASwB,GAAaD,CAAAA,CAA6C,CACjE,GAAIA,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,EAAY,MAAA,GAAUA,CAAAA,CAChD,OAAOA,CAAAA,CAET,GAAI,OAAOA,GAAS,QAAA,CAClB,GAAI,CACF,IAAM3H,EAAS,IAAA,CAAK,KAAA,CAAM2H,CAAI,CAAA,CAC9B,GAAI3H,CAAAA,EAAU,OAAOA,CAAAA,EAAW,QAAA,EAAYA,CAAAA,CAAO,IAAA,CAAM,OAAOA,CAClE,MAAQ,CAER,CAEF,OAAO,IACT,CAGA,SAAS6G,EAAAA,CAAQgB,CAAAA,CAAqC,CACpD,GAAI,CAACA,CAAAA,EAAY,OAAO,QAAA,CAAa,GAAA,CAAa,OAAO,IAAM,CAAC,CAAA,CAChE,IAAMC,CAAAA,CAAmD,GACzD,IAAA,IAAWlG,CAAAA,IAAM,KAAA,CAAM,IAAA,CACrB,SAAS,gBAAA,CAA8BiG,CAAQ,CACjD,CAAA,CACEC,CAAAA,CAAO,IAAA,CAAK,CAAE,EAAA,CAAAlG,EAAI,IAAA,CAAMA,CAAAA,CAAG,KAAA,CAAM,UAAW,CAAC,CAAA,CAC7CA,CAAAA,CAAG,KAAA,CAAM,WAAa,QAAA,CAExB,OAAO,IAAM,CACX,IAAA,GAAW,CAAE,EAAA,CAAAA,CAAAA,CAAI,KAAAmG,CAAK,CAAA,GAAKD,CAAAA,CAAQlG,CAAAA,CAAG,MAAM,UAAA,CAAamG,EAC3D,CACF,CAEA,eAAejB,EAAAA,CAAmBL,CAAAA,CAAwC,CACxE,MAAMuB,EAAAA,EAAAA,CACFvB,CAAAA,CAAkB,CAAA,EACpB,MAAM,IAAI,OAAA,CAAShH,CAAAA,EAAY,MAAA,CAAO,UAAA,CAAWA,CAAAA,CAASgH,CAAe,CAAC,EAE9E,CAEA,SAASuB,EAAAA,EAAoC,CAC3C,OAAO,IAAI,OAAA,CAASvI,CAAAA,EAAY,CAC9B,qBAAA,CAAsB,IAAMA,CAAAA,EAAS,EACvC,CAAC,CACH,CAEA,SAAS0H,IAAoC,CAC3C,IAAMc,CAAAA,CAAK,SAAA,CAAU,SAAA,EAAa,EAAA,CAClC,OAAO,UAAA,CAAW,KAAKA,CAAE,CAAA,CAAI,SAAA,CAAY,KAC3C,CAEA,SAAStB,EAAAA,EAAuB,CAK9B,OAAO,aAHL,OAAO,MAAA,CAAW,GAAA,EAAe,YAAA,GAAgB,MAAA,CAC7C,MAAA,CAAO,UAAA,EAAA,CACP,KAAK,MAAA,EAAA,CAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAC,CAChB,CAAA,CAC1B,CAIA,SAASM,EAAAA,CAAcK,CAAAA,CAAuB,CAC5C,IAAMY,CAAAA,CAAQ,iCAAA,CAAkC,IAAA,CAAKZ,CAAO,CAAA,CAC5D,GAAI,CAACY,CAAAA,CACH,MAAM,IAAIpK,CAAAA,CACR,iDAAA,CACA,uBACF,CAAA,CAEF,IAAMqK,CAAAA,CAAOD,CAAAA,CAAM,CAAC,CAAA,EAAK,WAAA,CACnBE,CAAAA,CAAW,CAAA,CAAQF,CAAAA,CAAM,CAAC,CAAA,CAC1BP,EAAOO,CAAAA,CAAM,CAAC,CAAA,EAAK,EAAA,CAEzB,GAAI,CAACE,CAAAA,CACH,OAAO,IAAI,IAAA,CAAK,CAAC,kBAAA,CAAmBT,CAAI,CAAC,CAAA,CAAG,CAAE,IAAA,CAAMQ,CAAK,CAAC,CAAA,CAG5D,IAAME,CAAAA,CAAS,KAAKV,CAAI,CAAA,CAClBW,CAAAA,CAAQ,IAAI,UAAA,CAAWD,CAAAA,CAAO,MAAM,CAAA,CAC1C,QAASE,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAO,OAAQE,CAAAA,EAAAA,CAAKD,CAAAA,CAAMC,CAAC,CAAA,CAAIF,EAAO,UAAA,CAAWE,CAAC,CAAA,CACtE,OAAO,IAAI,IAAA,CAAK,CAACD,CAAK,EAAG,CAAE,IAAA,CAAMH,CAAK,CAAC,CACzC,CCvVA,IAAMK,EAAAA,CAAsB,oBACtBC,EAAAA,CACJ,6EAAA,CAUK,SAASC,EAAAA,CAAmBhB,CAAAA,CAAuB,CACxD,IAAMiB,CAAAA,CACJ,OAAOjB,CAAAA,CAAM,YAAA,EAAiB,UAAA,CAAaA,CAAAA,CAAM,cAAA,CAAiB,EAAA,CAEpE,IAAA,IAAW5D,KAAS6E,CAAAA,CAClB,GAAIC,EAAAA,CAAY9E,CAAK,CAAA,CAAG,OAAO,KAAA,CAGjC,OAAO8E,GAAYlB,CAAAA,CAAM,MAAM,CACjC,CAEA,SAASkB,EAAAA,CAAYtE,CAAAA,CAAyB,CAC5C,OAAKA,CAAAA,CAED,OAAO,OAAA,CAAY,GAAA,EAAeA,CAAAA,YAAiB,OAAA,CACjDA,CAAAA,CAAM,OAAA,CAAQmE,EAAqB,CAAA,CAAU,IAAA,CAC1C,CAAA,CAAQnE,EAAM,OAAA,CAAQkE,EAAmB,CAAA,CAG9C,OAAO,WAAe,GAAA,EAAelE,CAAAA,YAAiB,UAAA,CACjDsE,EAAAA,CAAYtE,CAAAA,CAAM,IAAI,CAAA,CAGxB,KAAA,CAXY,KAYrB,CCfA,eAAsBuE,EAAAA,CACpBC,CAAAA,CAAa,EAAA,CACY,CACzB,GAAI,OAAO,OAAW,GAAA,EAAe,CAAC,SAAA,CAAU,YAAA,CAC9C,MAAM,IAAIhL,CAAAA,CACR,uDAAA,CACA,aACF,CAAA,CAGF,IAAIgE,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAS,MAAM,SAAA,CAAU,YAAA,CAAa,aAAa,CAAE,KAAA,CAAO,CAAA,CAAK,CAAC,EACpE,CAAA,KAAQ,CACN,MAAM,IAAIhE,CAAAA,CACR,0CAAA,CACA,YACF,CACF,CAUA,IAAMiL,CAAAA,CANa,CACjB,yBACA,YAAA,CACA,WAAA,CACA,uBACF,CAAA,CAEa,IAAA,CAAMC,CAAAA,EAAM,aAAA,CAAc,eAAA,CAAgBA,CAAC,CAAC,CAAA,EAAK,EAAA,CAExDC,CAAAA,CAAW,IAAI,aAAA,CAAcnH,CAAAA,CAAQiH,CAAAA,CAAW,CAAE,SAAAA,CAAS,CAAA,CAAI,MAAS,CAAA,CACxEG,CAAAA,CAAiB,EAAA,CACjBlG,CAAAA,CAAQ,YAAY,GAAA,EAAA,CACtBmG,CAAAA,CAA2B,IAAA,CAE/BF,CAAAA,CAAS,gBAAA,CAAiB,eAAA,CAAkB7J,CAAAA,EAAM,CAC5CA,CAAAA,CAAE,IAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,IAAA,CAAO,CAAA,EAAG8J,CAAAA,CAAO,IAAA,CAAK9J,EAAE,IAAI,EACnD,CAAC,CAAA,CAED6J,EAAS,KAAA,EAAA,CACTE,CAAAA,CAAY,MAAA,CAAO,WAAW,IAAM,CAC9BF,CAAAA,CAAS,KAAA,GAAU,UAAA,EAAYA,CAAAA,CAAS,IAAA,GAC9C,EAAGH,CAAAA,CAAa,GAAI,CAAA,CAEpB,SAASM,GAAU,CACbD,CAAAA,GAAc,IAAA,EAAM,MAAA,CAAO,aAAaA,CAAS,CAAA,CACrDA,CAAAA,CAAY,IAAA,CACZ,IAAA,IAAWjH,CAAAA,IAASJ,CAAAA,CAAO,SAAA,GAAaI,CAAAA,CAAM,IAAA,GAChD,CAEA,OAAO,CACL,MAAA,CAAAJ,CAAAA,CACA,MAAA,EAAS,CACP,GAAI,CACEmH,CAAAA,CAAS,KAAA,GAAU,UAAA,EAAYA,CAAAA,CAAS,IAAA,GAC9C,MAAQ,CAER,CACAG,CAAAA,GACF,CAAA,CACA,IAAA,EAAgC,CAC9B,OAAO,IAAI,OAAA,CAAQ,CAAC3J,CAAAA,CAASC,CAAAA,GAAW,CACtC,GAAIuJ,CAAAA,CAAS,KAAA,GAAU,WAAY,CACjCG,CAAAA,EAAAA,CACA1J,CAAAA,CAAO,IAAI5B,CAAAA,CAAW,2BAAA,CAA6B,kBAAkB,CAAC,EACtE,MACF,CACAmL,CAAAA,CAAS,gBAAA,CACP,MAAA,CACA,IAAM,CACJ,IAAMI,EAAa,WAAA,CAAY,GAAA,EAAA,CAAQrG,CAAAA,CACjCsG,CAAAA,CAAYL,CAAAA,CAAS,QAAA,EAAYF,CAAAA,EAAY,aAC7C9I,CAAAA,CAAO,IAAI,IAAA,CAAKiJ,CAAAA,CAAQ,CAAE,IAAA,CAAMI,CAAU,CAAC,EACjDF,CAAAA,EAAAA,CACA3J,CAAAA,CAAQ,CAAE,KAAAQ,CAAAA,CAAM,UAAA,CAAAoJ,CAAAA,CAAY,QAAA,CAAUC,CAAU,CAAC,EACnD,CAAA,CACA,CAAE,IAAA,CAAM,IAAK,CACf,CAAA,CACAL,EAAS,IAAA,GACX,CAAC,CACH,CACF,CACF,CC7EA,eAAsBM,GACpBT,CAAAA,CAAa,EAAA,CACiB,CAC9B,GACE,OAAO,MAAA,CAAW,GAAA,EAClB,CAAC,UAAU,YAAA,EACX,OAAO,SAAA,CAAU,YAAA,CAAa,iBAAoB,UAAA,CAElD,MAAM,IAAIhL,CAAAA,CACR,4DACA,aACF,CAAA,CAGF,IAAIgE,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAS,MAAM,UAAU,YAAA,CAAa,eAAA,CAAgB,CACpD,KAAA,CAAO,GAEP,KAAA,CAAO,CAAA,CACT,CAAC,EACH,MAAQ,CACN,MAAM,IAAIhE,CAAAA,CACR,yCAAA,CACA,eACF,CACF,CASA,IAAMiL,CAAAA,CANa,CACjB,4BAAA,CACA,4BAAA,CACA,aACA,WACF,CAAA,CAEa,IAAA,CAAMC,CAAAA,EAAM,cAAc,eAAA,CAAgBA,CAAC,CAAC,CAAA,EAAK,EAAA,CAExDC,CAAAA,CAAW,IAAI,aAAA,CAAcnH,EAAQiH,CAAAA,CAAW,CAAE,QAAA,CAAAA,CAAS,CAAA,CAAI,MAAS,CAAA,CACxEG,CAAAA,CAAiB,EAAA,CACjBlG,CAAAA,CAAQ,WAAA,CAAY,GAAA,EAAA,CACtBmG,CAAAA,CAA2B,IAAA,CAE/BF,CAAAA,CAAS,iBAAiB,eAAA,CAAkB7J,CAAAA,EAAM,CAC5CA,CAAAA,CAAE,MAAQA,CAAAA,CAAE,IAAA,CAAK,IAAA,CAAO,CAAA,EAAG8J,EAAO,IAAA,CAAK9J,CAAAA,CAAE,IAAI,EACnD,CAAC,CAAA,CAED6J,CAAAA,CAAS,KAAA,GACTE,CAAAA,CAAY,MAAA,CAAO,UAAA,CAAW,IAAM,CAC9BF,CAAAA,CAAS,KAAA,GAAU,UAAA,EAAYA,EAAS,IAAA,GAC9C,CAAA,CAAGH,CAAAA,CAAa,GAAI,CAAA,CAIpB,IAAMU,CAAAA,CAAa1H,EAAO,cAAA,EAAA,CAAiB,CAAC,CAAA,CACxC0H,GACFA,CAAAA,CAAW,gBAAA,CAAiB,OAAA,CAAS,IAAM,CACrCP,CAAAA,CAAS,KAAA,GAAU,UAAA,EAAYA,CAAAA,CAAS,IAAA,GAC9C,CAAC,CAAA,CAGH,SAASG,CAAAA,EAAU,CACbD,CAAAA,GAAc,IAAA,EAAM,MAAA,CAAO,YAAA,CAAaA,CAAS,CAAA,CACrDA,EAAY,IAAA,CACZ,IAAA,IAAWjH,CAAAA,IAASJ,CAAAA,CAAO,SAAA,EAAA,CAAaI,CAAAA,CAAM,IAAA,GAChD,CAEA,OAAO,CACL,MAAA,CAAAJ,EACA,MAAA,EAAS,CACP,GAAI,CACEmH,EAAS,KAAA,GAAU,UAAA,EAAYA,CAAAA,CAAS,IAAA,GAC9C,CAAA,KAAQ,CAER,CACAG,IACF,CAAA,CACA,IAAA,EAAgC,CAC9B,OAAO,IAAI,OAAA,CAAQ,CAAC3J,CAAAA,CAASC,IAAW,CACtC,GAAIuJ,CAAAA,CAAS,KAAA,GAAU,UAAA,CAAY,CACjCG,CAAAA,EAAAA,CACA1J,EAAO,IAAI5B,CAAAA,CAAW,2BAAA,CAA6B,kBAAkB,CAAC,CAAA,CACtE,MACF,CACAmL,CAAAA,CAAS,iBACP,MAAA,CACA,IAAM,CACJ,IAAMI,CAAAA,CAAa,WAAA,CAAY,GAAA,EAAA,CAAQrG,EACjCsG,CAAAA,CAAYL,CAAAA,CAAS,QAAA,EAAYF,CAAAA,EAAY,YAAA,CAC7C9I,CAAAA,CAAO,IAAI,IAAA,CAAKiJ,EAAQ,CAAE,IAAA,CAAMI,CAAU,CAAC,CAAA,CACjDF,CAAAA,EAAAA,CACA3J,CAAAA,CAAQ,CAAE,IAAA,CAAAQ,CAAAA,CAAM,UAAA,CAAAoJ,CAAAA,CAAY,SAAUC,CAAU,CAAC,EACnD,CAAA,CACA,CAAE,IAAA,CAAM,IAAK,CACf,CAAA,CACAL,CAAAA,CAAS,IAAA,GACX,CAAC,CACH,CACF,CACF,CClFO,IAAMQ,EAAAA,CAAeC,aAAAA,CAAwC,IAAI,CAAA,CAEjE,SAASC,EAAAA,EAA8B,CAC5C,IAAM1H,CAAAA,CAAM2H,UAAAA,CAAWH,EAAY,CAAA,CACnC,GAAI,CAACxH,CAAAA,CACH,MAAM,IAAI,MAAM,iDAAiD,CAAA,CAEnE,OAAOA,CACT,KCEa4H,EAAAA,CAAwB,EAAA,CAAA,UAAA,CAGnC,SAAyB,CACzB,UAAA,CAAAC,CAAAA,CACA,KAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAAQ,kBAAA,CACR,WAAA,CAAAC,CAAAA,CAAc,CAAA,CACd,eAAA,CAAAC,CACF,CAAA,CAAGC,CAAAA,CAAK,CACN,IAAMC,CAAAA,CAAgBC,MAAAA,CAAiC,IAAI,CAAA,CACrDC,EAAmBD,MAAAA,CAAiC,IAAI,CAAA,CACxDE,CAAAA,CAAeF,OAA8B,IAAI,CAAA,CACjD,CAACG,CAAAA,CAAaC,CAAc,CAAA,CAAIC,QAAAA,CAA6B,IAAI,CAAA,CACjE,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAIF,SAAuB,EAAE,CAAA,CACzDG,CAAAA,CAAWR,MAAAA,CAA0B,IAAI,CAAA,CACzCS,CAAAA,CAAeT,OAAO,KAAK,CAAA,CAC3BU,CAAAA,CAAkBV,MAAAA,CAAO,CAAC,CAAA,CAC1BW,CAAAA,CAAgBX,MAAAA,CAAO,KAAK,CAAA,CAMlCY,SAAAA,CAAU,IAAM,CACd,IAAIC,CAAAA,CAAY,KAAA,CACZC,CAAAA,CAA8B,IAAA,CAClC,QAAC,SAAY,CACX,GAAI,CACF,IAAMC,CAAAA,CAAK,MAAM,iBAAA,CAAkBtB,CAAU,CAAA,CAC7C,GAAIoB,CAAAA,CAAW,CACbE,CAAAA,CAAG,KAAA,IAAQ,CACX,MACF,CACAD,CAAAA,CAAUC,CAAAA,CACVX,CAAAA,CAAeW,CAAE,EACnB,CAAA,KAAQ,CAGR,CACF,IAAG,CACI,IAAM,CACXF,CAAAA,CAAY,KACZC,CAAAA,EAAS,KAAA,KACX,CACF,EAAG,CAACrB,CAAU,CAAC,CAAA,CAGfmB,SAAAA,CAAU,IAAM,CACd,GAAI,CAACT,CAAAA,CAAa,OAClB,IAAMa,CAAAA,CAAOjB,CAAAA,CAAc,OAAA,CACrBkB,CAAAA,CAAUhB,CAAAA,CAAiB,QACjC,GAAI,CAACe,CAAAA,EAAQ,CAACC,CAAAA,CAAS,OACvBD,CAAAA,CAAK,KAAA,CAAQb,EAAY,KAAA,CACzBa,CAAAA,CAAK,MAAA,CAASb,CAAAA,CAAY,OAC1Bc,CAAAA,CAAQ,KAAA,CAAQd,CAAAA,CAAY,KAAA,CAC5Bc,EAAQ,MAAA,CAASd,CAAAA,CAAY,MAAA,CAC7B,IAAMvI,CAAAA,CAAMoJ,CAAAA,CAAK,UAAA,CAAW,IAAI,EAC3BpJ,CAAAA,GACLA,CAAAA,CAAI,qBAAA,CAAwB,KAAA,CAC5BA,EAAI,SAAA,CAAUuI,CAAAA,CAAa,CAAA,CAAG,CAAC,GACjC,CAAA,CAAG,CAACA,CAAW,CAAC,CAAA,CAIhBS,SAAAA,CAAU,IAAM,CACd,IAAMK,CAAAA,CAAUhB,CAAAA,CAAiB,OAAA,CAC5BgB,CAAAA,EACLC,GAAOD,CAAAA,CAASX,CAAAA,CAAaE,CAAAA,CAAS,OAAO,EAC/C,CAAA,CAAG,CAACF,CAAW,CAAC,CAAA,CAEhBa,mBAAAA,CACErB,CAAAA,CACA,KAA8B,CAC5B,cAAA,CAAgB,IAAMQ,CAAAA,CAAY,MAAA,CAAS,CAAA,CAC3C,KAAA,CAAO,IAAMC,CAAAA,CAAe,EAAE,CAAA,CAC9B,IAAA,CAAM,IACJA,CAAAA,CAAgBa,CAAAA,EACdA,CAAAA,CAAI,MAAA,GAAW,EAAIA,CAAAA,CAAMA,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAG,EAAE,CAC1C,CAAA,CACF,MAAM,OAAA,EAAU,CAId,IAAMC,CAAAA,CAAQb,CAAAA,CAAS,OAAA,CACjBc,CAAAA,CAAMD,CAAAA,CAAQ,CAAC,GAAGf,EAAae,CAAK,CAAA,CAAIf,CAAAA,CAI9C,GADIgB,CAAAA,CAAI,MAAA,GAAW,CAAA,EACf,CAACnB,EAAa,OAAOV,CAAAA,CACzB,IAAM7F,CAAAA,CAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC3CA,EAAI,KAAA,CAAQuG,CAAAA,CAAY,KAAA,CACxBvG,CAAAA,CAAI,OAASuG,CAAAA,CAAY,MAAA,CACzB,IAAMvI,CAAAA,CAAMgC,EAAI,UAAA,CAAW,IAAI,CAAA,CAC/B,GAAI,CAAChC,CAAAA,CAAK,OAAO6H,CAAAA,CACjB7H,EAAI,qBAAA,CAAwB,KAAA,CAC5BA,CAAAA,CAAI,SAAA,CAAUuI,CAAAA,CAAa,CAAA,CAAG,CAAC,CAAA,CAC/B,QAAWoB,CAAAA,IAAQD,CAAAA,CAAKE,EAAAA,CAAS5J,CAAAA,CAAK2J,CAAI,CAAA,CAI1C,OAAO,MAAM,IAAI,OAAA,CAAenM,CAAAA,EAAY,CAC1CwE,CAAAA,CAAI,OACDhE,CAAAA,EAAS,CACRR,CAAAA,CAAQQ,CAAAA,EAAQ6J,CAAU,EAC5B,CAAA,CACA,YAAA,CACA,GACF,EACF,CAAC,CACH,CACF,GACA,CAACa,CAAAA,CAAaH,CAAAA,CAAaV,CAAU,CACvC,CAAA,CAEA,SAASgC,CAAAA,CACP1M,CAAAA,CAC0B,CAC1B,IAAM2M,CAAAA,CAAIzB,CAAAA,CAAiB,OAAA,CAC3B,GAAI,CAACyB,CAAAA,CAAG,OAAO,CAAE,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAE,EAC5B,IAAMC,CAAAA,CAAOD,CAAAA,CAAE,qBAAA,GACTE,CAAAA,CAAKF,CAAAA,CAAE,KAAA,CAAQ,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAK,KAAA,CAAO,CAAC,EACrCE,CAAAA,CAAKH,CAAAA,CAAE,MAAA,CAAS,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAK,MAAA,CAAQ,CAAC,EAC7C,OAAO,CACL,CAAA,CAAA,CAAI5M,CAAAA,CAAE,OAAA,CAAU4M,CAAAA,CAAK,IAAA,EAAQC,CAAAA,CAC7B,GAAI7M,CAAAA,CAAE,OAAA,CAAU4M,CAAAA,CAAK,GAAA,EAAOE,CAC9B,CACF,CAEA,SAASC,CAAAA,EAAqB,CACxBnB,CAAAA,CAAc,OAAA,GAClBA,CAAAA,CAAc,OAAA,CAAU,IAAA,CACxB,qBAAA,CAAsB,IAAM,CAC1BA,EAAc,OAAA,CAAU,KAAA,CACxB,IAAMM,CAAAA,CAAUhB,CAAAA,CAAiB,OAAA,CAC5BgB,CAAAA,EACLC,EAAAA,CAAOD,EAASX,CAAAA,CAAaE,CAAAA,CAAS,OAAO,EAC/C,CAAC,CAAA,EACH,CAEA,SAASuB,EAAchN,CAAAA,CAA0C,CAC/D,GAAIA,CAAAA,CAAE,SAAW,MAAA,EAAaA,CAAAA,CAAE,MAAA,GAAW,CAAA,CAAG,OAC9C,GAAI,CACFA,CAAAA,CAAE,aAAA,CAAc,iBAAA,CAAkBA,CAAAA,CAAE,SAAS,EAC/C,MAAQ,CAKR,CACA0L,CAAAA,CAAa,OAAA,CAAU,IAAA,CACvBZ,CAAAA,GAAkB,IAAI,CAAA,CACtB,IAAMmC,CAAAA,CAAIP,CAAAA,CAAe1M,CAAC,CAAA,CACtB2K,CAAAA,GAAS,OAAA,CACXc,CAAAA,CAAS,OAAA,CAAU,CAAE,IAAA,CAAM,OAAA,CAAS,IAAA,CAAMwB,CAAAA,CAAG,GAAIA,CAAAA,CAAG,KAAA,CAAArC,CAAAA,CAAO,KAAA,CAAOC,CAAY,CAAA,CACrEF,CAAAA,GAAS,MAAA,CAClBc,CAAAA,CAAS,OAAA,CAAU,CAAE,IAAA,CAAM,MAAA,CAAQ,KAAMwB,CAAAA,CAAG,EAAA,CAAIA,CAAAA,CAAG,KAAA,CAAArC,EAAO,KAAA,CAAOC,CAAY,CAAA,CAE7EY,CAAAA,CAAS,QAAU,CACjB,IAAA,CAAM,UAAA,CACN,MAAA,CAAQ,CAACwB,CAAC,CAAA,CACV,KAAA,CAAArC,EACA,KAAA,CAAOC,CACT,CAAA,CAEFc,CAAAA,CAAgB,QAAU,WAAA,CAAY,GAAA,EAAI,CAC1CoB,CAAAA,GACF,CAEA,SAASG,CAAAA,CAAclN,CAAAA,CAA0C,CAC/D,GAAI,CAAC0L,CAAAA,CAAa,SAAW,CAACD,CAAAA,CAAS,OAAA,CAAS,OAChD,IAAMwB,CAAAA,CAAIP,CAAAA,CAAe1M,CAAC,EACpBsM,CAAAA,CAAQb,CAAAA,CAAS,OAAA,CACvB,GAAIa,CAAAA,CAAM,IAAA,GAAS,OAAA,EAAWA,CAAAA,CAAM,OAAS,MAAA,CAC3CA,CAAAA,CAAM,EAAA,CAAKW,CAAAA,CAAAA,KACN,CACL,IAAME,CAAAA,CAAOb,CAAAA,CAAM,MAAA,CAAOA,EAAM,MAAA,CAAO,MAAA,CAAS,CAAC,CAAA,CAC3Cc,CAAAA,CAAQD,CAAAA,CAAAA,CACTA,CAAAA,CAAK,CAAA,CAAIF,EAAE,CAAA,GAAM,CAAA,CAAA,CAAKE,CAAAA,CAAK,CAAA,CAAIF,CAAAA,CAAE,CAAA,GAAM,CAAA,CACxC,CAAA,CAAA,CAAA,CACEI,EAAM,WAAA,CAAY,GAAA,EAAI,CACtBC,CAAAA,CAAUD,CAAAA,CAAM1B,CAAAA,CAAgB,OAAA,CAAA,CAGlCyB,CAAAA,CAAQ,IAAME,CAAAA,CAAU,EAAA,IAC1BhB,CAAAA,CAAM,MAAA,CAAO,KAAKW,CAAC,CAAA,CACnBtB,CAAAA,CAAgB,OAAA,CAAU0B,GAE9B,CACAN,CAAAA,GACF,CAEA,SAASQ,CAAAA,EAAc,CACrB,GAAI,CAAC7B,CAAAA,CAAa,OAAA,CAAS,OAC3BA,CAAAA,CAAa,OAAA,CAAU,KAAA,CACvBZ,CAAAA,GAAkB,KAAK,EACvB,IAAMwB,CAAAA,CAAQb,CAAAA,CAAS,OAAA,CAEvB,GADAA,CAAAA,CAAS,OAAA,CAAU,IAAA,CACf,EAACa,CAAAA,CACL,CAAA,GAAIA,CAAAA,CAAM,IAAA,GAAS,SAAWA,CAAAA,CAAM,IAAA,GAAS,MAAA,CAAQ,CACnD,IAAMkB,CAAAA,CAAKlB,CAAAA,CAAM,EAAA,CAAG,CAAA,CAAIA,CAAAA,CAAM,IAAA,CAAK,CAAA,CAC7BmB,CAAAA,CAAKnB,EAAM,EAAA,CAAG,CAAA,CAAIA,CAAAA,CAAM,IAAA,CAAK,CAAA,CACnC,GAAIkB,CAAAA,CAAKA,CAAAA,CAAKC,EAAKA,CAAAA,CAAK,EAAA,CAAI,CAG1B,IAAMvB,CAAAA,CAAUhB,CAAAA,CAAiB,OAAA,CAC7BgB,CAAAA,EAASC,GAAOD,CAAAA,CAASX,CAAAA,CAAa,IAAI,CAAA,CAC9C,MACF,CACF,CAAA,KAAA,GAAWe,CAAAA,CAAM,MAAA,CAAO,OAAS,CAAA,CAAG,CAClC,IAAMJ,CAAAA,CAAUhB,CAAAA,CAAiB,OAAA,CAC7BgB,CAAAA,EAASC,EAAAA,CAAOD,EAASX,CAAAA,CAAa,IAAI,CAAA,CAC9C,MACF,CACAC,CAAAA,CAAgBa,CAAAA,EAAQ,CAAC,GAAGA,CAAAA,CAAKC,CAAK,CAAA,CAAE,KAAA,CAAM,GAAc,CAAC,EAAA,CAC/D,CAEA,OACEoB,IAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKvC,EAAc,SAAA,CAAU,sBAAA,CAChC,QAAA,CAAA,CAAAwC,GAAAA,CAAC,UAAO,GAAA,CAAK3C,CAAAA,CAAe,CAAA,CAC5B2C,GAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKzC,CAAAA,CACL,SAAA,CAAU,yBACV,aAAA,CAAe8B,CAAAA,CACf,aAAA,CAAeE,CAAAA,CACf,WAAA,CAAaK,CAAAA,CACb,eAAA,CAAiBA,CAAAA,CACnB,GACF,CAEJ,CAAC,EAED,SAASpB,EAAAA,CACP5J,CAAAA,CACAgJ,CAAAA,CACAe,CAAAA,CACA,CACA,IAAMzJ,CAAAA,CAAMN,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAClC,GAAKM,CAAAA,CACL,CAAAA,EAAI,SAAA,CAAU,CAAA,CAAG,CAAA,CAAGN,CAAAA,CAAO,KAAA,CAAOA,CAAAA,CAAO,MAAM,CAAA,CAC/C,QAAW,CAAA,IAAKgJ,CAAAA,CAAakB,EAAAA,CAAS5J,CAAAA,CAAK,CAAC,CAAA,CACxCyJ,CAAAA,EAAOG,EAAAA,CAAS5J,EAAKyJ,CAAK,EAAA,CAChC,CAEA,SAASG,EAAAA,CAAS5J,CAAAA,CAA+B2J,CAAAA,CAAkB,CAQjE,GAPA3J,CAAAA,CAAI,IAAA,EAAK,CACTA,CAAAA,CAAI,YAAc2J,CAAAA,CAAK,KAAA,CACvB3J,CAAAA,CAAI,SAAA,CAAY2J,EAAK,KAAA,CACrB3J,CAAAA,CAAI,SAAA,CAAY2J,CAAAA,CAAK,KAAA,CACrB3J,CAAAA,CAAI,OAAA,CAAU,OAAA,CACdA,EAAI,QAAA,CAAW,OAAA,CAEX2J,CAAAA,CAAK,IAAA,GAAS,OAAQ,CACxB,IAAMoB,CAAAA,CAAI,IAAA,CAAK,IAAIpB,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAGA,CAAAA,CAAK,EAAA,CAAG,CAAC,CAAA,CACnCqB,CAAAA,CAAI,KAAK,GAAA,CAAIrB,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAGA,EAAK,EAAA,CAAG,CAAC,CAAA,CACnCsB,CAAAA,CAAI,KAAK,GAAA,CAAItB,CAAAA,CAAK,EAAA,CAAG,CAAA,CAAIA,CAAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CACpCuB,EAAI,IAAA,CAAK,GAAA,CAAIvB,CAAAA,CAAK,EAAA,CAAG,CAAA,CAAIA,CAAAA,CAAK,IAAA,CAAK,CAAC,EAC1C3J,CAAAA,CAAI,UAAA,CAAW+K,CAAAA,CAAGC,CAAAA,CAAGC,CAAAA,CAAGC,CAAC,EAC3B,CAAA,KAAA,GAAWvB,EAAK,IAAA,GAAS,UAAA,CACvBwB,EAAAA,CAAenL,CAAAA,CAAK2J,EAAK,MAAM,CAAA,CAAA,KAC1B,CACL,GAAM,CAAE,IAAA,CAAAyB,CAAAA,CAAM,EAAA,CAAAC,CAAAA,CAAI,KAAA,CAAAC,CAAM,CAAA,CAAI3B,CAAAA,CAC5B3J,EAAI,SAAA,EAAU,CACdA,CAAAA,CAAI,MAAA,CAAOoL,CAAAA,CAAK,CAAA,CAAGA,CAAAA,CAAK,CAAC,EACzBpL,CAAAA,CAAI,MAAA,CAAOqL,CAAAA,CAAG,CAAA,CAAGA,CAAAA,CAAG,CAAC,CAAA,CACrBrL,CAAAA,CAAI,QAAO,CACX,IAAMuL,CAAAA,CAAQ,IAAA,CAAK,MAAMF,CAAAA,CAAG,CAAA,CAAID,CAAAA,CAAK,CAAA,CAAGC,EAAG,CAAA,CAAID,CAAAA,CAAK,CAAC,CAAA,CAC/CI,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAIF,EAAQ,CAAC,CAAA,CACnCtL,CAAAA,CAAI,SAAA,EAAU,CACdA,CAAAA,CAAI,MAAA,CAAOqL,CAAAA,CAAG,EAAGA,CAAAA,CAAG,CAAC,CAAA,CACrBrL,CAAAA,CAAI,MAAA,CACFqL,CAAAA,CAAG,CAAA,CAAIG,CAAAA,CAAO,KAAK,GAAA,CAAID,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAC1CF,CAAAA,CAAG,CAAA,CAAIG,CAAAA,CAAO,KAAK,GAAA,CAAID,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAK,CAAC,CAC5C,CAAA,CACAvL,CAAAA,CAAI,OACFqL,CAAAA,CAAG,CAAA,CAAIG,CAAAA,CAAO,IAAA,CAAK,IAAID,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAK,CAAC,EAC1CF,CAAAA,CAAG,CAAA,CAAIG,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAK,CAAC,CAC5C,CAAA,CACAvL,CAAAA,CAAI,SAAA,GACJA,CAAAA,CAAI,IAAA,GACN,CAEAA,EAAI,OAAA,GACN,CAQA,SAASmL,EAAAA,CACPnL,CAAAA,CACAyL,CAAAA,CACA,CACA,GAAIA,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,OACzBzL,CAAAA,CAAI,SAAA,EAAU,CACd,IAAM0L,EAAQD,CAAAA,CAAO,CAAC,CAAA,CACtB,GAAI,CAACC,CAAAA,CAAO,OAEZ,GADA1L,EAAI,MAAA,CAAO0L,CAAAA,CAAM,CAAA,CAAGA,CAAAA,CAAM,CAAC,CAAA,CACvBD,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,CAEvBzL,CAAAA,CAAI,GAAA,CAAI0L,CAAAA,CAAM,CAAA,CAAGA,CAAAA,CAAM,CAAA,CAAG1L,CAAAA,CAAI,SAAA,CAAY,EAAG,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAC3DA,CAAAA,CAAI,IAAA,EAAK,CACT,MACF,CACA,GAAIyL,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,CACvB,IAAME,CAAAA,CAASF,EAAO,CAAC,CAAA,CACvBzL,CAAAA,CAAI,MAAA,CAAO2L,EAAO,CAAA,CAAGA,CAAAA,CAAO,CAAC,CAAA,CAC7B3L,EAAI,MAAA,EAAO,CACX,MACF,CACA,IAAA,IAASsG,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAImF,EAAO,MAAA,CAAS,CAAA,CAAGnF,CAAAA,EAAAA,CAAK,CAC1C,IAAM8D,CAAAA,CAAIqB,CAAAA,CAAOnF,CAAC,EACZ7F,CAAAA,CAAOgL,CAAAA,CAAOnF,CAAAA,CAAI,CAAC,CAAA,CACnBsF,CAAAA,CAAAA,CAAMxB,CAAAA,CAAE,CAAA,CAAI3J,EAAK,CAAA,EAAK,CAAA,CACtBoL,CAAAA,CAAAA,CAAMzB,CAAAA,CAAE,EAAI3J,CAAAA,CAAK,CAAA,EAAK,CAAA,CAC5BT,CAAAA,CAAI,iBAAiBoK,CAAAA,CAAE,CAAA,CAAGA,CAAAA,CAAE,CAAA,CAAGwB,CAAAA,CAAIC,CAAE,EACvC,CAEA,IAAMvB,CAAAA,CAAOmB,CAAAA,CAAOA,CAAAA,CAAO,MAAA,CAAS,CAAC,CAAA,CACrCzL,CAAAA,CAAI,MAAA,CAAOsK,CAAAA,CAAK,EAAGA,CAAAA,CAAK,CAAC,CAAA,CACzBtK,CAAAA,CAAI,MAAA,GACN,CCjWA,IAAM8L,EAAAA,CAAoB,EAAA,CACpBC,GAAoB,EAAA,CAEpBC,EAAAA,CAA4D,CAChE,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,kBAAmB,EAC1C,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,mBAAoB,CAAA,CAC7C,CAAE,KAAA,CAAO,OAAQ,KAAA,CAAO,mBAAoB,CAAA,CAC5C,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,kBAAmB,EAC5C,CAAE,KAAA,CAAO,SAAA,CAAW,KAAA,CAAO,oBAAqB,CAClD,CAAA,CAEMC,EAAAA,CAA6E,CACjF,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,CAAA,CAAG,GAAA,CAAK,CAAE,CAAA,CACnC,CAAE,MAAO,QAAA,CAAU,KAAA,CAAO,CAAA,CAAG,GAAA,CAAK,CAAE,CAAA,CACpC,CAAE,KAAA,CAAO,QAAS,KAAA,CAAO,CAAA,CAAG,GAAA,CAAK,EAAG,CACtC,CAAA,CAEMC,EAAAA,CAAwE,CAC5E,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAM,EAC7B,CAAE,KAAA,CAAO,SAAA,CAAW,KAAA,CAAO,MAAO,CAAA,CAClC,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,OAAQ,CACnC,CAAA,CAIMC,GAAgF,CACpF,CAAE,KAAA,CAAO,MAAA,CAAQ,KAAA,CAAO,YAAA,CAAc,IAAA,CAAM,sBAAuB,EACnE,CAAE,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,QAAA,CAAU,IAAA,CAAM,sBAAuB,CAAA,CACjE,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,OAAA,CAAS,KAAM,kBAAmB,CAC7D,CAAA,CAYO,SAASC,IAAe,CAC7B,GAAM,CACJ,MAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,EACA,IAAA,CAAAC,CAAAA,CACA,OAAA,CAAA/I,CAAAA,CACA,cAAA,CAAAgJ,CAAAA,CACA,mBAAA,CAAAC,CACF,EAAIhF,EAAAA,EAAS,CACP,CAACiF,CAAAA,CAAMC,CAAO,CAAA,CAAInE,QAAAA,CAAe,CAAC,EAClC,CAAC5F,CAAAA,CAAQgK,CAAS,CAAA,CAAIpE,SAA+B,IAAI,CAAA,CACzD,CAACqE,CAAAA,CAAOC,CAAQ,CAAA,CAAItE,QAAAA,CAAgB,CAAE,IAAA,CAAM,MAAO,CAAC,CAAA,CACpD,CAACuE,EAAYC,CAAa,CAAA,CAAIxE,QAAAA,CAAS,KAAK,CAAA,CAC5C,CAACyE,CAAAA,CAAUC,CAAW,EAAI1E,QAAAA,CAAS,CAAC,CAAA,CAIpC,CAAC2E,CAAAA,CAAeC,CAAgB,CAAA,CAAI5E,QAAAA,CAAsB,IAAI,CAAA,CAC9D,CAAC6E,CAAAA,CAAcC,CAAe,EAAI9E,QAAAA,CAAS,KAAK,CAAA,CAEhD,CAACX,EAAM0F,CAAO,CAAA,CAAI/E,QAAAA,CAAyB,OAAO,CAAA,CAClD,CAACgF,CAAAA,CAAaC,CAAc,EAAIjF,QAAAA,CAAiBuD,EAAAA,CAAS,CAAC,CAAA,CAAG,KAAK,CAAA,CACnE,CAAChE,CAAAA,CAAa2F,CAAc,CAAA,CAAIlF,QAAAA,CAAiBwD,EAAAA,CAAa,CAAC,CAAA,CAAG,KAAK,CAAA,CACvE,CAAC9N,EAAMyP,CAAO,CAAA,CAAInF,QAAAA,CAAS,EAAE,EAC7B,CAACoF,CAAAA,CAAUC,CAAW,CAAA,CAAIrF,SAA2B,KAAK,CAAA,CAC1D,CAACsF,CAAAA,CAAgBC,EAAiB,CAAA,CAAIvF,QAAAA,CAAS+D,CAAAA,EAAM,OAAS,EAAE,CAAA,CAChE,CAACxF,CAAAA,CAAUiH,CAAW,CAAA,CAAIxF,QAAAA,CAAgC,IAAI,EAC9D,CAACyF,CAAAA,CAAOC,CAAQ,CAAA,CAAI1F,QAAAA,CACxB,IACF,CAAA,CACM,CAAC2F,GAAYC,EAAa,CAAA,CAAI5F,QAAAA,CAAS,CAAC,EACxC,CAAC6F,CAAAA,CAAeC,EAAgB,CAAA,CACpC9F,SAAqC,IAAI,CAAA,CACrC,CAAC3I,CAAAA,CAAO0O,CAAQ,CAAA,CAAI/F,QAAAA,CACxB,IACF,EACM,CAACgG,CAAAA,CAASC,CAAU,CAAA,CAAIjG,SAAS,KAAK,CAAA,CACtCkG,EAAAA,CAAgBvG,MAAAA,CAA8B,IAAI,CAAA,CAClDwG,EAAAA,CAAWxG,MAAAA,CAA8B,IAAI,CAAA,CAC7CyG,EAAAA,CAAuBzG,MAAAA,CAA2B,IAAI,EAItD0G,EAAAA,CAAsB1G,MAAAA,CAAO,KAAK,CAAA,CAiIxC,GA7HAY,SAAAA,CAAU,IAAM,CACd,GAAKsD,EACL,OAAAwC,EAAAA,CAAoB,OAAA,CAAU,KAAA,CAC9BlC,CAAAA,CAAQ,CAAC,CAAA,CACTC,CAAAA,CAAU,IAAI,CAAA,CACde,CAAAA,CAAQ,EAAE,CAAA,CACVO,CAAAA,CAAS,IAAI,CAAA,CACbE,EAAAA,CAAc,CAAC,CAAA,CACfG,CAAAA,CAAS,IAAI,CAAA,CACbvB,CAAAA,CAAc,KAAK,CAAA,CACnBE,CAAAA,CAAY,CAAC,CAAA,CACbE,CAAAA,CAAiB,IAAI,CAAA,CACrBE,EAAgB,KAAK,CAAA,CACrBgB,EAAAA,CAAkB/E,CAAAA,GAChBA,GAAK,MAAA,EAAO,CACL,IAAA,CACR,CAAA,CACGiD,CAAAA,EACFI,CAAAA,CAAU,MAAM,CAAA,CAChBE,EAAS,CAAE,IAAA,CAAM,OAAA,CAAS,OAAA,CAASN,CAAe,CAAC,CAAA,EAC1ChJ,CAAAA,EAAS,OAAS,QAAA,CAC3BsJ,CAAAA,CAAS,CAAE,IAAA,CAAM,QAAS,CAAC,CAAA,CAE3BA,CAAAA,CAAS,CACP,IAAA,CAAM,QAAA,CACN,KAAA,CACEL,CAAAA,EAAqB,SACrB,+CACJ,CAAC,CAAA,CAEI,IAAM,CACXoC,EAAAA,CAAoB,OAAA,CAAU,KAChC,CACF,CAAA,CAAG,CAACxC,CAAAA,CAAQ7I,CAAAA,CAASgJ,EAAgBC,CAAmB,CAAC,CAAA,CAKzD1D,SAAAA,CAAU,IAAM,CACd,GAAI,CAACsD,EAAQ,OACbuC,EAAAA,CAAqB,OAAA,CAClB,QAAA,CAAS,aAAA,EAAwC,IAAA,CACpD,IAAME,CAAAA,CAAO,SAAS,eAAA,CAChBC,CAAAA,CAAeD,CAAAA,CAAK,KAAA,CAAM,SAC1BE,CAAAA,CAAmBF,CAAAA,CAAK,KAAA,CAAM,YAAA,CAC9BG,EAAY,MAAA,CAAO,UAAA,CAAaH,CAAAA,CAAK,WAAA,CAC3CA,CAAAA,CAAK,KAAA,CAAM,QAAA,CAAW,QAAA,CAClBG,EAAY,CAAA,GAAGH,CAAAA,CAAK,KAAA,CAAM,YAAA,CAAe,GAAGG,CAAS,CAAA,EAAA,CAAA,CAAA,CACzD,IAAIC,CAAAA,CAAW,MACTxK,CAAAA,CAAU,IAAM,CACpB,GAAI,CAAAwK,CAAAA,CACJ,CAAAA,CAAAA,CAAW,KACXJ,CAAAA,CAAK,KAAA,CAAM,QAAA,CAAWC,CAAAA,CACtBD,EAAK,KAAA,CAAM,YAAA,CAAeE,CAAAA,CAC1B,GAAI,CACFJ,EAAAA,CAAqB,OAAA,EAAS,KAAA,KAChC,CAAA,KAAQ,CAER,CAAA,CACF,CAAA,CACA,cAAO,gBAAA,CAAiB,UAAA,CAAYlK,CAAO,CAAA,CACpC,IAAM,CACX,MAAA,CAAO,mBAAA,CAAoB,WAAYA,CAAO,CAAA,CAC9CA,CAAAA,GACF,CACF,CAAA,CAAG,CAAC2H,CAAM,CAAC,CAAA,CAGXtD,SAAAA,CAAU,IAAM,CACd,GAAI,CAACsD,CAAAA,CAAQ,OACb,SAAS8C,EAAMjS,CAAAA,CAAkB,CAC/B,GAAIA,CAAAA,CAAE,GAAA,GAAQ,QAAA,CAAU,CACtBA,CAAAA,CAAE,gBAAe,CACjBoP,CAAAA,EAAa,CACb,MACF,CACA,GAAIpP,CAAAA,CAAE,GAAA,GAAQ,MAAO,OACrB,IAAMkS,CAAAA,CAAOT,EAAAA,CAAS,OAAA,CACtB,GAAI,CAACS,CAAAA,CAAM,OACX,IAAMC,CAAAA,CAAaC,EAAAA,CAAaF,CAAI,EACpC,GAAIC,CAAAA,CAAW,MAAA,GAAW,CAAA,CAAG,OAC7B,IAAM5D,CAAAA,CAAQ4D,CAAAA,CAAW,CAAC,CAAA,CACpBhF,CAAAA,CAAOgF,CAAAA,CAAWA,CAAAA,CAAW,OAAS,CAAC,CAAA,CACvCE,EAAAA,CAAS,QAAA,CAAS,aAAA,CACpBrS,CAAAA,CAAE,QAAA,GAAaqS,EAAAA,GAAW9D,GAAS,CAAC2D,CAAAA,CAAK,QAAA,CAASG,EAAM,CAAA,CAAA,EAC1DrS,CAAAA,CAAE,cAAA,EAAe,CACjBmN,EAAK,KAAA,EAAM,EACF,CAACnN,CAAAA,CAAE,UAAYqS,EAAAA,GAAWlF,CAAAA,GACnCnN,CAAAA,CAAE,cAAA,GACFuO,CAAAA,CAAM,KAAA,EAAM,EAEhB,CACA,OAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAW0D,CAAK,EACnC,IAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAWA,CAAK,CAC5D,CAAA,CAAG,CAAC9C,CAAAA,CAAQC,CAAY,CAAC,CAAA,CAGzBvD,SAAAA,CAAU,IAAM,CACd,GAAI,CAACsD,CAAAA,EAAUQ,EAAM,IAAA,GAAS,QAAA,CAAU,OACxC,SAAS2C,EAAQtS,CAAAA,CAAmB,CAGlC,IAAMuS,CAAAA,CAFQ,MAAM,IAAA,CAAKvS,CAAAA,CAAE,aAAA,EAAe,KAAA,EAAS,EAAE,CAAA,CACjC,IAAA,CAAMwS,GAASA,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,EAC7C,SAAA,EAAU,CACzBD,IACLvS,CAAAA,CAAE,cAAA,EAAe,CACjByS,EAAAA,CAAuBF,CAAI,CAAA,EAC7B,CACA,OAAA,MAAA,CAAO,iBAAiB,OAAA,CAASD,CAAO,CAAA,CACjC,IAAM,OAAO,mBAAA,CAAoB,OAAA,CAASA,CAAO,CAE1D,EAAG,CAACnD,CAAAA,CAAQQ,CAAAA,CAAM,IAAI,CAAC,CAAA,CAGvB9D,SAAAA,CAAU,IAAM,CACd,GAAI,CAAChC,CAAAA,CAAU,OACf,IAAMjG,CAAAA,CAAQ,IAAA,CAAK,GAAA,GACb0D,CAAAA,CAAK,MAAA,CAAO,WAAA,CAAY,IAAM,CAClC,IAAMoL,CAAAA,CAAM,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,EAAI,CAAI9O,CAAAA,EAAS,GAAI,CAAA,CAClDsN,EAAAA,CAAcwB,CAAG,CAAA,CACbA,GAAO/D,EAAAA,EAAmBgE,EAAAA,GAChC,CAAA,CAAG,GAAG,CAAA,CACN,OAAO,IAAM,OAAO,aAAA,CAAcrL,CAAE,CAEtC,CAAA,CAAG,CAACuC,CAAQ,CAAC,CAAA,CAET,CAACsF,CAAAA,CAAQ,OAAO,IAAA,CAGpB,eAAeyD,EAAAA,CAAWtR,CAAAA,CAA+C,CACvEqQ,EAAAA,CAAoB,QAAU,KAAA,CAC9B/B,CAAAA,CAAS,CAAE,IAAA,CAAM,WAAY,CAAC,CAAA,CAC9B,GAAI,CACF,IAAMhO,CAAAA,CAAS,MAAMiR,EAAAA,CAAc,CACjC,GAAGvM,CAAAA,CACH,IAAA,CAAAhF,CAAAA,CACA,OAAQgF,CAAAA,EAAS,MAAA,EAAU,QAAA,CAAS,eACtC,CAAC,CAAA,CACD,OAAIqL,EAAAA,CAAoB,QAAgB,CAAA,CAAA,EACxCmB,EAAAA,CAAoBlR,CAAM,CAAA,CAC1BgO,CAAAA,CAAS,CAAE,IAAA,CAAM,OAAA,CAAS,QAAShO,CAAO,CAAC,CAAA,CACpC,CAAA,CAAA,CACT,OAAS5B,CAAAA,CAAG,CACV,OAAI2R,EAAAA,CAAoB,SACxB/B,CAAAA,CAAS,CACP,IAAA,CAAM,QAAA,CACN,KAAA,CACE5P,CAAAA,YAAa,KAAA,CACTA,CAAAA,CAAE,QACF,+CACR,CAAC,CAAA,CACM,KACT,CACF,CAEA,eAAe+S,EAAAA,CAAanJ,EAAkB,CAC5C8F,CAAAA,CAAU9F,CAAC,CAAA,CAEXsG,CAAAA,CAAiB,IAAI,CAAA,CACjBtG,CAAAA,GAAM,SAASoJ,EAAAA,EAAa,CAC5BpJ,CAAAA,GAAM,MAAA,CACR,MAAMgJ,EAAAA,CAAWtM,CAAAA,EAAS,IAAA,EAAQ,MAAM,EAC/BsD,CAAAA,GAAM,QAAA,CACf,MAAMgJ,EAAAA,CAAW,aAAa,CAAA,CAInB,MAAMA,EAAAA,CAAWtM,GAAS,IAAA,EAAQ,MAAM,CAAA,EAC3C,MAAM2M,EAAAA,GAElB,CAEA,SAASR,GAAuBF,CAAAA,CAAY,CAC1C,GAAI,CAACA,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,EAAG,CACnCW,KAAAA,CAAM,KAAA,CAAM,yCAAyC,EACrD,MACF,CACA,IAAMtR,CAAAA,CAASuR,GAA0BZ,CAAAA,CAAM,CAC7C,gCACF,CAAC,CAAA,CACD3C,CAAAA,CAAS,CAAE,IAAA,CAAM,QAAS,OAAA,CAAShO,CAAO,CAAC,EAC7C,CAEA,SAASkR,EAAAA,CAAoBlR,CAAAA,CAAuB,CAC9CA,CAAAA,CAAO,QAAA,CAAS,MAAA,GAAW,CAAA,EAC/BsR,KAAAA,CAAM,OAAA,CACJ,4FACF,EACF,CAGA,eAAeE,EAAAA,EAAiB,CAC9B,GAAI,CACF,IAAMrS,CAAAA,CAAI,MAAMsS,EAAAA,CAAY1E,EAAiB,CAAA,CAC7CmC,CAAAA,CAAY/P,CAAC,EACf,CAAA,MAASf,CAAAA,CAAG,CACVkT,KAAAA,CAAM,MAAMlT,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,wBAAwB,EACvE,CACF,CACA,eAAe2S,IAAkB,CAC/B,GAAK9I,CAAAA,CACL,GAAI,CACF,IAAMjI,CAAAA,CAAS,MAAMiI,EAAS,IAAA,EAAK,CACnCmH,CAAAA,CAAS,CAAE,KAAMpP,CAAAA,CAAO,IAAA,CAAM,UAAA,CAAYA,CAAAA,CAAO,UAAW,CAAC,EAC/D,CAAA,MAAS5B,CAAAA,CAAG,CACVkT,KAAAA,CAAM,KAAA,CAAMlT,CAAAA,YAAa,MAAQA,CAAAA,CAAE,OAAA,CAAU,0BAA0B,EACzE,CAAA,OAAE,CACA8Q,CAAAA,CAAY,IAAI,EAClB,CACF,CACA,SAASwC,EAAAA,EAAmB,CAC1BzJ,CAAAA,EAAU,MAAA,EAAO,CACjBiH,EAAY,IAAI,CAAA,CAChBE,CAAAA,CAAS,IAAI,EACbE,EAAAA,CAAc,CAAC,EACjB,CAGA,eAAe+B,EAAAA,EAAa,CAC1B,GAAI,CACF,IAAMlS,CAAAA,CAAI,MAAMwS,EAAAA,CAAY3E,EAAiB,CAAA,CAC7CwC,EAAAA,CAAiBrQ,CAAC,CAAA,CAClBA,CAAAA,CAAE,MAAA,CAAO,cAAA,EAAe,CAAE,CAAC,CAAA,EAAG,gBAAA,CAAiB,OAAA,CAAS,IAAM,CACvDyS,EAAAA,GACP,CAAC,EACH,CAAA,MAASxT,CAAAA,CAAG,CACVkT,KAAAA,CAAM,MAAMlT,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,4BAA4B,EAC3E,CACF,CACA,eAAewT,EAAAA,EAAc,CAC3B,GAAI,CAACrC,EAAe,OACpB,IAAMsC,CAAAA,CAAStC,CAAAA,CACfC,EAAAA,CAAiB,IAAI,CAAA,CACrB,GAAI,CACF,IAAMxP,CAAAA,CAAS,MAAM6R,CAAAA,CAAO,IAAA,EAAK,CACjCpC,CAAAA,CAAS,CAAE,KAAMzP,CAAAA,CAAO,IAAA,CAAM,UAAA,CAAYA,CAAAA,CAAO,UAAW,CAAC,EAC/D,CAAA,MAAS5B,CAAAA,CAAG,CACVkT,KAAAA,CAAM,KAAA,CAAMlT,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,0BAA0B,EACzE,CACF,CACA,SAASgT,EAAAA,EAAe,CACtB7B,GAAe,MAAA,EAAO,CACtBC,EAAAA,CAAiB,IAAI,EACrBC,CAAAA,CAAS,IAAI,EACf,CAGA,IAAMqC,EAAAA,CAAW/D,CAAAA,CAAM,IAAA,GAAS,QAChC,eAAegE,EAAAA,EAAS,CAKtB,GADI9J,GAAU,MAAM8I,EAAAA,EAAgB,CAChCnD,CAAAA,GAAS,EAAG,CAKd,GAFI2B,CAAAA,EAAe,MAAMqC,EAAAA,EAAY,CAEjC7D,CAAAA,CAAM,IAAA,GAAS,QAAS,CAC1B,IAAMiE,CAAAA,CAAO,MAAMpC,EAAAA,CAAc,OAAA,EAAS,OAAA,EAAQ,CAClDtB,EAAiB0D,CAAAA,EAAQjE,CAAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,CAC3CS,CAAAA,CAAgBwD,CAAAA,EAAQ,IAAA,EAAQA,IAASjE,CAAAA,CAAM,OAAA,CAAQ,IAAI,EAC7D,CACAF,CAAAA,CAAQ,CAAC,EACX,CAAA,KAAWD,IAAS,CAAA,CAClBC,CAAAA,CAAQ,CAAC,CAAA,CAET,MAAMoE,EAAAA,GAEV,CACA,SAASC,EAAAA,EAAS,CACZtE,CAAAA,CAAO,CAAA,EAAGC,CAAAA,CAASrJ,CAAAA,EAAOA,CAAAA,CAAI,CAAU,EAC9C,CAEA,eAAeyN,EAAAA,EAAS,CACtB,GAAIlE,CAAAA,CAAM,IAAA,GAAS,OAAA,CAAS,OAC5B,IAAMoE,CAAAA,CAAU/S,CAAAA,CAAK,IAAA,GACf,CAAE,OAAA,CAASgT,CAAc,CAAA,CAAIrE,EACnCG,CAAAA,CAAc,IAAI,CAAA,CAClBE,CAAAA,CAAY,CAAC,CAAA,CACb,GAAI,CAGF,IAAMiE,CAAAA,CAAiBhE,CAAAA,EAAiB+D,CAAAA,CAAc,IAAA,CAChDpS,CAAAA,CAAS,MAAMsN,CAAAA,CAAO,MAAA,CAC1B,CACE,OAAA,CAAS6E,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAU,KAAA,CAAA,CACxC,QAAA,CAAArD,CAAAA,CACA,eAAgBE,CAAAA,CAAe,IAAA,EAAK,EAAK,KAAA,CAAA,CACzC,WAAYqD,CAAAA,CACZ,KAAA,CAAOlD,CAAAA,EAAO,IAAA,CACd,gBAAiBA,CAAAA,EAAO,UAAA,CACxB,KAAA,CAAOpO,CAAAA,EAAO,IAAA,CACd,eAAA,CAAiBA,CAAAA,EAAO,UAAA,CACxB,QAASuR,EAAAA,CAAeF,CAAa,CACvC,CAAA,CACA,CACE,gBAAA,CAAmBG,CAAAA,EAAanE,CAAAA,CAAY,IAAA,CAAK,IAAI,GAAA,CAAMmE,CAAQ,CAAC,CACtE,CACF,CAAA,CACAnE,CAAAA,CAAY,CAAC,EACbkD,KAAAA,CAAM,OAAA,CAAQ,iCAA4B,CAAA,CACrCtR,EAAO,EAAA,CACZwN,CAAAA,GACF,CAAA,MAASpP,EAAG,CACVkT,KAAAA,CAAM,KAAA,CAAMlT,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,2BAA2B,EACxE8P,CAAAA,CAAc,KAAK,EACrB,CACF,CAEA,SAASsE,EAAAA,CAAoBpU,CAAAA,CAAqC,CAC5DA,CAAAA,CAAE,MAAA,GAAWA,CAAAA,CAAE,aAAA,EAAiB,CAAC6P,CAAAA,EAAYT,CAAAA,GACnD,CAEA,IAAMiF,EAAAA,CAAe,IAAA,CAAK,KAAA,CAAMtE,EAAW,GAAG,CAAA,CACxCuE,EAAAA,CAAgB5O,CAAAA,GAAW,QAC3B6O,EAAAA,CACH/E,CAAAA,GAAS,CAAA,EAAK,CAACkE,EAAAA,EAAa7D,CAAAA,CACzB2E,EAAAA,CACJhF,CAAAA,CAAO,EACH,MAAA,CACAK,CAAAA,CACEwE,EAAAA,CAAe,EAAA,CACb,CAAA,UAAA,EAAaA,EAAY,CAAA,OAAA,CAAA,CACzB,mBAAA,CACF,gBAER,OACE1G,GAAAA,CAAC,KAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,YAAA,CAAW,MAAA,CACX,YAAA,CAAW,gBACX,SAAA,CAAU,sBAAA,CACV,2BAAA,CAA0B,MAAA,CAC1B,YAAayG,EAAAA,CAEb,QAAA,CAAA1G,IAAAA,CAAC,KAAA,CAAA,CACC,IAAK+D,EAAAA,CACL,SAAA,CAAU,aAAA,CACV,oBAAA,CAAoBH,CAAAA,CAAU,MAAA,CAAS,MAAA,CAEvC,QAAA,CAAA,CAAA3D,IAAC8G,EAAAA,CAAA,CAAa,SAAA,CAAWrF,CAAAA,CAAc,CAAA,CAEvC1B,IAAAA,CAAC,QAAA,CAAA,CAAO,SAAA,CAAU,qBAChB,QAAA,CAAA,CAAAA,IAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,mBAAA,CACZ,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,uBAAA,CAAwB,aAAA,CAAY,MAAA,CAAO,CAAA,CAAE,iBAE/D,CAAA,CACAA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAASyB,CAAAA,CACT,SAAA,CAAU,gBAAA,CACV,YAAA,CAAW,OAAA,CACZ,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,EAEAzB,GAAAA,CAAC+G,EAAAA,CAAA,CAAQ,IAAA,CAAMlF,EAAM,CAAA,CAErB9B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAEZ,QAAA,CAAA,CAAA8B,CAAAA,GAAS,CAAA,CACR9B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YAAA,CACb,QAAA,CAAA,CAAAC,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,cAAA,CACV,IAAA,CAAK,QACL,YAAA,CAAW,gBAAA,CAEV,QAAA,CAAAqB,EAAAA,CAAQ,IAAKpF,CAAAA,EACZ8D,IAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,kBAAA,CACV,cAAA,CAAchI,IAAWkE,CAAAA,CAAE,KAAA,CAC3B,OAAA,CAAS,IAAMmJ,EAAAA,CAAanJ,CAAAA,CAAE,KAAK,CAAA,CACnC,SAAU+F,CAAAA,CAAM,IAAA,GAAS,WAAA,CAEzB,QAAA,CAAA,CAAAhC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAA,CAAsB,SAAA/D,CAAAA,CAAE,KAAA,CAAM,CAAA,CAC9C+D,GAAAA,CAAC,QAAK,SAAA,CAAU,mBAAA,CAAqB,QAAA,CAAA/D,CAAAA,CAAE,KAAK,CAAA,CAAA,CAAA,CARvCA,CAAAA,CAAE,KAST,CACD,CAAA,CACH,CAAA,CAEC+F,CAAAA,CAAM,IAAA,GAAS,OACdjC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,GAAA,CAAA,CAAE,QAAA,CAAA,sDAAA,CAEH,EACAA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iBAAA,CACV,OAAA,CAAS,IAAMiC,EAAS,CAAE,IAAA,CAAM,QAAS,CAAC,EAC3C,QAAA,CAAA,wBAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAEHD,EAAM,IAAA,GAAS,WAAA,CACdjC,IAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,cAAA,CACX,QAAA,CAAA,CAAAC,GAAAA,CAAC,QAAK,SAAA,CAAU,eAAA,CAAgB,aAAA,CAAY,MAAA,CAAO,CAAA,CAAE,iBAAA,CAAA,CAEvD,CAAA,CACE,IAAA,CAEHgC,EAAM,IAAA,GAAS,QAAA,CACdjC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAE,SAAA,CAAU,cAAA,CACV,QAAA,CAAAgC,CAAAA,CAAM,MACH,8EAAA,CACA,2CAAA,CACN,CAAA,CACAjC,IAAAA,CAAC,SAAM,SAAA,CAAU,mBAAA,CACf,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,8BAAA,CAA4B,CAAA,CAClCA,GAAAA,CAAC,SACC,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,iCAAA,CACP,SAAW3N,CAAAA,EAAM,CACf,IAAMuS,CAAAA,CAAOvS,EAAE,aAAA,CAAc,KAAA,GAAQ,CAAC,CAAA,CAClCuS,CAAAA,EAAME,EAAAA,CAAuBF,CAAI,CAAA,CACrCvS,EAAE,aAAA,CAAc,KAAA,CAAQ,GAC1B,CAAA,CACF,GACF,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAEH2P,CAAAA,CAAM,OAAS,OAAA,CACdjC,IAAAA,CAAAiH,QAAAA,CAAA,CACG,QAAA,CAAA,CAACL,EAAAA,CA8EE,IAAA,CA7EF5G,IAAAA,CAAC,OAAI,SAAA,CAAU,eAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,iBAAA,CACV,IAAA,CAAK,QACL,YAAA,CAAW,iBAAA,CAEX,QAAA,CAAA,CAAAC,GAAAA,CAACiH,EAAAA,CAAA,CACC,KAAA,CAAM,OAAA,CACN,OAAQjK,CAAAA,GAAS,OAAA,CACjB,OAAA,CAAS,IAAM0F,EAAQ,OAAO,CAAA,CAChC,CAAA,CACA1C,GAAAA,CAACiH,GAAA,CACC,KAAA,CAAM,KAAA,CACN,MAAA,CAAQjK,CAAAA,GAAS,MAAA,CACjB,OAAA,CAAS,IAAM0F,EAAQ,MAAM,CAAA,CAC/B,CAAA,CACA1C,GAAAA,CAACiH,EAAAA,CAAA,CACC,KAAA,CAAM,MAAA,CACN,OAAQjK,CAAAA,GAAS,UAAA,CACjB,OAAA,CAAS,IAAM0F,CAAAA,CAAQ,UAAU,CAAA,CACnC,CAAA,CAAA,CACF,EACA1C,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,EACpCA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,KAAK,OAAA,CACL,YAAA,CAAW,OAAA,CAEV,QAAA,CAAAkB,EAAAA,CAAS,GAAA,CAAKzI,CAAAA,EACbuH,GAAAA,CAAC,UAEC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,cAAA,CACV,KAAA,CAAO,CAAE,UAAA,CAAYvH,CAAAA,CAAE,KAAM,CAAA,CAC7B,YAAA,CAAYA,CAAAA,CAAE,KAAA,CACd,cAAA,CAAckK,CAAAA,GAAgBlK,CAAAA,CAAE,KAAA,CAChC,QAAS,IAAMmK,CAAAA,CAAenK,CAAAA,CAAE,KAAK,GANhCA,CAAAA,CAAE,KAOT,CACD,CAAA,CACH,EACAuH,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,oBAAA,CACV,IAAA,CAAK,OAAA,CACL,YAAA,CAAW,cAAA,CAEV,SAAAmB,EAAAA,CAAa,GAAA,CAAK1I,CAAAA,EACjBuH,GAAAA,CAAC,UAEC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,mBAAA,CACV,aAAYvH,CAAAA,CAAE,KAAA,CACd,cAAA,CAAcyE,CAAAA,GAAgBzE,CAAAA,CAAE,KAAA,CAChC,OAAA,CAAS,IAAMoK,EAAepK,CAAAA,CAAE,KAAK,CAAA,CAErC,QAAA,CAAAuH,IAAC,MAAA,CAAA,CACC,SAAA,CAAU,uBAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAOvH,CAAAA,CAAE,GAAA,CAAK,MAAA,CAAQA,CAAAA,CAAE,GAAI,CAAA,CACvC,CAAA,CAAA,CAVKA,EAAE,KAWT,CACD,CAAA,CACH,CAAA,CACAuH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,EACvCA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iBAAA,CACV,OAAA,CAAS,IAAM6D,GAAc,OAAA,EAAS,IAAA,EAAK,CAC5C,QAAA,CAAA,MAAA,CAED,EACA7D,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,UAAU,iBAAA,CACV,OAAA,CAAS,IAAM6D,EAAAA,CAAc,OAAA,EAAS,KAAA,EAAM,CAC7C,QAAA,CAAA,OAAA,CAED,GACF,CAAA,CAGF7D,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAAA,GAAAA,CAAClD,EAAAA,CAAA,CACC,GAAA,CAAK+G,EAAAA,CACL,UAAA,CAAY7B,CAAAA,CAAM,OAAA,CAAQ,IAAA,CAC1B,IAAA,CAAMhF,CAAAA,CACN,MAAO2F,CAAAA,CACP,WAAA,CAAazF,CAAAA,CACb,eAAA,CAAiB0G,EACnB,CAAA,CACF,CAAA,CAEA7D,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,mBAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iBAAA,CACV,QAAS,IAAMjI,CAAAA,EAAUqN,EAAAA,CAAarN,CAAM,CAAA,CAE3C,QAAA,CAAA4O,EAAAA,CAAgB,kBAAA,CAAgB,mBACnC,CAAA,CACCA,EAAAA,CACCnD,CAAAA,CACEzD,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACd,QAAA,CAAA,CAAAC,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,aAAA,CAAY,OAAO,CAAA,CACnDA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAiB,QAAA,CAAA,iBAAA,CAAU,CAAA,CAC3CA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iBAAA,CACV,QAAS6F,EAAAA,CACV,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE7Q,EACF+K,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,oBAC5B,IAAA,CAAK,KAAA,CAAM/K,CAAAA,CAAM,UAAA,CAAa,GAAI,CAAA,CAAE,YAAA,CAAA,CACzC,CAAA,CACE,KAEJ+K,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACb,UAAAmH,EAAAA,CAAanP,CAAM,CAAA,CAAE,4CAAA,CAAA,CAExB,GAEJ,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAAA,CACN,CAAA,CACE,IAAA,CAGH8J,CAAAA,GAAS,CAAA,CACR9B,IAAAA,CAAC,OAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,aAAA,CACf,QAAA,CAAA,CAAAC,IAAC,MAAA,CAAA,CAAK,QAAA,CAAA,gBAAA,CAAc,CAAA,CACpBA,GAAAA,CAAC,UAAA,CAAA,CACC,KAAA,CAAO3M,CAAAA,CACP,QAAA,CAAWhB,GAAMyQ,CAAAA,CAAQzQ,CAAAA,CAAE,MAAA,CAAO,KAAK,EACvC,IAAA,CAAM,CAAA,CACN,WAAA,CAAY,kCAAA,CACZ,UAAU,aAAA,CAEV,SAAA,CAAS,IAAA,CACX,CAAA,CAAA,CACF,CAAA,CAEA0N,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,6BAAA,CAA2B,CAAA,CACjCD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBACZ,QAAA,CAAA,CAAA,CAAC7D,CAAAA,EAAY,CAACkH,CAAAA,CACbpD,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAASyF,EAAAA,CACT,SAAA,CAAU,iBAAA,CACX,QAAA,CAAA,mBAAA,CAED,EACE,IAAA,CACHvJ,CAAAA,CACC6D,IAAAA,CAAAiH,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAjH,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACd,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,eAAA,CAAgB,aAAA,CAAY,MAAA,CAAO,CAAA,CACnDA,GAAAA,CAACmH,EAAAA,CAAA,CAAS,MAAA,CAAQjL,EAAS,MAAA,CAAQ,CAAA,CACnC6D,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAuD,EAAAA,CAAW,OAAKtC,EAAAA,CAAkB,GAAA,CAAA,CACrC,CAAA,CAAA,CACF,CAAA,CACAhB,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASgF,GACT,SAAA,CAAU,iBAAA,CACX,QAAA,CAAA,MAAA,CAED,CAAA,CACAhF,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS2F,EAAAA,CACT,SAAA,CAAU,iBAAA,CACX,QAAA,CAAA,QAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CACHvC,CAAAA,EAAS,CAAClH,CAAAA,CACT6D,IAAAA,CAAAiH,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhH,GAAAA,CAACoH,EAAAA,CAAA,CACC,KAAMhE,CAAAA,CAAM,IAAA,CACZ,UAAA,CAAYA,CAAAA,CAAM,WACpB,CAAA,CACApD,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAMqD,CAAAA,CAAS,IAAI,CAAA,CAC5B,SAAA,CAAU,iBAAA,CACX,QAAA,CAAA,QAAA,CAED,GACF,CAAA,CACE,IAAA,CAAA,CACN,CAAA,CAAA,CACF,CAAA,CAEAtD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CACb,UAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,UAAA,CAAQ,CAAA,CACdA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,KAAK,OAAA,CACL,YAAA,CAAW,mBAAA,CAEV,QAAA,CAAAoB,GAAW,GAAA,CAAKpC,CAAAA,EACfgB,GAAAA,CAAC,QAAA,CAAA,CAEC,KAAK,QAAA,CACL,SAAA,CAAU,oBAAA,CACV,cAAA,CAAc+C,CAAAA,GAAa/D,CAAAA,CAAE,KAAA,CAC7B,OAAA,CAAS,IAAMgE,CAAAA,CAAYhE,CAAAA,CAAE,KAAK,CAAA,CAEjC,QAAA,CAAAA,CAAAA,CAAE,KAAA,CAAA,CANEA,CAAAA,CAAE,KAOT,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAEAe,IAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,aAAA,CACf,UAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,uBAAA,CAAqB,CAAA,CAC3BA,IAAC,OAAA,CAAA,CACC,IAAA,CAAK,OAAA,CACL,KAAA,CAAOiD,EACP,QAAA,CAAW5Q,CAAAA,EAAM6Q,EAAAA,CAAkB7Q,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACjD,WAAA,CAAY,kBACZ,SAAA,CAAU,aAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAGHwP,CAAAA,GAAS,CAAA,CACR9B,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,UAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,mBAAO,CAAA,CACxCD,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBACb,QAAA,CAAA,CAAAmH,EAAAA,CAAanP,CAAM,CAAA,CACnByK,CAAAA,CAAe,iBAAA,CAAiB,EAAA,CACjCxC,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,YAAA,CACV,QAAS,IAAM8B,CAAAA,CAAQ,CAAC,CAAA,CACzB,gBAED,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACA/B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAA,CAAAC,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,QAAA,CAAA,UAAA,CAAQ,EACzCD,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACd,UAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,YAAA,CACb,QAAA,CAAAoB,EAAAA,CAAW,IAAA,CAAMpC,CAAAA,EAAMA,EAAE,KAAA,GAAU+D,CAAQ,CAAA,EAAG,KAAA,CACjD,CAAA,CACA/C,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,SAAA,CAAU,YAAA,CACV,OAAA,CAAS,IAAM8B,CAAAA,CAAQ,CAAC,CAAA,CACzB,QAAA,CAAA,MAAA,CAED,GACF,CAAA,CAAA,CACF,CAAA,CACA/B,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kBAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,gBAAA,CAAiB,QAAA,CAAA,aAAA,CAAW,CAAA,CAC5CD,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAA1M,EAAK,IAAA,EAAK,CACTA,CAAAA,CAAK,IAAA,EAAK,CAEV2M,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAoB,QAAA,CAAA,QAAA,CAAC,CAAA,CAEvCA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,YAAA,CACV,QAAS,IAAM8B,CAAAA,CAAQ,CAAC,CAAA,CACzB,gBAED,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACA/B,IAAAA,CAAC,OAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,QAAA,CAAA,UAAA,CAAQ,EACzCD,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAqD,CAAAA,CACCrD,IAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,cAAA,CAAe,QAAA,CAAA,CAAA,kBAAA,CACnB,IAAA,CAAK,KAAA,CAAMqD,CAAAA,CAAM,UAAA,CAAa,GAAI,CAAA,CAAE,IAC9CpD,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,UAAU,aAAA,CACV,YAAA,CAAW,mBAAA,CACX,OAAA,CAAS,IAAMqD,CAAAA,CAAS,IAAI,CAAA,CAC7B,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CACHrO,CAAAA,CACC+K,KAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAA,CAAA,eAAA,CACpB,KAAK,KAAA,CAAM/K,CAAAA,CAAM,UAAA,CAAa,GAAI,EAAE,GAAA,CAC7CgL,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,aAAA,CACV,YAAA,CAAW,eACX,OAAA,CAASqF,EAAAA,CACV,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,EACE,IAAA,CACHpC,CAAAA,CAAe,IAAA,EAAK,CACnBlD,KAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAA,CAAA,SAAA,CAAGkD,CAAAA,CAAe,IAAA,EAAK,CAAA,CAAE,CAAA,CACtD,KACH,CAACG,CAAAA,EAAS,CAAClH,CAAAA,CACV8D,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,UAAU,+BAAA,CACV,OAAA,CAAS,IAAM,CACb8B,CAAAA,CAAQ,CAAC,CAAA,CACJ2D,EAAAA,GACP,CAAA,CACD,QAAA,CAAA,cAAA,CAED,CAAA,CACE,IAAA,CACHjC,EACCzD,IAAAA,CAAAiH,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAjH,KAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CACd,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,cAAY,MAAA,CAAO,CAAA,CAAE,iBAAA,CAAA,CAEvD,CAAA,CACAA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,UAAU,+BAAA,CACV,OAAA,CAAS6F,EAAAA,CACV,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CACG7Q,CAAAA,CAQD,IAAA,CAPFgL,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,gCACV,OAAA,CAASsF,EAAAA,CACV,QAAA,CAAA,oBAAA,CAED,CAAA,CAAA,CAEJ,GACF,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAAA,CACN,CAAA,CAEAvF,IAAAA,CAAC,QAAA,CAAA,CAAO,SAAA,CAAU,oBAAA,CACf,UAAAmC,CAAAA,CACClC,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,IAAA,CAAK,aAAA,CACL,eAAA,CAAe,EACf,eAAA,CAAe,GAAA,CACf,eAAA,CAAe0G,EAAAA,CAEf,QAAA,CAAA1G,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,sBACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAG0G,EAAY,CAAA,CAAA,CAAI,CAAA,CACrC,CAAA,CACF,CAAA,CACE,KACJ3G,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS6B,CAAAA,GAAS,CAAA,CAAIJ,CAAAA,CAAe0E,GACrC,SAAA,CAAU,iBAAA,CACV,QAAA,CAAUjE,CAAAA,CAET,SAAAL,CAAAA,GAAS,CAAA,CAAI,QAAA,CAAW,MAAA,CAC3B,CAAA,CACA7B,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAASgG,EAAAA,CACT,SAAA,CAAU,mBAAA,CACV,SAAUY,EAAAA,CAET,QAAA,CAAAC,EAAAA,CACH,CAAA,CAAA,CACF,GACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAEA,SAASK,EAAAA,CAAanP,CAAAA,CAAsC,CAC1D,OAAIA,CAAAA,GAAW,OAAA,CAAgB,kBAAA,CAC3BA,CAAAA,GAAW,QAAA,CAAiB,gBAAA,CACzB,YACT,CAEA,SAASgP,EAAAA,CAAQ,CAAE,IAAA,CAAAlF,CAAK,CAAA,CAAmB,CACzC,IAAMwF,CAAAA,CAAQ,CACZ,CAAE,CAAA,CAAG,CAAA,CAAG,KAAA,CAAO,SAAU,CAAA,CACzB,CAAE,CAAA,CAAG,CAAA,CAAG,MAAO,UAAW,CAAA,CAC1B,CAAE,CAAA,CAAG,CAAA,CAAG,KAAA,CAAO,QAAS,CAC1B,EACA,OACErH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAAgB,aAAA,CAAY,MAAA,CACxC,QAAA,CAAAqH,EAAM,GAAA,CAAI,CAAC5O,CAAAA,CAAG+C,CAAAA,GACbuE,IAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CACE,YAAA,EACC8B,IAASpJ,CAAAA,CAAE,CAAA,CAAI,oBAAA,CAAuB,EAAA,CAAA,EACtCoJ,EAAOpJ,CAAAA,CAAE,CAAA,CAAI,kBAAA,CAAqB,EAAA,CAAA,CAGrC,UAAAuH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAkB,QAAA,CAAAvH,CAAAA,CAAE,CAAA,CAAE,CAAA,CACtCuH,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAkB,QAAA,CAAAvH,CAAAA,CAAE,KAAA,CAAM,CAAA,CACzC+C,CAAAA,CAAI6L,EAAM,MAAA,CAAS,CAAA,CAAIrH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,CAAA,CAAK,IAAA,CAAA,CAAA,CATzDvH,EAAE,CAUT,CACD,CAAA,CACH,CAEJ,CAEA,SAASwO,EAAAA,CAAW,CAClB,KAAA,CAAAK,EACA,MAAA,CAAA5C,CAAAA,CACA,OAAA,CAAA6C,CACF,CAAA,CAIG,CACD,OACEvH,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASuH,CAAAA,CACT,SAAA,CAAU,YAAA,CACV,cAAA,CAAc7C,CAAAA,CAEb,SAAA4C,CAAAA,CACH,CAEJ,CAGA,SAASR,EAAAA,CAAa,CAAE,SAAA,CAAAU,CAAU,EAA8B,CAC9D,IAAMC,CAAAA,CAAYnK,MAAAA,CAAsB,IAAI,CAAA,CACtCoK,CAAAA,CAAepK,MAAAA,CAAe,CAAC,EAC/BqK,CAAAA,CAAYrK,MAAAA,CAA2B,IAAI,CAAA,CAEjD,SAAS+B,CAAAA,CAAchN,CAAAA,CAAuC,CAC5DA,EAAE,aAAA,CAAc,iBAAA,CAAkBA,CAAAA,CAAE,SAAS,CAAA,CAC7CoV,CAAAA,CAAU,OAAA,CAAUpV,CAAAA,CAAE,QACtBqV,CAAAA,CAAa,OAAA,CAAU,WAAA,CAAY,GAAA,EAAI,CACvCC,CAAAA,CAAU,OAAA,CAAUtV,CAAAA,CAAE,cAAc,cACtC,CACA,SAASkN,CAAAA,CAAclN,EAAuC,CAC5D,GAAIoV,CAAAA,CAAU,OAAA,EAAW,MAAQ,CAACE,CAAAA,CAAU,OAAA,CAAS,OACrD,IAAM7H,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAGzN,CAAAA,CAAE,OAAA,CAAUoV,CAAAA,CAAU,OAAO,CAAA,CACpDE,CAAAA,CAAU,OAAA,CAAQ,KAAA,CAAM,UAAY,CAAA,WAAA,EAAc7H,CAAE,CAAA,GAAA,EACtD,CACA,SAASF,CAAAA,CAAYvN,CAAAA,CAAuC,CAC1D,GAAIoV,CAAAA,CAAU,OAAA,EAAW,IAAA,EAAQ,CAACE,EAAU,OAAA,CAAS,OACrD,IAAM7H,CAAAA,CAAK,KAAK,GAAA,CAAI,CAAA,CAAGzN,CAAAA,CAAE,OAAA,CAAUoV,CAAAA,CAAU,OAAO,CAAA,CAC9CG,CAAAA,CAAK,KAAK,GAAA,CAAI,CAAA,CAAG,WAAA,CAAY,GAAA,EAAI,CAAIF,CAAAA,CAAa,OAAO,CAAA,CACzDG,EAAW/H,CAAAA,CAAK8H,CAAAA,CACtBD,CAAAA,CAAU,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAY,EAAA,CACpCA,CAAAA,CAAU,QAAQ,KAAA,CAAM,UAAA,CAAa,EAAA,CACrCF,CAAAA,CAAU,QAAU,IAAA,CAAA,CAChB3H,CAAAA,CAAK,EAAA,EAAM+H,CAAAA,CAAW,KAAKL,CAAAA,GACjC,CAEA,OACExH,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,qBAAA,CACV,cAAY,MAAA,CACZ,aAAA,CAAeX,CAAAA,CACf,aAAA,CAAeE,EACf,WAAA,CAAaK,CAAAA,CACb,eAAA,CAAiBA,CAAAA,CACnB,CAEJ,CAMA,SAASuH,EAAAA,CAAS,CAAE,MAAA,CAAApS,CAAO,CAAA,CAA4B,CACrD,IAAM+S,CAAAA,CAAYxK,MAAAA,CAAiC,IAAI,CAAA,CAEvD,OAAAY,SAAAA,CAAU,IAAM,CACd,IAAMtJ,EAASkT,CAAAA,CAAU,OAAA,CACzB,GAAI,CAAClT,CAAAA,CAAQ,OACb,IAAMmT,CAAAA,CAAM,KAAK,GAAA,CAAI,MAAA,CAAO,gBAAA,EAAoB,CAAA,CAAG,CAAC,CAAA,CAC9CC,CAAAA,CAAWpT,CAAAA,CAAO,aAAe,EAAA,CACjCqT,CAAAA,CAAYrT,CAAAA,CAAO,YAAA,EAAgB,EAAA,CACzCA,CAAAA,CAAO,KAAA,CAAQ,IAAA,CAAK,MAAMoT,CAAAA,CAAWD,CAAG,CAAA,CACxCnT,CAAAA,CAAO,OAAS,IAAA,CAAK,KAAA,CAAMqT,CAAAA,CAAYF,CAAG,EAC1C,IAAM7S,CAAAA,CAAMN,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAClC,GAAI,CAACM,EAAK,OACVA,CAAAA,CAAI,KAAA,CAAM6S,CAAAA,CAAKA,CAAG,CAAA,CAElB,IAAMG,CAAAA,CACJ,OAAO,YAAA,EACN,MAAA,CACE,kBAAA,CACL,GAAI,CAACA,CAAAA,CAAW,OAChB,IAAMC,EAAW,IAAID,CAAAA,CACfE,CAAAA,CAASD,CAAAA,CAAS,wBAAwBpT,CAAM,CAAA,CAChDsT,CAAAA,CAAWF,CAAAA,CAAS,gBAAe,CACzCE,CAAAA,CAAS,OAAA,CAAU,IAAA,CACnBA,CAAAA,CAAS,qBAAA,CAAwB,EAAA,CACjCD,CAAAA,CAAO,QAAQC,CAAQ,CAAA,CACvB,IAAMzN,CAAAA,CAAO,IAAI,UAAA,CAAWyN,CAAAA,CAAS,OAAO,EAEtCC,CAAAA,CAAO,EAAA,CACPC,CAAAA,CAAM,CAAA,CACNC,CAAAA,CAAQ,CAAA,CACRC,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAA,CAAIT,CAAAA,CAAWO,CAAAA,EAAOD,CAAAA,CAAO,IAAMA,CAAI,CAAA,CACvDI,CAAAA,CAAS,IAAA,CAAK,IAAID,CAAAA,CAAO,CAAA,CAAG,CAAC,CAAA,CAC7BjR,CAAAA,CAAS,IAAI,KAAA,CAAc8Q,CAAI,EAAE,IAAA,CAAK,CAAC,CAAA,CAEzCK,CAAAA,CAAM,EACNxK,CAAAA,CAAY,KAAA,CAChB,SAASyK,CAAAA,EAAQ,CACf,GAAIzK,CAAAA,CAAW,OACfkK,CAAAA,CAAS,qBAAA,CAAsBzN,CAAI,CAAA,CACnC,IAAMiO,EAAa,IAAA,CAAK,KAAA,CAAMjO,CAAAA,CAAK,MAAA,CAAS0N,CAAI,CAAA,CAChDpT,CAAAA,CAAK,SAAA,CAAU,CAAA,CAAG,EAAG8S,CAAAA,CAAUC,CAAS,CAAA,CACxC/S,CAAAA,CAAK,SAAA,CAAY4T,EAAAA,CAAU,gBAAgB,CAAA,EAAK,iBAChD,IAAA,IAAStN,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI8M,CAAAA,CAAM9M,CAAAA,EAAAA,CAAK,CAC7B,IAAIuN,EAAO,CAAA,CACX,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIH,CAAAA,CAAYG,CAAAA,EAAAA,CAAK,CACnC,IAAMC,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CAAKrO,CAAAA,CAAKY,EAAIqN,CAAAA,CAAaG,CAAC,CAAA,EAAK,GAAA,EAAO,GAAG,CAAA,CACtDC,CAAAA,CAAIF,CAAAA,GAAMA,CAAAA,CAAOE,CAAAA,EACvB,CACA,IAAMxU,CAAAA,CAAS,KAAK,GAAA,CAAI,CAAA,CAAIsU,CAAAA,CAAO,GAAA,CAAO,GAAG,CAAA,CACvCrK,CAAAA,CAAMlH,CAAAA,CAAOgE,CAAC,CAAA,EAAK,CAAA,CACzBhE,CAAAA,CAAOgE,CAAC,CAAA,CAAI/G,CAAAA,CAASiK,CAAAA,CAAMjK,CAAAA,CAASiK,GAAOjK,CAAAA,CAASiK,CAAAA,EAAO,GAAA,CAC3D,IAAM0B,EAAI,IAAA,CAAK,GAAA,CAAIoI,CAAAA,CAAOhR,CAAAA,CAAOgE,CAAC,CAAA,CAAKyM,CAAS,CAAA,CAC1ChI,CAAAA,CAAIzE,CAAAA,EAAKiN,CAAAA,CAAOF,CAAAA,CAAAA,CAChBrI,CAAAA,CAAAA,CAAK+H,EAAY7H,CAAAA,EAAK,CAAA,CAC5B8I,EAAAA,CAAchU,CAAAA,CAAM+K,CAAAA,CAAGC,CAAAA,CAAGuI,CAAAA,CAAMrI,CAAAA,CAAGsI,CAAM,CAAA,CACzCxT,CAAAA,CAAK,IAAA,GACP,CACAyT,CAAAA,CAAM,qBAAA,CAAsBC,CAAK,EACnC,CACA,OAAAD,CAAAA,CAAM,qBAAA,CAAsBC,CAAK,CAAA,CAE1B,IAAM,CACXzK,CAAAA,CAAY,KACZ,oBAAA,CAAqBwK,CAAG,CAAA,CACxB,GAAI,CACFP,CAAAA,CAAO,UAAA,GACT,MAAQ,CAER,CACKD,CAAAA,CAAS,KAAA,GAChB,CACF,CAAA,CAAG,CAACpT,CAAM,CAAC,CAAA,CAEJiL,GAAAA,CAAC,QAAA,CAAA,CAAO,GAAA,CAAK8H,CAAAA,CAAW,SAAA,CAAU,gBAAA,CAAiB,aAAA,CAAY,OAAO,CAC/E,CAIA,SAASoB,EAAAA,CACPhU,EACA+K,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA,EACM,CACN,IAAMsI,CAAAA,CAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGvI,CAAAA,CAAI,CAAA,CAAGC,EAAI,CAAC,CAAA,CACvClL,CAAAA,CAAI,SAAA,EAAU,CACd,IAAMiU,CAAAA,CAASjU,CAAAA,CAGf,GAAI,OAAOiU,CAAAA,CAAO,SAAA,EAAc,UAAA,CAAY,CAC1CA,CAAAA,CAAO,SAAA,CAAUlJ,CAAAA,CAAGC,EAAGC,CAAAA,CAAGC,CAAAA,CAAGsI,CAAM,CAAA,CACnC,MACF,CACAxT,CAAAA,CAAI,MAAA,CAAO+K,CAAAA,CAAIyI,EAAQxI,CAAC,CAAA,CACxBhL,CAAAA,CAAI,KAAA,CAAM+K,CAAAA,CAAIE,CAAAA,CAAGD,CAAAA,CAAGD,CAAAA,CAAIE,EAAGD,CAAAA,CAAIE,CAAAA,CAAGsI,CAAM,CAAA,CACxCxT,CAAAA,CAAI,KAAA,CAAM+K,CAAAA,CAAIE,CAAAA,CAAGD,EAAIE,CAAAA,CAAGH,CAAAA,CAAGC,CAAAA,CAAIE,CAAAA,CAAGsI,CAAM,CAAA,CACxCxT,CAAAA,CAAI,KAAA,CAAM+K,EAAGC,CAAAA,CAAIE,CAAAA,CAAGH,CAAAA,CAAGC,CAAAA,CAAGwI,CAAM,CAAA,CAChCxT,CAAAA,CAAI,KAAA,CAAM+K,CAAAA,CAAGC,EAAGD,CAAAA,CAAIE,CAAAA,CAAGD,CAAAA,CAAGwI,CAAM,CAAA,CAChCxT,CAAAA,CAAI,SAAA,GACN,CAIA,SAASkS,EAAAA,CAAa,CAAE,IAAA,CAAAlU,CAAAA,CAAM,UAAA,CAAAoJ,CAAW,CAAA,CAAuC,CAC9E,GAAM,CAACxK,CAAAA,CAAKsX,CAAM,CAAA,CAAIzL,QAAAA,CAAiB,EAAE,CAAA,CACzC,OAAAO,SAAAA,CAAU,IAAM,CACd,IAAMmL,EAAI,GAAA,CAAI,eAAA,CAAgBnW,CAAI,CAAA,CAClC,OAAAkW,CAAAA,CAAOC,CAAC,CAAA,CACD,IAAM,CACX,GAAA,CAAI,eAAA,CAAgBA,CAAC,EACvB,CACF,CAAA,CAAG,CAACnW,CAAI,CAAC,CAAA,CAEP6M,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,qBAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,OAAA,CAAA,CAAM,QAAA,CAAQ,IAAA,CAAC,OAAA,CAAQ,UAAA,CAAW,IAAKlO,CAAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,CAAA,CACxEiO,KAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAoB,QAAA,CAAA,CAAA,IAAA,CAAK,MAAMzD,CAAAA,CAAa,GAAI,CAAA,CAAE,GAAA,CAAA,CAAC,CAAA,CAAA,CACrE,CAEJ,CAEA,SAASwM,GAAUQ,CAAAA,CAAsB,CACvC,OAAI,OAAO,MAAA,CAAW,GAAA,CAAoB,EAAA,CACnC,gBAAA,CAAiB,SAAS,eAAe,CAAA,CAC7C,gBAAA,CAAiBA,CAAI,CAAA,CACrB,IAAA,EACL,CAEA,IAAMC,EAAAA,CACJ,2IAAA,CAEF,SAAS9E,EAAAA,CAAaF,EAAkC,CACtD,OAAO,KAAA,CAAM,IAAA,CACXA,EAAK,gBAAA,CAA8BgF,EAAkB,CACvD,CAAA,CAAE,MAAA,CAAQ1U,CAAAA,EAAO,CAACA,CAAAA,CAAG,aAAa,UAAU,CAAA,EAAKA,CAAAA,CAAG,YAAA,GAAiB,IAAI,CAC3E,CC1oCO,SAAS2U,EAAAA,EAA4B,CAC1C,GAAI,OAAO,QAAA,CAAa,GAAA,EAAe,OAAO,MAAA,CAAW,IACvD,OAAO,CAAA,CAET,IAAMrJ,CAAAA,CAAI,MAAA,CAAO,UAAA,CACXC,CAAAA,CAAI,MAAA,CAAO,YACjB,GAAID,CAAAA,GAAM,CAAA,EAAKC,CAAAA,GAAM,CAAA,CAAG,OAAO,CAAA,CAE/B,IAAMqJ,EAASrJ,CAAAA,CAAI,CAAA,CACbsJ,CAAAA,CAAU,CAAC,KAAK,KAAA,CAAMvJ,CAAAA,CAAI,EAAG,CAAA,CAAG,KAAK,KAAA,CAAMA,CAAAA,CAAI,EAAG,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAI,EAAG,CAAC,CAAA,CACxEwJ,CAAAA,CAAO,IAAI,GAAA,CACbC,EAAU,CAAA,CAEd,IAAA,IAAW3J,CAAAA,IAAKyJ,CAAAA,CAAS,CACvB,IAAMG,CAAAA,CAAQ,QAAA,CAAS,iBAAA,CAAkB5J,CAAAA,CAAGwJ,CAAM,CAAA,CAClD,IAAA,IAAW5U,KAAMgV,CAAAA,CAAO,CACtB,GAAIF,CAAAA,CAAK,IAAI9U,CAAE,CAAA,CAAG,SAClB8U,CAAAA,CAAK,IAAI9U,CAAE,CAAA,CACX,IAAMiV,CAAAA,CAAK,MAAA,CAAO,gBAAA,CAAiBjV,CAAE,CAAA,CACrC,GAAIiV,CAAAA,CAAG,QAAA,GAAa,OAAA,EAAWA,CAAAA,CAAG,QAAA,GAAa,QAAA,CAAU,SACzD,IAAM7K,EAAOpK,CAAAA,CAAG,qBAAA,EAAsB,CAElCoK,CAAAA,CAAK,MAAA,CAASmB,CAAAA,CAAI,CAAA,EAClBnB,CAAAA,CAAK,OAASmB,CAAAA,CAAI,CAAA,EAElBnB,CAAAA,CAAK,KAAA,CAAQkB,EAAI,EAAA,EACjBlB,CAAAA,CAAK,MAAA,CAAS2K,CAAAA,GAASA,EAAU3K,CAAAA,CAAK,MAAA,EAC5C,CACF,CACA,OAAO2K,CACT,CAoCO,SAASG,GACdC,CAAAA,CACAC,CAAAA,CACQ,CACR,GAAI,OAAO,QAAA,CAAa,GAAA,EAAe,OAAO,OAAW,GAAA,CACvD,OAAO,CAAA,CAET,IAAM9J,CAAAA,CAAI,MAAA,CAAO,UAAA,CACXC,CAAAA,CAAI,OAAO,WAAA,CACbwJ,CAAAA,CAAU,CAAA,CACd,IAAA,IAAW9O,KAAYkP,CAAAA,CAAW,CAChC,IAAIE,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAQ,QAAA,CAAS,gBAAA,CAAiBpP,CAAQ,EAC5C,CAAA,KAAQ,CACN,QACF,CACA,IAAA,IAAWqP,CAAAA,IAAQ,KAAA,CAAM,IAAA,CAAKD,CAAK,CAAA,CAAG,CACpC,IAAMjL,CAAAA,CAAOkL,CAAAA,CAAK,qBAAA,EAAsB,CACxC,GAAIlL,CAAAA,CAAK,MAAA,GAAW,CAAA,EAAKA,EAAK,KAAA,GAAU,CAAA,CAAG,SAC3C,IAAImL,EAAU,CAAA,CACd,OAAQH,CAAAA,EACN,KAAK,QAAA,CACH,GAAIhL,CAAAA,CAAK,MAAA,CAASmB,CAAAA,CAAI,CAAA,CAAG,MACzBgK,CAAAA,CAAU,KAAK,GAAA,CAAI,CAAA,CAAGhK,CAAAA,CAAInB,CAAAA,CAAK,GAAG,CAAA,CAClC,MACF,KAAK,KAAA,CACH,GAAIA,CAAAA,CAAK,GAAA,CAAM,CAAA,CAAG,MAClBmL,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGnL,EAAK,MAAM,CAAA,CACjC,MACF,KAAK,OACH,GAAIA,CAAAA,CAAK,IAAA,CAAO,CAAA,CAAG,MACnBmL,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGnL,CAAAA,CAAK,KAAK,CAAA,CAChC,MACF,KAAK,OAAA,CACH,GAAIA,CAAAA,CAAK,KAAA,CAAQkB,CAAAA,CAAI,CAAA,CAAG,MACxBiK,CAAAA,CAAU,KAAK,GAAA,CAAI,CAAA,CAAGjK,CAAAA,CAAIlB,CAAAA,CAAK,IAAI,CAAA,CACnC,KACJ,CACImL,EAAUR,CAAAA,GAASA,CAAAA,CAAUQ,CAAAA,EACnC,CACF,CACA,OAAOR,CACT,CC3FO,SAASS,GACd1Y,CAAAA,CACiB,CACjB,GAAM,CAAC2Y,CAAAA,CAAQC,CAAS,CAAA,CAAI5M,QAAAA,CAA0B,KAAO,CAC3D,MAAA,CAAQhM,CAAAA,CAAO,MAAA,CAAO,CAAA,CACtB,KAAA,CAAOA,CAAAA,CAAO,MAAA,CAAO,EACrB,IAAA,CAAMA,CAAAA,CAAO,MAAA,CAAO,CAAA,CACpB,GAAA,CAAKA,CAAAA,CAAO,MAAA,CAAO,CACrB,EAAE,CAAA,CAII6Y,CAAAA,CAAUlN,MAAAA,CAAOgN,CAAM,EAIvBG,CAAAA,CAAWC,EAAAA,CAAW/Y,CAAAA,CAAO,KAAK,EAClCgZ,CAAAA,CAAYhZ,CAAAA,CAAO,SAAA,CACnBiZ,CAAAA,CAAUjZ,CAAAA,CAAO,MAAA,CAAO,CAAA,CACxBkZ,CAAAA,CAAUlZ,EAAO,MAAA,CAAO,CAAA,CAE9B,OAAAuM,SAAAA,CAAU,IAAM,CACd,GAAI,OAAO,OAAW,GAAA,CAAa,OAEnC,IAAIyK,CAAAA,CAAM,CAAA,CACNxK,CAAAA,CAAY,KAAA,CAEV2M,CAAAA,CAAU,IAAM,CAEpB,GADAnC,CAAAA,CAAM,CAAA,CACFxK,EAAW,OAEf,IAAM8L,CAAAA,CAAOU,CAAAA,CAAU,CAAC,CAAA,GAAM,GAAA,CAAM,QAAA,CAAW,KAAA,CACzCI,CAAAA,CAAQJ,CAAAA,CAAU,CAAC,CAAA,GAAM,IAAM,OAAA,CAAU,MAAA,CAE3CK,CAAAA,CAAS,CAAA,CACTC,EAAS,CAAA,CACTtZ,CAAAA,CAAO,KAAA,GAAU,MAAA,EAAUsY,IAAS,QAAA,CACtCe,CAAAA,CAASxB,EAAAA,EAAkB,CAClB,KAAA,CAAM,OAAA,CAAQ7X,CAAAA,CAAO,KAAK,IACnCqZ,CAAAA,CAASjB,EAAAA,CAA4BpY,CAAAA,CAAO,KAAA,CAAOsY,CAAI,CAAA,CACvDgB,CAAAA,CAASlB,EAAAA,CAA4BpY,CAAAA,CAAO,MAAOoZ,CAAK,CAAA,CAAA,CAG1D,IAAMpV,CAAAA,CAAwB,CAC5B,MAAA,CAAQsU,CAAAA,GAAS,QAAA,CAAWY,EAAUG,CAAAA,CAAS,CAAA,CAC/C,GAAA,CAAKf,CAAAA,GAAS,KAAA,CAAQY,CAAAA,CAAUG,CAAAA,CAAS,CAAA,CACzC,MAAOD,CAAAA,GAAU,OAAA,CAAUH,CAAAA,CAAUK,CAAAA,CAAS,CAAA,CAC9C,IAAA,CAAMF,CAAAA,GAAU,MAAA,CAASH,EAAUK,CAAAA,CAAS,CAC9C,CAAA,CACMjQ,CAAAA,CAAOwP,EAAQ,OAAA,CAAA,CAEnB7U,CAAAA,CAAK,MAAA,GAAWqF,CAAAA,CAAK,QACrBrF,CAAAA,CAAK,GAAA,GAAQqF,CAAAA,CAAK,GAAA,EAClBrF,CAAAA,CAAK,KAAA,GAAUqF,CAAAA,CAAK,KAAA,EACpBrF,EAAK,IAAA,GAASqF,CAAAA,CAAK,IAAA,IAEnBwP,CAAAA,CAAQ,OAAA,CAAU7U,CAAAA,CAClB4U,CAAAA,CAAU5U,CAAI,GAElB,CAAA,CAEMuV,CAAAA,CAAW,IAAM,CACjBvC,CAAAA,GACJA,CAAAA,CAAM,MAAA,CAAO,qBAAA,CAAsBmC,CAAO,CAAA,EAC5C,CAAA,CAEAI,CAAAA,EAAS,CAET,IAAMC,CAAAA,CACJ,OAAO,cAAA,CAAmB,GAAA,CACtB,IAAI,cAAA,CAAeD,CAAQ,CAAA,CAC3B,IAAA,CACNC,CAAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,eAAe,EAEpC,IAAMC,CAAAA,CACJ,OAAO,gBAAA,CAAqB,GAAA,CACxB,IAAI,gBAAA,CAAiBF,CAAQ,EAC7B,IAAA,CACNE,CAAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAM,CACzB,SAAA,CAAW,IAAA,CACX,QAAS,IAAA,CACT,UAAA,CAAY,IAAA,CACZ,eAAA,CAAiB,CAAC,OAAA,CAAS,OAAA,CAAS,QAAQ,CAC9C,CAAC,CAAA,CAED,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAUF,CAAQ,CAAA,CAC1C,IAAMG,CAAAA,CAAK,OAAO,cAAA,CAClB,OAAAA,CAAAA,EAAI,gBAAA,CAAiB,QAAA,CAAUH,CAAQ,CAAA,CACvCG,CAAAA,EAAI,iBAAiB,QAAA,CAAUH,CAAQ,CAAA,CAEhC,IAAM,CACX/M,CAAAA,CAAY,IAAA,CACRwK,CAAAA,EAAK,OAAO,oBAAA,CAAqBA,CAAG,CAAA,CACxCwC,CAAAA,EAAI,YAAW,CACfC,CAAAA,EAAI,UAAA,EAAW,CACf,OAAO,mBAAA,CAAoB,QAAA,CAAUF,CAAQ,CAAA,CAC7CG,CAAAA,EAAI,mBAAA,CAAoB,QAAA,CAAUH,CAAQ,EAC1CG,CAAAA,EAAI,mBAAA,CAAoB,QAAA,CAAUH,CAAQ,EAC5C,CAGF,CAAA,CAAG,CAACP,EAAWC,CAAAA,CAASC,CAAAA,CAASJ,CAAQ,CAAC,CAAA,CAEnCH,CACT,CAEA,SAASI,GAAWY,CAAAA,CAA0C,CAC5D,OAAIA,CAAAA,GAAU,MAAc,OAAA,CACxBA,CAAAA,GAAU,MAAA,CAAe,MAAA,CACtBA,EAAM,IAAA,CAAK,GAAG,CACvB,CCjIO,SAASC,EAAAA,CAAoBC,CAAAA,CAA2B,CAC7D,GAAM,CAACC,CAAAA,CAAMC,CAAO,CAAA,CAAI/N,QAAAA,CAAS,KAAK,CAAA,CAEtC,OAAAO,SAAAA,CAAU,IAAM,CACd,GAAI,CAACsN,CAAAA,CAAS,CACZE,CAAAA,CAAQ,KAAK,CAAA,CACb,MACF,CACA,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OACnC,IAAML,CAAAA,CAAK,MAAA,CAAO,cAAA,CAElB,GADI,CAACA,CAAAA,EAEH,OAAO,MAAA,CAAO,UAAA,EAAe,UAAA,EAC7B,CAAC,MAAA,CAAO,UAAA,CAAW,mBAAmB,CAAA,CAAE,OAAA,CAExC,OAGF,IAAMM,CAAAA,CAAqB,GAAA,CACvBhD,CAAAA,CAAM,CAAA,CACJiD,EAAQ,IAAM,CAClBjD,CAAAA,CAAM,CAAA,CACN,IAAMkD,CAAAA,CAAS,MAAA,CAAO,WAAA,CAAcR,CAAAA,CAAG,OACvCK,CAAAA,CAAQG,CAAAA,CAASF,CAAkB,EACrC,CAAA,CACMT,CAAAA,CAAW,IAAM,CACjBvC,IACJA,CAAAA,CAAM,MAAA,CAAO,qBAAA,CAAsBiD,CAAK,GAC1C,CAAA,CAEA,OAAAV,CAAAA,EAAS,CACTG,EAAG,gBAAA,CAAiB,QAAA,CAAUH,CAAQ,CAAA,CACtCG,CAAAA,CAAG,gBAAA,CAAiB,QAAA,CAAUH,CAAQ,EAC/B,IAAM,CACPvC,CAAAA,EAAK,MAAA,CAAO,qBAAqBA,CAAG,CAAA,CACxC0C,CAAAA,CAAG,mBAAA,CAAoB,SAAUH,CAAQ,CAAA,CACzCG,CAAAA,CAAG,mBAAA,CAAoB,QAAA,CAAUH,CAAQ,EAC3C,CACF,EAAG,CAACM,CAAO,CAAC,CAAA,CAELC,CACT,CC/BO,SAASK,EAAAA,CAAgB,CAC9B,MAAA,CAAAna,CAAAA,CACA,aAAAoa,CAAAA,CACA,MAAA,CAAAhR,CAAAA,CACA,aAAA,CAAAsE,EACA,OAAA,CAAAkI,CACF,CAAA,CAAyB,CACvB,GAAM,CAAC9S,CAAAA,CAAQuX,CAAS,CAAA,CAAIrO,QAAAA,CAA6B,IAAI,CAAA,CACvDsO,CAAAA,CAAY3O,OAA0B,IAAI,CAAA,CAC1CgN,CAAAA,CAASD,EAAAA,CAAmB1Y,CAAM,CAAA,CAClCua,CAAAA,CAAeX,EAAAA,CAAoB5Z,EAAO,cAAc,CAAA,CAS9D,GAPAuM,SAAAA,CAAU,IAAM,CACV,OAAO,QAAA,CAAa,KACxB8N,CAAAA,CAAUD,CAAAA,EAAgB,QAAA,CAAS,IAAI,EACzC,CAAA,CAAG,CAACA,CAAY,CAAC,EAEjBI,EAAAA,CAAoBF,CAAAA,CAAW,CAAClR,CAAAA,EAAU,CAACmR,CAAY,CAAA,CAEnD,CAACzX,EAAQ,OAAO,IAAA,CAEpB,IAAMkW,CAAAA,CAAYhZ,CAAAA,CAAO,SAAA,CACnBya,CAAAA,CAAQzB,CAAAA,CAAU,CAAC,CAAA,GAAM,GAAA,CAAM,QAAA,CAAW,KAAA,CAC1C0B,CAAAA,CAAQ1B,CAAAA,CAAU,CAAC,CAAA,GAAM,IAAM,OAAA,CAAU,MAAA,CAEzC2B,CAAAA,CAAMF,CAAAA,GAAU,SAAW9B,CAAAA,CAAO,MAAA,CAASA,CAAAA,CAAO,GAAA,CAClDiC,EAAMF,CAAAA,GAAU,OAAA,CAAU/B,CAAAA,CAAO,KAAA,CAAQA,CAAAA,CAAO,IAAA,CAEhDkC,CAAAA,CAA6B,CACjC,SAAU,OAAA,CACV,CAACJ,CAAK,EAAGza,EAAO,QAAA,CACZ,CAAA,KAAA,EAAQ2a,CAAG,CAAA,yBAAA,EAA4BF,CAAK,CAAA,OAAA,CAAA,CAC5C,CAAA,EAAGE,CAAG,CAAA,EAAA,CAAA,CACV,CAACD,CAAK,EAAG1a,CAAAA,CAAO,SACZ,CAAA,KAAA,EAAQ4a,CAAG,CAAA,yBAAA,EAA4BF,CAAK,UAC5C,CAAA,EAAGE,CAAG,CAAA,EAAA,CAAA,CACV,MAAA,CAAQ5a,EAAO,MAAA,CACf,OAAA,CAASoJ,CAAAA,EAAUmR,CAAAA,CAAe,CAAA,CAAI,CAAA,CACtC,aAAA,CAAenR,CAAAA,EAAUmR,EAAe,MAAA,CAAS,MAAA,CACjD,UAAA,CAAY,oBACd,CAAA,CAEA,OAAOO,YAAAA,CACL1M,IAAAA,CAAC,UACC,GAAA,CAAKkM,CAAAA,CACL,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,gDAAA,CACV,KAAA,CAAOO,CAAAA,CACP,aAAY7a,CAAAA,CAAO,KAAA,CACnB,aAAA,CAAaoJ,CAAAA,EAAUmR,EAAe,IAAA,CAAO,MAAA,CAC7C,QAAA,CAAUnR,CAAAA,EAAUmR,EAAe,EAAA,CAAK,CAAA,CACxC,aAAA,CAAgBvR,CAAAA,EAAU0E,CAAAA,GAAgB1E,CAAAA,CAAM,WAAW,CAAA,CAC3D,QAAUA,CAAAA,EAAU4M,CAAAA,CAAQ5M,CAAAA,CAAM,WAAW,CAAA,CAC7C,oBAAA,CAAmB,EAAA,CACnB,2BAAA,CAA0B,OAEzB,QAAA,CAAA,CAAAhJ,CAAAA,CAAO,IAAA,CACRqO,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAArO,CAAAA,CAAO,KAAA,CAAM,GACtB,CAAA,CACA8C,CACF,CACF,CAMA,SAAS0X,EAAAA,CACP/O,CAAAA,CACAsH,CAAAA,CACA,CACA,IAAMgI,CAAAA,CAAYpP,MAAAA,CAAO,KAAK,CAAA,CAE9BY,SAAAA,CAAU,IAAM,CAId,GAHI,QAAQ,GAAA,CAAI,QAAA,GAAa,YAAA,EACzB,CAACwG,CAAAA,EACDgI,CAAAA,CAAU,OAAA,EACV,OAAO,OAAW,GAAA,CAAa,OAEnC,IAAMC,CAAAA,CAAI,MAAA,CAAO,UAAA,CAAW,IAAM,CAChC,IAAM9X,CAAAA,CAAKuI,CAAAA,CAAI,OAAA,CACf,GAAI,CAACvI,CAAAA,CAAI,OACT,IAAMoK,CAAAA,CAAOpK,EAAG,qBAAA,EAAsB,CACtC,GAAIoK,CAAAA,CAAK,KAAA,GAAU,CAAA,EAAKA,CAAAA,CAAK,MAAA,GAAW,EAAG,OAC3C,IAAM2N,CAAAA,CAAK3N,CAAAA,CAAK,KAAOA,CAAAA,CAAK,KAAA,CAAQ,CAAA,CAC9B4N,CAAAA,CAAK5N,EAAK,GAAA,CAAMA,CAAAA,CAAK,MAAA,CAAS,CAAA,CAC9B4K,CAAAA,CAAQ,QAAA,CAAS,iBAAA,CAAkB+C,CAAAA,CAAIC,CAAE,CAAA,CACzCC,CAAAA,CAAOC,EAAAA,CAAO,MAAA,CAAO,iBAAiBlY,CAAE,CAAA,CAAE,MAAM,CAAA,CACtD,QAAWmY,CAAAA,IAAanD,CAAAA,CAAO,CAC7B,GAAImD,CAAAA,GAAcnY,CAAAA,EAAMA,CAAAA,CAAG,QAAA,CAASmY,CAAS,CAAA,CAAG,SAEhD,GADWD,EAAAA,CAAO,MAAA,CAAO,gBAAA,CAAiBC,CAAS,CAAA,CAAE,MAAM,CAAA,CAClDF,CAAAA,CAAM,CACbJ,CAAAA,CAAU,OAAA,CAAU,IAAA,CAEpB,OAAA,CAAQ,IAAA,CAAK,iCAAkCM,CAAS,CAAA,CACxD,KACF,CACF,CACF,CAAA,CAAG,GAAG,CAAA,CACN,OAAO,IAAM,MAAA,CAAO,YAAA,CAAaL,CAAC,CACpC,CAAA,CAAG,CAACjI,CAAAA,CAAQtH,CAAG,CAAC,EAClB,CAEA,SAAS2P,EAAAA,CAAOE,CAAAA,CAAmB,CACjC,IAAMC,CAAAA,CAAI,SAASD,CAAAA,CAAG,EAAE,CAAA,CACxB,OAAO,MAAA,CAAO,KAAA,CAAMC,CAAC,CAAA,CAAI,EAAIA,CAC/B,CC9GO,SAASC,EAAAA,CAAc,CAC5B,KAAA,CAAAC,CAAAA,CACA,KAAA,CAAA9F,CAAAA,CACA,IAAA,CAAA+F,CAAAA,CACA,cAAAhO,CAAAA,CACA,OAAA,CAAAkI,CACF,CAAA,CAAuB,CACrB,GAAM,CAAC9S,CAAAA,CAAQuX,CAAS,CAAA,CAAIrO,QAAAA,CAA6B,IAAI,CAAA,CAS7D,OAPAO,SAAAA,CAAU,IAAM,CACd,GAAI,OAAO,QAAA,CAAa,GAAA,CAAa,OACrC,IAAMrJ,CAAAA,CACJuY,CAAAA,YAAiB,WAAA,CAAcA,CAAAA,CAASA,EAAM,OAAA,EAAW,IAAA,CAC3DpB,CAAAA,CAAUnX,CAAE,EACd,CAAA,CAAG,CAACuY,CAAK,CAAC,CAAA,CAEL3Y,CAAAA,CAEEgY,YAAAA,CACL1M,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,8BACV,aAAA,CAAgBpF,CAAAA,EAAU0E,CAAAA,GAAgB1E,CAAAA,CAAM,WAAW,CAAA,CAC3D,OAAA,CAAUA,CAAAA,EAAU4M,CAAAA,CAAQ5M,EAAM,WAAW,CAAA,CAC7C,YAAA,CAAY2M,CAAAA,CACZ,oBAAA,CAAmB,EAAA,CACnB,2BAAA,CAA0B,MAAA,CAEzB,UAAA+F,CAAAA,CACDrN,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAsH,CAAAA,CAAM,CAAA,CAAA,CACf,CAAA,CACA7S,CACF,EAhBoB,IAiBtB,CCxBO,SAAS6Y,EAAAA,CAAa,CAC3B,MAAA,CAAA3b,CAAAA,CACA,YAAA,CAAAoa,CAAAA,CACA,MAAA,CAAAhR,EACA,aAAA,CAAewS,CAAAA,CACf,OAAA,CAAAhG,CACF,CAAA,CAAsB,CACpB,GAAM,CAAC9S,EAAQuX,CAAS,CAAA,CAAIrO,QAAAA,CAA6B,IAAI,CAAA,CACvD,CAAC6P,CAAAA,CAAUC,CAAW,EAAI9P,QAAAA,CAAS,KAAK,CAAA,CACxC+P,CAAAA,CAAepQ,OAAwC,IAAI,CAAA,CAOjE,GALAY,SAAAA,CAAU,IAAM,CACV,OAAO,QAAA,CAAa,GAAA,EACxB8N,CAAAA,CAAUD,CAAAA,EAAgB,QAAA,CAAS,IAAI,EACzC,CAAA,CAAG,CAACA,CAAY,CAAC,CAAA,CAEb,CAACtX,CAAAA,CAAQ,OAAO,KAEpB,IAAMkZ,CAAAA,CAAY,CAAA,wBAAA,EAA2Bhc,CAAAA,CAAO,IAAI,CAAA,EACtD6b,CAAAA,CAAW,uBAAA,CAA0B,EACvC,CAAA,CAAA,CAEA,SAASnO,CAAAA,CAAchN,CAAAA,CAA0C,CAC/Dkb,CAAAA,GAAwBlb,CAAAA,CAAE,WAAW,CAAA,CACrCqb,EAAa,OAAA,CAAU,CAAE,CAAA,CAAGrb,CAAAA,CAAE,OAAA,CAAS,CAAA,CAAGA,CAAAA,CAAE,OAAQ,EACpDob,CAAAA,CAAY,IAAI,CAAA,CAChBpb,CAAAA,CAAE,cAAc,iBAAA,CAAkBA,CAAAA,CAAE,SAAS,EAC/C,CACA,SAASkN,CAAAA,CAAclN,CAAAA,CAA0C,CAC/D,IAAM4D,CAAAA,CAAQyX,CAAAA,CAAa,OAAA,CAC3B,GAAI,CAACzX,CAAAA,CAAO,OACZ,IAAM4J,EAAKxN,CAAAA,CAAE,OAAA,CAAU4D,CAAAA,CAAM,CAAA,CACvB6J,EAAKzN,CAAAA,CAAE,OAAA,CAAU4D,CAAAA,CAAM,CAAA,CAAA,CAE1BtE,CAAAA,CAAO,IAAA,GAAS,KAAA,EAASmO,CAAAA,CAAK,IAC9BnO,CAAAA,CAAO,IAAA,GAAS,QAAA,EAAYmO,CAAAA,CAAK,GAAA,EACjCnO,CAAAA,CAAO,IAAA,GAAS,OAAA,EAAWkO,EAAK,GAAA,EAChClO,CAAAA,CAAO,IAAA,GAAS,MAAA,EAAUkO,CAAAA,CAAK,EAAA,IAEhC6N,CAAAA,CAAa,OAAA,CAAU,KACvBnG,CAAAA,CAAQlV,CAAAA,CAAE,WAAW,CAAA,EAEzB,CACA,SAASuN,CAAAA,EAAc,CACrB8N,CAAAA,CAAa,QAAU,IAAA,CACvBD,CAAAA,CAAY,KAAK,EACnB,CACA,SAASG,CAAAA,EAAkB,CACzBF,EAAa,OAAA,CAAU,IAAA,CACvBD,CAAAA,CAAY,KAAK,EACnB,CAEA,OAAOhB,YAAAA,CACL1M,KAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAW4N,CAAAA,CACX,KAAA,CAAO,CACL,MAAA,CAAQhc,EAAO,MAAA,CACf,OAAA,CAASoJ,CAAAA,CAAS,CAAA,CAAI,EACtB,aAAA,CAAeA,CAAAA,CAAS,MAAA,CAAS,MACnC,EACA,YAAA,CAAYpJ,CAAAA,CAAO,KAAA,CACnB,aAAA,CAAaoJ,CAAAA,CAAS,IAAA,CAAO,MAAA,CAC7B,QAAA,CAAUA,EAAS,EAAA,CAAK,CAAA,CACxB,OAAA,CAAUJ,CAAAA,EAAU4M,CAAAA,CAAQ5M,CAAAA,CAAM,WAAW,CAAA,CAC7C,cAAe0E,CAAAA,CACf,aAAA,CAAeE,CAAAA,CACf,WAAA,CAAaK,CAAAA,CACb,eAAA,CAAiBgO,CAAAA,CACjB,YAAA,CAAc,IAAMH,CAAAA,CAAY,IAAI,CAAA,CACpC,YAAA,CAAc,IAAMA,CAAAA,CAAY,KAAK,CAAA,CACrC,oBAAA,CAAmB,GACnB,2BAAA,CAA0B,MAAA,CAE1B,QAAA,CAAA,CAAAzN,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAA,CAAqB,aAAA,CAAY,OAAO,CAAA,CACxDD,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAqB,QAAA,CAAA,CAAApO,CAAAA,CAAO,IAAA,CAAMA,CAAAA,CAAO,OAAM,CAAA,CAAA,CACjE,CAAA,CACA8C,CACF,CACF,CClEO,SAASoZ,EAAAA,CACdC,CAAAA,CACqB,CACrB,OAAO,CACL,IAAA,CAAM,OAAA,CACN,KAAMA,CAAAA,CAAI,IAAA,EAAQ,KAAA,CAClB,KAAA,CAAOA,EAAI,KAAA,EAAS,UAAA,CACpB,IAAA,CAAMA,CAAAA,CAAI,IAAA,CACV,MAAA,CAAQA,CAAAA,CAAI,MAAA,EAAU,UACxB,CACF,CA0CO,SAASC,EAAAA,CACdD,CAAAA,CACwB,CACxB,OAAO,CACL,KAAM,UAAA,CACN,SAAA,CAAWA,CAAAA,CAAI,SAAA,EAAa,IAAA,CAC5B,MAAA,CAAQ,CAAE,CAAA,CAAGA,EAAI,MAAA,EAAQ,CAAA,EAAK,EAAA,CAAI,CAAA,CAAGA,EAAI,MAAA,EAAQ,CAAA,EAAK,EAAG,CAAA,CACzD,SAAUA,CAAAA,CAAI,QAAA,EAAY,IAAA,CAC1B,KAAA,CACEA,CAAAA,CAAI,KAAA,GAAU,KAAA,CACV,KAAA,CACAA,EAAI,KAAA,EAAS,IAAA,CACX,MAAA,CACA,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAI,KAAK,CAAA,CACrBA,EAAI,KAAA,CACJ,CAACA,CAAAA,CAAI,KAAK,CAAA,CACpB,cAAA,CAAgBA,CAAAA,CAAI,cAAA,EAAkB,KACtC,MAAA,CAAQA,CAAAA,CAAI,MAAA,EAAU,UAAA,CACtB,MAAOA,CAAAA,CAAI,KAAA,EAAS,UAAA,CACpB,IAAA,CAAMA,EAAI,IACZ,CACF,CCxGA,IAAME,EAAAA,CAA6D,CACjE,YAAA,CAAc,YAAA,CACd,YAAA,CAAc,YAAA,CACd,iBAAA,CAAmB,SACnB,gBAAA,CAAkB,QACpB,CAAA,CAUO,SAASC,EAAAA,CAAcC,CAAAA,CAAqC,CACjE,IAAMC,EAAaC,KAAAA,EAAM,CAEzBlQ,SAAAA,CAAU,IAAM,CACd,GAAI,OAAO,QAAA,CAAa,GAAA,CAAa,OACrC,IAAMqG,CAAAA,CAAO,QAAA,CAAS,eAAA,CAChB8J,CAAAA,CAAO,CAAA,iBAAA,EAAoBC,EAAAA,CAAKH,CAAU,CAAC,CAAA,CAAA,CAC3CI,CAAAA,CAA0C,EAAC,CAEjD,GAAIL,CAAAA,GAAU,MAAA,EAAUA,CAAAA,EAAS,IAAA,CAE/B3J,EAAK,eAAA,CAAgB,kBAAkB,CAAA,CAAA,KAAA,GAC9B2J,CAAAA,GAAU,OAAA,EAAWA,CAAAA,GAAU,MAAA,CACxCK,CAAAA,CAAS,kBAAkB,CAAA,CAAIhK,CAAAA,CAAK,YAAA,CAAa,kBAAkB,EACnEA,CAAAA,CAAK,YAAA,CAAa,kBAAA,CAAoB2J,CAAK,OAE3C,IAAA,GAAW,CAACM,CAAAA,CAAQC,CAAG,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQT,EAAO,EAAG,CACnD,IAAM/E,CAAAA,CAAIiF,CAAAA,CAAMO,CAAyB,CAAA,CACrC,OAAOxF,CAAAA,EAAM,UAAYA,CAAAA,CAAE,MAAA,CAAS,CAAA,GACtCsF,CAAAA,CAASC,CAAM,CAAA,CAAIjK,CAAAA,CAAK,KAAA,CAAM,iBAAiBiK,CAAM,CAAA,EAAK,IAAA,CAC1DjK,CAAAA,CAAK,MAAM,WAAA,CAAYiK,CAAAA,CAAQvF,CAAC,CAAA,EAEpC,CAEF,OAAA1E,CAAAA,CAAK,YAAA,CAAa8J,CAAAA,CAAM,EAAE,CAAA,CAEnB,IAAM,CACX9J,EAAK,eAAA,CAAgB8J,CAAI,CAAA,CACzB,IAAA,GAAW,CAACK,CAAAA,CAAGzF,CAAC,CAAA,GAAK,OAAO,OAAA,CAAQsF,CAAQ,CAAA,CACtCG,CAAAA,CAAE,UAAA,CAAW,IAAI,CAAA,CACfzF,CAAAA,CAAG1E,EAAK,KAAA,CAAM,WAAA,CAAYmK,CAAAA,CAAGzF,CAAC,EAC7B1E,CAAAA,CAAK,KAAA,CAAM,cAAA,CAAemK,CAAC,EACvBzF,CAAAA,EAAK,IAAA,CACd1E,CAAAA,CAAK,eAAA,CAAgBmK,CAAC,CAAA,CAEtBnK,CAAAA,CAAK,YAAA,CAAamK,EAAGzF,CAAC,EAG5B,CACF,CAAA,CAAG,CAACiF,CAAAA,CAAOC,CAAU,CAAC,EACxB,CAEA,SAASG,EAAAA,CAAK7V,CAAAA,CAAmB,CAC/B,OAAOA,CAAAA,CAAE,OAAA,CAAQ,gBAAiB,EAAE,CACtC,CC5DA,IAAMkW,EAAAA,CAAa,MAAA,CAAO,GAAA,CAAI,uBAAuB,CAAA,CAC/CC,EAAAA,CAAa,sBAAA,CAWnB,SAASC,IAA2B,CAClC,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OACnC,IAAM1O,CAAAA,CAAI,OACV,GAAIA,CAAAA,CAAEwO,EAAU,CAAA,CAAG,OACnBxO,CAAAA,CAAEwO,EAAU,CAAA,CAAI,KAEhB,IAAMG,CAAAA,CAAW,IAAM,MAAA,CAAO,cAAc,IAAI,KAAA,CAAMF,EAAU,CAAC,EAE3DG,CAAAA,CAAW,OAAA,CAAQ,SAAA,CACzB,OAAA,CAAQ,SAAA,CAAY,SAAA,GAAa9X,CAAAA,CAAwC,CACvE,IAAM,CAAA,CAAI8X,CAAAA,CAAS,KAAA,CAAM,IAAA,CAAM9X,CAAI,CAAA,CACnC,OAAA6X,CAAAA,GACO,CACT,CAAA,CACA,IAAME,CAAAA,CAAc,OAAA,CAAQ,YAAA,CAC5B,OAAA,CAAQ,YAAA,CAAe,YAClB/X,CAAAA,CACH,CACA,IAAM,CAAA,CAAI+X,EAAY,KAAA,CAAM,IAAA,CAAM/X,CAAI,CAAA,CACtC,OAAA6X,CAAAA,EAAS,CACF,CACT,CAAA,CACA,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAYA,CAAQ,EAC9C,CAMO,SAASG,EAAAA,CACdC,CAAAA,CACS,CACT,GAAM,CAACnU,CAAAA,CAAQoU,CAAS,CAAA,CAAIxR,QAAAA,CAAS,KAAK,CAAA,CAE1C,OAAAO,SAAAA,CAAU,IAAM,CACd,GAAI,CAACgR,CAAAA,CAAW,CACdC,CAAAA,CAAU,KAAK,CAAA,CACf,MACF,CACA,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OACnCN,EAAAA,EAAmB,CAEnB,IAAMO,CAAAA,CAAW,IAAM,CACrB,GAAI,CACFD,CAAAA,CAAU,CAAC,CAACD,CAAAA,CAAU,CAAE,QAAA,CAAU,OAAO,QAAA,CAAS,QAAS,CAAC,CAAC,EAC/D,CAAA,KAAQ,CACNC,CAAAA,CAAU,KAAK,EACjB,CACF,CAAA,CACA,OAAAC,GAAS,CACT,MAAA,CAAO,gBAAA,CAAiBR,EAAAA,CAAYQ,CAAQ,CAAA,CAC5C,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAYA,CAAQ,CAAA,CACrC,IAAM,CACX,OAAO,mBAAA,CAAoBR,EAAAA,CAAYQ,CAAQ,CAAA,CAC/C,OAAO,mBAAA,CAAoB,UAAA,CAAYA,CAAQ,EACjD,CACF,CAAA,CAAG,CAACF,CAAS,CAAC,CAAA,CAEPnU,CACT,CCvEA,IAAMsU,EAAAA,CAAmB,CACvB,IAAA,CACA,WAAA,CACA,UACA,MAAA,CACA,MAAA,CACA,MAAA,CACA,WAAA,CACA,OAAA,CACA,SACF,CAAA,CAOO,SAASC,IAA0B,CACxC,GAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAI7R,QAAAA,CAAS,KAAK,EAE1C,OAAAO,SAAAA,CAAU,IAAM,CACd,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OACnC,IAAMiC,CAAAA,CAAI,MAAA,CACV,GAAIA,EAAE,kBAAA,CAAoB,CACxBqP,CAAAA,CAAU,IAAI,EACd,MACF,CACA,IAAMC,CAAAA,CAAKtP,CAAAA,CAAE,MAAA,CACb,GAAIsP,CAAAA,EAAMA,EAAG,eAAA,CAAiB,CAC5BD,CAAAA,CAAU,IAAI,CAAA,CACd,MACF,CACA,IAAMtU,EAAK,SAAA,CAAU,SAAA,EAAa,EAAA,CAC9BmU,EAAAA,CAAiB,IAAA,CAAM1C,CAAAA,EAAMzR,CAAAA,CAAG,QAAA,CAASyR,CAAC,CAAC,CAAA,EAC7C6C,CAAAA,CAAU,IAAI,EAElB,CAAA,CAAG,EAAE,CAAA,CAEED,CACT,CCrCA,IAAMG,GAAiB,kBAAA,CACjBC,EAAAA,CAAiB,IAAA,CAAU,GAAA,CA+B1B,SAASC,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACmB,CACnB,GAAM,CAACC,CAAAA,CAAOC,CAAQ,CAAA,CAAIrS,QAAAA,CAA4B,KAAO,CAC3D,QAAS,IAAA,CACT,OAAA,CAAS,IAAA,CACT,WAAA,CAAa,MACb,OAAA,CAAS,IACX,CAAA,CAAE,CAAA,CAEF,OAAAO,SAAAA,CAAU,IAAM,CACd,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OAEnC,IAAM+R,CAAAA,CAASC,EAAAA,CAAUL,CAAM,CAAA,CAC3BI,GACFD,CAAAA,CAAS,CACP,OAAA,CAASC,CAAAA,CAAO,QAChB,OAAA,CAASE,EAAAA,CAAeF,CAAAA,CAAO,OAAO,CAAA,CACtC,WAAA,CAAaA,CAAAA,CAAO,KAAA,CACpB,QAAS,KACX,CAAC,CAAA,CAGH,IAAMG,EAAa,IAAI,eAAA,CAIjBhU,CAAAA,CAAY,MAAA,CAAO,WAAW,IAAMgU,CAAAA,CAAW,KAAA,EAAM,CAAG,GAAI,CAAA,CAC5Dte,CAAAA,CAAM,CAAA,EAAGge,EAAO,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAC,CAAA,0BAAA,EAA6B,kBAAA,CAAmBD,CAAM,CAAC,GAC/F,OAAA,KAAA,CAAM/d,CAAAA,CAAK,CACT,MAAA,CAAQ,KAAA,CACR,IAAA,CAAM,MAAA,CACN,WAAA,CAAa,OACb,MAAA,CAAQse,CAAAA,CAAW,MACrB,CAAC,EACE,IAAA,CAAK,MAAOnY,CAAAA,EAAQ,CACnB,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQA,CAAAA,CAAI,MAAM,CAAA,CAAE,CAAA,CACjD,IAAMlG,CAAAA,CAAQ,MAAMkG,CAAAA,CAAI,IAAA,EAAK,CACvBoY,EAAUC,EAAAA,CAAave,CAAAA,CAAK,OAAO,CAAA,CACzC,GAAI,CAACse,CAAAA,CAAS,MAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA,CACzD,IAAME,EAAQC,EAAAA,CAAWze,CAAAA,CAAK,OAAO,CAAA,CACrC0e,GAAWZ,CAAAA,CAAQQ,CAAAA,CAASE,CAAK,CAAA,CACjCP,CAAAA,CAAS,CACP,OAAA,CAAAK,CAAAA,CACA,QAASF,EAAAA,CAAeE,CAAO,CAAA,CAC/B,WAAA,CAAaE,CAAAA,CACb,OAAA,CAAS,KACX,CAAC,EACH,CAAC,CAAA,CACA,KAAA,CAAM,IAAM,CAEXP,CAAAA,CAAUhV,CAAAA,EACRA,CAAAA,CAAK,QACD,CAAE,OAAA,CAAS,IAAA,CAAM,OAAA,CAAS,KAAM,WAAA,CAAa,KAAA,CAAO,OAAA,CAAS,KAAM,EACnEA,CACN,EACF,CAAC,CAAA,CACA,OAAA,CAAQ,IAAM,MAAA,CAAO,YAAA,CAAaoB,CAAS,CAAC,CAAA,CAExC,IAAM,CACX,OAAO,YAAA,CAAaA,CAAS,CAAA,CAC7BgU,CAAAA,CAAW,QACb,CACF,CAAA,CAAG,CAACP,CAAAA,CAAQC,CAAM,CAAC,CAAA,CAEZC,CACT,CAEA,SAASI,EAAAA,CAAexD,CAAAA,CAA0B,CAKhD,OAAOA,CAAAA,CAAE,IAAA,GAAS,UACpB,CAEA,IAAM+D,EAAAA,CAAqD,CACzD,IAAA,CACA,IAAA,CACA,IAAA,CACA,IACF,CAAA,CACMC,GAAoC,CAAC,KAAA,CAAO,OAAA,CAAS,QAAA,CAAU,MAAM,CAAA,CAOpE,SAASL,EAAAA,CAAaM,EAAmC,CAC9D,GAAI,CAACA,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,CAAU,OAAO,KAC5C,IAAMxd,CAAAA,CAAIwd,CAAAA,CAIV,GAAIxd,EAAE,OAAA,GAAY,KAAA,CAAO,OAAO,CAAE,KAAM,UAAW,CAAA,CAEnD,IAAMkU,CAAAA,CAAQ,OAAOlU,CAAAA,CAAE,KAAA,EAAU,QAAA,CAAWA,EAAE,KAAA,CAAQ,UAAA,CAEtD,OAAIA,CAAAA,CAAE,IAAA,GAAS,UAAA,CAGN,CAAE,IAAA,CAAM,WAAY,SAAA,CADzBsd,EAAAA,CAAiB,IAAA,CAAMpR,CAAAA,EAAMA,CAAAA,GAAMlM,CAAAA,CAAE,SAAS,CAAA,EAAK,KACf,KAAA,CAAAkU,CAAM,CAAA,CAE1ClU,CAAAA,CAAE,OAAS,OAAA,CAEN,CAAE,IAAA,CAAM,OAAA,CAAS,KADXud,EAAAA,CAAY,IAAA,CAAMte,CAAAA,EAAMA,CAAAA,GAAMe,CAAAA,CAAE,IAAI,CAAA,EAAK,KAAA,CACxB,MAAAkU,CAAM,CAAA,CAE/B,IACT,CAOO,SAASkJ,EAAAA,CAAWI,CAAAA,CAAuB,CAChD,OAAI,CAACA,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,CAAiB,KAAA,CACpCA,CAAAA,CAAgC,KAAA,GAAU,IACpD,CAEA,SAASV,EAAAA,CAAUL,CAAAA,CAAoC,CACrD,GAAI,CACF,IAAMe,CAAAA,CAAM,OAAO,YAAA,CAAa,OAAA,CAAQlB,EAAAA,CAAiBG,CAAM,CAAA,CAC/D,GAAI,CAACe,CAAAA,CAAK,OAAO,IAAA,CACjB,IAAM3d,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAM2d,CAAG,CAAA,CAC7B,GACE,OAAO3d,CAAAA,EAAQ,SAAA,EAAc,QAAA,EAC7B,IAAA,CAAK,GAAA,EAAI,CAAIA,CAAAA,CAAO,SAAA,CAAY0c,GAEhC,OAAO,IAAA,CAET,IAAMU,CAAAA,CAAUC,GAAard,CAAAA,CAAO,OAAO,CAAA,CAC3C,OAAOod,EACH,CAAE,SAAA,CAAWpd,CAAAA,CAAO,SAAA,CAAW,OAAA,CAAAod,CAAAA,CAAS,KAAA,CAAOpd,CAAAA,CAAO,QAAU,CAAA,CAAK,CAAA,CACrE,IACN,CAAA,KAAQ,CACN,OAAO,IACT,CACF,CAEA,SAASwd,EAAAA,CACPZ,CAAAA,CACAQ,CAAAA,CACAE,CAAAA,CACM,CACN,GAAI,CACF,OAAO,YAAA,CAAa,OAAA,CAClBb,EAAAA,CAAiBG,CAAAA,CACjB,KAAK,SAAA,CAAU,CAAE,SAAA,CAAW,IAAA,CAAK,KAAI,CAAG,OAAA,CAAAQ,CAAAA,CAAS,KAAA,CAAAE,CAAM,CAAC,CAC1D,EACF,MAAQ,CAER,CACF,CCtLO,SAASM,GAAejW,CAAAA,CAAwB,CACrD,GAAIA,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAC1B,OAAQA,EAA4B,IAAA,GAASkW,EAAAA,CAE/C,GAAI,OAAOlW,GAAS,QAAA,CAClB,GAAI,CACF,OAAQ,KAAK,KAAA,CAAMA,CAAI,CAAA,CAAyB,IAAA,GAASkW,EAC3D,CAAA,KAAQ,CACN,OAAO,MACT,CAEF,OAAO,MACT,CAuBO,SAASC,EAAAA,CACdlf,CAAAA,CAA8B,GACT,CACrB,IAAMmf,CAAAA,CAAYnf,CAAAA,CAAQ,SAAA,EAAa,EAAA,CACjCof,CAAAA,CAAapf,CAAAA,CAAQ,YAAc,CAAA,CACnCqf,CAAAA,CAAWrf,CAAAA,CAAQ,QAAA,EAAY,IAC/Bsf,CAAAA,CAAatf,CAAAA,CAAQ,UAAA,EAAc,EAAA,CAErC2N,EAA8D,IAAA,CAC9D4R,CAAAA,CAAiB,EAAC,CAEtB,OAAO,CACL,IAAA,CAAKnR,CAAAA,CAAGC,EAAG+M,CAAAA,CAAGvN,CAAAA,CAAK,CACjB,GAAI,CAACF,CAAAA,CACH,OAAAA,CAAAA,CAAO,CAAE,EAAAS,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,CAAA,CAAA+M,CAAAA,CAAG,CAAA,CAAGvN,CAAI,CAAA,CAClB,MAET,GAAIA,CAAAA,CAAMF,CAAAA,CAAK,CAAA,CAAI2R,EAAY,OAAO,MAAA,CACtC,IAAME,CAAAA,CACJ,KAAK,GAAA,CAAIpR,CAAAA,CAAIT,CAAAA,CAAK,CAAC,CAAA,CAAI,IAAA,CAAK,GAAA,CAAIU,CAAAA,CAAIV,EAAK,CAAC,CAAA,CAAI,IAAA,CAAK,GAAA,CAAIyN,CAAAA,CAAIzN,CAAAA,CAAK,CAAC,CAAA,CAEnE,OADAA,CAAAA,CAAO,CAAE,CAAA,CAAAS,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,CAAA,CAAA+M,CAAAA,CAAG,EAAGvN,CAAI,CAAA,CACrB2R,CAAAA,CAAQL,CAAAA,CAAkB,OAC9BI,CAAAA,CAAOA,CAAAA,CAAK,MAAA,CAAQzE,CAAAA,EAAMjN,EAAMiN,CAAAA,CAAIuE,CAAQ,CAAA,CAC5CE,CAAAA,CAAK,IAAA,CAAK1R,CAAG,CAAA,CACT0R,CAAAA,CAAK,QAAUH,CAAAA,EACjBG,CAAAA,CAAO,EAAC,CACD,IAAA,EAEF,KAAA,CACT,CACF,CACF,CAqBO,SAASE,EAAAA,CACd9F,CAAAA,CACA+F,CAAAA,CACA/P,CAAAA,CACM,CACNtD,SAAAA,CAAU,IAAM,CACd,GAAI,CAACsN,CAAAA,EAAW,OAAO,OAAW,GAAA,CAAa,OAE/C,IAAIgG,CAAAA,CAAW,EACTC,CAAAA,CAAc,IAAA,CAEpB,SAASC,CAAAA,EAAO,CACd,IAAMhS,CAAAA,CAAM,IAAA,CAAK,KAAI,CACjB8B,CAAAA,EAAU9B,CAAAA,CAAM8R,CAAAA,CAAWC,CAAAA,GAC/BD,CAAAA,CAAW9R,CAAAA,CACX6R,CAAAA,IACF,CAGA,IAAM7W,CAAAA,CAAaC,CAAAA,EAAwB,CACrCkW,EAAAA,CAAelW,CAAAA,CAAM,IAAI,GAAG+W,CAAAA,GAClC,CAAA,CACA,MAAA,CAAO,iBAAiB,SAAA,CAAWhX,CAAS,CAAA,CAE5C,QAAA,CAAS,iBAAiB,SAAA,CAAWA,CAA0B,CAAA,CAG/D,IAAMiX,CAAAA,CAAWZ,EAAAA,EAA0B,CACrCa,CAAAA,CAAYvf,GAAyB,CACzC,IAAMwf,CAAAA,CAAIxf,CAAAA,CAAE,8BAAgCA,CAAAA,CAAE,YAAA,CAC1C,CAACwf,CAAAA,EAAKA,EAAE,CAAA,EAAK,IAAA,EAAQA,CAAAA,CAAE,CAAA,EAAK,IAAA,EAAQA,CAAAA,CAAE,CAAA,EAAK,IAAA,EAC3CF,EAAS,IAAA,CAAKE,CAAAA,CAAE,CAAA,CAAGA,CAAAA,CAAE,EAAGA,CAAAA,CAAE,CAAA,CAAG,IAAA,CAAK,GAAA,EAAK,CAAA,EAAGH,CAAAA,GAChD,CAAA,CAIMI,CAAAA,CACJ,OAAO,MAAA,CAAO,iBAAA,CAAsB,KACpC,OACE,MAAA,CAAO,iBAAA,CACP,iBAAA,EAAsB,UAAA,CAC1B,OAAIA,CAAAA,EAAW,MAAA,CAAO,iBAAiB,cAAA,CAAgBF,CAAQ,CAAA,CAExD,IAAM,CACX,MAAA,CAAO,mBAAA,CAAoB,SAAA,CAAWlX,CAAS,CAAA,CAC/C,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAWA,CAA0B,CAAA,CAC9DoX,CAAAA,EAAW,MAAA,CAAO,mBAAA,CAAoB,eAAgBF,CAAQ,EACpE,CACF,CAAA,CAAG,CAACpG,CAAAA,CAAS+F,CAAAA,CAAS/P,CAAM,CAAC,EAC/B,CCpHA,IAAMjQ,EAAAA,CAAkB,8BAAA,CAgGjB,SAASwgB,EAAAA,CAAc,CAC5B,MAAA,CAAAlC,CAAAA,CACA,MAAA,CAAAC,EACA,IAAA,CAAApO,CAAAA,CACA,SAAA,CAAAnP,CAAAA,CACA,eAAAyf,CAAAA,CAAiB,IAAA,CACjB,OAAA,CAAA3B,CAAAA,CACA,OAAA4B,CAAAA,CACA,KAAA,CAAA/D,CAAAA,CACA,YAAA,CAAAnC,CAAAA,CACA,OAAA,CAAApT,CAAAA,CACA,WAAA,CAAAuZ,EACA,YAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CACF,EAAuB,CACrB,GAAM,CAAC9Q,CAAAA,CAAQ+Q,CAAS,CAAA,CAAI5U,QAAAA,CAAS,KAAK,EACpC,CAAC6U,CAAAA,CAAWC,CAAY,CAAA,CAAI9U,SAAS,KAAK,CAAA,CAC1C,CAACgE,CAAAA,CAAgB+Q,CAAiB,CAAA,CAAI/U,QAAAA,CAC1C,IACF,CAAA,CACM,CAACiE,CAAAA,CAAqB+Q,CAAsB,CAAA,CAChDhV,SAAuB,IAAI,CAAA,CACvB,CAACiV,CAAY,EAAIjV,QAAAA,CAAS,KAAK,CAAA,CAC/B,CAAClD,CAAK,CAAA,CAAIkD,QAAAA,CAAuB,IAAI,CAAA,CACrCkV,CAAAA,CAAavV,MAAAA,CAAO,KAAK,CAAA,CACzBwV,EAAqBxV,MAAAA,CAAO,KAAK,CAAA,CACjCyV,CAAAA,CAA2BzV,OAA6B,IAAI,CAAA,CAE5DiE,CAAAA,CAASyR,OAAAA,CACb,IAAM,IAAI/J,EAAAA,CAAY,CAAE,MAAA,CAAA4G,CAAAA,CAAQ,MAAA,CAAAC,CAAAA,CAAQ,IAAA,CAAApO,EAAM,SAAA,CAAAnP,CAAU,CAAC,CAAA,CACzD,CACEsd,CAAAA,CACAC,CAAAA,CACApO,CAAAA,EAAM,GACNA,CAAAA,EAAM,KAAA,CACNA,CAAAA,EAAM,IAAA,CACNnP,CAAAA,EAAW,MAAA,CACXA,CAAAA,EAAW,QAAA,CACXA,GAAW,SACb,CACF,CAAA,CAIA2L,SAAAA,CAAU,IAAM,CACd+U,EAAAA,CAAsB,CACpB,eAAA,CAAA,CAAkBnD,GAAUve,EAAAA,EAAiB,OAAA,CAAQ,KAAA,CAAO,EAAE,CAChE,CAAC,EACH,CAAA,CAAG,CAACue,CAAM,CAAC,CAAA,CAQX,IAAMoD,CAAAA,CAAkB5V,MAAAA,CAAO6U,CAAY,CAAA,CAC3Ce,EAAgB,OAAA,CAAUf,CAAAA,CAK1BjU,SAAAA,CAAU,IAAM,CACd,GAAI,EAAA,OAAO,QAAA,CAAa,KACxB,OAAIsD,CAAAA,CACF,QAAA,CAAS,IAAA,CAAK,aAAa,iBAAA,CAAmB,MAAM,CAAA,CAEpD,QAAA,CAAS,KAAK,eAAA,CAAgB,iBAAiB,CAAA,CAE1C,IAAM,CACX,QAAA,CAAS,IAAA,CAAK,eAAA,CAAgB,iBAAiB,EACjD,CACF,CAAA,CAAG,CAACA,CAAM,CAAC,CAAA,CAKX,IAAM2R,EAAgB7V,MAAAA,CAAuB,IAAI,CAAA,CACjDY,SAAAA,CAAU,IAAM,CACd,GAAIiV,CAAAA,CAAc,UAAY3R,CAAAA,CAAQ,OACtC,IAAMxG,CAAAA,CAAOmY,EAAc,OAAA,CAC3BA,CAAAA,CAAc,OAAA,CAAU3R,CAAAA,CACpBxG,IAAS,IAAA,EACbkY,CAAAA,CAAgB,OAAA,GAAU1R,CAAM,EAClC,CAAA,CAAG,CAACA,CAAM,CAAC,CAAA,CAGX,IAAM4R,CAAAA,CAAgB9V,MAAAA,CAAO8U,CAAU,CAAA,CACvCgB,CAAAA,CAAc,OAAA,CAAUhB,CAAAA,CACxB,IAAMiB,EAAAA,CAAuB/V,MAAAA,CAAO+U,CAAiB,CAAA,CACrDgB,EAAAA,CAAqB,OAAA,CAAUhB,CAAAA,CAE/B,IAAMiB,EAAqBC,WAAAA,CAAa5Y,CAAAA,EAAiB,CACvDmY,CAAAA,CAAmB,QAAU,IAAA,CAC7BC,CAAAA,CAAyB,OAAA,CAAU,OAAA,CAAQ,SAAQ,CAChD,IAAA,CAAK,IAAMK,CAAAA,CAAc,OAAA,GAAUzY,CAAK,CAAC,CAAA,CACzC,KAAK,IAAM0Y,EAAAA,CAAqB,OAAA,GAAU1Y,CAAK,CAAC,CAAA,CAChD,IAAA,CAAK,IAAG,EAAY,EACzB,CAAA,CAAG,EAAE,CAAA,CAEC8Q,CAAAA,CAAO8H,WAAAA,CACV5Y,CAAAA,EAAkB,CACbkY,CAAAA,CAAW,OAAA,EAAWrR,CAAAA,GAC1BqR,CAAAA,CAAW,QAAU,IAAA,CACrBJ,CAAAA,CAAa,IAAI,CAAA,CACjBC,EAAkB,IAAI,CAAA,CACtBC,CAAAA,CAAuB,IAAI,CAAA,CAAA,CAErB,SAAY,CAChB,GAAI,CAQF,GAPIG,CAAAA,CAAmB,OAAA,CACrB,MAAMC,CAAAA,CAAyB,OAAA,EAE/B,MAAMK,CAAAA,CAAc,UAAUzY,CAAK,CAAA,CACnC,MAAM0Y,EAAAA,CAAqB,OAAA,GAAU1Y,CAAK,CAAA,CAAA,CAGxChC,CAAAA,EAAS,OAAS,QAAA,CACpB+Z,CAAAA,CAAkB,IAAI,CAAA,CACtBC,EAAuB,IAAI,CAAA,CAAA,KACtB,CACL,IAAM1e,EAAS,MAAMiR,EAAAA,CAAc,CACjC,GAAGvM,CAAAA,CACH,IAAA,CAAMA,CAAAA,EAAS,IAAA,EAAQ,OACvB,MAAA,CAAQA,CAAAA,EAAS,MAAA,EAAU,QAAA,CAAS,eACtC,CAAC,CAAA,CACD+Z,CAAAA,CAAkBze,CAAM,EAC1B,CACF,CAAA,MAAS5B,CAAAA,CAAG,CACVsgB,CAAAA,CACEtgB,CAAAA,YAAa,KAAA,CAAQA,EAAI,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAC,CAAC,CAC9C,EACF,CAAA,OAAE,CACAygB,EAAmB,OAAA,CAAU,KAAA,CAC7BC,CAAAA,CAAyB,OAAA,CAAU,IAAA,CACnCF,CAAAA,CAAW,OAAA,CAAU,KAAA,CACrBJ,EAAa,KAAK,CAAA,CAClBF,CAAAA,CAAU,IAAI,EAChB,CACF,CAAA,GAAG,EACL,CAAA,CACA,CAAC5Z,CAAAA,CAAS6I,CAAM,CAClB,CAAA,CACMgS,CAAAA,CAAQD,WAAAA,CAAY,IAAMhB,CAAAA,CAAU,KAAK,CAAA,CAAG,EAAE,CAAA,CAC9CrM,EAASqN,WAAAA,CAAYhS,CAAAA,CAAO,MAAA,CAAO,IAAA,CAAKA,CAAM,CAAA,CAAG,CAACA,CAAM,CAAC,CAAA,CAEzDkS,EAAAA,CAAgBnE,EAAAA,EAAe,CAC/BoE,GAAczE,EAAAA,CAAUgD,CAAM,CAAA,CACpChE,EAAAA,CAAcC,CAAK,CAAA,CAKnB,IAAMyF,CAAAA,CAAS/D,GACbS,CAAAA,CAAU,EAAA,CAAKR,CAAAA,CACfC,CAAAA,EAAUve,EACZ,CAAA,CAIMqiB,EAAAA,CAAiB1B,CAAAA,EAAeyB,EAAO,WAAA,CAC7CrC,EAAAA,CAAesC,EAAAA,CAAgBnI,CAAAA,CAAMjK,CAAM,CAAA,CAE3C,IAAMjK,CAAAA,CAAQyb,OAAAA,CACZ,KAAO,CACL,MAAA,CAAAzR,CAAAA,CACA,IAAA,CAAAG,CAAAA,CACA,MAAA,CAAAF,CAAAA,CACA,YAAA,CAAAoR,EACA,KAAA,CAAAnY,CAAAA,CACA,IAAA,CAAAgR,CAAAA,CACA,KAAA,CAAA+H,CAAAA,CACA,WAAA,CAAa/H,CAAAA,CACb,aAAc+H,CAAAA,CACd,MAAA,CAAAtN,CAAAA,CACA,aAAA,CAAAuN,EAAAA,CACA,OAAA,CAAA9a,CAAAA,CACA,cAAA,CAAAgJ,EACA,mBAAA,CAAAC,CAAAA,CACA,SAAA,CAAA4Q,CACF,GACA,CACEjR,CAAAA,CACAG,CAAAA,CACAF,CAAAA,CACAoR,EACAnY,CAAAA,CACAgR,CAAAA,CACA+H,CAAAA,CACAtN,CAAAA,CACAuN,EAAAA,CACA9a,CAAAA,CACAgJ,CAAAA,CACAC,CAAAA,CACA4Q,CACF,CACF,CAAA,CAEMqB,CAAAA,CAAmBC,EAAAA,CAAwB,CAC/C,QAAA,CAAUzD,CAAAA,CACV,MAAA,CAAQsD,EAAO,OAAA,CACf,aAAA,CAAeA,CAAAA,CAAO,OAAA,CACtB,cAAA,CAAA3B,CACF,CAAC,CAAA,CAED,OACEjS,IAAAA,CAACrD,EAAAA,CAAa,QAAA,CAAb,CAAsB,MAAOnF,CAAAA,CAC3B,QAAA,CAAA,CAAA+a,CAAAA,CACAuB,CAAAA,EAAkB,OAAS,UAAA,CAC1B7T,GAAAA,CAAC8L,EAAAA,CAAA,CACC,MAAA,CAAQiC,EAAAA,CAAsB8F,CAAgB,CAAA,CAC9C,aAAc9H,CAAAA,CACd,MAAA,CAAQ2H,EAAAA,EAAelB,CAAAA,CACvB,cAAec,CAAAA,CACf,OAAA,CAAU3Y,CAAAA,EAAU8Q,CAAAA,CAAK9Q,CAAK,CAAA,CAChC,CAAA,CACE,IAAA,CACHkZ,CAAAA,EAAkB,IAAA,GAAS,OAAA,CAC1B7T,GAAAA,CAACsN,EAAAA,CAAA,CACC,MAAA,CAAQO,EAAAA,CAAmBgG,CAAgB,CAAA,CAC3C,aAAc9H,CAAAA,CACd,MAAA,CAAQ2H,EAAAA,EAAelB,CAAAA,CACvB,cAAec,CAAAA,CACf,OAAA,CAAU3Y,CAAAA,EAAU8Q,CAAAA,CAAK9Q,CAAK,CAAA,CAChC,CAAA,CACE,IAAA,CACHkZ,GAAkB,IAAA,GAAS,QAAA,CAC1B7T,GAAAA,CAACmN,EAAAA,CAAA,CACC,KAAA,CAAO0G,CAAAA,CAAiB,KAAA,CACxB,MAAOA,CAAAA,CAAiB,KAAA,EAAS,UAAA,CACjC,IAAA,CAAMA,CAAAA,CAAiB,IAAA,CACvB,aAAA,CAAeP,CAAAA,CACf,QAAU3Y,CAAAA,EAAU8Q,CAAAA,CAAK9Q,CAAK,CAAA,CAChC,EACE,IAAA,CACJqF,GAAAA,CAACsB,EAAAA,CAAA,EAAa,GAChB,CAEJ,CAYA,SAASwS,EAAAA,CAAwB7c,CAAAA,CAKT,CACtB,OAAIA,CAAAA,CAAK,SAAiBA,CAAAA,CAAK,QAAA,CAC3BA,CAAAA,CAAK,cAAA,GAAmB,KAAA,CAAc,CAAE,IAAA,CAAM,UAAW,EACzDA,CAAAA,CAAK,MAAA,CAAeA,CAAAA,CAAK,MAAA,CACzBA,CAAAA,CAAK,aAAA,CAAsB,IAAA,CACxB,CAAE,KAAM,UAAW,CAC5B,CC1XO,SAAS8c,EAAAA,CAAe,CAC7B,QAAAC,CAAAA,CAAU,SAAA,CACV,QAAA,CAAAC,CAAAA,CAAW,KAAA,CACX,SAAA,CAAAtG,CAAAA,CACA,QAAA,CAAA2E,EAAW,UAAA,CACX,OAAA,CAAA/K,CAAAA,CACA,GAAGjP,CACL,CAAA,CAAwB,CACtB,GAAM,CAAE,WAAA,CAAA4b,CAAY,CAAA,CAAItX,EAAAA,EAAS,CAC3BuX,CAAAA,CAAM,CACV,WAAA,CACAH,IAAY,SAAA,CAAY,mBAAA,CAAsB,IAAA,CAC9CA,CAAAA,GAAY,QAAU,iBAAA,CAAoB,IAAA,CAC1CA,CAAAA,GAAY,SAAA,CAAY,oBAAsB,IAAA,CAC9CC,CAAAA,CAAW,oBAAA,CAAuB,IAAA,CAClCtG,CACF,CAAA,CACG,MAAA,CAAO,OAAO,EACd,IAAA,CAAK,GAAG,CAAA,CAEX,OACE3N,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAWmU,EACX,oBAAA,CAAmB,EAAA,CACnB,OAAA,CAAU9hB,CAAAA,EAAM,CACdkV,CAAAA,GAAUlV,CAAC,CAAA,CACNA,EAAE,gBAAA,EAAkB6hB,CAAAA,CAAY7hB,CAAAA,CAAE,WAAW,EACpD,CAAA,CACC,GAAGiG,CAAAA,CAEH,QAAA,CAAAga,EACH,CAEJ","file":"index.js","sourcesContent":["export class LumenError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status?: number,\n ) {\n super(message);\n this.name = \"LumenError\";\n }\n}\n\nexport class LumenOriginError extends LumenError {\n constructor() {\n super(\n \"Origin not allowed. Add this origin in your Lumen project settings.\",\n \"ORIGIN_NOT_ALLOWED\",\n 403,\n );\n this.name = \"LumenOriginError\";\n }\n}\n\nexport class LumenRateLimitError extends LumenError {\n constructor(public readonly retryAfter: number) {\n super(\n `Rate limited — retry after ${retryAfter}s.`,\n \"RATE_LIMITED\",\n 429,\n );\n this.name = \"LumenRateLimitError\";\n }\n}\n\nexport class LumenNetworkError extends LumenError {\n constructor(message: string) {\n super(message, \"NETWORK_ERROR\");\n this.name = \"LumenNetworkError\";\n }\n}\n","import type {\n AmplitudeIdentity,\n LumenClientConfig,\n LumenUser,\n SubmitOptions,\n SubmitPayload,\n SubmitResult,\n} from \"./types\";\nimport {\n LumenError,\n LumenNetworkError,\n LumenOriginError,\n LumenRateLimitError,\n} from \"./errors\";\n\nconst DEFAULT_API_URL = \"https://shakebugs.vercel.app\";\nconst SUBMIT_PATH = \"/api/v1/sdk/submit\";\n\nconst RETRYABLE_STATUSES = new Set([502, 503, 504]);\n\nexport class LumenClient {\n readonly apiKey: string;\n readonly apiUrl: string;\n user: LumenUser | undefined;\n amplitude: AmplitudeIdentity | undefined;\n\n constructor(config: LumenClientConfig) {\n if (!config.apiKey || !config.apiKey.startsWith(\"lk_pub_\")) {\n throw new LumenError(\n \"Invalid Lumen apiKey — expected a key starting with `lk_pub_`.\",\n \"INVALID_API_KEY\",\n );\n }\n this.apiKey = config.apiKey;\n this.apiUrl = (config.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n this.user = config.user;\n this.amplitude = config.amplitude;\n }\n\n /**\n * Submit a feedback payload. Uses XHR (not fetch) so we can surface\n * upload-progress events to the UI. Retries up to 2 times on 5xx /\n * network errors with exponential backoff.\n */\n async submit(\n payload: SubmitPayload,\n options: SubmitOptions = {},\n ): Promise<SubmitResult> {\n const url = `${this.apiUrl}${SUBMIT_PATH}`;\n const body = this.#buildFormData(payload);\n\n let lastError: unknown = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n if (attempt > 0) {\n await wait(2 ** attempt * 250);\n }\n try {\n return await this.#sendOnce(url, body, options);\n } catch (e) {\n lastError = e;\n // Don't retry deterministic client errors.\n if (\n e instanceof LumenOriginError ||\n e instanceof LumenRateLimitError\n ) {\n throw e;\n }\n if (\n e instanceof LumenError &&\n typeof e.status === \"number\" &&\n !RETRYABLE_STATUSES.has(e.status)\n ) {\n throw e;\n }\n }\n }\n if (lastError instanceof Error) throw lastError;\n throw new LumenNetworkError(\"Submit failed after 3 attempts.\");\n }\n\n #buildFormData(payload: SubmitPayload): FormData {\n const fd = new FormData();\n if (payload.rawText) fd.append(\"rawText\", payload.rawText);\n if (payload.category) fd.append(\"category\", payload.category);\n if (payload.submitterEmail) fd.append(\"submitterEmail\", payload.submitterEmail);\n if (payload.submitterFingerprint) {\n fd.append(\"submitterFingerprint\", payload.submitterFingerprint);\n }\n // Inject the configured Amplitude identity into the context channel\n // (unless the caller already set one on the payload). These are\n // analytics ids, not PII — the server reads them to pull the user's\n // event timeline during enrichment.\n const amplitude = payload.context.amplitude ?? this.amplitude;\n const context = amplitude\n ? { ...payload.context, amplitude }\n : payload.context;\n fd.append(\"context\", JSON.stringify(context));\n if (payload.screenshot) {\n fd.append(\n \"screenshot\",\n payload.screenshot,\n screenshotFilename(payload.screenshot),\n );\n }\n if (payload.audio) {\n fd.append(\"audio\", payload.audio, \"audio\");\n }\n if (payload.audioDurationMs != null) {\n fd.append(\"audioDurationMs\", String(payload.audioDurationMs));\n }\n if (payload.video) {\n fd.append(\"video\", payload.video, \"video\");\n }\n if (payload.videoDurationMs != null) {\n fd.append(\"videoDurationMs\", String(payload.videoDurationMs));\n }\n // `user` (id/email/name) is intentionally NOT sent. The server has\n // never read these fields, so transmitting them just leaks PII over\n // the wire for no benefit. The `LumenUser` type stays in the public\n // API as a no-op until a future release adds an authenticated\n // identity flow that the server can actually trust.\n return fd;\n }\n\n #sendOnce(\n url: string,\n body: FormData,\n options: SubmitOptions,\n ): Promise<SubmitResult> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url, true);\n xhr.setRequestHeader(\"X-Lumen-Api-Key\", this.apiKey);\n xhr.responseType = \"text\";\n\n const { onUploadProgress, signal } = options;\n\n if (onUploadProgress) {\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable && e.total > 0) {\n onUploadProgress(Math.min(1, e.loaded / e.total));\n }\n });\n }\n\n const onAbort = () => {\n xhr.abort();\n reject(new LumenNetworkError(\"Submit aborted.\"));\n };\n if (signal) {\n if (signal.aborted) {\n reject(new LumenNetworkError(\"Submit aborted.\"));\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n xhr.addEventListener(\"load\", () => {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n\n if (xhr.status === 403) {\n reject(new LumenOriginError());\n return;\n }\n if (xhr.status === 429) {\n const retryAfter = Number(xhr.getResponseHeader(\"Retry-After\")) || 60;\n reject(new LumenRateLimitError(retryAfter));\n return;\n }\n if (xhr.status < 200 || xhr.status >= 300) {\n reject(\n new LumenError(\n parseError(xhr.responseText) ?? `HTTP ${xhr.status}`,\n \"HTTP_ERROR\",\n xhr.status,\n ),\n );\n return;\n }\n try {\n const parsed = JSON.parse(xhr.responseText) as SubmitResult;\n resolve(parsed);\n } catch {\n reject(new LumenError(\"Malformed response from server.\", \"BAD_RESPONSE\"));\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n reject(new LumenNetworkError(\"Network error during submit.\"));\n });\n\n xhr.send(body);\n });\n }\n}\n\nfunction screenshotFilename(blob: Blob): string {\n const ext =\n blob.type === \"image/jpeg\"\n ? \"jpg\"\n : blob.type === \"image/webp\"\n ? \"webp\"\n : \"png\";\n return `screenshot.${ext}`;\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction parseError(text: string): string | null {\n try {\n const obj = JSON.parse(text) as { error?: string; message?: string };\n return obj.error ?? obj.message ?? null;\n } catch {\n return text || null;\n }\n}\n","import { LumenError } from \"./errors\";\nimport type {\n CaptureResult,\n ScreenshotCaptureOptions,\n} from \"./types\";\n\nconst DEFAULT_MAX_SCALE = 2;\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\n\ntype Html2Canvas = typeof import(\"html2canvas-pro\").default;\n\nlet html2canvasForTest: Html2Canvas | null = null;\n\nexport function __setHtml2CanvasForTest(renderer: Html2Canvas | null): void {\n html2canvasForTest = renderer;\n}\n\n/**\n * Capture the visible app screen with method/platform metadata.\n *\n * `mode: \"auto\"` keeps the no-permission DOM path first, then falls\n * back to the browser Screen Capture API if DOM rendering fails.\n * Hosts that need native-quality pixels can pass a custom provider.\n */\nexport async function captureScreen(\n options: ScreenshotCaptureOptions = {},\n): Promise<CaptureResult> {\n assertBrowser();\n\n const mode = options.mode ?? \"auto\";\n\n if (options.provider && (mode === \"auto\" || mode === \"custom\")) {\n try {\n return normalizeProviderResult(await options.provider(), options);\n } catch (e) {\n if (mode === \"custom\") throw e;\n // In auto mode a broken custom provider should not strand web apps.\n options.onWarning?.([\n \"Custom capture provider failed; falling back to browser DOM capture.\",\n ]);\n }\n }\n\n if (mode === \"manual\") {\n throw new LumenError(\n \"Manual screenshot upload is required for this capture mode.\",\n \"MANUAL_CAPTURE_REQUIRED\",\n );\n }\n\n if (mode === \"true-screen\") {\n return captureDisplayMedia(options);\n }\n\n if (mode === \"dom\") {\n return captureDom(options);\n }\n\n if (mode === \"custom\") {\n throw new LumenError(\n \"`capture.provider` is required when capture mode is `custom`.\",\n \"CAPTURE_PROVIDER_REQUIRED\",\n );\n }\n\n try {\n return await captureDom(options);\n } catch (domError) {\n if (canUseDisplayMedia()) {\n const result = await captureDisplayMedia(options);\n result.warnings = uniq([\n \"DOM screenshot failed; used browser screen permission fallback.\",\n ...result.warnings,\n ]);\n options.onWarning?.(result.warnings);\n return result;\n }\n throw domError;\n }\n}\n\n/**\n * Back-compatible wrapper kept for existing integrations.\n * New code should prefer `captureScreen()` so capture quality metadata\n * can be stored with the feedback.\n */\nexport async function captureScreenshot(\n target?: HTMLElement,\n): Promise<Blob> {\n const result = await captureScreen({ target, mode: \"auto\" });\n return result.blob;\n}\n\nexport function createManualCaptureResult(\n blob: Blob,\n warnings: string[] = [],\n): CaptureResult {\n assertBrowser();\n const viewport = currentViewport();\n return {\n blob,\n method: \"manual-upload\",\n platform: \"web\",\n viewport,\n pixelRatio: window.devicePixelRatio ?? 1,\n warnings: uniq(warnings),\n };\n}\n\nasync function captureDom(\n options: ScreenshotCaptureOptions,\n): Promise<CaptureResult> {\n const html2canvas = await loadHtml2Canvas();\n\n const target = options.target ?? document.documentElement;\n const viewport = currentViewport();\n const scale = Math.max(\n 1,\n Math.min(window.devicePixelRatio ?? 1, options.maxScale ?? DEFAULT_MAX_SCALE),\n );\n const warnings = collectDomWarnings(target);\n\n const canvas = await html2canvas(target, {\n backgroundColor: null,\n logging: false,\n useCORS: true,\n allowTaint: false,\n width: viewport.width,\n height: viewport.height,\n windowWidth: viewport.width,\n windowHeight: viewport.height,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n x: window.scrollX,\n y: window.scrollY,\n scale,\n ignoreElements: (el) =>\n el instanceof HTMLElement &&\n (el.dataset.lumenCaptureIgnore === \"true\" ||\n Boolean(el.closest(\"[data-lumen-capture-ignore='true']\"))),\n });\n\n const blob = await encodeCanvas(canvas, warnings);\n const result = {\n blob,\n method: \"web-dom\",\n platform: \"web\",\n viewport,\n pixelRatio: scale,\n warnings: uniq(warnings),\n } satisfies CaptureResult;\n if (result.warnings.length > 0) options.onWarning?.(result.warnings);\n return result;\n}\n\nasync function loadHtml2Canvas(): Promise<Html2Canvas> {\n if (html2canvasForTest) return html2canvasForTest;\n const { default: html2canvas } = await import(\"html2canvas-pro\");\n return html2canvas;\n}\n\nasync function captureDisplayMedia(\n options: ScreenshotCaptureOptions,\n): Promise<CaptureResult> {\n if (!canUseDisplayMedia()) {\n throw new LumenError(\n \"Browser screen capture is unavailable in this environment.\",\n \"DISPLAY_MEDIA_UNAVAILABLE\",\n );\n }\n\n const stream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n audio: false,\n });\n\n try {\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n video.srcObject = stream;\n await waitForVideoFrame(video);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new LumenError(\n \"Could not create a drawing context for screen capture.\",\n \"CANVAS_CONTEXT_UNAVAILABLE\",\n );\n }\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n const viewport = currentViewport();\n const warnings = [\n \"Browser screen capture uses the window or tab selected by the user.\",\n ];\n const blob = await encodeCanvas(canvas, warnings);\n const result = {\n blob,\n method: \"web-display-media\",\n platform: \"web\",\n viewport,\n pixelRatio:\n viewport.width > 0 ? canvas.width / viewport.width : undefined,\n warnings: uniq(warnings),\n } satisfies CaptureResult;\n options.onWarning?.(result.warnings);\n return result;\n } finally {\n for (const track of stream.getTracks()) track.stop();\n }\n}\n\nfunction normalizeProviderResult(\n result: CaptureResult,\n options: ScreenshotCaptureOptions,\n): CaptureResult {\n const viewport = currentViewport();\n const normalized = {\n ...result,\n method: result.method ?? \"custom\",\n platform: result.platform ?? \"custom\",\n viewport: result.viewport ?? viewport,\n pixelRatio: result.pixelRatio ?? window.devicePixelRatio ?? 1,\n warnings: uniq(result.warnings ?? []),\n } satisfies CaptureResult;\n if (normalized.warnings.length > 0) options.onWarning?.(normalized.warnings);\n return normalized;\n}\n\nfunction collectDomWarnings(target: HTMLElement): string[] {\n const warnings = new Set<string>();\n\n if (target.querySelector(\"iframe\")) {\n warnings.add(\"Embedded iframes may be blank or incomplete in DOM capture.\");\n }\n if (target.querySelector(\"video\")) {\n warnings.add(\"Video frames may be blank or stale in DOM capture.\");\n }\n if (target.querySelector(\"canvas\")) {\n warnings.add(\"Canvas/WebGL content may be blank if it is cross-origin tainted.\");\n }\n if (document.fonts && document.fonts.status !== \"loaded\") {\n warnings.add(\"Web fonts were still loading when the screenshot was captured.\");\n }\n\n let crossOriginImages = 0;\n for (const img of Array.from(target.querySelectorAll(\"img\"))) {\n const src = img.currentSrc || img.src;\n if (!src) continue;\n try {\n const url = new URL(src, window.location.href);\n if (url.origin !== window.location.origin && !img.crossOrigin) {\n crossOriginImages += 1;\n }\n } catch {\n // Invalid image URLs are ignored here; html2canvas will handle them.\n }\n }\n if (crossOriginImages > 0) {\n warnings.add(\n `${crossOriginImages} cross-origin image${crossOriginImages === 1 ? \"\" : \"s\"} without CORS may be omitted from the screenshot.`,\n );\n }\n\n return Array.from(warnings);\n}\n\nasync function encodeCanvas(\n canvas: HTMLCanvasElement,\n warnings: string[],\n): Promise<Blob> {\n let blob = await canvasToBlob(canvas, \"image/png\", 0.92);\n if (blob.size <= MAX_SCREENSHOT_BYTES) return blob;\n\n warnings.push(\"Screenshot exceeded the upload cap and was compressed.\");\n\n // Progressively downscale + re-encode until we're under the cap, or until\n // the image is too small to be useful. Without this loop a very large\n // screenshot from a 4K monitor at 2x DPR could still exceed the cap after\n // a single pass and silently fail to upload server-side.\n let working = canvas;\n let attempt = 0;\n while (blob.size > MAX_SCREENSHOT_BYTES && attempt < 6) {\n const ratio = Math.max(\n 0.35,\n Math.min(0.95, Math.sqrt(MAX_SCREENSHOT_BYTES / blob.size) * 0.9),\n );\n const next = document.createElement(\"canvas\");\n next.width = Math.max(1, Math.round(working.width * ratio));\n next.height = Math.max(1, Math.round(working.height * ratio));\n const ctx = next.getContext(\"2d\");\n if (!ctx) return blob;\n ctx.drawImage(working, 0, 0, next.width, next.height);\n working = next;\n\n for (const quality of [0.86, 0.74, 0.62, 0.5]) {\n blob = await canvasToBlob(working, \"image/jpeg\", quality);\n if (blob.size <= MAX_SCREENSHOT_BYTES) return blob;\n }\n\n attempt += 1;\n if (next.width < 480 || next.height < 320) break;\n }\n\n if (blob.size > MAX_SCREENSHOT_BYTES) {\n warnings.push(\n \"Screenshot remained large after compression; upload may be rejected.\",\n );\n }\n return blob;\n}\n\nfunction canvasToBlob(\n canvas: HTMLCanvasElement,\n type: \"image/png\" | \"image/jpeg\",\n quality: number,\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new LumenError(\"Could not encode screenshot.\", \"ENCODE_FAILED\"));\n return;\n }\n resolve(blob);\n },\n type,\n quality,\n );\n });\n}\n\nfunction currentViewport(): { width: number; height: number } {\n const visual = window.visualViewport;\n return {\n width: Math.round(visual?.width ?? window.innerWidth),\n height: Math.round(visual?.height ?? window.innerHeight),\n };\n}\n\nfunction canUseDisplayMedia(): boolean {\n return Boolean(navigator.mediaDevices?.getDisplayMedia);\n}\n\nasync function waitForVideoFrame(video: HTMLVideoElement): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const done = () => resolve();\n const fail = () =>\n reject(new LumenError(\"Could not read screen capture video.\", \"VIDEO_FAILED\"));\n video.addEventListener(\"loadedmetadata\", done, { once: true });\n video.addEventListener(\"error\", fail, { once: true });\n void video.play().catch(fail);\n });\n\n // Wait until the browser actually reports a non-zero frame size. We poll\n // via rAF (cheap, paints-aligned) with a hard cap so a stalled stream\n // can't hang the capture flow.\n const start = performance.now();\n const MAX_WAIT_MS = 1500;\n while (video.videoWidth === 0 || video.videoHeight === 0) {\n if (performance.now() - start > MAX_WAIT_MS) {\n throw new LumenError(\n \"Screen capture did not produce a frame in time.\",\n \"VIDEO_TIMEOUT\",\n );\n }\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n }\n}\n\nfunction assertBrowser(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new LumenError(\n \"Screenshot capture can only run in the browser.\",\n \"INVALID_ENV\",\n );\n }\n}\n\nfunction uniq(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean)));\n}\n","/**\n * Lightweight runtime capture: console + fetch/XHR ring buffers.\n *\n * Patched lazily on first install; idempotent. The buffers are drained\n * (not cleared) when `readRuntimeCapture()` is called so multiple\n * submissions in one session each get the latest tail.\n *\n * Keep this file dependency-free and small — it sits on every host\n * page's main bundle.\n */\n\nconst MAX_ENTRIES = 200;\nconst MAX_STRING = 4096;\n\ntype ConsoleLevel = \"log\" | \"info\" | \"warn\" | \"error\" | \"debug\";\n\nexport interface ConsoleEntry {\n level: ConsoleLevel;\n ts: number;\n message: string;\n}\n\nexport interface NetworkEntry {\n type: \"fetch\" | \"xhr\";\n method: string;\n url: string;\n status: number;\n ok: boolean;\n durationMs: number;\n ts: number;\n error?: string;\n}\n\nconst consoleBuf: ConsoleEntry[] = [];\nconst networkBuf: NetworkEntry[] = [];\n\nlet installed = false;\nlet ignoreUrlPrefix: string | null = null;\n\nexport interface InstallRuntimeCaptureOptions {\n /**\n * Requests to URLs starting with this prefix are skipped — prevents\n * the SDK from logging its own submit/config calls in a recursive\n * loop and from leaking apiKey headers into the buffer.\n */\n ignoreUrlPrefix?: string;\n}\n\nexport function installRuntimeCapture(\n options: InstallRuntimeCaptureOptions = {},\n): void {\n if (installed) return;\n if (typeof window === \"undefined\") return;\n installed = true;\n ignoreUrlPrefix = options.ignoreUrlPrefix ?? null;\n patchConsole();\n patchFetch();\n patchXhr();\n}\n\nexport function readRuntimeCapture(): {\n consoleLog: ConsoleEntry[];\n networkLog: NetworkEntry[];\n} {\n return {\n consoleLog: consoleBuf.slice(),\n networkLog: networkBuf.slice(),\n };\n}\n\nfunction pushBounded<T>(buf: T[], entry: T): void {\n buf.push(entry);\n if (buf.length > MAX_ENTRIES) buf.splice(0, buf.length - MAX_ENTRIES);\n}\n\nfunction safeStringify(args: unknown[]): string {\n const out: string[] = [];\n for (const arg of args) {\n if (typeof arg === \"string\") {\n out.push(arg);\n continue;\n }\n if (arg instanceof Error) {\n out.push(`${arg.name}: ${arg.message}${arg.stack ? `\\n${arg.stack}` : \"\"}`);\n continue;\n }\n try {\n out.push(JSON.stringify(arg, replacer));\n } catch {\n out.push(String(arg));\n }\n }\n const joined = out.join(\" \");\n return joined.length > MAX_STRING\n ? joined.slice(0, MAX_STRING) + \"…[truncated]\"\n : joined;\n}\n\n// Drops common circular refs (DOM nodes, React fibers) so JSON.stringify\n// doesn't throw and the buffer stays small.\nfunction replacer(_key: string, value: unknown): unknown {\n if (value instanceof Element) return `[Element ${(value as Element).tagName}]`;\n if (typeof value === \"function\") return \"[Function]\";\n return value;\n}\n\nfunction patchConsole(): void {\n const target = window.console;\n if (!target) return;\n const levels: ConsoleLevel[] = [\"log\", \"info\", \"warn\", \"error\", \"debug\"];\n for (const level of levels) {\n const original = target[level]?.bind(target);\n if (!original) continue;\n target[level] = (...args: unknown[]) => {\n try {\n pushBounded(consoleBuf, {\n level,\n ts: Date.now(),\n message: safeStringify(args),\n });\n } catch {\n // Never let our interception throw into the host app.\n }\n original(...args);\n };\n }\n}\n\nfunction isIgnored(url: string): boolean {\n if (!ignoreUrlPrefix) return false;\n return url.startsWith(ignoreUrlPrefix);\n}\n\nfunction patchFetch(): void {\n const originalFetch = window.fetch;\n if (typeof originalFetch !== \"function\") return;\n window.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n const method = (init?.method ?? (input instanceof Request ? input.method : \"GET\")).toUpperCase();\n if (isIgnored(url)) {\n return originalFetch.call(window, input as RequestInfo, init);\n }\n const started = performance.now();\n try {\n const res = await originalFetch.call(window, input as RequestInfo, init);\n pushBounded(networkBuf, {\n type: \"fetch\",\n method,\n url: truncate(url),\n status: res.status,\n ok: res.ok,\n durationMs: Math.round(performance.now() - started),\n ts: Date.now(),\n });\n return res;\n } catch (e) {\n pushBounded(networkBuf, {\n type: \"fetch\",\n method,\n url: truncate(url),\n status: 0,\n ok: false,\n durationMs: Math.round(performance.now() - started),\n ts: Date.now(),\n error: e instanceof Error ? e.message : \"fetch error\",\n });\n throw e;\n }\n } as typeof window.fetch;\n}\n\nfunction patchXhr(): void {\n const OriginalXHR = window.XMLHttpRequest;\n if (!OriginalXHR) return;\n const originalOpen = OriginalXHR.prototype.open;\n const originalSend = OriginalXHR.prototype.send;\n\n OriginalXHR.prototype.open = function patchedOpen(\n this: XMLHttpRequest & { __lumen?: { method: string; url: string; t: number } },\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n this.__lumen = {\n method: String(method).toUpperCase(),\n url: typeof url === \"string\" ? url : url.toString(),\n t: 0,\n };\n // @ts-expect-error variadic passthrough\n return originalOpen.call(this, method, url, ...rest);\n } as typeof OriginalXHR.prototype.open;\n\n OriginalXHR.prototype.send = function patchedSend(\n this: XMLHttpRequest & { __lumen?: { method: string; url: string; t: number } },\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const meta = this.__lumen;\n if (meta && !isIgnored(meta.url)) {\n meta.t = performance.now();\n const onDone = () => {\n try {\n pushBounded(networkBuf, {\n type: \"xhr\",\n method: meta.method,\n url: truncate(meta.url),\n status: this.status,\n ok: this.status >= 200 && this.status < 400,\n durationMs: Math.round(performance.now() - meta.t),\n ts: Date.now(),\n });\n } catch {\n // ignore\n }\n this.removeEventListener(\"loadend\", onDone);\n };\n this.addEventListener(\"loadend\", onDone);\n }\n return originalSend.call(this, body ?? null);\n } as typeof OriginalXHR.prototype.send;\n}\n\nfunction truncate(s: string): string {\n return s.length > 512 ? s.slice(0, 512) + \"…\" : s;\n}\n","import { readRuntimeCapture } from \"./capture-runtime\";\nimport type {\n CapturedContext,\n CaptureMetadata,\n CaptureResult,\n DeviceContext,\n} from \"./types\";\n\n/**\n * Snapshot of basic page context at submit-time.\n *\n * Console + network logs are sourced from the runtime ring buffer when\n * `installRuntimeCapture()` has been called by the host (the React\n * provider does this on mount). When the host hasn't installed\n * interception the buffer is empty and the legacy `[]` is sent — same\n * shape, no migration impact.\n */\nexport function captureContext(\n capture?: CaptureResult | CaptureMetadata,\n): CapturedContext {\n if (typeof window === \"undefined\") {\n return {\n url: \"\",\n userAgent: \"\",\n viewport: { width: 0, height: 0 },\n capture: toCaptureMetadata(capture),\n consoleLog: [],\n networkLog: [],\n };\n }\n\n const runtime = readRuntimeCapture();\n return {\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n capture: toCaptureMetadata(capture),\n device: snapshotDevice(),\n consoleLog: runtime.consoleLog,\n networkLog: runtime.networkLog,\n };\n}\n\nfunction snapshotDevice(): DeviceContext {\n const device: DeviceContext = {};\n try {\n device.screen = {\n width: window.screen?.width ?? 0,\n height: window.screen?.height ?? 0,\n };\n device.pixelRatio = window.devicePixelRatio ?? 1;\n device.language = navigator.language;\n device.languages = Array.from(navigator.languages ?? []);\n device.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n device.colorScheme = window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n device.referrer = document.referrer || undefined;\n device.title = document.title || undefined;\n device.online = navigator.onLine;\n const nav = performance.getEntriesByType(\"navigation\")[0] as\n | PerformanceNavigationTiming\n | undefined;\n if (nav) {\n device.uptimeMs = Math.round(performance.now());\n }\n } catch {\n // Best-effort snapshot — don't block submit on a missing API.\n }\n return device;\n}\n\nfunction toCaptureMetadata(\n capture?: CaptureResult | CaptureMetadata,\n): CaptureMetadata | undefined {\n if (!capture) return undefined;\n return {\n method: capture.method,\n platform: capture.platform,\n viewport: capture.viewport,\n pixelRatio: capture.pixelRatio,\n warnings: capture.warnings,\n };\n}\n","import { LumenError } from \"./errors\";\nimport type {\n CaptureMethod,\n CaptureResult,\n CapturePlatform,\n ScreenshotCaptureProvider,\n} from \"./types\";\n\n/**\n * Native-screenshot bridge for WebView hosts (Expo / react-native-webview,\n * Capacitor, …).\n *\n * The browser DOM renderer (`html2canvas`) only rasterizes what lives in the\n * DOM, so anything the native layer draws — native overlays, modals, tab\n * bars, the OS status bar — never shows up. To get a pixel-accurate shot of\n * what the user actually sees, capture has to happen on the native side\n * (e.g. `react-native-view-shot`).\n *\n * This helper builds a `ScreenshotCaptureProvider` you can pass straight into\n * `<LumenProvider capture={{ mode: \"custom\", provider }}>`. When Lumen needs a\n * screenshot it:\n * 1. requests the native host to capture after screen updates; if this is a\n * recapture while Lumen UI is already open, the provider also conceals\n * `[data-lumen-root]` / `data-lumen-capture-ignore` before the request,\n * 2. posts a `lumen:capture-request` message to the native host,\n * 3. waits for the host to send back a PNG/JPEG data URL,\n * 4. restores the sheet and resolves with a native `CaptureResult`.\n *\n * On the native side, respond by injecting JS that calls\n * `window.__lumenNativeCapture.resolve(id, dataUrl)` (or post a\n * `{ type: \"lumen:capture-response\", id, dataUrl }` message back into the\n * WebView). See the package README for a full Expo example.\n */\nexport interface NativeCaptureProviderOptions {\n /** Recorded in the submission metadata. Defaults to platform autodetection. */\n platform?: Extract<CapturePlatform, \"ios\" | \"android\">;\n /** Give up after this long if the native host never answers. Default 8000ms. */\n timeoutMs?: number;\n /**\n * How to deliver the capture request to the native host. Defaults to\n * `window.ReactNativeWebView.postMessage(JSON.stringify(request))`, which is\n * what react-native-webview exposes. Override for Capacitor / custom shells.\n */\n send?: (request: NativeCaptureRequest) => void;\n /**\n * CSS selector for elements to hide while the native shot is taken. Defaults\n * to the Lumen root and sheet markers so the feedback UI stays out of the\n * screenshot during recapture/legacy submit-time captures.\n * Pass `null` to disable hiding entirely.\n */\n concealSelector?: string | null;\n /**\n * Extra delay after concealment before `send` fires. Native iOS hosts should\n * still snapshot with `afterScreenUpdates: true`; this delay gives the\n * WebView compositor a chance to flush hidden DOM state first.\n */\n captureSettleMs?: number;\n}\n\nexport interface NativeCaptureRequest {\n type: \"lumen:capture-request\";\n /** Correlates the response with this request. */\n id: string;\n /**\n * Native hosts should honor this by capturing after pending screen updates\n * have committed, e.g. `drawHierarchy(..., afterScreenUpdates: true)` on iOS.\n */\n afterScreenUpdates: true;\n}\n\n/**\n * Message a native host posts into the WebView to open the Lumen sheet when\n * it detects a device shake. Deliver it the same way as any other bridge\n * message — `window.ReactNativeWebView` round-trips it back via the WebView's\n * `onMessage`, or inject `window.dispatchEvent(new MessageEvent(\"message\", …))`.\n * The React SDK listens for it when shake-to-open is enabled.\n */\nexport const LUMEN_SHAKE_MESSAGE = \"lumen:shake\";\n\nexport interface ShakeMessage {\n type: typeof LUMEN_SHAKE_MESSAGE;\n}\n\nexport interface NativeCaptureResponse {\n type: \"lumen:capture-response\";\n id: string;\n /** A `data:image/png;base64,…` (or jpeg/webp) URL of the captured screen. */\n dataUrl?: string;\n /** Set instead of `dataUrl` when the native capture failed. */\n error?: string;\n /** Optional device pixel ratio so metadata matches the native render. */\n pixelRatio?: number;\n}\n\ninterface PendingCapture {\n resolve: (response: NativeCaptureResponse) => void;\n reject: (error: Error) => void;\n}\n\ninterface NativeCaptureRegistry {\n pending: Map<string, PendingCapture>;\n /** Called by the native host (via injected JS) to deliver a result. */\n resolve: (id: string, dataUrl: string, pixelRatio?: number) => void;\n /** Called by the native host to report a capture failure. */\n reject: (id: string, error?: string) => void;\n}\n\ndeclare global {\n interface Window {\n __lumenNativeCapture?: NativeCaptureRegistry;\n ReactNativeWebView?: { postMessage: (msg: string) => void };\n }\n}\n\nconst DEFAULT_TIMEOUT_MS = 8000;\nconst DEFAULT_CAPTURE_SETTLE_MS = 50;\nconst DEFAULT_CONCEAL =\n '[data-lumen-root], [data-lumen-capture-ignore=\"true\"]';\n\n/**\n * Build a native-screenshot provider for a WebView host. Safe to call at\n * module scope; the registry + message listener install lazily on first use.\n */\nexport function createNativeCaptureProvider(\n options: NativeCaptureProviderOptions = {},\n): ScreenshotCaptureProvider {\n return async function nativeCaptureProvider(): Promise<CaptureResult> {\n if (typeof window === \"undefined\") {\n throw new LumenError(\n \"Native capture bridge requires a WebView/browser window.\",\n \"INVALID_ENV\",\n );\n }\n\n const registry = ensureRegistry();\n const send = options.send ?? defaultSend;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const captureSettleMs =\n options.captureSettleMs ?? DEFAULT_CAPTURE_SETTLE_MS;\n const id = newRequestId();\n\n const restore = conceal(\n options.concealSelector === undefined\n ? DEFAULT_CONCEAL\n : options.concealSelector,\n );\n try {\n await settleAfterConceal(captureSettleMs);\n\n const response = await new Promise<NativeCaptureResponse>(\n (resolve, reject) => {\n const timer = window.setTimeout(() => {\n registry.pending.delete(id);\n reject(\n new LumenError(\n \"Native screenshot timed out; the host did not respond.\",\n \"NATIVE_CAPTURE_TIMEOUT\",\n ),\n );\n }, timeoutMs);\n\n registry.pending.set(id, {\n resolve: (r) => {\n window.clearTimeout(timer);\n resolve(r);\n },\n reject: (e) => {\n window.clearTimeout(timer);\n reject(e);\n },\n });\n\n try {\n send({ type: \"lumen:capture-request\", id, afterScreenUpdates: true });\n } catch (e) {\n registry.pending.delete(id);\n window.clearTimeout(timer);\n reject(\n new LumenError(\n \"Could not reach the native host for screen capture.\",\n \"NATIVE_CAPTURE_UNAVAILABLE\",\n ),\n );\n void e;\n }\n },\n );\n\n if (response.error || !response.dataUrl) {\n throw new LumenError(\n response.error ?? \"Native screenshot returned no image.\",\n \"NATIVE_CAPTURE_FAILED\",\n );\n }\n\n const blob = dataUrlToBlob(response.dataUrl);\n const platform = options.platform ?? detectPlatform();\n const method: CaptureMethod =\n platform === \"android\" ? \"android-native\" : \"ios-native\";\n\n return {\n blob,\n method,\n platform,\n viewport: {\n width: Math.round(window.innerWidth),\n height: Math.round(window.innerHeight),\n },\n pixelRatio: response.pixelRatio ?? window.devicePixelRatio ?? 1,\n warnings: [],\n } satisfies CaptureResult;\n } finally {\n restore();\n }\n };\n}\n\n/** Default transport: react-native-webview's postMessage channel. */\nfunction defaultSend(request: NativeCaptureRequest): void {\n const rn = window.ReactNativeWebView;\n if (!rn?.postMessage) {\n throw new LumenError(\n \"window.ReactNativeWebView is unavailable; pass a custom `send`.\",\n \"NATIVE_CAPTURE_UNAVAILABLE\",\n );\n }\n rn.postMessage(JSON.stringify(request));\n}\n\nfunction ensureRegistry(): NativeCaptureRegistry {\n if (window.__lumenNativeCapture) return window.__lumenNativeCapture;\n\n const registry: NativeCaptureRegistry = {\n pending: new Map(),\n resolve(id, dataUrl, pixelRatio) {\n const entry = registry.pending.get(id);\n if (!entry) return;\n registry.pending.delete(id);\n entry.resolve({ type: \"lumen:capture-response\", id, dataUrl, pixelRatio });\n },\n reject(id, error) {\n const entry = registry.pending.get(id);\n if (!entry) return;\n registry.pending.delete(id);\n entry.resolve({ type: \"lumen:capture-response\", id, error });\n },\n };\n\n // Hosts that prefer postMessage (instead of injected JS) can post a\n // capture-response back into the WebView; accept it on window and document.\n const onMessage = (event: MessageEvent) => {\n const data = parseMessage(event.data);\n if (!data || data.type !== \"lumen:capture-response\") return;\n const entry = registry.pending.get(data.id);\n if (!entry) return;\n registry.pending.delete(data.id);\n entry.resolve(data);\n };\n window.addEventListener(\"message\", onMessage);\n document.addEventListener(\"message\", onMessage as EventListener);\n\n window.__lumenNativeCapture = registry;\n return registry;\n}\n\nfunction parseMessage(data: unknown): NativeCaptureResponse | null {\n if (data && typeof data === \"object\" && \"type\" in data) {\n return data as NativeCaptureResponse;\n }\n if (typeof data === \"string\") {\n try {\n const parsed = JSON.parse(data);\n if (parsed && typeof parsed === \"object\" && parsed.type) return parsed;\n } catch {\n // Not a Lumen message — ignore.\n }\n }\n return null;\n}\n\n/** Hide matching elements; returns a restore() that puts them back. */\nfunction conceal(selector: string | null): () => void {\n if (!selector || typeof document === \"undefined\") return () => {};\n const hidden: Array<{ el: HTMLElement; prev: string }> = [];\n for (const el of Array.from(\n document.querySelectorAll<HTMLElement>(selector),\n )) {\n hidden.push({ el, prev: el.style.visibility });\n el.style.visibility = \"hidden\";\n }\n return () => {\n for (const { el, prev } of hidden) el.style.visibility = prev;\n };\n}\n\nasync function settleAfterConceal(captureSettleMs: number): Promise<void> {\n await nextAnimationFrame();\n if (captureSettleMs > 0) {\n await new Promise((resolve) => window.setTimeout(resolve, captureSettleMs));\n }\n}\n\nfunction nextAnimationFrame(): Promise<void> {\n return new Promise((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n}\n\nfunction detectPlatform(): \"ios\" | \"android\" {\n const ua = navigator.userAgent || \"\";\n return /android/i.test(ua) ? \"android\" : \"ios\";\n}\n\nfunction newRequestId(): string {\n const rand =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : Math.random().toString(36).slice(2);\n return `lumen-cap-${rand}`;\n}\n\n/** Decode a data: URL into a Blob without relying on fetch() (some old\n * WebViews block fetch on data: URIs). */\nfunction dataUrlToBlob(dataUrl: string): Blob {\n const match = /^data:([^;,]*)(;base64)?,(.*)$/s.exec(dataUrl);\n if (!match) {\n throw new LumenError(\n \"Native host returned an invalid image data URL.\",\n \"NATIVE_CAPTURE_FAILED\",\n );\n }\n const mime = match[1] || \"image/png\";\n const isBase64 = Boolean(match[2]);\n const data = match[3] ?? \"\";\n\n if (!isBase64) {\n return new Blob([decodeURIComponent(data)], { type: mime });\n }\n\n const binary = atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return new Blob([bytes], { type: mime });\n}\n","const LUMEN_ROOT_SELECTOR = \"[data-lumen-root]\";\nconst LUMEN_MARKER_SELECTOR =\n \"[data-lumen-root], [data-lumen-trigger], [data-lumen-capture-ignore='true']\";\n\n/**\n * Public DOM contract for host overlay outside-click handlers.\n *\n * Lumen mounts its owned UI under a stable `[data-lumen-root]` host when using\n * the framework-agnostic mount. React trigger elements also carry stable Lumen\n * markers. Use this helper from document-level pointer/click handlers to keep\n * host sheets or modals open when the user activates Lumen.\n */\nexport function isLumenEventTarget(event: Event): boolean {\n const path =\n typeof event.composedPath === \"function\" ? event.composedPath() : [];\n\n for (const entry of path) {\n if (isLumenNode(entry)) return true;\n }\n\n return isLumenNode(event.target);\n}\n\nfunction isLumenNode(value: unknown): boolean {\n if (!value) return false;\n\n if (typeof Element !== \"undefined\" && value instanceof Element) {\n if (value.matches(LUMEN_MARKER_SELECTOR)) return true;\n return Boolean(value.closest(LUMEN_ROOT_SELECTOR));\n }\n\n if (typeof ShadowRoot !== \"undefined\" && value instanceof ShadowRoot) {\n return isLumenNode(value.host);\n }\n\n return false;\n}\n","import { LumenError } from \"./errors\";\n\nexport interface AudioRecording {\n blob: Blob;\n durationMs: number;\n mimeType: string;\n}\n\nexport interface RecorderHandle {\n /** Stop recording and resolve with the recorded blob. */\n stop: () => Promise<AudioRecording>;\n /** Cancel without producing a blob; releases the mic immediately. */\n cancel: () => void;\n /** Stream object (use to render a live waveform in Phase 2). */\n stream: MediaStream;\n}\n\n/**\n * Start a MediaRecorder. Caller is responsible for stopping/canceling.\n * Auto-stops after `maxSeconds` seconds to avoid runaway recordings.\n */\nexport async function recordAudio(\n maxSeconds = 60,\n): Promise<RecorderHandle> {\n if (typeof window === \"undefined\" || !navigator.mediaDevices) {\n throw new LumenError(\n \"Audio recording requires a browser with MediaDevices.\",\n \"INVALID_ENV\",\n );\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch {\n throw new LumenError(\n \"Microphone access denied or unavailable.\",\n \"MIC_DENIED\",\n );\n }\n\n // Pick the first MIME type supported by the browser; webm/opus on\n // Chromium, mp4/aac on Safari, ogg on Firefox.\n const candidates = [\n \"audio/webm;codecs=opus\",\n \"audio/webm\",\n \"audio/mp4\",\n \"audio/ogg;codecs=opus\",\n ];\n const mimeType =\n candidates.find((m) => MediaRecorder.isTypeSupported(m)) ?? \"\";\n\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n const chunks: Blob[] = [];\n const start = performance.now();\n let timeoutId: number | null = null;\n\n recorder.addEventListener(\"dataavailable\", (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n });\n\n recorder.start();\n timeoutId = window.setTimeout(() => {\n if (recorder.state !== \"inactive\") recorder.stop();\n }, maxSeconds * 1000);\n\n function release() {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n timeoutId = null;\n for (const track of stream.getTracks()) track.stop();\n }\n\n return {\n stream,\n cancel() {\n try {\n if (recorder.state !== \"inactive\") recorder.stop();\n } catch {\n /* ignore */\n }\n release();\n },\n stop(): Promise<AudioRecording> {\n return new Promise((resolve, reject) => {\n if (recorder.state === \"inactive\") {\n release();\n reject(new LumenError(\"Recorder already stopped.\", \"RECORDER_STOPPED\"));\n return;\n }\n recorder.addEventListener(\n \"stop\",\n () => {\n const durationMs = performance.now() - start;\n const finalType = recorder.mimeType || mimeType || \"audio/webm\";\n const blob = new Blob(chunks, { type: finalType });\n release();\n resolve({ blob, durationMs, mimeType: finalType });\n },\n { once: true },\n );\n recorder.stop();\n });\n },\n };\n}\n","import { LumenError } from \"./errors\";\n\nexport interface VideoRecording {\n blob: Blob;\n durationMs: number;\n mimeType: string;\n}\n\nexport interface VideoRecorderHandle {\n /** Stop recording and resolve with the recorded blob. */\n stop: () => Promise<VideoRecording>;\n /** Cancel without producing a blob; releases the screen capture. */\n cancel: () => void;\n /** The screen-capture stream (use to render a live preview). */\n stream: MediaStream;\n}\n\n/**\n * Record the screen via the browser Screen Capture API + MediaRecorder.\n * Mirrors {@link recordAudio} but over `getDisplayMedia`. The user picks a\n * tab / window / screen in the browser's native picker; if they cancel the\n * picker this rejects with `SCREEN_DENIED`.\n *\n * Auto-stops after `maxSeconds`. The browser also surfaces its own \"Stop\n * sharing\" control — we listen for the track ending so that path resolves\n * the recording too.\n */\nexport async function recordVideo(\n maxSeconds = 60,\n): Promise<VideoRecorderHandle> {\n if (\n typeof window === \"undefined\" ||\n !navigator.mediaDevices ||\n typeof navigator.mediaDevices.getDisplayMedia !== \"function\"\n ) {\n throw new LumenError(\n \"Screen recording requires a browser with getDisplayMedia.\",\n \"INVALID_ENV\",\n );\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n // Capture system/tab audio when the user opts in via the picker.\n audio: true,\n });\n } catch {\n throw new LumenError(\n \"Screen capture was denied or cancelled.\",\n \"SCREEN_DENIED\",\n );\n }\n\n // VP9/VP8 webm on Chromium; mp4 on Safari.\n const candidates = [\n \"video/webm;codecs=vp9,opus\",\n \"video/webm;codecs=vp8,opus\",\n \"video/webm\",\n \"video/mp4\",\n ];\n const mimeType =\n candidates.find((m) => MediaRecorder.isTypeSupported(m)) ?? \"\";\n\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n const chunks: Blob[] = [];\n const start = performance.now();\n let timeoutId: number | null = null;\n\n recorder.addEventListener(\"dataavailable\", (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n });\n\n recorder.start();\n timeoutId = window.setTimeout(() => {\n if (recorder.state !== \"inactive\") recorder.stop();\n }, maxSeconds * 1000);\n\n // The user can end the share from the browser's own UI — treat that as\n // a stop so the in-flight recording still resolves.\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n videoTrack.addEventListener(\"ended\", () => {\n if (recorder.state !== \"inactive\") recorder.stop();\n });\n }\n\n function release() {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n timeoutId = null;\n for (const track of stream.getTracks()) track.stop();\n }\n\n return {\n stream,\n cancel() {\n try {\n if (recorder.state !== \"inactive\") recorder.stop();\n } catch {\n /* ignore */\n }\n release();\n },\n stop(): Promise<VideoRecording> {\n return new Promise((resolve, reject) => {\n if (recorder.state === \"inactive\") {\n release();\n reject(new LumenError(\"Recorder already stopped.\", \"RECORDER_STOPPED\"));\n return;\n }\n recorder.addEventListener(\n \"stop\",\n () => {\n const durationMs = performance.now() - start;\n const finalType = recorder.mimeType || mimeType || \"video/webm\";\n const blob = new Blob(chunks, { type: finalType });\n release();\n resolve({ blob, durationMs, mimeType: finalType });\n },\n { once: true },\n );\n recorder.stop();\n });\n },\n };\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type {\n LumenClient,\n CaptureResult,\n ScreenshotCaptureOptions,\n LumenUser,\n SubmitOptions,\n SubmitPayload,\n SubmitResult,\n} from \"@lumen-stack/core\";\n\nexport interface LumenContextValue {\n client: LumenClient;\n user: LumenUser | undefined;\n\n // v2 surface\n open: (event?: Event) => void;\n close: () => void;\n isOpen: boolean;\n /** Pass-through to client.submit — for headless hosts that build their own payload. */\n submit: (\n payload: SubmitPayload,\n options?: SubmitOptions,\n ) => Promise<SubmitResult>;\n /** Best-effort: true when running inside a native shell (RN WebView, Capacitor, …). */\n isNativeShell: boolean;\n /** Capture options from <LumenProvider>. */\n capture: ScreenshotCaptureOptions | undefined;\n /** Screenshot captured before the wizard mounted, when available. */\n initialCapture: CaptureResult | null;\n /** Error from the pre-open capture; the modal falls back to manual upload. */\n initialCaptureError: Error | null;\n /** True while the trigger has been activated and the pre-open capture is running. */\n isOpening: boolean;\n\n // Back-compat aliases (kept; do not remove).\n openCapture: (event?: Event) => void;\n closeCapture: () => void;\n isSubmitting: boolean;\n error: Error | null;\n}\n\nexport const LumenContext = createContext<LumenContextValue | null>(null);\n\nexport function useLumen(): LumenContextValue {\n const ctx = useContext(LumenContext);\n if (!ctx) {\n throw new Error(\"useLumen() must be used inside <LumenProvider>.\");\n }\n return ctx;\n}\n","\"use client\";\n\nimport { useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport * as React from \"react\";\n\nexport type AnnotationTool = \"arrow\" | \"rect\" | \"freehand\";\n\ninterface ArrowAnno {\n kind: \"arrow\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n color: string;\n width: number;\n}\ninterface RectAnno {\n kind: \"rect\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n color: string;\n width: number;\n}\ninterface FreehandAnno {\n kind: \"freehand\";\n points: Array<{ x: number; y: number }>;\n color: string;\n width: number;\n}\ntype Annotation = ArrowAnno | RectAnno | FreehandAnno;\n\nconst HISTORY_LIMIT = 50;\n\nexport interface AnnotationLayerHandle {\n flatten: () => Promise<Blob>;\n reset: () => void;\n undo: () => void;\n hasAnnotations: () => boolean;\n}\n\nexport interface AnnotationLayerProps {\n screenshot: Blob;\n tool: AnnotationTool;\n /** Stroke color (CSS color). Default red-500. */\n color?: string;\n /** Stroke width in bitmap px. Default 4. */\n strokeWidth?: number;\n /** Called when the user starts/stops drawing — used by the modal to\n * lock its scrollable body during a stroke. */\n onDrawingChange?: (drawing: boolean) => void;\n}\n\n// forwardRef so the parent (CaptureModal) can call flatten() imperatively.\n// React 18 does NOT forward `ref` to plain function components — it must be\n// declared with forwardRef. React 19 deprecated forwardRef but still supports\n// it, so this is safe across both major versions.\nexport const AnnotationLayer = React.forwardRef<\n AnnotationLayerHandle,\n AnnotationLayerProps\n>(function AnnotationLayer({\n screenshot,\n tool,\n color = \"rgb(239, 68, 68)\",\n strokeWidth = 4,\n onDrawingChange,\n}, ref) {\n const baseCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const overlayCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [imageBitmap, setImageBitmap] = useState<ImageBitmap | null>(null);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const draftRef = useRef<Annotation | null>(null);\n const isDrawingRef = useRef(false);\n const lastSampleAtRef = useRef(0);\n const rafPendingRef = useRef(false);\n\n // Decode the screenshot once into a bitmap so we can redraw cheaply.\n // In React Strict Mode the effect runs twice on mount — we must close\n // the second-run bitmap and free both via .close() on unmount so we\n // don't leak GPU memory across repeated capture sessions.\n useEffect(() => {\n let cancelled = false;\n let decoded: ImageBitmap | null = null;\n (async () => {\n try {\n const bm = await createImageBitmap(screenshot);\n if (cancelled) {\n bm.close?.();\n return;\n }\n decoded = bm;\n setImageBitmap(bm);\n } catch {\n // Decoding failure leaves the layer in its loading state; the\n // surrounding modal will surface the error via toast on submit.\n }\n })();\n return () => {\n cancelled = true;\n decoded?.close?.();\n };\n }, [screenshot]);\n\n // Size + paint base canvas exactly once per bitmap.\n useEffect(() => {\n if (!imageBitmap) return;\n const base = baseCanvasRef.current;\n const overlay = overlayCanvasRef.current;\n if (!base || !overlay) return;\n base.width = imageBitmap.width;\n base.height = imageBitmap.height;\n overlay.width = imageBitmap.width;\n overlay.height = imageBitmap.height;\n const ctx = base.getContext(\"2d\");\n if (!ctx) return;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(imageBitmap, 0, 0);\n }, [imageBitmap]);\n\n // Repaint the OVERLAY only when annotations change. Base canvas is\n // never touched after the initial draw.\n useEffect(() => {\n const overlay = overlayCanvasRef.current;\n if (!overlay) return;\n redraw(overlay, annotations, draftRef.current);\n }, [annotations]);\n\n useImperativeHandle(\n ref,\n (): AnnotationLayerHandle => ({\n hasAnnotations: () => annotations.length > 0,\n reset: () => setAnnotations([]),\n undo: () =>\n setAnnotations((cur) =>\n cur.length === 0 ? cur : cur.slice(0, -1),\n ),\n async flatten() {\n // Mid-stroke at submit time: bake the live draft so the user\n // doesn't lose the annotation they were drawing when they clicked\n // Send.\n const draft = draftRef.current;\n const all = draft ? [...annotations, draft] : annotations;\n // No annotations → no re-encode. A 2MB PNG screenshot through\n // canvas.toBlob can take 100-300ms on a phone for zero benefit.\n if (all.length === 0) return screenshot;\n if (!imageBitmap) return screenshot;\n const out = document.createElement(\"canvas\");\n out.width = imageBitmap.width;\n out.height = imageBitmap.height;\n const ctx = out.getContext(\"2d\");\n if (!ctx) return screenshot;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(imageBitmap, 0, 0);\n for (const anno of all) drawAnno(ctx, anno);\n // JPEG q=0.85: ~4-10× smaller than PNG for screenshot content,\n // which dominates submit time on slow uplinks. Annotations are\n // simple shapes that survive JPEG without visible artifacts.\n return await new Promise<Blob>((resolve) => {\n out.toBlob(\n (blob) => {\n resolve(blob ?? screenshot);\n },\n \"image/jpeg\",\n 0.85,\n );\n });\n },\n }),\n [annotations, imageBitmap, screenshot],\n );\n\n function clientToCanvas(\n e: React.PointerEvent<HTMLCanvasElement>,\n ): { x: number; y: number } {\n const c = overlayCanvasRef.current;\n if (!c) return { x: 0, y: 0 };\n const rect = c.getBoundingClientRect();\n const sx = c.width / Math.max(rect.width, 1);\n const sy = c.height / Math.max(rect.height, 1);\n return {\n x: (e.clientX - rect.left) * sx,\n y: (e.clientY - rect.top) * sy,\n };\n }\n\n function scheduleDraftPaint() {\n if (rafPendingRef.current) return;\n rafPendingRef.current = true;\n requestAnimationFrame(() => {\n rafPendingRef.current = false;\n const overlay = overlayCanvasRef.current;\n if (!overlay) return;\n redraw(overlay, annotations, draftRef.current);\n });\n }\n\n function onPointerDown(e: React.PointerEvent<HTMLCanvasElement>) {\n if (e.button !== undefined && e.button !== 0) return;\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // iOS Safari can throw NotSupportedError if the pointer is already\n // captured by an ancestor (e.g. the sheet grabber's drag handler).\n // Swallow — capture is a nice-to-have for off-canvas tracking; the\n // stroke still works without it.\n }\n isDrawingRef.current = true;\n onDrawingChange?.(true);\n const p = clientToCanvas(e);\n if (tool === \"arrow\") {\n draftRef.current = { kind: \"arrow\", from: p, to: p, color, width: strokeWidth };\n } else if (tool === \"rect\") {\n draftRef.current = { kind: \"rect\", from: p, to: p, color, width: strokeWidth };\n } else {\n draftRef.current = {\n kind: \"freehand\",\n points: [p],\n color,\n width: strokeWidth,\n };\n }\n lastSampleAtRef.current = performance.now();\n scheduleDraftPaint();\n }\n\n function onPointerMove(e: React.PointerEvent<HTMLCanvasElement>) {\n if (!isDrawingRef.current || !draftRef.current) return;\n const p = clientToCanvas(e);\n const draft = draftRef.current;\n if (draft.kind === \"arrow\" || draft.kind === \"rect\") {\n draft.to = p;\n } else {\n const last = draft.points[draft.points.length - 1];\n const dist2 = last\n ? (last.x - p.x) ** 2 + (last.y - p.y) ** 2\n : Infinity;\n const now = performance.now();\n const elapsed = now - lastSampleAtRef.current;\n // Sample if we've moved ≥ 4 bitmap-px OR ≥ 16ms passed (handles\n // very slow strokes where a single point would otherwise stall).\n if (dist2 > 16 || elapsed > 16) {\n draft.points.push(p);\n lastSampleAtRef.current = now;\n }\n }\n scheduleDraftPaint();\n }\n\n function onPointerUp() {\n if (!isDrawingRef.current) return;\n isDrawingRef.current = false;\n onDrawingChange?.(false);\n const draft = draftRef.current;\n draftRef.current = null;\n if (!draft) return;\n if (draft.kind === \"arrow\" || draft.kind === \"rect\") {\n const dx = draft.to.x - draft.from.x;\n const dy = draft.to.y - draft.from.y;\n if (dx * dx + dy * dy < 16) {\n // Tap — discard. Force a clean overlay repaint so the empty\n // draft doesn't linger.\n const overlay = overlayCanvasRef.current;\n if (overlay) redraw(overlay, annotations, null);\n return;\n }\n } else if (draft.points.length < 2) {\n const overlay = overlayCanvasRef.current;\n if (overlay) redraw(overlay, annotations, null);\n return;\n }\n setAnnotations((cur) => [...cur, draft].slice(-HISTORY_LIMIT));\n }\n\n return (\n <div ref={containerRef} className=\"lumen-annotate-frame\">\n <canvas ref={baseCanvasRef} />\n <canvas\n ref={overlayCanvasRef}\n className=\"lumen-annotate-overlay\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n />\n </div>\n );\n});\n\nfunction redraw(\n canvas: HTMLCanvasElement,\n annotations: Annotation[],\n draft: Annotation | null,\n) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n for (const a of annotations) drawAnno(ctx, a);\n if (draft) drawAnno(ctx, draft);\n}\n\nfunction drawAnno(ctx: CanvasRenderingContext2D, anno: Annotation) {\n ctx.save();\n ctx.strokeStyle = anno.color;\n ctx.fillStyle = anno.color;\n ctx.lineWidth = anno.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n if (anno.kind === \"rect\") {\n const x = Math.min(anno.from.x, anno.to.x);\n const y = Math.min(anno.from.y, anno.to.y);\n const w = Math.abs(anno.to.x - anno.from.x);\n const h = Math.abs(anno.to.y - anno.from.y);\n ctx.strokeRect(x, y, w, h);\n } else if (anno.kind === \"freehand\") {\n drawSmoothPath(ctx, anno.points);\n } else {\n const { from, to, width } = anno;\n ctx.beginPath();\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n ctx.stroke();\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\n const head = Math.max(12, width * 4);\n ctx.beginPath();\n ctx.moveTo(to.x, to.y);\n ctx.lineTo(\n to.x - head * Math.cos(angle - Math.PI / 7),\n to.y - head * Math.sin(angle - Math.PI / 7),\n );\n ctx.lineTo(\n to.x - head * Math.cos(angle + Math.PI / 7),\n to.y - head * Math.sin(angle + Math.PI / 7),\n );\n ctx.closePath();\n ctx.fill();\n }\n\n ctx.restore();\n}\n\n/**\n * Draw a polyline as quadratic curves through midpoints. Each pair of\n * adjacent points contributes one curve where the original point is\n * the control point and the midpoint to the next is the end. This is\n * the standard \"midpoint smoothing\" trick — zero-dep, single pass.\n */\nfunction drawSmoothPath(\n ctx: CanvasRenderingContext2D,\n points: ReadonlyArray<{ x: number; y: number }>,\n) {\n if (points.length === 0) return;\n ctx.beginPath();\n const first = points[0];\n if (!first) return;\n ctx.moveTo(first.x, first.y);\n if (points.length === 1) {\n // Single dot — render a small filled circle so a tap is visible.\n ctx.arc(first.x, first.y, ctx.lineWidth / 2, 0, Math.PI * 2);\n ctx.fill();\n return;\n }\n if (points.length === 2) {\n const second = points[1]!;\n ctx.lineTo(second.x, second.y);\n ctx.stroke();\n return;\n }\n for (let i = 1; i < points.length - 1; i++) {\n const p = points[i]!;\n const next = points[i + 1]!;\n const mx = (p.x + next.x) / 2;\n const my = (p.y + next.y) / 2;\n ctx.quadraticCurveTo(p.x, p.y, mx, my);\n }\n // Final segment to the last point.\n const last = points[points.length - 1]!;\n ctx.lineTo(last.x, last.y);\n ctx.stroke();\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n captureContext,\n captureScreen,\n createManualCaptureResult,\n recordAudio,\n recordVideo,\n type CaptureResult,\n type FeedbackCategory,\n type RecorderHandle,\n type ScreenshotCaptureMode,\n type VideoRecorderHandle,\n} from \"@lumen-stack/core\";\n\nimport { useLumen } from \"./context\";\nimport {\n AnnotationLayer,\n type AnnotationLayerHandle,\n type AnnotationTool,\n} from \"./AnnotationLayer\";\n\nconst VOICE_MAX_SECONDS = 60;\nconst VIDEO_MAX_SECONDS = 60;\n\nconst SWATCHES: ReadonlyArray<{ label: string; value: string }> = [\n { label: \"Red\", value: \"rgb(239, 68, 68)\" },\n { label: \"Amber\", value: \"rgb(245, 158, 11)\" },\n { label: \"Blue\", value: \"rgb(59, 130, 246)\" },\n { label: \"Green\", value: \"rgb(34, 197, 94)\" },\n { label: \"Neutral\", value: \"rgb(244, 244, 245)\" },\n];\n\nconst STROKE_SIZES: ReadonlyArray<{ label: string; value: number; dot: number }> = [\n { label: \"Small\", value: 2, dot: 6 },\n { label: \"Medium\", value: 4, dot: 9 },\n { label: \"Large\", value: 6, dot: 12 },\n];\n\nconst CATEGORIES: ReadonlyArray<{ value: FeedbackCategory; label: string }> = [\n { value: \"bug\", label: \"Bug\" },\n { value: \"feature\", label: \"Idea\" },\n { value: \"other\", label: \"Other\" },\n];\n\ntype CaptureMethod = \"shot\" | \"screen\" | \"video\";\n\nconst METHODS: ReadonlyArray<{ value: CaptureMethod; label: string; hint: string }> = [\n { value: \"shot\", label: \"Screenshot\", hint: \"This page, instantly\" },\n { value: \"screen\", label: \"Screen\", hint: \"Pick a window or tab\" },\n { value: \"video\", label: \"Video\", hint: \"Record up to 60s\" },\n];\n\ntype Step = 1 | 2 | 3;\n\n// Capture sub-state, independent of the wizard step. The annotated artifact\n// lives on `ready`. `idle` = step 1 with nothing captured yet.\ntype Phase =\n | { kind: \"idle\" }\n | { kind: \"capturing\" }\n | { kind: \"manual\"; error?: string }\n | { kind: \"ready\"; capture: CaptureResult };\n\nexport function CaptureModal() {\n const {\n client,\n isOpen,\n closeCapture,\n user,\n capture,\n initialCapture,\n initialCaptureError,\n } = useLumen();\n const [step, setStep] = useState<Step>(1);\n const [method, setMethod] = useState<CaptureMethod | null>(null);\n const [phase, setPhase] = useState<Phase>({ kind: \"idle\" });\n const [submitting, setSubmitting] = useState(false);\n const [progress, setProgress] = useState(0);\n // The annotated screenshot is flattened when leaving step 1 (the only step\n // where AnnotationLayer is mounted) and stashed here, because submit() runs\n // on step 3 where the annotator — and its ref — no longer exist.\n const [flattenedShot, setFlattenedShot] = useState<Blob | null>(null);\n const [wasAnnotated, setWasAnnotated] = useState(false);\n\n const [tool, setTool] = useState<AnnotationTool>(\"arrow\");\n const [strokeColor, setStrokeColor] = useState<string>(SWATCHES[0]!.value);\n const [strokeWidth, setStrokeWidth] = useState<number>(STROKE_SIZES[1]!.value);\n const [text, setText] = useState(\"\");\n const [category, setCategory] = useState<FeedbackCategory>(\"bug\");\n const [submitterEmail, setSubmitterEmail] = useState(user?.email ?? \"\");\n const [recorder, setRecorder] = useState<RecorderHandle | null>(null);\n const [audio, setAudio] = useState<{ blob: Blob; durationMs: number } | null>(\n null,\n );\n const [recordSecs, setRecordSecs] = useState(0);\n const [videoRecorder, setVideoRecorder] =\n useState<VideoRecorderHandle | null>(null);\n const [video, setVideo] = useState<{ blob: Blob; durationMs: number } | null>(\n null,\n );\n const [drawing, setDrawing] = useState(false);\n const annotationRef = useRef<AnnotationLayerHandle>(null);\n const modalRef = useRef<HTMLDivElement | null>(null);\n const previouslyFocusedRef = useRef<HTMLElement | null>(null);\n\n // Cancellation flag for in-flight captures — survives a Strict-Mode double\n // mount or a fast re-open so a stale capture can't stomp the latest phase.\n const captureCancelledRef = useRef(false);\n\n // Reset everything when the modal opens. The default screenshot is captured\n // before the wizard mounts, so Lumen chrome is not present in the shot.\n useEffect(() => {\n if (!isOpen) return;\n captureCancelledRef.current = false;\n setStep(1);\n setMethod(null);\n setText(\"\");\n setAudio(null);\n setRecordSecs(0);\n setVideo(null);\n setSubmitting(false);\n setProgress(0);\n setFlattenedShot(null);\n setWasAnnotated(false);\n setVideoRecorder((cur) => {\n cur?.cancel();\n return null;\n });\n if (initialCapture) {\n setMethod(\"shot\");\n setPhase({ kind: \"ready\", capture: initialCapture });\n } else if (capture?.mode === \"manual\") {\n setPhase({ kind: \"manual\" });\n } else {\n setPhase({\n kind: \"manual\",\n error:\n initialCaptureError?.message ??\n \"Automatic screenshot capture was unavailable.\",\n });\n }\n return () => {\n captureCancelledRef.current = true;\n };\n }, [isOpen, capture, initialCapture, initialCaptureError]);\n\n // Body scroll-lock + remember/restore focus while the modal is open.\n // Restore is wired through pagehide as well, so a navigation or a host\n // app crash while the modal is open can't leave the page unscrollable.\n useEffect(() => {\n if (!isOpen) return;\n previouslyFocusedRef.current =\n (document.activeElement as HTMLElement | null) ?? null;\n const html = document.documentElement;\n const prevOverflow = html.style.overflow;\n const prevPaddingRight = html.style.paddingRight;\n const scrollbar = window.innerWidth - html.clientWidth;\n html.style.overflow = \"hidden\";\n if (scrollbar > 0) html.style.paddingRight = `${scrollbar}px`;\n let restored = false;\n const restore = () => {\n if (restored) return;\n restored = true;\n html.style.overflow = prevOverflow;\n html.style.paddingRight = prevPaddingRight;\n try {\n previouslyFocusedRef.current?.focus?.();\n } catch {\n // focus() can throw if the prior element was removed from DOM.\n }\n };\n window.addEventListener(\"pagehide\", restore);\n return () => {\n window.removeEventListener(\"pagehide\", restore);\n restore();\n };\n }, [isOpen]);\n\n // ESC to close. Tab/Shift-Tab focus trap.\n useEffect(() => {\n if (!isOpen) return;\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n closeCapture();\n return;\n }\n if (e.key !== \"Tab\") return;\n const root = modalRef.current;\n if (!root) return;\n const focusables = getFocusable(root);\n if (focusables.length === 0) return;\n const first = focusables[0]!;\n const last = focusables[focusables.length - 1]!;\n const active = document.activeElement as HTMLElement | null;\n if (e.shiftKey && (active === first || !root.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [isOpen, closeCapture]);\n\n // Paste-to-upload while on the manual-capture fallback.\n useEffect(() => {\n if (!isOpen || phase.kind !== \"manual\") return;\n function onPaste(e: ClipboardEvent) {\n const items = Array.from(e.clipboardData?.items ?? []);\n const image = items.find((item) => item.type.startsWith(\"image/\"));\n const file = image?.getAsFile();\n if (!file) return;\n e.preventDefault();\n acceptManualScreenshot(file);\n }\n window.addEventListener(\"paste\", onPaste);\n return () => window.removeEventListener(\"paste\", onPaste);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, phase.kind]);\n\n // Voice record timer.\n useEffect(() => {\n if (!recorder) return;\n const start = Date.now();\n const id = window.setInterval(() => {\n const sec = Math.floor((Date.now() - start) / 1000);\n setRecordSecs(sec);\n if (sec >= VOICE_MAX_SECONDS) finishRecording();\n }, 250);\n return () => window.clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder]);\n\n if (!isOpen) return null;\n\n // ── Capture ───────────────────────────────────────────────────────────\n async function runCapture(mode: ScreenshotCaptureMode): Promise<boolean> {\n captureCancelledRef.current = false;\n setPhase({ kind: \"capturing\" });\n try {\n const result = await captureScreen({\n ...capture,\n mode,\n target: capture?.target ?? document.documentElement,\n });\n if (captureCancelledRef.current) return false;\n showCaptureWarnings(result);\n setPhase({ kind: \"ready\", capture: result });\n return true;\n } catch (e) {\n if (captureCancelledRef.current) return false;\n setPhase({\n kind: \"manual\",\n error:\n e instanceof Error\n ? e.message\n : \"Automatic screenshot capture was unavailable.\",\n });\n return false;\n }\n }\n\n async function selectMethod(m: CaptureMethod) {\n setMethod(m);\n // A fresh capture invalidates any previously-flattened annotation.\n setFlattenedShot(null);\n if (m !== \"video\") discardVideo();\n if (m === \"shot\") {\n await runCapture(capture?.mode ?? \"auto\");\n } else if (m === \"screen\") {\n await runCapture(\"true-screen\");\n } else {\n // Video still needs a screenshot poster for the required `screenshot`\n // field. Grab a DOM shot first, then start recording.\n const ok = await runCapture(capture?.mode ?? \"auto\");\n if (ok) await startVideo();\n }\n }\n\n function acceptManualScreenshot(file: Blob) {\n if (!file.type.startsWith(\"image/\")) {\n toast.error(\"Choose a PNG, JPEG, or WebP screenshot.\");\n return;\n }\n const result = createManualCaptureResult(file, [\n \"Manual screenshot upload used.\",\n ]);\n setPhase({ kind: \"ready\", capture: result });\n }\n\n function showCaptureWarnings(result: CaptureResult) {\n if (result.warnings.length === 0) return;\n toast.warning(\n \"Screenshot captured, but iframe, video, canvas, or cross-origin content may be incomplete.\",\n );\n }\n\n // ── Voice ─────────────────────────────────────────────────────────────\n async function startRecording() {\n try {\n const r = await recordAudio(VOICE_MAX_SECONDS);\n setRecorder(r);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Microphone unavailable\");\n }\n }\n async function finishRecording() {\n if (!recorder) return;\n try {\n const result = await recorder.stop();\n setAudio({ blob: result.blob, durationMs: result.durationMs });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not stop recording\");\n } finally {\n setRecorder(null);\n }\n }\n function discardRecording() {\n recorder?.cancel();\n setRecorder(null);\n setAudio(null);\n setRecordSecs(0);\n }\n\n // ── Screen recording ──────────────────────────────────────────────────\n async function startVideo() {\n try {\n const r = await recordVideo(VIDEO_MAX_SECONDS);\n setVideoRecorder(r);\n r.stream.getVideoTracks()[0]?.addEventListener(\"ended\", () => {\n void finishVideo();\n });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Screen capture unavailable\");\n }\n }\n async function finishVideo() {\n if (!videoRecorder) return;\n const handle = videoRecorder;\n setVideoRecorder(null);\n try {\n const result = await handle.stop();\n setVideo({ blob: result.blob, durationMs: result.durationMs });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not stop recording\");\n }\n }\n function discardVideo() {\n videoRecorder?.cancel();\n setVideoRecorder(null);\n setVideo(null);\n }\n\n // ── Navigation ────────────────────────────────────────────────────────\n const captured = phase.kind === \"ready\";\n async function goNext() {\n // Finalize a still-running voice note before advancing. Clicking \"Next\"\n // while recording should stop+keep the take, not silently drop it\n // (awaited so the blob is in state by the time submit reads it).\n if (recorder) await finishRecording();\n if (step === 1) {\n // Finalize a still-running recording before advancing so its blob is\n // ready by submit (awaited — not fire-and-forget).\n if (videoRecorder) await finishVideo();\n // Flatten the annotation now, while AnnotationLayer is still mounted.\n if (phase.kind === \"ready\") {\n const flat = await annotationRef.current?.flatten();\n setFlattenedShot(flat ?? phase.capture.blob);\n setWasAnnotated(flat != null && flat !== phase.capture.blob);\n }\n setStep(2);\n } else if (step === 2) {\n setStep(3);\n } else {\n await submit();\n }\n }\n function goBack() {\n if (step > 1) setStep((s) => (s - 1) as Step);\n }\n\n async function submit() {\n if (phase.kind !== \"ready\") return;\n const trimmed = text.trim();\n const { capture: captureResult } = phase;\n setSubmitting(true);\n setProgress(0);\n try {\n // Use the annotation flattened when we left step 1; AnnotationLayer is\n // unmounted by now so we can't re-flatten here.\n const flatScreenshot = flattenedShot ?? captureResult.blob;\n const result = await client.submit(\n {\n rawText: trimmed.length > 0 ? trimmed : undefined,\n category,\n submitterEmail: submitterEmail.trim() || undefined,\n screenshot: flatScreenshot,\n audio: audio?.blob,\n audioDurationMs: audio?.durationMs,\n video: video?.blob,\n videoDurationMs: video?.durationMs,\n context: captureContext(captureResult),\n },\n {\n onUploadProgress: (fraction) => setProgress(Math.min(0.95, fraction)),\n },\n );\n setProgress(1);\n toast.success(\"Feedback sent — thank you.\");\n void result.id;\n closeCapture();\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not submit feedback\");\n setSubmitting(false);\n }\n }\n\n function onBackdropMouseDown(e: React.MouseEvent<HTMLDivElement>) {\n if (e.target === e.currentTarget && !submitting) closeCapture();\n }\n\n const uploadingPct = Math.round(progress * 100);\n const isVideoMethod = method === \"video\";\n const nextDisabled =\n (step === 1 && !captured) || submitting;\n const nextLabel =\n step < 3\n ? \"Next\"\n : submitting\n ? uploadingPct < 95\n ? `Uploading ${uploadingPct}%…`\n : \"Almost done…\"\n : \"Send feedback\";\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Send feedback\"\n className=\"lumen-modal-backdrop\"\n data-lumen-capture-ignore=\"true\"\n onMouseDown={onBackdropMouseDown}\n >\n <div\n ref={modalRef}\n className=\"lumen-modal\"\n data-lumen-drawing={drawing ? \"true\" : undefined}\n >\n <SheetGrabber onDismiss={closeCapture} />\n\n <header className=\"lumen-modal-header\">\n <h2 className=\"lumen-modal-title\">\n <span className=\"lumen-modal-title-dot\" aria-hidden=\"true\" />\n Send feedback\n </h2>\n <button\n type=\"button\"\n onClick={closeCapture}\n className=\"lumen-icon-btn\"\n aria-label=\"Close\"\n >\n ×\n </button>\n </header>\n\n <Stepper step={step} />\n\n <div className=\"lumen-modal-body\">\n {/* ── STEP 1 — Capture ── */}\n {step === 1 ? (\n <div className=\"lumen-pane\">\n <div\n className=\"lumen-method\"\n role=\"group\"\n aria-label=\"Capture method\"\n >\n {METHODS.map((m) => (\n <button\n key={m.value}\n type=\"button\"\n className=\"lumen-method-btn\"\n aria-pressed={method === m.value}\n onClick={() => selectMethod(m.value)}\n disabled={phase.kind === \"capturing\"}\n >\n <span className=\"lumen-method-label\">{m.label}</span>\n <span className=\"lumen-method-hint\">{m.hint}</span>\n </button>\n ))}\n </div>\n\n {phase.kind === \"idle\" ? (\n <div className=\"lumen-cap-empty\">\n <p>\n Pick a capture method above, or upload a screenshot.\n </p>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => setPhase({ kind: \"manual\" })}\n >\n Or upload a screenshot\n </button>\n </div>\n ) : null}\n\n {phase.kind === \"capturing\" ? (\n <p className=\"lumen-status\">\n <span className=\"lumen-spinner\" aria-hidden=\"true\" />\n Capturing…\n </p>\n ) : null}\n\n {phase.kind === \"manual\" ? (\n <div className=\"lumen-manual-capture\">\n <p className=\"lumen-status\">\n {phase.error\n ? \"Automatic capture was unavailable. Upload or paste a screenshot to continue.\"\n : \"Upload or paste a screenshot to continue.\"}\n </p>\n <label className=\"lumen-manual-drop\">\n <span>Choose or paste a screenshot</span>\n <input\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp\"\n onChange={(e) => {\n const file = e.currentTarget.files?.[0];\n if (file) acceptManualScreenshot(file);\n e.currentTarget.value = \"\";\n }}\n />\n </label>\n </div>\n ) : null}\n\n {phase.kind === \"ready\" ? (\n <>\n {!isVideoMethod ? (\n <div className=\"lumen-toolbar\">\n <div\n className=\"lumen-segmented\"\n role=\"group\"\n aria-label=\"Annotation tool\"\n >\n <ToolButton\n label=\"Arrow\"\n active={tool === \"arrow\"}\n onClick={() => setTool(\"arrow\")}\n />\n <ToolButton\n label=\"Box\"\n active={tool === \"rect\"}\n onClick={() => setTool(\"rect\")}\n />\n <ToolButton\n label=\"Draw\"\n active={tool === \"freehand\"}\n onClick={() => setTool(\"freehand\")}\n />\n </div>\n <span className=\"lumen-toolbar-sep\" />\n <div\n className=\"lumen-swatches\"\n role=\"group\"\n aria-label=\"Color\"\n >\n {SWATCHES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n className=\"lumen-swatch\"\n style={{ background: s.value }}\n aria-label={s.label}\n aria-pressed={strokeColor === s.value}\n onClick={() => setStrokeColor(s.value)}\n />\n ))}\n </div>\n <div\n className=\"lumen-stroke-sizes\"\n role=\"group\"\n aria-label=\"Stroke width\"\n >\n {STROKE_SIZES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n className=\"lumen-stroke-size\"\n aria-label={s.label}\n aria-pressed={strokeWidth === s.value}\n onClick={() => setStrokeWidth(s.value)}\n >\n <span\n className=\"lumen-stroke-size-dot\"\n style={{ width: s.dot, height: s.dot }}\n />\n </button>\n ))}\n </div>\n <span className=\"lumen-toolbar-spacer\" />\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => annotationRef.current?.undo()}\n >\n Undo\n </button>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => annotationRef.current?.reset()}\n >\n Clear\n </button>\n </div>\n ) : null}\n\n <div className=\"lumen-annotate\">\n <AnnotationLayer\n ref={annotationRef}\n screenshot={phase.capture.blob}\n tool={tool}\n color={strokeColor}\n strokeWidth={strokeWidth}\n onDrawingChange={setDrawing}\n />\n </div>\n\n <div className=\"lumen-cap-actions\">\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => method && selectMethod(method)}\n >\n {isVideoMethod ? \"↻ Re-record\" : \"↻ Recapture\"}\n </button>\n {isVideoMethod ? (\n videoRecorder ? (\n <span className=\"lumen-recording\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n <span className=\"lumen-rec-time\">Recording…</span>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={finishVideo}\n >\n Stop\n </button>\n </span>\n ) : video ? (\n <span className=\"lumen-cap-note\">\n ✓ {Math.round(video.durationMs / 1000)}s recorded\n </span>\n ) : null\n ) : (\n <span className=\"lumen-cap-note\">\n {captureLabel(method)} captured · switch method above\n anytime\n </span>\n )}\n </div>\n </>\n ) : null}\n </div>\n ) : null}\n\n {/* ── STEP 2 — Describe ── */}\n {step === 2 ? (\n <div className=\"lumen-pane lumen-form\">\n <label className=\"lumen-label\">\n <span>What happened?</span>\n <textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n rows={3}\n placeholder=\"Describe the issue or idea…\"\n className=\"lumen-input\"\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n </label>\n\n <div className=\"lumen-label\">\n <span>Add a voice note (optional)</span>\n <div className=\"lumen-audio-row\">\n {!recorder && !audio ? (\n <button\n type=\"button\"\n onClick={startRecording}\n className=\"lumen-btn-ghost\"\n >\n Record voice note\n </button>\n ) : null}\n {recorder ? (\n <>\n <span className=\"lumen-recording\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n <Waveform stream={recorder.stream} />\n <span className=\"lumen-rec-time\">\n {recordSecs}s / {VOICE_MAX_SECONDS}s\n </span>\n </span>\n <button\n type=\"button\"\n onClick={finishRecording}\n className=\"lumen-btn-ghost\"\n >\n Stop\n </button>\n <button\n type=\"button\"\n onClick={discardRecording}\n className=\"lumen-btn-ghost\"\n >\n Cancel\n </button>\n </>\n ) : null}\n {audio && !recorder ? (\n <>\n <AudioPreview\n blob={audio.blob}\n durationMs={audio.durationMs}\n />\n <button\n type=\"button\"\n onClick={() => setAudio(null)}\n className=\"lumen-btn-ghost\"\n >\n Remove\n </button>\n </>\n ) : null}\n </div>\n </div>\n\n <div className=\"lumen-label\">\n <span>Category</span>\n <div\n className=\"lumen-category\"\n role=\"group\"\n aria-label=\"Feedback category\"\n >\n {CATEGORIES.map((c) => (\n <button\n key={c.value}\n type=\"button\"\n className=\"lumen-category-opt\"\n aria-pressed={category === c.value}\n onClick={() => setCategory(c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n </div>\n\n <label className=\"lumen-label\">\n <span>Your email (optional)</span>\n <input\n type=\"email\"\n value={submitterEmail}\n onChange={(e) => setSubmitterEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className=\"lumen-input\"\n />\n </label>\n </div>\n ) : null}\n\n {/* ── STEP 3 — Review ── */}\n {step === 3 ? (\n <div className=\"lumen-pane lumen-review\">\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Capture</span>\n <span className=\"lumen-review-v\">\n {captureLabel(method)}\n {wasAnnotated ? \" · annotated\" : \"\"}\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(1)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Category</span>\n <span className=\"lumen-review-v\">\n <span className=\"lumen-chip\">\n {CATEGORIES.find((c) => c.value === category)?.label}\n </span>\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(2)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Description</span>\n <span className=\"lumen-review-v\">\n {text.trim() ? (\n text.trim()\n ) : (\n <span className=\"lumen-muted-empty\">—</span>\n )}\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(2)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Material</span>\n <span className=\"lumen-review-v lumen-attach-row\">\n {audio ? (\n <span className=\"lumen-attach\">\n 🎙 Voice {Math.round(audio.durationMs / 1000)}s\n <button\n type=\"button\"\n className=\"lumen-att-x\"\n aria-label=\"Remove voice note\"\n onClick={() => setAudio(null)}\n >\n ×\n </button>\n </span>\n ) : null}\n {video ? (\n <span className=\"lumen-attach\">\n ▶ Video {Math.round(video.durationMs / 1000)}s\n <button\n type=\"button\"\n className=\"lumen-att-x\"\n aria-label=\"Remove video\"\n onClick={discardVideo}\n >\n ×\n </button>\n </span>\n ) : null}\n {submitterEmail.trim() ? (\n <span className=\"lumen-attach\">✉ {submitterEmail.trim()}</span>\n ) : null}\n {!audio && !recorder ? (\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={() => {\n setStep(2);\n void startRecording();\n }}\n >\n + Voice note\n </button>\n ) : null}\n {videoRecorder ? (\n <>\n <span className=\"lumen-attach\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n Recording…\n </span>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={finishVideo}\n >\n Stop\n </button>\n </>\n ) : !video ? (\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={startVideo}\n >\n + Screen recording\n </button>\n ) : null}\n </span>\n </div>\n </div>\n ) : null}\n </div>\n\n <footer className=\"lumen-modal-footer\">\n {submitting ? (\n <div\n className=\"lumen-progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={uploadingPct}\n >\n <div\n className=\"lumen-progress-fill\"\n style={{ width: `${uploadingPct}%` }}\n />\n </div>\n ) : null}\n <div className=\"lumen-modal-actions\">\n <button\n type=\"button\"\n onClick={step === 1 ? closeCapture : goBack}\n className=\"lumen-btn-ghost\"\n disabled={submitting}\n >\n {step === 1 ? \"Cancel\" : \"Back\"}\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n className=\"lumen-btn-primary\"\n disabled={nextDisabled}\n >\n {nextLabel}\n </button>\n </div>\n </footer>\n </div>\n </div>\n );\n}\n\nfunction captureLabel(method: CaptureMethod | null): string {\n if (method === \"video\") return \"Screen recording\";\n if (method === \"screen\") return \"Screen capture\";\n return \"Screenshot\";\n}\n\nfunction Stepper({ step }: { step: Step }) {\n const steps = [\n { n: 1, label: \"Capture\" },\n { n: 2, label: \"Describe\" },\n { n: 3, label: \"Review\" },\n ] as const;\n return (\n <div className=\"lumen-stepper\" aria-hidden=\"true\">\n {steps.map((s, i) => (\n <div\n key={s.n}\n className={\n \"lumen-step\" +\n (step === s.n ? \" lumen-step-active\" : \"\") +\n (step > s.n ? \" lumen-step-done\" : \"\")\n }\n >\n <span className=\"lumen-step-num\">{s.n}</span>\n <span className=\"lumen-step-lbl\">{s.label}</span>\n {i < steps.length - 1 ? <span className=\"lumen-step-bar\" /> : null}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ToolButton({\n label,\n active,\n onClick,\n}: {\n label: string;\n active: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"lumen-tool\"\n aria-pressed={active}\n >\n {label}\n </button>\n );\n}\n\n/** Mobile sheet drag-to-dismiss handle. Hidden on ≥ 640px via CSS. */\nfunction SheetGrabber({ onDismiss }: { onDismiss: () => void }) {\n const startYRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n const targetRef = useRef<HTMLElement | null>(null);\n\n function onPointerDown(e: React.PointerEvent<HTMLDivElement>) {\n e.currentTarget.setPointerCapture(e.pointerId);\n startYRef.current = e.clientY;\n startTimeRef.current = performance.now();\n targetRef.current = e.currentTarget.parentElement;\n }\n function onPointerMove(e: React.PointerEvent<HTMLDivElement>) {\n if (startYRef.current == null || !targetRef.current) return;\n const dy = Math.max(0, e.clientY - startYRef.current);\n targetRef.current.style.transform = `translateY(${dy}px)`;\n }\n function onPointerUp(e: React.PointerEvent<HTMLDivElement>) {\n if (startYRef.current == null || !targetRef.current) return;\n const dy = Math.max(0, e.clientY - startYRef.current);\n const dt = Math.max(1, performance.now() - startTimeRef.current);\n const velocity = dy / dt;\n targetRef.current.style.transform = \"\";\n targetRef.current.style.transition = \"\";\n startYRef.current = null;\n if (dy > 80 || velocity > 0.6) onDismiss();\n }\n\n return (\n <div\n className=\"lumen-modal-grabber\"\n aria-hidden=\"true\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n />\n );\n}\n\n/** Live mic level visualisation. Reads time-domain samples from the\n * recorder stream and renders a centred series of rounded bars that\n * ease toward each new amplitude. AudioContext + AnalyserNode are torn\n * down on unmount so the mic isn't held open by a stale graph. */\nfunction Waveform({ stream }: { stream: MediaStream }) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n const cssWidth = canvas.clientWidth || 88;\n const cssHeight = canvas.clientHeight || 22;\n canvas.width = Math.round(cssWidth * dpr);\n canvas.height = Math.round(cssHeight * dpr);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.scale(dpr, dpr);\n\n const AudioCtor: typeof AudioContext | undefined =\n window.AudioContext ??\n (window as unknown as { webkitAudioContext?: typeof AudioContext })\n .webkitAudioContext;\n if (!AudioCtor) return;\n const audioCtx = new AudioCtor();\n const source = audioCtx.createMediaStreamSource(stream);\n const analyser = audioCtx.createAnalyser();\n analyser.fftSize = 1024;\n analyser.smoothingTimeConstant = 0.6;\n source.connect(analyser);\n const data = new Uint8Array(analyser.fftSize);\n\n const BARS = 18;\n const GAP = 3;\n const MIN_H = 3;\n const barW = Math.max(2, (cssWidth - GAP * (BARS - 1)) / BARS);\n const radius = Math.min(barW / 2, 3);\n const levels = new Array<number>(BARS).fill(0);\n\n let raf = 0;\n let cancelled = false;\n function frame() {\n if (cancelled) return;\n analyser.getByteTimeDomainData(data);\n const bucketSize = Math.floor(data.length / BARS);\n ctx!.clearRect(0, 0, cssWidth, cssHeight);\n ctx!.fillStyle = getCssVar(\"--lumen-danger\") || \"rgb(239,68,68)\";\n for (let i = 0; i < BARS; i++) {\n let peak = 0;\n for (let j = 0; j < bucketSize; j++) {\n const v = Math.abs((data[i * bucketSize + j] ?? 128) - 128);\n if (v > peak) peak = v;\n }\n const target = Math.min(1, (peak / 128) * 1.8);\n const cur = levels[i] ?? 0;\n levels[i] = target > cur ? target : cur + (target - cur) * 0.35;\n const h = Math.max(MIN_H, levels[i]! * cssHeight);\n const x = i * (barW + GAP);\n const y = (cssHeight - h) / 2;\n roundRectPath(ctx!, x, y, barW, h, radius);\n ctx!.fill();\n }\n raf = requestAnimationFrame(frame);\n }\n raf = requestAnimationFrame(frame);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(raf);\n try {\n source.disconnect();\n } catch {\n /* ignore */\n }\n void audioCtx.close();\n };\n }, [stream]);\n\n return <canvas ref={canvasRef} className=\"lumen-waveform\" aria-hidden=\"true\" />;\n}\n\n/** Trace a rounded-rect path. Uses native `roundRect` when present and\n * falls back to manual arcs for older Safari/Firefox. */\nfunction roundRectPath(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): void {\n const radius = Math.min(r, w / 2, h / 2);\n ctx.beginPath();\n const anyCtx = ctx as CanvasRenderingContext2D & {\n roundRect?: (x: number, y: number, w: number, h: number, r: number) => void;\n };\n if (typeof anyCtx.roundRect === \"function\") {\n anyCtx.roundRect(x, y, w, h, radius);\n return;\n }\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n}\n\n/** Preview the recorded clip with a native <audio> element. ObjectURL is\n * revoked on unmount/swap to avoid leaking the blob into memory. */\nfunction AudioPreview({ blob, durationMs }: { blob: Blob; durationMs: number }) {\n const [url, setUrl] = useState<string>(\"\");\n useEffect(() => {\n const u = URL.createObjectURL(blob);\n setUrl(u);\n return () => {\n URL.revokeObjectURL(u);\n };\n }, [blob]);\n return (\n <div className=\"lumen-audio-preview\">\n <audio controls preload=\"metadata\" src={url} className=\"lumen-audio-el\" />\n <span className=\"lumen-audio-meta\">{Math.round(durationMs / 1000)}s</span>\n </div>\n );\n}\n\nfunction getCssVar(name: string): string {\n if (typeof window === \"undefined\") return \"\";\n return getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n}\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction getFocusable(root: HTMLElement): HTMLElement[] {\n return Array.from(\n root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((el) => !el.hasAttribute(\"disabled\") && el.offsetParent !== null);\n}\n","/**\n * Heuristic floor detector. Returns the height (px) of the tallest\n * full-width fixed element anchored near the bottom of the viewport\n * (e.g. a tab bar). 0 if nothing matches.\n *\n * Cheap by design: probes `elementsFromPoint` at three x positions,\n * walks up parents, dedupes. O(small constant) — the spec's literal\n * `querySelectorAll('*')` would be O(DOM) per measurement.\n */\nexport function detectBottomFloor(): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const w = window.innerWidth;\n const h = window.innerHeight;\n if (w === 0 || h === 0) return 0;\n\n const probeY = h - 4;\n const probeXs = [Math.round(w * 0.1), Math.round(w * 0.5), Math.round(w * 0.9)];\n const seen = new Set<Element>();\n let tallest = 0;\n\n for (const x of probeXs) {\n const stack = document.elementsFromPoint(x, probeY);\n for (const el of stack) {\n if (seen.has(el)) continue;\n seen.add(el);\n const cs = window.getComputedStyle(el);\n if (cs.position !== \"fixed\" && cs.position !== \"sticky\") continue;\n const rect = el.getBoundingClientRect();\n // Anchored at bottom: rect.bottom is within ~8px of viewport bottom.\n if (rect.bottom < h - 8) continue;\n if (rect.bottom > h + 8) continue;\n // Full-width-ish: at least 60% of the viewport.\n if (rect.width < w * 0.6) continue;\n if (rect.height > tallest) tallest = rect.height;\n }\n }\n return tallest;\n}\n\n/**\n * Measure the bottom-overlap of every node matching the given selectors.\n * Returns the tallest overlap.\n */\nexport function measureExplicitAvoid(selectors: string[]): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const h = window.innerHeight;\n let tallest = 0;\n for (const selector of selectors) {\n let nodes: NodeListOf<Element>;\n try {\n nodes = document.querySelectorAll(selector);\n } catch {\n continue;\n }\n for (const node of Array.from(nodes)) {\n const rect = node.getBoundingClientRect();\n if (rect.height === 0 || rect.width === 0) continue;\n // Bottom-overlap = how far the node extends above the bottom edge,\n // assuming it's anchored to the bottom (rect.bottom near h).\n if (rect.bottom < h - 8) continue;\n const overlap = Math.max(0, h - rect.top);\n if (overlap > tallest) tallest = overlap;\n }\n }\n return tallest;\n}\n\n/**\n * Same idea as measureExplicitAvoid but for any of the four edges.\n * Returns inset to add for the given side.\n */\nexport function measureExplicitAvoidForSide(\n selectors: string[],\n side: \"top\" | \"bottom\" | \"left\" | \"right\",\n): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const w = window.innerWidth;\n const h = window.innerHeight;\n let tallest = 0;\n for (const selector of selectors) {\n let nodes: NodeListOf<Element>;\n try {\n nodes = document.querySelectorAll(selector);\n } catch {\n continue;\n }\n for (const node of Array.from(nodes)) {\n const rect = node.getBoundingClientRect();\n if (rect.height === 0 || rect.width === 0) continue;\n let overlap = 0;\n switch (side) {\n case \"bottom\":\n if (rect.bottom < h - 8) break;\n overlap = Math.max(0, h - rect.top);\n break;\n case \"top\":\n if (rect.top > 8) break;\n overlap = Math.max(0, rect.bottom);\n break;\n case \"left\":\n if (rect.left > 8) break;\n overlap = Math.max(0, rect.right);\n break;\n case \"right\":\n if (rect.right < w - 8) break;\n overlap = Math.max(0, w - rect.left);\n break;\n }\n if (overlap > tallest) tallest = overlap;\n }\n }\n return tallest;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport {\n detectBottomFloor,\n measureExplicitAvoidForSide,\n} from \"./autoDetectAvoid\";\nimport type { ResolvedFloatingConfig } from \"./types\";\n\nexport interface CollisionInsets {\n bottom: number;\n right: number;\n left: number;\n top: number;\n}\n\n/**\n * Computes the inset (px, before safe-area) the floating trigger needs\n * for its anchored corner. Subscribes to:\n * - ResizeObserver on documentElement\n * - MutationObserver on document.body (childList/attributes)\n * - visualViewport resize/scroll\n *\n * All callbacks coalesce into a single rAF measure to avoid feedback\n * loops where our CSS-var write triggers the next observer fire.\n */\nexport function useCollisionInsets(\n config: ResolvedFloatingConfig,\n): CollisionInsets {\n const [insets, setInsets] = useState<CollisionInsets>(() => ({\n bottom: config.offset.y,\n right: config.offset.x,\n left: config.offset.x,\n top: config.offset.y,\n }));\n\n // Hold the latest insets in a ref so the rAF body can compare without\n // capturing stale state.\n const lastRef = useRef(insets);\n\n // Stable identifier for the avoid array so the effect doesn't re-run\n // every render when callers pass an inline array.\n const avoidKey = avoidToKey(config.avoid);\n const placement = config.placement;\n const offsetX = config.offset.x;\n const offsetY = config.offset.y;\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let raf = 0;\n let cancelled = false;\n\n const measure = () => {\n raf = 0;\n if (cancelled) return;\n\n const side = placement[0] === \"b\" ? \"bottom\" : \"top\";\n const xSide = placement[1] === \"r\" ? \"right\" : \"left\";\n\n let yExtra = 0;\n let xExtra = 0;\n if (config.avoid === \"auto\" && side === \"bottom\") {\n yExtra = detectBottomFloor();\n } else if (Array.isArray(config.avoid)) {\n yExtra = measureExplicitAvoidForSide(config.avoid, side);\n xExtra = measureExplicitAvoidForSide(config.avoid, xSide);\n }\n\n const next: CollisionInsets = {\n bottom: side === \"bottom\" ? offsetY + yExtra : 0,\n top: side === \"top\" ? offsetY + yExtra : 0,\n right: xSide === \"right\" ? offsetX + xExtra : 0,\n left: xSide === \"left\" ? offsetX + xExtra : 0,\n };\n const prev = lastRef.current;\n if (\n next.bottom !== prev.bottom ||\n next.top !== prev.top ||\n next.right !== prev.right ||\n next.left !== prev.left\n ) {\n lastRef.current = next;\n setInsets(next);\n }\n };\n\n const schedule = () => {\n if (raf) return;\n raf = window.requestAnimationFrame(measure);\n };\n\n schedule();\n\n const ro =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(schedule)\n : null;\n ro?.observe(document.documentElement);\n\n const mo =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(schedule)\n : null;\n mo?.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"hidden\"],\n });\n\n window.addEventListener(\"resize\", schedule);\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", schedule);\n vv?.addEventListener(\"scroll\", schedule);\n\n return () => {\n cancelled = true;\n if (raf) window.cancelAnimationFrame(raf);\n ro?.disconnect();\n mo?.disconnect();\n window.removeEventListener(\"resize\", schedule);\n vv?.removeEventListener(\"resize\", schedule);\n vv?.removeEventListener(\"scroll\", schedule);\n };\n // `config.avoid` is captured via avoidKey; safe to ignore in deps.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [placement, offsetX, offsetY, avoidKey]);\n\n return insets;\n}\n\nfunction avoidToKey(avoid: string[] | false | \"auto\"): string {\n if (avoid === false) return \"false\";\n if (avoid === \"auto\") return \"auto\";\n return avoid.join(\"|\");\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * True when the on-screen keyboard is likely visible (visualViewport has\n * shrunk by >100px). Touch devices only — desktop never returns true.\n */\nexport function useViewportKeyboard(enabled: boolean): boolean {\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n if (!enabled) {\n setOpen(false);\n return;\n }\n if (typeof window === \"undefined\") return;\n const vv = window.visualViewport;\n if (!vv) return;\n if (\n typeof window.matchMedia !== \"function\" ||\n !window.matchMedia(\"(pointer: coarse)\").matches\n ) {\n return;\n }\n\n const KEYBOARD_THRESHOLD = 100;\n let raf = 0;\n const check = () => {\n raf = 0;\n const shrink = window.innerHeight - vv.height;\n setOpen(shrink > KEYBOARD_THRESHOLD);\n };\n const schedule = () => {\n if (raf) return;\n raf = window.requestAnimationFrame(check);\n };\n\n schedule();\n vv.addEventListener(\"resize\", schedule);\n vv.addEventListener(\"scroll\", schedule);\n return () => {\n if (raf) window.cancelAnimationFrame(raf);\n vv.removeEventListener(\"resize\", schedule);\n vv.removeEventListener(\"scroll\", schedule);\n };\n }, [enabled]);\n\n return open;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport * as React from \"react\";\n\nimport { useCollisionInsets } from \"./useCollisionInsets\";\nimport { useViewportKeyboard } from \"./useViewportKeyboard\";\nimport type { ResolvedFloatingConfig } from \"./types\";\n\nexport interface FloatingTriggerProps {\n config: ResolvedFloatingConfig;\n portalTarget?: HTMLElement;\n hidden: boolean;\n onPointerDown?: (event: PointerEvent) => void;\n onClick: (event: MouseEvent) => void;\n}\n\nexport function FloatingTrigger({\n config,\n portalTarget,\n hidden,\n onPointerDown,\n onClick,\n}: FloatingTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const insets = useCollisionInsets(config);\n const keyboardOpen = useViewportKeyboard(config.hideOnKeyboard);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setTarget(portalTarget ?? document.body);\n }, [portalTarget]);\n\n useOcclusionWarning(buttonRef, !hidden && !keyboardOpen);\n\n if (!target) return null;\n\n const placement = config.placement;\n const sideY = placement[0] === \"b\" ? \"bottom\" : \"top\";\n const sideX = placement[1] === \"r\" ? \"right\" : \"left\";\n\n const yPx = sideY === \"bottom\" ? insets.bottom : insets.top;\n const xPx = sideX === \"right\" ? insets.right : insets.left;\n\n const style: React.CSSProperties = {\n position: \"fixed\",\n [sideY]: config.safeArea\n ? `calc(${yPx}px + env(safe-area-inset-${sideY}, 0px))`\n : `${yPx}px`,\n [sideX]: config.safeArea\n ? `calc(${xPx}px + env(safe-area-inset-${sideX}, 0px))`\n : `${xPx}px`,\n zIndex: config.zIndex,\n opacity: hidden || keyboardOpen ? 0 : 1,\n pointerEvents: hidden || keyboardOpen ? \"none\" : \"auto\",\n transition: \"opacity 160ms ease\",\n };\n\n return createPortal(\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"lumen-btn lumen-btn-primary lumen-btn-floating\"\n style={style}\n aria-label={config.label}\n aria-hidden={hidden || keyboardOpen ? true : undefined}\n tabIndex={hidden || keyboardOpen ? -1 : 0}\n onPointerDown={(event) => onPointerDown?.(event.nativeEvent)}\n onClick={(event) => onClick(event.nativeEvent)}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n {config.icon}\n <span>{config.label}</span>\n </button>,\n target,\n );\n}\n\n/**\n * Dev-only: after the first stable measurement, sample the trigger's\n * center point and warn once if a higher-z-index element overlaps it.\n */\nfunction useOcclusionWarning(\n ref: React.RefObject<HTMLButtonElement | null>,\n active: boolean,\n) {\n const warnedRef = useRef(false);\n\n useEffect(() => {\n if (process.env.NODE_ENV === \"production\") return;\n if (!active) return;\n if (warnedRef.current) return;\n if (typeof window === \"undefined\") return;\n\n const t = window.setTimeout(() => {\n const el = ref.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const stack = document.elementsFromPoint(cx, cy);\n const ourZ = parseZ(window.getComputedStyle(el).zIndex);\n for (const candidate of stack) {\n if (candidate === el || el.contains(candidate)) continue;\n const cz = parseZ(window.getComputedStyle(candidate).zIndex);\n if (cz > ourZ) {\n warnedRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\"[lumen] trigger is occluded by\", candidate);\n break;\n }\n }\n }, 250);\n return () => window.clearTimeout(t);\n }, [active, ref]);\n}\n\nfunction parseZ(z: string): number {\n const n = parseInt(z, 10);\n return Number.isNaN(n) ? 0 : n;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { ReactNode, RefObject } from \"react\";\n\nexport interface InlineTriggerProps {\n mount: HTMLElement | RefObject<HTMLElement | null>;\n label: string;\n icon?: ReactNode;\n onPointerDown?: (event: PointerEvent) => void;\n onClick: (event: MouseEvent) => void;\n}\n\nexport function InlineTrigger({\n mount,\n label,\n icon,\n onPointerDown,\n onClick,\n}: InlineTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const el =\n mount instanceof HTMLElement ? mount : (mount.current ?? null);\n setTarget(el);\n }, [mount]);\n\n if (!target) return null;\n\n return createPortal(\n <button\n type=\"button\"\n className=\"lumen-btn lumen-btn-primary\"\n onPointerDown={(event) => onPointerDown?.(event.nativeEvent)}\n onClick={(event) => onClick(event.nativeEvent)}\n aria-label={label}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n {icon}\n <span>{label}</span>\n </button>,\n target,\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type { ResolvedNotchConfig } from \"./types\";\n\nexport interface NotchTriggerProps {\n config: ResolvedNotchConfig;\n portalTarget?: HTMLElement;\n hidden: boolean;\n onPointerDown?: (event: PointerEvent) => void;\n onClick: (event: MouseEvent | PointerEvent) => void;\n}\n\n/**\n * Edge-anchored notch. The resting state is a small tab on a screen\n * edge; on hover/tap it expands and opens the capture modal. A short\n * drag away from the edge (>16px) also opens, mimicking the iOS\n * Dynamic-Island pull gesture.\n *\n * Top edge → drag down. Right edge → drag left. Etc.\n */\nexport function NotchTrigger({\n config,\n portalTarget,\n hidden,\n onPointerDown: onActivatePointerDown,\n onClick,\n}: NotchTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n const [expanded, setExpanded] = useState(false);\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setTarget(portalTarget ?? document.body);\n }, [portalTarget]);\n\n if (!target) return null;\n\n const className = `lumen-notch lumen-notch-${config.edge}${\n expanded ? \" lumen-notch-expanded\" : \"\"\n }`;\n\n function onPointerDown(e: React.PointerEvent<HTMLButtonElement>) {\n onActivatePointerDown?.(e.nativeEvent);\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n setExpanded(true);\n e.currentTarget.setPointerCapture(e.pointerId);\n }\n function onPointerMove(e: React.PointerEvent<HTMLButtonElement>) {\n const start = dragStartRef.current;\n if (!start) return;\n const dx = e.clientX - start.x;\n const dy = e.clientY - start.y;\n const triggered =\n (config.edge === \"top\" && dy > 16) ||\n (config.edge === \"bottom\" && dy < -16) ||\n (config.edge === \"right\" && dx < -16) ||\n (config.edge === \"left\" && dx > 16);\n if (triggered) {\n dragStartRef.current = null;\n onClick(e.nativeEvent);\n }\n }\n function onPointerUp() {\n dragStartRef.current = null;\n setExpanded(false);\n }\n function onPointerCancel() {\n dragStartRef.current = null;\n setExpanded(false);\n }\n\n return createPortal(\n <button\n type=\"button\"\n className={className}\n style={{\n zIndex: config.zIndex,\n opacity: hidden ? 0 : 1,\n pointerEvents: hidden ? \"none\" : \"auto\",\n }}\n aria-label={config.label}\n aria-hidden={hidden ? true : undefined}\n tabIndex={hidden ? -1 : 0}\n onClick={(event) => onClick(event.nativeEvent)}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n onMouseEnter={() => setExpanded(true)}\n onMouseLeave={() => setExpanded(false)}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n <span className=\"lumen-notch-handle\" aria-hidden=\"true\" />\n <span className=\"lumen-notch-label\">{config.icon}{config.label}</span>\n </button>,\n target,\n );\n}\n","import type { ReactNode, RefObject } from \"react\";\n\nexport type LumenTriggerPlacement = \"br\" | \"bl\" | \"tr\" | \"tl\";\n\nexport interface FloatingTriggerConfig {\n kind: \"floating\";\n placement?: LumenTriggerPlacement;\n offset?: { x?: number; y?: number };\n safeArea?: boolean;\n /** Selectors to clear; pass `false` to disable auto-detect entirely. */\n avoid?: string | string[] | false;\n hideOnKeyboard?: boolean;\n zIndex?: number;\n label?: string;\n icon?: ReactNode;\n}\n\nexport type NotchEdge = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface NotchTriggerConfig {\n kind: \"notch\";\n edge?: NotchEdge;\n label?: string;\n icon?: ReactNode;\n /** z-index for the notch tab. Default 2147483600. */\n zIndex?: number;\n}\n\nexport interface ResolvedNotchConfig {\n kind: \"notch\";\n edge: NotchEdge;\n label: string;\n icon: ReactNode | undefined;\n zIndex: number;\n}\n\nexport function resolveNotchConfig(\n cfg: NotchTriggerConfig,\n): ResolvedNotchConfig {\n return {\n kind: \"notch\",\n edge: cfg.edge ?? \"top\",\n label: cfg.label ?? \"Feedback\",\n icon: cfg.icon,\n zIndex: cfg.zIndex ?? 2147483600,\n };\n}\n\nexport interface HeadlessTriggerConfig {\n kind: \"headless\";\n}\n\nexport interface InlineTriggerConfig {\n kind: \"inline\";\n mount: HTMLElement | RefObject<HTMLElement | null>;\n label?: string;\n icon?: ReactNode;\n}\n\nexport type LumenTrigger =\n | FloatingTriggerConfig\n | NotchTriggerConfig\n | HeadlessTriggerConfig\n | InlineTriggerConfig;\n\nexport type LumenTheme =\n | \"auto\"\n | \"light\"\n | \"dark\"\n | {\n background?: string;\n foreground?: string;\n accent?: string;\n radius?: string;\n };\n\nexport interface ResolvedFloatingConfig {\n kind: \"floating\";\n placement: LumenTriggerPlacement;\n offset: { x: number; y: number };\n safeArea: boolean;\n avoid: string[] | false | \"auto\";\n hideOnKeyboard: boolean;\n zIndex: number;\n label: string;\n icon: ReactNode | undefined;\n}\n\nexport function resolveFloatingConfig(\n cfg: FloatingTriggerConfig,\n): ResolvedFloatingConfig {\n return {\n kind: \"floating\",\n placement: cfg.placement ?? \"br\",\n offset: { x: cfg.offset?.x ?? 16, y: cfg.offset?.y ?? 16 },\n safeArea: cfg.safeArea ?? true,\n avoid:\n cfg.avoid === false\n ? false\n : cfg.avoid == null\n ? \"auto\"\n : Array.isArray(cfg.avoid)\n ? cfg.avoid\n : [cfg.avoid],\n hideOnKeyboard: cfg.hideOnKeyboard ?? true,\n zIndex: cfg.zIndex ?? 2147483600,\n label: cfg.label ?? \"Feedback\",\n icon: cfg.icon,\n };\n}\n","\"use client\";\n\nimport { useEffect, useId } from \"react\";\nimport type { LumenTheme } from \"./types\";\n\nconst VAR_MAP: Record<string, keyof Extract<LumenTheme, object>> = {\n \"--lumen-bg\": \"background\",\n \"--lumen-fg\": \"foreground\",\n \"--lumen-primary\": \"accent\",\n \"--lumen-radius\": \"radius\",\n};\n\n/**\n * Applies the theme by writing CSS variables to <html> (so they reach\n * the portaled CaptureModal) and toggling a data attribute for explicit\n * light/dark. Cleanup restores prior values on unmount.\n *\n * The instance id scopes attribute cleanup so two providers don't\n * stomp each other.\n */\nexport function useApplyTheme(theme: LumenTheme | undefined): void {\n const instanceId = useId();\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const attr = `data-lumen-theme-${slug(instanceId)}`;\n const previous: Record<string, string | null> = {};\n\n if (theme === \"auto\" || theme == null) {\n // Default: rely on prefers-color-scheme already in styles.css.\n root.removeAttribute(\"data-lumen-theme\");\n } else if (theme === \"light\" || theme === \"dark\") {\n previous[\"data-lumen-theme\"] = root.getAttribute(\"data-lumen-theme\");\n root.setAttribute(\"data-lumen-theme\", theme);\n } else {\n for (const [cssVar, key] of Object.entries(VAR_MAP)) {\n const v = theme[key as keyof typeof theme];\n if (typeof v === \"string\" && v.length > 0) {\n previous[cssVar] = root.style.getPropertyValue(cssVar) || null;\n root.style.setProperty(cssVar, v);\n }\n }\n }\n root.setAttribute(attr, \"\");\n\n return () => {\n root.removeAttribute(attr);\n for (const [k, v] of Object.entries(previous)) {\n if (k.startsWith(\"--\")) {\n if (v) root.style.setProperty(k, v);\n else root.style.removeProperty(k);\n } else if (v == null) {\n root.removeAttribute(k);\n } else {\n root.setAttribute(k, v);\n }\n }\n };\n }, [theme, instanceId]);\n}\n\nfunction slug(s: string): string {\n return s.replace(/[^a-zA-Z0-9]/g, \"\");\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst PATCH_FLAG = Symbol.for(\"lumen.history.patched\");\nconst EVENT_NAME = \"lumen:locationchange\";\n\ninterface PatchedWindow extends Window {\n [PATCH_FLAG]?: true;\n}\n\n/**\n * Idempotent global patch: monkey-patches pushState/replaceState exactly\n * once per window so any number of LumenProvider instances (and React\n * StrictMode double-mounts) can subscribe without stacking patches.\n */\nfunction ensureHistoryPatch(): void {\n if (typeof window === \"undefined\") return;\n const w = window as PatchedWindow;\n if (w[PATCH_FLAG]) return;\n w[PATCH_FLAG] = true;\n\n const dispatch = () => window.dispatchEvent(new Event(EVENT_NAME));\n\n const origPush = history.pushState;\n history.pushState = function (...args: Parameters<History[\"pushState\"]>) {\n const r = origPush.apply(this, args);\n dispatch();\n return r;\n };\n const origReplace = history.replaceState;\n history.replaceState = function (\n ...args: Parameters<History[\"replaceState\"]>\n ) {\n const r = origReplace.apply(this, args);\n dispatch();\n return r;\n };\n window.addEventListener(\"popstate\", dispatch);\n}\n\n/**\n * Returns true when `predicate(location)` returns true for the current\n * location. Re-evaluates on history changes.\n */\nexport function useHideOn(\n predicate: ((location: { pathname: string }) => boolean) | undefined,\n): boolean {\n const [hidden, setHidden] = useState(false);\n\n useEffect(() => {\n if (!predicate) {\n setHidden(false);\n return;\n }\n if (typeof window === \"undefined\") return;\n ensureHistoryPatch();\n\n const evaluate = () => {\n try {\n setHidden(!!predicate({ pathname: window.location.pathname }));\n } catch {\n setHidden(false);\n }\n };\n evaluate();\n window.addEventListener(EVENT_NAME, evaluate);\n window.addEventListener(\"popstate\", evaluate);\n return () => {\n window.removeEventListener(EVENT_NAME, evaluate);\n window.removeEventListener(\"popstate\", evaluate);\n };\n }, [predicate]);\n\n return hidden;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst NATIVE_UA_TOKENS = [\n \"wv\", // generic Android WebView\n \"Capacitor\",\n \"Cordova\",\n \"Expo\",\n \"FBAN\",\n \"FBAV\",\n \"Instagram\",\n \"Line/\",\n \"Twitter\",\n];\n\n/**\n * Best-effort detection of a native shell (RN WebView, Capacitor,\n * Cordova, social-app webviews). Reported via context so hosts can\n * branch their own UI; we never auto-hide based on it.\n */\nexport function useNativeShell(): boolean {\n const [native, setNative] = useState(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const w = window as unknown as Record<string, unknown>;\n if (w.ReactNativeWebView) {\n setNative(true);\n return;\n }\n const wk = w.webkit as { messageHandlers?: unknown } | undefined;\n if (wk && wk.messageHandlers) {\n setNative(true);\n return;\n }\n const ua = navigator.userAgent || \"\";\n if (NATIVE_UA_TOKENS.some((t) => ua.includes(t))) {\n setNative(true);\n }\n }, []);\n\n return native;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport type { LumenTrigger, NotchEdge, LumenTriggerPlacement } from \"./types\";\n\nconst STORAGE_PREFIX = \"lumen.config.v1.\";\nconst STORAGE_TTL_MS = 60 * 60 * 1000; // 1h\n\ninterface CachedEntry {\n fetchedAt: number;\n trigger: LumenTrigger;\n shake: boolean;\n}\n\nexport interface RemoteConfigState {\n /** Trigger from the remote config; null while loading and no cache. */\n trigger: LumenTrigger | null;\n /** Whether the SDK should render any trigger at all. */\n enabled: boolean;\n /**\n * Shake-to-open toggle from the dashboard. Independent of `enabled` so a\n * project can keep the visible widget hidden but still open on shake.\n */\n shakeToOpen: boolean;\n /** True until either localStorage or the network has answered. */\n loading: boolean;\n}\n\n/**\n * Fetches `/api/v1/sdk/config?apiKey=…` and caches the result in\n * localStorage so the trigger can render instantly on subsequent loads.\n *\n * Returns immediately from the cache, then revalidates in the\n * background. Falls back to `null` (caller will use its built-in\n * default) on every error path so a flaky config endpoint can never\n * break the host page.\n */\nexport function useRemoteConfig(\n apiKey: string,\n apiUrl: string,\n): RemoteConfigState {\n const [state, setState] = useState<RemoteConfigState>(() => ({\n trigger: null,\n enabled: true,\n shakeToOpen: false,\n loading: true,\n }));\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const cached = readCache(apiKey);\n if (cached) {\n setState({\n trigger: cached.trigger,\n enabled: triggerEnabled(cached.trigger),\n shakeToOpen: cached.shake,\n loading: false,\n });\n }\n\n const controller = new AbortController();\n // Hard timeout: the SDK can't hold its loading state hostage to a\n // slow or hung /sdk/config endpoint. After 5s we abort and resolve\n // to a sensible default so the host page never sees a broken widget.\n const timeoutId = window.setTimeout(() => controller.abort(), 5000);\n const url = `${apiUrl.replace(/\\/$/, \"\")}/api/v1/sdk/config?apiKey=${encodeURIComponent(apiKey)}`;\n fetch(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n signal: controller.signal,\n })\n .then(async (res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const body = (await res.json()) as { trigger?: unknown };\n const trigger = parseTrigger(body.trigger);\n if (!trigger) throw new Error(\"Malformed config response\");\n const shake = parseShake(body.trigger);\n writeCache(apiKey, trigger, shake);\n setState({\n trigger,\n enabled: triggerEnabled(trigger),\n shakeToOpen: shake,\n loading: false,\n });\n })\n .catch(() => {\n // Network/parse errors fall through to defaults — never block.\n setState((prev) =>\n prev.loading\n ? { trigger: null, enabled: true, shakeToOpen: false, loading: false }\n : prev,\n );\n })\n .finally(() => window.clearTimeout(timeoutId));\n\n return () => {\n window.clearTimeout(timeoutId);\n controller.abort();\n };\n }, [apiKey, apiUrl]);\n\n return state;\n}\n\nfunction triggerEnabled(t: LumenTrigger): boolean {\n // The SDK type doesn't carry `enabled` directly because hosts that\n // build a trigger inline would never need it; the *remote* type does\n // ship it as the on/off toggle and we encode that here as the\n // headless variant.\n return t.kind !== \"headless\";\n}\n\nconst VALID_PLACEMENTS: readonly LumenTriggerPlacement[] = [\n \"br\",\n \"bl\",\n \"tr\",\n \"tl\",\n];\nconst VALID_EDGES: readonly NotchEdge[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\n/**\n * Defensive parser for the remote config payload. Exported for tests;\n * the hook uses it internally. Returns null when the shape is bad so\n * the caller can fall back to defaults instead of rendering garbage.\n */\nexport function parseTrigger(raw: unknown): LumenTrigger | null {\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n\n // The dashboard ships `enabled` as the on/off toggle — when off,\n // collapse to a headless trigger so the SDK renders nothing.\n if (r.enabled === false) return { kind: \"headless\" };\n\n const label = typeof r.label === \"string\" ? r.label : \"Feedback\";\n\n if (r.kind === \"floating\") {\n const placement =\n VALID_PLACEMENTS.find((p) => p === r.placement) ?? \"br\";\n return { kind: \"floating\", placement, label };\n }\n if (r.kind === \"notch\") {\n const edge = VALID_EDGES.find((e) => e === r.edge) ?? \"top\";\n return { kind: \"notch\", edge, label };\n }\n return null;\n}\n\n/**\n * Read the dashboard's `shake` toggle off the raw config payload. Kept\n * separate from `parseTrigger` because that collapses a disabled widget to\n * `headless` (dropping every field) — but shake must survive an off widget.\n */\nexport function parseShake(raw: unknown): boolean {\n if (!raw || typeof raw !== \"object\") return false;\n return (raw as Record<string, unknown>).shake === true;\n}\n\nfunction readCache(apiKey: string): CachedEntry | null {\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + apiKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as CachedEntry;\n if (\n typeof parsed?.fetchedAt !== \"number\" ||\n Date.now() - parsed.fetchedAt > STORAGE_TTL_MS\n ) {\n return null;\n }\n const trigger = parseTrigger(parsed.trigger);\n return trigger\n ? { fetchedAt: parsed.fetchedAt, trigger, shake: parsed.shake === true }\n : null;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(\n apiKey: string,\n trigger: LumenTrigger,\n shake: boolean,\n): void {\n try {\n window.localStorage.setItem(\n STORAGE_PREFIX + apiKey,\n JSON.stringify({ fetchedAt: Date.now(), trigger, shake }),\n );\n } catch {\n // Quota / private mode — fail silent.\n }\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { LUMEN_SHAKE_MESSAGE } from \"@lumen-stack/core\";\n\n/**\n * True when a bridge message (`window.postMessage` data) is a Lumen shake\n * event. Accepts both a parsed object and the JSON string react-native-webview\n * delivers. Exported for tests.\n */\nexport function isShakeMessage(data: unknown): boolean {\n if (data && typeof data === \"object\") {\n return (data as { type?: unknown }).type === LUMEN_SHAKE_MESSAGE;\n }\n if (typeof data === \"string\") {\n try {\n return (JSON.parse(data) as { type?: unknown }).type === LUMEN_SHAKE_MESSAGE;\n } catch {\n return false;\n }\n }\n return false;\n}\n\nexport interface MotionShakeOptions {\n /** Jerk (sum of |Δx|+|Δy|+|Δz|) above which a sample counts as a jolt. */\n threshold?: number;\n /** Distinct jolts needed within `windowMs` to call it a shake. */\n neededHits?: number;\n /** Sliding window the jolts must fall inside. */\n windowMs?: number;\n /** Minimum gap between processed samples (throttle). */\n throttleMs?: number;\n}\n\nexport interface MotionShakeDetector {\n /** Feed one accelerometer sample; returns true when a shake completes. */\n push: (x: number, y: number, z: number, now: number) => boolean;\n}\n\n/**\n * Pure accelerometer shake detector. A shake is several large jerks in a\n * short window; the first sample only primes the baseline. Framework-free so\n * it can be unit-tested without a DOM. Exported for tests.\n */\nexport function createMotionShakeDetector(\n options: MotionShakeOptions = {},\n): MotionShakeDetector {\n const threshold = options.threshold ?? 18;\n const neededHits = options.neededHits ?? 3;\n const windowMs = options.windowMs ?? 700;\n const throttleMs = options.throttleMs ?? 60;\n\n let last: { x: number; y: number; z: number; t: number } | null = null;\n let hits: number[] = [];\n\n return {\n push(x, y, z, now) {\n if (!last) {\n last = { x, y, z, t: now };\n return false;\n }\n if (now - last.t < throttleMs) return false;\n const delta =\n Math.abs(x - last.x) + Math.abs(y - last.y) + Math.abs(z - last.z);\n last = { x, y, z, t: now };\n if (delta < threshold) return false;\n hits = hits.filter((t) => now - t < windowMs);\n hits.push(now);\n if (hits.length >= neededHits) {\n hits = [];\n return true;\n }\n return false;\n },\n };\n}\n\n/**\n * Open the Lumen sheet when the user shakes their device.\n *\n * Two independent sources, both gated by `enabled`:\n *\n * 1. **Native bridge (primary).** A native Expo / react-native-webview host\n * detects the shake (e.g. `expo-sensors`, iOS `motionEnded`, Android\n * sensor) and posts a `{ \"type\": \"lumen:shake\" }` message into the WebView.\n * This is the reliable path on real devices.\n *\n * 2. **Web DeviceMotion (best-effort fallback).** For mobile web / PWAs the\n * SDK listens to `devicemotion` directly. This works on Android Chrome and\n * any context where motion permission is already granted; iOS Safari needs\n * `DeviceMotionEvent.requestPermission()` from a user gesture, which the\n * SDK can't trigger on its own — so on iOS the native bridge is required.\n *\n * A cooldown stops a single shake (many motion samples) from opening the\n * sheet more than once, and `onShake` is skipped while already open.\n */\nexport function useShakeToOpen(\n enabled: boolean,\n onShake: () => void,\n isOpen: boolean,\n): void {\n useEffect(() => {\n if (!enabled || typeof window === \"undefined\") return;\n\n let lastFire = 0;\n const COOLDOWN_MS = 1500;\n\n function fire() {\n const now = Date.now();\n if (isOpen || now - lastFire < COOLDOWN_MS) return;\n lastFire = now;\n onShake();\n }\n\n // ── Source 1: native bridge message ──────────────────────────────────\n const onMessage = (event: MessageEvent) => {\n if (isShakeMessage(event.data)) fire();\n };\n window.addEventListener(\"message\", onMessage);\n // react-native-webview delivers postMessage on `document` on Android.\n document.addEventListener(\"message\", onMessage as EventListener);\n\n // ── Source 2: web DeviceMotion shake detection ───────────────────────\n const detector = createMotionShakeDetector();\n const onMotion = (e: DeviceMotionEvent) => {\n const a = e.accelerationIncludingGravity ?? e.acceleration;\n if (!a || a.x == null || a.y == null || a.z == null) return;\n if (detector.push(a.x, a.y, a.z, Date.now())) fire();\n };\n // Don't auto-attach where an explicit permission gate exists (iOS): the\n // listener would never fire and just burns a slot. The native bridge\n // covers iOS instead.\n const hasMotion =\n typeof window.DeviceMotionEvent !== \"undefined\" &&\n typeof (\n window.DeviceMotionEvent as unknown as { requestPermission?: unknown }\n ).requestPermission !== \"function\";\n if (hasMotion) window.addEventListener(\"devicemotion\", onMotion);\n\n return () => {\n window.removeEventListener(\"message\", onMessage);\n document.removeEventListener(\"message\", onMessage as EventListener);\n if (hasMotion) window.removeEventListener(\"devicemotion\", onMotion);\n };\n }, [enabled, onShake, isOpen]);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport * as React from \"react\";\nimport {\n installRuntimeCapture,\n LumenClient,\n type AmplitudeIdentity,\n type CaptureResult,\n type LumenUser,\n type ScreenshotCaptureOptions,\n} from \"@lumen-stack/core\";\nimport { captureScreen } from \"@lumen-stack/core\";\n\nimport { LumenContext, type LumenContextValue } from \"./context\";\nimport { CaptureModal } from \"./CaptureModal\";\nimport { FloatingTrigger } from \"./trigger/FloatingTrigger\";\nimport { InlineTrigger } from \"./trigger/InlineTrigger\";\nimport { NotchTrigger } from \"./trigger/NotchTrigger\";\nimport {\n resolveFloatingConfig,\n resolveNotchConfig,\n type LumenTheme,\n type LumenTrigger,\n} from \"./trigger/types\";\nimport { useApplyTheme } from \"./trigger/theme\";\nimport { useHideOn } from \"./trigger/useHideOn\";\nimport { useNativeShell } from \"./trigger/useNativeShell\";\nimport { useRemoteConfig } from \"./trigger/useRemoteConfig\";\nimport { useShakeToOpen } from \"./trigger/useShakeToOpen\";\n\nconst DEFAULT_API_URL = \"https://shakebugs.vercel.app\";\n\nexport interface LumenProviderProps {\n apiKey: string;\n /** Override the dashboard origin. Defaults to https://shakebugs.vercel.app. */\n apiUrl?: string;\n user?: LumenUser;\n /**\n * Amplitude analytics identity for the current user. When set and the\n * project has the Amplitude integration enabled, Lumen pulls this user's\n * recent event timeline at enrichment time so the AI triage understands\n * what they did before reporting. Pass what your Amplitude instance holds:\n * `amplitude={{ userId: amp.getUserId(), deviceId: amp.getDeviceId(), sessionId: String(amp.getSessionId()) }}`.\n */\n amplitude?: AmplitudeIdentity;\n /**\n * @deprecated Use `trigger` instead. `floatingButton={false}` is\n * equivalent to `trigger={{ kind: \"headless\" }}`.\n */\n floatingButton?: boolean;\n /**\n * Trigger configuration. When omitted the SDK fetches the dashboard's\n * widget config from `/api/v1/sdk/config` and renders that. Pass a\n * value here to override the dashboard config locally.\n */\n trigger?: LumenTrigger;\n /** Hide the trigger on certain routes. Modal stays open if already open. */\n hideOn?: (location: { pathname: string }) => boolean;\n theme?: LumenTheme;\n /** Where to portal the floating trigger. Defaults to document.body. */\n portalTarget?: HTMLElement;\n /** Screenshot capture behavior and optional native/custom provider. */\n capture?: ScreenshotCaptureOptions;\n /**\n * Open the feedback sheet when the user shakes their device. When omitted\n * the SDK uses the dashboard's shake setting from `/api/v1/sdk/config`;\n * pass a boolean to force it on/off locally. Works via the native bridge\n * (a `lumen:shake` postMessage from an Expo/WebView host) and a best-effort\n * web DeviceMotion fallback.\n */\n shakeToOpen?: boolean;\n /**\n * Called exactly once whenever the Lumen sheet opens (`true`) or closes\n * (`false`). Never fires on the initial mount. Correct across all trigger\n * types. No spurious `false` during the 3-step capture wizard — `isOpen`\n * stays `true` throughout.\n *\n * Use this to hide/show native UI in a WebView host. Two complementary\n * approaches work together:\n *\n * **Option A — React prop (same-process host):**\n * ```tsx\n * <LumenProvider\n * onOpenChange={(open) => tabBarRef.current?.setVisible(!open)}\n * >\n * ```\n *\n * **Option B — MutationObserver (injected JS from native shell):**\n * While Lumen is open, `document.body` carries `data-lumen-open=\"true\"`.\n * Observe it from React Native / Capacitor / Electron:\n * ```tsx\n * // React Native (App.tsx)\n * <WebView\n * injectedJavaScript={`\n * const obs = new MutationObserver(() => {\n * const open = document.body.hasAttribute('data-lumen-open');\n * window.ReactNativeWebView.postMessage(\n * JSON.stringify({ type: 'lumen:openChange', open })\n * );\n * });\n * obs.observe(document.body, {\n * attributes: true,\n * attributeFilter: ['data-lumen-open'],\n * });\n * `}\n * onMessage={(e) => {\n * const { type, open } = JSON.parse(e.nativeEvent.data);\n * if (type === 'lumen:openChange') setTabBarVisible(!open);\n * }}\n * />\n * ```\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Called before Lumen starts its capture/open flow. Hosts can use this to\n * suppress outside-click dismissal in their own overlay stack.\n */\n beforeOpen?: (event?: Event) => void | Promise<void>;\n /**\n * Alias for hosts that want trigger-specific coordination.\n * Runs after `beforeOpen` and before the pre-open screenshot.\n */\n onTriggerActivate?: (event?: Event) => void | Promise<void>;\n children: React.ReactNode;\n}\n\nexport function LumenProvider({\n apiKey,\n apiUrl,\n user,\n amplitude,\n floatingButton = true,\n trigger,\n hideOn,\n theme,\n portalTarget,\n capture,\n shakeToOpen,\n onOpenChange,\n beforeOpen,\n onTriggerActivate,\n children,\n}: LumenProviderProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [isOpening, setIsOpening] = useState(false);\n const [initialCapture, setInitialCapture] = useState<CaptureResult | null>(\n null,\n );\n const [initialCaptureError, setInitialCaptureError] =\n useState<Error | null>(null);\n const [isSubmitting] = useState(false);\n const [error] = useState<Error | null>(null);\n const openingRef = useRef(false);\n const triggerPreparedRef = useRef(false);\n const triggerPreparePromiseRef = useRef<Promise<void> | null>(null);\n\n const client = useMemo(\n () => new LumenClient({ apiKey, apiUrl, user, amplitude }),\n [\n apiKey,\n apiUrl,\n user?.id,\n user?.email,\n user?.name,\n amplitude?.userId,\n amplitude?.deviceId,\n amplitude?.sessionId,\n ],\n );\n\n // Patches console + fetch + XHR on mount. Idempotent — safe under\n // Strict Mode double-invocation, and a no-op on the server.\n useEffect(() => {\n installRuntimeCapture({\n ignoreUrlPrefix: (apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, \"\"),\n });\n }, [apiUrl]);\n\n // ── onOpenChange + data-lumen-open DOM attribute ─────────────────────────\n // Kept in two separate effects so the DOM attribute (which needs a cleanup\n // to survive Strict-Mode's fake-unmount cycle) and the callback (which must\n // fire exactly once per transition) stay independent.\n\n // Stable ref so inline callbacks never cause stale-closure problems.\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n\n // DOM attribute — readable by MutationObserver from injected WebView JS.\n // cleanup runs on Strict-Mode teardown AND real unmount, so the attribute\n // is always removed when this effect version is discarded.\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n if (isOpen) {\n document.body.setAttribute(\"data-lumen-open\", \"true\");\n } else {\n document.body.removeAttribute(\"data-lumen-open\");\n }\n return () => {\n document.body.removeAttribute(\"data-lumen-open\");\n };\n }, [isOpen]);\n\n // Callback — fires exactly once per real open/close transition.\n // prevIsOpenRef starts as null so the initial false on mount is skipped.\n // The `=== isOpen` guard prevents double-fire under Strict-Mode re-runs.\n const prevIsOpenRef = useRef<boolean | null>(null);\n useEffect(() => {\n if (prevIsOpenRef.current === isOpen) return;\n const prev = prevIsOpenRef.current;\n prevIsOpenRef.current = isOpen;\n if (prev === null) return; // initial mount — no transition yet\n onOpenChangeRef.current?.(isOpen);\n }, [isOpen]);\n // ─────────────────────────────────────────────────────────────────────────\n\n const beforeOpenRef = useRef(beforeOpen);\n beforeOpenRef.current = beforeOpen;\n const onTriggerActivateRef = useRef(onTriggerActivate);\n onTriggerActivateRef.current = onTriggerActivate;\n\n const prepareTriggerOpen = useCallback((event: Event) => {\n triggerPreparedRef.current = true;\n triggerPreparePromiseRef.current = Promise.resolve()\n .then(() => beforeOpenRef.current?.(event))\n .then(() => onTriggerActivateRef.current?.(event))\n .then(() => undefined);\n }, []);\n\n const open = useCallback(\n (event?: Event) => {\n if (openingRef.current || isOpen) return;\n openingRef.current = true;\n setIsOpening(true);\n setInitialCapture(null);\n setInitialCaptureError(null);\n\n void (async () => {\n try {\n if (triggerPreparedRef.current) {\n await triggerPreparePromiseRef.current;\n } else {\n await beforeOpenRef.current?.(event);\n await onTriggerActivateRef.current?.(event);\n }\n\n if (capture?.mode === \"manual\") {\n setInitialCapture(null);\n setInitialCaptureError(null);\n } else {\n const result = await captureScreen({\n ...capture,\n mode: capture?.mode ?? \"auto\",\n target: capture?.target ?? document.documentElement,\n });\n setInitialCapture(result);\n }\n } catch (e) {\n setInitialCaptureError(\n e instanceof Error ? e : new Error(String(e)),\n );\n } finally {\n triggerPreparedRef.current = false;\n triggerPreparePromiseRef.current = null;\n openingRef.current = false;\n setIsOpening(false);\n setIsOpen(true);\n }\n })();\n },\n [capture, isOpen],\n );\n const close = useCallback(() => setIsOpen(false), []);\n const submit = useCallback(client.submit.bind(client), [client]);\n\n const isNativeShell = useNativeShell();\n const hideTrigger = useHideOn(hideOn);\n useApplyTheme(theme);\n\n // Remote config: only fetched when the host hasn't pinned a trigger.\n // Passing the same apiUrl the LumenClient resolves to keeps the two\n // calls in lockstep.\n const remote = useRemoteConfig(\n trigger ? \"\" : apiKey,\n apiUrl ?? DEFAULT_API_URL,\n );\n\n // Shake-to-open: explicit prop wins; otherwise honor the dashboard setting.\n // `open` is stable (useCallback), so the listener isn't re-bound per render.\n const effectiveShake = shakeToOpen ?? remote.shakeToOpen;\n useShakeToOpen(effectiveShake, open, isOpen);\n\n const value = useMemo<LumenContextValue>(\n () => ({\n client,\n user,\n isOpen,\n isSubmitting,\n error,\n open,\n close,\n openCapture: open,\n closeCapture: close,\n submit,\n isNativeShell,\n capture,\n initialCapture,\n initialCaptureError,\n isOpening,\n }),\n [\n client,\n user,\n isOpen,\n isSubmitting,\n error,\n open,\n close,\n submit,\n isNativeShell,\n capture,\n initialCapture,\n initialCaptureError,\n isOpening,\n ],\n );\n\n const effectiveTrigger = resolveEffectiveTrigger({\n explicit: trigger,\n remote: remote.trigger,\n remoteLoading: remote.loading,\n floatingButton,\n });\n\n return (\n <LumenContext.Provider value={value}>\n {children}\n {effectiveTrigger?.kind === \"floating\" ? (\n <FloatingTrigger\n config={resolveFloatingConfig(effectiveTrigger)}\n portalTarget={portalTarget}\n hidden={hideTrigger || isOpening}\n onPointerDown={prepareTriggerOpen}\n onClick={(event) => open(event)}\n />\n ) : null}\n {effectiveTrigger?.kind === \"notch\" ? (\n <NotchTrigger\n config={resolveNotchConfig(effectiveTrigger)}\n portalTarget={portalTarget}\n hidden={hideTrigger || isOpening}\n onPointerDown={prepareTriggerOpen}\n onClick={(event) => open(event)}\n />\n ) : null}\n {effectiveTrigger?.kind === \"inline\" ? (\n <InlineTrigger\n mount={effectiveTrigger.mount}\n label={effectiveTrigger.label ?? \"Feedback\"}\n icon={effectiveTrigger.icon}\n onPointerDown={prepareTriggerOpen}\n onClick={(event) => open(event)}\n />\n ) : null}\n <CaptureModal />\n </LumenContext.Provider>\n );\n}\n\n/**\n * Trigger resolution precedence:\n * 1. Explicit `trigger` prop wins (host opt-out from remote).\n * 2. `floatingButton={false}` → headless (legacy escape hatch).\n * 3. Remote config from /api/v1/sdk/config.\n * 4. While remote is still loading without a cached value, render\n * nothing (avoids a flash of the default in the wrong place).\n * 5. If remote ultimately fails, fall back to the floating default\n * so the host always has *something*.\n */\nfunction resolveEffectiveTrigger(args: {\n explicit: LumenTrigger | undefined;\n remote: LumenTrigger | null;\n remoteLoading: boolean;\n floatingButton: boolean;\n}): LumenTrigger | null {\n if (args.explicit) return args.explicit;\n if (args.floatingButton === false) return { kind: \"headless\" };\n if (args.remote) return args.remote;\n if (args.remoteLoading) return null;\n return { kind: \"floating\" };\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useLumen } from \"./context\";\n\nexport interface FeedbackButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"default\" | \"ghost\" | \"outline\";\n /** Render fixed in the bottom-right corner. */\n floating?: boolean;\n}\n\nexport function FeedbackButton({\n variant = \"default\",\n floating = false,\n className,\n children = \"Feedback\",\n onClick,\n ...rest\n}: FeedbackButtonProps) {\n const { openCapture } = useLumen();\n const cls = [\n \"lumen-btn\",\n variant === \"default\" ? \"lumen-btn-primary\" : null,\n variant === \"ghost\" ? \"lumen-btn-ghost\" : null,\n variant === \"outline\" ? \"lumen-btn-outline\" : null,\n floating ? \"lumen-btn-floating\" : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n type=\"button\"\n className={cls}\n data-lumen-trigger=\"\"\n onClick={(e) => {\n onClick?.(e);\n if (!e.defaultPrevented) openCapture(e.nativeEvent);\n }}\n {...rest}\n >\n {children}\n </button>\n );\n}\n"]}