@sylergydigital/issue-pin-sdk 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +74 -0
- package/README.md +376 -0
- package/dist/index.cjs +2500 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +282 -0
- package/dist/index.d.ts +282 -0
- package/dist/index.js +2451 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/IssuePin.tsx","../src/FeedbackProvider.tsx","../src/useDocumentPathname.ts","../src/theme.ts","../src/FeedbackOverlay.tsx","../src/positioning.ts","../src/ThreadPins.tsx","../src/anchorRegistry.ts","../src/ReviewSurfaceOverlay.tsx","../src/SdkCommentPopover.tsx","../src/ScreenshotFeedback.tsx","../src/FeedbackButton.tsx","../src/launcher.ts","../src/ModalFeedbackInjector.tsx"],"sourcesContent":["import { Component, type ReactNode } from \"react\";\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport {\n FeedbackProvider,\n type FeedbackMode,\n type LauncherRenderProps,\n type ModalCaptureRenderProps,\n type ScrollContainerBinding,\n type AnchorResolution,\n type AnnotationSurface,\n useFeedbackSafe,\n} from \"./FeedbackProvider\";\nimport { FeedbackOverlay } from \"./FeedbackOverlay\";\nimport { ThreadPins } from \"./ThreadPins\";\nimport { ReviewSurfaceOverlay } from \"./ReviewSurfaceOverlay\";\nimport { SdkCommentPopover } from \"./SdkCommentPopover\";\nimport { ScreenshotFeedback } from \"./ScreenshotFeedback\";\nimport { FeedbackButton } from \"./FeedbackButton\";\nimport { ModalFeedbackInjector } from \"./ModalFeedbackInjector\";\n\n/** Silent error boundary — logs and swallows failures so sibling UI stays alive. */\nclass SdkErrorBoundary extends Component<\n { name: string; children: ReactNode },\n { hasError: boolean }\n> {\n state = { hasError: false };\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error) {\n console.warn(`[IssuePin] ${this.props.name} crashed and was disabled:`, error.message);\n }\n\n render() {\n return this.state.hasError ? null : this.props.children;\n }\n}\n\ninterface IssuePinProps {\n /** API key generated from the Issue Pin dashboard */\n apiKey?: string;\n /** Toggle SDK visibility without unmounting (default: true) */\n enabled?: boolean;\n /** Optional user info for attribution */\n user?: {\n id?: string;\n email?: string;\n displayName?: string;\n };\n /**\n * Pass the host app's Supabase client to auto-extract user identity\n * from their auth session. No manual user prop needed.\n *\n * @example\n * import { supabase } from \"./lib/supabase\";\n * <IssuePin apiKey=\"ew_live_...\" supabaseClient={supabase} />\n */\n supabaseClient?: SupabaseClient;\n /** Allow creating element-based pins from the launcher */\n allowPinOnPage?: boolean;\n /** Allow screenshot capture flow from the launcher */\n allowScreenshot?: boolean;\n /** Show SDK-owned instructional hints and coachmarks */\n showHints?: boolean;\n /** Optional host-owned scroll container for element pins */\n scrollContainer?: ScrollContainerBinding;\n /** Resolve a stable logical anchor key for clicked elements */\n resolveAnchor?: (target: Element) => AnchorResolution | null;\n /** Dedicated review surface URL rendered inside a managed iframe overlay */\n reviewUrl?: string;\n /** Which surface new annotations should target */\n annotationSurface?: AnnotationSurface;\n /** Show historical thread pins independently from other SDK UI */\n pinsVisible?: boolean;\n /** Floating button position */\n buttonPosition?: \"bottom-right\" | \"bottom-left\";\n /** Replace the stock launcher with custom UI while keeping SDK-owned state/actions */\n renderLauncher?: (props: LauncherRenderProps) => ReactNode;\n /** Replace the default injected modal screenshot button */\n renderModalCaptureButton?: (props: ModalCaptureRenderProps) => ReactNode;\n /** Whether modal screenshot buttons should be injected into detected dialogs */\n showModalCaptureButton?: boolean;\n /** Controlled annotate mode — pair with `onModeChange` */\n mode?: FeedbackMode;\n /** Called when annotate mode changes (including from the floating SDK button) */\n onModeChange?: (mode: FeedbackMode) => void;\n /** @deprecated Use `mode` / `onModeChange` (`annotate` ↔ `true`) */\n feedbackActive?: boolean;\n /** @deprecated Use `onModeChange` */\n onFeedbackActiveChange?: (active: boolean) => void;\n /** Emit lifecycle/state logs for SDK troubleshooting */\n debug?: boolean;\n\n // Legacy props (internal/dogfooding use)\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n workspaceId?: string;\n userId?: string;\n userEmail?: string;\n userDisplayName?: string;\n}\n\n/**\n * Drop-in SDK component — mount anywhere in your app tree.\n *\n * Recommended (auto-detect identity from Supabase auth):\n * <IssuePin apiKey=\"ew_live_...\" supabaseClient={supabase} />\n *\n * Manual identity:\n * <IssuePin apiKey=\"ew_live_...\" user={{ email: \"dev@co.com\" }} />\n *\n * Toggle visibility without unmounting:\n * <IssuePin apiKey=\"ew_live_...\" enabled={showFeedback} supabaseClient={supabase} />\n */\nexport function IssuePin({\n apiKey,\n enabled = false,\n user,\n supabaseClient,\n allowPinOnPage = true,\n allowScreenshot = true,\n showHints = true,\n scrollContainer,\n resolveAnchor,\n reviewUrl,\n annotationSurface,\n pinsVisible = true,\n buttonPosition = \"bottom-right\",\n renderLauncher,\n renderModalCaptureButton,\n showModalCaptureButton = true,\n mode,\n onModeChange,\n feedbackActive,\n onFeedbackActiveChange,\n debug = false,\n // Legacy props\n supabaseUrl,\n supabaseAnonKey,\n workspaceId,\n userId,\n userEmail,\n userDisplayName,\n}: IssuePinProps) {\n return (\n <FeedbackProvider\n apiKey={apiKey}\n supabaseUrl={supabaseUrl}\n supabaseAnonKey={supabaseAnonKey}\n workspaceId={workspaceId}\n supabaseClient={supabaseClient}\n debug={debug}\n allowPinOnPage={allowPinOnPage}\n allowScreenshot={allowScreenshot}\n showHints={showHints}\n scrollContainer={scrollContainer}\n resolveAnchor={resolveAnchor}\n reviewUrl={reviewUrl}\n annotationSurface={annotationSurface}\n mode={mode}\n onModeChange={onModeChange}\n feedbackActive={feedbackActive}\n onFeedbackActiveChange={onFeedbackActiveChange}\n userId={user?.id ?? userId}\n userEmail={user?.email ?? userEmail}\n userDisplayName={user?.displayName ?? userDisplayName}\n >\n {enabled && (\n <>\n {annotationSurface === \"review-iframe\" || (!!reviewUrl && !annotationSurface) ? (\n <ReviewSurfaceOverlay />\n ) : (\n <FeedbackOverlay />\n )}\n <SdkCommentPopover />\n <ScreenshotFeedback />\n {pinsVisible && (\n <SdkErrorBoundary name=\"ThreadPins\">\n <PinsSlot />\n </SdkErrorBoundary>\n )}\n {allowScreenshot && showModalCaptureButton && (\n <ModalFeedbackInjector renderButton={renderModalCaptureButton} />\n )}\n {renderLauncher ? (\n <CustomLauncherSlot renderLauncher={renderLauncher} />\n ) : (\n <FeedbackButton position={buttonPosition} />\n )}\n </>\n )}\n </FeedbackProvider>\n );\n}\n\nfunction CustomLauncherSlot({\n renderLauncher,\n}: {\n renderLauncher: (props: LauncherRenderProps) => ReactNode;\n}) {\n const ctx = useFeedbackSafe();\n\n if (!ctx) return null;\n\n return (\n <div data-ew-feedback-interactive=\"true\" onPointerDownCapture={(e) => e.stopPropagation()}>\n {renderLauncher({\n mode: ctx.mode,\n setMode: ctx.setMode,\n feedbackActive: ctx.feedbackActive,\n menuOpen: ctx.menuOpen,\n canPinOnPage: ctx.canPinOnPage,\n canScreenshot: ctx.canScreenshot,\n openMenu: ctx.openMenu,\n closeMenu: ctx.closeMenu,\n toggleMenu: ctx.toggleMenu,\n enterPinMode: ctx.enterPinMode,\n exitPinMode: ctx.exitPinMode,\n startScreenshotCapture: ctx.startScreenshotCapture,\n })}\n </div>\n );\n}\n\nfunction PinsSlot() {\n const ctx = useFeedbackSafe();\n\n if (!ctx) return null;\n if (ctx.annotationSurface === \"review-iframe\") return null;\n\n return <ThreadPins />;\n}\n\nexport type { LauncherRenderProps, ModalCaptureRenderProps };\n","import { createContext, useContext, ReactNode, useMemo, useState, useCallback, useEffect, type Dispatch, type SetStateAction } from \"react\";\nimport { createClient, SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Session } from \"@supabase/supabase-js\";\nimport html2canvas from \"html2canvas\";\nimport { useDocumentLocationParts } from \"./useDocumentPathname\";\nimport { Z } from \"./theme\";\nimport type { CoordinateSpace } from \"./positioning\";\n\n/** Pin interaction mode: `annotate` shows the click overlay to place a pin. */\nexport type FeedbackMode = \"view\" | \"annotate\";\nexport type AnnotationSurface = \"host-dom\" | \"review-iframe\";\n\nexport interface ScrollContainerBinding {\n key: string;\n ref: React.RefObject<HTMLElement | null>;\n}\n\nexport interface AnchorResolution {\n key: string;\n selector?: string | null;\n}\n\ninterface FeedbackConfig {\n apiKey?: string;\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n workspaceId?: string;\n userId?: string;\n userEmail?: string;\n userDisplayName?: string;\n /** Pass the host app's Supabase client to auto-extract user identity from their auth session */\n supabaseClient?: SupabaseClient;\n /** Skip automatic federation of the host app's user into the workspace (default: false) */\n skipFederation?: boolean;\n /** Allow creating new pins by clicking page elements (default: true) */\n allowPinOnPage?: boolean;\n /** Allow screenshot capture flow (default: true) */\n allowScreenshot?: boolean;\n /** Show SDK-owned instructional hints / coachmarks (default: true) */\n showHints?: boolean;\n /** Optional host-owned scroll container for element-based pin placement/rendering */\n scrollContainer?: ScrollContainerBinding;\n /** Resolve a host-defined logical anchor key for a clicked element */\n resolveAnchor?: (target: Element) => AnchorResolution | null;\n /** Dedicated review surface URL rendered inside a managed iframe overlay */\n reviewUrl?: string;\n /** Where new annotations should be placed. Defaults to `review-iframe` when reviewUrl is provided. */\n annotationSurface?: AnnotationSurface;\n /** Controlled pin mode when used with `onModeChange`. */\n mode?: FeedbackMode;\n /** Called when pin mode changes. When set, `mode` is controlled. */\n onModeChange?: (mode: FeedbackMode) => void;\n /** @deprecated Use `mode` and `onModeChange` instead */\n feedbackActive?: boolean;\n /** @deprecated Use `onModeChange` instead */\n onFeedbackActiveChange?: (active: boolean) => void;\n debug?: boolean;\n}\n\nexport interface ThreadData {\n annotation_surface: AnnotationSurface | null;\n anchor_key: string | null;\n coordinate_space: CoordinateSpace;\n container_key: string | null;\n id: string;\n page_url: string;\n review_url: string | null;\n selector: string | null;\n element_text: string | null;\n element_tag: string | null;\n x_position: number | null;\n y_position: number | null;\n viewport_width: number | null;\n viewport_height: number | null;\n modal_trigger_selector: string | null;\n screenshot_path: string | null;\n status: string;\n visibility: string;\n created_at: string;\n}\n\nexport interface PendingPin {\n annotationSurface: AnnotationSurface;\n anchorKey: string | null;\n coordinateSpace: CoordinateSpace;\n containerKey: string | null;\n x: number;\n y: number;\n selector: string | null;\n elementText: string;\n elementTag: string;\n pageUrl: string;\n reviewUrl: string | null;\n viewportLeft?: number;\n viewportTop?: number;\n}\n\nexport interface PendingScreenshotPin {\n x: number;\n y: number;\n width: number;\n height: number;\n pageUrl: string;\n}\n\nexport interface LauncherRenderProps {\n mode: FeedbackMode;\n setMode: (mode: FeedbackMode) => void;\n /** @deprecated Use `mode === \"annotate\"` */\n feedbackActive: boolean;\n menuOpen: boolean;\n canPinOnPage: boolean;\n canScreenshot: boolean;\n openMenu: () => void;\n closeMenu: () => void;\n toggleMenu: () => void;\n enterPinMode: () => void;\n exitPinMode: () => void;\n startScreenshotCapture: () => Promise<void>;\n}\n\nexport interface ModalCaptureRenderProps {\n captureScreenshot: () => Promise<void>;\n closeLauncherMenu: () => void;\n}\n\ninterface FeedbackContextType {\n client: SupabaseClient;\n workspaceId: string;\n siteUrl?: string;\n userId?: string;\n userEmail?: string;\n userDisplayName?: string;\n authReady: boolean;\n actorReady: boolean;\n actorError: string | null;\n debug: boolean;\n canPinOnPage: boolean;\n canScreenshot: boolean;\n showHints: boolean;\n annotationSurface: AnnotationSurface;\n reviewUrl: string | null;\n reviewOpen: boolean;\n setReviewOpen: (open: boolean) => void;\n scrollContainer?: ScrollContainerBinding;\n resolveAnchor?: (target: Element) => AnchorResolution | null;\n screenshotCapturing: boolean;\n threads: ThreadData[];\n isLoadingThreads: boolean;\n mode: FeedbackMode;\n setMode: (mode: FeedbackMode) => void;\n feedbackActive: boolean;\n setFeedbackActive: (active: boolean) => void;\n menuOpen: boolean;\n setMenuOpen: Dispatch<SetStateAction<boolean>>;\n openMenu: () => void;\n closeMenu: () => void;\n toggleMenu: () => void;\n enterPinMode: () => void;\n exitPinMode: () => void;\n startScreenshotCapture: () => Promise<void>;\n pendingPin: PendingPin | null;\n setPendingPin: (pin: PendingPin | null) => void;\n screenshotDataUrl: string | null;\n setScreenshotDataUrl: (url: string | null) => void;\n pendingScreenshotPin: PendingScreenshotPin | null;\n setPendingScreenshotPin: (pin: PendingScreenshotPin | null) => void;\n submitThread: (body: string, visibility: \"public\" | \"internal\") => Promise<void>;\n submitScreenshotThread: (body: string, visibility: \"public\" | \"internal\") => Promise<void>;\n refreshThreads: () => Promise<void>;\n}\n\nconst FeedbackContext = createContext<FeedbackContextType | null>(null);\n\ninterface ResolvedConfig {\n supabaseUrl: string;\n supabaseAnonKey: string;\n workspaceId: string;\n autoScreenshotOnPin?: boolean;\n siteUrl?: string;\n}\n\ntype ThreadsSchemaMode = \"modern\" | \"legacy\";\n\nconst MODERN_THREAD_SELECT = \"id, page_url, annotation_surface, review_url, selector, anchor_key, coordinate_space, container_key, element_text, element_tag, x_position, y_position, viewport_width, viewport_height, modal_trigger_selector, screenshot_path, status, visibility, created_at\";\nconst LEGACY_THREAD_SELECT = \"id, page_url, selector, element_text, element_tag, x_position, y_position, viewport_width, viewport_height, modal_trigger_selector, screenshot_path, status, visibility, created_at\";\nconst threadsSchemaModeByWorkspace = new Map<string, ThreadsSchemaMode>();\n\nfunction isMissingThreadsColumnError(error: unknown) {\n if (!error || typeof error !== \"object\") return false;\n const candidate = error as { code?: string; message?: string };\n if (candidate.code !== \"PGRST204\") return false;\n return typeof candidate.message === \"string\" && candidate.message.includes(\"column\");\n}\n\nfunction toLegacyThreadInsertPayload(payload: Record<string, unknown>) {\n const legacy = { ...payload };\n delete legacy.annotation_surface;\n delete legacy.review_url;\n delete legacy.anchor_key;\n delete legacy.coordinate_space;\n delete legacy.container_key;\n return legacy;\n}\n\nfunction normalizeLegacyThread(data: Record<string, unknown>): ThreadData {\n return {\n annotation_surface: \"host-dom\",\n anchor_key: null,\n coordinate_space: \"document\",\n container_key: null,\n id: String(data.id ?? \"\"),\n page_url: String(data.page_url ?? \"\"),\n review_url: null,\n selector: typeof data.selector === \"string\" ? data.selector : null,\n element_text: typeof data.element_text === \"string\" ? data.element_text : null,\n element_tag: typeof data.element_tag === \"string\" ? data.element_tag : null,\n x_position: typeof data.x_position === \"number\" ? data.x_position : data.x_position == null ? null : Number(data.x_position),\n y_position: typeof data.y_position === \"number\" ? data.y_position : data.y_position == null ? null : Number(data.y_position),\n viewport_width: typeof data.viewport_width === \"number\" ? data.viewport_width : data.viewport_width == null ? null : Number(data.viewport_width),\n viewport_height: typeof data.viewport_height === \"number\" ? data.viewport_height : data.viewport_height == null ? null : Number(data.viewport_height),\n modal_trigger_selector: typeof data.modal_trigger_selector === \"string\" ? data.modal_trigger_selector : null,\n screenshot_path: typeof data.screenshot_path === \"string\" ? data.screenshot_path : null,\n status: String(data.status ?? \"open\"),\n visibility: String(data.visibility ?? \"public\"),\n created_at: String(data.created_at ?? \"\"),\n };\n}\n\nfunction getThreadsSchemaMode(workspaceId: string): ThreadsSchemaMode {\n return threadsSchemaModeByWorkspace.get(workspaceId) ?? \"modern\";\n}\n\nfunction setThreadsSchemaMode(workspaceId: string, mode: ThreadsSchemaMode) {\n threadsSchemaModeByWorkspace.set(workspaceId, mode);\n}\n\nexport function resolveIssuePinActorUserId(opts: {\n explicitUserId?: string;\n autoIdentityUserId?: string;\n federatedLocalUserId?: string;\n hasApiKey: boolean;\n skipFederation?: boolean;\n}) {\n if (opts.explicitUserId) return opts.explicitUserId;\n if (opts.hasApiKey && !opts.skipFederation && opts.autoIdentityUserId) {\n return opts.federatedLocalUserId;\n }\n return opts.autoIdentityUserId;\n}\n\nexport function resolveIssuePinActorReady(opts: {\n authReady: boolean;\n explicitUserId?: string;\n autoIdentityUserId?: string;\n hasApiKey: boolean;\n skipFederation?: boolean;\n federatedLocalUserId?: string;\n}) {\n if (!opts.authReady) return false;\n if (opts.explicitUserId) return true;\n if (opts.hasApiKey && !opts.skipFederation && opts.autoIdentityUserId) {\n return !!opts.federatedLocalUserId;\n }\n return true;\n}\n\nexport function resolveAnnotationSurface(opts: {\n annotationSurface?: AnnotationSurface;\n reviewUrl?: string;\n}): AnnotationSurface {\n if (opts.annotationSurface) return opts.annotationSurface;\n return opts.reviewUrl ? \"review-iframe\" : \"host-dom\";\n}\n\nexport function resolveCanPinOnPage(opts: {\n allowPinOnPage: boolean;\n annotationSurface: AnnotationSurface;\n reviewUrl?: string | null;\n}) {\n if (!opts.allowPinOnPage) return false;\n if (opts.annotationSurface === \"review-iframe\") {\n return !!opts.reviewUrl;\n }\n return true;\n}\n\nexport function buildThreadInsertPayload(opts: {\n workspaceId: string;\n userId?: string;\n userEmail?: string;\n userDisplayName?: string;\n pendingPin: PendingPin;\n visibility: \"public\" | \"internal\";\n}) {\n const { pendingPin } = opts;\n const isReviewSurface = pendingPin.annotationSurface === \"review-iframe\";\n\n return {\n workspace_id: opts.workspaceId,\n created_by: opts.userId || null,\n page_url: pendingPin.pageUrl,\n annotation_surface: pendingPin.annotationSurface,\n review_url: isReviewSurface ? pendingPin.reviewUrl : null,\n selector: isReviewSurface ? null : pendingPin.selector,\n anchor_key: isReviewSurface ? null : pendingPin.anchorKey,\n coordinate_space: pendingPin.coordinateSpace,\n container_key: isReviewSurface ? null : pendingPin.containerKey,\n element_text: pendingPin.elementText,\n element_tag: pendingPin.elementTag,\n x_position: pendingPin.x,\n y_position: pendingPin.y,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n modal_trigger_selector: null,\n visibility: opts.visibility,\n sdk_user_email: opts.userEmail || null,\n sdk_user_name: opts.userDisplayName || null,\n };\n}\n\nasync function resolveApiKey(apiKey: string): Promise<ResolvedConfig> {\n const res = await fetch(\n `https://jzdvmfemzpmgmxupcamh.supabase.co/functions/v1/sdk-resolve`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey }),\n }\n );\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(err.error || \"Failed to resolve API key\");\n }\n return res.json();\n}\n\nfunction getFunctionsBaseUrl(supabaseUrl: string) {\n return `${supabaseUrl.replace(/\\/+$/, \"\")}/functions/v1`;\n}\n\nasync function uploadScreenshot(\n client: SupabaseClient,\n dataUrl: string,\n workspaceId: string\n): Promise<string> {\n const res = await fetch(dataUrl);\n const blob = await res.blob();\n const fileName = `${workspaceId}/${Date.now()}-${Math.random().toString(36).slice(2, 8)}.jpg`;\n const { error } = await client.storage.from(\"screenshots\").upload(fileName, blob, {\n contentType: \"image/jpeg\",\n cacheControl: \"31536000\",\n });\n if (error) throw error;\n return fileName;\n}\n\nasync function uploadScreenshotBlob(\n client: SupabaseClient,\n blob: Blob,\n workspaceId: string\n): Promise<string> {\n const fileName = `${workspaceId}/${Date.now()}-${Math.random().toString(36).slice(2, 8)}.jpg`;\n const { error } = await client.storage.from(\"screenshots\").upload(fileName, blob, {\n contentType: \"image/jpeg\",\n cacheControl: \"31536000\",\n });\n if (error) throw error;\n return fileName;\n}\n\n/**\n * SDK Entry Point — wrap your app to enable in-app feedback.\n */\nexport function FeedbackProvider({\n children,\n ...config\n}: FeedbackConfig & { children?: ReactNode }) {\n const directProps = config.supabaseUrl && config.supabaseAnonKey && config.workspaceId;\n const [resolved, setResolved] = useState<ResolvedConfig | null>(\n directProps\n ? { supabaseUrl: config.supabaseUrl!, supabaseAnonKey: config.supabaseAnonKey!, workspaceId: config.workspaceId!, autoScreenshotOnPin: false }\n : null\n );\n\n const [resolveError, setResolveError] = useState<string | null>(null);\n\n // Auto-extract identity from host app's Supabase client session\n const [autoIdentity, setAutoIdentity] = useState<{ userId?: string; userEmail?: string; userDisplayName?: string; accessToken?: string }>({});\n const [authReady, setAuthReady] = useState(!config.supabaseClient || !!(config.userId || config.userEmail || config.userDisplayName));\n\n useEffect(() => {\n if (!config.supabaseClient) {\n setAuthReady(true);\n return;\n }\n // If explicit user props are provided, skip auto-detect\n if (config.userId || config.userEmail || config.userDisplayName) {\n setAuthReady(true);\n return;\n }\n\n let cancelled = false;\n\n const extractIdentity = (session: Pick<Session, \"access_token\" | \"user\">) => ({\n userId: session.user.id,\n userEmail: session.user.email,\n userDisplayName:\n session.user.user_metadata?.display_name ??\n session.user.user_metadata?.full_name ??\n session.user.user_metadata?.name ??\n (session.user.email ? session.user.email.split(\"@\")[0] : undefined),\n accessToken: session.access_token,\n });\n\n const initAuth = async () => {\n try {\n const { data: { session } } = await config.supabaseClient!.auth.getSession();\n if (cancelled) return;\n if (session?.user) {\n const identity = extractIdentity(session);\n setAutoIdentity(identity);\n console.log(\"[EW SDK] Auto-identity resolved:\", { email: identity.userEmail, displayName: identity.userDisplayName });\n } else {\n console.log(\"[EW SDK] Auto-identity: no session found (user not logged in)\");\n }\n } catch (err) {\n console.warn(\"[IssuePin] Failed to auto-detect user from supabaseClient:\", err);\n } finally {\n if (!cancelled) setAuthReady(true);\n }\n };\n initAuth();\n\n // Listen for auth changes (login/logout)\n const { data: { subscription } } = config.supabaseClient.auth.onAuthStateChange(\n (_event, session) => {\n if (cancelled) return;\n if (session?.user) {\n const identity = extractIdentity(session);\n setAutoIdentity(identity);\n console.log(\"[EW SDK] Auth state changed — identity updated:\", { email: identity.userEmail, displayName: identity.userDisplayName });\n } else {\n setAutoIdentity({});\n console.log(\"[EW SDK] Auth state changed — user signed out\");\n }\n }\n );\n\n return () => {\n cancelled = true;\n subscription.unsubscribe();\n };\n }, [config.supabaseClient, config.userId, config.userEmail, config.userDisplayName]);\n\n // Merge: explicit props take precedence over auto-detected\n const effectiveEmail = config.userEmail ?? autoIdentity.userEmail;\n const effectiveDisplayName = config.userDisplayName ?? autoIdentity.userDisplayName;\n const resolvedAnnotationSurface = resolveAnnotationSurface({\n annotationSurface: config.annotationSurface,\n reviewUrl: config.reviewUrl,\n });\n\n useEffect(() => {\n if (resolved) return;\n if (!config.apiKey) {\n setResolveError(\"IssuePin: provide either apiKey or legacy supabase props\");\n return;\n }\n let cancelled = false;\n resolveApiKey(config.apiKey)\n .then((r) => {\n if (cancelled) return;\n if (!r.supabaseUrl || !r.supabaseAnonKey || !r.workspaceId) {\n setResolveError(\"SDK resolved config is incomplete (missing supabaseUrl, supabaseAnonKey, or workspaceId)\");\n return;\n }\n setResolved(r);\n })\n .catch((e) => { if (!cancelled) setResolveError(e.message); });\n return () => { cancelled = true; };\n }, [config.apiKey, config.supabaseUrl, config.supabaseAnonKey, config.workspaceId]);\n\n // ── Auto-federation: provision host-app user into the workspace ──\n const [federationDone, setFederationDone] = useState(false);\n const [federatedLocalUserId, setFederatedLocalUserId] = useState<string | undefined>();\n const [federationError, setFederationError] = useState<string | null>(null);\n useEffect(() => {\n if (federationDone) return;\n if (!resolved || !config.apiKey) return;\n if (config.skipFederation) return;\n // Need a detected identity from the host app's supabaseClient\n if (!autoIdentity.userId || !autoIdentity.userEmail || !autoIdentity.accessToken) return;\n\n let cancelled = false;\n const federate = async () => {\n try {\n const functionsBaseUrl = getFunctionsBaseUrl(resolved.supabaseUrl);\n const res = await fetch(\n `${functionsBaseUrl}/sdk-federate`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${autoIdentity.accessToken}`,\n },\n body: JSON.stringify({\n apiKey: config.apiKey,\n externalId: autoIdentity.userId,\n email: autoIdentity.userEmail,\n displayName: autoIdentity.userDisplayName || undefined,\n }),\n }\n );\n if (!cancelled) {\n if (res.ok) {\n const data = await res.json();\n setFederatedLocalUserId(data.user_id || undefined);\n setFederationError(null);\n console.log(\"[EW SDK] Auto-federation complete:\", { userId: data.user_id, isNew: data.is_new_user });\n } else {\n const err = await res.json().catch(() => ({}));\n const message = err.error || `Auto-federation failed (${res.status})`;\n setFederationError(message);\n console.warn(\"[EW SDK] Auto-federation failed:\", message);\n }\n setFederationDone(true);\n }\n } catch (err) {\n if (!cancelled) {\n const message = err instanceof Error ? err.message : \"Auto-federation error\";\n setFederationError(message);\n console.warn(\"[EW SDK] Auto-federation error:\", message);\n setFederationDone(true);\n }\n }\n };\n federate();\n return () => { cancelled = true; };\n }, [resolved, config.apiKey, config.skipFederation, autoIdentity.userId, autoIdentity.userEmail, autoIdentity.userDisplayName, autoIdentity.accessToken, federationDone]);\n\n const effectiveUserId = resolveIssuePinActorUserId({\n explicitUserId: config.userId,\n autoIdentityUserId: autoIdentity.userId,\n federatedLocalUserId,\n hasApiKey: !!config.apiKey,\n skipFederation: config.skipFederation,\n });\n\n const actorReady = resolveIssuePinActorReady({\n authReady,\n explicitUserId: config.userId,\n autoIdentityUserId: autoIdentity.userId,\n federatedLocalUserId,\n hasApiKey: !!config.apiKey,\n skipFederation: config.skipFederation,\n });\n\n const actorError =\n federationDone && !actorReady && (federationError || \"Unable to link your identity yet. Please retry in a moment.\")\n ? federationError || \"Unable to link your identity yet. Please retry in a moment.\"\n : null;\n\n if (resolveError) {\n console.error(\"[EW SDK]\", resolveError);\n return <>{children}</>;\n }\n\n if (!resolved) {\n return <>{children}</>;\n }\n\n const onModeChangeUnified =\n config.onModeChange ??\n (config.onFeedbackActiveChange\n ? ((m: FeedbackMode) => config.onFeedbackActiveChange!(m === \"annotate\"))\n : undefined);\n const controlledModeFromProps: FeedbackMode | undefined =\n config.mode !== undefined\n ? config.mode\n : config.feedbackActive !== undefined\n ? (config.feedbackActive ? \"annotate\" : \"view\")\n : undefined;\n const initialModeUncontrolled: FeedbackMode =\n config.mode ??\n (config.feedbackActive !== undefined ? (config.feedbackActive ? \"annotate\" : \"view\") : \"view\");\n\n return (\n <FeedbackProviderInner\n supabaseUrl={resolved.supabaseUrl}\n supabaseAnonKey={resolved.supabaseAnonKey}\n workspaceId={resolved.workspaceId}\n siteUrl={resolved.siteUrl}\n initialAutoScreenshot={resolved.autoScreenshotOnPin ?? false}\n allowPinOnPage={config.allowPinOnPage ?? true}\n allowScreenshot={config.allowScreenshot ?? true}\n showHints={config.showHints ?? true}\n annotationSurface={resolvedAnnotationSurface}\n reviewUrl={config.reviewUrl ?? null}\n scrollContainer={config.scrollContainer}\n resolveAnchor={config.resolveAnchor}\n isModeControlled={onModeChangeUnified !== undefined}\n controlledMode={controlledModeFromProps}\n onModeChange={onModeChangeUnified}\n initialModeUncontrolled={initialModeUncontrolled}\n debug={config.debug ?? false}\n authReady={authReady}\n actorReady={actorReady}\n actorError={actorError}\n userId={effectiveUserId}\n userEmail={effectiveEmail}\n userDisplayName={effectiveDisplayName}\n >\n {children}\n </FeedbackProviderInner>\n );\n}\n\ninterface InnerProps {\n supabaseUrl: string;\n supabaseAnonKey: string;\n workspaceId: string;\n siteUrl?: string;\n initialAutoScreenshot: boolean;\n allowPinOnPage: boolean;\n allowScreenshot: boolean;\n showHints: boolean;\n annotationSurface: AnnotationSurface;\n reviewUrl: string | null;\n scrollContainer?: ScrollContainerBinding;\n resolveAnchor?: (target: Element) => AnchorResolution | null;\n isModeControlled: boolean;\n controlledMode: FeedbackMode | undefined;\n onModeChange?: (mode: FeedbackMode) => void;\n initialModeUncontrolled: FeedbackMode;\n authReady: boolean;\n actorReady: boolean;\n actorError: string | null;\n debug: boolean;\n userId?: string;\n userEmail?: string;\n userDisplayName?: string;\n children?: ReactNode;\n}\n\nfunction FeedbackProviderInner({\n children,\n supabaseUrl,\n supabaseAnonKey,\n workspaceId,\n siteUrl,\n initialAutoScreenshot,\n allowPinOnPage,\n allowScreenshot,\n showHints,\n annotationSurface,\n reviewUrl,\n scrollContainer,\n resolveAnchor,\n isModeControlled,\n controlledMode,\n onModeChange,\n initialModeUncontrolled,\n authReady,\n actorReady,\n actorError,\n debug,\n userId,\n userEmail,\n userDisplayName,\n}: InnerProps) {\n const debugLog = useCallback((message: string, extra?: unknown) => {\n if (!debug) return;\n if (extra === undefined) {\n console.log(`[EW SDK] ${message}`);\n return;\n }\n console.log(`[EW SDK] ${message}`, extra);\n }, [debug]);\n\n // Warn developers when identity props are missing (once per mount)\n useEffect(() => {\n if (!userDisplayName && !userEmail) {\n console.warn(\n \"[IssuePin] No user identity provided — comments will appear as \\\"Unknown\\\". \" +\n \"Pass supabaseClient={supabase} for automatic identity, or user={{ email, displayName }} for manual attribution. \" +\n \"See https://github.com/sylergydigital/issue-pin/blob/main/sdk/README.md#user-identity-avoiding-unknown-comments\"\n );\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const client = useMemo(() => {\n try {\n return createClient(supabaseUrl, supabaseAnonKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: false,\n detectSessionInUrl: false,\n },\n });\n } catch (err) {\n console.error(\"[EW SDK] Failed to create Supabase client:\", err);\n return null;\n }\n }, [supabaseUrl, supabaseAnonKey]);\n\n // Fetch workspace config (e.g. auto_screenshot_on_pin) using the SDK client\n const [autoScreenshotOnPin, setAutoScreenshotOnPin] = useState(initialAutoScreenshot);\n useEffect(() => {\n if (!client) return;\n client\n .from(\"workspaces\")\n .select(\"auto_screenshot_on_pin\")\n .eq(\"id\", workspaceId)\n .single()\n .then(({ data }) => {\n if (data) setAutoScreenshotOnPin(data.auto_screenshot_on_pin);\n });\n }, [client, workspaceId]);\n\n const [threads, setThreads] = useState<ThreadData[]>([]);\n const [isLoadingThreads, setIsLoadingThreads] = useState(false);\n const [reviewOpen, setReviewOpen] = useState(false);\n const [internalMode, setInternalMode] = useState<FeedbackMode>(() =>\n isModeControlled ? \"view\" : initialModeUncontrolled\n );\n const [menuOpen, setMenuOpen] = useState(false);\n const [pendingPin, setPendingPin] = useState<PendingPin | null>(null);\n const [screenshotDataUrl, setScreenshotDataUrl] = useState<string | null>(null);\n const [pendingScreenshotPin, setPendingScreenshotPin] = useState<PendingScreenshotPin | null>(null);\n const [screenshotCapturing, setScreenshotCapturing] = useState(false);\n const [flashing, setFlashing] = useState(false);\n const mode = isModeControlled ? (controlledMode ?? \"view\") : internalMode;\n const setMode = useCallback(\n (m: FeedbackMode) => {\n if (!isModeControlled) setInternalMode(m);\n onModeChange?.(m);\n },\n [isModeControlled, onModeChange]\n );\n const feedbackActive = mode === \"annotate\";\n const setFeedbackActive = useCallback(\n (active: boolean) => {\n setMode(active ? \"annotate\" : \"view\");\n },\n [setMode]\n );\n\n const canPinOnPage = resolveCanPinOnPage({\n allowPinOnPage,\n annotationSurface,\n reviewUrl,\n });\n\n const openMenu = useCallback(() => {\n setMenuOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setMenuOpen(false);\n }, []);\n\n const toggleMenu = useCallback(() => {\n setMenuOpen((prev) => !prev);\n }, []);\n\n const enterPinMode = useCallback(() => {\n if (!canPinOnPage) return;\n setMode(\"annotate\");\n setMenuOpen(false);\n if (annotationSurface === \"review-iframe\") {\n setReviewOpen(true);\n }\n }, [annotationSurface, canPinOnPage, setMode]);\n\n const exitPinMode = useCallback(() => {\n setMode(\"view\");\n setMenuOpen(false);\n setPendingPin(null);\n if (annotationSurface === \"review-iframe\") {\n setReviewOpen(false);\n }\n }, [annotationSurface, setMode]);\n\n useEffect(() => {\n if (annotationSurface !== \"review-iframe\") return;\n if (mode === \"view\") {\n setReviewOpen(false);\n }\n }, [annotationSurface, mode]);\n\n const { pathname } = useDocumentLocationParts();\n\n // Set DOM flag so the Chrome extension knows the SDK is active\n if (typeof document !== \"undefined\") {\n document.documentElement.setAttribute(\"data-ew-sdk\", \"true\");\n }\n\n // Block native outside-click handlers for SDK controls\n useEffect(() => {\n const handleSdkPointerDownCapture = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n if (!target.closest('[data-ew-feedback-interactive=\"true\"]')) return;\n event.stopPropagation();\n };\n window.addEventListener(\"pointerdown\", handleSdkPointerDownCapture, true);\n return () => {\n window.removeEventListener(\"pointerdown\", handleSdkPointerDownCapture, true);\n };\n }, []);\n\n useEffect(() => {\n debugLog(\"FeedbackProvider mounted\", { workspaceId, path: pathname });\n return () => {\n debugLog(\"FeedbackProvider unmounted\", { workspaceId, path: pathname });\n };\n }, [debugLog, workspaceId, pathname]);\n\n useEffect(() => {\n debugLog(\"mode / feedbackActive\", { mode, feedbackActive });\n }, [debugLog, mode, feedbackActive]);\n\n useEffect(() => {\n debugLog(\"menuOpen =\", menuOpen);\n }, [debugLog, menuOpen]);\n\n const fetchThreads = useCallback(async () => {\n if (!client) return;\n setIsLoadingThreads(true);\n try {\n const pageUrl = pathname;\n const schemaMode = getThreadsSchemaMode(workspaceId);\n const runQuery = async (mode: ThreadsSchemaMode) => {\n const threadsTable: any = client.from(\"threads\");\n let query: any = threadsTable\n .select(mode === \"modern\" ? MODERN_THREAD_SELECT : LEGACY_THREAD_SELECT)\n .eq(\"workspace_id\", workspaceId)\n .eq(\"page_url\", pageUrl)\n .neq(\"status\", \"resolved\")\n .order(\"created_at\", { ascending: true });\n\n if (mode === \"modern\") {\n if (annotationSurface === \"review-iframe\") {\n query = query\n .eq(\"annotation_surface\", \"review-iframe\")\n .eq(\"review_url\", reviewUrl ?? \"\");\n } else {\n query = query.or(\"annotation_surface.is.null,annotation_surface.eq.host-dom\");\n }\n } else if (annotationSurface === \"review-iframe\") {\n return { data: [] as ThreadData[], error: null };\n }\n\n const result = await query;\n if (result.error) return { data: null, error: result.error };\n const rows = (result.data ?? []) as Record<string, unknown>[];\n return {\n data: mode === \"modern\" ? (rows as unknown as ThreadData[]) : rows.map(normalizeLegacyThread),\n error: null,\n };\n };\n\n let result = await runQuery(schemaMode);\n if (result.error && schemaMode === \"modern\" && isMissingThreadsColumnError(result.error)) {\n console.warn(\"[EW SDK] Falling back to legacy threads schema compatibility mode.\");\n setThreadsSchemaMode(workspaceId, \"legacy\");\n result = await runQuery(\"legacy\");\n }\n\n if (result.error) throw result.error;\n setThreads(result.data || []);\n } catch (err) {\n console.error(\"[EW SDK] Failed to fetch threads:\", err);\n } finally {\n setIsLoadingThreads(false);\n }\n }, [annotationSurface, client, reviewUrl, workspaceId, pathname]);\n\n useEffect(() => { fetchThreads(); }, [fetchThreads]);\n\n // Realtime subscription\n useEffect(() => {\n if (!client) return;\n const channel = client\n .channel(`sdk-threads-${workspaceId}`)\n .on(\"postgres_changes\" as any, {\n event: \"*\",\n schema: \"public\",\n table: \"threads\",\n filter: `workspace_id=eq.${workspaceId}`,\n }, () => { fetchThreads(); })\n .subscribe();\n return () => { client.removeChannel(channel); };\n }, [client, workspaceId, fetchThreads]);\n\n // Auto-screenshot helper: capture the page and attach to a thread\n const captureAndAttachScreenshot = useCallback(async (threadId: string) => {\n if (!client) return;\n try {\n await new Promise((resolve) => setTimeout(resolve, 300));\n\n const canvas = await html2canvas(document.body, {\n useCORS: true,\n allowTaint: true,\n logging: false,\n scale: window.devicePixelRatio || 1,\n width: window.innerWidth,\n height: window.innerHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n x: window.scrollX,\n y: window.scrollY,\n ignoreElements: (el) => {\n return el.closest?.('[data-ew-feedback-interactive=\"true\"]') !== null;\n },\n });\n const blob = await new Promise<Blob>((resolve, reject) => {\n canvas.toBlob((b) => (b ? resolve(b) : reject(new Error(\"toBlob failed\"))), \"image/jpeg\", 0.8);\n });\n const screenshotPath = await uploadScreenshotBlob(client, blob, workspaceId);\n await client.from(\"threads\").update({ screenshot_path: screenshotPath }).eq(\"id\", threadId);\n\n setFlashing(true);\n setTimeout(() => setFlashing(false), 300);\n\n console.log(\"[EW SDK] Auto-screenshot attached to thread\", threadId);\n } catch (err) {\n console.error(\"[EW SDK] Auto-screenshot failed:\", err);\n }\n }, [client, workspaceId]);\n\n const startScreenshotCapture = useCallback(async () => {\n if (!allowScreenshot) return;\n setMenuOpen(false);\n setScreenshotCapturing(true);\n try {\n const canvas = await html2canvas(document.body, {\n useCORS: true,\n scale: window.devicePixelRatio,\n logging: false,\n ignoreElements: (el) =>\n el.closest?.('[data-ew-feedback-interactive=\"true\"]') !== null,\n });\n const dataUrl = canvas.toDataURL(\"image/jpeg\", 0.7);\n setScreenshotDataUrl(dataUrl);\n } catch (err) {\n console.error(\"[EW SDK] Screenshot capture failed:\", err);\n } finally {\n setScreenshotCapturing(false);\n }\n }, [allowScreenshot]);\n\n const submitThread = useCallback(\n async (body: string, visibility: \"public\" | \"internal\") => {\n if (!pendingPin || !client) return;\n if (!actorReady) throw new Error(actorError || \"Unable to link your identity yet. Please retry in a moment.\");\n const threadPayload = buildThreadInsertPayload({\n workspaceId,\n userId,\n userEmail,\n userDisplayName,\n pendingPin,\n visibility,\n });\n\n const insertThread = async (payload: Record<string, unknown>) => client\n .from(\"threads\")\n .insert(payload)\n .select()\n .single();\n\n let { data: thread, error: threadErr } = await insertThread(\n getThreadsSchemaMode(workspaceId) === \"legacy\" ? toLegacyThreadInsertPayload(threadPayload) : threadPayload\n );\n if (threadErr && getThreadsSchemaMode(workspaceId) === \"modern\" && isMissingThreadsColumnError(threadErr)) {\n if (pendingPin.annotationSurface === \"review-iframe\") {\n throw new Error(\"This workspace is missing required review-surface thread columns. Apply the latest Issue Pin SDK migrations and retry.\");\n }\n console.warn(\"[EW SDK] Retrying thread insert against legacy threads schema.\");\n setThreadsSchemaMode(workspaceId, \"legacy\");\n ({ data: thread, error: threadErr } = await insertThread(toLegacyThreadInsertPayload(threadPayload)));\n }\n if (threadErr) throw threadErr;\n\n const { error: commentErr } = await client.from(\"thread_comments\").insert({\n thread_id: thread.id,\n author_id: userId || null,\n body,\n visibility,\n sdk_user_email: userEmail || null,\n sdk_user_name: userDisplayName || null,\n });\n if (commentErr) throw commentErr;\n\n setPendingPin(null);\n if (pendingPin.annotationSurface === \"review-iframe\") {\n setMode(\"view\");\n }\n await fetchThreads();\n\n debugLog(\"submitThread complete\", { autoScreenshotOnPin, threadId: thread.id });\n\n if (autoScreenshotOnPin) {\n captureAndAttachScreenshot(thread.id);\n }\n },\n [pendingPin, client, actorReady, actorError, workspaceId, userId, userEmail, userDisplayName, fetchThreads, autoScreenshotOnPin, captureAndAttachScreenshot, setMode]\n );\n\n const submitScreenshotThread = useCallback(\n async (body: string, visibility: \"public\" | \"internal\") => {\n if (!pendingScreenshotPin || !screenshotDataUrl || !client) return;\n if (!actorReady) throw new Error(actorError || \"Unable to link your identity yet. Please retry in a moment.\");\n const { x, y, pageUrl } = pendingScreenshotPin;\n\n const screenshotUrl = await uploadScreenshot(client, screenshotDataUrl, workspaceId);\n\n const threadPayload: Record<string, unknown> = {\n workspace_id: workspaceId,\n created_by: userId || null,\n page_url: pageUrl,\n selector: null,\n anchor_key: null,\n annotation_surface: annotationSurface,\n coordinate_space: \"document\",\n container_key: null,\n element_text: null,\n element_tag: \"screenshot\",\n review_url: annotationSurface === \"review-iframe\" ? reviewUrl : null,\n x_position: x,\n y_position: y,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n screenshot_path: screenshotUrl,\n visibility,\n sdk_user_email: userEmail || null,\n sdk_user_name: userDisplayName || null,\n };\n\n const insertThread = async (payload: Record<string, unknown>) => client\n .from(\"threads\")\n .insert(payload)\n .select()\n .single();\n\n let { data: thread, error: threadErr } = await insertThread(\n getThreadsSchemaMode(workspaceId) === \"legacy\" ? toLegacyThreadInsertPayload(threadPayload) : threadPayload\n );\n if (threadErr && getThreadsSchemaMode(workspaceId) === \"modern\" && isMissingThreadsColumnError(threadErr)) {\n if (annotationSurface === \"review-iframe\") {\n throw new Error(\"This workspace is missing required review-surface thread columns. Apply the latest Issue Pin SDK migrations and retry.\");\n }\n console.warn(\"[EW SDK] Retrying screenshot thread insert against legacy threads schema.\");\n setThreadsSchemaMode(workspaceId, \"legacy\");\n ({ data: thread, error: threadErr } = await insertThread(toLegacyThreadInsertPayload(threadPayload)));\n }\n if (threadErr) throw threadErr;\n\n const { error: commentErr } = await client.from(\"thread_comments\").insert({\n thread_id: thread.id,\n author_id: userId || null,\n body,\n visibility,\n sdk_user_email: userEmail || null,\n sdk_user_name: userDisplayName || null,\n });\n if (commentErr) throw commentErr;\n\n setPendingScreenshotPin(null);\n setScreenshotDataUrl(null);\n await fetchThreads();\n },\n [pendingScreenshotPin, screenshotDataUrl, client, actorReady, actorError, workspaceId, userId, userEmail, userDisplayName, fetchThreads, annotationSurface, reviewUrl]\n );\n\n // If client creation failed, render children without feedback functionality\n if (!client) {\n return <>{children}</>;\n }\n\n return (\n <FeedbackContext.Provider\n value={{\n client,\n workspaceId,\n siteUrl,\n userId,\n userEmail,\n userDisplayName,\n authReady,\n actorReady,\n actorError,\n debug,\n canPinOnPage,\n canScreenshot: allowScreenshot,\n showHints,\n annotationSurface,\n reviewUrl,\n reviewOpen,\n setReviewOpen,\n scrollContainer,\n resolveAnchor,\n screenshotCapturing,\n threads,\n isLoadingThreads,\n mode,\n setMode,\n feedbackActive,\n setFeedbackActive,\n menuOpen,\n setMenuOpen,\n openMenu,\n closeMenu,\n toggleMenu,\n enterPinMode,\n exitPinMode,\n startScreenshotCapture,\n pendingPin,\n setPendingPin,\n screenshotDataUrl,\n setScreenshotDataUrl,\n pendingScreenshotPin,\n setPendingScreenshotPin,\n submitThread,\n submitScreenshotThread,\n refreshThreads: fetchThreads,\n }}\n >\n {children}\n {flashing && (\n <>\n <style>{`@keyframes ew-flash-fade { 0% { opacity: 0.85; } 100% { opacity: 0; } }`}</style>\n <div\n style={{\n position: 'fixed',\n inset: 0,\n background: 'white',\n pointerEvents: 'none',\n zIndex: Z.flash,\n animation: 'ew-flash-fade 300ms ease-out forwards',\n }}\n />\n </>\n )}\n </FeedbackContext.Provider>\n );\n}\n\nexport function useFeedback() {\n const ctx = useContext(FeedbackContext);\n if (!ctx) throw new Error(\"useFeedback must be used within <FeedbackProvider>\");\n return ctx;\n}\n\n/**\n * Safe version that returns null when outside FeedbackProvider (e.g. during HMR).\n */\nexport function useFeedbackSafe() {\n return useContext(FeedbackContext);\n}\n","import { useSyncExternalStore } from \"react\";\n\nlet pathnameSubscribers = 0;\nconst listeners = new Set<() => void>();\nlet origPush: typeof history.pushState;\nlet origReplace: typeof history.replaceState;\n\nfunction notify() {\n listeners.forEach((l) => l());\n}\n\nfunction subscribePathname(onChange: () => void) {\n if (pathnameSubscribers === 0) {\n origPush = history.pushState.bind(history);\n origReplace = history.replaceState.bind(history);\n history.pushState = (...args: Parameters<typeof history.pushState>) => {\n origPush(...args);\n notify();\n };\n history.replaceState = (...args: Parameters<typeof history.replaceState>) => {\n origReplace(...args);\n notify();\n };\n window.addEventListener(\"popstate\", notify);\n }\n pathnameSubscribers++;\n listeners.add(onChange);\n return () => {\n listeners.delete(onChange);\n pathnameSubscribers--;\n if (pathnameSubscribers === 0) {\n history.pushState = origPush;\n history.replaceState = origReplace;\n window.removeEventListener(\"popstate\", notify);\n }\n };\n}\n\nfunction getLocationCombinedSnapshot() {\n if (typeof window === \"undefined\") return \"/\\n\";\n return `${window.location.pathname}\\n${window.location.search}`;\n}\n\nfunction getServerSnapshot() {\n return \"/\\n\";\n}\n\n/**\n * Pathname and search, updating on SPA navigations (pushState/replaceState/popstate).\n * Use instead of react-router `useLocation` for SDK code that must work without a Router.\n */\nexport function useDocumentLocationParts(): { pathname: string; search: string } {\n const combined = useSyncExternalStore(subscribePathname, getLocationCombinedSnapshot, getServerSnapshot);\n const [pathname, search] = combined.split(\"\\n\");\n return { pathname, search: search ?? \"\" };\n}\n","/** Stacking order for SDK layers (host apps should avoid z-index above these). */\nexport const Z = {\n pins: 99990,\n overlay: 99991,\n popover: 99992,\n launcher: 99993,\n screenshotModal: 99994,\n flash: 99998,\n} as const;\n\n/** Hardcoded SDK theme — independent of host app CSS variables. */\nexport const T = {\n card: '#1a1a1f',\n fg: '#e4e4e8',\n border: '#2a2a30',\n primary: '#6366f1',\n primaryFg: '#ffffff',\n accent: '#2e2e35',\n muted: '#737380',\n bg: '#141418',\n input: '#2a2a30',\n ring: '#6366f1',\n} as const;\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useFeedbackSafe } from \"./FeedbackProvider\";\nimport { Z } from \"./theme\";\nimport { clampPercent, ensurePositionedContainer, getContainerContentSize } from \"./positioning\";\n\nfunction getElementTag(el: Element): string {\n let tag = el.tagName.toLowerCase();\n if (el.className && typeof el.className === \"string\") {\n const classes = el.className.trim().split(/\\s+/).slice(0, 3).join(\".\");\n if (classes) tag += `.${classes}`;\n }\n return tag;\n}\n\nfunction escapeSelectorValue(value: string) {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(value);\n }\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n\nfunction generateFallbackSelector(el: Element): string | null {\n if (!(el instanceof HTMLElement)) return null;\n if (el.id) return `#${escapeSelectorValue(el.id)}`;\n\n const stableAttr = [\"data-testid\", \"data-qa\", \"data-cy\"].find((name) => el.getAttribute(name));\n if (stableAttr) {\n return `[${stableAttr}=\"${escapeSelectorValue(el.getAttribute(stableAttr) || \"\")}\"]`;\n }\n\n const segments: string[] = [];\n let current: HTMLElement | null = el;\n\n while (current && current !== document.body && segments.length < 5) {\n let segment = current.tagName.toLowerCase();\n\n if (current.classList.length > 0) {\n segment += `.${escapeSelectorValue(current.classList[0])}`;\n segments.unshift(segment);\n current = current.parentElement;\n continue;\n }\n\n const parent = current.parentElement;\n if (!parent) break;\n const siblings = Array.from(parent.children).filter((child) => child.tagName === current!.tagName);\n const siblingIndex = siblings.indexOf(current) + 1;\n segment += `:nth-of-type(${siblingIndex})`;\n segments.unshift(segment);\n current = parent;\n }\n\n return segments.length > 0 ? segments.join(\" > \") : null;\n}\n\n/**\n * Transparent overlay for same-origin SDK usage.\n * Stores pin position as document percentage (scrollWidth/scrollHeight); optional element metadata only.\n */\nexport function FeedbackOverlay() {\n const ctx = useFeedbackSafe();\n const [containerVersion, setContainerVersion] = useState(0);\n const scrollContainer = ctx?.scrollContainer;\n const container = scrollContainer?.ref.current ?? null;\n\n useEffect(() => {\n if (!container) return;\n const restorePosition = ensurePositionedContainer(container);\n const resizeObserver = new ResizeObserver(() => setContainerVersion((value) => value + 1));\n resizeObserver.observe(container);\n\n const schedule = () => setContainerVersion((value) => value + 1);\n container.addEventListener(\"scroll\", schedule, { passive: true });\n\n return () => {\n container.removeEventListener(\"scroll\", schedule);\n resizeObserver.disconnect();\n restorePosition();\n };\n }, [container]);\n\n const containerLayerStyle = useMemo(() => {\n if (!container) return null;\n const { width, height } = getContainerContentSize(container);\n return {\n position: \"absolute\" as const,\n inset: 0,\n width,\n height,\n background: \"transparent\",\n zIndex: Z.overlay,\n cursor: \"crosshair\",\n };\n }, [container, containerVersion]);\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!ctx) return;\n const { mode, setPendingPin, resolveAnchor } = ctx;\n if (mode !== \"annotate\") return;\n e.preventDefault();\n e.stopPropagation();\n\n const overlay = e.currentTarget;\n\n overlay.style.pointerEvents = \"none\";\n let el: Element | null = null;\n try {\n el = document.elementFromPoint(e.clientX, e.clientY);\n } finally {\n overlay.style.pointerEvents = \"auto\";\n }\n\n if (!el || el === overlay) return;\n\n const anchor = resolveAnchor?.(el) ?? null;\n const selector = anchor?.selector ?? generateFallbackSelector(el);\n let x = 0;\n let y = 0;\n let coordinateSpace: \"document\" | \"container\" = \"document\";\n let containerKey: string | null = null;\n\n if (scrollContainer?.ref.current) {\n const containerEl = scrollContainer.ref.current;\n const { width, height } = getContainerContentSize(containerEl);\n const rect = overlay.getBoundingClientRect();\n const localX = e.clientX - rect.left;\n const localY = e.clientY - rect.top;\n x = clampPercent((localX / width) * 100);\n y = clampPercent((localY / height) * 100);\n coordinateSpace = \"container\";\n containerKey = scrollContainer.key;\n } else {\n const doc = document.documentElement;\n const cw = Math.max(doc.scrollWidth, 1);\n const ch = Math.max(doc.scrollHeight, 1);\n const cx = e.clientX + window.scrollX;\n const cy = e.clientY + window.scrollY;\n x = clampPercent((cx / cw) * 100);\n y = clampPercent((cy / ch) * 100);\n }\n\n const elementText = (el.textContent || \"\").trim().slice(0, 200);\n const elementTag = getElementTag(el);\n\n setPendingPin({\n annotationSurface: \"host-dom\",\n anchorKey: anchor?.key ?? null,\n coordinateSpace,\n containerKey,\n x,\n y,\n selector,\n elementText,\n elementTag,\n pageUrl: window.location.pathname,\n reviewUrl: null,\n });\n },\n [ctx, scrollContainer]\n );\n\n if (!ctx || ctx.mode !== \"annotate\") return null;\n\n const overlay = (\n <div\n data-ew-feedback-interactive=\"true\"\n onPointerDownCapture={(e) => e.stopPropagation()}\n className={container ? \"\" : \"fixed inset-0 cursor-crosshair\"}\n style={container ? containerLayerStyle ?? undefined : { background: \"transparent\", zIndex: Z.overlay }}\n onClick={handleClick}\n />\n );\n\n if (container) {\n return createPortal(overlay, container);\n }\n\n return overlay;\n}\n","export type CoordinateSpace = \"document\" | \"container\";\n\nconst positionedContainers = new WeakMap<HTMLElement, { count: number; previousInlinePosition: string }>();\n\nexport function clampPercent(value: number) {\n return Math.min(100, Math.max(0, value));\n}\n\nexport function docPercentToViewport(xPct: number, yPct: number) {\n const doc = document.documentElement;\n const left = (xPct / 100) * doc.scrollWidth - window.scrollX;\n const top = (yPct / 100) * doc.scrollHeight - window.scrollY;\n return { left, top };\n}\n\nexport function getContainerContentSize(container: HTMLElement) {\n return {\n width: Math.max(container.scrollWidth, 1),\n height: Math.max(container.scrollHeight, 1),\n };\n}\n\nexport function containerPercentToViewport(container: HTMLElement, xPct: number, yPct: number) {\n const rect = container.getBoundingClientRect();\n const { width, height } = getContainerContentSize(container);\n\n return {\n left: rect.left + (xPct / 100) * width - container.scrollLeft,\n top: rect.top + (yPct / 100) * height - container.scrollTop,\n };\n}\n\nexport function elementCenterToViewport(element: Element) {\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left + rect.width / 2,\n top: rect.top + rect.height / 2,\n };\n}\n\nexport function elementCenterToContainer(container: HTMLElement, element: Element) {\n const containerRect = container.getBoundingClientRect();\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left - containerRect.left + container.scrollLeft + rect.width / 2,\n top: rect.top - containerRect.top + container.scrollTop + rect.height / 2,\n };\n}\n\nexport function containerPercentToContent(container: HTMLElement, xPct: number, yPct: number) {\n const { width, height } = getContainerContentSize(container);\n return {\n left: (xPct / 100) * width,\n top: (yPct / 100) * height,\n };\n}\n\nexport function ensurePositionedContainer(container: HTMLElement) {\n const computed = window.getComputedStyle(container);\n if (computed.position !== \"static\") {\n return () => {};\n }\n\n const existing = positionedContainers.get(container);\n if (existing) {\n existing.count += 1;\n return () => {\n existing.count -= 1;\n if (existing.count === 0) {\n container.style.position = existing.previousInlinePosition;\n positionedContainers.delete(container);\n }\n };\n }\n\n const state = {\n count: 1,\n previousInlinePosition: container.style.position,\n };\n positionedContainers.set(container, state);\n container.style.position = \"relative\";\n\n return () => {\n state.count -= 1;\n if (state.count === 0) {\n container.style.position = state.previousInlinePosition;\n positionedContainers.delete(container);\n }\n };\n}\n","import { useEffect, useState, useCallback, useRef, useLayoutEffect, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Camera } from \"lucide-react\";\nimport { useFeedbackSafe, type ThreadData } from \"./FeedbackProvider\";\nimport { useDocumentLocationParts } from \"./useDocumentPathname\";\nimport { Z } from \"./theme\";\nimport { getRegisteredAnchor, subscribeAnchorRegistry } from \"./anchorRegistry\";\nimport {\n containerPercentToContent,\n docPercentToViewport,\n elementCenterToContainer,\n elementCenterToViewport,\n ensurePositionedContainer,\n getContainerContentSize,\n} from \"./positioning\";\n\nconst EMPTY_THREADS: ThreadData[] = [];\n\ninterface PinPosition {\n threadId: string;\n top: number;\n left: number;\n index: number;\n isScreenshot: boolean;\n screenshotPath: string | null;\n screenshotX: number | null;\n screenshotY: number | null;\n}\n\nfunction resolveSelector(selector: string | null) {\n if (!selector) return null;\n try {\n return document.querySelector(selector);\n } catch {\n return null;\n }\n}\n\nfunction arePositionsEqual(prev: PinPosition[], next: PinPosition[]) {\n return (\n prev.length === next.length &&\n prev.every((pin, index) =>\n pin.threadId === next[index].threadId &&\n Math.round(pin.top) === Math.round(next[index].top) &&\n Math.round(pin.left) === Math.round(next[index].left)\n )\n );\n}\n\nfunction PinMarker({\n pin,\n isHighlighted,\n onClick,\n containerMode,\n}: {\n pin: PinPosition;\n isHighlighted: boolean;\n onClick: () => void;\n containerMode: boolean;\n}) {\n return (\n <div\n key={pin.threadId}\n data-ew-feedback-interactive=\"true\"\n className={`${containerMode ? \"absolute\" : \"fixed\"} pointer-events-auto`}\n style={{ top: pin.top - 12, left: pin.left - 12, zIndex: Z.pins }}\n >\n <div\n onClick={onClick}\n className={`flex h-6 w-6 items-center justify-center rounded-full text-[10px] font-bold shadow-lg cursor-pointer transition-transform hover:scale-125 ${\n pin.isScreenshot\n ? \"bg-accent text-accent-foreground border border-border\"\n : \"bg-primary text-primary-foreground\"\n } ${isHighlighted ? \"scale-150 ring-4 ring-primary/50 animate-pulse\" : \"\"}`}\n title={\n pin.isScreenshot\n ? `Thread #${pin.index} (screenshot — click to preview)`\n : `Thread #${pin.index}`\n }\n >\n {pin.isScreenshot ? (\n <Camera className=\"h-3 w-3\" />\n ) : (\n pin.index\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Renders thread pin markers in document or configured container coordinate space.\n */\nexport function ThreadPins() {\n const ctx = useFeedbackSafe();\n const [documentPositions, setDocumentPositions] = useState<PinPosition[]>([]);\n const [containerPositions, setContainerPositions] = useState<PinPosition[]>([]);\n const [containerVersion, setContainerVersion] = useState(0);\n const rafRef = useRef<number>();\n const { search } = useDocumentLocationParts();\n const [highlightedThreadId, setHighlightedThreadId] = useState<string | null>(null);\n const highlightTimeoutRef = useRef<ReturnType<typeof setTimeout>>();\n const lastHighlightedRef = useRef<string | null>(null);\n const getSignedUrlRef = useRef<(path: string) => Promise<string | null>>(() => Promise.resolve(null));\n const [previewScreenshot, setPreviewScreenshot] = useState<{\n url: string;\n x: number;\n y: number;\n } | null>(null);\n const signedUrlCache = useRef<Record<string, { url: string; expires: number }>>({});\n\n const threads = ctx?.threads ?? EMPTY_THREADS;\n const client = ctx?.client;\n const threadBaseUrl = ctx?.siteUrl?.replace(/\\/+$/, \"\") || window.location.origin;\n const scrollContainer = ctx?.scrollContainer;\n const container = scrollContainer?.ref.current ?? null;\n\n const getSignedUrl = useCallback(async (path: string): Promise<string | null> => {\n if (!client) return null;\n const storagePath = path.includes(\"/object/public/screenshots/\")\n ? path.split(\"/object/public/screenshots/\")[1]\n : path.startsWith(\"http\") ? null : path;\n if (!storagePath) return path;\n\n const cached = signedUrlCache.current[storagePath];\n if (cached && cached.expires > Date.now()) return cached.url;\n\n const { data, error } = await client.storage\n .from(\"screenshots\")\n .createSignedUrl(storagePath, 3600);\n if (error || !data) return null;\n signedUrlCache.current[storagePath] = { url: data.signedUrl, expires: Date.now() + 50 * 60 * 1000 };\n return data.signedUrl;\n }, [client]);\n getSignedUrlRef.current = getSignedUrl;\n\n useEffect(() => {\n if (!container) return;\n const restorePosition = ensurePositionedContainer(container);\n const resizeObserver = new ResizeObserver(() => setContainerVersion((value) => value + 1));\n resizeObserver.observe(container);\n return () => {\n resizeObserver.disconnect();\n restorePosition();\n };\n }, [container]);\n\n useEffect(() => subscribeAnchorRegistry(() => {\n setContainerVersion((value) => value + 1);\n }), []);\n\n // highlight_thread query param (no react-router)\n useEffect(() => {\n const threadId = new URLSearchParams(search).get(\"highlight_thread\");\n if (!threadId || threads.length === 0) return;\n if (lastHighlightedRef.current === threadId) return;\n\n const thread = threads.find((t) => t.id === threadId);\n if (!thread) return;\n\n lastHighlightedRef.current = threadId;\n\n const params = new URLSearchParams(search);\n params.delete(\"highlight_thread\");\n const next = `${window.location.pathname}${params.toString() ? `?${params}` : \"\"}${window.location.hash}`;\n window.history.replaceState({}, \"\", next);\n\n setHighlightedThreadId(threadId);\n\n if (thread.element_tag === \"screenshot\" && thread.screenshot_path && thread.x_position != null && thread.y_position != null) {\n getSignedUrlRef.current(thread.screenshot_path).then((url) => {\n if (url) {\n setPreviewScreenshot({\n url,\n x: thread.x_position!,\n y: thread.y_position!,\n });\n }\n });\n }\n\n highlightTimeoutRef.current = setTimeout(() => {\n setHighlightedThreadId(null);\n }, 3000);\n\n return () => {\n if (highlightTimeoutRef.current) clearTimeout(highlightTimeoutRef.current);\n };\n }, [search, threads]);\n\n const recalculate = useCallback(() => {\n const nextDocumentPins: PinPosition[] = [];\n const nextContainerPins: PinPosition[] = [];\n\n threads.forEach((thread, index) => {\n const isScreenshot = thread.element_tag === \"screenshot\";\n const x = thread.x_position ?? 0;\n const y = thread.y_position ?? 0;\n const pin: PinPosition = {\n threadId: thread.id,\n top: 0,\n left: 0,\n index: index + 1,\n isScreenshot,\n screenshotPath: thread.screenshot_path,\n screenshotX: thread.x_position,\n screenshotY: thread.y_position,\n };\n\n if (!isScreenshot && thread.coordinate_space === \"container\") {\n if (!container || !thread.container_key || thread.container_key !== scrollContainer?.key) {\n return;\n }\n\n const anchorElement = getRegisteredAnchor(thread.anchor_key) ?? resolveSelector(thread.selector);\n const resolved = anchorElement\n ? elementCenterToContainer(container, anchorElement)\n : containerPercentToContent(container, x, y);\n\n pin.left = resolved.left;\n pin.top = resolved.top;\n nextContainerPins.push(pin);\n return;\n }\n\n const anchorElement = !isScreenshot\n ? getRegisteredAnchor(thread.anchor_key) ?? resolveSelector(thread.selector)\n : null;\n const resolved = anchorElement\n ? elementCenterToViewport(anchorElement)\n : docPercentToViewport(x, y);\n\n pin.left = resolved.left;\n pin.top = resolved.top;\n nextDocumentPins.push(pin);\n });\n\n setDocumentPositions((prev) => arePositionsEqual(prev, nextDocumentPins) ? prev : nextDocumentPins);\n setContainerPositions((prev) => arePositionsEqual(prev, nextContainerPins) ? prev : nextContainerPins);\n }, [container, scrollContainer?.key, threads]);\n\n const scheduleRecalculate = useCallback(() => {\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(recalculate);\n }, [recalculate]);\n\n useLayoutEffect(() => {\n recalculate();\n }, [recalculate, containerVersion]);\n\n useEffect(() => {\n window.addEventListener(\"scroll\", scheduleRecalculate, true);\n window.addEventListener(\"resize\", scheduleRecalculate);\n window.addEventListener(\"load\", scheduleRecalculate);\n container?.addEventListener(\"scroll\", scheduleRecalculate, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", scheduleRecalculate, true);\n window.removeEventListener(\"resize\", scheduleRecalculate);\n window.removeEventListener(\"load\", scheduleRecalculate);\n container?.removeEventListener(\"scroll\", scheduleRecalculate);\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [container, scheduleRecalculate]);\n\n const handlePinClick = useCallback((pin: PinPosition) => {\n if (pin.isScreenshot && pin.screenshotPath && pin.screenshotX != null && pin.screenshotY != null) {\n getSignedUrl(pin.screenshotPath).then((signedUrl) => {\n if (signedUrl) {\n setPreviewScreenshot({ url: signedUrl, x: pin.screenshotX!, y: pin.screenshotY! });\n }\n });\n return;\n }\n\n window.open(`${threadBaseUrl}/threads/${pin.threadId}`, \"_blank\", \"noopener,noreferrer\");\n }, [getSignedUrl, threadBaseUrl]);\n\n const containerLayer = useMemo(() => {\n if (!container || containerPositions.length === 0) return null;\n const { width, height } = getContainerContentSize(container);\n return createPortal(\n <div\n data-ew-feedback-interactive=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n width,\n height,\n pointerEvents: \"none\",\n zIndex: Z.pins,\n }}\n >\n {containerPositions.map((pin) => (\n <PinMarker\n key={pin.threadId}\n pin={pin}\n isHighlighted={pin.threadId === highlightedThreadId}\n onClick={() => handlePinClick(pin)}\n containerMode\n />\n ))}\n </div>,\n container\n );\n }, [container, containerPositions, handlePinClick, highlightedThreadId, containerVersion]);\n\n if (!ctx || (documentPositions.length === 0 && containerPositions.length === 0 && !previewScreenshot)) return null;\n\n return (\n <>\n {documentPositions.map((pin) => (\n <PinMarker\n key={pin.threadId}\n pin={pin}\n isHighlighted={pin.threadId === highlightedThreadId}\n onClick={() => handlePinClick(pin)}\n containerMode={false}\n />\n ))}\n\n {containerLayer}\n\n {previewScreenshot && (\n <div\n data-ew-feedback-interactive=\"true\"\n onPointerDownCapture={(e) => e.stopPropagation()}\n className=\"fixed inset-0 flex items-center justify-center bg-black/70\"\n style={{ zIndex: Z.screenshotModal }}\n onClick={() => setPreviewScreenshot(null)}\n >\n <div className=\"relative max-h-[85vh] max-w-[90vw] overflow-hidden rounded-lg shadow-2xl\" onClick={(e) => e.stopPropagation()}>\n <img\n src={previewScreenshot.url}\n alt=\"Screenshot context\"\n className=\"max-h-[85vh] max-w-[90vw] object-contain\"\n draggable={false}\n />\n <div\n className=\"absolute pointer-events-none\"\n style={{\n left: `${previewScreenshot.x}%`,\n top: `${previewScreenshot.y}%`,\n transform: \"translate(-50%, -50%)\",\n }}\n >\n <div className=\"h-6 w-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-[10px] font-bold shadow-lg ring-4 ring-primary/30 animate-pulse\">\n •\n </div>\n </div>\n <button\n onClick={() => setPreviewScreenshot(null)}\n className=\"absolute top-2 right-2 text-[10px] px-2 py-1 rounded bg-card text-foreground border border-border hover:bg-accent\"\n >\n Close\n </button>\n </div>\n </div>\n )}\n </>\n );\n}\n","import { useCallback, useRef } from \"react\";\n\nconst anchors = new Map<string, HTMLElement>();\nconst listeners = new Set<() => void>();\n\nfunction emitChange() {\n listeners.forEach((listener) => listener());\n}\n\nexport function getRegisteredAnchor(anchorKey: string | null | undefined) {\n if (!anchorKey) return null;\n return anchors.get(anchorKey) ?? null;\n}\n\nexport function subscribeAnchorRegistry(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nexport function useIssuePinAnchor(anchorKey: string) {\n const currentNodeRef = useRef<HTMLElement | null>(null);\n\n return useCallback((node: HTMLElement | null) => {\n const currentNode = currentNodeRef.current;\n\n if (currentNode && currentNode !== node && anchors.get(anchorKey) === currentNode) {\n anchors.delete(anchorKey);\n emitChange();\n }\n\n currentNodeRef.current = node;\n\n if (node && anchors.get(anchorKey) !== node) {\n anchors.set(anchorKey, node);\n emitChange();\n }\n }, [anchorKey]);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { T, Z } from \"./theme\";\nimport { clampPercent } from \"./positioning\";\nimport { useFeedbackSafe, type ThreadData } from \"./FeedbackProvider\";\n\ninterface ReviewMetrics {\n width: number;\n height: number;\n scrollX: number;\n scrollY: number;\n}\n\nconst EMPTY_THREADS: ThreadData[] = [];\n\nfunction PinMarker({\n index,\n left,\n top,\n onClick,\n}: {\n index: number;\n left: number;\n top: number;\n onClick: () => void;\n}) {\n return (\n <div\n className=\"absolute pointer-events-auto\"\n style={{ left: left - 12, top: top - 12, zIndex: Z.pins }}\n >\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-foreground shadow-lg transition-transform hover:scale-125\"\n title={`Thread #${index}`}\n >\n {index}\n </button>\n </div>\n );\n}\n\nexport function ReviewSurfaceOverlay() {\n const ctx = useFeedbackSafe();\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const [metrics, setMetrics] = useState<ReviewMetrics>({ width: 0, height: 0, scrollX: 0, scrollY: 0 });\n const [frameReady, setFrameReady] = useState(false);\n const [frameError, setFrameError] = useState<string | null>(null);\n\n const open = ctx?.reviewOpen ?? false;\n const mode = ctx?.mode ?? \"view\";\n const reviewUrl = ctx?.reviewUrl ?? null;\n const threads = ctx?.threads ?? EMPTY_THREADS;\n const threadBaseUrl = ctx?.siteUrl?.replace(/\\/+$/, \"\") || window.location.origin;\n\n const updateMetrics = useCallback(() => {\n const iframe = iframeRef.current;\n if (!iframe) return;\n\n try {\n const doc = iframe.contentDocument;\n const win = iframe.contentWindow;\n const docEl = doc?.documentElement;\n if (!doc || !win || !docEl) {\n setFrameReady(false);\n return;\n }\n\n setMetrics({\n width: Math.max(docEl.scrollWidth, 1),\n height: Math.max(docEl.scrollHeight, 1),\n scrollX: win.scrollX,\n scrollY: win.scrollY,\n });\n setFrameReady(true);\n setFrameError(null);\n } catch {\n setFrameReady(false);\n setFrameError(\"Review URL must be same-origin and iframe-embeddable.\");\n }\n }, []);\n\n useEffect(() => {\n if (!open) return;\n if (!reviewUrl) {\n setFrameReady(false);\n setFrameError(\"Review mode requires a reviewUrl.\");\n return;\n }\n\n const iframe = iframeRef.current;\n if (!iframe) return;\n\n let cleanupResizeObserver: (() => void) | undefined;\n let cleanupScrollListener: (() => void) | undefined;\n\n const install = () => {\n updateMetrics();\n\n try {\n const doc = iframe.contentDocument;\n const win = iframe.contentWindow;\n const docEl = doc?.documentElement;\n if (!doc || !win || !docEl) {\n setFrameError(\"Unable to access the review surface.\");\n return;\n }\n\n const handleScroll = () => updateMetrics();\n win.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", updateMetrics);\n cleanupScrollListener = () => {\n win.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", updateMetrics);\n };\n\n const resizeObserver = new ResizeObserver(() => updateMetrics());\n resizeObserver.observe(docEl);\n if (doc.body) resizeObserver.observe(doc.body);\n cleanupResizeObserver = () => resizeObserver.disconnect();\n } catch {\n setFrameReady(false);\n setFrameError(\"Review URL must be same-origin and iframe-embeddable.\");\n }\n };\n\n const handleLoad = () => install();\n\n iframe.addEventListener(\"load\", handleLoad);\n if (iframe.contentDocument?.readyState === \"complete\") {\n install();\n }\n\n return () => {\n iframe.removeEventListener(\"load\", handleLoad);\n cleanupResizeObserver?.();\n cleanupScrollListener?.();\n };\n }, [open, reviewUrl, updateMetrics]);\n\n const handleClose = useCallback(() => {\n if (!ctx) return;\n ctx.setPendingPin(null);\n ctx.setReviewOpen(false);\n ctx.setMode(\"view\");\n }, [ctx]);\n\n const handleOverlayClick = useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n if (!ctx || mode !== \"annotate\") return;\n if (!reviewUrl || !frameReady || frameError) return;\n\n const rect = event.currentTarget.getBoundingClientRect();\n const x = clampPercent(((event.clientX - rect.left) / Math.max(metrics.width, 1)) * 100);\n const y = clampPercent(((event.clientY - rect.top) / Math.max(metrics.height, 1)) * 100);\n\n ctx.setPendingPin({\n annotationSurface: \"review-iframe\",\n anchorKey: null,\n coordinateSpace: \"document\",\n containerKey: null,\n x,\n y,\n selector: null,\n elementText: reviewUrl,\n elementTag: \"iframe.review-surface\",\n pageUrl: window.location.pathname,\n reviewUrl,\n viewportLeft: event.clientX,\n viewportTop: event.clientY,\n });\n }, [ctx, frameError, frameReady, metrics.height, metrics.width, mode, reviewUrl]);\n\n const handleWheel = useCallback((event: React.WheelEvent<HTMLDivElement>) => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.scrollBy(event.deltaX, event.deltaY);\n event.preventDefault();\n }, []);\n\n const layerStyle = useMemo(() => ({\n position: \"absolute\" as const,\n top: 0,\n left: 0,\n width: metrics.width,\n height: metrics.height,\n transform: `translate(${-metrics.scrollX}px, ${-metrics.scrollY}px)`,\n }), [metrics.height, metrics.scrollX, metrics.scrollY, metrics.width]);\n\n if (!ctx || ctx.annotationSurface !== \"review-iframe\" || !open) return null;\n\n return (\n <div\n data-ew-feedback-interactive=\"true\"\n onPointerDownCapture={(e) => e.stopPropagation()}\n className=\"fixed inset-0\"\n style={{ zIndex: Z.overlay, background: \"rgba(8, 8, 10, 0.82)\" }}\n >\n <div className=\"flex h-full flex-col p-4\">\n <div\n className=\"mb-3 flex items-center justify-between rounded-lg border px-3 py-2\"\n style={{ borderColor: T.border, background: T.card, color: T.fg }}\n >\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium\">Review Surface</div>\n <div className=\"truncate text-xs\" style={{ color: T.muted }}>\n {reviewUrl ?? \"Missing review URL\"}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"rounded px-3 py-1 text-xs\"\n style={{ background: T.accent, color: T.fg }}\n >\n Close\n </button>\n </div>\n\n <div className=\"relative min-h-0 flex-1 overflow-hidden rounded-xl border\" style={{ borderColor: T.border, background: \"#fff\" }}>\n <iframe\n ref={iframeRef}\n src={reviewUrl ?? undefined}\n title=\"Issue Pin review surface\"\n className=\"h-full w-full border-0\"\n />\n\n {reviewUrl && !frameError && mode === \"annotate\" && (\n <div\n data-ew-feedback-interactive=\"true\"\n className=\"absolute inset-0 cursor-crosshair overflow-hidden\"\n onClick={handleOverlayClick}\n onWheel={handleWheel}\n >\n <div style={layerStyle} />\n </div>\n )}\n\n {reviewUrl && !frameError && (\n <div className={`${mode === \"annotate\" ? \"pointer-events-none \" : \"\"}absolute inset-0 overflow-hidden`}>\n <div style={layerStyle}>\n {threads.map((thread, index) => {\n const x = thread.x_position ?? 0;\n const y = thread.y_position ?? 0;\n const left = (x / 100) * metrics.width;\n const top = (y / 100) * metrics.height;\n return (\n <PinMarker\n key={thread.id}\n index={index + 1}\n left={left}\n top={top}\n onClick={() => window.open(`${threadBaseUrl}/threads/${thread.id}`, \"_blank\", \"noopener,noreferrer\")}\n />\n );\n })}\n </div>\n </div>\n )}\n\n {!reviewUrl && (\n <div className=\"absolute inset-0 flex items-center justify-center p-6 text-center text-sm\" style={{ color: T.fg, background: \"rgba(20,20,24,0.9)\" }}>\n Review mode requires a `reviewUrl`.\n </div>\n )}\n\n {reviewUrl && frameError && (\n <div className=\"absolute inset-0 flex items-center justify-center p-6 text-center text-sm\" style={{ color: T.fg, background: \"rgba(20,20,24,0.9)\" }}>\n {frameError}\n </div>\n )}\n\n {reviewUrl && !frameError && !frameReady && (\n <div className=\"absolute inset-0 flex items-center justify-center p-6 text-center text-sm\" style={{ color: T.fg, background: \"rgba(20,20,24,0.5)\" }}>\n Loading review surface…\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useLayoutEffect, useCallback, useEffect } from \"react\";\nimport { useFeedbackSafe } from \"./FeedbackProvider\";\nimport { T, Z } from \"./theme\";\nimport { containerPercentToViewport, docPercentToViewport } from \"./positioning\";\n\nexport function SdkCommentPopover() {\n const ctx = useFeedbackSafe();\n const [body, setBody] = useState(\"\");\n const [visibility, setVisibility] = useState<\"public\" | \"internal\">(\"public\");\n const [submitting, setSubmitting] = useState(false);\n const [pos, setPos] = useState({ top: 0, left: 0 });\n\n const pendingPin = ctx?.pendingPin ?? null;\n\n const recalc = useCallback(() => {\n if (!pendingPin) return;\n if (\n pendingPin.annotationSurface === \"review-iframe\" &&\n pendingPin.viewportLeft != null &&\n pendingPin.viewportTop != null\n ) {\n const pad = 16;\n const w = 280;\n const maxLeft = Math.max(pad, window.innerWidth - w - pad);\n setPos({\n top: pendingPin.viewportTop + pad,\n left: Math.min(Math.max(pad, pendingPin.viewportLeft), maxLeft),\n });\n return;\n }\n const container = ctx?.scrollContainer?.ref.current ?? null;\n const { left, top } =\n pendingPin.coordinateSpace === \"container\" && pendingPin.containerKey && container && ctx?.scrollContainer?.key === pendingPin.containerKey\n ? containerPercentToViewport(container, pendingPin.x, pendingPin.y)\n : docPercentToViewport(pendingPin.x, pendingPin.y);\n const pad = 16;\n const w = 280;\n const maxLeft = Math.max(pad, window.innerWidth - w - pad);\n setPos({\n top: top + pad,\n left: Math.min(Math.max(pad, left), maxLeft),\n });\n }, [ctx, pendingPin]);\n\n useLayoutEffect(() => {\n recalc();\n }, [recalc]);\n\n useEffect(() => {\n if (!pendingPin) return;\n window.addEventListener(\"scroll\", recalc, true);\n window.addEventListener(\"resize\", recalc);\n return () => {\n window.removeEventListener(\"scroll\", recalc, true);\n window.removeEventListener(\"resize\", recalc);\n };\n }, [pendingPin, recalc]);\n\n if (!ctx || !pendingPin) return null;\n\n const { setPendingPin, submitThread, authReady, actorReady, actorError, userDisplayName, userEmail } = ctx;\n\n const identityLabel = userDisplayName || userEmail || null;\n\n const handleSubmit = async () => {\n if (!body.trim() || submitting) return;\n if (!actorReady) {\n console.warn(\"[EW SDK] Cannot submit:\", actorError || \"still linking user identity…\");\n return;\n }\n setSubmitting(true);\n try {\n await submitThread(body.trim(), visibility);\n setBody(\"\");\n } catch (err) {\n console.error(\"[EW SDK] Submit failed:\", err);\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <div\n data-ew-feedback-interactive=\"true\"\n onPointerDownCapture={(e) => e.stopPropagation()}\n style={{ position: \"fixed\", zIndex: Z.popover, top: pos.top, left: pos.left }}\n >\n <div style={{ width: 256, borderRadius: 8, border: `1px solid ${T.border}`, background: T.card, boxShadow: \"0 10px 25px -5px rgba(0,0,0,.5)\", padding: 12 }}>\n <div style={{ marginBottom: 8, fontSize: 10, color: T.muted, fontFamily: \"monospace\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {pendingPin.elementTag}\n {pendingPin.elementText && (\n <span style={{ marginLeft: 4, color: T.fg }}>\"{pendingPin.elementText.slice(0, 40)}\"</span>\n )}\n </div>\n\n <div style={{ marginBottom: 6, fontSize: 10, color: identityLabel ? T.fg : T.muted }}>\n {!authReady\n ? \"Identifying…\"\n : !actorReady\n ? actorError || \"Linking identity…\"\n : identityLabel\n ? `Commenting as ${identityLabel}`\n : \"Anonymous\"}\n </div>\n\n <textarea\n style={{\n width: \"100%\",\n borderRadius: 6,\n border: `1px solid ${T.input}`,\n background: T.bg,\n color: T.fg,\n padding: \"6px 8px\",\n fontSize: 12,\n resize: \"none\",\n outline: \"none\",\n boxSizing: \"border-box\",\n }}\n placeholder=\"Add a comment…\"\n rows={3}\n value={body}\n onChange={(e) => setBody(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) handleSubmit();\n }}\n autoFocus\n />\n\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginTop: 8 }}>\n <select\n style={{ fontSize: 10, background: T.bg, border: `1px solid ${T.input}`, borderRadius: 4, padding: \"2px 4px\", color: T.fg }}\n value={visibility}\n onChange={(e) => setVisibility(e.target.value as \"public\" | \"internal\")}\n >\n <option value=\"public\">Public</option>\n <option value=\"internal\">Internal</option>\n </select>\n\n <div style={{ display: \"flex\", gap: 6 }}>\n <button\n onClick={() => setPendingPin(null)}\n style={{ fontSize: 10, padding: \"4px 8px\", borderRadius: 4, background: T.accent, color: T.muted, border: \"none\", cursor: \"pointer\" }}\n >\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={!body.trim() || submitting || !actorReady}\n style={{ fontSize: 10, padding: \"4px 8px\", borderRadius: 4, background: T.primary, color: T.primaryFg, border: \"none\", cursor: \"pointer\", opacity: !body.trim() || submitting || !actorReady ? 0.5 : 1 }}\n >\n {submitting ? \"…\" : \"Pin\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport { X } from \"lucide-react\";\nimport { useFeedbackSafe } from \"./FeedbackProvider\";\nimport { T, Z } from \"./theme\";\n\ninterface DragPoint { x: number; y: number; }\n\nexport function ScreenshotFeedback() {\n const ctx = useFeedbackSafe();\n const [body, setBody] = useState(\"\");\n const [visibility, setVisibility] = useState<\"public\" | \"internal\">(\"public\");\n const [submitting, setSubmitting] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const [dragStart, setDragStart] = useState<DragPoint | null>(null);\n const [dragEnd, setDragEnd] = useState<DragPoint | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const screenshotDataUrl = ctx?.screenshotDataUrl ?? null;\n const setScreenshotDataUrl = ctx?.setScreenshotDataUrl;\n const pendingScreenshotPin = ctx?.pendingScreenshotPin ?? null;\n const setPendingScreenshotPin = ctx?.setPendingScreenshotPin;\n const submitScreenshotThread = ctx?.submitScreenshotThread;\n const actorReady = ctx?.actorReady ?? false;\n const actorError = ctx?.actorError ?? null;\n const authReady = ctx?.authReady ?? false;\n const showHints = ctx?.showHints ?? true;\n\n const getRelativeCoords = useCallback(\n (e: React.MouseEvent): DragPoint | null => {\n const container = containerRef.current;\n if (!container) return null;\n const rect = container.getBoundingClientRect();\n return {\n x: ((e.clientX - rect.left) / rect.width) * 100,\n y: ((e.clientY - rect.top) / rect.height) * 100,\n };\n },\n []\n );\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n const pt = getRelativeCoords(e);\n if (!pt) return;\n setDragStart(pt);\n setDragEnd(pt);\n setIsDragging(true);\n setPendingScreenshotPin?.(null);\n setBody(\"\");\n },\n [getRelativeCoords, setPendingScreenshotPin]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isDragging) return;\n const pt = getRelativeCoords(e);\n if (pt) setDragEnd(pt);\n },\n [isDragging, getRelativeCoords]\n );\n\n const handleMouseUp = useCallback(() => {\n if (!isDragging || !dragStart || !dragEnd) return;\n setIsDragging(false);\n const x = Math.min(dragStart.x, dragEnd.x);\n const y = Math.min(dragStart.y, dragEnd.y);\n const w = Math.abs(dragEnd.x - dragStart.x);\n const h = Math.abs(dragEnd.y - dragStart.y);\n if (w < 1 && h < 1) {\n setPendingScreenshotPin?.({ x: dragStart.x, y: dragStart.y, width: 0, height: 0, pageUrl: window.location.pathname });\n } else {\n setPendingScreenshotPin?.({ x, y, width: w, height: h, pageUrl: window.location.pathname });\n }\n }, [isDragging, dragStart, dragEnd, setPendingScreenshotPin]);\n\n const handleClose = () => {\n setScreenshotDataUrl?.(null);\n setPendingScreenshotPin?.(null);\n setBody(\"\");\n setDragStart(null);\n setDragEnd(null);\n };\n\n const handleSubmit = async () => {\n if (!body.trim() || submitting || !submitScreenshotThread) return;\n if (!actorReady) {\n console.warn(\"[EW SDK] Cannot submit screenshot:\", actorError || \"still linking user identity…\");\n return;\n }\n setSubmitting(true);\n try {\n await submitScreenshotThread(body.trim(), visibility);\n setBody(\"\");\n } catch (err) {\n console.error(\"[EW SDK] Screenshot submit failed:\", err);\n } finally {\n setSubmitting(false);\n }\n };\n\n if (!ctx || !screenshotDataUrl) return null;\n\n const selRect =\n isDragging && dragStart && dragEnd\n ? {\n x: Math.min(dragStart.x, dragEnd.x),\n y: Math.min(dragStart.y, dragEnd.y),\n w: Math.abs(dragEnd.x - dragStart.x),\n h: Math.abs(dragEnd.y - dragStart.y),\n }\n : null;\n\n return (\n <div\n data-ew-feedback-interactive=\"true\"\n onPointerDownCapture={(e) => e.stopPropagation()}\n style={{ position: \"fixed\", inset: 0, zIndex: Z.screenshotModal, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", background: \"rgba(0,0,0,0.8)\" }}\n >\n {/* Close button */}\n <button\n onClick={handleClose}\n style={{\n position: \"absolute\", top: 16, right: 16, zIndex: 10,\n display: \"flex\", height: 32, width: 32, alignItems: \"center\", justifyContent: \"center\",\n borderRadius: \"50%\", background: T.card, color: T.fg,\n border: `1px solid ${T.border}`, cursor: \"pointer\",\n }}\n title=\"Cancel screenshot feedback\"\n >\n <X style={{ width: 16, height: 16 }} />\n </button>\n\n {/* Instructions */}\n {showHints && !pendingScreenshotPin && !isDragging && (\n <div style={{\n position: \"absolute\", top: 16, left: \"50%\", transform: \"translateX(-50%)\", zIndex: 10,\n borderRadius: 8, background: T.card, border: `1px solid ${T.border}`,\n padding: \"8px 16px\", boxShadow: \"0 4px 12px rgba(0,0,0,.4)\",\n }}>\n <p style={{ fontSize: 12, color: T.fg, fontWeight: 500, margin: 0 }}>Click and drag to select an area</p>\n </div>\n )}\n\n {/* Screenshot container */}\n <div\n ref={containerRef}\n style={{ position: \"relative\", maxHeight: \"90vh\", maxWidth: \"95vw\", overflow: \"hidden\", borderRadius: 8, boxShadow: \"0 25px 50px -12px rgba(0,0,0,.5)\", userSelect: \"none\", cursor: \"crosshair\" }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n >\n <img src={screenshotDataUrl} alt=\"Screenshot for feedback\" style={{ display: \"block\", maxHeight: \"90vh\", maxWidth: \"95vw\", pointerEvents: \"none\" }} draggable={false} />\n\n {/* Live drag selection */}\n {selRect && selRect.w + selRect.h > 0.5 && (\n <div style={{\n position: \"absolute\", left: `${selRect.x}%`, top: `${selRect.y}%`,\n width: `${selRect.w}%`, height: `${selRect.h}%`,\n border: `2px solid ${T.primary}`, background: `${T.primary}33`, pointerEvents: \"none\",\n }} />\n )}\n\n {/* Committed selection / pin */}\n {pendingScreenshotPin && !isDragging && (\n <>\n {pendingScreenshotPin.width > 0 || pendingScreenshotPin.height > 0 ? (\n <div style={{\n position: \"absolute\", left: `${pendingScreenshotPin.x}%`, top: `${pendingScreenshotPin.y}%`,\n width: `${pendingScreenshotPin.width}%`, height: `${pendingScreenshotPin.height}%`,\n border: `2px solid ${T.primary}`, background: `${T.primary}33`, pointerEvents: \"none\",\n }} />\n ) : (\n <div style={{\n position: \"absolute\", left: `${pendingScreenshotPin.x}%`, top: `${pendingScreenshotPin.y}%`,\n transform: \"translate(-50%, -50%)\", pointerEvents: \"none\",\n }}>\n <div style={{\n height: 24, width: 24, borderRadius: \"50%\",\n background: T.primary, color: T.primaryFg,\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n fontSize: 10, fontWeight: 700,\n boxShadow: `0 0 0 4px ${T.primary}4d, 0 4px 12px rgba(0,0,0,.4)`,\n }}>•</div>\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Comment input */}\n {pendingScreenshotPin && !isDragging && (\n <div style={{ position: \"absolute\", bottom: 24, left: \"50%\", transform: \"translateX(-50%)\", zIndex: 10, width: 288 }}>\n <div style={{ borderRadius: 8, border: `1px solid ${T.border}`, background: T.card, boxShadow: \"0 10px 25px -5px rgba(0,0,0,.5)\", padding: 12 }}>\n <div style={{ marginBottom: 8, fontSize: 10, color: T.muted, fontFamily: \"monospace\" }}>\n 📸{\" \"}\n {pendingScreenshotPin.width > 0\n ? `Area (${Math.round(pendingScreenshotPin.x)}%, ${Math.round(pendingScreenshotPin.y)}%) ${Math.round(pendingScreenshotPin.width)}×${Math.round(pendingScreenshotPin.height)}%`\n : `Pin at (${Math.round(pendingScreenshotPin.x)}%, ${Math.round(pendingScreenshotPin.y)}%)`}\n </div>\n {!actorReady && (\n <div style={{ marginBottom: 8, fontSize: 10, color: T.muted }}>\n {!authReady ? \"Identifying…\" : actorError || \"Linking identity…\"}\n </div>\n )}\n\n <textarea\n style={{\n width: \"100%\", borderRadius: 6, border: `1px solid ${T.input}`,\n background: T.bg, color: T.fg, padding: \"6px 8px\", fontSize: 12,\n resize: \"none\", outline: \"none\", boxSizing: \"border-box\",\n }}\n placeholder=\"Add a comment…\"\n rows={3}\n value={body}\n onChange={(e) => setBody(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) handleSubmit(); }}\n autoFocus\n />\n\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginTop: 8 }}>\n <select\n style={{ fontSize: 10, background: T.bg, border: `1px solid ${T.input}`, borderRadius: 4, padding: \"2px 4px\", color: T.fg }}\n value={visibility}\n onChange={(e) => setVisibility(e.target.value as \"public\" | \"internal\")}\n >\n <option value=\"public\">Public</option>\n <option value=\"internal\">Internal</option>\n </select>\n\n <div style={{ display: \"flex\", gap: 6 }}>\n <button\n onClick={() => { setPendingScreenshotPin?.(null); setDragStart(null); setDragEnd(null); }}\n style={{ fontSize: 10, padding: \"4px 8px\", borderRadius: 4, background: T.accent, color: T.muted, border: \"none\", cursor: \"pointer\" }}\n >\n Re-select\n </button>\n <button\n onClick={handleSubmit}\n disabled={!body.trim() || submitting || !actorReady}\n style={{ fontSize: 10, padding: \"4px 8px\", borderRadius: 4, background: T.primary, color: T.primaryFg, border: \"none\", cursor: \"pointer\", opacity: !body.trim() || submitting || !actorReady ? 0.5 : 1 }}\n >\n {submitting ? \"…\" : \"Submit\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useRef, useEffect, useState } from \"react\";\nimport { MessageSquarePlus, MapPin, Camera } from \"lucide-react\";\nimport { useFeedbackSafe } from \"./FeedbackProvider\";\nimport { T, Z } from \"./theme\";\nimport { getLauncherCapabilities } from \"./launcher\";\n\ninterface FeedbackButtonProps {\n position?: \"bottom-right\" | \"bottom-left\";\n}\n\nexport function FeedbackButton({ position = \"bottom-right\" }: FeedbackButtonProps) {\n const ctx = useFeedbackSafe();\n const menuRef = useRef<HTMLDivElement>(null);\n const [hintDismissed, setHintDismissed] = useState(false);\n\n const menuOpenState = ctx?.menuOpen ?? false;\n const debug = ctx?.debug ?? false;\n\n // Close menu on outside click\n useEffect(() => {\n if (!menuOpenState || !ctx) return;\n const handler = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n ctx.setMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [menuOpenState, ctx]);\n\n useEffect(() => {\n if (!debug) return;\n console.log(\"[EW SDK] FeedbackButton mounted\");\n return () => console.log(\"[EW SDK] FeedbackButton unmounted\");\n }, [debug]);\n\n if (!ctx) return null;\n const {\n mode,\n menuOpen,\n canPinOnPage,\n canScreenshot,\n showHints,\n screenshotCapturing,\n toggleMenu,\n enterPinMode,\n exitPinMode,\n startScreenshotCapture,\n } = ctx;\n const annotate = mode === \"annotate\";\n const capabilities = getLauncherCapabilities({ allowPinOnPage: canPinOnPage, allowScreenshot: canScreenshot });\n\n const posStyle: React.CSSProperties =\n position === \"bottom-left\"\n ? { left: 20, bottom: 20 }\n : { right: 20, bottom: 20 };\n const hintStyle: React.CSSProperties =\n position === \"bottom-left\"\n ? { left: 56, bottom: 8 }\n : { right: 56, bottom: 8 };\n\n const handleToggle = () => {\n if (debug) console.log(\"[EW SDK] handleToggle\", { mode, menuOpen });\n setHintDismissed(true);\n if (annotate) {\n exitPinMode();\n return;\n }\n\n if (capabilities.actionCount === 1) {\n if (capabilities.singleAction === \"pin\") {\n enterPinMode();\n } else if (capabilities.singleAction === \"screenshot\") {\n void startScreenshotCapture();\n }\n return;\n }\n\n toggleMenu();\n };\n const capturing = screenshotCapturing;\n const showLauncherHint = showHints && !hintDismissed && !annotate && !menuOpen;\n\n if (capabilities.actionCount === 0) return null;\n\n return (\n <div\n ref={menuRef}\n data-ew-feedback-interactive=\"true\"\n style={{ position: \"fixed\", ...posStyle, zIndex: Z.launcher }}\n >\n {showLauncherHint && (\n <div\n style={{\n position: \"absolute\",\n ...hintStyle,\n width: 280,\n borderRadius: 10,\n border: `1px solid ${T.border}`,\n background: T.card,\n color: T.fg,\n boxShadow: \"0 10px 25px -5px rgba(0,0,0,.5)\",\n padding: \"12px 14px\",\n }}\n >\n <div style={{ fontSize: 16, fontWeight: 600, marginBottom: 6 }}>Open Issue Pin</div>\n <div style={{ fontSize: 12, color: T.muted, lineHeight: 1.45 }}>\n Click the feedback bubble to pin comments on the page or capture a screenshot.\n </div>\n </div>\n )}\n\n {/* Mode picker menu */}\n {menuOpen && !annotate && capabilities.actionCount > 1 && (\n <div\n style={{\n position: \"absolute\",\n bottom: 56,\n right: 0,\n marginBottom: 4,\n width: 176,\n borderRadius: 8,\n border: `1px solid ${T.border}`,\n background: T.card,\n boxShadow: \"0 10px 25px -5px rgba(0,0,0,.5)\",\n overflow: \"hidden\",\n }}\n >\n {canPinOnPage && (\n <button\n onClick={enterPinMode}\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 12px\",\n fontSize: 12,\n color: T.fg,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n textAlign: \"left\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = T.accent)}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n <MapPin style={{ width: 16, height: 16, color: T.primary, flexShrink: 0 }} />\n <div>\n <div style={{ fontWeight: 500 }}>Pin on page</div>\n <div style={{ fontSize: 10, color: T.muted }}>Click an element</div>\n </div>\n </button>\n )}\n {canPinOnPage && canScreenshot && <div style={{ borderTop: `1px solid ${T.border}` }} />}\n {canScreenshot && (\n <button\n onClick={() => void startScreenshotCapture()}\n disabled={capturing}\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 12px\",\n fontSize: 12,\n color: T.fg,\n background: \"transparent\",\n border: \"none\",\n cursor: capturing ? \"default\" : \"pointer\",\n opacity: capturing ? 0.5 : 1,\n textAlign: \"left\",\n }}\n onMouseEnter={(e) => { if (!capturing) e.currentTarget.style.background = T.accent; }}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n <Camera style={{ width: 16, height: 16, color: T.primary, flexShrink: 0 }} />\n <div>\n <div style={{ fontWeight: 500 }}>{capturing ? \"Capturing…\" : \"Screenshot\"}</div>\n <div style={{ fontSize: 10, color: T.muted }}>Capture current view</div>\n </div>\n </button>\n )}\n </div>\n )}\n\n {/* Main button */}\n <button\n // Use click so direct DOM `button.click()` and normal browser clicks\n // both open the menu. Pointerdown is intercepted in some hosts.\n onClick={handleToggle}\n style={{\n display: \"flex\",\n height: 48,\n width: 48,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"50%\",\n boxShadow: \"0 4px 12px rgba(0,0,0,.4)\",\n transition: \"all 200ms\",\n border: annotate ? \"none\" : `1px solid ${T.border}`,\n background: annotate ? T.primary : T.card,\n color: annotate ? T.primaryFg : T.fg,\n cursor: \"pointer\",\n transform: annotate ? \"scale(1.1)\" : \"scale(1)\",\n }}\n title={annotate ? \"Exit feedback mode\" : \"Open feedback menu\"}\n aria-label=\"Toggle feedback mode\"\n >\n <MessageSquarePlus style={{ width: 20, height: 20 }} />\n </button>\n </div>\n );\n}\n","export type LauncherAction = \"pin\" | \"screenshot\";\n\nexport interface LauncherCapabilities {\n canPinOnPage: boolean;\n canScreenshot: boolean;\n actionCount: number;\n singleAction: LauncherAction | null;\n}\n\nexport function getLauncherCapabilities({\n allowPinOnPage = true,\n allowScreenshot = true,\n}: {\n allowPinOnPage?: boolean;\n allowScreenshot?: boolean;\n}): LauncherCapabilities {\n const canPinOnPage = allowPinOnPage;\n const canScreenshot = allowScreenshot;\n const actionCount = Number(canPinOnPage) + Number(canScreenshot);\n const singleAction =\n actionCount === 1\n ? canPinOnPage\n ? \"pin\"\n : \"screenshot\"\n : null;\n\n return {\n canPinOnPage,\n canScreenshot,\n actionCount,\n singleAction,\n };\n}\n","import { useState, useEffect, useCallback, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Camera } from \"lucide-react\";\nimport { type ModalCaptureRenderProps, useFeedbackSafe } from \"./FeedbackProvider\";\nimport { T, Z } from \"./theme\";\n\nexport function ModalFeedbackInjector({\n renderButton,\n}: {\n renderButton?: (props: ModalCaptureRenderProps) => ReactNode;\n}) {\n const ctx = useFeedbackSafe();\n const [openModals, setOpenModals] = useState<Element[]>([]);\n\n useEffect(() => {\n const query = () => {\n const modals = document.querySelectorAll('[role=\"dialog\"], [data-radix-dialog-content]');\n setOpenModals(Array.from(modals));\n };\n query();\n const observer = new MutationObserver(query);\n observer.observe(document.body, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, []);\n\n const handleCapture = useCallback(async () => {\n if (!ctx) return;\n await ctx.startScreenshotCapture();\n }, [ctx]);\n\n if (!ctx || openModals.length === 0) return null;\n\n const renderProps: ModalCaptureRenderProps = {\n captureScreenshot: handleCapture,\n closeLauncherMenu: ctx.closeMenu,\n };\n\n return (\n <>\n {openModals.map((modal, i) =>\n createPortal(\n renderButton ? (\n <div data-ew-feedback-interactive=\"true\" onPointerDownCapture={(e) => e.stopPropagation()}>\n {renderButton(renderProps)}\n </div>\n ) : (\n <button\n key={i}\n data-ew-feedback-interactive=\"true\"\n onClick={(e) => {\n e.stopPropagation();\n void handleCapture();\n }}\n style={{\n position: \"absolute\",\n bottom: 12,\n right: 12,\n zIndex: Z.launcher,\n display: \"flex\",\n height: 32,\n width: 32,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"50%\",\n border: `1px solid ${T.border}`,\n background: T.card,\n color: T.fg,\n boxShadow: \"0 2px 8px rgba(0,0,0,.3)\",\n cursor: \"pointer\",\n }}\n title=\"Capture feedback screenshot\"\n aria-label=\"Capture feedback screenshot\"\n >\n <Camera style={{ width: 16, height: 16, color: T.primary }} />\n </button>\n ),\n modal,\n `modal-feedback-${i}`\n )\n )}\n </>\n );\n}\n"],"mappings":";AAAA,SAAS,iBAAiC;;;ACA1C,SAAS,eAAe,YAAuB,SAAS,UAAU,aAAa,iBAAqD;AACpI,SAAS,oBAAoC;AAE7C,OAAO,iBAAiB;;;ACHxB,SAAS,4BAA4B;AAErC,IAAI,sBAAsB;AAC1B,IAAM,YAAY,oBAAI,IAAgB;AACtC,IAAI;AACJ,IAAI;AAEJ,SAAS,SAAS;AAChB,YAAU,QAAQ,CAAC,MAAM,EAAE,CAAC;AAC9B;AAEA,SAAS,kBAAkB,UAAsB;AAC/C,MAAI,wBAAwB,GAAG;AAC7B,eAAW,QAAQ,UAAU,KAAK,OAAO;AACzC,kBAAc,QAAQ,aAAa,KAAK,OAAO;AAC/C,YAAQ,YAAY,IAAI,SAA+C;AACrE,eAAS,GAAG,IAAI;AAChB,aAAO;AAAA,IACT;AACA,YAAQ,eAAe,IAAI,SAAkD;AAC3E,kBAAY,GAAG,IAAI;AACnB,aAAO;AAAA,IACT;AACA,WAAO,iBAAiB,YAAY,MAAM;AAAA,EAC5C;AACA;AACA,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM;AACX,cAAU,OAAO,QAAQ;AACzB;AACA,QAAI,wBAAwB,GAAG;AAC7B,cAAQ,YAAY;AACpB,cAAQ,eAAe;AACvB,aAAO,oBAAoB,YAAY,MAAM;AAAA,IAC/C;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B;AACrC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO,GAAG,OAAO,SAAS,QAAQ;AAAA,EAAK,OAAO,SAAS,MAAM;AAC/D;AAEA,SAAS,oBAAoB;AAC3B,SAAO;AACT;AAMO,SAAS,2BAAiE;AAC/E,QAAM,WAAW,qBAAqB,mBAAmB,6BAA6B,iBAAiB;AACvG,QAAM,CAAC,UAAU,MAAM,IAAI,SAAS,MAAM,IAAI;AAC9C,SAAO,EAAE,UAAU,QAAQ,UAAU,GAAG;AAC1C;;;ACtDO,IAAM,IAAI;AAAA,EACf,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,OAAO;AACT;AAGO,IAAM,IAAI;AAAA,EACf,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AACR;;;AF+hBW,wBAsjBH,YAtjBG;AAzYX,IAAM,kBAAkB,cAA0C,IAAI;AAYtE,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,+BAA+B,oBAAI,IAA+B;AAExE,SAAS,4BAA4B,OAAgB;AACnD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,YAAY;AAClB,MAAI,UAAU,SAAS,WAAY,QAAO;AAC1C,SAAO,OAAO,UAAU,YAAY,YAAY,UAAU,QAAQ,SAAS,QAAQ;AACrF;AAEA,SAAS,4BAA4B,SAAkC;AACrE,QAAM,SAAS,EAAE,GAAG,QAAQ;AAC5B,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO;AACT;AAEA,SAAS,sBAAsB,MAA2C;AACxE,SAAO;AAAA,IACL,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,IACxB,UAAU,OAAO,KAAK,YAAY,EAAE;AAAA,IACpC,YAAY;AAAA,IACZ,UAAU,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAAA,IAC9D,cAAc,OAAO,KAAK,iBAAiB,WAAW,KAAK,eAAe;AAAA,IAC1E,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,IACvE,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,KAAK,cAAc,OAAO,OAAO,OAAO,KAAK,UAAU;AAAA,IAC3H,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,KAAK,cAAc,OAAO,OAAO,OAAO,KAAK,UAAU;AAAA,IAC3H,gBAAgB,OAAO,KAAK,mBAAmB,WAAW,KAAK,iBAAiB,KAAK,kBAAkB,OAAO,OAAO,OAAO,KAAK,cAAc;AAAA,IAC/I,iBAAiB,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB,KAAK,mBAAmB,OAAO,OAAO,OAAO,KAAK,eAAe;AAAA,IACpJ,wBAAwB,OAAO,KAAK,2BAA2B,WAAW,KAAK,yBAAyB;AAAA,IACxG,iBAAiB,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB;AAAA,IACnF,QAAQ,OAAO,KAAK,UAAU,MAAM;AAAA,IACpC,YAAY,OAAO,KAAK,cAAc,QAAQ;AAAA,IAC9C,YAAY,OAAO,KAAK,cAAc,EAAE;AAAA,EAC1C;AACF;AAEA,SAAS,qBAAqB,aAAwC;AACpE,SAAO,6BAA6B,IAAI,WAAW,KAAK;AAC1D;AAEA,SAAS,qBAAqB,aAAqB,MAAyB;AAC1E,+BAA6B,IAAI,aAAa,IAAI;AACpD;AAEO,SAAS,2BAA2B,MAMxC;AACD,MAAI,KAAK,eAAgB,QAAO,KAAK;AACrC,MAAI,KAAK,aAAa,CAAC,KAAK,kBAAkB,KAAK,oBAAoB;AACrE,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK;AACd;AAEO,SAAS,0BAA0B,MAOvC;AACD,MAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,MAAI,KAAK,eAAgB,QAAO;AAChC,MAAI,KAAK,aAAa,CAAC,KAAK,kBAAkB,KAAK,oBAAoB;AACrE,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,MAGnB;AACpB,MAAI,KAAK,kBAAmB,QAAO,KAAK;AACxC,SAAO,KAAK,YAAY,kBAAkB;AAC5C;AAEO,SAAS,oBAAoB,MAIjC;AACD,MAAI,CAAC,KAAK,eAAgB,QAAO;AACjC,MAAI,KAAK,sBAAsB,iBAAiB;AAC9C,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,MAOtC;AACD,QAAM,EAAE,WAAW,IAAI;AACvB,QAAM,kBAAkB,WAAW,sBAAsB;AAEzD,SAAO;AAAA,IACL,cAAc,KAAK;AAAA,IACnB,YAAY,KAAK,UAAU;AAAA,IAC3B,UAAU,WAAW;AAAA,IACrB,oBAAoB,WAAW;AAAA,IAC/B,YAAY,kBAAkB,WAAW,YAAY;AAAA,IACrD,UAAU,kBAAkB,OAAO,WAAW;AAAA,IAC9C,YAAY,kBAAkB,OAAO,WAAW;AAAA,IAChD,kBAAkB,WAAW;AAAA,IAC7B,eAAe,kBAAkB,OAAO,WAAW;AAAA,IACnD,cAAc,WAAW;AAAA,IACzB,aAAa,WAAW;AAAA,IACxB,YAAY,WAAW;AAAA,IACvB,YAAY,WAAW;AAAA,IACvB,gBAAgB,OAAO;AAAA,IACvB,iBAAiB,OAAO;AAAA,IACxB,wBAAwB;AAAA,IACxB,YAAY,KAAK;AAAA,IACjB,gBAAgB,KAAK,aAAa;AAAA,IAClC,eAAe,KAAK,mBAAmB;AAAA,EACzC;AACF;AAEA,eAAe,cAAc,QAAyC;AACpE,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;AAAA,IACjC;AAAA,EACF;AACA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,gBAAgB,EAAE;AACrE,UAAM,IAAI,MAAM,IAAI,SAAS,2BAA2B;AAAA,EAC1D;AACA,SAAO,IAAI,KAAK;AAClB;AAEA,SAAS,oBAAoB,aAAqB;AAChD,SAAO,GAAG,YAAY,QAAQ,QAAQ,EAAE,CAAC;AAC3C;AAEA,eAAe,iBACb,QACA,SACA,aACiB;AACjB,QAAM,MAAM,MAAM,MAAM,OAAO;AAC/B,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,WAAW,GAAG,WAAW,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACvF,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,QAAQ,KAAK,aAAa,EAAE,OAAO,UAAU,MAAM;AAAA,IAChF,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,MAAO,OAAM;AACjB,SAAO;AACT;AAEA,eAAe,qBACb,QACA,MACA,aACiB;AACjB,QAAM,WAAW,GAAG,WAAW,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACvF,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,QAAQ,KAAK,aAAa,EAAE,OAAO,UAAU,MAAM;AAAA,IAChF,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,MAAO,OAAM;AACjB,SAAO;AACT;AAKO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,GAAG;AACL,GAA8C;AAC5C,QAAM,cAAc,OAAO,eAAe,OAAO,mBAAmB,OAAO;AAC3E,QAAM,CAAC,UAAU,WAAW,IAAI;AAAA,IAC9B,cACI,EAAE,aAAa,OAAO,aAAc,iBAAiB,OAAO,iBAAkB,aAAa,OAAO,aAAc,qBAAqB,MAAM,IAC3I;AAAA,EACN;AAEA,QAAM,CAAC,cAAc,eAAe,IAAI,SAAwB,IAAI;AAGpE,QAAM,CAAC,cAAc,eAAe,IAAI,SAAkG,CAAC,CAAC;AAC5I,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,CAAC,OAAO,kBAAkB,CAAC,EAAE,OAAO,UAAU,OAAO,aAAa,OAAO,gBAAgB;AAEpI,YAAU,MAAM;AACd,QAAI,CAAC,OAAO,gBAAgB;AAC1B,mBAAa,IAAI;AACjB;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,OAAO,aAAa,OAAO,iBAAiB;AAC/D,mBAAa,IAAI;AACjB;AAAA,IACF;AAEA,QAAI,YAAY;AAEhB,UAAM,kBAAkB,CAAC,aAAqD;AAAA,MAC5E,QAAQ,QAAQ,KAAK;AAAA,MACrB,WAAW,QAAQ,KAAK;AAAA,MACxB,iBACE,QAAQ,KAAK,eAAe,gBAC5B,QAAQ,KAAK,eAAe,aAC5B,QAAQ,KAAK,eAAe,SAC3B,QAAQ,KAAK,QAAQ,QAAQ,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI;AAAA,MAC3D,aAAa,QAAQ;AAAA,IACvB;AAEA,UAAM,WAAW,YAAY;AAC3B,UAAI;AACF,cAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,MAAM,OAAO,eAAgB,KAAK,WAAW;AAC3E,YAAI,UAAW;AACf,YAAI,SAAS,MAAM;AACjB,gBAAM,WAAW,gBAAgB,OAAO;AACxC,0BAAgB,QAAQ;AACxB,kBAAQ,IAAI,oCAAoC,EAAE,OAAO,SAAS,WAAW,aAAa,SAAS,gBAAgB,CAAC;AAAA,QACtH,OAAO;AACL,kBAAQ,IAAI,+DAA+D;AAAA,QAC7E;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,KAAK,8DAA8D,GAAG;AAAA,MAChF,UAAE;AACA,YAAI,CAAC,UAAW,cAAa,IAAI;AAAA,MACnC;AAAA,IACF;AACA,aAAS;AAGT,UAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,OAAO,eAAe,KAAK;AAAA,MAC5D,CAAC,QAAQ,YAAY;AACnB,YAAI,UAAW;AACf,YAAI,SAAS,MAAM;AACjB,gBAAM,WAAW,gBAAgB,OAAO;AACxC,0BAAgB,QAAQ;AACxB,kBAAQ,IAAI,wDAAmD,EAAE,OAAO,SAAS,WAAW,aAAa,SAAS,gBAAgB,CAAC;AAAA,QACrI,OAAO;AACL,0BAAgB,CAAC,CAAC;AAClB,kBAAQ,IAAI,oDAA+C;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM;AACX,kBAAY;AACZ,mBAAa,YAAY;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,OAAO,gBAAgB,OAAO,QAAQ,OAAO,WAAW,OAAO,eAAe,CAAC;AAGnF,QAAM,iBAAiB,OAAO,aAAa,aAAa;AACxD,QAAM,uBAAuB,OAAO,mBAAmB,aAAa;AACpE,QAAM,4BAA4B,yBAAyB;AAAA,IACzD,mBAAmB,OAAO;AAAA,IAC1B,WAAW,OAAO;AAAA,EACpB,CAAC;AAED,YAAU,MAAM;AACd,QAAI,SAAU;AACd,QAAI,CAAC,OAAO,QAAQ;AAClB,sBAAgB,0DAA0D;AAC1E;AAAA,IACF;AACA,QAAI,YAAY;AAChB,kBAAc,OAAO,MAAM,EACxB,KAAK,CAAC,MAAM;AACX,UAAI,UAAW;AACf,UAAI,CAAC,EAAE,eAAe,CAAC,EAAE,mBAAmB,CAAC,EAAE,aAAa;AAC1D,wBAAgB,0FAA0F;AAC1G;AAAA,MACF;AACA,kBAAY,CAAC;AAAA,IACf,CAAC,EACA,MAAM,CAAC,MAAM;AAAE,UAAI,CAAC,UAAW,iBAAgB,EAAE,OAAO;AAAA,IAAG,CAAC;AAC/D,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAM;AAAA,EACnC,GAAG,CAAC,OAAO,QAAQ,OAAO,aAAa,OAAO,iBAAiB,OAAO,WAAW,CAAC;AAGlF,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAA6B;AACrF,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAwB,IAAI;AAC1E,YAAU,MAAM;AACd,QAAI,eAAgB;AACpB,QAAI,CAAC,YAAY,CAAC,OAAO,OAAQ;AACjC,QAAI,OAAO,eAAgB;AAE3B,QAAI,CAAC,aAAa,UAAU,CAAC,aAAa,aAAa,CAAC,aAAa,YAAa;AAElF,QAAI,YAAY;AAChB,UAAM,WAAW,YAAY;AAC3B,UAAI;AACF,cAAM,mBAAmB,oBAAoB,SAAS,WAAW;AACjE,cAAM,MAAM,MAAM;AAAA,UAChB,GAAG,gBAAgB;AAAA,UACnB;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,eAAe,UAAU,aAAa,WAAW;AAAA,YACnD;AAAA,YACA,MAAM,KAAK,UAAU;AAAA,cACnB,QAAQ,OAAO;AAAA,cACf,YAAY,aAAa;AAAA,cACzB,OAAO,aAAa;AAAA,cACpB,aAAa,aAAa,mBAAmB;AAAA,YAC/C,CAAC;AAAA,UACH;AAAA,QACF;AACA,YAAI,CAAC,WAAW;AACd,cAAI,IAAI,IAAI;AACV,kBAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,oCAAwB,KAAK,WAAW,MAAS;AACjD,+BAAmB,IAAI;AACvB,oBAAQ,IAAI,sCAAsC,EAAE,QAAQ,KAAK,SAAS,OAAO,KAAK,YAAY,CAAC;AAAA,UACrG,OAAO;AACL,kBAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC7C,kBAAM,UAAU,IAAI,SAAS,2BAA2B,IAAI,MAAM;AAClE,+BAAmB,OAAO;AAC1B,oBAAQ,KAAK,oCAAoC,OAAO;AAAA,UAC1D;AACA,4BAAkB,IAAI;AAAA,QACxB;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,CAAC,WAAW;AACd,gBAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,6BAAmB,OAAO;AAC1B,kBAAQ,KAAK,mCAAmC,OAAO;AACvD,4BAAkB,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AACA,aAAS;AACT,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAM;AAAA,EACnC,GAAG,CAAC,UAAU,OAAO,QAAQ,OAAO,gBAAgB,aAAa,QAAQ,aAAa,WAAW,aAAa,iBAAiB,aAAa,aAAa,cAAc,CAAC;AAExK,QAAM,kBAAkB,2BAA2B;AAAA,IACjD,gBAAgB,OAAO;AAAA,IACvB,oBAAoB,aAAa;AAAA,IACjC;AAAA,IACA,WAAW,CAAC,CAAC,OAAO;AAAA,IACpB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AAED,QAAM,aAAa,0BAA0B;AAAA,IAC3C;AAAA,IACA,gBAAgB,OAAO;AAAA,IACvB,oBAAoB,aAAa;AAAA,IACjC;AAAA,IACA,WAAW,CAAC,CAAC,OAAO;AAAA,IACpB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AAED,QAAM,aACJ,kBAAkB,CAAC,eAAe,mBAAmB,iEACjD,mBAAmB,gEACnB;AAEN,MAAI,cAAc;AAChB,YAAQ,MAAM,YAAY,YAAY;AACtC,WAAO,gCAAG,UAAS;AAAA,EACrB;AAEA,MAAI,CAAC,UAAU;AACb,WAAO,gCAAG,UAAS;AAAA,EACrB;AAEA,QAAM,sBACJ,OAAO,iBACN,OAAO,0BACH,CAAC,MAAoB,OAAO,uBAAwB,MAAM,UAAU,KACrE;AACN,QAAM,0BACJ,OAAO,SAAS,SACZ,OAAO,OACP,OAAO,mBAAmB,SACvB,OAAO,iBAAiB,aAAa,SACtC;AACR,QAAM,0BACJ,OAAO,SACN,OAAO,mBAAmB,SAAa,OAAO,iBAAiB,aAAa,SAAU;AAEzF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAa,SAAS;AAAA,MACtB,iBAAiB,SAAS;AAAA,MAC1B,aAAa,SAAS;AAAA,MACtB,SAAS,SAAS;AAAA,MAClB,uBAAuB,SAAS,uBAAuB;AAAA,MACvD,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,iBAAiB,OAAO,mBAAmB;AAAA,MAC3C,WAAW,OAAO,aAAa;AAAA,MAC/B,mBAAmB;AAAA,MACnB,WAAW,OAAO,aAAa;AAAA,MAC/B,iBAAiB,OAAO;AAAA,MACxB,eAAe,OAAO;AAAA,MACtB,kBAAkB,wBAAwB;AAAA,MAC1C,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd;AAAA,MACA,OAAO,OAAO,SAAS;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,iBAAiB;AAAA,MAEhB;AAAA;AAAA,EACH;AAEJ;AA6BA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAe;AACb,QAAM,WAAW,YAAY,CAAC,SAAiB,UAAoB;AACjE,QAAI,CAAC,MAAO;AACZ,QAAI,UAAU,QAAW;AACvB,cAAQ,IAAI,YAAY,OAAO,EAAE;AACjC;AAAA,IACF;AACA,YAAQ,IAAI,YAAY,OAAO,IAAI,KAAK;AAAA,EAC1C,GAAG,CAAC,KAAK,CAAC;AAGV,YAAU,MAAM;AACd,QAAI,CAAC,mBAAmB,CAAC,WAAW;AAClC,cAAQ;AAAA,QACN;AAAA,MAGF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,QAAQ,MAAM;AAC3B,QAAI;AACF,aAAO,aAAa,aAAa,iBAAiB;AAAA,QAChD,MAAM;AAAA,UACJ,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,oBAAoB;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ,MAAM,8CAA8C,GAAG;AAC/D,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,aAAa,eAAe,CAAC;AAGjC,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,qBAAqB;AACpF,YAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,WACG,KAAK,YAAY,EACjB,OAAO,wBAAwB,EAC/B,GAAG,MAAM,WAAW,EACpB,OAAO,EACP,KAAK,CAAC,EAAE,KAAK,MAAM;AAClB,UAAI,KAAM,wBAAuB,KAAK,sBAAsB;AAAA,IAC9D,CAAC;AAAA,EACL,GAAG,CAAC,QAAQ,WAAW,CAAC;AAExB,QAAM,CAAC,SAAS,UAAU,IAAI,SAAuB,CAAC,CAAC;AACvD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAC9D,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,cAAc,eAAe,IAAI;AAAA,IAAuB,MAC7D,mBAAmB,SAAS;AAAA,EAC9B;AACA,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,YAAY,aAAa,IAAI,SAA4B,IAAI;AACpE,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAwB,IAAI;AAC9E,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAAsC,IAAI;AAClG,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,KAAK;AACpE,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,OAAO,mBAAoB,kBAAkB,SAAU;AAC7D,QAAM,UAAU;AAAA,IACd,CAAC,MAAoB;AACnB,UAAI,CAAC,iBAAkB,iBAAgB,CAAC;AACxC,qBAAe,CAAC;AAAA,IAClB;AAAA,IACA,CAAC,kBAAkB,YAAY;AAAA,EACjC;AACA,QAAM,iBAAiB,SAAS;AAChC,QAAM,oBAAoB;AAAA,IACxB,CAAC,WAAoB;AACnB,cAAQ,SAAS,aAAa,MAAM;AAAA,IACtC;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,eAAe,oBAAoB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WAAW,YAAY,MAAM;AACjC,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,YAAY,MAAM;AAClC,gBAAY,KAAK;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,YAAY,MAAM;AACnC,gBAAY,CAAC,SAAS,CAAC,IAAI;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,YAAY,MAAM;AACrC,QAAI,CAAC,aAAc;AACnB,YAAQ,UAAU;AAClB,gBAAY,KAAK;AACjB,QAAI,sBAAsB,iBAAiB;AACzC,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,mBAAmB,cAAc,OAAO,CAAC;AAE7C,QAAM,cAAc,YAAY,MAAM;AACpC,YAAQ,MAAM;AACd,gBAAY,KAAK;AACjB,kBAAc,IAAI;AAClB,QAAI,sBAAsB,iBAAiB;AACzC,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,mBAAmB,OAAO,CAAC;AAE/B,YAAU,MAAM;AACd,QAAI,sBAAsB,gBAAiB;AAC3C,QAAI,SAAS,QAAQ;AACnB,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,mBAAmB,IAAI,CAAC;AAE5B,QAAM,EAAE,SAAS,IAAI,yBAAyB;AAG9C,MAAI,OAAO,aAAa,aAAa;AACnC,aAAS,gBAAgB,aAAa,eAAe,MAAM;AAAA,EAC7D;AAGA,YAAU,MAAM;AACd,UAAM,8BAA8B,CAAC,UAAwB;AAC3D,YAAM,SAAS,MAAM;AACrB,UAAI,EAAE,kBAAkB,SAAU;AAClC,UAAI,CAAC,OAAO,QAAQ,uCAAuC,EAAG;AAC9D,YAAM,gBAAgB;AAAA,IACxB;AACA,WAAO,iBAAiB,eAAe,6BAA6B,IAAI;AACxE,WAAO,MAAM;AACX,aAAO,oBAAoB,eAAe,6BAA6B,IAAI;AAAA,IAC7E;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,aAAS,4BAA4B,EAAE,aAAa,MAAM,SAAS,CAAC;AACpE,WAAO,MAAM;AACX,eAAS,8BAA8B,EAAE,aAAa,MAAM,SAAS,CAAC;AAAA,IACxE;AAAA,EACF,GAAG,CAAC,UAAU,aAAa,QAAQ,CAAC;AAEpC,YAAU,MAAM;AACd,aAAS,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAAA,EAC5D,GAAG,CAAC,UAAU,MAAM,cAAc,CAAC;AAEnC,YAAU,MAAM;AACd,aAAS,cAAc,QAAQ;AAAA,EACjC,GAAG,CAAC,UAAU,QAAQ,CAAC;AAEvB,QAAM,eAAe,YAAY,YAAY;AAC3C,QAAI,CAAC,OAAQ;AACb,wBAAoB,IAAI;AACxB,QAAI;AACF,YAAM,UAAU;AAChB,YAAM,aAAa,qBAAqB,WAAW;AACnD,YAAM,WAAW,OAAOA,UAA4B;AAClD,cAAM,eAAoB,OAAO,KAAK,SAAS;AAC/C,YAAI,QAAa,aACd,OAAOA,UAAS,WAAW,uBAAuB,oBAAoB,EACtE,GAAG,gBAAgB,WAAW,EAC9B,GAAG,YAAY,OAAO,EACtB,IAAI,UAAU,UAAU,EACxB,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAE1C,YAAIA,UAAS,UAAU;AACrB,cAAI,sBAAsB,iBAAiB;AACzC,oBAAQ,MACL,GAAG,sBAAsB,eAAe,EACxC,GAAG,cAAc,aAAa,EAAE;AAAA,UACrC,OAAO;AACL,oBAAQ,MAAM,GAAG,2DAA2D;AAAA,UAC9E;AAAA,QACF,WAAW,sBAAsB,iBAAiB;AAChD,iBAAO,EAAE,MAAM,CAAC,GAAmB,OAAO,KAAK;AAAA,QACjD;AAEA,cAAMC,UAAS,MAAM;AACrB,YAAIA,QAAO,MAAO,QAAO,EAAE,MAAM,MAAM,OAAOA,QAAO,MAAM;AAC3D,cAAM,OAAQA,QAAO,QAAQ,CAAC;AAC9B,eAAO;AAAA,UACL,MAAMD,UAAS,WAAY,OAAmC,KAAK,IAAI,qBAAqB;AAAA,UAC5F,OAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,SAAS,MAAM,SAAS,UAAU;AACtC,UAAI,OAAO,SAAS,eAAe,YAAY,4BAA4B,OAAO,KAAK,GAAG;AACxF,gBAAQ,KAAK,oEAAoE;AACjF,6BAAqB,aAAa,QAAQ;AAC1C,iBAAS,MAAM,SAAS,QAAQ;AAAA,MAClC;AAEA,UAAI,OAAO,MAAO,OAAM,OAAO;AAC/B,iBAAW,OAAO,QAAQ,CAAC,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,cAAQ,MAAM,qCAAqC,GAAG;AAAA,IACxD,UAAE;AACA,0BAAoB,KAAK;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,mBAAmB,QAAQ,WAAW,aAAa,QAAQ,CAAC;AAEhE,YAAU,MAAM;AAAE,iBAAa;AAAA,EAAG,GAAG,CAAC,YAAY,CAAC;AAGnD,YAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,UAAU,OACb,QAAQ,eAAe,WAAW,EAAE,EACpC,GAAG,oBAA2B;AAAA,MAC7B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,mBAAmB,WAAW;AAAA,IACxC,GAAG,MAAM;AAAE,mBAAa;AAAA,IAAG,CAAC,EAC3B,UAAU;AACb,WAAO,MAAM;AAAE,aAAO,cAAc,OAAO;AAAA,IAAG;AAAA,EAChD,GAAG,CAAC,QAAQ,aAAa,YAAY,CAAC;AAGtC,QAAM,6BAA6B,YAAY,OAAO,aAAqB;AACzE,QAAI,CAAC,OAAQ;AACb,QAAI;AACF,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAEvD,YAAM,SAAS,MAAM,YAAY,SAAS,MAAM;AAAA,QAC9C,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO,OAAO,oBAAoB;AAAA,QAClC,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO;AAAA,QAChB,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,gBAAgB,CAAC,OAAO;AACtB,iBAAO,GAAG,UAAU,uCAAuC,MAAM;AAAA,QACnE;AAAA,MACF,CAAC;AACD,YAAM,OAAO,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AACxD,eAAO,OAAO,CAAC,MAAO,IAAI,QAAQ,CAAC,IAAI,OAAO,IAAI,MAAM,eAAe,CAAC,GAAI,cAAc,GAAG;AAAA,MAC/F,CAAC;AACD,YAAM,iBAAiB,MAAM,qBAAqB,QAAQ,MAAM,WAAW;AAC3E,YAAM,OAAO,KAAK,SAAS,EAAE,OAAO,EAAE,iBAAiB,eAAe,CAAC,EAAE,GAAG,MAAM,QAAQ;AAE1F,kBAAY,IAAI;AAChB,iBAAW,MAAM,YAAY,KAAK,GAAG,GAAG;AAExC,cAAQ,IAAI,+CAA+C,QAAQ;AAAA,IACrE,SAAS,KAAK;AACZ,cAAQ,MAAM,oCAAoC,GAAG;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,QAAQ,WAAW,CAAC;AAExB,QAAM,yBAAyB,YAAY,YAAY;AACrD,QAAI,CAAC,gBAAiB;AACtB,gBAAY,KAAK;AACjB,2BAAuB,IAAI;AAC3B,QAAI;AACF,YAAM,SAAS,MAAM,YAAY,SAAS,MAAM;AAAA,QAC9C,SAAS;AAAA,QACT,OAAO,OAAO;AAAA,QACd,SAAS;AAAA,QACT,gBAAgB,CAAC,OACf,GAAG,UAAU,uCAAuC,MAAM;AAAA,MAC9D,CAAC;AACD,YAAM,UAAU,OAAO,UAAU,cAAc,GAAG;AAClD,2BAAqB,OAAO;AAAA,IAC9B,SAAS,KAAK;AACZ,cAAQ,MAAM,uCAAuC,GAAG;AAAA,IAC1D,UAAE;AACA,6BAAuB,KAAK;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,eAAe;AAAA,IACnB,OAAO,MAAc,eAAsC;AACzD,UAAI,CAAC,cAAc,CAAC,OAAQ;AAC5B,UAAI,CAAC,WAAY,OAAM,IAAI,MAAM,cAAc,6DAA6D;AAC5G,YAAM,gBAAgB,yBAAyB;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,eAAe,OAAO,YAAqC,OAC9D,KAAK,SAAS,EACd,OAAO,OAAO,EACd,OAAO,EACP,OAAO;AAEV,UAAI,EAAE,MAAM,QAAQ,OAAO,UAAU,IAAI,MAAM;AAAA,QAC7C,qBAAqB,WAAW,MAAM,WAAW,4BAA4B,aAAa,IAAI;AAAA,MAChG;AACA,UAAI,aAAa,qBAAqB,WAAW,MAAM,YAAY,4BAA4B,SAAS,GAAG;AACzG,YAAI,WAAW,sBAAsB,iBAAiB;AACpD,gBAAM,IAAI,MAAM,wHAAwH;AAAA,QAC1I;AACA,gBAAQ,KAAK,gEAAgE;AAC7E,6BAAqB,aAAa,QAAQ;AAC1C,SAAC,EAAE,MAAM,QAAQ,OAAO,UAAU,IAAI,MAAM,aAAa,4BAA4B,aAAa,CAAC;AAAA,MACrG;AACA,UAAI,UAAW,OAAM;AAErB,YAAM,EAAE,OAAO,WAAW,IAAI,MAAM,OAAO,KAAK,iBAAiB,EAAE,OAAO;AAAA,QACxE,WAAW,OAAO;AAAA,QAClB,WAAW,UAAU;AAAA,QACrB;AAAA,QACA;AAAA,QACA,gBAAgB,aAAa;AAAA,QAC7B,eAAe,mBAAmB;AAAA,MACpC,CAAC;AACD,UAAI,WAAY,OAAM;AAEtB,oBAAc,IAAI;AAClB,UAAI,WAAW,sBAAsB,iBAAiB;AACpD,gBAAQ,MAAM;AAAA,MAChB;AACA,YAAM,aAAa;AAEnB,eAAS,yBAAyB,EAAE,qBAAqB,UAAU,OAAO,GAAG,CAAC;AAE9E,UAAI,qBAAqB;AACvB,mCAA2B,OAAO,EAAE;AAAA,MACtC;AAAA,IACF;AAAA,IACA,CAAC,YAAY,QAAQ,YAAY,YAAY,aAAa,QAAQ,WAAW,iBAAiB,cAAc,qBAAqB,4BAA4B,OAAO;AAAA,EACtK;AAEA,QAAM,yBAAyB;AAAA,IAC7B,OAAO,MAAc,eAAsC;AACzD,UAAI,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,OAAQ;AAC5D,UAAI,CAAC,WAAY,OAAM,IAAI,MAAM,cAAc,6DAA6D;AAC5G,YAAM,EAAE,GAAG,GAAG,QAAQ,IAAI;AAE1B,YAAM,gBAAgB,MAAM,iBAAiB,QAAQ,mBAAmB,WAAW;AAEnF,YAAM,gBAAyC;AAAA,QAC7C,cAAc;AAAA,QACd,YAAY,UAAU;AAAA,QACtB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,oBAAoB;AAAA,QACpB,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,cAAc;AAAA,QACd,aAAa;AAAA,QACb,YAAY,sBAAsB,kBAAkB,YAAY;AAAA,QAChE,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,gBAAgB,OAAO;AAAA,QACvB,iBAAiB,OAAO;AAAA,QACxB,iBAAiB;AAAA,QACjB;AAAA,QACA,gBAAgB,aAAa;AAAA,QAC7B,eAAe,mBAAmB;AAAA,MACpC;AAEA,YAAM,eAAe,OAAO,YAAqC,OAC9D,KAAK,SAAS,EACd,OAAO,OAAO,EACd,OAAO,EACP,OAAO;AAEV,UAAI,EAAE,MAAM,QAAQ,OAAO,UAAU,IAAI,MAAM;AAAA,QAC7C,qBAAqB,WAAW,MAAM,WAAW,4BAA4B,aAAa,IAAI;AAAA,MAChG;AACA,UAAI,aAAa,qBAAqB,WAAW,MAAM,YAAY,4BAA4B,SAAS,GAAG;AACzG,YAAI,sBAAsB,iBAAiB;AACzC,gBAAM,IAAI,MAAM,wHAAwH;AAAA,QAC1I;AACA,gBAAQ,KAAK,2EAA2E;AACxF,6BAAqB,aAAa,QAAQ;AAC1C,SAAC,EAAE,MAAM,QAAQ,OAAO,UAAU,IAAI,MAAM,aAAa,4BAA4B,aAAa,CAAC;AAAA,MACrG;AACA,UAAI,UAAW,OAAM;AAErB,YAAM,EAAE,OAAO,WAAW,IAAI,MAAM,OAAO,KAAK,iBAAiB,EAAE,OAAO;AAAA,QACxE,WAAW,OAAO;AAAA,QAClB,WAAW,UAAU;AAAA,QACrB;AAAA,QACA;AAAA,QACA,gBAAgB,aAAa;AAAA,QAC7B,eAAe,mBAAmB;AAAA,MACpC,CAAC;AACD,UAAI,WAAY,OAAM;AAEtB,8BAAwB,IAAI;AAC5B,2BAAqB,IAAI;AACzB,YAAM,aAAa;AAAA,IACrB;AAAA,IACA,CAAC,sBAAsB,mBAAmB,QAAQ,YAAY,YAAY,aAAa,QAAQ,WAAW,iBAAiB,cAAc,mBAAmB,SAAS;AAAA,EACvK;AAGA,MAAI,CAAC,QAAQ;AACX,WAAO,gCAAG,UAAS;AAAA,EACrB;AAEA,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,MAClB;AAAA,MAEC;AAAA;AAAA,QACA,YACC,iCACE;AAAA,8BAAC,WAAO,qFAA0E;AAAA,UAClF;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,QAAQ,EAAE;AAAA,gBACV,WAAW;AAAA,cACb;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEO,SAAS,cAAc;AAC5B,QAAM,MAAM,WAAW,eAAe;AACtC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oDAAoD;AAC9E,SAAO;AACT;AAKO,SAAS,kBAAkB;AAChC,SAAO,WAAW,eAAe;AACnC;;;AGxoCA,SAAS,eAAAE,cAAa,aAAAC,YAAW,WAAAC,UAAS,YAAAC,iBAAgB;AAC1D,SAAS,oBAAoB;;;ACC7B,IAAM,uBAAuB,oBAAI,QAAwE;AAElG,SAAS,aAAa,OAAe;AAC1C,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AACzC;AAEO,SAAS,qBAAqB,MAAc,MAAc;AAC/D,QAAM,MAAM,SAAS;AACrB,QAAM,OAAQ,OAAO,MAAO,IAAI,cAAc,OAAO;AACrD,QAAM,MAAO,OAAO,MAAO,IAAI,eAAe,OAAO;AACrD,SAAO,EAAE,MAAM,IAAI;AACrB;AAEO,SAAS,wBAAwB,WAAwB;AAC9D,SAAO;AAAA,IACL,OAAO,KAAK,IAAI,UAAU,aAAa,CAAC;AAAA,IACxC,QAAQ,KAAK,IAAI,UAAU,cAAc,CAAC;AAAA,EAC5C;AACF;AAEO,SAAS,2BAA2B,WAAwB,MAAc,MAAc;AAC7F,QAAM,OAAO,UAAU,sBAAsB;AAC7C,QAAM,EAAE,OAAO,OAAO,IAAI,wBAAwB,SAAS;AAE3D,SAAO;AAAA,IACL,MAAM,KAAK,OAAQ,OAAO,MAAO,QAAQ,UAAU;AAAA,IACnD,KAAK,KAAK,MAAO,OAAO,MAAO,SAAS,UAAU;AAAA,EACpD;AACF;AAEO,SAAS,wBAAwB,SAAkB;AACxD,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,SAAO;AAAA,IACL,MAAM,KAAK,OAAO,KAAK,QAAQ;AAAA,IAC/B,KAAK,KAAK,MAAM,KAAK,SAAS;AAAA,EAChC;AACF;AAEO,SAAS,yBAAyB,WAAwB,SAAkB;AACjF,QAAM,gBAAgB,UAAU,sBAAsB;AACtD,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,SAAO;AAAA,IACL,MAAM,KAAK,OAAO,cAAc,OAAO,UAAU,aAAa,KAAK,QAAQ;AAAA,IAC3E,KAAK,KAAK,MAAM,cAAc,MAAM,UAAU,YAAY,KAAK,SAAS;AAAA,EAC1E;AACF;AAEO,SAAS,0BAA0B,WAAwB,MAAc,MAAc;AAC5F,QAAM,EAAE,OAAO,OAAO,IAAI,wBAAwB,SAAS;AAC3D,SAAO;AAAA,IACL,MAAO,OAAO,MAAO;AAAA,IACrB,KAAM,OAAO,MAAO;AAAA,EACtB;AACF;AAEO,SAAS,0BAA0B,WAAwB;AAChE,QAAM,WAAW,OAAO,iBAAiB,SAAS;AAClD,MAAI,SAAS,aAAa,UAAU;AAClC,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAEA,QAAM,WAAW,qBAAqB,IAAI,SAAS;AACnD,MAAI,UAAU;AACZ,aAAS,SAAS;AAClB,WAAO,MAAM;AACX,eAAS,SAAS;AAClB,UAAI,SAAS,UAAU,GAAG;AACxB,kBAAU,MAAM,WAAW,SAAS;AACpC,6BAAqB,OAAO,SAAS;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,IACP,wBAAwB,UAAU,MAAM;AAAA,EAC1C;AACA,uBAAqB,IAAI,WAAW,KAAK;AACzC,YAAU,MAAM,WAAW;AAE3B,SAAO,MAAM;AACX,UAAM,SAAS;AACf,QAAI,MAAM,UAAU,GAAG;AACrB,gBAAU,MAAM,WAAW,MAAM;AACjC,2BAAqB,OAAO,SAAS;AAAA,IACvC;AAAA,EACF;AACF;;;AD6EI,gBAAAC,YAAA;AAhKJ,SAAS,cAAc,IAAqB;AAC1C,MAAI,MAAM,GAAG,QAAQ,YAAY;AACjC,MAAI,GAAG,aAAa,OAAO,GAAG,cAAc,UAAU;AACpD,UAAM,UAAU,GAAG,UAAU,KAAK,EAAE,MAAM,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACrE,QAAI,QAAS,QAAO,IAAI,OAAO;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAe;AAC1C,MAAI,OAAO,QAAQ,eAAe,OAAO,IAAI,WAAW,YAAY;AAClE,WAAO,IAAI,OAAO,KAAK;AAAA,EACzB;AACA,SAAO,MAAM,QAAQ,UAAU,MAAM;AACvC;AAEA,SAAS,yBAAyB,IAA4B;AAC5D,MAAI,EAAE,cAAc,aAAc,QAAO;AACzC,MAAI,GAAG,GAAI,QAAO,IAAI,oBAAoB,GAAG,EAAE,CAAC;AAEhD,QAAM,aAAa,CAAC,eAAe,WAAW,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,aAAa,IAAI,CAAC;AAC7F,MAAI,YAAY;AACd,WAAO,IAAI,UAAU,KAAK,oBAAoB,GAAG,aAAa,UAAU,KAAK,EAAE,CAAC;AAAA,EAClF;AAEA,QAAM,WAAqB,CAAC;AAC5B,MAAI,UAA8B;AAElC,SAAO,WAAW,YAAY,SAAS,QAAQ,SAAS,SAAS,GAAG;AAClE,QAAI,UAAU,QAAQ,QAAQ,YAAY;AAE1C,QAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,iBAAW,IAAI,oBAAoB,QAAQ,UAAU,CAAC,CAAC,CAAC;AACxD,eAAS,QAAQ,OAAO;AACxB,gBAAU,QAAQ;AAClB;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ;AACvB,QAAI,CAAC,OAAQ;AACb,UAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,EAAE,OAAO,CAAC,UAAU,MAAM,YAAY,QAAS,OAAO;AACjG,UAAM,eAAe,SAAS,QAAQ,OAAO,IAAI;AACjD,eAAW,gBAAgB,YAAY;AACvC,aAAS,QAAQ,OAAO;AACxB,cAAU;AAAA,EACZ;AAEA,SAAO,SAAS,SAAS,IAAI,SAAS,KAAK,KAAK,IAAI;AACtD;AAMO,SAAS,kBAAkB;AAChC,QAAM,MAAM,gBAAgB;AAC5B,QAAM,CAAC,kBAAkB,mBAAmB,IAAIC,UAAS,CAAC;AAC1D,QAAM,kBAAkB,KAAK;AAC7B,QAAM,YAAY,iBAAiB,IAAI,WAAW;AAElD,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,UAAM,kBAAkB,0BAA0B,SAAS;AAC3D,UAAM,iBAAiB,IAAI,eAAe,MAAM,oBAAoB,CAAC,UAAU,QAAQ,CAAC,CAAC;AACzF,mBAAe,QAAQ,SAAS;AAEhC,UAAM,WAAW,MAAM,oBAAoB,CAAC,UAAU,QAAQ,CAAC;AAC/D,cAAU,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAEhE,WAAO,MAAM;AACX,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,qBAAe,WAAW;AAC1B,sBAAgB;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,sBAAsBC,SAAQ,MAAM;AACxC,QAAI,CAAC,UAAW,QAAO;AACvB,UAAM,EAAE,OAAO,OAAO,IAAI,wBAAwB,SAAS;AAC3D,WAAO;AAAA,MACL,UAAU;AAAA,MACV,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ,EAAE;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,WAAW,gBAAgB,CAAC;AAEhC,QAAM,cAAcC;AAAA,IAClB,CAAC,MAAwC;AACvC,UAAI,CAAC,IAAK;AACV,YAAM,EAAE,MAAM,eAAe,cAAc,IAAI;AAC/C,UAAI,SAAS,WAAY;AACzB,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAElB,YAAMC,WAAU,EAAE;AAElB,MAAAA,SAAQ,MAAM,gBAAgB;AAC9B,UAAI,KAAqB;AACzB,UAAI;AACF,aAAK,SAAS,iBAAiB,EAAE,SAAS,EAAE,OAAO;AAAA,MACrD,UAAE;AACA,QAAAA,SAAQ,MAAM,gBAAgB;AAAA,MAChC;AAEA,UAAI,CAAC,MAAM,OAAOA,SAAS;AAE3B,YAAM,SAAS,gBAAgB,EAAE,KAAK;AACtC,YAAM,WAAW,QAAQ,YAAY,yBAAyB,EAAE;AAChE,UAAI,IAAI;AACR,UAAI,IAAI;AACR,UAAI,kBAA4C;AAChD,UAAI,eAA8B;AAElC,UAAI,iBAAiB,IAAI,SAAS;AAChC,cAAM,cAAc,gBAAgB,IAAI;AACxC,cAAM,EAAE,OAAO,OAAO,IAAI,wBAAwB,WAAW;AAC7D,cAAM,OAAOA,SAAQ,sBAAsB;AAC3C,cAAM,SAAS,EAAE,UAAU,KAAK;AAChC,cAAM,SAAS,EAAE,UAAU,KAAK;AAChC,YAAI,aAAc,SAAS,QAAS,GAAG;AACvC,YAAI,aAAc,SAAS,SAAU,GAAG;AACxC,0BAAkB;AAClB,uBAAe,gBAAgB;AAAA,MACjC,OAAO;AACL,cAAM,MAAM,SAAS;AACrB,cAAM,KAAK,KAAK,IAAI,IAAI,aAAa,CAAC;AACtC,cAAM,KAAK,KAAK,IAAI,IAAI,cAAc,CAAC;AACvC,cAAM,KAAK,EAAE,UAAU,OAAO;AAC9B,cAAM,KAAK,EAAE,UAAU,OAAO;AAC9B,YAAI,aAAc,KAAK,KAAM,GAAG;AAChC,YAAI,aAAc,KAAK,KAAM,GAAG;AAAA,MAClC;AAEA,YAAM,eAAe,GAAG,eAAe,IAAI,KAAK,EAAE,MAAM,GAAG,GAAG;AAC9D,YAAM,aAAa,cAAc,EAAE;AAEnC,oBAAc;AAAA,QACZ,mBAAmB;AAAA,QACnB,WAAW,QAAQ,OAAO;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,OAAO,SAAS;AAAA,QACzB,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,IACA,CAAC,KAAK,eAAe;AAAA,EACvB;AAEA,MAAI,CAAC,OAAO,IAAI,SAAS,WAAY,QAAO;AAE5C,QAAM,UACJ,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACC,gCAA6B;AAAA,MAC7B,sBAAsB,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAC/C,WAAW,YAAY,KAAK;AAAA,MAC5B,OAAO,YAAY,uBAAuB,SAAY,EAAE,YAAY,eAAe,QAAQ,EAAE,QAAQ;AAAA,MACrG,SAAS;AAAA;AAAA,EACX;AAGF,MAAI,WAAW;AACb,WAAO,aAAa,SAAS,SAAS;AAAA,EACxC;AAEA,SAAO;AACT;;;AEpLA,SAAS,aAAAM,YAAW,YAAAC,WAAU,eAAAC,cAAa,UAAAC,SAAQ,iBAAiB,WAAAC,gBAAe;AACnF,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,cAAc;;;ACFvB,SAAS,eAAAC,cAAa,cAAc;AAEpC,IAAM,UAAU,oBAAI,IAAyB;AAC7C,IAAMC,aAAY,oBAAI,IAAgB;AAEtC,SAAS,aAAa;AACpB,EAAAA,WAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAC5C;AAEO,SAAS,oBAAoB,WAAsC;AACxE,MAAI,CAAC,UAAW,QAAO;AACvB,SAAO,QAAQ,IAAI,SAAS,KAAK;AACnC;AAEO,SAAS,wBAAwB,UAAsB;AAC5D,EAAAA,WAAU,IAAI,QAAQ;AACtB,SAAO,MAAM;AACX,IAAAA,WAAU,OAAO,QAAQ;AAAA,EAC3B;AACF;AAEO,SAAS,kBAAkB,WAAmB;AACnD,QAAM,iBAAiB,OAA2B,IAAI;AAEtD,SAAOD,aAAY,CAAC,SAA6B;AAC/C,UAAM,cAAc,eAAe;AAEnC,QAAI,eAAe,gBAAgB,QAAQ,QAAQ,IAAI,SAAS,MAAM,aAAa;AACjF,cAAQ,OAAO,SAAS;AACxB,iBAAW;AAAA,IACb;AAEA,mBAAe,UAAU;AAEzB,QAAI,QAAQ,QAAQ,IAAI,SAAS,MAAM,MAAM;AAC3C,cAAQ,IAAI,WAAW,IAAI;AAC3B,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAChB;;;AD0CU,SAqON,YAAAE,WArOM,OAAAC,MA0PA,QAAAC,aA1PA;AAjEV,IAAM,gBAA8B,CAAC;AAarC,SAAS,gBAAgB,UAAyB;AAChD,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI;AACF,WAAO,SAAS,cAAc,QAAQ;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,MAAqB,MAAqB;AACnE,SACE,KAAK,WAAW,KAAK,UACrB,KAAK;AAAA,IAAM,CAAC,KAAK,UACf,IAAI,aAAa,KAAK,KAAK,EAAE,YAC7B,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK,MAAM,KAAK,KAAK,EAAE,GAAG,KAClD,KAAK,MAAM,IAAI,IAAI,MAAM,KAAK,MAAM,KAAK,KAAK,EAAE,IAAI;AAAA,EACtD;AAEJ;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MAEC,gCAA6B;AAAA,MAC7B,WAAW,GAAG,gBAAgB,aAAa,OAAO;AAAA,MAClD,OAAO,EAAE,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,EAAE,KAAK;AAAA,MAEhE,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAW,6IACT,IAAI,eACA,0DACA,oCACN,IAAI,gBAAgB,mDAAmD,EAAE;AAAA,UACzE,OACE,IAAI,eACA,WAAW,IAAI,KAAK,0CACpB,WAAW,IAAI,KAAK;AAAA,UAGzB,cAAI,eACH,gBAAAA,KAAC,UAAO,WAAU,WAAU,IAE5B,IAAI;AAAA;AAAA,MAER;AAAA;AAAA,IAvBK,IAAI;AAAA,EAwBX;AAEJ;AAKO,SAAS,aAAa;AAC3B,QAAM,MAAM,gBAAgB;AAC5B,QAAM,CAAC,mBAAmB,oBAAoB,IAAIE,UAAwB,CAAC,CAAC;AAC5E,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAwB,CAAC,CAAC;AAC9E,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,CAAC;AAC1D,QAAM,SAASC,QAAe;AAC9B,QAAM,EAAE,OAAO,IAAI,yBAAyB;AAC5C,QAAM,CAAC,qBAAqB,sBAAsB,IAAID,UAAwB,IAAI;AAClF,QAAM,sBAAsBC,QAAsC;AAClE,QAAM,qBAAqBA,QAAsB,IAAI;AACrD,QAAM,kBAAkBA,QAAiD,MAAM,QAAQ,QAAQ,IAAI,CAAC;AACpG,QAAM,CAAC,mBAAmB,oBAAoB,IAAID,UAIxC,IAAI;AACd,QAAM,iBAAiBC,QAAyD,CAAC,CAAC;AAElF,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,SAAS,KAAK;AACpB,QAAM,gBAAgB,KAAK,SAAS,QAAQ,QAAQ,EAAE,KAAK,OAAO,SAAS;AAC3E,QAAM,kBAAkB,KAAK;AAC7B,QAAM,YAAY,iBAAiB,IAAI,WAAW;AAElD,QAAM,eAAeC,aAAY,OAAO,SAAyC;AAC/E,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,cAAc,KAAK,SAAS,6BAA6B,IAC3D,KAAK,MAAM,6BAA6B,EAAE,CAAC,IAC3C,KAAK,WAAW,MAAM,IAAI,OAAO;AACrC,QAAI,CAAC,YAAa,QAAO;AAEzB,UAAM,SAAS,eAAe,QAAQ,WAAW;AACjD,QAAI,UAAU,OAAO,UAAU,KAAK,IAAI,EAAG,QAAO,OAAO;AAEzD,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,QAClC,KAAK,aAAa,EAClB,gBAAgB,aAAa,IAAI;AACpC,QAAI,SAAS,CAAC,KAAM,QAAO;AAC3B,mBAAe,QAAQ,WAAW,IAAI,EAAE,KAAK,KAAK,WAAW,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK,IAAK;AAClG,WAAO,KAAK;AAAA,EACd,GAAG,CAAC,MAAM,CAAC;AACX,kBAAgB,UAAU;AAE1B,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,UAAM,kBAAkB,0BAA0B,SAAS;AAC3D,UAAM,iBAAiB,IAAI,eAAe,MAAM,oBAAoB,CAAC,UAAU,QAAQ,CAAC,CAAC;AACzF,mBAAe,QAAQ,SAAS;AAChC,WAAO,MAAM;AACX,qBAAe,WAAW;AAC1B,sBAAgB;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,EAAAA,WAAU,MAAM,wBAAwB,MAAM;AAC5C,wBAAoB,CAAC,UAAU,QAAQ,CAAC;AAAA,EAC1C,CAAC,GAAG,CAAC,CAAC;AAGN,EAAAA,WAAU,MAAM;AACd,UAAM,WAAW,IAAI,gBAAgB,MAAM,EAAE,IAAI,kBAAkB;AACnE,QAAI,CAAC,YAAY,QAAQ,WAAW,EAAG;AACvC,QAAI,mBAAmB,YAAY,SAAU;AAE7C,UAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACpD,QAAI,CAAC,OAAQ;AAEb,uBAAmB,UAAU;AAE7B,UAAM,SAAS,IAAI,gBAAgB,MAAM;AACzC,WAAO,OAAO,kBAAkB;AAChC,UAAM,OAAO,GAAG,OAAO,SAAS,QAAQ,GAAG,OAAO,SAAS,IAAI,IAAI,MAAM,KAAK,EAAE,GAAG,OAAO,SAAS,IAAI;AACvG,WAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI;AAExC,2BAAuB,QAAQ;AAE/B,QAAI,OAAO,gBAAgB,gBAAgB,OAAO,mBAAmB,OAAO,cAAc,QAAQ,OAAO,cAAc,MAAM;AAC3H,sBAAgB,QAAQ,OAAO,eAAe,EAAE,KAAK,CAAC,QAAQ;AAC5D,YAAI,KAAK;AACP,+BAAqB;AAAA,YACnB;AAAA,YACA,GAAG,OAAO;AAAA,YACV,GAAG,OAAO;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAEA,wBAAoB,UAAU,WAAW,MAAM;AAC7C,6BAAuB,IAAI;AAAA,IAC7B,GAAG,GAAI;AAEP,WAAO,MAAM;AACX,UAAI,oBAAoB,QAAS,cAAa,oBAAoB,OAAO;AAAA,IAC3E;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,QAAM,cAAcD,aAAY,MAAM;AACpC,UAAM,mBAAkC,CAAC;AACzC,UAAM,oBAAmC,CAAC;AAE1C,YAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,YAAM,eAAe,OAAO,gBAAgB;AAC5C,YAAM,IAAI,OAAO,cAAc;AAC/B,YAAM,IAAI,OAAO,cAAc;AAC/B,YAAM,MAAmB;AAAA,QACvB,UAAU,OAAO;AAAA,QACjB,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,gBAAgB,OAAO;AAAA,QACvB,aAAa,OAAO;AAAA,QACpB,aAAa,OAAO;AAAA,MACtB;AAEA,UAAI,CAAC,gBAAgB,OAAO,qBAAqB,aAAa;AAC5D,YAAI,CAAC,aAAa,CAAC,OAAO,iBAAiB,OAAO,kBAAkB,iBAAiB,KAAK;AACxF;AAAA,QACF;AAEA,cAAME,iBAAgB,oBAAoB,OAAO,UAAU,KAAK,gBAAgB,OAAO,QAAQ;AAC/F,cAAMC,YAAWD,iBACb,yBAAyB,WAAWA,cAAa,IACjD,0BAA0B,WAAW,GAAG,CAAC;AAE7C,YAAI,OAAOC,UAAS;AACpB,YAAI,MAAMA,UAAS;AACnB,0BAAkB,KAAK,GAAG;AAC1B;AAAA,MACF;AAEA,YAAM,gBAAgB,CAAC,eACnB,oBAAoB,OAAO,UAAU,KAAK,gBAAgB,OAAO,QAAQ,IACzE;AACJ,YAAM,WAAW,gBACb,wBAAwB,aAAa,IACrC,qBAAqB,GAAG,CAAC;AAE7B,UAAI,OAAO,SAAS;AACpB,UAAI,MAAM,SAAS;AACnB,uBAAiB,KAAK,GAAG;AAAA,IAC3B,CAAC;AAED,yBAAqB,CAAC,SAAS,kBAAkB,MAAM,gBAAgB,IAAI,OAAO,gBAAgB;AAClG,0BAAsB,CAAC,SAAS,kBAAkB,MAAM,iBAAiB,IAAI,OAAO,iBAAiB;AAAA,EACvG,GAAG,CAAC,WAAW,iBAAiB,KAAK,OAAO,CAAC;AAE7C,QAAM,sBAAsBH,aAAY,MAAM;AAC5C,QAAI,OAAO,QAAS,sBAAqB,OAAO,OAAO;AACvD,WAAO,UAAU,sBAAsB,WAAW;AAAA,EACpD,GAAG,CAAC,WAAW,CAAC;AAEhB,kBAAgB,MAAM;AACpB,gBAAY;AAAA,EACd,GAAG,CAAC,aAAa,gBAAgB,CAAC;AAElC,EAAAC,WAAU,MAAM;AACd,WAAO,iBAAiB,UAAU,qBAAqB,IAAI;AAC3D,WAAO,iBAAiB,UAAU,mBAAmB;AACrD,WAAO,iBAAiB,QAAQ,mBAAmB;AACnD,eAAW,iBAAiB,UAAU,qBAAqB,EAAE,SAAS,KAAK,CAAC;AAE5E,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,qBAAqB,IAAI;AAC9D,aAAO,oBAAoB,UAAU,mBAAmB;AACxD,aAAO,oBAAoB,QAAQ,mBAAmB;AACtD,iBAAW,oBAAoB,UAAU,mBAAmB;AAC5D,UAAI,OAAO,QAAS,sBAAqB,OAAO,OAAO;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,WAAW,mBAAmB,CAAC;AAEnC,QAAM,iBAAiBD,aAAY,CAAC,QAAqB;AACvD,QAAI,IAAI,gBAAgB,IAAI,kBAAkB,IAAI,eAAe,QAAQ,IAAI,eAAe,MAAM;AAChG,mBAAa,IAAI,cAAc,EAAE,KAAK,CAAC,cAAc;AACnD,YAAI,WAAW;AACb,+BAAqB,EAAE,KAAK,WAAW,GAAG,IAAI,aAAc,GAAG,IAAI,YAAa,CAAC;AAAA,QACnF;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,WAAO,KAAK,GAAG,aAAa,YAAY,IAAI,QAAQ,IAAI,UAAU,qBAAqB;AAAA,EACzF,GAAG,CAAC,cAAc,aAAa,CAAC;AAEhC,QAAM,iBAAiBI,SAAQ,MAAM;AACnC,QAAI,CAAC,aAAa,mBAAmB,WAAW,EAAG,QAAO;AAC1D,UAAM,EAAE,OAAO,OAAO,IAAI,wBAAwB,SAAS;AAC3D,WAAOC;AAAA,MACL,gBAAAT;AAAA,QAAC;AAAA;AAAA,UACC,gCAA6B;AAAA,UAC7B,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA,eAAe;AAAA,YACf,QAAQ,EAAE;AAAA,UACZ;AAAA,UAEC,6BAAmB,IAAI,CAAC,QACvB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,eAAe,IAAI,aAAa;AAAA,cAChC,SAAS,MAAM,eAAe,GAAG;AAAA,cACjC,eAAa;AAAA;AAAA,YAJR,IAAI;AAAA,UAKX,CACD;AAAA;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,oBAAoB,gBAAgB,qBAAqB,gBAAgB,CAAC;AAEzF,MAAI,CAAC,OAAQ,kBAAkB,WAAW,KAAK,mBAAmB,WAAW,KAAK,CAAC,kBAAoB,QAAO;AAE9G,SACE,gBAAAC,MAAAF,WAAA,EACG;AAAA,sBAAkB,IAAI,CAAC,QACtB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA,eAAe,IAAI,aAAa;AAAA,QAChC,SAAS,MAAM,eAAe,GAAG;AAAA,QACjC,eAAe;AAAA;AAAA,MAJV,IAAI;AAAA,IAKX,CACD;AAAA,IAEA;AAAA,IAEA,qBACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,gCAA6B;AAAA,QAC7B,sBAAsB,CAAC,MAAM,EAAE,gBAAgB;AAAA,QAC/C,WAAU;AAAA,QACV,OAAO,EAAE,QAAQ,EAAE,gBAAgB;AAAA,QACnC,SAAS,MAAM,qBAAqB,IAAI;AAAA,QAExC,0BAAAC,MAAC,SAAI,WAAU,4EAA2E,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAC1H;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,kBAAkB;AAAA,cACvB,KAAI;AAAA,cACJ,WAAU;AAAA,cACV,WAAW;AAAA;AAAA,UACb;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,MAAM,GAAG,kBAAkB,CAAC;AAAA,gBAC5B,KAAK,GAAG,kBAAkB,CAAC;AAAA,gBAC3B,WAAW;AAAA,cACb;AAAA,cAEA,0BAAAA,KAAC,SAAI,WAAU,iKAAgK,oBAE/K;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,qBAAqB,IAAI;AAAA,cACxC,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;AEzWA,SAAS,eAAAU,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AA8B5D,gBAAAC,MA4KI,QAAAC,aA5KJ;AAlBN,IAAMC,iBAA8B,CAAC;AAErC,SAASC,WAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,MAAM,OAAO,IAAI,KAAK,MAAM,IAAI,QAAQ,EAAE,KAAK;AAAA,MAExD,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA,WAAU;AAAA,UACV,OAAO,WAAW,KAAK;AAAA,UAEtB;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,uBAAuB;AACrC,QAAM,MAAM,gBAAgB;AAC5B,QAAM,YAAYI,QAAiC,IAAI;AACvD,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAwB,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;AACrG,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAwB,IAAI;AAEhE,QAAM,OAAO,KAAK,cAAc;AAChC,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,UAAU,KAAK,WAAWH;AAChC,QAAM,gBAAgB,KAAK,SAAS,QAAQ,QAAQ,EAAE,KAAK,OAAO,SAAS;AAE3E,QAAM,gBAAgBI,aAAY,MAAM;AACtC,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AAEb,QAAI;AACF,YAAM,MAAM,OAAO;AACnB,YAAM,MAAM,OAAO;AACnB,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;AAC1B,sBAAc,KAAK;AACnB;AAAA,MACF;AAEA,iBAAW;AAAA,QACT,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAAA,QACpC,QAAQ,KAAK,IAAI,MAAM,cAAc,CAAC;AAAA,QACtC,SAAS,IAAI;AAAA,QACb,SAAS,IAAI;AAAA,MACf,CAAC;AACD,oBAAc,IAAI;AAClB,oBAAc,IAAI;AAAA,IACpB,QAAQ;AACN,oBAAc,KAAK;AACnB,oBAAc,uDAAuD;AAAA,IACvE;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,QAAI,CAAC,WAAW;AACd,oBAAc,KAAK;AACnB,oBAAc,mCAAmC;AACjD;AAAA,IACF;AAEA,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AAEb,QAAI;AACJ,QAAI;AAEJ,UAAM,UAAU,MAAM;AACpB,oBAAc;AAEd,UAAI;AACF,cAAM,MAAM,OAAO;AACnB,cAAM,MAAM,OAAO;AACnB,cAAM,QAAQ,KAAK;AACnB,YAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;AAC1B,wBAAc,sCAAsC;AACpD;AAAA,QACF;AAEA,cAAM,eAAe,MAAM,cAAc;AACzC,YAAI,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;AAC9D,eAAO,iBAAiB,UAAU,aAAa;AAC/C,gCAAwB,MAAM;AAC5B,cAAI,oBAAoB,UAAU,YAAY;AAC9C,iBAAO,oBAAoB,UAAU,aAAa;AAAA,QACpD;AAEA,cAAM,iBAAiB,IAAI,eAAe,MAAM,cAAc,CAAC;AAC/D,uBAAe,QAAQ,KAAK;AAC5B,YAAI,IAAI,KAAM,gBAAe,QAAQ,IAAI,IAAI;AAC7C,gCAAwB,MAAM,eAAe,WAAW;AAAA,MAC1D,QAAQ;AACN,sBAAc,KAAK;AACnB,sBAAc,uDAAuD;AAAA,MACvE;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,QAAQ;AAEjC,WAAO,iBAAiB,QAAQ,UAAU;AAC1C,QAAI,OAAO,iBAAiB,eAAe,YAAY;AACrD,cAAQ;AAAA,IACV;AAEA,WAAO,MAAM;AACX,aAAO,oBAAoB,QAAQ,UAAU;AAC7C,8BAAwB;AACxB,8BAAwB;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,MAAM,WAAW,aAAa,CAAC;AAEnC,QAAM,cAAcD,aAAY,MAAM;AACpC,QAAI,CAAC,IAAK;AACV,QAAI,cAAc,IAAI;AACtB,QAAI,cAAc,KAAK;AACvB,QAAI,QAAQ,MAAM;AAAA,EACpB,GAAG,CAAC,GAAG,CAAC;AAER,QAAM,qBAAqBA,aAAY,CAAC,UAA4C;AAClF,QAAI,CAAC,OAAO,SAAS,WAAY;AACjC,QAAI,CAAC,aAAa,CAAC,cAAc,WAAY;AAE7C,UAAM,OAAO,MAAM,cAAc,sBAAsB;AACvD,UAAM,IAAI,cAAe,MAAM,UAAU,KAAK,QAAQ,KAAK,IAAI,QAAQ,OAAO,CAAC,IAAK,GAAG;AACvF,UAAM,IAAI,cAAe,MAAM,UAAU,KAAK,OAAO,KAAK,IAAI,QAAQ,QAAQ,CAAC,IAAK,GAAG;AAEvF,QAAI,cAAc;AAAA,MAChB,mBAAmB;AAAA,MACnB,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,SAAS,OAAO,SAAS;AAAA,MACzB;AAAA,MACA,cAAc,MAAM;AAAA,MACpB,aAAa,MAAM;AAAA,IACrB,CAAC;AAAA,EACH,GAAG,CAAC,KAAK,YAAY,YAAY,QAAQ,QAAQ,QAAQ,OAAO,MAAM,SAAS,CAAC;AAEhF,QAAM,cAAcA,aAAY,CAAC,UAA4C;AAC3E,UAAM,MAAM,UAAU,SAAS;AAC/B,QAAI,CAAC,IAAK;AACV,QAAI,SAAS,MAAM,QAAQ,MAAM,MAAM;AACvC,UAAM,eAAe;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAaE,SAAQ,OAAO;AAAA,IAChC,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,WAAW,aAAa,CAAC,QAAQ,OAAO,OAAO,CAAC,QAAQ,OAAO;AAAA,EACjE,IAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,SAAS,QAAQ,KAAK,CAAC;AAErE,MAAI,CAAC,OAAO,IAAI,sBAAsB,mBAAmB,CAAC,KAAM,QAAO;AAEvE,SACE,gBAAAR;AAAA,IAAC;AAAA;AAAA,MACC,gCAA6B;AAAA,MAC7B,sBAAsB,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAC/C,WAAU;AAAA,MACV,OAAO,EAAE,QAAQ,EAAE,SAAS,YAAY,uBAAuB;AAAA,MAE/D,0BAAAC,MAAC,SAAI,WAAU,4BACb;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,aAAa,EAAE,QAAQ,YAAY,EAAE,MAAM,OAAO,EAAE,GAAG;AAAA,YAEhE;AAAA,8BAAAA,MAAC,SAAI,WAAU,WACb;AAAA,gCAAAD,KAAC,SAAI,WAAU,uBAAsB,4BAAc;AAAA,gBACnD,gBAAAA,KAAC,SAAI,WAAU,oBAAmB,OAAO,EAAE,OAAO,EAAE,MAAM,GACvD,uBAAa,sBAChB;AAAA,iBACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,OAAO,EAAE,YAAY,EAAE,QAAQ,OAAO,EAAE,GAAG;AAAA,kBAC5C;AAAA;AAAA,cAED;AAAA;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAC,MAAC,SAAI,WAAU,6DAA4D,OAAO,EAAE,aAAa,EAAE,QAAQ,YAAY,OAAO,GAC5H;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK,aAAa;AAAA,cAClB,OAAM;AAAA,cACN,WAAU;AAAA;AAAA,UACZ;AAAA,UAEC,aAAa,CAAC,cAAc,SAAS,cACpC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,gCAA6B;AAAA,cAC7B,WAAU;AAAA,cACV,SAAS;AAAA,cACT,SAAS;AAAA,cAET,0BAAAA,KAAC,SAAI,OAAO,YAAY;AAAA;AAAA,UAC1B;AAAA,UAGD,aAAa,CAAC,cACb,gBAAAA,KAAC,SAAI,WAAW,GAAG,SAAS,aAAa,yBAAyB,EAAE,oCAClE,0BAAAA,KAAC,SAAI,OAAO,YACT,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,kBAAM,IAAI,OAAO,cAAc;AAC/B,kBAAM,IAAI,OAAO,cAAc;AAC/B,kBAAM,OAAQ,IAAI,MAAO,QAAQ;AACjC,kBAAM,MAAO,IAAI,MAAO,QAAQ;AAChC,mBACE,gBAAAA;AAAA,cAACG;AAAA,cAAA;AAAA,gBAEC,OAAO,QAAQ;AAAA,gBACf;AAAA,gBACA;AAAA,gBACA,SAAS,MAAM,OAAO,KAAK,GAAG,aAAa,YAAY,OAAO,EAAE,IAAI,UAAU,qBAAqB;AAAA;AAAA,cAJ9F,OAAO;AAAA,YAKd;AAAA,UAEJ,CAAC,GACH,GACF;AAAA,UAGD,CAAC,aACA,gBAAAH,KAAC,SAAI,WAAU,6EAA4E,OAAO,EAAE,OAAO,EAAE,IAAI,YAAY,qBAAqB,GAAG,iDAErJ;AAAA,UAGD,aAAa,cACZ,gBAAAA,KAAC,SAAI,WAAU,6EAA4E,OAAO,EAAE,OAAO,EAAE,IAAI,YAAY,qBAAqB,GAC/I,sBACH;AAAA,UAGD,aAAa,CAAC,cAAc,CAAC,cAC5B,gBAAAA,KAAC,SAAI,WAAU,6EAA4E,OAAO,EAAE,OAAO,EAAE,IAAI,YAAY,qBAAqB,GAAG,0CAErJ;AAAA,WAEJ;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ACxRA,SAAS,YAAAS,WAAU,mBAAAC,kBAAiB,eAAAC,cAAa,aAAAC,kBAAiB;AA2FtD,SAIJ,OAAAC,MAJI,QAAAC,aAAA;AAtFL,SAAS,oBAAoB;AAClC,QAAM,MAAM,gBAAgB;AAC5B,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAS,EAAE;AACnC,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAgC,QAAQ;AAC5E,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,KAAK,MAAM,IAAIA,UAAS,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;AAElD,QAAM,aAAa,KAAK,cAAc;AAEtC,QAAM,SAASC,aAAY,MAAM;AAC/B,QAAI,CAAC,WAAY;AACjB,QACE,WAAW,sBAAsB,mBACjC,WAAW,gBAAgB,QAC3B,WAAW,eAAe,MAC1B;AACA,YAAMC,OAAM;AACZ,YAAMC,KAAI;AACV,YAAMC,WAAU,KAAK,IAAIF,MAAK,OAAO,aAAaC,KAAID,IAAG;AACzD,aAAO;AAAA,QACL,KAAK,WAAW,cAAcA;AAAA,QAC9B,MAAM,KAAK,IAAI,KAAK,IAAIA,MAAK,WAAW,YAAY,GAAGE,QAAO;AAAA,MAChE,CAAC;AACD;AAAA,IACF;AACA,UAAM,YAAY,KAAK,iBAAiB,IAAI,WAAW;AACvD,UAAM,EAAE,MAAM,IAAI,IAChB,WAAW,oBAAoB,eAAe,WAAW,gBAAgB,aAAa,KAAK,iBAAiB,QAAQ,WAAW,eAC3H,2BAA2B,WAAW,WAAW,GAAG,WAAW,CAAC,IAChE,qBAAqB,WAAW,GAAG,WAAW,CAAC;AACrD,UAAM,MAAM;AACZ,UAAM,IAAI;AACV,UAAM,UAAU,KAAK,IAAI,KAAK,OAAO,aAAa,IAAI,GAAG;AACzD,WAAO;AAAA,MACL,KAAK,MAAM;AAAA,MACX,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO;AAAA,IAC7C,CAAC;AAAA,EACH,GAAG,CAAC,KAAK,UAAU,CAAC;AAEpB,EAAAC,iBAAgB,MAAM;AACpB,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,WAAO,iBAAiB,UAAU,QAAQ,IAAI;AAC9C,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,QAAQ,IAAI;AACjD,aAAO,oBAAoB,UAAU,MAAM;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,MAAI,CAAC,OAAO,CAAC,WAAY,QAAO;AAEhC,QAAM,EAAE,eAAe,cAAc,WAAW,YAAY,YAAY,iBAAiB,UAAU,IAAI;AAEvG,QAAM,gBAAgB,mBAAmB,aAAa;AAEtD,QAAM,eAAe,YAAY;AAC/B,QAAI,CAAC,KAAK,KAAK,KAAK,WAAY;AAChC,QAAI,CAAC,YAAY;AACf,cAAQ,KAAK,2BAA2B,cAAc,mCAA8B;AACpF;AAAA,IACF;AACA,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,aAAa,KAAK,KAAK,GAAG,UAAU;AAC1C,cAAQ,EAAE;AAAA,IACZ,SAAS,KAAK;AACZ,cAAQ,MAAM,2BAA2B,GAAG;AAAA,IAC9C,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,SACE,gBAAAR;AAAA,IAAC;AAAA;AAAA,MACC,gCAA6B;AAAA,MAC7B,sBAAsB,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAC/C,OAAO,EAAE,UAAU,SAAS,QAAQ,EAAE,SAAS,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK;AAAA,MAE5E,0BAAAC,MAAC,SAAI,OAAO,EAAE,OAAO,KAAK,cAAc,GAAG,QAAQ,aAAa,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,WAAW,mCAAmC,SAAS,GAAG,GACxJ;AAAA,wBAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,UAAU,IAAI,OAAO,EAAE,OAAO,YAAY,aAAa,UAAU,UAAU,cAAc,YAAY,YAAY,SAAS,GACtJ;AAAA,qBAAW;AAAA,UACX,WAAW,eACV,gBAAAA,MAAC,UAAK,OAAO,EAAE,YAAY,GAAG,OAAO,EAAE,GAAG,GAAG;AAAA;AAAA,YAAE,WAAW,YAAY,MAAM,GAAG,EAAE;AAAA,YAAE;AAAA,aAAC;AAAA,WAExF;AAAA,QAEA,gBAAAD,KAAC,SAAI,OAAO,EAAE,cAAc,GAAG,UAAU,IAAI,OAAO,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAChF,WAAC,YACE,sBACA,CAAC,aACC,cAAc,2BAChB,gBACE,iBAAiB,aAAa,KAC9B,aACR;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,cAAc;AAAA,cACd,QAAQ,aAAa,EAAE,KAAK;AAAA,cAC5B,YAAY,EAAE;AAAA,cACd,OAAO,EAAE;AAAA,cACT,SAAS;AAAA,cACT,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,WAAW;AAAA,YACb;AAAA,YACA,aAAY;AAAA,YACZ,MAAM;AAAA,YACN,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,YACvC,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,YAAY,EAAE,WAAW,EAAE,SAAU,cAAa;AAAA,YAClE;AAAA,YACA,WAAS;AAAA;AAAA,QACX;AAAA,QAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,WAAW,EAAE,GACjG;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,IAAI,QAAQ,aAAa,EAAE,KAAK,IAAI,cAAc,GAAG,SAAS,WAAW,OAAO,EAAE,GAAG;AAAA,cAC1H,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAA8B;AAAA,cAEtE;AAAA,gCAAAD,KAAC,YAAO,OAAM,UAAS,oBAAM;AAAA,gBAC7B,gBAAAA,KAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA;AAAA;AAAA,UACnC;AAAA,UAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,GACpC;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,cAAc,IAAI;AAAA,gBACjC,OAAO,EAAE,UAAU,IAAI,SAAS,WAAW,cAAc,GAAG,YAAY,EAAE,QAAQ,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,UAAU;AAAA,gBACrI;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,UAAU,CAAC,KAAK,KAAK,KAAK,cAAc,CAAC;AAAA,gBACzC,OAAO,EAAE,UAAU,IAAI,SAAS,WAAW,cAAc,GAAG,YAAY,EAAE,SAAS,OAAO,EAAE,WAAW,QAAQ,QAAQ,QAAQ,WAAW,SAAS,CAAC,KAAK,KAAK,KAAK,cAAc,CAAC,aAAa,MAAM,EAAE;AAAA,gBAEtM,uBAAa,WAAM;AAAA;AAAA,YACtB;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AC7JA,SAAS,YAAAS,WAAU,eAAAC,cAAa,UAAAC,eAAc;AAC9C,SAAS,SAAS;AAiIV,SAmCE,YAAAC,WAnCF,OAAAC,MAeF,QAAAC,aAfE;AA3HD,SAAS,qBAAqB;AACnC,QAAM,MAAM,gBAAgB;AAC5B,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAS,EAAE;AACnC,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAgC,QAAQ;AAC5E,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,eAAeC,QAAuB,IAAI;AAChD,QAAM,CAAC,WAAW,YAAY,IAAID,UAA2B,IAAI;AACjE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA2B,IAAI;AAC7D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,oBAAoB,KAAK,qBAAqB;AACpD,QAAM,uBAAuB,KAAK;AAClC,QAAM,uBAAuB,KAAK,wBAAwB;AAC1D,QAAM,0BAA0B,KAAK;AACrC,QAAM,yBAAyB,KAAK;AACpC,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,YAAY,KAAK,aAAa;AAEpC,QAAM,oBAAoBE;AAAA,IACxB,CAAC,MAA0C;AACzC,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,UAAW,QAAO;AACvB,YAAM,OAAO,UAAU,sBAAsB;AAC7C,aAAO;AAAA,QACL,IAAK,EAAE,UAAU,KAAK,QAAQ,KAAK,QAAS;AAAA,QAC5C,IAAK,EAAE,UAAU,KAAK,OAAO,KAAK,SAAU;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkBA;AAAA,IACtB,CAAC,MAAwB;AACvB,UAAI,EAAE,WAAW,EAAG;AACpB,YAAM,KAAK,kBAAkB,CAAC;AAC9B,UAAI,CAAC,GAAI;AACT,mBAAa,EAAE;AACf,iBAAW,EAAE;AACb,oBAAc,IAAI;AAClB,gCAA0B,IAAI;AAC9B,cAAQ,EAAE;AAAA,IACZ;AAAA,IACA,CAAC,mBAAmB,uBAAuB;AAAA,EAC7C;AAEA,QAAM,kBAAkBA;AAAA,IACtB,CAAC,MAAwB;AACvB,UAAI,CAAC,WAAY;AACjB,YAAM,KAAK,kBAAkB,CAAC;AAC9B,UAAI,GAAI,YAAW,EAAE;AAAA,IACvB;AAAA,IACA,CAAC,YAAY,iBAAiB;AAAA,EAChC;AAEA,QAAM,gBAAgBA,aAAY,MAAM;AACtC,QAAI,CAAC,cAAc,CAAC,aAAa,CAAC,QAAS;AAC3C,kBAAc,KAAK;AACnB,UAAM,IAAI,KAAK,IAAI,UAAU,GAAG,QAAQ,CAAC;AACzC,UAAM,IAAI,KAAK,IAAI,UAAU,GAAG,QAAQ,CAAC;AACzC,UAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,UAAU,CAAC;AAC1C,UAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,UAAU,CAAC;AAC1C,QAAI,IAAI,KAAK,IAAI,GAAG;AAClB,gCAA0B,EAAE,GAAG,UAAU,GAAG,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,OAAO,SAAS,SAAS,CAAC;AAAA,IACtH,OAAO;AACL,gCAA0B,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,OAAO,SAAS,SAAS,CAAC;AAAA,IAC5F;AAAA,EACF,GAAG,CAAC,YAAY,WAAW,SAAS,uBAAuB,CAAC;AAE5D,QAAM,cAAc,MAAM;AACxB,2BAAuB,IAAI;AAC3B,8BAA0B,IAAI;AAC9B,YAAQ,EAAE;AACV,iBAAa,IAAI;AACjB,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,eAAe,YAAY;AAC/B,QAAI,CAAC,KAAK,KAAK,KAAK,cAAc,CAAC,uBAAwB;AAC3D,QAAI,CAAC,YAAY;AACf,cAAQ,KAAK,sCAAsC,cAAc,mCAA8B;AAC/F;AAAA,IACF;AACA,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,uBAAuB,KAAK,KAAK,GAAG,UAAU;AACpD,cAAQ,EAAE;AAAA,IACZ,SAAS,KAAK;AACZ,cAAQ,MAAM,sCAAsC,GAAG;AAAA,IACzD,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,CAAC,kBAAmB,QAAO;AAEvC,QAAM,UACJ,cAAc,aAAa,UACvB;AAAA,IACE,GAAG,KAAK,IAAI,UAAU,GAAG,QAAQ,CAAC;AAAA,IAClC,GAAG,KAAK,IAAI,UAAU,GAAG,QAAQ,CAAC;AAAA,IAClC,GAAG,KAAK,IAAI,QAAQ,IAAI,UAAU,CAAC;AAAA,IACnC,GAAG,KAAK,IAAI,QAAQ,IAAI,UAAU,CAAC;AAAA,EACrC,IACA;AAEN,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,gCAA6B;AAAA,MAC7B,sBAAsB,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAC/C,OAAO,EAAE,UAAU,SAAS,OAAO,GAAG,QAAQ,EAAE,iBAAiB,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,YAAY,kBAAkB;AAAA,MAGhK;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAO;AAAA,cACL,UAAU;AAAA,cAAY,KAAK;AAAA,cAAI,OAAO;AAAA,cAAI,QAAQ;AAAA,cAClD,SAAS;AAAA,cAAQ,QAAQ;AAAA,cAAI,OAAO;AAAA,cAAI,YAAY;AAAA,cAAU,gBAAgB;AAAA,cAC9E,cAAc;AAAA,cAAO,YAAY,EAAE;AAAA,cAAM,OAAO,EAAE;AAAA,cAClD,QAAQ,aAAa,EAAE,MAAM;AAAA,cAAI,QAAQ;AAAA,YAC3C;AAAA,YACA,OAAM;AAAA,YAEN,0BAAAA,KAAC,KAAE,OAAO,EAAE,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA;AAAA,QACvC;AAAA,QAGC,aAAa,CAAC,wBAAwB,CAAC,cACtC,gBAAAA,KAAC,SAAI,OAAO;AAAA,UACV,UAAU;AAAA,UAAY,KAAK;AAAA,UAAI,MAAM;AAAA,UAAO,WAAW;AAAA,UAAoB,QAAQ;AAAA,UACnF,cAAc;AAAA,UAAG,YAAY,EAAE;AAAA,UAAM,QAAQ,aAAa,EAAE,MAAM;AAAA,UAClE,SAAS;AAAA,UAAY,WAAW;AAAA,QAClC,GACE,0BAAAA,KAAC,OAAE,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,IAAI,YAAY,KAAK,QAAQ,EAAE,GAAG,8CAAgC,GACvG;AAAA,QAIF,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO,EAAE,UAAU,YAAY,WAAW,QAAQ,UAAU,QAAQ,UAAU,UAAU,cAAc,GAAG,WAAW,oCAAoC,YAAY,QAAQ,QAAQ,YAAY;AAAA,YAChM,aAAa;AAAA,YACb,aAAa;AAAA,YACb,WAAW;AAAA,YAEX;AAAA,8BAAAD,KAAC,SAAI,KAAK,mBAAmB,KAAI,2BAA0B,OAAO,EAAE,SAAS,SAAS,WAAW,QAAQ,UAAU,QAAQ,eAAe,OAAO,GAAG,WAAW,OAAO;AAAA,cAGrK,WAAW,QAAQ,IAAI,QAAQ,IAAI,OAClC,gBAAAA,KAAC,SAAI,OAAO;AAAA,gBACV,UAAU;AAAA,gBAAY,MAAM,GAAG,QAAQ,CAAC;AAAA,gBAAK,KAAK,GAAG,QAAQ,CAAC;AAAA,gBAC9D,OAAO,GAAG,QAAQ,CAAC;AAAA,gBAAK,QAAQ,GAAG,QAAQ,CAAC;AAAA,gBAC5C,QAAQ,aAAa,EAAE,OAAO;AAAA,gBAAI,YAAY,GAAG,EAAE,OAAO;AAAA,gBAAM,eAAe;AAAA,cACjF,GAAG;AAAA,cAIJ,wBAAwB,CAAC,cACxB,gBAAAA,KAAAD,WAAA,EACG,+BAAqB,QAAQ,KAAK,qBAAqB,SAAS,IAC/D,gBAAAC,KAAC,SAAI,OAAO;AAAA,gBACV,UAAU;AAAA,gBAAY,MAAM,GAAG,qBAAqB,CAAC;AAAA,gBAAK,KAAK,GAAG,qBAAqB,CAAC;AAAA,gBACxF,OAAO,GAAG,qBAAqB,KAAK;AAAA,gBAAK,QAAQ,GAAG,qBAAqB,MAAM;AAAA,gBAC/E,QAAQ,aAAa,EAAE,OAAO;AAAA,gBAAI,YAAY,GAAG,EAAE,OAAO;AAAA,gBAAM,eAAe;AAAA,cACjF,GAAG,IAEH,gBAAAA,KAAC,SAAI,OAAO;AAAA,gBACV,UAAU;AAAA,gBAAY,MAAM,GAAG,qBAAqB,CAAC;AAAA,gBAAK,KAAK,GAAG,qBAAqB,CAAC;AAAA,gBACxF,WAAW;AAAA,gBAAyB,eAAe;AAAA,cACrD,GACE,0BAAAA,KAAC,SAAI,OAAO;AAAA,gBACV,QAAQ;AAAA,gBAAI,OAAO;AAAA,gBAAI,cAAc;AAAA,gBACrC,YAAY,EAAE;AAAA,gBAAS,OAAO,EAAE;AAAA,gBAChC,SAAS;AAAA,gBAAQ,YAAY;AAAA,gBAAU,gBAAgB;AAAA,gBACvD,UAAU;AAAA,gBAAI,YAAY;AAAA,gBAC1B,WAAW,aAAa,EAAE,OAAO;AAAA,cACnC,GAAG,oBAAC,GACN,GAEJ;AAAA;AAAA;AAAA,QAEJ;AAAA,QAGC,wBAAwB,CAAC,cACxB,gBAAAA,KAAC,SAAI,OAAO,EAAE,UAAU,YAAY,QAAQ,IAAI,MAAM,OAAO,WAAW,oBAAoB,QAAQ,IAAI,OAAO,IAAI,GACjH,0BAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,QAAQ,aAAa,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,WAAW,mCAAmC,SAAS,GAAG,GAC5I;AAAA,0BAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,UAAU,IAAI,OAAO,EAAE,OAAO,YAAY,YAAY,GAAG;AAAA;AAAA,YACnF;AAAA,YACF,qBAAqB,QAAQ,IAC1B,SAAS,KAAK,MAAM,qBAAqB,CAAC,CAAC,MAAM,KAAK,MAAM,qBAAqB,CAAC,CAAC,MAAM,KAAK,MAAM,qBAAqB,KAAK,CAAC,OAAI,KAAK,MAAM,qBAAqB,MAAM,CAAC,MAC1K,WAAW,KAAK,MAAM,qBAAqB,CAAC,CAAC,MAAM,KAAK,MAAM,qBAAqB,CAAC,CAAC;AAAA,aAC3F;AAAA,UACC,CAAC,cACA,gBAAAD,KAAC,SAAI,OAAO,EAAE,cAAc,GAAG,UAAU,IAAI,OAAO,EAAE,MAAM,GACzD,WAAC,YAAY,sBAAiB,cAAc,0BAC/C;AAAA,UAGF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBAAQ,cAAc;AAAA,gBAAG,QAAQ,aAAa,EAAE,KAAK;AAAA,gBAC5D,YAAY,EAAE;AAAA,gBAAI,OAAO,EAAE;AAAA,gBAAI,SAAS;AAAA,gBAAW,UAAU;AAAA,gBAC7D,QAAQ;AAAA,gBAAQ,SAAS;AAAA,gBAAQ,WAAW;AAAA,cAC9C;AAAA,cACA,aAAY;AAAA,cACZ,MAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,cACvC,WAAW,CAAC,MAAM;AAAE,oBAAI,EAAE,QAAQ,YAAY,EAAE,WAAW,EAAE,SAAU,cAAa;AAAA,cAAG;AAAA,cACvF,WAAS;AAAA;AAAA,UACX;AAAA,UAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,WAAW,EAAE,GACjG;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,IAAI,QAAQ,aAAa,EAAE,KAAK,IAAI,cAAc,GAAG,SAAS,WAAW,OAAO,EAAE,GAAG;AAAA,gBAC1H,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAA8B;AAAA,gBAEtE;AAAA,kCAAAD,KAAC,YAAO,OAAM,UAAS,oBAAM;AAAA,kBAC7B,gBAAAA,KAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA;AAAA;AAAA,YACnC;AAAA,YAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,GACpC;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM;AAAE,8CAA0B,IAAI;AAAG,iCAAa,IAAI;AAAG,+BAAW,IAAI;AAAA,kBAAG;AAAA,kBACxF,OAAO,EAAE,UAAU,IAAI,SAAS,WAAW,cAAc,GAAG,YAAY,EAAE,QAAQ,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,UAAU;AAAA,kBACrI;AAAA;AAAA,cAED;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT,UAAU,CAAC,KAAK,KAAK,KAAK,cAAc,CAAC;AAAA,kBACzC,OAAO,EAAE,UAAU,IAAI,SAAS,WAAW,cAAc,GAAG,YAAY,EAAE,SAAS,OAAO,EAAE,WAAW,QAAQ,QAAQ,QAAQ,WAAW,SAAS,CAAC,KAAK,KAAK,KAAK,cAAc,CAAC,aAAa,MAAM,EAAE;AAAA,kBAEtM,uBAAa,WAAM;AAAA;AAAA,cACtB;AAAA,eACF;AAAA,aACF;AAAA,WACF,GACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AC3PA,SAAS,UAAAK,SAAQ,aAAAC,YAAW,YAAAC,iBAAgB;AAC5C,SAAS,mBAAmB,QAAQ,UAAAC,eAAc;;;ACQ3C,SAAS,wBAAwB;AAAA,EACtC,iBAAiB;AAAA,EACjB,kBAAkB;AACpB,GAGyB;AACvB,QAAM,eAAe;AACrB,QAAM,gBAAgB;AACtB,QAAM,cAAc,OAAO,YAAY,IAAI,OAAO,aAAa;AAC/D,QAAM,eACJ,gBAAgB,IACZ,eACE,QACA,eACF;AAEN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AD4DQ,SAaE,OAAAC,MAbF,QAAAC,aAAA;AAlFD,SAAS,eAAe,EAAE,WAAW,eAAe,GAAwB;AACjF,QAAM,MAAM,gBAAgB;AAC5B,QAAM,UAAUC,QAAuB,IAAI;AAC3C,QAAM,CAAC,eAAe,gBAAgB,IAAIC,UAAS,KAAK;AAExD,QAAM,gBAAgB,KAAK,YAAY;AACvC,QAAM,QAAQ,KAAK,SAAS;AAG5B,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,CAAC,IAAK;AAC5B,UAAM,UAAU,CAAC,MAAkB;AACjC,UAAI,QAAQ,WAAW,CAAC,QAAQ,QAAQ,SAAS,EAAE,MAAc,GAAG;AAClE,YAAI,YAAY,KAAK;AAAA,MACvB;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,OAAO;AAC9C,WAAO,MAAM,SAAS,oBAAoB,aAAa,OAAO;AAAA,EAChE,GAAG,CAAC,eAAe,GAAG,CAAC;AAEvB,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,MAAO;AACZ,YAAQ,IAAI,iCAAiC;AAC7C,WAAO,MAAM,QAAQ,IAAI,mCAAmC;AAAA,EAC9D,GAAG,CAAC,KAAK,CAAC;AAEV,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,WAAW,SAAS;AAC1B,QAAM,eAAe,wBAAwB,EAAE,gBAAgB,cAAc,iBAAiB,cAAc,CAAC;AAE7G,QAAM,WACJ,aAAa,gBACT,EAAE,MAAM,IAAI,QAAQ,GAAG,IACvB,EAAE,OAAO,IAAI,QAAQ,GAAG;AAC9B,QAAM,YACJ,aAAa,gBACT,EAAE,MAAM,IAAI,QAAQ,EAAE,IACtB,EAAE,OAAO,IAAI,QAAQ,EAAE;AAE7B,QAAM,eAAe,MAAM;AACzB,QAAI,MAAO,SAAQ,IAAI,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAClE,qBAAiB,IAAI;AACrB,QAAI,UAAU;AACZ,kBAAY;AACZ;AAAA,IACF;AAEA,QAAI,aAAa,gBAAgB,GAAG;AAClC,UAAI,aAAa,iBAAiB,OAAO;AACvC,qBAAa;AAAA,MACf,WAAW,aAAa,iBAAiB,cAAc;AACrD,aAAK,uBAAuB;AAAA,MAC9B;AACA;AAAA,IACF;AAEA,eAAW;AAAA,EACb;AACA,QAAM,YAAY;AAClB,QAAM,mBAAmB,aAAa,CAAC,iBAAiB,CAAC,YAAY,CAAC;AAEtE,MAAI,aAAa,gBAAgB,EAAG,QAAO;AAE3C,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,gCAA6B;AAAA,MAC7B,OAAO,EAAE,UAAU,SAAS,GAAG,UAAU,QAAQ,EAAE,SAAS;AAAA,MAE3D;AAAA,4BACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,GAAG;AAAA,cACH,OAAO;AAAA,cACP,cAAc;AAAA,cACd,QAAQ,aAAa,EAAE,MAAM;AAAA,cAC7B,YAAY,EAAE;AAAA,cACd,OAAO,EAAE;AAAA,cACT,WAAW;AAAA,cACX,SAAS;AAAA,YACX;AAAA,YAEA;AAAA,8BAAAD,KAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,cAAc,EAAE,GAAG,4BAAc;AAAA,cAC9E,gBAAAA,KAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,OAAO,YAAY,KAAK,GAAG,4FAEhE;AAAA;AAAA;AAAA,QACF;AAAA,QAID,YAAY,CAAC,YAAY,aAAa,cAAc,KACnD,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,cAAc;AAAA,cACd,OAAO;AAAA,cACP,cAAc;AAAA,cACd,QAAQ,aAAa,EAAE,MAAM;AAAA,cAC7B,YAAY,EAAE;AAAA,cACd,WAAW;AAAA,cACX,UAAU;AAAA,YACZ;AAAA,YAEC;AAAA,8BACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,OAAO;AAAA,oBACP,YAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,OAAO,EAAE;AAAA,oBACT,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,QAAQ;AAAA,oBACR,WAAW;AAAA,kBACb;AAAA,kBACA,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,aAAa,EAAE;AAAA,kBAC3D,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,aAAa;AAAA,kBAEzD;AAAA,oCAAAD,KAAC,UAAO,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG;AAAA,oBAC3E,gBAAAC,MAAC,SACC;AAAA,sCAAAD,KAAC,SAAI,OAAO,EAAE,YAAY,IAAI,GAAG,yBAAW;AAAA,sBAC5C,gBAAAA,KAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,GAAG,8BAAgB;AAAA,uBAChE;AAAA;AAAA;AAAA,cACF;AAAA,cAED,gBAAgB,iBAAiB,gBAAAA,KAAC,SAAI,OAAO,EAAE,WAAW,aAAa,EAAE,MAAM,GAAG,GAAG;AAAA,cACrF,iBACC,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM,KAAK,uBAAuB;AAAA,kBAC3C,UAAU;AAAA,kBACV,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,OAAO;AAAA,oBACP,YAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,OAAO,EAAE;AAAA,oBACT,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,QAAQ,YAAY,YAAY;AAAA,oBAChC,SAAS,YAAY,MAAM;AAAA,oBAC3B,WAAW;AAAA,kBACb;AAAA,kBACA,cAAc,CAAC,MAAM;AAAE,wBAAI,CAAC,UAAW,GAAE,cAAc,MAAM,aAAa,EAAE;AAAA,kBAAQ;AAAA,kBACpF,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,aAAa;AAAA,kBAEzD;AAAA,oCAAAD,KAACK,SAAA,EAAO,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG;AAAA,oBAC3E,gBAAAJ,MAAC,SACC;AAAA,sCAAAD,KAAC,SAAI,OAAO,EAAE,YAAY,IAAI,GAAI,sBAAY,oBAAe,cAAa;AAAA,sBAC1E,gBAAAA,KAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,GAAG,kCAAoB;AAAA,uBACpE;AAAA;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QAEJ;AAAA,QAIF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAGC,SAAS;AAAA,YACT,OAAO;AAAA,cACL,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,cAAc;AAAA,cACd,WAAW;AAAA,cACX,YAAY;AAAA,cACZ,QAAQ,WAAW,SAAS,aAAa,EAAE,MAAM;AAAA,cACjD,YAAY,WAAW,EAAE,UAAU,EAAE;AAAA,cACrC,OAAO,WAAW,EAAE,YAAY,EAAE;AAAA,cAClC,QAAQ;AAAA,cACR,WAAW,WAAW,eAAe;AAAA,YACvC;AAAA,YACA,OAAO,WAAW,uBAAuB;AAAA,YACzC,cAAW;AAAA,YAEX,0BAAAA,KAAC,qBAAkB,OAAO,EAAE,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA;AAAA,QACvD;AAAA;AAAA;AAAA,EACF;AAEJ;;;AErNA,SAAS,YAAAM,WAAU,aAAAC,YAAW,eAAAC,oBAAmC;AACjE,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,UAAAC,eAAc;AAoCnB,qBAAAC,WAIQ,OAAAC,YAJR;AAhCG,SAAS,sBAAsB;AAAA,EACpC;AACF,GAEG;AACD,QAAM,MAAM,gBAAgB;AAC5B,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAoB,CAAC,CAAC;AAE1D,EAAAC,WAAU,MAAM;AACd,UAAM,QAAQ,MAAM;AAClB,YAAM,SAAS,SAAS,iBAAiB,8CAA8C;AACvF,oBAAc,MAAM,KAAK,MAAM,CAAC;AAAA,IAClC;AACA,UAAM;AACN,UAAM,WAAW,IAAI,iBAAiB,KAAK;AAC3C,aAAS,QAAQ,SAAS,MAAM,EAAE,WAAW,MAAM,SAAS,KAAK,CAAC;AAClE,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBC,aAAY,YAAY;AAC5C,QAAI,CAAC,IAAK;AACV,UAAM,IAAI,uBAAuB;AAAA,EACnC,GAAG,CAAC,GAAG,CAAC;AAER,MAAI,CAAC,OAAO,WAAW,WAAW,EAAG,QAAO;AAE5C,QAAM,cAAuC;AAAA,IAC3C,mBAAmB;AAAA,IACnB,mBAAmB,IAAI;AAAA,EACzB;AAEA,SACE,gBAAAH,KAAAD,WAAA,EACG,qBAAW;AAAA,IAAI,CAAC,OAAO,MACtBK;AAAA,MACE,eACE,gBAAAJ,KAAC,SAAI,gCAA6B,QAAO,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GACrF,uBAAa,WAAW,GAC3B,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,gCAA6B;AAAA,UAC7B,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,iBAAK,cAAc;AAAA,UACrB;AAAA,UACA,OAAO;AAAA,YACL,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,QAAQ,EAAE;AAAA,YACV,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,cAAc;AAAA,YACd,QAAQ,aAAa,EAAE,MAAM;AAAA,YAC7B,YAAY,EAAE;AAAA,YACd,OAAO,EAAE;AAAA,YACT,WAAW;AAAA,YACX,QAAQ;AAAA,UACV;AAAA,UACA,OAAM;AAAA,UACN,cAAW;AAAA,UAEX,0BAAAA,KAACK,SAAA,EAAO,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,QAAQ,GAAG;AAAA;AAAA,QA1BvD;AAAA,MA2BP;AAAA,MAEF;AAAA,MACA,kBAAkB,CAAC;AAAA,IACrB;AAAA,EACF,GACF;AAEJ;;;AbwFQ,qBAAAC,WAEI,OAAAC,MAFJ,QAAAC,aAAA;AArJR,IAAM,mBAAN,cAA+B,UAG7B;AAAA,EAHF;AAAA;AAIE,iBAAQ,EAAE,UAAU,MAAM;AAAA;AAAA,EAE1B,OAAO,2BAA2B;AAChC,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA,EAEA,kBAAkB,OAAc;AAC9B,YAAQ,KAAK,cAAc,KAAK,MAAM,IAAI,8BAA8B,MAAM,OAAO;AAAA,EACvF;AAAA,EAEA,SAAS;AACP,WAAO,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;AAAA,EACjD;AACF;AA8EO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,yBAAyB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA;AAAA,EAER;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,MAAM,MAAM;AAAA,MACpB,WAAW,MAAM,SAAS;AAAA,MAC1B,iBAAiB,MAAM,eAAe;AAAA,MAErC,qBACC,gBAAAC,MAAAF,WAAA,EACG;AAAA,8BAAsB,mBAAoB,CAAC,CAAC,aAAa,CAAC,oBACzD,gBAAAC,KAAC,wBAAqB,IAEtB,gBAAAA,KAAC,mBAAgB;AAAA,QAEnB,gBAAAA,KAAC,qBAAkB;AAAA,QACnB,gBAAAA,KAAC,sBAAmB;AAAA,QACnB,eACC,gBAAAA,KAAC,oBAAiB,MAAK,cACrB,0BAAAA,KAAC,YAAS,GACZ;AAAA,QAED,mBAAmB,0BAClB,gBAAAA,KAAC,yBAAsB,cAAc,0BAA0B;AAAA,QAEhE,iBACC,gBAAAA,KAAC,sBAAmB,gBAAgC,IAEpD,gBAAAA,KAAC,kBAAe,UAAU,gBAAgB;AAAA,SAE9C;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AACF,GAEG;AACD,QAAM,MAAM,gBAAgB;AAE5B,MAAI,CAAC,IAAK,QAAO;AAEjB,SACE,gBAAAA,KAAC,SAAI,gCAA6B,QAAO,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GACrF,yBAAe;AAAA,IACd,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,gBAAgB,IAAI;AAAA,IACpB,UAAU,IAAI;AAAA,IACd,cAAc,IAAI;AAAA,IAClB,eAAe,IAAI;AAAA,IACnB,UAAU,IAAI;AAAA,IACd,WAAW,IAAI;AAAA,IACf,YAAY,IAAI;AAAA,IAChB,cAAc,IAAI;AAAA,IAClB,aAAa,IAAI;AAAA,IACjB,wBAAwB,IAAI;AAAA,EAC9B,CAAC,GACH;AAEJ;AAEA,SAAS,WAAW;AAClB,QAAM,MAAM,gBAAgB;AAE5B,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,IAAI,sBAAsB,gBAAiB,QAAO;AAEtD,SAAO,gBAAAA,KAAC,cAAW;AACrB;","names":["mode","result","useCallback","useEffect","useMemo","useState","jsx","useState","useEffect","useMemo","useCallback","overlay","useEffect","useState","useCallback","useRef","useMemo","createPortal","useCallback","listeners","Fragment","jsx","jsxs","useState","useRef","useCallback","useEffect","anchorElement","resolved","useMemo","createPortal","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","EMPTY_THREADS","PinMarker","useRef","useState","useCallback","useEffect","useMemo","useState","useLayoutEffect","useCallback","useEffect","jsx","jsxs","useState","useCallback","pad","w","maxLeft","useLayoutEffect","useEffect","useState","useCallback","useRef","Fragment","jsx","jsxs","useState","useRef","useCallback","useRef","useEffect","useState","Camera","jsx","jsxs","useRef","useState","useEffect","Camera","useState","useEffect","useCallback","createPortal","Camera","Fragment","jsx","useState","useEffect","useCallback","createPortal","Camera","Fragment","jsx","jsxs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sylergydigital/issue-pin-sdk",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "Issue Pin — in-app visual feedback SDK",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.cjs",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"react": "^18.0.0",
|
|
26
|
+
"react-dom": "^18.0.0",
|
|
27
|
+
"@supabase/supabase-js": "^2.0.0",
|
|
28
|
+
"html2canvas": "^1.4.0",
|
|
29
|
+
"lucide-react": ">=0.300.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"tsup": "^8.0.0",
|
|
33
|
+
"typescript": "^5.0.0",
|
|
34
|
+
"react": "^18.3.1",
|
|
35
|
+
"react-dom": "^18.3.1",
|
|
36
|
+
"@supabase/supabase-js": "^2.99.1",
|
|
37
|
+
"@types/react": "^18.3.23",
|
|
38
|
+
"@types/react-dom": "^18.3.7",
|
|
39
|
+
"html2canvas": "^1.4.1",
|
|
40
|
+
"lucide-react": "^0.462.0"
|
|
41
|
+
},
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/sylergydigital/issue-pin-sdk.git"
|
|
45
|
+
},
|
|
46
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
47
|
+
"private": false
|
|
48
|
+
}
|