@marktiderman/genesis-support 0.1.0 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/native/modules.ts","../src/native/support.tsx","../src/native/annotator.tsx","../src/native/feedback-form.tsx","../src/native/screens.tsx"],"names":["Dimensions","all","jsx","NativeButton","useThemeRoles","useState","useEffect","jsxs","View","NativeSegmentedControl","Image","NativeText","useQueryClient","useQuery","Alert"],"mappings":"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","file":"native.js","sourcesContent":["/**\n * The native modules the support block can use, as the shapes it needs. The\n * app passes the real ones (all optional peers), so the block runs without\n * any of them and the tests pass fakes:\n *\n * import * as ViewShot from \"react-native-view-shot\"; // screenshots, mark-up\n * import { Accelerometer } from \"expo-sensors\"; // shake to report\n */\n\nexport interface CaptureOptions {\n format?: \"png\" | \"jpg\" | \"webp\";\n quality?: number;\n result?: \"tmpfile\" | \"base64\" | \"data-uri\";\n width?: number;\n height?: number;\n}\n\n/** `react-native-view-shot`: `captureScreen` (the whole screen) and `captureRef` (one view, for flattening mark-up). */\nexport interface ViewShotLike {\n captureScreen(options?: CaptureOptions): Promise<string>;\n captureRef(view: unknown, options?: CaptureOptions): Promise<string>;\n}\n\nexport interface AccelerometerMeasurement {\n x: number;\n y: number;\n z: number;\n}\n\n/** `expo-sensors`' `Accelerometer` (values in g). */\nexport interface AccelerometerLike {\n addListener(listener: (measurement: AccelerometerMeasurement) => void): { remove(): void };\n setUpdateInterval?(intervalMs: number): void;\n}\n\nexport interface ShakeOptions {\n /** Acceleration, in g, that counts as a jolt. Default 2.3. */\n threshold?: number;\n /** Jolts needed within `windowMs`. Default 2. */\n jolts?: number;\n windowMs?: number;\n /** Quiet time after a shake. Default 3000 ms. */\n cooldownMs?: number;\n intervalMs?: number;\n now?: () => number;\n}\n\n/** Calls `onShake` when the phone is shaken: a few strong jolts close together, then a cooldown. Returns the stop. */\nexport function listenForShake(accelerometer: AccelerometerLike, onShake: () => void, options: ShakeOptions = {}): () => void {\n const { threshold = 2.3, jolts = 2, windowMs = 1000, cooldownMs = 3000, intervalMs = 100, now = Date.now } = options;\n const recent: number[] = [];\n let quietUntil = 0;\n accelerometer.setUpdateInterval?.(intervalMs);\n const subscription = accelerometer.addListener(({ x, y, z }) => {\n const t = now();\n if (t < quietUntil) return;\n if (Math.sqrt(x * x + y * y + z * z) < threshold) return;\n recent.push(t);\n while (recent.length && t - recent[0]! > windowMs) recent.shift();\n if (recent.length >= jolts) {\n recent.length = 0;\n quietUntil = t + cooldownMs;\n onShake();\n }\n });\n return () => subscription.remove();\n}\n","/**\n * `createSupport(options)`: the support block for `GenesisNativeApp`.\n *\n * <GenesisNativeApp blocks={[support]} appFeatures={[\"account\"]}>\n *\n * It adds \"Send feedback\" and \"Help\" to Settings (`useBlockSettings`), names\n * its routes and migration 0006, and its root listens for a shake (with an\n * accelerometer): the screen is captured and the feedback screen opens with\n * it, ready to mark up. `useSupport().openFeedback()` does the same from a\n * button anywhere (a devtools panel's \"Send feedback\" slot, a help icon).\n *\n * The screens are the app's route files, each a Genesis layout fed by a hook\n * from here (`useSupportInbox` → `InboxPage`, `useSupportThread` →\n * `ThreadPage`, `useIdeaBoard` → `InboxPage`, `FeedbackForm` in\n * `SettingsSubPage`).\n */\nimport { createContext, useContext, useEffect, useSyncExternalStore, type ComponentType, type ReactNode } from \"react\";\nimport { Dimensions, Platform } from \"react-native\";\nimport type { NativeBlock, NativeBlockRootProps } from \"@marktiderman/genesis-native\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { NativeButton } from \"@marktiderman/genesis-ui-native/components\";\nimport { defineSupportBlock, supportPaths, SUPPORT_BLOCK_ID, type SupportPaths } from \"../block\";\nimport { createSupportClient, type SupportClient, type SupportSupabase } from \"../client\";\nimport { fill, resolveSupportCopy, type SupportCopy, type SupportCopyOverrides } from \"../copy\";\nimport { composeCollectors, createContextCollector, type ContextCollector, type ScreenshotContentType } from \"../record\";\nimport { listenForShake, type AccelerometerLike, type ShakeOptions, type ViewShotLike } from \"./modules\";\n\n/** A screenshot waiting for the feedback screen. `uri` is a data URI. */\nexport interface PendingScreenshot {\n uri: string;\n contentType: ScreenshotContentType;\n width: number;\n height: number;\n}\n\n/** What the feedback screen opens with: where the person was, and maybe a screenshot of it. */\nexport interface PendingFeedback {\n route: string | null;\n screenshot: PendingScreenshot | null;\n /** Extra context to send with the report (the devtools overlay's debug report). */\n extra?: Record<string, unknown>;\n}\n\nexport interface SupportOptions {\n /** The app's Supabase client (migration 0006 applied). */\n supabase: SupportSupabase;\n /** Opens a path (expo-router's `router.push`). */\n navigate: (href: string) => void;\n /** `Platform.OS`. Default from React Native. */\n platform?: string;\n /** The version signature sent with each report (`useVersionSignature().short`, or a function that reads it). */\n appVersion?: string | (() => string | undefined);\n /** The current route, as a hook (expo-router's `usePathname`). The root calls it. */\n useCurrentRoute?: () => string;\n /** More context (device facts, the update id). Merged over the defaults. */\n collector?: ContextCollector;\n /** `react-native-view-shot`. Without it there are no screenshots. */\n viewShot?: ViewShotLike;\n /** `expo-sensors`' `Accelerometer`. Without it (or with `shake: false`) shaking does nothing. */\n accelerometer?: AccelerometerLike;\n shake?: false | ShakeOptions;\n /** Default `/support`. The route files live under it. */\n basePath?: string;\n copy?: SupportCopyOverrides;\n /** The Settings rows' section (default `support`), or `false` for none. */\n settings?: false | { section?: string };\n /** `false` leaves the idea board out. */\n ideas?: boolean;\n /** Every caught error, for reporting. None of them reaches the person as a crash. */\n onError?: (error: Error, where: \"capture\" | \"shake\") => void;\n}\n\nexport interface SupportBlock extends NativeBlock<typeof SUPPORT_BLOCK_ID> {\n readonly options: SupportOptions;\n readonly client: SupportClient;\n readonly copy: SupportCopy;\n readonly paths: SupportPaths;\n readonly collector: ContextCollector;\n /** Capture the screen (if it can and `screenshot` isn't false), then open the feedback screen. */\n openFeedback(options?: { screenshot?: boolean; extra?: Record<string, unknown>; delayMs?: number }): Promise<void>;\n /** Hand the feedback screen what it opens with (`takePending` empties it). */\n takePending(): PendingFeedback | null;\n peekPending(): PendingFeedback | null;\n subscribePending(listener: () => void): () => void;\n /** The route the person is on, as the root last saw it. */\n currentRoute(): string | null;\n readonly Root: ComponentType<NativeBlockRootProps>;\n}\n\nconst SupportContext = createContext<SupportBlock | null>(null);\n\n/** The support block, from `GenesisNativeApp blocks` (or `SupportProvider`). Throws outside one. */\nexport function useSupport(): SupportBlock {\n const block = useContext(SupportContext);\n if (!block) throw new Error(\"useSupport: no support block. Pass `blocks={[createSupport(…)]}` to GenesisNativeApp, or wrap in <SupportProvider>.\");\n return block;\n}\n\n/** The same block, or `null` when support is off (for a button that hides itself). */\nexport function useOptionalSupport(): SupportBlock | null {\n return useContext(SupportContext);\n}\n\nexport function SupportProvider({ block, children }: { block: SupportBlock; children?: ReactNode }) {\n return <SupportContext.Provider value={block}>{children}</SupportContext.Provider>;\n}\n\nexport const SUPPORT_QUERY_ROOT = \"genesis-support\";\n\n/** How many reports have a staff reply the person hasn't read. */\nexport function useUnreadReplies(): number {\n const block = useSupport();\n const { data } = useQuery({ queryKey: [SUPPORT_QUERY_ROOT, \"reports\"], queryFn: () => block.client.myReports(), staleTime: 60_000 });\n return (data ?? []).filter((r) => r.unread).length;\n}\n\nexport function createSupport(options: SupportOptions): SupportBlock {\n const copy = resolveSupportCopy(options.copy);\n const paths = supportPaths(options.basePath);\n const client = createSupportClient(options.supabase);\n const platform = options.platform ?? Platform.OS;\n let route: string | null = null;\n let pending: PendingFeedback | null = null;\n const listeners = new Set<() => void>();\n const setPending = (next: PendingFeedback | null) => {\n pending = next;\n for (const l of listeners) l();\n };\n\n const defaults = createContextCollector({\n platform,\n appVersion: typeof options.appVersion === \"function\" ? options.appVersion : () => options.appVersion as string | undefined,\n route: () => route ?? undefined,\n device: () => {\n const screen = Dimensions.get(\"screen\");\n return { os: platform, osVersion: String(Platform.Version), screen: { width: Math.round(screen.width), height: Math.round(screen.height), scale: screen.scale } };\n },\n });\n const collector = options.collector ? composeCollectors(defaults, options.collector) : defaults;\n\n const declaration = defineSupportBlock({\n basePath: options.basePath,\n copy: options.copy,\n settings: options.settings,\n ideas: options.ideas,\n useHelpSubtitle: () => {\n const unread = useUnreadReplies();\n return unread ? fill(copy.settings.unreadReplies, { count: unread }) : null;\n },\n });\n\n const report = (error: unknown, where: \"capture\" | \"shake\") => {\n try {\n options.onError?.(error instanceof Error ? error : new Error(String(error)), where);\n } catch {\n // a failing reporter never breaks support\n }\n };\n\n let opening = false;\n // The devtools overlay's \"Send feedback\" (its `devtoolsFeedback` slot): closes the overlay,\n // captures the screen under it and opens the feedback screen with the debug report attached.\n function DevtoolsFeedback({ debugInfo, close }: { debugInfo: string; close: () => void }) {\n return (\n <NativeButton\n variant=\"outline\"\n testID=\"genesis-support-devtools-feedback\"\n onPress={() => {\n close();\n void block.openFeedback({ extra: { debugInfo: debugInfo.slice(0, 8000) }, delayMs: 400 });\n }}\n >\n {copy.settings.sendFeedback}\n </NativeButton>\n );\n }\n\n const block: SupportBlock = {\n ...declaration,\n contributes: { ...declaration.contributes, slots: { devtoolsFeedback: DevtoolsFeedback as ComponentType<never> } },\n platforms: [\"native\"],\n options,\n client,\n copy,\n paths,\n collector,\n async openFeedback({ screenshot = true, extra, delayMs = 0 } = {}) {\n if (opening) return;\n opening = true;\n try {\n // Let a sheet that is closing (the devtools overlay) get out of the picture first.\n if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, delayMs));\n let shot: PendingScreenshot | null = null;\n if (screenshot && options.viewShot) {\n try {\n const uri = await options.viewShot.captureScreen({ format: \"jpg\", quality: 0.8, result: \"data-uri\" });\n const window = Dimensions.get(\"window\");\n const scale = Dimensions.get(\"screen\").scale || 1;\n shot = { uri, contentType: \"image/jpeg\", width: Math.round(window.width * scale), height: Math.round(window.height * scale) };\n } catch (error) {\n report(error, \"capture\");\n }\n }\n setPending({ route, screenshot: shot, extra });\n options.navigate(paths.feedback);\n } finally {\n opening = false;\n }\n },\n takePending() {\n const p = pending;\n if (p) setPending(null);\n return p;\n },\n peekPending: () => pending,\n subscribePending(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n currentRoute: () => route,\n Root: function SupportRoot({ children }) {\n const current = (options.useCurrentRoute ?? noRoute)();\n useEffect(() => {\n if (current) route = current;\n }, [current]);\n useEffect(() => {\n if (!options.accelerometer || options.shake === false) return;\n try {\n return listenForShake(\n options.accelerometer,\n () => {\n // Already on a support screen: shaking again does nothing.\n if (route && route.startsWith(paths.inbox)) return;\n void block.openFeedback();\n },\n options.shake || {},\n );\n } catch (error) {\n report(error, \"shake\");\n return undefined;\n }\n }, []);\n return <SupportProvider block={block}>{children}</SupportProvider>;\n },\n };\n return block;\n}\n\nfunction noRoute(): string {\n return \"\";\n}\n\n/** The pending feedback, re-rendering when it changes. */\nexport function usePendingFeedback(): PendingFeedback | null {\n const block = useSupport();\n return useSyncExternalStore(block.subscribePending, block.peekPending, block.peekPending);\n}\n","/**\n * ScreenshotAnnotator: mark up a screenshot before it is sent. Two tools:\n * a pen to point something out, and Hide, which paints a solid box over\n * anything private (a name, an email, a message). \"Done\" flattens the image\n * and the marks into one picture with `react-native-view-shot`'s `captureRef`,\n * so what is sent is exactly what the person saw, hidden parts included.\n *\n * Plain views and React Native's PanResponder: no Skia, SVG or gesture library.\n */\nimport { useRef, useState, type ComponentRef } from \"react\";\nimport { Dimensions, Image, PanResponder, View, type LayoutChangeEvent } from \"react-native\";\nimport { NativeButton, NativeSegmentedControl, NativeText } from \"@marktiderman/genesis-ui-native/components\";\nimport { useThemeRoles } from \"@marktiderman/genesis-ui-native/hooks\";\nimport type { SupportCopy } from \"../copy\";\nimport type { ViewShotLike } from \"./modules\";\nimport type { PendingScreenshot } from \"./support\";\n\ntype Point = { x: number; y: number };\ntype Mark = { kind: \"pen\"; points: Point[] } | { kind: \"hide\"; from: Point; to: Point };\n\nconst DOT = 6;\n/** The most dots a drawing keeps, so a long scribble stays light. */\nconst MAX_DOTS = 3000;\n\n/** The dots along a stroke, close enough to read as a line. */\nexport function strokeDots(points: readonly Point[], spacing = DOT / 2): Point[] {\n const dots: Point[] = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i]!;\n const prev = points[i - 1];\n if (prev) {\n const dist = Math.hypot(p.x - prev.x, p.y - prev.y);\n for (let d = spacing; d < dist; d += spacing) dots.push({ x: prev.x + ((p.x - prev.x) * d) / dist, y: prev.y + ((p.y - prev.y) * d) / dist });\n }\n dots.push(p);\n }\n return dots;\n}\n\n/** A point inside the picture; a missing or odd coordinate counts as its edge. */\nexport function clamp(p: Point, size: { width: number; height: number }): Point {\n const fix = (v: number, max: number) => (Number.isFinite(v) ? Math.min(Math.max(v, 0), max || v) : 0);\n return { x: fix(p.x, size.width), y: fix(p.y, size.height) };\n}\n\nexport function boxOf(from: Point, to: Point) {\n return { left: Math.min(from.x, to.x), top: Math.min(from.y, to.y), width: Math.abs(to.x - from.x), height: Math.abs(to.y - from.y) };\n}\n\nexport interface ScreenshotAnnotatorProps {\n screenshot: PendingScreenshot;\n viewShot: ViewShotLike;\n copy: SupportCopy[\"annotate\"];\n /** `marked`: the image now carries marks (pen or hidden parts). */\n onDone: (screenshot: PendingScreenshot, marked: boolean) => void;\n /** `hadMarks`: the person drew something and left without saving it. */\n onCancel: (hadMarks: boolean) => void;\n testID?: string;\n}\n\nexport function ScreenshotAnnotator({ screenshot, viewShot, copy, onDone, onCancel, testID = \"genesis-support-annotator\" }: ScreenshotAnnotatorProps) {\n const colors = useThemeRoles();\n const surface = useRef<ComponentRef<typeof View> | null>(null);\n // A callback ref, not the ref object: NativeWind's interop walks object props on re-render, and\n // walking a mounted view's instance throws (it reaches navigation contexts).\n const setSurface = useRef((node: ComponentRef<typeof View> | null) => {\n surface.current = node;\n }).current;\n const [tool, setTool] = useState<\"pen\" | \"hide\">(\"pen\");\n const [marks, setMarks] = useState<Mark[]>([]);\n const [draft, setDraft] = useState<Mark | null>(null);\n const [width, setWidth] = useState(0);\n const [saving, setSaving] = useState(false);\n const [failed, setFailed] = useState(false);\n const toolRef = useRef(tool);\n toolRef.current = tool;\n const draftRef = useRef<Mark | null>(null);\n\n // The whole picture on screen with the buttons under it: at most about half the window tall.\n const ratio = screenshot.width / Math.max(1, screenshot.height);\n const maxHeight = Math.round(Dimensions.get(\"window\").height * 0.55);\n const fitWidth = width ? Math.min(width, Math.round(maxHeight * ratio)) : 0;\n const height = fitWidth ? Math.round(fitWidth / ratio) : 0;\n const size = useRef({ width: 0, height: 0 });\n size.current = { width: fitWidth, height };\n const start = useRef<Point>({ x: 0, y: 0 });\n\n const responder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n // Drawing inside a scroll view: keep the touch, don't hand it to the scroll.\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: (event) => {\n const p = clamp({ x: event.nativeEvent.locationX, y: event.nativeEvent.locationY }, size.current);\n start.current = p;\n draftRef.current = toolRef.current === \"pen\" ? { kind: \"pen\", points: [p] } : { kind: \"hide\", from: p, to: p };\n setDraft(draftRef.current);\n },\n onPanResponderMove: (_event, gesture) => {\n // From where the touch started, so a touch over a child or outside the picture stays in it.\n const p = clamp({ x: start.current.x + gesture.dx, y: start.current.y + gesture.dy }, size.current);\n const d = draftRef.current;\n if (!d) return;\n draftRef.current = d.kind === \"pen\" ? { kind: \"pen\", points: [...d.points, p] } : { ...d, to: p };\n setDraft(draftRef.current);\n },\n onPanResponderRelease: () => {\n const d = draftRef.current;\n draftRef.current = null;\n setDraft(null);\n if (d) setMarks((all) => [...all, d]);\n },\n // A scroll view above can still take the touch (iOS's own pan): keep what was drawn so far.\n onPanResponderTerminate: () => {\n const d = draftRef.current;\n draftRef.current = null;\n setDraft(null);\n if (d) setMarks((all) => [...all, d]);\n },\n }),\n ).current;\n\n const done = async () => {\n if (!marks.length) {\n onDone(screenshot, false);\n return;\n }\n setSaving(true);\n setFailed(false);\n try {\n const uri = await viewShot.captureRef(surface.current, { format: \"jpg\", quality: 0.85, result: \"data-uri\" });\n setSaving(false);\n onDone({ ...screenshot, uri, contentType: \"image/jpeg\" }, true);\n } catch {\n // Flattening failed: never send the unmarked image in its place (hidden parts would show).\n setSaving(false);\n setFailed(true);\n }\n };\n\n let dots = 0;\n const all = draft ? [...marks, draft] : marks;\n return (\n <View testID={testID} style={{ gap: 12 }}>\n <NativeText style={{ color: colors.secondaryLabel, fontSize: 13, lineHeight: 18 }}>{copy.hint}</NativeText>\n <NativeSegmentedControl\n testID={`${testID}-tool`}\n options={[\n { value: \"pen\", label: copy.pen },\n { value: \"hide\", label: copy.hide },\n ]}\n value={tool}\n onChange={(v) => setTool(v as \"pen\" | \"hide\")}\n />\n <View onLayout={(e: LayoutChangeEvent) => setWidth(e.nativeEvent.layout.width)} style={{ width: \"100%\" }}>\n <View ref={setSurface} collapsable={false} testID={`${testID}-surface`} style={{ alignSelf: \"center\", width: fitWidth || \"100%\", height: height || 320, overflow: \"hidden\", borderRadius: 12 }} {...responder.panHandlers}>\n <Image source={{ uri: screenshot.uri }} style={{ width: \"100%\", height: \"100%\" }} resizeMode=\"stretch\" accessibilityIgnoresInvertColors />\n {all.map((mark, i) => {\n if (mark.kind === \"hide\") {\n const box = boxOf(mark.from, mark.to);\n return <View key={i} testID={`${testID}-hide-${i}`} pointerEvents=\"none\" style={{ position: \"absolute\", ...box, backgroundColor: colors.label }} />;\n }\n return strokeDots(mark.points).map((p, j) => {\n if (dots++ > MAX_DOTS) return null;\n return (\n <View\n key={`${i}-${j}`}\n pointerEvents=\"none\"\n style={{ position: \"absolute\", left: p.x - DOT / 2, top: p.y - DOT / 2, width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: colors.destructive }}\n />\n );\n });\n })}\n </View>\n </View>\n {failed ? (\n <NativeText testID={`${testID}-failed`} accessibilityLiveRegion=\"polite\" style={{ color: colors.destructive, fontSize: 13, lineHeight: 18 }}>\n {copy.failed}\n </NativeText>\n ) : null}\n <View style={{ flexDirection: \"row\", gap: 8 }}>\n <NativeButton variant=\"ghost\" onPress={() => onCancel(marks.length > 0 || draft !== null)} testID={`${testID}-cancel`}>\n {copy.cancel}\n </NativeButton>\n <NativeButton variant=\"outline\" onPress={() => setMarks((m) => m.slice(0, -1))} disabled={!marks.length} testID={`${testID}-undo`}>\n {copy.undo}\n </NativeButton>\n <View style={{ flex: 1 }} />\n <NativeButton onPress={() => void done()} loading={saving} testID={`${testID}-done`}>\n {copy.done}\n </NativeButton>\n </View>\n </View>\n );\n}\n","/**\n * FeedbackForm: the feedback screen's content, for inside `SettingsSubPage`\n * (which keeps it above the keyboard). Type, message, and the screenshot the\n * shake (or `openFeedback`) captured: kept only if the person keeps it, after\n * they can mark it up and hide parts of it.\n *\n * <SettingsSubPage testID=\"support-feedback\"><FeedbackForm onSent={() => router.back()} /></SettingsSubPage>\n */\nimport { useEffect, useState } from \"react\";\nimport { Alert, Image, Modal, View } from \"react-native\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { NativeButton, NativeLabel, NativeSegmentedControl, NativeSwitch, NativeText, NativeTextarea } from \"@marktiderman/genesis-ui-native/components\";\nimport { useThemeRoles } from \"@marktiderman/genesis-ui-native/hooks\";\nimport { SupportError } from \"../client\";\nimport { FEEDBACK_TYPES, type FeedbackDelivery, type FeedbackType } from \"../record\";\nimport { ScreenshotAnnotator } from \"./annotator\";\nimport { SUPPORT_QUERY_ROOT, useSupport, type PendingFeedback, type PendingScreenshot } from \"./support\";\n\nexport interface FeedbackFormProps {\n defaultType?: FeedbackType;\n /** After a report is saved (go back, say thanks). The form has already shown its own confirmation. */\n onSent?: (delivery: FeedbackDelivery) => void;\n testID?: string;\n}\n\nexport function FeedbackForm({ defaultType = \"bug\", onSent, testID = \"genesis-support-feedback\" }: FeedbackFormProps) {\n const block = useSupport();\n const { copy } = block;\n const colors = useThemeRoles();\n const queryClient = useQueryClient();\n // What the shake (or openFeedback) left: taken once, so a second visit starts clean.\n const [origin] = useState<PendingFeedback | null>(() => block.peekPending());\n useEffect(() => {\n block.takePending();\n }, [block]);\n const [type, setType] = useState<FeedbackType>(defaultType);\n const [message, setMessage] = useState(\"\");\n const [screenshot, setScreenshot] = useState<PendingScreenshot | null>(origin?.screenshot ?? null);\n // Off until the person says so: a captured screen is never sent by default.\n const [include, setInclude] = useState(false);\n const [annotating, setAnnotating] = useState(false);\n const [sending, setSending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => setError(null), [message]);\n\n const send = async () => {\n if (!message.trim()) {\n setError(copy.feedback.messageRequired);\n return;\n }\n setSending(true);\n try {\n const context = await block.collector.collect();\n // Where the person was when they asked for the form, never the form itself.\n const route = origin?.route && !origin.route.startsWith(block.paths.inbox) ? origin.route : undefined;\n if (route) context.route = route;\n else delete context.route;\n if (origin?.extra) context.extra = { ...context.extra, ...origin.extra };\n const delivery = await block.client.submit({\n type,\n message: message.trim(),\n context,\n attachments: screenshot && include ? [{ kind: \"screenshot\", contentType: screenshot.contentType, base64: screenshot.uri, width: screenshot.width, height: screenshot.height }] : [],\n });\n void queryClient.invalidateQueries({ queryKey: [SUPPORT_QUERY_ROOT, \"reports\"] });\n setMessage(\"\");\n setScreenshot(null);\n Alert.alert(copy.feedback.sentTitle, delivery.attachmentsDropped ? copy.feedback.sentWithoutScreenshot : copy.feedback.sentBody);\n onSent?.(delivery);\n } catch (e) {\n const err = e instanceof SupportError ? e : null;\n setError(err?.rateLimited ? copy.feedback.rateLimited : err?.code === \"42501\" ? copy.feedback.signInFirst : copy.feedback.failedBody);\n } finally {\n setSending(false);\n }\n };\n\n return (\n <View testID={testID} style={{ gap: 16 }}>\n <View style={{ gap: 8 }}>\n <NativeLabel>{copy.feedback.typeLabel}</NativeLabel>\n <NativeSegmentedControl\n testID={`${testID}-type`}\n options={FEEDBACK_TYPES.map((t) => ({ value: t, label: copy.feedback.types[t] }))}\n value={type}\n onChange={(v) => setType(v as FeedbackType)}\n />\n </View>\n <NativeTextarea\n testID={`${testID}-message`}\n label={copy.feedback.messageLabel}\n placeholder={copy.feedback.messagePlaceholder}\n value={message}\n onChangeText={setMessage}\n maxLength={20000}\n rows={6}\n error={error ?? undefined}\n />\n {screenshot ? (\n <View testID={`${testID}-screenshot`} style={{ gap: 8 }}>\n <NativeLabel>{copy.feedback.screenshotLabel}</NativeLabel>\n <View style={{ flexDirection: \"row\", gap: 12, alignItems: \"flex-start\" }}>\n <Image\n source={{ uri: screenshot.uri }}\n accessibilityLabel={copy.feedback.screenshotLabel}\n style={{ width: 96, height: Math.round((96 * screenshot.height) / Math.max(1, screenshot.width)), borderRadius: 8, backgroundColor: colors.fill }}\n />\n <View style={{ flex: 1, gap: 8 }}>\n <View style={{ flexDirection: \"row\", alignItems: \"center\", justifyContent: \"space-between\", gap: 8 }}>\n <NativeText style={{ flex: 1, color: colors.label, fontSize: 15, lineHeight: 20 }}>{copy.feedback.includeScreenshot}</NativeText>\n <NativeSwitch\n testID={`${testID}-include-screenshot`}\n accessibilityLabel={copy.feedback.includeScreenshot}\n checked={include}\n onCheckedChange={setInclude}\n />\n </View>\n <NativeText style={{ color: colors.secondaryLabel, fontSize: 13, lineHeight: 18 }}>{copy.feedback.screenshotHint}</NativeText>\n {block.options.viewShot ? (\n <NativeButton variant=\"outline\" size=\"sm\" onPress={() => setAnnotating(true)} testID={`${testID}-annotate`}>\n {copy.feedback.annotate}\n </NativeButton>\n ) : null}\n <NativeButton\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => {\n setScreenshot(null);\n setInclude(false);\n }}\n testID={`${testID}-remove-screenshot`}\n >\n {copy.feedback.removeScreenshot}\n </NativeButton>\n </View>\n </View>\n </View>\n ) : null}\n {/* Full screen, outside the page's scroll view: on iOS a scroll view takes a drag before the drawing can. */}\n {annotating && screenshot && block.options.viewShot ? (\n <Modal visible animationType=\"slide\" presentationStyle=\"fullScreen\" onRequestClose={() => {\n // Android back: like Cancel, never leave a screenshot included without the person's marks.\n setInclude(false);\n setAnnotating(false);\n }}>\n <SafeAreaView style={{ flex: 1, backgroundColor: colors.background }}>\n <View style={{ flex: 1, padding: 16, justifyContent: \"center\" }}>\n <ScreenshotAnnotator\n screenshot={screenshot}\n viewShot={block.options.viewShot}\n copy={copy.annotate}\n onCancel={(hadMarks) => {\n // Marks left unsaved: the screenshot would go without the parts the person meant to hide.\n if (hadMarks) setInclude(false);\n setAnnotating(false);\n }}\n onDone={(next, marked) => {\n setScreenshot(next);\n if (marked) setInclude(true);\n setAnnotating(false);\n }}\n testID={`${testID}-annotator`}\n />\n </View>\n </SafeAreaView>\n </Modal>\n ) : null}\n <NativeButton onPress={() => void send()} loading={sending} disabled={sending} testID={`${testID}-send`}>\n {sending ? copy.feedback.sending : copy.feedback.send}\n </NativeButton>\n </View>\n );\n}\n","/**\n * The support screens as hooks that return a Genesis layout's props, so each\n * route file is a layout and one hook:\n *\n * const inbox = useSupportInbox(); → <InboxPage {...inbox} />\n * const thread = useSupportThread(id); → <ThreadPage {...thread} />\n * const board = useIdeaBoard(); → <InboxPage {...board} />\n * const shipped = useShippedIdeas(); → <InboxPage {...shipped} />\n *\n * Data is read and cached with TanStack Query (the native shell's client),\n * under the `genesis-support` key root, never persisted.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Alert, View } from \"react-native\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { NativeButton, NativeInput } from \"@marktiderman/genesis-ui-native/components\";\nimport type { InboxItem, InboxPageProps, ThreadMessage, ThreadPageProps } from \"@marktiderman/genesis-ui-native/layouts\";\nimport type { SupportIdea, SupportReport } from \"../client\";\nimport { fill } from \"../copy\";\nimport { SUPPORT_QUERY_ROOT, useOptionalSupport, useSupport } from \"./support\";\n\nconst key = (...parts: string[]) => [SUPPORT_QUERY_ROOT, ...parts];\n\ntype InboxProps = Pick<\n InboxPageProps,\n \"items\" | \"refreshing\" | \"onRefresh\" | \"emptyTitle\" | \"emptyBody\" | \"emptyActionLabel\" | \"onEmptyAction\" | \"sectionTitle\" | \"header\" | \"testID\" | \"loading\" | \"error\" | \"errorTitle\" | \"errorBody\"\n> & { headerTitle: string };\n\n/** Help: the person's reports, newest first, with unread staff replies, and links to the idea board. */\nexport function useSupportInbox(): InboxProps {\n const block = useSupport();\n const { copy, paths, client } = block;\n const queryClient = useQueryClient();\n const query = useQuery({ queryKey: key(\"reports\"), queryFn: () => client.myReports() });\n const navigate = block.options.navigate;\n\n const confirmDelete = (report: SupportReport) =>\n Alert.alert(copy.inbox.deleteConfirmTitle, copy.inbox.deleteConfirmBody, [\n { text: copy.inbox.cancel, style: \"cancel\" },\n {\n text: copy.inbox.delete,\n style: \"destructive\",\n onPress: () => {\n void client\n .deleteReport(report.id)\n .then(() => queryClient.invalidateQueries({ queryKey: key(\"reports\") }))\n .catch(() => Alert.alert(copy.feedback.failedTitle, copy.feedback.failedBody));\n },\n },\n ]);\n\n const items: InboxItem[] = (query.data ?? []).map((report) => ({\n id: report.id,\n title: report.title || firstLine(report.message),\n preview: report.title ? firstLine(report.message) : undefined,\n timestamp: report.lastStaffReplyAt ?? report.createdAt,\n unread: report.unread,\n meta: `${copy.feedback.types[report.type]} · ${copy.status[report.status]}`,\n onPress: () => navigate(paths.thread(report.id)),\n swipeActions: [{ id: \"delete\", label: copy.inbox.delete, destructive: true, onPress: () => confirmDelete(report) }],\n testID: `genesis-support-report-${report.id}`,\n }));\n\n const header = (\n <View style={{ flexDirection: \"row\", flexWrap: \"wrap\", gap: 8, paddingHorizontal: 16, paddingBottom: 8 }}>\n <NativeButton size=\"sm\" onPress={() => void block.openFeedback({ screenshot: false })} testID=\"genesis-support-inbox-new\">\n {copy.inbox.sendFeedback}\n </NativeButton>\n {block.options.ideas === false ? null : (\n <>\n <NativeButton size=\"sm\" variant=\"outline\" onPress={() => navigate(paths.ideas)} testID=\"genesis-support-inbox-ideas\">\n {copy.inbox.ideaBoard}\n </NativeButton>\n <NativeButton size=\"sm\" variant=\"outline\" onPress={() => navigate(paths.shipped)} testID=\"genesis-support-inbox-shipped\">\n {copy.inbox.shipped}\n </NativeButton>\n </>\n )}\n </View>\n );\n\n return {\n testID: \"genesis-support-inbox\",\n headerTitle: copy.inbox.title,\n items,\n loading: query.isPending,\n error: query.isError,\n refreshing: query.isRefetching,\n onRefresh: async () => {\n await query.refetch();\n },\n sectionTitle: items.length ? copy.inbox.sectionTitle : undefined,\n header,\n emptyTitle: copy.inbox.emptyTitle,\n emptyBody: copy.inbox.emptyBody,\n errorTitle: copy.inbox.errorTitle,\n errorBody: copy.inbox.errorBody,\n };\n}\n\nfunction firstLine(text: string): string {\n const line = text.split(\"\\n\").find((l) => l.trim()) ?? \"\";\n return line.length > 120 ? `${line.slice(0, 119)}…` : line;\n}\n\ntype ThreadProps = Pick<ThreadPageProps, \"messages\" | \"composer\" | \"closedNotice\" | \"readAt\" | \"readLabel\" | \"emptyTitle\" | \"emptyBody\" | \"labels\" | \"testID\"> & {\n headerTitle: string;\n report: SupportReport | null;\n loading: boolean;\n /** Read, and there is no such report (deleted, or not the person's): leave the screen. */\n notFound: boolean;\n};\n\nconst CLOSED = new Set([\"addressed\", \"wont_fix\"]);\n\n/** One report as a conversation: the report itself, then the replies. Marks it read as it opens and as replies arrive. */\nexport function useSupportThread(reportId: string, options: { pollMs?: number } = {}): ThreadProps {\n const block = useSupport();\n const { copy, client } = block;\n const queryClient = useQueryClient();\n const poll = options.pollMs ?? 30_000;\n const report = useQuery({ queryKey: key(\"report\", reportId), queryFn: () => client.report(reportId), refetchInterval: poll });\n const replies = useQuery({ queryKey: key(\"replies\", reportId), queryFn: () => client.replies(reportId), refetchInterval: poll });\n const attachments = useQuery({ queryKey: key(\"attachments\", reportId), queryFn: () => client.attachments(reportId), staleTime: 50 * 60_000 });\n const [draft, setDraft] = useState(\"\");\n const [failed, setFailed] = useState<{ id: string; body: string; at: string }[]>([]);\n\n const lastStaff = report.data?.lastStaffReplyAt ?? null;\n useEffect(() => {\n if (!report.data) return;\n void client\n .markRead(reportId)\n .then(() => queryClient.invalidateQueries({ queryKey: key(\"reports\") }))\n .catch(() => undefined);\n // Again when a new staff reply arrives.\n }, [client, reportId, lastStaff, Boolean(report.data), queryClient]);\n\n const send = useMutation({\n mutationFn: (body: string) => client.reply(reportId, body),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: key(\"replies\", reportId) });\n void queryClient.invalidateQueries({ queryKey: key(\"report\", reportId) });\n },\n onError: (_error, body) => setFailed((f) => [...f, { id: `failed-${Date.now()}`, body, at: new Date().toISOString() }]),\n });\n\n const r = report.data ?? null;\n const messages: ThreadMessage[] = useMemo(() => {\n if (!r) return [];\n const first: ThreadMessage = {\n id: r.id,\n body: r.message,\n mine: true,\n timestamp: r.createdAt,\n attachments: (attachments.data ?? [])\n .filter((a) => a.url)\n .map((a) => ({ id: a.id, uri: a.url!, width: a.width ?? undefined, height: a.height ?? undefined, accessibilityLabel: copy.thread.screenshot })),\n };\n const rest: ThreadMessage[] = (replies.data ?? []).map((reply) => ({\n id: reply.id,\n body: reply.body,\n mine: reply.mine,\n authorName: reply.fromStaff ? copy.thread.support : undefined,\n timestamp: reply.createdAt,\n }));\n const pending: ThreadMessage[] = send.isPending && send.variables ? [{ id: \"sending\", body: send.variables, mine: true, timestamp: new Date().toISOString(), status: \"sending\" }] : [];\n const failedMessages: ThreadMessage[] = failed.map((f) => ({\n id: f.id,\n body: f.body,\n mine: true,\n timestamp: f.at,\n status: \"failed\",\n onRetry: () => {\n setFailed((all) => all.filter((x) => x.id !== f.id));\n send.mutate(f.body);\n },\n }));\n return [first, ...rest, ...pending, ...failedMessages];\n }, [r, replies.data, attachments.data, send.isPending, send.variables, failed, copy, send]);\n\n const closed = r ? CLOSED.has(r.status) : false;\n return {\n testID: \"genesis-support-thread\",\n headerTitle: r ? r.title || copy.feedback.types[r.type] : copy.thread.title,\n report: r,\n loading: report.isPending,\n notFound: report.isSuccess && r === null,\n labels: { you: copy.thread.you, sending: copy.thread.sending, notSent: copy.thread.notSent, retryHint: copy.thread.retryHint },\n messages,\n readAt: r?.staffReadAt ?? null,\n readLabel: copy.thread.read,\n emptyTitle: copy.thread.emptyTitle,\n emptyBody: copy.thread.emptyBody,\n closedNotice: copy.thread.closed,\n composer: closed\n ? null\n : {\n value: draft,\n onChangeText: setDraft,\n placeholder: copy.thread.placeholder,\n sendLabel: copy.thread.send,\n sending: send.isPending,\n maxLength: 10000,\n onSend: () => {\n const body = draft.trim();\n if (!body || send.isPending) return;\n setDraft(\"\");\n send.mutate(body);\n },\n },\n };\n}\n\n/** A vote toggle for an idea row. */\nexport function VoteButton({ idea, onToggle, testID }: { idea: SupportIdea; onToggle: () => void; testID?: string }) {\n const { copy } = useSupport();\n const count = idea.voteCount === 1 ? copy.ideas.oneVote : fill(copy.ideas.votes, { count: idea.voteCount });\n const open = idea.status === \"open\" || idea.status === \"planned\" || idea.status === \"in_progress\";\n return (\n <View accessibilityLabel={`${idea.voted ? copy.ideas.voted : copy.ideas.vote}, ${count}`}>\n <NativeButton size=\"sm\" variant={idea.voted ? \"default\" : \"outline\"} onPress={onToggle} disabled={!open && !idea.voted} testID={testID}>\n {`▲ ${idea.voteCount}`}\n </NativeButton>\n </View>\n );\n}\n\ntype BoardProps = Pick<InboxPageProps, \"items\" | \"refreshing\" | \"onRefresh\" | \"emptyTitle\" | \"emptyBody\" | \"header\" | \"testID\" | \"loading\" | \"error\" | \"errorTitle\" | \"errorBody\"> & {\n headerTitle: string;\n};\n\n/** The idea board: most votes first, a vote button on each, and a field to suggest one. */\nexport function useIdeaBoard(): BoardProps {\n const block = useSupport();\n const { copy, client } = block;\n const queryClient = useQueryClient();\n const query = useQuery({ queryKey: key(\"ideas\"), queryFn: () => client.ideas() });\n const [title, setTitle] = useState(\"\");\n\n const toggle = useMutation({\n mutationFn: (idea: SupportIdea) => (idea.voted ? client.unvote(idea.id) : client.vote(idea.id)),\n onMutate: async (idea) => {\n await queryClient.cancelQueries({ queryKey: key(\"ideas\") });\n const before = queryClient.getQueryData<SupportIdea[]>(key(\"ideas\"));\n queryClient.setQueryData<SupportIdea[]>(key(\"ideas\"), (list) =>\n list?.map((i) => (i.id === idea.id ? { ...i, voted: !i.voted, voteCount: Math.max(0, i.voteCount + (i.voted ? -1 : 1)) } : i)),\n );\n return { before };\n },\n onError: (_e, _idea, context) => {\n if (context?.before) queryClient.setQueryData(key(\"ideas\"), context.before);\n },\n onSettled: () => void queryClient.invalidateQueries({ queryKey: key(\"ideas\") }),\n });\n\n const suggest = useMutation({\n mutationFn: (t: string) => client.suggestIdea({ title: t }),\n onSuccess: () => {\n setTitle(\"\");\n void queryClient.invalidateQueries({ queryKey: key(\"ideas\") });\n },\n onError: (e) => Alert.alert(copy.feedback.failedTitle, (e as { code?: string }).code === \"GS429\" ? copy.feedback.rateLimited : copy.feedback.failedBody),\n });\n\n const items: InboxItem[] = (query.data ?? []).map((idea) => ({\n id: idea.id,\n title: idea.title,\n preview: idea.body ?? undefined,\n meta: copy.ideas.statuses[idea.status],\n // Swipe or long press: the same vote, for people who don't see the button.\n swipeActions: [{ id: \"vote\", label: idea.voted ? copy.ideas.voted : copy.ideas.vote, onPress: () => toggle.mutate(idea) }],\n leading: <View />,\n trailing: <VoteButton idea={idea} onToggle={() => toggle.mutate(idea)} testID={`genesis-support-vote-${idea.id}`} />,\n testID: `genesis-support-idea-${idea.id}`,\n }));\n\n const header: ReactNode = (\n <View style={{ flexDirection: \"row\", gap: 8, alignItems: \"flex-end\", paddingHorizontal: 16, paddingBottom: 12 }}>\n <View style={{ flex: 1 }}>\n <NativeInput\n testID=\"genesis-support-idea-title\"\n label={copy.ideas.titleLabel}\n placeholder={copy.ideas.titlePlaceholder}\n value={title}\n onChangeText={setTitle}\n maxLength={140}\n />\n </View>\n <NativeButton\n onPress={() => title.trim().length >= 3 && suggest.mutate(title.trim())}\n disabled={title.trim().length < 3}\n loading={suggest.isPending}\n testID=\"genesis-support-idea-submit\"\n >\n {copy.ideas.submit}\n </NativeButton>\n </View>\n );\n\n return {\n testID: \"genesis-support-ideas\",\n headerTitle: copy.ideas.title,\n items,\n refreshing: query.isRefetching,\n onRefresh: async () => {\n await query.refetch();\n },\n header,\n loading: query.isPending,\n error: query.isError,\n errorTitle: copy.inbox.errorTitle,\n errorBody: copy.inbox.errorBody,\n emptyTitle: copy.ideas.emptyTitle,\n emptyBody: copy.ideas.emptyBody,\n };\n}\n\n/** \"You asked, we shipped\": the shipped ideas the person suggested or voted for, with the FeatureId each shipped as. */\nexport function useShippedIdeas(): Omit<BoardProps, \"header\"> {\n const { copy, client } = useSupport();\n const query = useQuery({ queryKey: key(\"shipped\"), queryFn: () => client.shippedForMe() });\n const items: InboxItem[] = (query.data ?? []).map((idea) => ({\n id: idea.id,\n title: idea.title,\n preview: idea.body ?? undefined,\n timestamp: idea.shippedAt ?? undefined,\n meta: idea.featureId ? fill(copy.shipped.shippedAs, { feature: idea.featureId }) : copy.ideas.statuses.shipped,\n leading: <View />,\n testID: `genesis-support-shipped-${idea.id}`,\n }));\n return {\n testID: \"genesis-support-shipped\",\n headerTitle: copy.shipped.title,\n items,\n refreshing: query.isRefetching,\n onRefresh: async () => {\n await query.refetch();\n },\n loading: query.isPending,\n error: query.isError,\n errorTitle: copy.inbox.errorTitle,\n errorBody: copy.inbox.errorBody,\n emptyTitle: copy.shipped.emptyTitle,\n emptyBody: copy.shipped.emptyBody,\n };\n}\n\n/**\n * \"Send feedback\", for a devtools panel's slot or any screen: captures the\n * screen, then opens the feedback screen. Renders nothing when support is off.\n */\nexport function SendFeedbackButton({ testID = \"genesis-support-send-feedback-button\", screenshot = true }: { testID?: string; screenshot?: boolean }) {\n const block = useOptionalSupport();\n if (!block) return null;\n return (\n <NativeButton variant=\"outline\" onPress={() => void block.openFeedback({ screenshot })} testID={testID}>\n {block.copy.settings.sendFeedback}\n </NativeButton>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/native/modules.ts","../src/native/support.tsx","../src/native/annotator.tsx","../src/native/feedback-form.tsx","../src/native/screens.tsx"],"names":["Dimensions","all","jsx","NativeButton","useThemeRoles","useState","useEffect","jsxs","View","NativeSegmentedControl","Image","NativeText","useQueryClient","useQuery","Alert"],"mappings":";;;;;;;;;;;;AAgDO,SAAS,cAAA,CAAe,aAAA,EAAkC,OAAA,EAAqB,OAAA,GAAwB,EAAC,EAAe;AAC5H,EAAA,MAAM,EAAE,SAAA,GAAY,GAAA,EAAK,KAAA,GAAQ,GAAG,QAAA,GAAW,GAAA,EAAM,UAAA,GAAa,GAAA,EAAM,UAAA,GAAa,GAAA,EAAK,GAAA,GAAM,IAAA,CAAK,KAAI,GAAI,OAAA;AAC7G,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,aAAA,CAAc,oBAAoB,UAAU,CAAA;AAC5C,EAAA,MAAM,YAAA,GAAe,cAAc,WAAA,CAAY,CAAC,EAAE,CAAA,EAAG,CAAA,EAAG,GAAE,KAAM;AAC9D,IAAA,MAAM,IAAI,GAAA,EAAI;AACd,IAAA,IAAI,IAAI,UAAA,EAAY;AACpB,IAAA,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,SAAA,EAAW;AAClD,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACb,IAAA,OAAO,MAAA,CAAO,UAAU,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAK,QAAA,SAAiB,KAAA,EAAM;AAChE,IAAA,IAAI,MAAA,CAAO,UAAU,KAAA,EAAO;AAC1B,MAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAChB,MAAA,UAAA,GAAa,CAAA,GAAI,UAAA;AACjB,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,MAAM,aAAa,MAAA,EAAO;AACnC;AC6BA,IAAM,cAAA,GAAiB,cAAmC,IAAI,CAAA;AAG9D,IAAM,eAAA,GAAkB,GAAA;AAGjB,SAAS,UAAA,GAA2B;AACzC,EAAA,MAAM,KAAA,GAAQ,WAAW,cAAc,CAAA;AACvC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,0HAAqH,CAAA;AACjJ,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,kBAAA,GAA0C;AACxD,EAAA,OAAO,WAAW,cAAc,CAAA;AAClC;AAEO,SAAS,eAAA,CAAgB,EAAE,KAAA,EAAO,QAAA,EAAS,EAAkD;AAClG,EAAA,2BAAQ,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,OAAQ,QAAA,EAAS,CAAA;AAC1D;AAEO,IAAM,kBAAA,GAAqB;AAG3B,SAAS,gBAAA,GAA2B;AACzC,EAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,SAAS,EAAE,QAAA,EAAU,CAAC,kBAAA,EAAoB,SAAS,CAAA,EAAG,OAAA,EAAS,MAAM,KAAA,CAAM,MAAA,CAAO,WAAU,EAAG,SAAA,EAAW,KAAQ,CAAA;AACnI,EAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAC9C;AAEO,SAAS,cAAc,OAAA,EAAuC;AACnE,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,oBAAoB,OAAA,CAAQ,QAAA,EAAU,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AAC3E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,QAAA,CAAS,EAAA;AAC9C,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,IAAI,OAAA,GAAkC,IAAA;AACtC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgB;AACtC,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAiC;AACnD,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,KAAA,MAAW,CAAA,IAAK,WAAW,CAAA,EAAE;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,WAAW,sBAAA,CAAuB;AAAA,IACtC,QAAA;AAAA,IACA,UAAA,EAAY,OAAO,OAAA,CAAQ,UAAA,KAAe,aAAa,OAAA,CAAQ,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA;AAAA,IAC1F,KAAA,EAAO,MAAM,KAAA,IAAS,MAAA;AAAA,IACtB,QAAQ,MAAM;AACZ,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AACtC,MAAA,OAAO,EAAE,EAAA,EAAI,QAAA,EAAU,SAAA,EAAW,MAAA,CAAO,SAAS,OAAO,CAAA,EAAG,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,CAAK,MAAM,MAAA,CAAO,KAAK,CAAA,EAAG,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,EAAE;AAAA,IAClK;AAAA,GACD,CAAA;AACD,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA,GAAY,kBAAkB,QAAA,EAAU,OAAA,CAAQ,SAAS,CAAA,GAAI,QAAA;AAEvF,EAAA,MAAM,cAAc,kBAAA,CAAmB;AAAA,IACrC,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,iBAAiB,MAAM;AACrB,MAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,MAAA,OAAO,MAAA,GAAS,KAAK,IAAA,CAAK,QAAA,CAAS,eAAe,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,GAAI,IAAA;AAAA,IACzE;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,EAAgB,KAAA,KAA+B;AAC7D,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,KAAK,CAAA;AAAA,IACpF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,OAAA,GAAU,KAAA;AAId,EAAA,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAW,KAAA,EAAM,EAA6D;AACxG,IAAA,uBACE,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,MAAA,EAAO,mCAAA;AAAA,QACP,SAAS,YAAY;AACnB,UAAA,MAAM,SAAS,KAAA,EAAM;AAErB,UAAA,OAAO,MAAA,YAAkB,OAAA,GAAU,MAAA,GAAS,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,eAAe,CAAC,CAAA,CAAA;AACzG,UAAA,KAAK,KAAA,CAAM,YAAA,CAAa,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA,EAAE,EAAG,CAAA;AAAA,QAC5E,CAAA;AAAA,QAEC,eAAK,QAAA,CAAS;AAAA;AAAA,KACjB;AAAA,EAEJ;AAEA,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,GAAG,WAAA;AAAA,IACH,WAAA,EAAa,EAAE,GAAG,WAAA,CAAY,aAAa,KAAA,EAAO,EAAE,gBAAA,EAAkB,gBAAA,EAAyC,EAAE;AAAA,IACjH,SAAA,EAAW,CAAC,QAAQ,CAAA;AAAA,IACpB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAM,YAAA,CAAa,EAAE,UAAA,GAAa,IAAA,EAAM,OAAO,OAAA,GAAU,CAAA,EAAE,GAAI,EAAC,EAAG;AACjE,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAI;AAEF,QAAA,IAAI,OAAA,GAAU,CAAA,EAAG,MAAM,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAC5E,QAAA,IAAI,IAAA,GAAiC,IAAA;AACrC,QAAA,IAAI,UAAA,IAAc,QAAQ,QAAA,EAAU;AAClC,UAAA,IAAI;AACF,YAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,QAAA,CAAS,aAAA,CAAc,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,CAAA;AACpG,YAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AACtC,YAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,QAAQ,EAAE,KAAA,IAAS,CAAA;AAChD,YAAA,IAAA,GAAO,EAAE,GAAA,EAAK,WAAA,EAAa,YAAA,EAAc,KAAA,EAAO,KAAK,KAAA,CAAM,MAAA,CAAO,KAAA,GAAQ,KAAK,GAAG,MAAA,EAAQ,IAAA,CAAK,MAAM,MAAA,CAAO,MAAA,GAAS,KAAK,CAAA,EAAE;AAAA,UAC9H,SAAS,KAAA,EAAO;AACd,YAAA,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,UACzB;AAAA,QACF;AACA,QAAA,UAAA,CAAW,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,OAAO,CAAA;AAC7C,QAAA,OAAA,CAAQ,QAAA,CAAS,MAAM,QAAQ,CAAA;AAAA,MACjC,CAAA,SAAE;AACA,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAAA,IACF,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAM,CAAA,GAAI,OAAA;AACV,MAAA,IAAI,CAAA,aAAc,IAAI,CAAA;AACtB,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AAAA,IACA,aAAa,MAAM,OAAA;AAAA,IACnB,iBAAiB,QAAA,EAAU;AACzB,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,MAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,cAAc,MAAM,KAAA;AAAA,IACpB,IAAA,EAAM,SAAS,WAAA,CAAY,EAAE,UAAS,EAAG;AACvC,MAAA,MAAM,OAAA,GAAA,CAAW,OAAA,CAAQ,eAAA,IAAmB,OAAA,GAAS;AACrD,MAAA,SAAA,CAAU,MAAM;AACd,QAAA,IAAI,SAAS,KAAA,GAAQ,OAAA;AAAA,MACvB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACZ,MAAA,SAAA,CAAU,MAAM;AACd,QAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,UAAU,KAAA,EAAO;AACvD,QAAA,IAAI;AACF,UAAA,OAAO,cAAA;AAAA,YACL,OAAA,CAAQ,aAAA;AAAA,YACR,MAAM;AAEJ,cAAA,IAAI,KAAA,IAAS,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA,EAAG;AAC5C,cAAA,KAAK,MAAM,YAAA,EAAa;AAAA,YAC1B,CAAA;AAAA,YACA,OAAA,CAAQ,SAAS;AAAC,WACpB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,MACF,CAAA,EAAG,EAAE,CAAA;AACL,MAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAe,QAAA,EAAS,CAAA;AAAA,IAClD;AAAA,GACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,OAAA,GAAkB;AACzB,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,kBAAA,GAA6C;AAC3D,EAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,EAAA,OAAO,qBAAqB,KAAA,CAAM,gBAAA,EAAkB,KAAA,CAAM,WAAA,EAAa,MAAM,WAAW,CAAA;AAC1F;ACxPA,IAAM,GAAA,GAAM,CAAA;AAEZ,IAAM,QAAA,GAAW,GAAA;AAGV,SAAS,UAAA,CAAW,MAAA,EAA0B,OAAA,GAAU,GAAA,GAAM,CAAA,EAAY;AAC/E,EAAA,MAAM,OAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACzB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,GAAI,KAAK,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA;AAClD,MAAA,KAAA,IAAS,CAAA,GAAI,OAAA,EAAS,CAAA,GAAI,IAAA,EAAM,CAAA,IAAK,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA,GAAK,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,CAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA,GAAK,IAAA,EAAM,CAAA;AAAA,IAC9I;AACA,IAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACb;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,KAAA,CAAM,GAAU,IAAA,EAAgD;AAC9E,EAAA,MAAM,MAAM,CAAC,CAAA,EAAW,GAAA,KAAiB,MAAA,CAAO,SAAS,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,GAAA,IAAO,CAAC,CAAA,GAAI,CAAA;AACnG,EAAA,OAAO,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,GAAG,IAAA,CAAK,KAAK,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAE;AAC7D;AAEO,SAAS,KAAA,CAAM,MAAa,EAAA,EAAW;AAC5C,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAG,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,CAAA,GAAI,KAAK,CAAC,CAAA,EAAG,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAE;AACtI;AAaO,SAAS,mBAAA,CAAoB,EAAE,UAAA,EAAY,QAAA,EAAU,MAAM,MAAA,EAAQ,QAAA,EAAU,MAAA,GAAS,2BAAA,EAA4B,EAA6B;AACpJ,EAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAyC,IAAI,CAAA;AAG7D,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,CAAC,IAAA,KAA2C;AACpE,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB,CAAC,CAAA,CAAE,OAAA;AACH,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAyB,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAiB,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAsB,IAAI,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,OAAO,IAAI,CAAA;AAC3B,EAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,EAAA,MAAM,QAAA,GAAW,OAAoB,IAAI,CAAA;AAGzC,EAAA,MAAM,QAAQ,UAAA,CAAW,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,WAAW,MAAM,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAMA,UAAAA,CAAW,IAAI,QAAQ,CAAA,CAAE,SAAS,IAAI,CAAA;AACnE,EAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,KAAA,CAAM,SAAA,GAAY,KAAK,CAAC,CAAA,GAAI,CAAA;AAC1E,EAAA,MAAM,SAAS,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAK,CAAA,GAAI,CAAA;AACzD,EAAA,MAAM,OAAO,MAAA,CAAO,EAAE,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,CAAA;AAC3C,EAAA,IAAA,CAAK,OAAA,GAAU,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,EAAO;AACzC,EAAA,MAAM,QAAQ,MAAA,CAAc,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAE1C,EAAA,MAAM,SAAA,GAAY,MAAA;AAAA,IAChB,aAAa,MAAA,CAAO;AAAA,MAClB,8BAA8B,MAAM,IAAA;AAAA,MACpC,6BAA6B,MAAM,IAAA;AAAA;AAAA,MAEnC,kCAAkC,MAAM,KAAA;AAAA,MACxC,mBAAA,EAAqB,CAAC,KAAA,KAAU;AAC9B,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,EAAE,CAAA,EAAG,KAAA,CAAM,WAAA,CAAY,SAAA,EAAW,CAAA,EAAG,KAAA,CAAM,WAAA,CAAY,SAAA,EAAU,EAAG,KAAK,OAAO,CAAA;AAChG,QAAA,KAAA,CAAM,OAAA,GAAU,CAAA;AAChB,QAAA,QAAA,CAAS,UAAU,OAAA,CAAQ,OAAA,KAAY,QAAQ,EAAE,IAAA,EAAM,OAAO,MAAA,EAAQ,CAAC,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAE;AAC7G,QAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,MAC3B,CAAA;AAAA,MACA,kBAAA,EAAoB,CAAC,MAAA,EAAQ,OAAA,KAAY;AAEvC,QAAA,MAAM,IAAI,KAAA,CAAM,EAAE,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,GAAI,OAAA,CAAQ,EAAA,EAAI,CAAA,EAAG,MAAM,OAAA,CAAQ,CAAA,GAAI,QAAQ,EAAA,EAAG,EAAG,KAAK,OAAO,CAAA;AAClG,QAAA,MAAM,IAAI,QAAA,CAAS,OAAA;AACnB,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,KAAS,QAAQ,EAAE,IAAA,EAAM,OAAO,MAAA,EAAQ,CAAC,GAAG,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,EAAE,GAAI,EAAE,GAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AAChG,QAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,MAC3B,CAAA;AAAA,MACA,uBAAuB,MAAM;AAC3B,QAAA,MAAM,IAAI,QAAA,CAAS,OAAA;AACnB,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,IAAI,CAAA,WAAY,CAACC,IAAAA,KAAQ,CAAC,GAAGA,IAAAA,EAAK,CAAC,CAAC,CAAA;AAAA,MACtC,CAAA;AAAA;AAAA,MAEA,yBAAyB,MAAM;AAC7B,QAAA,MAAM,IAAI,QAAA,CAAS,OAAA;AACnB,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,IAAI,CAAA,WAAY,CAACA,IAAAA,KAAQ,CAAC,GAAGA,IAAAA,EAAK,CAAC,CAAC,CAAA;AAAA,MACtC;AAAA,KACD;AAAA,GACH,CAAE,OAAA;AAEF,EAAA,MAAM,OAAO,YAAY;AACvB,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AACxB,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,YAAY,CAAA;AAC3G,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,MAAA,CAAO,EAAE,GAAG,UAAA,EAAY,KAAK,WAAA,EAAa,YAAA,IAAgB,IAAI,CAAA;AAAA,IAChE,CAAA,CAAA,MAAQ;AAEN,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,MAAM,MAAM,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,KAAK,CAAA,GAAI,KAAA;AACxC,EAAA,4BACG,IAAA,EAAA,EAAK,MAAA,EAAgB,OAAO,EAAE,GAAA,EAAK,IAAG,EACrC,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,cAAA,EAAgB,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,EAAA,EAAG,EAAI,eAAK,IAAA,EAAK,CAAA;AAAA,oBAC9FA,GAAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,GAAG,MAAM,CAAA,KAAA,CAAA;AAAA,QACjB,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAK,GAAA,EAAI;AAAA,UAChC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,KAAK,IAAA;AAAK,SACpC;AAAA,QACA,KAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAmB;AAAA;AAAA,KAC9C;AAAA,oBACAA,IAAC,IAAA,EAAA,EAAK,QAAA,EAAU,CAAC,CAAA,KAAyB,QAAA,CAAS,EAAE,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,EAAG,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,IAC9F,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAK,UAAA,EAAY,WAAA,EAAa,OAAO,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,QAAA,CAAA,EAAY,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA,EAAU,OAAO,QAAA,IAAY,MAAA,EAAQ,QAAQ,MAAA,IAAU,GAAA,EAAK,UAAU,QAAA,EAAU,YAAA,EAAc,IAAG,EAAI,GAAG,UAAU,WAAA,EAC5M,QAAA,EAAA;AAAA,sBAAAA,IAAC,KAAA,EAAA,EAAM,MAAA,EAAQ,EAAE,GAAA,EAAK,UAAA,CAAW,KAAI,EAAG,KAAA,EAAO,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,IAAU,UAAA,EAAW,SAAA,EAAU,kCAAgC,IAAA,EAAC,CAAA;AAAA,MACvI,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AACpB,QAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,KAAK,EAAE,CAAA;AACpC,UAAA,uBAAOA,IAAC,IAAA,EAAA,EAAa,MAAA,EAAQ,GAAG,MAAM,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA,EAAI,aAAA,EAAc,QAAO,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,GAAG,KAAK,eAAA,EAAiB,MAAA,CAAO,KAAA,EAAM,EAAA,EAA5H,CAA+H,CAAA;AAAA,QACnJ;AACA,QAAA,OAAO,WAAW,IAAA,CAAK,MAAM,EAAE,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC3C,UAAA,IAAI,IAAA,EAAA,GAAS,UAAU,OAAO,IAAA;AAC9B,UAAA,uBACEA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,aAAA,EAAc,MAAA;AAAA,cACd,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,MAAM,CAAA,CAAE,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,GAAA,EAAK,CAAA,CAAE,IAAI,GAAA,GAAM,CAAA,EAAG,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,cAAc,GAAA,GAAM,CAAA,EAAG,eAAA,EAAiB,MAAA,CAAO,WAAA;AAAY,aAAA;AAAA,YAFvJ,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,WAGhB;AAAA,QAEJ,CAAC,CAAA;AAAA,MACH,CAAC;AAAA,KAAA,EACH,CAAA,EACF,CAAA;AAAA,IACC,MAAA,mBACCA,GAAAA,CAAC,UAAA,EAAA,EAAW,QAAQ,CAAA,EAAG,MAAM,CAAA,OAAA,CAAA,EAAW,uBAAA,EAAwB,QAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,aAAa,QAAA,EAAU,EAAA,EAAI,YAAY,EAAA,EAAG,EACvI,QAAA,EAAA,IAAA,CAAK,MAAA,EACR,CAAA,GACE,IAAA;AAAA,oBACJ,IAAA,CAAC,QAAK,KAAA,EAAO,EAAE,eAAe,KAAA,EAAO,GAAA,EAAK,GAAE,EAC1C,QAAA,EAAA;AAAA,sBAAAA,IAACC,YAAAA,EAAA,EAAa,SAAQ,OAAA,EAAQ,OAAA,EAAS,MAAM,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,IAAK,KAAA,KAAU,IAAI,CAAA,EAAG,MAAA,EAAQ,GAAG,MAAM,CAAA,OAAA,CAAA,EACzG,eAAK,MAAA,EACR,CAAA;AAAA,sBACAD,GAAAA,CAACC,YAAAA,EAAA,EAAa,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,EAAG,QAAA,EAAU,CAAC,KAAA,CAAM,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA,EACvH,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,sBACAD,GAAAA,CAAC,IAAA,EAAA,EAAK,OAAO,EAAE,IAAA,EAAM,GAAE,EAAG,CAAA;AAAA,sBAC1BA,GAAAA,CAACC,YAAAA,EAAA,EAAa,OAAA,EAAS,MAAM,KAAK,IAAA,EAAK,EAAG,OAAA,EAAS,QAAQ,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA,EACzE,eAAK,IAAA,EACR;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACvKO,SAAS,YAAA,CAAa,EAAE,WAAA,GAAc,KAAA,EAAO,QAAQ,SAAA,GAAY,IAAA,EAAM,MAAA,GAAS,0BAAA,EAA2B,EAAsB;AACtI,EAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,MAAM,SAASC,aAAAA,EAAc;AAC7B,EAAA,MAAM,cAAc,cAAA,EAAe;AAEnC,EAAA,MAAM,CAAC,MAAM,CAAA,GAAIC,SAAiC,MAAM,KAAA,CAAM,aAAa,CAAA;AAC3E,EAAAC,UAAU,MAAM;AACd,IAAA,KAAA,CAAM,WAAA,EAAY;AAAA,EACpB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAID,SAAuB,WAAW,CAAA;AAC1D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAIA,QAAAA,CAAmC,MAAA,EAAQ,cAAc,IAAI,CAAA;AAEjG,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAAC,UAAU,MAAM,QAAA,CAAS,IAAI,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEzC,EAAA,MAAM,OAAO,YAAY;AACvB,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG;AACnB,MAAA,QAAA,CAAS,IAAA,CAAK,SAAS,eAAe,CAAA;AACtC,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,SAAA,CAAU,OAAA,EAAQ;AAE9C,MAAA,MAAM,KAAA,GAAQ,MAAA,EAAQ,KAAA,IAAS,CAAC,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,KAAA,CAAA;AAC5F,MAAA,IAAI,KAAA,UAAe,KAAA,GAAQ,KAAA;AAAA,kBACf,OAAA,CAAQ,KAAA;AACpB,MAAA,IAAI,MAAA,EAAQ,KAAA,EAAO,OAAA,CAAQ,KAAA,GAAQ,EAAE,GAAG,OAAA,CAAQ,KAAA,EAAO,GAAG,MAAA,CAAO,KAAA,EAAM;AACvE,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO;AAAA,QACzC,IAAA;AAAA,QACA,OAAA,EAAS,QAAQ,IAAA,EAAK;AAAA,QACtB,OAAA;AAAA,QACA,WAAA,EAAa,cAAc,OAAA,GAAU,CAAC,EAAE,IAAA,EAAM,YAAA,EAAc,aAAa,UAAA,CAAW,WAAA,EAAa,QAAQ,UAAA,CAAW,GAAA,EAAK,OAAO,UAAA,CAAW,KAAA,EAAO,QAAQ,UAAA,CAAW,MAAA,EAAQ,CAAA,GAAI;AAAC,OACnL,CAAA;AACD,MAAA,KAAK,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,CAAC,kBAAA,EAAoB,SAAS,GAAG,CAAA;AAChF,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,IAAI,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,QAAA,CAAS,kBAAA,GAAqB,IAAA,CAAK,QAAA,CAAS,qBAAA,GAAwB,IAAA,CAAK,SAAS,QAAQ,CAAA;AAC9I,MAAA,MAAA,GAAS,QAAQ,CAAA;AAAA,IACnB,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,GAAA,GAAM,CAAA,YAAa,YAAA,GAAe,CAAA,GAAI,IAAA;AAC5C,MAAA,QAAA,CAAS,GAAA,EAAK,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,WAAA,GAAc,GAAA,EAAK,IAAA,KAAS,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,WAAA,GAAc,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,IACtI,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,KAACC,IAAAA,EAAA,EAAK,QAAgB,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EACrC,QAAA,EAAA;AAAA,oBAAAD,KAACC,IAAAA,EAAA,EAAK,OAAO,EAAE,GAAA,EAAK,GAAE,EACpB,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,WAAA,EAAA,EAAa,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,sBACtCA,GAAAA;AAAA,QAACO,sBAAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,GAAG,MAAM,CAAA,KAAA,CAAA;AAAA,UACjB,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,CAAC,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAC,GAAE,CAAE,CAAA;AAAA,UAChF,KAAA,EAAO,IAAA;AAAA,UACP,QAAA,EAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAiB;AAAA;AAAA;AAC5C,KAAA,EACF,CAAA;AAAA,oBACAP,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,GAAG,MAAM,CAAA,QAAA,CAAA;AAAA,QACjB,KAAA,EAAO,KAAK,QAAA,CAAS,YAAA;AAAA,QACrB,WAAA,EAAa,KAAK,QAAA,CAAS,kBAAA;AAAA,QAC3B,KAAA,EAAO,OAAA;AAAA,QACP,YAAA,EAAc,UAAA;AAAA,QACd,SAAA,EAAW,GAAA;AAAA,QACX,IAAA,EAAM,CAAA;AAAA,QACN,OAAO,KAAA,IAAS;AAAA;AAAA,KAClB;AAAA,IACC,UAAA,mBACCK,IAAAA,CAACC,IAAAA,EAAA,EAAK,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,WAAA,CAAA,EAAe,KAAA,EAAO,EAAE,GAAA,EAAK,GAAE,EACpD,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,WAAA,EAAA,EAAa,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,eAAA,EAAgB,CAAA;AAAA,sBAC5CK,IAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,aAAA,EAAe,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,UAAA,EAAY,YAAA,EAAa,EACrE,QAAA,EAAA;AAAA,wBAAAN,GAAAA;AAAA,UAACQ,KAAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,EAAE,GAAA,EAAK,UAAA,CAAW,GAAA,EAAI;AAAA,YAC9B,kBAAA,EAAoB,KAAK,QAAA,CAAS,eAAA;AAAA,YAClC,KAAA,EAAO,EAAE,KAAA,EAAO,EAAA,EAAI,QAAQ,IAAA,CAAK,KAAA,CAAO,KAAK,UAAA,CAAW,MAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,WAAW,KAAK,CAAC,GAAG,YAAA,EAAc,CAAA,EAAG,eAAA,EAAiB,MAAA,CAAO,IAAA;AAAK;AAAA,SAClJ;AAAA,wBACAH,IAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE,EAC7B,QAAA,EAAA;AAAA,0BAAAD,IAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,eAAA,EAAiB,GAAA,EAAK,GAAE,EACjG,QAAA,EAAA;AAAA,4BAAAN,IAACS,UAAAA,EAAA,EAAW,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,UAAU,EAAA,EAAI,UAAA,EAAY,IAAG,EAAI,QAAA,EAAA,IAAA,CAAK,SAAS,iBAAA,EAAkB,CAAA;AAAA,4BACpHT,GAAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,MAAA,EAAQ,GAAG,MAAM,CAAA,mBAAA,CAAA;AAAA,gBACjB,kBAAA,EAAoB,KAAK,QAAA,CAAS,iBAAA;AAAA,gBAClC,OAAA,EAAS,OAAA;AAAA,gBACT,eAAA,EAAiB;AAAA;AAAA;AACnB,WAAA,EACF,CAAA;AAAA,0BACAA,GAAAA,CAACS,UAAAA,EAAA,EAAW,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,cAAA,EAAgB,QAAA,EAAU,IAAI,UAAA,EAAY,EAAA,EAAG,EAAI,QAAA,EAAA,IAAA,CAAK,SAAS,cAAA,EAAe,CAAA;AAAA,UAChH,KAAA,CAAM,QAAQ,QAAA,mBACbT,IAACC,YAAAA,EAAA,EAAa,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,SAAS,MAAM,aAAA,CAAc,IAAI,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,SAAA,CAAA,EAC5F,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,QAAA,EACjB,CAAA,GACE,IAAA;AAAA,0BACJD,GAAAA;AAAA,YAACC,YAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAS,MAAM;AACb,gBAAA,aAAA,CAAc,IAAI,CAAA;AAClB,gBAAA,UAAA,CAAW,KAAK,CAAA;AAAA,cAClB,CAAA;AAAA,cACA,MAAA,EAAQ,GAAG,MAAM,CAAA,kBAAA,CAAA;AAAA,cAEhB,eAAK,QAAA,CAAS;AAAA;AAAA;AACjB,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,GACE,IAAA;AAAA,IAEH,UAAA,IAAc,UAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,2BACzCD,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAO,MAAC,aAAA,EAAc,OAAA,EAAQ,iBAAA,EAAkB,YAAA,EAAa,gBAAgB,MAAM;AAEtF,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,CAAA,EACA,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,eAAA,EAAiB,MAAA,CAAO,UAAA,EAAW,EACjE,0BAAAA,GAAAA,CAACM,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,EAAA,EAAI,cAAA,EAAgB,QAAA,EAAS,EAC5D,QAAA,kBAAAN,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,UAAA;AAAA,QACA,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,QACxB,MAAM,IAAA,CAAK,QAAA;AAAA,QACX,QAAA,EAAU,CAAC,QAAA,KAAa;AAEtB,UAAA,IAAI,QAAA,aAAqB,KAAK,CAAA;AAC9B,UAAA,aAAA,CAAc,KAAK,CAAA;AAAA,QACrB,CAAA;AAAA,QACA,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,KAAW;AACxB,UAAA,aAAA,CAAc,IAAI,CAAA;AAClB,UAAA,IAAI,MAAA,aAAmB,IAAI,CAAA;AAC3B,UAAA,aAAA,CAAc,KAAK,CAAA;AAAA,QACrB,CAAA;AAAA,QACA,MAAA,EAAQ,GAAG,MAAM,CAAA,UAAA;AAAA;AAAA,KACnB,EACF,CAAA,EACF,CAAA,EACF,CAAA,GACE,IAAA;AAAA,oBACJA,IAACC,YAAAA,EAAA,EAAa,SAAS,MAAM,KAAK,IAAA,EAAK,EAAG,OAAA,EAAS,OAAA,EAAS,UAAU,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA,EAC7F,QAAA,EAAA,OAAA,GAAU,KAAK,QAAA,CAAS,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EACnD;AAAA,GAAA,EACF,CAAA;AAEJ;AC1JA,IAAM,MAAM,CAAA,GAAI,KAAA,KAAoB,CAAC,kBAAA,EAAoB,GAAG,KAAK,CAAA;AAQ1D,SAAS,eAAA,GAA8B;AAC5C,EAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAO,GAAI,KAAA;AAChC,EAAA,MAAM,cAAcS,cAAAA,EAAe;AACnC,EAAA,MAAM,KAAA,GAAQC,QAAAA,CAAS,EAAE,QAAA,EAAU,GAAA,CAAI,SAAS,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,SAAA,EAAU,EAAG,CAAA;AACtF,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,QAAA;AAE/B,EAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,KACrBC,KAAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,kBAAA,EAAoB,IAAA,CAAK,KAAA,CAAM,iBAAA,EAAmB;AAAA,IACvE,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,IAC3C;AAAA,MACE,IAAA,EAAM,KAAK,KAAA,CAAM,MAAA;AAAA,MACjB,KAAA,EAAO,aAAA;AAAA,MACP,SAAS,MAAM;AACb,QAAA,KAAK,MAAA,CACF,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA,CACtB,IAAA,CAAK,MAAM,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,GAAA,CAAI,SAAS,CAAA,EAAG,CAAC,CAAA,CACtE,KAAA,CAAM,MAAMA,KAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa,IAAA,CAAK,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,MACjF;AAAA;AACF,GACD,CAAA;AAEH,EAAA,MAAM,SAAsB,KAAA,CAAM,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IAC7D,IAAI,MAAA,CAAO,EAAA;AAAA,IACX,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,SAAA,CAAU,OAAO,OAAO,CAAA;AAAA,IAC/C,SAAS,MAAA,CAAO,KAAA,GAAQ,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AAAA,IACpD,SAAA,EAAW,MAAA,CAAO,gBAAA,IAAoB,MAAA,CAAO,SAAA;AAAA,IAC7C,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,CAAA,MAAA,EAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,IACzE,SAAS,MAAM,QAAA,CAAS,MAAM,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IAC/C,cAAc,CAAC,EAAE,EAAA,EAAI,QAAA,EAAU,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,WAAA,EAAa,MAAM,OAAA,EAAS,MAAM,aAAA,CAAc,MAAM,GAAG,CAAA;AAAA,IAClH,MAAA,EAAQ,CAAA,uBAAA,EAA0B,MAAA,CAAO,EAAE,CAAA;AAAA,GAC7C,CAAE,CAAA;AAEF,EAAA,MAAM,yBACJP,IAAAA,CAACC,IAAAA,EAAA,EAAK,OAAO,EAAE,aAAA,EAAe,KAAA,EAAO,QAAA,EAAU,QAAQ,GAAA,EAAK,CAAA,EAAG,mBAAmB,EAAA,EAAI,aAAA,EAAe,GAAE,EACrG,QAAA,EAAA;AAAA,oBAAAN,IAACC,YAAAA,EAAA,EAAa,MAAK,IAAA,EAAK,OAAA,EAAS,MAAM,KAAK,KAAA,CAAM,aAAa,EAAE,UAAA,EAAY,OAAO,CAAA,EAAG,QAAO,2BAAA,EAC3F,QAAA,EAAA,IAAA,CAAK,MAAM,YAAA,EACd,CAAA;AAAA,IACC,MAAM,OAAA,CAAQ,KAAA,KAAU,QAAQ,IAAA,mBAC/BI,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAL,IAACC,YAAAA,EAAA,EAAa,IAAA,EAAK,IAAA,EAAK,SAAQ,SAAA,EAAU,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,KAAK,CAAA,EAAG,QAAO,6BAAA,EACpF,QAAA,EAAA,IAAA,CAAK,MAAM,SAAA,EACd,CAAA;AAAA,sBACAD,GAAAA,CAACC,YAAAA,EAAA,EAAa,IAAA,EAAK,IAAA,EAAK,SAAQ,SAAA,EAAU,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,OAAO,CAAA,EAAG,QAAO,+BAAA,EACtF,QAAA,EAAA,IAAA,CAAK,MAAM,OAAA,EACd;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,uBAAA;AAAA,IACR,WAAA,EAAa,KAAK,KAAA,CAAM,KAAA;AAAA,IACxB,KAAA;AAAA,IACA,SAAS,KAAA,CAAM,SAAA;AAAA,IACf,OAAO,KAAA,CAAM,OAAA;AAAA,IACb,YAAY,KAAA,CAAM,YAAA;AAAA,IAClB,WAAW,YAAY;AACrB,MAAA,MAAM,MAAM,OAAA,EAAQ;AAAA,IACtB,CAAA;AAAA,IACA,YAAA,EAAc,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,MAAM,YAAA,GAAe,MAAA;AAAA,IACvD,MAAA;AAAA,IACA,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,IACvB,SAAA,EAAW,KAAK,KAAA,CAAM,SAAA;AAAA,IACtB,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,IACvB,SAAA,EAAW,KAAK,KAAA,CAAM;AAAA,GACxB;AACF;AAEA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,IAAK,EAAA;AACvD,EAAA,OAAO,IAAA,CAAK,SAAS,GAAA,GAAM,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAA,GAAM,IAAA;AACxD;AAmBO,SAAS,uBAAuB,QAAA,EAA+H;AACpK,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,UAAA,EAAW;AAC9B,EAAA,MAAM,QAAQU,QAAAA,CAAS,EAAE,QAAA,EAAU,GAAA,CAAI,UAAU,QAAQ,CAAA,EAAG,OAAA,EAAS,MAAM,OAAO,MAAA,CAAO,QAAQ,CAAA,EAAG,SAAA,EAAW,UAAU,CAAA;AACzH,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,IAAQ,MAAM,cAAA,EAAgB,KAAA,CAAM,IAAA,EAAM,cAAA,IAAkB,MAAM,OAAA,EAAS,KAAA,CAAM,SAAA,EAAW,KAAA,EAAO,MAAM,OAAA,EAAQ;AAC9I;AAGA,SAAS,UAAA,CAAW,OAAqB,IAAA,EAAuD;AAC9F,EAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,IAAe,EAAC,EAC3B,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,CAChC,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,IAAA,KAAS,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,CAAA,CAAE,IAAA,KAAS,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,CAAE,IAAA,IAAQ,IAAA,CAAK,OAAO,IAAK,CAAA;AAClI;AAEA,IAAM,yBAAS,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,UAAU,CAAC,CAAA;AAOzC,SAAS,gBAAA,CAAiB,QAAA,EAAkB,OAAA,GAA+B,EAAC,EAAgB;AACjG,EAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,KAAA;AACzB,EAAA,MAAM,cAAcD,cAAAA,EAAe;AACnC,EAAA,MAAM,QAAQC,QAAAA,CAAS,EAAE,QAAA,EAAU,GAAA,CAAI,UAAU,QAAQ,CAAA,EAAG,OAAA,EAAS,MAAM,OAAO,MAAA,CAAO,QAAQ,CAAA,EAAG,SAAA,EAAW,UAAU,CAAA;AACzH,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,IAAA,KAAS,MAAA;AAElC,EAAA,MAAM,IAAA,GAAO,IAAA,GAAO,KAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,GAAA;AAC/C,EAAA,MAAM,SAASA,QAAAA,CAAS,EAAE,QAAA,EAAU,GAAA,CAAI,UAAU,QAAQ,CAAA,EAAG,OAAA,EAAS,MAAM,OAAO,MAAA,CAAO,QAAQ,CAAA,EAAG,eAAA,EAAiB,MAAM,CAAA;AAC5H,EAAA,MAAM,UAAUA,QAAAA,CAAS,EAAE,UAAU,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG,eAAA,EAAiB,MAAM,OAAA,EAAS,KAAA,CAAM,WAAW,CAAA;AACzJ,EAAAP,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,OAAO,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU,MAAM;AACtC,MAAA,KAAK,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,IAAI,SAAA,EAAW,QAAQ,GAAG,CAAA;AACzE,MAAA,KAAK,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,IAAI,QAAA,EAAU,QAAQ,GAAG,CAAA;AAAA,IAC1E,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,WAAW,CAAC,CAAA;AACxC,EAAA,MAAM,cAAcO,QAAAA,CAAS,EAAE,QAAA,EAAU,GAAA,CAAI,eAAe,QAAQ,CAAA,EAAG,OAAA,EAAS,MAAM,OAAO,WAAA,CAAY,QAAQ,GAAG,SAAA,EAAW,EAAA,GAAK,KAAQ,CAAA;AAC5I,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIR,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAqD,EAAE,CAAA;AAEnF,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,EAAM,gBAAA,IAAoB,IAAA;AACnD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAClB,IAAA,KAAK,OACF,QAAA,CAAS,QAAQ,EACjB,IAAA,CAAK,MAAM,YAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,GAAA,CAAI,SAAS,CAAA,EAAG,CAAC,CAAA,CACtE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EAE1B,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,QAAQ,MAAA,CAAO,IAAI,CAAA,EAAG,WAAW,CAAC,CAAA;AAEnE,EAAA,MAAM,OAAO,WAAA,CAAY;AAAA,IACvB,YAAY,CAAC,IAAA,KAAiB,MAAA,CAAO,KAAA,CAAM,UAAU,IAAI,CAAA;AAAA,IACzD,WAAW,MAAM;AACf,MAAA,KAAK,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,IAAI,SAAA,EAAW,QAAQ,GAAG,CAAA;AACzE,MAAA,KAAK,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,IAAI,QAAA,EAAU,QAAQ,GAAG,CAAA;AAAA,IAC1E,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,MAAA,EAAQ,IAAA,KAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,GAAG,CAAA,EAAG,EAAE,EAAA,EAAI,UAAU,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,EAAM,EAAA,EAAA,iBAAI,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,EAAG,CAAC;AAAA,GACvH,CAAA;AAED,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,IAAQ,IAAA;AACzB,EAAA,MAAM,QAAA,GAA4B,QAAQ,MAAM;AAC9C,IAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAC;AAChB,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,OAAA;AAAA,MACR,IAAA,EAAM,IAAA;AAAA,MACN,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,WAAA,EAAA,CAAc,WAAA,CAAY,IAAA,IAAQ,IAC/B,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,CAAA,CACnB,GAAA,CAAI,CAAC,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,GAAA,EAAK,CAAA,CAAE,GAAA,EAAM,KAAA,EAAO,EAAE,KAAA,IAAS,MAAA,EAAW,MAAA,EAAQ,CAAA,CAAE,UAAU,MAAA,EAAW,kBAAA,EAAoB,IAAA,CAAK,MAAA,CAAO,YAAW,CAAE;AAAA,KACnJ;AAEA,IAAA,MAAM,IAAA,GAAA,CAAyB,OAAA,CAAQ,IAAA,IAAQ,IAC5C,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,QAAQ,CAAA,CACjC,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACf,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAM,CAAC,KAAA,CAAM,MAAM,GAAG,UAAA,CAAW,OAAO,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,MACtF,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAA,EAAY,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,OAAO,OAAA,GAAU,MAAA;AAAA,MACpD,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,cAAc,KAAA,CAAM,WAAA,IAAe,EAAC,EACjC,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,WAAW,CAAA,CAAE,GAAG,CAAA,CACzC,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,IAAI,GAAA,EAAK,CAAA,CAAE,GAAA,EAAM,KAAA,EAAO,EAAE,KAAA,IAAS,MAAA,EAAW,MAAA,EAAQ,CAAA,CAAE,UAAU,MAAA,EAAW,kBAAA,EAAoB,IAAA,CAAK,MAAA,CAAO,YAAW,CAAE;AAAA,KACnJ,CAAE,CAAA;AACJ,IAAA,MAAM,OAAA,GAA2B,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,SAAA,GAAY,CAAC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,MAAM,IAAA,EAAM,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,IAAe,MAAA,EAAQ,SAAA,EAAW,CAAA,GAAI,EAAC;AACrL,IAAA,MAAM,cAAA,GAAkC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACzD,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,IAAA,EAAM,IAAA;AAAA,MACN,WAAW,CAAA,CAAE,EAAA;AAAA,MACb,MAAA,EAAQ,QAAA;AAAA,MACR,SAAS,MAAM;AACb,QAAA,SAAA,CAAU,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,EAAE,CAAC,CAAA;AACnD,QAAA,IAAA,CAAK,MAAA,CAAO,EAAE,IAAI,CAAA;AAAA,MACpB;AAAA,KACF,CAAE,CAAA;AACF,IAAA,OAAO,CAAC,KAAA,EAAO,GAAG,MAAM,GAAG,OAAA,EAAS,GAAG,cAAc,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,MAAM,WAAA,CAAY,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAC,CAAA;AAE1F,EAAA,MAAM,SAAS,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,GAAI,KAAA;AAC1C,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,wBAAA;AAAA,IACR,WAAA,EAAa,CAAA,GAAI,CAAA,CAAE,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,IACtE,MAAA,EAAQ,CAAA;AAAA,IACR,SAAS,MAAA,CAAO,SAAA;AAAA,IAChB,QAAA,EAAU,MAAA,CAAO,SAAA,IAAa,CAAA,KAAM,IAAA;AAAA,IACpC,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,IAAQ,IAAA;AAAA,IAC1B,cAAA,EAAgB,KAAA,CAAM,IAAA,EAAM,cAAA,IAAkB,IAAA;AAAA,IAC9C,QAAQ,EAAE,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,KAAK,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,SAAS,IAAA,CAAK,MAAA,CAAO,SAAS,SAAA,EAAW,IAAA,CAAK,OAAO,SAAA,EAAU;AAAA,IAC7H,QAAA;AAAA,IACA,MAAA,EAAQ,GAAG,WAAA,IAAe,IAAA;AAAA,IAC1B,SAAA,EAAW,KAAK,MAAA,CAAO,IAAA;AAAA,IACvB,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,IACxB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,IACvB,YAAA,EAAc,KAAK,MAAA,CAAO,MAAA;AAAA,IAC1B,QAAA,EAAU,SACN,IAAA,GACA;AAAA,MACE,KAAA,EAAO,KAAA;AAAA,MACP,YAAA,EAAc,QAAA;AAAA,MACd,WAAA,EAAa,KAAK,MAAA,CAAO,WAAA;AAAA,MACzB,SAAA,EAAW,KAAK,MAAA,CAAO,IAAA;AAAA,MACvB,SAAS,IAAA,CAAK,SAAA;AAAA,MACd,SAAA,EAAW,GAAA;AAAA,MACX,QAAQ,MAAM;AACZ,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,SAAA,EAAW;AAC7B,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,MAClB;AAAA;AACF,GACN;AACF;AAGO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,QAAA,EAAU,QAAO,EAAiE;AACnH,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,EAAW;AAC5B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,KAAc,CAAA,GAAI,KAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,MAAM,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,WAAW,CAAA;AAC1G,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,KAAW,MAAA,IAAU,KAAK,MAAA,KAAW,SAAA,IAAa,KAAK,MAAA,KAAW,aAAA;AACpF,EAAA,uBACEJ,GAAAA,CAACM,IAAAA,EAAA,EAAK,kBAAA,EAAoB,CAAA,EAAG,KAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,IAAI,KAAK,KAAK,CAAA,CAAA,EACpF,0BAAAN,GAAAA,CAACC,YAAAA,EAAA,EAAa,IAAA,EAAK,MAAK,OAAA,EAAS,IAAA,CAAK,QAAQ,SAAA,GAAY,SAAA,EAAW,SAAS,QAAA,EAAU,QAAA,EAAU,CAAC,IAAA,IAAQ,CAAC,KAAK,KAAA,EAAO,MAAA,EACrH,oBAAK,IAAA,CAAK,SAAS,IACtB,CAAA,EACF,CAAA;AAEJ;AAOO,SAAS,YAAA,GAA2B;AACzC,EAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,KAAA;AACzB,EAAA,MAAM,cAAcS,cAAAA,EAAe;AACnC,EAAA,MAAM,KAAA,GAAQC,QAAAA,CAAS,EAAE,QAAA,EAAU,GAAA,CAAI,OAAO,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,EAAG,CAAA;AAChF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIR,SAAS,EAAE,CAAA;AAErC,EAAA,MAAM,SAAS,WAAA,CAAY;AAAA,IACzB,UAAA,EAAY,CAAC,IAAA,KAAuB,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IAC7F,QAAA,EAAU,OAAO,IAAA,KAAS;AACxB,MAAA,MAAM,YAAY,aAAA,CAAc,EAAE,UAAU,GAAA,CAAI,OAAO,GAAG,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,YAAA,CAA4B,GAAA,CAAI,OAAO,CAAC,CAAA;AACnE,MAAA,WAAA,CAAY,YAAA;AAAA,QAA4B,IAAI,OAAO,CAAA;AAAA,QAAG,CAAC,IAAA,KACrD,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAC,CAAA,CAAE,KAAA,EAAO,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,KAAA,GAAQ,EAAA,GAAK,CAAA,CAAE,CAAA,KAAM,CAAE;AAAA,OAC/H;AACA,MAAA,OAAO,EAAE,MAAA,EAAO;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,EAAA,EAAI,KAAA,EAAO,OAAA,KAAY;AAC/B,MAAA,IAAI,OAAA,EAAS,QAAQ,WAAA,CAAY,YAAA,CAAa,IAAI,OAAO,CAAA,EAAG,QAAQ,MAAM,CAAA;AAAA,IAC5E,CAAA;AAAA,IACA,SAAA,EAAW,MAAM,KAAK,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,GAC/E,CAAA;AAED,EAAA,MAAM,UAAU,WAAA,CAAY;AAAA,IAC1B,UAAA,EAAY,CAAC,CAAA,KAAc,MAAA,CAAO,YAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,IAC1D,WAAW,MAAM;AACf,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,KAAK,YAAY,iBAAA,CAAkB,EAAE,UAAU,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,SAAS,CAAC,CAAA,KAAMS,KAAAA,CAAM,KAAA,CAAM,KAAK,QAAA,CAAS,WAAA,EAAc,CAAA,CAAwB,IAAA,KAAS,UAAU,IAAA,CAAK,QAAA,CAAS,WAAA,GAAc,IAAA,CAAK,SAAS,UAAU;AAAA,GACxJ,CAAA;AAED,EAAA,MAAM,SAAsB,KAAA,CAAM,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IAC3D,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,OAAA,EAAS,KAAK,IAAA,IAAQ,MAAA;AAAA,IACtB,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA;AAAA,IAErC,YAAA,EAAc,CAAC,EAAE,EAAA,EAAI,QAAQ,KAAA,EAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,OAAA,EAAS,MAAM,OAAO,MAAA,CAAO,IAAI,GAAG,CAAA;AAAA,IACzH,OAAA,kBAASZ,GAAAA,CAACM,IAAAA,EAAA,EAAK,CAAA;AAAA,IACf,QAAA,kBAAUN,GAAAA,CAAC,UAAA,EAAA,EAAW,MAAY,QAAA,EAAU,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG,MAAA,EAAQ,CAAA,qBAAA,EAAwB,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,CAAA;AAAA,IAClH,MAAA,EAAQ,CAAA,qBAAA,EAAwB,IAAA,CAAK,EAAE,CAAA;AAAA,GACzC,CAAE,CAAA;AAEF,EAAA,MAAM,yBACJK,IAAAA,CAACC,IAAAA,EAAA,EAAK,OAAO,EAAE,aAAA,EAAe,KAAA,EAAO,GAAA,EAAK,GAAG,UAAA,EAAY,UAAA,EAAY,mBAAmB,EAAA,EAAI,aAAA,EAAe,IAAG,EAC5G,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAACM,MAAA,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,IACnB,QAAA,kBAAAN,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAO,4BAAA;AAAA,QACP,KAAA,EAAO,KAAK,KAAA,CAAM,UAAA;AAAA,QAClB,WAAA,EAAa,KAAK,KAAA,CAAM,gBAAA;AAAA,QACxB,KAAA,EAAO,KAAA;AAAA,QACP,YAAA,EAAc,QAAA;AAAA,QACd,SAAA,EAAW;AAAA;AAAA,KACb,EACF,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAACC,YAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,IAAU,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,QACtE,QAAA,EAAU,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAAA,QAChC,SAAS,OAAA,CAAQ,SAAA;AAAA,QACjB,MAAA,EAAO,6BAAA;AAAA,QAEN,eAAK,KAAA,CAAM;AAAA;AAAA;AACd,GAAA,EACF,CAAA;AAGF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,uBAAA;AAAA,IACR,WAAA,EAAa,KAAK,KAAA,CAAM,KAAA;AAAA,IACxB,KAAA;AAAA,IACA,YAAY,KAAA,CAAM,YAAA;AAAA,IAClB,WAAW,YAAY;AACrB,MAAA,MAAM,MAAM,OAAA,EAAQ;AAAA,IACtB,CAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAS,KAAA,CAAM,SAAA;AAAA,IACf,OAAO,KAAA,CAAM,OAAA;AAAA,IACb,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,IACvB,SAAA,EAAW,KAAK,KAAA,CAAM,SAAA;AAAA,IACtB,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,IACvB,SAAA,EAAW,KAAK,KAAA,CAAM;AAAA,GACxB;AACF;AAGO,SAAS,eAAA,GAA8C;AAC5D,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,UAAA,EAAW;AACpC,EAAA,MAAM,KAAA,GAAQU,QAAAA,CAAS,EAAE,QAAA,EAAU,GAAA,CAAI,SAAS,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,YAAA,EAAa,EAAG,CAAA;AACzF,EAAA,MAAM,SAAsB,KAAA,CAAM,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IAC3D,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,OAAA,EAAS,KAAK,IAAA,IAAQ,MAAA;AAAA,IACtB,SAAA,EAAW,KAAK,SAAA,IAAa,MAAA;AAAA,IAC7B,IAAA,EAAM,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,KAAK,OAAA,CAAQ,SAAA,EAAW,EAAE,OAAA,EAAS,KAAK,SAAA,EAAW,CAAA,GAAI,IAAA,CAAK,MAAM,QAAA,CAAS,OAAA;AAAA,IACvG,OAAA,kBAASX,GAAAA,CAACM,IAAAA,EAAA,EAAK,CAAA;AAAA,IACf,MAAA,EAAQ,CAAA,wBAAA,EAA2B,IAAA,CAAK,EAAE,CAAA;AAAA,GAC5C,CAAE,CAAA;AACF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,yBAAA;AAAA,IACR,WAAA,EAAa,KAAK,OAAA,CAAQ,KAAA;AAAA,IAC1B,KAAA;AAAA,IACA,YAAY,KAAA,CAAM,YAAA;AAAA,IAClB,WAAW,YAAY;AACrB,MAAA,MAAM,MAAM,OAAA,EAAQ;AAAA,IACtB,CAAA;AAAA,IACA,SAAS,KAAA,CAAM,SAAA;AAAA,IACf,OAAO,KAAA,CAAM,OAAA;AAAA,IACb,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,IACvB,SAAA,EAAW,KAAK,KAAA,CAAM,SAAA;AAAA,IACtB,UAAA,EAAY,KAAK,OAAA,CAAQ,UAAA;AAAA,IACzB,SAAA,EAAW,KAAK,OAAA,CAAQ;AAAA,GAC1B;AACF;AAMO,SAAS,mBAAmB,EAAE,MAAA,GAAS,sCAAA,EAAwC,UAAA,GAAa,MAAK,EAA8C;AACpJ,EAAA,MAAM,QAAQ,kBAAA,EAAmB;AACjC,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,uBACEN,GAAAA,CAACC,YAAAA,EAAA,EAAa,OAAA,EAAQ,SAAA,EAAU,SAAS,MAAM,KAAK,MAAM,YAAA,CAAa,EAAE,YAAY,CAAA,EAAG,QACrF,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,SAAS,YAAA,EACvB,CAAA;AAEJ","file":"native.js","sourcesContent":["/**\n * The native modules the support block can use, as the shapes it needs. The\n * app passes the real ones (all optional peers), so the block runs without\n * any of them and the tests pass fakes:\n *\n * import * as ViewShot from \"react-native-view-shot\"; // screenshots, mark-up\n * import { Accelerometer } from \"expo-sensors\"; // shake to report\n */\n\nexport interface CaptureOptions {\n format?: \"png\" | \"jpg\" | \"webp\";\n quality?: number;\n result?: \"tmpfile\" | \"base64\" | \"data-uri\";\n width?: number;\n height?: number;\n}\n\n/** `react-native-view-shot`: `captureScreen` (the whole screen) and `captureRef` (one view, for flattening mark-up). */\nexport interface ViewShotLike {\n captureScreen(options?: CaptureOptions): Promise<string>;\n captureRef(view: unknown, options?: CaptureOptions): Promise<string>;\n}\n\nexport interface AccelerometerMeasurement {\n x: number;\n y: number;\n z: number;\n}\n\n/** `expo-sensors`' `Accelerometer` (values in g). */\nexport interface AccelerometerLike {\n addListener(listener: (measurement: AccelerometerMeasurement) => void): { remove(): void };\n setUpdateInterval?(intervalMs: number): void;\n}\n\nexport interface ShakeOptions {\n /** Acceleration, in g, that counts as a jolt. Default 2.3. */\n threshold?: number;\n /** Jolts needed within `windowMs`. Default 2. */\n jolts?: number;\n windowMs?: number;\n /** Quiet time after a shake. Default 3000 ms. */\n cooldownMs?: number;\n intervalMs?: number;\n now?: () => number;\n}\n\n/** Calls `onShake` when the phone is shaken: a few strong jolts close together, then a cooldown. Returns the stop. */\nexport function listenForShake(accelerometer: AccelerometerLike, onShake: () => void, options: ShakeOptions = {}): () => void {\n const { threshold = 2.3, jolts = 2, windowMs = 1000, cooldownMs = 3000, intervalMs = 100, now = Date.now } = options;\n const recent: number[] = [];\n let quietUntil = 0;\n accelerometer.setUpdateInterval?.(intervalMs);\n const subscription = accelerometer.addListener(({ x, y, z }) => {\n const t = now();\n if (t < quietUntil) return;\n if (Math.sqrt(x * x + y * y + z * z) < threshold) return;\n recent.push(t);\n while (recent.length && t - recent[0]! > windowMs) recent.shift();\n if (recent.length >= jolts) {\n recent.length = 0;\n quietUntil = t + cooldownMs;\n onShake();\n }\n });\n return () => subscription.remove();\n}\n","/**\n * `createSupport(options)`: the support block for `GenesisNativeApp`.\n *\n * <GenesisNativeApp blocks={[support]} appFeatures={[\"account\"]}>\n *\n * It adds \"Send feedback\" and \"Help\" to Settings (`useBlockSettings`), names\n * its routes and migration 0006, and its root listens for a shake (with an\n * accelerometer): the screen is captured and the feedback screen opens with\n * it, ready to mark up. `useSupport().openFeedback()` does the same from a\n * button anywhere (a devtools panel's \"Send feedback\" slot, a help icon).\n *\n * The screens are the app's route files, each a Genesis layout fed by a hook\n * from here (`useSupportInbox` → `InboxPage`, `useSupportThread` →\n * `ThreadPage`, `useIdeaBoard` → `InboxPage`, `FeedbackForm` in\n * `SettingsSubPage`).\n */\nimport { createContext, useContext, useEffect, useSyncExternalStore, type ComponentType, type ReactNode } from \"react\";\nimport { Dimensions, Platform } from \"react-native\";\nimport type { NativeBlock, NativeBlockRootProps } from \"@marktiderman/genesis-native\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { NativeButton } from \"@marktiderman/genesis-ui-native/components\";\nimport { defineSupportBlock, supportPaths, SUPPORT_BLOCK_ID, type SupportPaths } from \"../block\";\nimport { createSupportClient, type SupportClient, type SupportSupabase } from \"../client\";\nimport type { SupportChatClient } from \"../chat\";\nimport { fill, resolveSupportCopy, type SupportCopy, type SupportCopyOverrides } from \"../copy\";\nimport { composeCollectors, createContextCollector, type ContextCollector, type ScreenshotContentType } from \"../record\";\nimport { listenForShake, type AccelerometerLike, type ShakeOptions, type ViewShotLike } from \"./modules\";\n\n/** A screenshot waiting for the feedback screen. `uri` is a data URI. */\nexport interface PendingScreenshot {\n uri: string;\n contentType: ScreenshotContentType;\n width: number;\n height: number;\n}\n\n/** What the feedback screen opens with: where the person was, and maybe a screenshot of it. */\nexport interface PendingFeedback {\n route: string | null;\n screenshot: PendingScreenshot | null;\n /** Extra context to send with the report (the devtools overlay's debug report). */\n extra?: Record<string, unknown>;\n}\n\nexport interface SupportOptions {\n /** The app's Supabase client (migration 0006 applied). */\n supabase: SupportSupabase;\n /**\n * genesis-chat's client (`createChatClient(supabase)`): with the support-chat block's migration\n * applied, a report's thread runs on genesis-chat (live, with files). Without it, support_replies.\n */\n chat?: SupportChatClient;\n /** Opens a path (expo-router's `router.push`). */\n navigate: (href: string) => void;\n /** `Platform.OS`. Default from React Native. */\n platform?: string;\n /** The version signature sent with each report (`useVersionSignature().short`, or a function that reads it). */\n appVersion?: string | (() => string | undefined);\n /** The current route, as a hook (expo-router's `usePathname`). The root calls it. */\n useCurrentRoute?: () => string;\n /** More context (device facts, the update id). Merged over the defaults. */\n collector?: ContextCollector;\n /** `react-native-view-shot`. Without it there are no screenshots. */\n viewShot?: ViewShotLike;\n /** `expo-sensors`' `Accelerometer`. Without it (or with `shake: false`) shaking does nothing. */\n accelerometer?: AccelerometerLike;\n shake?: false | ShakeOptions;\n /** Default `/support`. The route files live under it. */\n basePath?: string;\n copy?: SupportCopyOverrides;\n /** The Settings rows' section (default `support`), or `false` for none. */\n settings?: false | { section?: string };\n /** `false` leaves the idea board out. */\n ideas?: boolean;\n /** Every caught error, for reporting. None of them reaches the person as a crash. */\n onError?: (error: Error, where: \"capture\" | \"shake\") => void;\n}\n\nexport interface SupportBlock extends NativeBlock<typeof SUPPORT_BLOCK_ID> {\n readonly options: SupportOptions;\n readonly client: SupportClient;\n readonly copy: SupportCopy;\n readonly paths: SupportPaths;\n readonly collector: ContextCollector;\n /** Capture the screen (if it can and `screenshot` isn't false), then open the feedback screen. */\n openFeedback(options?: { screenshot?: boolean; extra?: Record<string, unknown>; delayMs?: number }): Promise<void>;\n /** Hand the feedback screen what it opens with (`takePending` empties it). */\n takePending(): PendingFeedback | null;\n peekPending(): PendingFeedback | null;\n subscribePending(listener: () => void): () => void;\n /** The route the person is on, as the root last saw it. */\n currentRoute(): string | null;\n readonly Root: ComponentType<NativeBlockRootProps>;\n}\n\nconst SupportContext = createContext<SupportBlock | null>(null);\n\n/** How long to let an overlay whose `close` returns nothing slide away before capturing. */\nconst LEGACY_CLOSE_MS = 400;\n\n/** The support block, from `GenesisNativeApp blocks` (or `SupportProvider`). Throws outside one. */\nexport function useSupport(): SupportBlock {\n const block = useContext(SupportContext);\n if (!block) throw new Error(\"useSupport: no support block. Pass `blocks={[createSupport(…)]}` to GenesisNativeApp, or wrap in <SupportProvider>.\");\n return block;\n}\n\n/** The same block, or `null` when support is off (for a button that hides itself). */\nexport function useOptionalSupport(): SupportBlock | null {\n return useContext(SupportContext);\n}\n\nexport function SupportProvider({ block, children }: { block: SupportBlock; children?: ReactNode }) {\n return <SupportContext.Provider value={block}>{children}</SupportContext.Provider>;\n}\n\nexport const SUPPORT_QUERY_ROOT = \"genesis-support\";\n\n/** How many reports have a staff reply the person hasn't read. */\nexport function useUnreadReplies(): number {\n const block = useSupport();\n const { data } = useQuery({ queryKey: [SUPPORT_QUERY_ROOT, \"reports\"], queryFn: () => block.client.myReports(), staleTime: 60_000 });\n return (data ?? []).filter((r) => r.unread).length;\n}\n\nexport function createSupport(options: SupportOptions): SupportBlock {\n const copy = resolveSupportCopy(options.copy);\n const paths = supportPaths(options.basePath);\n const client = createSupportClient(options.supabase, { chat: options.chat });\n const platform = options.platform ?? Platform.OS;\n let route: string | null = null;\n let pending: PendingFeedback | null = null;\n const listeners = new Set<() => void>();\n const setPending = (next: PendingFeedback | null) => {\n pending = next;\n for (const l of listeners) l();\n };\n\n const defaults = createContextCollector({\n platform,\n appVersion: typeof options.appVersion === \"function\" ? options.appVersion : () => options.appVersion as string | undefined,\n route: () => route ?? undefined,\n device: () => {\n const screen = Dimensions.get(\"screen\");\n return { os: platform, osVersion: String(Platform.Version), screen: { width: Math.round(screen.width), height: Math.round(screen.height), scale: screen.scale } };\n },\n });\n const collector = options.collector ? composeCollectors(defaults, options.collector) : defaults;\n\n const declaration = defineSupportBlock({\n basePath: options.basePath,\n copy: options.copy,\n settings: options.settings,\n ideas: options.ideas,\n useHelpSubtitle: () => {\n const unread = useUnreadReplies();\n return unread ? fill(copy.settings.unreadReplies, { count: unread }) : null;\n },\n });\n\n const report = (error: unknown, where: \"capture\" | \"shake\") => {\n try {\n options.onError?.(error instanceof Error ? error : new Error(String(error)), where);\n } catch {\n // a failing reporter never breaks support\n }\n };\n\n let opening = false;\n // The devtools overlay's \"Send feedback\" (its `devtoolsFeedback` slot): closes the overlay,\n // waits for its sheet to be gone (a capture during the dismissal caught the sheet half way\n // down), then captures the screen under it and opens the feedback screen with the debug report.\n function DevtoolsFeedback({ debugInfo, close }: { debugInfo: string; close: () => Promise<void> | void }) {\n return (\n <NativeButton\n variant=\"outline\"\n testID=\"genesis-support-devtools-feedback\"\n onPress={async () => {\n const closed = close();\n // An overlay whose close doesn't say when it's done: give its sheet time to leave.\n await (closed instanceof Promise ? closed : new Promise((resolve) => setTimeout(resolve, LEGACY_CLOSE_MS)));\n void block.openFeedback({ extra: { debugInfo: debugInfo.slice(0, 8000) } });\n }}\n >\n {copy.settings.sendFeedback}\n </NativeButton>\n );\n }\n\n const block: SupportBlock = {\n ...declaration,\n contributes: { ...declaration.contributes, slots: { devtoolsFeedback: DevtoolsFeedback as ComponentType<never> } },\n platforms: [\"native\"],\n options,\n client,\n copy,\n paths,\n collector,\n async openFeedback({ screenshot = true, extra, delayMs = 0 } = {}) {\n if (opening) return;\n opening = true;\n try {\n // Let a sheet that is closing (the devtools overlay) get out of the picture first.\n if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, delayMs));\n let shot: PendingScreenshot | null = null;\n if (screenshot && options.viewShot) {\n try {\n const uri = await options.viewShot.captureScreen({ format: \"jpg\", quality: 0.8, result: \"data-uri\" });\n const window = Dimensions.get(\"window\");\n const scale = Dimensions.get(\"screen\").scale || 1;\n shot = { uri, contentType: \"image/jpeg\", width: Math.round(window.width * scale), height: Math.round(window.height * scale) };\n } catch (error) {\n report(error, \"capture\");\n }\n }\n setPending({ route, screenshot: shot, extra });\n options.navigate(paths.feedback);\n } finally {\n opening = false;\n }\n },\n takePending() {\n const p = pending;\n if (p) setPending(null);\n return p;\n },\n peekPending: () => pending,\n subscribePending(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n currentRoute: () => route,\n Root: function SupportRoot({ children }) {\n const current = (options.useCurrentRoute ?? noRoute)();\n useEffect(() => {\n if (current) route = current;\n }, [current]);\n useEffect(() => {\n if (!options.accelerometer || options.shake === false) return;\n try {\n return listenForShake(\n options.accelerometer,\n () => {\n // Already on a support screen: shaking again does nothing.\n if (route && route.startsWith(paths.inbox)) return;\n void block.openFeedback();\n },\n options.shake || {},\n );\n } catch (error) {\n report(error, \"shake\");\n return undefined;\n }\n }, []);\n return <SupportProvider block={block}>{children}</SupportProvider>;\n },\n };\n return block;\n}\n\nfunction noRoute(): string {\n return \"\";\n}\n\n/** The pending feedback, re-rendering when it changes. */\nexport function usePendingFeedback(): PendingFeedback | null {\n const block = useSupport();\n return useSyncExternalStore(block.subscribePending, block.peekPending, block.peekPending);\n}\n","/**\n * ScreenshotAnnotator: mark up a screenshot before it is sent. Two tools:\n * a pen to point something out, and Hide, which paints a solid box over\n * anything private (a name, an email, a message). \"Done\" flattens the image\n * and the marks into one picture with `react-native-view-shot`'s `captureRef`,\n * so what is sent is exactly what the person saw, hidden parts included.\n *\n * Plain views and React Native's PanResponder: no Skia, SVG or gesture library.\n */\nimport { useRef, useState, type ComponentRef } from \"react\";\nimport { Dimensions, Image, PanResponder, View, type LayoutChangeEvent } from \"react-native\";\nimport { NativeButton, NativeSegmentedControl, NativeText } from \"@marktiderman/genesis-ui-native/components\";\nimport { useThemeRoles } from \"@marktiderman/genesis-ui-native/hooks\";\nimport type { SupportCopy } from \"../copy\";\nimport type { ViewShotLike } from \"./modules\";\nimport type { PendingScreenshot } from \"./support\";\n\ntype Point = { x: number; y: number };\ntype Mark = { kind: \"pen\"; points: Point[] } | { kind: \"hide\"; from: Point; to: Point };\n\nconst DOT = 6;\n/** The most dots a drawing keeps, so a long scribble stays light. */\nconst MAX_DOTS = 3000;\n\n/** The dots along a stroke, close enough to read as a line. */\nexport function strokeDots(points: readonly Point[], spacing = DOT / 2): Point[] {\n const dots: Point[] = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i]!;\n const prev = points[i - 1];\n if (prev) {\n const dist = Math.hypot(p.x - prev.x, p.y - prev.y);\n for (let d = spacing; d < dist; d += spacing) dots.push({ x: prev.x + ((p.x - prev.x) * d) / dist, y: prev.y + ((p.y - prev.y) * d) / dist });\n }\n dots.push(p);\n }\n return dots;\n}\n\n/** A point inside the picture; a missing or odd coordinate counts as its edge. */\nexport function clamp(p: Point, size: { width: number; height: number }): Point {\n const fix = (v: number, max: number) => (Number.isFinite(v) ? Math.min(Math.max(v, 0), max || v) : 0);\n return { x: fix(p.x, size.width), y: fix(p.y, size.height) };\n}\n\nexport function boxOf(from: Point, to: Point) {\n return { left: Math.min(from.x, to.x), top: Math.min(from.y, to.y), width: Math.abs(to.x - from.x), height: Math.abs(to.y - from.y) };\n}\n\nexport interface ScreenshotAnnotatorProps {\n screenshot: PendingScreenshot;\n viewShot: ViewShotLike;\n copy: SupportCopy[\"annotate\"];\n /** `marked`: the image now carries marks (pen or hidden parts). */\n onDone: (screenshot: PendingScreenshot, marked: boolean) => void;\n /** `hadMarks`: the person drew something and left without saving it. */\n onCancel: (hadMarks: boolean) => void;\n testID?: string;\n}\n\nexport function ScreenshotAnnotator({ screenshot, viewShot, copy, onDone, onCancel, testID = \"genesis-support-annotator\" }: ScreenshotAnnotatorProps) {\n const colors = useThemeRoles();\n const surface = useRef<ComponentRef<typeof View> | null>(null);\n // A callback ref, not the ref object: NativeWind's interop walks object props on re-render, and\n // walking a mounted view's instance throws (it reaches navigation contexts).\n const setSurface = useRef((node: ComponentRef<typeof View> | null) => {\n surface.current = node;\n }).current;\n const [tool, setTool] = useState<\"pen\" | \"hide\">(\"pen\");\n const [marks, setMarks] = useState<Mark[]>([]);\n const [draft, setDraft] = useState<Mark | null>(null);\n const [width, setWidth] = useState(0);\n const [saving, setSaving] = useState(false);\n const [failed, setFailed] = useState(false);\n const toolRef = useRef(tool);\n toolRef.current = tool;\n const draftRef = useRef<Mark | null>(null);\n\n // The whole picture on screen with the buttons under it: at most about half the window tall.\n const ratio = screenshot.width / Math.max(1, screenshot.height);\n const maxHeight = Math.round(Dimensions.get(\"window\").height * 0.55);\n const fitWidth = width ? Math.min(width, Math.round(maxHeight * ratio)) : 0;\n const height = fitWidth ? Math.round(fitWidth / ratio) : 0;\n const size = useRef({ width: 0, height: 0 });\n size.current = { width: fitWidth, height };\n const start = useRef<Point>({ x: 0, y: 0 });\n\n const responder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n // Drawing inside a scroll view: keep the touch, don't hand it to the scroll.\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: (event) => {\n const p = clamp({ x: event.nativeEvent.locationX, y: event.nativeEvent.locationY }, size.current);\n start.current = p;\n draftRef.current = toolRef.current === \"pen\" ? { kind: \"pen\", points: [p] } : { kind: \"hide\", from: p, to: p };\n setDraft(draftRef.current);\n },\n onPanResponderMove: (_event, gesture) => {\n // From where the touch started, so a touch over a child or outside the picture stays in it.\n const p = clamp({ x: start.current.x + gesture.dx, y: start.current.y + gesture.dy }, size.current);\n const d = draftRef.current;\n if (!d) return;\n draftRef.current = d.kind === \"pen\" ? { kind: \"pen\", points: [...d.points, p] } : { ...d, to: p };\n setDraft(draftRef.current);\n },\n onPanResponderRelease: () => {\n const d = draftRef.current;\n draftRef.current = null;\n setDraft(null);\n if (d) setMarks((all) => [...all, d]);\n },\n // A scroll view above can still take the touch (iOS's own pan): keep what was drawn so far.\n onPanResponderTerminate: () => {\n const d = draftRef.current;\n draftRef.current = null;\n setDraft(null);\n if (d) setMarks((all) => [...all, d]);\n },\n }),\n ).current;\n\n const done = async () => {\n if (!marks.length) {\n onDone(screenshot, false);\n return;\n }\n setSaving(true);\n setFailed(false);\n try {\n const uri = await viewShot.captureRef(surface.current, { format: \"jpg\", quality: 0.85, result: \"data-uri\" });\n setSaving(false);\n onDone({ ...screenshot, uri, contentType: \"image/jpeg\" }, true);\n } catch {\n // Flattening failed: never send the unmarked image in its place (hidden parts would show).\n setSaving(false);\n setFailed(true);\n }\n };\n\n let dots = 0;\n const all = draft ? [...marks, draft] : marks;\n return (\n <View testID={testID} style={{ gap: 12 }}>\n <NativeText style={{ color: colors.secondaryLabel, fontSize: 13, lineHeight: 18 }}>{copy.hint}</NativeText>\n <NativeSegmentedControl\n testID={`${testID}-tool`}\n options={[\n { value: \"pen\", label: copy.pen },\n { value: \"hide\", label: copy.hide },\n ]}\n value={tool}\n onChange={(v) => setTool(v as \"pen\" | \"hide\")}\n />\n <View onLayout={(e: LayoutChangeEvent) => setWidth(e.nativeEvent.layout.width)} style={{ width: \"100%\" }}>\n <View ref={setSurface} collapsable={false} testID={`${testID}-surface`} style={{ alignSelf: \"center\", width: fitWidth || \"100%\", height: height || 320, overflow: \"hidden\", borderRadius: 12 }} {...responder.panHandlers}>\n <Image source={{ uri: screenshot.uri }} style={{ width: \"100%\", height: \"100%\" }} resizeMode=\"stretch\" accessibilityIgnoresInvertColors />\n {all.map((mark, i) => {\n if (mark.kind === \"hide\") {\n const box = boxOf(mark.from, mark.to);\n return <View key={i} testID={`${testID}-hide-${i}`} pointerEvents=\"none\" style={{ position: \"absolute\", ...box, backgroundColor: colors.label }} />;\n }\n return strokeDots(mark.points).map((p, j) => {\n if (dots++ > MAX_DOTS) return null;\n return (\n <View\n key={`${i}-${j}`}\n pointerEvents=\"none\"\n style={{ position: \"absolute\", left: p.x - DOT / 2, top: p.y - DOT / 2, width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: colors.destructive }}\n />\n );\n });\n })}\n </View>\n </View>\n {failed ? (\n <NativeText testID={`${testID}-failed`} accessibilityLiveRegion=\"polite\" style={{ color: colors.destructive, fontSize: 13, lineHeight: 18 }}>\n {copy.failed}\n </NativeText>\n ) : null}\n <View style={{ flexDirection: \"row\", gap: 8 }}>\n <NativeButton variant=\"ghost\" onPress={() => onCancel(marks.length > 0 || draft !== null)} testID={`${testID}-cancel`}>\n {copy.cancel}\n </NativeButton>\n <NativeButton variant=\"outline\" onPress={() => setMarks((m) => m.slice(0, -1))} disabled={!marks.length} testID={`${testID}-undo`}>\n {copy.undo}\n </NativeButton>\n <View style={{ flex: 1 }} />\n <NativeButton onPress={() => void done()} loading={saving} testID={`${testID}-done`}>\n {copy.done}\n </NativeButton>\n </View>\n </View>\n );\n}\n","/**\n * FeedbackForm: the feedback screen's content, for inside `SettingsSubPage`\n * (which keeps it above the keyboard). Type, message, and the screenshot the\n * shake (or `openFeedback`) captured: kept only if the person keeps it, after\n * they can mark it up and hide parts of it.\n *\n * <SettingsSubPage testID=\"support-feedback\"><FeedbackForm onSent={() => router.back()} /></SettingsSubPage>\n */\nimport { useEffect, useState } from \"react\";\nimport { Alert, Image, Modal, View } from \"react-native\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { NativeButton, NativeLabel, NativeSegmentedControl, NativeSwitch, NativeText, NativeTextarea } from \"@marktiderman/genesis-ui-native/components\";\nimport { useThemeRoles } from \"@marktiderman/genesis-ui-native/hooks\";\nimport { SupportError } from \"../client\";\nimport { FEEDBACK_TYPES, type FeedbackDelivery, type FeedbackType } from \"../record\";\nimport { ScreenshotAnnotator } from \"./annotator\";\nimport { SUPPORT_QUERY_ROOT, useSupport, type PendingFeedback, type PendingScreenshot } from \"./support\";\n\nexport interface FeedbackFormProps {\n defaultType?: FeedbackType;\n /** After a report is saved (go back, say thanks). The form has already shown its own confirmation, unless `sentAlert` is false. */\n onSent?: (delivery: FeedbackDelivery) => void;\n /** Confirm a sent report with an alert. Default true; false when `onSent` says so itself (a toast). */\n sentAlert?: boolean;\n testID?: string;\n}\n\nexport function FeedbackForm({ defaultType = \"bug\", onSent, sentAlert = true, testID = \"genesis-support-feedback\" }: FeedbackFormProps) {\n const block = useSupport();\n const { copy } = block;\n const colors = useThemeRoles();\n const queryClient = useQueryClient();\n // What the shake (or openFeedback) left: taken once, so a second visit starts clean.\n const [origin] = useState<PendingFeedback | null>(() => block.peekPending());\n useEffect(() => {\n block.takePending();\n }, [block]);\n const [type, setType] = useState<FeedbackType>(defaultType);\n const [message, setMessage] = useState(\"\");\n const [screenshot, setScreenshot] = useState<PendingScreenshot | null>(origin?.screenshot ?? null);\n // Off until the person says so: a captured screen is never sent by default.\n const [include, setInclude] = useState(false);\n const [annotating, setAnnotating] = useState(false);\n const [sending, setSending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => setError(null), [message]);\n\n const send = async () => {\n if (!message.trim()) {\n setError(copy.feedback.messageRequired);\n return;\n }\n setSending(true);\n try {\n const context = await block.collector.collect();\n // Where the person was when they asked for the form, never the form itself.\n const route = origin?.route && !origin.route.startsWith(block.paths.inbox) ? origin.route : undefined;\n if (route) context.route = route;\n else delete context.route;\n if (origin?.extra) context.extra = { ...context.extra, ...origin.extra };\n const delivery = await block.client.submit({\n type,\n message: message.trim(),\n context,\n attachments: screenshot && include ? [{ kind: \"screenshot\", contentType: screenshot.contentType, base64: screenshot.uri, width: screenshot.width, height: screenshot.height }] : [],\n });\n void queryClient.invalidateQueries({ queryKey: [SUPPORT_QUERY_ROOT, \"reports\"] });\n setMessage(\"\");\n setScreenshot(null);\n if (sentAlert) Alert.alert(copy.feedback.sentTitle, delivery.attachmentsDropped ? copy.feedback.sentWithoutScreenshot : copy.feedback.sentBody);\n onSent?.(delivery);\n } catch (e) {\n const err = e instanceof SupportError ? e : null;\n setError(err?.rateLimited ? copy.feedback.rateLimited : err?.code === \"42501\" ? copy.feedback.signInFirst : copy.feedback.failedBody);\n } finally {\n setSending(false);\n }\n };\n\n return (\n <View testID={testID} style={{ gap: 16 }}>\n <View style={{ gap: 8 }}>\n <NativeLabel>{copy.feedback.typeLabel}</NativeLabel>\n <NativeSegmentedControl\n testID={`${testID}-type`}\n options={FEEDBACK_TYPES.map((t) => ({ value: t, label: copy.feedback.types[t] }))}\n value={type}\n onChange={(v) => setType(v as FeedbackType)}\n />\n </View>\n <NativeTextarea\n testID={`${testID}-message`}\n label={copy.feedback.messageLabel}\n placeholder={copy.feedback.messagePlaceholder}\n value={message}\n onChangeText={setMessage}\n maxLength={20000}\n rows={6}\n error={error ?? undefined}\n />\n {screenshot ? (\n <View testID={`${testID}-screenshot`} style={{ gap: 8 }}>\n <NativeLabel>{copy.feedback.screenshotLabel}</NativeLabel>\n <View style={{ flexDirection: \"row\", gap: 12, alignItems: \"flex-start\" }}>\n <Image\n source={{ uri: screenshot.uri }}\n accessibilityLabel={copy.feedback.screenshotLabel}\n style={{ width: 96, height: Math.round((96 * screenshot.height) / Math.max(1, screenshot.width)), borderRadius: 8, backgroundColor: colors.fill }}\n />\n <View style={{ flex: 1, gap: 8 }}>\n <View style={{ flexDirection: \"row\", alignItems: \"center\", justifyContent: \"space-between\", gap: 8 }}>\n <NativeText style={{ flex: 1, color: colors.label, fontSize: 15, lineHeight: 20 }}>{copy.feedback.includeScreenshot}</NativeText>\n <NativeSwitch\n testID={`${testID}-include-screenshot`}\n accessibilityLabel={copy.feedback.includeScreenshot}\n checked={include}\n onCheckedChange={setInclude}\n />\n </View>\n <NativeText style={{ color: colors.secondaryLabel, fontSize: 13, lineHeight: 18 }}>{copy.feedback.screenshotHint}</NativeText>\n {block.options.viewShot ? (\n <NativeButton variant=\"outline\" size=\"sm\" onPress={() => setAnnotating(true)} testID={`${testID}-annotate`}>\n {copy.feedback.annotate}\n </NativeButton>\n ) : null}\n <NativeButton\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => {\n setScreenshot(null);\n setInclude(false);\n }}\n testID={`${testID}-remove-screenshot`}\n >\n {copy.feedback.removeScreenshot}\n </NativeButton>\n </View>\n </View>\n </View>\n ) : null}\n {/* Full screen, outside the page's scroll view: on iOS a scroll view takes a drag before the drawing can. */}\n {annotating && screenshot && block.options.viewShot ? (\n <Modal visible animationType=\"slide\" presentationStyle=\"fullScreen\" onRequestClose={() => {\n // Android back: like Cancel, never leave a screenshot included without the person's marks.\n setInclude(false);\n setAnnotating(false);\n }}>\n <SafeAreaView style={{ flex: 1, backgroundColor: colors.background }}>\n <View style={{ flex: 1, padding: 16, justifyContent: \"center\" }}>\n <ScreenshotAnnotator\n screenshot={screenshot}\n viewShot={block.options.viewShot}\n copy={copy.annotate}\n onCancel={(hadMarks) => {\n // Marks left unsaved: the screenshot would go without the parts the person meant to hide.\n if (hadMarks) setInclude(false);\n setAnnotating(false);\n }}\n onDone={(next, marked) => {\n setScreenshot(next);\n if (marked) setInclude(true);\n setAnnotating(false);\n }}\n testID={`${testID}-annotator`}\n />\n </View>\n </SafeAreaView>\n </Modal>\n ) : null}\n <NativeButton onPress={() => void send()} loading={sending} disabled={sending} testID={`${testID}-send`}>\n {sending ? copy.feedback.sending : copy.feedback.send}\n </NativeButton>\n </View>\n );\n}\n","/**\n * The support screens as hooks that return a Genesis layout's props, so each\n * route file is a layout and one hook:\n *\n * const inbox = useSupportInbox(); → <InboxPage {...inbox} />\n * const thread = useSupportThread(id); → <ThreadPage {...thread} />\n * const board = useIdeaBoard(); → <InboxPage {...board} />\n * const shipped = useShippedIdeas(); → <InboxPage {...shipped} />\n *\n * Data is read and cached with TanStack Query (the native shell's client),\n * under the `genesis-support` key root, never persisted.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Alert, View } from \"react-native\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { NativeButton, NativeInput } from \"@marktiderman/genesis-ui-native/components\";\nimport type { InboxItem, InboxPageProps, ThreadMessage, ThreadPageProps } from \"@marktiderman/genesis-ui-native/layouts\";\nimport type { SupportIdea, SupportReply, SupportReport } from \"../client\";\nimport type { SupportThreadInfo } from \"../chat\";\nimport { fill } from \"../copy\";\nimport { SUPPORT_QUERY_ROOT, useOptionalSupport, useSupport } from \"./support\";\n\nconst key = (...parts: string[]) => [SUPPORT_QUERY_ROOT, ...parts];\n\ntype InboxProps = Pick<\n InboxPageProps,\n \"items\" | \"refreshing\" | \"onRefresh\" | \"emptyTitle\" | \"emptyBody\" | \"emptyActionLabel\" | \"onEmptyAction\" | \"sectionTitle\" | \"header\" | \"testID\" | \"loading\" | \"error\" | \"errorTitle\" | \"errorBody\"\n> & { headerTitle: string };\n\n/** Help: the person's reports, newest first, with unread staff replies, and links to the idea board. */\nexport function useSupportInbox(): InboxProps {\n const block = useSupport();\n const { copy, paths, client } = block;\n const queryClient = useQueryClient();\n const query = useQuery({ queryKey: key(\"reports\"), queryFn: () => client.myReports() });\n const navigate = block.options.navigate;\n\n const confirmDelete = (report: SupportReport) =>\n Alert.alert(copy.inbox.deleteConfirmTitle, copy.inbox.deleteConfirmBody, [\n { text: copy.inbox.cancel, style: \"cancel\" },\n {\n text: copy.inbox.delete,\n style: \"destructive\",\n onPress: () => {\n void client\n .deleteReport(report.id)\n .then(() => queryClient.invalidateQueries({ queryKey: key(\"reports\") }))\n .catch(() => Alert.alert(copy.feedback.failedTitle, copy.feedback.failedBody));\n },\n },\n ]);\n\n const items: InboxItem[] = (query.data ?? []).map((report) => ({\n id: report.id,\n title: report.title || firstLine(report.message),\n preview: report.title ? firstLine(report.message) : undefined,\n timestamp: report.lastStaffReplyAt ?? report.createdAt,\n unread: report.unread,\n meta: `${copy.feedback.types[report.type]} · ${copy.status[report.status]}`,\n onPress: () => navigate(paths.thread(report.id)),\n swipeActions: [{ id: \"delete\", label: copy.inbox.delete, destructive: true, onPress: () => confirmDelete(report) }],\n testID: `genesis-support-report-${report.id}`,\n }));\n\n const header = (\n <View style={{ flexDirection: \"row\", flexWrap: \"wrap\", gap: 8, paddingHorizontal: 16, paddingBottom: 8 }}>\n <NativeButton size=\"sm\" onPress={() => void block.openFeedback({ screenshot: false })} testID=\"genesis-support-inbox-new\">\n {copy.inbox.sendFeedback}\n </NativeButton>\n {block.options.ideas === false ? null : (\n <>\n <NativeButton size=\"sm\" variant=\"outline\" onPress={() => navigate(paths.ideas)} testID=\"genesis-support-inbox-ideas\">\n {copy.inbox.ideaBoard}\n </NativeButton>\n <NativeButton size=\"sm\" variant=\"outline\" onPress={() => navigate(paths.shipped)} testID=\"genesis-support-inbox-shipped\">\n {copy.inbox.shipped}\n </NativeButton>\n </>\n )}\n </View>\n );\n\n return {\n testID: \"genesis-support-inbox\",\n headerTitle: copy.inbox.title,\n items,\n loading: query.isPending,\n error: query.isError,\n refreshing: query.isRefetching,\n onRefresh: async () => {\n await query.refetch();\n },\n sectionTitle: items.length ? copy.inbox.sectionTitle : undefined,\n header,\n emptyTitle: copy.inbox.emptyTitle,\n emptyBody: copy.inbox.emptyBody,\n errorTitle: copy.inbox.errorTitle,\n errorBody: copy.inbox.errorBody,\n };\n}\n\nfunction firstLine(text: string): string {\n const line = text.split(\"\\n\").find((l) => l.trim()) ?? \"\";\n return line.length > 120 ? `${line.slice(0, 119)}…` : line;\n}\n\ntype ThreadProps = Pick<ThreadPageProps, \"messages\" | \"composer\" | \"closedNotice\" | \"readAt\" | \"readLabel\" | \"emptyTitle\" | \"emptyBody\" | \"labels\" | \"testID\"> & {\n headerTitle: string;\n report: SupportReport | null;\n loading: boolean;\n /** Read, and there is no such report (deleted, or not the person's): leave the screen. */\n notFound: boolean;\n /** `chat`: the thread runs on genesis-chat (the support-chat block), live; `replies`: support_replies, re-read every `pollMs`. */\n mode: SupportThreadInfo[\"mode\"] | null;\n /** The report's genesis-chat conversation, for a screen that renders it with genesis-chat's own native parts. */\n conversationId: string | null;\n};\n\n/**\n * Where a report's thread lives: its genesis-chat conversation (the support-chat block, with a\n * `chat` client given to `createSupport`), or support_replies. For a screen of your own that\n * renders the conversation with `@marktiderman/genesis-chat/native` (ChatThreadScreen).\n */\nexport function useSupportConversation(reportId: string): { mode: SupportThreadInfo[\"mode\"] | null; conversationId: string | null; loading: boolean; error: boolean } {\n const { client } = useSupport();\n const query = useQuery({ queryKey: key(\"thread\", reportId), queryFn: () => client.thread(reportId), staleTime: Infinity });\n return { mode: query.data?.mode ?? null, conversationId: query.data?.conversationId ?? null, loading: query.isPending, error: query.isError };\n}\n\n/** What a reply's files add to its text where the thread can only show photos. */\nfunction fileLabels(reply: SupportReply, copy: ReturnType<typeof useSupport>[\"copy\"]): string[] {\n return (reply.attachments ?? [])\n .filter((a) => a.kind !== \"image\")\n .map((a) => (a.kind === \"voice\" ? copy.thread.voiceNote : a.kind === \"video\" ? copy.thread.video : a.name || copy.thread.file));\n}\n\nconst CLOSED = new Set([\"addressed\", \"wont_fix\"]);\n\n/**\n * One report as a conversation: the report itself, then the replies. Marks it read as it opens\n * and as replies arrive. On genesis-chat (the support-chat block) it updates live and shows the\n * photos in replies; otherwise it re-reads support_replies every `pollMs`.\n */\nexport function useSupportThread(reportId: string, options: { pollMs?: number } = {}): ThreadProps {\n const block = useSupport();\n const { copy, client } = block;\n const queryClient = useQueryClient();\n const where = useQuery({ queryKey: key(\"thread\", reportId), queryFn: () => client.thread(reportId), staleTime: Infinity });\n const live = where.data?.mode === \"chat\";\n // Live on chat; polled on support_replies (and while it's still being worked out).\n const poll = live ? false : (options.pollMs ?? 30_000);\n const report = useQuery({ queryKey: key(\"report\", reportId), queryFn: () => client.report(reportId), refetchInterval: poll });\n const replies = useQuery({ queryKey: key(\"replies\", reportId), queryFn: () => client.replies(reportId), refetchInterval: poll, enabled: where.isFetched });\n useEffect(() => {\n if (!live) return;\n return client.subscribe(reportId, () => {\n void queryClient.invalidateQueries({ queryKey: key(\"replies\", reportId) });\n void queryClient.invalidateQueries({ queryKey: key(\"report\", reportId) });\n });\n }, [client, reportId, live, queryClient]);\n const attachments = useQuery({ queryKey: key(\"attachments\", reportId), queryFn: () => client.attachments(reportId), staleTime: 50 * 60_000 });\n const [draft, setDraft] = useState(\"\");\n const [failed, setFailed] = useState<{ id: string; body: string; at: string }[]>([]);\n\n const lastStaff = report.data?.lastStaffReplyAt ?? null;\n useEffect(() => {\n if (!report.data) return;\n void client\n .markRead(reportId)\n .then(() => queryClient.invalidateQueries({ queryKey: key(\"reports\") }))\n .catch(() => undefined);\n // Again when a new staff reply arrives.\n }, [client, reportId, lastStaff, Boolean(report.data), queryClient]);\n\n const send = useMutation({\n mutationFn: (body: string) => client.reply(reportId, body),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: key(\"replies\", reportId) });\n void queryClient.invalidateQueries({ queryKey: key(\"report\", reportId) });\n },\n onError: (_error, body) => setFailed((f) => [...f, { id: `failed-${Date.now()}`, body, at: new Date().toISOString() }]),\n });\n\n const r = report.data ?? null;\n const messages: ThreadMessage[] = useMemo(() => {\n if (!r) return [];\n const first: ThreadMessage = {\n id: r.id,\n body: r.message,\n mine: true,\n timestamp: r.createdAt,\n attachments: (attachments.data ?? [])\n .filter((a) => a.url)\n .map((a) => ({ id: a.id, uri: a.url!, width: a.width ?? undefined, height: a.height ?? undefined, accessibilityLabel: copy.thread.screenshot })),\n };\n // The person never receives internal notes; a staff member using this screen doesn't see them either.\n const rest: ThreadMessage[] = (replies.data ?? [])\n .filter((reply) => !reply.internal)\n .map((reply) => ({\n id: reply.id,\n body: [reply.body, ...fileLabels(reply, copy)].filter((part) => part.trim()).join(\"\\n\"),\n mine: reply.mine,\n authorName: reply.fromStaff ? copy.thread.support : undefined,\n timestamp: reply.createdAt,\n attachments: (reply.attachments ?? [])\n .filter((a) => a.kind === \"image\" && a.url)\n .map((a) => ({ id: a.id, uri: a.url!, width: a.width ?? undefined, height: a.height ?? undefined, accessibilityLabel: copy.thread.screenshot })),\n }));\n const pending: ThreadMessage[] = send.isPending && send.variables ? [{ id: \"sending\", body: send.variables, mine: true, timestamp: new Date().toISOString(), status: \"sending\" }] : [];\n const failedMessages: ThreadMessage[] = failed.map((f) => ({\n id: f.id,\n body: f.body,\n mine: true,\n timestamp: f.at,\n status: \"failed\",\n onRetry: () => {\n setFailed((all) => all.filter((x) => x.id !== f.id));\n send.mutate(f.body);\n },\n }));\n return [first, ...rest, ...pending, ...failedMessages];\n }, [r, replies.data, attachments.data, send.isPending, send.variables, failed, copy, send]);\n\n const closed = r ? CLOSED.has(r.status) : false;\n return {\n testID: \"genesis-support-thread\",\n headerTitle: r ? r.title || copy.feedback.types[r.type] : copy.thread.title,\n report: r,\n loading: report.isPending,\n notFound: report.isSuccess && r === null,\n mode: where.data?.mode ?? null,\n conversationId: where.data?.conversationId ?? null,\n labels: { you: copy.thread.you, sending: copy.thread.sending, notSent: copy.thread.notSent, retryHint: copy.thread.retryHint },\n messages,\n readAt: r?.staffReadAt ?? null,\n readLabel: copy.thread.read,\n emptyTitle: copy.thread.emptyTitle,\n emptyBody: copy.thread.emptyBody,\n closedNotice: copy.thread.closed,\n composer: closed\n ? null\n : {\n value: draft,\n onChangeText: setDraft,\n placeholder: copy.thread.placeholder,\n sendLabel: copy.thread.send,\n sending: send.isPending,\n maxLength: 10000,\n onSend: () => {\n const body = draft.trim();\n if (!body || send.isPending) return;\n setDraft(\"\");\n send.mutate(body);\n },\n },\n };\n}\n\n/** A vote toggle for an idea row. */\nexport function VoteButton({ idea, onToggle, testID }: { idea: SupportIdea; onToggle: () => void; testID?: string }) {\n const { copy } = useSupport();\n const count = idea.voteCount === 1 ? copy.ideas.oneVote : fill(copy.ideas.votes, { count: idea.voteCount });\n const open = idea.status === \"open\" || idea.status === \"planned\" || idea.status === \"in_progress\";\n return (\n <View accessibilityLabel={`${idea.voted ? copy.ideas.voted : copy.ideas.vote}, ${count}`}>\n <NativeButton size=\"sm\" variant={idea.voted ? \"default\" : \"outline\"} onPress={onToggle} disabled={!open && !idea.voted} testID={testID}>\n {`▲ ${idea.voteCount}`}\n </NativeButton>\n </View>\n );\n}\n\ntype BoardProps = Pick<InboxPageProps, \"items\" | \"refreshing\" | \"onRefresh\" | \"emptyTitle\" | \"emptyBody\" | \"header\" | \"testID\" | \"loading\" | \"error\" | \"errorTitle\" | \"errorBody\"> & {\n headerTitle: string;\n};\n\n/** The idea board: most votes first, a vote button on each, and a field to suggest one. */\nexport function useIdeaBoard(): BoardProps {\n const block = useSupport();\n const { copy, client } = block;\n const queryClient = useQueryClient();\n const query = useQuery({ queryKey: key(\"ideas\"), queryFn: () => client.ideas() });\n const [title, setTitle] = useState(\"\");\n\n const toggle = useMutation({\n mutationFn: (idea: SupportIdea) => (idea.voted ? client.unvote(idea.id) : client.vote(idea.id)),\n onMutate: async (idea) => {\n await queryClient.cancelQueries({ queryKey: key(\"ideas\") });\n const before = queryClient.getQueryData<SupportIdea[]>(key(\"ideas\"));\n queryClient.setQueryData<SupportIdea[]>(key(\"ideas\"), (list) =>\n list?.map((i) => (i.id === idea.id ? { ...i, voted: !i.voted, voteCount: Math.max(0, i.voteCount + (i.voted ? -1 : 1)) } : i)),\n );\n return { before };\n },\n onError: (_e, _idea, context) => {\n if (context?.before) queryClient.setQueryData(key(\"ideas\"), context.before);\n },\n onSettled: () => void queryClient.invalidateQueries({ queryKey: key(\"ideas\") }),\n });\n\n const suggest = useMutation({\n mutationFn: (t: string) => client.suggestIdea({ title: t }),\n onSuccess: () => {\n setTitle(\"\");\n void queryClient.invalidateQueries({ queryKey: key(\"ideas\") });\n },\n onError: (e) => Alert.alert(copy.feedback.failedTitle, (e as { code?: string }).code === \"GS429\" ? copy.feedback.rateLimited : copy.feedback.failedBody),\n });\n\n const items: InboxItem[] = (query.data ?? []).map((idea) => ({\n id: idea.id,\n title: idea.title,\n preview: idea.body ?? undefined,\n meta: copy.ideas.statuses[idea.status],\n // Swipe or long press: the same vote, for people who don't see the button.\n swipeActions: [{ id: \"vote\", label: idea.voted ? copy.ideas.voted : copy.ideas.vote, onPress: () => toggle.mutate(idea) }],\n leading: <View />,\n trailing: <VoteButton idea={idea} onToggle={() => toggle.mutate(idea)} testID={`genesis-support-vote-${idea.id}`} />,\n testID: `genesis-support-idea-${idea.id}`,\n }));\n\n const header: ReactNode = (\n <View style={{ flexDirection: \"row\", gap: 8, alignItems: \"flex-end\", paddingHorizontal: 16, paddingBottom: 12 }}>\n <View style={{ flex: 1 }}>\n <NativeInput\n testID=\"genesis-support-idea-title\"\n label={copy.ideas.titleLabel}\n placeholder={copy.ideas.titlePlaceholder}\n value={title}\n onChangeText={setTitle}\n maxLength={140}\n />\n </View>\n <NativeButton\n onPress={() => title.trim().length >= 3 && suggest.mutate(title.trim())}\n disabled={title.trim().length < 3}\n loading={suggest.isPending}\n testID=\"genesis-support-idea-submit\"\n >\n {copy.ideas.submit}\n </NativeButton>\n </View>\n );\n\n return {\n testID: \"genesis-support-ideas\",\n headerTitle: copy.ideas.title,\n items,\n refreshing: query.isRefetching,\n onRefresh: async () => {\n await query.refetch();\n },\n header,\n loading: query.isPending,\n error: query.isError,\n errorTitle: copy.inbox.errorTitle,\n errorBody: copy.inbox.errorBody,\n emptyTitle: copy.ideas.emptyTitle,\n emptyBody: copy.ideas.emptyBody,\n };\n}\n\n/** \"You asked, we shipped\": the shipped ideas the person suggested or voted for, with the FeatureId each shipped as. */\nexport function useShippedIdeas(): Omit<BoardProps, \"header\"> {\n const { copy, client } = useSupport();\n const query = useQuery({ queryKey: key(\"shipped\"), queryFn: () => client.shippedForMe() });\n const items: InboxItem[] = (query.data ?? []).map((idea) => ({\n id: idea.id,\n title: idea.title,\n preview: idea.body ?? undefined,\n timestamp: idea.shippedAt ?? undefined,\n meta: idea.featureId ? fill(copy.shipped.shippedAs, { feature: idea.featureId }) : copy.ideas.statuses.shipped,\n leading: <View />,\n testID: `genesis-support-shipped-${idea.id}`,\n }));\n return {\n testID: \"genesis-support-shipped\",\n headerTitle: copy.shipped.title,\n items,\n refreshing: query.isRefetching,\n onRefresh: async () => {\n await query.refetch();\n },\n loading: query.isPending,\n error: query.isError,\n errorTitle: copy.inbox.errorTitle,\n errorBody: copy.inbox.errorBody,\n emptyTitle: copy.shipped.emptyTitle,\n emptyBody: copy.shipped.emptyBody,\n };\n}\n\n/**\n * \"Send feedback\", for a devtools panel's slot or any screen: captures the\n * screen, then opens the feedback screen. Renders nothing when support is off.\n */\nexport function SendFeedbackButton({ testID = \"genesis-support-send-feedback-button\", screenshot = true }: { testID?: string; screenshot?: boolean }) {\n const block = useOptionalSupport();\n if (!block) return null;\n return (\n <NativeButton variant=\"outline\" onPress={() => void block.openFeedback({ screenshot })} testID={testID}>\n {block.copy.settings.sendFeedback}\n </NativeButton>\n );\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import * as react from 'react';
2
+ import { ResolveUser } from '@marktiderman/genesis-chat/web';
3
+ import { K as SupportClient, O as SupportCopyOverrides } from './copy-D3rc0SCl.js';
4
+ import '@supabase/supabase-js';
5
+
6
+ /** The query keys, under genesis-support's root (as on native). */
7
+ declare const supportWebKeys: {
8
+ report: (id: string) => readonly ["genesis-support", "report", string];
9
+ attachments: (id: string) => readonly ["genesis-support", "attachments", string];
10
+ thread: (id: string) => readonly ["genesis-support", "thread", string];
11
+ };
12
+ interface SupportReportThreadProps {
13
+ /** A support client made with the `chat` option (`createSupportClient(supabase, { chat })`). */
14
+ client: SupportClient;
15
+ reportId: string;
16
+ /**
17
+ * Names people. Default: the signed-in person is "You" and anyone else "Support" (only staff
18
+ * write in a report's conversation besides its person).
19
+ */
20
+ resolveUser?: ResolveUser;
21
+ copy?: SupportCopyOverrides;
22
+ /** A back button in the thread's header. */
23
+ onBack?: () => void;
24
+ className?: string;
25
+ }
26
+ /** The person's view of their report: the report, then the conversation with support, live. */
27
+ declare function SupportReportThread(props: SupportReportThreadProps): react.JSX.Element;
28
+
29
+ interface SupportStaffThreadProps extends Omit<SupportReportThreadProps, "resolveUser"> {
30
+ /** Names people: the reporter and staff. Required, since staff see who wrote what. */
31
+ resolveUser: ResolveUser;
32
+ /** Who a report can be given to (support staff). Without it there is no assignee picker. */
33
+ staff?: readonly {
34
+ id: string;
35
+ name: string;
36
+ }[];
37
+ /** Every refused change (not staff, a network failure), for reporting. */
38
+ onError?: (error: unknown) => void;
39
+ }
40
+ /** A report for staff: status and assignee controls over the live conversation, with internal notes. */
41
+ declare function SupportStaffThread({ staff, onError, ...props }: SupportStaffThreadProps): react.JSX.Element;
42
+
43
+ export { SupportReportThread, type SupportReportThreadProps, SupportStaffThread, type SupportStaffThreadProps, supportWebKeys };
@@ -0,0 +1,140 @@
1
+ import { resolveSupportCopy, FEEDBACK_STATUSES } from './chunk-OSB6G6Y3.js';
2
+ import { useMemo, useState } from 'react';
3
+ import { useQuery, useQueryClient } from '@tanstack/react-query';
4
+ import { Skeleton, cn, EmptyState, Card, CardHeader, Badge, CardTitle, CardDescription, CardContent, Label, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@marktiderman/genesis-ui';
5
+ import { ChatThread } from '@marktiderman/genesis-chat/web';
6
+ import { useChat, chatKeys } from '@marktiderman/genesis-chat/react';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var supportWebKeys = {
10
+ report: (id) => ["genesis-support", "report", id],
11
+ attachments: (id) => ["genesis-support", "attachments", id],
12
+ thread: (id) => ["genesis-support", "thread", id]
13
+ };
14
+ function ReportThreadShell({ client, reportId, resolveUser, onBack, className, toolbar, copyResolved: copy, testID }) {
15
+ const { userId: me } = useChat();
16
+ const report = useQuery({ queryKey: supportWebKeys.report(reportId), queryFn: () => client.report(reportId) });
17
+ const where = useQuery({ queryKey: supportWebKeys.thread(reportId), queryFn: () => client.thread(reportId), staleTime: Infinity });
18
+ const shots = useQuery({ queryKey: supportWebKeys.attachments(reportId), queryFn: () => client.attachments(reportId), staleTime: 50 * 6e4 });
19
+ const names = useMemo(
20
+ () => resolveUser ?? ((id) => ({ name: id === me ? copy.thread.you : copy.thread.support })),
21
+ [resolveUser, me, copy]
22
+ );
23
+ if (report.isPending || where.isPending) {
24
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-3 p-4", className), "data-testid": testID, "aria-busy": "true", children: [
25
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-24 w-full" }),
26
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-64 w-full" })
27
+ ] });
28
+ }
29
+ const r = report.data;
30
+ if (!r || where.data?.mode !== "chat") {
31
+ return /* @__PURE__ */ jsx("div", { className, "data-testid": testID, children: /* @__PURE__ */ jsx(
32
+ EmptyState,
33
+ {
34
+ title: r ? copy.staff.unavailableTitle : copy.thread.notFound,
35
+ description: r ? copy.staff.unavailableBody : void 0
36
+ }
37
+ ) });
38
+ }
39
+ const conversationId = where.data.conversationId;
40
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex h-full min-h-0 flex-col gap-3", className), "data-testid": testID, children: [
41
+ /* @__PURE__ */ jsxs(Card, { children: [
42
+ /* @__PURE__ */ jsxs(CardHeader, { className: "gap-2", children: [
43
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
44
+ /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: copy.feedback.types[r.type] }),
45
+ /* @__PURE__ */ jsx(Badge, { variant: "outline", "data-testid": "genesis-support-report-status", children: copy.status[r.status] })
46
+ ] }),
47
+ /* @__PURE__ */ jsx(CardTitle, { children: r.title || copy.feedback.types[r.type] }),
48
+ /* @__PURE__ */ jsx(CardDescription, { className: "whitespace-pre-wrap", children: r.message })
49
+ ] }),
50
+ (shots.data ?? []).some((a) => a.url) ? /* @__PURE__ */ jsx(CardContent, { className: "flex flex-wrap gap-2", children: (shots.data ?? []).filter((a) => a.url).map((a) => /* @__PURE__ */ jsx("a", { href: a.url, target: "_blank", rel: "noreferrer noopener", className: "block", children: /* @__PURE__ */ jsx("img", { src: a.url, alt: copy.thread.screenshot, className: "h-24 w-auto rounded-md border object-cover" }) }, a.id)) }) : null,
51
+ toolbar ? /* @__PURE__ */ jsx(CardContent, { className: "border-t pt-4", children: toolbar(r, conversationId) }) : null
52
+ ] }),
53
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsx(
54
+ ChatThread,
55
+ {
56
+ conversationId,
57
+ resolveUser: names,
58
+ title: r.title || copy.feedback.types[r.type],
59
+ onBack,
60
+ search: false,
61
+ scheduling: false,
62
+ availability: false,
63
+ placeholder: copy.thread.placeholder
64
+ }
65
+ ) })
66
+ ] });
67
+ }
68
+ function SupportReportThread(props) {
69
+ const copy = useMemo(() => resolveSupportCopy(props.copy), [props.copy]);
70
+ return /* @__PURE__ */ jsx(ReportThreadShell, { ...props, copyResolved: copy, testID: "genesis-support-report-thread" });
71
+ }
72
+ var NOBODY = "__nobody__";
73
+ function StaffControls({ client, reportId, status, reporter, conversationId, staff, resolveUser, copy, onError }) {
74
+ const chat = useChat();
75
+ const queryClient = useQueryClient();
76
+ const [failed, setFailed] = useState(false);
77
+ const conversation = useQuery({ queryKey: chatKeys.conversation(conversationId), queryFn: () => chat.client.conversation(conversationId) });
78
+ const assignee = conversation.data?.assigneeId ?? null;
79
+ const run = (work) => work.then(() => {
80
+ setFailed(false);
81
+ void queryClient.invalidateQueries({ queryKey: supportWebKeys.report(reportId) });
82
+ void queryClient.invalidateQueries({ queryKey: chatKeys.conversation(conversationId) });
83
+ }).catch((error) => {
84
+ setFailed(true);
85
+ onError?.(error);
86
+ });
87
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-end gap-4", children: [
88
+ reporter ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
89
+ /* @__PURE__ */ jsx(Label, { children: copy.staff.reporter }),
90
+ /* @__PURE__ */ jsx("span", { className: "text-sm", children: resolveUser(reporter).name })
91
+ ] }) : null,
92
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
93
+ /* @__PURE__ */ jsx(Label, { htmlFor: "genesis-support-staff-status", children: copy.staff.status }),
94
+ /* @__PURE__ */ jsxs(Select, { value: status, onValueChange: (value) => void run(client.setStatus(reportId, value)), children: [
95
+ /* @__PURE__ */ jsx(SelectTrigger, { id: "genesis-support-staff-status", className: "w-44", "data-testid": "genesis-support-staff-status", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
96
+ /* @__PURE__ */ jsx(SelectContent, { children: FEEDBACK_STATUSES.map((s) => /* @__PURE__ */ jsx(SelectItem, { value: s, children: copy.status[s] }, s)) })
97
+ ] })
98
+ ] }),
99
+ staff ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
100
+ /* @__PURE__ */ jsx(Label, { htmlFor: "genesis-support-staff-assignee", children: copy.staff.assignee }),
101
+ /* @__PURE__ */ jsxs(Select, { value: assignee ?? NOBODY, onValueChange: (value) => void run(client.assign(reportId, value === NOBODY ? null : value)), children: [
102
+ /* @__PURE__ */ jsx(SelectTrigger, { id: "genesis-support-staff-assignee", className: "w-48", "data-testid": "genesis-support-staff-assignee", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
103
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
104
+ /* @__PURE__ */ jsx(SelectItem, { value: NOBODY, children: copy.staff.unassigned }),
105
+ staff.map((s) => /* @__PURE__ */ jsx(SelectItem, { value: s.id, children: s.name }, s.id))
106
+ ] })
107
+ ] })
108
+ ] }) : null,
109
+ failed ? /* @__PURE__ */ jsx("p", { role: "alert", className: "text-sm text-destructive", children: copy.staff.failed }) : null
110
+ ] });
111
+ }
112
+ function SupportStaffThread({ staff, onError, ...props }) {
113
+ const copy = useMemo(() => resolveSupportCopy(props.copy), [props.copy]);
114
+ return /* @__PURE__ */ jsx(
115
+ ReportThreadShell,
116
+ {
117
+ ...props,
118
+ copyResolved: copy,
119
+ testID: "genesis-support-staff-thread",
120
+ toolbar: (report, conversationId) => /* @__PURE__ */ jsx(
121
+ StaffControls,
122
+ {
123
+ client: props.client,
124
+ reportId: props.reportId,
125
+ status: report.status,
126
+ reporter: report.userId ?? null,
127
+ conversationId,
128
+ staff,
129
+ resolveUser: props.resolveUser,
130
+ copy,
131
+ onError
132
+ }
133
+ )
134
+ }
135
+ );
136
+ }
137
+
138
+ export { SupportReportThread, SupportStaffThread, supportWebKeys };
139
+ //# sourceMappingURL=web-chat.js.map
140
+ //# sourceMappingURL=web-chat.js.map