@redacto.io/consent-sdk-js 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/redacto.d.mts +240 -21
- package/dist/redacto.d.ts +240 -21
- package/dist/redacto.global.js +357 -16
- package/dist/redacto.global.js.map +1 -1
- package/dist/redacto.js +11228 -2459
- package/dist/redacto.mjs +11155 -2386
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/state.ts","../src/core/dom.ts","../src/core/media-query.ts","../src/services/cache.ts","../../../node_modules/.pnpm/jwt-decode@4.0.0/node_modules/jwt-decode/build/esm/index.js","../src/core/jwt-decode.ts","../src/api/sandbox.ts","../src/api/constants.ts","../src/api/language.ts","../src/api/index.ts","../src/api/notice-consent-status.ts","../src/styles/inject.ts","../src/styles/modal.ts","../src/constants.ts","../src/core/required-marker.ts","../src/modal/purposes.ts","../src/modal/language-selector.ts","../src/modal/keyboard.ts","../src/services/storage.ts","../src/modal/tts.ts","../src/modal/age-verification.ts","../src/modal/guardian-form.ts","../src/modal/verification-screen.ts","../src/modal/colors.ts","../src/modal/consentSelection.ts","../src/modal/layout.ts","../src/modal/index.ts","../src/styles/inline.ts","../src/inline/purposes.ts","../src/inline/index.ts","../src/modal/digilocker-callback.ts"],"sourcesContent":["import { ModalController } from \"./modal\";\nimport { InlineController } from \"./inline\";\nimport { handleDigilockerCallback } from \"./modal/digilocker-callback\";\nimport type { ModalOptions, InlineOptions, DigiLockerCallbackOptions } from \"./types\";\n\nlet activeModal: ModalController | null = null;\nlet activeInline: InlineController | null = null;\n\n/**\n * Initialize a modal consent dialog.\n * Renders a full-screen overlay with the consent form.\n */\nfunction init(options: ModalOptions): void {\n // Destroy any existing instance\n destroy();\n\n activeModal = new ModalController(options);\n activeModal.init().catch((err) => {\n options.onError?.(err);\n });\n}\n\n/**\n * Initialize an inline consent form.\n * Renders consent purposes inside a target container element.\n */\nfunction inline(options: InlineOptions): void {\n // Destroy any existing inline instance\n if (activeInline) {\n activeInline.destroy();\n activeInline = null;\n }\n\n activeInline = new InlineController(options);\n activeInline.init().catch((err) => {\n options.onError?.(err);\n });\n}\n\n/**\n * Destroy all active consent instances.\n */\nfunction destroy(): void {\n if (activeModal) {\n activeModal.destroy();\n activeModal = null;\n }\n if (activeInline) {\n activeInline.destroy();\n activeInline = null;\n }\n}\n\n/**\n * Handle DigiLocker callback (for guardian verification redirect flow).\n * Call this on the DigiLocker callback page.\n */\nfunction digilockerCallback(options: DigiLockerCallbackOptions): void {\n handleDigilockerCallback(options);\n}\n\nconst RedactoConsent = {\n init,\n inline,\n destroy,\n digilockerCallback,\n version: \"0.1.0\",\n};\n\nexport default RedactoConsent;\nexport { init, inline, destroy, digilockerCallback };\nexport type { ModalOptions, InlineOptions, DigiLockerCallbackOptions };\nexport type { Settings } from \"./api/types\";\n","/**\n * Simple observable store — replaces React useState.\n * Shallow-merges updates and notifies subscribers.\n */\n\nexport type Listener<T> = (state: T, prevState: T) => void;\n\nexport class Store<T extends Record<string, any>> {\n private state: T;\n private listeners: Set<Listener<T>> = new Set();\n\n constructor(initialState: T) {\n this.state = { ...initialState };\n }\n\n getState(): Readonly<T> {\n return this.state;\n }\n\n setState(partial: Partial<T>): void {\n const prevState = this.state;\n this.state = { ...this.state, ...partial };\n this.listeners.forEach((listener) => listener(this.state, prevState));\n }\n\n subscribe(listener: Listener<T>): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n destroy(): void {\n this.listeners.clear();\n }\n}\n","/**\n * DOM creation helpers — replaces JSX.\n */\n\ntype Attrs = Record<string, any>;\n\n/**\n * Create an HTML element with attributes, styles, events, and children.\n *\n * Attribute keys:\n * - \"style\" → merged into element.style\n * - \"className\" → element.className\n * - \"on...\" → addEventListener (e.g. onClick → \"click\")\n * - \"dataset\" → Object.assign(element.dataset, value)\n * - anything else → setAttribute\n */\nexport function el(\n tag: string,\n attrs?: Attrs | null,\n ...children: (Node | string | null | undefined | false)[]\n): HTMLElement {\n const element = document.createElement(tag);\n if (attrs) applyAttrs(element, attrs);\n appendChildren(element, children);\n return element;\n}\n\n/**\n * Create an SVG element.\n */\nexport function svg(\n tag: string,\n attrs?: Attrs | null,\n ...children: (Node | string | null | undefined | false)[]\n): SVGElement {\n const element = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n tag\n );\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value == null || value === false) continue;\n if (key === \"style\" && typeof value === \"object\") {\n applyStyles(element as unknown as HTMLElement, value);\n } else {\n element.setAttribute(key, String(value));\n }\n }\n }\n appendChildren(element as unknown as HTMLElement, children);\n return element;\n}\n\nfunction applyAttrs(element: HTMLElement, attrs: Attrs): void {\n for (const [key, value] of Object.entries(attrs)) {\n if (value == null || value === false) continue;\n\n if (key === \"style\" && typeof value === \"object\") {\n applyStyles(element, value);\n } else if (key === \"className\") {\n element.className = value;\n } else if (key === \"dataset\" && typeof value === \"object\") {\n Object.assign(element.dataset, value);\n } else if (key.startsWith(\"on\") && typeof value === \"function\") {\n const event = key.slice(2).toLowerCase();\n element.addEventListener(event, value);\n } else if (key === \"checked\" || key === \"disabled\" || key === \"readOnly\") {\n (element as any)[key] = value;\n } else {\n element.setAttribute(key, String(value));\n }\n }\n}\n\n/**\n * CSS properties that take a unitless number, mirroring React's CSSProperty\n * list. For these we MUST NOT append \"px\" — doing so produces invalid CSS\n * (e.g. `font-weight: 400px`) and the browser falls back to the user-agent\n * default (which is what made <h3> purpose descriptions render as bold).\n */\nconst UNITLESS_PROPS = new Set([\n \"animationIterationCount\",\n \"aspectRatio\",\n \"borderImageOutset\",\n \"borderImageSlice\",\n \"borderImageWidth\",\n \"boxFlex\",\n \"boxFlexGroup\",\n \"boxOrdinalGroup\",\n \"columnCount\",\n \"columns\",\n \"flex\",\n \"flexGrow\",\n \"flexPositive\",\n \"flexShrink\",\n \"flexNegative\",\n \"flexOrder\",\n \"fontWeight\",\n \"gridArea\",\n \"gridRow\",\n \"gridRowEnd\",\n \"gridRowSpan\",\n \"gridRowStart\",\n \"gridColumn\",\n \"gridColumnEnd\",\n \"gridColumnSpan\",\n \"gridColumnStart\",\n \"lineClamp\",\n \"lineHeight\",\n \"opacity\",\n \"order\",\n \"orphans\",\n \"scale\",\n \"tabSize\",\n \"widows\",\n \"zIndex\",\n \"zoom\",\n]);\n\n/**\n * Apply a camelCase style object to an element.\n *\n * Numeric values are interpreted as pixels (matching React's behavior) EXCEPT\n * for the unitless properties listed above, which are passed through as-is.\n */\nexport function applyStyles(\n element: HTMLElement,\n styles: Record<string, any>\n): void {\n for (const [key, value] of Object.entries(styles)) {\n if (value == null) continue;\n const stringValue =\n typeof value === \"number\" && !UNITLESS_PROPS.has(key)\n ? `${value}px`\n : String(value);\n (element.style as any)[key] = stringValue;\n }\n}\n\nfunction appendChildren(\n parent: HTMLElement,\n children: (Node | string | null | undefined | false)[]\n): void {\n for (const child of children) {\n if (child == null || child === false) continue;\n if (typeof child === \"string\") {\n parent.appendChild(document.createTextNode(child));\n } else {\n parent.appendChild(child);\n }\n }\n}\n\n/**\n * Remove all children from an element.\n */\nexport function clearElement(element: HTMLElement): void {\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n}\n","/**\n * matchMedia wrapper with subscribe — replaces useMediaQuery hook.\n */\n\nexport type MediaQuerySubscription = {\n matches: boolean;\n subscribe: (cb: (matches: boolean) => void) => void;\n destroy: () => void;\n};\n\nexport function createMediaQuery(query: string): MediaQuerySubscription {\n const mql = window.matchMedia(query);\n let currentMatches = mql.matches;\n const listeners: Set<(matches: boolean) => void> = new Set();\n\n const handler = (e: MediaQueryListEvent) => {\n currentMatches = e.matches;\n listeners.forEach((cb) => cb(currentMatches));\n };\n\n mql.addEventListener(\"change\", handler);\n\n return {\n get matches() {\n return currentMatches;\n },\n subscribe(cb: (matches: boolean) => void) {\n listeners.add(cb);\n },\n destroy() {\n mql.removeEventListener(\"change\", handler);\n listeners.clear();\n },\n };\n}\n","const apiCache = new Map<string, { data: any; timestamp: number; ttl: number }>();\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\nexport function getCachedData(key: string): any | null {\n const cached = apiCache.get(key);\n if (cached && Date.now() - cached.timestamp < cached.ttl) {\n return cached.data;\n }\n if (cached) {\n apiCache.delete(key);\n }\n return null;\n}\n\nexport function setCachedData(key: string, data: any, ttl = CACHE_TTL): void {\n apiCache.set(key, { data, timestamp: Date.now(), ttl });\n}\n\nexport function clearApiCache(): void {\n apiCache.clear();\n}\n","export class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }));\n}\nfunction base64UrlDecode(str) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n try {\n return b64DecodeUnicode(output);\n }\n catch (err) {\n return atob(output);\n }\n}\nexport function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n options || (options = {});\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n }\n let decoded;\n try {\n decoded = base64UrlDecode(part);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n }\n try {\n return JSON.parse(decoded);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n }\n}\n","import { jwtDecode } from \"jwt-decode\";\nimport type { RedactoJwtPayload } from \"../api/types\";\n\n/**\n * Decode JWT with error handling — returns null on failure.\n */\nexport function decodeTokenSafely(token: string): RedactoJwtPayload | null {\n try {\n return jwtDecode(token) as RedactoJwtPayload;\n } catch (error) {\n console.warn(\"Failed to decode JWT token:\", error);\n return null;\n }\n}\n","/**\n * Sandbox-mode auth primitives for the consent PoC.\n *\n * In sandbox mode the SDK talks to the consent-server with a pasted static\n * token and an explicit test subject, bypassing the JWT entirely. Org/workspace\n * UUIDs come from options (they still build the `/public/organisations/{org}/\n * workspaces/{ws}/...` URL paths) instead of being decoded from a token.\n *\n * Auth is the single `X-Consent-Token` header carrying the static token; its\n * presence alone marks the request as `environment=test`. There is no subject\n * header. The acting identity (the test subject) rides the request's own\n * payload: query params (`primary_email` / `primary_mobile`) on GET/query reads,\n * and the body on POSTs. The server normalizes and namespaces it `test::`\n * server-side. Call sites resolve the credential via {@link buildAuthHeaders}\n * and the identity via {@link sandboxQueryIdentity} / {@link sandboxBodyIdentity}.\n *\n * This file exists so every JWT-decode / Authorization site resolves its\n * org/workspace UUIDs and builds its auth header through one place, keeping\n * sandbox vs. JWT branching from drifting across the fetch sites.\n */\nimport { decodeTokenSafely } from \"../core/jwt-decode\";\nimport type {\n ResolvedRequestAuth,\n SandboxAuth,\n SandboxIdentityPayload,\n SandboxOptions,\n} from \"./types\";\n\n/** HTTP header carrying the static sandbox token (the credential). */\nexport const SANDBOX_TOKEN_HEADER = \"X-Consent-Token\";\n\n/**\n * Resolve a {@link SandboxAuth} from sandbox options, or null when sandbox mode\n * is not active (no token).\n *\n * @throws Error when a sandbox token is provided but org/workspace or the acting\n * identity are incomplete — sandbox mode cannot build URLs or identify the\n * acting principal without them.\n */\nexport const resolveSandboxAuth = (\n options: SandboxOptions\n): SandboxAuth | null => {\n const token = options.token?.trim();\n if (!token) {\n return null;\n }\n\n const organisationUuid = options.organisationUuid?.trim();\n const workspaceUuid = options.workspaceUuid?.trim();\n const ucic = options.sandboxUcic?.trim();\n const email = options.sandboxEmail?.trim();\n const mobile = options.sandboxMobile?.trim();\n\n if (!organisationUuid || !workspaceUuid) {\n throw new Error(\n \"Sandbox mode requires organisationUuid and workspaceUuid\"\n );\n }\n if (!ucic && !email && !mobile) {\n throw new Error(\"Sandbox mode requires a UCIC, email, or mobile\");\n }\n\n return { token, ucic, email, mobile, organisationUuid, workspaceUuid };\n};\n\n/**\n * Resolve org/workspace UUIDs plus the sandbox context for an authenticated\n * request. In sandbox mode these come from options; otherwise they are decoded\n * from the JWT (preserving the pre-sandbox error messages exactly).\n *\n * @throws Error when neither a valid sandbox config nor a decodable token with\n * org/workspace UUIDs is available.\n */\nexport const resolveRequestAuth = (\n accessToken: string | undefined,\n options: SandboxOptions\n): ResolvedRequestAuth => {\n const sandbox = resolveSandboxAuth(options);\n if (sandbox) {\n return {\n organisationUuid: sandbox.organisationUuid,\n workspaceUuid: sandbox.workspaceUuid,\n sandbox,\n };\n }\n\n const decodedToken = accessToken ? decodeTokenSafely(accessToken) : null;\n if (!decodedToken) {\n throw new Error(\"Invalid access token\");\n }\n const { organisation_uuid, workspace_uuid } = decodedToken;\n if (!organisation_uuid || !workspace_uuid) {\n throw new Error(\"Invalid token: missing organization or workspace UUID\");\n }\n return {\n organisationUuid: organisation_uuid,\n workspaceUuid: workspace_uuid,\n sandbox: null,\n };\n};\n\n/**\n * Build the request headers for an authenticated call. In sandbox mode this is\n * the single `X-Consent-Token` credential (its presence marks the request as\n * `environment=test`); otherwise the standard `Authorization: Bearer`. There is\n * no subject header — the acting identity travels in the request's own payload\n * (see {@link sandboxQueryIdentity} for reads, {@link sandboxBodyIdentity} for\n * POSTs).\n */\nexport const buildAuthHeaders = (\n accessToken: string | undefined,\n sandbox: SandboxAuth | null\n): Record<string, string> => {\n if (sandbox) {\n return { [SANDBOX_TOKEN_HEADER]: sandbox.token };\n }\n return { Authorization: `Bearer ${accessToken}` };\n};\n\n/**\n * The identity payload for the sandbox acting principal — every identifier the\n * host supplied (`org_user_id` / `primary_email` / `primary_mobile`), mirroring\n * a live JWT's `user_data`. The server keys the principal by precedence (UCIC >\n * email > mobile) and preserves the rest as the display-only sandbox contact, so\n * the contact shows on the dashboard/receipt just as it does for a live user.\n * Merge this into a JSON request body (POST) or into query params (GET).\n */\nexport const sandboxBodyIdentity = (\n sandbox: SandboxAuth\n): SandboxIdentityPayload => {\n const payload: SandboxIdentityPayload = {};\n if (sandbox.ucic) {\n payload.org_user_id = sandbox.ucic;\n }\n if (sandbox.email) {\n payload.primary_email = sandbox.email;\n }\n if (sandbox.mobile) {\n payload.primary_mobile = sandbox.mobile;\n }\n return payload;\n};\n\n/**\n * The identity query fragment for GET/query reads — the same full identity as\n * {@link sandboxBodyIdentity}. Append these to the request's query string so the\n * server can resolve the acting test principal (it reads `org_user_id` /\n * `primary_email` / `primary_mobile` query params on sandbox reads).\n */\nexport const sandboxQueryIdentity = (\n sandbox: SandboxAuth\n): SandboxIdentityPayload => sandboxBodyIdentity(sandbox);\n","export const CODE_BY_NAME = new Map<string, string>([\n [\"english\", \"en\"],\n [\"assamese\", \"as\"],\n [\"bengali\", \"bn\"],\n [\"bodo\", \"brx\"],\n [\"dogri\", \"doi\"],\n [\"goan konkani\", \"gom\"],\n [\"gujarati\", \"gu\"],\n [\"hindi\", \"hi\"],\n [\"kannada\", \"kn\"],\n [\"kashmiri\", \"ks\"],\n [\"maithili\", \"mai\"],\n [\"malayalam\", \"ml\"],\n [\"manipuri\", \"mni-Mtei\"],\n [\"marathi\", \"mr\"],\n [\"nepali\", \"ne\"],\n [\"odia\", \"or\"],\n [\"punjabi\", \"pa\"],\n [\"sanskrit\", \"sa\"],\n [\"santali\", \"sat\"],\n [\"sindhi\", \"sd\"],\n [\"tamil\", \"ta\"],\n [\"telugu\", \"te\"],\n [\"urdu\", \"ur\"],\n]);\n\nexport const CODE_BY_LOWER = new Map<string, string>(\n [...CODE_BY_NAME.values()].map((c) => [c.toLowerCase(), c])\n);\n","import { CODE_BY_LOWER, CODE_BY_NAME } from \"./constants\";\n\nexport function toLanguageCode(lang?: string | null): string | undefined {\n if (!lang) {\n return undefined;\n }\n const trimmed = lang.trim();\n if (!trimmed) {\n return undefined;\n }\n const lower = trimmed.toLowerCase();\n return CODE_BY_LOWER.get(lower) ?? CODE_BY_NAME.get(lower) ?? trimmed;\n}\n\nexport function resolveDisplayLanguage(\n requested: string | undefined,\n defaultLanguage: string | undefined,\n translations: Record<string, unknown> | undefined\n): string {\n const fallback = defaultLanguage || \"en\";\n const requestedCode = toLanguageCode(requested);\n if (!requestedCode) {\n return fallback;\n }\n\n for (const key of Object.keys(translations || {})) {\n if (toLanguageCode(key) === requestedCode) {\n return key;\n }\n }\n\n return fallback;\n}\n","import { clearApiCache, getCachedData, setCachedData } from \"../services/cache\";\nimport { decodeTokenSafely } from \"../core/jwt-decode\";\nimport {\n buildAuthHeaders,\n resolveRequestAuth,\n sandboxBodyIdentity,\n sandboxQueryIdentity,\n} from \"./sandbox\";\nimport { toLanguageCode } from \"./language\";\nimport type {\n ConsentContent,\n ConsentEventPayload,\n FetchConsentContentParams,\n FetchConsentContentPublicParams,\n FetchTTSAudioUrlsParams,\n InitiateGuardianVerificationParams,\n InitiateGuardianVerificationResponse,\n SubmitConsentEventParams,\n SubmitConsentEventPublicParams,\n TTSAudioUrlsResponse,\n VerifyGuardianStatusParams,\n VerifyGuardianStatusResponse,\n} from \"./types\";\n\nconst BASE_URL = \"https://api.redacto.io/consent\";\nconst BASE_URL_PUBLIC = \"https://api.redacto.tech/consent\";\n\n// ─── Modal: fetch notice (authenticated, JWT-decoded) ───\n\nexport const fetchConsentContent = async ({\n noticeId,\n accessToken,\n baseUrl,\n language = \"en\",\n specific_uuid,\n validate_against = \"all\",\n include_fully_consented_data = false,\n signal,\n ...sandboxParams\n}: FetchConsentContentParams & { signal?: AbortSignal }): Promise<ConsentContent> => {\n if (!noticeId || !validate_against) {\n throw new Error(\"noticeId is required\");\n }\n if (!accessToken && !sandboxParams.token) {\n throw new Error(\"accessToken or token is required\");\n }\n\n const { organisationUuid: ORG, workspaceUuid: WS, sandbox } = resolveRequestAuth(\n accessToken,\n sandboxParams\n );\n\n const apiBaseUrl = baseUrl || BASE_URL;\n\n // Include org + workspace in the sandbox cache identity so two sessions\n // sharing an identity but scoped to different orgs never collide.\n const cacheIdentity = sandbox\n ? `sandbox:${sandbox.organisationUuid}:${sandbox.workspaceUuid}:${sandbox.ucic || sandbox.email || sandbox.mobile}`\n : accessToken;\n const cacheKey = `${cacheIdentity}-${noticeId}-${validate_against}-${language}-${specific_uuid || \"\"}-${include_fully_consented_data}`;\n\n if (validate_against === \"all\" && !specific_uuid) {\n const cached = getCachedData(cacheKey);\n if (cached) return cached;\n }\n\n const url = new URL(`${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/notices/${noticeId}`);\n if (specific_uuid) url.searchParams.append(\"specific_uuid\", specific_uuid);\n url.searchParams.append(\"validate_against\", validate_against);\n if (include_fully_consented_data) url.searchParams.append(\"include_fully_consented_data\", \"true\");\n // Sandbox mode: the acting identity travels as query params\n // (primary_email / primary_mobile); the credential is the X-Consent-Token header.\n if (sandbox) {\n for (const [key, value] of Object.entries(sandboxQueryIdentity(sandbox))) {\n if (value) url.searchParams.append(key, value);\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...buildAuthHeaders(accessToken, sandbox),\n \"Accept-Language\": language,\n },\n signal,\n });\n\n if (!response.ok) {\n let errorMessage = `Failed to fetch consent content: ${response.status} ${response.statusText}`;\n if (response.status === 401) errorMessage = \"Unauthorized: Invalid or expired token\";\n else if (response.status === 403) errorMessage = \"Forbidden: Access denied\";\n else if (response.status === 404) errorMessage = \"Notice not found\";\n else if (response.status === 409) errorMessage = \"User has already provided consent\";\n else if (response.status >= 500) errorMessage = \"Server error: Please try again later\";\n\n const error = new Error(errorMessage) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n const data: ConsentContent = await response.json();\n\n if (validate_against === \"all\" && !specific_uuid) {\n setCachedData(cacheKey, data);\n }\n\n return data;\n};\n\n// ─── Inline: fetch notice (public, no auth) ───\n\nexport const fetchConsentContentPublic = async ({\n org_uuid,\n workspace_uuid,\n notice_uuid,\n accessToken,\n baseUrl,\n language = \"en\",\n specific_uuid,\n}: FetchConsentContentPublicParams): Promise<ConsentContent> => {\n const apiBaseUrl = baseUrl || BASE_URL_PUBLIC;\n const noticesUrl = `${apiBaseUrl}/public/organisations/${org_uuid}/workspaces/${workspace_uuid}/notices`;\n\n const url = new URL(\n accessToken ? `${noticesUrl}/${notice_uuid}` : `${noticesUrl}/get-notice/${notice_uuid}`\n );\n if (specific_uuid) url.searchParams.append(\"specific_uuid\", specific_uuid);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept-Language\": language,\n ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}),\n },\n });\n\n if (response.status === 401) {\n const error = new Error(\"Unauthorized\") as Error & { status?: number };\n error.status = 401;\n throw error;\n }\n if (response.status === 409) {\n const error = new Error(\"User has already provided consent\") as Error & { status?: number };\n error.status = 409;\n throw error;\n }\n if (!response.ok) {\n throw new Error(`Failed to fetch consent content: ${response.statusText}`);\n }\n\n return await response.json();\n};\n\n// ─── Modal: submit consent (JWT-decoded) ───\n\nexport const submitConsentEvent = async ({\n accessToken,\n baseUrl,\n ledgerBaseUrl,\n noticeUuid,\n purposes,\n declined,\n meta_data,\n guardianVerificationReference,\n selfDeclaredAdult,\n language,\n signal,\n ...sandboxParams\n}: SubmitConsentEventParams & { signal?: AbortSignal }): Promise<void> => {\n if (!noticeUuid || !Array.isArray(purposes)) {\n throw new Error(\"noticeUuid and purposes array are required\");\n }\n if (!accessToken && !sandboxParams.token) {\n throw new Error(\"accessToken or token is required\");\n }\n\n const { organisationUuid: ORG, workspaceUuid: WS, sandbox } = resolveRequestAuth(\n accessToken,\n sandboxParams\n );\n\n // Route the write to the Go ledger when configured; fall back to the consent\n // server so existing integrations that only pass baseUrl keep working. Sandbox\n // never routes to the Go ledger (no X-Consent-Token support), so a sandbox\n // session forces the consent-server path even if a ledgerBaseUrl is set.\n const apiBaseUrl = (sandbox ? null : ledgerBaseUrl) || baseUrl || BASE_URL;\n\n const validatedPurposes = purposes.map((purpose) => {\n if (!purpose.uuid) throw new Error(\"Invalid purpose data: missing uuid\");\n\n const dataElements = (purpose.data_elements || [])\n .filter((element) => element.enabled)\n .map((element) => ({\n uuid: element.uuid,\n selected: element.required ? true : Boolean(element.selected),\n }));\n\n return {\n purpose_uuid: purpose.uuid,\n selected: Boolean(purpose.selected),\n data_elements: dataElements.length > 0 ? dataElements : undefined,\n };\n });\n\n const payload: ConsentEventPayload = {\n notice_uuid: noticeUuid,\n purposes: validatedPurposes,\n select_all_mandatory: false,\n source: \"WEB\",\n declined: Boolean(declined),\n meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid, minor_age: meta_data.minor_age } : undefined,\n guardian_verification_reference: guardianVerificationReference,\n self_declared_adult: selfDeclaredAdult,\n language: toLanguageCode(language),\n };\n\n // Sandbox mode: merge the acting test identity into the body (the server has\n // no subject header; it namespaces this identity `test::`).\n const requestBody = sandbox ? { ...payload, ...sandboxBodyIdentity(sandbox) } : payload;\n\n const response = await fetch(\n `${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/submit-consent`,\n {\n method: \"POST\",\n headers: {\n ...buildAuthHeaders(accessToken, sandbox),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n signal,\n }\n );\n\n if (!response.ok) {\n let errorMessage = `Failed to submit consent: ${response.status} ${response.statusText}`;\n if (response.status === 400) {\n try {\n const errorData = await response.json();\n errorMessage = errorData.message || \"Invalid request data\";\n } catch {\n errorMessage = \"Invalid request data\";\n }\n } else if (response.status === 401) errorMessage = \"Unauthorized: Invalid or expired token\";\n else if (response.status === 403) errorMessage = \"Forbidden: Access denied\";\n else if (response.status === 404) errorMessage = \"Notice not found\";\n else if (response.status >= 500) errorMessage = \"Server error: Please try again later\";\n\n const error = new Error(errorMessage) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n clearApiCache();\n};\n\n// ─── Inline: submit consent (direct org/workspace) ───\n\nexport const submitConsentEventPublic = async ({\n org_uuid,\n workspace_uuid,\n accessToken,\n baseUrl,\n ledgerBaseUrl,\n noticeUuid,\n purposes,\n declined,\n meta_data,\n language,\n}: SubmitConsentEventPublicParams): Promise<void> => {\n // Route the write to the Go ledger when configured; fall back to the consent\n // server so existing integrations that only pass baseUrl keep working.\n const apiBaseUrl = ledgerBaseUrl || baseUrl || BASE_URL_PUBLIC;\n\n const payload: ConsentEventPayload = {\n notice_uuid: noticeUuid,\n purposes: purposes.map((purpose) => {\n if (!purpose.uuid) throw new Error(\"Invalid purpose data: missing uuid\");\n\n const dataElements = purpose.data_elements\n .filter((element) => element.enabled)\n .map((element) => ({\n uuid: element.uuid,\n selected: element.required ? true : Boolean(element.selected),\n }));\n\n return {\n purpose_uuid: purpose.uuid,\n selected: Boolean(purpose.selected),\n data_elements: dataElements.length > 0 ? dataElements : undefined,\n };\n }),\n select_all_mandatory: false,\n source: \"WEB\",\n declined,\n meta_data,\n language: toLanguageCode(language),\n };\n\n const response = await fetch(\n `${apiBaseUrl}/public/organisations/${org_uuid}/workspaces/${workspace_uuid}/submit-consent`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n }\n );\n\n if (!response.ok) {\n let errorData;\n try {\n errorData = await response.json();\n } catch {\n errorData = { message: response.statusText };\n }\n\n if (response.status === 409) {\n const error = new Error(\n errorData.detail?.message || errorData.message || \"User has already provided consent\"\n ) as Error & { status?: number; code?: number };\n error.status = 409;\n error.code = errorData.code || 409;\n throw error;\n }\n\n const error = new Error(\n errorData.detail?.message || errorData.message || `Failed to submit consent event: ${response.statusText}`\n ) as Error & { status?: number; code?: number };\n error.status = response.status;\n error.code = errorData.code;\n throw error;\n }\n};\n\n// ─── TTS Audio ───\n\nexport const fetchTTSAudioUrls = async ({\n accessToken,\n baseUrl,\n ledgerBaseUrl,\n noticeUuid,\n language,\n signal,\n ...sandboxParams\n}: FetchTTSAudioUrlsParams & { signal?: AbortSignal }): Promise<TTSAudioUrlsResponse> => {\n if ((!accessToken && !sandboxParams.token) || !noticeUuid || !language) {\n throw new Error(\"accessToken (or token), noticeUuid, and language are required\");\n }\n\n const { organisationUuid: ORG, workspaceUuid: WS, sandbox } = resolveRequestAuth(\n accessToken,\n sandboxParams\n );\n\n // Prefer the Go ledger for audio, but a sandbox session never routes there:\n // the ledger's public reads are JWT-gated and don't support X-Consent-Token.\n // Without this a ledger-minted token is rejected by the consent server and\n // per-language audio silently disappears.\n const apiBaseUrl = (sandbox ? null : ledgerBaseUrl) || baseUrl || BASE_URL;\n const url = new URL(\n `${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/notices/${noticeUuid}/audio/${language}`\n );\n // Sandbox mode: the acting identity travels as query params\n // (primary_email / primary_mobile); the credential is the X-Consent-Token header.\n if (sandbox) {\n for (const [key, value] of Object.entries(sandboxQueryIdentity(sandbox))) {\n if (value) url.searchParams.append(key, value);\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...buildAuthHeaders(accessToken, sandbox),\n Accept: \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n let errorMessage = `Failed to fetch TTS audio URLs: ${response.status} ${response.statusText}`;\n if (response.status === 401) errorMessage = \"Unauthorized: Invalid or expired token\";\n else if (response.status === 403) errorMessage = \"Forbidden: Access denied\";\n else if (response.status === 404) errorMessage = \"Notice or audio not found\";\n else if (response.status >= 500) errorMessage = \"Server error: Please try again later\";\n\n const error = new Error(errorMessage) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n return await response.json();\n};\n\n// ─── Guardian Verification ───\n\nexport const initiateGuardianVerification = async ({\n accessToken,\n baseUrl,\n guardianName,\n guardianContact,\n guardianRelationship,\n frontendCallbackUrl,\n metadata,\n signal,\n}: InitiateGuardianVerificationParams): Promise<InitiateGuardianVerificationResponse> => {\n // Guardian verification is JWT-only: sandbox sessions have no minor-notice /\n // guardian support (the server 403s them, and C1 blocks minor notices at\n // render), so no sandbox identity is wired through here.\n if (!accessToken) throw new Error(\"accessToken is required\");\n if (!guardianName?.trim()) throw new Error(\"Guardian name is required\");\n if (!guardianContact?.trim()) throw new Error(\"Guardian contact is required\");\n if (!guardianRelationship?.trim()) throw new Error(\"Guardian relationship is required\");\n\n const decodedToken = decodeTokenSafely(accessToken);\n if (!decodedToken) throw new Error(\"Invalid access token\");\n const { organisation_uuid: ORG, workspace_uuid: WS } = decodedToken;\n if (!ORG || !WS) throw new Error(\"Invalid token: missing organization or workspace UUID\");\n\n const apiBaseUrl = baseUrl || BASE_URL;\n\n const payload: Record<string, any> = {\n guardian_name: guardianName.trim(),\n guardian_contact: guardianContact.trim(),\n guardian_relationship: guardianRelationship.trim(),\n };\n if (frontendCallbackUrl) payload.frontend_callback_url = frontendCallbackUrl;\n if (metadata) payload.metadata = metadata;\n\n const response = await fetch(\n `${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/guardian/initiate-verification`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n signal,\n }\n );\n\n if (!response.ok) {\n let errorMessage = `Failed to initiate verification: ${response.status} ${response.statusText}`;\n if (response.status === 400) {\n try {\n const errorData = await response.json();\n errorMessage = errorData.message || \"Invalid request data\";\n } catch {\n errorMessage = \"Invalid request data\";\n }\n } else if (response.status === 401) errorMessage = \"Unauthorized: Invalid or expired token\";\n else if (response.status === 404) errorMessage = \"Organization or workspace not found\";\n else if (response.status === 422) {\n try {\n const errorData = await response.json();\n errorMessage = errorData.message || \"Validation error: Please check your input\";\n } catch {\n errorMessage = \"Validation error: Please check your input\";\n }\n } else if (response.status >= 500) errorMessage = \"Server error: Please try again later\";\n\n const error = new Error(errorMessage) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n const responseData = await response.json();\n const detail = responseData.detail || responseData;\n\n if (detail.already_verified) {\n return {\n success: true,\n guardian_info_uuid: detail.guardian_info_uuid,\n already_verified: true,\n verification_reference: detail.verification_reference,\n };\n }\n\n if (!detail.session_token || !detail.digilocker_redirect_url) {\n throw new Error(\"Invalid response: missing session_token or digilocker_redirect_url\");\n }\n\n return {\n success: detail.success ?? true,\n guardian_info_uuid: detail.guardian_info_uuid,\n already_verified: false,\n session_token: detail.session_token,\n digilocker_redirect_url: detail.digilocker_redirect_url,\n expires_at: detail.expires_at,\n };\n};\n\nexport const verifyGuardianStatus = async ({\n accessToken,\n baseUrl,\n sessionToken,\n signal,\n}: VerifyGuardianStatusParams): Promise<VerifyGuardianStatusResponse> => {\n // Guardian verification is JWT-only: sandbox sessions have no minor-notice /\n // guardian support (the server 403s them, and C1 blocks minor notices at\n // render), so no sandbox identity is wired through here.\n if (!accessToken || !sessionToken) {\n throw new Error(\"accessToken and sessionToken are required\");\n }\n\n const decodedToken = decodeTokenSafely(accessToken);\n if (!decodedToken) throw new Error(\"Invalid access token\");\n const { organisation_uuid: ORG, workspace_uuid: WS } = decodedToken;\n if (!ORG || !WS) throw new Error(\"Invalid token: missing organization or workspace UUID\");\n\n const apiBaseUrl = baseUrl || BASE_URL;\n\n const response = await fetch(\n `${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/guardian/verify-status`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ session_token: sessionToken }),\n signal,\n }\n );\n\n if (!response.ok) {\n let errorMessage = `Failed to check verification status: ${response.status} ${response.statusText}`;\n if (response.status === 400) {\n try {\n const errorData = await response.json();\n errorMessage = errorData.message || errorData.detail?.message || \"Invalid session token\";\n } catch {\n errorMessage = \"Invalid session token\";\n }\n } else if (response.status === 401) errorMessage = \"Unauthorized: Invalid or expired token\";\n else if (response.status === 404)\n errorMessage = \"Verification session not found or expired. Please restart the verification process.\";\n else if (response.status === 410)\n errorMessage = \"Verification session has expired. Please restart the verification process.\";\n else if (response.status >= 500) errorMessage = \"Server error: Please try again later\";\n\n const error = new Error(errorMessage) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n const responseData = await response.json();\n const detail = responseData.detail || responseData;\n\n return {\n status: detail.status ?? \"in_progress\",\n guardian_info_uuid: detail.guardian_info_uuid ?? null,\n verification_reference: detail.verification_reference ?? null,\n guardian_details: detail.guardian_details ?? null,\n error: detail.error ?? null,\n error_code: detail.error_code ?? null,\n can_retry: detail.can_retry ?? true,\n };\n};\n","import { decodeTokenSafely } from \"../core/jwt-decode\";\nimport type {\n ConsentContent,\n DataElementSelection,\n FetchNoticeConsentStatusForScopeParams,\n FetchNoticeConsentStatusParams,\n LedgerConsentOverlay,\n NoticeConsentStatusResponse,\n PurposeSelection,\n} from \"./types\";\n\n/**\n * Go-ledger notice `check-consent` read.\n *\n * Post-cutover, consent records live in the Go ledger, so Python's notice\n * validation (which powered the 409 CONSENT_ALREADY_PROVIDED and the\n * `purpose_selections` / `reconsent_required` overlay) reads an empty consent\n * DB. When a `ledgerBaseUrl` is configured, the modal and the inline embed ask\n * the ledger directly instead.\n *\n * Every failure mode (no ledger configured, undecodable token, non-OK\n * response, network/abort/parse error) degrades to `null` so callers fall\n * back to the legacy Python-driven flow.\n */\n\n/**\n * Fetch the principal's current consent status for a notice from the Go\n * ledger (`check-consent`), with org/workspace supplied explicitly. The\n * principal resolves from the bearer token server-side, so the body is empty.\n * Returns null on any failure so the caller can fall back to the legacy flow.\n */\nexport const fetchNoticeConsentStatusForScope = async ({\n accessToken,\n ledgerBaseUrl,\n organisationUuid,\n workspaceUuid,\n noticeUuid,\n signal,\n}: FetchNoticeConsentStatusForScopeParams): Promise<NoticeConsentStatusResponse | null> => {\n if (!accessToken || !ledgerBaseUrl || !organisationUuid || !workspaceUuid || !noticeUuid) {\n return null;\n }\n\n try {\n const response = await fetch(\n `${ledgerBaseUrl}/public/organisations/${organisationUuid}/workspaces/${workspaceUuid}/notices/${noticeUuid}/check-consent`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: \"{}\",\n signal,\n }\n );\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as\n | NoticeConsentStatusResponse\n | { detail?: NoticeConsentStatusResponse };\n // The ledger returns the response directly; tolerate a {detail} envelope too.\n const body =\n data && typeof data === \"object\" && \"detail\" in data && data.detail\n ? data.detail\n : (data as NoticeConsentStatusResponse);\n\n if (!body || !Array.isArray(body.purposes)) return null;\n return body;\n } catch {\n // Network / abort / parse failure — degrade to the legacy Python flow.\n return null;\n }\n};\n\n/**\n * Same read, resolving org/workspace by decoding the JWT (the modal's tokens\n * carry them). Returns null on any failure.\n */\nexport const fetchNoticeConsentStatus = async ({\n accessToken,\n ledgerBaseUrl,\n noticeUuid,\n signal,\n}: FetchNoticeConsentStatusParams): Promise<NoticeConsentStatusResponse | null> => {\n if (!accessToken || !ledgerBaseUrl || !noticeUuid) return null;\n\n const decodedToken = decodeTokenSafely(accessToken);\n if (!decodedToken) return null;\n\n const { organisation_uuid: ORG, workspace_uuid: WS } = decodedToken;\n if (!ORG || !WS) return null;\n\n return fetchNoticeConsentStatusForScope({\n accessToken,\n ledgerBaseUrl,\n organisationUuid: ORG,\n workspaceUuid: WS,\n noticeUuid,\n signal,\n });\n};\n\n/**\n * Whether the principal has already fully consented to this notice with no\n * reconsent needed — the ledger equivalent of Python's 409\n * `CONSENT_ALREADY_PROVIDED`. Requires an active consent record with every\n * mandatory purpose still ACTIVE.\n */\nexport const isNoticeFullyConsented = (status: NoticeConsentStatusResponse): boolean =>\n status.consented && status.all_mandatory_active;\n\n/**\n * Translate the ledger's notice consent status into the\n * `{ purpose_selections, reconsent_required }` shape the modal already\n * consumes, so prior-consent pre-fill and reconsent categorization work off\n * the ledger. Returns null for a first-time principal (no consent record —\n * every purpose INACTIVE), preserving the normal first-time consent flow.\n *\n * `needs_reconsent` is derived from `status` (anything not ACTIVE needs\n * reconsent: expired / withdrawn / declined / inactive). NOTE: notice-version\n * reconsent is NOT covered — the ledger's check-consent has no version\n * awareness yet, so a republished-notice version bump won't re-prompt until\n * that lands on the ledger (tracked fast-follow).\n */\nexport const buildLedgerConsentOverlay = (\n status: NoticeConsentStatusResponse,\n configPurposes: ConsentContent[\"detail\"][\"active_config\"][\"purposes\"]\n): LedgerConsentOverlay | null => {\n const byUuid = new Map(status.purposes.map((p) => [p.uuid, p]));\n const hasHistory = status.purposes.some((p) => (p.status || \"INACTIVE\") !== \"INACTIVE\");\n if (!hasHistory) return null;\n\n const purpose_selections: Record<string, PurposeSelection> = {};\n for (const cp of configPurposes) {\n const lp = byUuid.get(cp.uuid);\n const purposeStatus = lp?.status || \"INACTIVE\";\n const selectedByUuid = new Map((lp?.data_elements || []).map((de) => [de.uuid, de.selected]));\n const data_elements: Record<string, DataElementSelection> = {};\n for (const de of cp.data_elements) {\n data_elements[de.uuid] = {\n selected: selectedByUuid.get(de.uuid) ?? false,\n enabled: de.enabled,\n required: de.required,\n };\n }\n purpose_selections[cp.uuid] = {\n selected: lp?.selected ?? false,\n status: purposeStatus,\n needs_reconsent: purposeStatus !== \"ACTIVE\",\n data_elements,\n };\n }\n\n const reconsent_required = configPurposes.some(\n (cp) => (purpose_selections[cp.uuid]?.status || \"INACTIVE\") !== \"ACTIVE\"\n );\n return { reconsent_required, purpose_selections };\n};\n","const STYLE_ID = \"redacto-consent-checkbox-styles\";\n\nconst STYLE_CONTENT = `\n /* Redacto Consent SDK Checkbox Styles */\n .redacto-checkbox-large {\n appearance: none !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n height: 20px !important;\n width: 20px !important;\n border: 2px solid #d0d5dd !important;\n border-radius: 5px !important;\n background-color: transparent !important;\n cursor: pointer !important;\n position: relative !important;\n box-sizing: border-box !important;\n margin: 0 !important;\n padding: 4px !important;\n }\n\n .redacto-checkbox-small {\n appearance: none !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n height: 16px !important;\n width: 16px !important;\n border: 2px solid #d0d5dd !important;\n border-radius: 5px !important;\n background-color: transparent !important;\n cursor: pointer !important;\n position: relative !important;\n box-sizing: border-box !important;\n margin: 0 !important;\n padding: 4px !important;\n }\n\n .redacto-checkbox-large:checked {\n background-color: #4f87ff !important;\n border-color: #4f87ff !important;\n }\n\n .redacto-checkbox-small:checked {\n background-color: #4f87ff !important;\n border-color: #4f87ff !important;\n }\n\n .redacto-checkbox-large:checked::after {\n content: '' !important;\n position: absolute !important;\n left: 50% !important;\n top: 50% !important;\n transform: translate(-50%, -50%) rotate(45deg) !important;\n width: 4px !important;\n height: 8px !important;\n border: solid white !important;\n border-width: 0 2px 2px 0 !important;\n box-sizing: border-box !important;\n }\n\n .redacto-checkbox-small:checked::after {\n content: '' !important;\n position: absolute !important;\n left: 50% !important;\n top: 50% !important;\n transform: translate(-50%, -50%) rotate(45deg) !important;\n width: 3px !important;\n height: 6px !important;\n border: solid white !important;\n border-width: 0 1.5px 1.5px 0 !important;\n box-sizing: border-box !important;\n }\n\n .redacto-checkbox-large:focus {\n outline: 2px solid #4f87ff !important;\n outline-offset: 2px !important;\n }\n\n .redacto-checkbox-small:focus {\n outline: 2px solid #4f87ff !important;\n outline-offset: 2px !important;\n }\n\n /* TTS Highlight Styles */\n .redacto-tts-highlight {\n position: relative !important;\n transition: background-color 0.3s ease, outline 0.3s ease !important;\n }\n\n h2.redacto-tts-highlight,\n h3.redacto-tts-highlight {\n background-color: #FFF9C4 !important;\n border-radius: 3px !important;\n padding: 2px 4px !important;\n margin: -2px -4px !important;\n }\n\n span.redacto-tts-highlight,\n a.redacto-tts-highlight {\n background-color: #FFF9C4 !important;\n border-radius: 3px !important;\n padding: 2px 4px !important;\n margin: -2px -4px !important;\n }\n\n p.redacto-tts-highlight {\n background-color: #FFF9C4 !important;\n border-radius: 3px !important;\n padding: 2px 4px !important;\n margin: -2px -4px !important;\n }\n\n button.redacto-tts-highlight {\n outline: 3px solid #FFF9C4 !important;\n outline-offset: 2px !important;\n }\n\n /* Overlay fade-in */\n @keyframes overlayFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n /* Spinner animation */\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n /* DigiLocker callback retry button hover */\n .redacto-dl-retry-btn:hover {\n background-color: #2563eb !important;\n }\n `;\n\n/**\n * Inject the checkbox / TTS / animation stylesheet into the given root.\n *\n * - When called with a `Document`, the style tag is placed in `document.head`.\n * - When called with a `ShadowRoot`, the style tag is placed inside the shadow\n * so it only applies within that shadow tree (full CSS isolation from the\n * host page).\n *\n * No-ops if the stylesheet is already present in the target root.\n */\nexport const injectCheckboxStyles = (\n root: Document | ShadowRoot\n): void => {\n if (typeof document === \"undefined\") return;\n\n // Skip if already injected into this root.\n const existing =\n root instanceof Document\n ? root.getElementById(STYLE_ID)\n : root.querySelector(`#${STYLE_ID}`);\n if (existing) return;\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = STYLE_CONTENT;\n\n if (root instanceof Document) {\n root.head.appendChild(style);\n } else {\n root.appendChild(style);\n }\n};\n","export const styles = {\n overlay: {\n position: \"fixed\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 999,\n animation: \"overlayFadeIn 0.2s cubic-bezier(0.16, 1, 0.3, 1)\",\n pointerEvents: \"all\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n modal: {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"700px\",\n borderRadius: \"8px\",\n backgroundColor: \"#ffffff\",\n boxShadow: \"4px 0px 4px 0px #00000040\",\n border: \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"90vh\",\n zIndex: 1000,\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n fontFamily: \"inherit\",\n },\n\n content: {\n margin: \"22px\",\n display: \"flex\",\n flexDirection: \"column\",\n flexGrow: 1,\n overflow: \"hidden\",\n minHeight: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n topSection: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n gap: \"10px\",\n paddingBottom: \"15px\",\n borderBottom: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n topLeft: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n flex: \"1 1 0\",\n minWidth: 0,\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n // The main notice header is two stacked rows: the logo alone on row 1,\n // aligned per active_config.logo_position, then the title and the\n // TTS/language controls on row 2. `topSection` and `topLeft` above keep their\n // single-row shape for the age-verification, guardian and verification\n // screens, which have no controls to place and share those styles.\n // Mirrors consent-sdk-react/src/RedactoNoticeConsent/styles.ts.\n headerStack: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n gap: \"10px\",\n paddingBottom: \"15px\",\n borderBottom: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n logoRow: {\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n headerRow: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"10px\",\n width: \"100%\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n logo: {\n height: \"32px\",\n width: \"auto\",\n maxWidth: \"140px\",\n objectFit: \"contain\",\n flexShrink: 0,\n margin: 0,\n padding: 0,\n display: \"block\",\n },\n\n title: {\n fontSize: \"18px\",\n fontWeight: 700,\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n verticalAlign: \"middle\",\n color: \"#101828\",\n flex: \"1 1 auto\",\n minWidth: 0,\n wordBreak: \"normal\",\n overflowWrap: \"anywhere\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n topRight: {\n borderRadius: \"8px\",\n padding: \"3px 9px\",\n border: \"1px solid #d0d5dd\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n fontWeight: 400,\n fontSize: \"12px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n verticalAlign: \"middle\",\n color: \"#344054\",\n gap: \"5px\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n cursor: \"pointer\",\n backgroundColor: \"#ffffff\",\n },\n\n middleSection: {\n margin: \"0px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\",\n flexGrow: 1,\n overflowY: \"auto\",\n minHeight: 0,\n paddingRight: \"15px\",\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n privacyText: {\n fontSize: \"16px\",\n fontWeight: 400,\n lineHeight: \"150%\",\n color: \"#344054\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n link: {\n color: \"#4f87ff\",\n textDecoration: \"none\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n subTitle: {\n fontWeight: 600,\n fontSize: \"16px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#101828\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n optionsContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionItem: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionLeft: {\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"center\",\n cursor: \"pointer\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionTextContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionTitle: {\n fontWeight: 500,\n fontSize: \"16px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#101828\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n optionDescription: {\n fontWeight: 400,\n fontSize: \"12px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#475467\",\n verticalAlign: \"middle\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n checkboxLarge: {\n height: \"20px\",\n width: \"20px\",\n padding: \"4px\",\n borderRadius: \"5px\",\n border: \"2px solid #d0d5dd\",\n margin: 0,\n boxSizing: \"border-box\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n backgroundColor: \"transparent\",\n },\n\n dataElementsContainer: {\n marginLeft: \"27px\",\n display: \"flex\",\n flexDirection: \"column\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n paddingLeft: \"22px\",\n },\n\n dataElementItem: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n justifyContent: \"space-between\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n minHeight: \"24px\",\n },\n\n dataElementText: {\n fontWeight: 400,\n fontSize: \"14px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#344054\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n checkboxSmall: {\n height: \"16px\",\n width: \"16px\",\n padding: \"4px\",\n borderRadius: \"5px\",\n border: \"2px solid #d0d5dd\",\n margin: 0,\n boxSizing: \"border-box\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n backgroundColor: \"transparent\",\n },\n\n bottomSection: {\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: \"29px\",\n paddingTop: \"15px\",\n borderTop: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n /**\n * The main notice footer. Wide: one row with decline pushed left and the\n * accepts grouped right. Narrow: a full-width stack. Review mode keeps\n * `bottomSection` — it collapses to a single button.\n */\n actionButtonRow: {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"12px\",\n paddingTop: \"15px\",\n borderTop: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n actionButtonStack: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\",\n paddingTop: \"15px\",\n borderTop: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n button: {\n width: \"100%\",\n borderRadius: \"8px\",\n padding: \"9px 45px\",\n fontWeight: 400,\n fontSize: \"16px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n cursor: \"pointer\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"center\",\n },\n\n acceptButton: {\n backgroundColor: \"#4f87ff\",\n border: \"none\",\n color: \"#ffffff\",\n },\n\n cancelButton: {\n border: \"1px solid #d0d5dd\",\n backgroundColor: \"#ffffff\",\n color: \"#000000\",\n },\n\n languageSelectorContainer: {\n position: \"relative\",\n // Shares `headerRow` with the title, which grows; without this a long\n // heading squeezes the language button instead of wrapping itself.\n flexShrink: 0,\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n languageDropdown: {\n position: \"absolute\",\n top: \"100%\",\n right: 0,\n backgroundColor: \"#ffffff\",\n border: \"1px solid #d0d5dd\",\n borderRadius: \"4px\",\n boxShadow: \"0px 2px 4px rgba(0, 0, 0, 0.1)\",\n zIndex: 10,\n width: \"max-content\",\n maxHeight: \"200px\",\n overflowY: \"auto\",\n marginTop: \"4px\",\n padding: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n languageItem: {\n padding: \"8px 12px\",\n cursor: \"pointer\",\n fontSize: \"12px\",\n color: \"#344054\",\n backgroundColor: \"#ffffff\",\n borderBottom: \"1px solid #e5e7eb\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n selectedLanguageItem: {\n backgroundColor: \"#f3f4f6\",\n fontWeight: 600,\n },\n\n loadingContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2rem\",\n minHeight: \"200px\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n loadingSpinner: {\n width: \"40px\",\n height: \"40px\",\n border: \"4px solid #f3f3f3\",\n borderTop: \"4px solid #3498db\",\n borderRadius: \"50%\",\n animation: \"spin 1s linear infinite\",\n marginBottom: \"1rem\",\n boxSizing: \"border-box\",\n },\n} as const;\n","import type { DpoInfoAudioKey, LogoPosition } from \"./api/types\";\n\nexport const DEFAULT_LOGO_POSITION: LogoPosition = \"left\";\n\n/**\n * English fallbacks for the action buttons, used when the notice config omits\n * a label — an older consent-server, or a notice published before the\n * accept-all shortcut existed.\n */\nexport const DEFAULT_ACCEPT_ALL_BUTTON_TEXT = \"Accept All\";\nexport const DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT = \"Accept Selected\";\nexport const DEFAULT_DECLINE_BUTTON_TEXT = \"Decline\";\n\n/**\n * DOM ids for the footer buttons. `confirm-button-text` and\n * `decline-button-text` predate the accept-all shortcut and are load-bearing\n * for the e2e suite and the TTS highlight sequence — do not rename them.\n */\nexport const ACCEPT_ALL_BUTTON_ID = \"accept-all-button-text\";\nexport const ACCEPT_SELECTED_BUTTON_ID = \"confirm-button-text\";\nexport const DECLINE_BUTTON_ID = \"decline-button-text\";\n\nexport const SUBMITTING_BUTTON_TEXT = \"Submitting...\";\n\n/**\n * `justify-content` for the logo row, keyed by the configured position. The row\n * is full width, so aligning it is the whole of the layout change.\n */\nexport const LOGO_POSITION_JUSTIFY: Record<LogoPosition, string> = {\n left: \"flex-start\",\n center: \"center\",\n right: \"flex-end\",\n};\n\n/** Glyph marking a required data element, and the purpose that carries one. */\nexport const REQUIRED_MARKER_GLYPH = \"*\";\n\nexport const REQUIRED_MARKER_ARIA_LABEL = \"required\";\n\nconst REQUIRED_MARKER_COLOR = \"red\";\n\n/** Gap between the label the marker annotates and the marker itself. */\nconst REQUIRED_MARKER_GAP = \"4px\";\n\nexport const REQUIRED_MARKER_STYLE: Readonly<Record<string, string>> = {\n color: REQUIRED_MARKER_COLOR,\n marginLeft: REQUIRED_MARKER_GAP,\n};\n\nexport const DPO_AUDIO_ELEMENT_MAP: ReadonlyArray<{\n audioKey: DpoInfoAudioKey;\n elementId: string;\n}> = [\n { audioKey: \"grievance_text_audio_url\", elementId: \"dpo-grievance-text\" },\n { audioKey: \"grievance_anchor_text_audio_url\", elementId: \"dpo-grievance-link\" },\n { audioKey: \"grievance_email_connector_text_audio_url\", elementId: \"dpo-grievance-email-connector\" },\n { audioKey: \"grievance_email_audio_url\", elementId: \"dpo-grievance-email\" },\n { audioKey: \"dp_board_text_audio_url\", elementId: \"dpo-dp-board-text\" },\n { audioKey: \"dp_board_anchor_text_audio_url\", elementId: \"dpo-dp-board-link\" },\n { audioKey: \"dpo_text_audio_url\", elementId: \"dpo-dpo-text\" },\n { audioKey: \"dpo_anchor_text_audio_url\", elementId: \"dpo-dpo-link\" },\n] as const;\n","import { el } from \"./dom\";\nimport {\n REQUIRED_MARKER_ARIA_LABEL,\n REQUIRED_MARKER_GLYPH,\n REQUIRED_MARKER_STYLE,\n} from \"../constants\";\nimport type { PurposeItemData } from \"../api/types\";\n\n/**\n * The red `*` that marks something the data subject cannot opt out of — a\n * required data element, or a purpose that carries one.\n *\n * Callers append this to the label element; append *after* any\n * `textContent` assignment, which replaces every existing child.\n */\nexport function createRequiredMarker(\n label: string = REQUIRED_MARKER_ARIA_LABEL\n): HTMLElement {\n return el(\n \"span\",\n { style: REQUIRED_MARKER_STYLE, \"aria-label\": label },\n REQUIRED_MARKER_GLYPH\n );\n}\n\n/**\n * Whether a purpose carries at least one required data element — the condition\n * for marking the purpose itself as required in the notice UI.\n *\n * Deliberately does not also test `enabled`: this drives a visual marker, and\n * it must agree with the per-element markers actually on screen.\n */\nexport function hasRequiredDataElement(purpose: PurposeItemData): boolean {\n return purpose.data_elements.some((element) => element.required);\n}\n","import { el, svg, applyStyles } from \"../core/dom\";\nimport {\n createRequiredMarker,\n hasRequiredDataElement,\n} from \"../core/required-marker\";\nimport { styles } from \"../styles/modal\";\nimport type { PurposeItemData, Settings } from \"../api/types\";\n\nexport type ModalPurposeRefs = {\n container: HTMLElement;\n checkboxes: Map<string, HTMLInputElement>;\n collapseButtons: Map<string, HTMLElement>;\n dataElementContainers: Map<string, HTMLElement>;\n chevrons: Map<string, SVGElement>;\n titleElements: Map<string, HTMLElement>;\n descriptionElements: Map<string, HTMLElement>;\n dataElementLabels: Map<string, HTMLElement>;\n};\n\nexport function renderModalPurposes(\n purposes: PurposeItemData[],\n options: {\n selectedPurposes: Record<string, boolean>;\n collapsedPurposes: Record<string, boolean>;\n selectedDataElements: Record<string, boolean>;\n initialDataElementSelections?: Record<string, boolean>;\n settings?: Partial<Settings>;\n isMobile: boolean;\n isAlreadyConsented: boolean;\n getTranslatedText: (key: string, defaultText: string, itemId?: string) => string;\n onPurposeToggle: (purposeUuid: string) => void;\n onPurposeCollapse: (purposeUuid: string) => void;\n onDataElementToggle: (elementUuid: string, purposeUuid: string) => void;\n }\n): ModalPurposeRefs {\n const {\n selectedPurposes,\n collapsedPurposes,\n selectedDataElements,\n initialDataElementSelections = {},\n settings,\n isMobile,\n isAlreadyConsented,\n getTranslatedText,\n onPurposeToggle,\n onPurposeCollapse,\n onDataElementToggle,\n } = options;\n\n const checkboxes = new Map<string, HTMLInputElement>();\n const collapseButtons = new Map<string, HTMLElement>();\n const dataElementContainers = new Map<string, HTMLElement>();\n const chevrons = new Map<string, SVGElement>();\n const titleElements = new Map<string, HTMLElement>();\n const descriptionElements = new Map<string, HTMLElement>();\n const dataElementLabels = new Map<string, HTMLElement>();\n\n const headingColor = settings?.headingColor || \"#323B4B\";\n const textColor = settings?.textColor || \"#344054\";\n const font = settings?.font || \"inherit\";\n\n const container = el(\"div\", { style: styles.optionsContainer });\n\n for (const purpose of purposes) {\n const purposeWrapper = el(\"div\");\n\n // Chevron\n const chevron = svg(\n \"svg\",\n {\n width: \"7\",\n height: \"12\",\n viewBox: \"0 0 7 12\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: headingColor,\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n style: {\n transform: !collapsedPurposes[purpose.uuid] ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.3s ease\",\n },\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", { d: \"M1 1L6 6L1 11\" })\n );\n chevrons.set(purpose.uuid, chevron);\n\n const chevronContainer = el(\n \"div\",\n { style: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", marginLeft: \"5px\" } },\n chevron\n );\n\n // Title\n const titleEl = el(\"h2\", {\n id: `purpose-name-${purpose.uuid}`,\n style: {\n ...styles.optionTitle,\n fontSize: isMobile ? \"14px\" : \"16px\",\n color: headingColor,\n fontFamily: font,\n },\n });\n // Appended after `textContent`, which replaces every existing child.\n titleEl.textContent = getTranslatedText(\"purposes.name\", purpose.name, purpose.uuid);\n if (hasRequiredDataElement(purpose)) {\n titleEl.appendChild(createRequiredMarker());\n }\n titleElements.set(purpose.uuid, titleEl);\n\n // Description\n const descEl = el(\"h3\", {\n id: `purpose-description-${purpose.uuid}`,\n style: {\n ...styles.optionDescription,\n fontSize: isMobile ? \"11px\" : \"12px\",\n color: textColor,\n fontFamily: font,\n },\n });\n descEl.textContent = getTranslatedText(\"purposes.description\", purpose.description, purpose.uuid);\n descriptionElements.set(purpose.uuid, descEl);\n\n const textContainer = el(\"div\", { style: styles.optionTextContainer }, titleEl, descEl);\n\n // Collapse button\n const collapseBtn = el(\"div\", {\n style: styles.optionLeft,\n role: \"button\",\n tabIndex: \"0\",\n \"aria-expanded\": String(!collapsedPurposes[purpose.uuid]),\n \"aria-controls\": `purpose-${purpose.uuid}`,\n \"aria-label\": `${collapsedPurposes[purpose.uuid] ? \"Expand\" : \"Collapse\"} ${getTranslatedText(\"purposes.name\", purpose.name, purpose.uuid)} details`,\n onClick: () => onPurposeCollapse(purpose.uuid),\n onKeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onPurposeCollapse(purpose.uuid);\n }\n },\n }, chevronContainer, textContainer);\n collapseButtons.set(purpose.uuid, collapseBtn);\n\n // Purpose checkbox or green checkmark\n let rightElement: HTMLElement;\n if (!isAlreadyConsented) {\n const purposeCheckbox = el(\"input\", {\n className: \"redacto-checkbox-large\",\n type: \"checkbox\",\n checked: selectedPurposes[purpose.uuid] || false,\n \"aria-label\": `Select all data elements for ${getTranslatedText(\"purposes.name\", purpose.name, purpose.uuid)}`,\n onChange: () => onPurposeToggle(purpose.uuid),\n }) as HTMLInputElement;\n checkboxes.set(purpose.uuid, purposeCheckbox);\n rightElement = purposeCheckbox;\n } else {\n rightElement = createGreenCheckmark(\n 20,\n `Already consented to ${getTranslatedText(\"purposes.name\", purpose.name, purpose.uuid)}`\n );\n applyStyles(rightElement, { marginLeft: \"12px\" });\n }\n\n const optionRow = el(\"div\", { style: styles.optionItem }, collapseBtn, rightElement);\n\n // Data elements\n const deContainer = el(\"div\", {\n id: `purpose-${purpose.uuid}`,\n style: styles.dataElementsContainer,\n });\n\n if (purpose.data_elements?.length > 0) {\n for (const dataElement of purpose.data_elements) {\n const combinedId = `${purpose.uuid}-${dataElement.uuid}`;\n\n const labelSpan = el(\"span\", {\n id: `data-element-${purpose.uuid}-${dataElement.uuid}`,\n style: {\n ...styles.dataElementText,\n fontSize: isMobile ? \"12px\" : \"14px\",\n color: textColor,\n fontFamily: font,\n },\n });\n labelSpan.textContent = getTranslatedText(\"data_elements.name\", dataElement.name, dataElement.uuid);\n dataElementLabels.set(combinedId, labelSpan);\n\n if (dataElement.required) {\n labelSpan.appendChild(createRequiredMarker());\n }\n\n let deRightElement: HTMLElement;\n if (!isAlreadyConsented) {\n const deCheckbox = el(\"input\", {\n className: \"redacto-checkbox-small\",\n type: \"checkbox\",\n checked: selectedDataElements[combinedId] || false,\n \"aria-label\": `Select ${getTranslatedText(\"data_elements.name\", dataElement.name, dataElement.uuid)}${dataElement.required ? \" (required)\" : \"\"}`,\n onChange: () => onDataElementToggle(dataElement.uuid, purpose.uuid),\n }) as HTMLInputElement;\n checkboxes.set(combinedId, deCheckbox);\n deRightElement = deCheckbox;\n } else {\n const wasSelected = initialDataElementSelections[combinedId] || false;\n if (wasSelected) {\n deRightElement = createGreenCheckmark(\n 16,\n `Consented to ${getTranslatedText(\"data_elements.name\", dataElement.name, dataElement.uuid)}`\n );\n } else {\n deRightElement = el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"16px\",\n height: \"16px\",\n borderRadius: \"50%\",\n border: \"2px solid #d0d5dd\",\n backgroundColor: \"transparent\",\n },\n \"aria-label\": `Not consented to ${getTranslatedText(\"data_elements.name\", dataElement.name, dataElement.uuid)}`,\n });\n }\n }\n\n const deRow = el(\"div\", { style: styles.dataElementItem }, labelSpan, deRightElement);\n deContainer.appendChild(deRow);\n }\n }\n\n dataElementContainers.set(purpose.uuid, deContainer);\n deContainer.style.display = !collapsedPurposes[purpose.uuid] && purpose.data_elements?.length > 0 ? \"flex\" : \"none\";\n\n purposeWrapper.appendChild(optionRow);\n purposeWrapper.appendChild(deContainer);\n container.appendChild(purposeWrapper);\n }\n\n return {\n container,\n checkboxes,\n collapseButtons,\n dataElementContainers,\n chevrons,\n titleElements,\n descriptionElements,\n dataElementLabels,\n };\n}\n\nfunction createGreenCheckmark(size: number, ariaLabel: string): HTMLElement {\n const svgSize = size === 20 ? 12 : 10;\n const strokeWidth = size === 20 ? \"2\" : \"1.5\";\n const pathD = size === 20 ? \"M4 6L5.5 7.5L8.5 4.5\" : \"M3 5L4.5 6.5L7.5 3.5\";\n\n const checkSvg = svg(\n \"svg\",\n {\n width: String(svgSize),\n height: String(svgSize),\n viewBox: `0 0 ${svgSize} ${svgSize}`,\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", {\n d: pathD,\n stroke: \"white\",\n \"stroke-width\": strokeWidth,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n })\n );\n\n return el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: \"50%\",\n backgroundColor: \"#10B981\",\n },\n \"aria-label\": ariaLabel,\n }, checkSvg);\n}\n","import { el, svg, applyStyles } from \"../core/dom\";\nimport { styles } from \"../styles/modal\";\nimport type { Settings } from \"../api/types\";\n\nconst LANGUAGE_NATIVE_LABELS: Record<string, string> = {\n English: \"English\",\n Assamese: \"অসমীয়া (Assamese)\",\n Bengali: \"বাংলা (Bengali)\",\n Bodo: \"बड़ो (Bodo)\",\n Dogri: \"डोगरी (Dogri)\",\n \"Goan Konkani\": \"कोंकणी (Goan Konkani)\",\n Gujarati: \"ગુજરાતી (Gujarati)\",\n Hindi: \"हिन्दी (Hindi)\",\n Kannada: \"ಕನ್ನಡ (Kannada)\",\n Kashmiri: \"كٲشُر (Kashmiri)\",\n Maithili: \"मैथिली (Maithili)\",\n Malayalam: \"മലയാളം (Malayalam)\",\n Manipuri: \"ꯃꯩꯇꯩꯂꯣꯟ (Manipuri)\",\n Marathi: \"मराठी (Marathi)\",\n Nepali: \"नेपाली (Nepali)\",\n Odia: \"ଓଡ଼ିଆ (Odia)\",\n Punjabi: \"ਪੰਜਾਬੀ (Punjabi)\",\n Sanskrit: \"संस्कृतम् (Sanskrit)\",\n Santali: \"ᱥᱟᱱᱛᱟᱲᱤ (Santali)\",\n Sindhi: \"سنڌي (Sindhi)\",\n Tamil: \"தமிழ் (Tamil)\",\n Telugu: \"తెలుగు (Telugu)\",\n Urdu: \"اردو (Urdu)\",\n};\n\nconst toNativeLabel = (name: string): string => LANGUAGE_NATIVE_LABELS[name] ?? name;\n\nexport type LanguageSelectorRefs = {\n container: HTMLElement;\n button: HTMLElement;\n dropdown: HTMLElement;\n buttonText: HTMLElement;\n};\n\nexport function renderLanguageSelector(options: {\n languages: string[];\n selectedLanguage: string;\n settings?: Partial<Settings>;\n onSelect: (lang: string) => void;\n /**\n * Where the dropdown panel itself is appended. We append it as a sibling of\n * the modal (rather than inside `container`) so it can escape the modal's\n * `transform: translate(...)` stacking context. Pass the shadow root when\n * the modal is rendered inside a shadow boundary; otherwise pass\n * `document.body`.\n */\n dropdownContainer: HTMLElement | ShadowRoot;\n}): LanguageSelectorRefs {\n const { languages, selectedLanguage, settings, onSelect, dropdownContainer } = options;\n\n let isOpen = false;\n\n const buttonText = el(\"span\");\n buttonText.textContent = toNativeLabel(selectedLanguage);\n\n const chevronSvg = svg(\n \"svg\",\n {\n width: \"8\",\n height: \"5\",\n viewBox: \"0 0 8 5\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n },\n svg(\"path\", {\n d: \"M1 1L4 4L7 1\",\n stroke: settings?.button?.language?.textColor || \"#344054\",\n \"stroke-width\": \"1.5\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n })\n );\n\n const buttonStyle: Record<string, any> = { ...styles.topRight };\n if (settings?.button?.language) {\n buttonStyle.backgroundColor = settings.button.language.backgroundColor;\n buttonStyle.color = settings.button.language.textColor;\n }\n\n const button = el(\"div\", {\n style: buttonStyle,\n role: \"button\",\n tabIndex: \"0\",\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": \"false\",\n \"aria-label\": `Language selector, current: ${toNativeLabel(selectedLanguage)}`,\n onClick: () => toggleDropdown(),\n onKeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleDropdown();\n } else if (e.key === \"Escape\") {\n closeDropdown();\n }\n },\n }, buttonText, chevronSvg);\n\n // Dropdown — uses position:fixed to escape modal's transform stacking context\n const dropdown = el(\"div\", {\n style: {\n position: \"fixed\",\n backgroundColor: \"#ffffff\",\n border: \"1px solid #d0d5dd\",\n borderRadius: \"4px\",\n boxShadow: \"0px 4px 12px rgba(0, 0, 0, 0.15)\",\n zIndex: 2147483647, // max int — always on top\n minWidth: \"140px\",\n maxHeight: \"200px\",\n overflowY: \"auto\",\n padding: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n display: \"none\",\n },\n role: \"listbox\",\n \"aria-label\": \"Select language\",\n });\n\n for (const lang of languages) {\n const isSelected = lang === selectedLanguage;\n const itemStyle = isSelected\n ? { ...styles.languageItem, ...styles.selectedLanguageItem }\n : { ...styles.languageItem };\n\n if (settings?.button?.language) {\n if (isSelected && settings.button.language.selectedBackgroundColor) {\n itemStyle.backgroundColor = settings.button.language.selectedBackgroundColor;\n }\n if (isSelected && settings.button.language.selectedTextColor) {\n itemStyle.color = settings.button.language.selectedTextColor;\n }\n }\n\n const item = el(\"div\", {\n style: itemStyle,\n role: \"option\",\n \"aria-selected\": String(isSelected),\n onClick: () => {\n onSelect(lang);\n closeDropdown();\n },\n onMouseenter: (e: Event) => {\n (e.target as HTMLElement).style.backgroundColor = \"#f3f4f6\";\n },\n onMouseleave: (e: Event) => {\n (e.target as HTMLElement).style.backgroundColor = isSelected ? \"#f3f4f6\" : \"#ffffff\";\n },\n });\n item.textContent = toNativeLabel(lang);\n dropdown.appendChild(item);\n }\n\n // Container only holds the button — dropdown is appended to its container\n // (shadow root in the modal flow, body for non-shadow callers) so it can\n // escape the modal's transform stacking context.\n const container = el(\"div\", { style: styles.languageSelectorContainer }, button);\n\n dropdownContainer.appendChild(dropdown);\n\n function positionDropdown() {\n const rect = button.getBoundingClientRect();\n dropdown.style.top = `${rect.bottom + 4}px`;\n dropdown.style.right = `${window.innerWidth - rect.right}px`;\n dropdown.style.left = \"auto\";\n }\n\n // Click outside handler. When the modal is inside a shadow root the click\n // event's `target` is retargeted to the shadow host for listeners on the\n // document. `composedPath()` returns the real path through the shadow tree\n // so we can correctly detect whether the click originated inside the\n // selector or its dropdown.\n const clickOutsideHandler = (e: Event) => {\n const path = (e as Event & { composedPath?: () => EventTarget[] }).composedPath?.() ?? [];\n if (path.includes(container) || path.includes(dropdown)) return;\n\n // Fallback for environments without composedPath()\n if (path.length === 0) {\n const target = e.target as Node;\n if (container.contains(target) || dropdown.contains(target)) return;\n }\n closeDropdown();\n };\n\n // Reposition on scroll/resize while open\n const repositionHandler = () => {\n if (isOpen) positionDropdown();\n };\n\n function toggleDropdown() {\n isOpen ? closeDropdown() : openDropdown();\n }\n\n function openDropdown() {\n isOpen = true;\n positionDropdown();\n dropdown.style.display = \"block\";\n button.setAttribute(\"aria-expanded\", \"true\");\n setTimeout(() => {\n document.addEventListener(\"click\", clickOutsideHandler);\n }, 0);\n window.addEventListener(\"scroll\", repositionHandler, true);\n window.addEventListener(\"resize\", repositionHandler);\n }\n\n function closeDropdown() {\n isOpen = false;\n dropdown.style.display = \"none\";\n button.setAttribute(\"aria-expanded\", \"false\");\n document.removeEventListener(\"click\", clickOutsideHandler);\n window.removeEventListener(\"scroll\", repositionHandler, true);\n window.removeEventListener(\"resize\", repositionHandler);\n }\n\n return { container, button, dropdown, buttonText };\n}\n","/**\n * Focus trap + keyboard navigation for the modal.\n */\n\nexport type KeyboardTrapCleanup = () => void;\n\nexport function setupKeyboardTrap(\n modalEl: HTMLElement,\n onEscape: () => void\n): KeyboardTrapCleanup {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onEscape();\n return;\n }\n\n if (e.key === \"Tab\") {\n const focusableElements = modalEl.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const focusable = Array.from(focusableElements).filter(\n (el) => !el.hasAttribute(\"disabled\") && el.offsetParent !== null\n );\n\n if (focusable.length === 0) {\n e.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n // When the modal lives inside a shadow root, document.activeElement\n // returns the shadow host rather than the actually focused element.\n // Read activeElement from the modal's own root for a correct answer.\n const root = modalEl.getRootNode() as Document | ShadowRoot;\n const active =\n (root as ShadowRoot).activeElement ?? document.activeElement;\n\n if (e.shiftKey) {\n if (active === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n };\n\n document.addEventListener(\"keydown\", handler);\n\n // Auto-focus first focusable element\n requestAnimationFrame(() => {\n const firstFocusable = modalEl.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n firstFocusable?.focus();\n });\n\n return () => {\n document.removeEventListener(\"keydown\", handler);\n };\n}\n","import type { PersistedConsentState } from \"../api/types\";\n\nconst STORAGE_KEY = \"redacto_consent_sdk_state\";\nconst STATE_EXPIRY_MS = 30 * 60 * 1000; // 30 minutes\n\nconst isBrowser = (): boolean => {\n return typeof window !== \"undefined\" && typeof window.sessionStorage !== \"undefined\";\n};\n\nexport const saveConsentState = (state: PersistedConsentState): void => {\n if (!isBrowser()) {\n console.warn(\"SessionStorage not available - state not persisted\");\n return;\n }\n\n try {\n const stateWithTimestamp = {\n ...state,\n timestamp: new Date().toISOString(),\n };\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(stateWithTimestamp));\n } catch (error) {\n console.error(\"Failed to save consent state:\", error);\n }\n};\n\nexport const getConsentState = (): PersistedConsentState | null => {\n if (!isBrowser()) return null;\n\n try {\n const savedState = sessionStorage.getItem(STORAGE_KEY);\n if (!savedState) return null;\n\n const parsed: PersistedConsentState = JSON.parse(savedState);\n\n const stateAge = Date.now() - new Date(parsed.timestamp).getTime();\n if (stateAge > STATE_EXPIRY_MS) {\n clearConsentState();\n return null;\n }\n\n return parsed;\n } catch (error) {\n console.error(\"Failed to get consent state:\", error);\n return null;\n }\n};\n\nexport const clearConsentState = (): void => {\n if (!isBrowser()) return;\n\n try {\n sessionStorage.removeItem(STORAGE_KEY);\n } catch (error) {\n console.error(\"Failed to clear consent state:\", error);\n }\n};\n\nexport const updateConsentState = (updates: Partial<PersistedConsentState>): void => {\n const currentState = getConsentState();\n if (currentState) {\n saveConsentState({\n ...currentState,\n ...updates,\n timestamp: new Date().toISOString(),\n });\n }\n};\n\nexport const hasPendingVerification = (): boolean => {\n const state = getConsentState();\n return state !== null && state.flowState === \"digilocker-pending\";\n};\n\nexport const getVerificationResult = (): \"pending\" | \"verified\" | \"failed\" | \"in_progress\" | \"expired\" | null => {\n const state = getConsentState();\n return state?.verificationResult ?? null;\n};\n\nexport const getVerificationReference = (): string | null => {\n const state = getConsentState();\n return state?.verificationReference ?? null;\n};\n","import { fetchTTSAudioUrls } from \"../api\";\nimport {\n ACCEPT_ALL_BUTTON_ID,\n ACCEPT_SELECTED_BUTTON_ID,\n DECLINE_BUTTON_ID,\n DPO_AUDIO_ELEMENT_MAP,\n} from \"../constants\";\nimport type {\n ActiveConfig,\n SandboxOptions,\n TTSAudioUrlsResponse,\n} from \"../api/types\";\n\nexport class TTSManager {\n private audioUrls: TTSAudioUrlsResponse[\"detail\"] | null = null;\n private audioSequence: string[] = [];\n private elementIdSequence: string[] = [];\n private currentAudio: HTMLAudioElement | null = null;\n private currentIndex = 0;\n private _isPlaying = false;\n private _isPaused = false;\n private _isAvailable = false;\n private highlightedElementId: string | null = null;\n private abortController: AbortController | null = null;\n private onStateChange: () => void;\n private root: Document | ShadowRoot;\n\n /**\n * @param onStateChange Invoked whenever playback state changes so the host\n * can refresh its UI (e.g. swap the play/pause icon).\n * @param root The root in which to look up highlightable elements by id.\n * When the modal is rendered inside a shadow root, pass that shadow root\n * so queries stay scoped to the SDK's tree (and don't accidentally hit\n * element ids that the host page also defines).\n */\n constructor(onStateChange: () => void, root: Document | ShadowRoot) {\n this.onStateChange = onStateChange;\n this.root = root;\n }\n\n get isPlaying(): boolean { return this._isPlaying; }\n get isPaused(): boolean { return this._isPaused; }\n get isAvailable(): boolean { return this._isAvailable; }\n\n async fetchAudioUrls(params: SandboxOptions & {\n accessToken?: string;\n baseUrl?: string;\n ledgerBaseUrl?: string;\n noticeUuid: string;\n language: string;\n content: ActiveConfig;\n }): Promise<void> {\n // Reset availability + sequences SYNCHRONOUSLY before notifying. The\n // language can change while a previous language's URLs are still loaded;\n // if we don't clear here, a click on the speaker icon (or the in-flight\n // stop()) would either keep the icon showing or replay the previous\n // language's audio. We then fire a single onStateChange() so the UI hides\n // the icon while the new language's audio is being fetched.\n this.stopInternal();\n this._isAvailable = false;\n this.audioUrls = null;\n this.audioSequence = [];\n this.elementIdSequence = [];\n this.onStateChange();\n\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n try {\n const response = await fetchTTSAudioUrls({\n accessToken: params.accessToken,\n baseUrl: params.baseUrl,\n ledgerBaseUrl: params.ledgerBaseUrl,\n noticeUuid: params.noticeUuid,\n language: params.language,\n signal: this.abortController.signal,\n token: params.token,\n sandboxUcic: params.sandboxUcic,\n sandboxEmail: params.sandboxEmail,\n sandboxMobile: params.sandboxMobile,\n organisationUuid: params.organisationUuid,\n workspaceUuid: params.workspaceUuid,\n });\n\n this.audioUrls = response.detail;\n this.buildSequences(params.content);\n // Only mark TTS as available if the backend actually returned playable\n // audio for this language. Some languages (e.g. Santali) come back with\n // a 200 but empty / partial fields — surfacing the speaker icon in that\n // case would let users click it and replay the previous language.\n this._isAvailable = this.audioSequence.length > 0;\n this.onStateChange();\n } catch (error) {\n if ((error as Error).name !== \"AbortError\") {\n this._isAvailable = false;\n this.audioUrls = null;\n this.audioSequence = [];\n this.elementIdSequence = [];\n this.onStateChange();\n }\n }\n }\n\n private buildSequences(content: ActiveConfig): void {\n if (!this.audioUrls) return;\n const urls = this.audioUrls;\n\n const audioSeq: string[] = [];\n const elementSeq: string[] = [];\n\n const push = (url: string | undefined, elementId: string) => {\n if (url) {\n audioSeq.push(url);\n elementSeq.push(elementId);\n }\n };\n\n // 1. Notice banner heading\n push(urls.notice_banner_heading_audio_url, \"privacy-notice-title\");\n // 2. Notice text\n push(urls.notice_text_audio_url, \"privacy-notice-text\");\n // 3. Privacy policy prefix text\n push(urls.privacy_policy_prefix_text_audio_url, \"privacy-policy-text\");\n // 4. Privacy policy anchor text\n push(urls.privacy_policy_anchor_text_audio_url, \"privacy-policy-link\");\n // 5. Purpose section heading\n push(urls.purpose_section_heading_audio_url, \"purpose-section-heading\");\n\n // 6. For each purpose: name, description, data elements\n for (const purpose of content.purposes) {\n const purposeAudio = urls.purposes_audio?.[purpose.uuid];\n if (purposeAudio) {\n push(purposeAudio.name_audio_url, `purpose-name-${purpose.uuid}`);\n push(purposeAudio.description_audio_url, `purpose-description-${purpose.uuid}`);\n }\n\n for (const de of purpose.data_elements) {\n const deAudio = urls.data_elements_audio?.[de.uuid];\n if (deAudio) {\n push(deAudio.name_audio_url, `data-element-${purpose.uuid}-${de.uuid}`);\n }\n }\n }\n\n // 7. Additional text\n push(urls.additional_text_audio_url, \"additional-text\");\n // 8. Privacy center anchor text\n push(urls.privacy_center_anchor_text_audio_url, \"privacy-center-link\");\n\n // 9. DPO info audio\n if (urls.dpo_info_audio) {\n for (const mapping of DPO_AUDIO_ELEMENT_MAP) {\n const audioUrl = urls.dpo_info_audio[mapping.audioKey];\n push(audioUrl, mapping.elementId);\n }\n }\n\n // 10. Action buttons, read in the order they are laid out.\n push(urls.accept_all_button_text_audio_url, ACCEPT_ALL_BUTTON_ID);\n push(urls.confirm_button_text_audio_url, ACCEPT_SELECTED_BUTTON_ID);\n push(urls.decline_button_text_audio_url, DECLINE_BUTTON_ID);\n\n this.audioSequence = audioSeq;\n this.elementIdSequence = elementSeq;\n }\n\n toggle(): void {\n this._isPlaying ? this.pause() : this.play();\n }\n\n play(): void {\n if (this.audioSequence.length === 0) return;\n\n if (this._isPaused && this.currentAudio) {\n this.currentAudio.play()\n .then(() => {\n this._isPlaying = true;\n this._isPaused = false;\n this.onStateChange();\n })\n .catch(() => {});\n } else {\n const startIndex = this._isPlaying ? this.currentIndex : 0;\n this.playNextAudio(startIndex);\n }\n }\n\n pause(): void {\n if (this.currentAudio && this._isPlaying) {\n this.currentAudio.pause();\n this._isPlaying = false;\n this._isPaused = true;\n this.onStateChange();\n }\n }\n\n stop(): void {\n this.stopInternal();\n this.onStateChange();\n }\n\n /**\n * Internal stop used by code paths (like fetchAudioUrls) that will fire\n * their own onStateChange after composing a richer state update — we don't\n * want the intermediate notification to flicker the UI based on a half-set\n * state (e.g. _isAvailable still true from the previous language).\n */\n private stopInternal(): void {\n if (this.currentAudio) {\n this.currentAudio.pause();\n this.currentAudio.currentTime = 0;\n this.currentAudio = null;\n }\n this._isPlaying = false;\n this._isPaused = false;\n this.currentIndex = 0;\n this.removeHighlights();\n this.highlightedElementId = null;\n }\n\n destroy(): void {\n this.abortController?.abort();\n this.stop();\n }\n\n private playNextAudio(index: number): void {\n if (index >= this.audioSequence.length) {\n this.stop();\n return;\n }\n\n if (this.currentAudio) {\n this.currentAudio.pause();\n this.currentAudio = null;\n }\n\n const audio = new Audio(this.audioSequence[index]);\n this.currentAudio = audio;\n this.currentIndex = index;\n this._isPlaying = true;\n this._isPaused = false;\n\n // Highlight\n const elementId = this.elementIdSequence[index];\n if (elementId) {\n this.highlightElement(elementId);\n }\n\n audio.onended = () => this.playNextAudio(index + 1);\n audio.onerror = () => {\n console.warn(`Failed to load audio at index ${index}`);\n this.playNextAudio(index + 1);\n };\n\n audio.play().catch((error) => {\n console.warn(`Failed to play audio at index ${index}:`, error);\n this._isPlaying = false;\n this.onStateChange();\n });\n\n this.onStateChange();\n }\n\n private highlightElement(elementId: string): void {\n this.removeHighlights();\n this.highlightedElementId = elementId;\n\n setTimeout(() => {\n // ShadowRoot has getElementById in modern browsers; fall back to\n // querySelector with CSS.escape for safety.\n const element =\n \"getElementById\" in this.root\n ? (this.root as Document | ShadowRoot & { getElementById(id: string): HTMLElement | null }).getElementById(elementId)\n : (this.root as ShadowRoot).querySelector<HTMLElement>(`#${CSS.escape(elementId)}`);\n if (element) {\n element.classList.add(\"redacto-tts-highlight\");\n\n const rect = element.getBoundingClientRect();\n const isVisible =\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth;\n\n if (!isVisible) {\n element.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"nearest\",\n });\n }\n }\n }, 50);\n }\n\n private removeHighlights(): void {\n this.root.querySelectorAll(\".redacto-tts-highlight\").forEach((el) => {\n el.classList.remove(\"redacto-tts-highlight\");\n });\n }\n}\n","import { el, svg } from \"../core/dom\";\nimport { styles } from \"../styles/modal\";\nimport type { Settings } from \"../api/types\";\nimport type { ResolvedColors } from \"./colors\";\n\nexport type AgeVerificationRefs = {\n container: HTMLElement;\n};\n\nexport function renderAgeVerification(options: {\n settings?: Partial<Settings>;\n colors: ResolvedColors;\n isMobile: boolean;\n logoUrl: string;\n onYes: () => void;\n onNo: () => void;\n onClose: () => void;\n}): AgeVerificationRefs {\n const { settings, colors, isMobile, logoUrl, onYes, onNo, onClose } = options;\n\n const headingColor = settings?.headingColor || \"#101828\";\n const textColor = colors.text;\n const font = colors.font;\n\n // ─── Top Section (matches React: logo+title left, X button right) ───\n const logo = el(\"img\", { src: logoUrl, style: styles.logo, alt: \"Redacto Logo\" });\n\n const title = el(\"h2\", {\n id: \"age-verification-title\",\n style: {\n ...styles.title,\n fontSize: isMobile ? \"16px\" : \"18px\",\n color: headingColor,\n fontFamily: font,\n },\n });\n title.textContent = \"Age Verification Required\";\n\n const topLeft = el(\"div\", { style: styles.topLeft }, logo, title);\n\n const closeBtn = el(\"button\", {\n style: {\n background: \"none\",\n border: \"none\",\n color: headingColor,\n cursor: \"pointer\",\n padding: isMobile ? \"2px\" : \"4px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n type: \"button\",\n \"aria-label\": \"Close modal\",\n onClick: onClose,\n });\n const closeSvg = svg(\n \"svg\",\n {\n width: isMobile ? \"18\" : \"20\",\n height: isMobile ? \"18\" : \"20\",\n viewBox: \"0 0 20 20\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", {\n d: \"M15 5L5 15M5 5L15 15\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n })\n );\n closeBtn.appendChild(closeSvg);\n\n const topSection = el(\"div\", {\n style: { ...styles.topSection, color: textColor, fontFamily: font },\n }, topLeft, closeBtn);\n\n // ─── Middle Section ───\n const description = el(\"p\", {\n style: {\n ...styles.privacyText,\n fontSize: isMobile ? \"14px\" : \"16px\",\n color: textColor,\n fontFamily: font,\n marginBottom: \"16px\",\n },\n });\n description.textContent = \"To proceed with this consent form, we need to verify your age.\";\n\n const question = el(\"p\", {\n style: {\n ...styles.subTitle,\n color: textColor,\n fontFamily: font,\n marginBottom: \"24px\",\n textAlign: \"left\",\n },\n });\n question.textContent = \"Are you 18 years of age or older?\";\n\n const middleSection = el(\"div\", {\n style: { ...styles.middleSection, color: textColor, fontFamily: font },\n }, description, question);\n\n // ─── Bottom Section (Yes first, No second — matches React) ───\n const btnBase = {\n ...styles.button,\n fontSize: isMobile ? \"14px\" : \"16px\",\n padding: isMobile ? \"10px 20px\" : \"9px 45px\",\n };\n\n const yesBtn = el(\"button\", {\n style: {\n ...btnBase,\n ...styles.acceptButton,\n backgroundColor: colors.acceptBg,\n color: colors.acceptText,\n borderRadius: colors.borderRadius,\n },\n type: \"button\",\n \"aria-label\": \"Confirm that I am 18 years of age or older\",\n onClick: onYes,\n });\n yesBtn.textContent = \"Yes, I am 18 or older\";\n\n const noBtn = el(\"button\", {\n style: {\n ...btnBase,\n ...styles.cancelButton,\n backgroundColor: colors.declineBg,\n color: colors.declineText,\n borderColor: colors.declineBorder,\n borderRadius: colors.borderRadius,\n },\n type: \"button\",\n \"aria-label\": \"Indicate that I am under 18 years of age\",\n onClick: onNo,\n });\n noBtn.textContent = \"No, I am under 18\";\n\n const bottomSection = el(\"div\", {\n style: { ...styles.bottomSection, color: textColor, fontFamily: font },\n }, yesBtn, noBtn);\n\n // ─── Assemble (wrapped in content div like modal) ───\n const container = el(\"div\", { style: styles.content }, topSection, middleSection, bottomSection);\n\n return { container };\n}\n","import { el, svg } from \"../core/dom\";\nimport { styles } from \"../styles/modal\";\nimport type { Settings } from \"../api/types\";\nimport type { ResolvedColors } from \"./colors\";\n\nconst RELATIONSHIP_OPTIONS = [\n { value: \"Father\", label: \"Father\" },\n { value: \"Mother\", label: \"Mother\" },\n { value: \"Legal Guardian\", label: \"Legal Guardian\" },\n { value: \"Grandparent\", label: \"Grandparent\" },\n];\n\nexport type GuardianFormData = {\n guardianName: string;\n guardianContact: string;\n guardianRelationship: string;\n};\n\nexport type GuardianFormRefs = {\n container: HTMLElement;\n nameInput: HTMLInputElement;\n contactInput: HTMLInputElement;\n relationshipDisplay: HTMLElement;\n nameError: HTMLElement;\n contactError: HTMLElement;\n relationshipError: HTMLElement;\n submitBtn: HTMLButtonElement;\n generalError: HTMLElement;\n};\n\nexport function renderGuardianForm(options: {\n formData: GuardianFormData;\n settings?: Partial<Settings>;\n colors: ResolvedColors;\n isMobile: boolean;\n logoUrl: string;\n isSubmitting: boolean;\n onSubmit: () => void;\n onCancel: () => void;\n onFieldChange: (field: keyof GuardianFormData, value: string) => void;\n}): GuardianFormRefs {\n const { formData, settings, colors, isMobile, logoUrl, isSubmitting, onSubmit, onCancel, onFieldChange } = options;\n\n const headingColor = settings?.headingColor || \"#101828\";\n const textColor = colors.text;\n const borderColor = colors.declineBorder;\n const bgColor = settings?.backgroundColor || \"#ffffff\";\n const radius = colors.borderRadius;\n const font = colors.font;\n const accentColor = colors.acceptBg;\n\n const inputStyle: Record<string, any> = {\n width: \"100%\",\n padding: \"10px 12px\",\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n fontSize: \"13px\",\n fontFamily: font,\n color: textColor,\n backgroundColor: bgColor,\n marginBottom: \"2px\",\n boxSizing: \"border-box\",\n outline: \"none\",\n };\n\n const errorStyle: Record<string, any> = {\n color: \"#DC2626\",\n fontSize: \"11px\",\n marginTop: \"4px\",\n marginBottom: \"0px\",\n display: \"none\",\n };\n\n const labelStyle: Record<string, any> = {\n fontSize: \"13px\",\n fontWeight: 500,\n color: textColor,\n fontFamily: font,\n marginBottom: \"4px\",\n display: \"block\",\n };\n\n const hintStyle: Record<string, any> = {\n fontSize: \"11px\",\n color: \"#667085\",\n marginTop: \"2px\",\n marginBottom: \"0px\",\n lineHeight: \"1.4\",\n };\n\n // ─── Top Section ───\n const logo = el(\"img\", { src: logoUrl, style: styles.logo, alt: \"Logo\" });\n const title = el(\"h2\", {\n id: \"guardian-form-title\",\n style: {\n ...styles.title,\n fontSize: \"16px\",\n fontWeight: 600,\n color: headingColor,\n fontFamily: font,\n },\n });\n title.textContent = \"Guardian Verification\";\n\n const topLeft = el(\"div\", { style: styles.topLeft }, logo, title);\n const topSection = el(\"div\", {\n style: { ...styles.topSection, color: textColor, fontFamily: font },\n }, topLeft);\n\n // ─── Middle Section ───\n const subtitle = el(\"p\", {\n style: {\n ...styles.privacyText,\n fontSize: \"13px\",\n lineHeight: \"1.5\",\n color: textColor,\n fontFamily: font,\n marginBottom: \"12px\",\n },\n });\n subtitle.textContent = \"Since you are under the age of consent, a legal guardian must verify their identity via DigiLocker before you can proceed.\";\n\n // Info banner with SVG icon\n const infoIcon = svg(\n \"svg\",\n {\n width: \"16\", height: \"16\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: \"#2563EB\", \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"circle\", { cx: \"12\", cy: \"12\", r: \"10\" }),\n svg(\"line\", { x1: \"12\", y1: \"16\", x2: \"12\", y2: \"12\" }),\n svg(\"line\", { x1: \"12\", y1: \"8\", x2: \"12.01\", y2: \"8\" })\n );\n (infoIcon as unknown as HTMLElement).style.cssText = \"flex-shrink:0;margin-top:1px\";\n\n const infoText = el(\"span\");\n infoText.textContent = \"The guardian's name will be matched against their DigiLocker identity document (e.g. Aadhaar). Please enter the name exactly as it appears on the document.\";\n\n const infoBanner = el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n padding: \"10px 12px\",\n backgroundColor: \"#EFF6FF\",\n border: \"1px solid #BFDBFE\",\n borderRadius: radius,\n marginBottom: \"16px\",\n fontSize: \"12px\",\n lineHeight: \"1.5\",\n color: \"#1E40AF\",\n },\n }, infoIcon, infoText);\n\n // ─── Name field ───\n const nameLabel = el(\"label\", { for: \"guardianName\", style: labelStyle });\n nameLabel.innerHTML = `Guardian's Full Name <span style=\"color:#DC2626\">*</span>`;\n\n const nameInput = el(\"input\", {\n id: \"guardianName\",\n type: \"text\",\n style: inputStyle,\n value: formData.guardianName,\n placeholder: \"e.g. Rajesh Kumar\",\n autoComplete: \"name\",\n \"aria-describedby\": \"guardianName-hint\",\n onInput: (e: Event) => onFieldChange(\"guardianName\", (e.target as HTMLInputElement).value),\n }) as HTMLInputElement;\n\n const nameHint = el(\"p\", { id: \"guardianName-hint\", style: hintStyle });\n nameHint.textContent = \"Enter the full name as per government ID (Aadhaar, PAN, etc.)\";\n\n const nameError = el(\"div\", { style: errorStyle, role: \"alert\" });\n const nameGroup = el(\"div\", null, nameLabel, nameInput, nameHint, nameError);\n\n // ─── Contact field ───\n const contactLabel = el(\"label\", { for: \"guardianContact\", style: labelStyle });\n contactLabel.innerHTML = `Guardian's Phone Number <span style=\"color:#DC2626\">*</span>`;\n\n const contactInput = el(\"input\", {\n id: \"guardianContact\",\n type: \"tel\",\n inputMode: \"tel\",\n style: inputStyle,\n value: formData.guardianContact,\n placeholder: \"e.g. 9876543210\",\n autoComplete: \"tel\",\n \"aria-describedby\": \"guardianContact-hint\",\n onInput: (e: Event) => onFieldChange(\"guardianContact\", (e.target as HTMLInputElement).value),\n }) as HTMLInputElement;\n\n const contactHint = el(\"p\", { id: \"guardianContact-hint\", style: hintStyle });\n contactHint.textContent = \"Mobile number linked to guardian's Aadhaar\";\n\n const contactError = el(\"div\", { style: errorStyle, role: \"alert\" });\n const contactGroup = el(\"div\", null, contactLabel, contactInput, contactHint, contactError);\n\n // ─── Relationship dropdown ───\n const relLabel = el(\"label\", { id: \"guardianRelationship-label\", style: labelStyle });\n relLabel.innerHTML = `Relationship <span style=\"color:#DC2626\">*</span>`;\n\n const selectedLabel = RELATIONSHIP_OPTIONS.find((o) => o.value === formData.guardianRelationship)?.label;\n\n const chevronSvg = svg(\n \"svg\",\n {\n width: \"14\", height: \"14\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: \"#667085\", \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"polyline\", { points: \"6 9 12 15 18 9\" })\n );\n (chevronSvg as unknown as HTMLElement).style.cssText = \"flex-shrink:0;margin-left:8px;transition:transform 0.2s\";\n\n const selectedSpan = el(\"span\", {\n style: { overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" },\n });\n selectedSpan.textContent = selectedLabel || \"Select relationship\";\n\n const relationshipDisplay = el(\"div\", {\n role: \"combobox\",\n \"aria-expanded\": \"false\",\n \"aria-haspopup\": \"listbox\",\n \"aria-labelledby\": \"guardianRelationship-label\",\n tabIndex: \"0\",\n style: {\n ...inputStyle,\n color: selectedLabel ? textColor : \"#9CA3AF\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n userSelect: \"none\",\n transition: \"border-color 0.15s, box-shadow 0.15s\",\n },\n }, selectedSpan, chevronSvg);\n\n // Dropdown list\n const dropdownList = el(\"div\", {\n id: \"guardianRelationship-listbox\",\n role: \"listbox\",\n \"aria-labelledby\": \"guardianRelationship-label\",\n style: {\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: 0,\n right: 0,\n backgroundColor: bgColor,\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.1), 0 1px 3px rgba(0,0,0,0.06)\",\n zIndex: 50,\n overflow: \"hidden\",\n padding: \"4px 0\",\n maxHeight: \"220px\",\n overflowY: \"auto\",\n display: \"none\",\n },\n });\n\n for (let i = 0; i < RELATIONSHIP_OPTIONS.length; i++) {\n const option = RELATIONSHIP_OPTIONS[i];\n const isSelected = formData.guardianRelationship === option.value;\n\n const optionEl = el(\"div\", {\n id: `guardianRelationship-option-${i}`,\n role: \"option\",\n \"aria-selected\": String(isSelected),\n style: {\n padding: \"9px 12px\",\n fontSize: \"13px\",\n fontFamily: font,\n color: isSelected ? accentColor : textColor,\n backgroundColor: \"transparent\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n transition: \"background-color 0.1s\",\n },\n onClick: () => {\n onFieldChange(\"guardianRelationship\", option.value);\n selectedSpan.textContent = option.label;\n relationshipDisplay.style.color = textColor;\n doClose();\n },\n onMouseenter: (e: Event) => { (e.target as HTMLElement).style.backgroundColor = \"#F3F4F6\"; },\n onMouseleave: (e: Event) => { (e.target as HTMLElement).style.backgroundColor = \"transparent\"; },\n });\n\n const label = el(\"span\");\n label.textContent = option.label;\n optionEl.appendChild(label);\n\n if (isSelected) {\n const checkSvg = svg(\n \"svg\",\n {\n width: \"14\", height: \"14\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: accentColor, \"stroke-width\": \"2.5\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"polyline\", { points: \"20 6 9 17 4 12\" })\n );\n (checkSvg as unknown as HTMLElement).style.flexShrink = \"0\";\n optionEl.appendChild(checkSvg);\n }\n\n dropdownList.appendChild(optionEl);\n }\n\n let dropdownOpen = false;\n\n const relContainer = el(\"div\", { style: { position: \"relative\" } });\n\n const handleClickOutside = (e: Event) => {\n if (!relContainer.contains(e.target as Node)) {\n doClose();\n }\n };\n\n function doOpen() {\n dropdownOpen = true;\n dropdownList.style.display = \"block\";\n relationshipDisplay.setAttribute(\"aria-expanded\", \"true\");\n (chevronSvg as unknown as HTMLElement).style.transform = \"rotate(180deg)\";\n relationshipDisplay.style.borderColor = accentColor;\n relationshipDisplay.style.boxShadow = `0 0 0 1px ${accentColor}`;\n\n // Determine direction: open upward if not enough space below\n const rect = relContainer.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const dropdownHeight = 220;\n const shouldOpenUpward = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n if (shouldOpenUpward) {\n dropdownList.style.top = \"auto\";\n dropdownList.style.bottom = \"calc(100% + 4px)\";\n dropdownList.style.boxShadow = \"0 -4px 12px rgba(0,0,0,0.1), 0 -1px 3px rgba(0,0,0,0.06)\";\n } else {\n dropdownList.style.top = \"calc(100% + 4px)\";\n dropdownList.style.bottom = \"auto\";\n dropdownList.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.1), 0 1px 3px rgba(0,0,0,0.06)\";\n }\n\n // Scroll the dropdown into view\n requestAnimationFrame(() => {\n dropdownList.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n });\n\n // Listen for clicks outside (next tick so current click doesn't trigger it)\n setTimeout(() => document.addEventListener(\"mousedown\", handleClickOutside), 0);\n }\n\n function doClose() {\n dropdownOpen = false;\n dropdownList.style.display = \"none\";\n relationshipDisplay.setAttribute(\"aria-expanded\", \"false\");\n (chevronSvg as unknown as HTMLElement).style.transform = \"rotate(0deg)\";\n relationshipDisplay.style.borderColor = borderColor;\n relationshipDisplay.style.boxShadow = \"none\";\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n\n relationshipDisplay.addEventListener(\"click\", () => {\n dropdownOpen ? doClose() : doOpen();\n });\n\n relationshipDisplay.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!dropdownOpen) doOpen();\n } else if (e.key === \"Escape\" || e.key === \"Tab\") {\n doClose();\n }\n });\n\n const relationshipError = el(\"div\", { style: errorStyle, role: \"alert\" });\n\n relContainer.appendChild(relLabel);\n relContainer.appendChild(relationshipDisplay);\n relContainer.appendChild(dropdownList);\n relContainer.appendChild(relationshipError);\n\n // General error\n const generalError = el(\"div\", {\n role: \"alert\",\n style: {\n color: \"#DC2626\",\n fontSize: \"13px\",\n marginTop: \"16px\",\n padding: \"12px\",\n borderRadius: \"6px\",\n border: \"1px solid #FCA5A5\",\n backgroundColor: \"#FEF2F2\",\n textAlign: \"center\",\n display: \"none\",\n },\n });\n\n const fieldsContainer = el(\"div\", {\n style: { display: \"flex\", flexDirection: \"column\", gap: \"14px\" },\n }, nameGroup, contactGroup, relContainer);\n\n const middleSection = el(\"div\", {\n style: { ...styles.middleSection, overflow: \"visible\", color: textColor, fontFamily: font },\n }, subtitle, infoBanner, fieldsContainer, generalError);\n\n // ─── Bottom Section (Verify first, Cancel second — matches React) ───\n const btnBase = {\n ...styles.button,\n fontSize: isMobile ? \"14px\" : \"16px\",\n padding: isMobile ? \"10px 20px\" : \"9px 45px\",\n };\n\n const submitBtn = el(\"button\", {\n style: {\n ...btnBase,\n ...styles.acceptButton,\n backgroundColor: colors.acceptBg,\n color: colors.acceptText,\n borderRadius: colors.borderRadius,\n },\n type: \"button\",\n disabled: isSubmitting,\n \"aria-label\": isSubmitting ? \"Verifying guardian identity\" : \"Proceed to guardian verification\",\n onClick: onSubmit,\n }) as HTMLButtonElement;\n submitBtn.textContent = isSubmitting ? \"Verifying...\" : \"Verify via DigiLocker\";\n\n const cancelBtn = el(\"button\", {\n style: {\n ...btnBase,\n ...styles.cancelButton,\n backgroundColor: colors.declineBg,\n color: colors.declineText,\n borderColor: colors.declineBorder,\n borderRadius: colors.borderRadius,\n },\n type: \"button\",\n \"aria-label\": \"Cancel\",\n onClick: onCancel,\n });\n cancelBtn.textContent = \"Cancel\";\n\n const bottomSection = el(\"div\", {\n style: { ...styles.bottomSection, paddingTop: \"12px\", color: textColor, fontFamily: font },\n }, submitBtn, cancelBtn);\n\n // ─── Assemble ───\n const container = el(\"div\", { style: { ...styles.content, overflow: \"visible\" } }, topSection, middleSection, bottomSection);\n\n return {\n container,\n nameInput,\n contactInput,\n relationshipDisplay,\n nameError,\n contactError,\n relationshipError,\n submitBtn,\n generalError,\n };\n}\n\nexport function validateGuardianForm(data: GuardianFormData): Record<string, string> {\n const errors: Record<string, string> = {};\n if (!data.guardianName.trim()) errors.guardianName = \"Guardian name is required\";\n if (!data.guardianContact.trim()) errors.guardianContact = \"Guardian contact is required\";\n if (!data.guardianRelationship.trim()) errors.guardianRelationship = \"Relationship to guardian is required\";\n return errors;\n}\n","import { el, svg } from \"../core/dom\";\nimport { styles } from \"../styles/modal\";\nimport type { Settings, GuardianVerificationErrorCode } from \"../api/types\";\nimport type { ResolvedColors } from \"./colors\";\n\nexport type VerificationScreenRefs = {\n container: HTMLElement;\n};\n\nexport function getVerificationErrorMessage(\n errorCode: string | null,\n fallbackError: string | null\n): string {\n switch (errorCode) {\n case \"GUARDIAN_UNDER_18\":\n return \"The guardian must be 18 years or older. Please provide details of a different guardian.\";\n case \"TOKEN_FAILED\":\n return \"DigiLocker verification could not be completed. Please try again.\";\n case \"DIGILOCKER_AUTH_FAILED\":\n return \"DigiLocker authorization was cancelled or failed. Please try again.\";\n case \"NO_AUTH_CODE\":\n return \"DigiLocker did not return an authorization code. Please try again.\";\n case \"SESSION_EXPIRED\":\n return \"Verification session has expired. Please try again.\";\n default:\n return fallbackError || \"Verification failed. Please try again.\";\n }\n}\n\nexport function renderVerificationScreen(options: {\n settings?: Partial<Settings>;\n colors: ResolvedColors;\n isMobile: boolean;\n logoUrl: string;\n isInitiating: boolean;\n isPolling: boolean;\n isComplete: boolean;\n isAutoTransitioning?: boolean;\n error: string | null;\n errorCode: string | null;\n canRetry: boolean;\n onContinue: () => void;\n onBack: (clearName?: boolean) => void;\n}): VerificationScreenRefs {\n const {\n settings, colors, isMobile, logoUrl,\n isInitiating, isPolling, isComplete, isAutoTransitioning,\n error, errorCode, canRetry,\n onContinue, onBack,\n } = options;\n\n const headingColor = settings?.headingColor || \"#101828\";\n const textColor = colors.text;\n const font = colors.font;\n const accentColor = colors.acceptBg;\n\n // ─── Top Section ───\n const logo = el(\"img\", { src: logoUrl, style: styles.logo, alt: \"Logo\" });\n const title = el(\"h2\", {\n id: \"verification-title\",\n style: {\n ...styles.title,\n fontSize: \"16px\",\n fontWeight: 600,\n color: headingColor,\n fontFamily: font,\n },\n });\n title.textContent = \"Guardian Verification\";\n\n const topLeft = el(\"div\", { style: styles.topLeft }, logo, title);\n const topSection = el(\"div\", {\n style: { ...styles.topSection, color: textColor, fontFamily: font },\n }, topLeft);\n\n // ─── Middle Section ───\n const middleSection = el(\"div\", {\n style: {\n ...styles.middleSection,\n color: textColor,\n fontFamily: font,\n textAlign: \"center\",\n },\n });\n\n if (isComplete && !error) {\n // Success state: green checkmark circle\n const successCircle = el(\"div\", {\n style: {\n width: \"64px\",\n height: \"64px\",\n borderRadius: \"50%\",\n backgroundColor: \"#D1FAE5\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n });\n const checkSvg = svg(\n \"svg\",\n {\n width: \"32\", height: \"32\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: \"#059669\", \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"polyline\", { points: \"20 6 9 17 4 12\" })\n );\n successCircle.appendChild(checkSvg);\n\n const successText = el(\"p\", {\n style: {\n color: headingColor,\n fontFamily: font,\n fontSize: \"16px\",\n fontWeight: 600,\n lineHeight: \"1.5\",\n marginTop: \"12px\",\n marginBottom: \"24px\",\n },\n });\n successText.textContent = \"Verification Completed\";\n\n const wrapper = el(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flex: \"1\",\n },\n }, successCircle, successText);\n middleSection.appendChild(wrapper);\n\n } else if ((isInitiating || isPolling) && !error) {\n // Polling state: spinner + status message\n const spinner = el(\"div\", {\n style: {\n width: \"48px\",\n height: \"48px\",\n border: \"4px solid #e5e7eb\",\n borderTopColor: accentColor,\n borderRadius: \"50%\",\n animation: \"spin 1s linear infinite\",\n margin: \"24px auto\",\n },\n });\n\n const statusMsg = el(\"div\", {\n style: {\n color: \"#059669\",\n fontSize: \"14px\",\n marginTop: \"16px\",\n padding: \"12px\",\n borderRadius: \"6px\",\n border: \"1px solid #A7F3D0\",\n backgroundColor: \"#D1FAE5\",\n textAlign: \"center\",\n },\n });\n statusMsg.textContent = isInitiating\n ? \"Opening DigiLocker in a new tab...\"\n : \"Please complete the verification in the DigiLocker tab. This page will update automatically when verification is complete.\";\n\n middleSection.appendChild(spinner);\n middleSection.appendChild(statusMsg);\n }\n\n if (error) {\n // Error state: red X circle + error text\n const errorCircle = el(\"div\", {\n style: {\n width: \"64px\",\n height: \"64px\",\n borderRadius: \"50%\",\n backgroundColor: \"#fee2e2\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n margin: \"24px auto\",\n },\n });\n const xSvg = svg(\n \"svg\",\n {\n width: \"32\", height: \"32\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: \"#dc2626\", \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"line\", { x1: \"18\", y1: \"6\", x2: \"6\", y2: \"18\" }),\n svg(\"line\", { x1: \"6\", y1: \"6\", x2: \"18\", y2: \"18\" })\n );\n errorCircle.appendChild(xSvg);\n\n const failedText = el(\"p\", {\n style: {\n ...styles.privacyText,\n color: textColor,\n fontFamily: font,\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n marginBottom: \"12px\",\n },\n });\n failedText.textContent = \"Verification failed\";\n\n const errorBox = el(\"div\", {\n style: {\n color: \"#DC2626\",\n fontSize: \"14px\",\n marginTop: \"16px\",\n padding: \"12px\",\n borderRadius: \"6px\",\n border: \"1px solid #FCA5A5\",\n backgroundColor: \"#FEF2F2\",\n textAlign: \"center\",\n },\n });\n errorBox.textContent = error;\n\n middleSection.appendChild(errorCircle);\n middleSection.appendChild(failedText);\n middleSection.appendChild(errorBox);\n }\n\n // ─── Bottom Section ───\n const btnBase = {\n ...styles.button,\n fontSize: isMobile ? \"14px\" : \"16px\",\n padding: isMobile ? \"10px 20px\" : \"9px 45px\",\n };\n\n const bottomSection = el(\"div\", {\n style: {\n ...styles.bottomSection,\n paddingTop: \"12px\",\n display: \"flex\",\n gap: \"12px\",\n justifyContent: \"center\",\n color: textColor,\n fontFamily: font,\n },\n });\n\n const acceptBtnStyle = {\n backgroundColor: colors.acceptBg,\n color: colors.acceptText,\n borderRadius: colors.borderRadius,\n };\n const declineBtnStyle = {\n backgroundColor: colors.declineBg,\n color: colors.declineText,\n borderColor: colors.declineBorder,\n borderRadius: colors.borderRadius,\n };\n\n // Hide bottom section during auto-transition\n if (!isAutoTransitioning) {\n if (isComplete && !error) {\n const continueBtn = el(\"button\", {\n style: { ...btnBase, ...acceptBtnStyle },\n type: \"button\",\n \"aria-label\": \"Continue to consent form\",\n onClick: onContinue,\n });\n continueBtn.textContent = \"Continue\";\n bottomSection.appendChild(continueBtn);\n } else if (error && canRetry) {\n const retryBtn = el(\"button\", {\n style: { ...btnBase, ...styles.acceptButton, ...acceptBtnStyle },\n type: \"button\",\n \"aria-label\": errorCode === \"GUARDIAN_UNDER_18\" ? \"Change guardian details\" : \"Try verification again\",\n onClick: () => onBack(errorCode === \"GUARDIAN_UNDER_18\"),\n });\n retryBtn.textContent = errorCode === \"GUARDIAN_UNDER_18\" ? \"Change Guardian\" : \"Try Again\";\n bottomSection.appendChild(retryBtn);\n } else if (error) {\n const goBackBtn = el(\"button\", {\n style: { ...btnBase, ...styles.cancelButton, ...declineBtnStyle },\n type: \"button\",\n \"aria-label\": \"Go back\",\n onClick: () => onBack(false),\n });\n goBackBtn.textContent = \"Go Back\";\n bottomSection.appendChild(goBackBtn);\n } else {\n // Polling state — show cancel\n const cancelBtn = el(\"button\", {\n style: { ...btnBase, ...styles.cancelButton, ...declineBtnStyle },\n type: \"button\",\n \"aria-label\": \"Cancel verification\",\n onClick: () => onBack(false),\n });\n cancelBtn.textContent = \"Cancel\";\n bottomSection.appendChild(cancelBtn);\n }\n }\n\n // ─── Assemble ───\n const container = el(\"div\", { style: styles.content }, topSection, middleSection, bottomSection);\n\n return { container };\n}\n","import type { ActiveConfig, Settings } from \"../api/types\";\n\nexport type ResolvedColors = {\n acceptBg: string;\n acceptText: string;\n /** The \"accept all\" shortcut. */\n acceptShortcutBg: string;\n acceptShortcutText: string;\n acceptShortcutBorder: string;\n declineBg: string;\n declineText: string;\n declineBorder: string;\n link: string;\n heading: string;\n text: string;\n font: string;\n borderRadius: string;\n primaryColor: string;\n secondaryColor: string;\n};\n\n/**\n * Resolves colors using the React SDK's fallback chain:\n * settings → API active_config → hardcoded default\n */\nexport function resolveColors(\n settings: Partial<Settings> | undefined,\n activeConfig: ActiveConfig | null | undefined\n): ResolvedColors {\n const primaryColor = activeConfig?.primary_color || \"#4f87ff\";\n const secondaryColor = activeConfig?.secondary_color || \"#4f87ff\";\n\n return {\n acceptBg: settings?.button?.accept?.backgroundColor || primaryColor,\n acceptText: settings?.button?.accept?.textColor || \"#ffffff\",\n acceptShortcutBg: settings?.button?.acceptAll?.backgroundColor || \"#ffffff\",\n acceptShortcutText: settings?.button?.acceptAll?.textColor || primaryColor,\n acceptShortcutBorder: primaryColor,\n declineBg: settings?.button?.decline?.backgroundColor || \"#ffffff\",\n declineText: settings?.button?.decline?.textColor || \"#000000\",\n declineBorder: settings?.borderColor || \"#d0d5dd\",\n link: settings?.link || secondaryColor,\n heading: settings?.headingColor || \"#323B4B\",\n text: settings?.textColor || \"#344054\",\n font: settings?.font || \"inherit\",\n borderRadius: settings?.borderRadius || \"8px\",\n primaryColor,\n secondaryColor,\n };\n}\n","import type {\n AcceptMode,\n SelectablePurpose,\n SelectionState,\n} from \"../types\";\n\n/**\n * Composite key for a data element's checkbox state — a data element uuid is\n * only unique within its purpose, since the same element can be attached to\n * several purposes on one notice.\n */\nexport const dataElementKey = (purposeUuid: string, elementUuid: string) =>\n `${purposeUuid}-${elementUuid}`;\n\n/**\n * Resolves the checkbox state that a given accept button should submit.\n *\n * - `all` selects every purpose and every enabled data element.\n * - `selected` is the user's own ticks, returned untouched.\n */\nexport const buildSelectionForMode = (\n purposes: ReadonlyArray<SelectablePurpose>,\n mode: AcceptMode,\n current: SelectionState\n): SelectionState => {\n if (mode === \"selected\") {\n return current;\n }\n\n const selectedPurposes: Record<string, boolean> = {};\n const selectedDataElements: Record<string, boolean> = {};\n\n purposes.forEach((purpose) => {\n selectedPurposes[purpose.uuid] = true;\n\n purpose.data_elements.forEach((element) => {\n selectedDataElements[dataElementKey(purpose.uuid, element.uuid)] =\n element.enabled;\n });\n });\n\n return { selectedPurposes, selectedDataElements };\n};\n","import type { LogoPosition } from \"../api/types\";\nimport { DEFAULT_LOGO_POSITION, LOGO_POSITION_JUSTIFY } from \"../constants\";\n\n/**\n * Resolves `active_config.logo_position` onto a position the header can lay out.\n *\n * The field is absent on notices published before it existed and on responses\n * from an older consent-server, so an unrecognised value is not an error — it\n * simply means \"the customer never chose\", which is the left-aligned default.\n *\n * Sibling of `resolveColors` in ./colors.ts: same config-then-default shape,\n * kept deliberately parallel with the React package's layout.ts.\n */\nexport function resolveLogoPosition(raw: string | undefined | null): LogoPosition {\n return raw === \"center\" || raw === \"right\" ? raw : DEFAULT_LOGO_POSITION;\n}\n\nexport function logoRowJustify(position: LogoPosition): string {\n return LOGO_POSITION_JUSTIFY[position];\n}\n","import { Store } from \"../core/state\";\nimport { el, svg, clearElement } from \"../core/dom\";\nimport { createMediaQuery, type MediaQuerySubscription } from \"../core/media-query\";\nimport {\n fetchConsentContent,\n submitConsentEvent,\n fetchTTSAudioUrls,\n initiateGuardianVerification,\n verifyGuardianStatus,\n} from \"../api\";\nimport {\n buildLedgerConsentOverlay,\n fetchNoticeConsentStatus,\n} from \"../api/notice-consent-status\";\nimport { resolveDisplayLanguage } from \"../api/language\";\nimport { clearApiCache } from \"../services/cache\";\nimport { injectCheckboxStyles } from \"../styles/inject\";\nimport { styles } from \"../styles/modal\";\nimport { renderModalPurposes, type ModalPurposeRefs } from \"./purposes\";\nimport { renderLanguageSelector, type LanguageSelectorRefs } from \"./language-selector\";\nimport { setupKeyboardTrap, type KeyboardTrapCleanup } from \"./keyboard\";\nimport {\n saveConsentState,\n getConsentState,\n clearConsentState,\n updateConsentState,\n} from \"../services/storage\";\nimport { TTSManager } from \"./tts\";\nimport { renderAgeVerification } from \"./age-verification\";\nimport {\n renderGuardianForm,\n validateGuardianForm,\n type GuardianFormData,\n type GuardianFormRefs,\n} from \"./guardian-form\";\nimport {\n renderVerificationScreen,\n getVerificationErrorMessage,\n} from \"./verification-screen\";\nimport { resolveColors } from \"./colors\";\nimport { buildSelectionForMode } from \"./consentSelection\";\nimport { logoRowJustify, resolveLogoPosition } from \"./layout\";\nimport {\n ACCEPT_ALL_BUTTON_ID,\n ACCEPT_SELECTED_BUTTON_ID,\n DECLINE_BUTTON_ID,\n DEFAULT_ACCEPT_ALL_BUTTON_TEXT,\n DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT,\n DEFAULT_DECLINE_BUTTON_TEXT,\n SUBMITTING_BUTTON_TEXT,\n} from \"../constants\";\nimport type { SandboxOptions } from \"../api/types\";\nimport type { AcceptMode, ModalOptions } from \"../types\";\nimport type {\n ActiveConfig,\n ConsentContent,\n PurposeItemData,\n PurposeSelection,\n Settings,\n TranslationObject,\n} from \"../api/types\";\n\ntype ModalState = {\n isLoading: boolean;\n isSubmitting: boolean;\n isSubmittingAccept: boolean;\n isSubmittingDecline: boolean;\n content: ConsentContent | null;\n selectedPurposes: Record<string, boolean>;\n selectedDataElements: Record<string, boolean>;\n initialDataElementSelections: Record<string, boolean>;\n collapsedPurposes: Record<string, boolean>;\n hasAlreadyConsented: boolean;\n isFullyConsentedReviewMode: boolean;\n selectedLanguage: string;\n errorMessage: string | null;\n fetchError: Error | null;\n needsConsentPurposes: PurposeItemData[];\n alreadyConsentedPurposes: PurposeItemData[];\n // Age/Guardian flow\n isMinorFlow: boolean;\n selfDeclaredAdult: boolean;\n showAgeVerification: boolean;\n showGuardianForm: boolean;\n showVerificationScreen: boolean;\n verificationReference: string | null;\n isVerificationComplete: boolean;\n isInitiatingVerification: boolean;\n isPollingStatus: boolean;\n verificationError: string | null;\n verificationErrorCode: string | null;\n canRetryVerification: boolean;\n guardianFormData: GuardianFormData;\n};\n\nexport class ModalController {\n private store: Store<ModalState>;\n private options: ModalOptions;\n private hostEl: HTMLElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private previousBodyOverflow: string | null = null;\n private previousHtmlOverflow: string | null = null;\n private overlayEl: HTMLElement | null = null;\n private modalEl: HTMLElement | null = null;\n private mediaQuery: MediaQuerySubscription;\n private purposeRefs: ModalPurposeRefs | null = null;\n private alreadyConsentedPurposeRefs: ModalPurposeRefs | null = null;\n private langSelectorRefs: LanguageSelectorRefs | null = null;\n private keyboardCleanup: KeyboardTrapCleanup | null = null;\n private abortController: AbortController | null = null;\n private unsubscribe: (() => void) | null = null;\n private ttsManager: TTSManager | null = null;\n private guardianFormRefs: GuardianFormRefs | null = null;\n private statusPollTimeout: ReturnType<typeof setTimeout> | null = null;\n private popupCheckInterval: ReturnType<typeof setInterval> | null = null;\n private verificationPopup: Window | null = null;\n private verificationSessionToken: string | null = null;\n private visibilityChangeHandler: (() => void) | null = null;\n\n // DOM refs for targeted updates\n private acceptBtn: HTMLButtonElement | null = null;\n private acceptAllBtn: HTMLButtonElement | null = null;\n private declineBtn: HTMLButtonElement | null = null;\n private middleSection: HTMLElement | null = null;\n private errorEl: HTMLElement | null = null;\n private noticeTitleEl: HTMLElement | null = null;\n private noticeTextEl: HTMLElement | null = null;\n private purposeHeadingEl: HTMLElement | null = null;\n private additionalTextEl: HTMLElement | null = null;\n private privacyPolicyLinkEl: HTMLAnchorElement | null = null;\n private privacyCenterLinkEl: HTMLAnchorElement | null = null;\n private ttsButton: HTMLElement | null = null;\n\n constructor(options: ModalOptions) {\n this.options = options;\n this.store = new Store<ModalState>({\n isLoading: true,\n isSubmitting: false,\n isSubmittingAccept: false,\n isSubmittingDecline: false,\n content: null,\n selectedPurposes: {},\n selectedDataElements: {},\n initialDataElementSelections: {},\n collapsedPurposes: {},\n hasAlreadyConsented: false,\n isFullyConsentedReviewMode: false,\n selectedLanguage: options.language || \"en\",\n errorMessage: null,\n fetchError: null,\n needsConsentPurposes: [],\n alreadyConsentedPurposes: [],\n isMinorFlow: false,\n selfDeclaredAdult: false,\n showAgeVerification: false,\n showGuardianForm: false,\n showVerificationScreen: false,\n verificationReference: null,\n isVerificationComplete: false,\n isInitiatingVerification: false,\n isPollingStatus: false,\n verificationError: null,\n verificationErrorCode: null,\n canRetryVerification: false,\n guardianFormData: { guardianName: \"\", guardianContact: \"\", guardianRelationship: \"\" },\n });\n this.mediaQuery = createMediaQuery(\"(max-width: 768px)\");\n // TTSManager is instantiated lazily in renderOverlayWithLoading() once the\n // shadow root exists, so it can scope its DOM queries inside the shadow.\n }\n\n async init(): Promise<void> {\n this.unsubscribe = this.store.subscribe((state, prevState) => {\n this.handleStateChange(state, prevState);\n });\n\n this.mediaQuery.subscribe(() => this.rebuildUI());\n\n // Render loading state\n this.renderOverlayWithLoading();\n\n // Fetch content\n await this.fetchNotice();\n }\n\n destroy(): void {\n this.abortController?.abort();\n this.keyboardCleanup?.();\n this.unsubscribe?.();\n this.mediaQuery.destroy();\n this.ttsManager?.destroy();\n this.stopPolling();\n this.store.destroy();\n\n // Removing the shadow host nukes the entire shadow tree (overlay, modal,\n // language dropdown, injected stylesheet) in a single operation.\n if (this.hostEl && this.hostEl.parentNode) {\n this.hostEl.parentNode.removeChild(this.hostEl);\n }\n\n // Restore the host page's scroll lock to whatever it was before we opened.\n if (this.previousBodyOverflow !== null) {\n document.body.style.overflow = this.previousBodyOverflow;\n this.previousBodyOverflow = null;\n }\n if (this.previousHtmlOverflow !== null) {\n document.documentElement.style.overflow = this.previousHtmlOverflow;\n this.previousHtmlOverflow = null;\n }\n\n this.hostEl = null;\n this.shadowRoot = null;\n this.overlayEl = null;\n this.modalEl = null;\n this.purposeRefs = null;\n this.langSelectorRefs = null;\n }\n\n // ─── Private ───\n\n /**\n * Sandbox auth options to forward to every API call. When `token` is set the\n * API layer sends the single `X-Consent-Token` header, carries every supplied\n * identifier in each request's payload, and reads org/workspace from these\n * fields instead of decoding the JWT. Empty in the normal JWT flow.\n */\n private sandboxParams(): SandboxOptions {\n // Legacy `sandboxSubject` (deprecated): classify into email/mobile so an\n // existing caller that still passes it keeps working unchanged.\n const legacySubject = this.options.sandboxSubject?.trim();\n const legacyEmail = legacySubject?.includes(\"@\") ? legacySubject : undefined;\n const legacyMobile =\n legacySubject && !legacySubject.includes(\"@\") ? legacySubject : undefined;\n return {\n token: this.options.token,\n // The static token carries no identity; carry every supplied identifier\n // (ucic/email/mobile) so the server can pick the principal by precedence\n // (UCIC > email > mobile) and keep the rest as the sandbox contact.\n // sandboxUcic / sandboxEmail / sandboxMobile stay as fallbacks.\n sandboxUcic: this.options.ucic || this.options.sandboxUcic,\n sandboxEmail: this.options.email || this.options.sandboxEmail || legacyEmail,\n sandboxMobile:\n this.options.mobile || this.options.sandboxMobile || legacyMobile,\n organisationUuid: this.options.organisationUuid,\n workspaceUuid: this.options.workspaceUuid,\n };\n }\n\n private async fetchNotice(): Promise<void> {\n this.abortController = new AbortController();\n this.store.setState({ isLoading: true, fetchError: null });\n\n try {\n // Standard flow reads the notice from the Go ledger. The magic-link flow\n // (applicationId/specific_uuid) and sandbox sessions stay on the consent\n // server: the ledger notice read supports neither (no specific_uuid, no\n // X-Consent-Token auth). Without this a ledger-minted token is rejected\n // by the consent server and the modal renders with no content.\n const noticeBaseUrl =\n this.options.ledgerBaseUrl &&\n !this.options.applicationId &&\n !this.options.token\n ? this.options.ledgerBaseUrl\n : this.options.baseUrl;\n const data = await fetchConsentContent({\n noticeId: this.options.noticeId,\n accessToken: this.options.accessToken,\n refreshToken: this.options.refreshToken,\n baseUrl: noticeBaseUrl,\n language: this.options.language,\n specific_uuid: this.options.applicationId,\n validate_against: this.options.validateAgainst || \"all\",\n include_fully_consented_data: this.options.includeFullyConsentedData,\n signal: this.abortController.signal,\n ...this.sandboxParams(),\n });\n\n const activeConfig = data.detail.active_config;\n\n // Overlay the prior-consent / reconsent state from the Go ledger's\n // check-consent. Consents live in the ledger post-cutover, so Python's\n // notice-validation overlay is empty; the notice text/config still comes\n // from Python (above). Falls back to the Python-provided values when the\n // ledger is unavailable, and is skipped for the magic-link flow\n // (applicationId), which pre-fills from a specific event.\n let purposeSelections = data.detail.purpose_selections;\n let reconsentRequired = data.detail.reconsent_required;\n let ledgerOverlayApplied = false;\n if (this.options.ledgerBaseUrl && !this.options.applicationId) {\n const ledgerStatus = await fetchNoticeConsentStatus({\n accessToken: this.options.accessToken,\n ledgerBaseUrl: this.options.ledgerBaseUrl,\n noticeUuid: this.options.noticeId,\n signal: this.abortController.signal,\n });\n if (ledgerStatus) {\n const overlay = buildLedgerConsentOverlay(ledgerStatus, activeConfig.purposes);\n reconsentRequired = overlay?.reconsent_required ?? false;\n purposeSelections = overlay?.purpose_selections;\n ledgerOverlayApplied = Boolean(overlay);\n }\n }\n\n // Initialize state\n const initialCollapsed: Record<string, boolean> = {};\n const initialPurposes: Record<string, boolean> = {};\n const initialElements: Record<string, boolean> = {};\n const initialDataElementSelections: Record<string, boolean> = {};\n\n // Categorize purposes for reconsent. With a ledger overlay, categorize\n // whenever prior consent exists (even without reconsent needed) so a\n // fully-consented principal gets the already-consented presentation /\n // review mode instead of a fresh consent flow — the ledger-mode\n // equivalent of Python's 409-driven short-circuit.\n let needsConsentPurposes: PurposeItemData[] = [];\n let alreadyConsentedPurposes: PurposeItemData[] = [];\n let isFullyConsentedReviewMode = false;\n\n if (purposeSelections && (reconsentRequired || ledgerOverlayApplied)) {\n for (const purpose of activeConfig.purposes) {\n const selection = purposeSelections[purpose.uuid];\n initialCollapsed[purpose.uuid] = true;\n\n if (selection && selection.selected && !selection.needs_reconsent) {\n alreadyConsentedPurposes.push(purpose);\n initialPurposes[purpose.uuid] = true;\n for (const de of purpose.data_elements) {\n const combinedId = `${purpose.uuid}-${de.uuid}`;\n const deSelection = selection.data_elements?.[de.uuid];\n const wasSelected = deSelection?.selected || false;\n initialElements[combinedId] = wasSelected;\n initialDataElementSelections[combinedId] = wasSelected;\n }\n } else {\n needsConsentPurposes.push(purpose);\n initialPurposes[purpose.uuid] = false;\n for (const de of purpose.data_elements) {\n initialElements[`${purpose.uuid}-${de.uuid}`] = false;\n }\n }\n }\n } else {\n needsConsentPurposes = activeConfig.purposes;\n for (const purpose of activeConfig.purposes) {\n initialCollapsed[purpose.uuid] = true;\n initialPurposes[purpose.uuid] = false;\n for (const de of purpose.data_elements) {\n initialElements[`${purpose.uuid}-${de.uuid}`] = false;\n }\n }\n }\n\n // Check if all purposes are already consented (review mode)\n if (\n this.options.includeFullyConsentedData &&\n needsConsentPurposes.length === 0 &&\n alreadyConsentedPurposes.length > 0\n ) {\n isFullyConsentedReviewMode = true;\n }\n\n const selectedLanguage = resolveDisplayLanguage(\n this.options.language,\n activeConfig.default_language,\n activeConfig.supported_languages_and_translations\n );\n\n // Check if minor flow is required, and restore in-progress verification\n // state from a previous session (e.g. user closed the SDK or returned\n // from a DigiLocker redirect mid-flow). Without this restoration, the\n // notice would be shown directly and guardian verification skipped.\n let isMinorFlow = false;\n let showAgeVerification = false;\n let restoreState: Partial<ModalState> = {};\n let pollingTokenToResume: string | null = null;\n if (data.detail.is_minor) {\n isMinorFlow = true;\n const persistedState = getConsentState();\n\n // Discard persisted state from a different notice\n if (persistedState?.noticeId && persistedState.noticeId !== this.options.noticeId) {\n clearConsentState();\n } else if (\n persistedState?.flowState === \"digilocker-pending\" &&\n persistedState.sessionToken\n ) {\n // User is mid-verification — resume the verification screen and polling\n restoreState = {\n showVerificationScreen: true,\n isPollingStatus: true,\n };\n pollingTokenToResume = persistedState.sessionToken;\n } else if (\n persistedState?.verificationResult === \"verified\" &&\n persistedState.verificationReference\n ) {\n // Verification completed during a redirect — show success state\n restoreState = {\n showVerificationScreen: true,\n isVerificationComplete: true,\n verificationReference: persistedState.verificationReference,\n };\n clearConsentState();\n } else if (\n persistedState?.verificationResult === \"failed\" ||\n persistedState?.verificationResult === \"expired\"\n ) {\n // Verification failed/expired during a redirect — show error\n restoreState = {\n showVerificationScreen: true,\n verificationError:\n persistedState.verificationResult === \"expired\"\n ? \"Verification session has expired. Please try again.\"\n : \"Verification failed. Please try again.\",\n canRetryVerification: true,\n };\n clearConsentState();\n } else {\n // No in-progress verification — start with age verification\n showAgeVerification = true;\n }\n }\n\n this.store.setState({\n content: data,\n isLoading: false,\n selectedLanguage,\n collapsedPurposes: initialCollapsed,\n selectedPurposes: initialPurposes,\n selectedDataElements: initialElements,\n initialDataElementSelections,\n needsConsentPurposes,\n alreadyConsentedPurposes,\n isFullyConsentedReviewMode,\n isMinorFlow,\n showAgeVerification,\n ...restoreState,\n });\n\n // Resume polling after state has been applied so the verification screen\n // is visible while polling runs.\n if (pollingTokenToResume) {\n this.startStatusPolling(pollingTokenToResume);\n }\n } catch (err: unknown) {\n if ((err as Error).name === \"AbortError\") return;\n const error = err as Error & { status?: number };\n if (error.status === 409) {\n this.store.setState({ hasAlreadyConsented: true, isLoading: false });\n this.options.onAccept();\n } else {\n this.store.setState({ fetchError: error, isLoading: false });\n this.options.onError?.(error);\n }\n }\n }\n\n private handleStateChange(state: ModalState, prevState: ModalState): void {\n // Loading → content loaded\n if (prevState.isLoading && !state.isLoading && state.content) {\n this.rebuildUI();\n return;\n }\n\n // Already consented → close\n if (state.hasAlreadyConsented && !prevState.hasAlreadyConsented) {\n this.destroy();\n return;\n }\n\n // Fetch error → show error\n if (state.fetchError && !prevState.fetchError) {\n this.renderError(state.fetchError.message);\n return;\n }\n\n // Screen transitions (age → guardian → verification → consent)\n if (state.showAgeVerification !== prevState.showAgeVerification ||\n state.showGuardianForm !== prevState.showGuardianForm ||\n state.showVerificationScreen !== prevState.showVerificationScreen) {\n this.rebuildUI();\n return;\n }\n\n // Verification screen state changes\n if (state.showVerificationScreen && (\n state.isVerificationComplete !== prevState.isVerificationComplete ||\n state.verificationError !== prevState.verificationError ||\n state.isPollingStatus !== prevState.isPollingStatus ||\n state.isInitiatingVerification !== prevState.isInitiatingVerification)) {\n this.rebuildUI();\n return;\n }\n\n // Checkbox changes\n if (\n state.selectedPurposes !== prevState.selectedPurposes ||\n state.selectedDataElements !== prevState.selectedDataElements\n ) {\n this.updateCheckboxes(state);\n }\n\n // Collapse changes\n if (state.collapsedPurposes !== prevState.collapsedPurposes) {\n this.updateCollapseState(state);\n }\n\n // Error message\n if (state.errorMessage !== prevState.errorMessage) {\n this.updateErrorMessage(state);\n }\n\n // Submitting state\n if (state.isSubmittingAccept !== prevState.isSubmittingAccept ||\n state.isSubmittingDecline !== prevState.isSubmittingDecline) {\n this.updateButtonStates(state);\n }\n }\n\n private renderOverlayWithLoading(): void {\n // Mount a single host <div> on document.body and attach an open shadow\n // root. All overlay, modal, and stylesheet content lives inside the shadow\n // so the host page's CSS cannot bleed in (and vice versa). This is what\n // makes the SDK render identically across customer sites and WordPress\n // installs that ship aggressive global stylesheets / accessibility plugins.\n this.hostEl = document.createElement(\"div\");\n this.hostEl.setAttribute(\"data-redacto-consent\", \"\");\n // Lock the host to a zero-size, fixed-position box so it cannot perturb a\n // flex / grid body layout. We deliberately DO NOT reset inherited text\n // properties (font-family, color, line-height) — those flow through the\n // shadow boundary so the modal picks up the host page's font, matching\n // how the React SDK renders.\n this.hostEl.style.position = \"fixed\";\n this.hostEl.style.top = \"0\";\n this.hostEl.style.left = \"0\";\n this.hostEl.style.width = \"0\";\n this.hostEl.style.height = \"0\";\n this.hostEl.style.zIndex = \"2147483646\";\n document.body.appendChild(this.hostEl);\n this.shadowRoot = this.hostEl.attachShadow({ mode: \"open\" });\n\n // Lock background scroll on the host page while the modal is open. We\n // capture the previous values so destroy() can restore exactly what was\n // there (including the empty string, which means \"use stylesheet rule\").\n this.previousBodyOverflow = document.body.style.overflow;\n this.previousHtmlOverflow = document.documentElement.style.overflow;\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n\n // Inject SDK stylesheet into the shadow root (not document.head).\n injectCheckboxStyles(this.shadowRoot);\n\n // Lazy-instantiate TTSManager now that we have a root for it to query.\n this.ttsManager = new TTSManager(\n () => this.updateTTSButton(),\n this.shadowRoot\n );\n\n const blockUI = this.options.blockUI !== false;\n\n if (blockUI) {\n this.overlayEl = el(\"div\", {\n style: styles.overlay,\n role: \"presentation\",\n });\n this.shadowRoot.appendChild(this.overlayEl);\n }\n\n const settingsObj = this.options.settings;\n const modalStyle = { ...styles.modal } as Record<string, any>;\n if (settingsObj?.backgroundColor) modalStyle.backgroundColor = settingsObj.backgroundColor;\n if (settingsObj?.borderRadius) modalStyle.borderRadius = settingsObj.borderRadius;\n if (settingsObj?.borderColor) modalStyle.border = `1px solid ${settingsObj.borderColor}`;\n if (settingsObj?.font) modalStyle.fontFamily = settingsObj.font;\n if (this.mediaQuery.matches) {\n modalStyle.width = \"90%\";\n modalStyle.maxWidth = \"90%\";\n }\n\n this.modalEl = el(\"div\", {\n style: modalStyle,\n role: \"dialog\",\n \"aria-modal\": \"true\",\n \"aria-label\": \"Privacy consent\",\n });\n\n // Loading content\n const loadingEl = el(\n \"div\",\n { style: styles.loadingContainer },\n el(\"div\", { style: styles.loadingSpinner }),\n el(\"p\", { style: { ...styles.privacyText, color: settingsObj?.textColor || \"#344054\" } }, \"Loading...\")\n );\n\n const contentEl = el(\"div\", { style: styles.content }, loadingEl);\n this.modalEl.appendChild(contentEl);\n this.shadowRoot.appendChild(this.modalEl);\n }\n\n private rebuildUI(): void {\n const state = this.store.getState();\n if (!state.content || !this.modalEl) return;\n\n const activeConfig = state.content.detail.active_config;\n const settingsObj = this.options.settings;\n const isMobile = this.mediaQuery.matches;\n const colors = resolveColors(settingsObj, activeConfig);\n\n // ─── Age Verification Screen ───\n if (state.showAgeVerification) {\n clearElement(this.modalEl);\n const ageRefs = renderAgeVerification({\n settings: settingsObj,\n colors,\n isMobile,\n logoUrl: activeConfig.logo_url,\n onYes: () => this.handleAgeVerificationYes(),\n onNo: () => this.handleAgeVerificationNo(),\n onClose: () => this.handleDecline(),\n });\n this.modalEl.appendChild(ageRefs.container);\n this.keyboardCleanup?.();\n this.keyboardCleanup = setupKeyboardTrap(this.modalEl, () => this.handleDecline());\n return;\n }\n\n // ─── Guardian Form Screen ───\n if (state.showGuardianForm) {\n clearElement(this.modalEl);\n this.guardianFormRefs = renderGuardianForm({\n formData: state.guardianFormData,\n settings: settingsObj,\n colors,\n isMobile,\n logoUrl: activeConfig.logo_url,\n isSubmitting: state.isInitiatingVerification,\n onSubmit: () => this.handleGuardianFormSubmit(),\n onCancel: () => this.handleDecline(),\n onFieldChange: (field, value) => {\n const s = this.store.getState();\n this.store.setState({\n guardianFormData: { ...s.guardianFormData, [field]: value },\n });\n },\n });\n this.modalEl.appendChild(this.guardianFormRefs.container);\n this.keyboardCleanup?.();\n this.keyboardCleanup = setupKeyboardTrap(this.modalEl, () => this.handleDecline());\n return;\n }\n\n // ─── Verification Screen ───\n if (state.showVerificationScreen) {\n clearElement(this.modalEl);\n const verRefs = renderVerificationScreen({\n settings: settingsObj,\n colors,\n isMobile,\n logoUrl: activeConfig.logo_url,\n isInitiating: state.isInitiatingVerification,\n isPolling: state.isPollingStatus,\n isComplete: state.isVerificationComplete,\n error: state.verificationError,\n errorCode: state.verificationErrorCode,\n canRetry: state.canRetryVerification,\n onContinue: () => this.handleVerificationContinue(),\n onBack: (clearName?: boolean) => {\n if (clearName) {\n this.handleChangeGuardian();\n } else if (state.verificationError && state.canRetryVerification) {\n this.handleVerificationRetry();\n } else {\n this.handleDecline();\n }\n },\n });\n this.modalEl.appendChild(verRefs.container);\n this.keyboardCleanup?.();\n this.keyboardCleanup = setupKeyboardTrap(this.modalEl, () => {});\n return;\n }\n\n // Clear modal content\n clearElement(this.modalEl);\n\n const headingColor = settingsObj?.headingColor || \"#101828\";\n const textColor = colors.text;\n const linkColor = colors.link;\n const font = colors.font;\n\n // ─── Top Section ───\n const logoImg = activeConfig.logo_url\n ? el(\"img\", {\n src: activeConfig.logo_url,\n style: {\n ...styles.logo,\n maxWidth: isMobile ? \"96px\" : \"140px\",\n maxHeight: isMobile ? \"28px\" : \"32px\",\n },\n alt: \"Logo\",\n })\n : null;\n\n this.noticeTitleEl = el(\"span\", {\n id: \"privacy-notice-title\",\n style: { ...styles.title, color: headingColor, fontFamily: font, fontSize: isMobile ? \"16px\" : \"18px\" },\n });\n this.noticeTitleEl.textContent = this.getTranslatedText(\"notice_banner_heading\", activeConfig.notice_banner_heading);\n\n // Clean up previous language dropdown (since rebuildUI re-creates it).\n // The dropdown lives inside the shadow root (sibling of the modal) so we\n // remove it from there.\n if (\n this.langSelectorRefs?.dropdown &&\n this.shadowRoot &&\n this.langSelectorRefs.dropdown.parentNode === this.shadowRoot\n ) {\n this.shadowRoot.removeChild(this.langSelectorRefs.dropdown);\n }\n\n // Language selector\n const supportedLangs = Object.keys(activeConfig.supported_languages_and_translations || {});\n const allLanguages = [activeConfig.default_language || \"English\", ...supportedLangs.filter((l) => l !== activeConfig.default_language)];\n\n this.langSelectorRefs = renderLanguageSelector({\n languages: allLanguages,\n selectedLanguage: state.selectedLanguage,\n settings: settingsObj,\n onSelect: (lang) => this.handleLanguageSelect(lang),\n dropdownContainer: this.shadowRoot!,\n });\n\n // TTS button with SVG speaker icon (matches React)\n const ttsStrokeColor = settingsObj?.button?.language?.textColor || \"currentColor\";\n const speakerSvg = svg(\n \"svg\",\n {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: ttsStrokeColor,\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"aria-hidden\": \"true\",\n },\n svg(\"polygon\", { points: \"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" }),\n svg(\"path\", { d: \"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\" })\n );\n\n this.ttsButton = el(\"button\", {\n style: {\n ...styles.topRight,\n display: \"none\",\n padding: \"3px 9px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n type: \"button\",\n \"aria-label\": \"Start audio playback\",\n title: \"Start Talkback\",\n onClick: () => this.ttsManager?.toggle(),\n });\n this.ttsButton.appendChild(speakerSvg);\n\n // Fetch TTS audio (the API uses \"English\" for English, not \"en\")\n this.ttsManager?.fetchAudioUrls({\n accessToken: this.options.accessToken,\n baseUrl: this.options.baseUrl,\n ledgerBaseUrl: this.options.ledgerBaseUrl,\n noticeUuid: activeConfig.notice_uuid,\n language: this.getLanguageCode(state.selectedLanguage),\n content: activeConfig,\n ...this.sandboxParams(),\n });\n\n // TTS button on LEFT, language selector on RIGHT (matches React)\n const topRight = el(\"div\", {\n style: { display: \"flex\", alignItems: \"center\", gap: \"8px\", flexShrink: 0 },\n }, this.ttsButton, this.langSelectorRefs.container);\n\n // Two stacked rows at every breakpoint: the logo alone on row 1, aligned\n // per the admin-chosen position, then title + controls on row 2.\n const logoPosition = resolveLogoPosition(activeConfig.logo_position);\n const headerRows: HTMLElement[] = [];\n // Row 1 only exists when there is a logo. This package has no bundled\n // fallback (unlike React), so rendering it regardless would leave nothing\n // but the headerStack gap — a phantom band above the title.\n if (logoImg) {\n headerRows.push(\n el(\n \"div\",\n { style: { ...styles.logoRow, justifyContent: logoRowJustify(logoPosition) } },\n logoImg\n )\n );\n }\n headerRows.push(el(\"div\", { style: styles.headerRow }, this.noticeTitleEl, topRight));\n\n const topSection = el(\n \"div\",\n { style: { ...styles.headerStack, gap: isMobile ? \"12px\" : \"10px\" } },\n ...headerRows\n );\n\n // ─── Middle Section ───\n this.middleSection = el(\"div\", { style: styles.middleSection });\n\n const baseTextStyle = { ...styles.privacyText, color: textColor, fontFamily: font, fontSize: isMobile ? \"14px\" : \"16px\" };\n\n // Notice text + Privacy policy in ONE <p> (matches React: single <p> with <br>)\n const noticeTextSpan = el(\"span\", { id: \"privacy-notice-text\" });\n noticeTextSpan.textContent = this.getTranslatedText(\"notice_text\", activeConfig.notice_text);\n\n const policyPrefixText = this.getTranslatedText(\"privacy_policy_prefix_text\", activeConfig.privacy_policy_prefix_text);\n const policyAnchorText = this.getTranslatedText(\"privacy_policy_anchor_text\", activeConfig.privacy_policy_anchor_text);\n\n this.privacyPolicyLinkEl = el(\"a\", {\n id: \"privacy-policy-link\",\n href: activeConfig.privacy_policy_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: { ...styles.link, color: linkColor, fontFamily: font },\n \"aria-label\": \"Privacy Policy (opens in new tab)\",\n }) as HTMLAnchorElement;\n this.privacyPolicyLinkEl.textContent = policyAnchorText;\n\n const policySpan = el(\"span\", { id: \"privacy-policy-text\" },\n `${policyPrefixText} `,\n this.privacyPolicyLinkEl\n );\n\n const noticeAndPolicyP = el(\"p\", { style: baseTextStyle },\n noticeTextSpan,\n el(\"br\"),\n policySpan\n );\n\n // Purpose section heading\n this.purposeHeadingEl = el(\"h2\", {\n id: \"purpose-section-heading\",\n style: { ...styles.subTitle, color: headingColor, fontFamily: font },\n });\n this.purposeHeadingEl.textContent = this.getTranslatedText(\"purpose_section_heading\", activeConfig.purpose_section_heading);\n\n this.middleSection.appendChild(noticeAndPolicyP);\n this.middleSection.appendChild(this.purposeHeadingEl);\n\n // Render purposes (needs consent)\n if (state.needsConsentPurposes.length > 0) {\n this.purposeRefs = renderModalPurposes(state.needsConsentPurposes, {\n selectedPurposes: state.selectedPurposes,\n collapsedPurposes: state.collapsedPurposes,\n selectedDataElements: state.selectedDataElements,\n settings: settingsObj,\n isMobile,\n isAlreadyConsented: false,\n getTranslatedText: (key, defaultText, itemId) => this.getTranslatedText(key, defaultText, itemId),\n onPurposeToggle: (uuid) => this.handlePurposeCheckboxChange(uuid),\n onPurposeCollapse: (uuid) => this.togglePurposeCollapse(uuid),\n onDataElementToggle: (euuid, puuid) => this.handleDataElementCheckboxChange(euuid, puuid),\n });\n this.middleSection.appendChild(this.purposeRefs.container);\n }\n\n // Render already-consented purposes\n if (state.alreadyConsentedPurposes.length > 0) {\n this.alreadyConsentedPurposeRefs = renderModalPurposes(state.alreadyConsentedPurposes, {\n selectedPurposes: state.selectedPurposes,\n collapsedPurposes: state.collapsedPurposes,\n selectedDataElements: state.selectedDataElements,\n initialDataElementSelections: state.initialDataElementSelections,\n settings: settingsObj,\n isMobile,\n isAlreadyConsented: true,\n getTranslatedText: (key, defaultText, itemId) => this.getTranslatedText(key, defaultText, itemId),\n onPurposeToggle: () => {},\n onPurposeCollapse: (uuid) => this.togglePurposeCollapse(uuid),\n onDataElementToggle: () => {},\n });\n this.middleSection.appendChild(this.alreadyConsentedPurposeRefs.container);\n }\n\n // Additional text + Privacy Center + DPO Info in ONE block (matches React layout)\n if (activeConfig.privacy_center_url || activeConfig.dpo_info) {\n const footerDiv = el(\"div\", {\n style: {\n ...baseTextStyle,\n fontSize: isMobile ? \"13px\" : \"14px\",\n lineHeight: \"1.4\",\n borderTop: \"1px solid rgba(152, 162, 179, 0.3)\",\n paddingTop: \"12px\",\n marginTop: \"12px\",\n },\n });\n\n const footerP = el(\"p\", { style: { margin: \"0\", opacity: \"0.6\" } });\n\n // Privacy Center section: \"additional_text Privacy Center.\"\n if (activeConfig.privacy_center_url) {\n if (activeConfig.additional_text) {\n const addlSpan = el(\"span\", { id: \"additional-text\" });\n addlSpan.textContent = this.getTranslatedText(\"additional_text\", activeConfig.additional_text);\n footerP.appendChild(addlSpan);\n footerP.appendChild(document.createTextNode(\" \"));\n }\n\n const pcAnchorText = this.getTranslatedText(\"privacy_center_anchor_text\", activeConfig.privacy_center_anchor_text || \"Privacy Center\");\n this.privacyCenterLinkEl = el(\"a\", {\n id: \"privacy-center-link\",\n href: activeConfig.privacy_center_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: { ...styles.link, color: linkColor, fontFamily: font },\n }) as HTMLAnchorElement;\n this.privacyCenterLinkEl.textContent = pcAnchorText;\n footerP.appendChild(this.privacyCenterLinkEl);\n footerP.appendChild(document.createTextNode(\".\"));\n }\n\n // DPO Info section (all inline with <br> separators, matching React)\n if (activeConfig.dpo_info) {\n const dpo = activeConfig.dpo_info;\n\n if (activeConfig.privacy_center_url) {\n footerP.appendChild(el(\"br\"));\n }\n\n // Grievance line\n if (dpo.grievance_text) {\n const gText = el(\"span\", { id: \"dpo-grievance-text\" });\n gText.textContent = this.getTranslatedDpoText(\"grievance_text\", dpo.grievance_text);\n footerP.appendChild(gText);\n footerP.appendChild(document.createTextNode(\" \"));\n\n if (dpo.grievance_url) {\n const gLink = el(\"a\", {\n id: \"dpo-grievance-link\",\n href: dpo.grievance_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: { ...styles.link, color: linkColor, fontFamily: font },\n });\n gLink.textContent = this.getTranslatedDpoText(\"grievance_anchor_text\", dpo.grievance_anchor_text);\n footerP.appendChild(gLink);\n }\n\n if (dpo.grievance_email) {\n footerP.appendChild(document.createTextNode(\" \"));\n const connectorSpan = el(\"span\", { id: \"dpo-grievance-email-connector\" });\n connectorSpan.textContent = this.getTranslatedDpoText(\n \"grievance_email_connector_text\",\n dpo.grievance_email_connector_text || \"or email to\"\n );\n footerP.appendChild(connectorSpan);\n footerP.appendChild(document.createTextNode(\" \"));\n\n const emailLink = el(\"a\", {\n id: \"dpo-grievance-email\",\n href: `mailto:${dpo.grievance_email}`,\n style: { ...styles.link, color: linkColor, fontFamily: font },\n });\n emailLink.textContent = dpo.grievance_email;\n footerP.appendChild(emailLink);\n }\n }\n\n // DP Board line\n if (dpo.dp_board_text) {\n footerP.appendChild(el(\"br\"));\n const dpText = el(\"span\", { id: \"dpo-dp-board-text\" });\n dpText.textContent = this.getTranslatedDpoText(\"dp_board_text\", dpo.dp_board_text);\n footerP.appendChild(dpText);\n footerP.appendChild(document.createTextNode(\" \"));\n\n if (dpo.dp_board_url) {\n const dpLink = el(\"a\", {\n id: \"dpo-dp-board-link\",\n href: dpo.dp_board_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: { ...styles.link, color: linkColor, fontFamily: font },\n });\n dpLink.textContent = this.getTranslatedDpoText(\"dp_board_anchor_text\", dpo.dp_board_anchor_text);\n footerP.appendChild(dpLink);\n }\n }\n\n // DPO line\n if (dpo.dpo_text) {\n footerP.appendChild(el(\"br\"));\n const dpoTextSpan = el(\"span\", { id: \"dpo-dpo-text\" });\n dpoTextSpan.textContent = this.getTranslatedDpoText(\"dpo_text\", dpo.dpo_text);\n footerP.appendChild(dpoTextSpan);\n footerP.appendChild(document.createTextNode(\" \"));\n\n if (dpo.dpo_url) {\n const dpoLink = el(\"a\", {\n id: \"dpo-dpo-link\",\n href: dpo.dpo_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: { ...styles.link, color: linkColor, fontFamily: font },\n });\n dpoLink.textContent = this.getTranslatedDpoText(\"dpo_anchor_text\", dpo.dpo_anchor_text);\n footerP.appendChild(dpoLink);\n }\n }\n }\n\n footerDiv.appendChild(footerP);\n this.middleSection.appendChild(footerDiv);\n }\n\n // Error message\n this.errorEl = el(\"div\", {\n role: \"alert\",\n style: {\n backgroundColor: \"#FEE2E2\",\n color: \"#DC2626\",\n padding: \"12px\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n border: \"1px solid #FCA5A5\",\n display: \"none\",\n },\n });\n\n // ─── Bottom Section: three actions (matches React) ───\n // wide: [Decline] <-- gap --> [Accept Selected] [Accept All]\n // narrow: [Accept All] / [Accept Selected] / [Decline], stacked\n const acceptBtnText = state.isFullyConsentedReviewMode\n ? (this.options.reviewModeButtonText || \"Continue\")\n : this.getTranslatedText(\n \"confirm_button_text\",\n activeConfig.confirm_button_text || DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT\n );\n\n // Three buttons share the footer width, so the single-button horizontal\n // padding would clip long translated labels. Let them wrap instead.\n // `width: auto` undoes `styles.button`'s `width: 100%` -- in the wide row\n // each button must size to its own label or the left/right split collapses.\n const gridButtonBox: Record<string, any> = {\n fontSize: isMobile ? \"14px\" : \"16px\",\n padding: state.isFullyConsentedReviewMode\n ? (isMobile ? \"10px 20px\" : \"9px 45px\")\n : \"9px 20px\",\n width:\n state.isFullyConsentedReviewMode || isMobile ? \"100%\" : \"auto\",\n whiteSpace: \"normal\",\n wordBreak: \"break-word\",\n };\n\n // \"Accept selected\" is outlined in the accent colour on the notice step --\n // subordinate to the filled Accept All. Review mode keeps it filled, since\n // it is then the only button.\n const acceptStyle: Record<string, any> = {\n ...styles.button,\n ...(state.isFullyConsentedReviewMode\n ? { ...styles.acceptButton, backgroundColor: colors.acceptBg, color: colors.acceptText }\n : {\n ...styles.cancelButton,\n backgroundColor: \"#ffffff\",\n color: colors.acceptShortcutText,\n borderColor: colors.acceptShortcutBorder,\n }),\n borderRadius: colors.borderRadius,\n ...gridButtonBox,\n };\n\n this.acceptBtn = el(\"button\", {\n id: ACCEPT_SELECTED_BUTTON_ID,\n style: acceptStyle,\n type: \"button\",\n onClick: () => this.handleAccept(\"selected\"),\n }) as HTMLButtonElement;\n this.acceptBtn.textContent = acceptBtnText;\n\n // Accept All is the filled primary -- the one-click path, in the far-right\n // slot -- so it carries the brand colour.\n const shortcutStyle: Record<string, any> = {\n ...styles.button,\n ...styles.acceptButton,\n backgroundColor: colors.acceptBg,\n color: colors.acceptText,\n borderRadius: colors.borderRadius,\n ...gridButtonBox,\n };\n\n this.acceptAllBtn = el(\"button\", {\n id: ACCEPT_ALL_BUTTON_ID,\n style: shortcutStyle,\n type: \"button\",\n onClick: () => this.handleAccept(\"all\"),\n }) as HTMLButtonElement;\n this.acceptAllBtn.textContent = this.getTranslatedText(\n \"accept_all_button_text\",\n activeConfig.accept_all_button_text || DEFAULT_ACCEPT_ALL_BUTTON_TEXT\n );\n\n const declineBtnText = this.getTranslatedText(\n \"decline_button_text\",\n activeConfig.decline_button_text || DEFAULT_DECLINE_BUTTON_TEXT\n );\n const declineStyle: Record<string, any> = {\n ...styles.button,\n ...styles.cancelButton,\n backgroundColor: colors.declineBg,\n color: colors.declineText,\n borderColor: colors.declineBorder,\n borderRadius: colors.borderRadius,\n ...gridButtonBox,\n // Pushes everything after decline to the right edge, which is the whole\n // of the wide layout. Inert in the stack and in review mode.\n marginRight:\n state.isFullyConsentedReviewMode || isMobile ? \"0\" : \"auto\",\n };\n\n this.declineBtn = el(\"button\", {\n id: DECLINE_BUTTON_ID,\n style: declineStyle,\n type: \"button\",\n onClick: () => this.handleDecline(),\n }) as HTMLButtonElement;\n\n if (!state.isFullyConsentedReviewMode) {\n this.declineBtn.textContent = declineBtnText;\n }\n\n // Review mode collapses to the single host-supplied continue button.\n const bottomSection = el(\"div\", {\n style: state.isFullyConsentedReviewMode\n ? styles.bottomSection\n : isMobile\n ? styles.actionButtonStack\n : styles.actionButtonRow,\n });\n if (state.isFullyConsentedReviewMode) {\n bottomSection.appendChild(this.acceptBtn);\n } else if (isMobile) {\n // Appended in a different order per breakpoint rather than reordered with\n // CSS, so focus order follows visual order (WCAG 2.4.3).\n bottomSection.appendChild(this.acceptAllBtn);\n bottomSection.appendChild(this.acceptBtn);\n bottomSection.appendChild(this.declineBtn);\n } else {\n bottomSection.appendChild(this.declineBtn);\n bottomSection.appendChild(this.acceptBtn);\n bottomSection.appendChild(this.acceptAllBtn);\n }\n\n // Assemble modal\n const contentWrapper = el(\n \"div\",\n { style: styles.content },\n topSection,\n this.errorEl,\n this.middleSection,\n bottomSection\n );\n\n this.modalEl.appendChild(contentWrapper);\n\n // Set initial accept button disabled state\n this.updateAcceptButtonState(state);\n\n // Setup keyboard trap\n this.keyboardCleanup?.();\n this.keyboardCleanup = setupKeyboardTrap(this.modalEl, () => this.handleDecline());\n }\n\n private getLanguageCode(displayLanguage: string): string {\n const content = this.store.getState().content?.detail.active_config;\n if (!content) return \"English\";\n\n // English maps to \"English\" for audio API\n if (displayLanguage === \"English\" || displayLanguage === \"en\" || displayLanguage === \"EN\") {\n return \"English\";\n }\n\n // If display language exists in translations, use it directly\n if (content.supported_languages_and_translations?.[displayLanguage]) {\n return displayLanguage;\n }\n\n // Fallback to default language or English\n return content.default_language === \"en\" || content.default_language === \"EN\"\n ? \"English\"\n : content.default_language || \"English\";\n }\n\n private getTranslatedDpoText(key: string, defaultText: string): string {\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n if (!content) return defaultText;\n\n const lang = state.selectedLanguage;\n if (lang === \"English\" || lang === \"en\" || lang === \"EN\") return defaultText;\n\n const translations = content.supported_languages_and_translations;\n if (!translations) return defaultText;\n\n const translationMap = translations[lang];\n if (!translationMap?.dpo_info) return defaultText;\n\n const value = (translationMap.dpo_info as any)[key];\n return typeof value === \"string\" && value ? value : defaultText;\n }\n\n private renderError(message: string): void {\n if (!this.modalEl) return;\n\n clearElement(this.modalEl);\n\n const errorContent = el(\n \"div\",\n { style: { ...styles.content, alignItems: \"center\", justifyContent: \"center\" } },\n el(\"div\", {\n role: \"alert\",\n style: {\n backgroundColor: \"#FEE2E2\",\n color: \"#DC2626\",\n padding: \"16px\",\n borderRadius: \"8px\",\n fontSize: \"14px\",\n border: \"1px solid #FCA5A5\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n },\n }, message)\n );\n\n this.modalEl.appendChild(errorContent);\n }\n\n private getTranslatedText(key: string, defaultText: string, itemId?: string): string {\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n if (!content) return defaultText;\n\n const lang = state.selectedLanguage;\n if (lang === \"English\" || lang === \"en\" || lang === \"EN\") {\n if (key === \"privacy_policy_anchor_text\" && content.privacy_policy_anchor_text) {\n return content.privacy_policy_anchor_text;\n }\n return defaultText;\n }\n\n const translations = content.supported_languages_and_translations;\n if (!translations) return defaultText;\n\n const translationMap = translations[lang] as TranslationObject | undefined;\n if (!translationMap) return defaultText;\n\n if (itemId) {\n if (key === \"purposes.name\" || key === \"purposes.description\") {\n const purposeData = translationMap.purposes?.[itemId];\n if (purposeData) {\n if (typeof purposeData === \"string\") {\n return key === \"purposes.name\" ? purposeData : defaultText;\n }\n return key === \"purposes.name\"\n ? purposeData.name || defaultText\n : purposeData.description || defaultText;\n }\n return defaultText;\n }\n if (key.startsWith(\"data_elements.\")) {\n return translationMap.data_elements?.[itemId] || defaultText;\n }\n }\n\n const value = (translationMap as any)[key];\n if (typeof value === \"string\" && value) return value;\n return defaultText;\n }\n\n private handleLanguageSelect(lang: string): void {\n this.store.setState({ selectedLanguage: lang });\n // Rebuild UI to update all translations\n this.rebuildUI();\n }\n\n private togglePurposeCollapse(purposeUuid: string): void {\n const state = this.store.getState();\n this.store.setState({\n collapsedPurposes: {\n ...state.collapsedPurposes,\n [purposeUuid]: !state.collapsedPurposes[purposeUuid],\n },\n });\n }\n\n private handlePurposeCheckboxChange(purposeUuid: string): void {\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n if (!content) return;\n\n const purpose = content.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose) return;\n\n const newPurposeState = !state.selectedPurposes[purposeUuid];\n const updatedElements = { ...state.selectedDataElements };\n for (const de of purpose.data_elements) {\n updatedElements[`${purposeUuid}-${de.uuid}`] = newPurposeState;\n }\n\n this.store.setState({\n selectedPurposes: { ...state.selectedPurposes, [purposeUuid]: newPurposeState },\n selectedDataElements: updatedElements,\n });\n }\n\n private handleDataElementCheckboxChange(elementUuid: string, purposeUuid: string): void {\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n if (!content) return;\n\n const purpose = content.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose) return;\n\n const combinedId = `${purposeUuid}-${elementUuid}`;\n const newDataElements = {\n ...state.selectedDataElements,\n [combinedId]: !state.selectedDataElements[combinedId],\n };\n\n const requiredElements = purpose.data_elements.filter((el) => el.required);\n let shouldCheckPurpose: boolean;\n\n if (requiredElements.length > 0) {\n shouldCheckPurpose = requiredElements.every(\n (el) => newDataElements[`${purposeUuid}-${el.uuid}`]\n );\n } else {\n shouldCheckPurpose = purpose.data_elements.some(\n (el) => newDataElements[`${purposeUuid}-${el.uuid}`]\n );\n }\n\n this.store.setState({\n selectedDataElements: newDataElements,\n selectedPurposes: { ...state.selectedPurposes, [purposeUuid]: shouldCheckPurpose },\n });\n }\n\n /**\n * Shared by all three accept buttons. The mode only decides which\n * purposes/data elements are submitted — everything downstream, including\n * the host's `onAccept` callback, is identical.\n */\n private async handleAccept(mode: AcceptMode = \"selected\"): Promise<void> {\n const state = this.store.getState();\n if (state.isSubmitting) return;\n\n // Review mode — just close\n if (state.isFullyConsentedReviewMode) {\n this.options.onAccept();\n this.destroy();\n return;\n }\n\n // Block submission for minors who have not completed guardian verification\n if (state.isMinorFlow && !state.verificationReference && !state.selfDeclaredAdult) {\n this.store.setState({\n errorMessage: \"Guardian verification is required before consent can be submitted.\",\n });\n return;\n }\n\n const content = state.content?.detail.active_config;\n if (!content) return;\n\n this.abortController = new AbortController();\n this.store.setState({ isSubmitting: true, isSubmittingAccept: true, errorMessage: null });\n\n const selection = buildSelectionForMode(content.purposes, mode, {\n selectedPurposes: state.selectedPurposes,\n selectedDataElements: state.selectedDataElements,\n });\n // Reflect the shortcut's selection in the checkboxes so the notice shows\n // what was sent if the request fails and it stays open.\n if (mode !== \"selected\") {\n this.store.setState({\n selectedPurposes: selection.selectedPurposes,\n selectedDataElements: selection.selectedDataElements,\n });\n }\n\n try {\n const purposes = content.purposes.map((purpose) => {\n const dataElements = purpose.data_elements\n .filter((de) => de.enabled)\n .map((de) => ({\n uuid: de.uuid,\n name: de.name,\n enabled: de.enabled,\n required: de.required,\n selected:\n selection.selectedDataElements[`${purpose.uuid}-${de.uuid}`] ||\n false,\n }));\n\n return {\n uuid: purpose.uuid,\n name: purpose.name,\n description: purpose.description,\n selected: selection.selectedPurposes[purpose.uuid] || false,\n data_elements: dataElements,\n };\n });\n\n await submitConsentEvent({\n accessToken: this.options.accessToken,\n baseUrl: this.options.baseUrl,\n ledgerBaseUrl: this.options.ledgerBaseUrl,\n noticeUuid: state.content!.detail.uuid,\n purposes,\n declined: false,\n meta_data: this.options.applicationId ? { specific_uuid: this.options.applicationId } : undefined,\n guardianVerificationReference: state.verificationReference || undefined,\n selfDeclaredAdult: state.selfDeclaredAdult || undefined,\n language: state.selectedLanguage,\n signal: this.abortController.signal,\n ...this.sandboxParams(),\n });\n\n this.options.onAccept();\n this.destroy();\n } catch (err) {\n if ((err as Error).name === \"AbortError\") return;\n const error = err as Error & { status?: number };\n const message = error.status === 409\n ? \"You have already provided consent.\"\n : error.status && error.status >= 500\n ? \"Server error: Please try again later.\"\n : error.message || \"Failed to submit consent.\";\n this.store.setState({ errorMessage: message, isSubmitting: false, isSubmittingAccept: false });\n this.options.onError?.(error);\n }\n }\n\n private handleDecline(): void {\n const state = this.store.getState();\n if (state.isSubmitting) return;\n\n // Stop any in-flight verification polling and clear the persisted\n // DigiLocker session so the next open starts the flow from scratch\n // (age verification → guardian form → verification screen).\n this.stopPolling();\n clearConsentState();\n\n this.options.onDecline();\n this.destroy();\n }\n\n private updateCheckboxes(state: ModalState): void {\n if (this.purposeRefs) {\n for (const [key, checkbox] of this.purposeRefs.checkboxes) {\n if (key in state.selectedPurposes) {\n checkbox.checked = state.selectedPurposes[key] || false;\n } else {\n checkbox.checked = state.selectedDataElements[key] || false;\n }\n }\n }\n // Update accept button disabled state\n this.updateAcceptButtonState(state);\n }\n\n private areAllRequiredChecked(state: ModalState): boolean {\n const content = state.content?.detail.active_config;\n if (!content?.purposes?.length) return false;\n\n return content.purposes.every((purpose) => {\n const requiredElements = purpose.data_elements.filter((de) => de.required && de.enabled);\n if (requiredElements.length === 0) return true;\n return requiredElements.every(\n (de) => state.selectedDataElements[`${purpose.uuid}-${de.uuid}`]\n );\n });\n }\n\n private updateAcceptButtonState(state: ModalState): void {\n if (!this.acceptBtn || state.isFullyConsentedReviewMode) return;\n\n const submitting = state.isSubmittingAccept || state.isSubmittingDecline;\n const allRequiredChecked = this.areAllRequiredChecked(state);\n // Only \"accept selected\" waits on the required boxes — sparing the two\n // shortcuts that gate is the point of the feature.\n const setDisabled = (btn: HTMLButtonElement | null, disabled: boolean) => {\n if (!btn) return;\n btn.disabled = disabled;\n btn.style.opacity = disabled ? \"0.5\" : \"1\";\n btn.style.cursor = disabled ? \"not-allowed\" : \"pointer\";\n };\n\n setDisabled(this.acceptBtn, !allRequiredChecked || submitting);\n setDisabled(this.acceptAllBtn, submitting);\n }\n\n private updateCollapseState(state: ModalState): void {\n const updateRefs = (refs: ModalPurposeRefs | null) => {\n if (!refs) return;\n for (const [purposeUuid, container] of refs.dataElementContainers) {\n const content = state.content?.detail.active_config;\n const purpose = content?.purposes.find((p) => p.uuid === purposeUuid);\n const isCollapsed = state.collapsedPurposes[purposeUuid];\n\n container.style.display = !isCollapsed && purpose?.data_elements?.length ? \"flex\" : \"none\";\n\n const chevron = refs.chevrons.get(purposeUuid);\n if (chevron) {\n (chevron as unknown as HTMLElement).style.transform = !isCollapsed ? \"rotate(90deg)\" : \"rotate(0deg)\";\n }\n\n const collapseBtn = refs.collapseButtons.get(purposeUuid);\n if (collapseBtn) {\n collapseBtn.setAttribute(\"aria-expanded\", String(!isCollapsed));\n }\n }\n };\n\n updateRefs(this.purposeRefs);\n updateRefs(this.alreadyConsentedPurposeRefs);\n }\n\n private updateErrorMessage(state: ModalState): void {\n if (!this.errorEl) return;\n if (state.errorMessage) {\n this.errorEl.textContent = state.errorMessage;\n this.errorEl.style.display = \"block\";\n } else {\n this.errorEl.style.display = \"none\";\n }\n }\n\n // ─── Age Verification Handlers ───\n\n private handleAgeVerificationYes(): void {\n this.store.setState({\n isMinorFlow: false,\n selfDeclaredAdult: true,\n showAgeVerification: false,\n });\n }\n\n private handleAgeVerificationNo(): void {\n this.store.setState({\n showAgeVerification: false,\n showGuardianForm: true,\n });\n }\n\n // ─── Guardian Form Handlers ───\n\n private async handleGuardianFormSubmit(): Promise<void> {\n const state = this.store.getState();\n const errors = validateGuardianForm(state.guardianFormData);\n if (Object.keys(errors).length > 0) {\n if (this.guardianFormRefs) {\n if (errors.guardianName) {\n this.guardianFormRefs.nameError.textContent = errors.guardianName;\n this.guardianFormRefs.nameError.style.display = \"block\";\n }\n if (errors.guardianContact) {\n this.guardianFormRefs.contactError.textContent = errors.guardianContact;\n this.guardianFormRefs.contactError.style.display = \"block\";\n }\n if (errors.guardianRelationship) {\n this.guardianFormRefs.relationshipError.textContent = errors.guardianRelationship;\n this.guardianFormRefs.relationshipError.style.display = \"block\";\n }\n }\n return;\n }\n\n this.store.setState({ isInitiatingVerification: true });\n\n const digilockerMode = this.options.digilockerMode || \"redirect\";\n const callbackUrl = digilockerMode === \"popup\"\n ? new URL(this.options.digilockerCallbackUrl || \"/digilocker-callback\", window.location.origin).href\n : undefined;\n\n try {\n const response = await initiateGuardianVerification({\n accessToken: this.options.accessToken,\n baseUrl: this.options.baseUrl,\n guardianName: state.guardianFormData.guardianName,\n guardianContact: state.guardianFormData.guardianContact,\n guardianRelationship: state.guardianFormData.guardianRelationship,\n frontendCallbackUrl: callbackUrl,\n });\n\n if (response.already_verified && response.verification_reference) {\n this.store.setState({\n verificationReference: response.verification_reference,\n showGuardianForm: false,\n showVerificationScreen: true,\n isInitiatingVerification: false,\n isVerificationComplete: true,\n });\n // Auto-transition to consent form after 1s\n setTimeout(() => {\n this.store.setState({\n showVerificationScreen: false,\n isVerificationComplete: false,\n });\n }, 1000);\n return;\n }\n\n // Save state for redirect flow\n saveConsentState({\n flowState: \"digilocker-pending\",\n sessionToken: response.session_token,\n guardianInfoUuid: response.guardian_info_uuid,\n selectedPurposes: state.selectedPurposes,\n selectedDataElements: state.selectedDataElements,\n timestamp: new Date().toISOString(),\n originalUrl: window.location.href,\n noticeId: this.options.noticeId,\n baseUrl: this.options.baseUrl,\n });\n\n // Show verification screen with \"Opening DigiLocker...\" state\n this.store.setState({\n showGuardianForm: false,\n showVerificationScreen: true,\n isInitiatingVerification: true,\n isPollingStatus: false,\n });\n\n if (digilockerMode === \"popup\" && response.digilocker_redirect_url) {\n const popup = window.open(\n response.digilocker_redirect_url,\n \"digilocker_verification\",\n \"width=600,height=700,scrollbars=yes,resizable=yes\"\n );\n if (popup) {\n this.verificationPopup = popup;\n this.startPopupMonitoring(popup);\n } else {\n this.store.setState({\n isInitiatingVerification: false,\n verificationError: \"Popup blocked. Please allow popups for this site.\",\n canRetryVerification: true,\n });\n return;\n }\n } else if (response.digilocker_redirect_url) {\n const openedWindow = window.open(response.digilocker_redirect_url, \"_blank\");\n if (!openedWindow) {\n this.store.setState({\n isInitiatingVerification: false,\n verificationError: \"Unable to open DigiLocker. Please allow popups.\",\n canRetryVerification: true,\n });\n return;\n }\n try { openedWindow.opener = null; } catch {}\n }\n\n // Switch to polling state (spinner + \"Please complete verification...\" message)\n this.store.setState({\n isInitiatingVerification: false,\n isPollingStatus: true,\n });\n this.startStatusPolling(response.session_token!);\n } catch (error) {\n this.store.setState({ isInitiatingVerification: false });\n const err = error as Error & { status?: number };\n if (this.guardianFormRefs) {\n this.guardianFormRefs.generalError.textContent = err.message || \"Failed to initiate verification.\";\n this.guardianFormRefs.generalError.style.display = \"block\";\n }\n }\n }\n\n // ─── Verification Polling ───\n\n private startStatusPolling(token: string): void {\n this.verificationSessionToken = token;\n let attempts = 0;\n let consecutiveErrors = 0;\n let paused = false;\n const MAX_ATTEMPTS = 40;\n const MAX_CONSECUTIVE_ERRORS = 3;\n const POLL_INTERVAL = 3000;\n\n const poll = async () => {\n if (paused) return;\n attempts++;\n\n if (attempts > MAX_ATTEMPTS) {\n this.stopPolling();\n this.store.setState({\n verificationError: \"Verification is taking longer than expected. Please try again.\",\n verificationErrorCode: \"SESSION_EXPIRED\",\n canRetryVerification: true,\n isPollingStatus: false,\n });\n return;\n }\n\n try {\n const response = await verifyGuardianStatus({\n accessToken: this.options.accessToken,\n baseUrl: this.options.baseUrl,\n sessionToken: token,\n });\n\n consecutiveErrors = 0;\n\n if (response.status === \"verified\") {\n this.stopPolling();\n const ref = response.verification_reference || response.guardian_details?.verification_reference;\n if (!ref) {\n this.store.setState({\n verificationError: \"Verification completed but no reference received. Please try again.\",\n canRetryVerification: true,\n isPollingStatus: false,\n });\n return;\n }\n this.store.setState({\n verificationReference: ref,\n isVerificationComplete: true,\n isPollingStatus: false,\n });\n clearConsentState();\n return;\n }\n\n if (response.status === \"failed\" || response.status === \"expired\") {\n this.stopPolling();\n this.store.setState({\n verificationError: getVerificationErrorMessage(response.error_code, response.error),\n verificationErrorCode: response.error_code,\n canRetryVerification: response.can_retry,\n isPollingStatus: false,\n });\n return;\n }\n\n if (!paused) {\n this.statusPollTimeout = setTimeout(poll, POLL_INTERVAL);\n }\n } catch (error) {\n const err = error as Error & { status?: number };\n if (err.status === 404 || err.status === 410) {\n this.stopPolling();\n this.store.setState({\n verificationError: \"Verification session not found or expired.\",\n verificationErrorCode: \"SESSION_EXPIRED\",\n canRetryVerification: true,\n isPollingStatus: false,\n });\n return;\n }\n\n consecutiveErrors++;\n if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {\n this.stopPolling();\n this.store.setState({\n verificationError: err.message || \"Unable to check verification status.\",\n canRetryVerification: true,\n isPollingStatus: false,\n });\n return;\n }\n\n this.statusPollTimeout = setTimeout(poll, POLL_INTERVAL);\n }\n };\n\n // Pause when tab hidden, resume on return\n this.visibilityChangeHandler = () => {\n if (document.hidden) {\n paused = true;\n if (this.statusPollTimeout) {\n clearTimeout(this.statusPollTimeout);\n this.statusPollTimeout = null;\n }\n } else {\n paused = false;\n poll();\n }\n };\n document.addEventListener(\"visibilitychange\", this.visibilityChangeHandler);\n\n this.statusPollTimeout = setTimeout(poll, POLL_INTERVAL);\n }\n\n private stopPolling(): void {\n if (this.statusPollTimeout) {\n clearTimeout(this.statusPollTimeout);\n this.statusPollTimeout = null;\n }\n if (this.popupCheckInterval) {\n clearInterval(this.popupCheckInterval);\n this.popupCheckInterval = null;\n }\n if (this.visibilityChangeHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityChangeHandler);\n this.visibilityChangeHandler = null;\n }\n this.verificationPopup?.close();\n this.verificationPopup = null;\n }\n\n private startPopupMonitoring(popup: Window): void {\n this.popupCheckInterval = setInterval(() => {\n if (popup.closed) {\n if (this.popupCheckInterval) {\n clearInterval(this.popupCheckInterval);\n this.popupCheckInterval = null;\n }\n }\n }, 500);\n }\n\n // ─── Verification Screen Handlers ───\n\n private handleVerificationContinue(): void {\n this.store.setState({\n showVerificationScreen: false,\n isVerificationComplete: false,\n });\n }\n\n private handleVerificationRetry(): void {\n this.store.setState({\n showVerificationScreen: false,\n showGuardianForm: true,\n verificationError: null,\n verificationErrorCode: null,\n canRetryVerification: false,\n isVerificationComplete: false,\n });\n }\n\n private handleChangeGuardian(): void {\n this.store.setState({\n showVerificationScreen: false,\n showGuardianForm: true,\n verificationError: null,\n verificationErrorCode: null,\n canRetryVerification: false,\n isVerificationComplete: false,\n guardianFormData: { guardianName: \"\", guardianContact: \"\", guardianRelationship: \"\" },\n });\n }\n\n // ─── TTS ───\n\n private updateTTSButton(): void {\n if (!this.ttsButton || !this.ttsManager) return;\n\n // When the current language has no TTS audio (e.g. Santali in some\n // configs), hide the speaker icon entirely. Without this branch the\n // button would keep whatever display value it had from the previous\n // language and clicking it would replay the previous language's audio.\n if (!this.ttsManager.isAvailable) {\n this.ttsButton.style.display = \"none\";\n return;\n }\n\n this.ttsButton.style.display = \"flex\";\n\n // Swap SVG: speaker icon vs pause icon\n clearElement(this.ttsButton);\n const strokeColor = this.options.settings?.button?.language?.textColor || \"currentColor\";\n\n if (this.ttsManager.isPlaying) {\n // Pause icon\n const pauseSvg = svg(\n \"svg\",\n {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"16\", height: \"16\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: strokeColor, \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n \"aria-hidden\": \"true\",\n },\n svg(\"rect\", { x: \"6\", y: \"4\", width: \"4\", height: \"16\" }),\n svg(\"rect\", { x: \"14\", y: \"4\", width: \"4\", height: \"16\" })\n );\n this.ttsButton.appendChild(pauseSvg);\n this.ttsButton.setAttribute(\"aria-label\", \"Pause audio playback\");\n this.ttsButton.setAttribute(\"title\", \"Pause Talkback\");\n } else {\n // Speaker icon\n const speakerSvg = svg(\n \"svg\",\n {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"16\", height: \"16\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: strokeColor, \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n \"aria-hidden\": \"true\",\n },\n svg(\"polygon\", { points: \"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" }),\n svg(\"path\", { d: \"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\" })\n );\n this.ttsButton.appendChild(speakerSvg);\n this.ttsButton.setAttribute(\"aria-label\", this.ttsManager.isPaused ? \"Resume audio playback\" : \"Start audio playback\");\n this.ttsButton.setAttribute(\"title\", this.ttsManager.isPaused ? \"Resume Talkback\" : \"Start Talkback\");\n }\n }\n\n private updateButtonStates(state: ModalState): void {\n const content = state.content?.detail.active_config;\n\n // All three accept buttons submit through the same path, so a submission\n // in flight busies every one of them.\n const applySubmittingState = (\n btn: HTMLButtonElement | null,\n idleLabel: string\n ) => {\n if (!btn) return;\n btn.textContent = state.isSubmittingAccept\n ? SUBMITTING_BUTTON_TEXT\n : idleLabel;\n btn.disabled = state.isSubmittingAccept;\n btn.style.opacity = state.isSubmittingAccept ? \"0.7\" : \"1\";\n btn.style.cursor = state.isSubmittingAccept ? \"not-allowed\" : \"pointer\";\n };\n\n applySubmittingState(\n this.acceptBtn,\n state.isFullyConsentedReviewMode\n ? this.options.reviewModeButtonText || \"Continue\"\n : this.getTranslatedText(\n \"confirm_button_text\",\n content?.confirm_button_text || DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT\n )\n );\n applySubmittingState(\n this.acceptAllBtn,\n this.getTranslatedText(\n \"accept_all_button_text\",\n content?.accept_all_button_text || DEFAULT_ACCEPT_ALL_BUTTON_TEXT\n )\n );\n\n if (this.declineBtn) {\n this.declineBtn.disabled = state.isSubmitting;\n this.declineBtn.style.opacity = state.isSubmitting ? \"0.7\" : \"1\";\n this.declineBtn.style.cursor = state.isSubmitting ? \"not-allowed\" : \"pointer\";\n }\n\n // Re-apply the required-elements gate, which `applySubmittingState` above\n // deliberately does not know about.\n this.updateAcceptButtonState(state);\n }\n}\n","export const inlineStyles = {\n optionItem: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionLeft: {\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"center\",\n cursor: \"pointer\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionTextContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionTitle: {\n fontWeight: 500,\n fontSize: \"16px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#101828\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n optionDescription: {\n fontWeight: 400,\n fontSize: \"12px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#475467\",\n verticalAlign: \"middle\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n checkboxLarge: {\n height: \"20px\",\n width: \"20px\",\n padding: \"4px\",\n borderRadius: \"5px\",\n border: \"2px solid #d0d5dd\",\n margin: 0,\n boxSizing: \"border-box\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n backgroundColor: \"transparent\",\n },\n\n dataElementsContainer: {\n marginLeft: \"27px\",\n display: \"flex\",\n flexDirection: \"column\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n paddingLeft: \"22px\",\n },\n\n dataElementItem: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n justifyContent: \"space-between\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n minHeight: \"24px\",\n },\n\n dataElementText: {\n fontWeight: 400,\n fontSize: \"14px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#344054\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n checkboxSmall: {\n height: \"16px\",\n width: \"16px\",\n padding: \"4px\",\n borderRadius: \"5px\",\n border: \"2px solid #d0d5dd\",\n margin: 0,\n boxSizing: \"border-box\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n backgroundColor: \"transparent\",\n },\n\n loadingContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2rem\",\n minHeight: \"200px\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n loadingSpinner: {\n width: \"40px\",\n height: \"40px\",\n border: \"4px solid #f3f3f3\",\n borderTop: \"4px solid #3498db\",\n borderRadius: \"50%\",\n animation: \"spin 1s linear infinite\",\n marginBottom: \"1rem\",\n boxSizing: \"border-box\",\n },\n} as const;\n","import { el, svg, applyStyles } from \"../core/dom\";\nimport {\n createRequiredMarker,\n hasRequiredDataElement,\n} from \"../core/required-marker\";\nimport { inlineStyles } from \"../styles/inline\";\nimport type { PurposeItemData, Settings } from \"../api/types\";\n\nexport type PurposeRenderRefs = {\n container: HTMLElement;\n checkboxes: Map<string, HTMLInputElement>; // purposeUuid or \"purposeUuid-elementUuid\"\n collapseButtons: Map<string, HTMLElement>;\n dataElementContainers: Map<string, HTMLElement>;\n chevrons: Map<string, SVGElement>;\n titleElements: Map<string, HTMLElement>;\n descriptionElements: Map<string, HTMLElement>;\n dataElementLabels: Map<string, HTMLElement>;\n};\n\nexport function renderInlinePurposes(\n purposes: PurposeItemData[],\n options: {\n selectedPurposes: Record<string, boolean>;\n collapsedPurposes: Record<string, boolean>;\n selectedDataElements: Record<string, boolean>;\n settings?: Partial<Settings>;\n isMobile: boolean;\n getTranslatedText: (key: string, defaultText: string, itemId?: string) => string;\n onPurposeToggle: (purposeUuid: string) => void;\n onPurposeCollapse: (purposeUuid: string) => void;\n onDataElementToggle: (elementUuid: string, purposeUuid: string) => void;\n }\n): PurposeRenderRefs {\n const {\n selectedPurposes,\n collapsedPurposes,\n selectedDataElements,\n settings,\n isMobile,\n getTranslatedText,\n onPurposeToggle,\n onPurposeCollapse,\n onDataElementToggle,\n } = options;\n\n const checkboxes = new Map<string, HTMLInputElement>();\n const collapseButtons = new Map<string, HTMLElement>();\n const dataElementContainers = new Map<string, HTMLElement>();\n const chevrons = new Map<string, SVGElement>();\n const titleElements = new Map<string, HTMLElement>();\n const descriptionElements = new Map<string, HTMLElement>();\n const dataElementLabels = new Map<string, HTMLElement>();\n\n const headingColor = settings?.headingColor || \"#101828\";\n const textColor = settings?.textColor || \"#344054\";\n\n const container = el(\"div\", {\n style: { display: \"flex\", flexDirection: \"column\", gap: \"16px\" },\n });\n\n for (const purpose of purposes) {\n const purposeWrapper = el(\"div\");\n\n // Chevron SVG\n const chevron = svg(\n \"svg\",\n {\n width: \"7\",\n height: \"12\",\n viewBox: \"0 0 7 12\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: settings?.headingColor || \"#323B4B\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n style: {\n transform: !collapsedPurposes[purpose.uuid] ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.3s ease\",\n },\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", { d: \"M1 1L6 6L1 11\" })\n );\n chevrons.set(purpose.uuid, chevron);\n\n const chevronContainer = el(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginLeft: \"5px\",\n },\n },\n chevron\n );\n\n // Title\n const titleEl = el(\"h2\", {\n style: {\n ...inlineStyles.optionTitle,\n fontSize: isMobile ? \"14px\" : \"16px\",\n color: headingColor,\n },\n });\n // Appended after `textContent`, which replaces every existing child.\n titleEl.textContent = getTranslatedText(\"purposes.name\", purpose.name, purpose.uuid);\n if (hasRequiredDataElement(purpose)) {\n titleEl.appendChild(createRequiredMarker());\n }\n titleElements.set(purpose.uuid, titleEl);\n\n // Description\n const descEl = el(\"h3\", {\n style: {\n ...inlineStyles.optionDescription,\n fontSize: isMobile ? \"11px\" : \"12px\",\n color: textColor,\n },\n });\n descEl.textContent = getTranslatedText(\"purposes.description\", purpose.description, purpose.uuid);\n descriptionElements.set(purpose.uuid, descEl);\n\n const textContainer = el(\"div\", { style: inlineStyles.optionTextContainer }, titleEl, descEl);\n\n // Collapse button\n const collapseBtn = el(\"div\", {\n style: inlineStyles.optionLeft,\n role: \"button\",\n tabIndex: \"0\",\n \"aria-expanded\": String(!collapsedPurposes[purpose.uuid]),\n \"aria-controls\": `purpose-${purpose.uuid}`,\n \"aria-label\": `${collapsedPurposes[purpose.uuid] ? \"Expand\" : \"Collapse\"} ${getTranslatedText(\"purposes.name\", purpose.name, purpose.uuid)} details`,\n onClick: () => onPurposeCollapse(purpose.uuid),\n onKeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onPurposeCollapse(purpose.uuid);\n }\n },\n }, chevronContainer, textContainer);\n collapseButtons.set(purpose.uuid, collapseBtn);\n\n // Purpose checkbox\n const purposeCheckbox = el(\"input\", {\n type: \"checkbox\",\n checked: selectedPurposes[purpose.uuid] || false,\n \"aria-label\": `Select all data elements for ${getTranslatedText(\"purposes.name\", purpose.name, purpose.uuid)}`,\n onChange: () => onPurposeToggle(purpose.uuid),\n }) as HTMLInputElement;\n checkboxes.set(purpose.uuid, purposeCheckbox);\n\n const optionRow = el(\"div\", { style: inlineStyles.optionItem }, collapseBtn, purposeCheckbox);\n\n // Data elements container\n const deContainer = el(\"div\", {\n id: `purpose-${purpose.uuid}`,\n style: inlineStyles.dataElementsContainer,\n });\n\n if (purpose.data_elements && purpose.data_elements.length > 0) {\n for (const dataElement of purpose.data_elements) {\n const combinedId = `${purpose.uuid}-${dataElement.uuid}`;\n\n const labelSpan = el(\"span\", {\n style: {\n ...inlineStyles.dataElementText,\n fontSize: isMobile ? \"12px\" : \"14px\",\n color: textColor,\n },\n });\n labelSpan.textContent = getTranslatedText(\"data_elements.name\", dataElement.name, dataElement.uuid);\n dataElementLabels.set(combinedId, labelSpan);\n\n if (dataElement.required) {\n labelSpan.appendChild(createRequiredMarker());\n }\n\n const deCheckbox = el(\"input\", {\n type: \"checkbox\",\n checked: selectedDataElements[combinedId] || false,\n \"aria-label\": `Select ${getTranslatedText(\"data_elements.name\", dataElement.name, dataElement.uuid)}${dataElement.required ? \" (required)\" : \"\"}`,\n onChange: () => onDataElementToggle(dataElement.uuid, purpose.uuid),\n }) as HTMLInputElement;\n checkboxes.set(combinedId, deCheckbox);\n\n const deRow = el(\"div\", { style: inlineStyles.dataElementItem }, labelSpan, deCheckbox);\n deContainer.appendChild(deRow);\n }\n }\n\n dataElementContainers.set(purpose.uuid, deContainer);\n\n // Show/hide data elements based on collapse state\n if (!collapsedPurposes[purpose.uuid] && purpose.data_elements?.length > 0) {\n deContainer.style.display = \"flex\";\n } else {\n deContainer.style.display = \"none\";\n }\n\n purposeWrapper.appendChild(optionRow);\n purposeWrapper.appendChild(deContainer);\n container.appendChild(purposeWrapper);\n }\n\n return {\n container,\n checkboxes,\n collapseButtons,\n dataElementContainers,\n chevrons,\n titleElements,\n descriptionElements,\n dataElementLabels,\n };\n}\n","import { Store } from \"../core/state\";\nimport { createMediaQuery, type MediaQuerySubscription } from \"../core/media-query\";\nimport { el, applyStyles, clearElement } from \"../core/dom\";\nimport { fetchConsentContentPublic, submitConsentEventPublic } from \"../api\";\nimport { resolveDisplayLanguage } from \"../api/language\";\nimport {\n fetchNoticeConsentStatusForScope,\n isNoticeFullyConsented,\n} from \"../api/notice-consent-status\";\nimport { injectCheckboxStyles } from \"../styles/inject\";\nimport { inlineStyles } from \"../styles/inline\";\nimport { renderInlinePurposes, type PurposeRenderRefs } from \"./purposes\";\nimport type { InlineOptions } from \"../types\";\nimport type { ActiveConfig, TranslationObject } from \"../api/types\";\n\ntype InlineState = {\n content: ActiveConfig | null;\n isLoading: boolean;\n isSubmitting: boolean;\n selectedLanguage: string;\n collapsedPurposes: Record<string, boolean>;\n selectedPurposes: Record<string, boolean>;\n selectedDataElements: Record<string, boolean>;\n hasAlreadyConsented: boolean;\n // Blocks auto-submit while the Go ledger check-consent read is in flight,\n // so an already-consented principal is not re-submitted post-cutover.\n isCheckingConsent: boolean;\n fetchError: Error | null;\n errorMessage: string | null;\n};\n\nexport class InlineController {\n private store: Store<InlineState>;\n private options: InlineOptions;\n private targetEl: HTMLElement | null = null;\n private hostEl: HTMLElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private rootEl: HTMLElement | null = null;\n private mediaQuery: MediaQuerySubscription;\n private purposeRefs: PurposeRenderRefs | null = null;\n private errorEl: HTMLElement | null = null;\n private hasSubmitted = false;\n private hasCheckedLedgerConsent = false;\n private fetchedWithToken = false;\n private fetchGeneration = 0;\n private unsubscribe: (() => void) | null = null;\n private abortController: AbortController | null = null;\n\n constructor(options: InlineOptions) {\n this.options = options;\n this.store = new Store<InlineState>({\n content: null,\n isLoading: true,\n isSubmitting: false,\n selectedLanguage: options.language || \"en\",\n collapsedPurposes: {},\n selectedPurposes: {},\n selectedDataElements: {},\n hasAlreadyConsented: false,\n isCheckingConsent: false,\n fetchError: null,\n errorMessage: null,\n });\n this.mediaQuery = createMediaQuery(\"(max-width: 768px)\");\n }\n\n async init(): Promise<void> {\n this.abortController = new AbortController();\n\n // Resolve target element\n if (typeof this.options.target === \"string\") {\n this.targetEl = document.querySelector(this.options.target);\n if (!this.targetEl) {\n throw new Error(`Target element not found: ${this.options.target}`);\n }\n } else {\n this.targetEl = this.options.target;\n }\n\n // Mount the inline form inside an open shadow root attached to a host\n // <div> within the user's target container. This matches the modal's\n // isolation strategy so host-page CSS cannot bleed into the inline form\n // either.\n this.hostEl = document.createElement(\"div\");\n this.hostEl.setAttribute(\"data-redacto-consent-inline\", \"\");\n // Block-level, but no `all: initial` — we want font / color / line-height\n // to inherit from the user's page so the inline form blends in like the\n // React SDK does.\n this.hostEl.style.display = \"block\";\n this.targetEl.appendChild(this.hostEl);\n this.shadowRoot = this.hostEl.attachShadow({ mode: \"open\" });\n injectCheckboxStyles(this.shadowRoot);\n\n // Subscribe to state changes\n this.unsubscribe = this.store.subscribe((state, prevState) => {\n this.handleStateChange(state, prevState);\n });\n\n // Subscribe to media query changes\n this.mediaQuery.subscribe(() => this.rebuildUI());\n\n // Render loading state\n this.renderLoading();\n\n // Fetch content\n await this.fetchNotice();\n }\n\n destroy(): void {\n // Cancels the in-flight ledger read and marks the controller torn down, so\n // late-resolving work cannot fire host callbacks or submit consent.\n this.abortController?.abort();\n this.unsubscribe?.();\n this.mediaQuery.destroy();\n this.store.destroy();\n // Removing the host div tears down the shadow tree (and the rootEl\n // inside it) in one step.\n if (this.hostEl && this.hostEl.parentNode) {\n this.hostEl.parentNode.removeChild(this.hostEl);\n }\n this.hostEl = null;\n this.shadowRoot = null;\n this.rootEl = null;\n this.purposeRefs = null;\n }\n\n updateToken(accessToken: string): void {\n this.options = { ...this.options, accessToken };\n if (accessToken && !this.fetchedWithToken) {\n void this.fetchNotice();\n return;\n }\n // A late-arriving token is the first chance to run the ledger\n // check-consent read; it gates auto-submit synchronously before trying.\n if (this.shouldCheckLedgerConsent()) {\n void this.checkLedgerConsent();\n return;\n }\n this.tryAutoSubmit();\n }\n\n // ─── Private ───\n\n // destroy() aborts the controller, so an aborted signal is the marker that\n // teardown has happened and async continuations must not touch the host.\n private isDestroyed(): boolean {\n return Boolean(this.abortController?.signal.aborted);\n }\n\n private async fetchNotice(): Promise<void> {\n const generation = ++this.fetchGeneration;\n this.fetchedWithToken = Boolean(this.options.accessToken);\n this.store.setState({ isLoading: true, fetchError: null, hasAlreadyConsented: false });\n try {\n const data = await fetchConsentContentPublic({\n org_uuid: this.options.org_uuid,\n workspace_uuid: this.options.workspace_uuid,\n notice_uuid: this.options.notice_uuid,\n accessToken: this.options.accessToken,\n baseUrl: this.options.baseUrl,\n language: this.options.language,\n specific_uuid: this.options.applicationId,\n });\n\n if (this.isDestroyed() || generation !== this.fetchGeneration) {\n return;\n }\n\n const activeConfig = data.detail.active_config;\n const initialCollapsed: Record<string, boolean> = {};\n const initialPurposes: Record<string, boolean> = {};\n const initialElements: Record<string, boolean> = {};\n\n for (const purpose of activeConfig.purposes) {\n initialCollapsed[purpose.uuid] = true;\n initialPurposes[purpose.uuid] = false;\n for (const de of purpose.data_elements) {\n initialElements[`${purpose.uuid}-${de.uuid}`] = false;\n }\n }\n\n // Post-cutover, consent records live in the Go ledger, so Python's\n // get-notice no longer 409s for an already-consented principal. Kick off\n // the ledger check BEFORE the content state lands: its synchronous\n // prologue raises isCheckingConsent, so the content state change below\n // cannot auto-submit until the read settles.\n void this.checkLedgerConsent();\n\n this.store.setState({\n content: activeConfig,\n isLoading: false,\n selectedLanguage: resolveDisplayLanguage(\n this.options.language,\n activeConfig.default_language,\n activeConfig.supported_languages_and_translations\n ),\n collapsedPurposes: initialCollapsed,\n selectedPurposes: initialPurposes,\n selectedDataElements: initialElements,\n });\n } catch (err: unknown) {\n if (this.isDestroyed() || generation !== this.fetchGeneration) {\n return;\n }\n const error = err as Error & { status?: number };\n if (error.status === 409) {\n this.store.setState({ hasAlreadyConsented: true, isLoading: false });\n this.options.onAccept?.();\n } else {\n this.store.setState({ fetchError: error, isLoading: false });\n this.options.onError?.(error);\n }\n }\n }\n\n private shouldCheckLedgerConsent(): boolean {\n return (\n Boolean(this.options.ledgerBaseUrl) &&\n !this.options.applicationId &&\n Boolean(this.options.accessToken) &&\n !this.hasCheckedLedgerConsent\n );\n }\n\n // Ask the Go ledger whether this principal has already fully consented —\n // the ledger equivalent of the legacy Python 409. Skipped without a ledger\n // (the 409 path governs) and for the magic-link applicationId flow. Any\n // failure returns null and falls through to the normal flow.\n private async checkLedgerConsent(): Promise<void> {\n if (!this.shouldCheckLedgerConsent()) return;\n this.hasCheckedLedgerConsent = true;\n this.store.setState({ isCheckingConsent: true });\n try {\n const status = await fetchNoticeConsentStatusForScope({\n accessToken: this.options.accessToken!,\n ledgerBaseUrl: this.options.ledgerBaseUrl,\n organisationUuid: this.options.org_uuid,\n workspaceUuid: this.options.workspace_uuid,\n noticeUuid: this.options.notice_uuid,\n signal: this.abortController?.signal,\n });\n if (this.isDestroyed()) {\n return;\n }\n if (status && isNoticeFullyConsented(status)) {\n this.store.setState({ hasAlreadyConsented: true });\n this.options.onAccept?.();\n }\n } finally {\n if (!this.isDestroyed()) {\n this.store.setState({ isCheckingConsent: false });\n // Re-run auto-submit now that the gate is down (no-op when already\n // consented or requirements are unmet).\n this.tryAutoSubmit();\n }\n }\n }\n\n private handleStateChange(state: InlineState, prevState: InlineState): void {\n // Loading → content loaded\n if (prevState.isLoading && !state.isLoading && state.content) {\n this.rebuildUI();\n }\n\n // Already consented or fetch error → hide\n if (state.hasAlreadyConsented || state.fetchError) {\n if (this.rootEl && this.shadowRoot && this.rootEl.parentNode === this.shadowRoot) {\n this.shadowRoot.removeChild(this.rootEl);\n this.rootEl = null;\n }\n return;\n }\n\n // Checkbox state changes → update checkboxes\n if (state.selectedPurposes !== prevState.selectedPurposes ||\n state.selectedDataElements !== prevState.selectedDataElements) {\n this.updateCheckboxes(state);\n this.notifyValidation(state);\n this.tryAutoSubmit();\n }\n\n // Collapse state changes\n if (state.collapsedPurposes !== prevState.collapsedPurposes) {\n this.updateCollapseState(state);\n }\n\n // Error message changes\n if (state.errorMessage !== prevState.errorMessage) {\n this.updateErrorMessage(state);\n }\n }\n\n private renderLoading(): void {\n if (!this.shadowRoot) return;\n\n const textColor = this.options.settings?.textColor || \"#344054\";\n\n this.rootEl = el(\n \"div\",\n { style: inlineStyles.loadingContainer },\n el(\"div\", { style: inlineStyles.loadingSpinner }),\n el(\"p\", { style: { fontSize: \"16px\", fontWeight: 400, color: textColor } }, \"Loading...\")\n );\n\n this.shadowRoot.appendChild(this.rootEl);\n }\n\n private rebuildUI(): void {\n const state = this.store.getState();\n if (!state.content || !this.shadowRoot) return;\n\n // Remove existing root\n if (this.rootEl && this.rootEl.parentNode === this.shadowRoot) {\n this.shadowRoot.removeChild(this.rootEl);\n }\n\n // Build error message element\n this.errorEl = el(\"div\", {\n role: \"alert\",\n style: {\n backgroundColor: \"#FEE2E2\",\n color: \"#DC2626\",\n padding: \"12px\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n border: \"1px solid #FCA5A5\",\n display: state.errorMessage ? \"block\" : \"none\",\n },\n });\n if (state.errorMessage) {\n this.errorEl.textContent = state.errorMessage;\n }\n\n // Build purposes\n this.purposeRefs = renderInlinePurposes(state.content.purposes, {\n selectedPurposes: state.selectedPurposes,\n collapsedPurposes: state.collapsedPurposes,\n selectedDataElements: state.selectedDataElements,\n settings: this.options.settings,\n isMobile: this.mediaQuery.matches,\n getTranslatedText: (key, defaultText, itemId) =>\n this.getTranslatedText(key, defaultText, itemId),\n onPurposeToggle: (uuid) => this.handlePurposeCheckboxChange(uuid),\n onPurposeCollapse: (uuid) => this.togglePurposeCollapse(uuid),\n onDataElementToggle: (elementUuid, purposeUuid) =>\n this.handleDataElementCheckboxChange(elementUuid, purposeUuid),\n });\n\n this.rootEl = el(\n \"div\",\n { style: { display: \"flex\", flexDirection: \"column\", gap: \"16px\" } },\n this.errorEl,\n this.purposeRefs.container\n );\n\n this.shadowRoot.appendChild(this.rootEl);\n this.notifyValidation(state);\n }\n\n private getTranslatedText(key: string, defaultText: string, itemId?: string): string {\n const state = this.store.getState();\n const content = state.content;\n if (!content) return defaultText;\n\n const lang = state.selectedLanguage;\n if (lang === \"English\" || lang === \"en\" || lang === \"EN\") {\n if (key === \"privacy_policy_anchor_text\" && content.privacy_policy_anchor_text) {\n return content.privacy_policy_anchor_text;\n }\n return defaultText;\n }\n\n const translations = content.supported_languages_and_translations;\n if (!translations) return defaultText;\n\n const translationMap = translations[lang] as TranslationObject | undefined;\n if (!translationMap) return defaultText;\n\n if (itemId) {\n if (key === \"purposes.name\" || key === \"purposes.description\") {\n const purposeData = translationMap.purposes?.[itemId];\n if (purposeData) {\n if (typeof purposeData === \"string\") {\n return key === \"purposes.name\" ? purposeData : defaultText;\n }\n return key === \"purposes.name\"\n ? purposeData.name || defaultText\n : purposeData.description || defaultText;\n }\n return defaultText;\n }\n if (key.startsWith(\"data_elements.\")) {\n return translationMap.data_elements?.[itemId] || defaultText;\n }\n }\n\n const value = (translationMap as any)[key];\n if (typeof value === \"string\" && value) return value;\n return defaultText;\n }\n\n private togglePurposeCollapse(purposeUuid: string): void {\n const state = this.store.getState();\n this.store.setState({\n collapsedPurposes: {\n ...state.collapsedPurposes,\n [purposeUuid]: !state.collapsedPurposes[purposeUuid],\n },\n });\n }\n\n private handlePurposeCheckboxChange(purposeUuid: string): void {\n const state = this.store.getState();\n const content = state.content;\n if (!content) return;\n\n const purpose = content.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose) return;\n\n const newPurposeState = !state.selectedPurposes[purposeUuid];\n\n const updatedElements = { ...state.selectedDataElements };\n for (const de of purpose.data_elements) {\n updatedElements[`${purposeUuid}-${de.uuid}`] = newPurposeState;\n }\n\n this.store.setState({\n selectedPurposes: { ...state.selectedPurposes, [purposeUuid]: newPurposeState },\n selectedDataElements: updatedElements,\n });\n }\n\n private handleDataElementCheckboxChange(elementUuid: string, purposeUuid: string): void {\n const state = this.store.getState();\n const content = state.content;\n if (!content) return;\n\n const purpose = content.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose) return;\n\n const combinedId = `${purposeUuid}-${elementUuid}`;\n const newElementState = !state.selectedDataElements[combinedId];\n\n const newDataElements = {\n ...state.selectedDataElements,\n [combinedId]: newElementState,\n };\n\n const requiredElements = purpose.data_elements.filter((el) => el.required);\n let shouldCheckPurpose: boolean;\n\n if (requiredElements.length > 0) {\n shouldCheckPurpose = requiredElements.every(\n (el) => newDataElements[`${purposeUuid}-${el.uuid}`]\n );\n } else {\n shouldCheckPurpose = purpose.data_elements.some(\n (el) => newDataElements[`${purposeUuid}-${el.uuid}`]\n );\n }\n\n this.store.setState({\n selectedDataElements: newDataElements,\n selectedPurposes: { ...state.selectedPurposes, [purposeUuid]: shouldCheckPurpose },\n });\n }\n\n private updateCheckboxes(state: InlineState): void {\n if (!this.purposeRefs) return;\n\n for (const [key, checkbox] of this.purposeRefs.checkboxes) {\n if (key in state.selectedPurposes) {\n checkbox.checked = state.selectedPurposes[key] || false;\n } else {\n checkbox.checked = state.selectedDataElements[key] || false;\n }\n }\n }\n\n private updateCollapseState(state: InlineState): void {\n if (!this.purposeRefs) return;\n\n for (const [purposeUuid, container] of this.purposeRefs.dataElementContainers) {\n const content = this.store.getState().content;\n const purpose = content?.purposes.find((p) => p.uuid === purposeUuid);\n const isCollapsed = state.collapsedPurposes[purposeUuid];\n\n container.style.display = !isCollapsed && purpose?.data_elements?.length ? \"flex\" : \"none\";\n\n const chevron = this.purposeRefs.chevrons.get(purposeUuid);\n if (chevron) {\n (chevron as unknown as HTMLElement).style.transform = !isCollapsed\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\";\n }\n\n const collapseBtn = this.purposeRefs.collapseButtons.get(purposeUuid);\n if (collapseBtn) {\n collapseBtn.setAttribute(\"aria-expanded\", String(!isCollapsed));\n }\n }\n }\n\n private updateErrorMessage(state: InlineState): void {\n if (!this.errorEl) return;\n if (state.errorMessage) {\n this.errorEl.textContent = state.errorMessage;\n this.errorEl.style.display = \"block\";\n } else {\n this.errorEl.style.display = \"none\";\n }\n }\n\n private areAllRequiredElementsChecked(): boolean {\n const state = this.store.getState();\n const content = state.content;\n if (!content) return false;\n\n return content.purposes.every((purpose) => {\n const requiredElements = purpose.data_elements.filter((el) => el.required);\n return requiredElements.every(\n (el) => state.selectedDataElements[`${purpose.uuid}-${el.uuid}`]\n );\n });\n }\n\n private notifyValidation(state: InlineState): void {\n const isValid = this.areAllRequiredElementsChecked();\n this.options.onValidationChange?.(isValid);\n }\n\n private async tryAutoSubmit(): Promise<void> {\n // A submit is a network write — never start one after teardown.\n if (this.isDestroyed()) {\n return;\n }\n\n const state = this.store.getState();\n const accessToken = this.options.accessToken;\n\n if (\n accessToken &&\n state.content &&\n this.areAllRequiredElementsChecked() &&\n !state.isSubmitting &&\n !state.isCheckingConsent &&\n !state.hasAlreadyConsented &&\n !this.hasSubmitted\n ) {\n this.hasSubmitted = true;\n try {\n await this.handleSubmit(accessToken);\n } catch (err) {\n this.hasSubmitted = false;\n this.options.onError?.(err as Error);\n }\n }\n }\n\n private async handleSubmit(tokenToUse: string): Promise<void> {\n const state = this.store.getState();\n const content = state.content;\n if (!tokenToUse || !content) {\n this.store.setState({ errorMessage: \"Unable to submit consent. Please try again.\" });\n throw new Error(\"Access token or content not available\");\n }\n\n try {\n this.store.setState({ isSubmitting: true, errorMessage: null });\n\n await submitConsentEventPublic({\n org_uuid: this.options.org_uuid,\n workspace_uuid: this.options.workspace_uuid,\n accessToken: tokenToUse,\n baseUrl: this.options.baseUrl,\n ledgerBaseUrl: this.options.ledgerBaseUrl,\n noticeUuid: content.notice_uuid,\n purposes: content.purposes.map((purpose) => {\n const hasSelectedRequired = purpose.data_elements.some(\n (el) =>\n el.required && (state.selectedDataElements[`${purpose.uuid}-${el.uuid}`] || false)\n );\n const hasSelectedAny = purpose.data_elements.some(\n (el) => state.selectedDataElements[`${purpose.uuid}-${el.uuid}`] || false\n );\n const purposeSelected =\n state.selectedPurposes[purpose.uuid] || hasSelectedRequired || hasSelectedAny;\n\n return {\n ...purpose,\n selected: purposeSelected,\n data_elements: purpose.data_elements.map((element) => ({\n ...element,\n selected: state.selectedDataElements[`${purpose.uuid}-${element.uuid}`] || false,\n })),\n };\n }),\n declined: false,\n meta_data: this.options.applicationId\n ? { specific_uuid: this.options.applicationId }\n : undefined,\n language: state.selectedLanguage,\n });\n\n this.options.onAccept?.();\n this.hasSubmitted = false;\n } catch (error) {\n const err = error as Error & { status?: number };\n const message =\n err.status === 500\n ? \"An error occurred while submitting your consent. Please try again later.\"\n : err.message || \"Failed to submit consent. Please try again.\";\n this.store.setState({ errorMessage: message });\n this.hasSubmitted = false;\n throw error;\n } finally {\n this.store.setState({ isSubmitting: false });\n }\n }\n}\n","import { el } from \"../core/dom\";\nimport { injectCheckboxStyles } from \"../styles/inject\";\nimport { verifyGuardianStatus } from \"../api\";\nimport {\n getConsentState,\n updateConsentState,\n} from \"../services/storage\";\nimport type { DigiLockerCallbackOptions } from \"../types\";\nimport type { GuardianVerificationErrorCode } from \"../api/types\";\n\nfunction getErrorMessage(errorCode?: GuardianVerificationErrorCode | string | null): string {\n switch (errorCode) {\n case \"GUARDIAN_UNDER_18\":\n return \"Guardian verification failed: The guardian must be 18 years or older.\";\n case \"SESSION_EXPIRED\":\n return \"Verification session has expired. Please restart the verification process.\";\n case \"TOKEN_FAILED\":\n return \"DigiLocker authentication failed. Please try again.\";\n case \"DIGILOCKER_AUTH_FAILED\":\n return \"DigiLocker authorization was cancelled or failed. Please try again.\";\n case \"NO_AUTH_CODE\":\n return \"Missing authorization code from DigiLocker. Please try again.\";\n default:\n return \"Verification failed. Please try again.\";\n }\n}\n\nexport function handleDigilockerCallback(options: DigiLockerCallbackOptions): void {\n // The DigiLocker callback page is a standalone screen, not embedded in a\n // host site, so styles can safely live in document.head here.\n injectCheckboxStyles(document);\n\n const params = new URLSearchParams(window.location.search);\n const sessionToken = params.get(\"session_token\");\n const urlStatus = params.get(\"status\") as \"verified\" | \"failed\" | \"expired\" | null;\n const verificationReference = params.get(\"verification_reference\");\n const errorCode = params.get(\"error_code\") as GuardianVerificationErrorCode | null;\n\n const persistedState = getConsentState();\n const originalUrl = persistedState?.originalUrl || \"/\";\n const storedBaseUrl = persistedState?.baseUrl;\n const storedSessionToken = persistedState?.sessionToken;\n const activeSessionToken = sessionToken || storedSessionToken;\n const apiBaseUrl = options.baseUrl || storedBaseUrl;\n\n // Check if in iframe\n let isInIframe = false;\n try {\n isInIframe = window.self !== window.top;\n } catch {\n isInIframe = true;\n }\n\n // Render status UI\n const container = el(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"200px\",\n padding: \"32px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n });\n\n const statusEl = el(\"p\", {\n style: { fontSize: \"16px\", fontWeight: 600, color: \"#101828\", textAlign: \"center\" },\n });\n statusEl.textContent = \"Processing verification...\";\n\n const spinnerEl = el(\"div\", {\n style: {\n width: \"40px\",\n height: \"40px\",\n border: \"4px solid #f3f3f3\",\n borderTop: \"4px solid #3498db\",\n borderRadius: \"50%\",\n animation: \"spin 1s linear infinite\",\n marginBottom: \"16px\",\n },\n });\n\n container.appendChild(spinnerEl);\n container.appendChild(statusEl);\n document.body.appendChild(container);\n\n const redirectToOriginal = (\n result: \"verified\" | \"failed\" | \"expired\",\n ref?: string\n ) => {\n updateConsentState({\n verificationResult: result,\n verificationReference: ref,\n flowState: result === \"verified\" ? \"consent-form\" : \"error\",\n });\n\n statusEl.textContent = result === \"verified\"\n ? \"Verification successful! Redirecting...\"\n : \"Verification failed. Redirecting...\";\n\n spinnerEl.style.display = \"none\";\n\n setTimeout(() => {\n window.location.href = originalUrl;\n }, 1500);\n };\n\n // Handle direct status from URL\n if (urlStatus === \"verified\" && verificationReference) {\n if (isInIframe && window.parent) {\n window.parent.postMessage({\n type: \"DIGILOCKER_VERIFICATION_STATUS\",\n status: \"verified\",\n verificationReference,\n }, window.location.origin);\n statusEl.textContent = \"Verification successful!\";\n spinnerEl.style.display = \"none\";\n return;\n }\n options.onSuccess?.(verificationReference);\n redirectToOriginal(\"verified\", verificationReference);\n return;\n }\n\n if (urlStatus === \"failed\" || urlStatus === \"expired\") {\n const errorMsg = getErrorMessage(errorCode);\n if (isInIframe && window.parent) {\n window.parent.postMessage({\n type: \"DIGILOCKER_VERIFICATION_STATUS\",\n status: urlStatus,\n errorCode,\n error: errorMsg,\n }, window.location.origin);\n statusEl.textContent = errorMsg;\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n return;\n }\n options.onError?.(new Error(errorMsg), errorCode || undefined);\n redirectToOriginal(urlStatus);\n return;\n }\n\n // No status in URL — poll the backend\n if (!activeSessionToken) {\n statusEl.textContent = \"No verification session found.\";\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n options.onError?.(new Error(\"No session token available\"));\n return;\n }\n\n let retryCount = 0;\n const MAX_RETRIES = 3;\n\n const pollStatus = async () => {\n try {\n const response = await verifyGuardianStatus({\n accessToken: options.accessToken,\n baseUrl: apiBaseUrl,\n sessionToken: activeSessionToken,\n });\n\n if (response.status === \"verified\") {\n const ref = response.verification_reference ||\n response.guardian_details?.verification_reference;\n\n if (isInIframe && window.parent) {\n window.parent.postMessage({\n type: \"DIGILOCKER_VERIFICATION_STATUS\",\n status: \"verified\",\n verificationReference: ref,\n }, window.location.origin);\n statusEl.textContent = \"Verification successful!\";\n spinnerEl.style.display = \"none\";\n return;\n }\n\n if (ref) options.onSuccess?.(ref);\n redirectToOriginal(\"verified\", ref || undefined);\n return;\n }\n\n if (response.status === \"failed\" || response.status === \"expired\") {\n const errorMsg = getVerificationError(response.error_code, response.error);\n\n if (isInIframe && window.parent) {\n window.parent.postMessage({\n type: \"DIGILOCKER_VERIFICATION_STATUS\",\n status: response.status,\n errorCode: response.error_code,\n error: errorMsg,\n }, window.location.origin);\n statusEl.textContent = errorMsg;\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n return;\n }\n\n options.onError?.(new Error(errorMsg), response.error_code || undefined);\n redirectToOriginal(response.status);\n return;\n }\n\n // Still in progress — retry with backoff\n retryCount++;\n if (retryCount > MAX_RETRIES) {\n const timeoutMsg = \"Verification is taking too long. Please return to the original page.\";\n statusEl.textContent = timeoutMsg;\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n options.onError?.(new Error(timeoutMsg));\n redirectToOriginal(\"failed\");\n return;\n }\n\n const delay = 3000 * Math.pow(2, retryCount - 1);\n statusEl.textContent = \"Still processing... Please wait.\";\n setTimeout(pollStatus, delay);\n } catch (error) {\n retryCount++;\n if (retryCount > MAX_RETRIES) {\n const errMsg = (error as Error).message || \"Failed to check verification status.\";\n statusEl.textContent = errMsg;\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n options.onError?.(error as Error);\n redirectToOriginal(\"failed\");\n return;\n }\n\n const delay = 3000 * Math.pow(2, retryCount - 1);\n setTimeout(pollStatus, delay);\n }\n };\n\n // Start first poll after 3s\n setTimeout(pollStatus, 3000);\n}\n\nfunction getVerificationError(errorCode: string | null, fallbackError: string | null): string {\n return getErrorMessage(errorCode) || fallbackError || \"Verification failed. Please try again.\";\n}\n"],"mappings":"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","names":["src_exports","__export","src_default","destroy","digilockerCallback","init","inline","Store","initialState","partial","prevState","listener","el","tag","attrs","children","element","applyAttrs","appendChildren","svg","key","value","applyStyles","event","UNITLESS_PROPS","styles","stringValue","parent","child","clearElement","createMediaQuery","query","mql","currentMatches","listeners","handler","e","cb","apiCache","CACHE_TTL","getCachedData","key","cached","setCachedData","data","ttl","clearApiCache","InvalidTokenError","b64DecodeUnicode","str","m","p","code","base64UrlDecode","output","jwtDecode","token","options","pos","part","decoded","e","decodeTokenSafely","token","jwtDecode","error","SANDBOX_TOKEN_HEADER","resolveSandboxAuth","options","_a","_b","_c","_d","_e","_f","token","organisationUuid","workspaceUuid","ucic","email","mobile","resolveRequestAuth","accessToken","sandbox","decodedToken","decodeTokenSafely","organisation_uuid","workspace_uuid","buildAuthHeaders","sandboxBodyIdentity","payload","sandboxQueryIdentity","CODE_BY_NAME","CODE_BY_LOWER","c","toLanguageCode","lang","_a","_b","trimmed","lower","CODE_BY_LOWER","CODE_BY_NAME","resolveDisplayLanguage","requested","defaultLanguage","translations","fallback","requestedCode","key","BASE_URL","BASE_URL_PUBLIC","fetchConsentContent","noticeId","accessToken","baseUrl","language","specific_uuid","validate_against","include_fully_consented_data","signal","sandboxParams","ORG","WS","sandbox","resolveRequestAuth","apiBaseUrl","cacheKey","cached","getCachedData","url","key","value","sandboxQueryIdentity","response","buildAuthHeaders","errorMessage","error","data","setCachedData","fetchConsentContentPublic","org_uuid","workspace_uuid","notice_uuid","noticesUrl","submitConsentEvent","ledgerBaseUrl","noticeUuid","purposes","declined","meta_data","guardianVerificationReference","selfDeclaredAdult","validatedPurposes","purpose","dataElements","element","payload","toLanguageCode","requestBody","sandboxBodyIdentity","clearApiCache","submitConsentEventPublic","_a","_b","errorData","fetchTTSAudioUrls","initiateGuardianVerification","guardianName","guardianContact","guardianRelationship","frontendCallbackUrl","metadata","decodedToken","decodeTokenSafely","responseData","detail","verifyGuardianStatus","sessionToken","_c","_d","_e","_f","_g","_h","fetchNoticeConsentStatusForScope","accessToken","ledgerBaseUrl","organisationUuid","workspaceUuid","noticeUuid","signal","response","data","body","fetchNoticeConsentStatus","decodedToken","decodeTokenSafely","ORG","WS","isNoticeFullyConsented","status","buildLedgerConsentOverlay","configPurposes","_a","_b","byUuid","p","purpose_selections","cp","lp","purposeStatus","selectedByUuid","de","data_elements","STYLE_ID","STYLE_CONTENT","injectCheckboxStyles","root","style","styles","DEFAULT_LOGO_POSITION","DEFAULT_ACCEPT_ALL_BUTTON_TEXT","DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT","DEFAULT_DECLINE_BUTTON_TEXT","ACCEPT_ALL_BUTTON_ID","ACCEPT_SELECTED_BUTTON_ID","DECLINE_BUTTON_ID","SUBMITTING_BUTTON_TEXT","LOGO_POSITION_JUSTIFY","REQUIRED_MARKER_GLYPH","REQUIRED_MARKER_ARIA_LABEL","REQUIRED_MARKER_COLOR","REQUIRED_MARKER_GAP","REQUIRED_MARKER_STYLE","DPO_AUDIO_ELEMENT_MAP","createRequiredMarker","label","REQUIRED_MARKER_ARIA_LABEL","el","REQUIRED_MARKER_STYLE","REQUIRED_MARKER_GLYPH","hasRequiredDataElement","purpose","element","renderModalPurposes","purposes","options","_a","_b","selectedPurposes","collapsedPurposes","selectedDataElements","initialDataElementSelections","settings","isMobile","isAlreadyConsented","getTranslatedText","onPurposeToggle","onPurposeCollapse","onDataElementToggle","checkboxes","collapseButtons","dataElementContainers","chevrons","titleElements","descriptionElements","dataElementLabels","headingColor","textColor","font","container","el","styles","purpose","purposeWrapper","chevron","svg","chevronContainer","titleEl","hasRequiredDataElement","createRequiredMarker","descEl","textContainer","collapseBtn","e","rightElement","createGreenCheckmark","applyStyles","purposeCheckbox","optionRow","deContainer","dataElement","combinedId","labelSpan","deRightElement","deCheckbox","deRow","size","ariaLabel","svgSize","strokeWidth","pathD","checkSvg","LANGUAGE_NATIVE_LABELS","toNativeLabel","name","_a","renderLanguageSelector","options","_b","_c","_d","languages","selectedLanguage","settings","onSelect","dropdownContainer","isOpen","buttonText","el","chevronSvg","svg","buttonStyle","styles","button","toggleDropdown","e","closeDropdown","dropdown","lang","isSelected","itemStyle","item","container","positionDropdown","rect","clickOutsideHandler","path","target","repositionHandler","openDropdown","setupKeyboardTrap","modalEl","onEscape","handler","e","_a","focusableElements","focusable","el","first","last","active","firstFocusable","STORAGE_KEY","isBrowser","saveConsentState","state","stateWithTimestamp","STORAGE_KEY","error","getConsentState","savedState","parsed","clearConsentState","updateConsentState","updates","currentState","TTSManager","onStateChange","root","params","_a","response","fetchTTSAudioUrls","error","content","_b","urls","audioSeq","elementSeq","push","url","elementId","purpose","purposeAudio","de","deAudio","mapping","DPO_AUDIO_ELEMENT_MAP","audioUrl","ACCEPT_ALL_BUTTON_ID","ACCEPT_SELECTED_BUTTON_ID","DECLINE_BUTTON_ID","startIndex","index","audio","element","rect","el","renderAgeVerification","options","settings","colors","isMobile","logoUrl","onYes","onNo","onClose","headingColor","textColor","font","logo","el","styles","title","topLeft","closeBtn","closeSvg","svg","topSection","description","question","middleSection","btnBase","yesBtn","noBtn","bottomSection","RELATIONSHIP_OPTIONS","renderGuardianForm","options","_a","formData","settings","colors","isMobile","logoUrl","isSubmitting","onSubmit","onCancel","onFieldChange","headingColor","textColor","borderColor","bgColor","radius","font","accentColor","inputStyle","errorStyle","labelStyle","hintStyle","logo","el","styles","title","topLeft","topSection","subtitle","infoIcon","svg","infoText","infoBanner","nameLabel","nameInput","e","nameHint","nameError","nameGroup","contactLabel","contactInput","contactHint","contactError","contactGroup","relLabel","selectedLabel","o","chevronSvg","selectedSpan","relationshipDisplay","dropdownList","i","option","isSelected","optionEl","doClose","label","checkSvg","dropdownOpen","relContainer","handleClickOutside","doOpen","rect","spaceBelow","dropdownHeight","relationshipError","generalError","fieldsContainer","middleSection","btnBase","submitBtn","cancelBtn","bottomSection","validateGuardianForm","data","errors","getVerificationErrorMessage","errorCode","fallbackError","renderVerificationScreen","options","settings","colors","isMobile","logoUrl","isInitiating","isPolling","isComplete","isAutoTransitioning","error","canRetry","onContinue","onBack","headingColor","textColor","font","accentColor","logo","el","styles","title","topLeft","topSection","middleSection","successCircle","checkSvg","svg","successText","wrapper","spinner","statusMsg","errorCircle","xSvg","failedText","errorBox","btnBase","bottomSection","acceptBtnStyle","declineBtnStyle","continueBtn","retryBtn","goBackBtn","cancelBtn","resolveColors","settings","activeConfig","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","primaryColor","secondaryColor","dataElementKey","purposeUuid","elementUuid","buildSelectionForMode","purposes","mode","current","selectedPurposes","selectedDataElements","purpose","element","resolveLogoPosition","raw","DEFAULT_LOGO_POSITION","logoRowJustify","position","LOGO_POSITION_JUSTIFY","ModalController","options","Store","createMediaQuery","state","prevState","_a","_b","_c","_d","legacySubject","legacyEmail","legacyMobile","noticeBaseUrl","data","fetchConsentContent","activeConfig","purposeSelections","reconsentRequired","ledgerOverlayApplied","ledgerStatus","fetchNoticeConsentStatus","overlay","buildLedgerConsentOverlay","initialCollapsed","initialPurposes","initialElements","initialDataElementSelections","needsConsentPurposes","alreadyConsentedPurposes","isFullyConsentedReviewMode","purpose","selection","de","combinedId","deSelection","wasSelected","selectedLanguage","resolveDisplayLanguage","isMinorFlow","showAgeVerification","restoreState","pollingTokenToResume","persistedState","getConsentState","clearConsentState","err","error","injectCheckboxStyles","TTSManager","el","styles","settingsObj","modalStyle","loadingEl","contentEl","_e","_f","_g","_h","isMobile","colors","resolveColors","clearElement","ageRefs","renderAgeVerification","setupKeyboardTrap","renderGuardianForm","field","value","s","verRefs","renderVerificationScreen","clearName","headingColor","textColor","linkColor","font","logoImg","supportedLangs","allLanguages","l","renderLanguageSelector","lang","ttsStrokeColor","speakerSvg","svg","topRight","logoPosition","resolveLogoPosition","headerRows","logoRowJustify","topSection","baseTextStyle","noticeTextSpan","policyPrefixText","policyAnchorText","policySpan","noticeAndPolicyP","renderModalPurposes","key","defaultText","itemId","uuid","euuid","puuid","footerDiv","footerP","addlSpan","pcAnchorText","dpo","gText","gLink","connectorSpan","emailLink","dpText","dpLink","dpoTextSpan","dpoLink","acceptBtnText","DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT","gridButtonBox","acceptStyle","ACCEPT_SELECTED_BUTTON_ID","shortcutStyle","ACCEPT_ALL_BUTTON_ID","DEFAULT_ACCEPT_ALL_BUTTON_TEXT","declineBtnText","DEFAULT_DECLINE_BUTTON_TEXT","declineStyle","DECLINE_BUTTON_ID","bottomSection","contentWrapper","displayLanguage","content","translations","translationMap","message","errorContent","purposeData","purposeUuid","p","newPurposeState","updatedElements","elementUuid","newDataElements","requiredElements","shouldCheckPurpose","mode","buildSelectionForMode","purposes","dataElements","submitConsentEvent","checkbox","submitting","allRequiredChecked","setDisabled","btn","disabled","updateRefs","refs","container","isCollapsed","chevron","collapseBtn","errors","validateGuardianForm","digilockerMode","callbackUrl","response","initiateGuardianVerification","saveConsentState","popup","openedWindow","token","attempts","consecutiveErrors","paused","MAX_ATTEMPTS","MAX_CONSECUTIVE_ERRORS","POLL_INTERVAL","poll","verifyGuardianStatus","ref","getVerificationErrorMessage","strokeColor","pauseSvg","applySubmittingState","idleLabel","SUBMITTING_BUTTON_TEXT","inlineStyles","renderInlinePurposes","purposes","options","_a","selectedPurposes","collapsedPurposes","selectedDataElements","settings","isMobile","getTranslatedText","onPurposeToggle","onPurposeCollapse","onDataElementToggle","checkboxes","collapseButtons","dataElementContainers","chevrons","titleElements","descriptionElements","dataElementLabels","headingColor","textColor","container","el","purpose","purposeWrapper","chevron","svg","chevronContainer","titleEl","inlineStyles","hasRequiredDataElement","createRequiredMarker","descEl","textContainer","collapseBtn","e","purposeCheckbox","optionRow","deContainer","dataElement","combinedId","labelSpan","deCheckbox","deRow","InlineController","options","Store","createMediaQuery","injectCheckboxStyles","state","prevState","_a","_b","accessToken","_c","_d","generation","data","fetchConsentContentPublic","activeConfig","initialCollapsed","initialPurposes","initialElements","purpose","de","resolveDisplayLanguage","err","error","status","fetchNoticeConsentStatusForScope","isNoticeFullyConsented","textColor","el","inlineStyles","renderInlinePurposes","key","defaultText","itemId","uuid","elementUuid","purposeUuid","content","lang","translations","translationMap","purposeData","value","p","newPurposeState","updatedElements","combinedId","newElementState","newDataElements","requiredElements","shouldCheckPurpose","checkbox","container","isCollapsed","chevron","collapseBtn","isValid","tokenToUse","submitConsentEventPublic","hasSelectedRequired","hasSelectedAny","purposeSelected","element","message","getErrorMessage","errorCode","handleDigilockerCallback","options","_a","_b","_c","injectCheckboxStyles","params","sessionToken","urlStatus","verificationReference","persistedState","getConsentState","originalUrl","storedBaseUrl","storedSessionToken","activeSessionToken","apiBaseUrl","isInIframe","container","el","statusEl","spinnerEl","redirectToOriginal","result","ref","updateConsentState","errorMsg","retryCount","MAX_RETRIES","pollStatus","_d","_e","response","verifyGuardianStatus","getVerificationError","timeoutMsg","delay","error","errMsg","fallbackError","activeModal","activeInline","init","options","destroy","ModalController","err","_a","inline","InlineController","digilockerCallback","handleDigilockerCallback","RedactoConsent","src_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/state.ts","../src/core/dom.ts","../src/core/media-query.ts","../src/services/cache.ts","../../../node_modules/.pnpm/jwt-decode@4.0.0/node_modules/jwt-decode/build/esm/index.js","../src/core/jwt-decode.ts","../src/api/sandbox.ts","../src/api/constants.ts","../src/api/language.ts","../src/api/submit-payload.ts","../src/shared/api-errors.ts","../src/shared/idempotency.ts","../src/modal/chromeCopy.data.ts","../src/constants.ts","../src/api/index.ts","../src/api/notice-consent-status.ts","../src/shared/endpoints.ts","../src/shared/appearance/constants.ts","../src/shared/appearance/ttsCssVariables.ts","../src/shared/appearance/customCss.ts","../src/shared/appearance/registry.ts","../src/shared/appearance/layout.ts","../src/shared/appearance/resolve.ts","../src/shared/appearance/color.ts","../src/shared/appearance/glass.ts","../src/shared/appearance/motion.ts","../src/shared/appearance/scopedCss.ts","../src/styles/inject.ts","../src/styles/modal.ts","../src/core/required-marker.ts","../src/core/productMatrix.ts","../src/appearance/constants.ts","../src/appearance/parts.ts","../src/modal/consentSelection.ts","../src/modal/chromeCopy.ts","../src/modal/selection-control.ts","../src/modal/purposes.ts","../src/modal/language-selector.ts","../src/modal/keyboard.ts","../src/services/storage.ts","../src/modal/tts.ts","../src/modal/age-verification.ts","../src/modal/guardian-form.ts","../src/modal/verification-screen.ts","../src/modal/colors.ts","../src/modal/productConsent.ts","../src/modal/productState.ts","../src/modal/product-sections.ts","../src/modal/layout.ts","../src/modal/otpGate.ts","../src/modal/otp-gate-panel.ts","../src/appearance/theme-vars.ts","../src/modal/confirm-dialog.ts","../src/modal/productPolicies.ts","../src/modal/product-policy-line.ts","../src/modal/preselection.ts","../src/modal/notice-font.ts","../src/modal/section-labels.ts","../src/modal/notice-accordion.ts","../src/appearance/layout-styles.ts","../src/appearance/variant-styles.ts","../src/appearance/glass-skin.ts","../src/appearance/host-settings.ts","../src/appearance/text-scale.ts","../src/modal/look.ts","../src/appearance/cache.ts","../src/appearance/custom-css.ts","../src/appearance/stylesheets.ts","../src/modal/index.ts","../src/styles/inline.ts","../src/inline/selection.ts","../src/inline/purposes.ts","../src/inline/look.ts","../src/inline/index.ts","../src/assisted/constants.ts","../src/assisted/api.ts","../src/assisted/i18n.ts","../src/assisted/icons.ts","../src/assisted/selection.ts","../src/assisted/styles.ts","../src/assisted/notice-view.ts","../src/assisted/theme.ts","../src/assisted/look.ts","../src/assisted/verify-view.ts","../src/assisted/index.ts","../src/modal/digilocker-callback.ts","../src/privacy-center/index.ts"],"sourcesContent":["import { ModalController } from \"./modal\";\nimport { InlineController } from \"./inline\";\nimport { AssistedController } from \"./assisted\";\nimport { handleDigilockerCallback } from \"./modal/digilocker-callback\";\nimport type {\n ModalOptions,\n InlineOptions,\n DigiLockerCallbackOptions,\n OtpGateOptions,\n OtpVerifyResult,\n} from \"./types\";\nimport type { AssistedOptions } from \"./assisted/types\";\nimport { mountPrivacyCenter } from \"./privacy-center\";\nimport type { PrivacyCenterHandle, PrivacyCenterOptions } from \"./privacy-center/types\";\n\nlet activeModal: ModalController | null = null;\nlet activeInline: InlineController | null = null;\nlet activeAssisted: AssistedController | null = null;\nconst activePrivacyCenters = new Set<PrivacyCenterHandle>();\n\n/**\n * Initialize a modal consent dialog.\n * Renders a full-screen overlay with the consent form.\n */\nfunction init(options: ModalOptions): void {\n // Destroy any existing instance\n destroy();\n\n activeModal = new ModalController(options);\n activeModal.init().catch((err) => {\n options.onError?.(err);\n });\n}\n\n/**\n * Initialize an inline consent form.\n * Renders consent purposes inside a target container element.\n */\nfunction inline(options: InlineOptions): void {\n // Destroy any existing inline instance\n if (activeInline) {\n activeInline.destroy();\n activeInline = null;\n }\n\n activeInline = new InlineController(options);\n activeInline.init().catch((err) => {\n options.onError?.(err);\n });\n}\n\nfunction updateToken(accessToken: string): void {\n activeModal?.updateToken(accessToken);\n activeInline?.updateToken(accessToken);\n}\n\nfunction assisted(options: AssistedOptions): void {\n if (activeAssisted) {\n activeAssisted.destroy();\n activeAssisted = null;\n }\n\n activeAssisted = new AssistedController(options);\n activeAssisted.init().catch((err) => {\n options.onError?.(err);\n });\n}\n\n/**\n * Mount the hosted Privacy Center in an iframe inside a target element.\n * Returns a handle whose `destroy()` removes it.\n */\nfunction privacyCenter(options: PrivacyCenterOptions): PrivacyCenterHandle {\n const handle = mountPrivacyCenter(options);\n const tracked: PrivacyCenterHandle = {\n iframe: handle.iframe,\n destroy: () => {\n activePrivacyCenters.delete(tracked);\n handle.destroy();\n },\n };\n activePrivacyCenters.add(tracked);\n return tracked;\n}\n\n/**\n * Destroy all active consent instances.\n */\nfunction destroy(): void {\n if (activeModal) {\n activeModal.destroy();\n activeModal = null;\n }\n if (activeInline) {\n activeInline.destroy();\n activeInline = null;\n }\n if (activeAssisted) {\n activeAssisted.destroy();\n activeAssisted = null;\n }\n for (const handle of [...activePrivacyCenters]) {\n handle.destroy();\n }\n}\n\n/**\n * Handle DigiLocker callback (for guardian verification redirect flow).\n * Call this on the DigiLocker callback page.\n */\nfunction digilockerCallback(options: DigiLockerCallbackOptions): void {\n handleDigilockerCallback(options);\n}\n\nconst RedactoConsent = {\n init,\n inline,\n assisted,\n privacyCenter,\n destroy,\n digilockerCallback,\n updateToken,\n version: \"0.1.0\",\n};\n\nexport default RedactoConsent;\nexport { init, inline, assisted, privacyCenter, destroy, digilockerCallback, updateToken };\nexport type {\n ModalOptions,\n InlineOptions,\n DigiLockerCallbackOptions,\n OtpGateOptions,\n OtpVerifyResult,\n AssistedOptions,\n PrivacyCenterOptions,\n PrivacyCenterHandle,\n};\nexport type { Settings } from \"./api/types\";\nexport { ApiError } from \"./shared/api-errors\";\nexport type { ApiErrorCode } from \"./shared/types\";\n","/**\n * Simple observable store — replaces React useState.\n * Shallow-merges updates and notifies subscribers.\n */\n\nexport type Listener<T> = (state: T, prevState: T) => void;\n\nexport class Store<T extends Record<string, any>> {\n private state: T;\n private listeners: Set<Listener<T>> = new Set();\n\n constructor(initialState: T) {\n this.state = { ...initialState };\n }\n\n getState(): Readonly<T> {\n return this.state;\n }\n\n setState(partial: Partial<T>): void {\n const prevState = this.state;\n this.state = { ...this.state, ...partial };\n this.listeners.forEach((listener) => listener(this.state, prevState));\n }\n\n subscribe(listener: Listener<T>): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n destroy(): void {\n this.listeners.clear();\n }\n}\n","/**\n * DOM creation helpers — replaces JSX.\n */\n\ntype Attrs = Record<string, any>;\n\n/**\n * Create an HTML element with attributes, styles, events, and children.\n *\n * Attribute keys:\n * - \"style\" → merged into element.style\n * - \"className\" → element.className\n * - \"on...\" → addEventListener (e.g. onClick → \"click\")\n * - \"dataset\" → Object.assign(element.dataset, value)\n * - anything else → setAttribute\n */\nexport function el(\n tag: string,\n attrs?: Attrs | null,\n ...children: (Node | string | null | undefined | false)[]\n): HTMLElement {\n const element = document.createElement(tag);\n if (attrs) applyAttrs(element, attrs);\n appendChildren(element, children);\n return element;\n}\n\n/**\n * Create an SVG element.\n */\nexport function svg(\n tag: string,\n attrs?: Attrs | null,\n ...children: (Node | string | null | undefined | false)[]\n): SVGElement {\n const element = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n tag\n );\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value == null || value === false) continue;\n if (key === \"style\" && typeof value === \"object\") {\n applyStyles(element as unknown as HTMLElement, value);\n } else {\n element.setAttribute(key, String(value));\n }\n }\n }\n appendChildren(element as unknown as HTMLElement, children);\n return element;\n}\n\nfunction applyAttrs(element: HTMLElement, attrs: Attrs): void {\n for (const [key, value] of Object.entries(attrs)) {\n if (value == null || value === false) continue;\n\n if (key === \"style\" && typeof value === \"object\") {\n applyStyles(element, value);\n } else if (key === \"className\") {\n element.className = value;\n } else if (key === \"dataset\" && typeof value === \"object\") {\n Object.assign(element.dataset, value);\n } else if (key.startsWith(\"on\") && typeof value === \"function\") {\n const event = key.slice(2).toLowerCase();\n element.addEventListener(event, value);\n } else if (key === \"checked\" || key === \"disabled\" || key === \"readOnly\") {\n (element as any)[key] = value;\n } else {\n element.setAttribute(key, String(value));\n }\n }\n}\n\n/**\n * CSS properties that take a unitless number, mirroring React's CSSProperty\n * list. For these we MUST NOT append \"px\" — doing so produces invalid CSS\n * (e.g. `font-weight: 400px`) and the browser falls back to the user-agent\n * default (which is what made <h3> purpose descriptions render as bold).\n */\nconst UNITLESS_PROPS = new Set([\n \"animationIterationCount\",\n \"aspectRatio\",\n \"borderImageOutset\",\n \"borderImageSlice\",\n \"borderImageWidth\",\n \"boxFlex\",\n \"boxFlexGroup\",\n \"boxOrdinalGroup\",\n \"columnCount\",\n \"columns\",\n \"flex\",\n \"flexGrow\",\n \"flexPositive\",\n \"flexShrink\",\n \"flexNegative\",\n \"flexOrder\",\n \"fontWeight\",\n \"gridArea\",\n \"gridRow\",\n \"gridRowEnd\",\n \"gridRowSpan\",\n \"gridRowStart\",\n \"gridColumn\",\n \"gridColumnEnd\",\n \"gridColumnSpan\",\n \"gridColumnStart\",\n \"lineClamp\",\n \"lineHeight\",\n \"WebkitLineClamp\",\n \"opacity\",\n \"order\",\n \"orphans\",\n \"scale\",\n \"tabSize\",\n \"widows\",\n \"zIndex\",\n \"zoom\",\n]);\n\n/**\n * Apply a camelCase style object to an element.\n *\n * Numeric values are interpreted as pixels (matching React's behavior) EXCEPT\n * for the unitless properties listed above, which are passed through as-is.\n */\nexport function applyStyles(\n element: HTMLElement,\n styles: Record<string, any>\n): void {\n for (const [key, value] of Object.entries(styles)) {\n if (value == null) continue;\n const stringValue =\n typeof value === \"number\" && !UNITLESS_PROPS.has(key)\n ? `${value}px`\n : String(value);\n (element.style as any)[key] = stringValue;\n }\n}\n\nfunction appendChildren(\n parent: HTMLElement,\n children: (Node | string | null | undefined | false)[]\n): void {\n for (const child of children) {\n if (child == null || child === false) continue;\n if (typeof child === \"string\") {\n parent.appendChild(document.createTextNode(child));\n } else {\n parent.appendChild(child);\n }\n }\n}\n\n/**\n * Remove all children from an element.\n */\nexport function clearElement(element: HTMLElement): void {\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n}\n","/**\n * matchMedia wrapper with subscribe — replaces useMediaQuery hook.\n */\n\nexport type MediaQuerySubscription = {\n matches: boolean;\n subscribe: (cb: (matches: boolean) => void) => void;\n destroy: () => void;\n};\n\nexport function createMediaQuery(query: string): MediaQuerySubscription {\n const mql = window.matchMedia(query);\n let currentMatches = mql.matches;\n const listeners: Set<(matches: boolean) => void> = new Set();\n\n const handler = (e: MediaQueryListEvent) => {\n currentMatches = e.matches;\n listeners.forEach((cb) => cb(currentMatches));\n };\n\n mql.addEventListener(\"change\", handler);\n\n return {\n get matches() {\n return currentMatches;\n },\n subscribe(cb: (matches: boolean) => void) {\n listeners.add(cb);\n },\n destroy() {\n mql.removeEventListener(\"change\", handler);\n listeners.clear();\n },\n };\n}\n","const apiCache = new Map<string, { data: any; timestamp: number; ttl: number }>();\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\nexport function getCachedData(key: string): any | null {\n const cached = apiCache.get(key);\n if (cached && Date.now() - cached.timestamp < cached.ttl) {\n return cached.data;\n }\n if (cached) {\n apiCache.delete(key);\n }\n return null;\n}\n\nexport function setCachedData(key: string, data: any, ttl = CACHE_TTL): void {\n apiCache.set(key, { data, timestamp: Date.now(), ttl });\n}\n\nexport function clearApiCache(): void {\n apiCache.clear();\n}\n","export class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }));\n}\nfunction base64UrlDecode(str) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n try {\n return b64DecodeUnicode(output);\n }\n catch (err) {\n return atob(output);\n }\n}\nexport function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n options || (options = {});\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n }\n let decoded;\n try {\n decoded = base64UrlDecode(part);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n }\n try {\n return JSON.parse(decoded);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n }\n}\n","import { jwtDecode } from \"jwt-decode\";\nimport type { RedactoJwtPayload } from \"../api/types\";\n\n/**\n * Decode JWT with error handling — returns null on failure.\n */\nexport function decodeTokenSafely(token: string): RedactoJwtPayload | null {\n try {\n return jwtDecode(token) as RedactoJwtPayload;\n } catch (error) {\n console.warn(\"Failed to decode JWT token:\", error);\n return null;\n }\n}\n","/**\n * Sandbox-mode auth primitives for the consent PoC.\n *\n * In sandbox mode the SDK talks to the consent-server with a pasted static\n * token and an explicit test subject, bypassing the JWT entirely. Org/workspace\n * UUIDs come from options (they still build the `/public/organisations/{org}/\n * workspaces/{ws}/...` URL paths) instead of being decoded from a token.\n *\n * Auth is the single `X-Consent-Token` header carrying the static token; its\n * presence alone marks the request as `environment=test`. There is no subject\n * header. The acting identity (the test subject) rides the request's own\n * payload: query params (`primary_email` / `primary_mobile`) on GET/query reads,\n * and the body on POSTs. The server normalizes and namespaces it `test::`\n * server-side. Call sites resolve the credential via {@link buildAuthHeaders}\n * and the identity via {@link sandboxQueryIdentity} / {@link sandboxBodyIdentity}.\n *\n * This file exists so every JWT-decode / Authorization site resolves its\n * org/workspace UUIDs and builds its auth header through one place, keeping\n * sandbox vs. JWT branching from drifting across the fetch sites.\n */\nimport { decodeTokenSafely } from \"../core/jwt-decode\";\nimport type {\n ResolvedRequestAuth,\n SandboxAuth,\n SandboxIdentityPayload,\n SandboxOptions,\n} from \"./types\";\n\n/** HTTP header carrying the static sandbox token (the credential). */\nexport const SANDBOX_TOKEN_HEADER = \"X-Consent-Token\";\n\n/**\n * Resolve a {@link SandboxAuth} from sandbox options, or null when sandbox mode\n * is not active (no token).\n *\n * @throws Error when a sandbox token is provided but org/workspace or the acting\n * identity are incomplete — sandbox mode cannot build URLs or identify the\n * acting principal without them.\n */\nexport const resolveSandboxAuth = (\n options: SandboxOptions\n): SandboxAuth | null => {\n const token = options.token?.trim();\n if (!token) {\n return null;\n }\n\n const organisationUuid = options.organisationUuid?.trim();\n const workspaceUuid = options.workspaceUuid?.trim();\n const ucic = options.sandboxUcic?.trim();\n const email = options.sandboxEmail?.trim();\n const mobile = options.sandboxMobile?.trim();\n\n if (!organisationUuid || !workspaceUuid) {\n throw new Error(\n \"Sandbox mode requires organisationUuid and workspaceUuid\"\n );\n }\n if (!ucic && !email && !mobile) {\n throw new Error(\"Sandbox mode requires a UCIC, email, or mobile\");\n }\n\n return { token, ucic, email, mobile, organisationUuid, workspaceUuid };\n};\n\n/**\n * Resolve org/workspace UUIDs plus the sandbox context for an authenticated\n * request. In sandbox mode these come from options; otherwise they are decoded\n * from the JWT (preserving the pre-sandbox error messages exactly).\n *\n * @throws Error when neither a valid sandbox config nor a decodable token with\n * org/workspace UUIDs is available.\n */\nexport const resolveRequestAuth = (\n accessToken: string | undefined,\n options: SandboxOptions\n): ResolvedRequestAuth => {\n const sandbox = resolveSandboxAuth(options);\n if (sandbox) {\n return {\n organisationUuid: sandbox.organisationUuid,\n workspaceUuid: sandbox.workspaceUuid,\n sandbox,\n };\n }\n\n const decodedToken = accessToken ? decodeTokenSafely(accessToken) : null;\n if (!decodedToken) {\n throw new Error(\"Invalid access token\");\n }\n const { organisation_uuid, workspace_uuid } = decodedToken;\n if (!organisation_uuid || !workspace_uuid) {\n throw new Error(\"Invalid token: missing organization or workspace UUID\");\n }\n return {\n organisationUuid: organisation_uuid,\n workspaceUuid: workspace_uuid,\n sandbox: null,\n };\n};\n\n/**\n * Build the request headers for an authenticated call. In sandbox mode this is\n * the single `X-Consent-Token` credential (its presence marks the request as\n * `environment=test`); otherwise the standard `Authorization: Bearer`. There is\n * no subject header — the acting identity travels in the request's own payload\n * (see {@link sandboxQueryIdentity} for reads, {@link sandboxBodyIdentity} for\n * POSTs).\n */\nexport const buildAuthHeaders = (\n accessToken: string | undefined,\n sandbox: SandboxAuth | null\n): Record<string, string> => {\n if (sandbox) {\n return { [SANDBOX_TOKEN_HEADER]: sandbox.token };\n }\n return { Authorization: `Bearer ${accessToken}` };\n};\n\n/**\n * The identity payload for the sandbox acting principal — every identifier the\n * host supplied (`org_user_id` / `primary_email` / `primary_mobile`), mirroring\n * a live JWT's `user_data`. The server keys the principal by precedence (UCIC >\n * email > mobile) and preserves the rest as the display-only sandbox contact, so\n * the contact shows on the dashboard/receipt just as it does for a live user.\n * Merge this into a JSON request body (POST) or into query params (GET).\n */\nexport const sandboxBodyIdentity = (\n sandbox: SandboxAuth\n): SandboxIdentityPayload => {\n const payload: SandboxIdentityPayload = {};\n if (sandbox.ucic) {\n payload.org_user_id = sandbox.ucic;\n }\n if (sandbox.email) {\n payload.primary_email = sandbox.email;\n }\n if (sandbox.mobile) {\n payload.primary_mobile = sandbox.mobile;\n }\n return payload;\n};\n\n/**\n * The identity query fragment for GET/query reads — the same full identity as\n * {@link sandboxBodyIdentity}. Append these to the request's query string so the\n * server can resolve the acting test principal (it reads `org_user_id` /\n * `primary_email` / `primary_mobile` query params on sandbox reads).\n */\nexport const sandboxQueryIdentity = (\n sandbox: SandboxAuth\n): SandboxIdentityPayload => sandboxBodyIdentity(sandbox);\n","export const CODE_BY_NAME = new Map<string, string>([\n [\"english\", \"en\"],\n [\"assamese\", \"as\"],\n [\"bengali\", \"bn\"],\n [\"bodo\", \"brx\"],\n [\"dogri\", \"doi\"],\n [\"goan konkani\", \"gom\"],\n [\"gujarati\", \"gu\"],\n [\"hindi\", \"hi\"],\n [\"kannada\", \"kn\"],\n [\"kashmiri\", \"ks\"],\n [\"maithili\", \"mai\"],\n [\"malayalam\", \"ml\"],\n [\"manipuri\", \"mni-Mtei\"],\n [\"marathi\", \"mr\"],\n [\"nepali\", \"ne\"],\n [\"odia\", \"or\"],\n [\"punjabi\", \"pa\"],\n [\"sanskrit\", \"sa\"],\n [\"santali\", \"sat\"],\n [\"sindhi\", \"sd\"],\n [\"tamil\", \"ta\"],\n [\"telugu\", \"te\"],\n [\"urdu\", \"ur\"],\n]);\n\nexport const CODE_BY_LOWER = new Map<string, string>(\n [...CODE_BY_NAME.values()].map((c) => [c.toLowerCase(), c])\n);\n","import { CODE_BY_LOWER, CODE_BY_NAME } from \"./constants\";\n\nexport function toLanguageCode(lang?: string | null): string | undefined {\n if (!lang) {\n return undefined;\n }\n const trimmed = lang.trim();\n if (!trimmed) {\n return undefined;\n }\n const lower = trimmed.toLowerCase();\n return CODE_BY_LOWER.get(lower) ?? CODE_BY_NAME.get(lower) ?? trimmed;\n}\n\nexport function resolveDisplayLanguage(\n requested: string | undefined,\n defaultLanguage: string | undefined,\n translations: Record<string, unknown> | undefined\n): string {\n const fallback = defaultLanguage || \"en\";\n const requestedCode = toLanguageCode(requested);\n if (!requestedCode) {\n return fallback;\n }\n\n for (const key of Object.keys(translations || {})) {\n if (toLanguageCode(key) === requestedCode) {\n return key;\n }\n }\n\n return fallback;\n}\n","import type { ConsentEventPayload, Purpose } from \"./types\";\n\nexport const toSubmitPurposes = (\n purposes: ReadonlyArray<Purpose>\n): ConsentEventPayload[\"purposes\"] =>\n purposes.map((purpose) => {\n if (!purpose.uuid) {\n throw new Error(\"Invalid purpose data: missing uuid\");\n }\n\n const dataElements = (purpose.data_elements || [])\n .filter((element) => element.enabled)\n .map((element) => ({\n uuid: element.uuid,\n selected: element.required ? true : Boolean(element.selected),\n }));\n\n return {\n purpose_uuid: purpose.uuid,\n ...(purpose.product_uuid ? { product_uuid: purpose.product_uuid } : {}),\n selected: Boolean(purpose.selected),\n data_elements: dataElements.length > 0 ? dataElements : undefined,\n };\n });\n","import type { ApiErrorBody, ApiErrorCodeLike, ApiErrorDetail } from \"./types\";\n\nexport class ApiError extends Error {\n readonly status: number;\n readonly code?: ApiErrorCodeLike;\n readonly shouldRequestNew?: boolean;\n\n constructor(opts: {\n status: number;\n code?: ApiErrorCodeLike;\n message: string;\n shouldRequestNew?: boolean;\n }) {\n super(opts.message);\n this.name = \"ApiError\";\n this.status = opts.status;\n this.code = opts.code;\n this.shouldRequestNew = opts.shouldRequestNew;\n Object.setPrototypeOf(this, ApiError.prototype);\n }\n}\n\nconst statusFallback = (status: number): string | undefined => {\n if (status === 401) {\n return \"Your session has expired. Please request a new access link.\";\n }\n if (status === 403) {\n return \"You do not have access to this resource.\";\n }\n if (status >= 500) {\n return \"Something went wrong on our end. Please try again later.\";\n }\n return undefined;\n};\n\nconst extractFromDetail = (\n detail: ApiErrorBody[\"detail\"]\n): { message?: string; code?: string | null } => {\n if (typeof detail === \"string\") {\n return { message: detail };\n }\n if (Array.isArray(detail)) {\n return {};\n }\n if (detail && typeof detail === \"object\") {\n const obj = detail as ApiErrorDetail;\n return { message: obj.message ?? obj.detail, code: obj.error_code };\n }\n return {};\n};\n\nexport const parseApiError = async (\n response: Response,\n fallbackMessage: string\n): Promise<ApiError> => {\n let body: ApiErrorBody | undefined;\n let parsedBody = false;\n try {\n body = (await response.json()) as ApiErrorBody;\n parsedBody = true;\n } catch {\n body = undefined;\n }\n\n const fromDetail = extractFromDetail(body?.detail);\n const serverMessage = body?.message ?? fromDetail.message;\n const message =\n serverMessage ??\n (parsedBody ? statusFallback(response.status) : undefined) ??\n fallbackMessage;\n const code = body?.error_code ?? fromDetail.code ?? undefined;\n\n return new ApiError({\n status: response.status,\n code,\n message,\n shouldRequestNew: body?.should_request_new,\n });\n};\n","import type { IdempotencySender, PendingKey, RandomSource } from \"./types\";\n\nconst HEADER = \"Idempotency-Key\";\n\nconst MAX_PENDING = 16;\n\nconst pending = new Map<string, PendingKey>();\n\nconst toHex = (bytes: Uint8Array): string =>\n Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\nexport const mintIdempotencyKey = (\n source: RandomSource | undefined = (globalThis as { crypto?: RandomSource }).crypto\n): string => {\n if (source && typeof source.randomUUID === \"function\") {\n return source.randomUUID();\n }\n if (source && typeof source.getRandomValues === \"function\") {\n return toHex(source.getRandomValues(new Uint8Array(16)));\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 14)}-${Math.random()\n .toString(36)\n .slice(2, 14)}`;\n};\n\nconst statusOf = (outcome: unknown): number | undefined => {\n if (typeof Response !== \"undefined\" && outcome instanceof Response) {\n return outcome.status;\n }\n if (outcome && typeof outcome === \"object\" && \"status\" in outcome) {\n const status = (outcome as { status?: unknown }).status;\n if (typeof status === \"number\") return status;\n }\n return undefined;\n};\n\nconst settledOnResolve = (result: unknown): boolean => {\n const status = statusOf(result);\n return status === undefined || status < 500;\n};\n\nconst settledOnReject = (error: unknown): boolean => {\n const status = statusOf(error);\n return status !== undefined && status < 500;\n};\n\nexport const withIdempotencyKey = async <T>(\n url: string,\n body: string,\n send: IdempotencySender<T>\n): Promise<T> => {\n const signature = `${url}\\n${body}`;\n\n let entry = pending.get(signature);\n if (!entry) {\n entry = { key: mintIdempotencyKey(), inFlight: 0, keep: false };\n if (pending.size >= MAX_PENDING) {\n const oldest = pending.keys().next().value;\n if (oldest !== undefined) pending.delete(oldest);\n }\n pending.set(signature, entry);\n } else if (entry.inFlight === 0) {\n entry.keep = false;\n }\n entry.inFlight += 1;\n\n const held = entry;\n const settle = (settled: boolean) => {\n held.inFlight -= 1;\n if (!settled) held.keep = true;\n if (held.inFlight === 0 && !held.keep) pending.delete(signature);\n };\n\n try {\n const result = await send({ [HEADER]: held.key });\n settle(settledOnResolve(result));\n return result;\n } catch (error) {\n settle(settledOnReject(error));\n throw error;\n }\n};\n\nexport const resetIdempotencyKeys = (): void => {\n pending.clear();\n};\n","// The translated strings themselves; the lookup lives in chromeCopy.ts.\nimport type { NoticeChromeCopy } from \"../types\";\n\nexport const NOTICE_CHROME_EN: NoticeChromeCopy = {\n yes: \"Yes\",\n no: \"No\",\n mixed: \"Partly\",\n savedAnswer: \"Saved answer: {answer}\",\n confirmAcceptAllTitle: \"Accept every purpose?\",\n confirmAcceptAllDetail:\n \"This agrees to all purposes on this notice, including any you left unselected.\",\n confirmAcceptSelectedTitle: \"Confirm your selections?\",\n confirmAcceptSelectedDetail:\n \"Only the purposes you selected are recorded as agreed. The rest are recorded as not agreed.\",\n confirmDeclineTitle: \"Decline this notice?\",\n confirmDeclineDetail:\n \"Nothing is recorded as agreed, including any purposes you selected.\",\n otpTitle: \"Enter the verification code\",\n otpDescription:\n \"Ask the customer to read out the code they were sent. Your selections are locked until it is confirmed.\",\n otpSubmit: \"Confirm code\",\n otpVerifying: \"Verifying...\",\n otpFailed: \"Could not verify that code.\",\n productPoliciesLabel: \"Privacy policies:\",\n hintNothingChosen: \"Select at least one purpose to confirm.\",\n hintNothingEngaged:\n \"Select or change a purpose for the product you are consenting to.\",\n hintRequiredOutstanding: \"Accept the required purposes to confirm.\",\n};\n\nexport const TRANSLATIONS: Record<string, NoticeChromeCopy> = {\n en: NOTICE_CHROME_EN,\n hi: {\n yes: \"हाँ\",\n no: \"नहीं\",\n mixed: \"आंशिक\",\n savedAnswer: \"सहेजा गया उत्तर: {answer}\",\n confirmAcceptAllTitle: \"सभी उद्देश्य स्वीकार करें?\",\n confirmAcceptAllDetail:\n \"इससे इस सूचना के सभी उद्देश्यों पर सहमति दी जाती है, उन्हें भी जिन्हें आपने नहीं चुना।\",\n confirmAcceptSelectedTitle: \"अपने चयन की पुष्टि करें?\",\n confirmAcceptSelectedDetail:\n \"केवल आपके चुने हुए उद्देश्य सहमत के रूप में दर्ज होंगे। शेष असहमत के रूप में दर्ज होंगे।\",\n confirmDeclineTitle: \"इस सूचना को अस्वीकार करें?\",\n confirmDeclineDetail:\n \"कुछ भी सहमत के रूप में दर्ज नहीं होगा, आपके चुने हुए उद्देश्य भी नहीं।\",\n otpTitle: \"सत्यापन कोड दर्ज करें\",\n otpDescription:\n \"ग्राहक से भेजा गया कोड पढ़ने के लिए कहें। पुष्टि होने तक आपके चयन लॉक रहेंगे।\",\n otpSubmit: \"कोड की पुष्टि करें\",\n otpVerifying: \"सत्यापित किया जा रहा है...\",\n otpFailed: \"यह कोड सत्यापित नहीं हो सका।\",\n productPoliciesLabel: \"गोपनीयता नीतियाँ:\",\n hintNothingChosen: \"पुष्टि के लिए कम से कम एक उद्देश्य चुनें।\",\n hintNothingEngaged:\n \"जिस उत्पाद के लिए आप सहमति दे रहे हैं, उसका कोई उद्देश्य चुनें या बदलें।\",\n hintRequiredOutstanding: \"पुष्टि के लिए आवश्यक उद्देश्य स्वीकार करें।\",\n },\n bn: {\n yes: \"হ্যাঁ\",\n no: \"না\",\n mixed: \"আংশিক\",\n savedAnswer: \"সংরক্ষিত উত্তর: {answer}\",\n confirmAcceptAllTitle: \"সব উদ্দেশ্য গ্রহণ করবেন?\",\n confirmAcceptAllDetail:\n \"এতে এই বিজ্ঞপ্তির সব উদ্দেশ্যে সম্মতি দেওয়া হয়, আপনি যেগুলি নির্বাচন করেননি সেগুলি সহ।\",\n confirmAcceptSelectedTitle: \"আপনার নির্বাচন নিশ্চিত করবেন?\",\n confirmAcceptSelectedDetail:\n \"শুধু আপনার নির্বাচিত উদ্দেশ্যগুলি সম্মত হিসাবে নথিভুক্ত হবে। বাকিগুলি অসম্মত হিসাবে নথিভুক্ত হবে।\",\n confirmDeclineTitle: \"এই বিজ্ঞপ্তি প্রত্যাখ্যান করবেন?\",\n confirmDeclineDetail:\n \"কিছুই সম্মত হিসাবে নথিভুক্ত হবে না, আপনার নির্বাচিত উদ্দেশ্যগুলিও নয়।\",\n otpTitle: \"যাচাইকরণ কোড লিখুন\",\n otpDescription:\n \"গ্রাহককে পাঠানো কোডটি পড়তে বলুন। নিশ্চিত না হওয়া পর্যন্ত আপনার নির্বাচন লক থাকবে।\",\n otpSubmit: \"কোড নিশ্চিত করুন\",\n otpVerifying: \"যাচাই করা হচ্ছে...\",\n otpFailed: \"এই কোডটি যাচাই করা যায়নি।\",\n productPoliciesLabel: \"গোপনীয়তা নীতি:\",\n hintNothingChosen: \"নিশ্চিত করতে অন্তত একটি উদ্দেশ্য নির্বাচন করুন।\",\n hintNothingEngaged:\n \"আপনি যে পণ্যে সম্মতি দিচ্ছেন তার একটি উদ্দেশ্য নির্বাচন করুন বা পরিবর্তন করুন।\",\n hintRequiredOutstanding: \"নিশ্চিত করতে আবশ্যক উদ্দেশ্যগুলি গ্রহণ করুন।\",\n },\n mr: {\n yes: \"होय\",\n no: \"नाही\",\n mixed: \"अंशतः\",\n savedAnswer: \"जतन केलेले उत्तर: {answer}\",\n confirmAcceptAllTitle: \"सर्व उद्दिष्टे स्वीकारायची?\",\n confirmAcceptAllDetail:\n \"यामुळे या सूचनेतील सर्व उद्दिष्टांना संमती मिळते, तुम्ही न निवडलेल्यांसह.\",\n confirmAcceptSelectedTitle: \"तुमच्या निवडींची पुष्टी करायची?\",\n confirmAcceptSelectedDetail:\n \"फक्त तुम्ही निवडलेली उद्दिष्टे संमत म्हणून नोंदवली जातील. उर्वरित असंमत म्हणून नोंदवली जातील.\",\n confirmDeclineTitle: \"ही सूचना नाकारायची?\",\n confirmDeclineDetail:\n \"काहीही संमत म्हणून नोंदवले जाणार नाही, तुम्ही निवडलेली उद्दिष्टेही नाहीत.\",\n otpTitle: \"पडताळणी कोड प्रविष्ट करा\",\n otpDescription:\n \"ग्राहकाला पाठवलेला कोड वाचायला सांगा. पुष्टी होईपर्यंत तुमच्या निवडी लॉक राहतील.\",\n otpSubmit: \"कोडची पुष्टी करा\",\n otpVerifying: \"पडताळणी होत आहे...\",\n otpFailed: \"हा कोड पडताळता आला नाही.\",\n productPoliciesLabel: \"गोपनीयता धोरणे:\",\n hintNothingChosen: \"पुष्टी करण्यासाठी किमान एक उद्दिष्ट निवडा.\",\n hintNothingEngaged:\n \"तुम्ही ज्या उत्पादनाला संमती देत आहात त्याचे उद्दिष्ट निवडा किंवा बदला.\",\n hintRequiredOutstanding: \"पुष्टी करण्यासाठी आवश्यक उद्दिष्टे स्वीकारा.\",\n },\n ta: {\n yes: \"ஆம்\",\n no: \"இல்லை\",\n mixed: \"பகுதி\",\n savedAnswer: \"சேமித்த பதில்: {answer}\",\n confirmAcceptAllTitle: \"அனைத்து நோக்கங்களையும் ஏற்கவா?\",\n confirmAcceptAllDetail:\n \"இது இந்த அறிவிப்பின் அனைத்து நோக்கங்களுக்கும் ஒப்புதல் அளிக்கிறது, நீங்கள் தேர்ந்தெடுக்காதவை உட்பட.\",\n confirmAcceptSelectedTitle: \"உங்கள் தேர்வுகளை உறுதிப்படுத்தவா?\",\n confirmAcceptSelectedDetail:\n \"நீங்கள் தேர்ந்தெடுத்த நோக்கங்கள் மட்டுமே ஒப்புக்கொண்டதாகப் பதிவு செய்யப்படும். மற்றவை ஒப்புக்கொள்ளாததாகப் பதிவு செய்யப்படும்.\",\n confirmDeclineTitle: \"இந்த அறிவிப்பை நிராகரிக்கவா?\",\n confirmDeclineDetail:\n \"எதுவும் ஒப்புக்கொண்டதாகப் பதிவு செய்யப்படாது, நீங்கள் தேர்ந்தெடுத்த நோக்கங்களும் அல்ல.\",\n otpTitle: \"சரிபார்ப்புக் குறியீட்டை உள்ளிடவும்\",\n otpDescription:\n \"அனுப்பப்பட்ட குறியீட்டை வாசிக்கும்படி வாடிக்கையாளரிடம் கேளுங்கள். உறுதிப்படுத்தும் வரை உங்கள் தேர்வுகள் பூட்டப்பட்டிருக்கும்.\",\n otpSubmit: \"குறியீட்டை உறுதிப்படுத்து\",\n otpVerifying: \"சரிபார்க்கப்படுகிறது...\",\n otpFailed: \"அந்தக் குறியீட்டைச் சரிபார்க்க முடியவில்லை.\",\n productPoliciesLabel: \"தனியுரிமைக் கொள்கைகள்:\",\n hintNothingChosen:\n \"உறுதிப்படுத்த குறைந்தது ஒரு நோக்கத்தைத் தேர்ந்தெடுக்கவும்.\",\n hintNothingEngaged:\n \"நீங்கள் ஒப்புதல் அளிக்கும் தயாரிப்பின் நோக்கத்தைத் தேர்ந்தெடுக்கவும் அல்லது மாற்றவும்.\",\n hintRequiredOutstanding: \"உறுதிப்படுத்த தேவையான நோக்கங்களை ஏற்கவும்.\",\n },\n te: {\n yes: \"అవును\",\n no: \"కాదు\",\n mixed: \"పాక్షిక\",\n savedAnswer: \"సేవ్ చేసిన సమాధానం: {answer}\",\n confirmAcceptAllTitle: \"అన్ని ప్రయోజనాలను అంగీకరించాలా?\",\n confirmAcceptAllDetail:\n \"ఇది ఈ నోటీసులోని అన్ని ప్రయోజనాలకు అంగీకరిస్తుంది, మీరు ఎంచుకోనివి సహా.\",\n confirmAcceptSelectedTitle: \"మీ ఎంపికలను నిర్ధారించాలా?\",\n confirmAcceptSelectedDetail:\n \"మీరు ఎంచుకున్న ప్రయోజనాలు మాత్రమే అంగీకరించినట్లు నమోదవుతాయి. మిగిలినవి అంగీకరించనట్లు నమోదవుతాయి.\",\n confirmDeclineTitle: \"ఈ నోటీసును తిరస్కరించాలా?\",\n confirmDeclineDetail:\n \"ఏదీ అంగీకరించినట్లు నమోదు కాదు, మీరు ఎంచుకున్న ప్రయోజనాలు కూడా కాదు.\",\n otpTitle: \"ధృవీకరణ కోడ్ను నమోదు చేయండి\",\n otpDescription:\n \"పంపిన కోడ్ను చదవమని కస్టమర్ను అడగండి. నిర్ధారణ అయ్యే వరకు మీ ఎంపికలు లాక్ అవుతాయి.\",\n otpSubmit: \"కోడ్ను నిర్ధారించండి\",\n otpVerifying: \"ధృవీకరిస్తోంది...\",\n otpFailed: \"ఆ కోడ్ను ధృవీకరించలేకపోయాము.\",\n productPoliciesLabel: \"గోప్యతా విధానాలు:\",\n hintNothingChosen: \"నిర్ధారించడానికి కనీసం ఒక ప్రయోజనాన్ని ఎంచుకోండి.\",\n hintNothingEngaged:\n \"మీరు సమ్మతి ఇస్తున్న ఉత్పత్తికి ఒక ప్రయోజనాన్ని ఎంచుకోండి లేదా మార్చండి.\",\n hintRequiredOutstanding:\n \"నిర్ధారించడానికి అవసరమైన ప్రయోజనాలను అంగీకరించండి.\",\n },\n gu: {\n yes: \"હા\",\n no: \"ના\",\n mixed: \"આંશિક\",\n savedAnswer: \"સાચવેલ જવાબ: {answer}\",\n confirmAcceptAllTitle: \"બધા હેતુઓ સ્વીકારવા?\",\n confirmAcceptAllDetail:\n \"આથી આ સૂચનાના બધા હેતુઓને સંમતિ મળે છે, તમે પસંદ ન કરેલા સહિત.\",\n confirmAcceptSelectedTitle: \"તમારી પસંદગીઓની પુષ્ટિ કરવી?\",\n confirmAcceptSelectedDetail:\n \"ફક્ત તમે પસંદ કરેલા હેતુઓ સંમત તરીકે નોંધાશે. બાકીના અસંમત તરીકે નોંધાશે.\",\n confirmDeclineTitle: \"આ સૂચના નકારવી?\",\n confirmDeclineDetail:\n \"કંઈપણ સંમત તરીકે નોંધાશે નહીં, તમે પસંદ કરેલા હેતુઓ પણ નહીં.\",\n otpTitle: \"ચકાસણી કોડ દાખલ કરો\",\n otpDescription:\n \"ગ્રાહકને મોકલેલો કોડ વાંચવા કહો. પુષ્ટિ થાય ત્યાં સુધી તમારી પસંદગીઓ લૉક રહેશે.\",\n otpSubmit: \"કોડની પુષ્ટિ કરો\",\n otpVerifying: \"ચકાસાઈ રહ્યું છે...\",\n otpFailed: \"તે કોડ ચકાસી શકાયો નથી.\",\n productPoliciesLabel: \"ગોપનીયતા નીતિઓ:\",\n hintNothingChosen: \"પુષ્ટિ કરવા ઓછામાં ઓછો એક હેતુ પસંદ કરો.\",\n hintNothingEngaged:\n \"તમે જે ઉત્પાદનને સંમતિ આપી રહ્યા છો તેનો હેતુ પસંદ કરો અથવા બદલો.\",\n hintRequiredOutstanding: \"પુષ્ટિ કરવા જરૂરી હેતુઓ સ્વીકારો.\",\n },\n kn: {\n yes: \"ಹೌದು\",\n no: \"ಇಲ್ಲ\",\n mixed: \"ಭಾಗಶಃ\",\n savedAnswer: \"ಉಳಿಸಿದ ಉತ್ತರ: {answer}\",\n confirmAcceptAllTitle: \"ಎಲ್ಲಾ ಉದ್ದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸುವುದೇ?\",\n confirmAcceptAllDetail:\n \"ಇದು ಈ ಸೂಚನೆಯ ಎಲ್ಲಾ ಉದ್ದೇಶಗಳಿಗೆ ಸಮ್ಮತಿಸುತ್ತದೆ, ನೀವು ಆಯ್ಕೆ ಮಾಡದವುಗಳೂ ಸೇರಿ.\",\n confirmAcceptSelectedTitle: \"ನಿಮ್ಮ ಆಯ್ಕೆಗಳನ್ನು ಖಚಿತಪಡಿಸುವುದೇ?\",\n confirmAcceptSelectedDetail:\n \"ನೀವು ಆಯ್ಕೆ ಮಾಡಿದ ಉದ್ದೇಶಗಳು ಮಾತ್ರ ಸಮ್ಮತಿಸಿದಂತೆ ದಾಖಲಾಗುತ್ತವೆ. ಉಳಿದವು ಸಮ್ಮತಿಸದಂತೆ ದಾಖಲಾಗುತ್ತವೆ.\",\n confirmDeclineTitle: \"ಈ ಸೂಚನೆಯನ್ನು ನಿರಾಕರಿಸುವುದೇ?\",\n confirmDeclineDetail:\n \"ಯಾವುದೂ ಸಮ್ಮತಿಸಿದಂತೆ ದಾಖಲಾಗುವುದಿಲ್ಲ, ನೀವು ಆಯ್ಕೆ ಮಾಡಿದ ಉದ್ದೇಶಗಳೂ ಅಲ್ಲ.\",\n otpTitle: \"ಪರಿಶೀಲನಾ ಕೋಡ್ ನಮೂದಿಸಿ\",\n otpDescription:\n \"ಕಳುಹಿಸಿದ ಕೋಡ್ ಅನ್ನು ಓದಲು ಗ್ರಾಹಕರನ್ನು ಕೇಳಿ. ಖಚಿತವಾಗುವವರೆಗೆ ನಿಮ್ಮ ಆಯ್ಕೆಗಳು ಲಾಕ್ ಆಗಿರುತ್ತವೆ.\",\n otpSubmit: \"ಕೋಡ್ ಖಚಿತಪಡಿಸಿ\",\n otpVerifying: \"ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ...\",\n otpFailed: \"ಆ ಕೋಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗಲಿಲ್ಲ.\",\n productPoliciesLabel: \"ಗೌಪ್ಯತಾ ನೀತಿಗಳು:\",\n hintNothingChosen: \"ಖಚಿತಪಡಿಸಲು ಕನಿಷ್ಠ ಒಂದು ಉದ್ದೇಶವನ್ನು ಆಯ್ಕೆಮಾಡಿ.\",\n hintNothingEngaged:\n \"ನೀವು ಸಮ್ಮತಿ ನೀಡುತ್ತಿರುವ ಉತ್ಪನ್ನದ ಉದ್ದೇಶವನ್ನು ಆಯ್ಕೆಮಾಡಿ ಅಥವಾ ಬದಲಾಯಿಸಿ.\",\n hintRequiredOutstanding: \"ಖಚಿತಪಡಿಸಲು ಅಗತ್ಯವಿರುವ ಉದ್ದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ.\",\n },\n ml: {\n yes: \"അതെ\",\n no: \"അല്ല\",\n mixed: \"ഭാഗികം\",\n savedAnswer: \"സംരക്ഷിച്ച ഉത്തരം: {answer}\",\n confirmAcceptAllTitle: \"എല്ലാ ഉദ്ദേശ്യങ്ങളും സ്വീകരിക്കണോ?\",\n confirmAcceptAllDetail:\n \"ഇത് ഈ അറിയിപ്പിലെ എല്ലാ ഉദ്ദേശ്യങ്ങൾക്കും സമ്മതം നൽകുന്നു, നിങ്ങൾ തിരഞ്ഞെടുക്കാത്തവ ഉൾപ്പെടെ.\",\n confirmAcceptSelectedTitle: \"നിങ്ങളുടെ തിരഞ്ഞെടുപ്പുകൾ സ്ഥിരീകരിക്കണോ?\",\n confirmAcceptSelectedDetail:\n \"നിങ്ങൾ തിരഞ്ഞെടുത്ത ഉദ്ദേശ്യങ്ങൾ മാത്രം സമ്മതിച്ചതായി രേഖപ്പെടുത്തും. ബാക്കിയുള്ളവ സമ്മതിക്കാത്തതായി രേഖപ്പെടുത്തും.\",\n confirmDeclineTitle: \"ഈ അറിയിപ്പ് നിരസിക്കണോ?\",\n confirmDeclineDetail:\n \"ഒന്നും സമ്മതിച്ചതായി രേഖപ്പെടുത്തില്ല, നിങ്ങൾ തിരഞ്ഞെടുത്ത ഉദ്ദേശ്യങ്ങളും ഇല്ല.\",\n otpTitle: \"പരിശോധനാ കോഡ് നൽകുക\",\n otpDescription:\n \"അയച്ച കോഡ് വായിക്കാൻ ഉപഭോക്താവിനോട് ആവശ്യപ്പെടുക. സ്ഥിരീകരിക്കുന്നതുവരെ നിങ്ങളുടെ തിരഞ്ഞെടുപ്പുകൾ ലോക്ക് ചെയ്യപ്പെടും.\",\n otpSubmit: \"കോഡ് സ്ഥിരീകരിക്കുക\",\n otpVerifying: \"പരിശോധിക്കുന്നു...\",\n otpFailed: \"ആ കോഡ് പരിശോധിക്കാനായില്ല.\",\n productPoliciesLabel: \"സ്വകാര്യതാ നയങ്ങൾ:\",\n hintNothingChosen:\n \"സ്ഥിരീകരിക്കാൻ കുറഞ്ഞത് ഒരു ഉദ്ദേശ്യമെങ്കിലും തിരഞ്ഞെടുക്കുക.\",\n hintNothingEngaged:\n \"നിങ്ങൾ സമ്മതം നൽകുന്ന ഉൽപ്പന്നത്തിന്റെ ഉദ്ദേശ്യം തിരഞ്ഞെടുക്കുകയോ മാറ്റുകയോ ചെയ്യുക.\",\n hintRequiredOutstanding:\n \"സ്ഥിരീകരിക്കാൻ ആവശ്യമായ ഉദ്ദേശ്യങ്ങൾ സ്വീകരിക്കുക.\",\n },\n pa: {\n yes: \"ਹਾਂ\",\n no: \"ਨਹੀਂ\",\n mixed: \"ਅੰਸ਼ਕ\",\n savedAnswer: \"ਸੰਭਾਲਿਆ ਜਵਾਬ: {answer}\",\n confirmAcceptAllTitle: \"ਸਾਰੇ ਮੰਤਵ ਸਵੀਕਾਰ ਕਰਨੇ ਹਨ?\",\n confirmAcceptAllDetail:\n \"ਇਸ ਨਾਲ ਇਸ ਸੂਚਨਾ ਦੇ ਸਾਰੇ ਮੰਤਵਾਂ ਲਈ ਸਹਿਮਤੀ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ, ਉਹ ਵੀ ਜੋ ਤੁਸੀਂ ਨਹੀਂ ਚੁਣੇ।\",\n confirmAcceptSelectedTitle: \"ਆਪਣੀਆਂ ਚੋਣਾਂ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨੀ ਹੈ?\",\n confirmAcceptSelectedDetail:\n \"ਸਿਰਫ਼ ਤੁਹਾਡੇ ਚੁਣੇ ਮੰਤਵ ਸਹਿਮਤ ਵਜੋਂ ਦਰਜ ਹੋਣਗੇ। ਬਾਕੀ ਅਸਹਿਮਤ ਵਜੋਂ ਦਰਜ ਹੋਣਗੇ।\",\n confirmDeclineTitle: \"ਇਹ ਸੂਚਨਾ ਰੱਦ ਕਰਨੀ ਹੈ?\",\n confirmDeclineDetail:\n \"ਕੁਝ ਵੀ ਸਹਿਮਤ ਵਜੋਂ ਦਰਜ ਨਹੀਂ ਹੋਵੇਗਾ, ਤੁਹਾਡੇ ਚੁਣੇ ਮੰਤਵ ਵੀ ਨਹੀਂ।\",\n otpTitle: \"ਤਸਦੀਕ ਕੋਡ ਦਾਖਲ ਕਰੋ\",\n otpDescription:\n \"ਗਾਹਕ ਨੂੰ ਭੇਜਿਆ ਕੋਡ ਪੜ੍ਹਨ ਲਈ ਕਹੋ। ਪੁਸ਼ਟੀ ਹੋਣ ਤੱਕ ਤੁਹਾਡੀਆਂ ਚੋਣਾਂ ਲਾਕ ਰਹਿਣਗੀਆਂ।\",\n otpSubmit: \"ਕੋਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ\",\n otpVerifying: \"ਤਸਦੀਕ ਹੋ ਰਿਹਾ ਹੈ...\",\n otpFailed: \"ਉਹ ਕੋਡ ਤਸਦੀਕ ਨਹੀਂ ਹੋ ਸਕਿਆ।\",\n productPoliciesLabel: \"ਪਰਦੇਦਾਰੀ ਨੀਤੀਆਂ:\",\n hintNothingChosen: \"ਪੁਸ਼ਟੀ ਲਈ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਮੰਤਵ ਚੁਣੋ।\",\n hintNothingEngaged:\n \"ਜਿਸ ਉਤਪਾਦ ਲਈ ਤੁਸੀਂ ਸਹਿਮਤੀ ਦੇ ਰਹੇ ਹੋ, ਉਸ ਦਾ ਮੰਤਵ ਚੁਣੋ ਜਾਂ ਬਦਲੋ।\",\n hintRequiredOutstanding: \"ਪੁਸ਼ਟੀ ਲਈ ਲੋੜੀਂਦੇ ਮੰਤਵ ਸਵੀਕਾਰ ਕਰੋ।\",\n },\n or: {\n yes: \"ହଁ\",\n no: \"ନା\",\n mixed: \"ଆଂଶିକ\",\n savedAnswer: \"ସଞ୍ଚିତ ଉତ୍ତର: {answer}\",\n confirmAcceptAllTitle: \"ସମସ୍ତ ଉଦ୍ଦେଶ୍ୟ ଗ୍ରହଣ କରିବେ?\",\n confirmAcceptAllDetail:\n \"ଏହା ଏହି ସୂଚନାର ସମସ୍ତ ଉଦ୍ଦେଶ୍ୟକୁ ସମ୍ମତି ଦିଏ, ଆପଣ ଚୟନ ନକରିଥିବା ଗୁଡ଼ିକ ସହିତ।\",\n confirmAcceptSelectedTitle: \"ଆପଣଙ୍କ ଚୟନ ନିଶ୍ଚିତ କରିବେ?\",\n confirmAcceptSelectedDetail:\n \"କେବଳ ଆପଣ ଚୟନ କରିଥିବା ଉଦ୍ଦେଶ୍ୟ ସମ୍ମତ ଭାବେ ଲିପିବଦ୍ଧ ହେବ। ବାକିଗୁଡ଼ିକ ଅସମ୍ମତ ଭାବେ ଲିପିବଦ୍ଧ ହେବ।\",\n confirmDeclineTitle: \"ଏହି ସୂଚନା ପ୍ରତ୍ୟାଖ୍ୟାନ କରିବେ?\",\n confirmDeclineDetail:\n \"କିଛି ବି ସମ୍ମତ ଭାବେ ଲିପିବଦ୍ଧ ହେବ ନାହିଁ, ଆପଣ ଚୟନ କରିଥିବା ଉଦ୍ଦେଶ୍ୟ ମଧ୍ୟ ନୁହେଁ।\",\n otpTitle: \"ଯାଞ୍ଚ କୋଡ୍ ପ୍ରବେଶ କରନ୍ତୁ\",\n otpDescription:\n \"ପଠାଯାଇଥିବା କୋଡ୍ ପଢ଼ିବାକୁ ଗ୍ରାହକଙ୍କୁ କୁହନ୍ତୁ। ନିଶ୍ଚିତ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଆପଣଙ୍କ ଚୟନ ଲକ୍ ରହିବ।\",\n otpSubmit: \"କୋଡ୍ ନିଶ୍ଚିତ କରନ୍ତୁ\",\n otpVerifying: \"ଯାଞ୍ଚ କରାଯାଉଛି...\",\n otpFailed: \"ସେହି କୋଡ୍ ଯାଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ।\",\n productPoliciesLabel: \"ଗୋପନୀୟତା ନୀତି:\",\n hintNothingChosen: \"ନିଶ୍ଚିତ କରିବାକୁ ଅତି କମରେ ଗୋଟିଏ ଉଦ୍ଦେଶ୍ୟ ଚୟନ କରନ୍ତୁ।\",\n hintNothingEngaged:\n \"ଆପଣ ସମ୍ମତି ଦେଉଥିବା ଉତ୍ପାଦର ଉଦ୍ଦେଶ୍ୟ ଚୟନ କରନ୍ତୁ କିମ୍ବା ବଦଳାନ୍ତୁ।\",\n hintRequiredOutstanding: \"ନିଶ୍ଚିତ କରିବାକୁ ଆବଶ୍ୟକ ଉଦ୍ଦେଶ୍ୟ ଗ୍ରହଣ କରନ୍ତୁ।\",\n },\n as: {\n yes: \"হয়\",\n no: \"নহয়\",\n mixed: \"আংশিক\",\n savedAnswer: \"সংৰক্ষিত উত্তৰ: {answer}\",\n confirmAcceptAllTitle: \"সকলো উদ্দেশ্য গ্ৰহণ কৰিবনে?\",\n confirmAcceptAllDetail:\n \"ই এই জাননীৰ সকলো উদ্দেশ্যত সন্মতি দিয়ে, আপুনি নিৰ্বাচন নকৰাবোৰো ধৰি।\",\n confirmAcceptSelectedTitle: \"আপোনাৰ নিৰ্বাচন নিশ্চিত কৰিবনে?\",\n confirmAcceptSelectedDetail:\n \"কেৱল আপুনি নিৰ্বাচন কৰা উদ্দেশ্যবোৰ সন্মত হিচাপে লিপিবদ্ধ হ'ব। বাকীবোৰ অসন্মত হিচাপে লিপিবদ্ধ হ'ব।\",\n confirmDeclineTitle: \"এই জাননী প্ৰত্যাখ্যান কৰিবনে?\",\n confirmDeclineDetail:\n \"একোৱেই সন্মত হিচাপে লিপিবদ্ধ নহ'ব, আপুনি নিৰ্বাচন কৰা উদ্দেশ্যবোৰো নহয়।\",\n otpTitle: \"সত্যাপন ক'ড দিয়ক\",\n otpDescription:\n \"পঠোৱা ক'ডটো পঢ়িবলৈ গ্ৰাহকক কওক। নিশ্চিত নোহোৱালৈকে আপোনাৰ নিৰ্বাচন লক থাকিব।\",\n otpSubmit: \"ক'ড নিশ্চিত কৰক\",\n otpVerifying: \"সত্যাপন কৰা হৈছে...\",\n otpFailed: \"সেই ক'ডটো সত্যাপন কৰিব পৰা নগ'ল।\",\n productPoliciesLabel: \"গোপনীয়তা নীতিসমূহ:\",\n hintNothingChosen: \"নিশ্চিত কৰিবলৈ অন্ততঃ এটা উদ্দেশ্য নিৰ্বাচন কৰক।\",\n hintNothingEngaged:\n \"আপুনি সন্মতি দি থকা সামগ্ৰীৰ এটা উদ্দেশ্য নিৰ্বাচন কৰক বা সলনি কৰক।\",\n hintRequiredOutstanding:\n \"নিশ্চিত কৰিবলৈ প্ৰয়োজনীয় উদ্দেশ্যবোৰ গ্ৰহণ কৰক।\",\n },\n ur: {\n yes: \"ہاں\",\n no: \"نہیں\",\n mixed: \"جزوی\",\n savedAnswer: \"محفوظ جواب: {answer}\",\n confirmAcceptAllTitle: \"تمام مقاصد قبول کریں؟\",\n confirmAcceptAllDetail:\n \"اس سے اس نوٹس کے تمام مقاصد پر رضامندی دی جاتی ہے، ان سمیت جو آپ نے منتخب نہیں کیے۔\",\n confirmAcceptSelectedTitle: \"اپنے انتخاب کی تصدیق کریں؟\",\n confirmAcceptSelectedDetail:\n \"صرف آپ کے منتخب کردہ مقاصد رضامند کے طور پر درج ہوں گے۔ باقی غیر رضامند کے طور پر درج ہوں گے۔\",\n confirmDeclineTitle: \"اس نوٹس کو مسترد کریں؟\",\n confirmDeclineDetail:\n \"کچھ بھی رضامند کے طور پر درج نہیں ہوگا، آپ کے منتخب کردہ مقاصد بھی نہیں۔\",\n otpTitle: \"تصدیقی کوڈ درج کریں\",\n otpDescription:\n \"گاہک سے بھیجا گیا کوڈ پڑھنے کو کہیں۔ تصدیق ہونے تک آپ کے انتخاب مقفل رہیں گے۔\",\n otpSubmit: \"کوڈ کی تصدیق کریں\",\n otpVerifying: \"تصدیق ہو رہی ہے...\",\n otpFailed: \"اس کوڈ کی تصدیق نہیں ہو سکی۔\",\n productPoliciesLabel: \"پرائیویسی پالیسیاں:\",\n hintNothingChosen: \"تصدیق کے لیے کم از کم ایک مقصد منتخب کریں۔\",\n hintNothingEngaged:\n \"جس پروڈکٹ کے لیے آپ رضامندی دے رہے ہیں، اس کا مقصد منتخب کریں یا تبدیل کریں۔\",\n hintRequiredOutstanding: \"تصدیق کے لیے مطلوبہ مقاصد قبول کریں۔\",\n },\n ne: {\n yes: \"हो\",\n no: \"होइन\",\n mixed: \"आंशिक\",\n savedAnswer: \"सुरक्षित उत्तर: {answer}\",\n confirmAcceptAllTitle: \"सबै उद्देश्य स्वीकार गर्ने?\",\n confirmAcceptAllDetail:\n \"यसले यस सूचनाका सबै उद्देश्यमा सहमति दिन्छ, तपाईंले नछानेका पनि।\",\n confirmAcceptSelectedTitle: \"आफ्ना छनोट पुष्टि गर्ने?\",\n confirmAcceptSelectedDetail:\n \"तपाईंले छानेका उद्देश्य मात्र सहमत रूपमा दर्ता हुनेछन्। बाँकी असहमत रूपमा दर्ता हुनेछन्।\",\n confirmDeclineTitle: \"यो सूचना अस्वीकार गर्ने?\",\n confirmDeclineDetail:\n \"केही पनि सहमत रूपमा दर्ता हुनेछैन, तपाईंले छानेका उद्देश्य पनि होइन।\",\n otpTitle: \"प्रमाणीकरण कोड प्रविष्ट गर्नुहोस्\",\n otpDescription:\n \"पठाइएको कोड पढ्न ग्राहकलाई भन्नुहोस्। पुष्टि नहुँदासम्म तपाईंका छनोट लक रहनेछन्।\",\n otpSubmit: \"कोड पुष्टि गर्नुहोस्\",\n otpVerifying: \"प्रमाणीकरण गर्दै...\",\n otpFailed: \"त्यो कोड प्रमाणित गर्न सकिएन।\",\n productPoliciesLabel: \"गोपनीयता नीतिहरू:\",\n hintNothingChosen: \"पुष्टि गर्न कम्तीमा एउटा उद्देश्य छान्नुहोस्।\",\n hintNothingEngaged:\n \"तपाईंले सहमति दिइरहनुभएको उत्पादनको उद्देश्य छान्नुहोस् वा परिवर्तन गर्नुहोस्।\",\n hintRequiredOutstanding: \"पुष्टि गर्न आवश्यक उद्देश्य स्वीकार गर्नुहोस्।\",\n },\n sa: {\n yes: \"आम्\",\n no: \"न\",\n mixed: \"आंशिकम्\",\n savedAnswer: \"रक्षितम् उत्तरम्: {answer}\",\n confirmAcceptAllTitle: \"सर्वाणि प्रयोजनानि स्वीकुर्वन्तु?\",\n confirmAcceptAllDetail:\n \"अनेन अस्याः सूचनायाः सर्वेषु प्रयोजनेषु सम्मतिः दीयते, यानि भवता न चितानि तान्यपि।\",\n confirmAcceptSelectedTitle: \"स्वचयनानि निश्चिनोतु?\",\n confirmAcceptSelectedDetail:\n \"केवलं भवता चितानि प्रयोजनानि सम्मतानि इति लिख्यन्ते। शेषाणि असम्मतानि इति लिख्यन्ते।\",\n confirmDeclineTitle: \"एतां सूचनां निराकरोतु?\",\n confirmDeclineDetail:\n \"किमपि सम्मतम् इति न लिख्यते, भवता चितानि प्रयोजनानि अपि न।\",\n otpTitle: \"सत्यापनसङ्केतं प्रविशतु\",\n otpDescription:\n \"प्रेषितं सङ्केतं पठितुं ग्राहकं वदतु। निश्चयपर्यन्तं भवतः चयनानि निरुद्धानि भवन्ति।\",\n otpSubmit: \"सङ्केतं निश्चिनोतु\",\n otpVerifying: \"सत्यापनं क्रियते...\",\n otpFailed: \"सः सङ्केतः सत्यापयितुं न शक्यते।\",\n productPoliciesLabel: \"गोपनीयतानीतयः:\",\n hintNothingChosen: \"निश्चेतुं न्यूनातिन्यूनम् एकं प्रयोजनं चिनोतु।\",\n hintNothingEngaged:\n \"यस्मै उत्पादाय भवान् सम्मतिं ददाति तस्य प्रयोजनं चिनोतु परिवर्तयतु वा।\",\n hintRequiredOutstanding: \"निश्चेतुम् आवश्यकानि प्रयोजनानि स्वीकुर्वन्तु।\",\n },\n mai: {\n yes: \"हँ\",\n no: \"नहि\",\n mixed: \"आंशिक\",\n savedAnswer: \"सहेजल उत्तर: {answer}\",\n confirmAcceptAllTitle: \"सभ उद्देश्य स्वीकार करी?\",\n confirmAcceptAllDetail:\n \"एहिसँ एहि सूचनाक सभ उद्देश्य पर सहमति देल जाइत अछि, जे अहाँ नहि चुनलहुँ ताहि सहित।\",\n confirmAcceptSelectedTitle: \"अपन चयनक पुष्टि करी?\",\n confirmAcceptSelectedDetail:\n \"मात्र अहाँक चुनल उद्देश्य सहमत रूपमे दर्ज होएत। शेष असहमत रूपमे दर्ज होएत।\",\n confirmDeclineTitle: \"एहि सूचनाकेँ अस्वीकार करी?\",\n confirmDeclineDetail:\n \"किछु सेहो सहमत रूपमे दर्ज नहि होएत, अहाँक चुनल उद्देश्य सेहो नहि।\",\n otpTitle: \"सत्यापन कोड दर्ज करू\",\n otpDescription:\n \"ग्राहकसँ पठाओल कोड पढ़बाक लेल कहू। पुष्टि होएब धरि अहाँक चयन लॉक रहत।\",\n otpSubmit: \"कोडक पुष्टि करू\",\n otpVerifying: \"सत्यापित कएल जा रहल अछि...\",\n otpFailed: \"ई कोड सत्यापित नहि भ सकल।\",\n productPoliciesLabel: \"गोपनीयता नीति:\",\n hintNothingChosen: \"पुष्टिक लेल कम सँ कम एकटा उद्देश्य चुनू।\",\n hintNothingEngaged:\n \"जाहि उत्पादक लेल अहाँ सहमति द रहल छी, ओकर उद्देश्य चुनू वा बदलू।\",\n hintRequiredOutstanding: \"पुष्टिक लेल आवश्यक उद्देश्य स्वीकार करू।\",\n },\n gom: {\n yes: \"हंय\",\n no: \"ना\",\n mixed: \"आंशिक\",\n savedAnswer: \"जतन केल्लें उत्तर: {answer}\",\n confirmAcceptAllTitle: \"सगळीं उद्दिश्टां स्वीकारचीं?\",\n confirmAcceptAllDetail:\n \"हाका लागून ह्या सुचोवणेच्या सगळ्या उद्दिश्टांक संमती मेळटा, तुवें निवडूंक नाशिल्लीं सयत.\",\n confirmAcceptSelectedTitle: \"तुज्या निवडीची खात्री करची?\",\n confirmAcceptSelectedDetail:\n \"फकत तुवें निवडिल्लीं उद्दिश्टां संमत म्हूण नोंद जातलीं. उरिल्लीं असंमत म्हूण नोंद जातलीं.\",\n confirmDeclineTitle: \"ही सुचोवणी न्हयकारची?\",\n confirmDeclineDetail:\n \"कांयच संमत म्हूण नोंद जावचें ना, तुवें निवडिल्लीं उद्दिश्टां लेगीत ना.\",\n otpTitle: \"पडताळणी कोड घालात\",\n otpDescription:\n \"धाडिल्लो कोड वाचपाक गिरायकाक सांगात. खात्री जायसर तुज्यो निवडी लॉक उरतल्यो.\",\n otpSubmit: \"कोडाची खात्री करात\",\n otpVerifying: \"पडताळणी जाता...\",\n otpFailed: \"तो कोड पडताळूंक जालो ना.\",\n productPoliciesLabel: \"गुपितपण धोरणां:\",\n hintNothingChosen: \"खात्री करपाक उणेंत उणें एक उद्दिश्ट निवडात.\",\n hintNothingEngaged:\n \"तुमी जाच्या उत्पादनाक संमती दितात ताचें उद्दिश्ट निवडात वा बदलात.\",\n hintRequiredOutstanding: \"खात्री करपाक जाय आशिल्लीं उद्दिश्टां स्वीकारात.\",\n },\n doi: {\n yes: \"हाँ\",\n no: \"नेईं\",\n mixed: \"अंशक\",\n savedAnswer: \"सहेजे दा जवाब: {answer}\",\n confirmAcceptAllTitle: \"सारे मकसद स्वीकार करने न?\",\n confirmAcceptAllDetail:\n \"इस्सै इस सूचना दे सारे मकसदें गी सहमति दित्ती जंदी ऐ, उ' बी जेह्ड़े तुसें नेईं चुने।\",\n confirmAcceptSelectedTitle: \"अपनी चोनें दी पुश्टी करनी ऐ?\",\n confirmAcceptSelectedDetail:\n \"सिर्फ तुंदे चुने दे मकसद सहमत दे तौर पर दर्ज होङन। बाकी असहमत दे तौर पर दर्ज होङन।\",\n confirmDeclineTitle: \"इस सूचना गी रद्द करना ऐ?\",\n confirmDeclineDetail:\n \"कुछ बी सहमत दे तौर पर दर्ज नेईं होग, तुंदे चुने दे मकसद बी नेईं।\",\n otpTitle: \"तस्दीक कोड दर्ज करो\",\n otpDescription:\n \"ग्राहक गी भेजे दा कोड पढ़ने आस्तै आखो। पुश्टी होने तकर तुंदियां चोनां लॉक रौंहगियां।\",\n otpSubmit: \"कोड दी पुश्टी करो\",\n otpVerifying: \"तस्दीक कीती जा करदी ऐ...\",\n otpFailed: \"उह् कोड तस्दीक नेईं होई सकेआ।\",\n productPoliciesLabel: \"निजता नीतियां:\",\n hintNothingChosen: \"पुश्टी आस्तै घट्टोघट्ट इक मकसद चुनो।\",\n hintNothingEngaged:\n \"जिस उत्पाद आस्तै तुस सहमति देआ करदे ओ, उंदा मकसद चुनो जां बदलो।\",\n hintRequiredOutstanding: \"पुश्टी आस्तै लोड़चदे मकसद स्वीकार करो।\",\n },\n brx: {\n yes: \"नंगौ\",\n no: \"नङा\",\n mixed: \"बाहागो\",\n savedAnswer: \"थिना दिनाय फिन: {answer}\",\n confirmAcceptAllTitle: \"गासैबो उद्देश्यखौ लानो नामा?\",\n confirmAcceptAllDetail:\n \"बेयाव बे खौरांनि गासैबो उद्देश्यखौ राजि होयो, नोंथाङा सायख'आखैमानिखौबो लाफानानै।\",\n confirmAcceptSelectedTitle: \"नोंथांनि सायखनायखौ थिक होनो नामा?\",\n confirmAcceptSelectedDetail:\n \"खालि नोंथाङा सायखनाय उद्देश्यखौल' राजि महरै लिरना दोनगोन। बागानथिङा राजि नङै महरै लिरना दोनगोन।\",\n confirmDeclineTitle: \"बे खौरांखौ नेवसिनो नामा?\",\n confirmDeclineDetail:\n \"जायखिजाया राजि महरै लिरना दोनाखै, नोंथाङा सायखनाय उद्देश्यबो नङा।\",\n otpTitle: \"थिक खालामनाय क'ड हाबहो\",\n otpDescription:\n \"दैथाय हरनाय क'डखौ फरायनो ग्राहकखौ बुं। थिक जायाब्लासिम नोंथांनि सायखनाया लक जादों।\",\n otpSubmit: \"क'डखौ थिक खालाम\",\n otpVerifying: \"थिक खालामगासिनो दं...\",\n otpFailed: \"बै क'डखौ थिक खालामनो हायाखै।\",\n productPoliciesLabel: \"गुबै नीति:\",\n hintNothingChosen: \"थिक खालामनो खमसिन मोनसे उद्देश्य सायख।\",\n hintNothingEngaged:\n \"नोंथाङा राजि होगासिनो दं बै प्र'डाक्टनि उद्देश्यखौ सायख एबा सोलाय।\",\n hintRequiredOutstanding: \"थिक खालामनो नांगौ उद्देश्यफोरखौ ला।\",\n },\n \"mni-Mtei\": {\n yes: \"ꯍꯣꯏ\",\n no: \"ꯅꯠꯇꯦ\",\n mixed: \"ꯁꯔꯨꯛ\",\n savedAnswer: \"ꯁꯦꯚ ꯇꯧꯔꯕ ꯄꯥꯎꯈꯨꯝ: {answer}\",\n confirmAcceptAllTitle: \"ꯄꯥꯟꯗꯝ ꯄꯨꯝꯅꯃꯛ ꯌꯥꯕꯔꯥ?\",\n confirmAcceptAllDetail:\n \"ꯃꯁꯤꯅ ꯈꯨꯗꯝ ꯑꯁꯤꯒꯤ ꯄꯥꯟꯗꯝ ꯄꯨꯝꯅꯃꯛꯇ ꯑꯌꯥꯕ ꯄꯤ, ꯅꯪꯅ ꯈꯅꯗꯕꯁꯤꯡꯁꯨ ꯌꯥꯎꯅ।\",\n confirmAcceptSelectedTitle: \"ꯅꯪꯒꯤ ꯈꯅꯕꯁꯤꯡ ꯆꯨꯝꯃꯤ ꯍꯥꯌꯕꯔꯥ?\",\n confirmAcceptSelectedDetail:\n \"ꯅꯪꯅ ꯈꯅꯕ ꯄꯥꯟꯗꯝꯁꯤꯡ ꯈꯛꯇꯅ ꯑꯌꯥꯕ ꯄꯤꯔꯕꯅꯤ ꯍꯥꯌꯅ ꯏꯔꯒꯅꯤ। ꯑꯇꯣꯞꯄꯁꯤꯡ ꯑꯌꯥꯕ ꯄꯤꯗꯕꯅꯤ ꯍꯥꯌꯅ ꯏꯔꯒꯅꯤ।\",\n confirmDeclineTitle: \"ꯈꯨꯗꯝ ꯑꯁꯤ ꯌꯥꯗꯕꯔꯥ?\",\n confirmDeclineDetail:\n \"ꯀꯔꯤꯒꯨꯝꯕꯁꯨ ꯑꯌꯥꯕ ꯄꯤꯔꯕꯅꯤ ꯍꯥꯌꯅ ꯏꯔꯔꯣꯏ, ꯅꯪꯅ ꯈꯅꯕ ꯄꯥꯟꯗꯝꯁꯤꯡꯁꯨ ꯅꯠꯇꯦ।\",\n otpTitle: \"ꯆꯦꯛ ꯇꯧꯕꯒꯤ ꯀꯣꯗ ꯆꯪꯁꯤꯜꯂꯨ\",\n otpDescription:\n \"ꯊꯥꯔꯛꯂꯕ ꯀꯣꯗ ꯑꯗꯨ ꯄꯥꯕꯅꯤ ꯍꯥꯌꯅ ꯒ꯭ꯔꯥꯍꯀꯗ ꯍꯥꯌꯌꯨ। ꯆꯨꯝꯃꯤ ꯍꯥꯌꯗ꯭ꯔꯤꯉꯩ ꯅꯪꯒꯤ ꯈꯅꯕꯁꯤꯡ ꯂꯣꯛ ꯇꯧꯔꯒꯅꯤ।\",\n otpSubmit: \"ꯀꯣꯗ ꯆꯨꯝꯃꯤ ꯍꯥꯌꯌꯨ\",\n otpVerifying: \"ꯆꯦꯛ ꯇꯧꯔꯤ...\",\n otpFailed: \"ꯀꯣꯗ ꯑꯗꯨ ꯆꯦꯛ ꯇꯧꯕ ꯉꯃꯗꯦ।\",\n productPoliciesLabel: \"ꯑꯔꯣꯠꯄꯒꯤ ꯄꯥꯟꯗꯝꯁꯤꯡ:\",\n hintNothingChosen: \"ꯆꯨꯝꯃꯤ ꯍꯥꯌꯅꯕ ꯌꯥꯝꯅ ꯌꯥꯝꯅ ꯄꯥꯟꯗꯝ ꯑꯃ ꯈꯜꯂꯨ।\",\n hintNothingEngaged:\n \"ꯅꯪꯅ ꯑꯌꯥꯕ ꯄꯤꯔꯤꯕ ꯄ꯭ꯔꯣꯗꯛꯠ ꯑꯗꯨꯒꯤ ꯄꯥꯟꯗꯝ ꯈꯜꯂꯨ ꯅꯠꯔꯒ ꯍꯣꯡꯗꯣꯛꯂꯨ।\",\n hintRequiredOutstanding: \"ꯆꯨꯝꯃꯤ ꯍꯥꯌꯅꯕ ꯗꯔꯀꯥꯔ ꯑꯣꯏꯕ ꯄꯥꯟꯗꯝꯁꯤꯡ ꯌꯥꯕꯤꯌꯨ।\",\n },\n sat: {\n yes: \"ᱦᱚᱭ\",\n no: \"ᱵᱟᱝ\",\n mixed: \"ᱠᱚᱴᱮᱫ\",\n savedAnswer: \"ᱥᱟᱸᱪᱟᱣ ᱛᱮᱞᱟ ᱛᱮᱞᱟ: {answer}\",\n confirmAcceptAllTitle: \"ᱡᱚᱛᱚ ᱩᱫᱫᱮᱥᱭ ᱦᱟᱛᱟᱣ ᱢᱮ?\",\n confirmAcceptAllDetail:\n \"ᱱᱳᱶᱟ ᱛᱮ ᱱᱚᱶᱟ ᱠᱷᱚᱵᱚᱨ ᱨᱮᱭᱟᱜ ᱡᱚᱛᱚ ᱩᱫᱫᱮᱥᱭ ᱨᱮ ᱨᱟᱡᱤ ᱮᱢᱚᱜᱼᱟ, ᱟᱢ ᱵᱟᱝ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱ ᱠᱳ ᱦᱚᱸ।\",\n confirmAcceptSelectedTitle: \"ᱟᱢᱟᱜ ᱵᱟᱪᱷᱟᱣ ᱠᱚ ᱛᱷᱤᱠ ᱢᱮ?\",\n confirmAcceptSelectedDetail:\n \"ᱠᱷᱟᱹᱞᱤ ᱟᱢ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱ ᱩᱫᱫᱮᱥᱭ ᱠᱚ ᱨᱟᱡᱤ ᱞᱮᱠᱟ ᱚᱞ ᱦᱩᱭᱩᱜᱼᱟ। ᱮᱴᱟᱜ ᱠᱚ ᱵᱟᱝ ᱨᱟᱡᱤ ᱞᱮᱠᱟ ᱚᱞ ᱦᱩᱭᱩᱜᱼᱟ।\",\n confirmDeclineTitle: \"ᱱᱚᱶᱟ ᱠᱷᱚᱵᱚᱨ ᱵᱟᱹᱜᱤ ᱢᱮ?\",\n confirmDeclineDetail:\n \"ᱡᱟᱦᱟᱸ ᱦᱚᱸ ᱨᱟᱡᱤ ᱞᱮᱠᱟ ᱵᱟᱝ ᱚᱞ ᱦᱩᱭᱩᱜᱼᱟ, ᱟᱢ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱ ᱩᱫᱫᱮᱥᱭ ᱠᱚ ᱦᱚᱸ ᱵᱟᱝ।\",\n otpTitle: \"ᱡᱟᱸᱪ ᱠᱳᱰ ᱟᱫᱮᱨ ᱢᱮ\",\n otpDescription:\n \"ᱠᱩᱞ ᱟᱠᱟᱱ ᱠᱳᱰ ᱯᱟᱲᱦᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱜᱟᱦᱟᱠ ᱠᱚ ᱢᱮᱛᱟᱣ ᱢᱮ। ᱛᱷᱤᱠ ᱵᱟᱝ ᱦᱩᱭ ᱦᱟᱹᱵᱤᱡ ᱟᱢᱟᱜ ᱵᱟᱪᱷᱟᱣ ᱠᱚ ᱞᱚᱠ ᱛᱟᱦᱮᱸᱱᱟ।\",\n otpSubmit: \"ᱠᱳᱰ ᱛᱷᱤᱠ ᱢᱮ\",\n otpVerifying: \"ᱡᱟᱸᱪ ᱠᱟᱱᱟ...\",\n otpFailed: \"ᱚᱱᱟ ᱠᱳᱰ ᱡᱟᱸᱪ ᱵᱟᱝ ᱦᱩᱭ ᱠᱮᱫᱟ।\",\n productPoliciesLabel: \"ᱱᱤᱡᱮᱨᱟᱜ ᱱᱤᱛᱤ ᱠᱚ:\",\n hintNothingChosen: \"ᱛᱷᱤᱠ ᱞᱟᱹᱜᱤᱫ ᱠᱚᱢ ᱛᱮ ᱠᱚᱢ ᱢᱤᱫ ᱩᱫᱫᱮᱥᱭ ᱵᱟᱪᱷᱟᱣ ᱢᱮ।\",\n hintNothingEngaged:\n \"ᱟᱢ ᱨᱟᱡᱤ ᱮᱢ ᱠᱟᱱ ᱯᱚᱱᱚᱛ ᱨᱮᱭᱟᱜ ᱩᱫᱫᱮᱥᱭ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ᱟᱨ ᱵᱟᱝ ᱵᱚᱫᱚᱞ ᱢᱮ।\",\n hintRequiredOutstanding: \"ᱛᱷᱤᱠ ᱞᱟᱹᱜᱤᱫ ᱡᱟᱹᱨᱩᱨᱤ ᱩᱫᱫᱮᱥᱭ ᱠᱚ ᱦᱟᱛᱟᱣ ᱢᱮ।\",\n },\n sd: {\n yes: \"ها\",\n no: \"نه\",\n mixed: \"جزوي\",\n savedAnswer: \"محفوظ جواب: {answer}\",\n confirmAcceptAllTitle: \"سڀ مقصد قبول ڪجن؟\",\n confirmAcceptAllDetail:\n \"هن سان هن نوٽيس جي سڀني مقصدن تي رضامندي ڏني ويندي، انهن سميت جيڪي توهان نه چونڊيا.\",\n confirmAcceptSelectedTitle: \"پنهنجي چونڊ جي تصديق ڪجي؟\",\n confirmAcceptSelectedDetail:\n \"صرف توهان جا چونڊيل مقصد راضي طور درج ٿيندا. باقي غير راضي طور درج ٿيندا.\",\n confirmDeclineTitle: \"هي نوٽيس رد ڪجي؟\",\n confirmDeclineDetail:\n \"ڪجهه به راضي طور درج نه ٿيندو، توهان جا چونڊيل مقصد به نه.\",\n otpTitle: \"تصديقي ڪوڊ داخل ڪريو\",\n otpDescription:\n \"گراهڪ کي موڪليل ڪوڊ پڙهڻ لاءِ چئو. تصديق ٿيڻ تائين توهان جي چونڊ بند رهندي.\",\n otpSubmit: \"ڪوڊ جي تصديق ڪريو\",\n otpVerifying: \"تصديق ٿي رهي آهي...\",\n otpFailed: \"اهو ڪوڊ تصديق نه ٿي سگهيو.\",\n productPoliciesLabel: \"رازداري پاليسيون:\",\n hintNothingChosen: \"تصديق لاءِ گهٽ ۾ گهٽ هڪ مقصد چونڊيو.\",\n hintNothingEngaged:\n \"جنهن پراڊڪٽ لاءِ توهان رضامندي ڏئي رهيا آهيو، ان جو مقصد چونڊيو يا تبديل ڪريو.\",\n hintRequiredOutstanding: \"تصديق لاءِ گهربل مقصد قبول ڪريو.\",\n },\n ks: {\n yes: \"آہن\",\n no: \"نہ\",\n mixed: \"جُزوی\",\n savedAnswer: \"محفوظ جواب: {answer}\",\n confirmAcceptAllTitle: \"سٲری مقصد قبول کریو؟\",\n confirmAcceptAllDetail:\n \"یَمہ سان چھ اَمہ اطلاعہ ہٕنٛدین سٲری مقصدن پؠٹھ رضامندی دِیہ یوان، تِم تہٕ یَم توہہِ چھُ نہٕ ژارمُت۔\",\n confirmAcceptSelectedTitle: \"پننہِ ژارِ ہٕنٛز تصدیق کریو؟\",\n confirmAcceptSelectedDetail:\n \"صرف توہنٛدؠ ژارمٕتؠ مقصد ییہ راضی گۄڈنؠ درج کرنہٕ۔ باقی ییہ ناراضی گۄڈنؠ درج کرنہٕ۔\",\n confirmDeclineTitle: \"یہ اطلاع ردٕ کریو؟\",\n confirmDeclineDetail:\n \"کینٛہہ تہِ ییہ نہٕ راضی گۄڈنؠ درج کرنہٕ، توہنٛدؠ ژارمٕتؠ مقصد تہِ نہٕ۔\",\n otpTitle: \"تصدیقی کوڈ دِیو\",\n otpDescription:\n \"گاہکس ونیو زِ سۄ کوڈ پریو یُس بیجنہٕ آو۔ تصدیق گژھنہٕ تام آسِ توہنٛز ژار بند۔\",\n otpSubmit: \"کوڈ ہٕنٛز تصدیق کریو\",\n otpVerifying: \"تصدیق چھِ گژھان...\",\n otpFailed: \"سۄ کوڈ ہیوک نہٕ تصدیق گژھتھ۔\",\n productPoliciesLabel: \"رازداری پالیسی:\",\n hintNothingChosen: \"تصدیقہٕ خٲطرٕ کم از کم اکھ مقصد ژاریو۔\",\n hintNothingEngaged:\n \"یَمہ پراڈکٹس خٲطرٕ توہہِ چھِو رضامندی دِوان، تَمہ ہُنٛد مقصد ژاریو یا بدلاو۔\",\n hintRequiredOutstanding: \"تصدیقہٕ خٲطرٕ ضروری مقصد قبول کریو۔\",\n },\n};\n","import type {\n DpoInfoAudioKey,\n LogoPosition,\n PurposePreselection,\n SelectionControlType,\n} from \"./api/types\";\nimport type { NoticeFontEntry } from \"./types\";\nimport { NOTICE_CHROME_EN } from \"./modal/chromeCopy.data\";\n\n/**\n * The production consent API. Every default in this package resolves here, so\n * no entry point can ship a host of its own -- the public calls used to fall\n * back to a staging constant and wrote consent records there.\n */\nexport const DEFAULT_CONSENT_API_BASE_URL = \"https://api.redacto.io/consent\";\n\nexport const DEFAULT_LOGO_POSITION: LogoPosition = \"left\";\n\n/**\n * English fallbacks for the action buttons, used when the notice config omits\n * a label — an older consent-server, or a notice published before the\n * accept-all shortcut existed.\n */\nexport const DEFAULT_ACCEPT_ALL_BUTTON_TEXT = \"Accept All\";\nexport const DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT = \"Accept Selected\";\nexport const DEFAULT_DECLINE_BUTTON_TEXT = \"Decline\";\n\n/**\n * DOM ids for the footer buttons. `confirm-button-text` and\n * `decline-button-text` predate the accept-all shortcut and are load-bearing\n * for the e2e suite and the TTS highlight sequence — do not rename them.\n */\nexport const ACCEPT_ALL_BUTTON_ID = \"accept-all-button-text\";\nexport const ACCEPT_SELECTED_BUTTON_ID = \"confirm-button-text\";\nexport const DECLINE_BUTTON_ID = \"decline-button-text\";\n\nexport const SUBMITTING_BUTTON_TEXT = \"Submitting...\";\n\n/**\n * `justify-content` for the logo row, keyed by the configured position. The row\n * is full width, so aligning it is the whole of the layout change.\n */\nexport const LOGO_POSITION_JUSTIFY: Record<LogoPosition, string> = {\n left: \"flex-start\",\n center: \"center\",\n right: \"flex-end\",\n};\n\n/** Glyph marking a required data element, and the purpose that carries one. */\nexport const REQUIRED_MARKER_GLYPH = \"*\";\n\nexport const REQUIRED_MARKER_ARIA_LABEL = \"required\";\n\nconst REQUIRED_MARKER_COLOR = \"red\";\n\n/** Gap between the label the marker annotates and the marker itself. */\nconst REQUIRED_MARKER_GAP = \"4px\";\n\nexport const REQUIRED_MARKER_STYLE: Readonly<Record<string, string>> = {\n color: REQUIRED_MARKER_COLOR,\n marginLeft: REQUIRED_MARKER_GAP,\n};\n\nexport const DPO_AUDIO_ELEMENT_MAP: ReadonlyArray<{\n audioKey: DpoInfoAudioKey;\n elementId: string;\n}> = [\n { audioKey: \"grievance_text_audio_url\", elementId: \"dpo-grievance-text\" },\n { audioKey: \"grievance_anchor_text_audio_url\", elementId: \"dpo-grievance-link\" },\n { audioKey: \"grievance_email_connector_text_audio_url\", elementId: \"dpo-grievance-email-connector\" },\n { audioKey: \"grievance_email_audio_url\", elementId: \"dpo-grievance-email\" },\n { audioKey: \"dp_board_text_audio_url\", elementId: \"dpo-dp-board-text\" },\n { audioKey: \"dp_board_anchor_text_audio_url\", elementId: \"dpo-dp-board-link\" },\n { audioKey: \"dpo_text_audio_url\", elementId: \"dpo-dpo-text\" },\n { audioKey: \"dpo_anchor_text_audio_url\", elementId: \"dpo-dpo-link\" },\n] as const;\n\nexport const PURPOSE_STATUS_ACTIVE = \"ACTIVE\";\n\nexport const PRODUCT_SECTION_COPY = {\n toggleSelection: (productName: string, purposeCount: number) =>\n `Toggle all ${purposeCount} purposes for ${productName}`,\n toggleRequired: (productName: string, purposeCount: number) =>\n `Toggle the ${purposeCount} required purposes for ${productName}`,\n settled: (productName: string) => `Already consented to ${productName}`,\n} as const;\n\nexport const CONFIRM_HINT_ID = \"redacto-confirm-hint\";\n\n/**\n * Why \"Accept Selected\" is disabled, in English. The notice reads the\n * translated strings from `noticeChromeCopy`; these are the defaults.\n */\nexport const CONFIRM_HINT_COPY = {\n \"nothing-chosen\": NOTICE_CHROME_EN.hintNothingChosen,\n \"nothing-engaged\": NOTICE_CHROME_EN.hintNothingEngaged,\n \"required-outstanding\": NOTICE_CHROME_EN.hintRequiredOutstanding,\n productsIncomplete: (productNames: string[]) =>\n `Accept the required purposes for ${productNames.join(\", \")} to confirm.`,\n} as const;\n\nexport const DEFAULT_PURPOSE_PRESELECTION: PurposePreselection = \"NONE\";\n\nexport const PURPOSE_STATUS_INACTIVE = \"INACTIVE\";\n\nexport const OTP_GATE_LENGTH = 6;\n\nexport const OTP_GATE_TITLE_ID = \"notice-otp-gate-title\";\n\nexport const OTP_GATE_COPY = {\n title: NOTICE_CHROME_EN.otpTitle,\n description: NOTICE_CHROME_EN.otpDescription,\n submit: NOTICE_CHROME_EN.otpSubmit,\n verifying: NOTICE_CHROME_EN.otpVerifying,\n failed: NOTICE_CHROME_EN.otpFailed,\n} as const;\n\nexport const PRODUCT_POLICIES_LABEL = NOTICE_CHROME_EN.productPoliciesLabel;\n\nexport const DEFAULT_SELECTION_CONTROL: SelectionControlType = \"checkbox\";\n\nexport const SELECTION_CONTROL_ACCENT = \"#4f87ff\";\n\nexport const SELECTION_CONTROL_COPY = {\n onRecord: (answer: string) =>\n NOTICE_CHROME_EN.savedAnswer.replace(\"{answer}\", answer),\n mixed: NOTICE_CHROME_EN.mixed,\n options: [\n { label: NOTICE_CHROME_EN.yes, value: true },\n { label: NOTICE_CHROME_EN.no, value: false },\n ],\n} as const;\n\nexport const CONFIRM_DIALOG_ID = \"redacto-confirm-dialog\";\nexport const CONFIRM_DIALOG_DETAIL_ID = \"redacto-confirm-dialog-detail\";\n\nexport const CONFIRM_DIALOG_COPY = {\n \"accept-all\": {\n title: NOTICE_CHROME_EN.confirmAcceptAllTitle,\n detail: NOTICE_CHROME_EN.confirmAcceptAllDetail,\n },\n \"accept-selected\": {\n title: NOTICE_CHROME_EN.confirmAcceptSelectedTitle,\n detail: NOTICE_CHROME_EN.confirmAcceptSelectedDetail,\n },\n decline: {\n title: NOTICE_CHROME_EN.confirmDeclineTitle,\n detail: NOTICE_CHROME_EN.confirmDeclineDetail,\n },\n confirm: NOTICE_CHROME_EN.yes,\n cancel: NOTICE_CHROME_EN.no,\n} as const;\n\nexport const INHERIT_FONT_FAMILY = \"inherit\";\n\nexport const DEFAULT_NOTICE_FONT_ID = \"arial\";\n\nexport const NOTICE_FONT_GENERIC_FALLBACK = \", sans-serif\";\n\nexport const NOTICE_FONT_CATALOGUE: ReadonlyArray<NoticeFontEntry> = [\n {\n id: \"montserrat\",\n value: \"Montserrat\",\n stack: 'Montserrat, \"Trebuchet MS\", \"Segoe UI\", Arial, sans-serif',\n },\n { id: \"arial\", value: \"Arial\", stack: \"Arial, Helvetica, sans-serif\" },\n {\n id: \"georgia\",\n value: \"Georgia\",\n stack: 'Georgia, \"Times New Roman\", Times, serif',\n },\n {\n id: \"times new roman\",\n value: \"Times New Roman\",\n stack: '\"Times New Roman\", Times, serif',\n },\n {\n id: \"trebuchet ms\",\n value: \"Trebuchet MS\",\n stack: '\"Trebuchet MS\", \"Lucida Sans Unicode\", \"Lucida Grande\", sans-serif',\n },\n { id: \"verdana\", value: \"Verdana\", stack: \"Verdana, Geneva, sans-serif\" },\n];\n\nexport const CSS_FONT_KEYWORDS: ReadonlyArray<string> = [\n \"inherit\",\n \"initial\",\n \"revert\",\n \"revert-layer\",\n \"unset\",\n \"serif\",\n \"sans-serif\",\n \"monospace\",\n \"cursive\",\n \"fantasy\",\n \"system-ui\",\n \"ui-serif\",\n \"ui-sans-serif\",\n \"ui-monospace\",\n \"ui-rounded\",\n \"math\",\n \"emoji\",\n \"fangsong\",\n];\n\nexport const UNSAFE_FONT_CHARACTERS = /[\"';{}\\\\]/g;\n\nexport const NOTICE_FONT_ROOT_ATTRIBUTE = \"data-redacto-notice-font\";\n\nexport const NOTICE_FONT_STYLE_ID = \"redacto-notice-font-styles\";\n\nexport const NOTICE_FONT_CSS = `\n [${NOTICE_FONT_ROOT_ATTRIBUTE}] button,\n [${NOTICE_FONT_ROOT_ATTRIBUTE}] input,\n [${NOTICE_FONT_ROOT_ATTRIBUTE}] optgroup,\n [${NOTICE_FONT_ROOT_ATTRIBUTE}] option,\n [${NOTICE_FONT_ROOT_ATTRIBUTE}] select,\n [${NOTICE_FONT_ROOT_ATTRIBUTE}] textarea {\n font-family: inherit;\n }\n`;\n","import { clearApiCache, getCachedData, setCachedData } from \"../services/cache\";\nimport { decodeTokenSafely } from \"../core/jwt-decode\";\nimport {\n buildAuthHeaders,\n resolveRequestAuth,\n sandboxBodyIdentity,\n sandboxQueryIdentity,\n} from \"./sandbox\";\nimport { toLanguageCode } from \"./language\";\nimport { toSubmitPurposes } from \"./submit-payload\";\nimport { parseApiError } from \"../shared/api-errors\";\nimport { withIdempotencyKey } from \"../shared/idempotency\";\nimport type {\n ConsentContent,\n ConsentEventPayload,\n FetchConsentContentParams,\n FetchConsentContentPublicParams,\n FetchTTSAudioUrlsParams,\n InitiateGuardianVerificationParams,\n InitiateGuardianVerificationResponse,\n SubmitConsentEventParams,\n SubmitConsentEventPublicParams,\n TTSAudioUrlsResponse,\n VerifyGuardianStatusParams,\n VerifyGuardianStatusResponse,\n} from \"./types\";\nimport { DEFAULT_CONSENT_API_BASE_URL } from \"../constants\";\n\nconst BASE_URL = DEFAULT_CONSENT_API_BASE_URL;\n\n// ─── Modal: fetch notice (authenticated, JWT-decoded) ───\n\nexport const fetchConsentContent = async ({\n noticeId,\n accessToken,\n baseUrl,\n language = \"en\",\n specific_uuid,\n validate_against = \"all\",\n include_fully_consented_data = false,\n signal,\n ...sandboxParams\n}: FetchConsentContentParams & { signal?: AbortSignal }): Promise<ConsentContent> => {\n if (!noticeId || !validate_against) {\n throw new Error(\"noticeId is required\");\n }\n if (!accessToken && !sandboxParams.token) {\n throw new Error(\"accessToken or token is required\");\n }\n\n const { organisationUuid: ORG, workspaceUuid: WS, sandbox } = resolveRequestAuth(\n accessToken,\n sandboxParams\n );\n\n const apiBaseUrl = baseUrl || BASE_URL;\n\n // Include org + workspace in the sandbox cache identity so two sessions\n // sharing an identity but scoped to different orgs never collide.\n const cacheIdentity = sandbox\n ? `sandbox:${sandbox.organisationUuid}:${sandbox.workspaceUuid}:${sandbox.ucic || sandbox.email || sandbox.mobile}`\n : accessToken;\n const cacheKey = `${cacheIdentity}-${noticeId}-${validate_against}-${language}-${specific_uuid || \"\"}-${include_fully_consented_data}`;\n\n if (validate_against === \"all\" && !specific_uuid) {\n const cached = getCachedData(cacheKey);\n if (cached) return cached;\n }\n\n const url = new URL(`${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/notices/${noticeId}`);\n if (specific_uuid) url.searchParams.append(\"specific_uuid\", specific_uuid);\n url.searchParams.append(\"validate_against\", validate_against);\n if (include_fully_consented_data) url.searchParams.append(\"include_fully_consented_data\", \"true\");\n // Sandbox mode: the acting identity travels as query params\n // (primary_email / primary_mobile); the credential is the X-Consent-Token header.\n if (sandbox) {\n for (const [key, value] of Object.entries(sandboxQueryIdentity(sandbox))) {\n if (value) url.searchParams.append(key, value);\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...buildAuthHeaders(accessToken, sandbox),\n \"Accept-Language\": language,\n },\n signal,\n });\n\n if (!response.ok) {\n throw await parseApiError(response, \"Could not load the consent notice. Please try again.\");\n }\n\n const data: ConsentContent = await response.json();\n\n if (validate_against === \"all\" && !specific_uuid) {\n setCachedData(cacheKey, data);\n }\n\n return data;\n};\n\n// ─── Inline: fetch notice (public, no auth) ───\n\nexport const fetchConsentContentPublic = async ({\n org_uuid,\n workspace_uuid,\n notice_uuid,\n accessToken,\n baseUrl,\n language = \"en\",\n specific_uuid,\n}: FetchConsentContentPublicParams): Promise<ConsentContent> => {\n const apiBaseUrl = baseUrl || BASE_URL;\n const noticesUrl = `${apiBaseUrl}/public/organisations/${org_uuid}/workspaces/${workspace_uuid}/notices`;\n\n const url = new URL(\n accessToken ? `${noticesUrl}/${notice_uuid}` : `${noticesUrl}/get-notice/${notice_uuid}`\n );\n if (specific_uuid) url.searchParams.append(\"specific_uuid\", specific_uuid);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept-Language\": language,\n ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}),\n },\n });\n\n if (!response.ok) {\n throw await parseApiError(response, \"Could not load the consent notice. Please try again.\");\n }\n\n return await response.json();\n};\n\n// ─── Modal: submit consent (JWT-decoded) ───\n\nexport const submitConsentEvent = async ({\n accessToken,\n baseUrl,\n ledgerBaseUrl,\n noticeUuid,\n purposes,\n declined,\n meta_data,\n guardianVerificationReference,\n selfDeclaredAdult,\n language,\n signal,\n ...sandboxParams\n}: SubmitConsentEventParams & { signal?: AbortSignal }): Promise<void> => {\n if (!noticeUuid || !Array.isArray(purposes)) {\n throw new Error(\"noticeUuid and purposes array are required\");\n }\n if (!accessToken && !sandboxParams.token) {\n throw new Error(\"accessToken or token is required\");\n }\n\n const { organisationUuid: ORG, workspaceUuid: WS, sandbox } = resolveRequestAuth(\n accessToken,\n sandboxParams\n );\n\n // Route the write to the Go ledger when configured; fall back to the consent\n // server so existing integrations that only pass baseUrl keep working.\n const apiBaseUrl = ledgerBaseUrl || baseUrl || BASE_URL;\n\n const payload: ConsentEventPayload = {\n notice_uuid: noticeUuid,\n purposes: toSubmitPurposes(purposes),\n select_all_mandatory: false,\n source: \"WEB\",\n declined: Boolean(declined),\n meta_data: meta_data ? { specific_uuid: meta_data.specific_uuid, minor_age: meta_data.minor_age } : undefined,\n guardian_verification_reference: guardianVerificationReference,\n self_declared_adult: selfDeclaredAdult,\n language: toLanguageCode(language),\n };\n\n // Sandbox mode: merge the acting test identity into the body (the server has\n // no subject header; it namespaces this identity `test::`).\n const requestBody = sandbox ? { ...payload, ...sandboxBodyIdentity(sandbox) } : payload;\n\n const url = `${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/submit-consent`;\n const serialisedBody = JSON.stringify(requestBody);\n\n const response = await withIdempotencyKey(url, serialisedBody, (idempotencyHeaders) =>\n fetch(url, {\n method: \"POST\",\n headers: {\n ...buildAuthHeaders(accessToken, sandbox),\n \"Content-Type\": \"application/json\",\n ...idempotencyHeaders,\n },\n body: serialisedBody,\n signal,\n })\n );\n\n if (!response.ok) {\n throw await parseApiError(response, \"Could not submit your consent. Please try again.\");\n }\n\n clearApiCache();\n};\n\n// ─── Inline: submit consent (direct org/workspace) ───\n\nexport const submitConsentEventPublic = async ({\n org_uuid,\n workspace_uuid,\n accessToken,\n baseUrl,\n ledgerBaseUrl,\n noticeUuid,\n purposes,\n declined,\n meta_data,\n language,\n}: SubmitConsentEventPublicParams): Promise<void> => {\n // Route the write to the Go ledger when configured; fall back to the consent\n // server so existing integrations that only pass baseUrl keep working.\n const apiBaseUrl = ledgerBaseUrl || baseUrl || BASE_URL;\n\n const payload: ConsentEventPayload = {\n notice_uuid: noticeUuid,\n purposes: toSubmitPurposes(purposes),\n select_all_mandatory: false,\n source: \"WEB\",\n declined,\n meta_data,\n language: toLanguageCode(language),\n };\n\n const url = `${apiBaseUrl}/public/organisations/${org_uuid}/workspaces/${workspace_uuid}/submit-consent`;\n const serialisedBody = JSON.stringify(payload);\n\n const response = await withIdempotencyKey(url, serialisedBody, (idempotencyHeaders) =>\n fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n ...idempotencyHeaders,\n },\n body: serialisedBody,\n })\n );\n\n if (!response.ok) {\n throw await parseApiError(response, \"Could not submit your consent. Please try again.\");\n }\n};\n\n// ─── TTS Audio ───\n\nexport const fetchTTSAudioUrls = async ({\n accessToken,\n baseUrl,\n ledgerBaseUrl,\n endpointMode,\n noticeUuid,\n language,\n signal,\n ...sandboxParams\n}: FetchTTSAudioUrlsParams & { signal?: AbortSignal }): Promise<TTSAudioUrlsResponse> => {\n if ((!accessToken && !sandboxParams.token) || !noticeUuid || !language) {\n throw new Error(\"accessToken (or token), noticeUuid, and language are required\");\n }\n\n const { organisationUuid: ORG, workspaceUuid: WS, sandbox } = resolveRequestAuth(\n accessToken,\n sandboxParams\n );\n\n // Prefer the Go ledger for audio. Outside host mode a sandbox session stays\n // on the consent server, as in earlier releases; in host mode the ledger\n // serves sandbox audio too.\n const ledgerServesAudio = !sandbox || endpointMode === \"host\";\n const apiBaseUrl = (ledgerServesAudio ? ledgerBaseUrl : null) || baseUrl || BASE_URL;\n const url = new URL(\n `${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/notices/${noticeUuid}/audio/${language}`\n );\n // Sandbox mode: the acting identity travels as query params\n // (primary_email / primary_mobile); the credential is the X-Consent-Token header.\n if (sandbox) {\n for (const [key, value] of Object.entries(sandboxQueryIdentity(sandbox))) {\n if (value) url.searchParams.append(key, value);\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...buildAuthHeaders(accessToken, sandbox),\n Accept: \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw await parseApiError(response, \"Could not load audio narration. Please try again.\");\n }\n\n return await response.json();\n};\n\n// ─── Guardian Verification ───\n\nexport const initiateGuardianVerification = async ({\n accessToken,\n baseUrl,\n guardianName,\n guardianContact,\n guardianRelationship,\n frontendCallbackUrl,\n metadata,\n signal,\n}: InitiateGuardianVerificationParams): Promise<InitiateGuardianVerificationResponse> => {\n // Guardian verification is JWT-only: sandbox sessions have no minor-notice /\n // guardian support (the server 403s them, and C1 blocks minor notices at\n // render), so no sandbox identity is wired through here.\n if (!accessToken) throw new Error(\"accessToken is required\");\n if (!guardianName?.trim()) throw new Error(\"Guardian name is required\");\n if (!guardianContact?.trim()) throw new Error(\"Guardian contact is required\");\n if (!guardianRelationship?.trim()) throw new Error(\"Guardian relationship is required\");\n\n const decodedToken = decodeTokenSafely(accessToken);\n if (!decodedToken) throw new Error(\"Invalid access token\");\n const { organisation_uuid: ORG, workspace_uuid: WS } = decodedToken;\n if (!ORG || !WS) throw new Error(\"Invalid token: missing organization or workspace UUID\");\n\n const apiBaseUrl = baseUrl || BASE_URL;\n\n const payload: Record<string, any> = {\n guardian_name: guardianName.trim(),\n guardian_contact: guardianContact.trim(),\n guardian_relationship: guardianRelationship.trim(),\n };\n if (frontendCallbackUrl) payload.frontend_callback_url = frontendCallbackUrl;\n if (metadata) payload.metadata = metadata;\n\n const response = await fetch(\n `${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/guardian/initiate-verification`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n signal,\n }\n );\n\n if (!response.ok) {\n throw await parseApiError(response, \"Could not start guardian verification. Please try again.\");\n }\n\n const responseData = await response.json();\n const detail = responseData.detail || responseData;\n\n if (detail.already_verified) {\n return {\n success: true,\n guardian_info_uuid: detail.guardian_info_uuid,\n already_verified: true,\n verification_reference: detail.verification_reference,\n };\n }\n\n if (!detail.session_token || !detail.digilocker_redirect_url) {\n throw new Error(\"Invalid response: missing session_token or digilocker_redirect_url\");\n }\n\n return {\n success: detail.success ?? true,\n guardian_info_uuid: detail.guardian_info_uuid,\n already_verified: false,\n session_token: detail.session_token,\n digilocker_redirect_url: detail.digilocker_redirect_url,\n expires_at: detail.expires_at,\n };\n};\n\nexport const verifyGuardianStatus = async ({\n accessToken,\n baseUrl,\n sessionToken,\n signal,\n}: VerifyGuardianStatusParams): Promise<VerifyGuardianStatusResponse> => {\n // Guardian verification is JWT-only: sandbox sessions have no minor-notice /\n // guardian support (the server 403s them, and C1 blocks minor notices at\n // render), so no sandbox identity is wired through here.\n if (!accessToken || !sessionToken) {\n throw new Error(\"accessToken and sessionToken are required\");\n }\n\n const decodedToken = decodeTokenSafely(accessToken);\n if (!decodedToken) throw new Error(\"Invalid access token\");\n const { organisation_uuid: ORG, workspace_uuid: WS } = decodedToken;\n if (!ORG || !WS) throw new Error(\"Invalid token: missing organization or workspace UUID\");\n\n const apiBaseUrl = baseUrl || BASE_URL;\n\n const response = await fetch(\n `${apiBaseUrl}/public/organisations/${ORG}/workspaces/${WS}/guardian/verify-status`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ session_token: sessionToken }),\n signal,\n }\n );\n\n if (!response.ok) {\n throw await parseApiError(response, \"Could not check verification status. Please try again.\");\n }\n\n const responseData = await response.json();\n const detail = responseData.detail || responseData;\n\n return {\n status: detail.status ?? \"in_progress\",\n guardian_info_uuid: detail.guardian_info_uuid ?? null,\n verification_reference: detail.verification_reference ?? null,\n guardian_details: detail.guardian_details ?? null,\n error: detail.error ?? null,\n error_code: detail.error_code ?? null,\n can_retry: detail.can_retry ?? true,\n };\n};\n","import { decodeTokenSafely } from \"../core/jwt-decode\";\nimport type {\n ConsentContent,\n DataElementSelection,\n FetchNoticeConsentStatusForScopeParams,\n FetchNoticeConsentStatusParams,\n LedgerConsentOverlay,\n NoticeConsentStatusResponse,\n PurposeSelection,\n} from \"./types\";\n\n/**\n * Go-ledger notice `check-consent` read.\n *\n * Post-cutover, consent records live in the Go ledger, so Python's notice\n * validation (which powered the 409 CONSENT_ALREADY_PROVIDED and the\n * `purpose_selections` / `reconsent_required` overlay) reads an empty consent\n * DB. When a `ledgerBaseUrl` is configured, the modal and the inline embed ask\n * the ledger directly instead.\n *\n * Every failure mode (no ledger configured, undecodable token, non-OK\n * response, network/abort/parse error) degrades to `null` so callers fall\n * back to the legacy Python-driven flow.\n */\n\n/**\n * Fetch the principal's current consent status for a notice from the Go\n * ledger (`check-consent`), with org/workspace supplied explicitly. The\n * principal resolves from the bearer token server-side, so the body is empty.\n * Returns null on any failure so the caller can fall back to the legacy flow.\n */\nexport const fetchNoticeConsentStatusForScope = async ({\n accessToken,\n ledgerBaseUrl,\n organisationUuid,\n workspaceUuid,\n noticeUuid,\n signal,\n}: FetchNoticeConsentStatusForScopeParams): Promise<NoticeConsentStatusResponse | null> => {\n if (!accessToken || !ledgerBaseUrl || !organisationUuid || !workspaceUuid || !noticeUuid) {\n return null;\n }\n\n try {\n const response = await fetch(\n `${ledgerBaseUrl}/public/organisations/${organisationUuid}/workspaces/${workspaceUuid}/notices/${noticeUuid}/check-consent`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: \"{}\",\n signal,\n }\n );\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as\n | NoticeConsentStatusResponse\n | { detail?: NoticeConsentStatusResponse };\n // The ledger returns the response directly; tolerate a {detail} envelope too.\n const body =\n data && typeof data === \"object\" && \"detail\" in data && data.detail\n ? data.detail\n : (data as NoticeConsentStatusResponse);\n\n if (!body || !Array.isArray(body.purposes)) return null;\n return body;\n } catch {\n // Network / abort / parse failure — degrade to the legacy Python flow.\n return null;\n }\n};\n\n/**\n * Same read, resolving org/workspace by decoding the JWT (the modal's tokens\n * carry them). Returns null on any failure.\n */\nexport const fetchNoticeConsentStatus = async ({\n accessToken,\n ledgerBaseUrl,\n noticeUuid,\n signal,\n}: FetchNoticeConsentStatusParams): Promise<NoticeConsentStatusResponse | null> => {\n if (!accessToken || !ledgerBaseUrl || !noticeUuid) return null;\n\n const decodedToken = decodeTokenSafely(accessToken);\n if (!decodedToken) return null;\n\n const { organisation_uuid: ORG, workspace_uuid: WS } = decodedToken;\n if (!ORG || !WS) return null;\n\n return fetchNoticeConsentStatusForScope({\n accessToken,\n ledgerBaseUrl,\n organisationUuid: ORG,\n workspaceUuid: WS,\n noticeUuid,\n signal,\n });\n};\n\n/**\n * Whether the principal has already fully consented to this notice with no\n * reconsent needed — the ledger equivalent of Python's 409\n * `CONSENT_ALREADY_PROVIDED`. Requires an active consent record with every\n * mandatory purpose still ACTIVE.\n */\nexport const isNoticeFullyConsented = (status: NoticeConsentStatusResponse): boolean =>\n status.consented && status.all_mandatory_active;\n\n/**\n * Translate the ledger's notice consent status into the\n * `{ purpose_selections, reconsent_required }` shape the modal already\n * consumes, so prior-consent pre-fill and reconsent categorization work off\n * the ledger. Returns null for a first-time principal (no consent record —\n * every purpose INACTIVE), preserving the normal first-time consent flow.\n *\n * `needs_reconsent` is derived from `status` (anything not ACTIVE needs\n * reconsent: expired / withdrawn / declined / inactive). NOTE: notice-version\n * reconsent is NOT covered — the ledger's check-consent has no version\n * awareness yet, so a republished-notice version bump won't re-prompt until\n * that lands on the ledger (tracked fast-follow).\n */\nexport const buildLedgerConsentOverlay = (\n status: NoticeConsentStatusResponse,\n configPurposes: ConsentContent[\"detail\"][\"active_config\"][\"purposes\"]\n): LedgerConsentOverlay | null => {\n const byUuid = new Map(status.purposes.map((p) => [p.uuid, p]));\n const hasHistory = status.purposes.some((p) => (p.status || \"INACTIVE\") !== \"INACTIVE\");\n if (!hasHistory) return null;\n\n const purpose_selections: Record<string, PurposeSelection> = {};\n for (const cp of configPurposes) {\n const lp = byUuid.get(cp.uuid);\n const purposeStatus = lp?.status || \"INACTIVE\";\n const selectedByUuid = new Map((lp?.data_elements || []).map((de) => [de.uuid, de.selected]));\n const data_elements: Record<string, DataElementSelection> = {};\n for (const de of cp.data_elements) {\n data_elements[de.uuid] = {\n selected: selectedByUuid.get(de.uuid) ?? false,\n enabled: de.enabled,\n required: de.required,\n };\n }\n purpose_selections[cp.uuid] = {\n selected: lp?.selected ?? false,\n status: purposeStatus,\n needs_reconsent: purposeStatus !== \"ACTIVE\",\n data_elements: purposeStatus === \"INACTIVE\" ? {} : data_elements,\n };\n }\n\n const reconsent_required = configPurposes.some(\n (cp) => (purpose_selections[cp.uuid]?.status || \"INACTIVE\") !== \"ACTIVE\"\n );\n return { reconsent_required, purpose_selections };\n};\n","/**\n * Turns the public `baseUrl` / `ledgerBaseUrl` options into the consent server\n * and ledger URLs the API functions take.\n *\n * Host mode: `baseUrl` is the API host (`https://api.redacto.io`). The consent\n * server is `{host}/consent` and the ledger `{host}/consent-ledger`; a\n * `ledgerBaseUrl` passed alongside the host is ignored.\n *\n * Legacy mode: `baseUrl` is omitted, is the consent server URL (`…/consent`)\n * earlier releases documented, or is not an absolute URL. Both values pass\n * through untouched, so every request is the one earlier releases sent,\n * including the default host when `baseUrl` is omitted.\n */\n\nconst CONSENT_SERVICE_PATH = \"/consent\";\nconst LEDGER_SERVICE_PATH = \"/consent-ledger\";\n\nexport type EndpointMode = \"host\" | \"legacy\";\n\nexport type ResolvedEndpoints =\n | { mode: \"host\"; baseUrl: string; ledgerBaseUrl: string }\n | { mode: \"legacy\"; baseUrl: string | undefined; ledgerBaseUrl: string | undefined };\n\n/**\n * An absolute http(s) URL: scheme, authority, optional path. A string match\n * rather than `new URL(...)` so the check is the same in every runtime.\n */\nconst ABSOLUTE_HTTP_URL = /^https?:\\/\\/[^\\s/?#]+(?:\\/[^\\s?#]*)?$/i;\n\nconst withoutTrailingSlash = (value: string): string => value.trim().replace(/\\/+$/, \"\");\n\nexport const resolveEndpoints = (\n baseUrl?: string,\n ledgerBaseUrl?: string\n): ResolvedEndpoints => {\n const trimmed = withoutTrailingSlash(baseUrl ?? \"\");\n if (!ABSOLUTE_HTTP_URL.test(trimmed) || trimmed.endsWith(CONSENT_SERVICE_PATH)) {\n return { mode: \"legacy\", baseUrl, ledgerBaseUrl };\n }\n\n const host = trimmed.endsWith(LEDGER_SERVICE_PATH)\n ? trimmed.slice(0, -LEDGER_SERVICE_PATH.length)\n : trimmed;\n return {\n mode: \"host\",\n baseUrl: `${host}${CONSENT_SERVICE_PATH}`,\n ledgerBaseUrl: `${host}${LEDGER_SERVICE_PATH}`,\n };\n};\n\nconst DEPRECATION_WARNINGS = {\n omittedBaseUrl:\n \"[Redacto] No baseUrl was passed, so requests go to the built-in production API. Pass baseUrl, the Redacto API host for your environment.\",\n consentServerBaseUrl:\n \"[Redacto] A baseUrl ending in /consent is deprecated. Pass the Redacto API host instead; the SDK reaches the consent server and the ledger under it.\",\n ledgerBaseUrl:\n \"[Redacto] ledgerBaseUrl is deprecated. Pass the Redacto API host as baseUrl instead; the SDK then reaches the consent server and the ledger under it.\",\n ledgerIgnored:\n \"[Redacto] ledgerBaseUrl is ignored because baseUrl is the API host; the SDK reaches the ledger under that host. Remove ledgerBaseUrl.\",\n privacyCenterSlug:\n \"[Redacto] slug is deprecated. Pass organisationUuid to privacyCenter() instead; slug will be removed in a future major release.\",\n} as const;\n\ntype DeprecationWarning = keyof typeof DEPRECATION_WARNINGS;\n\nconst issuedWarnings = new Set<DeprecationWarning>();\n\nconst warnOnce = (warning: DeprecationWarning): void => {\n if (issuedWarnings.has(warning)) return;\n issuedWarnings.add(warning);\n try {\n console.warn(DEPRECATION_WARNINGS[warning]);\n } catch {\n // A host page that stubs out the console must not break the notice.\n }\n};\n\n/** Reports, once per page load, that the Privacy Center was given a slug. */\nexport const warnDeprecatedPrivacyCenterSlug = (slug?: string): void => {\n if (slug?.trim()) warnOnce(\"privacyCenterSlug\");\n};\n\n/**\n * {@link resolveEndpoints} for an entry point's public options, reporting a\n * deprecated configuration once per kind on the console. Never throws.\n */\nexport const resolveEndpointOptions = (\n baseUrl?: string,\n ledgerBaseUrl?: string\n): ResolvedEndpoints => {\n // Only an omitted or empty baseUrl falls back to the default host.\n if (!baseUrl) warnOnce(\"omittedBaseUrl\");\n else if (withoutTrailingSlash(baseUrl).endsWith(CONSENT_SERVICE_PATH)) {\n warnOnce(\"consentServerBaseUrl\");\n }\n const resolved = resolveEndpoints(baseUrl, ledgerBaseUrl);\n if (ledgerBaseUrl?.trim()) {\n warnOnce(resolved.mode === \"host\" ? \"ledgerIgnored\" : \"ledgerBaseUrl\");\n }\n return resolved;\n};\n","/**\n * Every colour the console can set on a notice, in the order the server's\n * `NoticeAppearanceColorsIn` declares them. Keys outside this list are ignored,\n * so a newer console never breaks an older SDK.\n */\nexport const NOTICE_COLOR_KEYS = [\n \"background\",\n \"surface\",\n \"heading\",\n \"text\",\n \"muted_text\",\n \"link\",\n \"border\",\n \"overlay\",\n \"accept_all_bg\",\n \"accept_all_text\",\n \"accept_bg\",\n \"accept_text\",\n \"decline_bg\",\n \"decline_text\",\n \"decline_border\",\n \"language_bg\",\n \"language_text\",\n \"language_selected_bg\",\n \"language_selected_text\",\n \"toggle_on\",\n \"toggle_off\",\n \"toggle_knob\",\n \"tts_highlight_bg\",\n \"tts_highlight_text\",\n] as const;\n\nexport const NOTICE_SELECTION_CONTROLS = [\"checkbox\", \"radio\", \"dropdown\"] as const;\n\n/** How checkbox rows are drawn: native checkboxes, or switches. */\nexport const NOTICE_CONTROL_STYLES = [\"checkbox\", \"switch\"] as const;\n\n/** Mirrors the server's clamp, so a hand-edited value still draws sensibly. */\nexport const NOTICE_RADIUS_MIN = 0;\nexport const NOTICE_RADIUS_MAX = 28;\n\n/** Phones: a centred modal, or a sheet docked to the bottom edge. */\nexport const NOTICE_MOBILE_LAYOUTS = [\"modal\", \"sheet\"] as const;\n\n/** Where the notice sits on wider screens. */\nexport const NOTICE_DESKTOP_POSITIONS = [\n \"center\",\n \"bottom-right\",\n \"bottom-left\",\n \"bottom-bar\",\n] as const;\n\n/** The page behind the notice: dimmed with `colors.overlay`, or left as is. */\nexport const NOTICE_BACKDROPS = [\"dim\", \"none\"] as const;\n\n/** Phone footer: three stacked buttons, or Accept All over the other two. */\nexport const NOTICE_PHONE_FOOTERS = [\"stacked\", \"paired\"] as const;\n\nexport const NOTICE_TEXT_SCALES = [\"sm\", \"md\", \"lg\"] as const;\n\nexport const DEFAULT_TEXT_SCALE = \"md\";\n\nexport const DEFAULT_DESKTOP_POSITION = \"center\";\n\n/** Multiplies every text size the notice draws. */\nexport const NOTICE_TEXT_SCALE_FACTORS = {\n sm: 0.92,\n md: 1,\n lg: 1.1,\n} as const;\n\n/** Desktop card width, in px; mirrors the server's clamp. */\nexport const NOTICE_WIDTH_MIN = 320;\nexport const NOTICE_WIDTH_MAX = 960;\n\n/** Logo height, in px; mirrors the server's clamp. */\nexport const NOTICE_LOGO_SIZE_MIN = 16;\nexport const NOTICE_LOGO_SIZE_MAX = 96;\n\n/**\n * The admin's custom CSS is refused whole when it is longer than this or\n * carries one of these tokens, the same guard the server and the cookie banner\n * apply. Checked again here in case something other than the console wrote it.\n */\nexport const NOTICE_CUSTOM_CSS_MAX_LENGTH = 20000;\nexport const NOTICE_DISALLOWED_CSS_TOKENS = [\n \"</style\",\n \"@import\",\n \"javascript:\",\n \"expression(\",\n \"behavior:\",\n] as const;\n\n/** The at-rule that keeps an admin's custom CSS inside the element it styles. */\nexport const CSS_SCOPE_AT_RULE = \"@scope\";\n\n/** Characters escaped inside a quoted CSS attribute value. */\nexport const CSS_STRING_SPECIALS_RE = /[\"\\\\\\n]/g;\n\n/**\n * A CSS escape: `\\` and up to six hex digits (one optional trailing\n * whitespace, where `\\r\\n` counts as one), or `\\` and any literal character.\n * Decoded before the token scan, since a tokenizer reads `@im\\70 ort` as\n * `@import`.\n */\nexport const CSS_ESCAPE_RE =\n /\\\\([0-9a-f]{1,6})(?:\\r\\n|[ \\t\\r\\n\\f])?|\\\\([\\s\\S])/gi;\n\n/** Each CSS block opener and the closer that must end it. */\nexport const CSS_BRACKET_PAIRS: Readonly<Record<string, string>> = {\n \"{\": \"}\",\n \"(\": \")\",\n \"[\": \"]\",\n};\nexport const CSS_CLOSING_BRACKETS: ReadonlyArray<string> =\n Object.values(CSS_BRACKET_PAIRS);\n\n/** The characters that open a CSS string, and the newlines that end one early. */\nexport const CSS_QUOTES: ReadonlyArray<string> = ['\"', \"'\"];\nexport const CSS_NEWLINES: ReadonlyArray<string> = [\"\\n\", \"\\r\", \"\\f\"];\n\n/** What a CSS escape of NULL, a surrogate or an out-of-range code decodes to. */\nexport const CSS_REPLACEMENT_CHARACTER = \"\\uFFFD\";\nexport const MAX_CODE_POINT = 0x10ffff;\nexport const HEX_RADIX = 16;\nexport const SURROGATE_MIN = 0xd800;\nexport const SURROGATE_MAX = 0xdfff;\n\n/** Served colours are hex only: `#RGB`, `#RRGGBB` or `#RRGGBBAA`. */\nexport const NOTICE_HEX_COLOR_RE = /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n\n/** The talkback highlight every platform draws when the admin sets none. */\nexport const DEFAULT_TTS_HIGHLIGHT_BG = \"#FFF9C4\";\n\n/**\n * Custom properties the notice root sets from the console palette. The injected\n * stylesheet reads each with its classic value as the fallback, so a notice\n * whose admin set no colour renders exactly as before.\n */\nexport const NOTICE_THEME_VARS = {\n accent: \"--redacto-accent\",\n controlOff: \"--redacto-control-off\",\n knob: \"--redacto-toggle-knob\",\n ttsBackground: \"--redacto-tts-bg\",\n ttsText: \"--redacto-tts-text\",\n} as const;\n\n// Each palette colour as the injected stylesheet reads it, falling back to the\n// value classic always drew with.\nexport const THEMED_ACCENT = `var(${NOTICE_THEME_VARS.accent}, #4f87ff)`;\nexport const THEMED_CONTROL_OFF = `var(${NOTICE_THEME_VARS.controlOff}, #d0d5dd)`;\nexport const THEMED_TTS_BACKGROUND = `var(${NOTICE_THEME_VARS.ttsBackground}, ${DEFAULT_TTS_HIGHLIGHT_BG})`;\n\n/** Present on the notice root only when the admin set a talkback text colour. */\nexport const TTS_TEXT_ATTRIBUTE = \"data-redacto-tts-text\";\n","import { NOTICE_THEME_VARS, TTS_TEXT_ATTRIBUTE } from \"./constants\";\nimport type { NoticeAppearanceColors } from \"./types\";\n\n/**\n * The talkback highlight the console set, as the custom properties the\n * injected highlight rules read. Empty when the admin set none, so the rules\n * fall back to the default highlight every platform draws.\n */\nexport const buildTtsCssVariables = (\n colors: NoticeAppearanceColors,\n): Record<string, string> =>\n Object.fromEntries(\n [\n [NOTICE_THEME_VARS.ttsBackground, colors.tts_highlight_bg],\n [NOTICE_THEME_VARS.ttsText, colors.tts_highlight_text],\n ].filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n\n/** Switches on the highlight text rule, which classic leaves off entirely. */\nexport const buildTtsRootAttributes = (\n colors: NoticeAppearanceColors,\n): Readonly<Record<string, string>> =>\n colors.tts_highlight_text ? { [TTS_TEXT_ATTRIBUTE]: \"\" } : {};\n","import {\n CSS_BRACKET_PAIRS,\n CSS_CLOSING_BRACKETS,\n CSS_ESCAPE_RE,\n CSS_NEWLINES,\n CSS_QUOTES,\n CSS_REPLACEMENT_CHARACTER,\n HEX_RADIX,\n MAX_CODE_POINT,\n NOTICE_CUSTOM_CSS_MAX_LENGTH,\n NOTICE_DISALLOWED_CSS_TOKENS,\n SURROGATE_MAX,\n SURROGATE_MIN,\n} from \"./constants\";\n\n/** Resolves CSS escapes the way a tokenizer does, so a token check sees through them. */\nconst decodeCssEscapes = (value: string): string =>\n value.replace(\n CSS_ESCAPE_RE,\n (_match, hex: string | undefined, literal: string) => {\n if (hex === undefined) {\n return literal;\n }\n const codePoint = Number.parseInt(hex, HEX_RADIX);\n if (\n codePoint === 0 ||\n codePoint > MAX_CODE_POINT ||\n (codePoint >= SURROGATE_MIN && codePoint <= SURROGATE_MAX)\n ) {\n return CSS_REPLACEMENT_CHARACTER;\n }\n return String.fromCodePoint(codePoint);\n },\n );\n\n/**\n * Whether every `{`, `(` and `[` is closed by its own partner, in order,\n * reading the CSS the way a tokenizer does: brackets inside comments, strings\n * and escapes don't count. The notice wraps the CSS in an `@scope` block, so a\n * stray `}` would close that block and let the rules after it style the host\n * page. A string a newline cuts short, or a comment or string left open, is\n * refused too, since the browser would read the brackets after it differently.\n */\nconst hasBalancedBlocks = (css: string): boolean => {\n const open: string[] = [];\n let quote: string | undefined;\n let inComment = false;\n for (let index = 0; index < css.length; index += 1) {\n const char = css[index];\n if (inComment) {\n if (char === \"*\" && css[index + 1] === \"/\") {\n inComment = false;\n index += 1;\n }\n } else if (char === \"\\\\\") {\n index += 1;\n } else if (quote) {\n if (char === quote) {\n quote = undefined;\n } else if (CSS_NEWLINES.includes(char)) {\n return false;\n }\n } else if (char === \"/\" && css[index + 1] === \"*\") {\n inComment = true;\n index += 1;\n } else if (CSS_QUOTES.includes(char)) {\n quote = char;\n } else if (char in CSS_BRACKET_PAIRS) {\n open.push(CSS_BRACKET_PAIRS[char]);\n } else if (CSS_CLOSING_BRACKETS.includes(char) && open.pop() !== char) {\n return false;\n }\n }\n return open.length === 0 && !quote && !inComment;\n};\n\n/**\n * The server's custom CSS guard: within the length cap, balanced so it stays\n * inside the notice's `@scope`, and free of every disallowed token both as\n * written and once escapes are decoded.\n */\nexport const isSafeCustomCss = (css: string): boolean => {\n if (css.length > NOTICE_CUSTOM_CSS_MAX_LENGTH || !hasBalancedBlocks(css)) {\n return false;\n }\n const lowered = css.toLowerCase();\n const decoded = decodeCssEscapes(css).toLowerCase();\n return NOTICE_DISALLOWED_CSS_TOKENS.every(\n (token) => !lowered.includes(token) && !decoded.includes(token),\n );\n};\n","import type { AppearanceDefinition, AppearanceLayout, AppearanceStyle } from \"./types\";\n\nexport const DEFAULT_APPEARANCE: AppearanceStyle = \"classic\";\n\n/**\n * Set on each appearance's root element (and on anything portalled outside it)\n * so appearance stylesheets can scope every rule and never reach classic.\n */\nexport const APPEARANCE_ATTRIBUTE = \"data-redacto-appearance\";\n\n/**\n * Marks the notice's own roots. The notice and the Privacy Center share the\n * appearance attribute, so each one's glass stylesheet uses this to keep its\n * rules off the other when both render on one page.\n */\nexport const NOTICE_ROOT_ATTRIBUTE = \"data-redacto-notice\";\n\nconst CLASSIC_LAYOUT: AppearanceLayout = {\n sheet: false,\n collapsibleSections: false,\n switchControl: false,\n pairedFooter: false,\n loaderPill: false,\n sheetOverlays: false,\n};\n\nexport const APPEARANCES: Readonly<Record<AppearanceStyle, AppearanceDefinition>> = {\n classic: { layout: CLASSIC_LAYOUT },\n // Minimal and soft restyle classic's surfaces and keep its layout.\n minimal: { layout: CLASSIC_LAYOUT },\n soft: { layout: CLASSIC_LAYOUT },\n glass: {\n layout: {\n sheet: true,\n collapsibleSections: true,\n // Checkboxes until the admin (or the host) picks switches, in every style.\n switchControl: false,\n pairedFooter: true,\n loaderPill: true,\n sheetOverlays: true,\n },\n },\n};\n\nexport const isAppearance = (value: unknown): value is AppearanceStyle =>\n typeof value === \"string\" &&\n Object.prototype.hasOwnProperty.call(APPEARANCES, value);\n\n/**\n * Falls back to classic for anything unrecognised, so a typo or a value from a\n * newer SDK never breaks the host page.\n */\nexport const resolveAppearance = (value: unknown): AppearanceStyle =>\n isAppearance(value) ? value : DEFAULT_APPEARANCE;\n\nexport const getAppearanceLayout = (appearance: AppearanceStyle): AppearanceLayout =>\n APPEARANCES[appearance].layout;\n","import { DEFAULT_DESKTOP_POSITION } from \"./constants\";\nimport { getAppearanceLayout } from \"./registry\";\nimport type { ResolvedNoticeAppearance, ResolvedNoticeLayout } from \"./types\";\n\n/**\n * The notice's layout: each choice the console or the host made, else the\n * style's own default (glass docks as a sheet with collapsible sections and a\n * paired footer; the other styles keep classic's layout). Every style keeps\n * checkboxes until switches are asked for.\n */\nexport const resolveNoticeLayout = (\n appearance: ResolvedNoticeAppearance,\n): ResolvedNoticeLayout => {\n const defaults = getAppearanceLayout(appearance.style);\n return {\n mobileSheet: appearance.mobileLayout\n ? appearance.mobileLayout === \"sheet\"\n : defaults.sheet,\n desktopPosition: appearance.desktopPosition ?? DEFAULT_DESKTOP_POSITION,\n dimBackdrop: appearance.backdrop !== \"none\",\n collapsibleSections:\n appearance.collapsibleSections ?? defaults.collapsibleSections,\n pairedFooter: appearance.phoneFooter\n ? appearance.phoneFooter === \"paired\"\n : defaults.pairedFooter,\n switchControl: appearance.controlStyle\n ? appearance.controlStyle === \"switch\"\n : defaults.switchControl,\n motion: appearance.motion ?? true,\n };\n};\n","import {\n NOTICE_BACKDROPS,\n NOTICE_COLOR_KEYS,\n NOTICE_CONTROL_STYLES,\n NOTICE_DESKTOP_POSITIONS,\n NOTICE_HEX_COLOR_RE,\n NOTICE_LOGO_SIZE_MAX,\n NOTICE_LOGO_SIZE_MIN,\n NOTICE_MOBILE_LAYOUTS,\n NOTICE_PHONE_FOOTERS,\n NOTICE_RADIUS_MAX,\n NOTICE_RADIUS_MIN,\n NOTICE_SELECTION_CONTROLS,\n NOTICE_TEXT_SCALES,\n NOTICE_WIDTH_MAX,\n NOTICE_WIDTH_MIN,\n} from \"./constants\";\nimport { isSafeCustomCss } from \"./customCss\";\nimport { resolveAppearance } from \"./registry\";\nimport type {\n NoticeAppearance,\n NoticeAppearanceColors,\n ResolvedNoticeAppearance,\n} from \"./types\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst pickColors = (raw: unknown): NoticeAppearanceColors => {\n if (!isRecord(raw)) {\n return {};\n }\n const colors: NoticeAppearanceColors = {};\n for (const key of NOTICE_COLOR_KEYS) {\n const value = raw[key];\n if (typeof value === \"string\" && NOTICE_HEX_COLOR_RE.test(value)) {\n colors[key] = value;\n }\n }\n return colors;\n};\n\n/** A number clamped into range as a px length; anything else is unset. */\nconst pickPx = (raw: unknown, min: number, max: number): string | undefined => {\n if (typeof raw !== \"number\" || !Number.isFinite(raw)) {\n return undefined;\n }\n return `${Math.min(max, Math.max(min, Math.round(raw)))}px`;\n};\n\n/** One of `options`, or unset. */\nconst pickOption = <T extends string>(\n options: ReadonlyArray<T>,\n raw: unknown,\n): T | undefined => options.find((option) => option === raw);\n\nconst pickBoolean = (raw: unknown): boolean | undefined =>\n typeof raw === \"boolean\" ? raw : undefined;\n\nconst pickCustomCss = (raw: unknown): string | undefined =>\n typeof raw === \"string\" && raw.trim() && isSafeCustomCss(raw)\n ? raw\n : undefined;\n\n/**\n * Validates `active_config.appearance` into what components paint with. The\n * server already normalises it, but an older ledger row, a proxy or a hand edit\n * can still serve junk, and a notice must render whatever arrives: anything\n * unrecognised is dropped, and a missing value leaves the classic default.\n */\nexport const resolveNoticeAppearance = (\n raw: NoticeAppearance | null | undefined,\n): ResolvedNoticeAppearance => {\n const appearance = isRecord(raw) ? raw : {};\n return {\n style: resolveAppearance(appearance.style),\n colors: pickColors(appearance.colors),\n radius: pickPx(\n appearance.border_radius,\n NOTICE_RADIUS_MIN,\n NOTICE_RADIUS_MAX,\n ),\n selectionControl: pickOption(\n NOTICE_SELECTION_CONTROLS,\n appearance.selection_control,\n ),\n controlStyle: pickOption(NOTICE_CONTROL_STYLES, appearance.control_style),\n confirmBeforeSubmit: appearance.confirm_before_submit === true,\n mobileLayout: pickOption(NOTICE_MOBILE_LAYOUTS, appearance.mobile_layout),\n desktopPosition: pickOption(\n NOTICE_DESKTOP_POSITIONS,\n appearance.desktop_position,\n ),\n backdrop: pickOption(NOTICE_BACKDROPS, appearance.backdrop),\n collapsibleSections: pickBoolean(appearance.collapsible_sections),\n phoneFooter: pickOption(NOTICE_PHONE_FOOTERS, appearance.phone_footer),\n autoDark: appearance.auto_dark === true,\n darkColors: pickColors(appearance.dark_colors),\n maxWidth: pickPx(appearance.max_width, NOTICE_WIDTH_MIN, NOTICE_WIDTH_MAX),\n logoSize: pickPx(\n appearance.logo_size,\n NOTICE_LOGO_SIZE_MIN,\n NOTICE_LOGO_SIZE_MAX,\n ),\n textScale: pickOption(NOTICE_TEXT_SCALES, appearance.text_scale),\n motion: pickBoolean(appearance.motion),\n customCss: pickCustomCss(appearance.custom_css),\n };\n};\n\n/**\n * The palette to paint with: the dark one while the device prefers a dark\n * scheme and the admin turned automatic dark mode on with a dark palette set.\n * The dark palette replaces the light one whole, so a light colour never\n * leaks onto a dark surface.\n */\nexport const withColorScheme = (\n appearance: ResolvedNoticeAppearance,\n prefersDark: boolean,\n): ResolvedNoticeAppearance =>\n appearance.autoDark &&\n prefersDark &&\n Object.keys(appearance.darkColors).length > 0\n ? { ...appearance, colors: appearance.darkColors }\n : appearance;\n","import type { Rgba } from \"./types\";\n\nconst HEX_RE = /^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst NUM = String.raw`(\\d+(?:\\.\\d+)?|\\.\\d+)`;\n// Each channel is a number or a percentage, as CSS allows.\nconst RGB_RE = new RegExp(\n String.raw`^rgba?\\(\\s*${NUM}(%?)[\\s,]+${NUM}(%?)[\\s,]+${NUM}(%?)(?:[\\s,/]+${NUM}(%?))?\\s*\\)$`,\n \"i\",\n);\nconst BYTE_MAX = 255;\nconst PERCENT_MAX = 100;\n\nconst clampByte = (n: number) => Math.min(255, Math.max(0, Math.round(n)));\nconst clampUnit = (n: number) => Math.min(1, Math.max(0, n));\n\n/** Parses hex and rgb()/rgba(); anything else (names, var(), hsl) returns null. */\nexport const parseColor = (input: string | undefined | null): Rgba | null => {\n if (!input) {\n return null;\n }\n const value = input.trim();\n const hex = HEX_RE.exec(value);\n if (hex) {\n let digits = hex[1];\n if (digits.length <= 4) {\n digits = [...digits].map((d) => d + d).join(\"\");\n }\n const n = (i: number) => parseInt(digits.slice(i, i + 2), 16);\n return {\n r: n(0),\n g: n(2),\n b: n(4),\n a: digits.length === 8 ? n(6) / 255 : 1,\n };\n }\n const rgb = RGB_RE.exec(value);\n if (rgb) {\n const channel = (value: string, unit: string) =>\n unit ? (Number(value) * BYTE_MAX) / PERCENT_MAX : Number(value);\n const r = channel(rgb[1], rgb[2]);\n const g = channel(rgb[3], rgb[4]);\n const b = channel(rgb[5], rgb[6]);\n const alpha = rgb[7];\n const a = alpha === undefined ? 1 : Number(alpha) / (rgb[8] ? 100 : 1);\n return {\n r: clampByte(r),\n g: clampByte(g),\n b: clampByte(b),\n a: clampUnit(a),\n };\n }\n return null;\n};\n\n// A closed list rather than /[a-z]+/: letter-only hex missing its \"#\"\n// (\"ffffff\", \"fafafa\") and typos would otherwise pass as names.\nconst NAMED_COLORS = new Set(\n (\n \"aliceblue antiquewhite aqua aquamarine azure beige bisque black \" +\n \"blanchedalmond blue blueviolet brown burlywood cadetblue chartreuse \" +\n \"chocolate coral cornflowerblue cornsilk crimson cyan darkblue darkcyan \" +\n \"darkgoldenrod darkgray darkgreen darkgrey darkkhaki darkmagenta \" +\n \"darkolivegreen darkorange darkorchid darkred darksalmon darkseagreen \" +\n \"darkslateblue darkslategray darkslategrey darkturquoise darkviolet \" +\n \"deeppink deepskyblue dimgray dimgrey dodgerblue firebrick floralwhite \" +\n \"forestgreen fuchsia gainsboro ghostwhite gold goldenrod gray green \" +\n \"greenyellow grey honeydew hotpink indianred indigo ivory khaki lavender \" +\n \"lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan \" +\n \"lightgoldenrodyellow lightgray lightgreen lightgrey lightpink \" +\n \"lightsalmon lightseagreen lightskyblue lightslategray lightslategrey \" +\n \"lightsteelblue lightyellow lime limegreen linen magenta maroon \" +\n \"mediumaquamarine mediumblue mediumorchid mediumpurple mediumseagreen \" +\n \"mediumslateblue mediumspringgreen mediumturquoise mediumvioletred \" +\n \"midnightblue mintcream mistyrose moccasin navajowhite navy oldlace olive \" +\n \"olivedrab orange orangered orchid palegoldenrod palegreen paleturquoise \" +\n \"palevioletred papayawhip peachpuff peru pink plum powderblue purple \" +\n \"rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown \" +\n \"seagreen seashell sienna silver skyblue slateblue slategray slategrey \" +\n \"snow springgreen steelblue tan teal thistle tomato turquoise violet \" +\n \"wheat white whitesmoke yellow yellowgreen transparent currentcolor\"\n ).split(\" \"),\n);\n\n// Arguments may nest one level (color-mix(in srgb, var(--a) 40%, white)) but\n// never contain declaration or string syntax, so a value can't close its\n// function early and smuggle in another layer such as url().\nconst ARG = String.raw`[^();{}<>\"'\\\\]`;\nconst COLOR_FUNCTION_RE = new RegExp(\n String.raw`^(?:hsla?|hwb|lab|lch|oklab|oklch|color|color-mix|var)\\((?:${ARG}|\\(${ARG}*\\))*\\)$`,\n \"i\",\n);\nconst URL_RE = /url\\s*\\(/i;\n\nconst isPassthroughColor = (value: string): boolean =>\n NAMED_COLORS.has(value.toLowerCase()) ||\n (COLOR_FUNCTION_RE.test(value) && !URL_RE.test(value));\n\n/**\n * `color` when it could be a valid CSS colour, else `fallback`. A malformed\n * value (\"4f87ff\", \"ffffff\", \"#12345\") would otherwise poison every\n * color-mix() derived from it and blank out the surfaces it tints. Syntactic\n * only, so server and client renders agree.\n */\nexport const paintableColor = (\n color: string | undefined | null,\n fallback: string,\n): string => {\n const value = color?.trim();\n if (!value) {\n return fallback;\n }\n return parseColor(value) || isPassthroughColor(value) ? value : fallback;\n};\n\nconst format = ({ r, g, b, a }: Rgba) =>\n `rgba(${clampByte(r)}, ${clampByte(g)}, ${clampByte(b)}, ${Number(clampUnit(a).toFixed(3))})`;\n\nconst percent = (t: number) => `${Number((clampUnit(t) * 100).toFixed(1))}%`;\n\n/**\n * `color` at `alpha` opacity. Parseable colours resolve to rgba() so inline\n * styles stay plain; anything else (a CSS variable, a named colour) becomes a\n * color-mix() the browser resolves.\n */\nexport const withAlpha = (color: string, alpha: number): string => {\n const parsed = parseColor(color);\n if (parsed) {\n return format({ ...parsed, a: parsed.a * alpha });\n }\n return `color-mix(in srgb, ${color} ${percent(alpha)}, transparent)`;\n};\n\n/** `a` blended toward `b` by `t` (0 = a, 1 = b), fully opaque. */\nexport const mix = (a: string, b: string, t: number): string => {\n const pa = parseColor(a);\n const pb = parseColor(b);\n if (pa && pb) {\n const k = clampUnit(t);\n return format({\n r: pa.r + (pb.r - pa.r) * k,\n g: pa.g + (pb.g - pa.g) * k,\n b: pa.b + (pb.b - pa.b) * k,\n a: 1,\n });\n }\n return `color-mix(in srgb, ${a} ${percent(1 - t)}, ${b})`;\n};\n\n/**\n * `color` composited over `base`, so a translucent value becomes the solid\n * colour it would look like there. Unparseable input is returned unchanged.\n */\nexport const opaqueOver = (color: string, base: string): string => {\n const pc = parseColor(color);\n const pb = parseColor(base);\n if (!pc || !pb) {\n return color;\n }\n return mix(base, format({ ...pc, a: 1 }), pc.a);\n};\n","import { mix, withAlpha } from \"./color\";\nimport type { GlassPalette, GlassPaletteInput } from \"./types\";\n\n/** Near-black the brand accent is darkened toward for dims and shadows. */\nconst SHADE_BASE = \"#05050f\";\n\nexport const GLASS_DEFAULT_TINT = \"#ffffff\";\n\nexport const GLASS_RADIUS = {\n sheet: \"28px\",\n panel: \"20px\",\n control: \"12px\",\n row: \"10px\",\n pill: \"999px\",\n} as const;\n\nexport const GLASS_BLUR = \"blur(30px) saturate(180%)\";\n\n/**\n * Every glass colour, derived from the brand accent and a surface tint so the\n * appearance inherits whatever palette the workspace configured.\n */\nexport const glassPalette = ({\n accent,\n tint = GLASS_DEFAULT_TINT,\n}: GlassPaletteInput): GlassPalette => {\n const shade = mix(accent, SHADE_BASE, 0.7);\n return {\n accent,\n sheet: withAlpha(tint, 0.52),\n sheetDense: withAlpha(tint, 0.86),\n sheetEdge: withAlpha(tint, 0.6),\n panel: withAlpha(tint, 0.5),\n panelEdge: withAlpha(tint, 0.55),\n inset: withAlpha(tint, 0.55),\n control: withAlpha(tint, 0.72),\n footer: `linear-gradient(to bottom, ${withAlpha(tint, 0.35)} 0%, ${withAlpha(tint, 0.9)} 60%)`,\n accentFaint: withAlpha(accent, 0.04),\n accentWash: withAlpha(accent, 0.08),\n accentWashStrong: withAlpha(accent, 0.22),\n hairline: withAlpha(shade, 0.08),\n outline: withAlpha(shade, 0.14),\n dim: withAlpha(shade, 0.3),\n shadow: `0 -18px 50px -12px ${withAlpha(shade, 0.35)}`,\n floatShadow: `0 24px 60px -18px ${withAlpha(shade, 0.45)}`,\n primaryShadow: `0 10px 24px -10px ${withAlpha(accent, 0.6)}`,\n };\n};\n","/** Shared motion timings, used by every appearance so classic animates too. */\nexport const MOTION = {\n /** iOS sheet spring: fast start, long soft settle. */\n sheetEase: \"cubic-bezier(0.32, 0.72, 0, 1)\",\n outEase: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n sheetMs: 620,\n dimMs: 420,\n collapseMs: 380,\n /** Classic modals fade out quickly; glass sheets take `dimMs`. */\n fadeMs: 200,\n /**\n * Classic Privacy Center accordions. Must not exceed `collapseMs`, after\n * which PCAccordionBody lifts the clipping on an open body.\n */\n classicCollapseMs: 300,\n} as const;\n\n/** Duration and curve of a disclosure opening or closing. */\nexport const COLLAPSE_EASE = `${MOTION.collapseMs}ms ${MOTION.sheetEase}`;\n\nexport const prefersReducedMotion = (): boolean =>\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches === true;\n","import { CSS_SCOPE_AT_RULE, CSS_STRING_SPECIALS_RE } from \"./constants\";\nimport { isSafeCustomCss } from \"./customCss\";\n\ntype ScopedCssOptions = Readonly<{\n /**\n * Where the `<style>` goes: the document's head, or the shadow root the\n * surface renders in (a document stylesheet never reaches into a shadow tree).\n */\n root: Document | ShadowRoot;\n /** The attribute every element the CSS may style carries, e.g. `data-redacto-notice-id`. */\n scopeAttribute: string;\n /** That attribute's value for this one surface. */\n scopeId: string;\n /** Set on the injected `<style>`, valued with `scopeId`, so it can be found again. */\n markerAttribute: string;\n css: string;\n}>;\n\n/**\n * Whether the browser parsed anything outside the `@scope` block. The token\n * guard already refuses unbalanced CSS; this reads what the browser actually\n * built, so a tokenizer quirk the guard misses (a bad `url(` token hiding a\n * `}`) still cannot reach the host page. A browser without `@scope` drops the\n * block whole, which leaves only escaped rules behind. With no sheet to read\n * (a DOM without CSS parsing) there is nothing to check.\n */\nconst escapesScope = (style: HTMLStyleElement): boolean =>\n Array.from(style.sheet?.cssRules ?? []).some(\n (rule) => !rule.cssText.startsWith(CSS_SCOPE_AT_RULE),\n );\n\n/**\n * Injects an admin's custom CSS scoped to one surface: `@scope` keeps every\n * rule inside the elements carrying `scopeAttribute=\"scopeId\"`, so nothing\n * reaches the host page. CSS that fails the token guard is never injected,\n * and injected CSS is removed again if the browser parsed any of it outside\n * the scope. Returns the cleanup that removes it.\n */\nexport const applyScopedCustomCss = ({\n root,\n scopeAttribute,\n scopeId,\n markerAttribute,\n css,\n}: ScopedCssOptions): (() => void) => {\n if (typeof document === \"undefined\" || !css.trim() || !isSafeCustomCss(css)) {\n return () => undefined;\n }\n const id = scopeId.replace(CSS_STRING_SPECIALS_RE, \"\\\\$&\");\n const style = document.createElement(\"style\");\n style.setAttribute(markerAttribute, scopeId);\n style.textContent = `${CSS_SCOPE_AT_RULE} ([${scopeAttribute}=\"${id}\"]) {\\n${css}\\n}`;\n (root instanceof Document ? root.head : root).appendChild(style);\n if (escapesScope(style)) {\n style.remove();\n return () => undefined;\n }\n return () => style.remove();\n};\n","import {\n NOTICE_THEME_VARS,\n THEMED_ACCENT,\n THEMED_CONTROL_OFF,\n THEMED_TTS_BACKGROUND,\n TTS_TEXT_ATTRIBUTE,\n} from \"../shared/appearance\";\n\nconst STYLE_ID = \"redacto-consent-checkbox-styles\";\n\nconst STYLE_CONTENT = `\n /* Redacto Consent SDK Checkbox Styles */\n .redacto-checkbox-large {\n appearance: none !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n height: 20px !important;\n width: 20px !important;\n border: 2px solid ${THEMED_CONTROL_OFF} !important;\n border-radius: 5px !important;\n background-color: transparent !important;\n cursor: pointer !important;\n position: relative !important;\n box-sizing: border-box !important;\n flex-shrink: 0 !important;\n margin: 0 !important;\n padding: 4px !important;\n }\n\n .redacto-checkbox-medium {\n appearance: none !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n height: 17px !important;\n width: 17px !important;\n border: 2px solid ${THEMED_CONTROL_OFF} !important;\n border-radius: 5px !important;\n background-color: transparent !important;\n cursor: pointer !important;\n position: relative !important;\n box-sizing: border-box !important;\n flex-shrink: 0 !important;\n margin: 0 !important;\n padding: 4px !important;\n }\n\n .redacto-checkbox-small {\n appearance: none !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n height: 16px !important;\n width: 16px !important;\n border: 2px solid ${THEMED_CONTROL_OFF} !important;\n border-radius: 5px !important;\n background-color: transparent !important;\n cursor: pointer !important;\n position: relative !important;\n box-sizing: border-box !important;\n flex-shrink: 0 !important;\n margin: 0 !important;\n padding: 4px !important;\n }\n\n .redacto-checkbox-large:checked {\n background-color: ${THEMED_ACCENT} !important;\n border-color: ${THEMED_ACCENT} !important;\n }\n\n .redacto-checkbox-medium:checked {\n background-color: ${THEMED_ACCENT} !important;\n border-color: ${THEMED_ACCENT} !important;\n }\n\n .redacto-checkbox-small:checked {\n background-color: ${THEMED_ACCENT} !important;\n border-color: ${THEMED_ACCENT} !important;\n }\n\n .redacto-checkbox-large:checked::after,\n .redacto-checkbox-medium:checked::after {\n content: '' !important;\n position: absolute !important;\n left: 50% !important;\n top: 50% !important;\n transform: translate(-50%, -50%) rotate(45deg) !important;\n width: 4px !important;\n height: 8px !important;\n border: solid white !important;\n border-width: 0 2px 2px 0 !important;\n box-sizing: border-box !important;\n }\n\n .redacto-checkbox-small:checked::after {\n content: '' !important;\n position: absolute !important;\n left: 50% !important;\n top: 50% !important;\n transform: translate(-50%, -50%) rotate(45deg) !important;\n width: 3px !important;\n height: 6px !important;\n border: solid white !important;\n border-width: 0 1.5px 1.5px 0 !important;\n box-sizing: border-box !important;\n }\n\n .redacto-checkbox-large:indeterminate,\n .redacto-checkbox-medium:indeterminate {\n background-color: ${THEMED_ACCENT} !important;\n border-color: ${THEMED_ACCENT} !important;\n }\n\n .redacto-checkbox-large:indeterminate::after,\n .redacto-checkbox-medium:indeterminate::after {\n content: '' !important;\n position: absolute !important;\n left: 50% !important;\n top: 50% !important;\n transform: translate(-50%, -50%) !important;\n width: 8px !important;\n height: 2px !important;\n background-color: white !important;\n }\n\n .redacto-checkbox-large:focus,\n .redacto-checkbox-medium:focus {\n outline: 2px solid ${THEMED_ACCENT} !important;\n outline-offset: 2px !important;\n }\n\n .redacto-checkbox-small:focus {\n outline: 2px solid ${THEMED_ACCENT} !important;\n outline-offset: 2px !important;\n }\n\n /* TTS Highlight Styles */\n .redacto-tts-highlight {\n position: relative !important;\n transition: background-color 0.3s ease, outline 0.3s ease !important;\n }\n\n h2.redacto-tts-highlight,\n h3.redacto-tts-highlight {\n background-color: ${THEMED_TTS_BACKGROUND} !important;\n border-radius: 3px !important;\n padding: 2px 4px !important;\n margin: -2px -4px !important;\n }\n\n span.redacto-tts-highlight,\n a.redacto-tts-highlight {\n background-color: ${THEMED_TTS_BACKGROUND} !important;\n border-radius: 3px !important;\n padding: 2px 4px !important;\n margin: -2px -4px !important;\n }\n\n p.redacto-tts-highlight {\n background-color: ${THEMED_TTS_BACKGROUND} !important;\n border-radius: 3px !important;\n padding: 2px 4px !important;\n margin: -2px -4px !important;\n }\n\n /* Only when the admin chose one: classic keeps each element's own colour. */\n [${TTS_TEXT_ATTRIBUTE}] .redacto-tts-highlight {\n color: var(${NOTICE_THEME_VARS.ttsText}) !important;\n }\n\n button.redacto-tts-highlight {\n outline: 3px solid ${THEMED_TTS_BACKGROUND} !important;\n outline-offset: 2px !important;\n }\n\n /* Overlay fade-in */\n @keyframes overlayFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n /* Spinner animation */\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n /* DigiLocker callback retry button hover */\n .redacto-dl-retry-btn:hover {\n background-color: #2563eb !important;\n }\n `;\n\n/**\n * Inject the checkbox / TTS / animation stylesheet into the given root.\n *\n * - When called with a `Document`, the style tag is placed in `document.head`.\n * - When called with a `ShadowRoot`, the style tag is placed inside the shadow\n * so it only applies within that shadow tree (full CSS isolation from the\n * host page).\n *\n * No-ops if the stylesheet is already present in the target root.\n */\nexport const injectCheckboxStyles = (\n root: Document | ShadowRoot\n): void => {\n if (typeof document === \"undefined\") return;\n\n // Skip if already injected into this root.\n const existing =\n root instanceof Document\n ? root.getElementById(STYLE_ID)\n : root.querySelector(`#${STYLE_ID}`);\n if (existing) return;\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = STYLE_CONTENT;\n\n if (root instanceof Document) {\n root.head.appendChild(style);\n } else {\n root.appendChild(style);\n }\n};\n","export const styles = {\n overlay: {\n position: \"fixed\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 999,\n animation: \"overlayFadeIn 0.2s cubic-bezier(0.16, 1, 0.3, 1)\",\n pointerEvents: \"all\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n modal: {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"700px\",\n borderRadius: \"8px\",\n backgroundColor: \"#ffffff\",\n boxShadow: \"4px 0px 4px 0px #00000040\",\n border: \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"90vh\",\n zIndex: 1000,\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n fontFamily: \"inherit\",\n },\n\n content: {\n margin: \"22px\",\n display: \"flex\",\n flexDirection: \"column\",\n flexGrow: 1,\n overflow: \"hidden\",\n minHeight: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n topSection: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n gap: \"10px\",\n paddingBottom: \"15px\",\n borderBottom: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n topLeft: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n flex: \"1 1 0\",\n minWidth: 0,\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n // The main notice header is two stacked rows: the logo alone on row 1,\n // aligned per active_config.logo_position, then the title and the\n // TTS/language controls on row 2. `topSection` and `topLeft` above keep their\n // single-row shape for the age-verification, guardian and verification\n // screens, which have no controls to place and share those styles.\n // Mirrors consent-sdk-react/src/RedactoNoticeConsent/styles.ts.\n headerStack: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n gap: \"10px\",\n paddingBottom: \"15px\",\n borderBottom: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n logoRow: {\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n headerRow: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"10px\",\n width: \"100%\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n logo: {\n height: \"32px\",\n width: \"auto\",\n maxWidth: \"140px\",\n objectFit: \"contain\",\n flexShrink: 0,\n margin: 0,\n padding: 0,\n display: \"block\",\n },\n\n title: {\n fontSize: \"18px\",\n fontWeight: 700,\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n verticalAlign: \"middle\",\n color: \"#101828\",\n flex: \"1 1 auto\",\n minWidth: 0,\n wordBreak: \"normal\",\n overflowWrap: \"anywhere\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n topRight: {\n borderRadius: \"8px\",\n padding: \"3px 9px\",\n border: \"1px solid #d0d5dd\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n fontWeight: 400,\n fontSize: \"12px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n verticalAlign: \"middle\",\n color: \"#344054\",\n gap: \"5px\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n cursor: \"pointer\",\n backgroundColor: \"#ffffff\",\n },\n\n middleSection: {\n margin: \"0px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\",\n flexGrow: 1,\n overflowY: \"auto\",\n minHeight: 0,\n paddingRight: \"15px\",\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n privacyText: {\n fontSize: \"16px\",\n fontWeight: 400,\n lineHeight: \"150%\",\n color: \"#344054\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n link: {\n color: \"#4f87ff\",\n textDecoration: \"none\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n subTitle: {\n fontWeight: 600,\n fontSize: \"16px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#101828\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n optionsContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionItem: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionLeft: {\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"center\",\n cursor: \"pointer\",\n // The row is space-between, so without this the gap between the label and\n // the control belongs to neither and swallows a click aimed at the row.\n // minWidth lets a long heading wrap rather than push the control out.\n flexGrow: 1,\n minWidth: 0,\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionTextContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n // Carries the product heading's click handler, so it has to reach the\n // control rather than stopping at the end of a short name like \"Default\".\n flexGrow: 1,\n minWidth: 0,\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionTitle: {\n fontWeight: 500,\n fontSize: \"16px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#101828\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n optionDescription: {\n fontWeight: 400,\n fontSize: \"12px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#475467\",\n verticalAlign: \"middle\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n checkboxLarge: {\n height: \"20px\",\n width: \"20px\",\n padding: \"4px\",\n borderRadius: \"5px\",\n border: \"2px solid #d0d5dd\",\n margin: 0,\n boxSizing: \"border-box\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n backgroundColor: \"transparent\",\n },\n\n dataElementsContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n paddingLeft: \"22px\",\n },\n\n dataElementItem: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n justifyContent: \"space-between\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n minHeight: \"24px\",\n },\n\n // Applied only where the control is taller than a checkbox: a yes/no pair,\n // a dropdown or a switch. Unconditionally these leave the checkbox rows\n // loose.\n dataElementsContainerRoomy: {\n gap: \"4px\",\n },\n\n dataElementItemRoomy: {\n minHeight: \"28px\",\n padding: \"2px 0\",\n },\n\n dataElementText: {\n fontWeight: 400,\n fontSize: \"14px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#344054\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n checkboxSmall: {\n height: \"16px\",\n width: \"16px\",\n padding: \"4px\",\n borderRadius: \"5px\",\n border: \"2px solid #d0d5dd\",\n margin: 0,\n boxSizing: \"border-box\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n backgroundColor: \"transparent\",\n },\n\n bottomSection: {\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: \"29px\",\n paddingTop: \"15px\",\n borderTop: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n /**\n * The main notice footer. Wide: one row with decline pushed left and the\n * accepts grouped right. Narrow: a full-width stack. Review mode keeps\n * `bottomSection` — it collapses to a single button.\n */\n actionButtonRow: {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"12px\",\n paddingTop: \"15px\",\n borderTop: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n actionButtonStack: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\",\n paddingTop: \"15px\",\n borderTop: \"none\",\n backgroundColor: \"#ffffff\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n button: {\n width: \"100%\",\n borderRadius: \"8px\",\n padding: \"9px 45px\",\n fontWeight: 400,\n fontSize: \"16px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n cursor: \"pointer\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"center\",\n },\n\n otpGateLocked: {\n pointerEvents: \"none\",\n opacity: 0.55,\n },\n\n otpGatePanel: {\n margin: \"8px 0 4px\",\n padding: \"12px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n background: \"#f9fafb\",\n },\n\n otpGateTitle: {\n margin: 0,\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#111827\",\n },\n\n otpGateDescription: {\n margin: \"4px 0 10px\",\n fontSize: \"12px\",\n lineHeight: 1.4,\n color: \"#6b7280\",\n },\n\n otpGateDigits: {\n display: \"flex\",\n gap: \"8px\",\n justifyContent: \"space-between\",\n },\n\n otpGateDigit: {\n width: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n padding: \"10px 0\",\n fontSize: \"18px\",\n fontWeight: 600,\n textAlign: \"center\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"8px\",\n background: \"#ffffff\",\n },\n\n otpGateError: {\n margin: \"8px 0 0\",\n fontSize: \"12px\",\n color: \"#dc2626\",\n },\n\n otpGateButton: {\n width: \"100%\",\n marginTop: \"10px\",\n },\n\n acceptButton: {\n backgroundColor: \"#4f87ff\",\n border: \"none\",\n color: \"#ffffff\",\n },\n\n /**\n * Accept Selected: outlined in the accent so it still reads as an accept,\n * subordinate to the filled Accept All.\n */\n acceptSecondaryButton: {\n backgroundColor: \"#ffffff\",\n border: \"1px solid #4f87ff\",\n color: \"#4f87ff\",\n },\n\n /**\n * Three buttons share the footer width, so the single-button horizontal\n * padding would clip long translated labels. Let them wrap instead.\n *\n * `width: auto` undoes `button`'s `width: 100%` — in the wide row each button\n * must size to its own label, or all three stretch equally and the\n * left/right split disappears.\n */\n rowButton: {\n width: \"auto\",\n padding: \"9px 20px\",\n whiteSpace: \"normal\",\n wordBreak: \"break-word\",\n },\n\n /** In the narrow stack every button spans the full width. */\n stackButton: {\n width: \"100%\",\n padding: \"9px 20px\",\n whiteSpace: \"normal\",\n wordBreak: \"break-word\",\n },\n\n /**\n * Pushes everything after decline to the right edge, which is the whole of\n * the wide layout: `[Decline] <-- gap --> [Accept Selected] [Accept All]`.\n */\n declineSpacer: {\n marginRight: \"auto\",\n },\n\n cancelButton: {\n border: \"1px solid #d0d5dd\",\n backgroundColor: \"#ffffff\",\n color: \"#000000\",\n },\n\n languageSelectorContainer: {\n position: \"relative\",\n // Shares `headerRow` with the title, which grows; without this a long\n // heading squeezes the language button instead of wrapping itself.\n flexShrink: 0,\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n languageDropdown: {\n position: \"absolute\",\n top: \"100%\",\n right: 0,\n backgroundColor: \"#ffffff\",\n border: \"1px solid #d0d5dd\",\n borderRadius: \"4px\",\n boxShadow: \"0px 4px 12px rgba(0, 0, 0, 0.15)\",\n zIndex: 10,\n width: \"max-content\",\n maxHeight: \"200px\",\n overflowY: \"auto\",\n marginTop: \"4px\",\n padding: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n languageItem: {\n padding: \"8px 12px\",\n cursor: \"pointer\",\n fontSize: \"12px\",\n color: \"#344054\",\n backgroundColor: \"#ffffff\",\n borderBottom: \"1px solid #e5e7eb\",\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n\n selectedLanguageItem: {\n backgroundColor: \"#f3f4f6\",\n fontWeight: 600,\n },\n\n loadingContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2rem\",\n minHeight: \"200px\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n loadingSpinner: {\n width: \"40px\",\n height: \"40px\",\n border: \"4px solid #f3f3f3\",\n borderTop: \"4px solid #3498db\",\n borderRadius: \"50%\",\n animation: \"spin 1s linear infinite\",\n marginBottom: \"1rem\",\n boxSizing: \"border-box\",\n },\n\n sectionHeader: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n margin: \"0 0 8px\",\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n sectionBody: {\n paddingLeft: \"18px\",\n margin: \"0 0 14px\",\n boxSizing: \"border-box\",\n },\n\n sectionTitle: {\n fontWeight: 600,\n fontSize: \"17px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n chevronButton: {\n background: \"none\",\n border: \"none\",\n padding: 0,\n margin: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n },\n\n confirmHint: {\n fontSize: \"13px\",\n lineHeight: \"18px\",\n color: \"#6b6b6b\",\n margin: 0,\n paddingTop: \"12px\",\n boxSizing: \"border-box\",\n },\n} as const;\n\n/**\n * The modal's style set, widened from the literal types above so an\n * appearance can supply its own values under the same keys.\n */\nexport type NoticeStyles = {\n [K in keyof typeof styles]: Record<string, string | number | undefined>;\n};\n","import { el } from \"./dom\";\nimport {\n REQUIRED_MARKER_ARIA_LABEL,\n REQUIRED_MARKER_GLYPH,\n REQUIRED_MARKER_STYLE,\n} from \"../constants\";\nimport type { PurposeItemData } from \"../api/types\";\n\n/**\n * The red `*` that marks something the data subject cannot opt out of — a\n * required data element, or a purpose that carries one.\n *\n * Callers append this to the label element; append *after* any\n * `textContent` assignment, which replaces every existing child.\n */\nexport function createRequiredMarker(\n label: string = REQUIRED_MARKER_ARIA_LABEL\n): HTMLElement {\n return el(\n \"span\",\n { style: REQUIRED_MARKER_STYLE, \"aria-label\": label },\n REQUIRED_MARKER_GLYPH\n );\n}\n\n/**\n * Whether a purpose carries at least one required data element — the condition\n * for marking the purpose itself as required in the notice UI.\n *\n * Deliberately does not also test `enabled`: this drives a visual marker, and\n * it must agree with the per-element markers actually on screen.\n */\nexport function hasRequiredDataElement(purpose: PurposeItemData): boolean {\n return purpose.data_elements.some((element) => element.required);\n}\n","import type { ProductLike, ProductPurposeGroup, PurposeLike } from \"../types\";\n\nexport const productPurposeKey = (\n productUuid: string | undefined,\n purposeUuid: string,\n) => (productUuid ? `${productUuid}:${purposeUuid}` : purposeUuid);\n\nexport const purposeCoversProduct = (\n purpose: PurposeLike,\n productUuid: string,\n): boolean => {\n const scope = purpose.product_uuids;\n if (!scope || scope.length === 0) return true;\n return scope.includes(productUuid);\n};\n\nexport const isMultiProduct = (products: ProductLike[] | undefined): boolean =>\n Boolean(products && products.length > 1);\n\nexport const purposeNamesProduct = (\n purpose: PurposeLike,\n productUuid: string,\n): boolean => Boolean(purpose.product_uuids?.includes(productUuid));\n\nexport const noticeScopesPurposes = (purposes: PurposeLike[]): boolean =>\n purposes.some((purpose) => (purpose.product_uuids?.length ?? 0) > 0);\n\nexport const serverMarksMandatoryProducts = (\n products: ProductLike[] | undefined,\n): boolean =>\n Boolean(\n products &&\n products.length > 0 &&\n products.every((product) => product.mandatory !== undefined),\n );\n\nexport const gatedProductUuids = (\n products: ProductLike[] | undefined,\n): Set<string> =>\n new Set(\n (products ?? [])\n .filter((product) => product.mandatory === true)\n .map((product) => product.uuid),\n );\n\nexport const rowProductUuid = (\n row: { productUuid?: string },\n products: ProductLike[] | undefined,\n): string | undefined =>\n row.productUuid ?? (products?.length === 1 ? products[0].uuid : undefined);\n\nexport const rowsUnderGate = <R extends { productUuid?: string }>(\n rows: R[],\n products: ProductLike[] | undefined,\n): R[] => {\n const gated = gatedProductUuids(products);\n if (gated.size === 0) return [];\n\n return rows.filter((row) => {\n const productUuid = rowProductUuid(row, products);\n return productUuid !== undefined && gated.has(productUuid);\n });\n};\n\nexport const mandatoryProductsFirst = <P extends ProductLike>(\n products: P[],\n): P[] => {\n const mandatory = products.filter((product) => product.mandatory === true);\n if (mandatory.length === 0 || mandatory.length === products.length) {\n return products;\n }\n return [\n ...mandatory,\n ...products.filter((product) => product.mandatory !== true),\n ];\n};\n\n/**\n * `purposes` in the admin's saved order: the saved uuids first, then any\n * purpose the order does not name, in their own order. No saved order leaves\n * them as they are.\n */\nconst inSavedOrder = <U extends PurposeLike>(\n purposes: U[],\n saved: string[] | undefined,\n): U[] => {\n if (!saved || saved.length === 0) return purposes;\n\n const byUuid = new Map(purposes.map((p) => [p.uuid, p]));\n const ordered: U[] = [];\n for (const uuid of saved) {\n const found = byUuid.get(uuid);\n if (found) ordered.push(found);\n }\n const rest = purposes.filter((p) => !saved.includes(p.uuid));\n return [...ordered, ...rest];\n};\n\nexport const groupPurposesByProduct = <\n P extends ProductLike,\n U extends PurposeLike,\n>(\n products: P[] | undefined,\n purposes: U[],\n order?: Record<string, string[]>,\n): ProductPurposeGroup<P, U>[] => {\n if (!products || products.length === 0) return [];\n\n return mandatoryProductsFirst(products)\n .map((product) => {\n const covered = purposes.filter((purpose) =>\n purposeCoversProduct(purpose, product.uuid),\n );\n\n return { product, purposes: inSavedOrder(covered, order?.[product.uuid]) };\n })\n .filter((group) => group.purposes.length > 0);\n};\n\nexport const expandPurposesByProduct = <\n P extends ProductLike,\n U extends PurposeLike,\n>(\n products: P[] | undefined,\n purposes: U[],\n order?: Record<string, string[]>,\n): Array<{ product: P; purpose: U }> => {\n if (!isMultiProduct(products)) return [];\n\n const rows: Array<{ product: P; purpose: U }> = [];\n for (const group of groupPurposesByProduct(products, purposes, order)) {\n for (const purpose of group.purposes) {\n rows.push({ product: group.product, purpose });\n }\n }\n return rows;\n};\n\nexport const noticePurposeRows = <P extends ProductLike, U extends PurposeLike>(\n products: P[] | undefined,\n purposes: U[],\n order?: Record<string, string[]>,\n): Array<{ purpose: U; productUuid?: string }> => {\n if (!isMultiProduct(products)) {\n // A single-product notice renders ungrouped, but in the order the admin\n // saved for that product, as a grouped notice does per product.\n const sole = products?.[0];\n return inSavedOrder(purposes, sole ? order?.[sole.uuid] : undefined).map(\n (purpose) => ({ purpose, productUuid: undefined }),\n );\n }\n\n return expandPurposesByProduct(products, purposes, order).map((row) => ({\n purpose: row.purpose,\n productUuid: row.product.uuid,\n }));\n};\n\n/**\n * Each purpose once, in the order the notice renders them: the saved order of\n * a single-product notice, or product by product on a grouped one. For\n * everything that walks purposes rather than rows -- the reconsent split and\n * talkback -- so it follows what the visitor sees.\n */\nexport const purposesInRenderOrder = <\n P extends ProductLike,\n U extends PurposeLike,\n>(\n products: P[] | undefined,\n purposes: U[],\n order?: Record<string, string[]>,\n): U[] => {\n const seen = new Set<string>();\n const ordered: U[] = [];\n for (const { purpose } of noticePurposeRows(products, purposes, order)) {\n if (!seen.has(purpose.uuid)) {\n seen.add(purpose.uuid);\n ordered.push(purpose);\n }\n }\n return ordered;\n};\n","import type { AppearanceStyle } from \"../shared/appearance\";\nimport type { StyleRadii } from \"./types\";\n\n/** Corner radii each style draws with when the admin sets none. */\nexport const STYLE_RADII: Readonly<Record<AppearanceStyle, StyleRadii>> = {\n classic: { modal: \"8px\", button: \"8px\", panel: \"8px\", control: \"6px\" },\n minimal: { modal: \"4px\", button: \"4px\", panel: \"4px\", control: \"4px\" },\n soft: { modal: \"24px\", button: \"999px\", panel: \"16px\", control: \"12px\" },\n glass: { modal: \"28px\", button: \"999px\", panel: \"20px\", control: \"12px\" },\n};\n\n/** Brand accent when neither the host nor the notice sets one. */\nexport const DEFAULT_ACCENT_COLOR = \"#4f87ff\";\n\nexport const DEFAULT_HEADING_COLOR = \"#323B4B\";\nexport const DEFAULT_TEXT_COLOR = \"#344054\";\n\n/** The purposes heading when the notice sets none. */\nexport const DEFAULT_PURPOSE_SECTION_HEADING = \"Manage What You Share\";\n\n/**\n * Glass's desktop card. A percentage, not viewport units, so a host that\n * frames the notice gets a card that fits the frame.\n */\nexport const GLASS_DESKTOP_CARD_WIDTH = \"min(640px, calc(100% - 48px))\";\n\n/** Space between the panels on a sheet: purposes, the sections, the OTP step. */\nexport const SHEET_PANEL_GAP = \"10px\";\n\n/** Classic's own colours, under the parts a layout adds to an opaque style. */\nexport const SOLID_SURFACE_DEFAULTS = {\n panel: \"#ffffff\",\n edge: \"#e4e7ec\",\n outline: \"#d0d5dd\",\n} as const;\n\n/** localStorage key prefix for the last appearance served per notice. */\nexport const APPEARANCE_CACHE_KEY_PREFIX = \"redacto_notice_appearance:\";\n\nexport const LAYOUT_STYLE_ID = \"redacto-notice-layout-styles\";\nexport const GLASS_STYLE_ID = \"redacto-notice-glass-styles\";\nexport const SWITCH_STYLE_ID = \"redacto-notice-switch-styles\";\n\n/** Set on the notice root while it is docked to the bottom edge as a sheet. */\nexport const DOCK_ATTRIBUTE = \"data-redacto-sheet\";\nexport const DOCKED = \"dock\";\n\n/** Set on the notice root when the console turns motion off. */\nexport const MOTION_ATTRIBUTE = \"data-redacto-motion\";\nexport const MOTION_OFF = \"off\";\n\n/** Set on every root of one notice; the admin's custom CSS is scoped to it. */\nexport const NOTICE_ID_ATTRIBUTE = \"data-redacto-notice-id\";\n\n/** Marks the `<style>` holding a notice's custom CSS, valued with its id. */\nexport const CUSTOM_CSS_ATTRIBUTE = \"data-redacto-notice-css\";\n\n/** Set on the notice root when purpose checkboxes are drawn as switches. */\nexport const CONTROL_ATTRIBUTE = \"data-redacto-control\";\nexport const SWITCH_CONTROL = \"switch\";\n\n/** Track and thumb sizes, per checkbox size, in px. */\nexport const SWITCH_SIZES = {\n large: { width: 44, height: 26, thumb: 20 },\n medium: { width: 40, height: 24, thumb: 18 },\n} as const;\n\nexport const SWITCH_THUMB_INSET = 3;\n\n/** A px length, capturing the number: `\"14px\"` → `\"14\"`. */\nexport const PX_LENGTH_RE = /^(\\d+(?:\\.\\d+)?)px$/;\n\n/** Scaled font sizes keep one decimal place. */\nexport const FONT_SIZE_PRECISION = 10;\n\n/** Media query for the device's dark scheme, which automatic dark mode follows. */\nexport const DARK_SCHEME_QUERY = \"(prefers-color-scheme: dark)\";\n\n/** Gap between a corner card and the viewport edges. */\nexport const CORNER_OFFSET = \"24px\";\n\n/** A bottom bar spans the page; its content stays at a readable width. */\nexport const BOTTOM_BAR_CONTENT_WIDTH = \"1100px\";\n\n/** Logo width cap as a multiple of its height: classic's 140px over 32px. */\nexport const LOGO_WIDTH_RATIO = 4.375;\n\n/** Longest accessible name for a section header whose title is the notice copy itself. */\nexport const ACCORDION_NAME_MAX_CHARS = 80;\n\n/** Stable hooks the admin's custom CSS targets, as `[data-redacto-part=\"…\"]`. */\nexport const PART_ATTRIBUTE = \"data-redacto-part\";\n\nexport const NOTICE_PARTS = [\n \"root\",\n \"overlay\",\n \"header\",\n \"logo\",\n \"title\",\n \"language\",\n \"notice-text\",\n \"purposes\",\n \"product\",\n \"purpose\",\n \"purpose-title\",\n \"data-element\",\n \"section\",\n \"dpo\",\n \"footer\",\n \"accept-all\",\n \"accept-selected\",\n \"decline\",\n \"confirm-dialog\",\n \"otp\",\n] as const;\n\n/** Keyframe names are global, so they carry the notice in their name. */\nexport const NOTICE_KEYFRAMES = {\n rise: \"redacto-notice-rise\",\n float: \"redacto-notice-float\",\n /**\n * The float frames under a second name, for the desktop loader pill. The pill\n * and the card are one element; only a change of animation-name restarts the\n * entrance when the card replaces the pill.\n */\n floatPill: \"redacto-notice-float-pill\",\n fade: \"redacto-notice-fade\",\n settle: \"redacto-notice-settle\",\n pop: \"redacto-notice-pop\",\n spin: \"redacto-notice-spin\",\n} as const;\n\n/** Classes the glass notice puts on rows it separates with hairlines. */\nexport const GLASS_ROW_CLASS = \"redacto-glass-row\";\n\n/**\n * Custom properties the glass stylesheet reads; the notice root sets them from\n * its palette.\n */\nexport const GLASS_VARS = {\n accent: \"--redacto-glass-accent\",\n accentMid: \"--redacto-glass-accent-mid\",\n accentFaint: \"--redacto-glass-accent-faint\",\n track: \"--redacto-glass-track\",\n outline: \"--redacto-glass-outline\",\n hairline: \"--redacto-glass-hairline\",\n control: \"--redacto-glass-control\",\n} as const;\n","import { PART_ATTRIBUTE } from \"./constants\";\nimport type { NoticePart } from \"./types\";\n\n/**\n * A stable hook the admin's custom CSS targets, as `[data-redacto-part=\"…\"]`.\n * Spread into an element's attributes: `el(\"div\", { ...part(\"footer\") })`.\n */\nexport const part = (name: NoticePart): Record<string, string> => ({\n [PART_ATTRIBUTE]: name,\n});\n","import type {\n AcceptMode,\n SelectablePurpose,\n SelectionState,\n} from \"../types\";\nimport { productPurposeKey } from \"../core/productMatrix\";\n\n/**\n * Composite key for a data element's checkbox state — a data element uuid is\n * only unique within its purpose, since the same element can be attached to\n * several purposes on one notice.\n */\nexport const dataElementKey = (\n purposeUuid: string,\n elementUuid: string,\n productUuid?: string\n) => `${productPurposeKey(productUuid, purposeUuid)}-${elementUuid}`;\n\n/**\n * Resolves the checkbox state that a given accept button should submit.\n *\n * - `all` selects every purpose and every enabled data element.\n * - `selected` is the user's own ticks, returned untouched.\n */\nexport const buildSelectionForMode = (\n rows: ReadonlyArray<{\n purpose: SelectablePurpose;\n productUuid?: string;\n }>,\n mode: AcceptMode,\n current: SelectionState\n): SelectionState => {\n if (mode === \"selected\") {\n return current;\n }\n\n const selectedPurposes: Record<string, boolean> = {};\n const selectedDataElements: Record<string, boolean> = {};\n\n rows.forEach(({ purpose, productUuid }) => {\n selectedPurposes[productPurposeKey(productUuid, purpose.uuid)] = true;\n\n purpose.data_elements.forEach((element) => {\n selectedDataElements[\n dataElementKey(purpose.uuid, element.uuid, productUuid)\n ] = element.enabled;\n });\n });\n\n return { selectedPurposes, selectedDataElements };\n};\n\n/** Both flags, matching the ledger: a disabled element is one that is not\n * there. */\nexport const isBlockingRequiredElement = (element: {\n enabled: boolean;\n required: boolean;\n}): boolean => element.required && element.enabled;\n\n/** The one mandatory predicate: the asterisk, the product control and the\n * confirm gate all read this. */\nexport const hasRequiredDataElement = (purpose: SelectablePurpose): boolean =>\n purpose.data_elements.some(isBlockingRequiredElement);\n\n/**\n * The data elements a tick grants: the mandatory ones where the purpose has\n * any, every live one where it has none.\n *\n * One rule for the purpose tick and the product tick alike, so ticking a\n * product never records consent for optional data the visitor did not choose.\n * A disabled element is never granted by either.\n */\nexport const seededDataElements = (purpose: SelectablePurpose): Set<string> => {\n const mandatory = purpose.data_elements.filter(isBlockingRequiredElement);\n const granted =\n mandatory.length > 0\n ? mandatory\n : purpose.data_elements.filter((element) => element.enabled);\n return new Set(granted.map((element) => element.uuid));\n};\n","// The notice frame's own copy, which the server never translates.\nimport { toLanguageCode } from \"../api/language\";\nimport type { NoticeChromeCopy } from \"../types\";\nimport { NOTICE_CHROME_EN, TRANSLATIONS } from \"./chromeCopy.data\";\n\nexport { NOTICE_CHROME_EN };\n\n// Takes the display name the notice holds (\"Hindi\") or a BCP-47 code, and\n// falls back to English per key so a missing string never renders empty.\n// \"mni\" and \"mni-Mtei\" are the same bundle, as are \"pa\" and \"pa-IN\": match the\n// exact code first, then the primary subtag, so a caller passing a bare or\n// region-tagged code is not silently answered in English.\nconst primaryOf = (tag: string) => tag.split(\"-\")[0].toLowerCase();\n\nconst bundleFor = (code: string): NoticeChromeCopy | undefined => {\n if (TRANSLATIONS[code]) {\n return TRANSLATIONS[code];\n }\n // BCP-47 tags are case-insensitive, and a host may hand us \"HI-IN\".\n const primary = primaryOf(code);\n const key = Object.keys(TRANSLATIONS).find(\n (candidate) => primaryOf(candidate) === primary,\n );\n return key ? TRANSLATIONS[key] : undefined;\n};\n\nexport const noticeChromeCopy = (language?: string | null): NoticeChromeCopy => {\n const code = toLanguageCode(language);\n if (!code) {\n return NOTICE_CHROME_EN;\n }\n const bundle = bundleFor(code);\n return bundle ? { ...NOTICE_CHROME_EN, ...bundle } : NOTICE_CHROME_EN;\n};\n\n/** Fills the `{answer}` slot of the saved-answer cue. */\nexport const savedAnswerLabel = (copy: NoticeChromeCopy, answer: string): string =>\n copy.savedAnswer.replace(\"{answer}\", answer);\n\n/** The languages this bundle covers, for tests and tooling. */\nexport const NOTICE_CHROME_LANGUAGES = Object.keys(TRANSLATIONS);\n","import { el, svg } from \"../core/dom\";\nimport { SELECTION_CONTROL_ACCENT } from \"../constants\";\nimport { noticeChromeCopy, savedAnswerLabel } from \"./chromeCopy\";\nimport type {\n SelectionControlProps,\n SelectionControlRefs,\n SelectionControlSize,\n} from \"../types\";\n\nconst SIZES = {\n large: {\n option: { fontSize: \"14px\", fontWeight: \"500\" },\n radio: { width: \"17px\", height: \"17px\" },\n select: { fontSize: \"13px\", padding: \"6px 8px\", fontWeight: \"500\" },\n slot: \"68px\",\n gap: \"10px\",\n tick: { box: 20, glyph: 12 },\n },\n small: {\n option: { fontSize: \"12px\", fontWeight: \"400\" },\n radio: { width: \"13px\", height: \"13px\" },\n select: { fontSize: \"12px\", padding: \"5px 8px\", fontWeight: \"400\" },\n slot: \"62px\",\n gap: \"8px\",\n tick: { box: 17, glyph: 10 },\n },\n} as const;\n\nconst groupStyle = {\n display: \"flex\",\n alignItems: \"center\",\n flexShrink: \"0\",\n};\n\nconst optionStyle = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n};\n\nconst dropdownWrapStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n flexShrink: \"0\",\n};\n\nconst settledAnswerStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n color: \"#667085\",\n whiteSpace: \"nowrap\",\n};\n\nconst selectStyle = {\n border: \"1px solid #d0d5dd\",\n borderRadius: \"6px\",\n lineHeight: \"18px\",\n boxSizing: \"border-box\",\n cursor: \"pointer\",\n backgroundColor: \"#ffffff\",\n color: \"#344054\",\n flexShrink: \"0\",\n};\n\nconst lockedBadgeStyle = (box: number) => ({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: `${box}px`,\n height: `${box}px`,\n borderRadius: \"50%\",\n flexShrink: \"0\",\n boxSizing: \"border-box\",\n backgroundColor: \"#10B981\",\n marginLeft: \"12px\",\n});\n\nconst lockedTick = (label: string | undefined, box: number, glyph: number) =>\n el(\n \"div\",\n { role: \"img\", \"aria-label\": label, style: lockedBadgeStyle(box) },\n svg(\n \"svg\",\n {\n width: String(glyph),\n height: String(glyph),\n viewBox: \"0 0 12 12\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", {\n d: \"M4 6L5.5 7.5L8.5 4.5\",\n stroke: \"white\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n })\n )\n );\n\nconst checkboxClass = (size: SelectionControlSize, className?: string) =>\n className ??\n (size === \"small\" ? \"redacto-checkbox-medium\" : \"redacto-checkbox-large\");\n\nexport function renderSelectionControl(\n props: SelectionControlProps\n): SelectionControlRefs {\n const {\n control,\n onSelect,\n label,\n groupName,\n className,\n locked = false,\n lockedLabel,\n recordedAnswer,\n size = \"large\",\n language,\n skin,\n } = props;\n const copy = noticeChromeCopy(language);\n const options = [\n { label: copy.yes, value: true },\n { label: copy.no, value: false },\n ] as const;\n const scale = SIZES[size];\n let checked = props.checked;\n let indeterminate = props.indeterminate ?? false;\n\n const select = (next: boolean) => {\n if (indeterminate || next !== checked) onSelect(next);\n };\n\n const held = (value: boolean) =>\n locked ? value : !indeterminate && checked === value;\n\n const optionLabel = (text: string, value: boolean) =>\n recordedAnswer === value ? `${text} ${savedAnswerLabel(copy, text)}` : text;\n\n if (locked && control === \"checkbox\") {\n return {\n element: lockedTick(lockedLabel, scale.tick.box, scale.tick.glyph),\n setChecked: () => {},\n };\n }\n\n if (control === \"radio\") {\n const paintRadios = () => {\n radios.forEach((radio) => {\n radio.input.checked = held(radio.value);\n });\n };\n const radios = options.map((option) => ({\n value: option.value,\n input: el(\"input\", {\n type: \"radio\",\n name: groupName,\n checked: held(option.value),\n disabled: locked,\n \"aria-label\": optionLabel(option.label, option.value),\n style: {\n accentColor: skin?.accent ?? SELECTION_CONTROL_ACCENT,\n ...scale.radio,\n },\n onChange: () => {\n select(option.value);\n paintRadios();\n },\n }) as HTMLInputElement,\n label: option.label,\n }));\n\n const element = el(\n \"div\",\n {\n role: \"radiogroup\",\n \"aria-label\": locked ? lockedLabel : label,\n style: { ...groupStyle, gap: scale.gap },\n },\n ...radios.map((radio) =>\n el(\n \"label\",\n { style: { ...optionStyle, ...scale.option } },\n radio.input,\n radio.label\n )\n )\n );\n\n return {\n element,\n setChecked: (next: boolean, nextIndeterminate = false) => {\n if (locked) return;\n checked = next;\n indeterminate = nextIndeterminate;\n paintRadios();\n },\n };\n }\n\n if (control === \"dropdown\") {\n if (locked) {\n return {\n element: el(\n \"span\",\n {\n role: \"img\",\n \"aria-label\": lockedLabel,\n style: { ...settledAnswerStyle, ...scale.select, width: scale.slot },\n },\n options[0].label\n ),\n setChecked: () => {},\n };\n }\n\n const mixedOption = el(\n \"option\",\n { value: \"\", disabled: true },\n copy.mixed\n ) as HTMLOptionElement;\n\n const selectEl = el(\n \"select\",\n {\n \"aria-label\": label,\n style: { ...selectStyle, ...scale.select, ...skin?.select, width: \"100%\" },\n onChange: () => {\n select(selectEl.value === \"true\");\n paint();\n },\n },\n ...options.map((option) =>\n el(\"option\", { value: String(option.value) }, option.label)\n )\n ) as HTMLSelectElement;\n\n const paint = () => {\n if (indeterminate && mixedOption.parentNode !== selectEl) {\n selectEl.insertBefore(mixedOption, selectEl.firstChild);\n }\n if (!indeterminate && mixedOption.parentNode === selectEl) {\n selectEl.removeChild(mixedOption);\n }\n selectEl.value = indeterminate ? \"\" : String(held(true));\n };\n paint();\n\n return {\n element: el(\n \"span\",\n { style: { ...dropdownWrapStyle, width: scale.slot } },\n selectEl\n ),\n setChecked: (next: boolean, nextIndeterminate = false) => {\n checked = next;\n indeterminate = nextIndeterminate;\n paint();\n },\n };\n }\n\n const checkbox = el(\"input\", {\n className: checkboxClass(size, className),\n type: \"checkbox\",\n checked,\n \"aria-label\": label,\n onChange: () => {\n select(!checked);\n checkbox.checked = checked;\n checkbox.indeterminate = indeterminate;\n },\n }) as HTMLInputElement;\n checkbox.indeterminate = indeterminate;\n\n return {\n element: checkbox,\n setChecked: (next: boolean, nextIndeterminate = false) => {\n checked = next;\n indeterminate = nextIndeterminate;\n checkbox.checked = next;\n checkbox.indeterminate = nextIndeterminate;\n },\n };\n}\n","import { el, svg } from \"../core/dom\";\nimport { createRequiredMarker } from \"../core/required-marker\";\nimport { productPurposeKey } from \"../core/productMatrix\";\nimport { part } from \"../appearance/parts\";\nimport type { SelectionControlSkin, Style } from \"../appearance/types\";\nimport { styles as classicStyles, type NoticeStyles } from \"../styles/modal\";\nimport {\n DEFAULT_HEADING_COLOR,\n DEFAULT_TEXT_COLOR,\n} from \"../appearance/constants\";\nimport { DEFAULT_SELECTION_CONTROL } from \"../constants\";\nimport {\n hasRequiredDataElement,\n isBlockingRequiredElement,\n} from \"./consentSelection\";\nimport type { PurposeItemData, SelectionControlType } from \"../api/types\";\nimport type { SelectionControlRefs } from \"../types\";\nimport { renderSelectionControl } from \"./selection-control\";\n\nexport type ModalPurposeRefs = {\n container: HTMLElement;\n /** Data element controls, keyed `${stateKey}-${elementUuid}`. */\n elementControls: Map<string, SelectionControlRefs>;\n purposeControls: Map<string, SelectionControlRefs>;\n collapseButtons: Map<string, HTMLElement>;\n dataElementContainers: Map<string, HTMLElement>;\n chevrons: Map<string, SVGElement>;\n titleElements: Map<string, HTMLElement>;\n descriptionElements: Map<string, HTMLElement>;\n dataElementLabels: Map<string, HTMLElement>;\n};\n\n/** How the purpose rows are drawn: the notice's resolved look. */\nexport type PurposeLook = {\n styles: NoticeStyles;\n responsive: Record<string, Style>;\n headingColor: string;\n textColor: string;\n /** Descriptions, when the admin set a muted colour; else `textColor`. */\n mutedTextColor?: string;\n selectionControl: SelectionControlType;\n /** The notice language, for the control's own copy. */\n language?: string;\n controlSkin?: SelectionControlSkin;\n /** Marks each row for the appearance's stylesheet (glass hairlines). */\n rowClassName?: string;\n /** A yes/no pair, a dropdown or a switch needs a roomier data element row. */\n roomyControls: boolean;\n drawsSwitches: boolean;\n};\n\nexport const CLASSIC_PURPOSE_LOOK: PurposeLook = {\n styles: classicStyles,\n responsive: {},\n headingColor: DEFAULT_HEADING_COLOR,\n textColor: DEFAULT_TEXT_COLOR,\n selectionControl: DEFAULT_SELECTION_CONTROL,\n roomyControls: false,\n drawsSwitches: false,\n};\n\nconst settledMark = (consented: boolean, label: string): HTMLElement =>\n consented\n ? createGreenCheckmark(16, label)\n : el(\"div\", {\n role: \"img\",\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"16px\",\n height: \"16px\",\n borderRadius: \"50%\",\n border: \"2px solid #d0d5dd\",\n backgroundColor: \"transparent\",\n flexShrink: 0,\n boxSizing: \"border-box\",\n },\n \"aria-label\": label,\n });\n\nexport function renderModalPurposes(\n purposes: PurposeItemData[],\n options: {\n selectedPurposes: Record<string, boolean>;\n collapsedPurposes: Record<string, boolean>;\n selectedDataElements: Record<string, boolean>;\n initialDataElementSelections?: Record<string, boolean>;\n recordedAnswers?: Record<string, boolean>;\n look?: PurposeLook;\n isAlreadyConsented: boolean;\n productUuid?: string;\n isRowLocked?: (purposeUuid: string) => boolean;\n /** Rows go straight into this element instead of a container of their own. */\n host?: HTMLElement;\n getTranslatedText: (key: string, defaultText: string, itemId?: string) => string;\n onPurposeToggle: (purposeUuid: string, productUuid?: string) => void;\n onPurposeCollapse: (purposeUuid: string, productUuid?: string) => void;\n onDataElementToggle: (elementUuid: string, purposeUuid: string, productUuid?: string) => void;\n }\n): ModalPurposeRefs {\n const {\n selectedPurposes,\n collapsedPurposes,\n selectedDataElements,\n initialDataElementSelections = {},\n recordedAnswers = {},\n look = CLASSIC_PURPOSE_LOOK,\n isAlreadyConsented,\n productUuid,\n isRowLocked,\n getTranslatedText,\n onPurposeToggle,\n onPurposeCollapse,\n onDataElementToggle,\n } = options;\n const { styles, responsive, headingColor, textColor } = look;\n\n const elementControls = new Map<string, SelectionControlRefs>();\n const purposeControls = new Map<string, SelectionControlRefs>();\n const collapseButtons = new Map<string, HTMLElement>();\n const dataElementContainers = new Map<string, HTMLElement>();\n const chevrons = new Map<string, SVGElement>();\n const titleElements = new Map<string, HTMLElement>();\n const descriptionElements = new Map<string, HTMLElement>();\n const dataElementLabels = new Map<string, HTMLElement>();\n\n const container = options.host ?? el(\"div\", { style: styles.optionsContainer });\n\n for (const purpose of purposes) {\n const purposeWrapper = el(\"div\", { className: look.rowClassName ?? null });\n const stateKey = productPurposeKey(productUuid, purpose.uuid);\n const locked = isRowLocked ? isRowLocked(purpose.uuid) : isAlreadyConsented;\n const purposeName = getTranslatedText(\"purposes.name\", purpose.name, purpose.uuid);\n\n const chevron = svg(\n \"svg\",\n {\n width: \"7\",\n height: \"12\",\n viewBox: \"0 0 7 12\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: headingColor,\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n style: {\n transform: !collapsedPurposes[stateKey] ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.3s ease\",\n },\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", { d: \"M1 1L6 6L1 11\" })\n );\n chevrons.set(stateKey, chevron);\n\n const chevronContainer = el(\n \"div\",\n { style: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", marginLeft: \"5px\" } },\n chevron\n );\n\n const titleEl = el(\"h2\", {\n id: `purpose-name-${stateKey}`,\n ...part(\"purpose-title\"),\n style: {\n ...styles.optionTitle,\n ...responsive.optionTitle,\n color: headingColor,\n },\n });\n // Appended after `textContent`, which replaces every existing child.\n titleEl.textContent = purposeName;\n if (hasRequiredDataElement(purpose)) {\n titleEl.appendChild(createRequiredMarker());\n }\n titleElements.set(stateKey, titleEl);\n\n const descEl = el(\"h3\", {\n id: `purpose-description-${stateKey}`,\n style: {\n ...styles.optionDescription,\n ...responsive.optionDescription,\n color: look.mutedTextColor ?? textColor,\n },\n });\n descEl.textContent = getTranslatedText(\"purposes.description\", purpose.description, purpose.uuid);\n descriptionElements.set(stateKey, descEl);\n\n const textContainer = el(\"div\", { style: styles.optionTextContainer }, titleEl, descEl);\n\n const collapseBtn = el(\"div\", {\n style: styles.optionLeft,\n role: \"button\",\n tabIndex: \"0\",\n \"aria-expanded\": String(!collapsedPurposes[stateKey]),\n \"aria-controls\": `purpose-${stateKey}`,\n \"aria-label\": `${collapsedPurposes[stateKey] ? \"Expand\" : \"Collapse\"} ${purposeName} details`,\n onClick: () => onPurposeCollapse(purpose.uuid, productUuid),\n onKeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onPurposeCollapse(purpose.uuid, productUuid);\n }\n },\n }, chevronContainer, textContainer);\n collapseButtons.set(stateKey, collapseBtn);\n\n const purposeControl = renderSelectionControl({\n control: look.selectionControl,\n checked: selectedPurposes[stateKey] || false,\n onSelect: () => onPurposeToggle(purpose.uuid, productUuid),\n label: `Select all data elements for ${purposeName}`,\n groupName: `redacto-purpose-${stateKey}`,\n recordedAnswer: recordedAnswers[stateKey],\n size: \"small\",\n locked,\n lockedLabel: `Already consented to ${purposeName}`,\n language: look.language,\n skin: look.controlSkin,\n });\n if (!locked) {\n purposeControls.set(stateKey, purposeControl);\n }\n\n const optionRow = el(\n \"div\",\n { ...part(\"purpose\"), style: styles.optionItem },\n collapseBtn,\n purposeControl.element\n );\n\n const deContainer = el(\"div\", {\n id: `purpose-${stateKey}`,\n style: {\n ...styles.dataElementsContainer,\n ...(look.roomyControls ? styles.dataElementsContainerRoomy : {}),\n },\n });\n\n if (purpose.data_elements?.length > 0) {\n for (const dataElement of purpose.data_elements) {\n const combinedId = `${stateKey}-${dataElement.uuid}`;\n const elementName = getTranslatedText(\"data_elements.name\", dataElement.name, dataElement.uuid);\n\n const labelSpan = el(\"span\", {\n id: `data-element-${stateKey}-${dataElement.uuid}`,\n style: {\n ...styles.dataElementText,\n ...responsive.dataElementText,\n color: textColor,\n },\n });\n labelSpan.textContent = elementName;\n dataElementLabels.set(combinedId, labelSpan);\n\n if (isBlockingRequiredElement(dataElement)) {\n labelSpan.appendChild(createRequiredMarker());\n }\n\n let deRightElement: HTMLElement;\n if (!locked) {\n // The notice's own control, so a radio or dropdown notice asks the\n // data element the same way it asks the purpose. Kept a small round\n // check when purposes draw as switches.\n const control = renderSelectionControl({\n control: look.selectionControl,\n checked: selectedDataElements[combinedId] || false,\n onSelect: () => onDataElementToggle(dataElement.uuid, purpose.uuid, productUuid),\n label: `Select ${elementName}${isBlockingRequiredElement(dataElement) ? \" (required)\" : \"\"}`,\n groupName: `redacto-data-element-${combinedId}`,\n size: \"small\",\n className: \"redacto-checkbox-small\",\n language: look.language,\n skin: look.controlSkin,\n });\n elementControls.set(combinedId, control);\n deRightElement = control.element;\n } else {\n // A settled row records what was answered, yes or no, which the\n // control's locked state (always yes) cannot say.\n const wasSelected = initialDataElementSelections[combinedId] || false;\n deRightElement = settledMark(\n wasSelected,\n `${wasSelected ? \"Consented\" : \"Not consented\"} to ${elementName}`\n );\n }\n\n const deRow = el(\n \"div\",\n {\n ...part(\"data-element\"),\n style: {\n ...styles.dataElementItem,\n ...(look.roomyControls ? styles.dataElementItemRoomy : {}),\n },\n },\n labelSpan,\n deRightElement\n );\n deContainer.appendChild(deRow);\n }\n }\n\n dataElementContainers.set(stateKey, deContainer);\n deContainer.style.display = !collapsedPurposes[stateKey] && purpose.data_elements?.length > 0 ? \"flex\" : \"none\";\n\n purposeWrapper.appendChild(optionRow);\n purposeWrapper.appendChild(deContainer);\n container.appendChild(purposeWrapper);\n }\n\n return {\n container,\n elementControls,\n purposeControls,\n collapseButtons,\n dataElementContainers,\n chevrons,\n titleElements,\n descriptionElements,\n dataElementLabels,\n };\n}\n\nexport function createGreenCheckmark(size: number, ariaLabel: string): HTMLElement {\n const svgSize = size === 20 ? 12 : 10;\n const strokeWidth = size === 20 ? \"2\" : \"1.5\";\n const pathD = size === 20 ? \"M4 6L5.5 7.5L8.5 4.5\" : \"M3 5L4.5 6.5L7.5 3.5\";\n\n const checkSvg = svg(\n \"svg\",\n {\n width: String(svgSize),\n height: String(svgSize),\n viewBox: `0 0 ${svgSize} ${svgSize}`,\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", {\n d: pathD,\n stroke: \"white\",\n \"stroke-width\": strokeWidth,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n })\n );\n\n return el(\"div\", {\n role: \"img\",\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: \"50%\",\n backgroundColor: \"#10B981\",\n flexShrink: 0,\n },\n \"aria-label\": ariaLabel,\n }, checkSvg);\n}\n","import { el, svg } from \"../core/dom\";\nimport { part } from \"../appearance/parts\";\nimport type { Style } from \"../appearance/types\";\nimport { styles as classicStyles, type NoticeStyles } from \"../styles/modal\";\nimport type { Settings } from \"../api/types\";\n\nexport const LANGUAGE_NATIVE_LABELS: Record<string, string> = {\n English: \"English\",\n Assamese: \"অসমীয়া (Assamese)\",\n Bengali: \"বাংলা (Bengali)\",\n Bodo: \"बड़ो (Bodo)\",\n Dogri: \"डोगरी (Dogri)\",\n \"Goan Konkani\": \"कोंकणी (Goan Konkani)\",\n Gujarati: \"ગુજરાતી (Gujarati)\",\n Hindi: \"हिन्दी (Hindi)\",\n Kannada: \"ಕನ್ನಡ (Kannada)\",\n Kashmiri: \"كٲشُر (Kashmiri)\",\n Maithili: \"मैथिली (Maithili)\",\n Malayalam: \"മലയാളം (Malayalam)\",\n Manipuri: \"ꯃꯩꯇꯩꯂꯣꯟ (Manipuri)\",\n Marathi: \"मराठी (Marathi)\",\n Nepali: \"नेपाली (Nepali)\",\n Odia: \"ଓଡ଼ିଆ (Odia)\",\n Punjabi: \"ਪੰਜਾਬੀ (Punjabi)\",\n Sanskrit: \"संस्कृतम् (Sanskrit)\",\n Santali: \"ᱥᱟᱱᱛᱟᱲᱤ (Santali)\",\n Sindhi: \"سنڌي (Sindhi)\",\n Tamil: \"தமிழ் (Tamil)\",\n Telugu: \"తెలుగు (Telugu)\",\n Urdu: \"اردو (Urdu)\",\n};\n\nexport const toNativeLabel = (name: string): string => LANGUAGE_NATIVE_LABELS[name] ?? name;\n\nexport type LanguageSelectorRefs = {\n container: HTMLElement;\n button: HTMLElement;\n dropdown: HTMLElement;\n buttonText: HTMLElement;\n close: () => void;\n};\n\n/** How a themed notice paints the chip and its menu; classic when absent. */\nexport type LanguageSelectorLook = {\n styles: NoticeStyles;\n responsive?: Record<string, Style>;\n chip: Style;\n menu: Style;\n selected: Style;\n /** The notice's root attributes, so its stylesheets and custom CSS reach the menu. */\n rootAttributes?: Record<string, string>;\n};\n\nconst legacyLook = (settings: Partial<Settings> | undefined): LanguageSelectorLook => {\n const language = settings?.button?.language;\n const chip: Style = language\n ? { backgroundColor: language.backgroundColor, color: language.textColor }\n : {};\n const menu: Style = {};\n const selected: Style = {\n ...(language?.selectedBackgroundColor\n ? { backgroundColor: language.selectedBackgroundColor }\n : {}),\n ...(language?.selectedTextColor ? { color: language.selectedTextColor } : {}),\n };\n return { styles: classicStyles, chip, menu, selected };\n};\n\nexport function renderLanguageSelector(options: {\n languages: string[];\n selectedLanguage: string;\n settings?: Partial<Settings>;\n /** Wins over `settings`: the console appearance resolved for the notice. */\n look?: LanguageSelectorLook;\n onSelect: (lang: string) => void;\n /**\n * Where the dropdown panel itself is appended. We append it as a sibling of\n * the modal (rather than inside `container`) so it can escape the modal's\n * `transform: translate(...)` stacking context. Pass the shadow root when\n * the modal is rendered inside a shadow boundary; otherwise pass\n * `document.body`.\n */\n dropdownContainer: HTMLElement | ShadowRoot;\n}): LanguageSelectorRefs {\n const { languages, selectedLanguage, settings, onSelect, dropdownContainer } = options;\n const look = options.look ?? legacyLook(settings);\n const { styles } = look;\n\n let isOpen = false;\n\n const buttonText = el(\"span\");\n buttonText.textContent = toNativeLabel(selectedLanguage);\n\n const chevronSvg = svg(\n \"svg\",\n {\n width: \"8\",\n height: \"5\",\n viewBox: \"0 0 8 5\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n },\n svg(\"path\", {\n d: \"M1 1L4 4L7 1\",\n stroke: (look.chip.color as string | undefined) || \"#344054\",\n \"stroke-width\": \"1.5\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n })\n );\n\n const buttonStyle: Style = {\n ...styles.topRight,\n ...look.responsive?.topRight,\n ...look.chip,\n };\n\n const button = el(\"div\", {\n ...part(\"language\"),\n style: buttonStyle,\n role: \"button\",\n tabIndex: \"0\",\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": \"false\",\n \"aria-label\": `Language selector, current: ${toNativeLabel(selectedLanguage)}`,\n onClick: () => toggleDropdown(),\n onKeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleDropdown();\n } else if (e.key === \"Escape\") {\n closeDropdown();\n }\n },\n }, buttonText, chevronSvg);\n\n // Dropdown — uses position:fixed to escape modal's transform stacking context\n const dropdown = el(\"div\", {\n ...look.rootAttributes,\n style: {\n ...styles.languageDropdown,\n ...look.menu,\n position: \"fixed\",\n top: \"auto\",\n right: \"auto\",\n marginTop: 0,\n zIndex: 2147483647, // max int — always on top\n minWidth: \"140px\",\n width: \"auto\",\n display: \"none\",\n },\n role: \"listbox\",\n \"aria-label\": \"Select language\",\n });\n\n for (const lang of languages) {\n const isSelected = lang === selectedLanguage;\n const restingStyle: Style = {\n ...styles.languageItem,\n ...look.responsive?.languageItem,\n ...(isSelected ? { ...styles.selectedLanguageItem, ...look.selected } : look.menu),\n };\n const resting = (restingStyle.backgroundColor as string | undefined) ?? \"\";\n const hover = isSelected\n ? resting\n : ((look.selected.backgroundColor as string | undefined) ?? \"#f3f4f6\");\n\n const item = el(\"div\", {\n style: restingStyle,\n role: \"option\",\n \"aria-selected\": String(isSelected),\n onClick: () => {\n onSelect(lang);\n closeDropdown();\n },\n onMouseenter: (e: Event) => {\n (e.target as HTMLElement).style.backgroundColor = hover;\n },\n onMouseleave: (e: Event) => {\n (e.target as HTMLElement).style.backgroundColor = resting;\n },\n });\n item.textContent = toNativeLabel(lang);\n dropdown.appendChild(item);\n }\n\n // Container only holds the button — dropdown is appended to its container\n // (shadow root in the modal flow, body for non-shadow callers) so it can\n // escape the modal's transform stacking context.\n const container = el(\"div\", { style: styles.languageSelectorContainer }, button);\n\n dropdownContainer.appendChild(dropdown);\n\n function positionDropdown() {\n const rect = button.getBoundingClientRect();\n dropdown.style.top = `${rect.bottom + 4}px`;\n dropdown.style.right = `${window.innerWidth - rect.right}px`;\n dropdown.style.left = \"auto\";\n }\n\n // Click outside handler. When the modal is inside a shadow root the click\n // event's `target` is retargeted to the shadow host for listeners on the\n // document. `composedPath()` returns the real path through the shadow tree\n // so we can correctly detect whether the click originated inside the\n // selector or its dropdown.\n const clickOutsideHandler = (e: Event) => {\n const path = (e as Event & { composedPath?: () => EventTarget[] }).composedPath?.() ?? [];\n if (path.includes(container) || path.includes(dropdown)) return;\n\n // Fallback for environments without composedPath()\n if (path.length === 0) {\n const target = e.target as Node;\n if (container.contains(target) || dropdown.contains(target)) return;\n }\n closeDropdown();\n };\n\n // Reposition on scroll/resize while open\n const repositionHandler = () => {\n if (isOpen) positionDropdown();\n };\n\n function toggleDropdown() {\n isOpen ? closeDropdown() : openDropdown();\n }\n\n function openDropdown() {\n isOpen = true;\n positionDropdown();\n dropdown.style.display = \"block\";\n button.setAttribute(\"aria-expanded\", \"true\");\n setTimeout(() => {\n document.addEventListener(\"click\", clickOutsideHandler);\n }, 0);\n window.addEventListener(\"scroll\", repositionHandler, true);\n window.addEventListener(\"resize\", repositionHandler);\n }\n\n function closeDropdown() {\n isOpen = false;\n dropdown.style.display = \"none\";\n button.setAttribute(\"aria-expanded\", \"false\");\n document.removeEventListener(\"click\", clickOutsideHandler);\n window.removeEventListener(\"scroll\", repositionHandler, true);\n window.removeEventListener(\"resize\", repositionHandler);\n }\n\n return { container, button, dropdown, buttonText, close: closeDropdown };\n}\n","/**\n * Focus trap + keyboard navigation for the modal.\n */\n\nexport type KeyboardTrapCleanup = () => void;\n\nexport function setupKeyboardTrap(\n modalEl: HTMLElement,\n onEscape: () => void\n): KeyboardTrapCleanup {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onEscape();\n return;\n }\n\n if (e.key === \"Tab\") {\n const focusableElements = modalEl.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const focusable = Array.from(focusableElements).filter(\n (el) => !el.hasAttribute(\"disabled\") && el.offsetParent !== null\n );\n\n if (focusable.length === 0) {\n e.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n // When the modal lives inside a shadow root, document.activeElement\n // returns the shadow host rather than the actually focused element.\n // Read activeElement from the modal's own root for a correct answer.\n const root = modalEl.getRootNode() as Document | ShadowRoot;\n const active =\n (root as ShadowRoot).activeElement ?? document.activeElement;\n\n if (e.shiftKey) {\n if (active === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n };\n\n document.addEventListener(\"keydown\", handler);\n\n // Auto-focus first focusable element\n requestAnimationFrame(() => {\n const firstFocusable = modalEl.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n firstFocusable?.focus();\n });\n\n return () => {\n document.removeEventListener(\"keydown\", handler);\n };\n}\n","import type { PersistedConsentState } from \"../api/types\";\n\nconst STORAGE_KEY = \"redacto_consent_sdk_state\";\nconst STATE_EXPIRY_MS = 30 * 60 * 1000; // 30 minutes\n\nconst isBrowser = (): boolean => {\n return typeof window !== \"undefined\" && typeof window.sessionStorage !== \"undefined\";\n};\n\nexport const saveConsentState = (state: PersistedConsentState): void => {\n if (!isBrowser()) {\n console.warn(\"SessionStorage not available - state not persisted\");\n return;\n }\n\n try {\n const stateWithTimestamp = {\n ...state,\n timestamp: new Date().toISOString(),\n };\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(stateWithTimestamp));\n } catch (error) {\n console.error(\"Failed to save consent state:\", error);\n }\n};\n\nexport const getConsentState = (): PersistedConsentState | null => {\n if (!isBrowser()) return null;\n\n try {\n const savedState = sessionStorage.getItem(STORAGE_KEY);\n if (!savedState) return null;\n\n const parsed: PersistedConsentState = JSON.parse(savedState);\n\n const stateAge = Date.now() - new Date(parsed.timestamp).getTime();\n if (stateAge > STATE_EXPIRY_MS) {\n clearConsentState();\n return null;\n }\n\n return parsed;\n } catch (error) {\n console.error(\"Failed to get consent state:\", error);\n return null;\n }\n};\n\nexport const clearConsentState = (): void => {\n if (!isBrowser()) return;\n\n try {\n sessionStorage.removeItem(STORAGE_KEY);\n } catch (error) {\n console.error(\"Failed to clear consent state:\", error);\n }\n};\n\nexport const updateConsentState = (updates: Partial<PersistedConsentState>): void => {\n const currentState = getConsentState();\n if (currentState) {\n saveConsentState({\n ...currentState,\n ...updates,\n timestamp: new Date().toISOString(),\n });\n }\n};\n\nexport const hasPendingVerification = (): boolean => {\n const state = getConsentState();\n return state !== null && state.flowState === \"digilocker-pending\";\n};\n\nexport const getVerificationResult = (): \"pending\" | \"verified\" | \"failed\" | \"in_progress\" | \"expired\" | null => {\n const state = getConsentState();\n return state?.verificationResult ?? null;\n};\n\nexport const getVerificationReference = (): string | null => {\n const state = getConsentState();\n return state?.verificationReference ?? null;\n};\n","import { fetchTTSAudioUrls } from \"../api\";\nimport {\n ACCEPT_ALL_BUTTON_ID,\n ACCEPT_SELECTED_BUTTON_ID,\n DECLINE_BUTTON_ID,\n DPO_AUDIO_ELEMENT_MAP,\n} from \"../constants\";\nimport { purposesInRenderOrder } from \"../core/productMatrix\";\nimport type {\n ActiveConfig,\n PurposeItemData,\n SandboxOptions,\n TTSAudioUrlsResponse,\n} from \"../api/types\";\nimport type { EndpointMode } from \"../shared/endpoints\";\nimport type { TTSAudioFetcher } from \"../shared/types\";\n\nexport class TTSManager {\n private audioUrls: TTSAudioUrlsResponse[\"detail\"] | null = null;\n private audioSequence: string[] = [];\n private elementIdSequence: string[] = [];\n private currentAudio: HTMLAudioElement | null = null;\n private currentIndex = 0;\n private _isPlaying = false;\n private _isPaused = false;\n private _isAvailable = false;\n private highlightedElementId: string | null = null;\n private abortController: AbortController | null = null;\n private onStateChange: () => void;\n private root: Document | ShadowRoot;\n private fetchAudio: TTSAudioFetcher;\n\n /**\n * @param onStateChange Invoked whenever playback state changes so the host\n * can refresh its UI (e.g. swap the play/pause icon).\n * @param root The root in which to look up highlightable elements by id.\n * When the modal is rendered inside a shadow root, pass that shadow root\n * so queries stay scoped to the SDK's tree (and don't accidentally hit\n * element ids that the host page also defines).\n */\n constructor(\n onStateChange: () => void,\n root: Document | ShadowRoot,\n fetchAudio: TTSAudioFetcher = fetchTTSAudioUrls\n ) {\n this.onStateChange = onStateChange;\n this.root = root;\n this.fetchAudio = fetchAudio;\n }\n\n get isPlaying(): boolean { return this._isPlaying; }\n get isPaused(): boolean { return this._isPaused; }\n get isAvailable(): boolean { return this._isAvailable; }\n get currentElementId(): string | null { return this.highlightedElementId; }\n\n async fetchAudioUrls(params: SandboxOptions & {\n accessToken?: string;\n baseUrl?: string;\n ledgerBaseUrl?: string;\n endpointMode?: EndpointMode;\n noticeUuid: string;\n language: string;\n content: ActiveConfig;\n /** The purposes in the order the notice shows them; render order when absent. */\n purposes?: ReadonlyArray<PurposeItemData>;\n }): Promise<void> {\n // Reset availability + sequences SYNCHRONOUSLY before notifying. The\n // language can change while a previous language's URLs are still loaded;\n // if we don't clear here, a click on the speaker icon (or the in-flight\n // stop()) would either keep the icon showing or replay the previous\n // language's audio. We then fire a single onStateChange() so the UI hides\n // the icon while the new language's audio is being fetched.\n this.stopInternal();\n this._isAvailable = false;\n this.audioUrls = null;\n this.audioSequence = [];\n this.elementIdSequence = [];\n this.onStateChange();\n\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n try {\n const response = await this.fetchAudio({\n accessToken: params.accessToken,\n baseUrl: params.baseUrl,\n ledgerBaseUrl: params.ledgerBaseUrl,\n endpointMode: params.endpointMode,\n noticeUuid: params.noticeUuid,\n language: params.language,\n signal: this.abortController.signal,\n token: params.token,\n sandboxUcic: params.sandboxUcic,\n sandboxEmail: params.sandboxEmail,\n sandboxMobile: params.sandboxMobile,\n organisationUuid: params.organisationUuid,\n workspaceUuid: params.workspaceUuid,\n });\n\n this.audioUrls = response.detail;\n this.buildSequences(params.content, params.purposes);\n // Only mark TTS as available if the backend actually returned playable\n // audio for this language. Some languages (e.g. Santali) come back with\n // a 200 but empty / partial fields — surfacing the speaker icon in that\n // case would let users click it and replay the previous language.\n this._isAvailable = this.audioSequence.length > 0;\n this.onStateChange();\n } catch (error) {\n if ((error as Error).name !== \"AbortError\") {\n this._isAvailable = false;\n this.audioUrls = null;\n this.audioSequence = [];\n this.elementIdSequence = [];\n this.onStateChange();\n }\n }\n }\n\n private buildSequences(\n content: ActiveConfig,\n ordered?: ReadonlyArray<PurposeItemData>\n ): void {\n if (!this.audioUrls) return;\n const urls = this.audioUrls;\n\n const audioSeq: string[] = [];\n const elementSeq: string[] = [];\n\n const push = (url: string | undefined, elementId: string) => {\n if (url) {\n audioSeq.push(url);\n elementSeq.push(elementId);\n }\n };\n\n // 1. Notice banner heading\n push(urls.notice_banner_heading_audio_url, \"privacy-notice-title\");\n // 2. Notice text\n push(urls.notice_text_audio_url, \"privacy-notice-text\");\n // 3. Privacy policy prefix text\n push(urls.privacy_policy_prefix_text_audio_url, \"privacy-policy-text\");\n // 4. Privacy policy anchor text\n push(urls.privacy_policy_anchor_text_audio_url, \"privacy-policy-link\");\n // 5. Purpose section heading\n push(urls.purpose_section_heading_audio_url, \"purpose-section-heading\");\n\n // 6. For each purpose, in the order the visitor sees them: name,\n // description, data elements.\n const purposes =\n ordered ??\n purposesInRenderOrder(\n content.products,\n content.purposes,\n content.product_purpose_order\n );\n for (const purpose of purposes) {\n const purposeAudio = urls.purposes_audio?.[purpose.uuid];\n if (purposeAudio) {\n push(purposeAudio.name_audio_url, `purpose-name-${purpose.uuid}`);\n push(purposeAudio.description_audio_url, `purpose-description-${purpose.uuid}`);\n }\n\n for (const de of purpose.data_elements) {\n const deAudio = urls.data_elements_audio?.[de.uuid];\n if (deAudio) {\n push(deAudio.name_audio_url, `data-element-${purpose.uuid}-${de.uuid}`);\n }\n }\n }\n\n // 7. Additional text, when the notice shows any\n if (content.additional_text) {\n push(urls.additional_text_audio_url, \"additional-text\");\n }\n // 8. Privacy center anchor text, when the notice links one\n if (content.privacy_center_url) {\n push(urls.privacy_center_anchor_text_audio_url, \"privacy-center-link\");\n }\n\n // 9. DPO info audio\n if (urls.dpo_info_audio) {\n for (const mapping of DPO_AUDIO_ELEMENT_MAP) {\n const audioUrl = urls.dpo_info_audio[mapping.audioKey];\n push(audioUrl, mapping.elementId);\n }\n }\n\n // 10. Action buttons, read in the order they are laid out.\n push(urls.accept_all_button_text_audio_url, ACCEPT_ALL_BUTTON_ID);\n push(urls.confirm_button_text_audio_url, ACCEPT_SELECTED_BUTTON_ID);\n push(urls.decline_button_text_audio_url, DECLINE_BUTTON_ID);\n\n this.audioSequence = audioSeq;\n this.elementIdSequence = elementSeq;\n }\n\n toggle(): void {\n this._isPlaying ? this.pause() : this.play();\n }\n\n play(): void {\n if (this.audioSequence.length === 0) return;\n\n if (this._isPaused && this.currentAudio) {\n this.currentAudio.play()\n .then(() => {\n this._isPlaying = true;\n this._isPaused = false;\n this.onStateChange();\n })\n .catch(() => {});\n } else {\n const startIndex = this._isPlaying ? this.currentIndex : 0;\n this.playNextAudio(startIndex);\n }\n }\n\n pause(): void {\n if (this.currentAudio && this._isPlaying) {\n this.currentAudio.pause();\n this._isPlaying = false;\n this._isPaused = true;\n this.onStateChange();\n }\n }\n\n stop(): void {\n this.stopInternal();\n this.onStateChange();\n }\n\n /**\n * Internal stop used by code paths (like fetchAudioUrls) that will fire\n * their own onStateChange after composing a richer state update — we don't\n * want the intermediate notification to flicker the UI based on a half-set\n * state (e.g. _isAvailable still true from the previous language).\n */\n private stopInternal(): void {\n if (this.currentAudio) {\n this.currentAudio.pause();\n this.currentAudio.currentTime = 0;\n this.currentAudio = null;\n }\n this._isPlaying = false;\n this._isPaused = false;\n this.currentIndex = 0;\n this.removeHighlights();\n this.highlightedElementId = null;\n }\n\n destroy(): void {\n this.abortController?.abort();\n this.stop();\n }\n\n private playNextAudio(index: number): void {\n if (index >= this.audioSequence.length) {\n this.stop();\n return;\n }\n\n if (this.currentAudio) {\n this.currentAudio.pause();\n this.currentAudio = null;\n }\n\n const audio = new Audio(this.audioSequence[index]);\n this.currentAudio = audio;\n this.currentIndex = index;\n this._isPlaying = true;\n this._isPaused = false;\n\n // Highlight\n const elementId = this.elementIdSequence[index];\n if (elementId) {\n this.highlightElement(elementId);\n }\n\n audio.onended = () => this.playNextAudio(index + 1);\n audio.onerror = () => {\n console.warn(`Failed to load audio at index ${index}`);\n this.playNextAudio(index + 1);\n };\n\n audio.play().catch((error) => {\n console.warn(`Failed to play audio at index ${index}:`, error);\n this._isPlaying = false;\n this.onStateChange();\n });\n\n this.onStateChange();\n }\n\n private highlightElement(elementId: string): void {\n this.removeHighlights();\n this.highlightedElementId = elementId;\n\n setTimeout(() => {\n // ShadowRoot has getElementById in modern browsers; fall back to\n // querySelector with CSS.escape for safety.\n const element =\n \"getElementById\" in this.root\n ? (this.root as Document | ShadowRoot & { getElementById(id: string): HTMLElement | null }).getElementById(elementId)\n : (this.root as ShadowRoot).querySelector<HTMLElement>(`#${CSS.escape(elementId)}`);\n if (element) {\n element.classList.add(\"redacto-tts-highlight\");\n\n const rect = element.getBoundingClientRect();\n const isVisible =\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth;\n\n if (!isVisible) {\n element.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"nearest\",\n });\n }\n }\n }, 50);\n }\n\n private removeHighlights(): void {\n this.root.querySelectorAll(\".redacto-tts-highlight\").forEach((el) => {\n el.classList.remove(\"redacto-tts-highlight\");\n });\n }\n}\n","import { el, svg } from \"../core/dom\";\nimport { styles } from \"../styles/modal\";\nimport type { Settings } from \"../api/types\";\nimport type { ResolvedColors } from \"./colors\";\n\nexport type AgeVerificationRefs = {\n container: HTMLElement;\n};\n\nexport function renderAgeVerification(options: {\n settings?: Partial<Settings>;\n colors: ResolvedColors;\n isMobile: boolean;\n logoUrl: string;\n onYes: () => void;\n onNo: () => void;\n onClose: () => void;\n}): AgeVerificationRefs {\n const { settings, colors, isMobile, logoUrl, onYes, onNo, onClose } = options;\n\n const headingColor = settings?.headingColor || \"#101828\";\n const textColor = colors.text;\n const font = colors.font;\n\n // ─── Top Section (matches React: logo+title left, X button right) ───\n const logo = el(\"img\", { src: logoUrl, style: styles.logo, alt: \"Redacto Logo\" });\n\n const title = el(\"h2\", {\n id: \"age-verification-title\",\n style: {\n ...styles.title,\n fontSize: isMobile ? \"16px\" : \"18px\",\n color: headingColor,\n fontFamily: font,\n },\n });\n title.textContent = \"Age Verification Required\";\n\n const topLeft = el(\"div\", { style: styles.topLeft }, logo, title);\n\n const closeBtn = el(\"button\", {\n style: {\n background: \"none\",\n border: \"none\",\n color: headingColor,\n cursor: \"pointer\",\n padding: isMobile ? \"2px\" : \"4px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n type: \"button\",\n \"aria-label\": \"Close modal\",\n onClick: onClose,\n });\n const closeSvg = svg(\n \"svg\",\n {\n width: isMobile ? \"18\" : \"20\",\n height: isMobile ? \"18\" : \"20\",\n viewBox: \"0 0 20 20\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", {\n d: \"M15 5L5 15M5 5L15 15\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n })\n );\n closeBtn.appendChild(closeSvg);\n\n const topSection = el(\"div\", {\n style: { ...styles.topSection, color: textColor, fontFamily: font },\n }, topLeft, closeBtn);\n\n // ─── Middle Section ───\n const description = el(\"p\", {\n style: {\n ...styles.privacyText,\n fontSize: isMobile ? \"14px\" : \"16px\",\n color: textColor,\n fontFamily: font,\n marginBottom: \"16px\",\n },\n });\n description.textContent = \"To proceed with this consent form, we need to verify your age.\";\n\n const question = el(\"p\", {\n style: {\n ...styles.subTitle,\n color: textColor,\n fontFamily: font,\n marginBottom: \"24px\",\n textAlign: \"left\",\n },\n });\n question.textContent = \"Are you 18 years of age or older?\";\n\n const middleSection = el(\"div\", {\n style: { ...styles.middleSection, color: textColor, fontFamily: font },\n }, description, question);\n\n // ─── Bottom Section (Yes first, No second — matches React) ───\n const btnBase = {\n ...styles.button,\n fontSize: isMobile ? \"14px\" : \"16px\",\n padding: isMobile ? \"10px 20px\" : \"9px 45px\",\n };\n\n const yesBtn = el(\"button\", {\n style: {\n ...btnBase,\n ...styles.acceptButton,\n backgroundColor: colors.acceptBg,\n color: colors.acceptText,\n borderRadius: colors.borderRadius,\n },\n type: \"button\",\n \"aria-label\": \"Confirm that I am 18 years of age or older\",\n onClick: onYes,\n });\n yesBtn.textContent = \"Yes, I am 18 or older\";\n\n const noBtn = el(\"button\", {\n style: {\n ...btnBase,\n ...styles.cancelButton,\n backgroundColor: colors.declineBg,\n color: colors.declineText,\n borderColor: colors.declineBorder,\n borderRadius: colors.borderRadius,\n },\n type: \"button\",\n \"aria-label\": \"Indicate that I am under 18 years of age\",\n onClick: onNo,\n });\n noBtn.textContent = \"No, I am under 18\";\n\n const bottomSection = el(\"div\", {\n style: { ...styles.bottomSection, color: textColor, fontFamily: font },\n }, yesBtn, noBtn);\n\n // ─── Assemble (wrapped in content div like modal) ───\n const container = el(\"div\", { style: styles.content }, topSection, middleSection, bottomSection);\n\n return { container };\n}\n","import { el, svg } from \"../core/dom\";\nimport { styles } from \"../styles/modal\";\nimport type { Settings } from \"../api/types\";\nimport type { ResolvedColors } from \"./colors\";\n\nconst RELATIONSHIP_OPTIONS = [\n { value: \"Father\", label: \"Father\" },\n { value: \"Mother\", label: \"Mother\" },\n { value: \"Legal Guardian\", label: \"Legal Guardian\" },\n { value: \"Grandparent\", label: \"Grandparent\" },\n];\n\nexport type GuardianFormData = {\n guardianName: string;\n guardianContact: string;\n guardianRelationship: string;\n};\n\nexport type GuardianFormRefs = {\n container: HTMLElement;\n nameInput: HTMLInputElement;\n contactInput: HTMLInputElement;\n relationshipDisplay: HTMLElement;\n nameError: HTMLElement;\n contactError: HTMLElement;\n relationshipError: HTMLElement;\n submitBtn: HTMLButtonElement;\n generalError: HTMLElement;\n};\n\nexport function renderGuardianForm(options: {\n formData: GuardianFormData;\n settings?: Partial<Settings>;\n colors: ResolvedColors;\n isMobile: boolean;\n logoUrl: string;\n isSubmitting: boolean;\n onSubmit: () => void;\n onCancel: () => void;\n onFieldChange: (field: keyof GuardianFormData, value: string) => void;\n}): GuardianFormRefs {\n const { formData, settings, colors, isMobile, logoUrl, isSubmitting, onSubmit, onCancel, onFieldChange } = options;\n\n const headingColor = settings?.headingColor || \"#101828\";\n const textColor = colors.text;\n const borderColor = colors.declineBorder;\n const bgColor = settings?.backgroundColor || \"#ffffff\";\n const radius = colors.borderRadius;\n const font = colors.font;\n const accentColor = colors.acceptBg;\n\n const inputStyle: Record<string, any> = {\n width: \"100%\",\n padding: \"10px 12px\",\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n fontSize: \"13px\",\n fontFamily: font,\n color: textColor,\n backgroundColor: bgColor,\n marginBottom: \"2px\",\n boxSizing: \"border-box\",\n outline: \"none\",\n };\n\n const errorStyle: Record<string, any> = {\n color: \"#DC2626\",\n fontSize: \"11px\",\n marginTop: \"4px\",\n marginBottom: \"0px\",\n display: \"none\",\n };\n\n const labelStyle: Record<string, any> = {\n fontSize: \"13px\",\n fontWeight: 500,\n color: textColor,\n fontFamily: font,\n marginBottom: \"4px\",\n display: \"block\",\n };\n\n const hintStyle: Record<string, any> = {\n fontSize: \"11px\",\n color: \"#667085\",\n marginTop: \"2px\",\n marginBottom: \"0px\",\n lineHeight: \"1.4\",\n };\n\n // ─── Top Section ───\n const logo = el(\"img\", { src: logoUrl, style: styles.logo, alt: \"Logo\" });\n const title = el(\"h2\", {\n id: \"guardian-form-title\",\n style: {\n ...styles.title,\n fontSize: \"16px\",\n fontWeight: 600,\n color: headingColor,\n fontFamily: font,\n },\n });\n title.textContent = \"Guardian Verification\";\n\n const topLeft = el(\"div\", { style: styles.topLeft }, logo, title);\n const topSection = el(\"div\", {\n style: { ...styles.topSection, color: textColor, fontFamily: font },\n }, topLeft);\n\n // ─── Middle Section ───\n const subtitle = el(\"p\", {\n style: {\n ...styles.privacyText,\n fontSize: \"13px\",\n lineHeight: \"1.5\",\n color: textColor,\n fontFamily: font,\n marginBottom: \"12px\",\n },\n });\n subtitle.textContent = \"Since you are under the age of consent, a legal guardian must verify their identity via DigiLocker before you can proceed.\";\n\n // Info banner with SVG icon\n const infoIcon = svg(\n \"svg\",\n {\n width: \"16\", height: \"16\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: \"#2563EB\", \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"circle\", { cx: \"12\", cy: \"12\", r: \"10\" }),\n svg(\"line\", { x1: \"12\", y1: \"16\", x2: \"12\", y2: \"12\" }),\n svg(\"line\", { x1: \"12\", y1: \"8\", x2: \"12.01\", y2: \"8\" })\n );\n (infoIcon as unknown as HTMLElement).style.cssText = \"flex-shrink:0;margin-top:1px\";\n\n const infoText = el(\"span\");\n infoText.textContent = \"The guardian's name will be matched against their DigiLocker identity document (e.g. Aadhaar). Please enter the name exactly as it appears on the document.\";\n\n const infoBanner = el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n padding: \"10px 12px\",\n backgroundColor: \"#EFF6FF\",\n border: \"1px solid #BFDBFE\",\n borderRadius: radius,\n marginBottom: \"16px\",\n fontSize: \"12px\",\n lineHeight: \"1.5\",\n color: \"#1E40AF\",\n },\n }, infoIcon, infoText);\n\n // ─── Name field ───\n const nameLabel = el(\"label\", { for: \"guardianName\", style: labelStyle });\n nameLabel.innerHTML = `Guardian's Full Name <span style=\"color:#DC2626\">*</span>`;\n\n const nameInput = el(\"input\", {\n id: \"guardianName\",\n type: \"text\",\n style: inputStyle,\n value: formData.guardianName,\n placeholder: \"e.g. Rajesh Kumar\",\n autoComplete: \"name\",\n \"aria-describedby\": \"guardianName-hint\",\n onInput: (e: Event) => onFieldChange(\"guardianName\", (e.target as HTMLInputElement).value),\n }) as HTMLInputElement;\n\n const nameHint = el(\"p\", { id: \"guardianName-hint\", style: hintStyle });\n nameHint.textContent = \"Enter the full name as per government ID (Aadhaar, PAN, etc.)\";\n\n const nameError = el(\"div\", { style: errorStyle, role: \"alert\" });\n const nameGroup = el(\"div\", null, nameLabel, nameInput, nameHint, nameError);\n\n // ─── Contact field ───\n const contactLabel = el(\"label\", { for: \"guardianContact\", style: labelStyle });\n contactLabel.innerHTML = `Guardian's Phone Number <span style=\"color:#DC2626\">*</span>`;\n\n const contactInput = el(\"input\", {\n id: \"guardianContact\",\n type: \"tel\",\n inputMode: \"tel\",\n style: inputStyle,\n value: formData.guardianContact,\n placeholder: \"e.g. 9876543210\",\n autoComplete: \"tel\",\n \"aria-describedby\": \"guardianContact-hint\",\n onInput: (e: Event) => onFieldChange(\"guardianContact\", (e.target as HTMLInputElement).value),\n }) as HTMLInputElement;\n\n const contactHint = el(\"p\", { id: \"guardianContact-hint\", style: hintStyle });\n contactHint.textContent = \"Mobile number linked to guardian's Aadhaar\";\n\n const contactError = el(\"div\", { style: errorStyle, role: \"alert\" });\n const contactGroup = el(\"div\", null, contactLabel, contactInput, contactHint, contactError);\n\n // ─── Relationship dropdown ───\n const relLabel = el(\"label\", { id: \"guardianRelationship-label\", style: labelStyle });\n relLabel.innerHTML = `Relationship <span style=\"color:#DC2626\">*</span>`;\n\n const selectedLabel = RELATIONSHIP_OPTIONS.find((o) => o.value === formData.guardianRelationship)?.label;\n\n const chevronSvg = svg(\n \"svg\",\n {\n width: \"14\", height: \"14\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: \"#667085\", \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"polyline\", { points: \"6 9 12 15 18 9\" })\n );\n (chevronSvg as unknown as HTMLElement).style.cssText = \"flex-shrink:0;margin-left:8px;transition:transform 0.2s\";\n\n const selectedSpan = el(\"span\", {\n style: { overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" },\n });\n selectedSpan.textContent = selectedLabel || \"Select relationship\";\n\n const relationshipDisplay = el(\"div\", {\n role: \"combobox\",\n \"aria-expanded\": \"false\",\n \"aria-haspopup\": \"listbox\",\n \"aria-labelledby\": \"guardianRelationship-label\",\n tabIndex: \"0\",\n style: {\n ...inputStyle,\n color: selectedLabel ? textColor : \"#9CA3AF\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n userSelect: \"none\",\n transition: \"border-color 0.15s, box-shadow 0.15s\",\n },\n }, selectedSpan, chevronSvg);\n\n // Dropdown list\n const dropdownList = el(\"div\", {\n id: \"guardianRelationship-listbox\",\n role: \"listbox\",\n \"aria-labelledby\": \"guardianRelationship-label\",\n style: {\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: 0,\n right: 0,\n backgroundColor: bgColor,\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.1), 0 1px 3px rgba(0,0,0,0.06)\",\n zIndex: 50,\n overflow: \"hidden\",\n padding: \"4px 0\",\n maxHeight: \"220px\",\n overflowY: \"auto\",\n display: \"none\",\n },\n });\n\n for (let i = 0; i < RELATIONSHIP_OPTIONS.length; i++) {\n const option = RELATIONSHIP_OPTIONS[i];\n const isSelected = formData.guardianRelationship === option.value;\n\n const optionEl = el(\"div\", {\n id: `guardianRelationship-option-${i}`,\n role: \"option\",\n \"aria-selected\": String(isSelected),\n style: {\n padding: \"9px 12px\",\n fontSize: \"13px\",\n fontFamily: font,\n color: isSelected ? accentColor : textColor,\n backgroundColor: \"transparent\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n transition: \"background-color 0.1s\",\n },\n onClick: () => {\n onFieldChange(\"guardianRelationship\", option.value);\n selectedSpan.textContent = option.label;\n relationshipDisplay.style.color = textColor;\n doClose();\n },\n onMouseenter: (e: Event) => { (e.target as HTMLElement).style.backgroundColor = \"#F3F4F6\"; },\n onMouseleave: (e: Event) => { (e.target as HTMLElement).style.backgroundColor = \"transparent\"; },\n });\n\n const label = el(\"span\");\n label.textContent = option.label;\n optionEl.appendChild(label);\n\n if (isSelected) {\n const checkSvg = svg(\n \"svg\",\n {\n width: \"14\", height: \"14\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: accentColor, \"stroke-width\": \"2.5\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"polyline\", { points: \"20 6 9 17 4 12\" })\n );\n (checkSvg as unknown as HTMLElement).style.flexShrink = \"0\";\n optionEl.appendChild(checkSvg);\n }\n\n dropdownList.appendChild(optionEl);\n }\n\n let dropdownOpen = false;\n\n const relContainer = el(\"div\", { style: { position: \"relative\" } });\n\n const handleClickOutside = (e: Event) => {\n if (!relContainer.contains(e.target as Node)) {\n doClose();\n }\n };\n\n function doOpen() {\n dropdownOpen = true;\n dropdownList.style.display = \"block\";\n relationshipDisplay.setAttribute(\"aria-expanded\", \"true\");\n (chevronSvg as unknown as HTMLElement).style.transform = \"rotate(180deg)\";\n relationshipDisplay.style.borderColor = accentColor;\n relationshipDisplay.style.boxShadow = `0 0 0 1px ${accentColor}`;\n\n // Determine direction: open upward if not enough space below\n const rect = relContainer.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const dropdownHeight = 220;\n const shouldOpenUpward = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n if (shouldOpenUpward) {\n dropdownList.style.top = \"auto\";\n dropdownList.style.bottom = \"calc(100% + 4px)\";\n dropdownList.style.boxShadow = \"0 -4px 12px rgba(0,0,0,0.1), 0 -1px 3px rgba(0,0,0,0.06)\";\n } else {\n dropdownList.style.top = \"calc(100% + 4px)\";\n dropdownList.style.bottom = \"auto\";\n dropdownList.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.1), 0 1px 3px rgba(0,0,0,0.06)\";\n }\n\n // Scroll the dropdown into view\n requestAnimationFrame(() => {\n dropdownList.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n });\n\n // Listen for clicks outside (next tick so current click doesn't trigger it)\n setTimeout(() => document.addEventListener(\"mousedown\", handleClickOutside), 0);\n }\n\n function doClose() {\n dropdownOpen = false;\n dropdownList.style.display = \"none\";\n relationshipDisplay.setAttribute(\"aria-expanded\", \"false\");\n (chevronSvg as unknown as HTMLElement).style.transform = \"rotate(0deg)\";\n relationshipDisplay.style.borderColor = borderColor;\n relationshipDisplay.style.boxShadow = \"none\";\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n\n relationshipDisplay.addEventListener(\"click\", () => {\n dropdownOpen ? doClose() : doOpen();\n });\n\n relationshipDisplay.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!dropdownOpen) doOpen();\n } else if (e.key === \"Escape\" || e.key === \"Tab\") {\n doClose();\n }\n });\n\n const relationshipError = el(\"div\", { style: errorStyle, role: \"alert\" });\n\n relContainer.appendChild(relLabel);\n relContainer.appendChild(relationshipDisplay);\n relContainer.appendChild(dropdownList);\n relContainer.appendChild(relationshipError);\n\n // General error\n const generalError = el(\"div\", {\n role: \"alert\",\n style: {\n color: \"#DC2626\",\n fontSize: \"13px\",\n marginTop: \"16px\",\n padding: \"12px\",\n borderRadius: \"6px\",\n border: \"1px solid #FCA5A5\",\n backgroundColor: \"#FEF2F2\",\n textAlign: \"center\",\n display: \"none\",\n },\n });\n\n const fieldsContainer = el(\"div\", {\n style: { display: \"flex\", flexDirection: \"column\", gap: \"14px\" },\n }, nameGroup, contactGroup, relContainer);\n\n const middleSection = el(\"div\", {\n style: { ...styles.middleSection, overflow: \"visible\", color: textColor, fontFamily: font },\n }, subtitle, infoBanner, fieldsContainer, generalError);\n\n // ─── Bottom Section (Verify first, Cancel second — matches React) ───\n const btnBase = {\n ...styles.button,\n fontSize: isMobile ? \"14px\" : \"16px\",\n padding: isMobile ? \"10px 20px\" : \"9px 45px\",\n };\n\n const submitBtn = el(\"button\", {\n style: {\n ...btnBase,\n ...styles.acceptButton,\n backgroundColor: colors.acceptBg,\n color: colors.acceptText,\n borderRadius: colors.borderRadius,\n },\n type: \"button\",\n disabled: isSubmitting,\n \"aria-label\": isSubmitting ? \"Verifying guardian identity\" : \"Proceed to guardian verification\",\n onClick: onSubmit,\n }) as HTMLButtonElement;\n submitBtn.textContent = isSubmitting ? \"Verifying...\" : \"Verify via DigiLocker\";\n\n const cancelBtn = el(\"button\", {\n style: {\n ...btnBase,\n ...styles.cancelButton,\n backgroundColor: colors.declineBg,\n color: colors.declineText,\n borderColor: colors.declineBorder,\n borderRadius: colors.borderRadius,\n },\n type: \"button\",\n \"aria-label\": \"Cancel\",\n onClick: onCancel,\n });\n cancelBtn.textContent = \"Cancel\";\n\n const bottomSection = el(\"div\", {\n style: { ...styles.bottomSection, paddingTop: \"12px\", color: textColor, fontFamily: font },\n }, submitBtn, cancelBtn);\n\n // ─── Assemble ───\n const container = el(\"div\", { style: { ...styles.content, overflow: \"visible\" } }, topSection, middleSection, bottomSection);\n\n return {\n container,\n nameInput,\n contactInput,\n relationshipDisplay,\n nameError,\n contactError,\n relationshipError,\n submitBtn,\n generalError,\n };\n}\n\nexport function validateGuardianForm(data: GuardianFormData): Record<string, string> {\n const errors: Record<string, string> = {};\n if (!data.guardianName.trim()) errors.guardianName = \"Guardian name is required\";\n if (!data.guardianContact.trim()) errors.guardianContact = \"Guardian contact is required\";\n if (!data.guardianRelationship.trim()) errors.guardianRelationship = \"Relationship to guardian is required\";\n return errors;\n}\n","import { el, svg } from \"../core/dom\";\nimport { styles } from \"../styles/modal\";\nimport type { Settings, GuardianVerificationErrorCode } from \"../api/types\";\nimport type { ResolvedColors } from \"./colors\";\n\nexport type VerificationScreenRefs = {\n container: HTMLElement;\n};\n\nexport function getVerificationErrorMessage(\n errorCode: string | null,\n fallbackError: string | null\n): string {\n switch (errorCode) {\n case \"GUARDIAN_UNDER_18\":\n return \"The guardian must be 18 years or older. Please provide details of a different guardian.\";\n case \"TOKEN_FAILED\":\n return \"DigiLocker verification could not be completed. Please try again.\";\n case \"DIGILOCKER_AUTH_FAILED\":\n return \"DigiLocker authorization was cancelled or failed. Please try again.\";\n case \"NO_AUTH_CODE\":\n return \"DigiLocker did not return an authorization code. Please try again.\";\n case \"SESSION_EXPIRED\":\n return \"Verification session has expired. Please try again.\";\n default:\n return fallbackError || \"Verification failed. Please try again.\";\n }\n}\n\nexport function renderVerificationScreen(options: {\n settings?: Partial<Settings>;\n colors: ResolvedColors;\n isMobile: boolean;\n logoUrl: string;\n isInitiating: boolean;\n isPolling: boolean;\n isComplete: boolean;\n isAutoTransitioning?: boolean;\n error: string | null;\n errorCode: string | null;\n canRetry: boolean;\n onContinue: () => void;\n onBack: (clearName?: boolean) => void;\n}): VerificationScreenRefs {\n const {\n settings, colors, isMobile, logoUrl,\n isInitiating, isPolling, isComplete, isAutoTransitioning,\n error, errorCode, canRetry,\n onContinue, onBack,\n } = options;\n\n const headingColor = settings?.headingColor || \"#101828\";\n const textColor = colors.text;\n const font = colors.font;\n const accentColor = colors.acceptBg;\n\n // ─── Top Section ───\n const logo = el(\"img\", { src: logoUrl, style: styles.logo, alt: \"Logo\" });\n const title = el(\"h2\", {\n id: \"verification-title\",\n style: {\n ...styles.title,\n fontSize: \"16px\",\n fontWeight: 600,\n color: headingColor,\n fontFamily: font,\n },\n });\n title.textContent = \"Guardian Verification\";\n\n const topLeft = el(\"div\", { style: styles.topLeft }, logo, title);\n const topSection = el(\"div\", {\n style: { ...styles.topSection, color: textColor, fontFamily: font },\n }, topLeft);\n\n // ─── Middle Section ───\n const middleSection = el(\"div\", {\n style: {\n ...styles.middleSection,\n color: textColor,\n fontFamily: font,\n textAlign: \"center\",\n },\n });\n\n if (isComplete && !error) {\n // Success state: green checkmark circle\n const successCircle = el(\"div\", {\n style: {\n width: \"64px\",\n height: \"64px\",\n borderRadius: \"50%\",\n backgroundColor: \"#D1FAE5\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n });\n const checkSvg = svg(\n \"svg\",\n {\n width: \"32\", height: \"32\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: \"#059669\", \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"polyline\", { points: \"20 6 9 17 4 12\" })\n );\n successCircle.appendChild(checkSvg);\n\n const successText = el(\"p\", {\n style: {\n color: headingColor,\n fontFamily: font,\n fontSize: \"16px\",\n fontWeight: 600,\n lineHeight: \"1.5\",\n marginTop: \"12px\",\n marginBottom: \"24px\",\n },\n });\n successText.textContent = \"Verification Completed\";\n\n const wrapper = el(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flex: \"1\",\n },\n }, successCircle, successText);\n middleSection.appendChild(wrapper);\n\n } else if ((isInitiating || isPolling) && !error) {\n // Polling state: spinner + status message\n const spinner = el(\"div\", {\n style: {\n width: \"48px\",\n height: \"48px\",\n border: \"4px solid #e5e7eb\",\n borderTopColor: accentColor,\n borderRadius: \"50%\",\n animation: \"spin 1s linear infinite\",\n margin: \"24px auto\",\n },\n });\n\n const statusMsg = el(\"div\", {\n style: {\n color: \"#059669\",\n fontSize: \"14px\",\n marginTop: \"16px\",\n padding: \"12px\",\n borderRadius: \"6px\",\n border: \"1px solid #A7F3D0\",\n backgroundColor: \"#D1FAE5\",\n textAlign: \"center\",\n },\n });\n statusMsg.textContent = isInitiating\n ? \"Opening DigiLocker in a new tab...\"\n : \"Please complete the verification in the DigiLocker tab. This page will update automatically when verification is complete.\";\n\n middleSection.appendChild(spinner);\n middleSection.appendChild(statusMsg);\n }\n\n if (error) {\n // Error state: red X circle + error text\n const errorCircle = el(\"div\", {\n style: {\n width: \"64px\",\n height: \"64px\",\n borderRadius: \"50%\",\n backgroundColor: \"#fee2e2\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n margin: \"24px auto\",\n },\n });\n const xSvg = svg(\n \"svg\",\n {\n width: \"32\", height: \"32\", viewBox: \"0 0 24 24\",\n fill: \"none\", stroke: \"#dc2626\", \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\",\n },\n svg(\"line\", { x1: \"18\", y1: \"6\", x2: \"6\", y2: \"18\" }),\n svg(\"line\", { x1: \"6\", y1: \"6\", x2: \"18\", y2: \"18\" })\n );\n errorCircle.appendChild(xSvg);\n\n const failedText = el(\"p\", {\n style: {\n ...styles.privacyText,\n color: textColor,\n fontFamily: font,\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n marginBottom: \"12px\",\n },\n });\n failedText.textContent = \"Verification failed\";\n\n const errorBox = el(\"div\", {\n style: {\n color: \"#DC2626\",\n fontSize: \"14px\",\n marginTop: \"16px\",\n padding: \"12px\",\n borderRadius: \"6px\",\n border: \"1px solid #FCA5A5\",\n backgroundColor: \"#FEF2F2\",\n textAlign: \"center\",\n },\n });\n errorBox.textContent = error;\n\n middleSection.appendChild(errorCircle);\n middleSection.appendChild(failedText);\n middleSection.appendChild(errorBox);\n }\n\n // ─── Bottom Section ───\n const btnBase = {\n ...styles.button,\n fontSize: isMobile ? \"14px\" : \"16px\",\n padding: isMobile ? \"10px 20px\" : \"9px 45px\",\n };\n\n const bottomSection = el(\"div\", {\n style: {\n ...styles.bottomSection,\n paddingTop: \"12px\",\n display: \"flex\",\n gap: \"12px\",\n justifyContent: \"center\",\n color: textColor,\n fontFamily: font,\n },\n });\n\n const acceptBtnStyle = {\n backgroundColor: colors.acceptBg,\n color: colors.acceptText,\n borderRadius: colors.borderRadius,\n };\n const declineBtnStyle = {\n backgroundColor: colors.declineBg,\n color: colors.declineText,\n borderColor: colors.declineBorder,\n borderRadius: colors.borderRadius,\n };\n\n // Hide bottom section during auto-transition\n if (!isAutoTransitioning) {\n if (isComplete && !error) {\n const continueBtn = el(\"button\", {\n style: { ...btnBase, ...acceptBtnStyle },\n type: \"button\",\n \"aria-label\": \"Continue to consent form\",\n onClick: onContinue,\n });\n continueBtn.textContent = \"Continue\";\n bottomSection.appendChild(continueBtn);\n } else if (error && canRetry) {\n const retryBtn = el(\"button\", {\n style: { ...btnBase, ...styles.acceptButton, ...acceptBtnStyle },\n type: \"button\",\n \"aria-label\": errorCode === \"GUARDIAN_UNDER_18\" ? \"Change guardian details\" : \"Try verification again\",\n onClick: () => onBack(errorCode === \"GUARDIAN_UNDER_18\"),\n });\n retryBtn.textContent = errorCode === \"GUARDIAN_UNDER_18\" ? \"Change Guardian\" : \"Try Again\";\n bottomSection.appendChild(retryBtn);\n } else if (error) {\n const goBackBtn = el(\"button\", {\n style: { ...btnBase, ...styles.cancelButton, ...declineBtnStyle },\n type: \"button\",\n \"aria-label\": \"Go back\",\n onClick: () => onBack(false),\n });\n goBackBtn.textContent = \"Go Back\";\n bottomSection.appendChild(goBackBtn);\n } else {\n // Polling state — show cancel\n const cancelBtn = el(\"button\", {\n style: { ...btnBase, ...styles.cancelButton, ...declineBtnStyle },\n type: \"button\",\n \"aria-label\": \"Cancel verification\",\n onClick: () => onBack(false),\n });\n cancelBtn.textContent = \"Cancel\";\n bottomSection.appendChild(cancelBtn);\n }\n }\n\n // ─── Assemble ───\n const container = el(\"div\", { style: styles.content }, topSection, middleSection, bottomSection);\n\n return { container };\n}\n","import type { ModalLook } from \"./look\";\n\nexport type ResolvedColors = {\n acceptBg: string;\n acceptText: string;\n /** The \"accept selected\" button. */\n acceptShortcutBg: string;\n acceptShortcutText: string;\n acceptShortcutBorder: string;\n declineBg: string;\n declineText: string;\n declineBorder: string;\n link: string;\n heading: string;\n text: string;\n font: string;\n borderRadius: string;\n primaryColor: string;\n secondaryColor: string;\n};\n\nconst asString = (value: string | number | undefined, fallback: string): string =>\n value === undefined ? fallback : String(value);\n\n/**\n * The colours the age gate, guardian form and verification screen paint\n * with, read from the notice's resolved look so they follow the console\n * palette and the host's `settings` like the notice itself does.\n */\nexport function colorsFromLook(look: ModalLook): ResolvedColors {\n const { acceptAll, acceptSelected, decline, base } = look.buttons;\n return {\n acceptBg: asString(acceptAll.backgroundColor, look.accentColor),\n acceptText: asString(acceptAll.color, \"#ffffff\"),\n acceptShortcutBg: asString(acceptSelected.backgroundColor, \"#ffffff\"),\n acceptShortcutText: asString(acceptSelected.color, look.accentColor),\n acceptShortcutBorder: asString(acceptSelected.borderColor, look.accentColor),\n declineBg: asString(decline.backgroundColor, \"#ffffff\"),\n declineText: asString(decline.color, \"#000000\"),\n declineBorder: asString(decline.borderColor, \"#d0d5dd\"),\n link: look.linkColor,\n heading: look.headingColor,\n text: look.textColor,\n font: \"inherit\",\n borderRadius: asString(base.borderRadius, \"8px\"),\n primaryColor: asString(acceptAll.backgroundColor, look.accentColor),\n secondaryColor: look.linkColor,\n };\n}\n","import type { NoticeProduct, PurposeSelection } from \"../api/types\";\nimport { CONFIRM_HINT_COPY, PURPOSE_STATUS_ACTIVE } from \"../constants\";\nimport type {\n ConfirmVerdict,\n PurposeRow,\n RecordedLookup,\n ScopedPurpose,\n SelectablePurpose,\n SelectionState,\n SubmissionPurpose,\n} from \"../types\";\nimport {\n gatedProductUuids,\n noticeScopesPurposes,\n productPurposeKey,\n purposeNamesProduct,\n rowProductUuid,\n serverMarksMandatoryProducts,\n} from \"../core/productMatrix\";\nimport {\n dataElementKey,\n hasRequiredDataElement,\n isBlockingRequiredElement,\n seededDataElements,\n} from \"./consentSelection\";\n\nconst rowKey = (row: PurposeRow) =>\n productPurposeKey(row.productUuid, row.purpose.uuid);\n\nexport const recordedSelectionLookup =\n (\n purposeSelections: Record<string, PurposeSelection> | undefined,\n productPurposeSelections:\n | Record<string, Record<string, PurposeSelection>>\n | undefined,\n ): RecordedLookup =>\n (purposeUuid, productUuid) => {\n const perProduct = productUuid\n ? productPurposeSelections?.[productUuid]?.[purposeUuid]\n : undefined;\n return perProduct ?? purposeSelections?.[purposeUuid];\n };\n\nexport const seedSelection = (\n rows: ReadonlyArray<PurposeRow>,\n recordedFor: RecordedLookup,\n): SelectionState => {\n const selectedPurposes: Record<string, boolean> = {};\n const selectedDataElements: Record<string, boolean> = {};\n\n rows.forEach((row) => {\n const recorded = recordedFor(row.purpose.uuid, row.productUuid);\n selectedPurposes[rowKey(row)] = recorded ? recorded.selected : false;\n row.purpose.data_elements.forEach((element) => {\n selectedDataElements[\n dataElementKey(row.purpose.uuid, element.uuid, row.productUuid)\n ] = recorded?.data_elements?.[element.uuid]?.selected ?? false;\n });\n });\n\n return { selectedPurposes, selectedDataElements };\n};\n\nexport const collapseEveryRow = (\n rows: ReadonlyArray<PurposeRow>,\n): Record<string, boolean> =>\n rows.reduce((acc: Record<string, boolean>, row) => {\n acc[rowKey(row)] = true;\n return acc;\n }, {});\n\nexport const initialCollapsedProducts = (\n groups: ReadonlyArray<{ product: { uuid: string } }>,\n defaultOpenProducts?: ReadonlyArray<string>,\n): Record<string, boolean> => {\n const openByDefault = new Set(defaultOpenProducts ?? []);\n const soleSection = groups.length === 1;\n return groups.reduce((acc: Record<string, boolean>, group) => {\n acc[group.product.uuid] =\n !soleSection && !openByDefault.has(group.product.uuid);\n return acc;\n }, {});\n};\n\nexport const recordedBaseline = (\n rows: ReadonlyArray<PurposeRow>,\n recordedFor: RecordedLookup,\n): Record<string, boolean> =>\n rows.reduce((acc: Record<string, boolean>, row) => {\n const recorded = recordedFor(row.purpose.uuid, row.productUuid);\n acc[rowKey(row)] =\n recorded?.selected === true &&\n (!recorded.status || recorded.status === PURPOSE_STATUS_ACTIVE) &&\n recorded.needs_reconsent !== true;\n return acc;\n }, {});\n\nexport const settleProducts = (\n rows: ReadonlyArray<PurposeRow>,\n products: ReadonlyArray<NoticeProduct> | undefined,\n recordedFor: RecordedLookup,\n): {\n consentedProducts: Record<string, boolean>;\n consentedPurposes: Record<string, boolean>;\n} => {\n const productList = products ? [...products] : undefined;\n const isSettled = (row: PurposeRow) => {\n const recorded = recordedFor(row.purpose.uuid, row.productUuid);\n return recorded?.selected === true && recorded.needs_reconsent !== true;\n };\n\n const consentedPurposes: Record<string, boolean> = {};\n const rowsByProduct = new Map<string, PurposeRow[]>();\n rows.forEach((row) => {\n const resolved = rowProductUuid(row, productList);\n if (!resolved) return;\n consentedPurposes[rowKey(row)] = isSettled(row);\n const group = rowsByProduct.get(resolved) ?? [];\n group.push(row);\n rowsByProduct.set(resolved, group);\n });\n\n const consentedProducts: Record<string, boolean> = {};\n rowsByProduct.forEach((group, productUuid) => {\n const mandatory = group.filter((row) => hasRequiredDataElement(row.purpose));\n const deciding = mandatory.length > 0 ? mandatory : group;\n consentedProducts[productUuid] = deciding.every(isSettled);\n });\n\n return { consentedProducts, consentedPurposes };\n};\n\nexport const isFullyConsented = (\n rows: ReadonlyArray<PurposeRow>,\n recordedFor: RecordedLookup,\n): boolean =>\n rows.every((row) => {\n const recorded = recordedFor(row.purpose.uuid, row.productUuid);\n return Boolean(recorded?.selected && !recorded?.needs_reconsent);\n });\n\nexport const productBoxPurposes = <P extends SelectablePurpose>(\n purposes: ReadonlyArray<P>,\n): P[] => {\n const required = purposes.filter(hasRequiredDataElement);\n return required.length > 0 ? required : [...purposes];\n};\n\nexport const purposeToggle = (\n purpose: SelectablePurpose,\n productUuid: string | undefined,\n selectedPurposes: Record<string, boolean>,\n): SelectionState => {\n const key = productPurposeKey(productUuid, purpose.uuid);\n const nextState = !selectedPurposes[key];\n const seeded = seededDataElements(purpose);\n const selectedDataElements: Record<string, boolean> = {};\n purpose.data_elements.forEach((element) => {\n selectedDataElements[`${key}-${element.uuid}`] =\n nextState && seeded.has(element.uuid);\n });\n return { selectedPurposes: { [key]: nextState }, selectedDataElements };\n};\n\nexport const sectionToggle = (\n sectionPurposes: ReadonlyArray<SelectablePurpose>,\n keyProductUuid: string | undefined,\n selectedPurposes: Record<string, boolean>,\n next?: boolean,\n): SelectionState => {\n const nextState =\n next ??\n !sectionPurposes.every(\n (purpose) => selectedPurposes[productPurposeKey(keyProductUuid, purpose.uuid)],\n );\n const purposeOverrides: Record<string, boolean> = {};\n const elementOverrides: Record<string, boolean> = {};\n sectionPurposes.forEach((purpose) => {\n const key = productPurposeKey(keyProductUuid, purpose.uuid);\n purposeOverrides[key] = nextState;\n // The same elements the purpose's own tick grants.\n const seeded = seededDataElements(purpose);\n purpose.data_elements.forEach((element) => {\n elementOverrides[`${key}-${element.uuid}`] =\n nextState && seeded.has(element.uuid);\n });\n });\n return {\n selectedPurposes: purposeOverrides,\n selectedDataElements: elementOverrides,\n };\n};\n\nexport const purposeCheckedFromElements = (\n purpose: SelectablePurpose,\n productUuid: string | undefined,\n selectedDataElements: Record<string, boolean>,\n): boolean => {\n const key = productPurposeKey(productUuid, purpose.uuid);\n const requiredElements = purpose.data_elements.filter(isBlockingRequiredElement);\n return requiredElements.length > 0\n ? requiredElements.every((element) => selectedDataElements[`${key}-${element.uuid}`])\n : purpose.data_elements.some((element) => selectedDataElements[`${key}-${element.uuid}`]);\n};\n\nexport const confirmVerdict = ({\n products,\n purposes,\n rows,\n selectedPurposes,\n recordedPurposeSelections,\n}: {\n products: ReadonlyArray<NoticeProduct> | undefined;\n purposes: ReadonlyArray<ScopedPurpose>;\n rows: ReadonlyArray<PurposeRow>;\n selectedPurposes: Record<string, boolean>;\n recordedPurposeSelections: Record<string, boolean>;\n}): ConfirmVerdict => {\n if (rows.length === 0) return { ok: true, reason: \"ok\", blocking: [] };\n\n const productList = products ? [...products] : undefined;\n const isSelected = (row: PurposeRow) => Boolean(selectedPurposes[rowKey(row)]);\n const wasRecorded = (row: PurposeRow) =>\n Boolean(recordedPurposeSelections[rowKey(row)]);\n const isMandatory = (row: PurposeRow) => hasRequiredDataElement(row.purpose);\n const satisfies = (group: ReadonlyArray<PurposeRow>) =>\n group.filter(isMandatory).every(isSelected);\n const touched = (group: ReadonlyArray<PurposeRow>) =>\n group.some(isSelected) &&\n group.some((row) => isSelected(row) !== wasRecorded(row));\n\n const rowsByProduct = new Map<string, PurposeRow[]>();\n const unresolved: PurposeRow[] = [];\n rows.forEach((row) => {\n const productUuid = rowProductUuid(row, productList);\n if (productUuid === undefined) {\n unresolved.push(row);\n return;\n }\n const group = rowsByProduct.get(productUuid);\n if (group) {\n group.push(row);\n } else {\n rowsByProduct.set(productUuid, [row]);\n }\n });\n\n if (!serverMarksMandatoryProducts(productList)) {\n const groups = [...rowsByProduct.values()];\n if (unresolved.length > 0) groups.push(unresolved);\n const everyProductHasMandatory = groups.every((group) => group.some(isMandatory));\n const baseline = everyProductHasMandatory ? groups.some(satisfies) : satisfies(rows);\n const blocking = [...rowsByProduct.entries()]\n .filter(([, group]) => touched(group) && !satisfies(group))\n .map(([productUuid]) => productUuid);\n const ok = baseline && blocking.length === 0;\n return {\n ok,\n reason: ok\n ? \"ok\"\n : blocking.length > 0\n ? \"product-incomplete\"\n : \"required-outstanding\",\n blocking,\n };\n }\n\n if (unresolved.length > 0 && rowsByProduct.size === 0) {\n const ok = satisfies(unresolved);\n return { ok, reason: ok ? \"ok\" : \"required-outstanding\", blocking: [] };\n }\n\n const gated = gatedProductUuids(productList);\n const scoped = noticeScopesPurposes([...purposes]);\n const engagingRows = (group: PurposeRow[], productUuid: string) =>\n scoped\n ? group.filter((row) => purposeNamesProduct(row.purpose, productUuid))\n : group;\n\n const engaged: string[] = [];\n rowsByProduct.forEach((group, productUuid) => {\n if (gated.has(productUuid)) {\n engaged.push(productUuid);\n return;\n }\n if (touched(engagingRows(group, productUuid))) engaged.push(productUuid);\n });\n\n if (engaged.length === 0) {\n return {\n ok: false,\n reason: rows.some(isSelected) ? \"nothing-engaged\" : \"nothing-chosen\",\n blocking: [],\n };\n }\n\n const blocking = engaged.filter(\n (productUuid) => !satisfies(rowsByProduct.get(productUuid) ?? []),\n );\n\n return {\n ok: blocking.length === 0,\n reason: blocking.length === 0 ? \"ok\" : \"product-incomplete\",\n blocking,\n };\n};\n\nexport const confirmHint = (\n verdict: ConfirmVerdict,\n products: ReadonlyArray<NoticeProduct> | undefined,\n productName: (product: NoticeProduct) => string,\n copy: typeof CONFIRM_HINT_COPY = CONFIRM_HINT_COPY,\n): string | null => {\n if (verdict.ok || verdict.reason === \"ok\") return null;\n if (verdict.reason !== \"product-incomplete\") {\n return copy[verdict.reason];\n }\n const byUuid = new Map((products ?? []).map((product) => [product.uuid, product]));\n const names = verdict.blocking.map((uuid) => {\n const product = byUuid.get(uuid);\n return product ? productName(product) : uuid;\n });\n return copy.productsIncomplete(names);\n};\n\nexport const submissionPurposes = <P extends ScopedPurpose>(\n rows: ReadonlyArray<PurposeRow<P>>,\n selection: SelectionState,\n): SubmissionPurpose<P>[] =>\n rows.map(({ purpose, productUuid }) => {\n const key = productPurposeKey(productUuid, purpose.uuid);\n return {\n ...purpose,\n ...(productUuid ? { product_uuid: productUuid } : {}),\n selected: selection.selectedPurposes[key] || false,\n data_elements: purpose.data_elements.map((element) => ({\n ...element,\n selected: selection.selectedDataElements[`${key}-${element.uuid}`] || false,\n })),\n };\n });\n","import type { NoticeProduct } from \"../api/types\";\nimport type {\n ConfirmVerdict,\n ProductConfig,\n ProductSeed,\n ProductSeedInput,\n PurposeRow,\n ScopedPurpose,\n} from \"../types\";\nimport {\n gatedProductUuids,\n groupPurposesByProduct,\n isMultiProduct,\n noticePurposeRows,\n serverMarksMandatoryProducts,\n} from \"../core/productMatrix\";\nimport {\n collapseEveryRow,\n confirmVerdict,\n initialCollapsedProducts,\n isFullyConsented,\n recordedBaseline,\n recordedSelectionLookup,\n seedSelection,\n settleProducts,\n} from \"./productConsent\";\n\nexport const rowsOf = <P extends ScopedPurpose>(\n config: ProductConfig & { purposes: P[] },\n): PurposeRow<P>[] =>\n noticePurposeRows(config.products, config.purposes, config.product_purpose_order);\n\nexport const groupsOf = <P extends ScopedPurpose>(\n config: ProductConfig & { purposes: P[] },\n) => groupPurposesByProduct(config.products, config.purposes, config.product_purpose_order);\n\nexport const seedProductState = <P extends ScopedPurpose>({\n config,\n purposeSelections,\n productPurposeSelections,\n defaultOpenProducts,\n includeFullyConsentedData,\n}: ProductSeedInput<P>): ProductSeed<P> => {\n const rows = rowsOf(config);\n const recordedFor = recordedSelectionLookup(purposeSelections, productPurposeSelections);\n const hasRecord = Boolean(purposeSelections || productPurposeSelections);\n const settled = hasRecord\n ? settleProducts(rows, config.products, recordedFor)\n : { consentedProducts: {}, consentedPurposes: {} };\n\n const seed: ProductSeed<P> = {\n collapsedProducts: initialCollapsedProducts(groupsOf(config), defaultOpenProducts),\n recordedPurposeSelections: recordedBaseline(rows, recordedFor),\n consentedProducts: settled.consentedProducts,\n consentedPurposes: settled.consentedPurposes,\n };\n if (!isMultiProduct(config.products)) return seed;\n\n const seeded = seedSelection(rows, recordedFor);\n return {\n ...seed,\n collapsedPurposes: collapseEveryRow(rows),\n selectedPurposes: seeded.selectedPurposes,\n selectedDataElements: seeded.selectedDataElements,\n initialDataElementSelections: seeded.selectedDataElements,\n needsConsentPurposes: config.purposes,\n alreadyConsentedPurposes: [],\n isFullyConsentedReviewMode: Boolean(\n includeFullyConsentedData &&\n hasRecord &&\n rows.length > 0 &&\n isFullyConsented(rows, recordedFor),\n ),\n };\n};\n\nexport const productIsRequired = (\n products: ReadonlyArray<NoticeProduct> | undefined,\n productUuid: string,\n): boolean | undefined => {\n const list = products ? [...products] : undefined;\n if (!serverMarksMandatoryProducts(list)) return undefined;\n return gatedProductUuids(list).has(productUuid);\n};\n\nexport const noticeConfirmVerdict = <P extends ScopedPurpose>(\n config: ProductConfig & { purposes: P[] },\n selectedPurposes: Record<string, boolean>,\n recordedPurposeSelections: Record<string, boolean>,\n): ConfirmVerdict =>\n confirmVerdict({\n products: config.products,\n purposes: config.purposes,\n rows: rowsOf(config),\n selectedPurposes,\n recordedPurposeSelections,\n });\n","import { el, svg } from \"../core/dom\";\nimport { createRequiredMarker } from \"../core/required-marker\";\nimport { productPurposeKey } from \"../core/productMatrix\";\nimport { part } from \"../appearance/parts\";\nimport { CONFIRM_HINT_ID, PRODUCT_SECTION_COPY } from \"../constants\";\nimport { styles as classicStyles } from \"../styles/modal\";\nimport type {\n ProductGroupsOptions,\n ProductSectionOptions,\n ProductSectionRefs,\n SelectablePurpose,\n} from \"../types\";\nimport {\n CLASSIC_PURPOSE_LOOK,\n renderModalPurposes,\n type ModalPurposeRefs,\n} from \"./purposes\";\nimport { renderSelectionControl } from \"./selection-control\";\nimport { productBoxPurposes } from \"./productConsent\";\nimport { productIsRequired } from \"./productState\";\n\nconst CHEVRON_OPEN = \"rotate(90deg)\";\nconst CHEVRON_CLOSED = \"rotate(0deg)\";\n\nconst sectionTally = (\n boxPurposes: ReadonlyArray<SelectablePurpose>,\n keyProductUuid: string | undefined,\n selectedPurposes: Record<string, boolean>\n) => {\n const selectedCount = boxPurposes.filter(\n (purpose) => selectedPurposes[productPurposeKey(keyProductUuid, purpose.uuid)]\n ).length;\n return {\n allSelected: boxPurposes.length > 0 && selectedCount === boxPurposes.length,\n someSelected: selectedCount > 0,\n };\n};\n\n/**\n * A partly ticked section's middle state. A checkbox shows its dash and the\n * two-option controls hold neither answer; a switch has two positions, so it\n * shows off and the click that follows asks for all of it.\n */\nconst showsMidState = (\n tally: { allSelected: boolean; someSelected: boolean },\n drawsSwitch: boolean\n): boolean => !drawsSwitch && tally.someSelected && !tally.allSelected;\n\nexport function renderProductSection(options: ProductSectionOptions): ProductSectionRefs {\n const {\n product,\n purposes,\n keyProductUuid,\n selectedPurposes,\n collapsed,\n locked,\n isRequired,\n getTranslatedText,\n onToggleCollapse,\n onToggleSelect,\n } = options;\n const look = options.look ?? CLASSIC_PURPOSE_LOOK;\n const styles = look.styles;\n\n const name = getTranslatedText(\"products.name\", product.name, product.uuid);\n const headingColor = look.headingColor;\n const boxPurposes = productBoxPurposes(purposes);\n // Switches only stand in for checkboxes; a radio or dropdown header draws no\n // switch, so it keeps its own middle state.\n const drawsSwitch = look.drawsSwitches && look.selectionControl === \"checkbox\";\n\n const chevron = svg(\n \"svg\",\n {\n width: \"7\",\n height: \"12\",\n viewBox: \"0 0 7 12\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: headingColor,\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n style: {\n transform: collapsed ? CHEVRON_CLOSED : CHEVRON_OPEN,\n transition: \"transform 0.3s ease\",\n },\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", { d: \"M1 1L6 6L1 11\" })\n );\n\n // The button is the chevron alone, not the heading's container: ARIA gives\n // role=button presentational children, so an <h2> inside one is stripped\n // from the heading tree. aria-labelledby names it instead.\n const collapseButton = el(\n \"button\",\n {\n type: \"button\",\n style: classicStyles.chevronButton,\n \"aria-expanded\": String(!collapsed),\n \"aria-controls\": `product-${product.uuid}`,\n \"aria-labelledby\": `product-name-${product.uuid}`,\n onClick: () => onToggleCollapse(product.uuid),\n },\n el(\n \"div\",\n { style: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", marginLeft: \"5px\" } },\n chevron\n )\n );\n\n const title = el(\"h2\", {\n id: `product-name-${product.uuid}`,\n style: {\n ...styles.sectionTitle,\n ...look.responsive.optionTitle,\n color: headingColor,\n },\n });\n title.textContent = name;\n // Follows the gate, not the notice: only a product the confirm button\n // actually enforces is marked.\n if (isRequired) {\n title.appendChild(createRequiredMarker());\n }\n\n const tally = sectionTally(boxPurposes, keyProductUuid, selectedPurposes);\n const selection = renderSelectionControl({\n control: look.selectionControl,\n checked: tally.allSelected,\n indeterminate: showsMidState(tally, drawsSwitch),\n onSelect: (next) => onToggleSelect(product.uuid, next),\n label:\n boxPurposes.length < purposes.length\n ? PRODUCT_SECTION_COPY.toggleRequired(name, boxPurposes.length)\n : PRODUCT_SECTION_COPY.toggleSelection(name, boxPurposes.length),\n groupName: `redacto-product-${product.uuid}`,\n size: \"large\",\n locked,\n lockedLabel: PRODUCT_SECTION_COPY.settled(name),\n language: look.language,\n skin: look.controlSkin,\n });\n\n // The heading beside the chevron opens the section too, across the whole\n // row up to the control: a short name such as \"Default\" otherwise leaves\n // most of the row answering no click. Not a second button, which would\n // strip the <h2> from the heading tree.\n const heading = el(\n \"div\",\n {\n style: { ...styles.optionTextContainer, cursor: \"pointer\" },\n onClick: () => onToggleCollapse(product.uuid),\n },\n title\n );\n\n const header = el(\n \"div\",\n { ...part(\"product\"), style: styles.sectionHeader },\n el(\"div\", { style: styles.optionLeft }, collapseButton, heading),\n selection.element\n );\n\n const body = el(\"div\", { id: `product-${product.uuid}`, style: styles.sectionBody });\n body.hidden = collapsed;\n\n return {\n productUuid: product.uuid,\n keyProductUuid,\n boxPurposes,\n drawsSwitch,\n container: el(\"div\", { className: look.rowClassName ?? null }, header, body),\n body,\n collapseButton,\n chevron,\n control: locked ? null : selection,\n };\n}\n\nexport function renderProductGroups(options: ProductGroupsOptions): {\n container: HTMLElement;\n purposeRefs: ModalPurposeRefs;\n sections: ProductSectionRefs[];\n} {\n const look = options.look ?? CLASSIC_PURPOSE_LOOK;\n const container = options.host ?? el(\"div\", { style: look.styles.optionsContainer });\n const sections: ProductSectionRefs[] = [];\n const parts: ModalPurposeRefs[] = [];\n\n for (const group of options.groups) {\n const productUuid = group.product.uuid;\n const section = renderProductSection({\n product: group.product,\n purposes: group.purposes,\n keyProductUuid: productUuid,\n selectedPurposes: options.selectedPurposes,\n collapsed: options.collapsedProducts[productUuid] || false,\n locked: options.consentedProducts[productUuid] ?? false,\n isRequired: productIsRequired(options.products, productUuid),\n look,\n getTranslatedText: options.getTranslatedText,\n onToggleCollapse: options.onToggleCollapse,\n onToggleSelect: options.onToggleSelect,\n });\n const rows = renderModalPurposes(group.purposes, {\n selectedPurposes: options.selectedPurposes,\n collapsedPurposes: options.collapsedPurposes,\n selectedDataElements: options.selectedDataElements,\n initialDataElementSelections: options.initialDataElementSelections,\n recordedAnswers: options.recordedAnswers,\n look,\n isAlreadyConsented: false,\n productUuid,\n host: section.body,\n isRowLocked: (purposeUuid) =>\n options.consentedPurposes[productPurposeKey(productUuid, purposeUuid)] ?? false,\n getTranslatedText: options.getTranslatedText,\n onPurposeToggle: options.onPurposeToggle,\n onPurposeCollapse: options.onPurposeCollapse,\n onDataElementToggle: options.onDataElementToggle,\n });\n container.appendChild(section.container);\n sections.push(section);\n parts.push(rows);\n }\n\n return { container, purposeRefs: mergePurposeRefs(container, parts), sections };\n}\n\nexport function updateProductSection(\n refs: ProductSectionRefs,\n selectedPurposes: Record<string, boolean>,\n collapsed: boolean\n): void {\n if (refs.control) {\n const tally = sectionTally(refs.boxPurposes, refs.keyProductUuid, selectedPurposes);\n refs.control.setChecked(tally.allSelected, showsMidState(tally, refs.drawsSwitch ?? false));\n }\n refs.body.hidden = collapsed;\n refs.collapseButton.setAttribute(\"aria-expanded\", String(!collapsed));\n (refs.chevron as unknown as HTMLElement).style.transform = collapsed\n ? CHEVRON_CLOSED\n : CHEVRON_OPEN;\n}\n\nexport function mergePurposeRefs(\n container: HTMLElement,\n parts: ReadonlyArray<ModalPurposeRefs>\n): ModalPurposeRefs {\n const merge = <V>(pick: (refs: ModalPurposeRefs) => Map<string, V>) =>\n new Map<string, V>(parts.flatMap((refs) => [...pick(refs)]));\n return {\n container,\n elementControls: merge((refs) => refs.elementControls),\n purposeControls: merge((refs) => refs.purposeControls),\n collapseButtons: merge((refs) => refs.collapseButtons),\n dataElementContainers: merge((refs) => refs.dataElementContainers),\n chevrons: merge((refs) => refs.chevrons),\n titleElements: merge((refs) => refs.titleElements),\n descriptionElements: merge((refs) => refs.descriptionElements),\n dataElementLabels: merge((refs) => refs.dataElementLabels),\n };\n}\n\nexport function renderConfirmHint(style?: Record<string, string | number | undefined>): HTMLElement {\n return el(\"p\", { id: CONFIRM_HINT_ID, role: \"status\", style: style ?? classicStyles.confirmHint });\n}\n\nexport function updateConfirmHint(\n hintEl: HTMLElement,\n anchor: HTMLElement,\n describedButton: HTMLElement | null,\n text: string | null\n): void {\n if (!text) {\n hintEl.remove();\n describedButton?.removeAttribute(\"aria-describedby\");\n return;\n }\n hintEl.textContent = text;\n if (hintEl.nextSibling !== anchor) {\n anchor.parentNode?.insertBefore(hintEl, anchor);\n }\n describedButton?.setAttribute(\"aria-describedby\", CONFIRM_HINT_ID);\n}\n","import type { LogoPosition } from \"../api/types\";\nimport { DEFAULT_LOGO_POSITION, LOGO_POSITION_JUSTIFY } from \"../constants\";\n\n/**\n * Resolves `active_config.logo_position` onto a position the header can lay out.\n *\n * The field is absent on notices published before it existed and on responses\n * from an older consent-server, so an unrecognised value is not an error — it\n * simply means \"the customer never chose\", which is the left-aligned default.\n *\n * Sibling of `resolveColors` in ./colors.ts: same config-then-default shape,\n * kept deliberately parallel with the React package's layout.ts.\n */\nexport function resolveLogoPosition(raw: string | undefined | null): LogoPosition {\n return raw === \"center\" || raw === \"right\" ? raw : DEFAULT_LOGO_POSITION;\n}\n\nexport function logoRowJustify(position: LogoPosition): string {\n return LOGO_POSITION_JUSTIFY[position];\n}\n","import { OTP_GATE_COPY, OTP_GATE_LENGTH } from \"../constants\";\nimport type {\n AcceptMode,\n OtpEntry,\n OtpGateOptions,\n OtpGateView,\n OtpVerifyResult,\n} from \"../types\";\n\nexport const shouldHoldForOtp = (\n gate: { required: boolean } | undefined,\n verified: boolean\n): boolean => Boolean(gate?.required) && !verified;\n\nexport const emptyOtpDigits = (length: number = OTP_GATE_LENGTH): string[] =>\n Array.from({ length }, () => \"\");\n\nexport const otpCodeOf = (digits: string[]): string => digits.join(\"\");\n\nexport const isOtpComplete = (digits: string[]): boolean =>\n digits.length > 0 && digits.every((digit) => /^[0-9]$/.test(digit));\n\nconst onlyDigits = (value: string): string => value.replace(/[^0-9]/g, \"\");\n\nconst withDigit = (digits: string[], index: number, digit: string): string[] =>\n digits.map((current, i) => (i === index ? digit : current));\n\nconst fillFromStart = (code: string, length: number): string[] =>\n Array.from({ length }, (_, i) => code[i] ?? \"\");\n\nconst typedOver = (text: string, previous: string): string => {\n if (!previous || text.length !== previous.length + 1) {\n return text;\n }\n if (text.startsWith(previous)) {\n return text.slice(previous.length);\n }\n if (text.endsWith(previous)) {\n return text.slice(0, text.length - previous.length);\n }\n return text;\n};\n\nconst withoutPrevious = (\n code: string,\n previous: string,\n length: number\n): string => {\n if (!previous || code.length <= length) {\n return code;\n }\n if (code.startsWith(previous)) {\n return code.slice(previous.length);\n }\n if (code.endsWith(previous)) {\n return code.slice(0, code.length - previous.length);\n }\n return code;\n};\n\nexport const applyOtpText = (\n digits: string[],\n index: number,\n text: string\n): OtpEntry | null => {\n const length = digits.length;\n const previous = digits[index] ?? \"\";\n\n if (text === \"\") {\n return { digits: withDigit(digits, index, \"\"), focus: null };\n }\n\n const typed = onlyDigits(typedOver(text, previous));\n if (!typed) {\n return null;\n }\n\n if (typed.length === 1) {\n return {\n digits: withDigit(digits, index, typed),\n focus: index + 1 < length ? index + 1 : null,\n };\n }\n\n const code = withoutPrevious(typed, previous, length).slice(0, length);\n return {\n digits: fillFromStart(code, length),\n focus: Math.min(code.length, length - 1),\n };\n};\n\nexport const applyOtpBackspace = (\n digits: string[],\n index: number\n): OtpEntry => {\n if (digits[index]) {\n return { digits: withDigit(digits, index, \"\"), focus: null };\n }\n if (index <= 0) {\n return { digits, focus: null };\n }\n return { digits: withDigit(digits, index - 1, \"\"), focus: index - 1 };\n};\n\nconst settleVerify = async (\n gate: OtpGateOptions,\n code: string\n): Promise<OtpVerifyResult> => {\n try {\n const result = await gate.onVerify(code);\n return result && result.ok ? result : { ok: false, message: result?.message };\n } catch {\n return { ok: false };\n }\n};\n\nexport class OtpGateSession {\n private verified = false;\n private pendingMode: AcceptMode | null = null;\n private acceptAfterToken: AcceptMode | null = null;\n private tokenAtVerify: string | undefined = undefined;\n private current: OtpGateView = {\n digits: emptyOtpDigits(),\n busy: false,\n error: null,\n };\n\n get isLocked(): boolean {\n return this.pendingMode !== null;\n }\n\n get view(): OtpGateView {\n return this.current;\n }\n\n /** Whether an accept made now would be held for the code. */\n wouldHold(gate: OtpGateOptions | undefined): boolean {\n return shouldHoldForOtp(gate, this.verified);\n }\n\n hold(gate: OtpGateOptions | undefined, mode: AcceptMode): boolean {\n if (shouldHoldForOtp(gate, this.verified)) {\n this.pendingMode = mode;\n this.current = { ...this.current, error: null };\n return true;\n }\n this.acceptAfterToken = null;\n return false;\n }\n\n setDigits(digits: string[]): void {\n this.current = { ...this.current, digits };\n }\n\n async verify(\n gate: OtpGateOptions | undefined,\n token: string | undefined,\n onBusy: () => void,\n failedMessage: string = OTP_GATE_COPY.failed\n ): Promise<boolean> {\n if (\n !gate ||\n this.pendingMode === null ||\n this.current.busy ||\n !isOtpComplete(this.current.digits)\n ) {\n return false;\n }\n\n this.current = { ...this.current, busy: true, error: null };\n onBusy();\n\n const result = await settleVerify(gate, otpCodeOf(this.current.digits));\n\n if (!result.ok) {\n this.current = {\n digits: emptyOtpDigits(),\n busy: false,\n error: result.message ?? failedMessage,\n };\n return false;\n }\n\n const mode = this.pendingMode ?? \"selected\";\n this.verified = true;\n this.pendingMode = null;\n this.current = { digits: emptyOtpDigits(), busy: false, error: null };\n this.tokenAtVerify = token;\n this.acceptAfterToken = mode;\n return true;\n }\n\n dropStashedAccept(): void {\n this.acceptAfterToken = null;\n }\n\n takeStashedAccept(token: string | undefined): AcceptMode | null {\n if (this.acceptAfterToken === null || token === this.tokenAtVerify) {\n return null;\n }\n const mode = this.acceptAfterToken;\n this.acceptAfterToken = null;\n return mode;\n }\n}\n","import { el } from \"../core/dom\";\nimport { part } from \"../appearance/parts\";\nimport { OTP_GATE_COPY, OTP_GATE_TITLE_ID } from \"../constants\";\nimport type {\n OtpEntry,\n OtpGatePanelOptions,\n OtpGatePanelRefs,\n OtpGateView,\n} from \"../types\";\nimport { applyOtpBackspace, applyOtpText, isOtpComplete } from \"./otpGate\";\n\nconst panelStyle = {\n margin: \"8px 0 4px\",\n padding: \"12px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n background: \"#f9fafb\",\n};\n\nconst titleStyle = {\n margin: \"0\",\n fontSize: \"13px\",\n fontWeight: \"600\",\n color: \"#111827\",\n};\n\nconst descriptionStyle = {\n margin: \"4px 0 10px\",\n fontSize: \"12px\",\n lineHeight: \"1.4\",\n color: \"#6b7280\",\n};\n\nconst digitsStyle = {\n display: \"flex\",\n gap: \"8px\",\n justifyContent: \"space-between\",\n};\n\nconst digitStyle = {\n width: \"100%\",\n minWidth: \"0\",\n boxSizing: \"border-box\",\n padding: \"10px 0\",\n fontSize: \"18px\",\n fontWeight: \"600\",\n textAlign: \"center\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"8px\",\n background: \"#ffffff\",\n};\n\nconst errorStyle = {\n margin: \"8px 0 0\",\n fontSize: \"12px\",\n color: \"#dc2626\",\n};\n\nconst buttonStyle = {\n width: \"100%\",\n marginTop: \"10px\",\n borderRadius: \"8px\",\n padding: \"9px 20px\",\n fontSize: \"14px\",\n lineHeight: \"150%\",\n border: \"none\",\n backgroundColor: \"#4f87ff\",\n color: \"#ffffff\",\n cursor: \"pointer\",\n boxSizing: \"border-box\",\n};\n\nexport function renderOtpGatePanel(\n options: OtpGatePanelOptions\n): OtpGatePanelRefs {\n let view: OtpGateView = options.view;\n const inputs: HTMLInputElement[] = [];\n\n const look = options.styles ?? {};\n const errorEl = el(\"p\", {\n role: \"alert\",\n style: { ...errorStyle, ...look.error, display: \"none\" },\n });\n\n const confirmButton = el(\"button\", {\n type: \"button\",\n style: { ...buttonStyle, ...look.button, ...options.buttonStyle },\n onClick: () => {\n if (view.busy || !isOtpComplete(view.digits)) return;\n options.onConfirm();\n },\n }) as HTMLButtonElement;\n\n const paint = () => {\n inputs.forEach((input, index) => {\n input.value = view.digits[index] ?? \"\";\n input.disabled = view.busy;\n });\n const blocked = view.busy || !isOtpComplete(view.digits);\n confirmButton.disabled = blocked;\n confirmButton.style.opacity = blocked ? \"0.5\" : \"1\";\n confirmButton.style.cursor = blocked ? \"not-allowed\" : \"pointer\";\n confirmButton.textContent = view.busy\n ? options.verifyingLabel ?? OTP_GATE_COPY.verifying\n : options.submitLabel;\n errorEl.textContent = view.error ?? \"\";\n errorEl.style.display = view.error ? \"block\" : \"none\";\n };\n\n const focusDigit = (index: number) => {\n inputs[index]?.focus();\n };\n\n const applyEntry = (entry: OtpEntry | null) => {\n if (!entry) {\n paint();\n return;\n }\n view = { ...view, digits: entry.digits };\n paint();\n options.onDigitsChange(entry.digits);\n if (entry.focus !== null) focusDigit(entry.focus);\n };\n\n const digitRow = el(\"div\", { style: { ...digitsStyle, ...look.digits } });\n view.digits.forEach((_, index) => {\n const input = el(\"input\", {\n id: `notice-otp-digit-${index}`,\n type: \"text\",\n inputmode: \"numeric\",\n autocomplete: index === 0 ? \"one-time-code\" : \"off\",\n \"aria-label\": `Digit ${index + 1}`,\n style: { ...digitStyle, ...look.digit },\n onFocus: () => input.select(),\n onInput: () => applyEntry(applyOtpText(view.digits, index, input.value)),\n onKeydown: (event: KeyboardEvent) => {\n if (event.key !== \"Backspace\") return;\n event.preventDefault();\n applyEntry(applyOtpBackspace(view.digits, index));\n },\n onPaste: (event: ClipboardEvent) => {\n event.preventDefault();\n const text = event.clipboardData?.getData(\"text\") ?? \"\";\n applyEntry(applyOtpText(view.digits, index, text));\n },\n }) as HTMLInputElement;\n inputs.push(input);\n digitRow.appendChild(input);\n });\n\n const container = el(\n \"div\",\n {\n ...part(\"otp\"),\n role: \"group\",\n \"aria-labelledby\": OTP_GATE_TITLE_ID,\n style: { ...panelStyle, ...look.panel },\n },\n el(\"h3\", { id: OTP_GATE_TITLE_ID, style: { ...titleStyle, ...look.title } }, options.title),\n el(\"p\", { style: { ...descriptionStyle, ...look.description } }, options.description),\n digitRow,\n errorEl,\n confirmButton\n );\n\n paint();\n\n return {\n container,\n render: (next: OtpGateView) => {\n view = next;\n paint();\n },\n focusDigit,\n };\n}\n\nexport function lockSelections(container: HTMLElement): void {\n container.setAttribute(\"inert\", \"\");\n container.setAttribute(\"aria-disabled\", \"true\");\n container.style.pointerEvents = \"none\";\n container.style.opacity = \"0.55\";\n container\n .querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLButtonElement>(\n \"input, select, button\"\n )\n .forEach((control) => {\n control.disabled = true;\n });\n container\n .querySelectorAll<HTMLElement>('[role=\"button\"]')\n .forEach((button) => {\n button.setAttribute(\"tabindex\", \"-1\");\n button.setAttribute(\"aria-disabled\", \"true\");\n });\n}\n","import {\n buildTtsCssVariables,\n NOTICE_THEME_VARS,\n type NoticeAppearanceColors,\n} from \"../shared/appearance\";\nimport { GLASS_VARS } from \"./constants\";\n\n/**\n * The console colours the injected stylesheets paint with: checkbox and switch\n * states, and the talkback highlight. Only colours the admin set are emitted,\n * so every other value falls back to the stylesheet's own default.\n */\nexport const buildThemeCssVariables = (\n colors: NoticeAppearanceColors,\n): Record<string, string> => {\n const accent = colors.toggle_on ?? colors.accept_all_bg;\n const entries: Array<[string, string | undefined]> = [\n [NOTICE_THEME_VARS.accent, accent],\n [NOTICE_THEME_VARS.controlOff, colors.toggle_off],\n [NOTICE_THEME_VARS.knob, colors.toggle_knob],\n [GLASS_VARS.track, colors.toggle_off],\n ];\n return {\n ...Object.fromEntries(\n entries.filter((entry): entry is [string, string] => entry[1] !== undefined),\n ),\n ...buildTtsCssVariables(colors),\n };\n};\n\n/**\n * Sets custom properties on an element. `el()`'s style handling assigns\n * camelCase properties, which a `--name` is not, so these go through\n * `setProperty`.\n */\nexport const applyCssVariables = (\n element: HTMLElement,\n variables: Readonly<Record<string, string>>,\n): void => {\n for (const [name, value] of Object.entries(variables)) {\n element.style.setProperty(name, value);\n }\n};\n","import { el } from \"../core/dom\";\nimport { part } from \"../appearance/parts\";\nimport { applyCssVariables } from \"../appearance/theme-vars\";\nimport {\n CONFIRM_DIALOG_DETAIL_ID,\n CONFIRM_DIALOG_ID,\n NOTICE_FONT_ROOT_ATTRIBUTE,\n} from \"../constants\";\nimport type { ConfirmAction, ConfirmDialogOptions, ConfirmDialogRefs, NoticeChromeCopy } from \"../types\";\nimport { noticeChromeCopy } from \"./chromeCopy\";\n\nconst ACTION_COPY: Record<\n ConfirmAction,\n { title: keyof NoticeChromeCopy; detail: keyof NoticeChromeCopy }\n> = {\n \"accept-all\": { title: \"confirmAcceptAllTitle\", detail: \"confirmAcceptAllDetail\" },\n \"accept-selected\": {\n title: \"confirmAcceptSelectedTitle\",\n detail: \"confirmAcceptSelectedDetail\",\n },\n decline: { title: \"confirmDeclineTitle\", detail: \"confirmDeclineDetail\" },\n};\n\nconst overlayStyle = {\n position: \"fixed\",\n inset: \"0\",\n top: \"0\",\n left: \"0\",\n right: \"0\",\n bottom: \"0\",\n backgroundColor: \"rgba(16, 24, 40, 0.45)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"24px\",\n zIndex: \"2147483647\",\n};\n\nconst panelStyle = {\n backgroundColor: \"#ffffff\",\n borderRadius: \"12px\",\n padding: \"24px\",\n maxWidth: \"380px\",\n width: \"100%\",\n boxShadow: \"0 12px 32px rgba(16, 24, 40, 0.18)\",\n boxSizing: \"border-box\",\n};\n\nconst titleStyle = {\n margin: \"0 0 8px\",\n fontSize: \"16px\",\n lineHeight: \"24px\",\n fontWeight: \"600\",\n color: \"#101828\",\n};\n\nconst detailStyle = {\n margin: \"0 0 20px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n};\n\nconst actionsStyle = {\n display: \"flex\",\n gap: \"12px\",\n justifyContent: \"flex-end\",\n};\n\nconst buttonStyle = {\n borderRadius: \"8px\",\n padding: \"8px 20px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n cursor: \"pointer\",\n border: \"1px solid #d0d5dd\",\n backgroundColor: \"#ffffff\",\n color: \"#344054\",\n};\n\nconst activeIn = (root: ShadowRoot | Document): Element | null =>\n root.activeElement ?? document.activeElement;\n\nexport function openConfirmDialog(\n options: ConfirmDialogOptions\n): ConfirmDialogRefs {\n const { root, action, onConfirm, onCancel, confirmStyle, fontFamily, skin } =\n options;\n const copy = noticeChromeCopy(options.language);\n const opener = activeIn(root);\n let disposed = false;\n\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n document.removeEventListener(\"keydown\", onKeyDown, true);\n overlay.parentNode?.removeChild(overlay);\n };\n\n const cancel = () => {\n dispose();\n onCancel();\n if (opener instanceof HTMLElement) opener.focus();\n };\n\n const confirm = () => {\n dispose();\n onConfirm();\n };\n\n const cancelButton = el(\n \"button\",\n { type: \"button\", style: { ...buttonStyle, ...skin?.button }, onClick: cancel },\n copy.no\n ) as HTMLButtonElement;\n\n const confirmButton = el(\n \"button\",\n {\n type: \"button\",\n style: { ...buttonStyle, ...skin?.button, ...confirmStyle },\n onClick: confirm,\n },\n copy.yes\n ) as HTMLButtonElement;\n\n const panel = el(\n \"div\",\n {\n role: \"dialog\",\n ...part(\"confirm-dialog\"),\n \"aria-modal\": \"true\",\n \"aria-labelledby\": CONFIRM_DIALOG_ID,\n \"aria-describedby\": CONFIRM_DIALOG_DETAIL_ID,\n style: { ...panelStyle, ...skin?.panel },\n },\n el(\n \"p\",\n { id: CONFIRM_DIALOG_ID, style: { ...titleStyle, ...skin?.title } },\n copy[ACTION_COPY[action].title]\n ),\n el(\n \"p\",\n { id: CONFIRM_DIALOG_DETAIL_ID, style: { ...detailStyle, ...skin?.detail } },\n copy[ACTION_COPY[action].detail]\n ),\n el(\"div\", { style: actionsStyle }, cancelButton, confirmButton)\n );\n\n // The notice's root attributes, so its stylesheets and the admin's scoped\n // custom CSS reach the confirm step too.\n const overlay = el(\n \"div\",\n {\n ...options.rootAttributes,\n [NOTICE_FONT_ROOT_ATTRIBUTE]: \"\",\n style: { ...overlayStyle, ...skin?.overlay, fontFamily: fontFamily || \"inherit\" },\n },\n panel\n );\n if (options.rootVariables) applyCssVariables(overlay, options.rootVariables);\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n cancel();\n return;\n }\n if (event.key !== \"Tab\") return;\n event.stopPropagation();\n\n const active = activeIn(root);\n if (event.shiftKey && active === cancelButton) {\n event.preventDefault();\n confirmButton.focus();\n return;\n }\n if (!event.shiftKey && active === confirmButton) {\n event.preventDefault();\n cancelButton.focus();\n return;\n }\n if (active !== cancelButton && active !== confirmButton) {\n event.preventDefault();\n cancelButton.focus();\n }\n }\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n (root instanceof Document ? root.body : root).appendChild(overlay);\n cancelButton.focus();\n\n return { element: overlay, dispose };\n}\n","import type { NoticeProduct } from \"../api/types\";\nimport type { ProductPolicyLink } from \"../types\";\n\nexport const getProductPolicyLinks = (\n products: ReadonlyArray<NoticeProduct> | null | undefined,\n policies: Record<string, string> | null | undefined\n): ProductPolicyLink[] => {\n if (!policies) {\n return [];\n }\n return (products ?? []).flatMap((product) => {\n const url = policies[product.uuid];\n return url ? [{ uuid: product.uuid, name: product.name, url }] : [];\n });\n};\n\nexport const shouldShowNoticePolicyLink = (\n products: ReadonlyArray<NoticeProduct> | null | undefined,\n links: ReadonlyArray<ProductPolicyLink>\n): boolean => {\n const productCount = products?.length ?? 0;\n if (links.length === 0 || productCount === 0) {\n return true;\n }\n return links.length < productCount;\n};\n","import { el } from \"../core/dom\";\nimport type { ProductPolicyLineOptions } from \"../types\";\n\nexport function renderProductPolicyLine({\n label,\n links,\n linkStyle,\n}: ProductPolicyLineOptions): HTMLElement {\n const line = el(\n \"span\",\n { id: \"product-privacy-policies\" },\n el(\"span\", { id: \"product-privacy-policies-label\" }, label),\n \" \"\n );\n links.forEach((link, index) => {\n if (index > 0) line.appendChild(document.createTextNode(\", \"));\n line.appendChild(\n el(\n \"a\",\n {\n id: `product-privacy-policy-${link.uuid}`,\n href: link.url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: linkStyle,\n },\n link.name\n )\n );\n });\n return line;\n}\n","import type {\n PurposeItemData,\n PurposePreselection,\n PurposeSelection,\n} from \"../api/types\";\nimport {\n DEFAULT_PURPOSE_PRESELECTION,\n PURPOSE_STATUS_INACTIVE,\n} from \"../constants\";\nimport { productPurposeKey } from \"../core/productMatrix\";\nimport type {\n OpeningSelection,\n PurposeRow,\n RecordedLookup,\n SelectablePurpose,\n SelectionState,\n} from \"../types\";\nimport { buildSelectionForMode, dataElementKey } from \"./consentSelection\";\n\nexport const resolvePurposePreselection = (\n raw: string | undefined | null\n): PurposePreselection =>\n raw === \"MANDATORY\" || raw === \"ALL\" ? raw : DEFAULT_PURPOSE_PRESELECTION;\n\nexport const hasRecordedPurposeState = (\n selection: PurposeSelection | undefined\n): selection is PurposeSelection => {\n if (!selection) {\n return false;\n }\n if (selection.status && selection.status !== PURPOSE_STATUS_INACTIVE) {\n return true;\n }\n return Object.keys(selection.data_elements ?? {}).length > 0;\n};\n\nexport const buildPreselection = (\n purposes: ReadonlyArray<SelectablePurpose>,\n mode: PurposePreselection\n): SelectionState => {\n if (mode === \"ALL\") {\n return buildSelectionForMode(\n purposes.map((purpose) => ({ purpose, productUuid: undefined })),\n \"all\",\n { selectedPurposes: {}, selectedDataElements: {} }\n );\n }\n\n const selectedPurposes: Record<string, boolean> = {};\n const selectedDataElements: Record<string, boolean> = {};\n\n purposes.forEach((purpose) => {\n let hasPreselectedElement = false;\n purpose.data_elements.forEach((element) => {\n const isPreselected =\n mode === \"MANDATORY\" && element.required && element.enabled;\n selectedDataElements[dataElementKey(purpose.uuid, element.uuid)] =\n isPreselected;\n hasPreselectedElement = hasPreselectedElement || isPreselected;\n });\n selectedPurposes[purpose.uuid] = hasPreselectedElement;\n });\n\n return { selectedPurposes, selectedDataElements };\n};\n\nexport const openingSelection = (\n purposes: ReadonlyArray<PurposeItemData>,\n preselection: string | undefined | null,\n recordedFor: RecordedLookup\n): OpeningSelection => {\n const hint = buildPreselection(\n purposes,\n resolvePurposePreselection(preselection)\n );\n const isRecorded = (purposeUuid: string, productUuid?: string) =>\n hasRecordedPurposeState(recordedFor(purposeUuid, productUuid));\n\n return {\n purpose: (purposeUuid, productUuid) =>\n !isRecorded(purposeUuid, productUuid) &&\n (hint.selectedPurposes[purposeUuid] ?? false),\n dataElement: (purposeUuid, elementUuid, productUuid) =>\n !isRecorded(purposeUuid, productUuid) &&\n (hint.selectedDataElements[dataElementKey(purposeUuid, elementUuid)] ??\n false),\n };\n};\n\nexport const applyPreselection = (\n rows: ReadonlyArray<PurposeRow<PurposeItemData>>,\n preselection: string | undefined | null,\n recordedFor: RecordedLookup,\n seeded: SelectionState\n): SelectionState => {\n const opening = openingSelection(\n rows.map((row) => row.purpose),\n preselection,\n recordedFor\n );\n const selectedPurposes = { ...seeded.selectedPurposes };\n const selectedDataElements = { ...seeded.selectedDataElements };\n\n rows.forEach(({ purpose, productUuid }) => {\n if (hasRecordedPurposeState(recordedFor(purpose.uuid, productUuid))) return;\n selectedPurposes[productPurposeKey(productUuid, purpose.uuid)] =\n opening.purpose(purpose.uuid, productUuid);\n purpose.data_elements.forEach((element) => {\n selectedDataElements[dataElementKey(purpose.uuid, element.uuid, productUuid)] =\n opening.dataElement(purpose.uuid, element.uuid, productUuid);\n });\n });\n\n return { selectedPurposes, selectedDataElements };\n};\n\nexport const recordedAnswersFor = (\n rows: ReadonlyArray<PurposeRow>,\n recordedFor: RecordedLookup\n): Record<string, boolean> =>\n rows.reduce((answers: Record<string, boolean>, { purpose, productUuid }) => {\n const selection = recordedFor(purpose.uuid, productUuid);\n if (hasRecordedPurposeState(selection)) {\n answers[productPurposeKey(productUuid, purpose.uuid)] =\n selection.selected === true;\n }\n return answers;\n }, {});\n\n/**\n * The preselection hint on the keys the rows actually read. The hint is per\n * purpose, but a grouped notice keys its state per (product, purpose), so a\n * surface that seeds rows straight from `buildPreselection` writes keys its\n * own checkboxes and gate never read.\n */\nexport const preselectionForRows = (\n rows: ReadonlyArray<{ purpose: SelectablePurpose; productUuid?: string }>,\n preselection: SelectionState\n): SelectionState => {\n const selectedPurposes: Record<string, boolean> = {};\n const selectedDataElements: Record<string, boolean> = {};\n\n rows.forEach(({ purpose, productUuid }) => {\n selectedPurposes[productPurposeKey(productUuid, purpose.uuid)] =\n preselection.selectedPurposes[purpose.uuid] ?? false;\n purpose.data_elements.forEach((element) => {\n selectedDataElements[dataElementKey(purpose.uuid, element.uuid, productUuid)] =\n preselection.selectedDataElements[dataElementKey(purpose.uuid, element.uuid)] ?? false;\n });\n });\n\n return { selectedPurposes, selectedDataElements };\n};\n","import {\n CSS_FONT_KEYWORDS,\n DEFAULT_NOTICE_FONT_ID,\n INHERIT_FONT_FAMILY,\n NOTICE_FONT_CATALOGUE,\n NOTICE_FONT_CSS,\n NOTICE_FONT_GENERIC_FALLBACK,\n NOTICE_FONT_STYLE_ID,\n UNSAFE_FONT_CHARACTERS,\n} from \"../constants\";\nimport type { NoticeFontEntry, NoticeFontSources } from \"../types\";\n\nconst entryById = (id: string): NoticeFontEntry | undefined =>\n NOTICE_FONT_CATALOGUE.find((entry) => entry.id === id);\n\nconst toFontFamilyValue = (value: string): string => {\n if (value.includes(\",\")) {\n return value;\n }\n const family = value.replace(UNSAFE_FONT_CHARACTERS, \"\").trim();\n if (!family) {\n return INHERIT_FONT_FAMILY;\n }\n const lowered = family.toLowerCase();\n if (CSS_FONT_KEYWORDS.includes(lowered)) {\n return lowered;\n }\n return entryById(lowered)?.stack ?? `\"${family}\"${NOTICE_FONT_GENERIC_FALLBACK}`;\n};\n\nconst toNoticeFontEntry = (\n fontPreference?: string\n): NoticeFontEntry | undefined => {\n const stored = fontPreference?.trim();\n if (!stored) {\n return undefined;\n }\n return entryById(stored.toLowerCase()) ?? entryById(DEFAULT_NOTICE_FONT_ID);\n};\n\nexport const resolveNoticeFontFamily = ({\n hostFont,\n noticeFont,\n}: NoticeFontSources): string => {\n const host = hostFont?.trim();\n if (host) {\n return toFontFamilyValue(host);\n }\n return toNoticeFontEntry(noticeFont)?.stack ?? INHERIT_FONT_FAMILY;\n};\n\nexport const injectNoticeFontStyles = (root: ShadowRoot | Document): void => {\n const existing =\n root instanceof Document\n ? root.getElementById(NOTICE_FONT_STYLE_ID)\n : root.querySelector(`#${NOTICE_FONT_STYLE_ID}`);\n if (existing) return;\n\n const style = document.createElement(\"style\");\n style.id = NOTICE_FONT_STYLE_ID;\n style.textContent = NOTICE_FONT_CSS;\n (root instanceof Document ? root.head : root).appendChild(style);\n};\n","import { toLanguageCode } from \"../api/language\";\nimport type { SectionLabels } from \"../types\";\n\n/** The notice's two collapsible sections, in render order. */\nexport const NOTICE_SECTIONS = [\"about\", \"dpo\"] as const;\n\n/**\n * SDK-owned UI copy for the section headers, keyed by BCP-47 code. The notice\n * record carries translations for its own content only, so these have to ship\n * with the SDK. \"Grievance\" matches the Privacy Center locale files.\n *\n * Bodo, Kashmiri, Manipuri and Santali are deliberately absent until a native\n * speaker supplies them: for those, `sectionLabelsFor` returns null and the\n * headers fall back to the notice's own translated text rather than English.\n */\nconst SECTION_LABELS: Record<string, SectionLabels> = {\n en: { about: \"About this notice\", dpo: \"Grievances & your DPO\" },\n as: { about: \"এই জাননীৰ বিষয়ে\", dpo: \"অভিযোগ আৰু যোগাযোগ\" },\n bn: { about: \"এই বিজ্ঞপ্তি সম্পর্কে\", dpo: \"অভিযোগ ও যোগাযোগ\" },\n doi: { about: \"इस सूचना बारै\", dpo: \"शिकायत ते संपर्क\" },\n gom: { about: \"ह्या सुचनेविशीं\", dpo: \"तक्रार आनी संपर्क\" },\n gu: { about: \"આ સૂચના વિશે\", dpo: \"ફરિયાદ અને સંપર્ક\" },\n hi: { about: \"इस सूचना के बारे में\", dpo: \"शिकायत और संपर्क\" },\n kn: { about: \"ಈ ಸೂಚನೆಯ ಬಗ್ಗೆ\", dpo: \"ಕುಂದುಕೊರತೆ ಮತ್ತು ಸಂಪರ್ಕ\" },\n mai: { about: \"एहि सूचनाक विषयमे\", dpo: \"शिकायत आ संपर्क\" },\n ml: { about: \"ഈ അറിയിപ്പിനെക്കുറിച്ച്\", dpo: \"പരാതിയും ബന്ധപ്പെടലും\" },\n mr: { about: \"या सूचनेबद्दल\", dpo: \"तक्रार आणि संपर्क\" },\n ne: { about: \"यस सूचनाबारे\", dpo: \"गुनासो र सम्पर्क\" },\n or: { about: \"ଏହି ବିଜ୍ଞପ୍ତି ବିଷୟରେ\", dpo: \"ଅଭିଯୋଗ ଏବଂ ଯୋଗାଯୋଗ\" },\n pa: { about: \"ਇਸ ਸੂਚਨਾ ਬਾਰੇ\", dpo: \"ਸ਼ਿਕਾਇਤ ਅਤੇ ਸੰਪਰਕ\" },\n sa: { about: \"अस्याः सूचनायाः विषये\", dpo: \"परिवादः सम्पर्कश्च\" },\n sd: { about: \"هن نوٽيس بابت\", dpo: \"شڪايت ۽ رابطو\" },\n ta: { about: \"இந்த அறிவிப்பு பற்றி\", dpo: \"புகார் மற்றும் தொடர்பு\" },\n te: { about: \"ఈ నోటీసు గురించి\", dpo: \"ఫిర్యాదు మరియు సంప్రదింపు\" },\n ur: { about: \"اس نوٹس کے بارے میں\", dpo: \"شکایت اور رابطہ\" },\n};\n\n/** Last resort when the notice has no copy of its own to title a section with. */\nexport const ENGLISH_SECTION_LABELS: SectionLabels = SECTION_LABELS.en;\n\n/** Labels for a notice language (display name or code), or null if unsupported. */\nexport const sectionLabelsFor = (language: string): SectionLabels | null => {\n const code = toLanguageCode(language);\n if (!code) {\n return null;\n }\n const lower = code.toLowerCase();\n return (\n SECTION_LABELS[lower] ?? SECTION_LABELS[lower.split(\"-\")[0]] ?? null\n );\n};\n","import { el, svg } from \"../core/dom\";\nimport { ACCORDION_NAME_MAX_CHARS } from \"../appearance/constants\";\nimport { part } from \"../appearance/parts\";\nimport type { AccordionStyles } from \"../appearance/types\";\nimport { COLLAPSE_EASE, MOTION, prefersReducedMotion } from \"../shared/appearance\";\n\n/**\n * A short accessible name that starts with the visible title, so voice-control\n * users can still say what they see. Sliced by code point, not UTF-16 unit.\n */\nexport const briefName = (text: string): string => {\n const chars = Array.from(text.replace(/\\s+/g, \" \").trim());\n return chars.length <= ACCORDION_NAME_MAX_CHARS\n ? chars.join(\"\")\n : `${chars.slice(0, ACCORDION_NAME_MAX_CHARS).join(\"\").trimEnd()}…`;\n};\n\nconst ICON_PATHS: Record<NoticeAccordionIcon, Array<[string, Record<string, string>]>> = {\n info: [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"9\" }],\n [\"path\", { d: \"M12 16v-4M12 8h.01\" }],\n ],\n shield: [\n [\"path\", { d: \"M12 3l7 3v5c0 4.5-3 8.3-7 10-4-1.7-7-5.5-7-10V6l7-3z\" }],\n [\"path\", { d: \"M9 12l2 2 4-4\" }],\n ],\n};\n\nexport type NoticeAccordionIcon = \"info\" | \"shield\";\n\nexport type CollapseRefs = {\n /** The slot the panel mounts into; stays in the tree while collapsed. */\n slot: HTMLElement;\n setOpen: (open: boolean) => void;\n isMounted: () => boolean;\n dispose: () => void;\n};\n\n/**\n * Animated disclosure body. Rows go 0fr -> 1fr so the panel eases to its\n * natural height without measuring it — notice copy varies a lot by language.\n *\n * Closing content is `inert` and `aria-hidden` for the length of the exit\n * animation, then unmounts, so from the moment it starts to close it is out of\n * the accessibility tree and the tab order.\n */\nexport const createCollapse = (\n content: HTMLElement,\n options: { id?: string; open: boolean; animate: () => boolean }\n): CollapseRefs => {\n const slot = el(\"div\", { style: { display: \"contents\" } });\n const inner = el(\"div\", {\n style: {\n opacity: \"1\",\n transform: \"none\",\n },\n }, content);\n const clip = el(\"div\", { style: { overflow: \"hidden\", minHeight: 0 } }, inner);\n const panel = el(\"div\", { id: options.id, style: { display: \"grid\" } }, clip);\n let open = options.open;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let frame: number | null = null;\n\n const clearPending = () => {\n if (timer !== null) clearTimeout(timer);\n timer = null;\n if (frame !== null && typeof cancelAnimationFrame === \"function\") cancelAnimationFrame(frame);\n frame = null;\n };\n\n const paint = (expanded: boolean) => {\n const still = !options.animate();\n panel.style.gridTemplateRows = expanded ? \"1fr\" : \"0fr\";\n panel.style.transition = still ? \"none\" : `grid-template-rows ${COLLAPSE_EASE}`;\n inner.style.opacity = expanded ? \"1\" : \"0\";\n inner.style.transform = expanded ? \"none\" : \"translateY(-4px)\";\n inner.style.transition = still\n ? \"none\"\n : `opacity 260ms ${MOTION.outEase}, transform 320ms ${MOTION.outEase}`;\n inner.style.transitionDelay = expanded ? \"80ms\" : \"0ms\";\n };\n\n const mountOpen = (animated: boolean) => {\n panel.removeAttribute(\"inert\");\n panel.removeAttribute(\"aria-hidden\");\n if (panel.parentNode !== slot) slot.appendChild(panel);\n if (!animated || typeof requestAnimationFrame !== \"function\") {\n paint(true);\n return;\n }\n paint(false);\n // Two frames: the first commits the 0fr state, the second transitions\n // from it. One frame can be batched into the same paint and skip it.\n frame = requestAnimationFrame(() => {\n frame = requestAnimationFrame(() => {\n frame = null;\n paint(true);\n });\n });\n };\n\n if (open) mountOpen(false);\n\n return {\n slot,\n isMounted: () => panel.parentNode === slot,\n setOpen: (next: boolean) => {\n if (next === open) return;\n open = next;\n clearPending();\n if (next) {\n mountOpen(options.animate());\n return;\n }\n panel.setAttribute(\"inert\", \"\");\n panel.setAttribute(\"aria-hidden\", \"true\");\n paint(false);\n if (!options.animate()) {\n panel.remove();\n return;\n }\n timer = setTimeout(() => {\n timer = null;\n panel.remove();\n }, MOTION.collapseMs);\n },\n dispose: clearPending,\n };\n};\n\nexport type NoticeAccordionOptions = {\n /** DOM id for the panel. */\n panelId: string;\n icon: NoticeAccordionIcon;\n title: string;\n /** Clamp the title to two lines — for when it is notice copy, not a label. */\n clampTitle?: boolean;\n /**\n * One-line preview shown under the title; clamped, so it can be the real copy.\n * Hidden from assistive tech, which would otherwise read the whole notice as\n * the button's name and then again inside the panel.\n */\n hint?: string;\n open: boolean;\n /** Held open by talkback: the header says so and ignores clicks. */\n locked: boolean;\n onToggle: () => void;\n styles: AccordionStyles;\n /** Whether disclosures animate: off with motion off or reduced motion. */\n animate: () => boolean;\n content: HTMLElement;\n};\n\nexport type NoticeAccordionRefs = {\n element: HTMLElement;\n /** Whether keyboard focus sits inside the panel. */\n holdsFocus: (active: Element | null) => boolean;\n setState: (open: boolean, locked: boolean) => void;\n dispose: () => void;\n};\n\n/**\n * A collapsed-by-default section of the notice body (the notice text, the DPO\n * and grievance block). The header is a real button with `aria-expanded`, so\n * screen readers announce the state the chevron shows. The panel's content\n * unmounts once closed, so its links leave the tab order with it.\n */\nexport function renderNoticeAccordion(options: NoticeAccordionOptions): NoticeAccordionRefs {\n const { panelId, icon, title, clampTitle = false, hint, styles, animate } = options;\n let open = options.open;\n let locked = options.locked;\n\n const hintEl = hint\n ? el(\"span\", { dir: \"auto\", style: styles.hint, \"aria-hidden\": \"true\" }, hint)\n : null;\n\n const chevron = svg(\n \"svg\",\n {\n width: \"18\",\n height: \"18\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"aria-hidden\": \"true\",\n style: styles.chevron,\n },\n svg(\"path\", { d: \"M6 9l6 6 6-6\" })\n );\n\n const head = el(\n \"button\",\n {\n type: \"button\",\n style: styles.head,\n \"aria-label\": clampTitle ? briefName(title) : null,\n onClick: () => {\n if (!locked) options.onToggle();\n },\n },\n el(\n \"span\",\n { style: styles.icon, \"aria-hidden\": \"true\" },\n svg(\n \"svg\",\n {\n width: \"18\",\n height: \"18\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n },\n ...ICON_PATHS[icon].map(([tag, attrs]) => svg(tag, attrs))\n )\n ),\n el(\n \"span\",\n { style: styles.text },\n el(\n \"span\",\n { dir: \"auto\", style: { ...styles.title, ...(clampTitle ? styles.titleClamped : {}) } },\n title\n ),\n hintEl\n ),\n chevron\n );\n\n const body = el(\"div\", { style: styles.body }, options.content);\n const collapse = createCollapse(body, { id: panelId, open, animate });\n\n const paintHead = () => {\n head.setAttribute(\"aria-expanded\", String(open));\n if (open) {\n head.setAttribute(\"aria-controls\", panelId);\n } else {\n head.removeAttribute(\"aria-controls\");\n }\n if (locked) {\n head.setAttribute(\"aria-disabled\", \"true\");\n } else {\n head.removeAttribute(\"aria-disabled\");\n }\n if (hintEl) hintEl.style.display = open ? \"none\" : \"\";\n (chevron as unknown as HTMLElement).style.transform = open ? \"rotate(180deg)\" : \"none\";\n (chevron as unknown as HTMLElement).style.transition =\n animate() && !prefersReducedMotion()\n ? `transform ${MOTION.collapseMs}ms ${MOTION.sheetEase}`\n : \"none\";\n };\n paintHead();\n\n const element = el(\"div\", { ...part(\"section\"), style: styles.root }, head, collapse.slot);\n\n return {\n element,\n holdsFocus: (active) => Boolean(active && body.contains(active)),\n setState: (nextOpen, nextLocked) => {\n locked = nextLocked;\n if (nextOpen !== open) {\n open = nextOpen;\n collapse.setOpen(nextOpen);\n }\n paintHead();\n },\n dispose: () => collapse.dispose(),\n };\n}\n","import {\n MOTION,\n withAlpha,\n type NoticeAppearanceColors,\n type ResolvedNoticeLayout,\n} from \"../shared/appearance\";\nimport {\n BOTTOM_BAR_CONTENT_WIDTH,\n CORNER_OFFSET,\n NOTICE_KEYFRAMES,\n SHEET_PANEL_GAP,\n SOLID_SURFACE_DEFAULTS,\n} from \"./constants\";\nimport type {\n AccordionStyles,\n CornerSide,\n LayoutParts,\n LayoutPartsInput,\n LayoutSurface,\n ModalPositionInput,\n Style,\n StyleRadii,\n} from \"./types\";\n\n/**\n * The surface an opaque style's layout parts draw on, from the admin's palette\n * over classic's own colours. Glass passes its translucent palette instead.\n */\nexport const solidSurface = (\n colors: NoticeAppearanceColors,\n accent: string,\n radii: StyleRadii,\n): LayoutSurface => {\n const edge = colors.border ?? SOLID_SURFACE_DEFAULTS.edge;\n return {\n accent,\n panel: colors.surface ?? colors.background ?? SOLID_SURFACE_DEFAULTS.panel,\n panelEdge: edge,\n hairline: edge,\n outline: colors.toggle_off ?? SOLID_SURFACE_DEFAULTS.outline,\n footer: colors.background ?? SOLID_SURFACE_DEFAULTS.panel,\n accentWash: withAlpha(accent, 0.08),\n radii,\n };\n};\n\nconst accordionStyles = (\n s: LayoutSurface,\n { isMobile, headingColor, textColor }: LayoutPartsInput,\n): AccordionStyles => ({\n root: {\n borderRadius: s.radii.panel,\n backgroundColor: s.panel,\n border: `1px solid ${s.panelEdge}`,\n boxSizing: \"border-box\",\n flexShrink: 0,\n },\n head: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n width: \"100%\",\n padding: isMobile ? \"12px 14px\" : \"14px 16px\",\n margin: 0,\n background: \"none\",\n border: 0,\n borderRadius: s.radii.panel,\n textAlign: \"left\",\n color: textColor,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n boxSizing: \"border-box\",\n },\n icon: {\n display: \"grid\",\n placeItems: \"center\",\n width: \"34px\",\n height: \"34px\",\n borderRadius: s.radii.control,\n backgroundColor: s.accentWash,\n color: s.accent,\n flexShrink: 0,\n },\n text: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1px\",\n flex: 1,\n minWidth: 0,\n },\n title: {\n fontSize: \"14px\",\n fontWeight: 700,\n lineHeight: 1.35,\n color: headingColor,\n },\n titleClamped: {\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n fontWeight: 600,\n },\n hint: {\n fontSize: \"12px\",\n lineHeight: 1.4,\n color: textColor,\n opacity: 0.75,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n },\n chevron: { flexShrink: 0, opacity: 0.7 },\n body: {\n // The icon well's width plus its gap on desktop, so the copy lines up\n // with the title; phones need the width more than the alignment.\n padding: isMobile ? \"0 14px 14px\" : \"0 16px 16px 62px\",\n fontSize: isMobile ? \"13px\" : \"14px\",\n lineHeight: 1.55,\n color: textColor,\n boxSizing: \"border-box\",\n },\n});\n\n/**\n * The parts a layout choice draws with, in any style: the sheet's grabber and\n * bands, the collapsible sections and the paired phone footer.\n */\nexport const buildLayoutParts = (\n s: LayoutSurface,\n input: LayoutPartsInput,\n): LayoutParts => {\n const { isMobile } = input;\n const gutter = isMobile ? \"16px\" : \"24px\";\n return {\n grabber: {\n width: \"38px\",\n height: \"5px\",\n margin: \"8px auto 0\",\n borderRadius: \"999px\",\n backgroundColor: s.outline,\n flexShrink: 0,\n },\n sheetContent: {\n display: \"flex\",\n flexDirection: \"column\",\n flexGrow: 1,\n overflow: \"hidden\",\n minHeight: 0,\n margin: 0,\n boxSizing: \"border-box\",\n textAlign: \"left\",\n },\n sheetHeader: {\n padding: isMobile ? `12px ${gutter} 12px` : `22px ${gutter} 14px`,\n flexShrink: 0,\n },\n sheetGroup: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: SHEET_PANEL_GAP,\n },\n sheetBody: {\n margin: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: SHEET_PANEL_GAP,\n flexGrow: 1,\n overflowY: \"auto\",\n overscrollBehavior: \"contain\",\n minHeight: 0,\n padding: isMobile ? \"4px 16px 14px\" : \"4px 24px 18px\",\n boxSizing: \"border-box\",\n textAlign: \"left\",\n animation: `${NOTICE_KEYFRAMES.settle} 520ms 160ms ${MOTION.outEase} both`,\n },\n footerBand: {\n padding: isMobile ? \"12px 16px 16px\" : \"14px 24px 22px\",\n borderTop: `1px solid ${s.hairline}`,\n background: s.footer,\n flexShrink: 0,\n boxSizing: \"border-box\",\n },\n actionButtonPair: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: \"8px\",\n margin: 0,\n padding: 0,\n },\n accordion: accordionStyles(s, input),\n };\n};\n\nconst RISE = `${NOTICE_KEYFRAMES.rise} ${MOTION.sheetMs}ms ${MOTION.sheetEase} both`;\nconst SETTLE = `${NOTICE_KEYFRAMES.settle} ${MOTION.dimMs}ms ${MOTION.outEase} both`;\n\n/** Pinned to the bottom edge, full width, with only its top corners rounded. */\nconst edgeDock = (radius: string): Style => ({\n top: \"auto\",\n left: \"0\",\n right: \"0\",\n bottom: \"0\",\n transform: \"none\",\n width: \"100%\",\n maxWidth: \"100%\",\n borderRadius: `${radius} ${radius} 0 0`,\n borderBottom: \"none\",\n animation: RISE,\n});\n\nconst corner = (side: CornerSide): Style => ({\n top: \"auto\",\n bottom: CORNER_OFFSET,\n left: side === \"left\" ? CORNER_OFFSET : \"auto\",\n right: side === \"right\" ? CORNER_OFFSET : \"auto\",\n transform: \"none\",\n animation: SETTLE,\n});\n\n/** Pinned to a viewport edge: a phone sheet, or a desktop bottom bar. */\nexport const isDocked = (\n layout: ResolvedNoticeLayout,\n isMobile: boolean,\n): boolean =>\n isMobile ? layout.mobileSheet : layout.desktopPosition === \"bottom-bar\";\n\n/**\n * Where the dialog sits, over whatever the style drew. Percentages, not\n * viewport units, so a frame the host renders the notice in is the\n * containing block.\n */\nexport const modalPosition = ({\n layout,\n isMobile,\n radius,\n maxWidth,\n}: ModalPositionInput): Style => {\n if (isMobile) {\n return layout.mobileSheet\n ? {\n ...edgeDock(radius),\n maxHeight: \"92vh\",\n paddingBottom: \"env(safe-area-inset-bottom, 0px)\",\n }\n : {};\n }\n const width: Style = maxWidth\n ? { width: `min(${maxWidth}, calc(100% - 48px))`, maxWidth: \"none\" }\n : {};\n switch (layout.desktopPosition) {\n case \"bottom-right\":\n return { ...corner(\"right\"), ...width };\n case \"bottom-left\":\n return { ...corner(\"left\"), ...width };\n case \"bottom-bar\":\n return {\n ...edgeDock(radius),\n maxHeight: \"70vh\",\n paddingLeft: `max(0px, calc((100% - ${BOTTOM_BAR_CONTENT_WIDTH}) / 2))`,\n paddingRight: `max(0px, calc((100% - ${BOTTOM_BAR_CONTENT_WIDTH}) / 2))`,\n };\n default:\n return width;\n }\n};\n","import {\n withAlpha,\n type AppearanceStyle,\n type NoticeAppearanceColors,\n} from \"../shared/appearance\";\nimport type { Style, StyleMap, StylePatch } from \"./types\";\n\n/**\n * Shallow per-key merge: each patched key keeps the classic properties it does\n * not override. Generic, so a surface whose style keys copy the modal's\n * (assisted) takes the same patches; a patched key it lacks is added unused.\n */\nexport const mergeNoticeStyles = <T extends StyleMap>(\n base: T,\n patch: StylePatch,\n): T => {\n const merged: Record<string, Style> = { ...base };\n for (const [key, style] of Object.entries(patch)) {\n merged[key] = { ...merged[key], ...style };\n }\n return merged as T;\n};\n\n/** Drops unset keys, so a patch never overwrites a classic value with nothing. */\nconst defined = (style: Style): Style =>\n Object.fromEntries(\n Object.entries(style).filter(([, value]) => value !== undefined),\n );\n\nconst definedPatch = (patch: StylePatch): StylePatch =>\n Object.fromEntries(\n Object.entries(patch)\n .map(([key, style]) => [key, defined(style ?? {})] as const)\n .filter(([, style]) => Object.keys(style).length > 0),\n );\n\n/**\n * The admin's palette painted onto classic's surfaces. Classic hardcodes white\n * on every section, so a dark palette has to reach each one; a colour the\n * admin left unset keeps classic's own value.\n */\nconst palettePatch = (colors: NoticeAppearanceColors): StylePatch => {\n const surface = colors.surface ?? colors.background;\n const section = { backgroundColor: colors.background };\n const edge = colors.border && `1px solid ${colors.border}`;\n return definedPatch({\n overlay: { backgroundColor: colors.overlay },\n modal: { backgroundColor: colors.background },\n topSection: section,\n headerStack: section,\n bottomSection: section,\n actionButtonRow: section,\n actionButtonStack: section,\n title: { color: colors.heading },\n subTitle: { color: colors.heading },\n optionTitle: { color: colors.heading },\n privacyText: { color: colors.text },\n dataElementText: { color: colors.text },\n optionDescription: { color: colors.muted_text },\n confirmHint: { color: colors.muted_text },\n link: { color: colors.link },\n topRight: { border: edge },\n languageDropdown: { backgroundColor: surface, border: edge },\n languageItem: {\n backgroundColor: surface,\n color: colors.text,\n borderBottom: edge,\n },\n otpGatePanel: { background: surface, border: edge },\n otpGateTitle: { color: colors.heading },\n otpGateDescription: { color: colors.muted_text },\n otpGateDigit: {\n background: colors.background,\n border: edge,\n color: colors.heading,\n },\n });\n};\n\n/** Flat and quiet: hairline edges, no shadows, tight corners. */\nconst minimalPatch = (colors: NoticeAppearanceColors): StylePatch => {\n const hairline = `1px solid ${colors.border ?? \"#e4e7ec\"}`;\n return {\n modal: { boxShadow: \"none\", border: hairline },\n languageDropdown: { boxShadow: \"none\" },\n optionItem: { paddingBottom: \"10px\", borderBottom: hairline },\n button: { boxShadow: \"none\", fontWeight: 500 },\n otpGatePanel: { borderRadius: \"4px\" },\n };\n};\n\n/** Rounded and friendly: brand-washed panels and a soft lifted card. */\nconst softPatch = (accent: string): StylePatch => ({\n modal: { boxShadow: \"0 24px 48px -12px rgba(16, 24, 40, 0.22)\" },\n optionItem: {\n padding: \"12px 14px\",\n borderRadius: \"16px\",\n backgroundColor: withAlpha(accent, 0.06),\n },\n languageDropdown: { borderRadius: \"16px\" },\n button: { fontWeight: 600 },\n otpGatePanel: { borderRadius: \"16px\", background: withAlpha(accent, 0.06) },\n});\n\nconst variantPatch = (\n style: AppearanceStyle,\n colors: NoticeAppearanceColors,\n accent: string,\n): StylePatch => {\n if (style === \"minimal\") {\n return minimalPatch(colors);\n }\n if (style === \"soft\") {\n return softPatch(accent);\n }\n return {};\n};\n\n/**\n * Classic's styles with the admin's palette and, for minimal or soft, their\n * shape on top. Glass builds its own skin over this, so the palette reaches it\n * too wherever glass does not paint the surface itself.\n */\nexport const buildVariantStyles = <T extends StyleMap>(\n base: T,\n style: AppearanceStyle,\n colors: NoticeAppearanceColors,\n accent: string,\n): T =>\n mergeNoticeStyles(\n mergeNoticeStyles(base, palettePatch(colors)),\n variantPatch(style, colors, accent),\n );\n","import {\n GLASS_BLUR,\n GLASS_DEFAULT_TINT,\n GLASS_RADIUS,\n MOTION,\n glassPalette,\n opaqueOver,\n paintableColor,\n withAlpha,\n type GlassPalette,\n} from \"../shared/appearance\";\nimport {\n DEFAULT_ACCENT_COLOR,\n GLASS_DESKTOP_CARD_WIDTH,\n GLASS_ROW_CLASS,\n GLASS_VARS,\n NOTICE_KEYFRAMES,\n} from \"./constants\";\nimport { buildLayoutParts } from \"./layout-styles\";\nimport { mergeNoticeStyles } from \"./variant-styles\";\nimport type {\n ConfirmDialogSkin,\n GlassParts,\n GlassSkinInput,\n LayoutSurface,\n NoticeSkin,\n SelectionControlSkin,\n Style,\n StyleMap,\n StylePatch,\n} from \"./types\";\n\nconst blur: Style = {\n backdropFilter: GLASS_BLUR,\n WebkitBackdropFilter: GLASS_BLUR,\n};\n\n/** A verification-code field: a translucent control, like the notice's others. */\nconst otpField = (p: GlassPalette, color: string): Style => ({\n background: p.control,\n border: `1px solid ${p.outline}`,\n borderRadius: GLASS_RADIUS.control,\n color,\n});\n\nconst stylePatch = (\n p: GlassPalette,\n { isMobile, docked, textColor, headingColor, tint = GLASS_DEFAULT_TINT }: GlassSkinInput,\n): StylePatch => ({\n overlay: {\n backgroundColor: p.dim,\n animation: `${NOTICE_KEYFRAMES.fade} ${MOTION.dimMs}ms ${MOTION.outEase} both`,\n },\n\n // A floating card, centred by translate, which the float keyframes end on.\n // Where it sits (a docked sheet, a corner, a bar) is the layout's\n // `modalPosition`, spread over this.\n modal: {\n borderRadius: GLASS_RADIUS.sheet,\n backgroundColor: p.sheet,\n ...blur,\n border: `1px solid ${p.sheetEdge}`,\n boxShadow: docked ? p.shadow : p.floatShadow,\n maxHeight: \"85vh\",\n overflow: \"hidden\",\n animation: `${NOTICE_KEYFRAMES.float} ${MOTION.dimMs}ms ${MOTION.outEase} both`,\n },\n\n topSection: { backgroundColor: \"transparent\" },\n headerStack: { backgroundColor: \"transparent\" },\n\n title: {\n fontWeight: 800,\n lineHeight: 1.2,\n letterSpacing: \"-0.01em\",\n },\n\n topRight: {\n borderRadius: GLASS_RADIUS.pill,\n height: \"32px\",\n padding: \"0 12px\",\n border: `1px solid ${p.hairline}`,\n fontWeight: 600,\n lineHeight: 1,\n backgroundColor: p.control,\n },\n\n privacyText: { lineHeight: 1.55 },\n\n link: {\n fontWeight: 600,\n textDecoration: \"underline\",\n textDecorationThickness: \"1px\",\n textUnderlineOffset: \"3px\",\n },\n\n subTitle: {\n fontWeight: 700,\n margin: \"6px 4px 0\",\n },\n\n // The purposes as one grouped panel; rows separate with injected hairlines.\n optionsContainer: {\n gap: 0,\n borderRadius: GLASS_RADIUS.panel,\n backgroundColor: p.panel,\n border: `1px solid ${p.panelEdge}`,\n overflow: \"hidden\",\n flexShrink: 0,\n },\n\n optionItem: {\n gap: \"12px\",\n padding: isMobile ? \"12px 14px 12px 10px\" : \"14px 16px 14px 12px\",\n },\n\n optionLeft: {\n gap: \"10px\",\n flex: 1,\n minWidth: 0,\n borderRadius: GLASS_RADIUS.row,\n },\n\n optionTextContainer: { gap: \"2px\", minWidth: 0 },\n\n optionTitle: { fontWeight: 700, lineHeight: 1.4, letterSpacing: 0 },\n\n optionDescription: { lineHeight: 1.45, letterSpacing: 0, opacity: 0.85 },\n\n sectionHeader: {\n margin: 0,\n padding: isMobile ? \"14px 14px 10px 10px\" : \"16px 16px 10px 12px\",\n },\n\n // Purposes sit under their product with a small indent and no gap: the\n // panel's hairlines already separate them.\n sectionBody: {\n paddingLeft: \"12px\",\n margin: 0,\n },\n\n sectionTitle: { fontWeight: 700, letterSpacing: 0 },\n\n dataElementsContainer: {\n gap: \"4px\",\n padding: isMobile ? \"0 14px 12px 30px\" : \"0 16px 14px 34px\",\n },\n\n dataElementItem: {\n padding: \"8px 10px\",\n borderRadius: GLASS_RADIUS.row,\n backgroundColor: p.inset,\n minHeight: \"36px\",\n },\n\n dataElementText: { fontWeight: 500, letterSpacing: 0 },\n\n bottomSection: {\n gap: \"10px\",\n backgroundColor: \"transparent\",\n },\n\n // The band around these carries the padding and surface (`parts.footerBand`).\n actionButtonRow: {\n gap: \"10px\",\n paddingTop: 0,\n backgroundColor: \"transparent\",\n },\n\n actionButtonStack: {\n gap: \"8px\",\n paddingTop: 0,\n backgroundColor: \"transparent\",\n },\n\n confirmHint: {\n fontSize: \"12px\",\n lineHeight: \"17px\",\n color: textColor,\n opacity: 0.8,\n paddingTop: 0,\n margin: \"0 0 10px\",\n },\n\n // The inline verification step sits in the footer band, so it reads as one\n // more panel on the sheet. The base sheet uses the `background` shorthand,\n // which a `backgroundColor` patch would not override.\n otpGatePanel: {\n margin: \"0 0 12px\",\n padding: \"14px\",\n background: p.panel,\n border: `1px solid ${p.panelEdge}`,\n borderRadius: GLASS_RADIUS.panel,\n },\n\n otpGateTitle: { color: headingColor, fontWeight: 700 },\n\n otpGateDescription: { color: textColor, opacity: 0.85 },\n\n otpGateDigit: otpField(p, headingColor),\n\n button: {\n minHeight: isMobile ? \"48px\" : \"44px\",\n fontWeight: 700,\n lineHeight: 1.2,\n letterSpacing: 0,\n },\n\n acceptButton: { boxShadow: p.primaryShadow },\n\n acceptSecondaryButton: {\n backgroundColor: p.accentWash,\n border: \"1px solid transparent\",\n },\n\n rowButton: { padding: \"10px 24px\" },\n\n stackButton: { padding: \"10px 16px\" },\n\n cancelButton: {\n border: `1px solid ${p.outline}`,\n backgroundColor: \"transparent\",\n color: textColor,\n },\n\n // Opaque: it floats over the body's own text, which shows through even a\n // 97% surface — so a translucent host tint is flattened onto white.\n languageDropdown: {\n backgroundColor: opaqueOver(tint, \"#ffffff\"),\n border: `1px solid ${p.panelEdge}`,\n borderRadius: \"16px\",\n boxShadow: p.floatShadow,\n minWidth: \"140px\",\n maxHeight: \"240px\",\n padding: \"6px\",\n animation: `${NOTICE_KEYFRAMES.pop} 220ms ${MOTION.outEase} both`,\n transformOrigin: \"top right\",\n },\n\n languageItem: {\n color: headingColor,\n backgroundColor: \"transparent\",\n borderRadius: GLASS_RADIUS.row,\n borderBottom: \"none\",\n },\n\n selectedLanguageItem: { backgroundColor: p.accentWash },\n\n loadingSpinner: {\n width: \"18px\",\n height: \"18px\",\n border: `2.5px solid ${p.accentWashStrong}`,\n borderTop: `2.5px solid ${p.accent}`,\n animation: `${NOTICE_KEYFRAMES.spin} 0.9s linear infinite`,\n marginBottom: 0,\n flexShrink: 0,\n },\n});\n\n/**\n * Patches the responsive styles, which the modal spreads after `styles` and\n * which would otherwise re-impose classic widths, paddings and type sizes.\n */\nconst responsivePatch = (isMobile: boolean): Record<string, Style> => ({\n modal: {\n width: isMobile ? \"calc(100% - 32px)\" : GLASS_DESKTOP_CARD_WIDTH,\n maxWidth: \"none\",\n },\n title: { fontSize: isMobile ? \"19px\" : \"21px\" },\n subTitle: { fontSize: \"14px\" },\n optionTitle: { fontSize: isMobile ? \"14px\" : \"15px\" },\n optionDescription: { fontSize: isMobile ? \"12px\" : \"13px\" },\n dataElementText: { fontSize: \"13px\" },\n privacyText: { fontSize: isMobile ? \"13px\" : \"14px\" },\n topRight: { padding: \"0 12px\", height: \"32px\" },\n languageItem: { fontSize: \"13px\", padding: \"9px 12px\" },\n headerStack: { gap: \"12px\" },\n button: {\n fontSize: \"15px\",\n padding: isMobile ? \"10px 16px\" : \"10px 24px\",\n },\n});\n\nconst glassSurface = (p: GlassPalette): LayoutSurface => ({\n accent: p.accent,\n panel: p.panel,\n panelEdge: p.panelEdge,\n hairline: p.hairline,\n outline: p.outline,\n footer: p.footer,\n accentWash: p.accentWash,\n radii: { panel: GLASS_RADIUS.panel, control: GLASS_RADIUS.control },\n});\n\nconst loaderPillSurface = (p: GlassPalette): Style => ({\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n padding: \"12px 18px\",\n borderRadius: GLASS_RADIUS.pill,\n backgroundColor: p.control,\n ...blur,\n border: `1px solid ${p.panelEdge}`,\n boxShadow: p.floatShadow,\n zIndex: 1000,\n boxSizing: \"border-box\",\n});\n\nconst partsFor = (p: GlassPalette, input: GlassSkinInput): GlassParts => ({\n ...buildLayoutParts(glassSurface(p), input),\n loaderPill: input.isMobile\n ? {\n position: \"fixed\",\n top: \"auto\",\n left: \"0\",\n right: \"0\",\n bottom: \"calc(28px + env(safe-area-inset-bottom, 0px))\",\n margin: \"0 auto\",\n width: \"fit-content\",\n maxWidth: \"none\",\n transform: \"none\",\n ...loaderPillSurface(p),\n animation: `${NOTICE_KEYFRAMES.pop} 260ms ${MOTION.outEase} both`,\n }\n : {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n width: \"auto\",\n transform: \"translate(-50%, -50%)\",\n ...loaderPillSurface(p),\n animation: `${NOTICE_KEYFRAMES.floatPill} 260ms ${MOTION.outEase} both`,\n },\n loaderText: {\n margin: 0,\n fontSize: \"14px\",\n fontWeight: 600,\n lineHeight: 1.2,\n },\n rowClassName: GLASS_ROW_CLASS,\n});\n\nconst cssVariablesFor = (p: GlassPalette): Record<string, string> => ({\n [GLASS_VARS.accent]: p.accent,\n [GLASS_VARS.accentMid]: withAlpha(p.accent, 0.55),\n [GLASS_VARS.accentFaint]: p.accentFaint,\n [GLASS_VARS.track]: p.accentWashStrong,\n [GLASS_VARS.outline]: p.outline,\n [GLASS_VARS.hairline]: p.hairline,\n [GLASS_VARS.control]: p.control,\n});\n\nconst controlSkinFor = (\n p: GlassPalette,\n { headingColor }: GlassSkinInput,\n): SelectionControlSkin => ({\n accent: p.accent,\n select: {\n border: `1px solid ${p.outline}`,\n borderRadius: GLASS_RADIUS.control,\n backgroundColor: p.control,\n color: headingColor,\n },\n});\n\nconst confirmSkinFor = (\n p: GlassPalette,\n { headingColor, textColor }: GlassSkinInput,\n): ConfirmDialogSkin => ({\n overlay: { backgroundColor: p.dim },\n panel: {\n backgroundColor: p.sheetDense,\n ...blur,\n borderRadius: GLASS_RADIUS.panel,\n border: `1px solid ${p.panelEdge}`,\n boxShadow: p.floatShadow,\n animation: `${NOTICE_KEYFRAMES.pop} 220ms ${MOTION.outEase} both`,\n },\n title: { color: headingColor, fontWeight: 700 },\n detail: { color: textColor },\n button: {\n borderRadius: GLASS_RADIUS.pill,\n border: `1px solid ${p.outline}`,\n backgroundColor: \"transparent\",\n color: textColor,\n fontWeight: 600,\n },\n});\n\n/** Everything the glass appearance draws with, derived from the workspace brand. */\nexport const buildGlassSkin = <T extends StyleMap>(\n base: T,\n input: GlassSkinInput,\n): NoticeSkin<T> => {\n // Resolve once so no builder can reach the raw host value: an invalid or\n // empty tint must fall back everywhere, not only in the palette.\n const resolved: GlassSkinInput = {\n ...input,\n accent: paintableColor(input.accent, DEFAULT_ACCENT_COLOR),\n tint: paintableColor(input.tint, GLASS_DEFAULT_TINT),\n };\n const palette = glassPalette({\n accent: resolved.accent,\n tint: resolved.tint,\n });\n return {\n palette,\n styles: mergeNoticeStyles(base, stylePatch(palette, resolved)),\n responsive: responsivePatch(resolved.isMobile),\n parts: partsFor(palette, resolved),\n cssVariables: cssVariablesFor(palette),\n controlSkin: controlSkinFor(palette, resolved),\n confirmSkin: confirmSkinFor(palette, resolved),\n };\n};\n","import {\n isAppearance,\n isSafeCustomCss,\n resolveNoticeAppearance,\n withColorScheme,\n type NoticeAppearance,\n type NoticeAppearanceColors,\n type ResolvedNoticeAppearance,\n} from \"../shared/appearance\";\nimport type { Settings, SettingsPalette } from \"../api/types\";\n\n/** Drops unset keys, so a host value only replaces a console value it names. */\nconst definedColors = (\n colors: Record<string, string | undefined>,\n): NoticeAppearanceColors =>\n Object.fromEntries(\n Object.entries(colors).filter(([, value]) => Boolean(value)),\n ) as NoticeAppearanceColors;\n\n/** A host palette in the console's colour keys; unset colours are dropped. */\nconst hostColors = (\n palette: Partial<SettingsPalette> | undefined,\n): NoticeAppearanceColors => {\n if (!palette) {\n return {};\n }\n const button = palette.button;\n return definedColors({\n background: palette.backgroundColor,\n surface: palette.surfaceColor,\n heading: palette.headingColor,\n text: palette.textColor,\n muted_text: palette.mutedTextColor,\n link: palette.link,\n border: palette.borderColor,\n overlay: palette.overlayColor,\n // `||`, not `??`: an empty string is unset, as it always was.\n accept_all_bg:\n button?.acceptAll?.backgroundColor || button?.accept?.backgroundColor,\n accept_all_text: button?.acceptAll?.textColor || button?.accept?.textColor,\n accept_bg: button?.acceptSelected?.backgroundColor,\n accept_text: button?.acceptSelected?.textColor,\n decline_bg: button?.decline?.backgroundColor,\n decline_text: button?.decline?.textColor,\n decline_border: button?.decline?.borderColor,\n language_bg: button?.language?.backgroundColor,\n language_text: button?.language?.textColor,\n language_selected_bg: button?.language?.selectedBackgroundColor,\n language_selected_text: button?.language?.selectedTextColor,\n toggle_on: palette.toggle?.onColor || button?.accept?.backgroundColor,\n toggle_off: palette.toggle?.offColor,\n toggle_knob: palette.toggle?.knobColor,\n tts_highlight_bg: palette.ttsHighlight?.backgroundColor,\n tts_highlight_text: palette.ttsHighlight?.textColor,\n });\n};\n\n/**\n * Host `settings` over the console appearance, key by key: whatever the\n * integrator sets in code wins, and everything they leave unset keeps the\n * console's value (which in turn falls back to the notice's brand colours).\n * `settings.darkPalette` merges over the console's dark palette the same way.\n *\n * `button.accept` keeps the meaning it has always had: the brand accent, and\n * Accept All's colour when `acceptAll` is unset.\n */\nexport const mergeHostSettings = (\n resolved: ResolvedNoticeAppearance,\n settings: Partial<Settings> | undefined,\n): ResolvedNoticeAppearance => {\n if (!settings) {\n return resolved;\n }\n const hostCss = settings.customCss;\n return {\n // An unrecognised host style is ignored rather than forcing classic.\n style: isAppearance(settings.theme) ? settings.theme : resolved.style,\n colors: { ...resolved.colors, ...hostColors(settings) },\n radius: settings.borderRadius || resolved.radius,\n selectionControl: settings.selectionControl ?? resolved.selectionControl,\n controlStyle: settings.controlStyle ?? resolved.controlStyle,\n confirmBeforeSubmit:\n settings.confirmBeforeSubmit ?? resolved.confirmBeforeSubmit,\n mobileLayout: settings.mobileLayout ?? resolved.mobileLayout,\n desktopPosition: settings.desktopPosition ?? resolved.desktopPosition,\n backdrop: settings.backdrop ?? resolved.backdrop,\n collapsibleSections:\n settings.collapsibleSections ?? resolved.collapsibleSections,\n phoneFooter: settings.phoneFooter ?? resolved.phoneFooter,\n autoDark: settings.autoDark ?? resolved.autoDark,\n darkColors: {\n ...resolved.darkColors,\n ...hostColors(settings.darkPalette),\n },\n maxWidth: settings.maxWidth || resolved.maxWidth,\n logoSize: settings.logoSize || resolved.logoSize,\n textScale: settings.textScale ?? resolved.textScale,\n motion: settings.motion ?? resolved.motion,\n // Host CSS passes the same guard as the console's; refused, the\n // console's still applies.\n customCss:\n hostCss && isSafeCustomCss(hostCss) ? hostCss : resolved.customCss,\n };\n};\n\n/**\n * The served appearance under the host's `settings`, painted with the dark\n * palette while the device prefers dark and the appearance asks for\n * automatic dark mode.\n */\nexport const resolveNoticeLook = (\n served: NoticeAppearance | null | undefined,\n settings: Partial<Settings> | undefined,\n prefersDark: boolean,\n): ResolvedNoticeAppearance =>\n withColorScheme(\n mergeHostSettings(resolveNoticeAppearance(served), settings),\n prefersDark,\n );\n","import {\n DEFAULT_TEXT_SCALE,\n NOTICE_TEXT_SCALE_FACTORS,\n type ResolvedNoticeAppearance,\n} from \"../shared/appearance\";\nimport { FONT_SIZE_PRECISION, PX_LENGTH_RE } from \"./constants\";\nimport type { StyleMap } from \"./types\";\n\nconst round = (value: number): number =>\n Math.round(value * FONT_SIZE_PRECISION) / FONT_SIZE_PRECISION;\n\n/** One font size times `factor`; lengths other than px already follow their parent. */\nexport const scaleFontSize = (\n size: string | number | undefined,\n factor: number,\n): string | number | undefined => {\n if (factor === 1 || size === undefined) {\n return size;\n }\n if (typeof size === \"number\") {\n return round(size * factor);\n }\n const match = PX_LENGTH_RE.exec(size);\n return match ? `${round(Number(match[1]) * factor)}px` : size;\n};\n\n/**\n * Every px font size in a style map, times `factor`; other lengths (`em`,\n * `%`) already follow their parent. A factor of 1 returns the map unchanged.\n */\nexport const scaleFontSizes = <T extends StyleMap>(\n styles: T,\n factor: number,\n): T => {\n if (factor === 1) {\n return styles;\n }\n return Object.fromEntries(\n Object.entries(styles).map(([key, style]) => [\n key,\n style.fontSize === undefined\n ? style\n : { ...style, fontSize: scaleFontSize(style.fontSize, factor) },\n ]),\n ) as T;\n};\n\n/** The multiplier the appearance's text scale asks for. */\nexport const textScaleFactor = (appearance: ResolvedNoticeAppearance): number =>\n NOTICE_TEXT_SCALE_FACTORS[appearance.textScale ?? DEFAULT_TEXT_SCALE];\n","import {\n APPEARANCE_ATTRIBUTE,\n NOTICE_ROOT_ATTRIBUTE,\n buildTtsRootAttributes,\n getAppearanceLayout,\n resolveNoticeLayout,\n type NoticeAppearance,\n type ResolvedNoticeAppearance,\n type ResolvedNoticeLayout,\n} from \"../shared/appearance\";\nimport {\n CONTROL_ATTRIBUTE,\n DEFAULT_ACCENT_COLOR,\n DEFAULT_HEADING_COLOR,\n DEFAULT_TEXT_COLOR,\n DOCK_ATTRIBUTE,\n DOCKED,\n LOGO_WIDTH_RATIO,\n MOTION_ATTRIBUTE,\n MOTION_OFF,\n NOTICE_ID_ATTRIBUTE,\n STYLE_RADII,\n SWITCH_CONTROL,\n} from \"../appearance/constants\";\nimport { buildGlassSkin } from \"../appearance/glass-skin\";\nimport { resolveNoticeLook } from \"../appearance/host-settings\";\nimport {\n buildLayoutParts,\n isDocked,\n modalPosition,\n solidSurface,\n} from \"../appearance/layout-styles\";\nimport { scaleFontSizes, textScaleFactor } from \"../appearance/text-scale\";\nimport { buildThemeCssVariables } from \"../appearance/theme-vars\";\nimport { buildVariantStyles } from \"../appearance/variant-styles\";\nimport type {\n ConfirmDialogSkin,\n LayoutParts,\n GlassParts,\n NoticeSkin,\n SelectionControlSkin,\n Style,\n StyleRadii,\n} from \"../appearance/types\";\nimport { DEFAULT_SELECTION_CONTROL } from \"../constants\";\nimport { styles as classicStyles, type NoticeStyles } from \"../styles/modal\";\nimport type { ActiveConfig, SelectionControlType, Settings } from \"../api/types\";\n\nexport type ModalLookInput = Readonly<{\n noticeId: string;\n /** The notice once it is read; null while it loads. */\n content: ActiveConfig | null;\n /** The last appearance served for this notice, drawn while it loads. */\n cachedAppearance?: NoticeAppearance;\n settings?: Partial<Settings>;\n prefersDark: boolean;\n isMobile: boolean;\n}>;\n\n/** Footer and sub-flow buttons, each a style patch over the base button. */\nexport type ModalButtonStyles = Readonly<{\n base: Style;\n acceptAll: Style;\n acceptSelected: Style;\n decline: Style;\n}>;\n\nexport type ModalLanguageStyles = Readonly<{\n chip: Style;\n menu: Style;\n selected: Style;\n}>;\n\n/**\n * Everything the modal draws with, resolved once per render from the console\n * appearance under the host's `settings`.\n */\nexport type ModalLook = Readonly<{\n appearance: ResolvedNoticeAppearance;\n layout: ResolvedNoticeLayout;\n skin: NoticeSkin<NoticeStyles> | null;\n /** Classic, the admin's palette, the style's shape and the text scale. */\n styles: NoticeStyles;\n /** Breakpoint sizes, spread after `styles`. */\n responsive: Record<string, Style>;\n /** The parts a layout choice draws with: glass's own, else the style's. */\n parts: LayoutParts;\n /** Glass lays the notice out as panels on a sheet; null otherwise. */\n sheetParts: GlassParts | null;\n docked: boolean;\n showsLoaderPill: boolean;\n textScale: number;\n headingColor: string;\n textColor: string;\n accentColor: string;\n linkColor: string;\n radii: StyleRadii;\n /** On the dialog, its overlay and its confirm step. */\n rootAttributes: Record<string, string>;\n /** Custom properties for the dialog root; set with `setProperty`. */\n cssVariables: Record<string, string>;\n overlayStyle: Style;\n modalStyle: Style;\n buttons: ModalButtonStyles;\n language: ModalLanguageStyles;\n controlSkin?: SelectionControlSkin;\n confirmSkin?: ConfirmDialogSkin;\n selectionControl: SelectionControlType;\n drawsSwitches: boolean;\n /** A yes/no pair, a dropdown and a switch are all taller than a checkbox. */\n roomyControls: boolean;\n}>;\n\nconst baseResponsive = (isMobile: boolean): Record<string, Style> => ({\n modal: {\n width: isMobile ? \"90%\" : \"700px\",\n maxWidth: isMobile ? \"90%\" : \"calc(100% - 32px)\",\n },\n content: { margin: isMobile ? \"20px\" : \"22px\" },\n title: { fontSize: isMobile ? \"16px\" : \"18px\" },\n subTitle: { fontSize: isMobile ? \"14px\" : \"16px\" },\n optionTitle: { fontSize: isMobile ? \"14px\" : \"16px\" },\n optionDescription: { fontSize: isMobile ? \"12px\" : \"14px\" },\n dataElementText: { fontSize: isMobile ? \"12px\" : \"14px\" },\n privacyText: { fontSize: isMobile ? \"14px\" : \"16px\" },\n topRight: {\n fontSize: isMobile ? \"11px\" : \"12px\",\n padding: isMobile ? \"3px 6px\" : \"3px 9px\",\n },\n headerStack: { gap: isMobile ? \"12px\" : \"10px\" },\n logo: {\n maxWidth: isMobile ? \"96px\" : \"140px\",\n maxHeight: isMobile ? \"28px\" : \"32px\",\n },\n languageItem: {\n fontSize: isMobile ? \"11px\" : \"12px\",\n padding: isMobile ? \"6px 10px\" : \"8px 12px\",\n },\n middleSection: { paddingRight: isMobile ? \"10px\" : \"15px\" },\n button: {\n fontSize: isMobile ? \"14px\" : \"16px\",\n padding: isMobile ? \"10px 20px\" : \"9px 45px\",\n },\n dpoText: { fontSize: isMobile ? \"13px\" : \"14px\" },\n});\n\nexport const buildModalLook = ({\n noticeId,\n content,\n cachedAppearance,\n settings,\n prefersDark,\n isMobile,\n}: ModalLookInput): ModalLook => {\n const appearance = resolveNoticeLook(\n content ? content.appearance : cachedAppearance,\n settings,\n prefersDark,\n );\n const style = appearance.style;\n const colors = appearance.colors;\n const layout = resolveNoticeLayout(appearance);\n const docked = isDocked(layout, isMobile);\n const headingColor = colors.heading || DEFAULT_HEADING_COLOR;\n const textColor = colors.text || DEFAULT_TEXT_COLOR;\n const brandAccent = colors.toggle_on ?? colors.accept_all_bg;\n const isGlass = style === \"glass\";\n // Accept Selected's chain: the accent the brand paints its accents with.\n // Before the notice arrives its brand colour is unknown, so the loader\n // takes the neutral heading colour rather than flashing the SDK's default.\n const classicAccent =\n brandAccent || content?.primary_color || (content ? DEFAULT_ACCENT_COLOR : headingColor);\n // A skin paints switches, washes and rings in the accent, so it follows\n // Accept All's own chain: a host that themes only `acceptAll` sees one\n // brand colour across the notice, not two.\n const accentColor =\n colors.toggle_on ?? (isGlass ? colors.accept_all_bg || classicAccent : classicAccent);\n\n const variant = buildVariantStyles(classicStyles, style, colors, accentColor);\n const skin = isGlass\n ? buildGlassSkin(variant, {\n accent: accentColor,\n tint: colors.surface ?? colors.background,\n headingColor,\n textColor,\n isMobile,\n docked,\n })\n : null;\n const textScale = textScaleFactor(appearance);\n const styles = scaleFontSizes(skin?.styles ?? variant, textScale);\n\n const responsive: Record<string, Style> = baseResponsive(isMobile);\n for (const [key, patch] of Object.entries(skin?.responsive ?? {})) {\n responsive[key] = { ...responsive[key], ...patch };\n }\n if (appearance.logoSize) {\n responsive.logo = {\n ...responsive.logo,\n height: appearance.logoSize,\n maxHeight: appearance.logoSize,\n maxWidth: `calc(${appearance.logoSize} * ${LOGO_WIDTH_RATIO})`,\n };\n }\n\n const radii = STYLE_RADII[style];\n const parts = skin?.parts ??\n buildLayoutParts(solidSurface(colors, accentColor, radii), {\n headingColor,\n textColor,\n isMobile,\n });\n\n const selectionControl = appearance.selectionControl ?? DEFAULT_SELECTION_CONTROL;\n const drawsSwitches = layout.switchControl;\n const hostRadius = appearance.radius;\n const modalRadius = hostRadius || radii.modal;\n const buttonRadius = hostRadius || radii.button;\n\n // Glass draws its own dim over the variant styles; an admin overlay wins,\n // and a backdrop turned off leaves the page as it is (still blocking it).\n const overlayStyle: Style = !layout.dimBackdrop\n ? { ...styles.overlay, backgroundColor: \"transparent\" }\n : colors.overlay\n ? { ...styles.overlay, backgroundColor: colors.overlay }\n : styles.overlay;\n\n const position = modalPosition({\n layout,\n isMobile,\n radius: modalRadius,\n maxWidth: appearance.maxWidth,\n });\n const modalStyle: Style = {\n ...styles.modal,\n ...responsive.modal,\n borderRadius: modalRadius,\n ...(skin ? {} : { backgroundColor: colors.background || \"#ffffff\" }),\n ...position,\n };\n\n const button: Style = { borderRadius: buttonRadius };\n const acceptAll: Style = {\n ...button,\n backgroundColor:\n colors.accept_all_bg || brandAccent || content?.primary_color || DEFAULT_ACCENT_COLOR,\n color: colors.accept_all_text || \"#ffffff\",\n };\n // Accept Selected is outlined in the accent colour: still clearly an accept,\n // but subordinate to Accept All. Glass washes it in the accent instead: an\n // outline on a translucent sheet reads as a disabled button.\n const acceptSelected: Style = {\n ...button,\n backgroundColor: colors.accept_bg ?? (skin ? skin.palette.accentWash : \"#ffffff\"),\n color: colors.accept_text ?? accentColor,\n borderColor: skin ? \"transparent\" : colors.accept_text ?? accentColor,\n };\n const decline: Style = {\n ...button,\n backgroundColor: colors.decline_bg || (skin ? \"transparent\" : \"#ffffff\"),\n color: colors.decline_text || (skin ? textColor : \"#000000\"),\n borderColor:\n colors.decline_border ?? (colors.border || (skin ? skin.palette.outline : \"#d0d5dd\")),\n };\n\n const chip: Style = {\n borderRadius: buttonRadius,\n borderColor: colors.border || (skin ? skin.palette.hairline : \"#d0d5dd\"),\n backgroundColor: colors.language_bg || (skin ? skin.palette.control : \"#ffffff\"),\n color: colors.language_text || (skin ? headingColor : \"#344054\"),\n };\n // The menu and its rows take the chip's colours but never its radius, which\n // is sized for one short pill and bows a panel's border across the labels.\n const { borderRadius: _chipRadius, ...chipColors } = chip;\n const menu: Style = skin\n ? {\n ...(colors.language_bg && { backgroundColor: colors.language_bg }),\n color: chip.color,\n }\n : chipColors;\n const selected: Style = {\n ...menu,\n backgroundColor:\n colors.language_selected_bg || (skin ? skin.palette.accentWash : \"#f3f4f6\"),\n color: colors.language_selected_text || (skin ? headingColor : \"#344054\"),\n fontWeight: 600,\n };\n\n const rootAttributes: Record<string, string> = {\n [NOTICE_ROOT_ATTRIBUTE]: \"\",\n [NOTICE_ID_ATTRIBUTE]: noticeId,\n ...(skin ? { [APPEARANCE_ATTRIBUTE]: style } : {}),\n ...(drawsSwitches ? { [CONTROL_ATTRIBUTE]: SWITCH_CONTROL } : {}),\n ...(!layout.motion ? { [MOTION_ATTRIBUTE]: MOTION_OFF } : {}),\n ...buildTtsRootAttributes(colors),\n };\n\n return {\n appearance,\n layout,\n skin,\n styles,\n responsive: scaleFontSizes(responsive, textScale),\n parts: { ...parts, accordion: scaleFontSizes(parts.accordion, textScale) },\n sheetParts: skin?.parts ?? null,\n docked,\n showsLoaderPill: getAppearanceLayout(style).loaderPill,\n textScale,\n headingColor,\n textColor,\n accentColor,\n linkColor: colors.link || content?.secondary_color || DEFAULT_ACCENT_COLOR,\n radii,\n rootAttributes,\n cssVariables: {\n ...(skin?.cssVariables ?? {}),\n ...buildThemeCssVariables(colors),\n },\n overlayStyle,\n modalStyle,\n buttons: { base: button, acceptAll, acceptSelected, decline },\n language: { chip, menu, selected },\n controlSkin: skin?.controlSkin,\n confirmSkin: skin?.confirmSkin,\n selectionControl,\n drawsSwitches,\n roomyControls: drawsSwitches || selectionControl !== \"checkbox\",\n };\n};\n\n/** Attributes a docked notice root carries, for the dvh rule. */\nexport const dockAttributes = (look: ModalLook): Record<string, string> =>\n look.docked ? { [DOCK_ATTRIBUTE]: DOCKED } : {};\n","import type { NoticeAppearance } from \"../shared/appearance\";\nimport { APPEARANCE_CACHE_KEY_PREFIX } from \"./constants\";\n\n/**\n * The last appearance served for a notice, so its next load can draw the\n * loading state in the admin's style instead of flashing classic until the\n * notice read returns. Best effort: storage can be absent, full or blocked, and\n * the served value always replaces this one once it arrives.\n */\nexport const readCachedAppearance = (\n noticeId: string,\n): NoticeAppearance | undefined => {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n try {\n const raw = window.localStorage.getItem(\n `${APPEARANCE_CACHE_KEY_PREFIX}${noticeId}`,\n );\n return raw ? (JSON.parse(raw) as NoticeAppearance) : undefined;\n } catch {\n return undefined;\n }\n};\n\nexport const writeCachedAppearance = (\n noticeId: string,\n appearance: NoticeAppearance | undefined,\n): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n const key = `${APPEARANCE_CACHE_KEY_PREFIX}${noticeId}`;\n try {\n if (!appearance || Object.keys(appearance).length === 0) {\n window.localStorage.removeItem(key);\n return;\n }\n window.localStorage.setItem(key, JSON.stringify(appearance));\n } catch {\n // Storage is optional here; the notice already renders from the served value.\n }\n};\n","import { applyScopedCustomCss } from \"../shared/appearance\";\nimport { CUSTOM_CSS_ATTRIBUTE, NOTICE_ID_ATTRIBUTE } from \"./constants\";\n\n/**\n * Injects the admin's custom CSS scoped to one notice, the way the cookie\n * banner scopes its own: `@scope` keeps every rule inside the elements that\n * carry this notice's id (the dialog, its overlay and its confirm step), so\n * nothing reaches the host page. Goes into the shadow root the notice renders\n * in. Returns the cleanup that removes it.\n */\nexport const applyNoticeCustomCss = (\n root: Document | ShadowRoot,\n noticeId: string,\n css: string,\n): (() => void) =>\n applyScopedCustomCss({\n root,\n scopeAttribute: NOTICE_ID_ATTRIBUTE,\n scopeId: noticeId,\n markerAttribute: CUSTOM_CSS_ATTRIBUTE,\n css,\n });\n\n/**\n * Keeps one notice's custom CSS injected while it changes (a language switch,\n * a dark device, a later notice read), re-injecting only when the CSS does.\n */\nexport class NoticeCustomCss {\n private css: string | undefined;\n private cleanup: (() => void) | null = null;\n\n apply(root: Document | ShadowRoot, noticeId: string, css: string | undefined): void {\n if (css === this.css && (this.cleanup || !css)) return;\n this.remove();\n this.css = css;\n if (css) this.cleanup = applyNoticeCustomCss(root, noticeId, css);\n }\n\n remove(): void {\n this.cleanup?.();\n this.cleanup = null;\n this.css = undefined;\n }\n}\n","import {\n APPEARANCE_ATTRIBUTE,\n MOTION,\n NOTICE_ROOT_ATTRIBUTE,\n NOTICE_THEME_VARS,\n} from \"../shared/appearance\";\nimport {\n CONTROL_ATTRIBUTE,\n DOCK_ATTRIBUTE,\n DOCKED,\n GLASS_ROW_CLASS,\n GLASS_STYLE_ID,\n GLASS_VARS,\n LAYOUT_STYLE_ID,\n MOTION_ATTRIBUTE,\n MOTION_OFF,\n NOTICE_KEYFRAMES,\n SWITCH_CONTROL,\n SWITCH_SIZES,\n SWITCH_STYLE_ID,\n SWITCH_THUMB_INSET,\n} from \"./constants\";\n\n/**\n * Adds a stylesheet to a root once: the document's head, or the shadow root a\n * surface renders in (a document stylesheet never reaches into a shadow tree).\n */\nexport const injectStyleSheet = (\n root: Document | ShadowRoot,\n id: string,\n css: string,\n): void => {\n if (typeof document === \"undefined\") return;\n const existing =\n root instanceof Document ? root.getElementById(id) : root.querySelector(`#${id}`);\n if (existing) return;\n const style = document.createElement(\"style\");\n style.id = id;\n style.textContent = css;\n (root instanceof Document ? root.head : root).appendChild(style);\n};\n\nconst N = `[${NOTICE_ROOT_ATTRIBUTE}]`;\n\nconst FLOAT_FRAMES = `\n from { opacity: 0; transform: translate(-50%, calc(-50% + 16px)) scale(0.98); }\n to { opacity: 1; transform: translate(-50%, -50%); }`;\nconst FLOAT_FRAMES_STILL = `\n from { opacity: 0; transform: translate(-50%, -50%); }\n to { opacity: 1; transform: translate(-50%, -50%); }`;\n\n/** Declares the float frames under both float names. */\nconst floatKeyframes = (frames: string) =>\n [NOTICE_KEYFRAMES.float, NOTICE_KEYFRAMES.floatPill]\n .map((name) => `@keyframes ${name} {${frames}\\n }`)\n .join(\"\\n\");\n\n/**\n * What every layout needs beyond inline styles: the entrance keyframes (a\n * docked sheet rises, a corner card settles, a centred glass card floats), the\n * dock's dynamic viewport height, and the console's motion switch.\n */\nexport const layoutCss = `\n /* dvh tracks the phone's collapsing toolbars; vh stays inline as the\n fallback for browsers without it. */\n @supports (height: 100dvh) {\n ${N}[${DOCK_ATTRIBUTE}=\"${DOCKED}\"] {\n max-height: 92dvh !important;\n }\n }\n\n @keyframes ${NOTICE_KEYFRAMES.rise} {\n from { transform: translateY(104%); }\n to { transform: none; }\n }\n\n /* Ends on the translate the card is centred with inline. */\n ${floatKeyframes(FLOAT_FRAMES)}\n\n @keyframes ${NOTICE_KEYFRAMES.fade} {\n from { opacity: 0; }\n }\n\n @keyframes ${NOTICE_KEYFRAMES.settle} {\n from { opacity: 0; transform: translateY(12px); }\n }\n\n @keyframes ${NOTICE_KEYFRAMES.pop} {\n from { opacity: 0; transform: scale(0.94); }\n }\n\n @keyframes ${NOTICE_KEYFRAMES.spin} {\n to { transform: rotate(360deg); }\n }\n\n /* Motion switched off in the console: every entrance and transition stops,\n the spinner included, since a still ring still reads as loading. */\n ${N}[${MOTION_ATTRIBUTE}=\"${MOTION_OFF}\"],\n ${N}[${MOTION_ATTRIBUTE}=\"${MOTION_OFF}\"] * {\n animation: none !important;\n transition: none !important;\n }\n\n @media (prefers-reduced-motion: reduce) {\n @keyframes ${NOTICE_KEYFRAMES.rise} {\n from { opacity: 0; }\n }\n ${floatKeyframes(FLOAT_FRAMES_STILL)}\n @keyframes ${NOTICE_KEYFRAMES.settle} {\n from { opacity: 0; }\n }\n @keyframes ${NOTICE_KEYFRAMES.pop} {\n from { opacity: 0; }\n }\n ${N} *,\n ${N} *::after {\n transition-duration: 0ms !important;\n }\n }\n`;\n\nconst G = `[${NOTICE_ROOT_ATTRIBUTE}][${APPEARANCE_ATTRIBUTE}=\"glass\"]`;\n\n/**\n * Every custom property carries a neutral fallback, so a rule that reaches an\n * element outside a root that sets them still draws something visible.\n */\nconst GLASS_FALLBACKS: Readonly<Record<string, string>> = {\n [GLASS_VARS.accent]: \"currentColor\",\n [GLASS_VARS.accentMid]: \"rgba(128, 128, 128, 0.55)\",\n [GLASS_VARS.accentFaint]: \"rgba(128, 128, 128, 0.06)\",\n [GLASS_VARS.track]: \"rgba(128, 128, 128, 0.3)\",\n [GLASS_VARS.outline]: \"rgba(128, 128, 128, 0.4)\",\n [GLASS_VARS.hairline]: \"rgba(128, 128, 128, 0.15)\",\n [GLASS_VARS.control]: \"rgba(255, 255, 255, 0.72)\",\n};\n\nconst v = (name: string) => `var(${name}, ${GLASS_FALLBACKS[name]})`;\n\n/** Glass drawing native checkboxes, not switches (the switch sheet owns those). */\nconst C = `${G}:not([${CONTROL_ATTRIBUTE}=\"${SWITCH_CONTROL}\"])`;\n\n/**\n * The glass notice's stylesheet: what inline styles cannot express (focus\n * rings, hairlines, press feedback). Every rule is scoped under the appearance\n * attribute so classic never matches one, and every colour is a custom\n * property the notice root sets from the workspace brand.\n */\nexport const glassCss = `\n /* One focus ring in the brand accent, for keyboard users only. The base\n sheet rings checkboxes on any :focus, which a tap would show too. */\n ${G} .redacto-checkbox-large:focus:not(:focus-visible),\n ${G} .redacto-checkbox-medium:focus:not(:focus-visible),\n ${G} .redacto-checkbox-small:focus:not(:focus-visible) {\n outline: none !important;\n }\n\n ${G} .redacto-checkbox-large:focus-visible,\n ${G} .redacto-checkbox-medium:focus-visible,\n ${G} .redacto-checkbox-small:focus-visible,\n ${G} button:focus-visible,\n ${G} a:focus-visible,\n ${G} select:focus-visible,\n ${G} input:focus-visible,\n ${G} [role=\"button\"]:focus-visible,\n ${G} [role=\"option\"]:focus-visible {\n outline: 2px solid ${v(GLASS_VARS.accent)} !important;\n outline-offset: 2px !important;\n }\n\n /* Checkboxes on a translucent sheet: classic's pale grey edge all but\n vanishes, so an unticked box takes a brand-tinted edge on a light fill.\n An admin's toggle-off colour still wins. */\n ${C} .redacto-checkbox-large:not(:checked),\n ${C} .redacto-checkbox-medium:not(:checked),\n ${C} .redacto-checkbox-small:not(:checked) {\n border-color: var(${NOTICE_THEME_VARS.controlOff}, ${v(GLASS_VARS.accentMid)}) !important;\n background-color: ${v(GLASS_VARS.control)} !important;\n }\n\n /* Hairlines between the rows of a grouped list. */\n ${G} .${GLASS_ROW_CLASS} + .${GLASS_ROW_CLASS} {\n border-top: 1px solid ${v(GLASS_VARS.hairline)};\n }\n\n /* Tactile press feedback. */\n ${G} button {\n transition: transform 180ms ${MOTION.outEase}, filter 200ms, opacity 200ms;\n -webkit-tap-highlight-color: transparent;\n }\n\n ${G} button:not(:disabled):active {\n transform: scale(0.97);\n }\n\n ${G} button:not(:disabled):hover {\n filter: brightness(1.05);\n }\n\n ${G} [role=\"option\"]:not([aria-selected=\"true\"]):hover {\n background-color: ${v(GLASS_VARS.accentFaint)} !important;\n }\n\n @media (prefers-reduced-motion: reduce) {\n ${G} button {\n transition: none !important;\n }\n }\n`;\n\n/**\n * Purpose and product checkboxes drawn as switches, for any style: the admin\n * picks switches in the console (or the host in `settings.controlStyle`); no\n * style draws them by default. The inputs stay native checkboxes, so keyboard,\n * form and assistive-tech behaviour are the checkbox's own.\n *\n * Colours read the glass palette's properties first (set only under glass),\n * then the console palette's, then the classic defaults.\n */\nconst S = `[${NOTICE_ROOT_ATTRIBUTE}][${CONTROL_ATTRIBUTE}=\"${SWITCH_CONTROL}\"]`;\n\nconst ACCENT = `var(${GLASS_VARS.accent}, var(${NOTICE_THEME_VARS.accent}, #4f87ff))`;\nconst TRACK = `var(${GLASS_VARS.track}, var(${NOTICE_THEME_VARS.controlOff}, #d0d5dd))`;\nconst KNOB = `var(${NOTICE_THEME_VARS.knob}, #ffffff)`;\nconst OUTLINE = `var(${GLASS_VARS.outline}, var(${NOTICE_THEME_VARS.controlOff}, #d0d5dd))`;\nconst CHECK_FILL = `var(${GLASS_VARS.control}, #ffffff)`;\n\nconst switchRules = (size: keyof typeof SWITCH_SIZES) => {\n const { width, height, thumb } = SWITCH_SIZES[size];\n const travel = width - thumb - SWITCH_THUMB_INSET * 2;\n const sel = `${S} .redacto-checkbox-${size}`;\n return `\n ${sel} {\n width: ${width}px !important;\n height: ${height}px !important;\n border: 0 !important;\n border-radius: 999px !important;\n background-color: ${TRACK} !important;\n padding: 0 !important;\n transition: background-color 280ms ${MOTION.outEase} !important;\n }\n\n ${sel}::after,\n ${sel}:checked::after {\n content: '' !important;\n position: absolute !important;\n top: ${SWITCH_THUMB_INSET}px !important;\n left: ${SWITCH_THUMB_INSET}px !important;\n width: ${thumb}px !important;\n height: ${thumb}px !important;\n border: 0 !important;\n border-radius: 999px !important;\n background: ${KNOB} !important;\n box-shadow: 0 2px 6px rgba(15, 23, 42, 0.25) !important;\n box-sizing: border-box !important;\n transform: none !important;\n transition: transform 340ms ${MOTION.sheetEase} !important;\n }\n\n ${sel}:checked {\n background-color: ${ACCENT} !important;\n }\n\n ${sel}:checked::after {\n transform: translateX(${travel}px) !important;\n }\n\n /* No mid-state rule here on purpose: a switch has two positions. */\n `;\n};\n\nexport const switchCss = `\n ${switchRules(\"large\")}\n ${switchRules(\"medium\")}\n\n /* Data elements: a round check, the switch's companion. */\n ${S} .redacto-checkbox-small {\n width: 20px !important;\n height: 20px !important;\n border: 1.5px solid ${OUTLINE} !important;\n border-radius: 999px !important;\n background-color: ${CHECK_FILL} !important;\n padding: 0 !important;\n transition: background-color 220ms ${MOTION.outEase},\n border-color 220ms ${MOTION.outEase} !important;\n }\n\n ${S} .redacto-checkbox-small:checked {\n background-color: ${ACCENT} !important;\n border-color: ${ACCENT} !important;\n }\n\n ${S} .redacto-checkbox-small:checked::after {\n top: 45% !important;\n width: 4px !important;\n height: 8px !important;\n border-width: 0 2px 2px 0 !important;\n }\n\n ${S} .redacto-checkbox-large:disabled,\n ${S} .redacto-checkbox-medium:disabled,\n ${S} .redacto-checkbox-small:disabled {\n opacity: 0.55 !important;\n cursor: default !important;\n }\n\n /* The console's motion switch, off; the layout sheet's own rule is weaker\n than these, so it cannot stop the switches itself. */\n ${S}[${MOTION_ATTRIBUTE}=\"${MOTION_OFF}\"] .redacto-checkbox-large,\n ${S}[${MOTION_ATTRIBUTE}=\"${MOTION_OFF}\"] .redacto-checkbox-large::after,\n ${S}[${MOTION_ATTRIBUTE}=\"${MOTION_OFF}\"] .redacto-checkbox-medium,\n ${S}[${MOTION_ATTRIBUTE}=\"${MOTION_OFF}\"] .redacto-checkbox-medium::after,\n ${S}[${MOTION_ATTRIBUTE}=\"${MOTION_OFF}\"] .redacto-checkbox-small {\n transition: none !important;\n }\n\n @media (prefers-reduced-motion: reduce) {\n ${S} .redacto-checkbox-large,\n ${S} .redacto-checkbox-large::after,\n ${S} .redacto-checkbox-medium,\n ${S} .redacto-checkbox-medium::after,\n ${S} .redacto-checkbox-small {\n transition: none !important;\n }\n }\n`;\n\n/** The keyframes and motion switch every layout uses; idempotent per root. */\nexport const injectLayoutStyles = (root: Document | ShadowRoot): void =>\n injectStyleSheet(root, LAYOUT_STYLE_ID, layoutCss);\n\n/** Injected on first glass render only, so a notice that never asks for glass carries none. */\nexport const injectGlassStyles = (root: Document | ShadowRoot): void =>\n injectStyleSheet(root, GLASS_STYLE_ID, glassCss);\n\n/** Injected the first time a notice draws switches; idempotent per root. */\nexport const injectSwitchStyles = (root: Document | ShadowRoot): void =>\n injectStyleSheet(root, SWITCH_STYLE_ID, switchCss);\n","import { Store } from \"../core/state\";\nimport { el, svg, clearElement, applyStyles } from \"../core/dom\";\nimport { createMediaQuery, type MediaQuerySubscription } from \"../core/media-query\";\nimport {\n fetchConsentContent,\n submitConsentEvent,\n initiateGuardianVerification,\n verifyGuardianStatus,\n} from \"../api\";\nimport {\n buildLedgerConsentOverlay,\n fetchNoticeConsentStatus,\n} from \"../api/notice-consent-status\";\nimport { resolveDisplayLanguage } from \"../api/language\";\nimport { resolveEndpointOptions, type ResolvedEndpoints } from \"../shared/endpoints\";\nimport { injectCheckboxStyles } from \"../styles/inject\";\nimport { styles } from \"../styles/modal\";\nimport { renderModalPurposes, type ModalPurposeRefs, type PurposeLook } from \"./purposes\";\nimport { renderLanguageSelector, type LanguageSelectorRefs } from \"./language-selector\";\nimport { setupKeyboardTrap, type KeyboardTrapCleanup } from \"./keyboard\";\nimport {\n saveConsentState,\n getConsentState,\n clearConsentState,\n} from \"../services/storage\";\nimport { TTSManager } from \"./tts\";\nimport { renderAgeVerification } from \"./age-verification\";\nimport {\n renderGuardianForm,\n validateGuardianForm,\n type GuardianFormData,\n type GuardianFormRefs,\n} from \"./guardian-form\";\nimport {\n renderVerificationScreen,\n getVerificationErrorMessage,\n} from \"./verification-screen\";\nimport { colorsFromLook } from \"./colors\";\nimport { buildSelectionForMode } from \"./consentSelection\";\nimport {\n isMultiProduct,\n productPurposeKey,\n purposesInRenderOrder,\n} from \"../core/productMatrix\";\nimport {\n confirmHint,\n isFullyConsented,\n purposeCheckedFromElements,\n purposeToggle,\n recordedSelectionLookup,\n sectionToggle,\n seedSelection,\n submissionPurposes,\n} from \"./productConsent\";\nimport {\n groupsOf,\n noticeConfirmVerdict,\n productIsRequired,\n rowsOf,\n seedProductState,\n} from \"./productState\";\nimport {\n renderConfirmHint,\n renderProductGroups,\n renderProductSection,\n updateConfirmHint,\n updateProductSection,\n} from \"./product-sections\";\nimport { logoRowJustify, resolveLogoPosition } from \"./layout\";\nimport { OtpGateSession } from \"./otpGate\";\nimport { lockSelections, renderOtpGatePanel } from \"./otp-gate-panel\";\nimport { openConfirmDialog } from \"./confirm-dialog\";\nimport { getProductPolicyLinks, shouldShowNoticePolicyLink } from \"./productPolicies\";\nimport { renderProductPolicyLine } from \"./product-policy-line\";\nimport { applyPreselection, recordedAnswersFor } from \"./preselection\";\nimport { injectNoticeFontStyles, resolveNoticeFontFamily } from \"./notice-font\";\nimport { noticeChromeCopy } from \"./chromeCopy\";\nimport {\n ENGLISH_SECTION_LABELS,\n NOTICE_SECTIONS,\n sectionLabelsFor,\n} from \"./section-labels\";\nimport {\n renderNoticeAccordion,\n type NoticeAccordionRefs,\n} from \"./notice-accordion\";\nimport { buildModalLook, dockAttributes, type ModalLook } from \"./look\";\nimport { readCachedAppearance, writeCachedAppearance } from \"../appearance/cache\";\nimport {\n DARK_SCHEME_QUERY,\n DEFAULT_PURPOSE_SECTION_HEADING,\n} from \"../appearance/constants\";\nimport { NoticeCustomCss } from \"../appearance/custom-css\";\nimport { part } from \"../appearance/parts\";\nimport {\n injectGlassStyles,\n injectLayoutStyles,\n injectSwitchStyles,\n} from \"../appearance/stylesheets\";\nimport { applyCssVariables } from \"../appearance/theme-vars\";\nimport type { Style } from \"../appearance/types\";\nimport { prefersReducedMotion, type NoticeAppearance } from \"../shared/appearance\";\nimport {\n ACCEPT_ALL_BUTTON_ID,\n ACCEPT_SELECTED_BUTTON_ID,\n CONFIRM_HINT_COPY,\n DECLINE_BUTTON_ID,\n DEFAULT_ACCEPT_ALL_BUTTON_TEXT,\n DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT,\n DEFAULT_DECLINE_BUTTON_TEXT,\n NOTICE_FONT_ROOT_ATTRIBUTE,\n SUBMITTING_BUTTON_TEXT,\n} from \"../constants\";\nimport type { SandboxOptions } from \"../api/types\";\nimport type {\n AcceptMode,\n ConfirmAction,\n ConfirmDialogRefs,\n ConfirmVerdict,\n ModalOptions,\n NoticeSection,\n OtpGatePanelRefs,\n ProductSectionRefs,\n SelectionState,\n} from \"../types\";\nimport type {\n ConsentContent,\n PurposeItemData,\n TranslationObject,\n} from \"../api/types\";\n\ntype ModalState = {\n isLoading: boolean;\n isSubmitting: boolean;\n isSubmittingAccept: boolean;\n isSubmittingDecline: boolean;\n content: ConsentContent | null;\n selectedPurposes: Record<string, boolean>;\n selectedDataElements: Record<string, boolean>;\n initialDataElementSelections: Record<string, boolean>;\n recordedAnswers: Record<string, boolean>;\n collapsedPurposes: Record<string, boolean>;\n collapsedProducts: Record<string, boolean>;\n recordedPurposeSelections: Record<string, boolean>;\n consentedProducts: Record<string, boolean>;\n consentedPurposes: Record<string, boolean>;\n hasAlreadyConsented: boolean;\n isFullyConsentedReviewMode: boolean;\n selectedLanguage: string;\n errorMessage: string | null;\n fetchError: Error | null;\n needsConsentPurposes: PurposeItemData[];\n alreadyConsentedPurposes: PurposeItemData[];\n // Age/Guardian flow\n isMinorFlow: boolean;\n selfDeclaredAdult: boolean;\n showAgeVerification: boolean;\n showGuardianForm: boolean;\n showVerificationScreen: boolean;\n verificationReference: string | null;\n isVerificationComplete: boolean;\n isInitiatingVerification: boolean;\n isPollingStatus: boolean;\n verificationError: string | null;\n verificationErrorCode: string | null;\n canRetryVerification: boolean;\n guardianFormData: GuardianFormData;\n};\n\n/** The `data-redacto-*` attributes this controller last set on an element. */\nconst OWNED_ATTRIBUTE_PREFIX = \"data-redacto-\";\n\n/**\n * Repaints one of the notice's roots: the attributes the appearance stylesheets\n * and the admin's custom CSS key on, the inline style and the custom\n * properties. Starts from a clean element, so a look that drops a key (the\n * loader pill growing into the card) does not leave it behind.\n */\nconst paintRoot = (\n element: HTMLElement,\n style: Style,\n attributes: Record<string, string>,\n variables: Record<string, string> = {}\n): void => {\n for (const { name } of Array.from(element.attributes)) {\n if (name.startsWith(OWNED_ATTRIBUTE_PREFIX) && !(name in attributes)) {\n element.removeAttribute(name);\n }\n }\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, value);\n }\n element.removeAttribute(\"style\");\n applyStyles(element, style);\n applyCssVariables(element, variables);\n};\n\nexport class ModalController {\n private store: Store<ModalState>;\n private options: ModalOptions;\n private readonly endpoints: ResolvedEndpoints;\n private hostEl: HTMLElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private previousBodyOverflow: string | null = null;\n private previousHtmlOverflow: string | null = null;\n private overlayEl: HTMLElement | null = null;\n private modalEl: HTMLElement | null = null;\n private mediaQuery: MediaQuerySubscription;\n private colorScheme: MediaQuerySubscription;\n private purposeRefs: ModalPurposeRefs | null = null;\n private alreadyConsentedPurposeRefs: ModalPurposeRefs | null = null;\n private productSections: ProductSectionRefs[] = [];\n private confirmHintEl: HTMLElement | null = null;\n private bottomSectionEl: HTMLElement | null = null;\n private langSelectorRefs: LanguageSelectorRefs | null = null;\n private keyboardCleanup: KeyboardTrapCleanup | null = null;\n private abortController: AbortController | null = null;\n private unsubscribe: (() => void) | null = null;\n private ttsManager: TTSManager | null = null;\n private guardianFormRefs: GuardianFormRefs | null = null;\n private statusPollTimeout: ReturnType<typeof setTimeout> | null = null;\n private popupCheckInterval: ReturnType<typeof setInterval> | null = null;\n private verificationPopup: Window | null = null;\n private verificationSessionToken: string | null = null;\n private visibilityChangeHandler: (() => void) | null = null;\n private otpSession = new OtpGateSession();\n private otpPanel: OtpGatePanelRefs | null = null;\n /** The visitor's own ticks, held while a shortcut is pending behind the code. */\n private preGateSelection: SelectionState | null = null;\n private selectionsEl: HTMLElement | null = null;\n private confirmDialog: ConfirmDialogRefs | null = null;\n /** The last appearance served for this notice, drawn while it loads. */\n private cachedAppearance: NoticeAppearance | undefined;\n private look: ModalLook | null = null;\n private customCss = new NoticeCustomCss();\n /** The visitor's own choice for each collapsible section. */\n private openSections: Record<NoticeSection, boolean> = { about: false, dpo: false };\n private sectionRefs: Partial<Record<NoticeSection, NoticeAccordionRefs>> = {};\n private talkbackActive = false;\n\n // DOM refs for targeted updates\n private acceptBtn: HTMLButtonElement | null = null;\n private acceptAllBtn: HTMLButtonElement | null = null;\n private declineBtn: HTMLButtonElement | null = null;\n private middleSection: HTMLElement | null = null;\n private errorEl: HTMLElement | null = null;\n private noticeTitleEl: HTMLElement | null = null;\n private purposeHeadingEl: HTMLElement | null = null;\n private privacyPolicyLinkEl: HTMLAnchorElement | null = null;\n private privacyCenterLinkEl: HTMLAnchorElement | null = null;\n private ttsButton: HTMLElement | null = null;\n\n constructor(options: ModalOptions) {\n this.options = options;\n this.endpoints = resolveEndpointOptions(options.baseUrl, options.ledgerBaseUrl);\n this.store = new Store<ModalState>({\n isLoading: true,\n isSubmitting: false,\n isSubmittingAccept: false,\n isSubmittingDecline: false,\n content: null,\n selectedPurposes: {},\n selectedDataElements: {},\n initialDataElementSelections: {},\n recordedAnswers: {},\n collapsedPurposes: {},\n collapsedProducts: {},\n recordedPurposeSelections: {},\n consentedProducts: {},\n consentedPurposes: {},\n hasAlreadyConsented: false,\n isFullyConsentedReviewMode: false,\n selectedLanguage: options.language || \"en\",\n errorMessage: null,\n fetchError: null,\n needsConsentPurposes: [],\n alreadyConsentedPurposes: [],\n isMinorFlow: false,\n selfDeclaredAdult: false,\n showAgeVerification: false,\n showGuardianForm: false,\n showVerificationScreen: false,\n verificationReference: null,\n isVerificationComplete: false,\n isInitiatingVerification: false,\n isPollingStatus: false,\n verificationError: null,\n verificationErrorCode: null,\n canRetryVerification: false,\n guardianFormData: { guardianName: \"\", guardianContact: \"\", guardianRelationship: \"\" },\n });\n this.mediaQuery = createMediaQuery(\"(max-width: 768px)\");\n // Automatic dark mode follows the device's scheme while the notice is open.\n this.colorScheme = createMediaQuery(DARK_SCHEME_QUERY);\n // TTSManager is instantiated lazily in renderOverlayWithLoading() once the\n // shadow root exists, so it can scope its DOM queries inside the shadow.\n }\n\n async init(): Promise<void> {\n this.unsubscribe = this.store.subscribe((state, prevState) => {\n this.handleStateChange(state, prevState);\n });\n\n this.mediaQuery.subscribe(() => this.repaint());\n this.colorScheme.subscribe(() => this.repaint());\n\n // Draw the loading state in the look last served for this notice.\n this.cachedAppearance = readCachedAppearance(this.options.noticeId);\n\n // Render loading state\n this.renderOverlayWithLoading();\n\n // Fetch content\n await this.fetchNotice();\n }\n\n destroy(): void {\n this.abortController?.abort();\n this.keyboardCleanup?.();\n this.unsubscribe?.();\n this.mediaQuery.destroy();\n this.colorScheme.destroy();\n this.ttsManager?.destroy();\n this.stopPolling();\n this.confirmDialog?.dispose();\n this.confirmDialog = null;\n this.disposeSections();\n this.customCss.remove();\n this.store.destroy();\n\n // Removing the shadow host nukes the entire shadow tree (overlay, modal,\n // language dropdown, injected stylesheets) in a single operation.\n if (this.hostEl && this.hostEl.parentNode) {\n this.hostEl.parentNode.removeChild(this.hostEl);\n }\n\n // Restore the host page's scroll lock to whatever it was before we opened.\n if (this.previousBodyOverflow !== null) {\n document.body.style.overflow = this.previousBodyOverflow;\n this.previousBodyOverflow = null;\n }\n if (this.previousHtmlOverflow !== null) {\n document.documentElement.style.overflow = this.previousHtmlOverflow;\n this.previousHtmlOverflow = null;\n }\n\n this.hostEl = null;\n this.shadowRoot = null;\n this.overlayEl = null;\n this.modalEl = null;\n this.purposeRefs = null;\n this.langSelectorRefs = null;\n }\n\n updateToken(accessToken: string): void {\n this.options = { ...this.options, accessToken };\n this.fireStashedAccept();\n }\n\n // ─── Private ───\n\n private fireStashedAccept(): void {\n if (!this.modalEl || this.confirmDialog) return;\n const mode = this.otpSession.takeStashedAccept(this.options.accessToken);\n if (mode) void this.handleAccept(mode);\n }\n\n private holdForOtp(mode: AcceptMode): boolean {\n const wasLocked = this.otpSession.isLocked;\n if (!this.otpSession.hold(this.options.otpGate, mode)) return false;\n if (wasLocked) {\n this.otpPanel?.render(this.otpSession.view);\n return true;\n }\n this.mountOtpGate();\n this.otpPanel?.focusDigit(0);\n this.otpPanel?.container.scrollIntoView?.({ block: \"nearest\" });\n return true;\n }\n\n private mountOtpGate(): void {\n this.otpPanel = null;\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n const look = this.look;\n if (!this.otpSession.isLocked || !this.selectionsEl || !content || !look) return;\n lockSelections(this.selectionsEl);\n const gate = this.options.otpGate;\n const chrome = noticeChromeCopy(state.selectedLanguage);\n const { styles } = look;\n this.otpPanel = renderOtpGatePanel({\n title: gate?.title ?? chrome.otpTitle,\n description: gate?.description ?? chrome.otpDescription,\n submitLabel: gate?.submitLabel ?? chrome.otpSubmit,\n verifyingLabel: chrome.otpVerifying,\n view: this.otpSession.view,\n styles: {\n panel: styles.otpGatePanel,\n title: styles.otpGateTitle,\n description: styles.otpGateDescription,\n digits: styles.otpGateDigits,\n digit: styles.otpGateDigit,\n error: styles.otpGateError,\n button: { ...styles.button, ...styles.acceptButton, ...styles.otpGateButton },\n },\n buttonStyle: look.buttons.acceptAll,\n onDigitsChange: (digits) => this.otpSession.setDigits(digits),\n onConfirm: () => void this.handleOtpConfirm(),\n });\n this.selectionsEl.insertAdjacentElement(\"afterend\", this.otpPanel.container);\n }\n\n private async handleOtpConfirm(): Promise<void> {\n const verified = await this.otpSession.verify(\n this.options.otpGate,\n this.options.accessToken,\n () => this.otpPanel?.render(this.otpSession.view),\n noticeChromeCopy(this.store.getState().selectedLanguage).otpFailed\n );\n if (!this.modalEl) return;\n if (!verified) {\n this.otpPanel?.render(this.otpSession.view);\n this.otpPanel?.focusDigit(0);\n return;\n }\n this.preGateSelection = null;\n this.rebuildUI();\n this.fireStashedAccept();\n }\n\n private confirmFirst(kind: ConfirmAction, action: () => void): void {\n this.otpSession.dropStashedAccept();\n const state = this.store.getState();\n const look = this.look;\n if (\n !look?.appearance.confirmBeforeSubmit ||\n state.isFullyConsentedReviewMode ||\n !this.shadowRoot\n ) {\n action();\n return;\n }\n if (this.confirmDialog || state.isSubmitting) return;\n if (kind === \"accept-selected\" && !this.confirmVerdict(state).ok) return;\n this.confirmDialog = openConfirmDialog({\n root: this.shadowRoot,\n action: kind,\n language: state.selectedLanguage,\n onConfirm: () => {\n this.confirmDialog = null;\n action();\n },\n onCancel: () => {\n this.confirmDialog = null;\n },\n confirmStyle: {\n ...look.buttons.acceptAll,\n borderColor: look.buttons.acceptAll.backgroundColor,\n },\n skin: look.confirmSkin,\n rootAttributes: look.rootAttributes,\n rootVariables: look.cssVariables,\n fontFamily: this.modalEl?.style.fontFamily,\n });\n }\n\n /**\n * Sandbox auth options to forward to every API call. When `token` is set the\n * API layer sends the single `X-Consent-Token` header, carries every supplied\n * identifier in each request's payload, and reads org/workspace from these\n * fields instead of decoding the JWT. Empty in the normal JWT flow.\n */\n private sandboxParams(): SandboxOptions {\n // Legacy `sandboxSubject` (deprecated): classify into email/mobile so an\n // existing caller that still passes it keeps working unchanged.\n const legacySubject = this.options.sandboxSubject?.trim();\n const legacyEmail = legacySubject?.includes(\"@\") ? legacySubject : undefined;\n const legacyMobile =\n legacySubject && !legacySubject.includes(\"@\") ? legacySubject : undefined;\n return {\n token: this.options.token,\n // The static token carries no identity; carry every supplied identifier\n // (ucic/email/mobile) so the server can pick the principal by precedence\n // (UCIC > email > mobile) and keep the rest as the sandbox contact.\n // sandboxUcic / sandboxEmail / sandboxMobile stay as fallbacks.\n sandboxUcic: this.options.ucic || this.options.sandboxUcic,\n sandboxEmail: this.options.email || this.options.sandboxEmail || legacyEmail,\n sandboxMobile:\n this.options.mobile || this.options.sandboxMobile || legacyMobile,\n organisationUuid: this.options.organisationUuid,\n workspaceUuid: this.options.workspaceUuid,\n };\n }\n\n private async fetchNotice(): Promise<void> {\n this.abortController = new AbortController();\n this.store.setState({ isLoading: true, fetchError: null });\n\n try {\n // Standard flow reads the notice from the Go ledger. The magic-link flow\n // (applicationId/specific_uuid) and sandbox sessions stay on the consent\n // server: the ledger notice read supports neither (no specific_uuid, no\n // X-Consent-Token auth). Without this a ledger-minted token is rejected\n // by the consent server and the modal renders with no content.\n const noticeBaseUrl =\n this.endpoints.ledgerBaseUrl &&\n !this.options.applicationId &&\n !this.options.token\n ? this.endpoints.ledgerBaseUrl\n : this.endpoints.baseUrl;\n const data = await fetchConsentContent({\n noticeId: this.options.noticeId,\n accessToken: this.options.accessToken,\n refreshToken: this.options.refreshToken,\n baseUrl: noticeBaseUrl,\n language: this.options.language,\n specific_uuid: this.options.applicationId,\n validate_against: this.options.validateAgainst || \"all\",\n include_fully_consented_data: this.options.includeFullyConsentedData,\n signal: this.abortController.signal,\n ...this.sandboxParams(),\n });\n\n const activeConfig = data.detail.active_config;\n // Remembered for this notice's next load, so its loading state is drawn\n // in the admin's look rather than flashing classic.\n writeCachedAppearance(this.options.noticeId, activeConfig.appearance);\n\n // Overlay the prior-consent / reconsent state from the Go ledger's\n // check-consent. Consents live in the ledger post-cutover, so Python's\n // notice-validation overlay is empty; the notice text/config still comes\n // from Python (above). Falls back to the Python-provided values when the\n // ledger is unavailable, and is skipped for the magic-link flow\n // (applicationId), which pre-fills from a specific event.\n let purposeSelections = data.detail.purpose_selections;\n let reconsentRequired = data.detail.reconsent_required;\n let ledgerOverlayApplied = false;\n if (this.endpoints.ledgerBaseUrl && !this.options.applicationId) {\n const ledgerStatus = await fetchNoticeConsentStatus({\n // A sandbox session carries no bearer token; the read then\n // degrades to null and the server's own overlay applies.\n accessToken: this.options.accessToken ?? \"\",\n ledgerBaseUrl: this.endpoints.ledgerBaseUrl,\n noticeUuid: this.options.noticeId,\n signal: this.abortController.signal,\n });\n if (ledgerStatus) {\n const overlay = buildLedgerConsentOverlay(ledgerStatus, activeConfig.purposes);\n reconsentRequired = overlay?.reconsent_required ?? false;\n purposeSelections = overlay?.purpose_selections;\n ledgerOverlayApplied = Boolean(overlay);\n }\n }\n\n // Initialize state\n const initialCollapsed: Record<string, boolean> = {};\n const initialDataElementSelections: Record<string, boolean> = {};\n\n // Categorize purposes for reconsent. With a ledger overlay, categorize\n // whenever prior consent exists (even without reconsent needed) so a\n // fully-consented principal gets the already-consented presentation /\n // review mode instead of a fresh consent flow — the ledger-mode\n // equivalent of Python's 409-driven short-circuit.\n let needsConsentPurposes: PurposeItemData[] = [];\n let alreadyConsentedPurposes: PurposeItemData[] = [];\n let isFullyConsentedReviewMode = false;\n const recordedFor = recordedSelectionLookup(\n purposeSelections,\n data.detail.product_purpose_selections\n );\n const seedRows = rowsOf(activeConfig);\n const reviewsFullRecord = Boolean(\n this.options.includeFullyConsentedData &&\n seedRows.length > 0 &&\n isFullyConsented(seedRows, recordedFor)\n );\n\n // Categorised in the order the notice renders them.\n const orderedPurposes = purposesInRenderOrder(\n activeConfig.products,\n activeConfig.purposes,\n activeConfig.product_purpose_order\n );\n if (purposeSelections && (reconsentRequired || ledgerOverlayApplied || reviewsFullRecord)) {\n for (const purpose of orderedPurposes) {\n const selection = purposeSelections[purpose.uuid];\n initialCollapsed[purpose.uuid] = true;\n\n if (selection && selection.selected && !selection.needs_reconsent) {\n alreadyConsentedPurposes.push(purpose);\n for (const de of purpose.data_elements) {\n const combinedId = `${purpose.uuid}-${de.uuid}`;\n const deSelection = selection.data_elements?.[de.uuid];\n initialDataElementSelections[combinedId] = deSelection?.selected || false;\n }\n } else {\n needsConsentPurposes.push(purpose);\n }\n }\n } else {\n needsConsentPurposes = orderedPurposes;\n for (const purpose of activeConfig.purposes) {\n initialCollapsed[purpose.uuid] = true;\n }\n }\n\n // Check if all purposes are already consented (review mode)\n if (\n this.options.includeFullyConsentedData &&\n needsConsentPurposes.length === 0 &&\n alreadyConsentedPurposes.length > 0\n ) {\n isFullyConsentedReviewMode = true;\n }\n\n const productSeed = seedProductState({\n config: activeConfig,\n purposeSelections,\n productPurposeSelections: data.detail.product_purpose_selections,\n defaultOpenProducts: this.options.defaultOpenProducts,\n includeFullyConsentedData: this.options.includeFullyConsentedData,\n });\n const productPreselection = applyPreselection(\n seedRows,\n activeConfig.purpose_preselection,\n recordedFor,\n productSeed.selectedPurposes && productSeed.selectedDataElements\n ? {\n selectedPurposes: productSeed.selectedPurposes,\n selectedDataElements: productSeed.selectedDataElements,\n }\n : seedSelection(seedRows, recordedFor)\n );\n\n const selectedLanguage = resolveDisplayLanguage(\n this.options.language,\n activeConfig.default_language,\n activeConfig.supported_languages_and_translations\n );\n\n // Check if minor flow is required, and restore in-progress verification\n // state from a previous session (e.g. user closed the SDK or returned\n // from a DigiLocker redirect mid-flow). Without this restoration, the\n // notice would be shown directly and guardian verification skipped.\n let isMinorFlow = false;\n let showAgeVerification = false;\n let restoreState: Partial<ModalState> = {};\n let pollingTokenToResume: string | null = null;\n if (data.detail.is_minor) {\n isMinorFlow = true;\n const persistedState = getConsentState();\n\n // Discard persisted state from a different notice\n if (persistedState?.noticeId && persistedState.noticeId !== this.options.noticeId) {\n clearConsentState();\n } else if (\n persistedState?.flowState === \"digilocker-pending\" &&\n persistedState.sessionToken\n ) {\n // User is mid-verification — resume the verification screen and polling\n restoreState = {\n showVerificationScreen: true,\n isPollingStatus: true,\n };\n pollingTokenToResume = persistedState.sessionToken;\n } else if (\n persistedState?.verificationResult === \"verified\" &&\n persistedState.verificationReference\n ) {\n // Verification completed during a redirect — show success state\n restoreState = {\n showVerificationScreen: true,\n isVerificationComplete: true,\n verificationReference: persistedState.verificationReference,\n };\n clearConsentState();\n } else if (\n persistedState?.verificationResult === \"failed\" ||\n persistedState?.verificationResult === \"expired\"\n ) {\n // Verification failed/expired during a redirect — show error\n restoreState = {\n showVerificationScreen: true,\n verificationError:\n persistedState.verificationResult === \"expired\"\n ? \"Verification session has expired. Please try again.\"\n : \"Verification failed. Please try again.\",\n canRetryVerification: true,\n };\n clearConsentState();\n } else {\n // No in-progress verification — start with age verification\n showAgeVerification = true;\n }\n }\n\n this.store.setState({\n content: data,\n isLoading: false,\n selectedLanguage,\n collapsedPurposes: initialCollapsed,\n initialDataElementSelections,\n recordedAnswers: recordedAnswersFor(seedRows, recordedFor),\n needsConsentPurposes,\n alreadyConsentedPurposes,\n isFullyConsentedReviewMode,\n ...productSeed,\n ...productPreselection,\n isMinorFlow,\n showAgeVerification,\n ...restoreState,\n });\n\n // Resume polling after state has been applied so the verification screen\n // is visible while polling runs.\n if (pollingTokenToResume) {\n this.startStatusPolling(pollingTokenToResume);\n }\n } catch (err: unknown) {\n if ((err as Error).name === \"AbortError\") return;\n const error = err as Error & { status?: number };\n if (error.status === 409) {\n this.store.setState({ hasAlreadyConsented: true, isLoading: false });\n this.options.onAccept();\n } else {\n this.store.setState({ fetchError: error, isLoading: false });\n this.options.onError?.(error);\n }\n }\n }\n\n private handleStateChange(state: ModalState, prevState: ModalState): void {\n // Loading → content loaded\n if (prevState.isLoading && !state.isLoading && state.content) {\n this.rebuildUI();\n return;\n }\n\n // Already consented → close\n if (state.hasAlreadyConsented && !prevState.hasAlreadyConsented) {\n this.destroy();\n return;\n }\n\n // Fetch error → show error\n if (state.fetchError && !prevState.fetchError) {\n this.renderError(state.fetchError.message);\n return;\n }\n\n // Screen transitions (age → guardian → verification → consent)\n if (state.showAgeVerification !== prevState.showAgeVerification ||\n state.showGuardianForm !== prevState.showGuardianForm ||\n state.showVerificationScreen !== prevState.showVerificationScreen) {\n this.rebuildUI();\n return;\n }\n\n // Verification screen state changes\n if (state.showVerificationScreen && (\n state.isVerificationComplete !== prevState.isVerificationComplete ||\n state.verificationError !== prevState.verificationError ||\n state.isPollingStatus !== prevState.isPollingStatus ||\n state.isInitiatingVerification !== prevState.isInitiatingVerification)) {\n this.rebuildUI();\n return;\n }\n\n // Checkbox changes\n if (\n state.selectedPurposes !== prevState.selectedPurposes ||\n state.selectedDataElements !== prevState.selectedDataElements\n ) {\n this.updateCheckboxes(state);\n }\n\n // Collapse changes\n if (state.collapsedPurposes !== prevState.collapsedPurposes) {\n this.updateCollapseState(state);\n }\n\n if (state.collapsedProducts !== prevState.collapsedProducts) {\n this.updateProductSections(state);\n }\n\n // Error message\n if (state.errorMessage !== prevState.errorMessage) {\n this.updateErrorMessage(state);\n }\n\n // Submitting state\n if (state.isSubmittingAccept !== prevState.isSubmittingAccept ||\n state.isSubmittingDecline !== prevState.isSubmittingDecline) {\n this.updateButtonStates(state);\n }\n }\n\n private lookFor(state: ModalState): ModalLook {\n return buildModalLook({\n noticeId: this.options.noticeId,\n content: state.content?.detail.active_config ?? null,\n cachedAppearance: this.cachedAppearance,\n settings: this.options.settings,\n prefersDark: this.colorScheme.matches,\n isMobile: this.mediaQuery.matches,\n });\n }\n\n /** Redraws for a new breakpoint or colour scheme, whatever is showing. */\n private repaint(): void {\n const state = this.store.getState();\n if (state.content && !state.isLoading) {\n this.rebuildUI();\n } else if (state.isLoading) {\n this.renderLoading();\n }\n }\n\n /** Whether disclosures and entrances animate: the console's switch and the OS's. */\n private animates(): boolean {\n return (this.look?.layout.motion ?? true) && !prefersReducedMotion();\n }\n\n /**\n * Paints the overlay and the dialog root for a look: the appearance\n * stylesheets inside the shadow root, the admin's scoped custom CSS, and the\n * root attributes both carry.\n */\n private paintChrome(look: ModalLook, fontFamily: string, loading: boolean): void {\n const root = this.shadowRoot;\n if (!root || !this.modalEl) return;\n this.look = look;\n injectLayoutStyles(root);\n if (look.skin) injectGlassStyles(root);\n if (look.drawsSwitches) injectSwitchStyles(root);\n this.customCss.apply(root, this.options.noticeId, look.appearance.customCss);\n\n if (this.overlayEl) {\n paintRoot(this.overlayEl, look.overlayStyle, {\n ...look.rootAttributes,\n ...part(\"overlay\"),\n });\n }\n\n const attributes = {\n ...look.rootAttributes,\n ...part(\"root\"),\n ...dockAttributes(look),\n [NOTICE_FONT_ROOT_ATTRIBUTE]: \"\",\n };\n // The dialog itself shrinks to a pill until the notice arrives, then grows\n // into the card: one element, so the focus trap and role hold throughout.\n const pill = loading && look.showsLoaderPill && look.skin;\n const style: Style = pill\n ? { ...look.skin!.parts.loaderPill, fontFamily }\n : { ...look.modalStyle, fontFamily };\n paintRoot(this.modalEl, style, attributes, look.cssVariables);\n }\n\n private renderOverlayWithLoading(): void {\n // Mount a single host <div> on document.body and attach an open shadow\n // root. All overlay, modal, and stylesheet content lives inside the shadow\n // so the host page's CSS cannot bleed in (and vice versa). This is what\n // makes the SDK render identically across customer sites and WordPress\n // installs that ship aggressive global stylesheets / accessibility plugins.\n this.hostEl = document.createElement(\"div\");\n this.hostEl.setAttribute(\"data-redacto-consent\", \"\");\n // Lock the host to a zero-size, fixed-position box so it cannot perturb a\n // flex / grid body layout. We deliberately DO NOT reset inherited text\n // properties (font-family, color, line-height) — those flow through the\n // shadow boundary so the modal picks up the host page's font, matching\n // how the React SDK renders.\n this.hostEl.style.position = \"fixed\";\n this.hostEl.style.top = \"0\";\n this.hostEl.style.left = \"0\";\n this.hostEl.style.width = \"0\";\n this.hostEl.style.height = \"0\";\n this.hostEl.style.zIndex = \"2147483646\";\n document.body.appendChild(this.hostEl);\n this.shadowRoot = this.hostEl.attachShadow({ mode: \"open\" });\n\n // Lock background scroll on the host page while the modal is open. We\n // capture the previous values so destroy() can restore exactly what was\n // there (including the empty string, which means \"use stylesheet rule\").\n this.previousBodyOverflow = document.body.style.overflow;\n this.previousHtmlOverflow = document.documentElement.style.overflow;\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n\n // Inject SDK stylesheet into the shadow root (not document.head).\n injectCheckboxStyles(this.shadowRoot);\n injectNoticeFontStyles(this.shadowRoot);\n\n // Lazy-instantiate TTSManager now that we have a root for it to query.\n this.ttsManager = new TTSManager(\n () => this.handleTalkbackChange(),\n this.shadowRoot\n );\n\n // A backdrop the console turns off still blocks the page while the host\n // asks for `blockUI`; it only stops dimming it.\n if (this.options.blockUI !== false) {\n this.overlayEl = el(\"div\", { role: \"presentation\" });\n this.shadowRoot.appendChild(this.overlayEl);\n }\n\n this.modalEl = el(\"div\", {\n role: \"dialog\",\n \"aria-modal\": \"true\",\n \"aria-label\": \"Privacy consent\",\n });\n this.shadowRoot.appendChild(this.modalEl);\n this.renderLoading();\n }\n\n private renderLoading(): void {\n if (!this.modalEl) return;\n const look = this.lookFor(this.store.getState());\n const fontFamily = resolveNoticeFontFamily({ hostFont: this.options.settings?.font });\n this.paintChrome(look, fontFamily, true);\n clearElement(this.modalEl);\n const { styles } = look;\n\n if (look.showsLoaderPill && look.skin) {\n this.modalEl.appendChild(\n el(\n \"div\",\n {\n role: \"status\",\n \"aria-live\": \"polite\",\n \"aria-label\": \"Loading consent notice\",\n style: { display: \"flex\", alignItems: \"center\", gap: \"10px\" },\n },\n el(\"div\", { style: styles.loadingSpinner, \"aria-hidden\": \"true\" }),\n el(\"p\", { style: { ...look.skin.parts.loaderText, color: look.headingColor } }, \"Loading...\")\n )\n );\n return;\n }\n\n const loadingEl = el(\n \"div\",\n {\n role: \"status\",\n \"aria-live\": \"polite\",\n \"aria-label\": \"Loading consent notice\",\n style: styles.loadingContainer,\n },\n el(\"div\", { style: styles.loadingSpinner, \"aria-hidden\": \"true\" }),\n el(\"p\", { style: { ...styles.privacyText, color: look.textColor } }, \"Loading...\")\n );\n this.modalEl.appendChild(\n el(\"div\", { style: { ...styles.content, ...look.responsive.content } }, loadingEl)\n );\n }\n\n /** The look as the purpose rows and product sections read it. */\n private purposeLook(look: ModalLook, language: string): PurposeLook {\n return {\n styles: look.styles,\n responsive: look.responsive,\n headingColor: look.headingColor,\n textColor: look.textColor,\n mutedTextColor: look.appearance.colors.muted_text,\n selectionControl: look.selectionControl,\n language,\n controlSkin: look.controlSkin,\n rowClassName: look.skin?.parts.rowClassName,\n roomyControls: look.roomyControls,\n drawsSwitches: look.drawsSwitches,\n };\n }\n\n private disposeSections(): void {\n for (const refs of Object.values(this.sectionRefs)) refs?.dispose();\n this.sectionRefs = {};\n }\n\n /**\n * Wraps a notice-body section in a disclosure when the layout collapses\n * them. Without SDK labels for the language, the notice's own translated\n * text becomes the title, so nothing shows in English.\n */\n private withNoticeSection(\n section: NoticeSection,\n node: HTMLElement,\n look: ModalLook,\n titles: { preview: string; fallback: string }\n ): HTMLElement {\n if (!look.layout.collapsibleSections) {\n return node;\n }\n const label = sectionLabelsFor(this.store.getState().selectedLanguage)?.[section];\n const refs = renderNoticeAccordion({\n panelId: `privacy-notice-${section}`,\n icon: section === \"about\" ? \"info\" : \"shield\",\n title: label ?? (titles.preview || titles.fallback || ENGLISH_SECTION_LABELS[section]),\n clampTitle: !label,\n hint: label ? titles.preview || undefined : undefined,\n open: this.openSections[section] || this.talkbackActive,\n locked: this.talkbackActive,\n onToggle: () => this.toggleNoticeSection(section),\n styles: look.parts.accordion,\n animate: () => this.animates(),\n content: node,\n });\n this.sectionRefs[section] = refs;\n return refs.element;\n }\n\n private toggleNoticeSection(section: NoticeSection): void {\n this.openSections = { ...this.openSections, [section]: !this.openSections[section] };\n this.syncSections();\n }\n\n /** Talkback reads both sections by id, so they stay open while it plays or pauses. */\n private syncSections(): void {\n for (const section of NOTICE_SECTIONS) {\n this.sectionRefs[section]?.setState(\n this.openSections[section] || this.talkbackActive,\n this.talkbackActive\n );\n }\n }\n\n private handleTalkbackChange(): void {\n const tts = this.ttsManager;\n const active = Boolean(tts && (tts.isPlaying || tts.isPaused));\n if (active !== this.talkbackActive) {\n if (!active) {\n // A section talkback held open would otherwise collapse and unmount\n // the link the visitor tabbed into, dropping focus out of the dialog;\n // such a section is kept open as if the visitor had opened it.\n const focused = this.shadowRoot?.activeElement ?? null;\n for (const section of NOTICE_SECTIONS) {\n if (this.sectionRefs[section]?.holdsFocus(focused)) {\n this.openSections = { ...this.openSections, [section]: true };\n }\n }\n }\n this.talkbackActive = active;\n this.syncSections();\n }\n this.revealPurposeBeingRead();\n this.updateTTSButton();\n }\n\n /**\n * Expands every rendered copy of the purpose talkback is reading, so the\n * data elements it reads next are on screen rather than collapsed under it.\n */\n private revealPurposeBeingRead(): void {\n const elementId = this.ttsManager?.isPlaying ? this.ttsManager.currentElementId : null;\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n if (!elementId || !content) return;\n const owner = content.purposes.find(\n (purpose) =>\n elementId === `purpose-name-${purpose.uuid}` ||\n elementId === `purpose-description-${purpose.uuid}` ||\n purpose.data_elements.some(\n (element) => elementId === `data-element-${purpose.uuid}-${element.uuid}`\n )\n );\n if (!owner) return;\n const keys = rowsOf(content)\n .filter((row) => row.purpose.uuid === owner.uuid)\n .map((row) => productPurposeKey(row.productUuid, owner.uuid))\n .filter((key) => state.collapsedPurposes[key]);\n if (keys.length === 0) return;\n const collapsedPurposes = { ...state.collapsedPurposes };\n for (const key of keys) collapsedPurposes[key] = false;\n this.store.setState({ collapsedPurposes });\n }\n\n private rebuildUI(): void {\n const state = this.store.getState();\n if (!state.content || !this.modalEl) return;\n\n const activeConfig = state.content.detail.active_config;\n const settingsObj = this.options.settings;\n const isMobile = this.mediaQuery.matches;\n const look = this.lookFor(state);\n const fontFamily = resolveNoticeFontFamily({\n hostFont: settingsObj?.font,\n noticeFont: activeConfig.font_preference,\n });\n this.paintChrome(look, fontFamily, false);\n this.disposeSections();\n // Only the notice itself is titled and described by its own copy; the\n // sub-flows keep the dialog's plain label.\n this.modalEl.removeAttribute(\"aria-labelledby\");\n this.modalEl.removeAttribute(\"aria-describedby\");\n const colors = colorsFromLook(look);\n // The sub-flows read the heading and surface colours the way `settings`\n // did, now resolved through the console appearance.\n const subFlowSettings = {\n headingColor: look.headingColor,\n backgroundColor: look.appearance.colors.background,\n };\n const subFlowLogo = activeConfig.logo_url;\n\n // ─── Age Verification Screen ───\n if (state.showAgeVerification) {\n clearElement(this.modalEl);\n const ageRefs = renderAgeVerification({\n settings: subFlowSettings,\n colors,\n isMobile,\n logoUrl: subFlowLogo,\n onYes: () => this.handleAgeVerificationYes(),\n onNo: () => this.handleAgeVerificationNo(),\n onClose: () => this.handleDecline(),\n });\n this.modalEl.appendChild(ageRefs.container);\n this.keyboardCleanup?.();\n this.keyboardCleanup = setupKeyboardTrap(this.modalEl, () => this.handleDecline());\n return;\n }\n\n // ─── Guardian Form Screen ───\n if (state.showGuardianForm) {\n clearElement(this.modalEl);\n this.guardianFormRefs = renderGuardianForm({\n formData: state.guardianFormData,\n settings: subFlowSettings,\n colors,\n isMobile,\n logoUrl: subFlowLogo,\n isSubmitting: state.isInitiatingVerification,\n onSubmit: () => this.handleGuardianFormSubmit(),\n onCancel: () => this.handleDecline(),\n onFieldChange: (field, value) => {\n const s = this.store.getState();\n this.store.setState({\n guardianFormData: { ...s.guardianFormData, [field]: value },\n });\n },\n });\n this.modalEl.appendChild(this.guardianFormRefs.container);\n this.keyboardCleanup?.();\n this.keyboardCleanup = setupKeyboardTrap(this.modalEl, () => this.handleDecline());\n return;\n }\n\n // ─── Verification Screen ───\n if (state.showVerificationScreen) {\n clearElement(this.modalEl);\n const verRefs = renderVerificationScreen({\n settings: subFlowSettings,\n colors,\n isMobile,\n logoUrl: subFlowLogo,\n isInitiating: state.isInitiatingVerification,\n isPolling: state.isPollingStatus,\n isComplete: state.isVerificationComplete,\n error: state.verificationError,\n errorCode: state.verificationErrorCode,\n canRetry: state.canRetryVerification,\n onContinue: () => this.handleVerificationContinue(),\n onBack: (clearName?: boolean) => {\n if (clearName) {\n this.handleChangeGuardian();\n } else if (state.verificationError && state.canRetryVerification) {\n this.handleVerificationRetry();\n } else {\n this.handleDecline();\n }\n },\n });\n this.modalEl.appendChild(verRefs.container);\n this.keyboardCleanup?.();\n this.keyboardCleanup = setupKeyboardTrap(this.modalEl, () => {});\n return;\n }\n\n // Clear modal content\n clearElement(this.modalEl);\n this.modalEl.setAttribute(\"aria-labelledby\", \"privacy-notice-title\");\n this.modalEl.setAttribute(\"aria-describedby\", \"privacy-notice-description\");\n\n const { styles, responsive, sheetParts, parts, headingColor, textColor } = look;\n const chrome = noticeChromeCopy(state.selectedLanguage);\n const purposeLook = this.purposeLook(look, state.selectedLanguage);\n const linkStyle = { ...styles.link, color: look.linkColor };\n const textStyle = {\n ...styles.privacyText,\n ...responsive.privacyText,\n color: textColor,\n };\n\n if (look.docked && isMobile) {\n this.modalEl.appendChild(el(\"div\", { style: parts.grabber, \"aria-hidden\": \"true\" }));\n }\n\n // ─── Header: the logo alone on row 1, then title + controls ───\n const logoImg = activeConfig.logo_url\n ? el(\"img\", {\n ...part(\"logo\"),\n src: activeConfig.logo_url,\n style: { ...styles.logo, ...responsive.logo },\n alt: \"Logo\",\n })\n : null;\n\n this.noticeTitleEl = el(\"h2\", {\n id: \"privacy-notice-title\",\n ...part(\"title\"),\n style: { ...styles.title, ...responsive.title, color: headingColor },\n });\n this.noticeTitleEl.textContent = this.getTranslatedText(\n \"notice_banner_heading\",\n activeConfig.notice_banner_heading || \"Privacy Notice\"\n );\n\n // Clean up previous language dropdown (since rebuildUI re-creates it).\n // The dropdown lives inside the shadow root (sibling of the modal) so we\n // remove it from there.\n if (\n this.langSelectorRefs?.dropdown &&\n this.shadowRoot &&\n this.langSelectorRefs.dropdown.parentNode === this.shadowRoot\n ) {\n this.langSelectorRefs.close();\n this.shadowRoot.removeChild(this.langSelectorRefs.dropdown);\n }\n\n const supportedLangs = Object.keys(activeConfig.supported_languages_and_translations || {});\n const allLanguages = [\n activeConfig.default_language || \"English\",\n ...supportedLangs.filter((l) => l !== activeConfig.default_language),\n ];\n\n this.langSelectorRefs = renderLanguageSelector({\n languages: allLanguages,\n selectedLanguage: state.selectedLanguage,\n look: {\n styles,\n responsive,\n chip: look.language.chip,\n menu: look.language.menu,\n selected: look.language.selected,\n rootAttributes: look.rootAttributes,\n },\n onSelect: (lang) => this.handleLanguageSelect(lang),\n dropdownContainer: this.shadowRoot!,\n });\n\n this.ttsButton = el(\"button\", {\n style: {\n ...styles.topRight,\n ...responsive.topRight,\n ...look.language.chip,\n display: \"none\",\n padding: \"3px 9px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n type: \"button\",\n \"aria-label\": \"Start audio playback\",\n title: \"Start Talkback\",\n onClick: () => this.ttsManager?.toggle(),\n });\n this.ttsButton.appendChild(this.speakerIcon(false));\n\n // Fetch TTS audio (the API uses \"English\" for English, not \"en\")\n this.ttsManager?.fetchAudioUrls({\n accessToken: this.options.accessToken,\n baseUrl: this.endpoints.baseUrl,\n ledgerBaseUrl: this.endpoints.ledgerBaseUrl,\n endpointMode: this.endpoints.mode,\n noticeUuid: activeConfig.notice_uuid,\n language: this.getLanguageCode(state.selectedLanguage),\n content: activeConfig,\n purposes: this.talkbackPurposes(state),\n ...this.sandboxParams(),\n });\n\n // TTS button on LEFT, language selector on RIGHT (matches React)\n const topRight = el(\"div\", {\n style: { display: \"flex\", alignItems: \"center\", gap: \"8px\", flexShrink: 0 },\n }, this.ttsButton, this.langSelectorRefs.container);\n\n const logoPosition = resolveLogoPosition(activeConfig.logo_position);\n const headerRows: HTMLElement[] = [];\n // Row 1 only exists when there is a logo. This package has no bundled\n // fallback (unlike React), so rendering it regardless would leave nothing\n // but the headerStack gap — a phantom band above the title.\n if (logoImg) {\n headerRows.push(\n el(\n \"div\",\n { style: { ...styles.logoRow, justifyContent: logoRowJustify(logoPosition) } },\n logoImg\n )\n );\n }\n headerRows.push(el(\"div\", { style: styles.headerRow }, this.noticeTitleEl, topRight));\n\n const topSection = el(\n \"div\",\n {\n ...part(\"header\"),\n style: {\n ...styles.headerStack,\n ...responsive.headerStack,\n ...sheetParts?.sheetHeader,\n color: textColor,\n },\n },\n ...headerRows\n );\n\n // ─── Body ───\n this.middleSection = el(\"div\", {\n id: \"privacy-notice-description\",\n style: {\n ...(sheetParts\n ? sheetParts.sheetBody\n : { ...styles.middleSection, ...responsive.middleSection }),\n color: textColor,\n },\n });\n\n const noticeTextSpan = el(\"span\", { id: \"privacy-notice-text\" });\n const noticeText = this.getTranslatedText(\"notice_text\", activeConfig.notice_text);\n noticeTextSpan.textContent = noticeText;\n\n const policyPrefixText = this.getTranslatedText(\n \"privacy_policy_prefix_text\",\n activeConfig.privacy_policy_prefix_text || \"\"\n );\n const policyAnchorText = this.getTranslatedText(\n \"privacy_policy_anchor_text\",\n activeConfig.privacy_policy_anchor_text || \"Privacy Policy\"\n );\n\n this.privacyPolicyLinkEl = el(\"a\", {\n id: \"privacy-policy-link\",\n href: activeConfig.privacy_policy_url || \"#\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: linkStyle,\n \"aria-label\": \"Privacy Policy (opens in new tab)\",\n }) as HTMLAnchorElement;\n this.privacyPolicyLinkEl.textContent = policyAnchorText;\n\n const policySpan = el(\"span\", { id: \"privacy-policy-text\" },\n `${policyPrefixText} `,\n this.privacyPolicyLinkEl\n );\n\n const productPolicyLinks = getProductPolicyLinks(\n activeConfig.products,\n activeConfig.product_privacy_policies\n );\n const showNoticePolicyLink = shouldShowNoticePolicyLink(\n activeConfig.products,\n productPolicyLinks\n );\n\n const noticeAndPolicyP = el(\"p\", { ...part(\"notice-text\"), style: textStyle },\n noticeTextSpan,\n showNoticePolicyLink && el(\"br\"),\n showNoticePolicyLink && policySpan\n );\n\n const dpoPreview = activeConfig.dpo_info\n ? this.getTranslatedDpoText(\"grievance_text\", activeConfig.dpo_info.grievance_text || \"\")\n : activeConfig.additional_text\n ? this.getTranslatedText(\"additional_text\", activeConfig.additional_text)\n : \"\";\n\n this.middleSection.appendChild(\n this.withNoticeSection(\"about\", noticeAndPolicyP, look, {\n preview: noticeText,\n // Without an SDK label or a preview, a section is titled by the\n // notice's own link copy inside it, which the admin translated.\n fallback: activeConfig.privacy_policy_anchor_text ? policyAnchorText : \"\",\n })\n );\n\n // Purpose section heading: the notice's own, else the SDK default.\n this.purposeHeadingEl = el(\"h2\", {\n id: \"purpose-section-heading\",\n style: { ...styles.subTitle, ...responsive.subTitle, color: headingColor },\n });\n this.purposeHeadingEl.textContent = this.getTranslatedText(\n \"purpose_section_heading\",\n activeConfig.purpose_section_heading || DEFAULT_PURPOSE_SECTION_HEADING\n );\n this.middleSection.appendChild(this.purposeHeadingEl);\n\n // Wraps the purposes and the DPO block. On a sheet, and wherever the\n // sections collapse into panels, it keeps the body's spacing so those\n // panels never sit flush.\n const purposesGroup = el(\"div\", {\n ...part(\"purposes\"),\n style: sheetParts || look.layout.collapsibleSections ? parts.sheetGroup : null,\n });\n this.middleSection.appendChild(purposesGroup);\n this.selectionsEl = el(\"div\", { style: styles.optionsContainer });\n purposesGroup.appendChild(this.selectionsEl);\n\n this.productSections = [];\n this.alreadyConsentedPurposeRefs = null;\n const translate = (key: string, defaultText: string, itemId?: string) =>\n this.getTranslatedText(key, defaultText, itemId);\n const soleSection = this.renderSoleProductSection(state, purposeLook);\n const purposesHost = soleSection ? soleSection.body : this.selectionsEl;\n if (soleSection) this.selectionsEl.appendChild(soleSection.container);\n\n // Already-consented purposes lead, as the reconsent split orders them.\n if (!isMultiProduct(activeConfig.products) && state.alreadyConsentedPurposes.length > 0) {\n this.alreadyConsentedPurposeRefs = renderModalPurposes(state.alreadyConsentedPurposes, {\n selectedPurposes: state.selectedPurposes,\n collapsedPurposes: state.collapsedPurposes,\n selectedDataElements: state.selectedDataElements,\n initialDataElementSelections: state.initialDataElementSelections,\n look: purposeLook,\n isAlreadyConsented: true,\n host: purposesHost,\n getTranslatedText: translate,\n onPurposeToggle: () => {},\n onPurposeCollapse: (uuid) => this.togglePurposeCollapse(uuid),\n onDataElementToggle: () => {},\n });\n }\n\n if (isMultiProduct(activeConfig.products)) {\n const grouped = renderProductGroups({\n groups: groupsOf(activeConfig),\n products: activeConfig.products,\n selectedPurposes: state.selectedPurposes,\n selectedDataElements: state.selectedDataElements,\n collapsedPurposes: state.collapsedPurposes,\n collapsedProducts: state.collapsedProducts,\n consentedProducts: state.consentedProducts,\n consentedPurposes: state.consentedPurposes,\n initialDataElementSelections: state.initialDataElementSelections,\n recordedAnswers: state.recordedAnswers,\n look: purposeLook,\n host: this.selectionsEl,\n getTranslatedText: translate,\n onPurposeToggle: (uuid, productUuid) => this.handlePurposeCheckboxChange(uuid, productUuid),\n onPurposeCollapse: (uuid, productUuid) => this.togglePurposeCollapse(uuid, productUuid),\n onDataElementToggle: (euuid, puuid, productUuid) =>\n this.handleDataElementCheckboxChange(euuid, puuid, productUuid),\n onToggleCollapse: (productUuid) => this.toggleProductCollapse(productUuid),\n onToggleSelect: (productUuid, choice) => this.handleProductCheckboxChange(productUuid, choice),\n });\n this.purposeRefs = grouped.purposeRefs;\n this.productSections = grouped.sections;\n } else if (state.needsConsentPurposes.length > 0) {\n this.purposeRefs = renderModalPurposes(state.needsConsentPurposes, {\n selectedPurposes: state.selectedPurposes,\n collapsedPurposes: state.collapsedPurposes,\n selectedDataElements: state.selectedDataElements,\n recordedAnswers: state.recordedAnswers,\n look: purposeLook,\n isAlreadyConsented: state.isFullyConsentedReviewMode,\n host: purposesHost,\n getTranslatedText: translate,\n onPurposeToggle: (uuid) => this.handlePurposeCheckboxChange(uuid),\n onPurposeCollapse: (uuid) => this.togglePurposeCollapse(uuid),\n onDataElementToggle: (euuid, puuid) => this.handleDataElementCheckboxChange(euuid, puuid),\n });\n } else {\n this.purposeRefs = null;\n }\n\n this.mountOtpGate();\n\n // ─── Additional text, Privacy Center, product policies and DPO ───\n const dpoBlock = this.renderDpoBlock(look, productPolicyLinks, chrome.productPoliciesLabel);\n if (dpoBlock) {\n const centerTitle =\n activeConfig.privacy_center_url && activeConfig.privacy_center_anchor_text\n ? this.getTranslatedText(\n \"privacy_center_anchor_text\",\n activeConfig.privacy_center_anchor_text\n )\n : \"\";\n purposesGroup.appendChild(\n this.withNoticeSection(\"dpo\", dpoBlock, look, {\n preview: dpoPreview,\n fallback: centerTitle,\n })\n );\n }\n\n // Error message\n this.errorEl = el(\"div\", {\n role: \"alert\",\n style: {\n ...(sheetParts\n ? {\n marginTop: isMobile ? \"12px\" : \"16px\",\n marginLeft: isMobile ? \"16px\" : \"24px\",\n marginRight: isMobile ? \"16px\" : \"24px\",\n }\n : {}),\n backgroundColor: \"#FEE2E2\",\n color: \"#DC2626\",\n padding: \"12px\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n border: \"1px solid #FCA5A5\",\n display: \"none\",\n },\n });\n\n // ─── Footer: three actions ───\n const bottomSection = this.renderFooter(state, look);\n\n const contentWrapper = el(\n \"div\",\n { style: sheetParts ? sheetParts.sheetContent : { ...styles.content, ...responsive.content } },\n this.errorEl,\n topSection,\n this.middleSection\n );\n // On a sheet the hint and the actions share one band pinned under the\n // scrolling body, so the hint reads as part of the footer it explains.\n if (sheetParts) {\n contentWrapper.appendChild(el(\"div\", { style: sheetParts.footerBand }, bottomSection));\n } else {\n contentWrapper.appendChild(bottomSection);\n }\n\n this.modalEl.appendChild(contentWrapper);\n this.bottomSectionEl = bottomSection;\n this.confirmHintEl = renderConfirmHint(styles.confirmHint);\n\n // Set initial accept button disabled state\n this.updateAcceptButtonState(state);\n this.updateErrorMessage(state);\n\n // Setup keyboard trap\n this.keyboardCleanup?.();\n this.keyboardCleanup = setupKeyboardTrap(this.modalEl, () => this.handleDecline());\n }\n\n /** The purposes in the order talkback reads them: as the notice shows them. */\n private talkbackPurposes(state: ModalState): PurposeItemData[] {\n const content = state.content?.detail.active_config;\n if (!content) return [];\n if (!isMultiProduct(content.products) && state.alreadyConsentedPurposes.length > 0) {\n return [...state.alreadyConsentedPurposes, ...state.needsConsentPurposes];\n }\n return purposesInRenderOrder(\n content.products,\n content.purposes,\n content.product_purpose_order\n );\n }\n\n private renderDpoBlock(\n look: ModalLook,\n productPolicyLinks: ReturnType<typeof getProductPolicyLinks>,\n policiesLabel: string\n ): HTMLElement | null {\n const activeConfig = this.store.getState().content?.detail.active_config;\n if (!activeConfig) return null;\n // The admin's additional text shows with or without a privacy-center\n // link; the link follows it only when the notice has one.\n const hasPrivacyCenterLine = Boolean(\n activeConfig.privacy_center_url || activeConfig.additional_text\n );\n if (!hasPrivacyCenterLine && !activeConfig.dpo_info && productPolicyLinks.length === 0) {\n return null;\n }\n\n const { styles, responsive } = look;\n const collapsible = look.layout.collapsibleSections;\n const linkStyle = { ...styles.link, color: look.linkColor };\n const footerDiv = el(\"div\", {\n ...part(\"dpo\"),\n style: {\n ...styles.privacyText,\n ...responsive.privacyText,\n color: look.textColor,\n fontSize: responsive.dpoText.fontSize,\n lineHeight: \"1.4\",\n // Inside a disclosure the panel is the separator, and the copy is\n // what the visitor opened it to read.\n ...(collapsible\n ? {}\n : {\n borderTop: \"1px solid rgba(152, 162, 179, 0.3)\",\n paddingTop: \"12px\",\n marginTop: \"12px\",\n }),\n },\n });\n\n const footerP = el(\"p\", { style: { margin: \"0\", opacity: collapsible ? \"1\" : \"0.6\" } });\n\n if (hasPrivacyCenterLine) {\n if (activeConfig.additional_text) {\n const addlSpan = el(\"span\", { id: \"additional-text\" });\n addlSpan.textContent = this.getTranslatedText(\"additional_text\", activeConfig.additional_text);\n footerP.appendChild(addlSpan);\n }\n if (activeConfig.privacy_center_url) {\n if (activeConfig.additional_text) footerP.appendChild(document.createTextNode(\" \"));\n const pcAnchorText = this.getTranslatedText(\n \"privacy_center_anchor_text\",\n activeConfig.privacy_center_anchor_text || \"Privacy Center\"\n );\n this.privacyCenterLinkEl = el(\"a\", {\n id: \"privacy-center-link\",\n href: activeConfig.privacy_center_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: linkStyle,\n }) as HTMLAnchorElement;\n this.privacyCenterLinkEl.textContent = pcAnchorText;\n footerP.appendChild(this.privacyCenterLinkEl);\n footerP.appendChild(document.createTextNode(\".\"));\n }\n }\n\n if (productPolicyLinks.length > 0) {\n if (hasPrivacyCenterLine) {\n footerP.appendChild(el(\"br\"));\n }\n // Each policy is named the way its product heading is: translated.\n footerP.appendChild(\n renderProductPolicyLine({\n label: this.getTranslatedText(\"product_privacy_policies_label\", policiesLabel),\n links: productPolicyLinks.map((link) => ({\n ...link,\n name: this.getTranslatedText(\"products.name\", link.name, link.uuid),\n })),\n linkStyle,\n })\n );\n }\n\n if (activeConfig.dpo_info) {\n const dpo = activeConfig.dpo_info;\n\n if (hasPrivacyCenterLine || productPolicyLinks.length > 0) {\n footerP.appendChild(el(\"br\"));\n }\n\n // Grievance line\n if (dpo.grievance_text) {\n const gText = el(\"span\", { id: \"dpo-grievance-text\" });\n gText.textContent = this.getTranslatedDpoText(\"grievance_text\", dpo.grievance_text);\n footerP.appendChild(gText);\n footerP.appendChild(document.createTextNode(\" \"));\n\n if (dpo.grievance_url) {\n const gLink = el(\"a\", {\n id: \"dpo-grievance-link\",\n href: dpo.grievance_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: linkStyle,\n });\n gLink.textContent = this.getTranslatedDpoText(\n \"grievance_anchor_text\",\n dpo.grievance_anchor_text || \"click here\"\n );\n footerP.appendChild(gLink);\n }\n\n if (dpo.grievance_email) {\n footerP.appendChild(document.createTextNode(\" \"));\n const connectorSpan = el(\"span\", { id: \"dpo-grievance-email-connector\" });\n connectorSpan.textContent = this.getTranslatedDpoText(\n \"grievance_email_connector_text\",\n dpo.grievance_email_connector_text || \"or email to\"\n );\n footerP.appendChild(connectorSpan);\n footerP.appendChild(document.createTextNode(\" \"));\n\n const emailLink = el(\"a\", {\n id: \"dpo-grievance-email\",\n href: `mailto:${dpo.grievance_email}`,\n style: linkStyle,\n });\n emailLink.textContent = dpo.grievance_email;\n footerP.appendChild(emailLink);\n }\n }\n\n // DP Board line\n if (dpo.dp_board_text) {\n footerP.appendChild(el(\"br\"));\n const dpText = el(\"span\", { id: \"dpo-dp-board-text\" });\n dpText.textContent = this.getTranslatedDpoText(\"dp_board_text\", dpo.dp_board_text);\n footerP.appendChild(dpText);\n footerP.appendChild(document.createTextNode(\" \"));\n\n if (dpo.dp_board_url) {\n const dpLink = el(\"a\", {\n id: \"dpo-dp-board-link\",\n href: dpo.dp_board_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: linkStyle,\n });\n dpLink.textContent = this.getTranslatedDpoText(\n \"dp_board_anchor_text\",\n dpo.dp_board_anchor_text || \"here\"\n );\n footerP.appendChild(dpLink);\n }\n }\n\n // DPO line: the console links the DPO by email; a URL is the fallback.\n if (dpo.dpo_text) {\n footerP.appendChild(el(\"br\"));\n const dpoTextSpan = el(\"span\", { id: \"dpo-dpo-text\" });\n dpoTextSpan.textContent = this.getTranslatedDpoText(\"dpo_text\", dpo.dpo_text);\n footerP.appendChild(dpoTextSpan);\n footerP.appendChild(document.createTextNode(\" \"));\n\n const dpoHref = dpo.dpo_email ? `mailto:${dpo.dpo_email}` : dpo.dpo_url;\n if (dpoHref) {\n const dpoLink = el(\"a\", {\n id: \"dpo-dpo-link\",\n href: dpoHref,\n ...(dpo.dpo_email ? {} : { target: \"_blank\", rel: \"noopener noreferrer\" }),\n style: linkStyle,\n });\n dpoLink.textContent = this.getTranslatedDpoText(\n \"dpo_anchor_text\",\n dpo.dpo_anchor_text || \"Click here\"\n );\n footerP.appendChild(dpoLink);\n }\n }\n }\n\n footerDiv.appendChild(footerP);\n return footerDiv;\n }\n\n /**\n * The notice's three actions.\n *\n * wide: [Decline] <-- gap --> [Accept Selected] [Accept All]\n * narrow: [Accept All] / [Accept Selected] / [Decline], stacked full width\n * paired: [Accept All] / [Accept Selected] [Decline] (narrow, paired footer)\n *\n * The children are appended in a different order per breakpoint rather than\n * reordered with CSS, so focus order follows visual order (WCAG 2.4.3).\n */\n private renderFooter(state: ModalState, look: ModalLook): HTMLElement {\n const activeConfig = state.content!.detail.active_config;\n const isMobile = this.mediaQuery.matches;\n const { styles, responsive, sheetParts } = look;\n const review = state.isFullyConsentedReviewMode;\n\n const containerStyle: Style = {\n ...(review\n ? styles.bottomSection\n : isMobile\n ? styles.actionButtonStack\n : styles.actionButtonRow),\n // The band pads the footer; the buttons' own inset would double it.\n ...(sheetParts ? { paddingTop: 0 } : {}),\n color: look.textColor,\n };\n const bottomSection = el(\"div\", { ...part(\"footer\"), style: containerStyle });\n\n const baseButton: Style = {\n ...styles.button,\n ...responsive.button,\n ...(review ? {} : isMobile ? styles.stackButton : styles.rowButton),\n };\n\n // Review mode collapses to the single host-supplied continue button.\n if (review) {\n this.acceptBtn = el(\"button\", {\n id: ACCEPT_SELECTED_BUTTON_ID,\n type: \"button\",\n style: { ...baseButton, ...styles.acceptButton, ...look.buttons.acceptAll },\n onClick: () => this.confirmFirst(\"accept-selected\", () => this.handleAccept(\"selected\")),\n }) as HTMLButtonElement;\n this.acceptBtn.textContent = this.options.reviewModeButtonText || \"Continue\";\n this.acceptAllBtn = null;\n this.declineBtn = null;\n bottomSection.appendChild(this.acceptBtn);\n return bottomSection;\n }\n\n this.acceptAllBtn = el(\"button\", {\n id: ACCEPT_ALL_BUTTON_ID,\n ...part(\"accept-all\"),\n type: \"button\",\n style: { ...baseButton, ...styles.acceptButton, ...look.buttons.acceptAll },\n onClick: () => this.confirmFirst(\"accept-all\", () => this.handleAccept(\"all\")),\n }) as HTMLButtonElement;\n this.acceptAllBtn.textContent = this.getTranslatedText(\n \"accept_all_button_text\",\n activeConfig.accept_all_button_text || DEFAULT_ACCEPT_ALL_BUTTON_TEXT\n );\n\n this.acceptBtn = el(\"button\", {\n id: ACCEPT_SELECTED_BUTTON_ID,\n ...part(\"accept-selected\"),\n type: \"button\",\n style: { ...baseButton, ...styles.acceptSecondaryButton, ...look.buttons.acceptSelected },\n onClick: () => this.confirmFirst(\"accept-selected\", () => this.handleAccept(\"selected\")),\n }) as HTMLButtonElement;\n this.acceptBtn.textContent = this.getTranslatedText(\n \"confirm_button_text\",\n activeConfig.confirm_button_text || DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT\n );\n\n this.declineBtn = el(\"button\", {\n id: DECLINE_BUTTON_ID,\n ...part(\"decline\"),\n type: \"button\",\n style: {\n ...baseButton,\n ...styles.cancelButton,\n ...look.buttons.decline,\n // Only the wide row needs the spacer that pushes the accepts right.\n ...(isMobile ? {} : styles.declineSpacer),\n },\n onClick: () => this.confirmFirst(\"decline\", () => this.handleDecline()),\n }) as HTMLButtonElement;\n this.declineBtn.textContent = this.getTranslatedText(\n \"decline_button_text\",\n activeConfig.decline_button_text || DEFAULT_DECLINE_BUTTON_TEXT\n );\n\n if (isMobile && look.layout.pairedFooter) {\n bottomSection.appendChild(this.acceptAllBtn);\n bottomSection.appendChild(\n el(\"div\", { style: look.parts.actionButtonPair }, this.acceptBtn, this.declineBtn)\n );\n } else if (isMobile) {\n bottomSection.appendChild(this.acceptAllBtn);\n bottomSection.appendChild(this.acceptBtn);\n bottomSection.appendChild(this.declineBtn);\n } else {\n bottomSection.appendChild(this.declineBtn);\n bottomSection.appendChild(this.acceptBtn);\n bottomSection.appendChild(this.acceptAllBtn);\n }\n return bottomSection;\n }\n private getLanguageCode(displayLanguage: string): string {\n const content = this.store.getState().content?.detail.active_config;\n if (!content) return \"English\";\n\n // English maps to \"English\" for audio API\n if (displayLanguage === \"English\" || displayLanguage === \"en\" || displayLanguage === \"EN\") {\n return \"English\";\n }\n\n // If display language exists in translations, use it directly\n if (content.supported_languages_and_translations?.[displayLanguage]) {\n return displayLanguage;\n }\n\n // Fallback to default language or English\n return content.default_language === \"en\" || content.default_language === \"EN\"\n ? \"English\"\n : content.default_language || \"English\";\n }\n\n private getTranslatedDpoText(key: string, defaultText: string): string {\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n if (!content) return defaultText;\n\n const lang = state.selectedLanguage;\n if (lang === \"English\" || lang === \"en\" || lang === \"EN\") return defaultText;\n\n const translations = content.supported_languages_and_translations;\n if (!translations) return defaultText;\n\n const translationMap = translations[lang];\n if (!translationMap?.dpo_info) return defaultText;\n\n const value = (translationMap.dpo_info as any)[key];\n return typeof value === \"string\" && value ? value : defaultText;\n }\n\n private renderError(message: string): void {\n if (!this.modalEl) return;\n\n clearElement(this.modalEl);\n\n const errorContent = el(\n \"div\",\n { style: { ...styles.content, alignItems: \"center\", justifyContent: \"center\" } },\n el(\"div\", {\n role: \"alert\",\n style: {\n backgroundColor: \"#FEE2E2\",\n color: \"#DC2626\",\n padding: \"16px\",\n borderRadius: \"8px\",\n fontSize: \"14px\",\n border: \"1px solid #FCA5A5\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n },\n }, message)\n );\n\n this.modalEl.appendChild(errorContent);\n }\n\n private getTranslatedText(key: string, defaultText: string, itemId?: string): string {\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n if (!content) return defaultText;\n\n const lang = state.selectedLanguage;\n if (lang === \"English\" || lang === \"en\" || lang === \"EN\") {\n if (key === \"privacy_policy_anchor_text\" && content.privacy_policy_anchor_text) {\n return content.privacy_policy_anchor_text;\n }\n return defaultText;\n }\n\n const translations = content.supported_languages_and_translations;\n if (!translations) return defaultText;\n\n const translationMap = translations[lang] as TranslationObject | undefined;\n if (!translationMap) return defaultText;\n\n if (itemId) {\n if (key === \"purposes.name\" || key === \"purposes.description\") {\n const purposeData = translationMap.purposes?.[itemId];\n if (purposeData) {\n if (typeof purposeData === \"string\") {\n return key === \"purposes.name\" ? purposeData : defaultText;\n }\n return key === \"purposes.name\"\n ? purposeData.name || defaultText\n : purposeData.description || defaultText;\n }\n return defaultText;\n }\n if (key === \"products.name\" || key === \"products.description\") {\n const productData = translationMap.products?.[itemId];\n if (productData) {\n if (typeof productData === \"string\") {\n return key === \"products.name\" ? productData : defaultText;\n }\n return key === \"products.name\"\n ? productData.name || defaultText\n : productData.description || defaultText;\n }\n return defaultText;\n }\n if (key.startsWith(\"data_elements.\")) {\n return translationMap.data_elements?.[itemId] || defaultText;\n }\n }\n\n const value = (translationMap as any)[key];\n if (typeof value === \"string\" && value) return value;\n return defaultText;\n }\n\n private handleLanguageSelect(lang: string): void {\n this.store.setState({ selectedLanguage: lang });\n // Rebuild UI to update all translations\n this.rebuildUI();\n }\n\n private togglePurposeCollapse(purposeUuid: string, productUuid?: string): void {\n const state = this.store.getState();\n const key = productPurposeKey(productUuid, purposeUuid);\n this.store.setState({\n collapsedPurposes: {\n ...state.collapsedPurposes,\n [key]: !state.collapsedPurposes[key],\n },\n });\n }\n\n private handlePurposeCheckboxChange(purposeUuid: string, productUuid?: string): void {\n this.otpSession.dropStashedAccept();\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n if (!content) return;\n\n const purpose = content.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose) return;\n\n const next = purposeToggle(purpose, productUuid, state.selectedPurposes);\n this.store.setState({\n selectedPurposes: { ...state.selectedPurposes, ...next.selectedPurposes },\n selectedDataElements: { ...state.selectedDataElements, ...next.selectedDataElements },\n });\n }\n\n private handleDataElementCheckboxChange(\n elementUuid: string,\n purposeUuid: string,\n productUuid?: string\n ): void {\n this.otpSession.dropStashedAccept();\n const state = this.store.getState();\n const content = state.content?.detail.active_config;\n if (!content) return;\n\n const purpose = content.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose) return;\n\n const key = productPurposeKey(productUuid, purposeUuid);\n const combinedId = `${key}-${elementUuid}`;\n const newDataElements = {\n ...state.selectedDataElements,\n [combinedId]: !state.selectedDataElements[combinedId],\n };\n\n this.store.setState({\n selectedDataElements: newDataElements,\n selectedPurposes: {\n ...state.selectedPurposes,\n [key]: purposeCheckedFromElements(purpose, productUuid, newDataElements),\n },\n });\n }\n\n private toggleProductCollapse(productUuid: string): void {\n const state = this.store.getState();\n this.store.setState({\n collapsedProducts: {\n ...state.collapsedProducts,\n [productUuid]: !state.collapsedProducts[productUuid],\n },\n });\n }\n\n private isRowLocked(state: ModalState, purposeUuid: string, productUuid?: string): boolean {\n if (isMultiProduct(state.content?.detail.active_config.products)) {\n return state.consentedPurposes[productPurposeKey(productUuid, purposeUuid)] ?? false;\n }\n return state.alreadyConsentedPurposes.some((purpose) => purpose.uuid === purposeUuid);\n }\n\n private handleProductCheckboxChange(productUuid: string, choice?: boolean): void {\n this.otpSession.dropStashedAccept();\n const state = this.store.getState();\n const section = this.productSections.find((refs) => refs.productUuid === productUuid);\n if (!section) return;\n\n const editable = section.boxPurposes.filter(\n (purpose) => !this.isRowLocked(state, purpose.uuid, section.keyProductUuid)\n );\n if (editable.length === 0) return;\n\n const next = sectionToggle(editable, section.keyProductUuid, state.selectedPurposes, choice);\n this.store.setState({\n selectedPurposes: { ...state.selectedPurposes, ...next.selectedPurposes },\n selectedDataElements: { ...state.selectedDataElements, ...next.selectedDataElements },\n });\n }\n\n private renderSoleProductSection(state: ModalState, look: PurposeLook): ProductSectionRefs | null {\n const content = state.content?.detail.active_config;\n const products = content?.products;\n if (!content || !products || products.length !== 1) return null;\n\n const product = products[0];\n const section = renderProductSection({\n product,\n purposes: content.purposes,\n selectedPurposes: state.selectedPurposes,\n collapsed: state.collapsedProducts[product.uuid] || false,\n locked: state.consentedProducts[product.uuid] ?? state.isFullyConsentedReviewMode,\n isRequired: productIsRequired(products, product.uuid),\n look,\n getTranslatedText: (key, defaultText, itemId) => this.getTranslatedText(key, defaultText, itemId),\n onToggleCollapse: (productUuid) => this.toggleProductCollapse(productUuid),\n onToggleSelect: (productUuid, choice) => this.handleProductCheckboxChange(productUuid, choice),\n });\n this.productSections = [section];\n return section;\n }\n\n private updateProductSections(state: ModalState): void {\n for (const section of this.productSections) {\n updateProductSection(\n section,\n state.selectedPurposes,\n state.collapsedProducts[section.productUuid] || false\n );\n }\n }\n\n /**\n * Shared by all three accept buttons. The mode only decides which\n * purposes/data elements are submitted — everything downstream, including\n * the host's `onAccept` callback, is identical.\n */\n /**\n * Shared by all three accept buttons. The mode only decides which\n * purposes/data elements are submitted — everything downstream, including\n * the host's `onAccept` callback, is identical.\n */\n private async handleAccept(mode: AcceptMode = \"selected\"): Promise<void> {\n const state = this.store.getState();\n if (state.isSubmitting) return;\n\n // Review mode — just close\n if (state.isFullyConsentedReviewMode) {\n this.options.onAccept();\n this.destroy();\n return;\n }\n\n // Block submission for minors who have not completed guardian verification\n if (state.isMinorFlow && !state.verificationReference && !state.selfDeclaredAdult) {\n this.store.setState({\n errorMessage: \"Guardian verification is required before consent can be submitted.\",\n });\n return;\n }\n\n const content = state.content?.detail.active_config;\n if (!content) return;\n const rows = rowsOf(content);\n\n if (this.otpSession.wouldHold(this.options.otpGate)) {\n // The rows stay visible behind the code entry, so they show what will\n // be recorded: a shortcut's selection while it is pending, and the\n // visitor's own ticks again once Accept Selected re-pends.\n if (mode === \"selected\") {\n const own = this.preGateSelection;\n if (own) {\n this.preGateSelection = null;\n this.store.setState(own);\n }\n if (!this.confirmVerdict(this.store.getState()).ok) {\n if (this.otpSession.isLocked) this.holdForOtp(mode);\n return;\n }\n } else {\n this.preGateSelection ??= {\n selectedPurposes: state.selectedPurposes,\n selectedDataElements: state.selectedDataElements,\n };\n this.store.setState(\n buildSelectionForMode(rows, mode, {\n selectedPurposes: state.selectedPurposes,\n selectedDataElements: state.selectedDataElements,\n })\n );\n }\n this.holdForOtp(mode);\n return;\n }\n\n if (mode === \"selected\" && !this.confirmVerdict(state).ok) return;\n\n const selection = buildSelectionForMode(rows, mode, {\n selectedPurposes: state.selectedPurposes,\n selectedDataElements: state.selectedDataElements,\n });\n // Reflect the shortcut's selection in the checkboxes so the notice shows\n // what was sent if the request fails and it stays open.\n if (mode !== \"selected\") {\n this.store.setState({\n selectedPurposes: selection.selectedPurposes,\n selectedDataElements: selection.selectedDataElements,\n });\n }\n\n this.abortController = new AbortController();\n this.store.setState({ isSubmitting: true, isSubmittingAccept: true, errorMessage: null });\n\n try {\n const purposes = submissionPurposes(rows, selection);\n\n await submitConsentEvent({\n accessToken: this.options.accessToken,\n baseUrl: this.endpoints.baseUrl,\n ledgerBaseUrl: this.endpoints.ledgerBaseUrl,\n noticeUuid: state.content!.detail.uuid,\n purposes,\n declined: false,\n meta_data: this.options.applicationId ? { specific_uuid: this.options.applicationId } : undefined,\n guardianVerificationReference: state.verificationReference || undefined,\n selfDeclaredAdult: state.selfDeclaredAdult || undefined,\n language: state.selectedLanguage,\n signal: this.abortController.signal,\n ...this.sandboxParams(),\n });\n\n this.options.onAccept();\n this.destroy();\n } catch (err) {\n if ((err as Error).name === \"AbortError\") return;\n const error = err as Error;\n const message = error.message || \"Failed to submit consent. Please try again.\";\n this.store.setState({ errorMessage: message, isSubmitting: false, isSubmittingAccept: false });\n this.options.onError?.(error);\n }\n }\n private handleDecline(): void {\n this.otpSession.dropStashedAccept();\n const state = this.store.getState();\n if (state.isSubmitting) return;\n\n // Stop any in-flight verification polling and clear the persisted\n // DigiLocker session so the next open starts the flow from scratch\n // (age verification → guardian form → verification screen).\n this.stopPolling();\n clearConsentState();\n\n this.options.onDecline();\n this.destroy();\n }\n\n private updateCheckboxes(state: ModalState): void {\n if (this.purposeRefs) {\n for (const [key, control] of this.purposeRefs.purposeControls) {\n control.setChecked(state.selectedPurposes[key] || false);\n }\n for (const [key, control] of this.purposeRefs.elementControls) {\n control.setChecked(state.selectedDataElements[key] || false);\n }\n }\n this.updateProductSections(state);\n // Update accept button disabled state\n this.updateAcceptButtonState(state);\n }\n\n private confirmVerdict(state: ModalState): ConfirmVerdict {\n const content = state.content?.detail.active_config;\n if (!content) return { ok: false, reason: \"nothing-chosen\", blocking: [] };\n return noticeConfirmVerdict(\n content,\n state.selectedPurposes,\n state.recordedPurposeSelections\n );\n }\n\n private updateConfirmHint(state: ModalState, verdict: ConfirmVerdict): void {\n if (!this.confirmHintEl || !this.bottomSectionEl) return;\n const submitting = state.isSubmittingAccept || state.isSubmittingDecline;\n const chrome = noticeChromeCopy(state.selectedLanguage);\n const text =\n submitting || state.isFullyConsentedReviewMode\n ? null\n : confirmHint(\n verdict,\n state.content?.detail.active_config.products,\n (product) => this.getTranslatedText(\"products.name\", product.name, product.uuid),\n {\n ...CONFIRM_HINT_COPY,\n \"nothing-chosen\": chrome.hintNothingChosen,\n \"nothing-engaged\": chrome.hintNothingEngaged,\n \"required-outstanding\": chrome.hintRequiredOutstanding,\n }\n );\n updateConfirmHint(this.confirmHintEl, this.bottomSectionEl, this.acceptBtn, text);\n }\n private updateAcceptButtonState(state: ModalState): void {\n if (!this.acceptBtn || state.isFullyConsentedReviewMode) return;\n\n const submitting = state.isSubmittingAccept || state.isSubmittingDecline;\n const verdict = this.confirmVerdict(state);\n this.updateConfirmHint(state, verdict);\n // Only \"accept selected\" waits on the required boxes — sparing the two\n // shortcuts that gate is the point of the feature.\n const setDisabled = (btn: HTMLButtonElement | null, disabled: boolean) => {\n if (!btn) return;\n btn.disabled = disabled;\n btn.style.opacity = disabled ? \"0.5\" : \"1\";\n btn.style.cursor = disabled ? \"not-allowed\" : \"pointer\";\n };\n\n setDisabled(this.acceptBtn, !verdict.ok || submitting);\n setDisabled(this.acceptAllBtn, submitting);\n }\n\n private updateCollapseState(state: ModalState): void {\n const updateRefs = (refs: ModalPurposeRefs | null) => {\n if (!refs) return;\n for (const [purposeUuid, container] of refs.dataElementContainers) {\n const isCollapsed = state.collapsedPurposes[purposeUuid];\n\n container.style.display = !isCollapsed && container.childElementCount > 0 ? \"flex\" : \"none\";\n\n const chevron = refs.chevrons.get(purposeUuid);\n if (chevron) {\n (chevron as unknown as HTMLElement).style.transform = !isCollapsed ? \"rotate(90deg)\" : \"rotate(0deg)\";\n }\n\n const collapseBtn = refs.collapseButtons.get(purposeUuid);\n if (collapseBtn) {\n collapseBtn.setAttribute(\"aria-expanded\", String(!isCollapsed));\n }\n }\n };\n\n updateRefs(this.purposeRefs);\n updateRefs(this.alreadyConsentedPurposeRefs);\n }\n\n private updateErrorMessage(state: ModalState): void {\n if (!this.errorEl) return;\n if (state.errorMessage) {\n this.errorEl.textContent = state.errorMessage;\n this.errorEl.style.display = \"block\";\n } else {\n this.errorEl.style.display = \"none\";\n }\n }\n\n // ─── Age Verification Handlers ───\n\n private handleAgeVerificationYes(): void {\n this.store.setState({\n isMinorFlow: false,\n selfDeclaredAdult: true,\n showAgeVerification: false,\n });\n }\n\n private handleAgeVerificationNo(): void {\n this.store.setState({\n showAgeVerification: false,\n showGuardianForm: true,\n });\n }\n\n // ─── Guardian Form Handlers ───\n\n private async handleGuardianFormSubmit(): Promise<void> {\n const state = this.store.getState();\n const errors = validateGuardianForm(state.guardianFormData);\n if (Object.keys(errors).length > 0) {\n if (this.guardianFormRefs) {\n if (errors.guardianName) {\n this.guardianFormRefs.nameError.textContent = errors.guardianName;\n this.guardianFormRefs.nameError.style.display = \"block\";\n }\n if (errors.guardianContact) {\n this.guardianFormRefs.contactError.textContent = errors.guardianContact;\n this.guardianFormRefs.contactError.style.display = \"block\";\n }\n if (errors.guardianRelationship) {\n this.guardianFormRefs.relationshipError.textContent = errors.guardianRelationship;\n this.guardianFormRefs.relationshipError.style.display = \"block\";\n }\n }\n return;\n }\n\n this.store.setState({ isInitiatingVerification: true });\n\n const digilockerMode = this.options.digilockerMode || \"redirect\";\n const callbackUrl = digilockerMode === \"popup\"\n ? new URL(this.options.digilockerCallbackUrl || \"/digilocker-callback\", window.location.origin).href\n : undefined;\n\n try {\n const response = await initiateGuardianVerification({\n accessToken: this.options.accessToken,\n baseUrl: this.endpoints.baseUrl,\n guardianName: state.guardianFormData.guardianName,\n guardianContact: state.guardianFormData.guardianContact,\n guardianRelationship: state.guardianFormData.guardianRelationship,\n frontendCallbackUrl: callbackUrl,\n });\n\n if (response.already_verified && response.verification_reference) {\n this.store.setState({\n verificationReference: response.verification_reference,\n showGuardianForm: false,\n showVerificationScreen: true,\n isInitiatingVerification: false,\n isVerificationComplete: true,\n });\n // Auto-transition to consent form after 1s\n setTimeout(() => {\n this.store.setState({\n showVerificationScreen: false,\n isVerificationComplete: false,\n });\n }, 1000);\n return;\n }\n\n // Save state for redirect flow\n saveConsentState({\n flowState: \"digilocker-pending\",\n sessionToken: response.session_token,\n guardianInfoUuid: response.guardian_info_uuid,\n selectedPurposes: state.selectedPurposes,\n selectedDataElements: state.selectedDataElements,\n timestamp: new Date().toISOString(),\n originalUrl: window.location.href,\n noticeId: this.options.noticeId,\n baseUrl: this.endpoints.baseUrl,\n });\n\n // Show verification screen with \"Opening DigiLocker...\" state\n this.store.setState({\n showGuardianForm: false,\n showVerificationScreen: true,\n isInitiatingVerification: true,\n isPollingStatus: false,\n });\n\n if (digilockerMode === \"popup\" && response.digilocker_redirect_url) {\n const popup = window.open(\n response.digilocker_redirect_url,\n \"digilocker_verification\",\n \"width=600,height=700,scrollbars=yes,resizable=yes\"\n );\n if (popup) {\n this.verificationPopup = popup;\n this.startPopupMonitoring(popup);\n } else {\n this.store.setState({\n isInitiatingVerification: false,\n verificationError: \"Popup blocked. Please allow popups for this site.\",\n canRetryVerification: true,\n });\n return;\n }\n } else if (response.digilocker_redirect_url) {\n const openedWindow = window.open(response.digilocker_redirect_url, \"_blank\");\n if (!openedWindow) {\n this.store.setState({\n isInitiatingVerification: false,\n verificationError: \"Unable to open DigiLocker. Please allow popups.\",\n canRetryVerification: true,\n });\n return;\n }\n try { openedWindow.opener = null; } catch {}\n }\n\n // Switch to polling state (spinner + \"Please complete verification...\" message)\n this.store.setState({\n isInitiatingVerification: false,\n isPollingStatus: true,\n });\n this.startStatusPolling(response.session_token!);\n } catch (error) {\n this.store.setState({ isInitiatingVerification: false });\n const err = error as Error & { status?: number };\n if (this.guardianFormRefs) {\n this.guardianFormRefs.generalError.textContent = err.message || \"Failed to initiate verification.\";\n this.guardianFormRefs.generalError.style.display = \"block\";\n }\n }\n }\n\n // ─── Verification Polling ───\n\n private startStatusPolling(token: string): void {\n this.verificationSessionToken = token;\n let attempts = 0;\n let consecutiveErrors = 0;\n let paused = false;\n const MAX_ATTEMPTS = 40;\n const MAX_CONSECUTIVE_ERRORS = 3;\n const POLL_INTERVAL = 3000;\n\n const poll = async () => {\n if (paused) return;\n attempts++;\n\n if (attempts > MAX_ATTEMPTS) {\n this.stopPolling();\n this.store.setState({\n verificationError: \"Verification is taking longer than expected. Please try again.\",\n verificationErrorCode: \"SESSION_EXPIRED\",\n canRetryVerification: true,\n isPollingStatus: false,\n });\n return;\n }\n\n try {\n const response = await verifyGuardianStatus({\n accessToken: this.options.accessToken,\n baseUrl: this.endpoints.baseUrl,\n sessionToken: token,\n });\n\n consecutiveErrors = 0;\n\n if (response.status === \"verified\") {\n this.stopPolling();\n const ref = response.verification_reference || response.guardian_details?.verification_reference;\n if (!ref) {\n this.store.setState({\n verificationError: \"Verification completed but no reference received. Please try again.\",\n canRetryVerification: true,\n isPollingStatus: false,\n });\n return;\n }\n this.store.setState({\n verificationReference: ref,\n isVerificationComplete: true,\n isPollingStatus: false,\n });\n clearConsentState();\n return;\n }\n\n if (response.status === \"failed\" || response.status === \"expired\") {\n this.stopPolling();\n this.store.setState({\n verificationError: getVerificationErrorMessage(response.error_code, response.error),\n verificationErrorCode: response.error_code,\n canRetryVerification: response.can_retry,\n isPollingStatus: false,\n });\n return;\n }\n\n if (!paused) {\n this.statusPollTimeout = setTimeout(poll, POLL_INTERVAL);\n }\n } catch (error) {\n const err = error as Error & { status?: number };\n if (err.status === 404 || err.status === 410) {\n this.stopPolling();\n this.store.setState({\n verificationError: \"Verification session not found or expired.\",\n verificationErrorCode: \"SESSION_EXPIRED\",\n canRetryVerification: true,\n isPollingStatus: false,\n });\n return;\n }\n\n consecutiveErrors++;\n if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {\n this.stopPolling();\n this.store.setState({\n verificationError: err.message || \"Unable to check verification status.\",\n canRetryVerification: true,\n isPollingStatus: false,\n });\n return;\n }\n\n this.statusPollTimeout = setTimeout(poll, POLL_INTERVAL);\n }\n };\n\n // Pause when tab hidden, resume on return\n this.visibilityChangeHandler = () => {\n if (document.hidden) {\n paused = true;\n if (this.statusPollTimeout) {\n clearTimeout(this.statusPollTimeout);\n this.statusPollTimeout = null;\n }\n } else {\n paused = false;\n poll();\n }\n };\n document.addEventListener(\"visibilitychange\", this.visibilityChangeHandler);\n\n this.statusPollTimeout = setTimeout(poll, POLL_INTERVAL);\n }\n\n private stopPolling(): void {\n if (this.statusPollTimeout) {\n clearTimeout(this.statusPollTimeout);\n this.statusPollTimeout = null;\n }\n if (this.popupCheckInterval) {\n clearInterval(this.popupCheckInterval);\n this.popupCheckInterval = null;\n }\n if (this.visibilityChangeHandler) {\n document.removeEventListener(\"visibilitychange\", this.visibilityChangeHandler);\n this.visibilityChangeHandler = null;\n }\n this.verificationPopup?.close();\n this.verificationPopup = null;\n }\n\n private startPopupMonitoring(popup: Window): void {\n this.popupCheckInterval = setInterval(() => {\n if (popup.closed) {\n if (this.popupCheckInterval) {\n clearInterval(this.popupCheckInterval);\n this.popupCheckInterval = null;\n }\n }\n }, 500);\n }\n\n // ─── Verification Screen Handlers ───\n\n private handleVerificationContinue(): void {\n this.store.setState({\n showVerificationScreen: false,\n isVerificationComplete: false,\n });\n }\n\n private handleVerificationRetry(): void {\n this.store.setState({\n showVerificationScreen: false,\n showGuardianForm: true,\n verificationError: null,\n verificationErrorCode: null,\n canRetryVerification: false,\n isVerificationComplete: false,\n });\n }\n\n private handleChangeGuardian(): void {\n this.store.setState({\n showVerificationScreen: false,\n showGuardianForm: true,\n verificationError: null,\n verificationErrorCode: null,\n canRetryVerification: false,\n isVerificationComplete: false,\n guardianFormData: { guardianName: \"\", guardianContact: \"\", guardianRelationship: \"\" },\n });\n }\n\n // ─── TTS ───\n\n /** The talkback control's glyph: a speaker, or a pause while it plays. */\n private speakerIcon(playing: boolean): SVGElement {\n const stroke = this.look?.appearance.colors.language_text || \"currentColor\";\n const attrs = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke,\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"aria-hidden\": \"true\",\n };\n return playing\n ? svg(\n \"svg\",\n attrs,\n svg(\"rect\", { x: \"6\", y: \"4\", width: \"4\", height: \"16\" }),\n svg(\"rect\", { x: \"14\", y: \"4\", width: \"4\", height: \"16\" })\n )\n : svg(\n \"svg\",\n attrs,\n svg(\"polygon\", { points: \"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" }),\n svg(\"path\", { d: \"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\" })\n );\n }\n\n private updateTTSButton(): void {\n if (!this.ttsButton || !this.ttsManager) return;\n\n // When the current language has no TTS audio (e.g. Santali in some\n // configs), hide the speaker icon entirely. Without this branch the\n // button would keep whatever display value it had from the previous\n // language and clicking it would replay the previous language's audio.\n if (!this.ttsManager.isAvailable) {\n this.ttsButton.style.display = \"none\";\n return;\n }\n\n this.ttsButton.style.display = \"flex\";\n clearElement(this.ttsButton);\n const playing = this.ttsManager.isPlaying;\n this.ttsButton.appendChild(this.speakerIcon(playing));\n\n if (playing) {\n this.ttsButton.setAttribute(\"aria-label\", \"Pause audio playback\");\n this.ttsButton.setAttribute(\"title\", \"Pause Talkback\");\n } else {\n this.ttsButton.setAttribute(\"aria-label\", this.ttsManager.isPaused ? \"Resume audio playback\" : \"Start audio playback\");\n this.ttsButton.setAttribute(\"title\", this.ttsManager.isPaused ? \"Resume Talkback\" : \"Start Talkback\");\n }\n }\n\n private updateButtonStates(state: ModalState): void {\n const content = state.content?.detail.active_config;\n\n // All three accept buttons submit through the same path, so a submission\n // in flight busies every one of them.\n const applySubmittingState = (\n btn: HTMLButtonElement | null,\n idleLabel: string\n ) => {\n if (!btn) return;\n btn.textContent = state.isSubmittingAccept\n ? SUBMITTING_BUTTON_TEXT\n : idleLabel;\n btn.disabled = state.isSubmittingAccept;\n btn.style.opacity = state.isSubmittingAccept ? \"0.7\" : \"1\";\n btn.style.cursor = state.isSubmittingAccept ? \"not-allowed\" : \"pointer\";\n };\n\n applySubmittingState(\n this.acceptBtn,\n state.isFullyConsentedReviewMode\n ? this.options.reviewModeButtonText || \"Continue\"\n : this.getTranslatedText(\n \"confirm_button_text\",\n content?.confirm_button_text || DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT\n )\n );\n applySubmittingState(\n this.acceptAllBtn,\n this.getTranslatedText(\n \"accept_all_button_text\",\n content?.accept_all_button_text || DEFAULT_ACCEPT_ALL_BUTTON_TEXT\n )\n );\n\n if (this.declineBtn) {\n this.declineBtn.disabled = state.isSubmitting;\n this.declineBtn.style.opacity = state.isSubmitting ? \"0.7\" : \"1\";\n this.declineBtn.style.cursor = state.isSubmitting ? \"not-allowed\" : \"pointer\";\n }\n\n // Re-apply the required-elements gate, which `applySubmittingState` above\n // deliberately does not know about.\n this.updateAcceptButtonState(state);\n }\n}\n","export const inlineStyles = {\n root: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"16px\",\n fontFamily: \"inherit\",\n },\n\n // The embed's own panel, drawn only when the console palette sets a\n // background: its text colours are chosen for that background, not the\n // host's card, so a dark palette would otherwise vanish on a light host.\n paintedRoot: {\n padding: \"16px\",\n boxSizing: \"border-box\",\n },\n\n optionItem: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionLeft: {\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"center\",\n cursor: \"pointer\",\n flexGrow: 1,\n minWidth: 0,\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionTextContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n },\n\n optionTitle: {\n fontWeight: 500,\n fontSize: \"16px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#101828\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n optionDescription: {\n fontWeight: 400,\n fontSize: \"12px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#475467\",\n verticalAlign: \"middle\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n checkboxLarge: {\n height: \"20px\",\n width: \"20px\",\n padding: \"4px\",\n borderRadius: \"5px\",\n border: \"2px solid #d0d5dd\",\n margin: 0,\n boxSizing: \"border-box\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n backgroundColor: \"transparent\",\n },\n\n dataElementsContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n paddingLeft: \"22px\",\n },\n\n dataElementItem: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n justifyContent: \"space-between\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n minHeight: \"24px\",\n },\n\n productHeading: {\n fontWeight: 500,\n fontSize: \"16px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n margin: \"0 0 8px\",\n padding: 0,\n textAlign: \"left\",\n },\n\n dataElementText: {\n fontWeight: 400,\n fontSize: \"14px\",\n lineHeight: \"150%\",\n letterSpacing: \"0.2px\",\n color: \"#344054\",\n margin: 0,\n padding: 0,\n textAlign: \"left\",\n },\n\n checkboxSmall: {\n height: \"16px\",\n width: \"16px\",\n padding: \"4px\",\n borderRadius: \"5px\",\n border: \"2px solid #d0d5dd\",\n margin: 0,\n boxSizing: \"border-box\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n backgroundColor: \"transparent\",\n },\n\n loadingContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2rem\",\n minHeight: \"200px\",\n margin: 0,\n boxSizing: \"border-box\",\n },\n\n loadingSpinner: {\n width: \"40px\",\n height: \"40px\",\n border: \"4px solid #f3f3f3\",\n borderTop: \"4px solid #3498db\",\n borderRadius: \"50%\",\n animation: \"spin 1s linear infinite\",\n marginBottom: \"1rem\",\n boxSizing: \"border-box\",\n },\n} as const;\n","import { isBlockingRequiredElement } from \"../modal/consentSelection\";\nimport { noticePurposeRows, productPurposeKey } from \"../core/productMatrix\";\nimport type { ProductLike } from \"../types\";\nimport type { Purpose } from \"../api/types\";\nimport type {\n InlineElementFlags,\n InlineNoticePurpose,\n InlinePurposeRow,\n InlineSelectablePurpose,\n InlineSelection,\n} from \"./types\";\n\nexport { isBlockingRequiredElement };\n\nexport const hasBlockingRequiredElement = (purpose: {\n data_elements: Array<{ enabled: boolean; required: boolean }>;\n}): boolean => purpose.data_elements.some(isBlockingRequiredElement);\n\nexport const inlineElementKey = (\n productUuid: string | undefined,\n purposeUuid: string,\n elementUuid: string\n): string => `${productPurposeKey(productUuid, purposeUuid)}-${elementUuid}`;\n\nexport const inlinePurposeRows = <P extends ProductLike, U extends InlineSelectablePurpose>(config: {\n products?: P[];\n purposes: U[];\n product_purpose_order?: Record<string, string[]>;\n}): InlinePurposeRow<U>[] =>\n noticePurposeRows(config.products, config.purposes, config.product_purpose_order);\n\nexport const initialCollapsedPurposes = <U extends InlineSelectablePurpose>(\n rows: InlinePurposeRow<U>[]\n): Record<string, boolean> =>\n rows.reduce<Record<string, boolean>>((acc, row) => {\n acc[productPurposeKey(row.productUuid, row.purpose.uuid)] = true;\n return acc;\n }, {});\n\nexport const initialSelection = <U extends InlineSelectablePurpose>(\n rows: InlinePurposeRow<U>[]\n): InlineSelection => {\n const selectedPurposes: Record<string, boolean> = {};\n const selectedDataElements: Record<string, boolean> = {};\n rows.forEach(({ purpose, productUuid }) => {\n selectedPurposes[productPurposeKey(productUuid, purpose.uuid)] = false;\n purpose.data_elements.forEach((element) => {\n selectedDataElements[inlineElementKey(productUuid, purpose.uuid, element.uuid)] = false;\n });\n });\n return { selectedPurposes, selectedDataElements };\n};\n\nexport const allRequiredElementsChecked = <U extends InlineSelectablePurpose>(\n rows: InlinePurposeRow<U>[],\n selectedDataElements: Record<string, boolean>\n): boolean =>\n rows.every(({ purpose, productUuid }) =>\n purpose.data_elements\n .filter(isBlockingRequiredElement)\n .every((element) =>\n Boolean(selectedDataElements[inlineElementKey(productUuid, purpose.uuid, element.uuid)])\n )\n );\n\nexport const withPurposeElements = (\n purpose: InlineSelectablePurpose,\n productUuid: string | undefined,\n selected: boolean,\n selectedDataElements: Record<string, boolean>\n): Record<string, boolean> => {\n const updated = { ...selectedDataElements };\n purpose.data_elements.forEach((element) => {\n updated[inlineElementKey(productUuid, purpose.uuid, element.uuid)] =\n selected && element.enabled;\n });\n return updated;\n};\n\nexport const toggleDataElement = (\n purpose: InlineSelectablePurpose,\n elementUuid: string,\n productUuid: string | undefined,\n selectedDataElements: Record<string, boolean>\n): { selectedDataElements: Record<string, boolean>; purposeSelected: boolean } => {\n const combinedId = inlineElementKey(productUuid, purpose.uuid, elementUuid);\n const next = { ...selectedDataElements, [combinedId]: !selectedDataElements[combinedId] };\n const isTicked = (element: InlineElementFlags) =>\n Boolean(next[inlineElementKey(productUuid, purpose.uuid, element.uuid)]);\n const requiredElements = purpose.data_elements.filter(isBlockingRequiredElement);\n const purposeSelected =\n requiredElements.length > 0\n ? requiredElements.every(isTicked)\n : purpose.data_elements.some(isTicked);\n return { selectedDataElements: next, purposeSelected };\n};\n\nexport const buildInlineSubmitPurposes = (\n rows: InlinePurposeRow<InlineNoticePurpose>[],\n { selectedPurposes, selectedDataElements }: InlineSelection\n): Purpose[] =>\n rows.map(({ purpose, productUuid }) => {\n const key = productPurposeKey(productUuid, purpose.uuid);\n const isTicked = (elementUuid: string) =>\n selectedDataElements[`${key}-${elementUuid}`] || false;\n const hasSelectedRequiredElement = purpose.data_elements.some(\n (element) => element.required && isTicked(element.uuid)\n );\n const hasSelectedDataElement = purpose.data_elements.some((element) =>\n isTicked(element.uuid)\n );\n const purposeSelected =\n selectedPurposes[key] || hasSelectedRequiredElement || hasSelectedDataElement;\n return {\n ...purpose,\n ...(productUuid ? { product_uuid: productUuid } : {}),\n selected: purposeSelected,\n data_elements: purpose.data_elements.map((element) => ({\n ...element,\n selected: isTicked(element.uuid),\n })),\n };\n });\n\nexport const inlineSubmissionKey = (\n accessToken: string | undefined,\n configUuid: string | undefined,\n { selectedPurposes, selectedDataElements }: InlineSelection\n): string =>\n JSON.stringify([accessToken ?? null, configUuid ?? null, selectedPurposes, selectedDataElements]);\n\nexport const isRetryableFailure = (error: unknown): boolean => {\n const status = (error as { status?: unknown } | null)?.status;\n return typeof status !== \"number\" || status >= 500;\n};\n","import { el, svg } from \"../core/dom\";\nimport { createRequiredMarker } from \"../core/required-marker\";\nimport { part } from \"../appearance/parts\";\nimport { inlineStyles } from \"../styles/inline\";\nimport { DEFAULT_SELECTION_CONTROL } from \"../constants\";\nimport {\n groupPurposesByProduct,\n isMultiProduct,\n productPurposeKey,\n} from \"../core/productMatrix\";\nimport { renderSelectionControl } from \"../modal/selection-control\";\nimport { hasBlockingRequiredElement, inlinePurposeRows, isBlockingRequiredElement } from \"./selection\";\nimport type { PurposeItemData } from \"../api/types\";\nimport type { SelectionControlRefs } from \"../types\";\nimport type { InlinePurposeRenderOptions } from \"./types\";\n\nexport type PurposeRenderRefs = {\n container: HTMLElement;\n /** Purpose controls, keyed by the row's state key. */\n purposeControls: Map<string, SelectionControlRefs>;\n /** Data element checkboxes, keyed `${stateKey}-${elementUuid}`. */\n checkboxes: Map<string, HTMLInputElement>;\n collapseButtons: Map<string, HTMLElement>;\n dataElementContainers: Map<string, HTMLElement>;\n chevrons: Map<string, SVGElement>;\n titleElements: Map<string, HTMLElement>;\n descriptionElements: Map<string, HTMLElement>;\n dataElementLabels: Map<string, HTMLElement>;\n};\n\nexport function renderInlinePurposes(\n purposes: PurposeItemData[],\n options: InlinePurposeRenderOptions\n): PurposeRenderRefs {\n const {\n selectedPurposes,\n collapsedPurposes,\n selectedDataElements,\n products,\n productPurposeOrder,\n settings,\n look,\n isMobile,\n getTranslatedText,\n onPurposeToggle,\n onPurposeCollapse,\n onDataElementToggle,\n } = options;\n\n const purposeControls = new Map<string, SelectionControlRefs>();\n const checkboxes = new Map<string, HTMLInputElement>();\n const collapseButtons = new Map<string, HTMLElement>();\n const dataElementContainers = new Map<string, HTMLElement>();\n const chevrons = new Map<string, SVGElement>();\n const titleElements = new Map<string, HTMLElement>();\n const descriptionElements = new Map<string, HTMLElement>();\n const dataElementLabels = new Map<string, HTMLElement>();\n\n const styles = look?.styles ?? inlineStyles;\n const responsive = look?.responsive ?? {\n optionTitle: { fontSize: isMobile ? \"14px\" : \"16px\" },\n optionDescription: { fontSize: isMobile ? \"11px\" : \"12px\" },\n dataElementText: { fontSize: isMobile ? \"12px\" : \"14px\" },\n };\n const headingColor = look?.headingColor ?? settings?.headingColor ?? \"#101828\";\n const textColor = look?.textColor ?? settings?.textColor ?? \"#344054\";\n const descriptionColor = look?.descriptionColor ?? textColor;\n const chevronColor = look?.chevronColor ?? settings?.headingColor ?? \"#323B4B\";\n const selectionControl =\n look?.selectionControl ?? settings?.selectionControl ?? DEFAULT_SELECTION_CONTROL;\n\n const container = el(\"div\", {\n style: { display: \"flex\", flexDirection: \"column\", gap: \"16px\" },\n });\n\n const renderPurpose = (purpose: PurposeItemData, productUuid?: string): HTMLElement => {\n const stateKey = productPurposeKey(productUuid, purpose.uuid);\n const purposeWrapper = el(\"div\");\n const purposeName = getTranslatedText(\"purposes.name\", purpose.name, purpose.uuid);\n\n const chevron = svg(\n \"svg\",\n {\n width: \"7\",\n height: \"12\",\n viewBox: \"0 0 7 12\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: chevronColor,\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n style: {\n transform: !collapsedPurposes[stateKey] ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.3s ease\",\n },\n \"aria-hidden\": \"true\",\n },\n svg(\"path\", { d: \"M1 1L6 6L1 11\" })\n );\n chevrons.set(stateKey, chevron);\n\n const chevronContainer = el(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginLeft: \"5px\",\n },\n },\n chevron\n );\n\n const titleEl = el(\"h2\", {\n ...part(\"purpose-title\"),\n style: {\n ...styles.optionTitle,\n ...responsive.optionTitle,\n color: headingColor,\n },\n });\n // Appended after `textContent`, which replaces every existing child.\n titleEl.textContent = purposeName;\n if (hasBlockingRequiredElement(purpose)) {\n titleEl.appendChild(createRequiredMarker());\n }\n titleElements.set(stateKey, titleEl);\n\n const descEl = el(\"h3\", {\n style: {\n ...styles.optionDescription,\n ...responsive.optionDescription,\n color: descriptionColor,\n },\n });\n descEl.textContent = getTranslatedText(\"purposes.description\", purpose.description, purpose.uuid);\n descriptionElements.set(stateKey, descEl);\n\n const textContainer = el(\"div\", { style: styles.optionTextContainer }, titleEl, descEl);\n\n const collapseBtn = el(\"div\", {\n style: styles.optionLeft,\n role: \"button\",\n tabIndex: \"0\",\n \"aria-expanded\": String(!collapsedPurposes[stateKey]),\n \"aria-controls\": `purpose-${stateKey}`,\n \"aria-label\": `${collapsedPurposes[stateKey] ? \"Expand\" : \"Collapse\"} ${purposeName} details`,\n onClick: () => onPurposeCollapse(purpose.uuid, productUuid),\n onKeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onPurposeCollapse(purpose.uuid, productUuid);\n }\n },\n }, chevronContainer, textContainer);\n collapseButtons.set(stateKey, collapseBtn);\n\n // The console's selection control, as the banner draws it.\n const purposeControl = renderSelectionControl({\n control: selectionControl,\n checked: selectedPurposes[stateKey] || false,\n onSelect: () => onPurposeToggle(purpose.uuid, productUuid),\n label: `Select all data elements for ${purposeName}`,\n groupName: `redacto-inline-purpose-${stateKey}`,\n size: \"small\",\n language: options.language,\n });\n purposeControls.set(stateKey, purposeControl);\n\n const optionRow = el(\n \"div\",\n { ...part(\"purpose\"), style: styles.optionItem },\n collapseBtn,\n purposeControl.element\n );\n\n const deContainer = el(\"div\", {\n id: `purpose-${stateKey}`,\n style: styles.dataElementsContainer,\n });\n\n if (purpose.data_elements && purpose.data_elements.length > 0) {\n for (const dataElement of purpose.data_elements) {\n const combinedId = `${stateKey}-${dataElement.uuid}`;\n const elementName = getTranslatedText(\"data_elements.name\", dataElement.name, dataElement.uuid);\n\n const labelSpan = el(\"span\", {\n style: {\n ...styles.dataElementText,\n ...responsive.dataElementText,\n color: textColor,\n },\n });\n labelSpan.textContent = elementName;\n dataElementLabels.set(combinedId, labelSpan);\n\n if (isBlockingRequiredElement(dataElement)) {\n labelSpan.appendChild(createRequiredMarker());\n }\n\n const deCheckbox = el(\"input\", {\n className: \"redacto-checkbox-small\",\n type: \"checkbox\",\n checked: selectedDataElements[combinedId] || false,\n \"aria-label\": `Select ${elementName}${isBlockingRequiredElement(dataElement) ? \" (required)\" : \"\"}`,\n onChange: () => onDataElementToggle(dataElement.uuid, purpose.uuid, productUuid),\n }) as HTMLInputElement;\n checkboxes.set(combinedId, deCheckbox);\n\n const deRow = el(\n \"div\",\n { ...part(\"data-element\"), style: styles.dataElementItem },\n labelSpan,\n deCheckbox\n );\n deContainer.appendChild(deRow);\n }\n }\n\n dataElementContainers.set(stateKey, deContainer);\n\n if (!collapsedPurposes[stateKey] && purpose.data_elements?.length > 0) {\n deContainer.style.display = \"flex\";\n } else {\n deContainer.style.display = \"none\";\n }\n\n purposeWrapper.appendChild(optionRow);\n purposeWrapper.appendChild(deContainer);\n return purposeWrapper;\n };\n\n if (!isMultiProduct(products)) {\n // In the order the admin saved for the sole product.\n for (const { purpose } of inlinePurposeRows({\n products,\n purposes,\n product_purpose_order: productPurposeOrder,\n })) {\n container.appendChild(renderPurpose(purpose));\n }\n } else {\n for (const group of groupPurposesByProduct(products, purposes, productPurposeOrder)) {\n const heading = el(\"div\", {\n ...part(\"product\"),\n style: { ...styles.productHeading, color: headingColor },\n });\n heading.textContent = getTranslatedText(\"products.name\", group.product.name, group.product.uuid);\n if (group.product.mandatory) {\n heading.appendChild(createRequiredMarker());\n }\n const section = el(\n \"div\",\n { style: { display: \"flex\", flexDirection: \"column\", gap: \"16px\" } },\n heading\n );\n for (const purpose of group.purposes) {\n section.appendChild(renderPurpose(purpose, group.product.uuid));\n }\n container.appendChild(section);\n }\n }\n\n return {\n container,\n purposeControls,\n checkboxes,\n collapseButtons,\n dataElementContainers,\n chevrons,\n titleElements,\n descriptionElements,\n dataElementLabels,\n };\n}\n","import {\n NOTICE_ROOT_ATTRIBUTE,\n resolveNoticeLayout,\n type ResolvedNoticeAppearance,\n} from \"../shared/appearance\";\nimport {\n CONTROL_ATTRIBUTE,\n NOTICE_ID_ATTRIBUTE,\n STYLE_RADII,\n SWITCH_CONTROL,\n} from \"../appearance/constants\";\nimport { resolveNoticeLook } from \"../appearance/host-settings\";\nimport { part } from \"../appearance/parts\";\nimport { scaleFontSizes, textScaleFactor } from \"../appearance/text-scale\";\nimport { buildThemeCssVariables } from \"../appearance/theme-vars\";\nimport type { Style } from \"../appearance/types\";\nimport { DEFAULT_SELECTION_CONTROL, NOTICE_FONT_ROOT_ATTRIBUTE } from \"../constants\";\nimport { inlineStyles } from \"../styles/inline\";\nimport type { ActiveConfig, SelectionControlType, Settings } from \"../api/types\";\n\ntype InlineStyles = { [K in keyof typeof inlineStyles]: Style };\n\nexport type InlineLookInput = Readonly<{\n noticeId: string;\n content: ActiveConfig | null;\n settings?: Partial<Settings>;\n prefersDark: boolean;\n isMobile: boolean;\n fontFamily: string;\n}>;\n\n/**\n * What the inline embed draws with. It sits in the host's own card, so it\n * takes the console's text and control colours, the selection control and the\n * text scale, and paints a panel of its own only when the palette sets a\n * background its text colours were chosen for.\n */\nexport type InlineLook = Readonly<{\n appearance: ResolvedNoticeAppearance;\n styles: InlineStyles;\n responsive: Record<string, Style>;\n headingColor: string;\n textColor: string;\n descriptionColor: string;\n chevronColor: string;\n selectionControl: SelectionControlType;\n drawsSwitches: boolean;\n rootStyle: Style;\n rootVariables: Record<string, string>;\n rootAttributes: Record<string, string>;\n}>;\n\nexport const buildInlineLook = ({\n noticeId,\n content,\n settings,\n prefersDark,\n isMobile,\n fontFamily,\n}: InlineLookInput): InlineLook => {\n const appearance = resolveNoticeLook(content?.appearance, settings, prefersDark);\n const { colors } = appearance;\n const drawsSwitches = resolveNoticeLayout(appearance).switchControl;\n const factor = textScaleFactor(appearance);\n const styles = scaleFontSizes(inlineStyles as InlineStyles, factor);\n const responsive = scaleFontSizes(\n {\n optionTitle: { fontSize: isMobile ? \"14px\" : \"16px\" },\n optionDescription: { fontSize: isMobile ? \"11px\" : \"12px\" },\n dataElementText: { fontSize: isMobile ? \"12px\" : \"14px\" },\n },\n factor\n );\n const textColor = colors.text || \"#344054\";\n // The brand accent, applied to the embed's native controls. Absent unless\n // the admin set one, so the browser's own default stays as it always was.\n const accent = colors.toggle_on ?? colors.accept_all_bg;\n\n const rootStyle: Style = {\n ...styles.root,\n ...(colors.background\n ? {\n ...styles.paintedRoot,\n backgroundColor: colors.background,\n borderRadius: appearance.radius || STYLE_RADII[appearance.style].modal,\n }\n : {}),\n // Inherited by what draws no colour of its own (the Yes / No labels).\n ...(colors.text ? { color: colors.text } : {}),\n fontFamily,\n ...(accent ? { accentColor: accent } : {}),\n };\n\n return {\n appearance,\n styles,\n responsive,\n headingColor: colors.heading || \"#101828\",\n textColor,\n descriptionColor: colors.muted_text || textColor,\n chevronColor: colors.heading || \"#323B4B\",\n selectionControl: appearance.selectionControl ?? DEFAULT_SELECTION_CONTROL,\n drawsSwitches,\n rootStyle,\n rootVariables: buildThemeCssVariables(colors),\n // The admin's custom CSS is scoped to the element carrying the notice id;\n // the switch stylesheet to a notice root that asks for switches.\n rootAttributes: {\n [NOTICE_ID_ATTRIBUTE]: noticeId,\n [NOTICE_ROOT_ATTRIBUTE]: \"\",\n [NOTICE_FONT_ROOT_ATTRIBUTE]: \"\",\n ...(drawsSwitches ? { [CONTROL_ATTRIBUTE]: SWITCH_CONTROL } : {}),\n ...part(\"root\"),\n },\n };\n};\n","import { Store } from \"../core/state\";\nimport { createMediaQuery, type MediaQuerySubscription } from \"../core/media-query\";\nimport { el, applyStyles, clearElement } from \"../core/dom\";\nimport { fetchConsentContentPublic, submitConsentEventPublic } from \"../api\";\nimport { resolveDisplayLanguage } from \"../api/language\";\nimport {\n fetchNoticeConsentStatusForScope,\n isNoticeFullyConsented,\n} from \"../api/notice-consent-status\";\nimport { resolveEndpointOptions, type ResolvedEndpoints } from \"../shared/endpoints\";\nimport { injectCheckboxStyles } from \"../styles/inject\";\nimport { inlineStyles } from \"../styles/inline\";\nimport { renderInlinePurposes, type PurposeRenderRefs } from \"./purposes\";\nimport { buildInlineLook, type InlineLook } from \"./look\";\nimport { DARK_SCHEME_QUERY } from \"../appearance/constants\";\nimport { NoticeCustomCss } from \"../appearance/custom-css\";\nimport { injectSwitchStyles } from \"../appearance/stylesheets\";\nimport { applyCssVariables } from \"../appearance/theme-vars\";\nimport { openConfirmDialog } from \"../modal/confirm-dialog\";\nimport { injectNoticeFontStyles, resolveNoticeFontFamily } from \"../modal/notice-font\";\nimport {\n buildPreselection,\n preselectionForRows,\n resolvePurposePreselection,\n} from \"../modal/preselection\";\nimport { NOTICE_FONT_ROOT_ATTRIBUTE } from \"../constants\";\nimport { productPurposeKey } from \"../core/productMatrix\";\nimport {\n allRequiredElementsChecked,\n buildInlineSubmitPurposes,\n initialCollapsedPurposes,\n initialSelection,\n inlinePurposeRows,\n inlineSubmissionKey,\n isRetryableFailure,\n toggleDataElement,\n withPurposeElements,\n} from \"./selection\";\nimport type { ConfirmDialogRefs, InlineOptions } from \"../types\";\nimport type { ActiveConfig, TranslationObject } from \"../api/types\";\n\ntype InlineState = {\n content: ActiveConfig | null;\n isLoading: boolean;\n isSubmitting: boolean;\n selectedLanguage: string;\n collapsedPurposes: Record<string, boolean>;\n selectedPurposes: Record<string, boolean>;\n selectedDataElements: Record<string, boolean>;\n hasAlreadyConsented: boolean;\n // Blocks auto-submit while the Go ledger check-consent read is in flight,\n // so an already-consented principal is not re-submitted post-cutover.\n isCheckingConsent: boolean;\n fetchError: Error | null;\n errorMessage: string | null;\n};\n\n/** The selection a confirm answer was given for. */\nconst selectionSignature = (state: {\n selectedPurposes: Record<string, boolean>;\n selectedDataElements: Record<string, boolean>;\n}): string => JSON.stringify([state.selectedPurposes, state.selectedDataElements]);\n\nexport class InlineController {\n private store: Store<InlineState>;\n private options: InlineOptions;\n private readonly endpoints: ResolvedEndpoints;\n private targetEl: HTMLElement | null = null;\n private hostEl: HTMLElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private rootEl: HTMLElement | null = null;\n private mediaQuery: MediaQuerySubscription;\n private purposeRefs: PurposeRenderRefs | null = null;\n private errorEl: HTMLElement | null = null;\n private hasSubmitted = false;\n private lastSubmissionKey: string | null = null;\n private hasCheckedLedgerConsent = false;\n private fetchedWithToken = false;\n private fetchGeneration = 0;\n private unsubscribe: (() => void) | null = null;\n private abortController: AbortController | null = null;\n private colorScheme: MediaQuerySubscription;\n private customCss = new NoticeCustomCss();\n private look: InlineLook | null = null;\n // The embed has no accept button -- its only submit is the automatic one --\n // so the confirm step gates that. Keyed on the selection it was asked\n // about: declining stops this submission without silencing the embed for a\n // selection the visitor goes on to change, and a confirmed one is not asked\n // about again once it has been sent.\n private confirmDialog: ConfirmDialogRefs | null = null;\n private refusedSelection: string | null = null;\n private confirmedSelection: string | null = null;\n\n constructor(options: InlineOptions) {\n this.options = options;\n this.endpoints = resolveEndpointOptions(options.baseUrl, options.ledgerBaseUrl);\n this.store = new Store<InlineState>({\n content: null,\n isLoading: true,\n isSubmitting: false,\n selectedLanguage: options.language || \"en\",\n collapsedPurposes: {},\n selectedPurposes: {},\n selectedDataElements: {},\n hasAlreadyConsented: false,\n isCheckingConsent: false,\n fetchError: null,\n errorMessage: null,\n });\n this.mediaQuery = createMediaQuery(\"(max-width: 768px)\");\n // Automatic dark mode follows the device's scheme while the embed is up.\n this.colorScheme = createMediaQuery(DARK_SCHEME_QUERY);\n }\n\n async init(): Promise<void> {\n this.abortController = new AbortController();\n\n // Resolve target element\n if (typeof this.options.target === \"string\") {\n this.targetEl = document.querySelector(this.options.target);\n if (!this.targetEl) {\n throw new Error(`Target element not found: ${this.options.target}`);\n }\n } else {\n this.targetEl = this.options.target;\n }\n\n // Mount the inline form inside an open shadow root attached to a host\n // <div> within the user's target container. This matches the modal's\n // isolation strategy so host-page CSS cannot bleed into the inline form\n // either.\n this.hostEl = document.createElement(\"div\");\n this.hostEl.setAttribute(\"data-redacto-consent-inline\", \"\");\n // Block-level, but no `all: initial` — we want font / color / line-height\n // to inherit from the user's page so the inline form blends in like the\n // React SDK does.\n this.hostEl.style.display = \"block\";\n this.targetEl.appendChild(this.hostEl);\n this.shadowRoot = this.hostEl.attachShadow({ mode: \"open\" });\n injectCheckboxStyles(this.shadowRoot);\n injectNoticeFontStyles(this.shadowRoot);\n\n // Subscribe to state changes\n this.unsubscribe = this.store.subscribe((state, prevState) => {\n this.handleStateChange(state, prevState);\n });\n\n // Subscribe to media query changes\n this.mediaQuery.subscribe(() => this.rebuildUI());\n this.colorScheme.subscribe(() => this.rebuildUI());\n\n // Render loading state\n this.renderLoading();\n\n // Fetch content\n await this.fetchNotice();\n }\n\n destroy(): void {\n // Cancels the in-flight ledger read and marks the controller torn down, so\n // late-resolving work cannot fire host callbacks or submit consent.\n this.abortController?.abort();\n this.unsubscribe?.();\n this.mediaQuery.destroy();\n this.colorScheme.destroy();\n this.confirmDialog?.dispose();\n this.confirmDialog = null;\n this.customCss.remove();\n this.store.destroy();\n // Removing the host div tears down the shadow tree (and the rootEl\n // inside it) in one step.\n if (this.hostEl && this.hostEl.parentNode) {\n this.hostEl.parentNode.removeChild(this.hostEl);\n }\n this.hostEl = null;\n this.shadowRoot = null;\n this.rootEl = null;\n this.purposeRefs = null;\n }\n\n updateToken(accessToken: string): void {\n this.options = { ...this.options, accessToken };\n // Both guards are released together: a refusal held past a new token\n // would freeze the embed for that selection with no way back to a dialog.\n this.refusedSelection = null;\n this.confirmedSelection = null;\n if (accessToken && !this.fetchedWithToken) {\n void this.fetchNotice();\n return;\n }\n // A late-arriving token is the first chance to run the ledger\n // check-consent read; it gates auto-submit synchronously before trying.\n if (this.shouldCheckLedgerConsent()) {\n void this.checkLedgerConsent();\n return;\n }\n this.tryAutoSubmit();\n }\n\n // ─── Private ───\n\n // destroy() aborts the controller, so an aborted signal is the marker that\n // teardown has happened and async continuations must not touch the host.\n private isDestroyed(): boolean {\n return Boolean(this.abortController?.signal.aborted);\n }\n\n private async fetchNotice(): Promise<void> {\n const generation = ++this.fetchGeneration;\n this.fetchedWithToken = Boolean(this.options.accessToken);\n this.store.setState({ isLoading: true, fetchError: null, hasAlreadyConsented: false });\n // With the API host, a token-authenticated read goes to the ledger like the\n // modal's; the tokenless and magic-link reads stay on the consent server.\n const noticeBaseUrl =\n this.endpoints.mode === \"host\" && this.options.accessToken && !this.options.applicationId\n ? this.endpoints.ledgerBaseUrl\n : this.endpoints.baseUrl;\n try {\n const data = await fetchConsentContentPublic({\n org_uuid: this.options.org_uuid,\n workspace_uuid: this.options.workspace_uuid,\n notice_uuid: this.options.notice_uuid,\n accessToken: this.options.accessToken,\n baseUrl: noticeBaseUrl,\n language: this.options.language,\n specific_uuid: this.options.applicationId,\n });\n\n if (this.isDestroyed() || generation !== this.fetchGeneration) {\n return;\n }\n\n const activeConfig = data.detail.active_config;\n const rows = inlinePurposeRows(activeConfig);\n // Seeded from the notice's pre-selection mode, on the keys the rows read\n // (per product and purpose once the notice groups): NONE leaves\n // everything unticked, as it always did.\n const selection = {\n ...initialSelection(rows),\n ...preselectionForRows(\n rows,\n buildPreselection(\n activeConfig.purposes,\n resolvePurposePreselection(activeConfig.purpose_preselection)\n )\n ),\n };\n\n // Post-cutover, consent records live in the Go ledger, so Python's\n // get-notice no longer 409s for an already-consented principal. Kick off\n // the ledger check BEFORE the content state lands: its synchronous\n // prologue raises isCheckingConsent, so the content state change below\n // cannot auto-submit until the read settles.\n void this.checkLedgerConsent();\n\n this.store.setState({\n content: activeConfig,\n isLoading: false,\n selectedLanguage: resolveDisplayLanguage(\n this.options.language,\n activeConfig.default_language,\n activeConfig.supported_languages_and_translations\n ),\n collapsedPurposes: initialCollapsedPurposes(rows),\n selectedPurposes: selection.selectedPurposes,\n selectedDataElements: selection.selectedDataElements,\n });\n } catch (err: unknown) {\n if (this.isDestroyed() || generation !== this.fetchGeneration) {\n return;\n }\n const error = err as Error & { status?: number };\n if (error.status === 409) {\n this.store.setState({ hasAlreadyConsented: true, isLoading: false });\n this.options.onAccept?.();\n } else {\n this.store.setState({ fetchError: error, isLoading: false });\n this.options.onError?.(error);\n }\n }\n }\n\n private shouldCheckLedgerConsent(): boolean {\n return (\n Boolean(this.endpoints.ledgerBaseUrl) &&\n !this.options.applicationId &&\n Boolean(this.options.accessToken) &&\n !this.hasCheckedLedgerConsent\n );\n }\n\n // Ask the Go ledger whether this principal has already fully consented —\n // the ledger equivalent of the legacy Python 409. Skipped without a ledger\n // (the 409 path governs) and for the magic-link applicationId flow. Any\n // failure returns null and falls through to the normal flow.\n private async checkLedgerConsent(): Promise<void> {\n if (!this.shouldCheckLedgerConsent()) return;\n this.hasCheckedLedgerConsent = true;\n this.store.setState({ isCheckingConsent: true });\n try {\n const status = await fetchNoticeConsentStatusForScope({\n accessToken: this.options.accessToken!,\n ledgerBaseUrl: this.endpoints.ledgerBaseUrl,\n organisationUuid: this.options.org_uuid,\n workspaceUuid: this.options.workspace_uuid,\n noticeUuid: this.options.notice_uuid,\n signal: this.abortController?.signal,\n });\n if (this.isDestroyed()) {\n return;\n }\n if (status && isNoticeFullyConsented(status)) {\n this.store.setState({ hasAlreadyConsented: true });\n this.options.onAccept?.();\n }\n } finally {\n if (!this.isDestroyed()) {\n this.store.setState({ isCheckingConsent: false });\n // Re-run auto-submit now that the gate is down (no-op when already\n // consented or requirements are unmet).\n this.tryAutoSubmit();\n }\n }\n }\n\n private handleStateChange(state: InlineState, prevState: InlineState): void {\n // Loading → content loaded\n if (prevState.isLoading && !state.isLoading && state.content) {\n this.rebuildUI();\n }\n\n // Already consented or fetch error → hide\n if (state.hasAlreadyConsented || state.fetchError) {\n if (this.rootEl && this.shadowRoot && this.rootEl.parentNode === this.shadowRoot) {\n this.shadowRoot.removeChild(this.rootEl);\n this.rootEl = null;\n }\n return;\n }\n\n // Checkbox state changes → update checkboxes\n if (state.selectedPurposes !== prevState.selectedPurposes ||\n state.selectedDataElements !== prevState.selectedDataElements) {\n this.updateCheckboxes(state);\n this.notifyValidation(state);\n this.tryAutoSubmit();\n }\n\n // Collapse state changes\n if (state.collapsedPurposes !== prevState.collapsedPurposes) {\n this.updateCollapseState(state);\n }\n\n // Error message changes\n if (state.errorMessage !== prevState.errorMessage) {\n this.updateErrorMessage(state);\n }\n }\n\n private renderLoading(): void {\n if (!this.shadowRoot) return;\n\n const textColor = this.options.settings?.textColor || \"#344054\";\n\n this.rootEl = el(\n \"div\",\n {\n [NOTICE_FONT_ROOT_ATTRIBUTE]: \"\",\n style: {\n ...inlineStyles.loadingContainer,\n fontFamily: resolveNoticeFontFamily({ hostFont: this.options.settings?.font }),\n },\n },\n el(\"div\", { style: inlineStyles.loadingSpinner }),\n el(\"p\", { style: { fontSize: \"16px\", fontWeight: 400, color: textColor } }, \"Loading...\")\n );\n\n this.shadowRoot.appendChild(this.rootEl);\n }\n\n private rebuildUI(): void {\n const state = this.store.getState();\n if (!state.content || !this.shadowRoot) return;\n // The embed stays hidden once consent is on record or the fetch failed.\n if (state.hasAlreadyConsented || state.fetchError) return;\n\n // Remove existing root\n if (this.rootEl && this.rootEl.parentNode === this.shadowRoot) {\n this.shadowRoot.removeChild(this.rootEl);\n }\n\n // Build error message element\n this.errorEl = el(\"div\", {\n role: \"alert\",\n style: {\n backgroundColor: \"#FEE2E2\",\n color: \"#DC2626\",\n padding: \"12px\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n border: \"1px solid #FCA5A5\",\n display: state.errorMessage ? \"block\" : \"none\",\n },\n });\n if (state.errorMessage) {\n this.errorEl.textContent = state.errorMessage;\n }\n\n const look = buildInlineLook({\n noticeId: this.options.notice_uuid,\n content: state.content,\n settings: this.options.settings,\n prefersDark: this.colorScheme.matches,\n isMobile: this.mediaQuery.matches,\n fontFamily: resolveNoticeFontFamily({\n hostFont: this.options.settings?.font,\n noticeFont: state.content.font_preference,\n }),\n });\n this.look = look;\n if (look.drawsSwitches) injectSwitchStyles(this.shadowRoot);\n this.customCss.apply(this.shadowRoot, this.options.notice_uuid, look.appearance.customCss);\n\n // Build purposes\n this.purposeRefs = renderInlinePurposes(state.content.purposes, {\n selectedPurposes: state.selectedPurposes,\n collapsedPurposes: state.collapsedPurposes,\n selectedDataElements: state.selectedDataElements,\n products: state.content.products,\n productPurposeOrder: state.content.product_purpose_order,\n settings: this.options.settings,\n look,\n language: state.selectedLanguage,\n isMobile: this.mediaQuery.matches,\n getTranslatedText: (key, defaultText, itemId) =>\n this.getTranslatedText(key, defaultText, itemId),\n onPurposeToggle: (uuid, productUuid) => this.handlePurposeCheckboxChange(uuid, productUuid),\n onPurposeCollapse: (uuid, productUuid) => this.togglePurposeCollapse(uuid, productUuid),\n onDataElementToggle: (elementUuid, purposeUuid, productUuid) =>\n this.handleDataElementCheckboxChange(elementUuid, purposeUuid, productUuid),\n });\n\n this.rootEl = el(\n \"div\",\n { ...look.rootAttributes, style: look.rootStyle },\n this.errorEl,\n this.purposeRefs.container\n );\n applyCssVariables(this.rootEl, look.rootVariables);\n\n this.shadowRoot.appendChild(this.rootEl);\n this.notifyValidation(state);\n }\n\n private getTranslatedText(key: string, defaultText: string, itemId?: string): string {\n const state = this.store.getState();\n const content = state.content;\n if (!content) return defaultText;\n\n const lang = state.selectedLanguage;\n if (lang === \"English\" || lang === \"en\" || lang === \"EN\") {\n if (key === \"privacy_policy_anchor_text\" && content.privacy_policy_anchor_text) {\n return content.privacy_policy_anchor_text;\n }\n return defaultText;\n }\n\n const translations = content.supported_languages_and_translations;\n if (!translations) return defaultText;\n\n const translationMap = translations[lang] as TranslationObject | undefined;\n if (!translationMap) return defaultText;\n\n if (itemId) {\n if (key === \"purposes.name\" || key === \"purposes.description\") {\n const purposeData = translationMap.purposes?.[itemId];\n if (purposeData) {\n if (typeof purposeData === \"string\") {\n return key === \"purposes.name\" ? purposeData : defaultText;\n }\n return key === \"purposes.name\"\n ? purposeData.name || defaultText\n : purposeData.description || defaultText;\n }\n return defaultText;\n }\n if (key === \"products.name\" || key === \"products.description\") {\n const productData = translationMap.products?.[itemId];\n if (productData) {\n if (typeof productData === \"string\") {\n return key === \"products.name\" ? productData : defaultText;\n }\n return key === \"products.name\"\n ? productData.name || defaultText\n : productData.description || defaultText;\n }\n return defaultText;\n }\n if (key.startsWith(\"data_elements.\")) {\n return translationMap.data_elements?.[itemId] || defaultText;\n }\n }\n\n const value = (translationMap as any)[key];\n if (typeof value === \"string\" && value) return value;\n return defaultText;\n }\n\n private togglePurposeCollapse(purposeUuid: string, productUuid?: string): void {\n const state = this.store.getState();\n const key = productPurposeKey(productUuid, purposeUuid);\n this.store.setState({\n collapsedPurposes: {\n ...state.collapsedPurposes,\n [key]: !state.collapsedPurposes[key],\n },\n });\n }\n\n private handlePurposeCheckboxChange(purposeUuid: string, productUuid?: string): void {\n const state = this.store.getState();\n const content = state.content;\n if (!content) return;\n\n const purpose = content.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose) return;\n\n const key = productPurposeKey(productUuid, purposeUuid);\n const newPurposeState = !state.selectedPurposes[key];\n\n this.store.setState({\n selectedPurposes: { ...state.selectedPurposes, [key]: newPurposeState },\n selectedDataElements: withPurposeElements(\n purpose,\n productUuid,\n newPurposeState,\n state.selectedDataElements\n ),\n });\n }\n\n private handleDataElementCheckboxChange(\n elementUuid: string,\n purposeUuid: string,\n productUuid?: string\n ): void {\n const state = this.store.getState();\n const content = state.content;\n if (!content) return;\n\n const purpose = content.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose) return;\n\n const next = toggleDataElement(purpose, elementUuid, productUuid, state.selectedDataElements);\n\n this.store.setState({\n selectedDataElements: next.selectedDataElements,\n selectedPurposes: {\n ...state.selectedPurposes,\n [productPurposeKey(productUuid, purposeUuid)]: next.purposeSelected,\n },\n });\n }\n\n private updateCheckboxes(state: InlineState): void {\n if (!this.purposeRefs) return;\n\n for (const [key, control] of this.purposeRefs.purposeControls) {\n control.setChecked(state.selectedPurposes[key] || false);\n }\n for (const [key, checkbox] of this.purposeRefs.checkboxes) {\n checkbox.checked = state.selectedDataElements[key] || false;\n }\n }\n\n private updateCollapseState(state: InlineState): void {\n if (!this.purposeRefs) return;\n\n const rows = state.content ? inlinePurposeRows(state.content) : [];\n const rowsByKey = new Map(\n rows.map((row) => [productPurposeKey(row.productUuid, row.purpose.uuid), row])\n );\n\n for (const [stateKey, container] of this.purposeRefs.dataElementContainers) {\n const purpose = rowsByKey.get(stateKey)?.purpose;\n const isCollapsed = state.collapsedPurposes[stateKey];\n\n container.style.display = !isCollapsed && purpose?.data_elements?.length ? \"flex\" : \"none\";\n\n const chevron = this.purposeRefs.chevrons.get(stateKey);\n if (chevron) {\n (chevron as unknown as HTMLElement).style.transform = !isCollapsed\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\";\n }\n\n const collapseBtn = this.purposeRefs.collapseButtons.get(stateKey);\n if (collapseBtn) {\n collapseBtn.setAttribute(\"aria-expanded\", String(!isCollapsed));\n }\n }\n }\n\n private updateErrorMessage(state: InlineState): void {\n if (!this.errorEl) return;\n if (state.errorMessage) {\n this.errorEl.textContent = state.errorMessage;\n this.errorEl.style.display = \"block\";\n } else {\n this.errorEl.style.display = \"none\";\n }\n }\n\n private areAllRequiredElementsChecked(): boolean {\n const state = this.store.getState();\n const content = state.content;\n if (!content) return false;\n\n return allRequiredElementsChecked(inlinePurposeRows(content), state.selectedDataElements);\n }\n\n private notifyValidation(state: InlineState): void {\n const isValid = this.areAllRequiredElementsChecked();\n this.options.onValidationChange?.(isValid);\n }\n\n private async tryAutoSubmit(skipKey: string | null = null): Promise<void> {\n // A submit is a network write — never start one after teardown.\n if (this.isDestroyed()) {\n return;\n }\n\n const state = this.store.getState();\n const accessToken = this.options.accessToken;\n\n if (\n accessToken &&\n state.content &&\n this.areAllRequiredElementsChecked() &&\n !state.isSubmitting &&\n !state.isCheckingConsent &&\n !state.hasAlreadyConsented &&\n !this.hasSubmitted\n ) {\n const submissionKey = inlineSubmissionKey(accessToken, state.content.uuid, state);\n if (submissionKey === this.lastSubmissionKey || submissionKey === skipKey) {\n return;\n }\n if (this.look?.appearance.confirmBeforeSubmit) {\n const signature = selectionSignature(state);\n if (this.refusedSelection === signature || this.confirmedSelection === signature) {\n return;\n }\n this.askToConfirm(signature);\n return;\n }\n await this.runSubmission(accessToken, submissionKey);\n }\n }\n\n /** Asks \"are you sure\" before the automatic submission of `signature`. */\n private askToConfirm(signature: string): void {\n if (this.confirmDialog || !this.shadowRoot) return;\n this.confirmDialog = openConfirmDialog({\n root: this.shadowRoot,\n action: \"accept-selected\",\n language: this.store.getState().selectedLanguage,\n rootAttributes: this.look?.rootAttributes,\n fontFamily: (this.look?.rootStyle.fontFamily as string | undefined) ?? undefined,\n onConfirm: () => {\n this.confirmDialog = null;\n this.confirmedSelection = signature;\n void this.submitConfirmed();\n },\n onCancel: () => {\n this.confirmDialog = null;\n this.refusedSelection = signature;\n },\n });\n }\n\n private async submitConfirmed(): Promise<void> {\n const state = this.store.getState();\n const accessToken = this.options.accessToken;\n if (this.isDestroyed() || !accessToken || !state.content) return;\n const submitted = await this.runSubmission(\n accessToken,\n inlineSubmissionKey(accessToken, state.content.uuid, state)\n );\n if (!submitted && !this.isDestroyed()) {\n // Released with the failure: holding it would leave the embed with no\n // dialog and no way back to one.\n this.confirmedSelection = null;\n void this.tryAutoSubmit();\n }\n }\n\n /** Sends one submission; resolves whether it was recorded. */\n private async runSubmission(accessToken: string, submissionKey: string): Promise<boolean> {\n this.hasSubmitted = true;\n this.lastSubmissionKey = submissionKey;\n try {\n await this.handleSubmit(accessToken);\n } catch (err) {\n this.hasSubmitted = false;\n this.options.onError?.(err as Error);\n if (isRetryableFailure(err)) {\n this.lastSubmissionKey = null;\n void this.tryAutoSubmit(submissionKey);\n } else {\n // Picks up a change made while this submit was in flight; the failed\n // selection itself stays skipped under its key.\n void this.tryAutoSubmit();\n }\n return false;\n }\n void this.tryAutoSubmit();\n return true;\n }\n\n private async handleSubmit(tokenToUse: string): Promise<void> {\n const state = this.store.getState();\n const content = state.content;\n if (!tokenToUse || !content) {\n this.store.setState({ errorMessage: \"Unable to submit consent. Please try again.\" });\n throw new Error(\"Access token or content not available\");\n }\n\n try {\n this.store.setState({ isSubmitting: true, errorMessage: null });\n\n await submitConsentEventPublic({\n org_uuid: this.options.org_uuid,\n workspace_uuid: this.options.workspace_uuid,\n accessToken: tokenToUse,\n baseUrl: this.endpoints.baseUrl,\n ledgerBaseUrl: this.endpoints.ledgerBaseUrl,\n noticeUuid: content.notice_uuid,\n purposes: buildInlineSubmitPurposes(inlinePurposeRows(content), state),\n declined: false,\n meta_data: this.options.applicationId\n ? { specific_uuid: this.options.applicationId }\n : undefined,\n language: state.selectedLanguage,\n });\n\n this.options.onAccept?.();\n this.hasSubmitted = false;\n } catch (error) {\n const err = error as Error;\n const message = err.message || \"Failed to submit consent. Please try again.\";\n this.store.setState({ errorMessage: message });\n this.hasSubmitted = false;\n throw error;\n } finally {\n this.store.setState({ isSubmitting: false });\n }\n }\n}\n","import type { PurposePreselection } from \"./types\";\nimport { DEFAULT_CONSENT_API_BASE_URL } from \"../constants\";\n\nexport const ASSISTED_BASE_URL = DEFAULT_CONSENT_API_BASE_URL;\n\nexport const ASSISTED_CONFIG = {\n otpLength: 6,\n resendSeconds: 30,\n dialCode: \"+91\",\n channel: \"sms\",\n emailChannel: \"email\",\n otpPurpose: \"login\",\n mobileDigits: 10,\n} as const;\n\nexport const EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nexport const DEFAULT_PURPOSE_PRESELECTION: PurposePreselection = \"NONE\";\n\nexport const ASSISTED_FALLBACK_MESSAGES = {\n notice: \"Could not load the consent notice. Please try again.\",\n createOtp: \"Could not send the OTP. Please try again.\",\n verifyOtp: \"Could not verify the OTP. Please try again.\",\n submit: \"Could not submit your consent. Please try again.\",\n audio: \"Could not load audio narration. Please try again.\",\n} as const;\n\nexport const ASSISTED_HOST_ATTRIBUTE = \"data-redacto-consent-assisted\";\n\nexport const ASSISTED_IDS = {\n mobileInput: \"redacto-assisted-mobile\",\n emailInput: \"redacto-assisted-email\",\n otpInputPrefix: \"redacto-assisted-otp-\",\n verifyPanel: \"redacto-assisted-verify\",\n purposeContainerPrefix: \"redacto-assisted-purpose-\",\n resend: \"redacto-assisted-resend\",\n speakerSlot: \"redacto-assisted-speaker\",\n} as const;\n\nexport const FOCUS_KEY_ATTRIBUTE = \"data-focus-key\";\n\nexport const FOCUS_KEYS = {\n language: \"language\",\n speaker: \"speaker\",\n acceptAll: \"accept-all\",\n primary: \"primary\",\n decline: \"decline\",\n editSelections: \"edit-selections\",\n switchMethod: \"switch-method\",\n changeContact: \"change-contact\",\n resend: \"resend\",\n close: \"close\",\n purpose: (purposeUuid: string) => `purpose:${purposeUuid}`,\n collapse: (purposeUuid: string) => `collapse:${purposeUuid}`,\n element: (purposeUuid: string, elementUuid: string) => `element:${purposeUuid}:${elementUuid}`,\n} as const;\n\nexport const ASSISTED_DEFAULT_PRIMARY_COLOR = \"#4f87ff\";\n\nexport const ASSISTED_STYLE_ID = \"redacto-assisted-styles\";\n\nexport const MOBILE_QUERY = \"(max-width: 768px)\";\n","import { parseApiError } from \"../shared/api-errors\";\nimport { withIdempotencyKey } from \"../shared/idempotency\";\nimport { toSubmitPurposes } from \"../api/submit-payload\";\nimport { toLanguageCode } from \"../api/language\";\nimport type { TTSAudioUrlsResponse } from \"../api/types\";\nimport { ASSISTED_BASE_URL, ASSISTED_FALLBACK_MESSAGES } from \"./constants\";\nimport type {\n AssistedNoticeResponse,\n CreateOtpDetail,\n CreateOtpParams,\n CreateOtpResponse,\n FetchAssistedNoticeParams,\n FetchAssistedTTSAudioUrlsParams,\n SubmitAssistedConsentParams,\n VerifyOtpDetail,\n VerifyOtpParams,\n VerifyOtpResponse,\n} from \"./types\";\n\nconst publicScope = (\n baseUrl: string | undefined,\n organisationUuid: string,\n workspaceUuid: string\n): string =>\n `${baseUrl || ASSISTED_BASE_URL}/public/organisations/${organisationUuid}/workspaces/${workspaceUuid}`;\n\nexport const fetchAssistedNotice = async ({\n organisationUuid,\n workspaceUuid,\n noticeUuid,\n baseUrl,\n signal,\n}: FetchAssistedNoticeParams): Promise<AssistedNoticeResponse> => {\n if (!organisationUuid || !workspaceUuid || !noticeUuid) {\n throw new Error(\"organisationUuid, workspaceUuid and noticeUuid are required\");\n }\n\n const url = `${publicScope(baseUrl, organisationUuid, workspaceUuid)}/notices/get-notice/${noticeUuid}`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: { accept: \"application/json\" },\n signal,\n });\n\n if (!response.ok) {\n throw await parseApiError(response, ASSISTED_FALLBACK_MESSAGES.notice);\n }\n\n return (await response.json()) as AssistedNoticeResponse;\n};\n\nexport const createOtp = async ({\n organisationUuid,\n workspaceUuid,\n to,\n channel,\n baseUrl,\n signal,\n}: CreateOtpParams): Promise<CreateOtpDetail> => {\n if (!organisationUuid || !workspaceUuid || !to) {\n throw new Error(\"organisationUuid, workspaceUuid and to are required\");\n }\n\n const url = `${publicScope(baseUrl, organisationUuid, workspaceUuid)}/otp/create`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ to, channel }),\n signal,\n });\n\n if (!response.ok) {\n throw await parseApiError(response, ASSISTED_FALLBACK_MESSAGES.createOtp);\n }\n\n const data = (await response.json()) as CreateOtpResponse;\n return data.detail;\n};\n\nexport const verifyOtp = async ({\n organisationUuid,\n workspaceUuid,\n uuid,\n otp,\n purpose,\n baseUrl,\n signal,\n}: VerifyOtpParams): Promise<VerifyOtpDetail> => {\n if (!organisationUuid || !workspaceUuid || !uuid || !otp) {\n throw new Error(\"organisationUuid, workspaceUuid, uuid and otp are required\");\n }\n\n const url = `${publicScope(baseUrl, organisationUuid, workspaceUuid)}/otp/verify`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ uuid, otp, purpose }),\n signal,\n });\n\n if (!response.ok) {\n throw await parseApiError(response, ASSISTED_FALLBACK_MESSAGES.verifyOtp);\n }\n\n const data = (await response.json()) as VerifyOtpResponse;\n return data.detail;\n};\n\nexport const submitAssistedConsent = async ({\n accessToken,\n organisationUuid,\n workspaceUuid,\n baseUrl,\n ledgerBaseUrl,\n noticeUuid,\n purposes,\n language,\n signal,\n}: SubmitAssistedConsentParams): Promise<Record<string, unknown> | null> => {\n if (!accessToken || !noticeUuid || !Array.isArray(purposes)) {\n throw new Error(\"accessToken, noticeUuid and purposes array are required\");\n }\n\n const payload = {\n notice_uuid: noticeUuid,\n purposes: toSubmitPurposes(purposes),\n select_all_mandatory: false,\n source: \"WEB\",\n declined: false,\n language: toLanguageCode(language),\n };\n\n const url = `${publicScope(ledgerBaseUrl || baseUrl, organisationUuid, workspaceUuid)}/submit-consent`;\n const serialisedBody = JSON.stringify(payload);\n\n const response = await withIdempotencyKey(url, serialisedBody, (idempotencyHeaders) =>\n fetch(url, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n ...idempotencyHeaders,\n },\n body: serialisedBody,\n signal,\n })\n );\n\n if (!response.ok) {\n throw await parseApiError(response, ASSISTED_FALLBACK_MESSAGES.submit);\n }\n\n const text = await response.text();\n if (!text) return null;\n try {\n return JSON.parse(text) as Record<string, unknown>;\n } catch {\n return null;\n }\n};\n\nexport const fetchAssistedTTSAudioUrls = async ({\n organisationUuid,\n workspaceUuid,\n noticeUuid,\n language,\n baseUrl,\n signal,\n}: FetchAssistedTTSAudioUrlsParams): Promise<TTSAudioUrlsResponse> => {\n if (!organisationUuid || !workspaceUuid || !noticeUuid || !language) {\n throw new Error(\"organisationUuid, workspaceUuid, noticeUuid and language are required\");\n }\n\n const url = `${publicScope(baseUrl, organisationUuid, workspaceUuid)}/notices/${noticeUuid}/audio/${language}`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: { accept: \"application/json\" },\n signal,\n });\n\n if (!response.ok) {\n throw await parseApiError(response, ASSISTED_FALLBACK_MESSAGES.audio);\n }\n\n return (await response.json()) as TTSAudioUrlsResponse;\n};\n","import type { StaticKey, StaticStrings, StaticVars } from \"./types\";\n\nconst en: StaticStrings = {\n useEmailInstead: \"Use email instead\",\n useMobileInstead: \"Use mobile instead\",\n emailAddress: \"Email address\",\n otpHelperEmail: \"We'll send a one-time password to this email.\",\n changeEmail: \"Change Email\",\n expandDetails: \"Expand {name} details\",\n collapseDetails: \"Collapse {name} details\",\n selectAllFor: \"Select all data elements for {name}\",\n selectElement: \"Select {name}\",\n selectElementRequired: \"Select {name} (required)\",\n required: \"required\",\n logoAlt: \"Logo\",\n selectLanguage: \"Select language\",\n selectLanguageCurrent: \"Select language. Current language: {lang}\",\n opensInNewTab: \"opens in new tab\",\n audioStart: \"Start audio playback\",\n audioPause: \"Pause audio playback\",\n talkbackStart: \"Start Talkback\",\n talkbackPause: \"Pause Talkback\",\n mobileNumber: \"Mobile number\",\n otpHelper: \"We'll send a one-time password to this number.\",\n otpSentTo: \"OTP sent to\",\n changeMobile: \"Change Mobile Number\",\n enterNDigitOtp: \"Enter {count}-digit OTP\",\n otpDigit: \"OTP digit {index}\",\n resendIn: \"Resend OTP in {seconds}s\",\n sending: \"Sending…\",\n resendOtp: \"Resend OTP\",\n getOtp: \"Get OTP\",\n verifying: \"Verifying…\",\n verifyOtp: \"Verify OTP\",\n sendOtp: \"Send OTP\",\n confirmOtp: \"Confirm OTP\",\n verifyWithOtp: \"Verify with OTP\",\n editSelections: \"Edit selections\",\n otpIncorrect:\n \"The verification code you entered is incorrect. Please check and try again.\",\n otpExpired: \"Your verification code has expired. Please request a new code.\",\n otpNotFound: \"Verification code not found. Please request a new code.\",\n otpVerifyFailed: \"Could not verify the OTP. Please try again.\",\n otpSendFailed: \"Could not send the OTP. Please try again.\",\n consentConfirmed: \"Consent confirmed\",\n recordedUnder: \"OTP verified · recorded under {regulation}\",\n recordedUnderAt: \"OTP verified · recorded under {regulation} at {time}\",\n consentReferenceId: \"Consent reference id\",\n proceed: \"Proceed\",\n loadingNotice: \"Loading notice\",\n loadFailedTitle: \"Couldn't load the consent notice\",\n tryAgain: \"Please try again.\",\n close: \"Close\",\n};\n\nconst hi: StaticStrings = {\n useEmailInstead: \"ईमेल इस्तेमाल करें\",\n useMobileInstead: \"मोबाइल इस्तेमाल करें\",\n emailAddress: \"ईमेल पता\",\n otpHelperEmail: \"हम इस ईमेल पर एक वन-टाइम पासवर्ड भेजेंगे.\",\n changeEmail: \"ईमेल बदलें\",\n expandDetails: \"{name} का विवरण विस्तृत करें\",\n collapseDetails: \"{name} का विवरण संक्षिप्त करें\",\n selectAllFor: \"{name} के लिए सभी डेटा तत्व चुनें\",\n selectElement: \"{name} चुनें\",\n selectElementRequired: \"{name} चुनें (आवश्यक)\",\n required: \"आवश्यक\",\n logoAlt: \"लोगो\",\n selectLanguage: \"भाषा चुनें\",\n selectLanguageCurrent: \"भाषा चुनें. वर्तमान भाषा: {lang}\",\n opensInNewTab: \"नए टैब में खुलता है\",\n audioStart: \"ऑडियो प्लेबैक शुरू करें\",\n audioPause: \"ऑडियो प्लेबैक रोकें\",\n talkbackStart: \"टॉकबैक शुरू करें\",\n talkbackPause: \"टॉकबैक रोकें\",\n mobileNumber: \"मोबाइल नंबर\",\n otpHelper: \"हम इस नंबर पर एक वन-टाइम पासवर्ड भेजेंगे.\",\n otpSentTo: \"ओटीपी (OTP) भेजा गया\",\n changeMobile: \"मोबाइल नंबर बदलें\",\n enterNDigitOtp: \"{count}-अंकों का ओटीपी (OTP) दर्ज करें\",\n otpDigit: \"ओटीपी (OTP) अंक {index}\",\n resendIn: \"{seconds} सेकंड में ओटीपी (OTP) पुनः भेजें\",\n sending: \"भेजा जा रहा है…\",\n resendOtp: \"ओटीपी (OTP) पुनः भेजें\",\n getOtp: \"ओटीपी (OTP) प्राप्त करें\",\n verifying: \"सत्यापित किया जा रहा है…\",\n verifyOtp: \"ओटीपी (OTP) सत्यापित करें\",\n sendOtp: \"ओटीपी (OTP) भेजें\",\n confirmOtp: \"ओटीपी (OTP) की पुष्टि करें\",\n verifyWithOtp: \"ओटीपी (OTP) से सत्यापित करें\",\n editSelections: \"चयन संपादित करें\",\n otpIncorrect:\n \"आपके द्वारा दर्ज किया गया सत्यापन कोड गलत है. कृपया जाँचें और पुनः प्रयास करें.\",\n otpExpired: \"आपके सत्यापन कोड की अवधि समाप्त हो गई है. कृपया नया कोड माँगें.\",\n otpNotFound: \"सत्यापन कोड नहीं मिला. कृपया नया कोड माँगें.\",\n otpVerifyFailed: \"ओटीपी (OTP) सत्यापित नहीं हो सका. कृपया पुनः प्रयास करें.\",\n otpSendFailed: \"ओटीपी (OTP) नहीं भेजा जा सका. कृपया पुनः प्रयास करें.\",\n consentConfirmed: \"सहमति की पुष्टि हुई\",\n recordedUnder: \"ओटीपी (OTP) सत्यापित · {regulation} के तहत दर्ज किया गया\",\n recordedUnderAt:\n \"ओटीपी (OTP) सत्यापित · {regulation} के तहत {time} पर दर्ज किया गया\",\n consentReferenceId: \"सहमति संदर्भ आईडी\",\n proceed: \"आगे बढ़ें\",\n loadingNotice: \"नोटिस लोड हो रहा है\",\n loadFailedTitle: \"सहमति नोटिस लोड नहीं हो सका\",\n tryAgain: \"कृपया पुनः प्रयास करें.\",\n close: \"बंद करें\",\n};\n\nconst bn: StaticStrings = {\n useEmailInstead: \"ইমেইল ব্যবহার করুন\",\n useMobileInstead: \"মোবাইল ব্যবহার করুন\",\n emailAddress: \"ইমেইল ঠিকানা\",\n otpHelperEmail: \"আমরা এই ইমেইলে একটি ওয়ান-টাইম পাসওয়ার্ড পাঠাব।\",\n changeEmail: \"ইমেইল পরিবর্তন করুন\",\n expandDetails: \"{name} এর বিবরণ প্রসারিত করুন\",\n collapseDetails: \"{name} এর বিবরণ সংকুচিত করুন\",\n selectAllFor: \"{name} এর জন্য সমস্ত ডেটা উপাদান নির্বাচন করুন\",\n selectElement: \"{name} নির্বাচন করুন\",\n selectElementRequired: \"{name} নির্বাচন করুন (আবশ্যক)\",\n required: \"আবশ্যক\",\n logoAlt: \"লোগো\",\n selectLanguage: \"ভাষা নির্বাচন করুন\",\n selectLanguageCurrent: \"ভাষা নির্বাচন করুন। বর্তমান ভাষা: {lang}\",\n opensInNewTab: \"নতুন ট্যাবে খোলে\",\n audioStart: \"অডিও প্লেব্যাক শুরু করুন\",\n audioPause: \"অডিও প্লেব্যাক বিরতি দিন\",\n talkbackStart: \"টকব্যাক শুরু করুন\",\n talkbackPause: \"টকব্যাক বিরতি দিন\",\n mobileNumber: \"মোবাইল নম্বর\",\n otpHelper: \"আমরা এই নম্বরে একটি ওয়ান-টাইম পাসওয়ার্ড পাঠাব।\",\n otpSentTo: \"ওটিপি (OTP) পাঠানো হয়েছে\",\n changeMobile: \"মোবাইল নম্বর পরিবর্তন করুন\",\n enterNDigitOtp: \"{count}-সংখ্যার ওটিপি (OTP) লিখুন\",\n otpDigit: \"ওটিপি (OTP) সংখ্যা {index}\",\n resendIn: \"{seconds} সেকেন্ডে ওটিপি (OTP) পুনরায় পাঠান\",\n sending: \"পাঠানো হচ্ছে…\",\n resendOtp: \"ওটিপি (OTP) পুনরায় পাঠান\",\n getOtp: \"ওটিপি (OTP) পান\",\n verifying: \"যাচাই করা হচ্ছে…\",\n verifyOtp: \"ওটিপি (OTP) যাচাই করুন\",\n sendOtp: \"ওটিপি (OTP) পাঠান\",\n confirmOtp: \"ওটিপি (OTP) নিশ্চিত করুন\",\n verifyWithOtp: \"ওটিপি (OTP) দিয়ে যাচাই করুন\",\n editSelections: \"নির্বাচন সম্পাদনা করুন\",\n otpIncorrect:\n \"আপনি যে যাচাইকরণ কোডটি লিখেছেন তা ভুল। অনুগ্রহ করে যাচাই করে আবার চেষ্টা করুন।\",\n otpExpired:\n \"আপনার যাচাইকরণ কোডের মেয়াদ শেষ হয়ে গেছে। অনুগ্রহ করে একটি নতুন কোড চান।\",\n otpNotFound: \"যাচাইকরণ কোড পাওয়া যায়নি। অনুগ্রহ করে একটি নতুন কোড চান।\",\n otpVerifyFailed:\n \"ওটিপি (OTP) যাচাই করা যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।\",\n otpSendFailed: \"ওটিপি (OTP) পাঠানো যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।\",\n consentConfirmed: \"সম্মতি নিশ্চিত হয়েছে\",\n recordedUnder: \"ওটিপি (OTP) যাচাই হয়েছে · {regulation} এর অধীনে নথিভুক্ত\",\n recordedUnderAt:\n \"ওটিপি (OTP) যাচাই হয়েছে · {regulation} এর অধীনে {time} এ নথিভুক্ত\",\n consentReferenceId: \"সম্মতি রেফারেন্স আইডি\",\n proceed: \"এগিয়ে যান\",\n loadingNotice: \"নোটিশ লোড হচ্ছে\",\n loadFailedTitle: \"সম্মতি নোটিশ লোড করা যায়নি\",\n tryAgain: \"অনুগ্রহ করে আবার চেষ্টা করুন।\",\n close: \"বন্ধ করুন\",\n};\n\nconst gu: StaticStrings = {\n useEmailInstead: \"ઇમેલ વાપરો\",\n useMobileInstead: \"મોબાઇલ વાપરો\",\n emailAddress: \"ઇમેલ સરનામું\",\n otpHelperEmail: \"અમે આ ઇમેલ પર વન-ટાઇમ પાસવર્ડ મોકલીશું.\",\n changeEmail: \"ઇમેલ બદલો\",\n expandDetails: \"{name} ની વિગતો વિસ્તૃત કરો\",\n collapseDetails: \"{name} ની વિગતો સંકોચો\",\n selectAllFor: \"{name} માટે બધા ડેટા ઘટકો પસંદ કરો\",\n selectElement: \"{name} પસંદ કરો\",\n selectElementRequired: \"{name} પસંદ કરો (આવશ્યક)\",\n required: \"આવશ્યક\",\n logoAlt: \"લોગો\",\n selectLanguage: \"ભાષા પસંદ કરો\",\n selectLanguageCurrent: \"ભાષા પસંદ કરો. વર્તમાન ભાષા: {lang}\",\n opensInNewTab: \"નવી ટૅબમાં ખુલે છે\",\n audioStart: \"ઑડિયો પ્લેબેક શરૂ કરો\",\n audioPause: \"ઑડિયો પ્લેબેક થોભાવો\",\n talkbackStart: \"ટૉકબેક શરૂ કરો\",\n talkbackPause: \"ટૉકબેક થોભાવો\",\n mobileNumber: \"મોબાઇલ નંબર\",\n otpHelper: \"અમે આ નંબર પર વન-ટાઇમ પાસવર્ડ મોકલીશું.\",\n otpSentTo: \"ઓટીપી (OTP) મોકલ્યો\",\n changeMobile: \"મોબાઇલ નંબર બદલો\",\n enterNDigitOtp: \"{count}-અંકનો ઓટીપી (OTP) દાખલ કરો\",\n otpDigit: \"ઓટીપી (OTP) અંક {index}\",\n resendIn: \"{seconds} સેકન્ડમાં ઓટીપી (OTP) ફરી મોકલો\",\n sending: \"મોકલી રહ્યું છે…\",\n resendOtp: \"ઓટીપી (OTP) ફરી મોકલો\",\n getOtp: \"ઓટીપી (OTP) મેળવો\",\n verifying: \"ચકાસી રહ્યું છે…\",\n verifyOtp: \"ઓટીપી (OTP) ચકાસો\",\n sendOtp: \"ઓટીપી (OTP) મોકલો\",\n confirmOtp: \"ઓટીપી (OTP) ની પુષ્ટિ કરો\",\n verifyWithOtp: \"ઓટીપી (OTP) થી ચકાસો\",\n editSelections: \"પસંદગીઓ સંપાદિત કરો\",\n otpIncorrect:\n \"તમે દાખલ કરેલ ચકાસણી કોડ ખોટો છે. કૃપા કરીને તપાસો અને ફરી પ્રયાસ કરો.\",\n otpExpired: \"તમારા ચકાસણી કોડની મુદત પૂરી થઈ ગઈ છે. કૃપા કરીને નવો કોડ માગો.\",\n otpNotFound: \"ચકાસણી કોડ મળ્યો નથી. કૃપા કરીને નવો કોડ માગો.\",\n otpVerifyFailed: \"ઓટીપી (OTP) ચકાસી શકાયો નથી. કૃપા કરીને ફરી પ્રયાસ કરો.\",\n otpSendFailed: \"ઓટીપી (OTP) મોકલી શકાયો નથી. કૃપા કરીને ફરી પ્રયાસ કરો.\",\n consentConfirmed: \"સંમતિની પુષ્ટિ થઈ\",\n recordedUnder: \"ઓટીપી (OTP) ચકાસાયું · {regulation} હેઠળ નોંધાયું\",\n recordedUnderAt:\n \"ઓટીપી (OTP) ચકાસાયું · {regulation} હેઠળ {time} વાગ્યે નોંધાયું\",\n consentReferenceId: \"સંમતિ સંદર્ભ આઈડી\",\n proceed: \"આગળ વધો\",\n loadingNotice: \"નોટિસ લોડ થઈ રહ્યું છે\",\n loadFailedTitle: \"સંમતિ નોટિસ લોડ થઈ શકી નથી\",\n tryAgain: \"કૃપા કરીને ફરી પ્રયાસ કરો.\",\n close: \"બંધ કરો\",\n};\n\nconst kn: StaticStrings = {\n useEmailInstead: \"ಇಮೇಲ್ ಬಳಸಿ\",\n useMobileInstead: \"ಮೊಬೈಲ್ ಬಳಸಿ\",\n emailAddress: \"ಇಮೇಲ್ ವಿಳಾಸ\",\n otpHelperEmail: \"ನಾವು ಈ ಇಮೇಲ್ಗೆ ಒಂದು-ಬಾರಿಯ ಪಾಸ್ವರ್ಡ್ ಕಳುಹಿಸುತ್ತೇವೆ.\",\n changeEmail: \"ಇಮೇಲ್ ಬದಲಾಯಿಸಿ\",\n expandDetails: \"{name} ವಿವರಗಳನ್ನು ವಿಸ್ತರಿಸಿ\",\n collapseDetails: \"{name} ವಿವರಗಳನ್ನು ಸಂಕುಚಿಸಿ\",\n selectAllFor: \"{name} ಗಾಗಿ ಎಲ್ಲಾ ಡೇಟಾ ಅಂಶಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ\",\n selectElement: \"{name} ಆಯ್ಕೆಮಾಡಿ\",\n selectElementRequired: \"{name} ಆಯ್ಕೆಮಾಡಿ (ಅಗತ್ಯ)\",\n required: \"ಅಗತ್ಯ\",\n logoAlt: \"ಲೋಗೋ\",\n selectLanguage: \"ಭಾಷೆ ಆಯ್ಕೆಮಾಡಿ\",\n selectLanguageCurrent: \"ಭಾಷೆ ಆಯ್ಕೆಮಾಡಿ. ಪ್ರಸ್ತುತ ಭಾಷೆ: {lang}\",\n opensInNewTab: \"ಹೊಸ ಟ್ಯಾಬ್ನಲ್ಲಿ ತೆರೆಯುತ್ತದೆ\",\n audioStart: \"ಆಡಿಯೊ ಪ್ಲೇಬ್ಯಾಕ್ ಪ್ರಾರಂಭಿಸಿ\",\n audioPause: \"ಆಡಿಯೊ ಪ್ಲೇಬ್ಯಾಕ್ ವಿರಾಮಗೊಳಿಸಿ\",\n talkbackStart: \"ಟಾಕ್ಬ್ಯಾಕ್ ಪ್ರಾರಂಭಿಸಿ\",\n talkbackPause: \"ಟಾಕ್ಬ್ಯಾಕ್ ವಿರಾಮಗೊಳಿಸಿ\",\n mobileNumber: \"ಮೊಬೈಲ್ ಸಂಖ್ಯೆ\",\n otpHelper: \"ನಾವು ಈ ಸಂಖ್ಯೆಗೆ ಒಂದು-ಬಾರಿಯ ಪಾಸ್ವರ್ಡ್ ಕಳುಹಿಸುತ್ತೇವೆ.\",\n otpSentTo: \"ಓಟಿಪಿ (OTP) ಕಳುಹಿಸಲಾಗಿದೆ\",\n changeMobile: \"ಮೊಬೈಲ್ ಸಂಖ್ಯೆ ಬದಲಾಯಿಸಿ\",\n enterNDigitOtp: \"{count}-ಅಂಕಿಯ ಓಟಿಪಿ (OTP) ನಮೂದಿಸಿ\",\n otpDigit: \"ಓಟಿಪಿ (OTP) ಅಂಕಿ {index}\",\n resendIn: \"{seconds} ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಓಟಿಪಿ (OTP) ಮರುಕಳುಹಿಸಿ\",\n sending: \"ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ…\",\n resendOtp: \"ಓಟಿಪಿ (OTP) ಮರುಕಳುಹಿಸಿ\",\n getOtp: \"ಓಟಿಪಿ (OTP) ಪಡೆಯಿರಿ\",\n verifying: \"ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ…\",\n verifyOtp: \"ಓಟಿಪಿ (OTP) ಪರಿಶೀಲಿಸಿ\",\n sendOtp: \"ಓಟಿಪಿ (OTP) ಕಳುಹಿಸಿ\",\n confirmOtp: \"ಓಟಿಪಿ (OTP) ದೃಢೀಕರಿಸಿ\",\n verifyWithOtp: \"ಓಟಿಪಿ (OTP) ಮೂಲಕ ಪರಿಶೀಲಿಸಿ\",\n editSelections: \"ಆಯ್ಕೆಗಳನ್ನು ಸಂಪಾದಿಸಿ\",\n otpIncorrect:\n \"ನೀವು ನಮೂದಿಸಿದ ಪರಿಶೀಲನಾ ಕೋಡ್ ತಪ್ಪಾಗಿದೆ. ದಯವಿಟ್ಟು ಪರಿಶೀಲಿಸಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.\",\n otpExpired: \"ನಿಮ್ಮ ಪರಿಶೀಲನಾ ಕೋಡ್ ಅವಧಿ ಮೀರಿದೆ. ದಯವಿಟ್ಟು ಹೊಸ ಕೋಡ್ ಕೋರಿ.\",\n otpNotFound: \"ಪರಿಶೀಲನಾ ಕೋಡ್ ಕಂಡುಬಂದಿಲ್ಲ. ದಯವಿಟ್ಟು ಹೊಸ ಕೋಡ್ ಕೋರಿ.\",\n otpVerifyFailed: \"ಓಟಿಪಿ (OTP) ಪರಿಶೀಲಿಸಲಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.\",\n otpSendFailed: \"ಓಟಿಪಿ (OTP) ಕಳುಹಿಸಲಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.\",\n consentConfirmed: \"ಸಮ್ಮತಿ ದೃಢೀಕರಿಸಲಾಗಿದೆ\",\n recordedUnder:\n \"ಓಟಿಪಿ (OTP) ಪರಿಶೀಲಿಸಲಾಗಿದೆ · {regulation} ಅಡಿಯಲ್ಲಿ ದಾಖಲಿಸಲಾಗಿದೆ\",\n recordedUnderAt:\n \"ಓಟಿಪಿ (OTP) ಪರಿಶೀಲಿಸಲಾಗಿದೆ · {regulation} ಅಡಿಯಲ್ಲಿ {time} ಕ್ಕೆ ದಾಖಲಿಸಲಾಗಿದೆ\",\n consentReferenceId: \"ಸಮ್ಮತಿ ಉಲ್ಲೇಖ ಐಡಿ\",\n proceed: \"ಮುಂದುವರಿಯಿರಿ\",\n loadingNotice: \"ಸೂಚನೆ ಲೋಡ್ ಆಗುತ್ತಿದೆ\",\n loadFailedTitle: \"ಸಮ್ಮತಿ ಸೂಚನೆಯನ್ನು ಲೋಡ್ ಮಾಡಲಾಗಲಿಲ್ಲ\",\n tryAgain: \"ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.\",\n close: \"ಮುಚ್ಚಿ\",\n};\n\nconst ks: StaticStrings = {\n useEmailInstead: \"ای میل استعمال کرِو\",\n useMobileInstead: \"موبایل استعمال کرِو\",\n emailAddress: \"ای میل ایڈریس\",\n otpHelperEmail: \"أسؠ بھیجو اَتھ ای میلس پؠٹھ اکھ ون ٹایم پاسورڈ۔\",\n changeEmail: \"ای میل تبدیل کرِو\",\n expandDetails: \"{name} تفصیلات کھولِو\",\n collapseDetails: \"{name} تفصیلات بند کرِو\",\n selectAllFor: \"{name} خٲطرٕ سٲری ڈیٹا عناصر ژارٕو\",\n selectElement: \"{name} ژارٕو\",\n selectElementRequired: \"{name} ژارٕو (ضروری)\",\n required: \"ضروری\",\n logoAlt: \"لوگو\",\n selectLanguage: \"زبان ژارٕو\",\n selectLanguageCurrent: \"زبان ژارٕو۔ موجودٕ زبان: {lang}\",\n opensInNewTab: \"نٔو ٹیب منٛز کھولان\",\n audioStart: \"آڈیو پلے بیک شروٗع کرِو\",\n audioPause: \"آڈیو پلے بیک روکِو\",\n talkbackStart: \"ٹاک بیک شروٗع کرِو\",\n talkbackPause: \"ٹاک بیک روکِو\",\n mobileNumber: \"موبایل نمبر\",\n otpHelper: \"أسؠ بھیجو اَتھ نمبرس پؠٹھ اکھ ون ٹایم پاسورڈ۔\",\n otpSentTo: \"او ٹی پی (OTP) بھیجِو\",\n changeMobile: \"موبایل نمبر تبدیل کرِو\",\n enterNDigitOtp: \"{count}-ہندسن ہُنٛد او ٹی پی (OTP) دِیُت\",\n otpDigit: \"او ٹی پی (OTP) ہندسہ {index}\",\n resendIn: \"{seconds} سیکنڈن منٛز او ٹی پی (OTP) دوبارٕ بھیجِو\",\n sending: \"بھیجان آسؠ…\",\n resendOtp: \"او ٹی پی (OTP) دوبارٕ بھیجِو\",\n getOtp: \"او ٹی پی (OTP) حٲصِل کرِو\",\n verifying: \"تصدیق کران آسؠ…\",\n verifyOtp: \"او ٹی پی (OTP) تصدیق کرِو\",\n sendOtp: \"او ٹی پی (OTP) بھیجِو\",\n confirmOtp: \"او ٹی پی (OTP) پۄختہ کرِو\",\n verifyWithOtp: \"او ٹی پی (OTP) سٟتؠ تصدیق کرِو\",\n editSelections: \"ژارٕمٕژ تبدیل کرِو\",\n otpIncorrect:\n \"تُہند درج کرمُت تصدیقی کوڈ چھ غلط۔ مہربانی کرِتھ چیک کرِتھ دوبارٕ کوشش کریو۔\",\n otpExpired:\n \"تُہند تصدیقی کوڈ ہنٛد میعاد چھ ختم گژھمُت۔ مہربانی کرِتھ نٔو کوڈ طلب کریو۔\",\n otpNotFound: \"تصدیقی کوڈ آو نہ لبنہ۔ مہربانی کرِتھ نٔو کوڈ طلب کریو۔\",\n otpVerifyFailed:\n \"او ٹی پی (OTP) ہیوٚک نہ تصدیق کرنہ۔ مہربانی کرِتھ دوبارٕ کوشش کریو۔\",\n otpSendFailed:\n \"او ٹی پی (OTP) ہیوٚک نہ بھیجنہ۔ مہربانی کرِتھ دوبارٕ کوشش کریو۔\",\n consentConfirmed: \"رضامندی تصدیق آیہٕ\",\n recordedUnder: \"او ٹی پی (OTP) تصدیق · {regulation} تحت درج\",\n recordedUnderAt: \"او ٹی پی (OTP) تصدیق · {regulation} تحت {time} پؠٹھ درج\",\n consentReferenceId: \"رضامندی ریفرنس آی ڈی\",\n proceed: \"اگٕ بڑھِو\",\n loadingNotice: \"نوٹس لوڈ گژھان آسؠ\",\n loadFailedTitle: \"رضامندی نوٹس لوڈ کرِتھ ہیوٚک نہٕ\",\n tryAgain: \"مہربانی کرِتھ دوبارٕ کوشش کرِو۔\",\n close: \"بند کرِو\",\n};\n\nconst gom: StaticStrings = {\n useEmailInstead: \"ईमेल वापरात\",\n useMobileInstead: \"मोबायल वापरात\",\n emailAddress: \"ईमेल पत्तो\",\n otpHelperEmail: \"आमी ह्या ईमेलाचेर एक वेळचो पासवर्ड धाडटले.\",\n changeEmail: \"ईमेल बदलात\",\n expandDetails: \"{name} चो तपशील विस्तारीत करात\",\n collapseDetails: \"{name} चो तपशील संकुचित करात\",\n selectAllFor: \"{name} खातीर सगळे डेटा घटक निवडात\",\n selectElement: \"{name} निवडात\",\n selectElementRequired: \"{name} निवडात (गरजेचें)\",\n required: \"गरजेचें\",\n logoAlt: \"लोगो\",\n selectLanguage: \"भास निवडात\",\n selectLanguageCurrent: \"भास निवडात. सद्याची भास: {lang}\",\n opensInNewTab: \"नव्या टॅबांत उगडता\",\n audioStart: \"ऑडियो प्लेबॅक सुरू करात\",\n audioPause: \"ऑडियो प्लेबॅक थांबयात\",\n talkbackStart: \"टॉकबॅक सुरू करात\",\n talkbackPause: \"टॉकबॅक थांबयात\",\n mobileNumber: \"मोबायल क्रमांक\",\n otpHelper: \"आमी ह्या क्रमांकाचेर एक वेळचो पासवर्ड धाडटले.\",\n otpSentTo: \"ओटीपी (OTP) धाडलो\",\n changeMobile: \"मोबायल क्रमांक बदलात\",\n enterNDigitOtp: \"{count}-आंकडी ओटीपी (OTP) घालात\",\n otpDigit: \"ओटीपी (OTP) आंकडो {index}\",\n resendIn: \"{seconds} सेकंदांनी ओटीपी (OTP) परत धाडात\",\n sending: \"धाडटा…\",\n resendOtp: \"ओटीपी (OTP) परत धाडात\",\n getOtp: \"ओटीपी (OTP) मेळयात\",\n verifying: \"तपासता…\",\n verifyOtp: \"ओटीपी (OTP) तपासात\",\n sendOtp: \"ओटीपी (OTP) धाडात\",\n confirmOtp: \"ओटीपी (OTP) निश्चीत करात\",\n verifyWithOtp: \"ओटीपी (OTP) वरवीं तपासात\",\n editSelections: \"निवडी संपादित करात\",\n otpIncorrect:\n \"तुमी घाललो पडताळणी कोड चुकीचो आसा. उपकार करून तपासात आनी परत यत्न करात.\",\n otpExpired: \"तुमच्या पडताळणी कोडाची मुदत सोंपली. उपकार करून नवो कोड मागात.\",\n otpNotFound: \"पडताळणी कोड मेळूंक ना. उपकार करून नवो कोड मागात.\",\n otpVerifyFailed: \"ओटीपी (OTP) पडताळूंक जमलें ना. उपकार करून परत यत्न करात.\",\n otpSendFailed: \"ओटीपी (OTP) धाडूंक जमलें ना. उपकार करून परत यत्न करात.\",\n consentConfirmed: \"संमती निश्चीत जाली\",\n recordedUnder: \"ओटीपी (OTP) तपासलो · {regulation} खाला नोंद केली\",\n recordedUnderAt:\n \"ओटीपी (OTP) तपासलो · {regulation} खाला {time} वोरांचेर नोंद केली\",\n consentReferenceId: \"संमती संदर्भ आयडी\",\n proceed: \"फुडें वचात\",\n loadingNotice: \"नोटीस लोड जाता\",\n loadFailedTitle: \"संमती नोटीस लोड करूंक जमलें ना\",\n tryAgain: \"उपकार करून परत यत्न करात.\",\n close: \"बंद करात\",\n};\n\nconst mai: StaticStrings = {\n useEmailInstead: \"ईमेल उपयोग करू\",\n useMobileInstead: \"मोबाइल उपयोग करू\",\n emailAddress: \"ईमेल पता\",\n otpHelperEmail: \"हम एहि ईमेल पर एकटा वन-टाइम पासवर्ड पठाएब.\",\n changeEmail: \"ईमेल बदलू\",\n expandDetails: \"{name} क विवरण विस्तृत करू\",\n collapseDetails: \"{name} क विवरण संक्षिप्त करू\",\n selectAllFor: \"{name} लेल सभ डेटा तत्व चुनू\",\n selectElement: \"{name} चुनू\",\n selectElementRequired: \"{name} चुनू (आवश्यक)\",\n required: \"आवश्यक\",\n logoAlt: \"लोगो\",\n selectLanguage: \"भाषा चुनू\",\n selectLanguageCurrent: \"भाषा चुनू. वर्तमान भाषा: {lang}\",\n opensInNewTab: \"नव टैब मे खुजैत अछि\",\n audioStart: \"ऑडियो प्लेबैक शुरू करू\",\n audioPause: \"ऑडियो प्लेबैक रोकू\",\n talkbackStart: \"टॉकबैक शुरू करू\",\n talkbackPause: \"टॉकबैक रोकू\",\n mobileNumber: \"मोबाइल नंबर\",\n otpHelper: \"हम एहि नंबर पर एकटा वन-टाइम पासवर्ड पठाएब.\",\n otpSentTo: \"ओटीपी (OTP) पठाओल गेल\",\n changeMobile: \"मोबाइल नंबर बदलू\",\n enterNDigitOtp: \"{count}-अंक क ओटीपी (OTP) दर्ज करू\",\n otpDigit: \"ओटीपी (OTP) अंक {index}\",\n resendIn: \"{seconds} सेकंड मे ओटीपी (OTP) पुनः पठाउ\",\n sending: \"पठाओल जा रहल अछि…\",\n resendOtp: \"ओटीपी (OTP) पुनः पठाउ\",\n getOtp: \"ओटीपी (OTP) प्राप्त करू\",\n verifying: \"सत्यापित कैल जा रहल अछि…\",\n verifyOtp: \"ओटीपी (OTP) सत्यापित करू\",\n sendOtp: \"ओटीपी (OTP) पठाउ\",\n confirmOtp: \"ओटीपी (OTP) क पुष्टि करू\",\n verifyWithOtp: \"ओटीपी (OTP) सँ सत्यापित करू\",\n editSelections: \"चयन संपादित करू\",\n otpIncorrect:\n \"अहाँक दर्ज कएल सत्यापन कोड गलत अछि. कृपया जाँचू आ फेर प्रयास करू.\",\n otpExpired: \"अहाँक सत्यापन कोडक अवधि समाप्त भ' गेल. कृपया नव कोड मांगू.\",\n otpNotFound: \"सत्यापन कोड नहि भेटल. कृपया नव कोड मांगू.\",\n otpVerifyFailed: \"ओटीपी (OTP) सत्यापित नहि भ' सकल. कृपया फेर प्रयास करू.\",\n otpSendFailed: \"ओटीपी (OTP) पठाओल नहि जा सकल. कृपया फेर प्रयास करू.\",\n consentConfirmed: \"सहमति क पुष्टि भेल\",\n recordedUnder: \"ओटीपी (OTP) सत्यापित · {regulation} क अंतर्गत दर्ज\",\n recordedUnderAt:\n \"ओटीपी (OTP) सत्यापित · {regulation} क अंतर्गत {time} बजे दर्ज\",\n consentReferenceId: \"सहमति संदर्भ आईडी\",\n proceed: \"आगू बढ़ू\",\n loadingNotice: \"नोटिस लोड भ' रहल अछि\",\n loadFailedTitle: \"सहमति नोटिस लोड नहि भ' सकल\",\n tryAgain: \"कृपया पुनः प्रयास करू.\",\n close: \"बंद करू\",\n};\n\nconst ml: StaticStrings = {\n useEmailInstead: \"ഇമെയിൽ ഉപയോഗിക്കുക\",\n useMobileInstead: \"മൊബൈൽ ഉപയോഗിക്കുക\",\n emailAddress: \"ഇമെയിൽ വിലാസം\",\n otpHelperEmail: \"ഞങ്ങൾ ഈ ഇമെയിലിലേക്ക് ഒറ്റത്തവണ പാസ്വേഡ് അയയ്ക്കും.\",\n changeEmail: \"ഇമെയിൽ മാറ്റുക\",\n expandDetails: \"{name} വിശദാംശങ്ങൾ വികസിപ്പിക്കുക\",\n collapseDetails: \"{name} വിശദാംശങ്ങൾ ചുരുക്കുക\",\n selectAllFor: \"{name} എന്നതിനായി എല്ലാ ഡാറ്റ ഘടകങ്ങളും തിരഞ്ഞെടുക്കുക\",\n selectElement: \"{name} തിരഞ്ഞെടുക്കുക\",\n selectElementRequired: \"{name} തിരഞ്ഞെടുക്കുക (ആവശ്യമാണ്)\",\n required: \"ആവശ്യമാണ്\",\n logoAlt: \"ലോഗോ\",\n selectLanguage: \"ഭാഷ തിരഞ്ഞെടുക്കുക\",\n selectLanguageCurrent: \"ഭാഷ തിരഞ്ഞെടുക്കുക. നിലവിലെ ഭാഷ: {lang}\",\n opensInNewTab: \"പുതിയ ടാബിൽ തുറക്കുന്നു\",\n audioStart: \"ഓഡിയോ പ്ലേബാക്ക് ആരംഭിക്കുക\",\n audioPause: \"ഓഡിയോ പ്ലേബാക്ക് താൽക്കാലികമായി നിർത്തുക\",\n talkbackStart: \"ടോക്ക്ബാക്ക് ആരംഭിക്കുക\",\n talkbackPause: \"ടോക്ക്ബാക്ക് താൽക്കാലികമായി നിർത്തുക\",\n mobileNumber: \"മൊബൈൽ നമ്പർ\",\n otpHelper: \"ഞങ്ങൾ ഈ നമ്പറിലേക്ക് ഒറ്റത്തവണ പാസ്വേഡ് അയയ്ക്കും.\",\n otpSentTo: \"ഒടിപി (OTP) അയച്ചു\",\n changeMobile: \"മൊബൈൽ നമ്പർ മാറ്റുക\",\n enterNDigitOtp: \"{count}-അക്ക ഒടിപി (OTP) നൽകുക\",\n otpDigit: \"ഒടിപി (OTP) അക്കം {index}\",\n resendIn: \"{seconds} സെക്കൻഡിൽ ഒടിപി (OTP) വീണ്ടും അയയ്ക്കുക\",\n sending: \"അയയ്ക്കുന്നു…\",\n resendOtp: \"ഒടിപി (OTP) വീണ്ടും അയയ്ക്കുക\",\n getOtp: \"ഒടിപി (OTP) നേടുക\",\n verifying: \"പരിശോധിക്കുന്നു…\",\n verifyOtp: \"ഒടിപി (OTP) പരിശോധിക്കുക\",\n sendOtp: \"ഒടിപി (OTP) അയയ്ക്കുക\",\n confirmOtp: \"ഒടിപി (OTP) സ്ഥിരീകരിക്കുക\",\n verifyWithOtp: \"ഒടിപി (OTP) ഉപയോഗിച്ച് പരിശോധിക്കുക\",\n editSelections: \"തിരഞ്ഞെടുപ്പുകൾ എഡിറ്റ് ചെയ്യുക\",\n otpIncorrect:\n \"നിങ്ങൾ നൽകിയ പരിശോധനാ കോഡ് തെറ്റാണ്. ദയവായി പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.\",\n otpExpired:\n \"നിങ്ങളുടെ പരിശോധനാ കോഡിന്റെ കാലാവധി കഴിഞ്ഞു. ദയവായി പുതിയ കോഡ് അഭ്യർത്ഥിക്കുക.\",\n otpNotFound:\n \"പരിശോധനാ കോഡ് കണ്ടെത്തിയില്ല. ദയവായി പുതിയ കോഡ് അഭ്യർത്ഥിക്കുക.\",\n otpVerifyFailed: \"ഒടിപി (OTP) പരിശോധിക്കാനായില്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.\",\n otpSendFailed: \"ഒടിപി (OTP) അയയ്ക്കാനായില്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.\",\n consentConfirmed: \"സമ്മതം സ്ഥിരീകരിച്ചു\",\n recordedUnder: \"ഒടിപി (OTP) പരിശോധിച്ചു · {regulation} പ്രകാരം രേഖപ്പെടുത്തി\",\n recordedUnderAt:\n \"ഒടിപി (OTP) പരിശോധിച്ചു · {regulation} പ്രകാരം {time}-ന് രേഖപ്പെടുത്തി\",\n consentReferenceId: \"സമ്മത റഫറൻസ് ഐഡി\",\n proceed: \"തുടരുക\",\n loadingNotice: \"നോട്ടീസ് ലോഡ് ചെയ്യുന്നു\",\n loadFailedTitle: \"സമ്മത നോട്ടീസ് ലോഡ് ചെയ്യാനായില്ല\",\n tryAgain: \"ദയവായി വീണ്ടും ശ്രമിക്കുക.\",\n close: \"അടയ്ക്കുക\",\n};\n\nconst mniMtei: StaticStrings = {\n useEmailInstead: \"ইমেইল শিজিন্নবা\",\n useMobileInstead: \"মোবাইল শিজিন্নবা\",\n emailAddress: \"ইমেইল ঠিকানা\",\n otpHelperEmail: \"ঐখোয়না ইমেইল অসিদা অমুক্তং শিজিন্নবা পাসৱার্দ থাগনি।\",\n changeEmail: \"ইমেইল হোংদোকউ\",\n expandDetails: \"{name} গী অকুপ্পা ৱারোল ফোংদোকউ\",\n collapseDetails: \"{name} গী অকুপ্পা ৱারোল হুপশিনউ\",\n selectAllFor: \"{name} গীদমক ডেটা পুম্নমক খনগৎলু\",\n selectElement: \"{name} খনগৎলু\",\n selectElementRequired: \"{name} খনগৎলু (দরকার ওই)\",\n required: \"দরকার ওই\",\n logoAlt: \"লোগো\",\n selectLanguage: \"লোল খনগৎলু\",\n selectLanguageCurrent: \"লোল খনগৎলু। হৌজিক্কী লোল: {lang}\",\n opensInNewTab: \"অনৌবা টেবত হাংই\",\n audioStart: \"অডিও প্লেবেক হৌদোকউ\",\n audioPause: \"অডিও প্লেবেক লেপশিনউ\",\n talkbackStart: \"টোকবেক হৌদোকউ\",\n talkbackPause: \"টোকবেক লেপশিনউ\",\n mobileNumber: \"মোবাইল নম্বর\",\n otpHelper: \"ঐখোয়না নম্বর অসিদা অমুক্তং শিজিন্নবা পাসৱার্দ থাগনি।\",\n otpSentTo: \"ওটিপি (OTP) থাখ্রে\",\n changeMobile: \"মোবাইল নম্বর হোংদোকউ\",\n enterNDigitOtp: \"{count}-মশিংগী ওটিপি (OTP) চংশিল্লু\",\n otpDigit: \"ওটিপি (OTP) মশিং {index}\",\n resendIn: \"{seconds} সেকেন্দগী মনুংদা ওটিপি (OTP) অমুক হন্না থাউ\",\n sending: \"থারি…\",\n resendOtp: \"ওটিপি (OTP) অমুক হন্না থাউ\",\n getOtp: \"ওটিপি (OTP) ফংউ\",\n verifying: \"শোয়দনা য়েংলি…\",\n verifyOtp: \"ওটিপি (OTP) শোয়দনা য়েংউ\",\n sendOtp: \"ওটিপি (OTP) থাউ\",\n confirmOtp: \"ওটিপি (OTP) চপ চানা শেংদোকউ\",\n verifyWithOtp: \"ওটিপি (OTP) না শোয়দনা য়েংউ\",\n editSelections: \"খনগৎলবশিং শেমদোকউ\",\n otpIncorrect:\n \"নহাক্না চংশিল্লবা ভেরিফিকেসন কোদ অসি অরানবনি। চানবীদুনা য়েংশিল্লগা অমুক হন্না হোৎনবীয়ু।\",\n otpExpired:\n \"নহাক্কী ভেরিফিকেসন কোদ অসিগী মতম লোইখ্রে। চানবীদুনা অনৌবা কোদ অমা নিজবীয়ু।\",\n otpNotFound: \"ভেরিফিকেসন কোদ ফংদ্রে। চানবীদুনা অনৌবা কোদ অমা নিজবীয়ু।\",\n otpVerifyFailed:\n \"ওটিপি (OTP) শোয়দনা য়েংবা ঙমদ্রে। চানবীদুনা অমুক হন্না হোৎনবীয়ু।\",\n otpSendFailed: \"ওটিপি (OTP) থাবা ঙমদ্রে। চানবীদুনা অমুক হন্না হোৎনবীয়ু।\",\n consentConfirmed: \"অয়াবা চপ চানা শেংদোকখ্রে\",\n recordedUnder:\n \"ওটিপি (OTP) শোয়দনা য়েংলে · {regulation} গী মখাদা রেকর্ড তৌখ্রে\",\n recordedUnderAt:\n \"ওটিপি (OTP) শোয়দনা য়েংলে · {regulation} গী মখাদা {time} দা রেকর্ড তৌখ্রে\",\n consentReferenceId: \"অয়াবা রেফরেন্স আইদি\",\n proceed: \"মখা চৎথউ\",\n loadingNotice: \"নোতিস লোদ তৌরি\",\n loadFailedTitle: \"অয়াবা নোতিস লোদ তৌবা ঙমদে\",\n tryAgain: \"চানবীদুনা অমুক হন্না হোৎনবীয়ু।\",\n close: \"লোনশিনউ\",\n};\n\nconst mr: StaticStrings = {\n useEmailInstead: \"ईमेल वापरा\",\n useMobileInstead: \"मोबाइल वापरा\",\n emailAddress: \"ईमेल पत्ता\",\n otpHelperEmail: \"आम्ही या ईमेलवर एक-वेळचा पासवर्ड पाठवू.\",\n changeEmail: \"ईमेल बदला\",\n expandDetails: \"{name} चे तपशील विस्तृत करा\",\n collapseDetails: \"{name} चे तपशील संक्षिप्त करा\",\n selectAllFor: \"{name} साठी सर्व डेटा घटक निवडा\",\n selectElement: \"{name} निवडा\",\n selectElementRequired: \"{name} निवडा (आवश्यक)\",\n required: \"आवश्यक\",\n logoAlt: \"लोगो\",\n selectLanguage: \"भाषा निवडा\",\n selectLanguageCurrent: \"भाषा निवडा. सध्याची भाषा: {lang}\",\n opensInNewTab: \"नवीन टॅबमध्ये उघडते\",\n audioStart: \"ऑडिओ प्लेबॅक सुरू करा\",\n audioPause: \"ऑडिओ प्लेबॅक थांबवा\",\n talkbackStart: \"टॉकबॅक सुरू करा\",\n talkbackPause: \"टॉकबॅक थांबवा\",\n mobileNumber: \"मोबाइल नंबर\",\n otpHelper: \"आम्ही या नंबरवर एक-वेळचा पासवर्ड पाठवू.\",\n otpSentTo: \"ओटीपी (OTP) पाठवला\",\n changeMobile: \"मोबाइल नंबर बदला\",\n enterNDigitOtp: \"{count}-अंकी ओटीपी (OTP) प्रविष्ट करा\",\n otpDigit: \"ओटीपी (OTP) अंक {index}\",\n resendIn: \"{seconds} सेकंदात ओटीपी (OTP) पुन्हा पाठवा\",\n sending: \"पाठवत आहे…\",\n resendOtp: \"ओटीपी (OTP) पुन्हा पाठवा\",\n getOtp: \"ओटीपी (OTP) मिळवा\",\n verifying: \"पडताळत आहे…\",\n verifyOtp: \"ओटीपी (OTP) पडताळा\",\n sendOtp: \"ओटीपी (OTP) पाठवा\",\n confirmOtp: \"ओटीपी (OTP) ची पुष्टी करा\",\n verifyWithOtp: \"ओटीपी (OTP) ने पडताळा\",\n editSelections: \"निवडी संपादित करा\",\n otpIncorrect:\n \"तुम्ही प्रविष्ट केलेला पडताळणी कोड चुकीचा आहे. कृपया तपासा आणि पुन्हा प्रयत्न करा.\",\n otpExpired: \"तुमच्या पडताळणी कोडची मुदत संपली आहे. कृपया नवीन कोड मागवा.\",\n otpNotFound: \"पडताळणी कोड सापडला नाही. कृपया नवीन कोड मागवा.\",\n otpVerifyFailed: \"ओटीपी (OTP) पडताळता आला नाही. कृपया पुन्हा प्रयत्न करा.\",\n otpSendFailed: \"ओटीपी (OTP) पाठवता आला नाही. कृपया पुन्हा प्रयत्न करा.\",\n consentConfirmed: \"संमती निश्चित झाली\",\n recordedUnder: \"ओटीपी (OTP) पडताळला · {regulation} अंतर्गत नोंदवले\",\n recordedUnderAt:\n \"ओटीपी (OTP) पडताळला · {regulation} अंतर्गत {time} वाजता नोंदवले\",\n consentReferenceId: \"संमती संदर्भ आयडी\",\n proceed: \"पुढे जा\",\n loadingNotice: \"सूचना लोड होत आहे\",\n loadFailedTitle: \"संमती सूचना लोड करता आली नाही\",\n tryAgain: \"कृपया पुन्हा प्रयत्न करा.\",\n close: \"बंद करा\",\n};\n\nconst ne: StaticStrings = {\n useEmailInstead: \"इमेल प्रयोग गर्नुहोस्\",\n useMobileInstead: \"मोबाइल प्रयोग गर्नुहोस्\",\n emailAddress: \"इमेल ठेगाना\",\n otpHelperEmail: \"हामी यो इमेलमा एक-पटक प्रयोग हुने पासवर्ड पठाउनेछौं।\",\n changeEmail: \"इमेल परिवर्तन गर्नुहोस्\",\n expandDetails: \"{name} को विवरण विस्तार गर्नुहोस्\",\n collapseDetails: \"{name} को विवरण संक्षिप्त गर्नुहोस्\",\n selectAllFor: \"{name} का लागि सबै डेटा तत्वहरू चयन गर्नुहोस्\",\n selectElement: \"{name} चयन गर्नुहोस्\",\n selectElementRequired: \"{name} चयन गर्नुहोस् (आवश्यक)\",\n required: \"आवश्यक\",\n logoAlt: \"लोगो\",\n selectLanguage: \"भाषा चयन गर्नुहोस्\",\n selectLanguageCurrent: \"भाषा चयन गर्नुहोस्। हालको भाषा: {lang}\",\n opensInNewTab: \"नयाँ ट्याबमा खुल्छ\",\n audioStart: \"अडियो प्लेब्याक सुरु गर्नुहोस्\",\n audioPause: \"अडियो प्लेब्याक रोक्नुहोस्\",\n talkbackStart: \"टकब्याक सुरु गर्नुहोस्\",\n talkbackPause: \"टकब्याक रोक्नुहोस्\",\n mobileNumber: \"मोबाइल नम्बर\",\n otpHelper: \"हामी यो नम्बरमा एक-पटक प्रयोग हुने पासवर्ड पठाउनेछौं।\",\n otpSentTo: \"ओटीपी (OTP) पठाइयो\",\n changeMobile: \"मोबाइल नम्बर परिवर्तन गर्नुहोस्\",\n enterNDigitOtp: \"{count}-अङ्कको ओटीपी (OTP) प्रविष्ट गर्नुहोस्\",\n otpDigit: \"ओटीपी (OTP) अङ्क {index}\",\n resendIn: \"{seconds} सेकेन्डमा ओटीपी (OTP) पुनः पठाउनुहोस्\",\n sending: \"पठाउँदै…\",\n resendOtp: \"ओटीपी (OTP) पुनः पठाउनुहोस्\",\n getOtp: \"ओटीपी (OTP) प्राप्त गर्नुहोस्\",\n verifying: \"प्रमाणित गर्दै…\",\n verifyOtp: \"ओटीपी (OTP) प्रमाणित गर्नुहोस्\",\n sendOtp: \"ओटीपी (OTP) पठाउनुहोस्\",\n confirmOtp: \"ओटीपी (OTP) पुष्टि गर्नुहोस्\",\n verifyWithOtp: \"ओटीपी (OTP) मार्फत प्रमाणित गर्नुहोस्\",\n editSelections: \"चयनहरू सम्पादन गर्नुहोस्\",\n otpIncorrect:\n \"तपाईंले प्रविष्ट गर्नुभएको प्रमाणीकरण कोड गलत छ. कृपया जाँच गरी पुनः प्रयास गर्नुहोस्.\",\n otpExpired:\n \"तपाईंको प्रमाणीकरण कोडको म्याद सकिएको छ. कृपया नयाँ कोड अनुरोध गर्नुहोस्.\",\n otpNotFound: \"प्रमाणीकरण कोड फेला परेन. कृपया नयाँ कोड अनुरोध गर्नुहोस्.\",\n otpVerifyFailed:\n \"ओटीपी (OTP) प्रमाणित गर्न सकिएन. कृपया पुनः प्रयास गर्नुहोस्.\",\n otpSendFailed: \"ओटीपी (OTP) पठाउन सकिएन. कृपया पुनः प्रयास गर्नुहोस्.\",\n consentConfirmed: \"सहमति पुष्टि भयो\",\n recordedUnder: \"ओटीपी (OTP) प्रमाणित · {regulation} अन्तर्गत अभिलेख गरियो\",\n recordedUnderAt:\n \"ओटीपी (OTP) प्रमाणित · {regulation} अन्तर्गत {time} मा अभिलेख गरियो\",\n consentReferenceId: \"सहमति सन्दर्भ आईडी\",\n proceed: \"अगाडि बढ्नुहोस्\",\n loadingNotice: \"सूचना लोड हुँदै\",\n loadFailedTitle: \"सहमति सूचना लोड गर्न सकिएन\",\n tryAgain: \"कृपया पुनः प्रयास गर्नुहोस्।\",\n close: \"बन्द गर्नुहोस्\",\n};\n\nconst or: StaticStrings = {\n useEmailInstead: \"ଇମେଲ୍ ବ୍ୟବହାର କରନ୍ତୁ\",\n useMobileInstead: \"ମୋବାଇଲ୍ ବ୍ୟବହାର କରନ୍ତୁ\",\n emailAddress: \"ଇମେଲ୍ ଠିକଣା\",\n otpHelperEmail: \"ଆମେ ଏହି ଇମେଲକୁ ଗୋଟିଏ-ଥର ବ୍ୟବହାର ପାସୱର୍ଡ ପଠାଇବୁ।\",\n changeEmail: \"ଇମେଲ୍ ବଦଳାନ୍ତୁ\",\n expandDetails: \"{name} ର ବିବରଣୀ ବିସ୍ତାର କରନ୍ତୁ\",\n collapseDetails: \"{name} ର ବିବରଣୀ ସଙ୍କୁଚିତ କରନ୍ତୁ\",\n selectAllFor: \"{name} ପାଇଁ ସମସ୍ତ ଡାଟା ଉପାଦାନ ବାଛନ୍ତୁ\",\n selectElement: \"{name} ବାଛନ୍ତୁ\",\n selectElementRequired: \"{name} ବାଛନ୍ତୁ (ଆବଶ୍ୟକ)\",\n required: \"ଆବଶ୍ୟକ\",\n logoAlt: \"ଲୋଗୋ\",\n selectLanguage: \"ଭାଷା ବାଛନ୍ତୁ\",\n selectLanguageCurrent: \"ଭାଷା ବାଛନ୍ତୁ। ବର୍ତ୍ତମାନର ଭାଷା: {lang}\",\n opensInNewTab: \"ନୂଆ ଟ୍ୟାବରେ ଖୋଲେ\",\n audioStart: \"ଅଡିଓ ପ୍ଲେବ୍ୟାକ୍ ଆରମ୍ଭ କରନ୍ତୁ\",\n audioPause: \"ଅଡିଓ ପ୍ଲେବ୍ୟାକ୍ ବିରତ କରନ୍ତୁ\",\n talkbackStart: \"ଟକ୍ବ୍ୟାକ୍ ଆରମ୍ଭ କରନ୍ତୁ\",\n talkbackPause: \"ଟକ୍ବ୍ୟାକ୍ ବିରତ କରନ୍ତୁ\",\n mobileNumber: \"ମୋବାଇଲ୍ ନମ୍ବର\",\n otpHelper: \"ଆମେ ଏହି ନମ୍ବରକୁ ଗୋଟିଏ-ଥର ବ୍ୟବହାର ପାସୱର୍ଡ ପଠାଇବୁ।\",\n otpSentTo: \"ଓଟିପି (OTP) ପଠାଗଲା\",\n changeMobile: \"ମୋବାଇଲ୍ ନମ୍ବର ବଦଳାନ୍ତୁ\",\n enterNDigitOtp: \"{count}-ଅଙ୍କ ବିଶିଷ୍ଟ ଓଟିପି (OTP) ଭରନ୍ତୁ\",\n otpDigit: \"ଓଟିପି (OTP) ଅଙ୍କ {index}\",\n resendIn: \"{seconds} ସେକେଣ୍ଡରେ ଓଟିପି (OTP) ପୁନଃ ପଠାନ୍ତୁ\",\n sending: \"ପଠାଯାଉଛି…\",\n resendOtp: \"ଓଟିପି (OTP) ପୁନଃ ପଠାନ୍ତୁ\",\n getOtp: \"ଓଟିପି (OTP) ପାଆନ୍ତୁ\",\n verifying: \"ଯାଞ୍ଚ କରାଯାଉଛି…\",\n verifyOtp: \"ଓଟିପି (OTP) ଯାଞ୍ଚ କରନ୍ତୁ\",\n sendOtp: \"ଓଟିପି (OTP) ପଠାନ୍ତୁ\",\n confirmOtp: \"ଓଟିପି (OTP) ନିଶ୍ଚିତ କରନ୍ତୁ\",\n verifyWithOtp: \"ଓଟିପି (OTP) ମାଧ୍ୟମରେ ଯାଞ୍ଚ କରନ୍ତୁ\",\n editSelections: \"ଚୟନଗୁଡ଼ିକ ସମ୍ପାଦନ କରନ୍ତୁ\",\n otpIncorrect:\n \"ଆପଣ ଭରିଥିବା ଯାଞ୍ଚ କୋଡ୍ ଭୁଲ ଅଛି। ଦୟାକରି ଯାଞ୍ଚ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।\",\n otpExpired: \"ଆପଣଙ୍କ ଯାଞ୍ଚ କୋଡ୍ର ମିଆଦ ସରିଯାଇଛି। ଦୟାକରି ନୂଆ କୋଡ୍ ମାଗନ୍ତୁ।\",\n otpNotFound: \"ଯାଞ୍ଚ କୋଡ୍ ମିଳିଲା ନାହିଁ। ଦୟାକରି ନୂଆ କୋଡ୍ ମାଗନ୍ତୁ।\",\n otpVerifyFailed:\n \"ଓଟିପି (OTP) ଯାଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।\",\n otpSendFailed: \"ଓଟିପି (OTP) ପଠାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।\",\n consentConfirmed: \"ସମ୍ମତି ନିଶ୍ଚିତ ହେଲା\",\n recordedUnder: \"ଓଟିପି (OTP) ଯାଞ୍ଚ ହେଲା · {regulation} ଅଧୀନରେ ରେକର୍ଡ କରାଗଲା\",\n recordedUnderAt:\n \"ଓଟିପି (OTP) ଯାଞ୍ଚ ହେଲା · {regulation} ଅଧୀନରେ {time}ରେ ରେକର୍ଡ କରାଗଲା\",\n consentReferenceId: \"ସମ୍ମତି ରେଫରେନ୍ସ ଆଇଡି\",\n proceed: \"ଆଗକୁ ବଢ଼ନ୍ତୁ\",\n loadingNotice: \"ବିଜ୍ଞପ୍ତି ଲୋଡ୍ ହେଉଛି\",\n loadFailedTitle: \"ସମ୍ମତି ବିଜ୍ଞପ୍ତି ଲୋଡ୍ କରାଯାଇପାରିଲା ନାହିଁ\",\n tryAgain: \"ଦୟାକରି ପୁନଃ ଚେଷ୍ଟା କରନ୍ତୁ।\",\n close: \"ବନ୍ଦ କରନ୍ତୁ\",\n};\n\nconst pa: StaticStrings = {\n useEmailInstead: \"ਈਮੇਲ ਵਰਤੋ\",\n useMobileInstead: \"ਮੋਬਾਈਲ ਵਰਤੋ\",\n emailAddress: \"ਈਮੇਲ ਪਤਾ\",\n otpHelperEmail: \"ਅਸੀਂ ਇਸ ਈਮੇਲ 'ਤੇ ਇੱਕ ਵਾਰੀ ਵਰਤੋਂ ਵਾਲਾ ਪਾਸਵਰਡ ਭੇਜਾਂਗੇ।\",\n changeEmail: \"ਈਮੇਲ ਬਦਲੋ\",\n expandDetails: \"{name} ਦੇ ਵੇਰਵੇ ਫੈਲਾਓ\",\n collapseDetails: \"{name} ਦੇ ਵੇਰਵੇ ਸਮੇਟੋ\",\n selectAllFor: \"{name} ਲਈ ਸਾਰੇ ਡਾਟਾ ਤੱਤ ਚੁਣੋ\",\n selectElement: \"{name} ਚੁਣੋ\",\n selectElementRequired: \"{name} ਚੁਣੋ (ਲੋੜੀਂਦਾ)\",\n required: \"ਲੋੜੀਂਦਾ\",\n logoAlt: \"ਲੋਗੋ\",\n selectLanguage: \"ਭਾਸ਼ਾ ਚੁਣੋ\",\n selectLanguageCurrent: \"ਭਾਸ਼ਾ ਚੁਣੋ। ਮੌਜੂਦਾ ਭਾਸ਼ਾ: {lang}\",\n opensInNewTab: \"ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ\",\n audioStart: \"ਆਡੀਓ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਕਰੋ\",\n audioPause: \"ਆਡੀਓ ਪਲੇਬੈਕ ਰੋਕੋ\",\n talkbackStart: \"ਟਾਕਬੈਕ ਸ਼ੁਰੂ ਕਰੋ\",\n talkbackPause: \"ਟਾਕਬੈਕ ਰੋਕੋ\",\n mobileNumber: \"ਮੋਬਾਈਲ ਨੰਬਰ\",\n otpHelper: \"ਅਸੀਂ ਇਸ ਨੰਬਰ 'ਤੇ ਇੱਕ ਵਾਰੀ ਵਰਤੋਂ ਵਾਲਾ ਪਾਸਵਰਡ ਭੇਜਾਂਗੇ।\",\n otpSentTo: \"ਓਟੀਪੀ (OTP) ਭੇਜਿਆ ਗਿਆ\",\n changeMobile: \"ਮੋਬਾਈਲ ਨੰਬਰ ਬਦਲੋ\",\n enterNDigitOtp: \"{count}-ਅੰਕਾਂ ਵਾਲਾ ਓਟੀਪੀ (OTP) ਦਰਜ ਕਰੋ\",\n otpDigit: \"ਓਟੀਪੀ (OTP) ਅੰਕ {index}\",\n resendIn: \"{seconds} ਸਕਿੰਟਾਂ ਵਿੱਚ ਓਟੀਪੀ (OTP) ਮੁੜ ਭੇਜੋ\",\n sending: \"ਭੇਜਿਆ ਜਾ ਰਿਹਾ ਹੈ…\",\n resendOtp: \"ਓਟੀਪੀ (OTP) ਮੁੜ ਭੇਜੋ\",\n getOtp: \"ਓਟੀਪੀ (OTP) ਪ੍ਰਾਪਤ ਕਰੋ\",\n verifying: \"ਪੁਸ਼ਟੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…\",\n verifyOtp: \"ਓਟੀਪੀ (OTP) ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ\",\n sendOtp: \"ਓਟੀਪੀ (OTP) ਭੇਜੋ\",\n confirmOtp: \"ਓਟੀਪੀ (OTP) ਦੀ ਤਸਦੀਕ ਕਰੋ\",\n verifyWithOtp: \"ਓਟੀਪੀ (OTP) ਨਾਲ ਤਸਦੀਕ ਕਰੋ\",\n editSelections: \"ਚੋਣਾਂ ਸੋਧੋ\",\n otpIncorrect:\n \"ਤੁਹਾਡੇ ਵੱਲੋਂ ਦਰਜ ਕੀਤਾ ਤਸਦੀਕ ਕੋਡ ਗਲਤ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਜਾਂਚ ਕਰੋ ਅਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।\",\n otpExpired:\n \"ਤੁਹਾਡੇ ਤਸਦੀਕ ਕੋਡ ਦੀ ਮਿਆਦ ਖਤਮ ਹੋ ਗਈ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਨਵਾਂ ਕੋਡ ਮੰਗੋ।\",\n otpNotFound: \"ਤਸਦੀਕ ਕੋਡ ਨਹੀਂ ਮਿਲਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਨਵਾਂ ਕੋਡ ਮੰਗੋ।\",\n otpVerifyFailed:\n \"ਓਟੀਪੀ (OTP) ਦੀ ਤਸਦੀਕ ਨਹੀਂ ਹੋ ਸਕੀ। ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।\",\n otpSendFailed: \"ਓਟੀਪੀ (OTP) ਨਹੀਂ ਭੇਜਿਆ ਜਾ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।\",\n consentConfirmed: \"ਸਹਿਮਤੀ ਦੀ ਪੁਸ਼ਟੀ ਹੋਈ\",\n recordedUnder: \"ਓਟੀਪੀ (OTP) ਦੀ ਪੁਸ਼ਟੀ · {regulation} ਅਧੀਨ ਦਰਜ ਕੀਤਾ ਗਿਆ\",\n recordedUnderAt:\n \"ਓਟੀਪੀ (OTP) ਦੀ ਪੁਸ਼ਟੀ · {regulation} ਅਧੀਨ {time} ਵਜੇ ਦਰਜ ਕੀਤਾ ਗਿਆ\",\n consentReferenceId: \"ਸਹਿਮਤੀ ਰੈਫਰੈਂਸ ਆਈਡੀ\",\n proceed: \"ਅੱਗੇ ਵਧੋ\",\n loadingNotice: \"ਨੋਟਿਸ ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ\",\n loadFailedTitle: \"ਸਹਿਮਤੀ ਨੋਟਿਸ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕਿਆ\",\n tryAgain: \"ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।\",\n close: \"ਬੰਦ ਕਰੋ\",\n};\n\nconst sa: StaticStrings = {\n useEmailInstead: \"ईमेल् उपयुज्यताम्\",\n useMobileInstead: \"चलदूरभाषः उपयुज्यताम्\",\n emailAddress: \"ईमेल्-पता\",\n otpHelperEmail: \"वयम् अस्मिन् ईमेल् एकवारप्रयोग-कूटशब्दं प्रेषयिष्यामः।\",\n changeEmail: \"ईमेल् परिवर्तयतु\",\n expandDetails: \"{name} इत्यस्य विवरणं विस्तारयतु\",\n collapseDetails: \"{name} इत्यस्य विवरणं संक्षिपतु\",\n selectAllFor: \"{name} कृते सर्वाणि दत्तांश-तत्त्वानि चिनोतु\",\n selectElement: \"{name} चिनोतु\",\n selectElementRequired: \"{name} चिनोतु (आवश्यकम्)\",\n required: \"आवश्यकम्\",\n logoAlt: \"प्रतीकचिह्नम्\",\n selectLanguage: \"भाषां चिनोतु\",\n selectLanguageCurrent: \"भाषां चिनोतु। वर्तमाना भाषा: {lang}\",\n opensInNewTab: \"नूतनपटले उद्घाटयति\",\n audioStart: \"श्रव्यप्रचारणम् आरभतु\",\n audioPause: \"श्रव्यप्रचारणं विरमयतु\",\n talkbackStart: \"टॉक्-बैक् आरभतु\",\n talkbackPause: \"टॉक्-बैक् विरमयतु\",\n mobileNumber: \"चलदूरभाष-सङ्ख्या\",\n otpHelper: \"वयम् अस्मिन् सङ्ख्यायां एकवारप्रयोग-कूटशब्दं प्रेषयिष्यामः।\",\n otpSentTo: \"ओटीपी (OTP) प्रेषितम्\",\n changeMobile: \"चलदूरभाष-सङ्ख्यां परिवर्तयतु\",\n enterNDigitOtp: \"{count}-अङ्कीयं ओटीपी (OTP) प्रविशतु\",\n otpDigit: \"ओटीपी (OTP) अङ्कः {index}\",\n resendIn: \"{seconds} सेकेण्ड्-काले ओटीपी (OTP) पुनः प्रेषयतु\",\n sending: \"प्रेष्यते…\",\n resendOtp: \"ओटीपी (OTP) पुनः प्रेषयतु\",\n getOtp: \"ओटीपी (OTP) प्राप्नोतु\",\n verifying: \"सत्यापयति…\",\n verifyOtp: \"ओटीपी (OTP) सत्यापयतु\",\n sendOtp: \"ओटीपी (OTP) प्रेषयतु\",\n confirmOtp: \"ओटीपी (OTP) सुनिश्चिनोतु\",\n verifyWithOtp: \"ओटीपी (OTP) द्वारा सत्यापयतु\",\n editSelections: \"चयनानि सम्पादयतु\",\n otpIncorrect:\n \"भवता प्रविष्टः सत्यापनसङ्केतः अशुद्धः अस्ति. कृपया परीक्ष्य पुनः प्रयतताम्.\",\n otpExpired:\n \"भवतः सत्यापनसङ्केतस्य अवधिः समाप्तः. कृपया नूतनं सङ्केतं प्रार्थयताम्.\",\n otpNotFound: \"सत्यापनसङ्केतः न प्राप्तः. कृपया नूतनं सङ्केतं प्रार्थयताम्.\",\n otpVerifyFailed: \"ओटीपी (OTP) सत्यापयितुं न शक्तम्. कृपया पुनः प्रयतताम्.\",\n otpSendFailed: \"ओटीपी (OTP) प्रेषयितुं न शक्तम्. कृपया पुनः प्रयतताम्.\",\n consentConfirmed: \"सम्मतिः सुनिश्चिता\",\n recordedUnder: \"ओटीपी (OTP) सत्यापितम् · {regulation} अन्तर्गतं लिखितम्\",\n recordedUnderAt:\n \"ओटीपी (OTP) सत्यापितम् · {regulation} अन्तर्गतं {time} समये लिखितम्\",\n consentReferenceId: \"सम्मति-सन्दर्भ-सङ्केतः\",\n proceed: \"अग्रे गच्छतु\",\n loadingNotice: \"सूचना आरोप्यते\",\n loadFailedTitle: \"सम्मति-सूचना आरोपयितुं न शक्यते\",\n tryAgain: \"कृपया पुनः प्रयत्नं करोतु।\",\n close: \"पिदधातु\",\n};\n\nconst sat: StaticStrings = {\n useEmailInstead: \"ᱤᱢᱮᱞ ᱵᱮᱵᱷᱟᱨ ᱢᱮ\",\n useMobileInstead: \"ᱢᱳᱵᱟᱭᱤᱞ ᱵᱮᱵᱷᱟᱨ ᱢᱮ\",\n emailAddress: \"ᱤᱢᱮᱞ ᱴᱷᱤᱠᱟᱱᱟ\",\n otpHelperEmail: \"ᱟᱞᱮ ᱱᱚᱣᱟ ᱤᱢᱮᱞ ᱨᱮ ᱢᱤᱫ ᱫᱷᱟᱣ ᱵᱮᱵᱷᱟᱨ ᱯᱟᱥᱣᱟᱰ ᱵᱷᱮᱡᱟᱣᱟ।\",\n changeEmail: \"ᱤᱢᱮᱞ ᱵᱚᱫᱚᱞ ᱢᱮ\",\n expandDetails: \"{name} ᱨᱮᱭᱟᱜ ᱵᱤᱵᱨᱚᱬ ᱯᱟᱥᱱᱟᱣ ᱢᱮ\",\n collapseDetails: \"{name} ᱨᱮᱭᱟᱜ ᱵᱤᱵᱨᱚᱬ ᱦᱩᱰᱤᱧ ᱢᱮ\",\n selectAllFor: \"{name} ᱞᱟᱹᱜᱤᱫ ᱡᱷᱚᱛᱚ ᱰᱟᱴᱟ ᱵᱟᱵᱚᱫ ᱵᱟᱪᱷᱟᱣ ᱢᱮ\",\n selectElement: \"{name} ᱵᱟᱪᱷᱟᱣ ᱢᱮ\",\n selectElementRequired: \"{name} ᱵᱟᱪᱷᱟᱣ ᱢᱮ (ᱫᱟᱨᱠᱟᱨ)\",\n required: \"ᱫᱟᱨᱠᱟᱨ\",\n logoAlt: \"ᱞᱚᱜᱚ\",\n selectLanguage: \"ᱯᱟᱹᱨᱥᱤ ᱵᱟᱪᱷᱟᱣ ᱢᱮ\",\n selectLanguageCurrent: \"ᱯᱟᱹᱨᱥᱤ ᱵᱟᱪᱷᱟᱣ ᱢᱮ। ᱱᱤᱛᱚᱜᱟᱜ ᱯᱟᱹᱨᱥᱤ: {lang}\",\n opensInNewTab: \"ᱱᱟᱣᱟ ᱴᱮᱵ ᱨᱮ ᱡᱷᱤᱡ ᱟᱠᱟᱱᱟ\",\n audioStart: \"ᱚᱰᱤᱭᱚ ᱯᱞᱮᱵᱮᱠ ᱮᱱᱮᱫ ᱢᱮ\",\n audioPause: \"ᱚᱰᱤᱭᱚ ᱯᱞᱮᱵᱮᱠ ᱛᱷᱟᱢᱟᱣ ᱢᱮ\",\n talkbackStart: \"ᱴᱚᱠᱵᱮᱠ ᱮᱱᱮᱫ ᱢᱮ\",\n talkbackPause: \"ᱴᱚᱠᱵᱮᱠ ᱛᱷᱟᱢᱟᱣ ᱢᱮ\",\n mobileNumber: \"ᱢᱳᱵᱟᱭᱤᱞ ᱱᱚᱢᱵᱚᱨ\",\n otpHelper: \"ᱟᱞᱮ ᱱᱚᱣᱟ ᱱᱚᱢᱵᱚᱨ ᱨᱮ ᱢᱤᱫ ᱫᱷᱟᱣ ᱵᱮᱵᱷᱟᱨ ᱯᱟᱥᱣᱟᱰ ᱵᱷᱮᱡᱟᱣᱟ।\",\n otpSentTo: \"ᱚᱴᱤᱯᱤ (OTP) ᱵᱷᱮᱡᱟᱣ ᱮᱱᱟ\",\n changeMobile: \"ᱢᱳᱵᱟᱭᱤᱞ ᱱᱚᱢᱵᱚᱨ ᱵᱚᱫᱚᱞ ᱢᱮ\",\n enterNDigitOtp: \"{count}-ᱴᱷᱮᱱ ᱟᱝᱠ ᱨᱮᱱᱟᱜ ᱚᱴᱤᱯᱤ (OTP) ᱟᱫᱮᱨ ᱢᱮ\",\n otpDigit: \"ᱚᱴᱤᱯᱤ (OTP) ᱟᱝᱠ {index}\",\n resendIn: \"{seconds} ᱥᱮᱠᱮᱱᱰ ᱨᱮ ᱚᱴᱤᱯᱤ (OTP) ᱫᱳᱦᱲᱟ ᱵᱷᱮᱡᱟ ᱢᱮ\",\n sending: \"ᱵᱷᱮᱡᱟᱣ ᱠᱟᱱᱟ…\",\n resendOtp: \"ᱚᱴᱤᱯᱤ (OTP) ᱫᱳᱦᱲᱟ ᱵᱷᱮᱡᱟ ᱢᱮ\",\n getOtp: \"ᱚᱴᱤᱯᱤ (OTP) ᱧᱟᱢ ᱢᱮ\",\n verifying: \"ᱯᱟᱨᱠᱷᱟ ᱠᱟᱱᱟ…\",\n verifyOtp: \"ᱚᱴᱤᱯᱤ (OTP) ᱯᱟᱨᱠᱷᱟ ᱢᱮ\",\n sendOtp: \"ᱚᱴᱤᱯᱤ (OTP) ᱵᱷᱮᱡᱟ ᱢᱮ\",\n confirmOtp: \"ᱚᱴᱤᱯᱤ (OTP) ᱯᱚᱠᱠᱟ ᱢᱮ\",\n verifyWithOtp: \"ᱚᱴᱤᱯᱤ (OTP) ᱛᱮ ᱯᱟᱨᱠᱷᱟ ᱢᱮ\",\n editSelections: \"ᱵᱟᱪᱷᱟᱣ ᱥᱟᱯᱲᱟᱣ ᱢᱮ\",\n otpIncorrect:\n \"ᱟᱢ ᱟᱫᱮᱨ ᱟᱠᱟᱱ ᱠᱳᱰ ᱵᱷᱩᱞ ᱠᱟᱱᱟ। ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱧᱮᱞ ᱠᱟᱛᱮ ᱫᱳᱦᱲᱟ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱢᱮ।\",\n otpExpired: \"ᱟᱢᱟᱜ ᱠᱳᱰ ᱨᱮᱱᱟᱜ ᱚᱠᱛᱚ ᱢᱩᱪᱟᱫ ᱮᱱᱟ। ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱱᱟᱣᱟ ᱠᱳᱰ ᱢᱟᱸᱜ ᱢᱮ।\",\n otpNotFound: \"ᱠᱳᱰ ᱵᱟᱝ ᱧᱟᱢ ᱞᱮᱱᱟ। ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱱᱟᱣᱟ ᱠᱳᱰ ᱢᱟᱸᱜ ᱢᱮ।\",\n otpVerifyFailed:\n \"ᱚᱴᱤᱯᱤ (OTP) ᱵᱟᱝ ᱯᱟᱨᱠᱷᱟ ᱦᱩᱭ ᱞᱮᱱᱟ। ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱫᱳᱦᱲᱟ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱢᱮ।\",\n otpSendFailed: \"ᱚᱴᱤᱯᱤ (OTP) ᱵᱟᱝ ᱵᱷᱮᱡᱟ ᱦᱩᱭ ᱞᱮᱱᱟ। ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱫᱳᱦᱲᱟ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱢᱮ।\",\n consentConfirmed: \"ᱨᱟᱹᱡᱤ ᱯᱚᱠᱠᱟ ᱦᱩᱭ ᱮᱱᱟ\",\n recordedUnder:\n \"ᱚᱴᱤᱯᱤ (OTP) ᱯᱟᱨᱠᱷᱟ ᱦᱩᱭ ᱮᱱᱟ · {regulation} ᱞᱟᱛᱟᱨ ᱨᱮ ᱱᱚᱛ ᱦᱩᱭ ᱮᱱᱟ\",\n recordedUnderAt:\n \"ᱚᱴᱤᱯᱤ (OTP) ᱯᱟᱨᱠᱷᱟ ᱦᱩᱭ ᱮᱱᱟ · {regulation} ᱞᱟᱛᱟᱨ ᱨᱮ {time} ᱨᱮ ᱱᱚᱛ ᱦᱩᱭ ᱮᱱᱟ\",\n consentReferenceId: \"ᱨᱟᱹᱡᱤ ᱨᱮᱯᱷᱨᱮᱱᱥ ᱟᱭᱰᱤ\",\n proceed: \"ᱟᱭᱢᱟ ᱪᱟᱞᱟᱜ ᱢᱮ\",\n loadingNotice: \"ᱱᱳᱴᱤᱥ ᱞᱳᱰ ᱦᱩᱭ ᱠᱟᱱᱟ\",\n loadFailedTitle: \"ᱨᱟᱹᱡᱤ ᱱᱳᱴᱤᱥ ᱞᱳᱰ ᱵᱟᱝ ᱦᱩᱭ ᱞᱮᱱᱟ\",\n tryAgain: \"ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱫᱳᱦᱲᱟ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱢᱮ।\",\n close: \"ᱵᱚᱸᱫᱚ ᱢᱮ\",\n};\n\nconst sd: StaticStrings = {\n useEmailInstead: \"اي ميل استعمال ڪريو\",\n useMobileInstead: \"موبائيل استعمال ڪريو\",\n emailAddress: \"اي ميل پتو\",\n otpHelperEmail: \"اسان هن اي ميل تي هڪ ڀيرو استعمال ٿيندڙ پاسورڊ موڪلينداسين.\",\n changeEmail: \"اي ميل تبديل ڪريو\",\n expandDetails: \"{name} جا تفصيل وڌايو\",\n collapseDetails: \"{name} جا تفصيل سُکيڙيو\",\n selectAllFor: \"{name} لاءِ سڀ ڊيٽا عنصر چونڊيو\",\n selectElement: \"{name} چونڊيو\",\n selectElementRequired: \"{name} چونڊيو (ضروري)\",\n required: \"ضروري\",\n logoAlt: \"لوگو\",\n selectLanguage: \"ٻولي چونڊيو\",\n selectLanguageCurrent: \"ٻولي چونڊيو. موجودہ ٻولي: {lang}\",\n opensInNewTab: \"نئين ٽيب ۾ کُلي ٿو\",\n audioStart: \"آڊيو پلے بيڪ شروع ڪريو\",\n audioPause: \"آڊيو پلے بيڪ روڪيو\",\n talkbackStart: \"ٽاڪ بيڪ شروع ڪريو\",\n talkbackPause: \"ٽاڪ بيڪ روڪيو\",\n mobileNumber: \"موبائيل نمبر\",\n otpHelper: \"اسان هن نمبر تي هڪ ڀيرو استعمال ٿيندڙ پاسورڊ موڪلينداسين.\",\n otpSentTo: \"او ٽي پي (OTP) موڪليو ويو\",\n changeMobile: \"موبائيل نمبر تبديل ڪريو\",\n enterNDigitOtp: \"{count}-عددن وارو او ٽي پي (OTP) داخل ڪريو\",\n otpDigit: \"او ٽي پي (OTP) عدد {index}\",\n resendIn: \"{seconds} سيڪنڊن ۾ او ٽي پي (OTP) ٻيهر موڪليو\",\n sending: \"موڪليو پيو وڃي…\",\n resendOtp: \"او ٽي پي (OTP) ٻيهر موڪليو\",\n getOtp: \"او ٽي پي (OTP) حاصل ڪريو\",\n verifying: \"تصديق ٿي رهي آهي…\",\n verifyOtp: \"او ٽي پي (OTP) جي تصديق ڪريو\",\n sendOtp: \"او ٽي پي (OTP) موڪليو\",\n confirmOtp: \"او ٽي پي (OTP) جي تصديق ڪريو\",\n verifyWithOtp: \"او ٽي پي (OTP) سان تصديق ڪريو\",\n editSelections: \"چونڊون تبديل ڪريو\",\n otpIncorrect:\n \"توهان داخل ڪيل تصديق ڪوڊ غلط آهي. مهرباني ڪري جانچيو ۽ ٻيهر ڪوشش ڪريو.\",\n otpExpired:\n \"توهان جي تصديق ڪوڊ جي مدت ختم ٿي وئي آهي. مهرباني ڪري نئون ڪوڊ گهرو.\",\n otpNotFound: \"تصديق ڪوڊ نه مليو. مهرباني ڪري نئون ڪوڊ گهرو.\",\n otpVerifyFailed:\n \"او ٽي پي (OTP) جي تصديق نه ٿي سگهي. مهرباني ڪري ٻيهر ڪوشش ڪريو.\",\n otpSendFailed: \"او ٽي پي (OTP) موڪلي نه سگهيو. مهرباني ڪري ٻيهر ڪوشش ڪريو.\",\n consentConfirmed: \"رضامندي جي تصديق ٿي\",\n recordedUnder: \"او ٽي پي (OTP) تصديق ٿيل · {regulation} تحت رڪارڊ ٿيل\",\n recordedUnderAt:\n \"او ٽي پي (OTP) تصديق ٿيل · {regulation} تحت {time} تي رڪارڊ ٿيل\",\n consentReferenceId: \"رضامندي ريفرنس آءِ ڊي\",\n proceed: \"اڳتي وڌو\",\n loadingNotice: \"نوٽيس لوڊ ٿي رهيو آهي\",\n loadFailedTitle: \"رضامندي نوٽيس لوڊ نه ٿي سگھيو\",\n tryAgain: \"مهرباني ڪري ٻيهر ڪوشش ڪريو.\",\n close: \"بند ڪريو\",\n};\n\nconst ta: StaticStrings = {\n useEmailInstead: \"மின்னஞ்சல் பயன்படுத்து\",\n useMobileInstead: \"மொபைல் பயன்படுத்து\",\n emailAddress: \"மின்னஞ்சல் முகவரி\",\n otpHelperEmail: \"இந்த மின்னஞ்சலுக்கு ஒரு முறை பயன்படுத்தும் கடவுச்சொல்லை அனுப்புவோம்.\",\n changeEmail: \"மின்னஞ்சலை மாற்று\",\n expandDetails: \"{name} விவரங்களை விரிவாக்கு\",\n collapseDetails: \"{name} விவரங்களை சுருக்கு\",\n selectAllFor: \"{name} க்கான அனைத்து தரவு கூறுகளையும் தேர்ந்தெடு\",\n selectElement: \"{name} தேர்ந்தெடு\",\n selectElementRequired: \"{name} தேர்ந்தெடு (தேவை)\",\n required: \"தேவை\",\n logoAlt: \"லோகோ\",\n selectLanguage: \"மொழியைத் தேர்ந்தெடு\",\n selectLanguageCurrent: \"மொழியைத் தேர்ந்தெடு. தற்போதைய மொழி: {lang}\",\n opensInNewTab: \"புதிய தாவலில் திறக்கிறது\",\n audioStart: \"ஆடியோ பிளேபேக்கைத் தொடங்கு\",\n audioPause: \"ஆடியோ பிளேபேக்கை இடைநிறுத்து\",\n talkbackStart: \"டாக்பேக்கைத் தொடங்கு\",\n talkbackPause: \"டாக்பேக்கை இடைநிறுத்து\",\n mobileNumber: \"மொபைல் எண்\",\n otpHelper: \"இந்த எண்ணுக்கு ஒரு முறை பயன்படுத்தும் கடவுச்சொல்லை அனுப்புவோம்.\",\n otpSentTo: \"ஓடிபி (OTP) அனுப்பப்பட்டது\",\n changeMobile: \"மொபைல் எண்ணை மாற்று\",\n enterNDigitOtp: \"{count}-இலக்க ஓடிபி (OTP) ஐ உள்ளிடவும்\",\n otpDigit: \"ஓடிபி (OTP) இலக்கம் {index}\",\n resendIn: \"{seconds} வினாடிகளில் ஓடிபி (OTP) ஐ மீண்டும் அனுப்பு\",\n sending: \"அனுப்புகிறது…\",\n resendOtp: \"ஓடிபி (OTP) ஐ மீண்டும் அனுப்பு\",\n getOtp: \"ஓடிபி (OTP) பெறு\",\n verifying: \"சரிபார்க்கிறது…\",\n verifyOtp: \"ஓடிபி (OTP) ஐ சரிபார்\",\n sendOtp: \"ஓடிபி (OTP) ஐ அனுப்பு\",\n confirmOtp: \"ஓடிபி (OTP) ஐ உறுதிப்படுத்து\",\n verifyWithOtp: \"ஓடிபி (OTP) மூலம் சரிபார்\",\n editSelections: \"தேர்வுகளைத் திருத்து\",\n otpIncorrect:\n \"நீங்கள் உள்ளிட்ட சரிபார்ப்புக் குறியீடு தவறானது. சரிபார்த்து மீண்டும் முயற்சிக்கவும்.\",\n otpExpired:\n \"உங்கள் சரிபார்ப்புக் குறியீட்டின் காலம் முடிந்தது. புதிய குறியீட்டைக் கோரவும்.\",\n otpNotFound:\n \"சரிபார்ப்புக் குறியீடு கிடைக்கவில்லை. புதிய குறியீட்டைக் கோரவும்.\",\n otpVerifyFailed:\n \"ஓடிபி (OTP) ஐ சரிபார்க்க முடியவில்லை. மீண்டும் முயற்சிக்கவும்.\",\n otpSendFailed: \"ஓடிபி (OTP) ஐ அனுப்ப முடியவில்லை. மீண்டும் முயற்சிக்கவும்.\",\n consentConfirmed: \"ஒப்புதல் உறுதி செய்யப்பட்டது\",\n recordedUnder:\n \"ஓடிபி (OTP) சரிபார்க்கப்பட்டது · {regulation} இன் கீழ் பதிவு செய்யப்பட்டது\",\n recordedUnderAt:\n \"ஓடிபி (OTP) சரிபார்க்கப்பட்டது · {regulation} இன் கீழ் {time} மணிக்கு பதிவு செய்யப்பட்டது\",\n consentReferenceId: \"ஒப்புதல் குறிப்பு ஐடி\",\n proceed: \"தொடரவும்\",\n loadingNotice: \"அறிவிப்பு ஏற்றப்படுகிறது\",\n loadFailedTitle: \"ஒப்புதல் அறிவிப்பை ஏற்ற முடியவில்லை\",\n tryAgain: \"மீண்டும் முயற்சிக்கவும்.\",\n close: \"மூடு\",\n};\n\nconst te: StaticStrings = {\n useEmailInstead: \"ఇమెయిల్ ఉపయోగించండి\",\n useMobileInstead: \"మొబైల్ ఉపయోగించండి\",\n emailAddress: \"ఇమెయిల్ చిరునామా\",\n otpHelperEmail: \"మేము ఈ ఇమెయిల్కు ఒక్కసారి ఉపయోగించే పాస్వర్డ్ను పంపుతాము.\",\n changeEmail: \"ఇమెయిల్ మార్చు\",\n expandDetails: \"{name} వివరాలను విస్తరించు\",\n collapseDetails: \"{name} వివరాలను కుదించు\",\n selectAllFor: \"{name} కోసం అన్ని డేటా అంశాలను ఎంచుకోండి\",\n selectElement: \"{name} ఎంచుకోండి\",\n selectElementRequired: \"{name} ఎంచుకోండి (అవసరం)\",\n required: \"అవసరం\",\n logoAlt: \"లోగో\",\n selectLanguage: \"భాష ఎంచుకోండి\",\n selectLanguageCurrent: \"భాష ఎంచుకోండి. ప్రస్తుత భాష: {lang}\",\n opensInNewTab: \"కొత్త ట్యాబ్లో తెరుచుకుంటుంది\",\n audioStart: \"ఆడియో ప్లేబ్యాక్ ప్రారంభించు\",\n audioPause: \"ఆడియో ప్లేబ్యాక్ నిలిపివేయి\",\n talkbackStart: \"టాక్బ్యాక్ ప్రారంభించు\",\n talkbackPause: \"టాక్బ్యాక్ నిలిపివేయి\",\n mobileNumber: \"మొబైల్ నంబర్\",\n otpHelper: \"మేము ఈ నంబర్కు ఒక్కసారి ఉపయోగించే పాస్వర్డ్ను పంపుతాము.\",\n otpSentTo: \"ఓటీపీ (OTP) పంపబడింది\",\n changeMobile: \"మొబైల్ నంబర్ మార్చు\",\n enterNDigitOtp: \"{count}-అంకెల ఓటీపీ (OTP) నమోదు చేయండి\",\n otpDigit: \"ఓటీపీ (OTP) అంకె {index}\",\n resendIn: \"{seconds} సెకన్లలో ఓటీపీ (OTP) మళ్లీ పంపు\",\n sending: \"పంపుతోంది…\",\n resendOtp: \"ఓటీపీ (OTP) మళ్లీ పంపు\",\n getOtp: \"ఓటీపీ (OTP) పొందండి\",\n verifying: \"ధృవీకరిస్తోంది…\",\n verifyOtp: \"ఓటీపీ (OTP) ధృవీకరించండి\",\n sendOtp: \"ఓటీపీ (OTP) పంపండి\",\n confirmOtp: \"ఓటీపీ (OTP) నిర్ధారించండి\",\n verifyWithOtp: \"ఓటీపీ (OTP) ద్వారా ధృవీకరించండి\",\n editSelections: \"ఎంపికలను సవరించండి\",\n otpIncorrect:\n \"మీరు నమోదు చేసిన ధృవీకరణ కోడ్ తప్పు. దయచేసి తనిఖీ చేసి మళ్లీ ప్రయత్నించండి.\",\n otpExpired: \"మీ ధృవీకరణ కోడ్ గడువు ముగిసింది. దయచేసి కొత్త కోడ్ అడగండి.\",\n otpNotFound: \"ధృవీకరణ కోడ్ కనుగొనబడలేదు. దయచేసి కొత్త కోడ్ అడగండి.\",\n otpVerifyFailed:\n \"ఓటీపీ (OTP) ధృవీకరించడం సాధ్యం కాలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.\",\n otpSendFailed: \"ఓటీపీ (OTP) పంపడం సాధ్యం కాలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.\",\n consentConfirmed: \"సమ్మతి నిర్ధారించబడింది\",\n recordedUnder:\n \"ఓటీపీ (OTP) ధృవీకరించబడింది · {regulation} కింద నమోదు చేయబడింది\",\n recordedUnderAt:\n \"ఓటీపీ (OTP) ధృవీకరించబడింది · {regulation} కింద {time}కి నమోదు చేయబడింది\",\n consentReferenceId: \"సమ్మతి సూచన ఐడీ\",\n proceed: \"కొనసాగించు\",\n loadingNotice: \"నోటీసు లోడ్ అవుతోంది\",\n loadFailedTitle: \"సమ్మతి నోటీసును లోడ్ చేయడం సాధ్యం కాలేదు\",\n tryAgain: \"దయచేసి మళ్లీ ప్రయత్నించండి.\",\n close: \"మూసివేయి\",\n};\n\nconst ur: StaticStrings = {\n useEmailInstead: \"ای میل استعمال کریں\",\n useMobileInstead: \"موبائل استعمال کریں\",\n emailAddress: \"ای میل پتہ\",\n otpHelperEmail: \"ہم اس ای میل پر ایک بار استعمال ہونے والا پاس ورڈ بھیجیں گے۔\",\n changeEmail: \"ای میل تبدیل کریں\",\n expandDetails: \"{name} کی تفصیلات پھیلائیں\",\n collapseDetails: \"{name} کی تفصیلات سمیٹیں\",\n selectAllFor: \"{name} کے لیے تمام ڈیٹا عناصر منتخب کریں\",\n selectElement: \"{name} منتخب کریں\",\n selectElementRequired: \"{name} منتخب کریں (لازمی)\",\n required: \"لازمی\",\n logoAlt: \"لوگو\",\n selectLanguage: \"زبان منتخب کریں\",\n selectLanguageCurrent: \"زبان منتخب کریں۔ موجودہ زبان: {lang}\",\n opensInNewTab: \"نئے ٹیب میں کھلتا ہے\",\n audioStart: \"آڈیو پلے بیک شروع کریں\",\n audioPause: \"آڈیو پلے بیک روکیں\",\n talkbackStart: \"ٹاک بیک شروع کریں\",\n talkbackPause: \"ٹاک بیک روکیں\",\n mobileNumber: \"موبائل نمبر\",\n otpHelper: \"ہم اس نمبر پر ایک بار استعمال ہونے والا پاس ورڈ بھیجیں گے۔\",\n otpSentTo: \"او ٹی پی (OTP) بھیج دیا گیا\",\n changeMobile: \"موبائل نمبر تبدیل کریں\",\n enterNDigitOtp: \"{count}-ہندسوں والا او ٹی پی (OTP) درج کریں\",\n otpDigit: \"او ٹی پی (OTP) ہندسہ {index}\",\n resendIn: \"{seconds} سیکنڈ میں او ٹی پی (OTP) دوبارہ بھیجیں\",\n sending: \"بھیجا جا رہا ہے…\",\n resendOtp: \"او ٹی پی (OTP) دوبارہ بھیجیں\",\n getOtp: \"او ٹی پی (OTP) حاصل کریں\",\n verifying: \"تصدیق ہو رہی ہے…\",\n verifyOtp: \"او ٹی پی (OTP) کی تصدیق کریں\",\n sendOtp: \"او ٹی پی (OTP) بھیجیں\",\n confirmOtp: \"او ٹی پی (OTP) کی تصدیق کریں\",\n verifyWithOtp: \"او ٹی پی (OTP) سے تصدیق کریں\",\n editSelections: \"انتخاب میں ترمیم کریں\",\n otpIncorrect:\n \"آپ کا درج کردہ توثیقی کوڈ غلط ہے۔ براہ کرم جانچیں اور دوبارہ کوشش کریں۔\",\n otpExpired:\n \"آپ کے توثیقی کوڈ کی میعاد ختم ہو گئی ہے۔ براہ کرم نیا کوڈ طلب کریں۔\",\n otpNotFound: \"توثیقی کوڈ نہیں ملا۔ براہ کرم نیا کوڈ طلب کریں۔\",\n otpVerifyFailed:\n \"او ٹی پی (OTP) کی تصدیق نہیں ہو سکی۔ براہ کرم دوبارہ کوشش کریں۔\",\n otpSendFailed: \"او ٹی پی (OTP) نہیں بھیجا جا سکا۔ براہ کرم دوبارہ کوشش کریں۔\",\n consentConfirmed: \"رضامندی کی تصدیق ہو گئی\",\n recordedUnder:\n \"او ٹی پی (OTP) تصدیق شدہ · {regulation} کے تحت ریکارڈ کیا گیا\",\n recordedUnderAt:\n \"او ٹی پی (OTP) تصدیق شدہ · {regulation} کے تحت {time} پر ریکارڈ کیا گیا\",\n consentReferenceId: \"رضامندی ریفرنس آئی ڈی\",\n proceed: \"آگے بڑھیں\",\n loadingNotice: \"نوٹس لوڈ ہو رہا ہے\",\n loadFailedTitle: \"رضامندی نوٹس لوڈ نہیں ہو سکا\",\n tryAgain: \"براہ کرم دوبارہ کوشش کریں۔\",\n close: \"بند کریں\",\n};\n\nconst as: StaticStrings = {\n useEmailInstead: \"ইমেইল ব্যৱহাৰ কৰক\",\n useMobileInstead: \"মোবাইল ব্যৱহাৰ কৰক\",\n emailAddress: \"ইমেইল ঠিকনা\",\n otpHelperEmail: \"আমি এই ইমেইললৈ এটা এবাৰ ব্যৱহাৰযোগ্য পাছৱৰ্ড পঠিয়াম।\",\n changeEmail: \"ইমেইল সলনি কৰক\",\n expandDetails: \"{name} ৰ বিৱৰণ বিস্তাৰ কৰক\",\n collapseDetails: \"{name} ৰ বিৱৰণ সংকোচন কৰক\",\n selectAllFor: \"{name} ৰ বাবে সকলো ডাটা উপাদান বাছনি কৰক\",\n selectElement: \"{name} বাছনি কৰক\",\n selectElementRequired: \"{name} বাছনি কৰক (আৱশ্যক)\",\n required: \"আৱশ্যক\",\n logoAlt: \"ল’গো\",\n selectLanguage: \"ভাষা বাছনি কৰক\",\n selectLanguageCurrent: \"ভাষা বাছনি কৰক। বৰ্তমানৰ ভাষা: {lang}\",\n opensInNewTab: \"নতুন টেবত খোলে\",\n audioStart: \"অডিঅ’ প্লেবেক আৰম্ভ কৰক\",\n audioPause: \"অডিঅ’ প্লেবেক বিৰতি দিয়ক\",\n talkbackStart: \"টকবেক আৰম্ভ কৰক\",\n talkbackPause: \"টকবেক বিৰতি দিয়ক\",\n mobileNumber: \"মোবাইল নম্বৰ\",\n otpHelper: \"আমি এই নম্বৰলৈ এটা এবাৰ ব্যৱহাৰযোগ্য পাছৱৰ্ড পঠিয়াম।\",\n otpSentTo: \"ওটিপি (OTP) পঠিওৱা হ’ল\",\n changeMobile: \"মোবাইল নম্বৰ সলনি কৰক\",\n enterNDigitOtp: \"{count}-অংকৰ ওটিপি (OTP) দিয়ক\",\n otpDigit: \"ওটিপি (OTP) অংক {index}\",\n resendIn: \"{seconds} ছেকেণ্ডত ওটিপি (OTP) পুনৰ পঠিয়াওক\",\n sending: \"পঠিওৱা হৈ আছে…\",\n resendOtp: \"ওটিপি (OTP) পুনৰ পঠিয়াওক\",\n getOtp: \"ওটিপি (OTP) লওক\",\n verifying: \"সত্যাপন কৰি আছে…\",\n verifyOtp: \"ওটিপি (OTP) সত্যাপন কৰক\",\n sendOtp: \"ওটিপি (OTP) পঠিয়াওক\",\n confirmOtp: \"ওটিপি (OTP) নিশ্চিত কৰক\",\n verifyWithOtp: \"ওটিপি (OTP) ৰে সত্যাপন কৰক\",\n editSelections: \"বাছনিসমূহ সম্পাদনা কৰক\",\n otpIncorrect:\n \"আপুনি দিয়া সত্যাপন ক'ড ভুল। অনুগ্ৰহ কৰি পৰীক্ষা কৰি পুনৰ চেষ্টা কৰক।\",\n otpExpired: \"আপোনাৰ সত্যাপন ক'ডৰ ম্যাদ উকলিল। অনুগ্ৰহ কৰি নতুন ক'ড বিচাৰক।\",\n otpNotFound: \"সত্যাপন ক'ড পোৱা নগ'ল। অনুগ্ৰহ কৰি নতুন ক'ড বিচাৰক।\",\n otpVerifyFailed:\n \"ওটিপি (OTP) সত্যাপন কৰিব পৰা নগ'ল। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।\",\n otpSendFailed: \"ওটিপি (OTP) পঠিয়াব পৰা নগ'ল। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।\",\n consentConfirmed: \"সন্মতি নিশ্চিত হ’ল\",\n recordedUnder: \"ওটিপি (OTP) সত্যাপিত · {regulation} ৰ অধীনত লিপিবদ্ধ কৰা হ’ল\",\n recordedUnderAt:\n \"ওটিপি (OTP) সত্যাপিত · {regulation} ৰ অধীনত {time} বজাত লিপিবদ্ধ কৰা হ’ল\",\n consentReferenceId: \"সন্মতি ৰেফাৰেন্স আইডি\",\n proceed: \"আগবাঢ়ক\",\n loadingNotice: \"জাননী ল’ড হৈ আছে\",\n loadFailedTitle: \"সন্মতি জাননী ল’ড কৰিব পৰা নগ’ল\",\n tryAgain: \"অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।\",\n close: \"বন্ধ কৰক\",\n};\n\nconst brx: StaticStrings = {\n useEmailInstead: \"इमेल बाहाय\",\n useMobileInstead: \"मबाइल बाहाय\",\n emailAddress: \"इमेल ठिकानाय\",\n otpHelperEmail: \"जों बे इमेलआव मोनसे थांखि बाहायनाय पासवार्ड दैथायगोन।\",\n changeEmail: \"इमेल सोलायहो\",\n expandDetails: \"{name} नि गुवारै बेखेवनाय खालामो\",\n collapseDetails: \"{name} नि गुवारै फुंखानाय खालामो\",\n selectAllFor: \"{name} नि थाखाय गासै डाटा बिथिं सायख\",\n selectElement: \"{name} सायख\",\n selectElementRequired: \"{name} सायख (गोनां)\",\n required: \"गोनां\",\n logoAlt: \"लोगो\",\n selectLanguage: \"राव सायख\",\n selectLanguageCurrent: \"राव सायख। दानि राव: {lang}\",\n opensInNewTab: \"गोदान टेबआव खेवनाय जायो\",\n audioStart: \"अडिअ' प्लेबेक जागायहो\",\n audioPause: \"अडिअ' प्लेबेक थिनाय खालामो\",\n talkbackStart: \"टकबेक जागायहो\",\n talkbackPause: \"टकबेक थिनाय खालामो\",\n mobileNumber: \"मबाइल नम्बर\",\n otpHelper: \"जों बे नम्बरआव मोनसे थांखि बाहायनाय पासवार्ड दैथायगोन।\",\n otpSentTo: \"ओटीपी (OTP) दैथायबाय\",\n changeMobile: \"मबाइल नम्बर सोलायहो\",\n enterNDigitOtp: \"{count}-अंकनि ओटीपी (OTP) हाबहो\",\n otpDigit: \"ओटीपी (OTP) अंक {index}\",\n resendIn: \"{seconds} सेकेन्डआव ओटीपी (OTP) फिन दैथाय\",\n sending: \"दैथायगासिनो दं…\",\n resendOtp: \"ओटीपी (OTP) फिन दैथाय\",\n getOtp: \"ओटीपी (OTP) मोनो\",\n verifying: \"रोखा खालामगासिनो दं…\",\n verifyOtp: \"ओटीपी (OTP) रोखा खालामो\",\n sendOtp: \"ओटीपी (OTP) दैथाय\",\n confirmOtp: \"ओटीपी (OTP) पोखा खालामो\",\n verifyWithOtp: \"ओटीपी (OTP) जों रोखा खालामो\",\n editSelections: \"सायखनायखौ सुजुहो\",\n otpIncorrect:\n \"नोंथाङा हाबहोनाय सत्यापन कोडआ गोरोबा नङा। अननानै नाजावनानै फिन नाजा।\",\n otpExpired: \"नोंथांनि सत्यापन कोडनि सम जोबबाय। अननानै गोदान कोड बिथां।\",\n otpNotFound: \"सत्यापन कोड मोनाखै। अननानै गोदान कोड बिथां।\",\n otpVerifyFailed: \"ओटीपी (OTP) रोखा खालामनो हायाखै। अननानै फिन नाजा।\",\n otpSendFailed: \"ओटीपी (OTP) दैथायनो हायाखै। अननानै फिन नाजा।\",\n consentConfirmed: \"रायजुमनाय रोखा जाबाय\",\n recordedUnder: \"ओटीपी (OTP) रोखा जाबाय · {regulation} नि सिङाव लिरनाय जादों\",\n recordedUnderAt:\n \"ओटीपी (OTP) रोखा जाबाय · {regulation} नि सिङाव {time} आव लिरनाय जादों\",\n consentReferenceId: \"रायजुमनाय रेफरेन्स आइडि\",\n proceed: \"सिगांआव थां\",\n loadingNotice: \"नोटिस लोड जागासिनो दं\",\n loadFailedTitle: \"रायजुमनाय नोटिस लोड खालामनो हायाखै\",\n tryAgain: \"अननानै फिन नाजा।\",\n close: \"बन्द खालामो\",\n};\n\nconst doi: StaticStrings = {\n useEmailInstead: \"ईमेल बरतो\",\n useMobileInstead: \"मोबाइल बरतो\",\n emailAddress: \"ईमेल पता\",\n otpHelperEmail: \"अस इस ईमेल पर इक बारी बरतोने आह्ला पासवर्ड भेजगे।\",\n changeEmail: \"ईमेल बदलो\",\n expandDetails: \"{name} दा विवरण फैलाओ\",\n collapseDetails: \"{name} दा विवरण समेटो\",\n selectAllFor: \"{name} आस्तै सब्भै डेटा तत्व चुनो\",\n selectElement: \"{name} चुनो\",\n selectElementRequired: \"{name} चुनो (लोड़चदा)\",\n required: \"लोड़चदा\",\n logoAlt: \"लोगो\",\n selectLanguage: \"भाशा चुनो\",\n selectLanguageCurrent: \"भाशा चुनो। मजूदा भाशा: {lang}\",\n opensInNewTab: \"नमें टैब च खुल्लदा ऐ\",\n audioStart: \"ऑडियो प्लेबैक शुरू करो\",\n audioPause: \"ऑडियो प्लेबैक रोको\",\n talkbackStart: \"टॉकबैक शुरू करो\",\n talkbackPause: \"टॉकबैक रोको\",\n mobileNumber: \"मोबाइल नंबर\",\n otpHelper: \"अस इस नंबर पर इक बारी बरतोने आह्ला पासवर्ड भेजगे।\",\n otpSentTo: \"ओटीपी (OTP) भेजेआ गेआ\",\n changeMobile: \"मोबाइल नंबर बदलो\",\n enterNDigitOtp: \"{count}-अंकें दा ओटीपी (OTP) पाओ\",\n otpDigit: \"ओटीपी (OTP) अंक {index}\",\n resendIn: \"{seconds} सकिंटें च ओटीपी (OTP) फ्ही भेजो\",\n sending: \"भेजेआ जा करदा ऐ…\",\n resendOtp: \"ओटीपी (OTP) फ्ही भेजो\",\n getOtp: \"ओटीपी (OTP) हासल करो\",\n verifying: \"तसदीक कीती जा करदी ऐ…\",\n verifyOtp: \"ओटीपी (OTP) दी तसदीक करो\",\n sendOtp: \"ओटीपी (OTP) भेजो\",\n confirmOtp: \"ओटीपी (OTP) दी पुष्टी करो\",\n verifyWithOtp: \"ओटीपी (OTP) कन्नै तसदीक करो\",\n editSelections: \"चोनें गी बदलो\",\n otpIncorrect:\n \"तुसें दर्ज कीता तसदीक कोड गलत ऐ। किरपा करियै जाँच करो ते फ्ही कोशिश करो।\",\n otpExpired:\n \"तुंदे तसदीक कोड दी मीयाद खत्म होई गेई ऐ। किरपा करियै नमां कोड मंगो।\",\n otpNotFound: \"तसदीक कोड नेईं मिलेआ। किरपा करियै नमां कोड मंगो।\",\n otpVerifyFailed:\n \"ओटीपी (OTP) दी तसदीक नेईं होई सकी। किरपा करियै फ्ही कोशिश करो।\",\n otpSendFailed: \"ओटीपी (OTP) नेईं भेजेआ जाई सकेआ। किरपा करियै फ्ही कोशिश करो।\",\n consentConfirmed: \"सहमति दी पुष्टी होई\",\n recordedUnder: \"ओटीपी (OTP) तसदीकशुदा · {regulation} दे तहत दर्ज कीता गेआ\",\n recordedUnderAt:\n \"ओटीपी (OTP) तसदीकशुदा · {regulation} दे तहत {time} पर दर्ज कीता गेआ\",\n consentReferenceId: \"सहमति रैफरैंस आईडी\",\n proceed: \"अग्गें बधो\",\n loadingNotice: \"नोटिस लोड होआ करदा ऐ\",\n loadFailedTitle: \"सहमति नोटिस लोड नेईं होई सकेआ\",\n tryAgain: \"किरपा करियै फ्ही कोशिश करो।\",\n close: \"बंद करो\",\n};\n\nexport const STATIC_STRINGS: Record<string, StaticStrings> = {\n en,\n hi,\n bn,\n gu,\n kn,\n ks,\n gom,\n mai,\n ml,\n \"mni-Mtei\": mniMtei,\n mr,\n ne,\n or,\n pa,\n sa,\n sat,\n sd,\n ta,\n te,\n ur,\n as,\n brx,\n doi,\n};\n\nconst interpolate = (template: string, vars?: StaticVars): string =>\n vars\n ? template.replace(/\\{(\\w+)\\}/g, (match, token) =>\n token in vars ? String(vars[token]) : match,\n )\n : template;\n\nexport const makeStaticT =\n (langCode: string) =>\n (key: StaticKey, vars?: StaticVars): string => {\n const table = STATIC_STRINGS[langCode] ?? en;\n const template = table[key] ?? en[key];\n return interpolate(template, vars);\n };\n","import { svg } from \"../core/dom\";\n\nconst icon = (size: number, color: string, strokeWidth: number, ...children: SVGElement[]): SVGElement =>\n svg(\n \"svg\",\n {\n width: String(size),\n height: String(size),\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: color,\n \"stroke-width\": String(strokeWidth),\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"aria-hidden\": \"true\",\n style: { flexShrink: 0 },\n },\n ...children\n );\n\nexport const lockIcon = (color: string): SVGElement =>\n icon(\n 15,\n color,\n 2,\n svg(\"rect\", { x: \"3\", y: \"11\", width: \"18\", height: \"11\", rx: \"2\" }),\n svg(\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\" })\n );\n\nexport const checkIcon = (color: string): SVGElement =>\n icon(15, color, 2.5, svg(\"path\", { d: \"M20 6 9 17l-5-5\" }));\n\nexport const clockIcon = (color: string): SVGElement =>\n icon(13, color, 2, svg(\"circle\", { cx: \"12\", cy: \"12\", r: \"9\" }), svg(\"path\", { d: \"M12 7v5l3 2\" }));\n\nexport const phoneIcon = (color: string): SVGElement =>\n icon(\n 14,\n color,\n 2,\n svg(\"path\", {\n d: \"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z\",\n })\n );\n\nexport const mailIcon = (color: string): SVGElement =>\n icon(\n 14,\n color,\n 2,\n svg(\"rect\", { x: \"2\", y: \"4\", width: \"20\", height: \"16\", rx: \"2\" }),\n svg(\"path\", { d: \"m22 7-10 5L2 7\" })\n );\n\nexport const chevronIcon = (expanded: boolean, color = \"#323B4B\"): SVGElement =>\n svg(\n \"svg\",\n {\n width: \"7\",\n height: \"12\",\n viewBox: \"0 0 7 12\",\n fill: \"none\",\n stroke: color,\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"aria-hidden\": \"true\",\n style: {\n transform: expanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.3s ease\",\n },\n },\n svg(\"path\", { d: \"M1 1L6 6L1 11\" })\n );\n\nexport const speakerIcon = (playing: boolean): SVGElement =>\n playing\n ? icon(\n 16,\n \"currentColor\",\n 2,\n svg(\"rect\", { x: \"6\", y: \"4\", width: \"4\", height: \"16\" }),\n svg(\"rect\", { x: \"14\", y: \"4\", width: \"4\", height: \"16\" })\n )\n : icon(\n 16,\n \"currentColor\",\n 2,\n svg(\"polygon\", { points: \"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" }),\n svg(\"path\", { d: \"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\" })\n );\n","import { buildSelectionForMode, dataElementKey } from \"../modal/consentSelection\";\nimport { ASSISTED_CONFIG, DEFAULT_PURPOSE_PRESELECTION, EMAIL_REGEX } from \"./constants\";\nimport type { Purpose, PurposeItemData } from \"../api/types\";\nimport type { AcceptMode, SelectablePurpose } from \"../types\";\nimport { ApiError } from \"../shared/api-errors\";\nimport type { AssistedSelection, PurposePreselection, StaticKey, VerifyMethod } from \"./types\";\n\nexport const isBlockingRequiredElement = (element: {\n enabled: boolean;\n required: boolean;\n}): boolean => element.required && element.enabled;\n\nexport const hasBlockingRequiredElement = (purpose: SelectablePurpose): boolean =>\n purpose.data_elements.some(isBlockingRequiredElement);\n\nexport const resolvePurposePreselection = (\n raw: string | undefined | null\n): PurposePreselection =>\n raw === \"MANDATORY\" || raw === \"ALL\" ? raw : DEFAULT_PURPOSE_PRESELECTION;\n\nexport const buildPreselection = (\n purposes: ReadonlyArray<SelectablePurpose>,\n mode: PurposePreselection\n): AssistedSelection => {\n const empty: AssistedSelection = { selectedPurposes: {}, selectedDataElements: {} };\n if (mode === \"ALL\") {\n return buildSelectionForMode(purposes.map((purpose) => ({ purpose })), \"all\", empty);\n }\n\n purposes.forEach((purpose) => {\n let hasPreselectedElement = false;\n purpose.data_elements.forEach((element) => {\n const isPreselected = mode === \"MANDATORY\" && isBlockingRequiredElement(element);\n empty.selectedDataElements[dataElementKey(purpose.uuid, element.uuid)] = isPreselected;\n hasPreselectedElement = hasPreselectedElement || isPreselected;\n });\n empty.selectedPurposes[purpose.uuid] = hasPreselectedElement;\n });\n\n return empty;\n};\n\nexport const togglePurposeSelection = (\n purpose: SelectablePurpose,\n current: AssistedSelection\n): AssistedSelection => {\n const next = !current.selectedPurposes[purpose.uuid];\n const selectedDataElements = { ...current.selectedDataElements };\n purpose.data_elements.forEach((element) => {\n selectedDataElements[dataElementKey(purpose.uuid, element.uuid)] = next && element.enabled;\n });\n return {\n selectedPurposes: { ...current.selectedPurposes, [purpose.uuid]: next },\n selectedDataElements,\n };\n};\n\nexport const toggleDataElementSelection = (\n purpose: SelectablePurpose,\n elementUuid: string,\n current: AssistedSelection\n): AssistedSelection => {\n const key = dataElementKey(purpose.uuid, elementUuid);\n const selectedDataElements = {\n ...current.selectedDataElements,\n [key]: !current.selectedDataElements[key],\n };\n const isTicked = (element: { uuid: string }) =>\n Boolean(selectedDataElements[dataElementKey(purpose.uuid, element.uuid)]);\n const blocking = purpose.data_elements.filter(isBlockingRequiredElement);\n const purposeSelected =\n blocking.length > 0\n ? blocking.every(isTicked)\n : purpose.data_elements.some((element) => element.enabled && isTicked(element));\n return {\n selectedPurposes: { ...current.selectedPurposes, [purpose.uuid]: purposeSelected },\n selectedDataElements,\n };\n};\n\nexport const areAllRequiredElementsChecked = (\n purposes: ReadonlyArray<SelectablePurpose>,\n selectedDataElements: Record<string, boolean>\n): boolean =>\n purposes.every((purpose) =>\n purpose.data_elements\n .filter(isBlockingRequiredElement)\n .every((element) => Boolean(selectedDataElements[dataElementKey(purpose.uuid, element.uuid)]))\n );\n\nexport const selectionForMode = (\n purposes: ReadonlyArray<SelectablePurpose>,\n mode: AcceptMode,\n current: AssistedSelection\n): AssistedSelection =>\n buildSelectionForMode(purposes.map((purpose) => ({ purpose })), mode, current);\n\nexport const buildAssistedSubmitPurposes = (\n purposes: ReadonlyArray<PurposeItemData>,\n selection: AssistedSelection\n): Purpose[] =>\n purposes.map((purpose) => ({\n uuid: purpose.uuid,\n name: purpose.name,\n description: purpose.description,\n selected: Boolean(selection.selectedPurposes[purpose.uuid]),\n data_elements: purpose.data_elements.map((element) => ({\n uuid: element.uuid,\n name: element.name,\n enabled: element.enabled !== false,\n required: element.required,\n selected: isBlockingRequiredElement(element)\n ? true\n : Boolean(selection.selectedDataElements[dataElementKey(purpose.uuid, element.uuid)]),\n })),\n }));\n\nexport const sanitiseMobile = (raw: string): string =>\n raw.replace(/\\D/g, \"\").slice(0, ASSISTED_CONFIG.mobileDigits);\n\nexport const isContactValid = (method: VerifyMethod, mobile: string, email: string): boolean =>\n method === \"email\"\n ? EMAIL_REGEX.test(email.trim())\n : mobile.replace(/\\D/g, \"\").length >= ASSISTED_CONFIG.mobileDigits;\n\nexport const otpRecipient = (method: VerifyMethod, mobile: string, email: string): string =>\n method === \"email\" ? email.trim() : `${ASSISTED_CONFIG.dialCode}${mobile}`;\n\nexport const otpChannel = (method: VerifyMethod): string =>\n method === \"email\" ? ASSISTED_CONFIG.emailChannel : ASSISTED_CONFIG.channel;\n\nexport const emptyOtpDigits = (): string[] =>\n Array.from({ length: ASSISTED_CONFIG.otpLength }, () => \"\");\n\nexport const isOtpComplete = (digits: ReadonlyArray<string>): boolean =>\n digits.join(\"\").length === ASSISTED_CONFIG.otpLength;\n\nexport const applyOtpDigit = (\n digits: ReadonlyArray<string>,\n index: number,\n raw: string\n): { digits: string[]; focusIndex: number | null } => {\n const digit = raw.replace(/\\D/g, \"\").slice(-1);\n const next = [...digits];\n next[index] = digit;\n const focusIndex = digit && index < ASSISTED_CONFIG.otpLength - 1 ? index + 1 : null;\n return { digits: next, focusIndex };\n};\n\nexport const applyOtpPaste = (text: string): { digits: string[]; focusIndex: number } | null => {\n const pasted = text.replace(/\\D/g, \"\").slice(0, ASSISTED_CONFIG.otpLength);\n if (!pasted) return null;\n return {\n digits: Array.from({ length: ASSISTED_CONFIG.otpLength }, (_, i) => pasted[i] ?? \"\"),\n focusIndex: Math.min(pasted.length, ASSISTED_CONFIG.otpLength - 1),\n };\n};\n\nexport const backspaceFocusIndex = (digits: ReadonlyArray<string>, index: number): number | null =>\n !digits[index] && index > 0 ? index - 1 : null;\n\nexport const verifyFailureKey = (error: unknown): StaticKey => {\n if (error instanceof ApiError && error.status === 404) return \"otpNotFound\";\n if (error instanceof ApiError && error.status === 400) {\n return error.shouldRequestNew ? \"otpExpired\" : \"otpIncorrect\";\n }\n return \"otpVerifyFailed\";\n};\n\nexport const isAlreadyConsentedError = (error: unknown): boolean =>\n error instanceof ApiError && (error.status === 409 || error.code === \"CONSENT_ALREADY_PROVIDED\");\n\nexport const purposeHidingElement = (\n purposes: ReadonlyArray<PurposeItemData>,\n collapsedPurposes: Record<string, boolean>,\n elementId: string | null\n): string | null => {\n if (!elementId) return null;\n const owner = purposes.find((purpose) =>\n purpose.data_elements.some(\n (element) =>\n element.enabled !== false && elementId === `data-element-${purpose.uuid}-${element.uuid}`\n )\n );\n return owner && collapsedPurposes[owner.uuid] ? owner.uuid : null;\n};\n","import { ASSISTED_STYLE_ID } from \"./constants\";\n\nconst ASSISTED_CSS = `\n .redacto-assisted-phone-field:focus-within {\n border-color: var(--ra-accent, #4f87ff) !important;\n box-shadow: 0 0 0 3px var(--ra-accent-soft, rgba(79, 135, 255, 0.18)) !important;\n }\n .redacto-assisted-phone-input {\n border: none !important;\n outline: none !important;\n background: transparent !important;\n flex: 1 1 auto !important;\n min-width: 0 !important;\n font: inherit !important;\n font-size: 15px !important;\n color: #101828 !important;\n padding: 0 !important;\n }\n .redacto-assisted-otp-input {\n width: 42px !important;\n height: 46px !important;\n text-align: center !important;\n font: inherit !important;\n font-size: 18px !important;\n font-weight: 600 !important;\n border: 1px solid #d0d5dd !important;\n border-radius: 8px !important;\n box-sizing: border-box !important;\n outline: none !important;\n }\n .redacto-assisted-otp-input:focus {\n border-color: var(--ra-accent, #4f87ff) !important;\n box-shadow: 0 0 0 3px var(--ra-accent-soft, rgba(79, 135, 255, 0.18)) !important;\n }\n .redacto-assisted-otp-error {\n border-color: #D92D20 !important;\n }\n .redacto-assisted-link {\n background: none !important;\n border: none !important;\n padding: 0 !important;\n cursor: pointer !important;\n font: inherit !important;\n font-size: 13px !important;\n font-weight: 500 !important;\n display: inline-flex !important;\n align-items: center !important;\n gap: 4px !important;\n }\n .redacto-assisted-link:disabled {\n opacity: 0.5 !important;\n cursor: not-allowed !important;\n }\n button:disabled.redacto-assisted-primary-btn {\n opacity: 0.5 !important;\n cursor: not-allowed !important;\n }\n @keyframes redactoAssistedReveal {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .redacto-assisted-reveal {\n animation: redactoAssistedReveal 0.2s ease-out;\n }\n @media (prefers-reduced-motion: reduce) {\n .redacto-assisted-reveal { animation: none; }\n }\n`;\n\nexport const injectAssistedStyles = (root: ShadowRoot): void => {\n if (root.querySelector(`#${ASSISTED_STYLE_ID}`)) return;\n const style = document.createElement(\"style\");\n style.id = ASSISTED_STYLE_ID;\n style.textContent = ASSISTED_CSS;\n root.appendChild(style);\n};\n\nexport const assistedStyles = {\n lockedOptions: {\n opacity: \"0.6\",\n pointerEvents: \"none\",\n },\n verifyPanel: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"14px\",\n border: \"1px solid #EAECF0\",\n borderRadius: \"12px\",\n padding: \"16px\",\n backgroundColor: \"#FCFCFD\",\n boxSizing: \"border-box\",\n },\n verifyPanelHeader: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n verifyPanelTitle: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontSize: \"15px\",\n fontWeight: 600,\n color: \"#101828\",\n },\n fieldLabelRow: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n fieldLabel: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontSize: \"13px\",\n fontWeight: 500,\n color: \"#475467\",\n },\n phoneField: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n border: \"1px solid #d0d5dd\",\n borderRadius: \"8px\",\n padding: \"10px 12px\",\n backgroundColor: \"#ffffff\",\n boxSizing: \"border-box\",\n },\n phonePrefix: {\n fontSize: \"15px\",\n color: \"#475467\",\n fontWeight: 500,\n },\n helperText: {\n margin: 0,\n fontSize: \"12px\",\n color: \"#667085\",\n },\n otpStatusRow: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"8px\",\n flexWrap: \"wrap\",\n },\n otpSentText: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontSize: \"13px\",\n color: \"#344054\",\n },\n fieldError: {\n margin: 0,\n fontSize: \"13px\",\n color: \"#D92D20\",\n },\n centerLabel: {\n margin: 0,\n fontSize: \"13px\",\n color: \"#475467\",\n textAlign: \"center\",\n },\n otpRow: {\n display: \"flex\",\n justifyContent: \"center\",\n gap: \"8px\",\n },\n resendText: {\n margin: 0,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: \"4px\",\n fontSize: \"13px\",\n color: \"#667085\",\n },\n errorTitle: {\n margin: 0,\n fontSize: \"16px\",\n fontWeight: 600,\n color: \"#101828\",\n },\n errorText: {\n margin: 0,\n fontSize: \"14px\",\n color: \"#475467\",\n },\n declineSpacer: {\n marginRight: \"auto\",\n },\n rowButton: {\n width: \"auto\",\n },\n stackButton: {\n width: \"100%\",\n },\n} as const;\n","import { el } from \"../core/dom\";\nimport { createRequiredMarker } from \"../core/required-marker\";\nimport { part } from \"../appearance/parts\";\nimport { DEFAULT_PURPOSE_SECTION_HEADING } from \"../appearance/constants\";\nimport { PRODUCT_POLICIES_LABEL } from \"../constants\";\nimport { dataElementKey } from \"../modal/consentSelection\";\nimport { renderProductPolicyLine } from \"../modal/product-policy-line\";\nimport { shouldShowNoticePolicyLink } from \"../modal/productPolicies\";\nimport { ASSISTED_IDS, FOCUS_KEY_ATTRIBUTE, FOCUS_KEYS } from \"./constants\";\nimport { chevronIcon } from \"./icons\";\nimport { hasBlockingRequiredElement, isBlockingRequiredElement } from \"./selection\";\nimport { assistedStyles } from \"./styles\";\nimport type { PurposeItemData } from \"../api/types\";\nimport type { AssistedViewContext } from \"./types\";\n\nconst linkAttrs = (ctx: AssistedViewContext, id: string, href: string) => ({\n id,\n href,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: { ...ctx.styles.link, color: ctx.linkColor },\n});\n\nconst textStyle = (ctx: AssistedViewContext) => ({\n ...ctx.styles.privacyText,\n ...ctx.responsive.privacyText,\n});\n\nexport const renderNoticeText = (ctx: AssistedViewContext): HTMLElement => {\n const { content, t, ts } = ctx;\n const anchorText = t(\n \"privacy_policy_anchor_text\",\n content.privacy_policy_anchor_text || \"Privacy Policy\"\n );\n const link = el(\n \"a\",\n {\n ...linkAttrs(ctx, \"privacy-policy-link\", content.privacy_policy_url || \"#\"),\n \"aria-label\": `${anchorText} (${ts(\"opensInNewTab\")})`,\n },\n anchorText\n );\n // The notice-level policy hides once every product names one of its own.\n const showNoticePolicyLink = shouldShowNoticePolicyLink(content.products, ctx.productPolicyLinks);\n return el(\n \"p\",\n { ...part(\"notice-text\"), style: textStyle(ctx) },\n el(\"span\", { id: \"privacy-notice-text\" }, t(\"notice_text\", content.notice_text)),\n showNoticePolicyLink && el(\"br\"),\n showNoticePolicyLink &&\n el(\n \"span\",\n null,\n el(\n \"span\",\n { id: \"privacy-policy-text\" },\n t(\"privacy_policy_prefix_text\", content.privacy_policy_prefix_text || \"\")\n ),\n \" \",\n link\n )\n );\n};\n\nexport const renderPurposeHeading = (ctx: AssistedViewContext): HTMLElement =>\n el(\n \"h2\",\n {\n id: \"purpose-section-heading\",\n style: { ...ctx.styles.subTitle, ...ctx.responsive.subTitle },\n },\n ctx.t(\n \"purpose_section_heading\",\n ctx.content.purpose_section_heading || DEFAULT_PURPOSE_SECTION_HEADING\n )\n );\n\nconst renderPurpose = (\n ctx: AssistedViewContext,\n purpose: PurposeItemData,\n locked: boolean\n): HTMLElement => {\n const { state, t, ts, handlers, styles, responsive } = ctx;\n const isExpanded = !state.collapsedPurposes[purpose.uuid];\n const name = t(\"purposes.name\", purpose.name, purpose.uuid);\n const description = t(\"purposes.description\", purpose.description, purpose.uuid);\n const dataElements = purpose.data_elements.filter((element) => element.enabled !== false);\n const containerId = `${ASSISTED_IDS.purposeContainerPrefix}${purpose.uuid}`;\n\n const title = el(\"h2\", {\n id: `purpose-name-${purpose.uuid}`,\n ...part(\"purpose-title\"),\n style: { ...styles.optionTitle, ...responsive.optionTitle },\n });\n title.textContent = name;\n if (hasBlockingRequiredElement(purpose)) {\n title.appendChild(createRequiredMarker(ts(\"required\")));\n }\n\n const textContainer = el(\"div\", { style: styles.optionTextContainer }, title);\n if (description) {\n textContainer.appendChild(\n el(\n \"h3\",\n {\n id: `purpose-description-${purpose.uuid}`,\n style: { ...styles.optionDescription, ...responsive.optionDescription },\n },\n description\n )\n );\n }\n\n const collapse = el(\n \"div\",\n {\n style: styles.optionLeft,\n role: \"button\",\n tabIndex: \"0\",\n \"aria-expanded\": String(isExpanded),\n \"aria-controls\": containerId,\n \"aria-label\": isExpanded ? ts(\"collapseDetails\", { name }) : ts(\"expandDetails\", { name }),\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.collapse(purpose.uuid),\n onClick: () => handlers.onPurposeCollapse(purpose.uuid),\n onKeydown: (event: KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handlers.onPurposeCollapse(purpose.uuid);\n }\n },\n },\n el(\n \"div\",\n { style: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", marginLeft: \"5px\" } },\n chevronIcon(isExpanded, ctx.look.chevronColor)\n ),\n textContainer\n );\n\n const checkbox = el(\"input\", {\n className: \"redacto-checkbox-large\",\n type: \"checkbox\",\n checked: Boolean(state.selectedPurposes[purpose.uuid]),\n disabled: locked,\n \"aria-label\": ts(\"selectAllFor\", { name }),\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.purpose(purpose.uuid),\n onChange: () => handlers.onPurposeToggle(purpose.uuid),\n });\n\n const elementsContainer = el(\"div\", {\n id: containerId,\n style: {\n ...styles.dataElementsContainer,\n display: isExpanded && dataElements.length > 0 ? \"flex\" : \"none\",\n },\n });\n for (const element of dataElements) {\n const elementName = t(\"data_elements.name\", element.name, element.uuid);\n const label = el(\"span\", {\n id: `data-element-${purpose.uuid}-${element.uuid}`,\n style: { ...styles.dataElementText, ...responsive.dataElementText },\n });\n label.textContent = elementName;\n if (isBlockingRequiredElement(element)) {\n label.appendChild(createRequiredMarker(ts(\"required\")));\n }\n const elementCheckbox = el(\"input\", {\n className: \"redacto-checkbox-small\",\n type: \"checkbox\",\n checked: Boolean(state.selectedDataElements[dataElementKey(purpose.uuid, element.uuid)]),\n disabled: locked,\n \"aria-label\": element.required\n ? ts(\"selectElementRequired\", { name: elementName })\n : ts(\"selectElement\", { name: elementName }),\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.element(purpose.uuid, element.uuid),\n onChange: () => handlers.onDataElementToggle(purpose.uuid, element.uuid),\n });\n elementsContainer.appendChild(\n el(\"div\", { ...part(\"data-element\"), style: styles.dataElementItem }, label, elementCheckbox)\n );\n }\n\n return el(\n \"div\",\n null,\n el(\"div\", { ...part(\"purpose\"), style: styles.optionItem }, collapse, checkbox),\n elementsContainer\n );\n};\n\nexport const renderPurposes = (ctx: AssistedViewContext, locked: boolean): HTMLElement => {\n const container = el(\"div\", {\n ...part(\"purposes\"),\n style: { ...ctx.styles.optionsContainer, ...(locked ? assistedStyles.lockedOptions : {}) },\n \"aria-disabled\": locked ? \"true\" : null,\n });\n // In the order the visitor sees them: the saved order, product by product.\n for (const purpose of ctx.displayedPurposes) {\n container.appendChild(renderPurpose(ctx, purpose, locked));\n }\n return container;\n};\n\nexport const renderDpoFooter = (ctx: AssistedViewContext): HTMLElement | null => {\n const { content, t, tDpo, styles, responsive, productPolicyLinks } = ctx;\n const dpo = content.dpo_info;\n // The admin's additional text shows with or without a privacy-center link;\n // the link follows it only when the notice has one.\n const hasPrivacyCenterLine = Boolean(content.privacy_center_url || content.additional_text);\n if (!hasPrivacyCenterLine && !dpo && productPolicyLinks.length === 0) return null;\n\n const paragraph = el(\"p\", { style: { margin: 0, opacity: \"0.6\" } });\n const linkStyle = { ...styles.link, color: ctx.linkColor };\n\n if (hasPrivacyCenterLine) {\n paragraph.appendChild(\n el(\n \"span\",\n { id: \"additional-text\" },\n t(\"additional_text\", content.additional_text || \"Manage or withdraw consent anytime at\")\n )\n );\n if (content.privacy_center_url) {\n paragraph.appendChild(document.createTextNode(\" \"));\n paragraph.appendChild(\n el(\n \"a\",\n linkAttrs(ctx, \"privacy-center-link\", content.privacy_center_url),\n t(\"privacy_center_anchor_text\", content.privacy_center_anchor_text || \"Privacy Center\")\n )\n );\n paragraph.appendChild(document.createTextNode(\".\"));\n }\n }\n\n if (productPolicyLinks.length > 0) {\n if (hasPrivacyCenterLine) paragraph.appendChild(el(\"br\"));\n // Each policy is named the way its product is: translated.\n paragraph.appendChild(\n renderProductPolicyLine({\n label: t(\"product_privacy_policies_label\", PRODUCT_POLICIES_LABEL),\n links: productPolicyLinks.map((link) => ({\n ...link,\n name: t(\"products.name\", link.name, link.uuid),\n })),\n linkStyle,\n })\n );\n }\n\n if (dpo) {\n if (hasPrivacyCenterLine || productPolicyLinks.length > 0) paragraph.appendChild(el(\"br\"));\n paragraph.appendChild(\n el(\"span\", { id: \"dpo-grievance-text\" }, tDpo(\"grievance_text\", dpo.grievance_text))\n );\n paragraph.appendChild(document.createTextNode(\" \"));\n if (dpo.grievance_url) {\n paragraph.appendChild(\n el(\n \"a\",\n linkAttrs(ctx, \"dpo-grievance-link\", dpo.grievance_url),\n tDpo(\"grievance_anchor_text\", dpo.grievance_anchor_text || \"click here\")\n )\n );\n }\n paragraph.appendChild(document.createTextNode(\" \"));\n if (dpo.grievance_email) {\n paragraph.appendChild(\n el(\n \"span\",\n { id: \"dpo-grievance-email-connector\" },\n tDpo(\"grievance_email_connector_text\", dpo.grievance_email_connector_text || \"or email to\")\n )\n );\n paragraph.appendChild(document.createTextNode(\" \"));\n paragraph.appendChild(\n el(\n \"a\",\n {\n id: \"dpo-grievance-email\",\n href: `mailto:${dpo.grievance_email}`,\n style: linkStyle,\n },\n dpo.grievance_email\n )\n );\n }\n paragraph.appendChild(el(\"br\"));\n paragraph.appendChild(\n el(\"span\", { id: \"dpo-dp-board-text\" }, tDpo(\"dp_board_text\", dpo.dp_board_text))\n );\n paragraph.appendChild(document.createTextNode(\" \"));\n if (dpo.dp_board_url) {\n paragraph.appendChild(\n el(\n \"a\",\n linkAttrs(ctx, \"dpo-dp-board-link\", dpo.dp_board_url),\n tDpo(\"dp_board_anchor_text\", dpo.dp_board_anchor_text || \"click here\")\n )\n );\n }\n paragraph.appendChild(el(\"br\"));\n paragraph.appendChild(el(\"span\", { id: \"dpo-dpo-text\" }, tDpo(\"dpo_text\", dpo.dpo_text)));\n paragraph.appendChild(document.createTextNode(\" \"));\n const dpoAnchor = tDpo(\"dpo_anchor_text\", dpo.dpo_anchor_text || \"Click here\");\n if (dpo.dpo_email) {\n paragraph.appendChild(\n el(\n \"a\",\n {\n id: \"dpo-dpo-link\",\n href: `mailto:${dpo.dpo_email}`,\n style: linkStyle,\n },\n dpoAnchor\n )\n );\n } else if (dpo.dpo_url) {\n paragraph.appendChild(el(\"a\", linkAttrs(ctx, \"dpo-dpo-link\", dpo.dpo_url), dpoAnchor));\n }\n }\n\n return el(\n \"div\",\n {\n ...part(\"dpo\"),\n style: {\n ...styles.privacyText,\n ...responsive.privacyText,\n fontSize: responsive.dpoText.fontSize,\n lineHeight: \"1.4\",\n borderTop: \"1px solid rgba(152, 162, 179, 0.3)\",\n paddingTop: \"12px\",\n marginTop: \"12px\",\n },\n },\n paragraph\n );\n};\n","export const hexToRgba = (hex: string, alpha: number): string | null => {\n if (typeof hex !== \"string\" || hex[0] !== \"#\") return null;\n let h = hex.slice(1);\n if (h.length === 3) {\n h = h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n if (h.length !== 6 || /[^0-9a-fA-F]/.test(h)) return null;\n const n = parseInt(h, 16);\n return `rgba(${(n >> 16) & 255}, ${(n >> 8) & 255}, ${n & 255}, ${alpha})`;\n};\n\nexport const isDefaultLanguage = (lang: string): boolean =>\n lang === \"English\" || lang === \"en\" || lang === \"EN\";\n\nexport const normaliseLanguage = (lang: string | undefined | null): string =>\n !lang || isDefaultLanguage(lang) ? \"English\" : lang;\n\nexport const availableLanguages = (\n defaultLanguage: string | undefined,\n translations: Record<string, unknown> | undefined\n): string[] => {\n const pinned = [\"English\"];\n const normalised = normaliseLanguage(defaultLanguage);\n if (normalised !== \"English\") pinned.push(normalised);\n const rest = Object.keys(translations || {})\n .filter((lang) => !pinned.includes(lang))\n .sort((a, b) => a.localeCompare(b, \"en\"));\n return [...pinned, ...rest];\n};\n","import { buildTtsRootAttributes, type ResolvedNoticeAppearance } from \"../shared/appearance\";\nimport { NOTICE_ID_ATTRIBUTE, STYLE_RADII } from \"../appearance/constants\";\nimport { resolveNoticeLook } from \"../appearance/host-settings\";\nimport { part } from \"../appearance/parts\";\nimport { scaleFontSizes, textScaleFactor } from \"../appearance/text-scale\";\nimport { buildThemeCssVariables } from \"../appearance/theme-vars\";\nimport type { Style } from \"../appearance/types\";\nimport { buildVariantStyles, mergeNoticeStyles } from \"../appearance/variant-styles\";\nimport { NOTICE_FONT_ROOT_ATTRIBUTE } from \"../constants\";\nimport { styles as classicStyles, type NoticeStyles } from \"../styles/modal\";\nimport { resolveLogoPosition } from \"../modal/layout\";\nimport type { LogoPosition, Settings } from \"../api/types\";\nimport { ASSISTED_DEFAULT_PRIMARY_COLOR } from \"./constants\";\nimport { hexToRgba } from \"./theme\";\nimport type { AssistedActiveConfig } from \"./types\";\n\nconst DEFAULT_CHEVRON_COLOR = \"#323B4B\";\n\nexport type AssistedLookInput = Readonly<{\n noticeId: string;\n content: AssistedActiveConfig;\n settings?: Partial<Settings>;\n prefersDark: boolean;\n isMobile: boolean;\n}>;\n\n/**\n * The console look, display only: the palette, the minimal or soft shape,\n * corners and text size. Glass keeps classic's surfaces here, since the\n * assisted notice draws no sheet. Nothing here changes what the visitor can\n * do, what is submitted or how it is verified.\n */\nexport type AssistedLook = Readonly<{\n appearance: ResolvedNoticeAppearance;\n styles: NoticeStyles;\n responsive: Record<string, Style>;\n primaryColor: string;\n linkColor: string;\n accentTint: string;\n accentSoft: string;\n chevronColor: string;\n logoPosition: LogoPosition;\n /** Accept All, Accept Selected (outlined) and Decline, each only where set. */\n acceptAll: Style;\n acceptSelected: Style;\n decline: Style;\n rootAttributes: Record<string, string>;\n rootVariables: Record<string, string>;\n}>;\n\nconst responsiveFor = (isMobile: boolean): Record<string, Style> => ({\n title: { fontSize: isMobile ? \"16px\" : \"18px\" },\n subTitle: { fontSize: isMobile ? \"14px\" : \"16px\" },\n optionTitle: { fontSize: isMobile ? \"14px\" : \"16px\" },\n optionDescription: { fontSize: isMobile ? \"12px\" : \"14px\" },\n dataElementText: { fontSize: isMobile ? \"12px\" : \"14px\" },\n privacyText: { fontSize: isMobile ? \"14px\" : \"16px\" },\n dpoText: { fontSize: isMobile ? \"13px\" : \"14px\" },\n topRight: {\n fontSize: isMobile ? \"11px\" : \"12px\",\n padding: isMobile ? \"3px 6px\" : \"3px 9px\",\n },\n logo: {\n maxWidth: isMobile ? \"96px\" : \"140px\",\n maxHeight: isMobile ? \"28px\" : \"32px\",\n },\n languageItem: {\n fontSize: isMobile ? \"11px\" : \"12px\",\n padding: isMobile ? \"6px 10px\" : \"8px 12px\",\n },\n button: {\n fontSize: isMobile ? \"14px\" : \"16px\",\n padding: isMobile ? \"10px 20px\" : \"9px 45px\",\n },\n});\n\nexport const buildAssistedLook = ({\n noticeId,\n content,\n settings,\n prefersDark,\n isMobile,\n}: AssistedLookInput): AssistedLook => {\n const appearance = resolveNoticeLook(content.appearance, settings, prefersDark);\n const { colors } = appearance;\n const primaryColor =\n colors.accept_all_bg || content.primary_color || ASSISTED_DEFAULT_PRIMARY_COLOR;\n const radii = STYLE_RADII[appearance.style];\n const factor = textScaleFactor(appearance);\n const styles = scaleFontSizes(\n buildVariantStyles(\n mergeNoticeStyles(classicStyles as NoticeStyles, {\n modal: { borderRadius: appearance.radius || radii.modal },\n button: { borderRadius: appearance.radius || radii.button },\n }),\n appearance.style,\n colors,\n primaryColor\n ),\n factor\n );\n\n return {\n appearance,\n styles,\n responsive: scaleFontSizes(responsiveFor(isMobile), factor),\n primaryColor,\n linkColor: colors.link || content.secondary_color || ASSISTED_DEFAULT_PRIMARY_COLOR,\n accentTint: hexToRgba(primaryColor, 0.08) || \"#F5F8FF\",\n accentSoft: hexToRgba(primaryColor, 0.18) || \"rgba(79, 135, 255, 0.18)\",\n chevronColor: colors.heading ?? DEFAULT_CHEVRON_COLOR,\n logoPosition: resolveLogoPosition(content.logo_position),\n acceptAll: {\n backgroundColor: primaryColor,\n ...(colors.accept_all_text ? { color: colors.accept_all_text } : {}),\n },\n acceptSelected: {\n ...(colors.accept_bg ? { backgroundColor: colors.accept_bg } : {}),\n color: colors.accept_text ?? primaryColor,\n borderColor: colors.accept_text ?? primaryColor,\n },\n decline: {\n ...(colors.decline_bg ? { backgroundColor: colors.decline_bg } : {}),\n ...(colors.decline_text ? { color: colors.decline_text } : {}),\n ...(colors.decline_border ? { borderColor: colors.decline_border } : {}),\n },\n // The admin's custom CSS is scoped to the element carrying the notice id.\n rootAttributes: {\n [NOTICE_ID_ATTRIBUTE]: noticeId,\n [NOTICE_FONT_ROOT_ATTRIBUTE]: \"\",\n ...part(\"root\"),\n ...buildTtsRootAttributes(colors),\n },\n rootVariables: {\n \"--ra-accent\": primaryColor,\n \"--ra-accent-soft\": hexToRgba(primaryColor, 0.18) || \"rgba(79, 135, 255, 0.18)\",\n ...buildThemeCssVariables(colors),\n },\n };\n};\n","import { el } from \"../core/dom\";\nimport { part } from \"../appearance/parts\";\nimport {\n ACCEPT_ALL_BUTTON_ID,\n ACCEPT_SELECTED_BUTTON_ID,\n DECLINE_BUTTON_ID,\n DEFAULT_ACCEPT_ALL_BUTTON_TEXT,\n DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT,\n DEFAULT_DECLINE_BUTTON_TEXT,\n} from \"../constants\";\nimport { ASSISTED_CONFIG, ASSISTED_IDS, FOCUS_KEY_ATTRIBUTE, FOCUS_KEYS } from \"./constants\";\nimport { checkIcon, clockIcon, lockIcon, mailIcon, phoneIcon } from \"./icons\";\nimport { areAllRequiredElementsChecked, isContactValid, isOtpComplete } from \"./selection\";\nimport { assistedStyles } from \"./styles\";\nimport type { AssistedPrimaryAction, AssistedViewContext } from \"./types\";\n\nconst renderContactField = (ctx: AssistedViewContext): HTMLElement => {\n const { state, handlers } = ctx;\n const locked = state.otpSent || state.isSendingOtp;\n if (state.verifyMethod === \"mobile\") {\n return el(\n \"div\",\n { className: \"redacto-assisted-phone-field\", style: assistedStyles.phoneField },\n el(\"span\", { style: assistedStyles.phonePrefix }, ASSISTED_CONFIG.dialCode),\n el(\"input\", {\n id: ASSISTED_IDS.mobileInput,\n type: \"tel\",\n inputmode: \"numeric\",\n autocomplete: \"tel-national\",\n className: \"redacto-assisted-phone-input\",\n placeholder: \"98765 43210\",\n value: state.mobile,\n disabled: locked,\n onInput: (event: Event) => handlers.onMobileInput((event.target as HTMLInputElement).value),\n })\n );\n }\n return el(\n \"div\",\n { className: \"redacto-assisted-phone-field\", style: assistedStyles.phoneField },\n el(\"input\", {\n id: ASSISTED_IDS.emailInput,\n type: \"email\",\n inputmode: \"email\",\n autocomplete: \"email\",\n className: \"redacto-assisted-phone-input\",\n placeholder: \"you@example.com\",\n value: state.email,\n disabled: locked,\n onInput: (event: Event) => handlers.onEmailInput((event.target as HTMLInputElement).value),\n })\n );\n};\n\nexport const otpBoxStyle = (ctx: AssistedViewContext, digit: string, index: number) => ({\n borderColor: digit ? ctx.primaryColor : \"\",\n backgroundColor: digit ? ctx.accentTint : \"\",\n marginLeft: index === 3 ? \"8px\" : \"\",\n});\n\nexport const renderResend = (ctx: AssistedViewContext): HTMLElement => {\n const { state, ts, handlers, primaryColor } = ctx;\n if (state.resendCountdown > 0) {\n return el(\n \"p\",\n { id: ASSISTED_IDS.resend, style: assistedStyles.resendText },\n clockIcon(\"#667085\"),\n ts(\"resendIn\", { seconds: state.resendCountdown })\n );\n }\n return el(\n \"p\",\n { id: ASSISTED_IDS.resend, style: assistedStyles.resendText },\n el(\n \"button\",\n {\n type: \"button\",\n className: \"redacto-assisted-link\",\n style: { color: primaryColor },\n disabled: state.isSendingOtp,\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.resend,\n onClick: () => handlers.onResend(),\n },\n state.isSendingOtp ? ts(\"sending\") : ts(\"resendOtp\")\n )\n );\n};\n\nconst renderOtpEntry = (ctx: AssistedViewContext): HTMLElement => {\n const { state, ts, handlers } = ctx;\n const boxes = state.otpDigits.map((digit, index) =>\n el(\"input\", {\n id: `${ASSISTED_IDS.otpInputPrefix}${index}`,\n type: \"text\",\n inputmode: \"numeric\",\n autocomplete: \"one-time-code\",\n maxlength: \"1\",\n className: `redacto-assisted-otp-input${state.otpError ? \" redacto-assisted-otp-error\" : \"\"}`,\n style: otpBoxStyle(ctx, digit, index),\n value: digit,\n disabled: state.isVerifying,\n \"aria-label\": ts(\"otpDigit\", { index: index + 1 }),\n onInput: (event: Event) => handlers.onOtpInput(index, (event.target as HTMLInputElement).value),\n onKeydown: (event: KeyboardEvent) => handlers.onOtpKeydown(index, event),\n onPaste: (event: ClipboardEvent) => handlers.onOtpPaste(event),\n })\n );\n\n return el(\n \"div\",\n { style: { display: \"flex\", flexDirection: \"column\", gap: \"12px\" } },\n el(\n \"p\",\n { style: assistedStyles.centerLabel },\n ts(\"enterNDigitOtp\", { count: ASSISTED_CONFIG.otpLength })\n ),\n el(\"div\", { style: assistedStyles.otpRow }, ...boxes),\n state.otpError ? el(\"p\", { role: \"alert\", style: assistedStyles.fieldError }, state.otpError) : null,\n renderResend(ctx)\n );\n};\n\nexport const renderVerifyPanel = (ctx: AssistedViewContext): HTMLElement => {\n const { state, ts, handlers, primaryColor } = ctx;\n const isEmail = state.verifyMethod === \"email\";\n const linksLocked = state.isVerifying || state.isSendingOtp;\n\n const labelRow = el(\n \"div\",\n { style: assistedStyles.fieldLabelRow },\n el(\n \"label\",\n { for: isEmail ? ASSISTED_IDS.emailInput : ASSISTED_IDS.mobileInput, style: assistedStyles.fieldLabel },\n isEmail ? mailIcon(\"#475467\") : phoneIcon(\"#475467\"),\n isEmail ? ts(\"emailAddress\") : ts(\"mobileNumber\")\n ),\n state.otpSent\n ? null\n : el(\n \"button\",\n {\n type: \"button\",\n className: \"redacto-assisted-link\",\n style: { color: primaryColor },\n disabled: state.isSendingOtp,\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.switchMethod,\n onClick: () => handlers.onSwitchMethod(),\n },\n isEmail ? phoneIcon(primaryColor) : mailIcon(primaryColor),\n isEmail ? ts(\"useMobileInstead\") : ts(\"useEmailInstead\")\n )\n );\n\n const status = state.otpSent\n ? el(\n \"div\",\n { style: assistedStyles.otpStatusRow },\n el(\n \"span\",\n { style: assistedStyles.otpSentText },\n checkIcon(\"#10B981\"),\n `${ts(\"otpSentTo\")} ${isEmail ? state.email : `${ASSISTED_CONFIG.dialCode} ${state.mobile}`}`\n ),\n el(\n \"button\",\n {\n type: \"button\",\n className: \"redacto-assisted-link\",\n style: { color: primaryColor },\n disabled: linksLocked,\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.changeContact,\n onClick: () => handlers.onChangeContact(),\n },\n isEmail ? ts(\"changeEmail\") : ts(\"changeMobile\")\n )\n )\n : el(\"p\", { style: assistedStyles.helperText }, isEmail ? ts(\"otpHelperEmail\") : ts(\"otpHelper\"));\n\n return el(\n \"div\",\n {\n id: ASSISTED_IDS.verifyPanel,\n className: \"redacto-assisted-reveal\",\n style: assistedStyles.verifyPanel,\n },\n el(\n \"div\",\n { style: assistedStyles.verifyPanelHeader },\n el(\"span\", { style: assistedStyles.verifyPanelTitle }, lockIcon(primaryColor), ts(\"verifyWithOtp\")),\n el(\n \"button\",\n {\n type: \"button\",\n className: \"redacto-assisted-link\",\n style: { color: primaryColor },\n disabled: linksLocked,\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.editSelections,\n onClick: () => handlers.onEditSelections(),\n },\n ts(\"editSelections\")\n )\n ),\n el(\n \"div\",\n { style: { display: \"flex\", flexDirection: \"column\", gap: \"10px\" } },\n labelRow,\n renderContactField(ctx),\n status,\n state.createError\n ? el(\"p\", { role: \"alert\", style: assistedStyles.fieldError }, state.createError)\n : null,\n state.otpSent ? renderOtpEntry(ctx) : null\n )\n );\n};\n\nexport const primaryAction = (ctx: AssistedViewContext): AssistedPrimaryAction => {\n const { state, content, t, ts, handlers } = ctx;\n if (state.step === \"verify\" && !state.otpSent) {\n return {\n label: state.isSendingOtp ? ts(\"sending\") : ts(\"sendOtp\"),\n disabled: !isContactValid(state.verifyMethod, state.mobile, state.email) || state.isSendingOtp,\n action: handlers.onGetOtp,\n };\n }\n if (state.step === \"verify\") {\n return {\n label: state.isVerifying ? ts(\"verifying\") : ts(\"confirmOtp\"),\n disabled: !isOtpComplete(state.otpDigits) || state.isVerifying,\n action: handlers.onConfirmOtp,\n };\n }\n return {\n label: t(\"confirm_button_text\", content.confirm_button_text || DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT),\n disabled: !areAllRequiredElementsChecked(ctx.displayedPurposes, state.selectedDataElements),\n action: handlers.onAcceptSelected,\n };\n};\n\nexport const renderFooter = (ctx: AssistedViewContext): HTMLElement => {\n const { state, content, t, handlers, isMobile, primaryColor, styles, look } = ctx;\n const isVerify = state.step === \"verify\";\n const buttonBase = { ...styles.button, ...ctx.responsive.button };\n const width = isMobile ? assistedStyles.stackButton : assistedStyles.rowButton;\n const primaryState = primaryAction(ctx);\n\n const primary = el(\n \"button\",\n {\n type: \"button\",\n id: ACCEPT_SELECTED_BUTTON_ID,\n ...(isVerify ? {} : part(\"accept-selected\")),\n className: \"redacto-assisted-primary-btn\",\n style: isVerify\n ? { ...buttonBase, ...styles.acceptButton, backgroundColor: primaryColor }\n : { ...buttonBase, ...styles.cancelButton, ...width, ...look.acceptSelected },\n disabled: primaryState.disabled,\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.primary,\n onClick: () => primaryState.action(),\n },\n primaryState.label\n );\n\n const decline = el(\n \"button\",\n {\n type: \"button\",\n id: DECLINE_BUTTON_ID,\n ...part(\"decline\"),\n style: {\n ...buttonBase,\n ...styles.cancelButton,\n ...(isVerify ? {} : width),\n ...(isVerify || isMobile ? {} : assistedStyles.declineSpacer),\n ...look.decline,\n },\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.decline,\n onClick: () => handlers.onDecline(),\n },\n t(\"decline_button_text\", content.decline_button_text || DEFAULT_DECLINE_BUTTON_TEXT)\n );\n\n if (isVerify) {\n return el(\n \"div\",\n { ...part(\"footer\"), style: { ...styles.bottomSection, flexDirection: isMobile ? \"column\" : \"row\" } },\n primary,\n decline\n );\n }\n\n const acceptAll = el(\n \"button\",\n {\n type: \"button\",\n id: ACCEPT_ALL_BUTTON_ID,\n ...part(\"accept-all\"),\n style: { ...buttonBase, ...styles.acceptButton, ...width, ...look.acceptAll },\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.acceptAll,\n onClick: () => handlers.onAcceptAll(),\n },\n t(\"accept_all_button_text\", content.accept_all_button_text || DEFAULT_ACCEPT_ALL_BUTTON_TEXT)\n );\n\n return isMobile\n ? el(\"div\", { ...part(\"footer\"), style: styles.actionButtonStack }, acceptAll, primary, decline)\n : el(\"div\", { ...part(\"footer\"), style: styles.actionButtonRow }, decline, primary, acceptAll);\n};\n","import { Store } from \"../core/state\";\nimport { applyStyles, clearElement, el } from \"../core/dom\";\nimport { createMediaQuery, type MediaQuerySubscription } from \"../core/media-query\";\nimport { injectCheckboxStyles } from \"../styles/inject\";\nimport { styles } from \"../styles/modal\";\nimport { renderLanguageSelector, type LanguageSelectorRefs } from \"../modal/language-selector\";\nimport { setupKeyboardTrap, type KeyboardTrapCleanup } from \"../modal/keyboard\";\nimport { injectNoticeFontStyles, resolveNoticeFontFamily } from \"../modal/notice-font\";\nimport { TTSManager } from \"../modal/tts\";\nimport {\n fetchNoticeConsentStatusForScope,\n isNoticeFullyConsented,\n} from \"../api/notice-consent-status\";\nimport { toLanguageCode } from \"../api/language\";\nimport { resolveEndpointOptions, type ResolvedEndpoints } from \"../shared/endpoints\";\nimport { NOTICE_FONT_ROOT_ATTRIBUTE } from \"../constants\";\nimport type { TranslationObject } from \"../api/types\";\nimport type { AcceptMode } from \"../types\";\nimport {\n createOtp,\n fetchAssistedNotice,\n fetchAssistedTTSAudioUrls,\n submitAssistedConsent,\n verifyOtp,\n} from \"./api\";\nimport {\n ASSISTED_CONFIG,\n ASSISTED_DEFAULT_PRIMARY_COLOR,\n ASSISTED_HOST_ATTRIBUTE,\n ASSISTED_IDS,\n FOCUS_KEY_ATTRIBUTE,\n FOCUS_KEYS,\n MOBILE_QUERY,\n} from \"./constants\";\nimport { makeStaticT } from \"./i18n\";\nimport { speakerIcon } from \"./icons\";\nimport { renderDpoFooter, renderNoticeText, renderPurposeHeading, renderPurposes } from \"./notice-view\";\nimport {\n applyOtpDigit,\n applyOtpPaste,\n areAllRequiredElementsChecked,\n backspaceFocusIndex,\n buildAssistedSubmitPurposes,\n buildPreselection,\n emptyOtpDigits,\n isAlreadyConsentedError,\n isContactValid,\n isOtpComplete,\n otpChannel,\n otpRecipient,\n purposeHidingElement,\n resolvePurposePreselection,\n sanitiseMobile,\n selectionForMode,\n toggleDataElementSelection,\n togglePurposeSelection,\n verifyFailureKey,\n} from \"./selection\";\nimport { assistedStyles, injectAssistedStyles } from \"./styles\";\nimport { availableLanguages, isDefaultLanguage, normaliseLanguage } from \"./theme\";\nimport { buildAssistedLook } from \"./look\";\nimport { DARK_SCHEME_QUERY } from \"../appearance/constants\";\nimport { NoticeCustomCss } from \"../appearance/custom-css\";\nimport { part } from \"../appearance/parts\";\nimport { applyCssVariables } from \"../appearance/theme-vars\";\nimport { purposesInRenderOrder } from \"../core/productMatrix\";\nimport { logoRowJustify } from \"../modal/layout\";\nimport { getProductPolicyLinks } from \"../modal/productPolicies\";\nimport { otpBoxStyle, primaryAction, renderFooter, renderResend, renderVerifyPanel } from \"./verify-view\";\nimport type {\n AssistedActiveConfig,\n AssistedHandlers,\n AssistedOptions,\n AssistedState,\n AssistedViewContext,\n StaticTranslate,\n VerifiedOtp,\n} from \"./types\";\n\nconst PATCHABLE_KEYS: ReadonlySet<keyof AssistedState> = new Set<keyof AssistedState>([\n \"mobile\",\n \"email\",\n \"otpDigits\",\n \"resendCountdown\",\n \"ttsRevision\",\n]);\n\nconst initialState = (): AssistedState => ({\n isLoading: true,\n fetchError: null,\n content: null,\n step: \"notice\",\n acceptMode: \"selected\",\n selectedPurposes: {},\n selectedDataElements: {},\n collapsedPurposes: {},\n selectedLanguage: \"English\",\n verifyMethod: \"mobile\",\n mobile: \"\",\n email: \"\",\n otpSent: false,\n otpDigits: emptyOtpDigits(),\n otpUuid: \"\",\n resendCountdown: 0,\n isSendingOtp: false,\n isVerifying: false,\n createError: null,\n otpError: null,\n ttsRevision: 0,\n});\n\nconst otpInputId = (index: number): string => `${ASSISTED_IDS.otpInputPrefix}${index}`;\n\nconst scrollIntoViewSoft = (target: Element | null): void => {\n if (!target || typeof (target as HTMLElement).scrollIntoView !== \"function\") return;\n const reduce =\n typeof window.matchMedia === \"function\" &&\n Boolean(window.matchMedia(\"(prefers-reduced-motion: reduce)\")?.matches);\n (target as HTMLElement).scrollIntoView({ behavior: reduce ? \"auto\" : \"smooth\", block: \"nearest\" });\n};\n\nexport class AssistedController {\n private options: AssistedOptions;\n private readonly endpoints: ResolvedEndpoints;\n private store: Store<AssistedState>;\n private mediaQuery: MediaQuerySubscription;\n private colorScheme: MediaQuerySubscription;\n private customCss = new NoticeCustomCss();\n private overlayEl: HTMLElement | null = null;\n private hostEl: HTMLElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private modalEl: HTMLElement | null = null;\n private middleEl: HTMLElement | null = null;\n private langSelectorRefs: LanguageSelectorRefs | null = null;\n private ttsManager: TTSManager | null = null;\n private keyboardCleanup: KeyboardTrapCleanup | null = null;\n private unsubscribe: (() => void) | null = null;\n private abortController = new AbortController();\n private resendTimer: ReturnType<typeof setInterval> | null = null;\n private pendingFocusId: string | null = null;\n private pendingReveal: string | null = null;\n private previousBodyOverflow: string | null = null;\n private previousHtmlOverflow: string | null = null;\n private otpRequest = 0;\n private verified: VerifiedOtp | null = null;\n private destroyed = false;\n private handlers: AssistedHandlers;\n\n constructor(options: AssistedOptions) {\n this.options = options;\n this.endpoints = resolveEndpointOptions(options.baseUrl, options.ledgerBaseUrl);\n this.store = new Store<AssistedState>(initialState());\n this.mediaQuery = createMediaQuery(MOBILE_QUERY);\n // Automatic dark mode follows the device's scheme while the notice is open.\n this.colorScheme = createMediaQuery(DARK_SCHEME_QUERY);\n this.handlers = {\n onPurposeToggle: (uuid) => this.handlePurposeToggle(uuid),\n onPurposeCollapse: (uuid) => this.handlePurposeCollapse(uuid),\n onDataElementToggle: (purposeUuid, elementUuid) =>\n this.handleDataElementToggle(purposeUuid, elementUuid),\n onAcceptAll: () => this.handleConfirmStep(\"all\"),\n onAcceptSelected: () => this.handleConfirmStep(\"selected\"),\n onDecline: () => this.handleDecline(),\n onGetOtp: () => this.handleGetOtp(),\n onConfirmOtp: () => {\n void this.handleConfirmOtp();\n },\n onEditSelections: () => this.handleEditSelections(),\n onSwitchMethod: () => this.handleSwitchMethod(),\n onMobileInput: (value) => this.store.setState({ mobile: sanitiseMobile(value) }),\n onEmailInput: (value) => this.store.setState({ email: value }),\n onChangeContact: () => this.handleChangeContact(),\n onResend: () => this.handleResend(),\n onOtpInput: (index, value) => this.handleOtpInput(index, value),\n onOtpKeydown: (index, event) => this.handleOtpKeydown(index, event),\n onOtpPaste: (event) => this.handleOtpPaste(event),\n };\n }\n\n async init(): Promise<void> {\n this.mount();\n this.unsubscribe = this.store.subscribe((state, prev) => this.handleStateChange(state, prev));\n this.mediaQuery.subscribe(() => this.render());\n this.colorScheme.subscribe(() => this.render());\n this.render();\n await this.fetchNotice();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.abortController.abort();\n this.stopCountdown();\n this.keyboardCleanup?.();\n this.langSelectorRefs?.close();\n this.ttsManager?.destroy();\n this.unsubscribe?.();\n this.store.destroy();\n this.mediaQuery.destroy();\n this.colorScheme.destroy();\n this.customCss.remove();\n if (this.hostEl?.parentNode) {\n this.hostEl.parentNode.removeChild(this.hostEl);\n }\n if (this.previousBodyOverflow !== null) {\n document.body.style.overflow = this.previousBodyOverflow;\n }\n if (this.previousHtmlOverflow !== null) {\n document.documentElement.style.overflow = this.previousHtmlOverflow;\n }\n this.hostEl = null;\n this.shadowRoot = null;\n this.modalEl = null;\n this.middleEl = null;\n this.langSelectorRefs = null;\n }\n\n private mount(): void {\n this.hostEl = document.createElement(\"div\");\n this.hostEl.setAttribute(ASSISTED_HOST_ATTRIBUTE, \"\");\n this.hostEl.style.position = \"fixed\";\n this.hostEl.style.top = \"0\";\n this.hostEl.style.left = \"0\";\n this.hostEl.style.width = \"0\";\n this.hostEl.style.height = \"0\";\n this.hostEl.style.zIndex = \"2147483646\";\n document.body.appendChild(this.hostEl);\n this.shadowRoot = this.hostEl.attachShadow({ mode: \"open\" });\n\n this.previousBodyOverflow = document.body.style.overflow;\n this.previousHtmlOverflow = document.documentElement.style.overflow;\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n\n injectCheckboxStyles(this.shadowRoot);\n injectNoticeFontStyles(this.shadowRoot);\n injectAssistedStyles(this.shadowRoot);\n\n this.ttsManager = new TTSManager(\n () => this.handleTtsChange(),\n this.shadowRoot,\n (params) =>\n fetchAssistedTTSAudioUrls({\n organisationUuid: this.options.organisationUuid,\n workspaceUuid: this.options.workspaceUuid,\n noticeUuid: params.noticeUuid,\n language: params.language,\n baseUrl: this.endpoints.baseUrl,\n signal: params.signal,\n })\n );\n\n this.overlayEl = el(\"div\", { ...part(\"overlay\"), style: styles.overlay, role: \"presentation\" });\n this.shadowRoot.appendChild(this.overlayEl);\n this.modalEl = el(\"div\", {\n style: styles.modal,\n role: \"dialog\",\n \"aria-modal\": \"true\",\n [NOTICE_FONT_ROOT_ATTRIBUTE]: \"\",\n });\n this.shadowRoot.appendChild(this.modalEl);\n }\n\n private handleTtsChange(): void {\n if (this.destroyed) return;\n const state = this.store.getState();\n const hidingPurpose = state.content\n ? purposeHidingElement(\n state.content.purposes,\n state.collapsedPurposes,\n this.ttsManager?.currentElementId ?? null\n )\n : null;\n this.store.setState(\n hidingPurpose\n ? {\n collapsedPurposes: { ...state.collapsedPurposes, [hidingPurpose]: false },\n ttsRevision: state.ttsRevision + 1,\n }\n : { ttsRevision: state.ttsRevision + 1 }\n );\n }\n\n private ts(): StaticTranslate {\n return makeStaticT(toLanguageCode(this.store.getState().selectedLanguage) || \"en\");\n }\n\n private translate(key: string, fallback: string, itemId?: string): string {\n const { content, selectedLanguage } = this.store.getState();\n if (!content) return fallback;\n if (isDefaultLanguage(selectedLanguage)) {\n if (itemId) return fallback;\n const value = (content as unknown as Record<string, unknown>)[key];\n return typeof value === \"string\" && value ? value : fallback;\n }\n const map = content.supported_languages_and_translations?.[selectedLanguage] as\n | TranslationObject\n | undefined;\n if (!map) return fallback;\n if (itemId) {\n if (key === \"purposes.name\" || key === \"purposes.description\") {\n const purpose = map.purposes?.[itemId];\n if (!purpose) return fallback;\n if (typeof purpose === \"string\") {\n return key === \"purposes.name\" ? purpose : fallback;\n }\n return key === \"purposes.name\" ? purpose.name || fallback : purpose.description || fallback;\n }\n if (key.startsWith(\"data_elements.\")) {\n return map.data_elements?.[itemId] || fallback;\n }\n return fallback;\n }\n const value = (map as unknown as Record<string, unknown>)[key];\n return typeof value === \"string\" && value ? value : fallback;\n }\n\n private translateDpo(key: string, fallback: string): string {\n const { content, selectedLanguage } = this.store.getState();\n if (!content?.dpo_info) return fallback;\n const base = (content.dpo_info as unknown as Record<string, string | undefined>)[key] || fallback;\n if (isDefaultLanguage(selectedLanguage)) return base;\n const map = content.supported_languages_and_translations?.[selectedLanguage];\n const translated = (map?.dpo_info as Record<string, string | undefined> | undefined)?.[key];\n return translated || base;\n }\n\n private async fetchNotice(): Promise<void> {\n try {\n const data = await fetchAssistedNotice({\n organisationUuid: this.options.organisationUuid,\n workspaceUuid: this.options.workspaceUuid,\n noticeUuid: this.options.noticeUuid,\n baseUrl: this.endpoints.baseUrl,\n signal: this.abortController.signal,\n });\n if (this.destroyed) return;\n const activeConfig = data.detail.active_config;\n const preselection = buildPreselection(\n activeConfig.purposes,\n resolvePurposePreselection(activeConfig.purpose_preselection)\n );\n const collapsedPurposes: Record<string, boolean> = {};\n activeConfig.purposes.forEach((purpose) => {\n collapsedPurposes[purpose.uuid] = true;\n });\n this.store.setState({\n content: activeConfig,\n isLoading: false,\n selectedLanguage: normaliseLanguage(activeConfig.default_language),\n collapsedPurposes,\n ...preselection,\n });\n if (this.modalEl) {\n this.keyboardCleanup = setupKeyboardTrap(this.modalEl, () => undefined);\n }\n this.fetchAudio();\n } catch (err) {\n if (this.destroyed || (err instanceof Error && err.name === \"AbortError\")) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.store.setState({ fetchError: error, isLoading: false });\n this.options.onError?.(error);\n }\n }\n\n private fetchAudio(): void {\n const { content, selectedLanguage } = this.store.getState();\n if (!content?.notice_uuid || !this.ttsManager) return;\n void this.ttsManager.fetchAudioUrls({\n noticeUuid: content.notice_uuid,\n language: selectedLanguage,\n content,\n });\n }\n\n private viewContext(state: AssistedState, content: AssistedActiveConfig): AssistedViewContext {\n const isMobile = this.mediaQuery.matches;\n // Host settings, then the console palette, then the notice's brand colours.\n const look = buildAssistedLook({\n noticeId: this.options.noticeUuid,\n content,\n settings: this.options.settings,\n prefersDark: this.colorScheme.matches,\n isMobile,\n });\n return {\n state,\n content,\n isMobile,\n look,\n styles: look.styles,\n responsive: look.responsive,\n displayedPurposes: purposesInRenderOrder(\n content.products,\n content.purposes,\n content.product_purpose_order\n ),\n productPolicyLinks: getProductPolicyLinks(content.products, content.product_privacy_policies),\n primaryColor: look.primaryColor,\n linkColor: look.linkColor,\n accentTint: look.accentTint,\n t: (key, fallback, itemId) => this.translate(key, fallback, itemId),\n tDpo: (key, fallback) => this.translateDpo(key, fallback),\n ts: this.ts(),\n handlers: this.handlers,\n };\n }\n\n private handleStateChange(state: AssistedState, prev: AssistedState): void {\n const changed = (Object.keys(state) as Array<keyof AssistedState>).filter(\n (key) => state[key] !== prev[key]\n );\n if (changed.length === 0) return;\n if (state.content && changed.every((key) => PATCHABLE_KEYS.has(key)) && this.patch(state, changed)) {\n return;\n }\n this.render();\n }\n\n private patch(state: AssistedState, changed: Array<keyof AssistedState>): boolean {\n const root = this.shadowRoot;\n if (!root || !state.content) return false;\n const ctx = this.viewContext(state, state.content);\n\n if (changed.includes(\"mobile\")) {\n const input = root.getElementById(ASSISTED_IDS.mobileInput) as HTMLInputElement | null;\n if (input && input.value !== state.mobile) input.value = state.mobile;\n }\n\n if (changed.includes(\"otpDigits\")) {\n state.otpDigits.forEach((digit, index) => {\n const box = root.getElementById(otpInputId(index)) as HTMLInputElement | null;\n if (!box) return;\n if (box.value !== digit) box.value = digit;\n applyStyles(box, otpBoxStyle(ctx, digit, index));\n });\n if (this.pendingFocusId) {\n (root.getElementById(this.pendingFocusId) as HTMLElement | null)?.focus();\n this.pendingFocusId = null;\n }\n }\n\n if (changed.includes(\"resendCountdown\")) {\n const resend = root.getElementById(ASSISTED_IDS.resend);\n if (resend) resend.replaceWith(renderResend(ctx));\n }\n\n if (changed.includes(\"ttsRevision\")) {\n const slot = root.getElementById(ASSISTED_IDS.speakerSlot);\n if (slot) {\n clearElement(slot);\n const speaker = this.renderSpeaker(ctx);\n if (speaker) slot.appendChild(speaker);\n }\n }\n\n const primary = root.querySelector<HTMLButtonElement>(`[${FOCUS_KEY_ATTRIBUTE}=\"${FOCUS_KEYS.primary}\"]`);\n if (primary) {\n const next = primaryAction(ctx);\n primary.disabled = next.disabled;\n if (primary.textContent !== next.label) primary.textContent = next.label;\n }\n return true;\n }\n\n private focusTarget(): { key: string | null; id: string | null; caret: number | null } {\n const active = this.shadowRoot?.activeElement as HTMLInputElement | null;\n if (this.pendingFocusId) {\n const id = this.pendingFocusId;\n this.pendingFocusId = null;\n return { key: null, id, caret: null };\n }\n if (!active) return { key: null, id: null, caret: null };\n return {\n key: active.getAttribute(FOCUS_KEY_ATTRIBUTE),\n id: active.id || null,\n caret: active.type === \"tel\" || active.type === \"text\" ? active.selectionStart : null,\n };\n }\n\n private restoreFocus(target: { key: string | null; id: string | null; caret: number | null }): void {\n const root = this.shadowRoot;\n if (!root) return;\n const element = (\n target.key\n ? root.querySelector(`[${FOCUS_KEY_ATTRIBUTE}=\"${target.key}\"]`)\n : target.id\n ? root.getElementById(target.id)\n : null\n ) as HTMLInputElement | null;\n if (!element) return;\n element.focus();\n if (target.caret !== null && (element.type === \"tel\" || element.type === \"text\")) {\n element.setSelectionRange(target.caret, target.caret);\n }\n }\n\n private render(): void {\n if (this.destroyed || !this.modalEl || !this.shadowRoot) return;\n const state = this.store.getState();\n const focus = this.focusTarget();\n const scrollTop = this.middleEl?.scrollTop ?? 0;\n\n this.removeLanguageDropdown();\n clearElement(this.modalEl);\n const ts = this.ts();\n const body = el(\"div\", { style: styles.content });\n this.modalEl.appendChild(body);\n this.middleEl = null;\n\n if (state.isLoading) {\n body.appendChild(\n el(\n \"div\",\n { style: styles.loadingContainer },\n el(\"div\", { style: styles.loadingSpinner, role: \"status\", \"aria-label\": ts(\"loadingNotice\") })\n )\n );\n return;\n }\n\n if (state.fetchError || !state.content) {\n body.appendChild(\n el(\n \"div\",\n { style: { ...styles.loadingContainer, gap: \"8px\" } },\n el(\"p\", { style: assistedStyles.errorTitle }, ts(\"loadFailedTitle\")),\n el(\"p\", { style: assistedStyles.errorText }, state.fetchError?.message || ts(\"tryAgain\")),\n el(\n \"button\",\n {\n type: \"button\",\n style: { ...styles.button, ...styles.cancelButton, width: \"auto\" },\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.close,\n onClick: () => this.handleDecline(),\n },\n ts(\"close\")\n )\n )\n );\n return;\n }\n\n const content = state.content;\n const ctx = this.viewContext(state, content);\n const { look } = ctx;\n const noticeTitle = ctx.t(\"notice_banner_heading\", content.notice_banner_heading || \"Privacy Notice\");\n this.modalEl.setAttribute(\"aria-label\", noticeTitle);\n for (const [name, value] of Object.entries(look.rootAttributes)) {\n this.modalEl.setAttribute(name, value);\n }\n this.modalEl.removeAttribute(\"style\");\n applyStyles(this.modalEl, {\n ...look.styles.modal,\n width: ctx.isMobile ? \"90%\" : \"700px\",\n fontFamily: resolveNoticeFontFamily({\n hostFont: this.options.settings?.font,\n noticeFont: content.font_preference,\n }),\n });\n applyCssVariables(this.modalEl, look.rootVariables);\n if (this.overlayEl) {\n this.overlayEl.style.backgroundColor = String(look.styles.overlay.backgroundColor);\n }\n if (this.shadowRoot) {\n this.customCss.apply(this.shadowRoot, this.options.noticeUuid, look.appearance.customCss);\n }\n body.style.margin = ctx.isMobile ? \"20px\" : \"22px\";\n\n body.appendChild(this.renderHeader(ctx, noticeTitle));\n const isVerify = state.step === \"verify\";\n this.middleEl = el(\n \"div\",\n { style: { ...look.styles.middleSection, paddingRight: ctx.isMobile ? \"10px\" : \"15px\" } },\n renderNoticeText(ctx),\n renderPurposeHeading(ctx),\n renderPurposes(ctx, isVerify),\n renderDpoFooter(ctx),\n isVerify ? renderVerifyPanel(ctx) : null\n );\n body.appendChild(this.middleEl);\n body.appendChild(renderFooter(ctx));\n this.middleEl.scrollTop = scrollTop;\n this.restoreFocus(focus);\n\n if (this.pendingReveal) {\n const reveal = this.pendingReveal;\n this.pendingReveal = null;\n setTimeout(() => scrollIntoViewSoft(this.shadowRoot?.getElementById(reveal) ?? null), 60);\n }\n }\n\n private renderSpeaker(ctx: AssistedViewContext): HTMLElement | null {\n const tts = this.ttsManager;\n if (!tts?.isAvailable || ctx.state.step !== \"notice\") return null;\n const playing = tts.isPlaying && !tts.isPaused;\n return el(\n \"button\",\n {\n type: \"button\",\n style: {\n ...ctx.styles.topRight,\n ...ctx.responsive.topRight,\n ...(ctx.look.appearance.colors.language_bg\n ? { backgroundColor: ctx.look.appearance.colors.language_bg }\n : {}),\n ...(ctx.look.appearance.colors.language_text\n ? { color: ctx.look.appearance.colors.language_text }\n : {}),\n padding: \"3px 9px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n \"aria-label\": playing ? ctx.ts(\"audioPause\") : ctx.ts(\"audioStart\"),\n title: playing ? ctx.ts(\"talkbackPause\") : ctx.ts(\"talkbackStart\"),\n [FOCUS_KEY_ATTRIBUTE]: FOCUS_KEYS.speaker,\n onClick: () => this.ttsManager?.toggle(),\n },\n speakerIcon(playing)\n );\n }\n\n private renderHeader(ctx: AssistedViewContext, noticeTitle: string): HTMLElement {\n const { content, ts, isMobile, state, styles, responsive, look } = ctx;\n const title = el(\n \"h2\",\n {\n id: \"privacy-notice-title\",\n ...part(\"title\"),\n style: { ...styles.title, ...responsive.title },\n },\n noticeTitle\n );\n const logo = content.logo_url\n ? el(\"img\", {\n ...part(\"logo\"),\n src: content.logo_url,\n alt: ts(\"logoAlt\"),\n style: { ...styles.logo, ...responsive.logo },\n })\n : null;\n\n const speakerSlot = el(\"span\", { id: ASSISTED_IDS.speakerSlot, style: { display: \"flex\" } });\n const speaker = this.renderSpeaker(ctx);\n if (speaker) speakerSlot.appendChild(speaker);\n\n const colors = look.appearance.colors;\n this.langSelectorRefs = renderLanguageSelector({\n languages: availableLanguages(content.default_language, content.supported_languages_and_translations),\n selectedLanguage: state.selectedLanguage,\n look: {\n styles,\n responsive,\n chip: {\n ...(colors.language_bg ? { backgroundColor: colors.language_bg } : {}),\n ...(colors.language_text ? { color: colors.language_text } : {}),\n ...(colors.border ? { borderColor: colors.border } : {}),\n },\n menu: {},\n selected: {\n ...(colors.language_selected_bg ? { backgroundColor: colors.language_selected_bg } : {}),\n ...(colors.language_selected_text ? { color: colors.language_selected_text } : {}),\n },\n rootAttributes: look.rootAttributes,\n },\n onSelect: (lang) => this.handleLanguageSelect(lang),\n dropdownContainer: this.shadowRoot as ShadowRoot,\n });\n this.langSelectorRefs.button.setAttribute(FOCUS_KEY_ATTRIBUTE, FOCUS_KEYS.language);\n\n const controls = el(\n \"div\",\n { style: { display: \"flex\", alignItems: \"center\", gap: \"8px\", flexShrink: 0 } },\n speakerSlot,\n this.langSelectorRefs.container\n );\n\n // Centred or right: the logo takes its own row above the header, as it\n // does in the modal. Left keeps it beside the title, as it always sat.\n const logoRow =\n logo && look.logoPosition !== \"left\"\n ? el(\n \"div\",\n { style: { ...styles.logoRow, justifyContent: logoRowJustify(look.logoPosition) } },\n logo\n )\n : null;\n const headerLogo = logoRow ? null : logo;\n\n const sectionStyle = {\n ...styles.topSection,\n flexDirection: isMobile ? \"column\" : \"row\",\n alignItems: isMobile ? \"stretch\" : \"flex-start\",\n gap: isMobile ? \"12px\" : \"10px\",\n };\n\n const header = isMobile\n ? el(\n \"div\",\n { style: sectionStyle },\n el(\n \"div\",\n { style: { display: \"flex\", alignItems: \"center\", gap: \"10px\", width: \"100%\" } },\n headerLogo,\n el(\"div\", { style: { marginLeft: \"auto\", display: \"flex\", alignItems: \"center\", flexShrink: 0 } }, controls)\n ),\n title\n )\n : el(\"div\", { style: sectionStyle }, el(\"div\", { style: styles.topLeft }, headerLogo, title), controls);\n\n if (!logoRow) {\n header.setAttribute(\"data-redacto-part\", \"header\");\n return header;\n }\n return el(\n \"div\",\n { ...part(\"header\"), style: { display: \"flex\", flexDirection: \"column\", gap: \"10px\" } },\n logoRow,\n header\n );\n }\n\n private removeLanguageDropdown(): void {\n const refs = this.langSelectorRefs;\n if (!refs) return;\n refs.close();\n if (this.shadowRoot && refs.dropdown.parentNode === this.shadowRoot) {\n this.shadowRoot.removeChild(refs.dropdown);\n }\n this.langSelectorRefs = null;\n }\n\n private handleLanguageSelect(lang: string): void {\n this.store.setState({ selectedLanguage: lang });\n this.fetchAudio();\n }\n\n private handlePurposeToggle(purposeUuid: string): void {\n const state = this.store.getState();\n const purpose = state.content?.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose || state.step !== \"notice\") return;\n this.store.setState(togglePurposeSelection(purpose, state));\n }\n\n private handleDataElementToggle(purposeUuid: string, elementUuid: string): void {\n const state = this.store.getState();\n const purpose = state.content?.purposes.find((p) => p.uuid === purposeUuid);\n if (!purpose || state.step !== \"notice\") return;\n this.store.setState(toggleDataElementSelection(purpose, elementUuid, state));\n }\n\n private handlePurposeCollapse(purposeUuid: string): void {\n const { collapsedPurposes } = this.store.getState();\n this.store.setState({\n collapsedPurposes: { ...collapsedPurposes, [purposeUuid]: !collapsedPurposes[purposeUuid] },\n });\n }\n\n private handleConfirmStep(mode: AcceptMode): void {\n const state = this.store.getState();\n const content = state.content;\n if (!content || state.step !== \"notice\") return;\n // A purpose that covers no product on the notice is not shown, so it\n // cannot be ticked and must not hold the step shut.\n const shown = purposesInRenderOrder(\n content.products,\n content.purposes,\n content.product_purpose_order\n );\n if (mode === \"selected\" && !areAllRequiredElementsChecked(shown, state.selectedDataElements)) {\n return;\n }\n const selection = selectionForMode(content.purposes, mode, state);\n this.ttsManager?.stop();\n this.pendingFocusId =\n state.verifyMethod === \"email\" ? ASSISTED_IDS.emailInput : ASSISTED_IDS.mobileInput;\n this.pendingReveal = ASSISTED_IDS.verifyPanel;\n this.store.setState({\n selectedPurposes: selection.selectedPurposes,\n selectedDataElements: selection.selectedDataElements,\n acceptMode: mode,\n step: \"verify\",\n otpSent: false,\n });\n }\n\n private discardOtpSession(): void {\n this.otpRequest += 1;\n this.verified = null;\n this.stopCountdown();\n }\n\n private handleEditSelections(): void {\n this.discardOtpSession();\n this.store.setState({\n acceptMode: \"selected\",\n step: \"notice\",\n otpSent: false,\n otpUuid: \"\",\n mobile: \"\",\n email: \"\",\n otpDigits: emptyOtpDigits(),\n resendCountdown: 0,\n isSendingOtp: false,\n createError: null,\n otpError: null,\n });\n }\n\n private handleSwitchMethod(): void {\n const state = this.store.getState();\n if (state.otpSent || state.isSendingOtp) return;\n const verifyMethod = state.verifyMethod === \"email\" ? \"mobile\" : \"email\";\n this.pendingFocusId = verifyMethod === \"email\" ? ASSISTED_IDS.emailInput : ASSISTED_IDS.mobileInput;\n this.store.setState({ verifyMethod, createError: null });\n }\n\n private handleGetOtp(): void {\n const state = this.store.getState();\n if (state.isSendingOtp || !isContactValid(state.verifyMethod, state.mobile, state.email)) return;\n void this.sendOtp();\n }\n\n private handleResend(): void {\n if (this.store.getState().isSendingOtp) return;\n void this.sendOtp();\n }\n\n private async sendOtp(): Promise<void> {\n const state = this.store.getState();\n const request = ++this.otpRequest;\n this.verified = null;\n this.store.setState({ createError: null, isSendingOtp: true });\n try {\n const detail = await createOtp({\n organisationUuid: this.options.organisationUuid,\n workspaceUuid: this.options.workspaceUuid,\n to: otpRecipient(state.verifyMethod, state.mobile, state.email),\n channel: otpChannel(state.verifyMethod),\n baseUrl: this.endpoints.baseUrl,\n signal: this.abortController.signal,\n });\n if (this.destroyed || request !== this.otpRequest) return;\n this.pendingFocusId = otpInputId(0);\n this.pendingReveal = otpInputId(0);\n this.store.setState({\n otpUuid: detail.uuid,\n otpDigits: emptyOtpDigits(),\n otpError: null,\n resendCountdown: ASSISTED_CONFIG.resendSeconds,\n otpSent: true,\n isSendingOtp: false,\n });\n this.startCountdown();\n } catch {\n if (this.destroyed || request !== this.otpRequest) return;\n this.store.setState({ createError: this.ts()(\"otpSendFailed\"), isSendingOtp: false });\n }\n }\n\n private startCountdown(): void {\n this.stopCountdown();\n this.resendTimer = setInterval(() => {\n const remaining = this.store.getState().resendCountdown;\n if (remaining <= 1) {\n this.stopCountdown();\n this.store.setState({ resendCountdown: 0 });\n return;\n }\n this.store.setState({ resendCountdown: remaining - 1 });\n }, 1000);\n }\n\n private stopCountdown(): void {\n if (this.resendTimer) {\n clearInterval(this.resendTimer);\n this.resendTimer = null;\n }\n }\n\n private handleChangeContact(): void {\n const state = this.store.getState();\n this.discardOtpSession();\n this.pendingFocusId =\n state.verifyMethod === \"email\" ? ASSISTED_IDS.emailInput : ASSISTED_IDS.mobileInput;\n this.store.setState({\n otpSent: false,\n otpUuid: \"\",\n otpDigits: emptyOtpDigits(),\n resendCountdown: 0,\n isSendingOtp: false,\n createError: null,\n otpError: null,\n });\n }\n\n private handleOtpInput(index: number, value: string): void {\n const next = applyOtpDigit(this.store.getState().otpDigits, index, value);\n this.pendingFocusId = next.focusIndex !== null ? otpInputId(next.focusIndex) : null;\n this.store.setState({ otpDigits: next.digits });\n this.pendingFocusId = null;\n }\n\n private handleOtpKeydown(index: number, event: KeyboardEvent): void {\n if (event.key !== \"Backspace\") return;\n const target = backspaceFocusIndex(this.store.getState().otpDigits, index);\n if (target === null) return;\n (this.shadowRoot?.getElementById(otpInputId(target)) as HTMLInputElement | null)?.focus();\n }\n\n private handleOtpPaste(event: ClipboardEvent): void {\n const pasted = applyOtpPaste(event.clipboardData?.getData(\"text\") ?? \"\");\n if (!pasted) return;\n event.preventDefault();\n this.pendingFocusId = otpInputId(pasted.focusIndex);\n this.store.setState({ otpDigits: pasted.digits });\n this.pendingFocusId = null;\n }\n\n private async verifiedToken(otpUuid: string, code: string): Promise<string> {\n if (this.verified?.otpUuid === otpUuid) return this.verified.accessToken;\n const detail = await verifyOtp({\n organisationUuid: this.options.organisationUuid,\n workspaceUuid: this.options.workspaceUuid,\n uuid: otpUuid,\n otp: code,\n purpose: ASSISTED_CONFIG.otpPurpose,\n baseUrl: this.endpoints.baseUrl,\n signal: this.abortController.signal,\n });\n this.verified = { otpUuid, accessToken: detail.access_token };\n return detail.access_token;\n }\n\n private async handleConfirmOtp(): Promise<void> {\n const state = this.store.getState();\n const content = state.content;\n if (!content || state.isVerifying || !isOtpComplete(state.otpDigits)) return;\n const ts = this.ts();\n this.store.setState({ otpError: null, isVerifying: true });\n\n let accessToken: string;\n try {\n accessToken = await this.verifiedToken(state.otpUuid, state.otpDigits.join(\"\"));\n } catch (err) {\n if (this.destroyed) return;\n this.store.setState({ otpError: ts(verifyFailureKey(err)), isVerifying: false });\n return;\n }\n if (this.destroyed) return;\n\n const noticeUuid = content.notice_uuid || this.options.noticeUuid;\n try {\n if (this.endpoints.ledgerBaseUrl) {\n const status = await fetchNoticeConsentStatusForScope({\n accessToken,\n ledgerBaseUrl: this.endpoints.ledgerBaseUrl,\n organisationUuid: this.options.organisationUuid,\n workspaceUuid: this.options.workspaceUuid,\n noticeUuid,\n signal: this.abortController.signal,\n });\n if (this.destroyed) return;\n if (status && isNoticeFullyConsented(status)) {\n this.complete();\n return;\n }\n }\n\n const latest = this.store.getState();\n const selection = selectionForMode(content.purposes, latest.acceptMode, latest);\n await submitAssistedConsent({\n accessToken,\n organisationUuid: this.options.organisationUuid,\n workspaceUuid: this.options.workspaceUuid,\n baseUrl: this.endpoints.baseUrl,\n ledgerBaseUrl: this.endpoints.ledgerBaseUrl,\n noticeUuid,\n purposes: buildAssistedSubmitPurposes(content.purposes, selection),\n language: latest.selectedLanguage,\n signal: this.abortController.signal,\n });\n if (this.destroyed) return;\n this.complete();\n } catch (err) {\n if (this.destroyed) return;\n if (isAlreadyConsentedError(err)) {\n this.complete();\n return;\n }\n this.store.setState({ otpError: ts(\"tryAgain\"), isVerifying: false });\n this.options.onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private complete(): void {\n this.options.onComplete?.();\n this.destroy();\n }\n\n private handleDecline(): void {\n this.options.onDecline?.();\n this.destroy();\n }\n}\n","import { el } from \"../core/dom\";\nimport { injectCheckboxStyles } from \"../styles/inject\";\nimport { verifyGuardianStatus } from \"../api\";\nimport {\n getConsentState,\n updateConsentState,\n} from \"../services/storage\";\nimport { resolveEndpoints } from \"../shared/endpoints\";\nimport type { DigiLockerCallbackOptions } from \"../types\";\nimport type { GuardianVerificationErrorCode } from \"../api/types\";\n\nfunction getErrorMessage(errorCode?: GuardianVerificationErrorCode | string | null): string {\n switch (errorCode) {\n case \"GUARDIAN_UNDER_18\":\n return \"Guardian verification failed: The guardian must be 18 years or older.\";\n case \"SESSION_EXPIRED\":\n return \"Verification session has expired. Please restart the verification process.\";\n case \"TOKEN_FAILED\":\n return \"DigiLocker authentication failed. Please try again.\";\n case \"DIGILOCKER_AUTH_FAILED\":\n return \"DigiLocker authorization was cancelled or failed. Please try again.\";\n case \"NO_AUTH_CODE\":\n return \"Missing authorization code from DigiLocker. Please try again.\";\n default:\n return \"Verification failed. Please try again.\";\n }\n}\n\nexport function handleDigilockerCallback(options: DigiLockerCallbackOptions): void {\n // The DigiLocker callback page is a standalone screen, not embedded in a\n // host site, so styles can safely live in document.head here.\n injectCheckboxStyles(document);\n\n const params = new URLSearchParams(window.location.search);\n const sessionToken = params.get(\"session_token\");\n const urlStatus = params.get(\"status\") as \"verified\" | \"failed\" | \"expired\" | null;\n const verificationReference = params.get(\"verification_reference\");\n const errorCode = params.get(\"error_code\") as GuardianVerificationErrorCode | null;\n\n const persistedState = getConsentState();\n const originalUrl = persistedState?.originalUrl || \"/\";\n const storedBaseUrl = persistedState?.baseUrl;\n const storedSessionToken = persistedState?.sessionToken;\n const activeSessionToken = sessionToken || storedSessionToken;\n // The modal stores the consent server URL it used; an API host passed here\n // resolves to the same one.\n const apiBaseUrl = resolveEndpoints(options.baseUrl || storedBaseUrl).baseUrl;\n\n // Check if in iframe\n let isInIframe = false;\n try {\n isInIframe = window.self !== window.top;\n } catch {\n isInIframe = true;\n }\n\n // Render status UI\n const container = el(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"200px\",\n padding: \"32px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n });\n\n const statusEl = el(\"p\", {\n style: { fontSize: \"16px\", fontWeight: 600, color: \"#101828\", textAlign: \"center\" },\n });\n statusEl.textContent = \"Processing verification...\";\n\n const spinnerEl = el(\"div\", {\n style: {\n width: \"40px\",\n height: \"40px\",\n border: \"4px solid #f3f3f3\",\n borderTop: \"4px solid #3498db\",\n borderRadius: \"50%\",\n animation: \"spin 1s linear infinite\",\n marginBottom: \"16px\",\n },\n });\n\n container.appendChild(spinnerEl);\n container.appendChild(statusEl);\n document.body.appendChild(container);\n\n const redirectToOriginal = (\n result: \"verified\" | \"failed\" | \"expired\",\n ref?: string\n ) => {\n updateConsentState({\n verificationResult: result,\n verificationReference: ref,\n flowState: result === \"verified\" ? \"consent-form\" : \"error\",\n });\n\n statusEl.textContent = result === \"verified\"\n ? \"Verification successful! Redirecting...\"\n : \"Verification failed. Redirecting...\";\n\n spinnerEl.style.display = \"none\";\n\n setTimeout(() => {\n window.location.href = originalUrl;\n }, 1500);\n };\n\n // Handle direct status from URL\n if (urlStatus === \"verified\" && verificationReference) {\n if (isInIframe && window.parent) {\n window.parent.postMessage({\n type: \"DIGILOCKER_VERIFICATION_STATUS\",\n status: \"verified\",\n verificationReference,\n }, window.location.origin);\n statusEl.textContent = \"Verification successful!\";\n spinnerEl.style.display = \"none\";\n return;\n }\n options.onSuccess?.(verificationReference);\n redirectToOriginal(\"verified\", verificationReference);\n return;\n }\n\n if (urlStatus === \"failed\" || urlStatus === \"expired\") {\n const errorMsg = getErrorMessage(errorCode);\n if (isInIframe && window.parent) {\n window.parent.postMessage({\n type: \"DIGILOCKER_VERIFICATION_STATUS\",\n status: urlStatus,\n errorCode,\n error: errorMsg,\n }, window.location.origin);\n statusEl.textContent = errorMsg;\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n return;\n }\n options.onError?.(new Error(errorMsg), errorCode || undefined);\n redirectToOriginal(urlStatus);\n return;\n }\n\n // No status in URL — poll the backend\n if (!activeSessionToken) {\n statusEl.textContent = \"No verification session found.\";\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n options.onError?.(new Error(\"No session token available\"));\n return;\n }\n\n let retryCount = 0;\n const MAX_RETRIES = 3;\n\n const pollStatus = async () => {\n try {\n const response = await verifyGuardianStatus({\n accessToken: options.accessToken,\n baseUrl: apiBaseUrl,\n sessionToken: activeSessionToken,\n });\n\n if (response.status === \"verified\") {\n const ref = response.verification_reference ||\n response.guardian_details?.verification_reference;\n\n if (isInIframe && window.parent) {\n window.parent.postMessage({\n type: \"DIGILOCKER_VERIFICATION_STATUS\",\n status: \"verified\",\n verificationReference: ref,\n }, window.location.origin);\n statusEl.textContent = \"Verification successful!\";\n spinnerEl.style.display = \"none\";\n return;\n }\n\n if (ref) options.onSuccess?.(ref);\n redirectToOriginal(\"verified\", ref || undefined);\n return;\n }\n\n if (response.status === \"failed\" || response.status === \"expired\") {\n const errorMsg = getVerificationError(response.error_code, response.error);\n\n if (isInIframe && window.parent) {\n window.parent.postMessage({\n type: \"DIGILOCKER_VERIFICATION_STATUS\",\n status: response.status,\n errorCode: response.error_code,\n error: errorMsg,\n }, window.location.origin);\n statusEl.textContent = errorMsg;\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n return;\n }\n\n options.onError?.(new Error(errorMsg), response.error_code || undefined);\n redirectToOriginal(response.status);\n return;\n }\n\n // Still in progress — retry with backoff\n retryCount++;\n if (retryCount > MAX_RETRIES) {\n const timeoutMsg = \"Verification is taking too long. Please return to the original page.\";\n statusEl.textContent = timeoutMsg;\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n options.onError?.(new Error(timeoutMsg));\n redirectToOriginal(\"failed\");\n return;\n }\n\n const delay = 3000 * Math.pow(2, retryCount - 1);\n statusEl.textContent = \"Still processing... Please wait.\";\n setTimeout(pollStatus, delay);\n } catch (error) {\n retryCount++;\n if (retryCount > MAX_RETRIES) {\n const errMsg = (error as Error).message || \"Failed to check verification status.\";\n statusEl.textContent = errMsg;\n statusEl.style.color = \"#DC2626\";\n spinnerEl.style.display = \"none\";\n options.onError?.(error as Error);\n redirectToOriginal(\"failed\");\n return;\n }\n\n const delay = 3000 * Math.pow(2, retryCount - 1);\n setTimeout(pollStatus, delay);\n }\n };\n\n // Start first poll after 3s\n setTimeout(pollStatus, 3000);\n}\n\nfunction getVerificationError(errorCode: string | null, fallbackError: string | null): string {\n return getErrorMessage(errorCode) || fallbackError || \"Verification failed. Please try again.\";\n}\n","import { warnDeprecatedPrivacyCenterSlug } from \"../shared/endpoints\";\nimport type { PrivacyCenterHandle, PrivacyCenterOptions } from \"./types\";\n\n/** Where the hosted Privacy Center lives in production. */\nexport const DEFAULT_PRIVACY_CENTER_ORIGIN = \"https://console.redacto.io\";\n\n/** The message the hosted page posts with its content height, on load and on resize. */\nexport const PRIVACY_CENTER_HEIGHT_MESSAGE = \"redacto:privacy-center:height\";\n\nconst DEFAULT_HEIGHT = \"720px\";\nconst DEFAULT_TITLE = \"Privacy Center\";\n\nconst toCssLength = (value: number | string): string =>\n typeof value === \"number\" ? `${value}px` : value;\n\nconst resolveTarget = (target: string | HTMLElement): HTMLElement => {\n if (typeof target !== \"string\") {\n return target;\n }\n const element = document.querySelector<HTMLElement>(target);\n if (!element) {\n throw new Error(`Target element not found: ${target}`);\n }\n return element;\n};\n\n/**\n * The page to frame: `url` as given, else the hosted sign-in for the\n * organisation (or, deprecated, the slug) on `origin`. `language` becomes\n * `?lang=` either way.\n */\nexport const privacyCenterUrl = (options: PrivacyCenterOptions): string => {\n const base = options.url\n ? options.url\n : `${(options.origin ?? DEFAULT_PRIVACY_CENTER_ORIGIN).replace(/\\/+$/, \"\")}/consent/privacy-center/${encodeURIComponent(\n options.organisationUuid || options.slug || \"\",\n )}/sign-in`;\n const url = new URL(base, window.location.href);\n if (options.language) {\n url.searchParams.set(\"lang\", options.language);\n }\n return url.toString();\n};\n\nconst readHeight = (data: unknown): number | null => {\n if (typeof data !== \"object\" || data === null) {\n return null;\n }\n const message = data as { type?: unknown; height?: unknown };\n if (message.type !== PRIVACY_CENTER_HEIGHT_MESSAGE) {\n return null;\n }\n const height = message.height;\n return typeof height === \"number\" && Number.isFinite(height) && height > 0\n ? Math.ceil(height)\n : null;\n};\n\n/**\n * Mounts the hosted Privacy Center in an iframe inside `target`. The frame\n * grows to fit its content when the hosted page reports its height; with\n * `height` set it keeps that height instead. Returns a handle whose\n * `destroy()` removes the frame and its listener.\n */\nexport const mountPrivacyCenter = (options: PrivacyCenterOptions): PrivacyCenterHandle => {\n if (!options.url && !options.organisationUuid && !options.slug) {\n throw new Error(\"privacyCenter() needs an organisationUuid or a url\");\n }\n warnDeprecatedPrivacyCenterSlug(options.slug);\n const container = resolveTarget(options.target);\n const src = privacyCenterUrl(options);\n const fixedHeight = options.height !== undefined && options.height !== \"auto\";\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = src;\n iframe.title = options.title ?? DEFAULT_TITLE;\n iframe.setAttribute(\"data-redacto-privacy-center\", \"\");\n iframe.setAttribute(\"allow\", \"clipboard-write\");\n iframe.style.display = \"block\";\n iframe.style.width = \"100%\";\n iframe.style.border = \"0\";\n iframe.style.height = fixedHeight ? toCssLength(options.height as number | string) : DEFAULT_HEIGHT;\n\n // Only the frame this call created may resize it; its payload is a number.\n const onMessage = (event: MessageEvent) => {\n if (fixedHeight || event.source !== iframe.contentWindow) {\n return;\n }\n const height = readHeight(event.data);\n if (height !== null) {\n iframe.style.height = `${height}px`;\n }\n };\n\n window.addEventListener(\"message\", onMessage);\n container.appendChild(iframe);\n\n let destroyed = false;\n return {\n iframe,\n destroy: () => {\n if (destroyed) {\n return;\n }\n destroyed = true;\n window.removeEventListener(\"message\", onMessage);\n iframe.remove();\n },\n };\n};\n"],"mappings":"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yB,0CAC3B,EAEaC,GAAiD,CAC5D,GAAID,EACJ,GAAI,CACF,IAAK,qBACL,GAAI,2BACJ,MAAO,iCACP,YAAa,6FACb,sBAAuB,2IACvB,uBACE,kbACF,2BAA4B,0HAC5B,4BACE,8bACF,oBAAqB,sIACrB,qBACE,4VACF,SAAU,kHACV,eACE,sYACF,UAAW,gGACX,aAAc,4HACd,UAAW,kJACX,qBAAsB,+FACtB,kBAAmB,iNACnB,mBACE,wWACF,wBAAyB,sOAC3B,EACA,GAAI,CACF,IAAK,iCACL,GAAI,eACJ,MAAO,iCACP,YAAa,4FACb,sBAAuB,+HACvB,uBACE,6cACF,2BAA4B,6JAC5B,4BACE,6gBACF,oBAAqB,+KACrB,qBACE,qXACF,SAAU,qGACV,eACE,ybACF,UAAW,yFACX,aAAc,sFACd,UAAW,2IACX,qBAAsB,mFACtB,kBAAmB,+PACnB,mBACE,2ZACF,wBAAyB,iPAC3B,EACA,GAAI,CACF,IAAK,qBACL,GAAI,2BACJ,MAAO,iCACP,YAAa,mGACb,sBAAuB,sJACvB,uBACE,kYACF,2BAA4B,yKAC5B,4BACE,2eACF,oBAAqB,sGACrB,qBACE,kYACF,SAAU,oIACV,eACE,uaACF,UAAW,yFACX,aAAc,sFACd,UAAW,0HACX,qBAAsB,mFACtB,kBAAmB,iOACnB,mBACE,sXACF,wBAAyB,iPAC3B,EACA,GAAI,CACF,IAAK,qBACL,GAAI,iCACJ,MAAO,iCACP,YAAa,sFACb,sBAAuB,wKACvB,uBACE,8hBACF,2BAA4B,0LAC5B,4BACE,qrBACF,oBAAqB,4JACrB,qBACE,0dACF,SAAU,2MACV,eACE,0rBACF,UAAW,oJACX,aAAc,8HACd,UAAW,iPACX,qBAAsB,6HACtB,kBACE,sUACF,mBACE,+dACF,wBAAyB,0OAC3B,EACA,GAAI,CACF,IAAK,iCACL,GAAI,2BACJ,MAAO,6CACP,YAAa,+GACb,sBAAuB,8KACvB,uBACE,2XACF,2BAA4B,gJAC5B,4BACE,6hBACF,oBAAqB,0IACrB,qBACE,yWACF,SAAU,4JACV,eACE,0bACF,UAAW,4HACX,aAAc,0FACd,UAAW,kKACX,qBAAsB,+FACtB,kBAAmB,gRACnB,mBACE,sYACF,wBACE,0RACJ,EACA,GAAI,CACF,IAAK,eACL,GAAI,eACJ,MAAO,iCACP,YAAa,0EACb,sBAAuB,4GACvB,uBACE,iTACF,2BAA4B,uJAC5B,4BACE,wXACF,oBAAqB,8EACrB,qBACE,+SACF,SAAU,sGACV,eACE,uZACF,UAAW,yFACX,aAAc,4FACd,UAAW,oHACX,qBAAsB,mFACtB,kBAAmB,2MACnB,mBACE,wUACF,wBAAyB,+KAC3B,EACA,GAAI,CACF,IAAK,2BACL,GAAI,2BACJ,MAAO,iCACP,YAAa,gFACb,sBAAuB,0LACvB,uBACE,4XACF,2BAA4B,oLAC5B,4BACE,ofACF,oBAAqB,sJACrB,qBACE,8WACF,SAAU,uHACV,eACE,6dACF,UAAW,kFACX,aAAc,kHACd,UAAW,mKACX,qBAAsB,yFACtB,kBAAmB,wPACnB,mBACE,yXACF,wBAAyB,4PAC3B,EACA,GAAI,CACF,IAAK,qBACL,GAAI,2BACJ,MAAO,uCACP,YAAa,8GACb,sBAAuB,gMACvB,uBACE,0fACF,2BAA4B,0OAC5B,4BACE,yoBACF,oBAAqB,8HACrB,qBACE,qbACF,SAAU,2GACV,eACE,gpBACF,UAAW,gHACX,aAAc,gGACd,UAAW,gJACX,qBAAsB,qGACtB,kBACE,wVACF,mBACE,mdACF,wBACE,0RACJ,EACA,GAAI,CACF,IAAK,qBACL,GAAI,2BACJ,MAAO,iCACP,YAAa,gFACb,sBAAuB,gIACvB,uBACE,qZACF,2BAA4B,+JAC5B,4BACE,uXACF,oBAAqB,wGACrB,qBACE,+SACF,SAAU,gGACV,eACE,0YACF,UAAW,0FACX,aAAc,uFACd,UAAW,sIACX,qBAAsB,yFACtB,kBAAmB,2KACnB,mBACE,iTACF,wBAAyB,qLAC3B,EACA,GAAI,CACF,IAAK,eACL,GAAI,eACJ,MAAO,iCACP,YAAa,gFACb,sBAAuB,iJACvB,uBACE,6XACF,2BAA4B,qIAC5B,4BACE,oeACF,oBAAqB,6JACrB,qBACE,oYACF,SAAU,oIACV,eACE,keACF,UAAW,2GACX,aAAc,qFACd,UAAW,iMACX,qBAAsB,6EACtB,kBAAmB,kRACnB,mBACE,qVACF,wBAAyB,uPAC3B,EACA,GAAI,CACF,IAAK,qBACL,GAAI,2BACJ,MAAO,iCACP,YAAa,4FACb,sBAAuB,iJACvB,uBACE,0WACF,2BAA4B,yKAC5B,4BACE,ogBACF,oBAAqB,6JACrB,qBACE,4XACF,SAAU,0FACV,eACE,0ZACF,UAAW,8EACX,aAAc,4FACd,UAAW,gKACX,qBAAsB,2GACtB,kBAAmB,qQACnB,mBACE,8VACF,wBACE,+QACJ,EACA,GAAI,CACF,IAAK,qBACL,GAAI,2BACJ,MAAO,2BACP,YAAa,oEACb,sBAAuB,kHACvB,uBACE,sZACF,2BAA4B,2IAC5B,4BACE,wcACF,oBAAqB,mHACrB,qBACE,wWACF,SAAU,sGACV,eACE,iYACF,UAAW,0FACX,aAAc,iFACd,UAAW,6IACX,qBAAsB,2GACtB,kBAAmB,kNACnB,mBACE,2XACF,wBAAyB,4LAC3B,EACA,GAAI,CACF,IAAK,eACL,GAAI,2BACJ,MAAO,iCACP,YAAa,4FACb,sBAAuB,iJACvB,uBACE,iVACF,2BAA4B,+HAC5B,4BACE,udACF,oBAAqB,+HACrB,qBACE,oWACF,SAAU,0LACV,eACE,ibACF,UAAW,iHACX,aAAc,iGACd,UAAW,6JACX,qBAAsB,+FACtB,kBAAmB,wPACnB,mBACE,+aACF,wBAAyB,6PAC3B,EACA,GAAI,CACF,IAAK,qBACL,GAAI,SACJ,MAAO,6CACP,YAAa,wGACb,sBAAuB,0LACvB,uBACE,mbACF,2BAA4B,uHAC5B,4BACE,ycACF,oBAAqB,wHACrB,qBACE,6SACF,SAAU,wIACV,eACE,wcACF,UAAW,0GACX,aAAc,iGACd,UAAW,+KACX,qBAAsB,kFACtB,kBAAmB,mQACnB,mBACE,0XACF,wBAAyB,uQAC3B,EACA,IAAK,CACH,IAAK,eACL,GAAI,qBACJ,MAAO,iCACP,YAAa,0EACb,sBAAuB,+HACvB,uBACE,+ZACF,2BAA4B,uGAC5B,4BACE,mYACF,oBAAqB,2IACrB,qBACE,6UACF,SAAU,4GACV,eACE,qWACF,UAAW,mFACX,aAAc,4HACd,UAAW,gIACX,qBAAsB,6EACtB,kBAAmB,gNACnB,mBACE,kUACF,wBAAyB,yNAC3B,EACA,IAAK,CACH,IAAK,qBACL,GAAI,eACJ,MAAO,iCACP,YAAa,yGACb,sBAAuB,4JACvB,uBACE,kdACF,2BAA4B,iJAC5B,4BACE,mdACF,oBAAqB,kHACrB,qBACE,2WACF,SAAU,+FACV,eACE,yYACF,UAAW,qGACX,aAAc,yEACd,UAAW,0HACX,qBAAsB,mFACtB,kBAAmB,kOACnB,mBACE,uVACF,wBAAyB,8PAC3B,EACA,IAAK,CACH,IAAK,qBACL,GAAI,2BACJ,MAAO,2BACP,YAAa,iFACb,sBAAuB,gIACvB,uBACE,iaACF,2BAA4B,6IAC5B,4BACE,0ZACF,oBAAqB,qHACrB,qBACE,wTACF,SAAU,sGACV,eACE,qbACF,UAAW,0FACX,aAAc,gHACd,UAAW,wJACX,qBAAsB,6EACtB,kBAAmB,kMACnB,mBACE,4TACF,wBAAyB,6MAC3B,EACA,IAAK,CACH,IAAK,2BACL,GAAI,qBACJ,MAAO,uCACP,YAAa,uFACb,sBAAuB,uJACvB,uBACE,4aACF,2BAA4B,gLAC5B,4BACE,ufACF,oBAAqB,+HACrB,qBACE,4VACF,SAAU,mHACV,eACE,mbACF,UAAW,8EACX,aAAc,wGACd,UAAW,kJACX,qBAAsB,qDACtB,kBAAmB,8MACnB,mBACE,6VACF,wBAAyB,gMAC3B,EACA,WAAY,CACV,IAAK,qBACL,GAAI,2BACJ,MAAO,2BACP,YAAa,6FACb,sBAAuB,sGACvB,uBACE,6SACF,2BAA4B,qIAC5B,4BACE,2ZACF,oBAAqB,oFACrB,qBACE,kTACF,SAAU,kHACV,eACE,uaACF,UAAW,mFACX,aAAc,iDACd,UAAW,6GACX,qBAAsB,+FACtB,kBAAmB,6LACnB,mBACE,+RACF,wBAAyB,mNAC3B,EACA,IAAK,CACH,IAAK,qBACL,GAAI,qBACJ,MAAO,iCACP,YAAa,mGACb,sBAAuB,6GACvB,uBACE,mZACF,2BAA4B,oHAC5B,4BACE,6bACF,oBAAqB,6GACrB,qBACE,2VACF,SAAU,oFACV,eACE,4dACF,UAAW,2DACX,aAAc,uDACd,UAAW,sIACX,qBAAsB,oFACtB,kBAAmB,mOACnB,mBACE,+SACF,wBAAyB,8MAC3B,EACA,GAAI,CACF,IAAK,eACL,GAAI,eACJ,MAAO,2BACP,YAAa,oEACb,sBAAuB,0FACvB,uBACE,gaACF,2BAA4B,qIAC5B,4BACE,yWACF,oBAAqB,oFACrB,qBACE,8RACF,SAAU,4GACV,eACE,qXACF,UAAW,0FACX,aAAc,uFACd,UAAW,iIACX,qBAAsB,+FACtB,kBAAmB,mLACnB,mBACE,4YACF,wBAAyB,oKAC3B,EACA,GAAI,CACF,IAAK,qBACL,GAAI,eACJ,MAAO,iCACP,YAAa,oEACb,sBAAuB,4GACvB,uBACE,igBACF,2BAA4B,uJAC5B,4BACE,+aACF,oBAAqB,gGACrB,qBACE,2WACF,SAAU,mFACV,eACE,sYACF,UAAW,4GACX,aAAc,sFACd,UAAW,kJACX,qBAAsB,mFACtB,kBAAmB,oMACnB,mBACE,+YACF,wBAAyB,2LAC3B,CACF,ECnlBO,IAAME,GAA+B,iCAE/BC,GAAsC,OAOtCC,GAAiC,aACjCC,GAAsC,kBACtCC,GAA8B,UAO9BC,GAAuB,yBACvBC,GAA4B,sBAC5BC,GAAoB,sBAEpBC,GAAyB,gBAMzBC,GAAsD,CACjE,KAAM,aACN,OAAQ,SACR,MAAO,UACT,EAGaC,GAAwB,IAExBC,GAA6B,WAEpCC,GAAwB,MAGxBC,GAAsB,MAEfC,GAA0D,CACrE,MAAOF,GACP,WAAYC,EACd,EAEaE,GAGR,CACH,CAAE,SAAU,2BAA4B,UAAW,oBAAqB,EACxE,CAAE,SAAU,kCAAmC,UAAW,oBAAqB,EAC/E,CAAE,SAAU,2CAA4C,UAAW,+BAAgC,EACnG,CAAE,SAAU,4BAA6B,UAAW,qBAAsB,EAC1E,CAAE,SAAU,0BAA2B,UAAW,mBAAoB,EACtE,CAAE,SAAU,iCAAkC,UAAW,mBAAoB,EAC7E,CAAE,SAAU,qBAAsB,UAAW,cAAe,EAC5D,CAAE,SAAU,4BAA6B,UAAW,cAAe,CACrE,EAEaC,GAAwB,SAExBC,GAAuB,CAClC,gBAAiB,CAACC,EAAqBC,IACrC,cAAcA,CAAY,iBAAiBD,CAAW,GACxD,eAAgB,CAACA,EAAqBC,IACpC,cAAcA,CAAY,0BAA0BD,CAAW,GACjE,QAAUA,GAAwB,wBAAwBA,CAAW,EACvE,EAEaE,GAAkB,uBAMlBC,GAAoB,CAC/B,iBAAkBC,EAAiB,kBACnC,kBAAmBA,EAAiB,mBACpC,uBAAwBA,EAAiB,wBACzC,mBAAqBC,GACnB,oCAAoCA,EAAa,KAAK,IAAI,CAAC,cAC/D,EAEaC,GAAoD,OAEpDC,GAA0B,WAE1BC,GAAkB,EAElBC,GAAoB,wBAEpBC,GAAgB,CAC3B,MAAON,EAAiB,SACxB,YAAaA,EAAiB,eAC9B,OAAQA,EAAiB,UACzB,UAAWA,EAAiB,aAC5B,OAAQA,EAAiB,SAC3B,EAEaO,GAAyBP,EAAiB,qBAE1CQ,GAAkD,WAElDC,GAA2B,UAE3BC,GAAyB,CACpC,SAAWC,GACTX,EAAiB,YAAY,QAAQ,WAAYW,CAAM,EACzD,MAAOX,EAAiB,MACxB,QAAS,CACP,CAAE,MAAOA,EAAiB,IAAK,MAAO,EAAK,EAC3C,CAAE,MAAOA,EAAiB,GAAI,MAAO,EAAM,CAC7C,CACF,EAEaY,GAAoB,yBACpBC,GAA2B,gCAE3BC,GAAsB,CACjC,aAAc,CACZ,MAAOd,EAAiB,sBACxB,OAAQA,EAAiB,sBAC3B,EACA,kBAAmB,CACjB,MAAOA,EAAiB,2BACxB,OAAQA,EAAiB,2BAC3B,EACA,QAAS,CACP,MAAOA,EAAiB,oBACxB,OAAQA,EAAiB,oBAC3B,EACA,QAASA,EAAiB,IAC1B,OAAQA,EAAiB,EAC3B,EAEae,GAAsB,UAEtBC,GAAyB,QAEzBC,GAA+B,eAE/BC,GAAwD,CACnE,CACE,GAAI,aACJ,MAAO,aACP,MAAO,2DACT,EACA,CAAE,GAAI,QAAS,MAAO,QAAS,MAAO,8BAA+B,EACrE,CACE,GAAI,UACJ,MAAO,UACP,MAAO,0CACT,EACA,CACE,GAAI,kBACJ,MAAO,kBACP,MAAO,iCACT,EACA,CACE,GAAI,eACJ,MAAO,eACP,MAAO,oEACT,EACA,CAAE,GAAI,UAAW,MAAO,UAAW,MAAO,6BAA8B,CAC1E,EAEaC,GAA2C,CACtD,UACA,UACA,SACA,eACA,QACA,QACA,aACA,YACA,UACA,UACA,YACA,WACA,gBACA,eACA,aACA,OACA,QACA,UACF,EAEaC,GAAyB,aAEzBC,GAA6B,2BAE7BC,GAAuB,6BAEvBC,GAAkB;AAAA,KAC1BF,EAA0B;AAAA,KAC1BA,EAA0B;AAAA,KAC1BA,EAA0B;AAAA,KAC1BA,EAA0B;AAAA,KAC1BA,EAA0B;AAAA,KAC1BA,EAA0B;AAAA;AAAA;EC7L/B,IAAMG,GAAWC,GAIJC,GAAsB,MAAO,CACxC,SAAAC,EACA,YAAAC,EACA,QAAAC,EACA,SAAAC,EAAW,KACX,cAAAC,EACA,iBAAAC,EAAmB,MACnB,6BAAAC,EAA+B,GAC/B,OAAAC,EACA,GAAGC,CACL,IAAqF,CACnF,GAAI,CAACR,GAAY,CAACK,EAChB,MAAM,IAAI,MAAM,sBAAsB,EAExC,GAAI,CAACJ,GAAe,CAACO,EAAc,MACjC,MAAM,IAAI,MAAM,kCAAkC,EAGpD,GAAM,CAAE,iBAAkBC,EAAK,cAAeC,EAAI,QAAAC,CAAQ,EAAIC,GAC5DX,EACAO,CACF,EAEMK,EAAaX,GAAWL,GAOxBiB,EAAW,GAHKH,EAClB,WAAWA,EAAQ,gBAAgB,IAAIA,EAAQ,aAAa,IAAIA,EAAQ,MAAQA,EAAQ,OAASA,EAAQ,MAAM,GAC/GV,CAC6B,IAAID,CAAQ,IAAIK,CAAgB,IAAIF,CAAQ,IAAIC,GAAiB,EAAE,IAAIE,CAA4B,GAEpI,GAAID,IAAqB,OAAS,CAACD,EAAe,CAChD,IAAMW,EAASC,GAAcF,CAAQ,EACrC,GAAIC,EAAQ,OAAOA,CACrB,CAEA,IAAME,EAAM,IAAI,IAAI,GAAGJ,CAAU,yBAAyBJ,CAAG,eAAeC,CAAE,YAAYV,CAAQ,EAAE,EAMpG,GALII,GAAea,EAAI,aAAa,OAAO,gBAAiBb,CAAa,EACzEa,EAAI,aAAa,OAAO,mBAAoBZ,CAAgB,EACxDC,GAA8BW,EAAI,aAAa,OAAO,+BAAgC,MAAM,EAG5FN,EACF,OAAW,CAACO,EAAKC,CAAK,IAAK,OAAO,QAAQC,GAAqBT,CAAO,CAAC,EACjEQ,GAAOF,EAAI,aAAa,OAAOC,EAAKC,CAAK,EAIjD,IAAME,EAAW,MAAM,MAAMJ,EAAI,SAAS,EAAG,CAC3C,OAAQ,MACR,QAAS,CACP,GAAGK,GAAiBrB,EAAaU,CAAO,EACxC,kBAAmBR,CACrB,EACA,OAAAI,CACF,CAAC,EAED,GAAI,CAACc,EAAS,GACZ,MAAM,MAAME,GAAcF,EAAU,sDAAsD,EAG5F,IAAMG,EAAuB,MAAMH,EAAS,KAAK,EAEjD,OAAIhB,IAAqB,OAAS,CAACD,GACjCqB,GAAcX,EAAUU,CAAI,EAGvBA,CACT,EAIaE,GAA4B,MAAO,CAC9C,SAAAC,EACA,eAAAC,EACA,YAAAC,EACA,YAAA5B,EACA,QAAAC,EACA,SAAAC,EAAW,KACX,cAAAC,CACF,IAAgE,CAE9D,IAAM0B,EAAa,GADA5B,GAAWL,EACE,yBAAyB8B,CAAQ,eAAeC,CAAc,WAExFX,EAAM,IAAI,IACdhB,EAAc,GAAG6B,CAAU,IAAID,CAAW,GAAK,GAAGC,CAAU,eAAeD,CAAW,EACxF,EACIzB,GAAea,EAAI,aAAa,OAAO,gBAAiBb,CAAa,EAEzE,IAAMiB,EAAW,MAAM,MAAMJ,EAAI,SAAS,EAAG,CAC3C,OAAQ,MACR,QAAS,CACP,eAAgB,mBAChB,kBAAmBd,EACnB,GAAIF,EAAc,CAAE,cAAe,UAAUA,CAAW,EAAG,EAAI,CAAC,CAClE,CACF,CAAC,EAED,GAAI,CAACoB,EAAS,GACZ,MAAM,MAAME,GAAcF,EAAU,sDAAsD,EAG5F,OAAO,MAAMA,EAAS,KAAK,CAC7B,EAIaU,GAAqB,MAAO,CACvC,YAAA9B,EACA,QAAAC,EACA,cAAA8B,EACA,WAAAC,EACA,SAAAC,EACA,SAAAC,EACA,UAAAC,EACA,8BAAAC,EACA,kBAAAC,EACA,SAAAnC,EACA,OAAAI,EACA,GAAGC,CACL,IAA0E,CACxE,GAAI,CAACyB,GAAc,CAAC,MAAM,QAAQC,CAAQ,EACxC,MAAM,IAAI,MAAM,4CAA4C,EAE9D,GAAI,CAACjC,GAAe,CAACO,EAAc,MACjC,MAAM,IAAI,MAAM,kCAAkC,EAGpD,GAAM,CAAE,iBAAkBC,EAAK,cAAeC,EAAI,QAAAC,CAAQ,EAAIC,GAC5DX,EACAO,CACF,EAIMK,EAAamB,GAAiB9B,GAAWL,GAEzC0C,EAA+B,CACnC,YAAaN,EACb,SAAUO,GAAiBN,CAAQ,EACnC,qBAAsB,GACtB,OAAQ,MACR,SAAU,EAAQC,EAClB,UAAWC,EAAY,CAAE,cAAeA,EAAU,cAAe,UAAWA,EAAU,SAAU,EAAI,OACpG,gCAAiCC,EACjC,oBAAqBC,EACrB,SAAUG,GAAetC,CAAQ,CACnC,EAIMuC,EAAc/B,EAAU,CAAE,GAAG4B,EAAS,GAAGI,GAAoBhC,CAAO,CAAE,EAAI4B,EAE1EtB,EAAM,GAAGJ,CAAU,yBAAyBJ,CAAG,eAAeC,CAAE,kBAChEkC,EAAiB,KAAK,UAAUF,CAAW,EAE3CrB,EAAW,MAAMwB,GAAmB5B,EAAK2B,EAAiBE,GAC9D,MAAM7B,EAAK,CACT,OAAQ,OACR,QAAS,CACP,GAAGK,GAAiBrB,EAAaU,CAAO,EACxC,eAAgB,mBAChB,GAAGmC,CACL,EACA,KAAMF,EACN,OAAArC,CACF,CAAC,CACH,EAEA,GAAI,CAACc,EAAS,GACZ,MAAM,MAAME,GAAcF,EAAU,kDAAkD,EAGxF0B,GAAc,CAChB,EAIaC,GAA2B,MAAO,CAC7C,SAAArB,EACA,eAAAC,EACA,YAAA3B,EACA,QAAAC,EACA,cAAA8B,EACA,WAAAC,EACA,SAAAC,EACA,SAAAC,EACA,UAAAC,EACA,SAAAjC,CACF,IAAqD,CAGnD,IAAMU,EAAamB,GAAiB9B,GAAWL,GAEzC0C,EAA+B,CACnC,YAAaN,EACb,SAAUO,GAAiBN,CAAQ,EACnC,qBAAsB,GACtB,OAAQ,MACR,SAAAC,EACA,UAAAC,EACA,SAAUK,GAAetC,CAAQ,CACnC,EAEMc,EAAM,GAAGJ,CAAU,yBAAyBc,CAAQ,eAAeC,CAAc,kBACjFgB,EAAiB,KAAK,UAAUL,CAAO,EAEvClB,EAAW,MAAMwB,GAAmB5B,EAAK2B,EAAiBE,GAC9D,MAAM7B,EAAK,CACT,OAAQ,OACR,QAAS,CACP,cAAe,UAAUhB,CAAW,GACpC,eAAgB,mBAChB,GAAG6C,CACL,EACA,KAAMF,CACR,CAAC,CACH,EAEA,GAAI,CAACvB,EAAS,GACZ,MAAM,MAAME,GAAcF,EAAU,kDAAkD,CAE1F,EAIa4B,GAAoB,MAAO,CACtC,YAAAhD,EACA,QAAAC,EACA,cAAA8B,EACA,aAAAkB,EACA,WAAAjB,EACA,SAAA9B,EACA,OAAAI,EACA,GAAGC,CACL,IAAyF,CACvF,GAAK,CAACP,GAAe,CAACO,EAAc,OAAU,CAACyB,GAAc,CAAC9B,EAC5D,MAAM,IAAI,MAAM,+DAA+D,EAGjF,GAAM,CAAE,iBAAkBM,EAAK,cAAeC,EAAI,QAAAC,CAAQ,EAAIC,GAC5DX,EACAO,CACF,EAMMK,GADoB,CAACF,GAAWuC,IAAiB,OACflB,EAAgB,OAAS9B,GAAWL,GACtEoB,EAAM,IAAI,IACd,GAAGJ,CAAU,yBAAyBJ,CAAG,eAAeC,CAAE,YAAYuB,CAAU,UAAU9B,CAAQ,EACpG,EAGA,GAAIQ,EACF,OAAW,CAACO,EAAKC,CAAK,IAAK,OAAO,QAAQC,GAAqBT,CAAO,CAAC,EACjEQ,GAAOF,EAAI,aAAa,OAAOC,EAAKC,CAAK,EAIjD,IAAME,EAAW,MAAM,MAAMJ,EAAI,SAAS,EAAG,CAC3C,OAAQ,MACR,QAAS,CACP,GAAGK,GAAiBrB,EAAaU,CAAO,EACxC,OAAQ,kBACV,EACA,OAAAJ,CACF,CAAC,EAED,GAAI,CAACc,EAAS,GACZ,MAAM,MAAME,GAAcF,EAAU,mDAAmD,EAGzF,OAAO,MAAMA,EAAS,KAAK,CAC7B,EAIa8B,GAA+B,MAAO,CACjD,YAAAlD,EACA,QAAAC,EACA,aAAAkD,EACA,gBAAAC,EACA,qBAAAC,EACA,oBAAAC,EACA,SAAAC,EACA,OAAAjD,CACF,IAAyF,CAjUzF,IAAAkD,EAqUE,GAAI,CAACxD,EAAa,MAAM,IAAI,MAAM,yBAAyB,EAC3D,GAAI,EAACmD,GAAA,MAAAA,EAAc,QAAQ,MAAM,IAAI,MAAM,2BAA2B,EACtE,GAAI,EAACC,GAAA,MAAAA,EAAiB,QAAQ,MAAM,IAAI,MAAM,8BAA8B,EAC5E,GAAI,EAACC,GAAA,MAAAA,EAAsB,QAAQ,MAAM,IAAI,MAAM,mCAAmC,EAEtF,IAAMI,EAAeC,GAAkB1D,CAAW,EAClD,GAAI,CAACyD,EAAc,MAAM,IAAI,MAAM,sBAAsB,EACzD,GAAM,CAAE,kBAAmBjD,EAAK,eAAgBC,CAAG,EAAIgD,EACvD,GAAI,CAACjD,GAAO,CAACC,EAAI,MAAM,IAAI,MAAM,uDAAuD,EAExF,IAAMG,EAAaX,GAAWL,GAExB0C,EAA+B,CACnC,cAAea,EAAa,KAAK,EACjC,iBAAkBC,EAAgB,KAAK,EACvC,sBAAuBC,EAAqB,KAAK,CACnD,EACIC,IAAqBhB,EAAQ,sBAAwBgB,GACrDC,IAAUjB,EAAQ,SAAWiB,GAEjC,IAAMnC,EAAW,MAAM,MACrB,GAAGR,CAAU,yBAAyBJ,CAAG,eAAeC,CAAE,kCAC1D,CACE,OAAQ,OACR,QAAS,CACP,cAAe,UAAUT,CAAW,GACpC,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAUsC,CAAO,EAC5B,OAAAhC,CACF,CACF,EAEA,GAAI,CAACc,EAAS,GACZ,MAAM,MAAME,GAAcF,EAAU,0DAA0D,EAGhG,IAAMuC,EAAe,MAAMvC,EAAS,KAAK,EACnCwC,EAASD,EAAa,QAAUA,EAEtC,GAAIC,EAAO,iBACT,MAAO,CACL,QAAS,GACT,mBAAoBA,EAAO,mBAC3B,iBAAkB,GAClB,uBAAwBA,EAAO,sBACjC,EAGF,GAAI,CAACA,EAAO,eAAiB,CAACA,EAAO,wBACnC,MAAM,IAAI,MAAM,oEAAoE,EAGtF,MAAO,CACL,SAASJ,EAAAI,EAAO,UAAP,KAAAJ,EAAkB,GAC3B,mBAAoBI,EAAO,mBAC3B,iBAAkB,GAClB,cAAeA,EAAO,cACtB,wBAAyBA,EAAO,wBAChC,WAAYA,EAAO,UACrB,CACF,EAEaC,GAAuB,MAAO,CACzC,YAAA7D,EACA,QAAAC,EACA,aAAA6D,EACA,OAAAxD,CACF,IAAyE,CAzYzE,IAAAkD,EAAAO,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA6YE,GAAI,CAACpE,GAAe,CAAC8D,EACnB,MAAM,IAAI,MAAM,2CAA2C,EAG7D,IAAML,EAAeC,GAAkB1D,CAAW,EAClD,GAAI,CAACyD,EAAc,MAAM,IAAI,MAAM,sBAAsB,EACzD,GAAM,CAAE,kBAAmBjD,EAAK,eAAgBC,CAAG,EAAIgD,EACvD,GAAI,CAACjD,GAAO,CAACC,EAAI,MAAM,IAAI,MAAM,uDAAuD,EAIxF,IAAMW,EAAW,MAAM,MACrB,GAHiBnB,GAAWL,EAGf,yBAAyBY,CAAG,eAAeC,CAAE,0BAC1D,CACE,OAAQ,OACR,QAAS,CACP,cAAe,UAAUT,CAAW,GACpC,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAU,CAAE,cAAe8D,CAAa,CAAC,EACpD,OAAAxD,CACF,CACF,EAEA,GAAI,CAACc,EAAS,GACZ,MAAM,MAAME,GAAcF,EAAU,wDAAwD,EAG9F,IAAMuC,EAAe,MAAMvC,EAAS,KAAK,EACnCwC,EAASD,EAAa,QAAUA,EAEtC,MAAO,CACL,QAAQH,EAAAI,EAAO,SAAP,KAAAJ,EAAiB,cACzB,oBAAoBO,EAAAH,EAAO,qBAAP,KAAAG,EAA6B,KACjD,wBAAwBC,EAAAJ,EAAO,yBAAP,KAAAI,EAAiC,KACzD,kBAAkBC,EAAAL,EAAO,mBAAP,KAAAK,EAA2B,KAC7C,OAAOC,EAAAN,EAAO,QAAP,KAAAM,EAAgB,KACvB,YAAYC,EAAAP,EAAO,aAAP,KAAAO,EAAqB,KACjC,WAAWC,EAAAR,EAAO,YAAP,KAAAQ,EAAoB,EACjC,CACF,ECtZO,IAAMC,GAAmC,MAAO,CACrD,YAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,WAAAC,EACA,OAAAC,CACF,IAA2F,CACzF,GAAI,CAACL,GAAe,CAACC,GAAiB,CAACC,GAAoB,CAACC,GAAiB,CAACC,EAC5E,OAAO,KAGT,GAAI,CACF,IAAME,EAAW,MAAM,MACrB,GAAGL,CAAa,yBAAyBC,CAAgB,eAAeC,CAAa,YAAYC,CAAU,iBAC3G,CACE,OAAQ,OACR,QAAS,CACP,cAAe,UAAUJ,CAAW,GACpC,eAAgB,kBAClB,EACA,KAAM,KACN,OAAAK,CACF,CACF,EAEA,GAAI,CAACC,EAAS,GAAI,OAAO,KAEzB,IAAMC,EAAQ,MAAMD,EAAS,KAAK,EAI5BE,EACJD,GAAQ,OAAOA,GAAS,UAAY,WAAYA,GAAQA,EAAK,OACzDA,EAAK,OACJA,EAEP,MAAI,CAACC,GAAQ,CAAC,MAAM,QAAQA,EAAK,QAAQ,EAAU,KAC5CA,CACT,MAAQ,CAEN,OAAO,IACT,CACF,EAMaC,GAA2B,MAAO,CAC7C,YAAAT,EACA,cAAAC,EACA,WAAAG,EACA,OAAAC,CACF,IAAmF,CACjF,GAAI,CAACL,GAAe,CAACC,GAAiB,CAACG,EAAY,OAAO,KAE1D,IAAMM,EAAeC,GAAkBX,CAAW,EAClD,GAAI,CAACU,EAAc,OAAO,KAE1B,GAAM,CAAE,kBAAmBE,EAAK,eAAgBC,CAAG,EAAIH,EACvD,MAAI,CAACE,GAAO,CAACC,EAAW,KAEjBd,GAAiC,CACtC,YAAAC,EACA,cAAAC,EACA,iBAAkBW,EAClB,cAAeC,EACf,WAAAT,EACA,OAAAC,CACF,CAAC,CACH,EAQaS,GAA0BC,GACrCA,EAAO,WAAaA,EAAO,qBAehBC,GAA4B,CACvCD,EACAE,IACgC,CAjIlC,IAAAC,EAAAC,EAkIE,IAAMC,EAAS,IAAI,IAAIL,EAAO,SAAS,IAAKM,GAAM,CAACA,EAAE,KAAMA,CAAC,CAAC,CAAC,EAE9D,GAAI,CADeN,EAAO,SAAS,KAAMM,IAAOA,EAAE,QAAU,cAAgB,UAAU,EACrE,OAAO,KAExB,IAAMC,EAAuD,CAAC,EAC9D,QAAWC,KAAMN,EAAgB,CAC/B,IAAMO,EAAKJ,EAAO,IAAIG,EAAG,IAAI,EACvBE,GAAgBD,GAAA,YAAAA,EAAI,SAAU,WAC9BE,EAAiB,IAAI,MAAKF,GAAA,YAAAA,EAAI,gBAAiB,CAAC,GAAG,IAAKG,GAAO,CAACA,EAAG,KAAMA,EAAG,QAAQ,CAAC,CAAC,EACtFC,EAAsD,CAAC,EAC7D,QAAWD,KAAMJ,EAAG,cAClBK,EAAcD,EAAG,IAAI,EAAI,CACvB,UAAUT,EAAAQ,EAAe,IAAIC,EAAG,IAAI,IAA1B,KAAAT,EAA+B,GACzC,QAASS,EAAG,QACZ,SAAUA,EAAG,QACf,EAEFL,EAAmBC,EAAG,IAAI,EAAI,CAC5B,UAAUJ,EAAAK,GAAA,YAAAA,EAAI,WAAJ,KAAAL,EAAgB,GAC1B,OAAQM,EACR,gBAAiBA,IAAkB,SACnC,cAAeA,IAAkB,WAAa,CAAC,EAAIG,CACrD,CACF,CAKA,MAAO,CAAE,mBAHkBX,EAAe,KACvCM,GAAI,CA5JT,IAAAL,EA4Ja,SAAAA,EAAAI,EAAmBC,EAAG,IAAI,IAA1B,YAAAL,EAA6B,SAAU,cAAgB,SAClE,EAC6B,mBAAAI,CAAmB,CAClD,ECjJA,IAAMO,GAAuB,WACvBC,GAAsB,kBAYtBC,GAAoB,yCAEpBC,GAAwBC,GAA0BA,EAAM,KAAK,EAAE,QAAQ,OAAQ,EAAE,EAE1EC,GAAmB,CAC9BC,EACAC,IACsB,CACtB,IAAMC,EAAUL,GAAqBG,GAAA,KAAAA,EAAW,EAAE,EAClD,GAAI,CAACJ,GAAkB,KAAKM,CAAO,GAAKA,EAAQ,SAASR,EAAoB,EAC3E,MAAO,CAAE,KAAM,SAAU,QAAAM,EAAS,cAAAC,CAAc,EAGlD,IAAME,EAAOD,EAAQ,SAASP,EAAmB,EAC7CO,EAAQ,MAAM,EAAG,CAACP,GAAoB,MAAM,EAC5CO,EACJ,MAAO,CACL,KAAM,OACN,QAAS,GAAGC,CAAI,GAAGT,EAAoB,GACvC,cAAe,GAAGS,CAAI,GAAGR,EAAmB,EAC9C,CACF,EAEMS,GAAuB,CAC3B,eACE,2IACF,qBACE,uJACF,cACE,wJACF,cACE,wIACF,kBACE,iIACJ,EAIMC,GAAiB,IAAI,IAErBC,GAAYC,GAAsC,CACtD,GAAI,CAAAF,GAAe,IAAIE,CAAO,EAC9B,CAAAF,GAAe,IAAIE,CAAO,EAC1B,GAAI,CACF,QAAQ,KAAKH,GAAqBG,CAAO,CAAC,CAC5C,MAAQ,CAER,EACF,EAGaC,GAAmCC,GAAwB,CAClEA,GAAA,MAAAA,EAAM,QAAQH,GAAS,mBAAmB,CAChD,EAMaI,GAAyB,CACpCV,EACAC,IACsB,CAEjBD,EACIH,GAAqBG,CAAO,EAAE,SAASN,EAAoB,GAClEY,GAAS,sBAAsB,EAFnBA,GAAS,gBAAgB,EAIvC,IAAMK,EAAWZ,GAAiBC,EAASC,CAAa,EACxD,OAAIA,GAAA,MAAAA,EAAe,QACjBK,GAASK,EAAS,OAAS,OAAS,gBAAkB,eAAe,EAEhEA,CACT,EC/FO,IAAMC,GAAoB,CAC/B,aACA,UACA,UACA,OACA,aACA,OACA,SACA,UACA,gBACA,kBACA,YACA,cACA,aACA,eACA,iBACA,cACA,gBACA,uBACA,yBACA,YACA,aACA,cACA,mBACA,oBACF,EAEaC,GAA4B,CAAC,WAAY,QAAS,UAAU,EAG5DC,GAAwB,CAAC,WAAY,QAAQ,EAOnD,IAAMC,GAAwB,CAAC,QAAS,OAAO,EAGzCC,GAA2B,CACtC,SACA,eACA,cACA,YACF,EAGaC,GAAmB,CAAC,MAAO,MAAM,EAGjCC,GAAuB,CAAC,UAAW,QAAQ,EAE3CC,GAAqB,CAAC,KAAM,KAAM,IAAI,EAI5C,IAAMC,GAA2B,SAG3BC,GAA4B,CACvC,GAAI,IACJ,GAAI,EACJ,GAAI,GACN,EAGaC,GAAmB,IACnBC,GAAmB,IAGnBC,GAAuB,GACvBC,GAAuB,GAOvBC,GAA+B,IAC/BC,GAA+B,CAC1C,UACA,UACA,cACA,cACA,WACF,EAGaC,GAAoB,SAGpBC,GAAyB,WAQzBC,GACX,sDAGWC,GAAsD,CACjE,IAAK,IACL,IAAK,IACL,IAAK,GACP,EACaC,GACX,OAAO,OAAOD,EAAiB,EAGpBE,GAAoC,CAAC,IAAK,GAAG,EAC7CC,GAAsC,CAAC;AAAA,EAAM,KAAM,IAAI,EAGvDC,GAA4B,SAC5BC,GAAiB,QACjBC,GAAY,GACZC,GAAgB,MAChBC,GAAgB,MAGhBC,GAAsB,8CAGtBC,GAA2B,UAO3BC,GAAoB,CAC/B,OAAQ,mBACR,WAAY,wBACZ,KAAM,wBACN,cAAe,mBACf,QAAS,oBACX,EAIaC,GAAgB,OAAOD,GAAkB,MAAM,aAC/CE,GAAqB,OAAOF,GAAkB,UAAU,aACxDG,GAAwB,OAAOH,GAAkB,aAAa,KAAKD,EAAwB,IAG3FK,GAAqB,wBClJ3B,IAAMC,GACXC,GAEA,OAAO,YACL,CACE,CAACC,GAAkB,cAAeD,EAAO,gBAAgB,EACzD,CAACC,GAAkB,QAASD,EAAO,kBAAkB,CACvD,EAAE,OAAQE,GAAqCA,EAAM,CAAC,IAAM,MAAS,CACvE,EAGWC,GACXH,GAEAA,EAAO,mBAAqB,CAAE,CAACI,EAAkB,EAAG,EAAG,EAAI,CAAC,ECN9D,IAAMC,GAAoBC,GACxBA,EAAM,QACJC,GACA,CAACC,EAAQC,EAAyBC,IAAoB,CACpD,GAAID,IAAQ,OACV,OAAOC,EAET,IAAMC,EAAY,OAAO,SAASF,EAAKG,EAAS,EAChD,OACED,IAAc,GACdA,EAAYE,IACXF,GAAaG,IAAiBH,GAAaI,GAErCC,GAEF,OAAO,cAAcL,CAAS,CACvC,CACF,EAUIM,GAAqBC,GAAyB,CAClD,IAAMC,EAAiB,CAAC,EACpBC,EACAC,EAAY,GAChB,QAASC,EAAQ,EAAGA,EAAQJ,EAAI,OAAQI,GAAS,EAAG,CAClD,IAAMC,EAAOL,EAAII,CAAK,EACtB,GAAID,EACEE,IAAS,KAAOL,EAAII,EAAQ,CAAC,IAAM,MACrCD,EAAY,GACZC,GAAS,WAEFC,IAAS,KAClBD,GAAS,UACAF,GACT,GAAIG,IAASH,EACXA,EAAQ,eACCI,GAAa,SAASD,CAAI,EACnC,MAAO,WAEAA,IAAS,KAAOL,EAAII,EAAQ,CAAC,IAAM,IAC5CD,EAAY,GACZC,GAAS,UACAG,GAAW,SAASF,CAAI,EACjCH,EAAQG,UACCA,KAAQG,GACjBP,EAAK,KAAKO,GAAkBH,CAAI,CAAC,UACxBI,GAAqB,SAASJ,CAAI,GAAKJ,EAAK,IAAI,IAAMI,EAC/D,MAAO,EAEX,CACA,OAAOJ,EAAK,SAAW,GAAK,CAACC,GAAS,CAACC,CACzC,EAOaO,GAAmBV,GAAyB,CACvD,GAAIA,EAAI,OAASW,IAAgC,CAACZ,GAAkBC,CAAG,EACrE,MAAO,GAET,IAAMY,EAAUZ,EAAI,YAAY,EAC1Ba,EAAU1B,GAAiBa,CAAG,EAAE,YAAY,EAClD,OAAOc,GAA6B,MACjCC,GAAU,CAACH,EAAQ,SAASG,CAAK,GAAK,CAACF,EAAQ,SAASE,CAAK,CAChE,CACF,ECxFO,IAAMC,GAAsC,UAMtCC,GAAuB,0BAOvBC,GAAwB,sBAE/BC,GAAmC,CACvC,MAAO,GACP,oBAAqB,GACrB,cAAe,GACf,aAAc,GACd,WAAY,GACZ,cAAe,EACjB,EAEaC,GAAuE,CAClF,QAAS,CAAE,OAAQD,EAAe,EAElC,QAAS,CAAE,OAAQA,EAAe,EAClC,KAAM,CAAE,OAAQA,EAAe,EAC/B,MAAO,CACL,OAAQ,CACN,MAAO,GACP,oBAAqB,GAErB,cAAe,GACf,aAAc,GACd,WAAY,GACZ,cAAe,EACjB,CACF,CACF,EAEaE,GAAgBC,GAC3B,OAAOA,GAAU,UACjB,OAAO,UAAU,eAAe,KAAKF,GAAaE,CAAK,EAM5CC,GAAqBD,GAChCD,GAAaC,CAAK,EAAIA,EAAQN,GAEnBQ,GAAuBC,GAClCL,GAAYK,CAAU,EAAE,OC9CnB,IAAMC,GACXC,GACyB,CAZ3B,IAAAC,EAAAC,EAAAC,EAaE,IAAMC,EAAWC,GAAoBL,EAAW,KAAK,EACrD,MAAO,CACL,YAAaA,EAAW,aACpBA,EAAW,eAAiB,QAC5BI,EAAS,MACb,iBAAiBH,EAAAD,EAAW,kBAAX,KAAAC,EAA8BK,GAC/C,YAAaN,EAAW,WAAa,OACrC,qBACEE,EAAAF,EAAW,sBAAX,KAAAE,EAAkCE,EAAS,oBAC7C,aAAcJ,EAAW,YACrBA,EAAW,cAAgB,SAC3BI,EAAS,aACb,cAAeJ,EAAW,aACtBA,EAAW,eAAiB,SAC5BI,EAAS,cACb,QAAQD,EAAAH,EAAW,SAAX,KAAAG,EAAqB,EAC/B,CACF,ECLA,IAAMI,GAAYC,GAChB,OAAOA,GAAU,UAAYA,IAAU,MAAQ,CAAC,MAAM,QAAQA,CAAK,EAE/DC,GAAcC,GAAyC,CAC3D,GAAI,CAACH,GAASG,CAAG,EACf,MAAO,CAAC,EAEV,IAAMC,EAAiC,CAAC,EACxC,QAAWC,KAAOC,GAAmB,CACnC,IAAML,EAAQE,EAAIE,CAAG,EACjB,OAAOJ,GAAU,UAAYM,GAAoB,KAAKN,CAAK,IAC7DG,EAAOC,CAAG,EAAIJ,EAElB,CACA,OAAOG,CACT,EAGMI,GAAS,CAACL,EAAcM,EAAaC,IAAoC,CAC7E,GAAI,SAAOP,GAAQ,UAAY,CAAC,OAAO,SAASA,CAAG,GAGnD,MAAO,GAAG,KAAK,IAAIO,EAAK,KAAK,IAAID,EAAK,KAAK,MAAMN,CAAG,CAAC,CAAC,CAAC,IACzD,EAGMQ,GAAa,CACjBC,EACAT,IACkBS,EAAQ,KAAMC,GAAWA,IAAWV,CAAG,EAErDW,GAAeX,GACnB,OAAOA,GAAQ,UAAYA,EAAM,OAE7BY,GAAiBZ,GACrB,OAAOA,GAAQ,UAAYA,EAAI,KAAK,GAAKa,GAAgBb,CAAG,EACxDA,EACA,OAQOc,GACXd,GAC6B,CAC7B,IAAMe,EAAalB,GAASG,CAAG,EAAIA,EAAM,CAAC,EAC1C,MAAO,CACL,MAAOgB,GAAkBD,EAAW,KAAK,EACzC,OAAQhB,GAAWgB,EAAW,MAAM,EACpC,OAAQV,GACNU,EAAW,cACX,EACA,EACF,EACA,iBAAkBP,GAChBS,GACAF,EAAW,iBACb,EACA,aAAcP,GAAWU,GAAuBH,EAAW,aAAa,EACxE,oBAAqBA,EAAW,wBAA0B,GAC1D,aAAcP,GAAWW,GAAuBJ,EAAW,aAAa,EACxE,gBAAiBP,GACfY,GACAL,EAAW,gBACb,EACA,SAAUP,GAAWa,GAAkBN,EAAW,QAAQ,EAC1D,oBAAqBJ,GAAYI,EAAW,oBAAoB,EAChE,YAAaP,GAAWc,GAAsBP,EAAW,YAAY,EACrE,SAAUA,EAAW,YAAc,GACnC,WAAYhB,GAAWgB,EAAW,WAAW,EAC7C,SAAUV,GAAOU,EAAW,UAAWQ,GAAkBC,EAAgB,EACzE,SAAUnB,GACRU,EAAW,UACXU,GACAC,EACF,EACA,UAAWlB,GAAWmB,GAAoBZ,EAAW,UAAU,EAC/D,OAAQJ,GAAYI,EAAW,MAAM,EACrC,UAAWH,GAAcG,EAAW,UAAU,CAChD,CACF,EAQaa,GAAkB,CAC7Bb,EACAc,IAEAd,EAAW,UACXc,GACA,OAAO,KAAKd,EAAW,UAAU,EAAE,OAAS,EACxC,CAAE,GAAGA,EAAY,OAAQA,EAAW,UAAW,EAC/CA,EC1HN,IAAMe,GAAS,8CACTC,GAAM,OAAO,2BAEbC,GAAS,IAAI,OACjB,OAAO,iBAAiBD,EAAG,aAAaA,EAAG,aAAaA,EAAG,iBAAiBA,EAAG,eAC/E,GACF,EACME,GAAW,IACXC,GAAc,IAEdC,GAAaC,GAAc,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAC,CAAC,CAAC,EACnEC,GAAaD,GAAc,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGA,CAAC,CAAC,EAG9CE,GAAcC,GAAkD,CAC3E,GAAI,CAACA,EACH,OAAO,KAET,IAAMC,EAAQD,EAAM,KAAK,EACnBE,EAAMX,GAAO,KAAKU,CAAK,EAC7B,GAAIC,EAAK,CACP,IAAIC,EAASD,EAAI,CAAC,EACdC,EAAO,QAAU,IACnBA,EAAS,CAAC,GAAGA,CAAM,EAAE,IAAKC,GAAMA,EAAIA,CAAC,EAAE,KAAK,EAAE,GAEhD,IAAMP,EAAKQ,GAAc,SAASF,EAAO,MAAME,EAAGA,EAAI,CAAC,EAAG,EAAE,EAC5D,MAAO,CACL,EAAGR,EAAE,CAAC,EACN,EAAGA,EAAE,CAAC,EACN,EAAGA,EAAE,CAAC,EACN,EAAGM,EAAO,SAAW,EAAIN,EAAE,CAAC,EAAI,IAAM,CACxC,CACF,CACA,IAAMS,EAAMb,GAAO,KAAKQ,CAAK,EAC7B,GAAIK,EAAK,CACP,IAAMC,EAAU,CAACN,EAAeO,IAC9BA,EAAQ,OAAOP,CAAK,EAAIP,GAAYC,GAAc,OAAOM,CAAK,EAC1D,EAAIM,EAAQD,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAC1BG,EAAIF,EAAQD,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAC1BI,EAAIH,EAAQD,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAC1BK,EAAQL,EAAI,CAAC,EACbM,EAAID,IAAU,OAAY,EAAI,OAAOA,CAAK,GAAKL,EAAI,CAAC,EAAI,IAAM,GACpE,MAAO,CACL,EAAGV,GAAU,CAAC,EACd,EAAGA,GAAUa,CAAC,EACd,EAAGb,GAAUc,CAAC,EACd,EAAGZ,GAAUc,CAAC,CAChB,CACF,CACA,OAAO,IACT,EAIMC,GAAe,IAAI,IAErB,y9CAsBA,MAAM,GAAG,CACb,EAKMC,GAAM,OAAO,oBACbC,GAAoB,IAAI,OAC5B,OAAO,iEAAiED,EAAG,MAAMA,EAAG,WACpF,GACF,EACME,GAAS,YAETC,GAAsBhB,GAC1BY,GAAa,IAAIZ,EAAM,YAAY,CAAC,GACnCc,GAAkB,KAAKd,CAAK,GAAK,CAACe,GAAO,KAAKf,CAAK,EAQzCiB,GAAiB,CAC5BC,EACAC,IACW,CACX,IAAMnB,EAAQkB,GAAA,YAAAA,EAAO,OACrB,OAAKlB,IAGEF,GAAWE,CAAK,GAAKgB,GAAmBhB,CAAK,GAAIA,EAF/CmB,CAGX,EAEMC,GAAS,CAAC,CAAE,EAAAC,EAAG,EAAAb,EAAG,EAAAC,EAAG,EAAAE,CAAE,IAC3B,QAAQhB,GAAU0B,CAAC,CAAC,KAAK1B,GAAUa,CAAC,CAAC,KAAKb,GAAUc,CAAC,CAAC,KAAK,OAAOZ,GAAUc,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAEtFW,GAAW,GAAc,GAAG,QAAQzB,GAAU,CAAC,EAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAO5D0B,EAAY,CAACL,EAAeR,IAA0B,CACjE,IAAMc,EAAS1B,GAAWoB,CAAK,EAC/B,OAAIM,EACKJ,GAAO,CAAE,GAAGI,EAAQ,EAAGA,EAAO,EAAId,CAAM,CAAC,EAE3C,sBAAsBQ,CAAK,IAAII,GAAQZ,CAAK,CAAC,gBACtD,EAGae,GAAM,CAACd,EAAWF,EAAWiB,IAAsB,CAC9D,IAAMC,EAAK7B,GAAWa,CAAC,EACjBiB,EAAK9B,GAAWW,CAAC,EACvB,GAAIkB,GAAMC,EAAI,CACZ,IAAMC,EAAIhC,GAAU6B,CAAC,EACrB,OAAON,GAAO,CACZ,EAAGO,EAAG,GAAKC,EAAG,EAAID,EAAG,GAAKE,EAC1B,EAAGF,EAAG,GAAKC,EAAG,EAAID,EAAG,GAAKE,EAC1B,EAAGF,EAAG,GAAKC,EAAG,EAAID,EAAG,GAAKE,EAC1B,EAAG,CACL,CAAC,CACH,CACA,MAAO,sBAAsBlB,CAAC,IAAIW,GAAQ,EAAII,CAAC,CAAC,KAAKjB,CAAC,GACxD,EAMaqB,GAAa,CAACZ,EAAea,IAAyB,CACjE,IAAMC,EAAKlC,GAAWoB,CAAK,EACrBU,EAAK9B,GAAWiC,CAAI,EAC1B,MAAI,CAACC,GAAM,CAACJ,EACHV,EAEFO,GAAIM,EAAMX,GAAO,CAAE,GAAGY,EAAI,EAAG,CAAE,CAAC,EAAGA,EAAG,CAAC,CAChD,EC3JA,IAAMC,GAAa,UAENC,GAAqB,UAErBC,GAAe,CAC1B,MAAO,OACP,MAAO,OACP,QAAS,OACT,IAAK,OACL,KAAM,OACR,EAEaC,GAAa,4BAMbC,GAAe,CAAC,CAC3B,OAAAC,EACA,KAAAC,EAAOL,EACT,IAAuC,CACrC,IAAMM,EAAQC,GAAIH,EAAQL,GAAY,EAAG,EACzC,MAAO,CACL,OAAAK,EACA,MAAOI,EAAUH,EAAM,GAAI,EAC3B,WAAYG,EAAUH,EAAM,GAAI,EAChC,UAAWG,EAAUH,EAAM,EAAG,EAC9B,MAAOG,EAAUH,EAAM,EAAG,EAC1B,UAAWG,EAAUH,EAAM,GAAI,EAC/B,MAAOG,EAAUH,EAAM,GAAI,EAC3B,QAASG,EAAUH,EAAM,GAAI,EAC7B,OAAQ,8BAA8BG,EAAUH,EAAM,GAAI,CAAC,QAAQG,EAAUH,EAAM,EAAG,CAAC,QACvF,YAAaG,EAAUJ,EAAQ,GAAI,EACnC,WAAYI,EAAUJ,EAAQ,GAAI,EAClC,iBAAkBI,EAAUJ,EAAQ,GAAI,EACxC,SAAUI,EAAUF,EAAO,GAAI,EAC/B,QAASE,EAAUF,EAAO,GAAI,EAC9B,IAAKE,EAAUF,EAAO,EAAG,EACzB,OAAQ,sBAAsBE,EAAUF,EAAO,GAAI,CAAC,GACpD,YAAa,qBAAqBE,EAAUF,EAAO,GAAI,CAAC,GACxD,cAAe,qBAAqBE,EAAUJ,EAAQ,EAAG,CAAC,EAC5D,CACF,EC9CO,IAAMK,EAAS,CAEpB,UAAW,iCACX,QAAS,iCACT,QAAS,IACT,MAAO,IACP,WAAY,IAEZ,OAAQ,IAKR,kBAAmB,GACrB,EAGaC,GAAgB,GAAGD,EAAO,UAAU,MAAMA,EAAO,SAAS,GAE1DE,GAAuB,IAAY,CApBhD,IAAAC,EAAAC,EAqBE,cAAO,QAAW,eAClBA,GAAAD,EAAA,OAAO,aAAP,YAAAA,EAAA,YAAoB,sCAApB,YAAAC,EAAyD,WAAY,ICIvE,IAAMC,GAAgBC,GAAkC,CA1BxD,IAAAC,EAAAC,EA2BE,aAAM,MAAKA,GAAAD,EAAAD,EAAM,QAAN,YAAAC,EAAa,WAAb,KAAAC,EAAyB,CAAC,CAAC,EAAE,KACrCC,GAAS,CAACA,EAAK,QAAQ,WAAWC,EAAiB,CACtD,GASWC,GAAuB,CAAC,CACnC,KAAAC,EACA,eAAAC,EACA,QAAAC,EACA,gBAAAC,EACA,IAAAC,CACF,IAAsC,CACpC,GAAI,OAAO,UAAa,aAAe,CAACA,EAAI,KAAK,GAAK,CAACC,GAAgBD,CAAG,EACxE,MAAO,IAAG,GAEZ,IAAME,EAAKJ,EAAQ,QAAQK,GAAwB,MAAM,EACnDb,EAAQ,SAAS,cAAc,OAAO,EAI5C,OAHAA,EAAM,aAAaS,EAAiBD,CAAO,EAC3CR,EAAM,YAAc,GAAGI,EAAiB,MAAMG,CAAc,KAAKK,CAAE;AAAA,EAAUF,CAAG;AAAA,IAC/EJ,aAAgB,SAAWA,EAAK,KAAOA,GAAM,YAAYN,CAAK,EAC3DD,GAAaC,CAAK,GACpBA,EAAM,OAAO,EACN,IAAG,IAEL,IAAMA,EAAM,OAAO,CAC5B,EClDA,IAAMc,GAAW,kCAEXC,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAQIC,EAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAiBlBA,EAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAiBlBA,EAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAYlBC,EAAa;AAAA,sBACjBA,EAAa;AAAA;AAAA;AAAA;AAAA,0BAITA,EAAa;AAAA,sBACjBA,EAAa;AAAA;AAAA;AAAA;AAAA,0BAITA,EAAa;AAAA,sBACjBA,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAgCTA,EAAa;AAAA,sBACjBA,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAiBRA,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKbA,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAYdC,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAQrBA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAOrBA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAOxCC,EAAkB;AAAA,mBACNC,GAAkB,OAAO;AAAA;AAAA;AAAA;AAAA,2BAIjBF,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgCnCG,GACXC,GACS,CAQT,GAPI,OAAO,UAAa,cAItBA,aAAgB,SACZA,EAAK,eAAeR,EAAQ,EAC5BQ,EAAK,cAAc,IAAIR,EAAQ,EAAE,GACzB,OAEd,IAAMS,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,GAAKT,GACXS,EAAM,YAAcR,GAEhBO,aAAgB,SAClBA,EAAK,KAAK,YAAYC,CAAK,EAE3BD,EAAK,YAAYC,CAAK,CAE1B,EC9NO,IAAMC,EAAS,CACpB,QAAS,CACP,SAAU,QACV,IAAK,EACL,KAAM,EACN,MAAO,OACP,OAAQ,OACR,gBAAiB,qBACjB,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,OAAQ,IACR,UAAW,mDACX,cAAe,MACf,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,MAAO,CACL,SAAU,QACV,IAAK,MACL,KAAM,MACN,UAAW,wBACX,MAAO,QACP,aAAc,MACd,gBAAiB,UACjB,UAAW,4BACX,OAAQ,OACR,QAAS,OACT,cAAe,SACf,UAAW,OACX,OAAQ,IACR,OAAQ,EACR,QAAS,EACT,UAAW,aACX,UAAW,OACX,WAAY,SACd,EAEA,QAAS,CACP,OAAQ,OACR,QAAS,OACT,cAAe,SACf,SAAU,EACV,SAAU,SACV,UAAW,EACX,UAAW,aACX,UAAW,MACb,EAEA,WAAY,CACV,QAAS,OACT,eAAgB,gBAChB,WAAY,aACZ,IAAK,OACL,cAAe,OACf,aAAc,OACd,gBAAiB,UACjB,OAAQ,EACR,UAAW,aACX,UAAW,MACb,EAEA,QAAS,CACP,QAAS,OACT,WAAY,SACZ,IAAK,OACL,KAAM,QACN,SAAU,EACV,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAQA,YAAa,CACX,QAAS,OACT,cAAe,SACf,WAAY,UACZ,IAAK,OACL,cAAe,OACf,aAAc,OACd,gBAAiB,UACjB,OAAQ,EACR,UAAW,aACX,UAAW,MACb,EAEA,QAAS,CACP,QAAS,OACT,WAAY,SACZ,MAAO,OACP,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,UAAW,CACT,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,IAAK,OACL,MAAO,OACP,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,KAAM,CACJ,OAAQ,OACR,MAAO,OACP,SAAU,QACV,UAAW,UACX,WAAY,EACZ,OAAQ,EACR,QAAS,EACT,QAAS,OACX,EAEA,MAAO,CACL,SAAU,OACV,WAAY,IACZ,WAAY,OACZ,cAAe,QACf,cAAe,SACf,MAAO,UACP,KAAM,WACN,SAAU,EACV,UAAW,SACX,aAAc,WACd,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,SAAU,CACR,aAAc,MACd,QAAS,UACT,OAAQ,oBACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,EACZ,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,cAAe,SACf,MAAO,UACP,IAAK,MACL,OAAQ,EACR,UAAW,aACX,UAAW,OACX,OAAQ,UACR,gBAAiB,SACnB,EAEA,cAAe,CACb,OAAQ,MACR,QAAS,OACT,cAAe,SACf,IAAK,OACL,SAAU,EACV,UAAW,OACX,UAAW,EACX,aAAc,OACd,UAAW,aACX,UAAW,MACb,EAEA,YAAa,CACX,SAAU,OACV,WAAY,IACZ,WAAY,OACZ,MAAO,UACP,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,KAAM,CACJ,MAAO,UACP,eAAgB,OAChB,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,SAAU,CACR,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,MAAO,UACP,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,iBAAkB,CAChB,QAAS,OACT,cAAe,SACf,IAAK,OACL,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,WAAY,CACV,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,WAAY,CACV,QAAS,OACT,IAAK,OACL,WAAY,SACZ,OAAQ,UAIR,SAAU,EACV,SAAU,EACV,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,oBAAqB,CACnB,QAAS,OACT,cAAe,SAGf,SAAU,EACV,SAAU,EACV,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,YAAa,CACX,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,MAAO,UACP,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,kBAAmB,CACjB,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,MAAO,UACP,cAAe,SACf,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,cAAe,CACb,OAAQ,OACR,MAAO,OACP,QAAS,MACT,aAAc,MACd,OAAQ,oBACR,OAAQ,EACR,UAAW,aACX,WAAY,OACZ,iBAAkB,OAClB,cAAe,OACf,OAAQ,UACR,SAAU,WACV,gBAAiB,aACnB,EAEA,sBAAuB,CACrB,QAAS,OACT,cAAe,SACf,OAAQ,EACR,QAAS,EACT,UAAW,aACX,YAAa,MACf,EAEA,gBAAiB,CACf,QAAS,OACT,WAAY,SACZ,IAAK,OACL,eAAgB,gBAChB,OAAQ,EACR,QAAS,EACT,UAAW,aACX,UAAW,MACb,EAKA,2BAA4B,CAC1B,IAAK,KACP,EAEA,qBAAsB,CACpB,UAAW,OACX,QAAS,OACX,EAEA,gBAAiB,CACf,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,MAAO,UACP,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,cAAe,CACb,OAAQ,OACR,MAAO,OACP,QAAS,MACT,aAAc,MACd,OAAQ,oBACR,OAAQ,EACR,UAAW,aACX,WAAY,OACZ,iBAAkB,OAClB,cAAe,OACf,OAAQ,UACR,SAAU,WACV,gBAAiB,aACnB,EAEA,cAAe,CACb,QAAS,OACT,eAAgB,gBAChB,IAAK,OACL,WAAY,OACZ,UAAW,OACX,gBAAiB,UACjB,OAAQ,EACR,UAAW,YACb,EAOA,gBAAiB,CACf,QAAS,OACT,cAAe,MACf,WAAY,SACZ,IAAK,OACL,WAAY,OACZ,UAAW,OACX,gBAAiB,UACjB,OAAQ,EACR,UAAW,YACb,EAEA,kBAAmB,CACjB,QAAS,OACT,cAAe,SACf,IAAK,OACL,WAAY,OACZ,UAAW,OACX,gBAAiB,UACjB,OAAQ,EACR,UAAW,YACb,EAEA,OAAQ,CACN,MAAO,OACP,aAAc,MACd,QAAS,WACT,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,OAAQ,UACR,OAAQ,EACR,UAAW,aACX,UAAW,QACb,EAEA,cAAe,CACb,cAAe,OACf,QAAS,GACX,EAEA,aAAc,CACZ,OAAQ,YACR,QAAS,OACT,OAAQ,oBACR,aAAc,MACd,WAAY,SACd,EAEA,aAAc,CACZ,OAAQ,EACR,SAAU,OACV,WAAY,IACZ,MAAO,SACT,EAEA,mBAAoB,CAClB,OAAQ,aACR,SAAU,OACV,WAAY,IACZ,MAAO,SACT,EAEA,cAAe,CACb,QAAS,OACT,IAAK,MACL,eAAgB,eAClB,EAEA,aAAc,CACZ,MAAO,OACP,SAAU,EACV,UAAW,aACX,QAAS,SACT,SAAU,OACV,WAAY,IACZ,UAAW,SACX,OAAQ,oBACR,aAAc,MACd,WAAY,SACd,EAEA,aAAc,CACZ,OAAQ,UACR,SAAU,OACV,MAAO,SACT,EAEA,cAAe,CACb,MAAO,OACP,UAAW,MACb,EAEA,aAAc,CACZ,gBAAiB,UACjB,OAAQ,OACR,MAAO,SACT,EAMA,sBAAuB,CACrB,gBAAiB,UACjB,OAAQ,oBACR,MAAO,SACT,EAUA,UAAW,CACT,MAAO,OACP,QAAS,WACT,WAAY,SACZ,UAAW,YACb,EAGA,YAAa,CACX,MAAO,OACP,QAAS,WACT,WAAY,SACZ,UAAW,YACb,EAMA,cAAe,CACb,YAAa,MACf,EAEA,aAAc,CACZ,OAAQ,oBACR,gBAAiB,UACjB,MAAO,SACT,EAEA,0BAA2B,CACzB,SAAU,WAGV,WAAY,EACZ,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,iBAAkB,CAChB,SAAU,WACV,IAAK,OACL,MAAO,EACP,gBAAiB,UACjB,OAAQ,oBACR,aAAc,MACd,UAAW,mCACX,OAAQ,GACR,MAAO,cACP,UAAW,QACX,UAAW,OACX,UAAW,MACX,QAAS,EACT,UAAW,aACX,UAAW,MACb,EAEA,aAAc,CACZ,QAAS,WACT,OAAQ,UACR,SAAU,OACV,MAAO,UACP,gBAAiB,UACjB,aAAc,oBACd,OAAQ,EACR,UAAW,aACX,UAAW,MACb,EAEA,qBAAsB,CACpB,gBAAiB,UACjB,WAAY,GACd,EAEA,iBAAkB,CAChB,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,QAAS,OACT,UAAW,QACX,OAAQ,EACR,UAAW,YACb,EAEA,eAAgB,CACd,MAAO,OACP,OAAQ,OACR,OAAQ,oBACR,UAAW,oBACX,aAAc,MACd,UAAW,0BACX,aAAc,OACd,UAAW,YACb,EAEA,cAAe,CACb,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,OAAQ,UACR,QAAS,EACT,UAAW,YACb,EAEA,YAAa,CACX,YAAa,OACb,OAAQ,WACR,UAAW,YACb,EAEA,aAAc,CACZ,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,cAAe,CACb,WAAY,OACZ,OAAQ,OACR,QAAS,EACT,OAAQ,EACR,OAAQ,UACR,QAAS,OACT,WAAY,QACd,EAEA,YAAa,CACX,SAAU,OACV,WAAY,OACZ,MAAO,UACP,OAAQ,EACR,WAAY,OACZ,UAAW,YACb,CACF,EC9lBO,SAASC,GACdC,EAAgBC,GACH,CACb,OAAOC,EACL,OACA,CAAE,MAAOC,GAAuB,aAAcH,CAAM,EACpDI,EACF,CACF,CCrBO,IAAMC,EAAoB,CAC/BC,EACAC,IACID,EAAc,GAAGA,CAAW,IAAIC,CAAW,GAAKA,EAEzCC,GAAuB,CAClCC,EACAH,IACY,CACZ,IAAMI,EAAQD,EAAQ,cACtB,MAAI,CAACC,GAASA,EAAM,SAAW,EAAU,GAClCA,EAAM,SAASJ,CAAW,CACnC,EAEaK,GAAkBC,GAC7B,GAAQA,GAAYA,EAAS,OAAS,GAE3BC,GAAsB,CACjCJ,EACAH,IACS,CAtBX,IAAAQ,EAsBc,UAAQA,EAAAL,EAAQ,gBAAR,MAAAK,EAAuB,SAASR,KAEzCS,GAAwBC,GACnCA,EAAS,KAAMP,GAAS,CAzB1B,IAAAK,EAAAG,EAyB8B,QAAAA,GAAAH,EAAAL,EAAQ,gBAAR,YAAAK,EAAuB,SAAvB,KAAAG,EAAiC,GAAK,EAAC,EAExDC,GACXN,GAEA,GACEA,GACAA,EAAS,OAAS,GAClBA,EAAS,MAAOO,GAAYA,EAAQ,YAAc,MAAS,GAGlDC,GACXR,GAEA,IAAI,KACDA,GAAA,KAAAA,EAAY,CAAC,GACX,OAAQO,GAAYA,EAAQ,YAAc,EAAI,EAC9C,IAAKA,GAAYA,EAAQ,IAAI,CAClC,EAEWE,GAAiB,CAC5BC,EACAV,IACoB,CAhDtB,IAAAE,EAiDE,OAAAA,EAAAQ,EAAI,cAAJ,KAAAR,GAAoBF,GAAA,YAAAA,EAAU,UAAW,EAAIA,EAAS,CAAC,EAAE,KAAO,QAe3D,IAAMW,GACXC,GACQ,CACR,IAAMC,EAAYD,EAAS,OAAQE,GAAYA,EAAQ,YAAc,EAAI,EACzE,OAAID,EAAU,SAAW,GAAKA,EAAU,SAAWD,EAAS,OACnDA,EAEF,CACL,GAAGC,EACH,GAAGD,EAAS,OAAQE,GAAYA,EAAQ,YAAc,EAAI,CAC5D,CACF,EAOMC,GAAe,CACnBC,EACAC,IACQ,CACR,GAAI,CAACA,GAASA,EAAM,SAAW,EAAG,OAAOD,EAEzC,IAAME,EAAS,IAAI,IAAIF,EAAS,IAAKG,GAAM,CAACA,EAAE,KAAMA,CAAC,CAAC,CAAC,EACjDC,EAAe,CAAC,EACtB,QAAWC,KAAQJ,EAAO,CACxB,IAAMK,EAAQJ,EAAO,IAAIG,CAAI,EACzBC,GAAOF,EAAQ,KAAKE,CAAK,CAC/B,CACA,IAAMC,EAAOP,EAAS,OAAQG,GAAM,CAACF,EAAM,SAASE,EAAE,IAAI,CAAC,EAC3D,MAAO,CAAC,GAAGC,EAAS,GAAGG,CAAI,CAC7B,EAEaC,GAAyB,CAIpCZ,EACAI,EACAS,IAEI,CAACb,GAAYA,EAAS,SAAW,EAAU,CAAC,EAEzCD,GAAuBC,CAAQ,EACnC,IAAKE,GAAY,CAChB,IAAMY,EAAUV,EAAS,OAAQW,GAC/BC,GAAqBD,EAASb,EAAQ,IAAI,CAC5C,EAEA,MAAO,CAAE,QAAAA,EAAS,SAAUC,GAAaW,EAASD,GAAA,YAAAA,EAAQX,EAAQ,KAAK,CAAE,CAC3E,CAAC,EACA,OAAQe,GAAUA,EAAM,SAAS,OAAS,CAAC,EAGnCC,GAA0B,CAIrClB,EACAI,EACAS,IACsC,CACtC,GAAI,CAACM,GAAenB,CAAQ,EAAG,MAAO,CAAC,EAEvC,IAAMoB,EAA0C,CAAC,EACjD,QAAWH,KAASL,GAAuBZ,EAAUI,EAAUS,CAAK,EAClE,QAAWE,KAAWE,EAAM,SAC1BG,EAAK,KAAK,CAAE,QAASH,EAAM,QAAS,QAAAF,CAAQ,CAAC,EAGjD,OAAOK,CACT,EAEaC,GAAoB,CAC/BrB,EACAI,EACAS,IACgD,CAChD,GAAI,CAACM,GAAenB,CAAQ,EAAG,CAG7B,IAAMsB,EAAOtB,GAAA,YAAAA,EAAW,GACxB,OAAOG,GAAaC,EAAUkB,EAAOT,GAAA,YAAAA,EAAQS,EAAK,MAAQ,MAAS,EAAE,IAClEP,IAAa,CAAE,QAAAA,EAAS,YAAa,MAAU,EAClD,CACF,CAEA,OAAOG,GAAwBlB,EAAUI,EAAUS,CAAK,EAAE,IAAKU,IAAS,CACtE,QAASA,EAAI,QACb,YAAaA,EAAI,QAAQ,IAC3B,EAAE,CACJ,EAQaC,GAAwB,CAInCxB,EACAI,EACAS,IACQ,CACR,IAAMY,EAAO,IAAI,IACXjB,EAAe,CAAC,EACtB,OAAW,CAAE,QAAAO,CAAQ,IAAKM,GAAkBrB,EAAUI,EAAUS,CAAK,EAC9DY,EAAK,IAAIV,EAAQ,IAAI,IACxBU,EAAK,IAAIV,EAAQ,IAAI,EACrBP,EAAQ,KAAKO,CAAO,GAGxB,OAAOP,CACT,ECjLO,IAAMkB,GAA6D,CACxE,QAAS,CAAE,MAAO,MAAO,OAAQ,MAAO,MAAO,MAAO,QAAS,KAAM,EACrE,QAAS,CAAE,MAAO,MAAO,OAAQ,MAAO,MAAO,MAAO,QAAS,KAAM,EACrE,KAAM,CAAE,MAAO,OAAQ,OAAQ,QAAS,MAAO,OAAQ,QAAS,MAAO,EACvE,MAAO,CAAE,MAAO,OAAQ,OAAQ,QAAS,MAAO,OAAQ,QAAS,MAAO,CAC1E,EAGaC,GAAuB,UAEvBC,GAAwB,UACxBC,GAAqB,UAGrBC,GAAkC,wBAMlCC,GAA2B,gCAG3BC,GAAkB,OAGlBC,GAAyB,CACpC,MAAO,UACP,KAAM,UACN,QAAS,SACX,EAGaC,GAA8B,6BAE9BC,GAAkB,+BAClBC,GAAiB,8BACjBC,GAAkB,+BAGlBC,GAAiB,qBACjBC,GAAS,OAGTC,GAAmB,sBACnBC,GAAa,MAGbC,GAAsB,yBAGtBC,GAAuB,0BAGvBC,GAAoB,uBACpBC,GAAiB,SAGjBC,GAAe,CAC1B,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,MAAO,EAAG,EAC1C,OAAQ,CAAE,MAAO,GAAI,OAAQ,GAAI,MAAO,EAAG,CAC7C,EAEaC,GAAqB,EAGrBC,GAAe,sBAGfC,GAAsB,GAGtBC,GAAoB,+BAGpBC,GAAgB,OAGhBC,GAA2B,SAG3BC,GAAmB,MAGnBC,GAA2B,GAG3BC,GAAiB,oBA0BvB,IAAMC,EAAmB,CAC9B,KAAM,sBACN,MAAO,uBAMP,UAAW,4BACX,KAAM,sBACN,OAAQ,wBACR,IAAK,qBACL,KAAM,qBACR,EAGaC,GAAkB,oBAMlBC,EAAa,CACxB,OAAQ,yBACR,UAAW,6BACX,YAAa,+BACb,MAAO,wBACP,QAAS,0BACT,SAAU,2BACV,QAAS,yBACX,EC5IO,IAAMC,EAAQC,IAA8C,CACjE,CAACC,EAAc,EAAGD,CACpB,GCGO,IAAME,GAAiB,CAC5BC,EACAC,EACAC,IACG,GAAGC,EAAkBD,EAAaF,CAAW,CAAC,IAAIC,CAAW,GAQrDG,GAAwB,CACnCC,EAIAC,EACAC,IACmB,CACnB,GAAID,IAAS,WACX,OAAOC,EAGT,IAAMC,EAA4C,CAAC,EAC7CC,EAAgD,CAAC,EAEvD,OAAAJ,EAAK,QAAQ,CAAC,CAAE,QAAAK,EAAS,YAAAR,CAAY,IAAM,CACzCM,EAAiBL,EAAkBD,EAAaQ,EAAQ,IAAI,CAAC,EAAI,GAEjEA,EAAQ,cAAc,QAASC,GAAY,CACzCF,EACEV,GAAeW,EAAQ,KAAMC,EAAQ,KAAMT,CAAW,CACxD,EAAIS,EAAQ,OACd,CAAC,CACH,CAAC,EAEM,CAAE,iBAAAH,EAAkB,qBAAAC,CAAqB,CAClD,EAIaG,GAA6BD,GAG3BA,EAAQ,UAAYA,EAAQ,QAI9BE,GAA0BH,GACrCA,EAAQ,cAAc,KAAKE,EAAyB,EAUzCE,GAAsBJ,GAA4C,CAC7E,IAAMK,EAAYL,EAAQ,cAAc,OAAOE,EAAyB,EAClEI,EACJD,EAAU,OAAS,EACfA,EACAL,EAAQ,cAAc,OAAQC,GAAYA,EAAQ,OAAO,EAC/D,OAAO,IAAI,IAAIK,EAAQ,IAAKL,GAAYA,EAAQ,IAAI,CAAC,CACvD,ECnEA,IAAMM,GAAaC,GAAgBA,EAAI,MAAM,GAAG,EAAE,CAAC,EAAE,YAAY,EAE3DC,GAAaC,GAA+C,CAChE,GAAIC,GAAaD,CAAI,EACnB,OAAOC,GAAaD,CAAI,EAG1B,IAAME,EAAUL,GAAUG,CAAI,EACxBG,EAAM,OAAO,KAAKF,EAAY,EAAE,KACnCG,GAAcP,GAAUO,CAAS,IAAMF,CAC1C,EACA,OAAOC,EAAMF,GAAaE,CAAG,EAAI,MACnC,EAEaE,GAAoBC,GAA+C,CAC9E,IAAMN,EAAOO,GAAeD,CAAQ,EACpC,GAAI,CAACN,EACH,OAAOQ,EAET,IAAMC,EAASV,GAAUC,CAAI,EAC7B,OAAOS,EAAS,CAAE,GAAGD,EAAkB,GAAGC,CAAO,EAAID,CACvD,EAGaE,GAAmB,CAACC,EAAwBC,IACvDD,EAAK,YAAY,QAAQ,WAAYC,CAAM,EAGhCC,GAA0B,OAAO,KAAKZ,EAAY,EC/B/D,IAAMa,GAAQ,CACZ,MAAO,CACL,OAAQ,CAAE,SAAU,OAAQ,WAAY,KAAM,EAC9C,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,EACvC,OAAQ,CAAE,SAAU,OAAQ,QAAS,UAAW,WAAY,KAAM,EAClE,KAAM,OACN,IAAK,OACL,KAAM,CAAE,IAAK,GAAI,MAAO,EAAG,CAC7B,EACA,MAAO,CACL,OAAQ,CAAE,SAAU,OAAQ,WAAY,KAAM,EAC9C,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,EACvC,OAAQ,CAAE,SAAU,OAAQ,QAAS,UAAW,WAAY,KAAM,EAClE,KAAM,OACN,IAAK,MACL,KAAM,CAAE,IAAK,GAAI,MAAO,EAAG,CAC7B,CACF,EAEMC,GAAa,CACjB,QAAS,OACT,WAAY,SACZ,WAAY,GACd,EAEMC,GAAc,CAClB,QAAS,OACT,WAAY,SACZ,IAAK,MACL,OAAQ,UACR,WAAY,QACd,EAEMC,GAAoB,CACxB,QAAS,cACT,WAAY,SACZ,eAAgB,WAChB,WAAY,GACd,EAEMC,GAAqB,CACzB,QAAS,cACT,WAAY,SACZ,eAAgB,WAChB,MAAO,UACP,WAAY,QACd,EAEMC,GAAc,CAClB,OAAQ,oBACR,aAAc,MACd,WAAY,OACZ,UAAW,aACX,OAAQ,UACR,gBAAiB,UACjB,MAAO,UACP,WAAY,GACd,EAEMC,GAAoBC,IAAiB,CACzC,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GAAGA,CAAG,KACb,OAAQ,GAAGA,CAAG,KACd,aAAc,MACd,WAAY,IACZ,UAAW,aACX,gBAAiB,UACjB,WAAY,MACd,GAEMC,GAAa,CAACC,EAA2BF,EAAaG,IAC1DC,EACE,MACA,CAAE,KAAM,MAAO,aAAcF,EAAO,MAAOH,GAAiBC,CAAG,CAAE,EACjEK,EACE,MACA,CACE,MAAO,OAAOF,CAAK,EACnB,OAAQ,OAAOA,CAAK,EACpB,QAAS,YACT,KAAM,OACN,MAAO,6BACP,cAAe,MACjB,EACAE,EAAI,OAAQ,CACV,EAAG,uBACH,OAAQ,QACR,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,OACrB,CAAC,CACH,CACF,EAEIC,GAAgB,CAACC,EAA4BC,IACjDA,GAAA,KAAAA,EACCD,IAAS,QAAU,0BAA4B,yBAE3C,SAASE,GACdC,EACsB,CA/GxB,IAAAC,EAgHE,GAAM,CACJ,QAAAC,EACA,SAAAC,EACA,MAAAX,EACA,UAAAY,EACA,UAAAN,EACA,OAAAO,EAAS,GACT,YAAAC,EACA,eAAAC,EACA,KAAAV,EAAO,QACP,SAAAW,EACA,KAAAC,CACF,EAAIT,EACEU,EAAOC,GAAiBH,CAAQ,EAChCI,EAAU,CACd,CAAE,MAAOF,EAAK,IAAK,MAAO,EAAK,EAC/B,CAAE,MAAOA,EAAK,GAAI,MAAO,EAAM,CACjC,EACMG,EAAQ9B,GAAMc,CAAI,EACpBiB,EAAUd,EAAM,QAChBe,GAAgBd,EAAAD,EAAM,gBAAN,KAAAC,EAAuB,GAErCe,EAAUC,GAAkB,EAC5BF,GAAiBE,IAASH,IAASX,EAASc,CAAI,CACtD,EAEMC,EAAQC,GACZd,EAASc,EAAQ,CAACJ,GAAiBD,IAAYK,EAE3CC,EAAc,CAACC,EAAcF,IACjCZ,IAAmBY,EAAQ,GAAGE,CAAI,IAAIC,GAAiBZ,EAAMW,CAAI,CAAC,GAAKA,EAEzE,GAAIhB,GAAUH,IAAY,WACxB,MAAO,CACL,QAASX,GAAWe,EAAaO,EAAM,KAAK,IAAKA,EAAM,KAAK,KAAK,EACjE,WAAY,IAAM,CAAC,CACrB,EAGF,GAAIX,IAAY,QAAS,CACvB,IAAMqB,EAAc,IAAM,CACxBC,EAAO,QAASC,GAAU,CACxBA,EAAM,MAAM,QAAUP,EAAKO,EAAM,KAAK,CACxC,CAAC,CACH,EACMD,EAASZ,EAAQ,IAAKc,GAAQ,CA7JxC,IAAAzB,EA6J4C,OACtC,MAAOyB,EAAO,MACd,MAAOhC,EAAG,QAAS,CACjB,KAAM,QACN,KAAMU,EACN,QAASc,EAAKQ,EAAO,KAAK,EAC1B,SAAUrB,EACV,aAAce,EAAYM,EAAO,MAAOA,EAAO,KAAK,EACpD,MAAO,CACL,aAAazB,EAAAQ,GAAA,YAAAA,EAAM,SAAN,KAAAR,EAAgB0B,GAC7B,GAAGd,EAAM,KACX,EACA,SAAU,IAAM,CACdG,EAAOU,EAAO,KAAK,EACnBH,EAAY,CACd,CACF,CAAC,EACD,MAAOG,EAAO,KAChB,EAAE,EAmBF,MAAO,CACL,QAlBchC,EACd,MACA,CACE,KAAM,aACN,aAAcW,EAASC,EAAcd,EACrC,MAAO,CAAE,GAAGR,GAAY,IAAK6B,EAAM,GAAI,CACzC,EACA,GAAGW,EAAO,IAAKC,GACb/B,EACE,QACA,CAAE,MAAO,CAAE,GAAGT,GAAa,GAAG4B,EAAM,MAAO,CAAE,EAC7CY,EAAM,MACNA,EAAM,KACR,CACF,CACF,EAIE,WAAY,CAACR,EAAeW,EAAoB,KAAU,CACpDvB,IACJS,EAAUG,EACVF,EAAgBa,EAChBL,EAAY,EACd,CACF,CACF,CAEA,GAAIrB,IAAY,WAAY,CAC1B,GAAIG,EACF,MAAO,CACL,QAASX,EACP,OACA,CACE,KAAM,MACN,aAAcY,EACd,MAAO,CAAE,GAAGnB,GAAoB,GAAG0B,EAAM,OAAQ,MAAOA,EAAM,IAAK,CACrE,EACAD,EAAQ,CAAC,EAAE,KACb,EACA,WAAY,IAAM,CAAC,CACrB,EAGF,IAAMiB,EAAcnC,EAClB,SACA,CAAE,MAAO,GAAI,SAAU,EAAK,EAC5BgB,EAAK,KACP,EAEMoB,EAAWpC,EACf,SACA,CACE,aAAcF,EACd,MAAO,CAAE,GAAGJ,GAAa,GAAGyB,EAAM,OAAQ,GAAGJ,GAAA,YAAAA,EAAM,OAAQ,MAAO,MAAO,EACzE,SAAU,IAAM,CACdO,EAAOc,EAAS,QAAU,MAAM,EAChCC,EAAM,CACR,CACF,EACA,GAAGnB,EAAQ,IAAKc,GACdhC,EAAG,SAAU,CAAE,MAAO,OAAOgC,EAAO,KAAK,CAAE,EAAGA,EAAO,KAAK,CAC5D,CACF,EAEMK,EAAQ,IAAM,CACdhB,GAAiBc,EAAY,aAAeC,GAC9CA,EAAS,aAAaD,EAAaC,EAAS,UAAU,EAEpD,CAACf,GAAiBc,EAAY,aAAeC,GAC/CA,EAAS,YAAYD,CAAW,EAElCC,EAAS,MAAQf,EAAgB,GAAK,OAAOG,EAAK,EAAI,CAAC,CACzD,EACA,OAAAa,EAAM,EAEC,CACL,QAASrC,EACP,OACA,CAAE,MAAO,CAAE,GAAGR,GAAmB,MAAO2B,EAAM,IAAK,CAAE,EACrDiB,CACF,EACA,WAAY,CAACb,EAAeW,EAAoB,KAAU,CACxDd,EAAUG,EACVF,EAAgBa,EAChBG,EAAM,CACR,CACF,CACF,CAEA,IAAMC,EAAWtC,EAAG,QAAS,CAC3B,UAAWE,GAAcC,EAAMC,CAAS,EACxC,KAAM,WACN,QAAAgB,EACA,aAActB,EACd,SAAU,IAAM,CACdwB,EAAO,CAACF,CAAO,EACfkB,EAAS,QAAUlB,EACnBkB,EAAS,cAAgBjB,CAC3B,CACF,CAAC,EACD,OAAAiB,EAAS,cAAgBjB,EAElB,CACL,QAASiB,EACT,WAAY,CAACf,EAAeW,EAAoB,KAAU,CACxDd,EAAUG,EACVF,EAAgBa,EAChBI,EAAS,QAAUf,EACnBe,EAAS,cAAgBJ,CAC3B,CACF,CACF,CC9OO,IAAMK,GAAoC,CAC/C,OAAQC,EACR,WAAY,CAAC,EACb,aAAcC,GACd,UAAWC,GACX,iBAAkBC,GAClB,cAAe,GACf,cAAe,EACjB,EAEMC,GAAc,CAACC,EAAoBC,IACvCD,EACIE,GAAqB,GAAID,CAAK,EAC9BE,EAAG,MAAO,CACR,KAAM,MACN,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,OACP,OAAQ,OACR,aAAc,MACd,OAAQ,oBACR,gBAAiB,cACjB,WAAY,EACZ,UAAW,YACb,EACA,aAAcF,CAChB,CAAC,EAEA,SAASG,GACdC,EACAC,EAiBkB,CApGpB,IAAAC,EAAAC,EAAAC,EAAAC,GAAAC,EAqGE,GAAM,CACJ,iBAAAC,EACA,kBAAAC,EACA,qBAAAC,EACA,6BAAAC,EAA+B,CAAC,EAChC,gBAAAC,EAAkB,CAAC,EACnB,KAAAC,EAAOvB,GACP,mBAAAwB,EACA,YAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,oBAAAC,CACF,EAAIlB,EACE,CAAE,OAAAX,EAAQ,WAAA8B,EAAY,aAAAC,EAAc,UAAAC,CAAU,EAAIV,EAElDW,EAAkB,IAAI,IACtBC,EAAkB,IAAI,IACtBC,EAAkB,IAAI,IACtBC,EAAwB,IAAI,IAC5BC,EAAW,IAAI,IACfC,EAAgB,IAAI,IACpBC,EAAsB,IAAI,IAC1BC,EAAoB,IAAI,IAExBC,GAAY7B,EAAAD,EAAQ,OAAR,KAAAC,EAAgBJ,EAAG,MAAO,CAAE,MAAOR,EAAO,gBAAiB,CAAC,EAE9E,QAAW0C,KAAWhC,EAAU,CAC9B,IAAMiC,GAAiBnC,EAAG,MAAO,CAAE,WAAWK,EAAAS,EAAK,eAAL,KAAAT,EAAqB,IAAK,CAAC,EACnE+B,EAAWC,EAAkBrB,EAAakB,EAAQ,IAAI,EACtDI,GAASrB,EAAcA,EAAYiB,EAAQ,IAAI,EAAInB,EACnDwB,GAAcrB,EAAkB,gBAAiBgB,EAAQ,KAAMA,EAAQ,IAAI,EAE3EM,GAAUC,EACd,MACA,CACE,MAAO,IACP,OAAQ,KACR,QAAS,WACT,KAAM,OACN,MAAO,6BACP,OAAQlB,EACR,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,QACnB,MAAO,CACL,UAAYb,EAAkB0B,CAAQ,EAAsB,eAAlB,gBAC1C,WAAY,qBACd,EACA,cAAe,MACjB,EACAK,EAAI,OAAQ,CAAE,EAAG,eAAgB,CAAC,CACpC,EACAZ,EAAS,IAAIO,EAAUI,EAAO,EAE9B,IAAME,GAAmB1C,EACvB,MACA,CAAE,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,WAAY,KAAM,CAAE,EAChGwC,EACF,EAEMG,GAAU3C,EAAG,KAAM,CACvB,GAAI,gBAAgBoC,CAAQ,GAC5B,GAAGQ,EAAK,eAAe,EACvB,MAAO,CACL,GAAGpD,EAAO,YACV,GAAG8B,EAAW,YACd,MAAOC,CACT,CACF,CAAC,EAEDoB,GAAQ,YAAcJ,GAClBM,GAAuBX,CAAO,GAChCS,GAAQ,YAAYG,GAAqB,CAAC,EAE5ChB,EAAc,IAAIM,EAAUO,EAAO,EAEnC,IAAMI,GAAS/C,EAAG,KAAM,CACtB,GAAI,uBAAuBoC,CAAQ,GACnC,MAAO,CACL,GAAG5C,EAAO,kBACV,GAAG8B,EAAW,kBACd,OAAOhB,EAAAQ,EAAK,iBAAL,KAAAR,EAAuBkB,CAChC,CACF,CAAC,EACDuB,GAAO,YAAc7B,EAAkB,uBAAwBgB,EAAQ,YAAaA,EAAQ,IAAI,EAChGH,EAAoB,IAAIK,EAAUW,EAAM,EAExC,IAAMC,EAAgBhD,EAAG,MAAO,CAAE,MAAOR,EAAO,mBAAoB,EAAGmD,GAASI,EAAM,EAEhFE,EAAcjD,EAAG,MAAO,CAC5B,MAAOR,EAAO,WACd,KAAM,SACN,SAAU,IACV,gBAAiB,OAAO,CAACkB,EAAkB0B,CAAQ,CAAC,EACpD,gBAAiB,WAAWA,CAAQ,GACpC,aAAc,GAAG1B,EAAkB0B,CAAQ,EAAI,SAAW,UAAU,IAAIG,EAAW,WACnF,QAAS,IAAMnB,EAAkBc,EAAQ,KAAMlB,CAAW,EAC1D,UAAYkC,GAAqB,EAC3BA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAe,EACjB9B,EAAkBc,EAAQ,KAAMlB,CAAW,EAE/C,CACF,EAAG0B,GAAkBM,CAAa,EAClCrB,EAAgB,IAAIS,EAAUa,CAAW,EAEzC,IAAME,EAAiBC,GAAuB,CAC5C,QAAStC,EAAK,iBACd,QAASL,EAAiB2B,CAAQ,GAAK,GACvC,SAAU,IAAMjB,EAAgBe,EAAQ,KAAMlB,CAAW,EACzD,MAAO,gCAAgCuB,EAAW,GAClD,UAAW,mBAAmBH,CAAQ,GACtC,eAAgBvB,EAAgBuB,CAAQ,EACxC,KAAM,QACN,OAAAE,GACA,YAAa,wBAAwBC,EAAW,GAChD,SAAUzB,EAAK,SACf,KAAMA,EAAK,WACb,CAAC,EACIwB,IACHZ,EAAgB,IAAIU,EAAUe,CAAc,EAG9C,IAAME,GAAYrD,EAChB,MACA,CAAE,GAAG4C,EAAK,SAAS,EAAG,MAAOpD,EAAO,UAAW,EAC/CyD,EACAE,EAAe,OACjB,EAEMG,GAActD,EAAG,MAAO,CAC5B,GAAI,WAAWoC,CAAQ,GACvB,MAAO,CACL,GAAG5C,EAAO,sBACV,GAAIsB,EAAK,cAAgBtB,EAAO,2BAA6B,CAAC,CAChE,CACF,CAAC,EAED,KAAIe,GAAA2B,EAAQ,gBAAR,YAAA3B,GAAuB,QAAS,EAClC,QAAWgD,KAAerB,EAAQ,cAAe,CAC/C,IAAMsB,GAAa,GAAGpB,CAAQ,IAAImB,EAAY,IAAI,GAC5CE,EAAcvC,EAAkB,qBAAsBqC,EAAY,KAAMA,EAAY,IAAI,EAExFG,EAAY1D,EAAG,OAAQ,CAC3B,GAAI,gBAAgBoC,CAAQ,IAAImB,EAAY,IAAI,GAChD,MAAO,CACL,GAAG/D,EAAO,gBACV,GAAG8B,EAAW,gBACd,MAAOE,CACT,CACF,CAAC,EACDkC,EAAU,YAAcD,EACxBzB,EAAkB,IAAIwB,GAAYE,CAAS,EAEvCC,GAA0BJ,CAAW,GACvCG,EAAU,YAAYZ,GAAqB,CAAC,EAG9C,IAAIc,EACJ,GAAKtB,GAiBE,CAGL,IAAMuB,GAAcjD,EAA6B4C,EAAU,GAAK,GAChEI,EAAiBhE,GACfiE,GACA,GAAGA,GAAc,YAAc,eAAe,OAAOJ,CAAW,EAClE,CACF,KAzBa,CAIX,IAAMK,GAAUV,GAAuB,CACrC,QAAStC,EAAK,iBACd,QAASH,EAAqB6C,EAAU,GAAK,GAC7C,SAAU,IAAMnC,EAAoBkC,EAAY,KAAMrB,EAAQ,KAAMlB,CAAW,EAC/E,MAAO,UAAUyC,CAAW,GAAGE,GAA0BJ,CAAW,EAAI,cAAgB,EAAE,GAC1F,UAAW,wBAAwBC,EAAU,GAC7C,KAAM,QACN,UAAW,yBACX,SAAU1C,EAAK,SACf,KAAMA,EAAK,WACb,CAAC,EACDW,EAAgB,IAAI+B,GAAYM,EAAO,EACvCF,EAAiBE,GAAQ,OAC3B,CAUA,IAAMC,GAAQ/D,EACZ,MACA,CACE,GAAG4C,EAAK,cAAc,EACtB,MAAO,CACL,GAAGpD,EAAO,gBACV,GAAIsB,EAAK,cAAgBtB,EAAO,qBAAuB,CAAC,CAC1D,CACF,EACAkE,EACAE,CACF,EACAN,GAAY,YAAYS,EAAK,CAC/B,CAGFnC,EAAsB,IAAIQ,EAAUkB,EAAW,EAC/CA,GAAY,MAAM,QAAU,CAAC5C,EAAkB0B,CAAQ,KAAK5B,EAAA0B,EAAQ,gBAAR,YAAA1B,EAAuB,QAAS,EAAI,OAAS,OAEzG2B,GAAe,YAAYkB,EAAS,EACpClB,GAAe,YAAYmB,EAAW,EACtCrB,EAAU,YAAYE,EAAc,CACtC,CAEA,MAAO,CACL,UAAAF,EACA,gBAAAR,EACA,gBAAAC,EACA,gBAAAC,EACA,sBAAAC,EACA,SAAAC,EACA,cAAAC,EACA,oBAAAC,EACA,kBAAAC,CACF,CACF,CAEO,SAASjC,GAAqBiE,EAAcC,EAAgC,CACjF,IAAMC,EAAUF,IAAS,GAAK,GAAK,GAC7BG,EAAcH,IAAS,GAAK,IAAM,MAClCI,EAAQJ,IAAS,GAAK,uBAAyB,uBAE/CK,EAAW5B,EACf,MACA,CACE,MAAO,OAAOyB,CAAO,EACrB,OAAQ,OAAOA,CAAO,EACtB,QAAS,OAAOA,CAAO,IAAIA,CAAO,GAClC,KAAM,OACN,MAAO,6BACP,cAAe,MACjB,EACAzB,EAAI,OAAQ,CACV,EAAG2B,EACH,OAAQ,QACR,eAAgBD,EAChB,iBAAkB,QAClB,kBAAmB,OACrB,CAAC,CACH,EAEA,OAAOnE,EAAG,MAAO,CACf,KAAM,MACN,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GAAGgE,CAAI,KACd,OAAQ,GAAGA,CAAI,KACf,aAAc,MACd,gBAAiB,UACjB,WAAY,CACd,EACA,aAAcC,CAChB,EAAGI,CAAQ,CACb,CCtWO,IAAMC,GAAiD,CAC5D,QAAS,UACT,SAAU,wDACV,QAAS,2CACT,KAAM,kCACN,MAAO,yCACP,eAAgB,sDAChB,SAAU,wDACV,MAAO,+CACP,QAAS,2CACT,SAAU,4CACV,SAAU,kDACV,UAAW,mDACX,SAAU,wDACV,QAAS,2CACT,OAAQ,gDACR,KAAM,wCACN,QAAS,iDACT,SAAU,oEACV,QAAS,uDACT,OAAQ,oCACR,MAAO,yCACP,OAAQ,gDACR,KAAM,iCACR,EAEaC,GAAiBC,GAAsB,CAhCpD,IAAAC,EAgCuD,OAAAA,EAAAH,GAAuBE,CAAI,IAA3B,KAAAC,EAAgCD,GAqBjFE,GAAcC,GAAkE,CArDtF,IAAAF,EAsDE,IAAMG,GAAWH,EAAAE,GAAA,YAAAA,EAAU,SAAV,YAAAF,EAAkB,SAC7BI,EAAcD,EAChB,CAAE,gBAAiBA,EAAS,gBAAiB,MAAOA,EAAS,SAAU,EACvE,CAAC,EACCE,EAAc,CAAC,EACfC,EAAkB,CACtB,GAAIH,GAAA,MAAAA,EAAU,wBACV,CAAE,gBAAiBA,EAAS,uBAAwB,EACpD,CAAC,EACL,GAAIA,GAAA,MAAAA,EAAU,kBAAoB,CAAE,MAAOA,EAAS,iBAAkB,EAAI,CAAC,CAC7E,EACA,MAAO,CAAE,OAAQI,EAAe,KAAAH,EAAM,KAAAC,EAAM,SAAAC,CAAS,CACvD,EAEO,SAASE,GAAuBC,EAed,CAnFzB,IAAAT,EAAAU,EAAAC,EAAAC,EAAAC,EAoFE,GAAM,CAAE,UAAAC,EAAW,iBAAAC,EAAkB,SAAAb,EAAU,SAAAc,EAAU,kBAAAC,CAAkB,EAAIR,EACzES,GAAOlB,EAAAS,EAAQ,OAAR,KAAAT,EAAgBC,GAAWC,CAAQ,EAC1C,CAAE,OAAAK,CAAO,EAAIW,EAEfC,EAAS,GAEPC,EAAaC,EAAG,MAAM,EAC5BD,EAAW,YAActB,GAAciB,CAAgB,EAEvD,IAAMO,EAAaC,EACjB,MACA,CACE,MAAO,IACP,OAAQ,IACR,QAAS,UACT,KAAM,OACN,MAAO,4BACT,EACAA,EAAI,OAAQ,CACV,EAAG,eACH,OAASL,EAAK,KAAK,OAAgC,UACnD,eAAgB,MAChB,iBAAkB,QAClB,kBAAmB,OACrB,CAAC,CACH,EAEMM,EAAqB,CACzB,GAAGjB,EAAO,SACV,IAAGG,EAAAQ,EAAK,aAAL,YAAAR,EAAiB,SACpB,GAAGQ,EAAK,IACV,EAEMO,EAASJ,EAAG,MAAO,CACvB,GAAGK,EAAK,UAAU,EAClB,MAAOF,EACP,KAAM,SACN,SAAU,IACV,gBAAiB,UACjB,gBAAiB,QACjB,aAAc,+BAA+B1B,GAAciB,CAAgB,CAAC,GAC5E,QAAS,IAAMY,EAAe,EAC9B,UAAYC,GAAqB,CAC3BA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,KACjCA,EAAE,eAAe,EACjBD,EAAe,GACNC,EAAE,MAAQ,UACnBC,EAAc,CAElB,CACF,EAAGT,EAAYE,CAAU,EAGnBQ,EAAWT,EAAG,MAAO,CACzB,GAAGH,EAAK,eACR,MAAO,CACL,GAAGX,EAAO,iBACV,GAAGW,EAAK,KACR,SAAU,QACV,IAAK,OACL,MAAO,OACP,UAAW,EACX,OAAQ,WACR,SAAU,QACV,MAAO,OACP,QAAS,MACX,EACA,KAAM,UACN,aAAc,iBAChB,CAAC,EAED,QAAWa,KAAQjB,EAAW,CAC5B,IAAMkB,EAAaD,IAAShB,EACtBkB,EAAsB,CAC1B,GAAG1B,EAAO,aACV,IAAGI,EAAAO,EAAK,aAAL,YAAAP,EAAiB,aACpB,GAAIqB,EAAa,CAAE,GAAGzB,EAAO,qBAAsB,GAAGW,EAAK,QAAS,EAAIA,EAAK,IAC/E,EACMgB,GAAWtB,EAAAqB,EAAa,kBAAb,KAAArB,EAAuD,GAClEuB,EAAQH,EACVE,GACErB,EAAAK,EAAK,SAAS,kBAAd,KAAAL,EAAwD,UAExDuB,GAAOf,EAAG,MAAO,CACrB,MAAOY,EACP,KAAM,SACN,gBAAiB,OAAOD,CAAU,EAClC,QAAS,IAAM,CACbhB,EAASe,CAAI,EACbF,EAAc,CAChB,EACA,aAAeD,GAAa,CACzBA,EAAE,OAAuB,MAAM,gBAAkBO,CACpD,EACA,aAAeP,GAAa,CACzBA,EAAE,OAAuB,MAAM,gBAAkBM,CACpD,CACF,CAAC,EACDE,GAAK,YAActC,GAAciC,CAAI,EACrCD,EAAS,YAAYM,EAAI,CAC3B,CAKA,IAAMC,EAAYhB,EAAG,MAAO,CAAE,MAAOd,EAAO,yBAA0B,EAAGkB,CAAM,EAE/ER,EAAkB,YAAYa,CAAQ,EAEtC,SAASQ,GAAmB,CAC1B,IAAMC,EAAOd,EAAO,sBAAsB,EAC1CK,EAAS,MAAM,IAAM,GAAGS,EAAK,OAAS,CAAC,KACvCT,EAAS,MAAM,MAAQ,GAAG,OAAO,WAAaS,EAAK,KAAK,KACxDT,EAAS,MAAM,KAAO,MACxB,CAOA,IAAMU,EAAuBZ,GAAa,CA7M5C,IAAA5B,EAAAU,EA8MI,IAAM+B,GAAQ/B,GAAAV,EAAA4B,EAAqD,eAArD,YAAA5B,EAAA,KAAA4B,KAAA,KAAAlB,EAAyE,CAAC,EACxF,GAAI,EAAA+B,EAAK,SAASJ,CAAS,GAAKI,EAAK,SAASX,CAAQ,GAGtD,IAAIW,EAAK,SAAW,EAAG,CACrB,IAAMC,EAASd,EAAE,OACjB,GAAIS,EAAU,SAASK,CAAM,GAAKZ,EAAS,SAASY,CAAM,EAAG,MAC/D,CACAb,EAAc,EAChB,EAGMc,EAAoB,IAAM,CAC1BxB,GAAQmB,EAAiB,CAC/B,EAEA,SAASX,GAAiB,CACxBR,EAASU,EAAc,EAAIe,EAAa,CAC1C,CAEA,SAASA,GAAe,CACtBzB,EAAS,GACTmB,EAAiB,EACjBR,EAAS,MAAM,QAAU,QACzBL,EAAO,aAAa,gBAAiB,MAAM,EAC3C,WAAW,IAAM,CACf,SAAS,iBAAiB,QAASe,CAAmB,CACxD,EAAG,CAAC,EACJ,OAAO,iBAAiB,SAAUG,EAAmB,EAAI,EACzD,OAAO,iBAAiB,SAAUA,CAAiB,CACrD,CAEA,SAASd,GAAgB,CACvBV,EAAS,GACTW,EAAS,MAAM,QAAU,OACzBL,EAAO,aAAa,gBAAiB,OAAO,EAC5C,SAAS,oBAAoB,QAASe,CAAmB,EACzD,OAAO,oBAAoB,SAAUG,EAAmB,EAAI,EAC5D,OAAO,oBAAoB,SAAUA,CAAiB,CACxD,CAEA,MAAO,CAAE,UAAAN,EAAW,OAAAZ,EAAQ,SAAAK,EAAU,WAAAV,EAAY,MAAOS,CAAc,CACzE,CClPO,SAASgB,GACdC,EACAC,EACqB,CACrB,IAAMC,EAAWC,GAAqB,CAVxC,IAAAC,EAWI,GAAID,EAAE,MAAQ,SAAU,CACtBA,EAAE,eAAe,EACjBF,EAAS,EACT,MACF,CAEA,GAAIE,EAAE,MAAQ,MAAO,CACnB,IAAME,EAAoBL,EAAQ,iBAChC,0EACF,EACMM,EAAY,MAAM,KAAKD,CAAiB,EAAE,OAC7CE,GAAO,CAACA,EAAG,aAAa,UAAU,GAAKA,EAAG,eAAiB,IAC9D,EAEA,GAAID,EAAU,SAAW,EAAG,CAC1BH,EAAE,eAAe,EACjB,MACF,CAEA,IAAMK,EAAQF,EAAU,CAAC,EACnBG,EAAOH,EAAUA,EAAU,OAAS,CAAC,EAMrCI,GACHN,EAFUJ,EAAQ,YAAY,EAEV,gBAApB,KAAAI,EAAqC,SAAS,cAE7CD,EAAE,SACAO,IAAWF,IACbL,EAAE,eAAe,EACjBM,EAAK,MAAM,GAGTC,IAAWD,IACbN,EAAE,eAAe,EACjBK,EAAM,MAAM,EAGlB,CACF,EAEA,gBAAS,iBAAiB,UAAWN,CAAO,EAG5C,sBAAsB,IAAM,CAC1B,IAAMS,EAAiBX,EAAQ,cAC7B,0EACF,EACAW,GAAA,MAAAA,EAAgB,OAClB,CAAC,EAEM,IAAM,CACX,SAAS,oBAAoB,UAAWT,CAAO,CACjD,CACF,CCjEA,IAAMU,GAAc,4BAGpB,IAAMC,GAAY,IACT,OAAO,QAAW,aAAe,OAAO,OAAO,gBAAmB,YAG9DC,GAAoBC,GAAuC,CACtE,GAAI,CAACF,GAAU,EAAG,CAChB,QAAQ,KAAK,oDAAoD,EACjE,MACF,CAEA,GAAI,CACF,IAAMG,EAAqB,CACzB,GAAGD,EACH,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,EACA,eAAe,QAAQE,GAAa,KAAK,UAAUD,CAAkB,CAAC,CACxE,OAASE,EAAO,CACd,QAAQ,MAAM,gCAAiCA,CAAK,CACtD,CACF,EAEaC,GAAkB,IAAoC,CACjE,GAAI,CAACN,GAAU,EAAG,OAAO,KAEzB,GAAI,CACF,IAAMO,EAAa,eAAe,QAAQH,EAAW,EACrD,GAAI,CAACG,EAAY,OAAO,KAExB,IAAMC,EAAgC,KAAK,MAAMD,CAAU,EAG3D,OADiB,KAAK,IAAI,EAAI,IAAI,KAAKC,EAAO,SAAS,EAAE,QAAQ,EAClD,MACbC,GAAkB,EACX,MAGFD,CACT,OAASH,EAAO,CACd,eAAQ,MAAM,+BAAgCA,CAAK,EAC5C,IACT,CACF,EAEaI,GAAoB,IAAY,CAC3C,GAAKT,GAAU,EAEf,GAAI,CACF,eAAe,WAAWI,EAAW,CACvC,OAASC,EAAO,CACd,QAAQ,MAAM,iCAAkCA,CAAK,CACvD,CACF,EAEaK,GAAsBC,GAAkD,CACnF,IAAMC,EAAeN,GAAgB,EACjCM,GACFX,GAAiB,CACf,GAAGW,EACH,GAAGD,EACH,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,CAEL,EClDO,IAAME,GAAN,KAAiB,CAuBtB,YACEC,EACAC,EACAC,EAA8BC,GAC9B,CA1BF,KAAQ,UAAmD,KAC3D,KAAQ,cAA0B,CAAC,EACnC,KAAQ,kBAA8B,CAAC,EACvC,KAAQ,aAAwC,KAChD,KAAQ,aAAe,EACvB,KAAQ,WAAa,GACrB,KAAQ,UAAY,GACpB,KAAQ,aAAe,GACvB,KAAQ,qBAAsC,KAC9C,KAAQ,gBAA0C,KAkBhD,KAAK,cAAgBH,EACrB,KAAK,KAAOC,EACZ,KAAK,WAAaC,CACpB,CAEA,IAAI,WAAqB,CAAE,OAAO,KAAK,UAAY,CACnD,IAAI,UAAoB,CAAE,OAAO,KAAK,SAAW,CACjD,IAAI,aAAuB,CAAE,OAAO,KAAK,YAAc,CACvD,IAAI,kBAAkC,CAAE,OAAO,KAAK,oBAAsB,CAE1E,MAAM,eAAeE,EAUH,CAjEpB,IAAAC,EAwEI,KAAK,aAAa,EAClB,KAAK,aAAe,GACpB,KAAK,UAAY,KACjB,KAAK,cAAgB,CAAC,EACtB,KAAK,kBAAoB,CAAC,EAC1B,KAAK,cAAc,GAEnBA,EAAA,KAAK,kBAAL,MAAAA,EAAsB,QACtB,KAAK,gBAAkB,IAAI,gBAE3B,GAAI,CACF,IAAMC,EAAW,MAAM,KAAK,WAAW,CACrC,YAAaF,EAAO,YACpB,QAASA,EAAO,QAChB,cAAeA,EAAO,cACtB,aAAcA,EAAO,aACrB,WAAYA,EAAO,WACnB,SAAUA,EAAO,SACjB,OAAQ,KAAK,gBAAgB,OAC7B,MAAOA,EAAO,MACd,YAAaA,EAAO,YACpB,aAAcA,EAAO,aACrB,cAAeA,EAAO,cACtB,iBAAkBA,EAAO,iBACzB,cAAeA,EAAO,aACxB,CAAC,EAED,KAAK,UAAYE,EAAS,OAC1B,KAAK,eAAeF,EAAO,QAASA,EAAO,QAAQ,EAKnD,KAAK,aAAe,KAAK,cAAc,OAAS,EAChD,KAAK,cAAc,CACrB,OAASG,EAAO,CACTA,EAAgB,OAAS,eAC5B,KAAK,aAAe,GACpB,KAAK,UAAY,KACjB,KAAK,cAAgB,CAAC,EACtB,KAAK,kBAAoB,CAAC,EAC1B,KAAK,cAAc,EAEvB,CACF,CAEQ,eACNC,EACAC,EACM,CAzHV,IAAAJ,EAAAK,EA0HI,GAAI,CAAC,KAAK,UAAW,OACrB,IAAMC,EAAO,KAAK,UAEZC,EAAqB,CAAC,EACtBC,EAAuB,CAAC,EAExBC,EAAO,CAACC,EAAyBC,IAAsB,CACvDD,IACFH,EAAS,KAAKG,CAAG,EACjBF,EAAW,KAAKG,CAAS,EAE7B,EAGAF,EAAKH,EAAK,gCAAiC,sBAAsB,EAEjEG,EAAKH,EAAK,sBAAuB,qBAAqB,EAEtDG,EAAKH,EAAK,qCAAsC,qBAAqB,EAErEG,EAAKH,EAAK,qCAAsC,qBAAqB,EAErEG,EAAKH,EAAK,kCAAmC,yBAAyB,EAItE,IAAMM,EACJR,GAAA,KAAAA,EACAS,GACEV,EAAQ,SACRA,EAAQ,SACRA,EAAQ,qBACV,EACF,QAAWW,KAAWF,EAAU,CAC9B,IAAMG,GAAef,EAAAM,EAAK,iBAAL,YAAAN,EAAsBc,EAAQ,MAC/CC,IACFN,EAAKM,EAAa,eAAgB,gBAAgBD,EAAQ,IAAI,EAAE,EAChEL,EAAKM,EAAa,sBAAuB,uBAAuBD,EAAQ,IAAI,EAAE,GAGhF,QAAWE,KAAMF,EAAQ,cAAe,CACtC,IAAMG,GAAUZ,EAAAC,EAAK,sBAAL,YAAAD,EAA2BW,EAAG,MAC1CC,GACFR,EAAKQ,EAAQ,eAAgB,gBAAgBH,EAAQ,IAAI,IAAIE,EAAG,IAAI,EAAE,CAE1E,CACF,CAYA,GATIb,EAAQ,iBACVM,EAAKH,EAAK,0BAA2B,iBAAiB,EAGpDH,EAAQ,oBACVM,EAAKH,EAAK,qCAAsC,qBAAqB,EAInEA,EAAK,eACP,QAAWY,KAAWC,GAAuB,CAC3C,IAAMC,EAAWd,EAAK,eAAeY,EAAQ,QAAQ,EACrDT,EAAKW,EAAUF,EAAQ,SAAS,CAClC,CAIFT,EAAKH,EAAK,iCAAkCe,EAAoB,EAChEZ,EAAKH,EAAK,8BAA+BgB,EAAyB,EAClEb,EAAKH,EAAK,8BAA+BiB,EAAiB,EAE1D,KAAK,cAAgBhB,EACrB,KAAK,kBAAoBC,CAC3B,CAEA,QAAe,CACb,KAAK,WAAa,KAAK,MAAM,EAAI,KAAK,KAAK,CAC7C,CAEA,MAAa,CACX,GAAI,KAAK,cAAc,SAAW,EAElC,GAAI,KAAK,WAAa,KAAK,aACzB,KAAK,aAAa,KAAK,EACpB,KAAK,IAAM,CACV,KAAK,WAAa,GAClB,KAAK,UAAY,GACjB,KAAK,cAAc,CACrB,CAAC,EACA,MAAM,IAAM,CAAC,CAAC,MACZ,CACL,IAAMgB,EAAa,KAAK,WAAa,KAAK,aAAe,EACzD,KAAK,cAAcA,CAAU,CAC/B,CACF,CAEA,OAAc,CACR,KAAK,cAAgB,KAAK,aAC5B,KAAK,aAAa,MAAM,EACxB,KAAK,WAAa,GAClB,KAAK,UAAY,GACjB,KAAK,cAAc,EAEvB,CAEA,MAAa,CACX,KAAK,aAAa,EAClB,KAAK,cAAc,CACrB,CAQQ,cAAqB,CACvB,KAAK,eACP,KAAK,aAAa,MAAM,EACxB,KAAK,aAAa,YAAc,EAChC,KAAK,aAAe,MAEtB,KAAK,WAAa,GAClB,KAAK,UAAY,GACjB,KAAK,aAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,qBAAuB,IAC9B,CAEA,SAAgB,CA1PlB,IAAAxB,GA2PIA,EAAA,KAAK,kBAAL,MAAAA,EAAsB,QACtB,KAAK,KAAK,CACZ,CAEQ,cAAcyB,EAAqB,CACzC,GAAIA,GAAS,KAAK,cAAc,OAAQ,CACtC,KAAK,KAAK,EACV,MACF,CAEI,KAAK,eACP,KAAK,aAAa,MAAM,EACxB,KAAK,aAAe,MAGtB,IAAMC,EAAQ,IAAI,MAAM,KAAK,cAAcD,CAAK,CAAC,EACjD,KAAK,aAAeC,EACpB,KAAK,aAAeD,EACpB,KAAK,WAAa,GAClB,KAAK,UAAY,GAGjB,IAAMd,EAAY,KAAK,kBAAkBc,CAAK,EAC1Cd,GACF,KAAK,iBAAiBA,CAAS,EAGjCe,EAAM,QAAU,IAAM,KAAK,cAAcD,EAAQ,CAAC,EAClDC,EAAM,QAAU,IAAM,CACpB,QAAQ,KAAK,iCAAiCD,CAAK,EAAE,EACrD,KAAK,cAAcA,EAAQ,CAAC,CAC9B,EAEAC,EAAM,KAAK,EAAE,MAAOxB,GAAU,CAC5B,QAAQ,KAAK,iCAAiCuB,CAAK,IAAKvB,CAAK,EAC7D,KAAK,WAAa,GAClB,KAAK,cAAc,CACrB,CAAC,EAED,KAAK,cAAc,CACrB,CAEQ,iBAAiBS,EAAyB,CAChD,KAAK,iBAAiB,EACtB,KAAK,qBAAuBA,EAE5B,WAAW,IAAM,CAGf,IAAMgB,EACJ,mBAAoB,KAAK,KACpB,KAAK,KAAoF,eAAehB,CAAS,EACjH,KAAK,KAAoB,cAA2B,IAAI,IAAI,OAAOA,CAAS,CAAC,EAAE,EACtF,GAAIgB,EAAS,CACXA,EAAQ,UAAU,IAAI,uBAAuB,EAE7C,IAAMC,EAAOD,EAAQ,sBAAsB,EAEzCC,EAAK,KAAO,GACZA,EAAK,MAAQ,GACbA,EAAK,QAAU,OAAO,aACtBA,EAAK,OAAS,OAAO,YAGrBD,EAAQ,eAAe,CACrB,SAAU,SACV,MAAO,SACP,OAAQ,SACV,CAAC,CAEL,CACF,EAAG,EAAE,CACP,CAEQ,kBAAyB,CAC/B,KAAK,KAAK,iBAAiB,wBAAwB,EAAE,QAASE,GAAO,CACnEA,EAAG,UAAU,OAAO,uBAAuB,CAC7C,CAAC,CACH,CACF,ECjUO,SAASC,GAAsBC,EAQd,CACtB,GAAM,CAAE,SAAAC,EAAU,OAAAC,EAAQ,SAAAC,EAAU,QAAAC,EAAS,MAAAC,EAAO,KAAAC,EAAM,QAAAC,CAAQ,EAAIP,EAEhEQ,GAAeP,GAAA,YAAAA,EAAU,eAAgB,UACzCQ,EAAYP,EAAO,KACnBQ,EAAOR,EAAO,KAGdS,EAAOC,EAAG,MAAO,CAAE,IAAKR,EAAS,MAAOS,EAAO,KAAM,IAAK,cAAe,CAAC,EAE1EC,EAAQF,EAAG,KAAM,CACrB,GAAI,yBACJ,MAAO,CACL,GAAGC,EAAO,MACV,SAAUV,EAAW,OAAS,OAC9B,MAAOK,EACP,WAAYE,CACd,CACF,CAAC,EACDI,EAAM,YAAc,4BAEpB,IAAMC,EAAUH,EAAG,MAAO,CAAE,MAAOC,EAAO,OAAQ,EAAGF,EAAMG,CAAK,EAE1DE,EAAWJ,EAAG,SAAU,CAC5B,MAAO,CACL,WAAY,OACZ,OAAQ,OACR,MAAOJ,EACP,OAAQ,UACR,QAASL,EAAW,MAAQ,MAC5B,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,EACA,KAAM,SACN,aAAc,cACd,QAASI,CACX,CAAC,EACKU,EAAWC,EACf,MACA,CACE,MAAOf,EAAW,KAAO,KACzB,OAAQA,EAAW,KAAO,KAC1B,QAAS,YACT,KAAM,OACN,MAAO,6BACP,cAAe,MACjB,EACAe,EAAI,OAAQ,CACV,EAAG,uBACH,OAAQ,eACR,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,OACrB,CAAC,CACH,EACAF,EAAS,YAAYC,CAAQ,EAE7B,IAAME,EAAaP,EAAG,MAAO,CAC3B,MAAO,CAAE,GAAGC,EAAO,WAAY,MAAOJ,EAAW,WAAYC,CAAK,CACpE,EAAGK,EAASC,CAAQ,EAGdI,EAAcR,EAAG,IAAK,CAC1B,MAAO,CACL,GAAGC,EAAO,YACV,SAAUV,EAAW,OAAS,OAC9B,MAAOM,EACP,WAAYC,EACZ,aAAc,MAChB,CACF,CAAC,EACDU,EAAY,YAAc,iEAE1B,IAAMC,EAAWT,EAAG,IAAK,CACvB,MAAO,CACL,GAAGC,EAAO,SACV,MAAOJ,EACP,WAAYC,EACZ,aAAc,OACd,UAAW,MACb,CACF,CAAC,EACDW,EAAS,YAAc,oCAEvB,IAAMC,EAAgBV,EAAG,MAAO,CAC9B,MAAO,CAAE,GAAGC,EAAO,cAAe,MAAOJ,EAAW,WAAYC,CAAK,CACvE,EAAGU,EAAaC,CAAQ,EAGlBE,EAAU,CACd,GAAGV,EAAO,OACV,SAAUV,EAAW,OAAS,OAC9B,QAASA,EAAW,YAAc,UACpC,EAEMqB,EAASZ,EAAG,SAAU,CAC1B,MAAO,CACL,GAAGW,EACH,GAAGV,EAAO,aACV,gBAAiBX,EAAO,SACxB,MAAOA,EAAO,WACd,aAAcA,EAAO,YACvB,EACA,KAAM,SACN,aAAc,6CACd,QAASG,CACX,CAAC,EACDmB,EAAO,YAAc,wBAErB,IAAMC,EAAQb,EAAG,SAAU,CACzB,MAAO,CACL,GAAGW,EACH,GAAGV,EAAO,aACV,gBAAiBX,EAAO,UACxB,MAAOA,EAAO,YACd,YAAaA,EAAO,cACpB,aAAcA,EAAO,YACvB,EACA,KAAM,SACN,aAAc,2CACd,QAASI,CACX,CAAC,EACDmB,EAAM,YAAc,oBAEpB,IAAMC,EAAgBd,EAAG,MAAO,CAC9B,MAAO,CAAE,GAAGC,EAAO,cAAe,MAAOJ,EAAW,WAAYC,CAAK,CACvE,EAAGc,EAAQC,CAAK,EAKhB,MAAO,CAAE,UAFSb,EAAG,MAAO,CAAE,MAAOC,EAAO,OAAQ,EAAGM,EAAYG,EAAeI,CAAa,CAE5E,CACrB,CCjJA,IAAMC,GAAuB,CAC3B,CAAE,MAAO,SAAU,MAAO,QAAS,EACnC,CAAE,MAAO,SAAU,MAAO,QAAS,EACnC,CAAE,MAAO,iBAAkB,MAAO,gBAAiB,EACnD,CAAE,MAAO,cAAe,MAAO,aAAc,CAC/C,EAoBO,SAASC,GAAmBC,EAUd,CAxCrB,IAAAC,GAyCE,GAAM,CAAE,SAAAC,EAAU,SAAAC,EAAU,OAAAC,EAAQ,SAAAC,EAAU,QAAAC,EAAS,aAAAC,EAAc,SAAAC,EAAU,SAAAC,EAAU,cAAAC,CAAc,EAAIV,EAErGW,GAAeR,GAAA,YAAAA,EAAU,eAAgB,UACzCS,EAAYR,EAAO,KACnBS,EAAcT,EAAO,cACrBU,GAAUX,GAAA,YAAAA,EAAU,kBAAmB,UACvCY,EAASX,EAAO,aAChBY,EAAOZ,EAAO,KACda,EAAcb,EAAO,SAErBc,EAAkC,CACtC,MAAO,OACP,QAAS,YACT,OAAQ,aAAaL,CAAW,GAChC,aAAcE,EACd,SAAU,OACV,WAAYC,EACZ,MAAOJ,EACP,gBAAiBE,EACjB,aAAc,MACd,UAAW,aACX,QAAS,MACX,EAEMK,EAAkC,CACtC,MAAO,UACP,SAAU,OACV,UAAW,MACX,aAAc,MACd,QAAS,MACX,EAEMC,EAAkC,CACtC,SAAU,OACV,WAAY,IACZ,MAAOR,EACP,WAAYI,EACZ,aAAc,MACd,QAAS,OACX,EAEMK,EAAiC,CACrC,SAAU,OACV,MAAO,UACP,UAAW,MACX,aAAc,MACd,WAAY,KACd,EAGMC,EAAOC,EAAG,MAAO,CAAE,IAAKjB,EAAS,MAAOkB,EAAO,KAAM,IAAK,MAAO,CAAC,EAClEC,EAAQF,EAAG,KAAM,CACrB,GAAI,sBACJ,MAAO,CACL,GAAGC,EAAO,MACV,SAAU,OACV,WAAY,IACZ,MAAOb,EACP,WAAYK,CACd,CACF,CAAC,EACDS,EAAM,YAAc,wBAEpB,IAAMC,EAAUH,EAAG,MAAO,CAAE,MAAOC,EAAO,OAAQ,EAAGF,EAAMG,CAAK,EAC1DE,EAAaJ,EAAG,MAAO,CAC3B,MAAO,CAAE,GAAGC,EAAO,WAAY,MAAOZ,EAAW,WAAYI,CAAK,CACpE,EAAGU,CAAO,EAGJE,EAAWL,EAAG,IAAK,CACvB,MAAO,CACL,GAAGC,EAAO,YACV,SAAU,OACV,WAAY,MACZ,MAAOZ,EACP,WAAYI,EACZ,aAAc,MAChB,CACF,CAAC,EACDY,EAAS,YAAc,6HAGvB,IAAMC,EAAWC,EACf,MACA,CACE,MAAO,KAAM,OAAQ,KAAM,QAAS,YACpC,KAAM,OAAQ,OAAQ,UAAW,eAAgB,IACjD,iBAAkB,QAAS,kBAAmB,OAChD,EACAA,EAAI,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,CAAC,EAC7CA,EAAI,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,IAAK,CAAC,EACtDA,EAAI,OAAQ,CAAE,GAAI,KAAM,GAAI,IAAK,GAAI,QAAS,GAAI,GAAI,CAAC,CACzD,EACCD,EAAoC,MAAM,QAAU,+BAErD,IAAME,EAAWR,EAAG,MAAM,EAC1BQ,EAAS,YAAc,8JAEvB,IAAMC,EAAaT,EAAG,MAAO,CAC3B,MAAO,CACL,QAAS,OACT,WAAY,aACZ,IAAK,MACL,QAAS,YACT,gBAAiB,UACjB,OAAQ,oBACR,aAAcR,EACd,aAAc,OACd,SAAU,OACV,WAAY,MACZ,MAAO,SACT,CACF,EAAGc,EAAUE,CAAQ,EAGfE,EAAYV,EAAG,QAAS,CAAE,IAAK,eAAgB,MAAOH,CAAW,CAAC,EACxEa,EAAU,UAAY,4DAEtB,IAAMC,EAAYX,EAAG,QAAS,CAC5B,GAAI,eACJ,KAAM,OACN,MAAOL,EACP,MAAOhB,EAAS,aAChB,YAAa,oBACb,aAAc,OACd,mBAAoB,oBACpB,QAAUiC,GAAazB,EAAc,eAAiByB,EAAE,OAA4B,KAAK,CAC3F,CAAC,EAEKC,GAAWb,EAAG,IAAK,CAAE,GAAI,oBAAqB,MAAOF,CAAU,CAAC,EACtEe,GAAS,YAAc,gEAEvB,IAAMC,EAAYd,EAAG,MAAO,CAAE,MAAOJ,EAAY,KAAM,OAAQ,CAAC,EAC1DmB,EAAYf,EAAG,MAAO,KAAMU,EAAWC,EAAWE,GAAUC,CAAS,EAGrEE,GAAehB,EAAG,QAAS,CAAE,IAAK,kBAAmB,MAAOH,CAAW,CAAC,EAC9EmB,GAAa,UAAY,+DAEzB,IAAMC,EAAejB,EAAG,QAAS,CAC/B,GAAI,kBACJ,KAAM,MACN,UAAW,MACX,MAAOL,EACP,MAAOhB,EAAS,gBAChB,YAAa,kBACb,aAAc,MACd,mBAAoB,uBACpB,QAAUiC,GAAazB,EAAc,kBAAoByB,EAAE,OAA4B,KAAK,CAC9F,CAAC,EAEKM,GAAclB,EAAG,IAAK,CAAE,GAAI,uBAAwB,MAAOF,CAAU,CAAC,EAC5EoB,GAAY,YAAc,6CAE1B,IAAMC,GAAenB,EAAG,MAAO,CAAE,MAAOJ,EAAY,KAAM,OAAQ,CAAC,EAC7DwB,GAAepB,EAAG,MAAO,KAAMgB,GAAcC,EAAcC,GAAaC,EAAY,EAGpFE,GAAWrB,EAAG,QAAS,CAAE,GAAI,6BAA8B,MAAOH,CAAW,CAAC,EACpFwB,GAAS,UAAY,oDAErB,IAAMC,IAAgB5C,GAAAH,GAAqB,KAAMgD,GAAMA,EAAE,QAAU5C,EAAS,oBAAoB,IAA1E,YAAAD,GAA6E,MAE7F8C,GAAajB,EACjB,MACA,CACE,MAAO,KAAM,OAAQ,KAAM,QAAS,YACpC,KAAM,OAAQ,OAAQ,UAAW,eAAgB,IACjD,iBAAkB,QAAS,kBAAmB,OAChD,EACAA,EAAI,WAAY,CAAE,OAAQ,gBAAiB,CAAC,CAC9C,EACCiB,GAAsC,MAAM,QAAU,0DAEvD,IAAMC,EAAezB,EAAG,OAAQ,CAC9B,MAAO,CAAE,SAAU,SAAU,aAAc,WAAY,WAAY,QAAS,CAC9E,CAAC,EACDyB,EAAa,YAAcH,IAAiB,sBAE5C,IAAMI,EAAsB1B,EAAG,MAAO,CACpC,KAAM,WACN,gBAAiB,QACjB,gBAAiB,UACjB,kBAAmB,6BACnB,SAAU,IACV,MAAO,CACL,GAAGL,EACH,MAAO2B,GAAgBjC,EAAY,UACnC,OAAQ,UACR,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,WAAY,OACZ,WAAY,sCACd,CACF,EAAGoC,EAAcD,EAAU,EAGrBG,EAAe3B,EAAG,MAAO,CAC7B,GAAI,+BACJ,KAAM,UACN,kBAAmB,6BACnB,MAAO,CACL,SAAU,WACV,IAAK,mBACL,KAAM,EACN,MAAO,EACP,gBAAiBT,EACjB,OAAQ,aAAaD,CAAW,GAChC,aAAcE,EACd,UAAW,yDACX,OAAQ,GACR,SAAU,SACV,QAAS,QACT,UAAW,QACX,UAAW,OACX,QAAS,MACX,CACF,CAAC,EAED,QAASoC,EAAI,EAAGA,EAAIrD,GAAqB,OAAQqD,IAAK,CACpD,IAAMC,GAAStD,GAAqBqD,CAAC,EAC/BE,GAAanD,EAAS,uBAAyBkD,GAAO,MAEtDE,GAAW/B,EAAG,MAAO,CACzB,GAAI,+BAA+B4B,CAAC,GACpC,KAAM,SACN,gBAAiB,OAAOE,EAAU,EAClC,MAAO,CACL,QAAS,WACT,SAAU,OACV,WAAYrC,EACZ,MAAOqC,GAAapC,EAAcL,EAClC,gBAAiB,cACjB,OAAQ,UACR,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,WAAY,uBACd,EACA,QAAS,IAAM,CACbF,EAAc,uBAAwB0C,GAAO,KAAK,EAClDJ,EAAa,YAAcI,GAAO,MAClCH,EAAoB,MAAM,MAAQrC,EAClC2C,EAAQ,CACV,EACA,aAAepB,IAAa,CAAGA,GAAE,OAAuB,MAAM,gBAAkB,SAAW,EAC3F,aAAeA,IAAa,CAAGA,GAAE,OAAuB,MAAM,gBAAkB,aAAe,CACjG,CAAC,EAEKqB,GAAQjC,EAAG,MAAM,EAIvB,GAHAiC,GAAM,YAAcJ,GAAO,MAC3BE,GAAS,YAAYE,EAAK,EAEtBH,GAAY,CACd,IAAMI,GAAW3B,EACf,MACA,CACE,MAAO,KAAM,OAAQ,KAAM,QAAS,YACpC,KAAM,OAAQ,OAAQb,EAAa,eAAgB,MACnD,iBAAkB,QAAS,kBAAmB,OAChD,EACAa,EAAI,WAAY,CAAE,OAAQ,gBAAiB,CAAC,CAC9C,EACC2B,GAAoC,MAAM,WAAa,IACxDH,GAAS,YAAYG,EAAQ,CAC/B,CAEAP,EAAa,YAAYI,EAAQ,CACnC,CAEA,IAAII,GAAe,GAEbC,GAAepC,EAAG,MAAO,CAAE,MAAO,CAAE,SAAU,UAAW,CAAE,CAAC,EAE5DqC,EAAsBzB,GAAa,CAClCwB,GAAa,SAASxB,EAAE,MAAc,GACzCoB,EAAQ,CAEZ,EAEA,SAASM,IAAS,CAChBH,GAAe,GACfR,EAAa,MAAM,QAAU,QAC7BD,EAAoB,aAAa,gBAAiB,MAAM,EACvDF,GAAsC,MAAM,UAAY,iBACzDE,EAAoB,MAAM,YAAchC,EACxCgC,EAAoB,MAAM,UAAY,aAAahC,CAAW,GAG9D,IAAM6C,EAAOH,GAAa,sBAAsB,EAC1CI,GAAa,OAAO,YAAcD,EAAK,OACvCE,GAAiB,IACED,GAAaC,IAAkBF,EAAK,IAAME,IAGjEd,EAAa,MAAM,IAAM,OACzBA,EAAa,MAAM,OAAS,mBAC5BA,EAAa,MAAM,UAAY,6DAE/BA,EAAa,MAAM,IAAM,mBACzBA,EAAa,MAAM,OAAS,OAC5BA,EAAa,MAAM,UAAY,0DAIjC,sBAAsB,IAAM,CAC1BA,EAAa,eAAe,CAAE,SAAU,SAAU,MAAO,SAAU,CAAC,CACtE,CAAC,EAGD,WAAW,IAAM,SAAS,iBAAiB,YAAaU,CAAkB,EAAG,CAAC,CAChF,CAEA,SAASL,GAAU,CACjBG,GAAe,GACfR,EAAa,MAAM,QAAU,OAC7BD,EAAoB,aAAa,gBAAiB,OAAO,EACxDF,GAAsC,MAAM,UAAY,eACzDE,EAAoB,MAAM,YAAcpC,EACxCoC,EAAoB,MAAM,UAAY,OACtC,SAAS,oBAAoB,YAAaW,CAAkB,CAC9D,CAEAX,EAAoB,iBAAiB,QAAS,IAAM,CAClDS,GAAeH,EAAQ,EAAIM,GAAO,CACpC,CAAC,EAEDZ,EAAoB,iBAAiB,UAAYd,GAAqB,CAChEA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,KAAOA,EAAE,MAAQ,aAClDA,EAAE,eAAe,EACZuB,IAAcG,GAAO,IACjB1B,EAAE,MAAQ,UAAYA,EAAE,MAAQ,QACzCoB,EAAQ,CAEZ,CAAC,EAED,IAAMU,EAAoB1C,EAAG,MAAO,CAAE,MAAOJ,EAAY,KAAM,OAAQ,CAAC,EAExEwC,GAAa,YAAYf,EAAQ,EACjCe,GAAa,YAAYV,CAAmB,EAC5CU,GAAa,YAAYT,CAAY,EACrCS,GAAa,YAAYM,CAAiB,EAG1C,IAAMC,EAAe3C,EAAG,MAAO,CAC7B,KAAM,QACN,MAAO,CACL,MAAO,UACP,SAAU,OACV,UAAW,OACX,QAAS,OACT,aAAc,MACd,OAAQ,oBACR,gBAAiB,UACjB,UAAW,SACX,QAAS,MACX,CACF,CAAC,EAEK4C,GAAkB5C,EAAG,MAAO,CAChC,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,MAAO,CACjE,EAAGe,EAAWK,GAAcgB,EAAY,EAElCS,GAAgB7C,EAAG,MAAO,CAC9B,MAAO,CAAE,GAAGC,EAAO,cAAe,SAAU,UAAW,MAAOZ,EAAW,WAAYI,CAAK,CAC5F,EAAGY,EAAUI,EAAYmC,GAAiBD,CAAY,EAGhDG,GAAU,CACd,GAAG7C,EAAO,OACV,SAAUnB,EAAW,OAAS,OAC9B,QAASA,EAAW,YAAc,UACpC,EAEMiE,GAAY/C,EAAG,SAAU,CAC7B,MAAO,CACL,GAAG8C,GACH,GAAG7C,EAAO,aACV,gBAAiBpB,EAAO,SACxB,MAAOA,EAAO,WACd,aAAcA,EAAO,YACvB,EACA,KAAM,SACN,SAAUG,EACV,aAAcA,EAAe,8BAAgC,mCAC7D,QAASC,CACX,CAAC,EACD8D,GAAU,YAAc/D,EAAe,eAAiB,wBAExD,IAAMgE,GAAYhD,EAAG,SAAU,CAC7B,MAAO,CACL,GAAG8C,GACH,GAAG7C,EAAO,aACV,gBAAiBpB,EAAO,UACxB,MAAOA,EAAO,YACd,YAAaA,EAAO,cACpB,aAAcA,EAAO,YACvB,EACA,KAAM,SACN,aAAc,SACd,QAASK,CACX,CAAC,EACD8D,GAAU,YAAc,SAExB,IAAMC,GAAgBjD,EAAG,MAAO,CAC9B,MAAO,CAAE,GAAGC,EAAO,cAAe,WAAY,OAAQ,MAAOZ,EAAW,WAAYI,CAAK,CAC3F,EAAGsD,GAAWC,EAAS,EAKvB,MAAO,CACL,UAHgBhD,EAAG,MAAO,CAAE,MAAO,CAAE,GAAGC,EAAO,QAAS,SAAU,SAAU,CAAE,EAAGG,EAAYyC,GAAeI,EAAa,EAIzH,UAAAtC,EACA,aAAAM,EACA,oBAAAS,EACA,UAAAZ,EACA,aAAAK,GACA,kBAAAuB,EACA,UAAAK,GACA,aAAAJ,CACF,CACF,CAEO,SAASO,GAAqBC,EAAgD,CACnF,IAAMC,EAAiC,CAAC,EACxC,OAAKD,EAAK,aAAa,KAAK,IAAGC,EAAO,aAAe,6BAChDD,EAAK,gBAAgB,KAAK,IAAGC,EAAO,gBAAkB,gCACtDD,EAAK,qBAAqB,KAAK,IAAGC,EAAO,qBAAuB,wCAC9DA,CACT,CC/cO,SAASC,GACdC,EACAC,EACQ,CACR,OAAQD,EAAW,CACjB,IAAK,oBACH,MAAO,0FACT,IAAK,eACH,MAAO,oEACT,IAAK,yBACH,MAAO,sEACT,IAAK,eACH,MAAO,qEACT,IAAK,kBACH,MAAO,sDACT,QACE,OAAOC,GAAiB,wCAC5B,CACF,CAEO,SAASC,GAAyBC,EAcd,CACzB,GAAM,CACJ,SAAAC,EAAU,OAAAC,EAAQ,SAAAC,EAAU,QAAAC,EAC5B,aAAAC,EAAc,UAAAC,EAAW,WAAAC,EAAY,oBAAAC,EACrC,MAAAC,EAAO,UAAAZ,EAAW,SAAAa,EAClB,WAAAC,EAAY,OAAAC,CACd,EAAIZ,EAEEa,GAAeZ,GAAA,YAAAA,EAAU,eAAgB,UACzCa,EAAYZ,EAAO,KACnBa,EAAOb,EAAO,KACdc,EAAcd,EAAO,SAGrBe,EAAOC,EAAG,MAAO,CAAE,IAAKd,EAAS,MAAOe,EAAO,KAAM,IAAK,MAAO,CAAC,EAClEC,EAAQF,EAAG,KAAM,CACrB,GAAI,qBACJ,MAAO,CACL,GAAGC,EAAO,MACV,SAAU,OACV,WAAY,IACZ,MAAON,EACP,WAAYE,CACd,CACF,CAAC,EACDK,EAAM,YAAc,wBAEpB,IAAMC,EAAUH,EAAG,MAAO,CAAE,MAAOC,EAAO,OAAQ,EAAGF,EAAMG,CAAK,EAC1DE,EAAaJ,EAAG,MAAO,CAC3B,MAAO,CAAE,GAAGC,EAAO,WAAY,MAAOL,EAAW,WAAYC,CAAK,CACpE,EAAGM,CAAO,EAGJE,EAAgBL,EAAG,MAAO,CAC9B,MAAO,CACL,GAAGC,EAAO,cACV,MAAOL,EACP,WAAYC,EACZ,UAAW,QACb,CACF,CAAC,EAED,GAAIR,GAAc,CAACE,EAAO,CAExB,IAAMe,EAAgBN,EAAG,MAAO,CAC9B,MAAO,CACL,MAAO,OACP,OAAQ,OACR,aAAc,MACd,gBAAiB,UACjB,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,CACF,CAAC,EACKO,EAAWC,EACf,MACA,CACE,MAAO,KAAM,OAAQ,KAAM,QAAS,YACpC,KAAM,OAAQ,OAAQ,UAAW,eAAgB,IACjD,iBAAkB,QAAS,kBAAmB,OAChD,EACAA,EAAI,WAAY,CAAE,OAAQ,gBAAiB,CAAC,CAC9C,EACAF,EAAc,YAAYC,CAAQ,EAElC,IAAME,EAAcT,EAAG,IAAK,CAC1B,MAAO,CACL,MAAOL,EACP,WAAYE,EACZ,SAAU,OACV,WAAY,IACZ,WAAY,MACZ,UAAW,OACX,aAAc,MAChB,CACF,CAAC,EACDY,EAAY,YAAc,yBAE1B,IAAMC,GAAUV,EAAG,MAAO,CACxB,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,KAAM,GACR,CACF,EAAGM,EAAeG,CAAW,EAC7BJ,EAAc,YAAYK,EAAO,CAEnC,UAAYvB,GAAgBC,IAAc,CAACG,EAAO,CAEhD,IAAMoB,EAAUX,EAAG,MAAO,CACxB,MAAO,CACL,MAAO,OACP,OAAQ,OACR,OAAQ,oBACR,eAAgBF,EAChB,aAAc,MACd,UAAW,0BACX,OAAQ,WACV,CACF,CAAC,EAEKc,EAAYZ,EAAG,MAAO,CAC1B,MAAO,CACL,MAAO,UACP,SAAU,OACV,UAAW,OACX,QAAS,OACT,aAAc,MACd,OAAQ,oBACR,gBAAiB,UACjB,UAAW,QACb,CACF,CAAC,EACDY,EAAU,YAAczB,EACpB,qCACA,6HAEJkB,EAAc,YAAYM,CAAO,EACjCN,EAAc,YAAYO,CAAS,CACrC,CAEA,GAAIrB,EAAO,CAET,IAAMsB,EAAcb,EAAG,MAAO,CAC5B,MAAO,CACL,MAAO,OACP,OAAQ,OACR,aAAc,MACd,gBAAiB,UACjB,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,OAAQ,WACV,CACF,CAAC,EACKc,EAAON,EACX,MACA,CACE,MAAO,KAAM,OAAQ,KAAM,QAAS,YACpC,KAAM,OAAQ,OAAQ,UAAW,eAAgB,IACjD,iBAAkB,QAAS,kBAAmB,OAChD,EACAA,EAAI,OAAQ,CAAE,GAAI,KAAM,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,CAAC,EACpDA,EAAI,OAAQ,CAAE,GAAI,IAAK,GAAI,IAAK,GAAI,KAAM,GAAI,IAAK,CAAC,CACtD,EACAK,EAAY,YAAYC,CAAI,EAE5B,IAAMC,EAAaf,EAAG,IAAK,CACzB,MAAO,CACL,GAAGC,EAAO,YACV,MAAOL,EACP,WAAYC,EACZ,SAAU,OACV,WAAY,MACZ,aAAc,MAChB,CACF,CAAC,EACDkB,EAAW,YAAc,sBAEzB,IAAMC,GAAWhB,EAAG,MAAO,CACzB,MAAO,CACL,MAAO,UACP,SAAU,OACV,UAAW,OACX,QAAS,OACT,aAAc,MACd,OAAQ,oBACR,gBAAiB,UACjB,UAAW,QACb,CACF,CAAC,EACDgB,GAAS,YAAczB,EAEvBc,EAAc,YAAYQ,CAAW,EACrCR,EAAc,YAAYU,CAAU,EACpCV,EAAc,YAAYW,EAAQ,CACpC,CAGA,IAAMC,EAAU,CACd,GAAGhB,EAAO,OACV,SAAUhB,EAAW,OAAS,OAC9B,QAASA,EAAW,YAAc,UACpC,EAEMiC,EAAgBlB,EAAG,MAAO,CAC9B,MAAO,CACL,GAAGC,EAAO,cACV,WAAY,OACZ,QAAS,OACT,IAAK,OACL,eAAgB,SAChB,MAAOL,EACP,WAAYC,CACd,CACF,CAAC,EAEKsB,EAAiB,CACrB,gBAAiBnC,EAAO,SACxB,MAAOA,EAAO,WACd,aAAcA,EAAO,YACvB,EACMoC,EAAkB,CACtB,gBAAiBpC,EAAO,UACxB,MAAOA,EAAO,YACd,YAAaA,EAAO,cACpB,aAAcA,EAAO,YACvB,EAGA,GAAI,CAACM,EACH,GAAID,GAAc,CAACE,EAAO,CACxB,IAAM8B,EAAcrB,EAAG,SAAU,CAC/B,MAAO,CAAE,GAAGiB,EAAS,GAAGE,CAAe,EACvC,KAAM,SACN,aAAc,2BACd,QAAS1B,CACX,CAAC,EACD4B,EAAY,YAAc,WAC1BH,EAAc,YAAYG,CAAW,CACvC,SAAW9B,GAASC,EAAU,CAC5B,IAAM8B,EAAWtB,EAAG,SAAU,CAC5B,MAAO,CAAE,GAAGiB,EAAS,GAAGhB,EAAO,aAAc,GAAGkB,CAAe,EAC/D,KAAM,SACN,aAAcxC,IAAc,oBAAsB,0BAA4B,yBAC9E,QAAS,IAAMe,EAAOf,IAAc,mBAAmB,CACzD,CAAC,EACD2C,EAAS,YAAc3C,IAAc,oBAAsB,kBAAoB,YAC/EuC,EAAc,YAAYI,CAAQ,CACpC,SAAW/B,EAAO,CAChB,IAAMgC,EAAYvB,EAAG,SAAU,CAC7B,MAAO,CAAE,GAAGiB,EAAS,GAAGhB,EAAO,aAAc,GAAGmB,CAAgB,EAChE,KAAM,SACN,aAAc,UACd,QAAS,IAAM1B,EAAO,EAAK,CAC7B,CAAC,EACD6B,EAAU,YAAc,UACxBL,EAAc,YAAYK,CAAS,CACrC,KAAO,CAEL,IAAMC,EAAYxB,EAAG,SAAU,CAC7B,MAAO,CAAE,GAAGiB,EAAS,GAAGhB,EAAO,aAAc,GAAGmB,CAAgB,EAChE,KAAM,SACN,aAAc,sBACd,QAAS,IAAM1B,EAAO,EAAK,CAC7B,CAAC,EACD8B,EAAU,YAAc,SACxBN,EAAc,YAAYM,CAAS,CACrC,CAMF,MAAO,CAAE,UAFSxB,EAAG,MAAO,CAAE,MAAOC,EAAO,OAAQ,EAAGG,EAAYC,EAAea,CAAa,CAE5E,CACrB,CCxRA,IAAMO,GAAW,CAACC,EAAoCC,IACpDD,IAAU,OAAYC,EAAW,OAAOD,CAAK,EAOxC,SAASE,GAAeC,EAAiC,CAC9D,GAAM,CAAE,UAAAC,EAAW,eAAAC,EAAgB,QAAAC,EAAS,KAAAC,CAAK,EAAIJ,EAAK,QAC1D,MAAO,CACL,SAAUJ,GAASK,EAAU,gBAAiBD,EAAK,WAAW,EAC9D,WAAYJ,GAASK,EAAU,MAAO,SAAS,EAC/C,iBAAkBL,GAASM,EAAe,gBAAiB,SAAS,EACpE,mBAAoBN,GAASM,EAAe,MAAOF,EAAK,WAAW,EACnE,qBAAsBJ,GAASM,EAAe,YAAaF,EAAK,WAAW,EAC3E,UAAWJ,GAASO,EAAQ,gBAAiB,SAAS,EACtD,YAAaP,GAASO,EAAQ,MAAO,SAAS,EAC9C,cAAeP,GAASO,EAAQ,YAAa,SAAS,EACtD,KAAMH,EAAK,UACX,QAASA,EAAK,aACd,KAAMA,EAAK,UACX,KAAM,UACN,aAAcJ,GAASQ,EAAK,aAAc,KAAK,EAC/C,aAAcR,GAASK,EAAU,gBAAiBD,EAAK,WAAW,EAClE,eAAgBA,EAAK,SACvB,CACF,CCtBA,IAAMK,GAAUC,GACdC,EAAkBD,EAAI,YAAaA,EAAI,QAAQ,IAAI,EAExCE,GACX,CACEC,EACAC,IAIF,CAACC,EAAaC,IAAgB,CApChC,IAAAC,EAqCI,IAAMC,EAAaF,GACfC,EAAAH,GAAA,YAAAA,EAA2BE,KAA3B,YAAAC,EAA0CF,GAC1C,OACJ,OAAOG,GAAA,KAAAA,EAAcL,GAAA,YAAAA,EAAoBE,EAC3C,EAEWI,GAAgB,CAC3BC,EACAC,IACmB,CACnB,IAAMC,EAA4C,CAAC,EAC7CC,EAAgD,CAAC,EAEvD,OAAAH,EAAK,QAASV,GAAQ,CACpB,IAAMc,EAAWH,EAAYX,EAAI,QAAQ,KAAMA,EAAI,WAAW,EAC9DY,EAAiBb,GAAOC,CAAG,CAAC,EAAIc,EAAWA,EAAS,SAAW,GAC/Dd,EAAI,QAAQ,cAAc,QAASe,GAAY,CArDnD,IAAAR,EAAAS,EAAAC,EAsDMJ,EACEK,GAAelB,EAAI,QAAQ,KAAMe,EAAQ,KAAMf,EAAI,WAAW,CAChE,GAAIiB,GAAAD,GAAAT,EAAAO,GAAA,YAAAA,EAAU,gBAAV,YAAAP,EAA0BQ,EAAQ,QAAlC,YAAAC,EAAyC,WAAzC,KAAAC,EAAqD,EAC3D,CAAC,CACH,CAAC,EAEM,CAAE,iBAAAL,EAAkB,qBAAAC,CAAqB,CAClD,EAEaM,GACXT,GAEAA,EAAK,OAAO,CAACU,EAA8BpB,KACzCoB,EAAIrB,GAAOC,CAAG,CAAC,EAAI,GACZoB,GACN,CAAC,CAAC,EAEMC,GAA2B,CACtCC,EACAC,IAC4B,CAC5B,IAAMC,EAAgB,IAAI,IAAID,GAAA,KAAAA,EAAuB,CAAC,CAAC,EACjDE,EAAcH,EAAO,SAAW,EACtC,OAAOA,EAAO,OAAO,CAACF,EAA8BM,KAClDN,EAAIM,EAAM,QAAQ,IAAI,EACpB,CAACD,GAAe,CAACD,EAAc,IAAIE,EAAM,QAAQ,IAAI,EAChDN,GACN,CAAC,CAAC,CACP,EAEaO,GAAmB,CAC9BjB,EACAC,IAEAD,EAAK,OAAO,CAACU,EAA8BpB,IAAQ,CACjD,IAAMc,EAAWH,EAAYX,EAAI,QAAQ,KAAMA,EAAI,WAAW,EAC9D,OAAAoB,EAAIrB,GAAOC,CAAG,CAAC,GACbc,GAAA,YAAAA,EAAU,YAAa,KACtB,CAACA,EAAS,QAAUA,EAAS,SAAWc,KACzCd,EAAS,kBAAoB,GACxBM,CACT,EAAG,CAAC,CAAC,EAEMS,GAAiB,CAC5BnB,EACAoB,EACAnB,IAIG,CACH,IAAMoB,EAAcD,EAAW,CAAC,GAAGA,CAAQ,EAAI,OACzCE,EAAahC,GAAoB,CACrC,IAAMc,EAAWH,EAAYX,EAAI,QAAQ,KAAMA,EAAI,WAAW,EAC9D,OAAOc,GAAA,YAAAA,EAAU,YAAa,IAAQA,EAAS,kBAAoB,EACrE,EAEMmB,EAA6C,CAAC,EAC9CC,EAAgB,IAAI,IAC1BxB,EAAK,QAASV,GAAQ,CAjHxB,IAAAO,EAkHI,IAAM4B,EAAWC,GAAepC,EAAK+B,CAAW,EAChD,GAAI,CAACI,EAAU,OACfF,EAAkBlC,GAAOC,CAAG,CAAC,EAAIgC,EAAUhC,CAAG,EAC9C,IAAM0B,GAAQnB,EAAA2B,EAAc,IAAIC,CAAQ,IAA1B,KAAA5B,EAA+B,CAAC,EAC9CmB,EAAM,KAAK1B,CAAG,EACdkC,EAAc,IAAIC,EAAUT,CAAK,CACnC,CAAC,EAED,IAAMW,EAA6C,CAAC,EACpD,OAAAH,EAAc,QAAQ,CAACR,EAAOpB,IAAgB,CAC5C,IAAMgC,EAAYZ,EAAM,OAAQ1B,GAAQuC,GAAuBvC,EAAI,OAAO,CAAC,EACrEwC,EAAWF,EAAU,OAAS,EAAIA,EAAYZ,EACpDW,EAAkB/B,CAAW,EAAIkC,EAAS,MAAMR,CAAS,CAC3D,CAAC,EAEM,CAAE,kBAAAK,EAAmB,kBAAAJ,CAAkB,CAChD,EAEaQ,GAAmB,CAC9B/B,EACAC,IAEAD,EAAK,MAAOV,GAAQ,CAClB,IAAMc,EAAWH,EAAYX,EAAI,QAAQ,KAAMA,EAAI,WAAW,EAC9D,MAAO,GAAQc,GAAA,MAAAA,EAAU,UAAY,EAACA,GAAA,MAAAA,EAAU,iBAClD,CAAC,EAEU4B,GACXC,GACQ,CACR,IAAMC,EAAWD,EAAS,OAAOJ,EAAsB,EACvD,OAAOK,EAAS,OAAS,EAAIA,EAAW,CAAC,GAAGD,CAAQ,CACtD,EAEaE,GAAgB,CAC3BC,EACAxC,EACAM,IACmB,CACnB,IAAMmC,EAAM9C,EAAkBK,EAAawC,EAAQ,IAAI,EACjDE,EAAY,CAACpC,EAAiBmC,CAAG,EACjCE,EAASC,GAAmBJ,CAAO,EACnCjC,EAAgD,CAAC,EACvD,OAAAiC,EAAQ,cAAc,QAAS/B,GAAY,CACzCF,EAAqB,GAAGkC,CAAG,IAAIhC,EAAQ,IAAI,EAAE,EAC3CiC,GAAaC,EAAO,IAAIlC,EAAQ,IAAI,CACxC,CAAC,EACM,CAAE,iBAAkB,CAAE,CAACgC,CAAG,EAAGC,CAAU,EAAG,qBAAAnC,CAAqB,CACxE,EAEasC,GAAgB,CAC3BC,EACAC,EACAzC,EACA0C,IACmB,CACnB,IAAMN,EACJM,GAAA,KAAAA,EACA,CAACF,EAAgB,MACdN,GAAYlC,EAAiBX,EAAkBoD,EAAgBP,EAAQ,IAAI,CAAC,CAC/E,EACIS,EAA4C,CAAC,EAC7CC,EAA4C,CAAC,EACnD,OAAAJ,EAAgB,QAASN,GAAY,CACnC,IAAMC,EAAM9C,EAAkBoD,EAAgBP,EAAQ,IAAI,EAC1DS,EAAiBR,CAAG,EAAIC,EAExB,IAAMC,EAASC,GAAmBJ,CAAO,EACzCA,EAAQ,cAAc,QAAS/B,GAAY,CACzCyC,EAAiB,GAAGT,CAAG,IAAIhC,EAAQ,IAAI,EAAE,EACvCiC,GAAaC,EAAO,IAAIlC,EAAQ,IAAI,CACxC,CAAC,CACH,CAAC,EACM,CACL,iBAAkBwC,EAClB,qBAAsBC,CACxB,CACF,EAEaC,GAA6B,CACxCX,EACAxC,EACAO,IACY,CACZ,IAAMkC,EAAM9C,EAAkBK,EAAawC,EAAQ,IAAI,EACjDY,EAAmBZ,EAAQ,cAAc,OAAOa,EAAyB,EAC/E,OAAOD,EAAiB,OAAS,EAC7BA,EAAiB,MAAO3C,GAAYF,EAAqB,GAAGkC,CAAG,IAAIhC,EAAQ,IAAI,EAAE,CAAC,EAClF+B,EAAQ,cAAc,KAAM/B,GAAYF,EAAqB,GAAGkC,CAAG,IAAIhC,EAAQ,IAAI,EAAE,CAAC,CAC5F,EAEa6C,GAAiB,CAAC,CAC7B,SAAA9B,EACA,SAAAa,EACA,KAAAjC,EACA,iBAAAE,EACA,0BAAAiD,CACF,IAMsB,CACpB,GAAInD,EAAK,SAAW,EAAG,MAAO,CAAE,GAAI,GAAM,OAAQ,KAAM,SAAU,CAAC,CAAE,EAErE,IAAMqB,EAAcD,EAAW,CAAC,GAAGA,CAAQ,EAAI,OACzCgC,EAAc9D,GAAoB,EAAQY,EAAiBb,GAAOC,CAAG,CAAC,EACtE+D,EAAe/D,GACnB,EAAQ6D,EAA0B9D,GAAOC,CAAG,CAAC,EACzCgE,EAAehE,GAAoBuC,GAAuBvC,EAAI,OAAO,EACrEiE,EAAavC,GACjBA,EAAM,OAAOsC,CAAW,EAAE,MAAMF,CAAU,EACtCI,EAAWxC,GACfA,EAAM,KAAKoC,CAAU,GACrBpC,EAAM,KAAM1B,GAAQ8D,EAAW9D,CAAG,IAAM+D,EAAY/D,CAAG,CAAC,EAEpDkC,EAAgB,IAAI,IACpBiC,EAA2B,CAAC,EAelC,GAdAzD,EAAK,QAASV,GAAQ,CACpB,IAAMM,EAAc8B,GAAepC,EAAK+B,CAAW,EACnD,GAAIzB,IAAgB,OAAW,CAC7B6D,EAAW,KAAKnE,CAAG,EACnB,MACF,CACA,IAAM0B,EAAQQ,EAAc,IAAI5B,CAAW,EACvCoB,EACFA,EAAM,KAAK1B,CAAG,EAEdkC,EAAc,IAAI5B,EAAa,CAACN,CAAG,CAAC,CAExC,CAAC,EAEG,CAACoE,GAA6BrC,CAAW,EAAG,CAC9C,IAAMT,EAAS,CAAC,GAAGY,EAAc,OAAO,CAAC,EACrCiC,EAAW,OAAS,GAAG7C,EAAO,KAAK6C,CAAU,EAEjD,IAAME,EAD2B/C,EAAO,MAAOI,GAAUA,EAAM,KAAKsC,CAAW,CAAC,EACpC1C,EAAO,KAAK2C,CAAS,EAAIA,EAAUvD,CAAI,EAC7E4D,EAAW,CAAC,GAAGpC,EAAc,QAAQ,CAAC,EACzC,OAAO,CAAC,CAAC,CAAER,CAAK,IAAMwC,EAAQxC,CAAK,GAAK,CAACuC,EAAUvC,CAAK,CAAC,EACzD,IAAI,CAAC,CAACpB,CAAW,IAAMA,CAAW,EAC/BiE,EAAKF,GAAYC,EAAS,SAAW,EAC3C,MAAO,CACL,GAAAC,EACA,OAAQA,EACJ,KACAD,EAAS,OAAS,EAChB,qBACA,uBACN,SAAAA,CACF,CACF,CAEA,GAAIH,EAAW,OAAS,GAAKjC,EAAc,OAAS,EAAG,CACrD,IAAMqC,EAAKN,EAAUE,CAAU,EAC/B,MAAO,CAAE,GAAAI,EAAI,OAAQA,EAAK,KAAO,uBAAwB,SAAU,CAAC,CAAE,CACxE,CAEA,IAAMC,EAAQC,GAAkB1C,CAAW,EACrC2C,EAASC,GAAqB,CAAC,GAAGhC,CAAQ,CAAC,EAC3CiC,EAAe,CAAClD,EAAqBpB,IACzCoE,EACIhD,EAAM,OAAQ1B,GAAQ6E,GAAoB7E,EAAI,QAASM,CAAW,CAAC,EACnEoB,EAEAoD,EAAoB,CAAC,EAS3B,GARA5C,EAAc,QAAQ,CAACR,EAAOpB,IAAgB,CAC5C,GAAIkE,EAAM,IAAIlE,CAAW,EAAG,CAC1BwE,EAAQ,KAAKxE,CAAW,EACxB,MACF,CACI4D,EAAQU,EAAalD,EAAOpB,CAAW,CAAC,GAAGwE,EAAQ,KAAKxE,CAAW,CACzE,CAAC,EAEGwE,EAAQ,SAAW,EACrB,MAAO,CACL,GAAI,GACJ,OAAQpE,EAAK,KAAKoD,CAAU,EAAI,kBAAoB,iBACpD,SAAU,CAAC,CACb,EAGF,IAAMQ,EAAWQ,EAAQ,OACtBxE,GAAa,CAzSlB,IAAAC,EAySqB,OAAC0D,GAAU1D,EAAA2B,EAAc,IAAI5B,CAAW,IAA7B,KAAAC,EAAkC,CAAC,CAAC,EAClE,EAEA,MAAO,CACL,GAAI+D,EAAS,SAAW,EACxB,OAAQA,EAAS,SAAW,EAAI,KAAO,qBACvC,SAAAA,CACF,CACF,EAEaS,GAAc,CACzBC,EACAlD,EACAmD,EACAC,EAAiCC,KACf,CAClB,GAAIH,EAAQ,IAAMA,EAAQ,SAAW,KAAM,OAAO,KAClD,GAAIA,EAAQ,SAAW,qBACrB,OAAOE,EAAKF,EAAQ,MAAM,EAE5B,IAAMI,EAAS,IAAI,KAAKtD,GAAA,KAAAA,EAAY,CAAC,GAAG,IAAKuD,GAAY,CAACA,EAAQ,KAAMA,CAAO,CAAC,CAAC,EAC3EC,EAAQN,EAAQ,SAAS,IAAKO,GAAS,CAC3C,IAAMF,EAAUD,EAAO,IAAIG,CAAI,EAC/B,OAAOF,EAAUJ,EAAYI,CAAO,EAAIE,CAC1C,CAAC,EACD,OAAOL,EAAK,mBAAmBI,CAAK,CACtC,EAEaE,GAAqB,CAChC9E,EACA+E,IAEA/E,EAAK,IAAI,CAAC,CAAE,QAAAoC,EAAS,YAAAxC,CAAY,IAAM,CACrC,IAAMyC,EAAM9C,EAAkBK,EAAawC,EAAQ,IAAI,EACvD,MAAO,CACL,GAAGA,EACH,GAAIxC,EAAc,CAAE,aAAcA,CAAY,EAAI,CAAC,EACnD,SAAUmF,EAAU,iBAAiB1C,CAAG,GAAK,GAC7C,cAAeD,EAAQ,cAAc,IAAK/B,IAAa,CACrD,GAAGA,EACH,SAAU0E,EAAU,qBAAqB,GAAG1C,CAAG,IAAIhC,EAAQ,IAAI,EAAE,GAAK,EACxE,EAAE,CACJ,CACF,CAAC,ECzTI,IAAM2E,GACXC,GAEAC,GAAkBD,EAAO,SAAUA,EAAO,SAAUA,EAAO,qBAAqB,EAErEE,GACXF,GACGG,GAAuBH,EAAO,SAAUA,EAAO,SAAUA,EAAO,qBAAqB,EAE7EI,GAAmB,CAA0B,CACxD,OAAAJ,EACA,kBAAAK,EACA,yBAAAC,EACA,oBAAAC,EACA,0BAAAC,CACF,IAA2C,CACzC,IAAMC,EAAOV,GAAOC,CAAM,EACpBU,EAAcC,GAAwBN,EAAmBC,CAAwB,EACjFM,EAAY,GAAQP,GAAqBC,GACzCO,EAAUD,EACZE,GAAeL,EAAMT,EAAO,SAAUU,CAAW,EACjD,CAAE,kBAAmB,CAAC,EAAG,kBAAmB,CAAC,CAAE,EAE7CK,EAAuB,CAC3B,kBAAmBC,GAAyBd,GAASF,CAAM,EAAGO,CAAmB,EACjF,0BAA2BU,GAAiBR,EAAMC,CAAW,EAC7D,kBAAmBG,EAAQ,kBAC3B,kBAAmBA,EAAQ,iBAC7B,EACA,GAAI,CAACK,GAAelB,EAAO,QAAQ,EAAG,OAAOe,EAE7C,IAAMI,EAASC,GAAcX,EAAMC,CAAW,EAC9C,MAAO,CACL,GAAGK,EACH,kBAAmBM,GAAiBZ,CAAI,EACxC,iBAAkBU,EAAO,iBACzB,qBAAsBA,EAAO,qBAC7B,6BAA8BA,EAAO,qBACrC,qBAAsBnB,EAAO,SAC7B,yBAA0B,CAAC,EAC3B,2BAA4B,GAC1BQ,GACEI,GACAH,EAAK,OAAS,GACda,GAAiBb,EAAMC,CAAW,EAExC,CACF,EAEaa,GAAoB,CAC/BC,EACAC,IACwB,CACxB,IAAMC,EAAOF,EAAW,CAAC,GAAGA,CAAQ,EAAI,OACxC,GAAKG,GAA6BD,CAAI,EACtC,OAAOE,GAAkBF,CAAI,EAAE,IAAID,CAAW,CAChD,EAEaI,GAAuB,CAClC7B,EACA8B,EACAC,IAEAC,GAAe,CACb,SAAUhC,EAAO,SACjB,SAAUA,EAAO,SACjB,KAAMD,GAAOC,CAAM,EACnB,iBAAA8B,EACA,0BAAAC,CACF,CAAC,EC3EH,IAAME,GAAe,gBACfC,GAAiB,eAEjBC,GAAe,CACnBC,EACAC,EACAC,IACG,CACH,IAAMC,EAAgBH,EAAY,OAC/BI,GAAYF,EAAiBG,EAAkBJ,EAAgBG,EAAQ,IAAI,CAAC,CAC/E,EAAE,OACF,MAAO,CACL,YAAaJ,EAAY,OAAS,GAAKG,IAAkBH,EAAY,OACrE,aAAcG,EAAgB,CAChC,CACF,EAOMG,GAAgB,CACpBC,EACAC,IACY,CAACA,GAAeD,EAAM,cAAgB,CAACA,EAAM,YAEpD,SAASE,GAAqBC,EAAoD,CAhDzF,IAAAC,EAAAC,EAiDE,GAAM,CACJ,QAAAC,EACA,SAAAC,EACA,eAAAb,EACA,iBAAAC,EACA,UAAAa,EACA,OAAAC,EACA,WAAAC,EACA,kBAAAC,EACA,iBAAAC,EACA,eAAAC,CACF,EAAIV,EACEW,GAAOV,EAAAD,EAAQ,OAAR,KAAAC,EAAgBW,GACvBC,EAASF,EAAK,OAEdG,EAAON,EAAkB,gBAAiBL,EAAQ,KAAMA,EAAQ,IAAI,EACpEY,EAAeJ,EAAK,aACpBrB,EAAc0B,GAAmBZ,CAAQ,EAGzCN,EAAca,EAAK,eAAiBA,EAAK,mBAAqB,WAE9DM,EAAUC,EACd,MACA,CACE,MAAO,IACP,OAAQ,KACR,QAAS,WACT,KAAM,OACN,MAAO,6BACP,OAAQH,EACR,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,QACnB,MAAO,CACL,UAAWV,EAAYjB,GAAiBD,GACxC,WAAY,qBACd,EACA,cAAe,MACjB,EACA+B,EAAI,OAAQ,CAAE,EAAG,eAAgB,CAAC,CACpC,EAKMC,EAAiBC,EACrB,SACA,CACE,KAAM,SACN,MAAOP,EAAc,cACrB,gBAAiB,OAAO,CAACR,CAAS,EAClC,gBAAiB,WAAWF,EAAQ,IAAI,GACxC,kBAAmB,gBAAgBA,EAAQ,IAAI,GAC/C,QAAS,IAAMM,EAAiBN,EAAQ,IAAI,CAC9C,EACAiB,EACE,MACA,CAAE,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,WAAY,KAAM,CAAE,EAChGH,CACF,CACF,EAEMI,EAAQD,EAAG,KAAM,CACrB,GAAI,gBAAgBjB,EAAQ,IAAI,GAChC,MAAO,CACL,GAAGU,EAAO,aACV,GAAGF,EAAK,WAAW,YACnB,MAAOI,CACT,CACF,CAAC,EACDM,EAAM,YAAcP,EAGhBP,GACFc,EAAM,YAAYC,GAAqB,CAAC,EAG1C,IAAMzB,EAAQR,GAAaC,EAAaC,EAAgBC,CAAgB,EAClE+B,EAAYC,GAAuB,CACvC,QAASb,EAAK,iBACd,QAASd,EAAM,YACf,cAAeD,GAAcC,EAAOC,CAAW,EAC/C,SAAW2B,GAASf,EAAeP,EAAQ,KAAMsB,CAAI,EACrD,MACEnC,EAAY,OAASc,EAAS,OAC1BsB,GAAqB,eAAeZ,EAAMxB,EAAY,MAAM,EAC5DoC,GAAqB,gBAAgBZ,EAAMxB,EAAY,MAAM,EACnE,UAAW,mBAAmBa,EAAQ,IAAI,GAC1C,KAAM,QACN,OAAAG,EACA,YAAaoB,GAAqB,QAAQZ,CAAI,EAC9C,SAAUH,EAAK,SACf,KAAMA,EAAK,WACb,CAAC,EAMKgB,EAAUP,EACd,MACA,CACE,MAAO,CAAE,GAAGP,EAAO,oBAAqB,OAAQ,SAAU,EAC1D,QAAS,IAAMJ,EAAiBN,EAAQ,IAAI,CAC9C,EACAkB,CACF,EAEMO,EAASR,EACb,MACA,CAAE,GAAGS,EAAK,SAAS,EAAG,MAAOhB,EAAO,aAAc,EAClDO,EAAG,MAAO,CAAE,MAAOP,EAAO,UAAW,EAAGM,EAAgBQ,CAAO,EAC/DJ,EAAU,OACZ,EAEMO,EAAOV,EAAG,MAAO,CAAE,GAAI,WAAWjB,EAAQ,IAAI,GAAI,MAAOU,EAAO,WAAY,CAAC,EACnF,OAAAiB,EAAK,OAASzB,EAEP,CACL,YAAaF,EAAQ,KACrB,eAAAZ,EACA,YAAAD,EACA,YAAAQ,EACA,UAAWsB,EAAG,MAAO,CAAE,WAAWlB,EAAAS,EAAK,eAAL,KAAAT,EAAqB,IAAK,EAAG0B,EAAQE,CAAI,EAC3E,KAAAA,EACA,eAAAX,EACA,QAAAF,EACA,QAASX,EAAS,KAAOiB,CAC3B,CACF,CAEO,SAASQ,GAAoB/B,EAIlC,CAzLF,IAAAC,EAAAC,EAAA8B,EA0LE,IAAMrB,GAAOV,EAAAD,EAAQ,OAAR,KAAAC,EAAgBW,GACvBqB,GAAY/B,EAAAF,EAAQ,OAAR,KAAAE,EAAgBkB,EAAG,MAAO,CAAE,MAAOT,EAAK,OAAO,gBAAiB,CAAC,EAC7EuB,EAAiC,CAAC,EAClCC,EAA4B,CAAC,EAEnC,QAAWC,KAASpC,EAAQ,OAAQ,CAClC,IAAMqC,EAAcD,EAAM,QAAQ,KAC5BE,EAAUvC,GAAqB,CACnC,QAASqC,EAAM,QACf,SAAUA,EAAM,SAChB,eAAgBC,EAChB,iBAAkBrC,EAAQ,iBAC1B,UAAWA,EAAQ,kBAAkBqC,CAAW,GAAK,GACrD,QAAQL,EAAAhC,EAAQ,kBAAkBqC,CAAW,IAArC,KAAAL,EAA0C,GAClD,WAAYO,GAAkBvC,EAAQ,SAAUqC,CAAW,EAC3D,KAAA1B,EACA,kBAAmBX,EAAQ,kBAC3B,iBAAkBA,EAAQ,iBAC1B,eAAgBA,EAAQ,cAC1B,CAAC,EACKwC,EAAOC,GAAoBL,EAAM,SAAU,CAC/C,iBAAkBpC,EAAQ,iBAC1B,kBAAmBA,EAAQ,kBAC3B,qBAAsBA,EAAQ,qBAC9B,6BAA8BA,EAAQ,6BACtC,gBAAiBA,EAAQ,gBACzB,KAAAW,EACA,mBAAoB,GACpB,YAAA0B,EACA,KAAMC,EAAQ,KACd,YAAcI,GAAa,CAxNjC,IAAAzC,EAyNQ,OAAAA,EAAAD,EAAQ,kBAAkBL,EAAkB0C,EAAaK,CAAW,CAAC,IAArE,KAAAzC,EAA0E,IAC5E,kBAAmBD,EAAQ,kBAC3B,gBAAiBA,EAAQ,gBACzB,kBAAmBA,EAAQ,kBAC3B,oBAAqBA,EAAQ,mBAC/B,CAAC,EACDiC,EAAU,YAAYK,EAAQ,SAAS,EACvCJ,EAAS,KAAKI,CAAO,EACrBH,EAAM,KAAKK,CAAI,CACjB,CAEA,MAAO,CAAE,UAAAP,EAAW,YAAaU,GAAiBV,EAAWE,CAAK,EAAG,SAAAD,CAAS,CAChF,CAEO,SAASU,GACdC,EACArD,EACAa,EACM,CA3OR,IAAAJ,EA4OE,GAAI4C,EAAK,QAAS,CAChB,IAAMhD,EAAQR,GAAawD,EAAK,YAAaA,EAAK,eAAgBrD,CAAgB,EAClFqD,EAAK,QAAQ,WAAWhD,EAAM,YAAaD,GAAcC,GAAOI,EAAA4C,EAAK,cAAL,KAAA5C,EAAoB,EAAK,CAAC,CAC5F,CACA4C,EAAK,KAAK,OAASxC,EACnBwC,EAAK,eAAe,aAAa,gBAAiB,OAAO,CAACxC,CAAS,CAAC,EACnEwC,EAAK,QAAmC,MAAM,UAAYxC,EACvDjB,GACAD,EACN,CAEO,SAASwD,GACdV,EACAE,EACkB,CAClB,IAAMW,EAAYC,GAChB,IAAI,IAAeZ,EAAM,QAASU,GAAS,CAAC,GAAGE,EAAKF,CAAI,CAAC,CAAC,CAAC,EAC7D,MAAO,CACL,UAAAZ,EACA,gBAAiBa,EAAOD,GAASA,EAAK,eAAe,EACrD,gBAAiBC,EAAOD,GAASA,EAAK,eAAe,EACrD,gBAAiBC,EAAOD,GAASA,EAAK,eAAe,EACrD,sBAAuBC,EAAOD,GAASA,EAAK,qBAAqB,EACjE,SAAUC,EAAOD,GAASA,EAAK,QAAQ,EACvC,cAAeC,EAAOD,GAASA,EAAK,aAAa,EACjD,oBAAqBC,EAAOD,GAASA,EAAK,mBAAmB,EAC7D,kBAAmBC,EAAOD,GAASA,EAAK,iBAAiB,CAC3D,CACF,CAEO,SAASG,GAAkBC,EAAkE,CAClG,OAAO7B,EAAG,IAAK,CAAE,GAAI8B,GAAiB,KAAM,SAAU,MAAOD,GAAA,KAAAA,EAASpC,EAAc,WAAY,CAAC,CACnG,CAEO,SAASsC,GACdC,EACAC,EACAC,EACAC,EACM,CAnRR,IAAAtD,EAoRE,GAAI,CAACsD,EAAM,CACTH,EAAO,OAAO,EACdE,GAAA,MAAAA,EAAiB,gBAAgB,oBACjC,MACF,CACAF,EAAO,YAAcG,EACjBH,EAAO,cAAgBC,KACzBpD,EAAAoD,EAAO,aAAP,MAAApD,EAAmB,aAAamD,EAAQC,IAE1CC,GAAA,MAAAA,EAAiB,aAAa,mBAAoBJ,GACpD,CCjRO,SAASM,GAAoBC,EAA8C,CAChF,OAAOA,IAAQ,UAAYA,IAAQ,QAAUA,EAAMC,EACrD,CAEO,SAASC,GAAeC,EAAgC,CAC7D,OAAOC,GAAsBD,CAAQ,CACvC,CCVO,IAAME,GAAmB,CAC9BC,EACAC,IACY,GAAQD,GAAA,MAAAA,EAAM,WAAa,CAACC,EAE7BC,GAAiB,CAACC,EAAiBC,KAC9C,MAAM,KAAK,CAAE,OAAAD,CAAO,EAAG,IAAM,EAAE,EAEpBE,GAAaC,GAA6BA,EAAO,KAAK,EAAE,EAExDC,GAAiBD,GAC5BA,EAAO,OAAS,GAAKA,EAAO,MAAOE,GAAU,UAAU,KAAKA,CAAK,CAAC,EAE9DC,GAAcC,GAA0BA,EAAM,QAAQ,UAAW,EAAE,EAEnEC,GAAY,CAACL,EAAkBM,EAAeJ,IAClDF,EAAO,IAAI,CAACO,EAAS,IAAO,IAAMD,EAAQJ,EAAQK,CAAQ,EAEtDC,GAAgB,CAACC,EAAcZ,IACnC,MAAM,KAAK,CAAE,OAAAA,CAAO,EAAG,CAACa,EAAGC,IAAG,CA5BhC,IAAAC,EA4BmC,OAAAA,EAAAH,EAAKE,CAAC,IAAN,KAAAC,EAAW,GAAE,EAE1CC,GAAY,CAACC,EAAcC,IAC3B,CAACA,GAAYD,EAAK,SAAWC,EAAS,OAAS,EAC1CD,EAELA,EAAK,WAAWC,CAAQ,EACnBD,EAAK,MAAMC,EAAS,MAAM,EAE/BD,EAAK,SAASC,CAAQ,EACjBD,EAAK,MAAM,EAAGA,EAAK,OAASC,EAAS,MAAM,EAE7CD,EAGHE,GAAkB,CACtBP,EACAM,EACAlB,IAEI,CAACkB,GAAYN,EAAK,QAAUZ,EACvBY,EAELA,EAAK,WAAWM,CAAQ,EACnBN,EAAK,MAAMM,EAAS,MAAM,EAE/BN,EAAK,SAASM,CAAQ,EACjBN,EAAK,MAAM,EAAGA,EAAK,OAASM,EAAS,MAAM,EAE7CN,EAGIQ,GAAe,CAC1BjB,EACAM,EACAQ,IACoB,CAhEtB,IAAAF,EAiEE,IAAMf,EAASG,EAAO,OAChBe,GAAWH,EAAAZ,EAAOM,CAAK,IAAZ,KAAAM,EAAiB,GAElC,GAAIE,IAAS,GACX,MAAO,CAAE,OAAQT,GAAUL,EAAQM,EAAO,EAAE,EAAG,MAAO,IAAK,EAG7D,IAAMY,EAAQf,GAAWU,GAAUC,EAAMC,CAAQ,CAAC,EAClD,GAAI,CAACG,EACH,OAAO,KAGT,GAAIA,EAAM,SAAW,EACnB,MAAO,CACL,OAAQb,GAAUL,EAAQM,EAAOY,CAAK,EACtC,MAAOZ,EAAQ,EAAIT,EAASS,EAAQ,EAAI,IAC1C,EAGF,IAAMG,EAAOO,GAAgBE,EAAOH,EAAUlB,CAAM,EAAE,MAAM,EAAGA,CAAM,EACrE,MAAO,CACL,OAAQW,GAAcC,EAAMZ,CAAM,EAClC,MAAO,KAAK,IAAIY,EAAK,OAAQZ,EAAS,CAAC,CACzC,CACF,EAEasB,GAAoB,CAC/BnB,EACAM,IAEIN,EAAOM,CAAK,EACP,CAAE,OAAQD,GAAUL,EAAQM,EAAO,EAAE,EAAG,MAAO,IAAK,EAEzDA,GAAS,EACJ,CAAE,OAAAN,EAAQ,MAAO,IAAK,EAExB,CAAE,OAAQK,GAAUL,EAAQM,EAAQ,EAAG,EAAE,EAAG,MAAOA,EAAQ,CAAE,EAGhEc,GAAe,MACnB1B,EACAe,IAC6B,CAC7B,GAAI,CACF,IAAMY,EAAS,MAAM3B,EAAK,SAASe,CAAI,EACvC,OAAOY,GAAUA,EAAO,GAAKA,EAAS,CAAE,GAAI,GAAO,QAASA,GAAA,YAAAA,EAAQ,OAAQ,CAC9E,MAAQ,CACN,MAAO,CAAE,GAAI,EAAM,CACrB,CACF,EAEaC,GAAN,KAAqB,CAArB,cACL,KAAQ,SAAW,GACnB,KAAQ,YAAiC,KACzC,KAAQ,iBAAsC,KAC9C,KAAQ,cAAoC,OAC5C,KAAQ,QAAuB,CAC7B,OAAQ1B,GAAe,EACvB,KAAM,GACN,MAAO,IACT,EAEA,IAAI,UAAoB,CACtB,OAAO,KAAK,cAAgB,IAC9B,CAEA,IAAI,MAAoB,CACtB,OAAO,KAAK,OACd,CAGA,UAAUF,EAA2C,CACnD,OAAOD,GAAiBC,EAAM,KAAK,QAAQ,CAC7C,CAEA,KAAKA,EAAkC6B,EAA2B,CAChE,OAAI9B,GAAiBC,EAAM,KAAK,QAAQ,GACtC,KAAK,YAAc6B,EACnB,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,MAAO,IAAK,EACvC,KAET,KAAK,iBAAmB,KACjB,GACT,CAEA,UAAUvB,EAAwB,CAChC,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,OAAAA,CAAO,CAC3C,CAEA,MAAM,OACJN,EACA8B,EACAC,EACAC,EAAwBC,GAAc,OACpB,CA/JtB,IAAAf,EAAAgB,EAgKI,GACE,CAAClC,GACD,KAAK,cAAgB,MACrB,KAAK,QAAQ,MACb,CAACO,GAAc,KAAK,QAAQ,MAAM,EAElC,MAAO,GAGT,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,KAAM,GAAM,MAAO,IAAK,EAC1DwB,EAAO,EAEP,IAAMJ,EAAS,MAAMD,GAAa1B,EAAMK,GAAU,KAAK,QAAQ,MAAM,CAAC,EAEtE,GAAI,CAACsB,EAAO,GACV,YAAK,QAAU,CACb,OAAQzB,GAAe,EACvB,KAAM,GACN,OAAOgB,EAAAS,EAAO,UAAP,KAAAT,EAAkBc,CAC3B,EACO,GAGT,IAAMH,GAAOK,EAAA,KAAK,cAAL,KAAAA,EAAoB,WACjC,YAAK,SAAW,GAChB,KAAK,YAAc,KACnB,KAAK,QAAU,CAAE,OAAQhC,GAAe,EAAG,KAAM,GAAO,MAAO,IAAK,EACpE,KAAK,cAAgB4B,EACrB,KAAK,iBAAmBD,EACjB,EACT,CAEA,mBAA0B,CACxB,KAAK,iBAAmB,IAC1B,CAEA,kBAAkBC,EAA8C,CAC9D,GAAI,KAAK,mBAAqB,MAAQA,IAAU,KAAK,cACnD,OAAO,KAET,IAAMD,EAAO,KAAK,iBAClB,YAAK,iBAAmB,KACjBA,CACT,CACF,ECjMA,IAAMM,GAAa,CACjB,OAAQ,YACR,QAAS,OACT,OAAQ,oBACR,aAAc,MACd,WAAY,SACd,EAEMC,GAAa,CACjB,OAAQ,IACR,SAAU,OACV,WAAY,MACZ,MAAO,SACT,EAEMC,GAAmB,CACvB,OAAQ,aACR,SAAU,OACV,WAAY,MACZ,MAAO,SACT,EAEMC,GAAc,CAClB,QAAS,OACT,IAAK,MACL,eAAgB,eAClB,EAEMC,GAAa,CACjB,MAAO,OACP,SAAU,IACV,UAAW,aACX,QAAS,SACT,SAAU,OACV,WAAY,MACZ,UAAW,SACX,OAAQ,oBACR,aAAc,MACd,WAAY,SACd,EAEMC,GAAa,CACjB,OAAQ,UACR,SAAU,OACV,MAAO,SACT,EAEMC,GAAc,CAClB,MAAO,OACP,UAAW,OACX,aAAc,MACd,QAAS,WACT,SAAU,OACV,WAAY,OACZ,OAAQ,OACR,gBAAiB,UACjB,MAAO,UACP,OAAQ,UACR,UAAW,YACb,EAEO,SAASC,GACdC,EACkB,CA1EpB,IAAAC,EA2EE,IAAIC,EAAoBF,EAAQ,KAC1BG,EAA6B,CAAC,EAE9BC,GAAOH,EAAAD,EAAQ,SAAR,KAAAC,EAAkB,CAAC,EAC1BI,EAAUC,EAAG,IAAK,CACtB,KAAM,QACN,MAAO,CAAE,GAAGT,GAAY,GAAGO,EAAK,MAAO,QAAS,MAAO,CACzD,CAAC,EAEKG,EAAgBD,EAAG,SAAU,CACjC,KAAM,SACN,MAAO,CAAE,GAAGR,GAAa,GAAGM,EAAK,OAAQ,GAAGJ,EAAQ,WAAY,EAChE,QAAS,IAAM,CACTE,EAAK,MAAQ,CAACM,GAAcN,EAAK,MAAM,GAC3CF,EAAQ,UAAU,CACpB,CACF,CAAC,EAEKS,EAAQ,IAAM,CA7FtB,IAAAR,EAAAS,EA8FIP,EAAO,QAAQ,CAACQ,EAAOC,IAAU,CA9FrC,IAAAX,EA+FMU,EAAM,OAAQV,EAAAC,EAAK,OAAOU,CAAK,IAAjB,KAAAX,EAAsB,GACpCU,EAAM,SAAWT,EAAK,IACxB,CAAC,EACD,IAAMW,EAAUX,EAAK,MAAQ,CAACM,GAAcN,EAAK,MAAM,EACvDK,EAAc,SAAWM,EACzBN,EAAc,MAAM,QAAUM,EAAU,MAAQ,IAChDN,EAAc,MAAM,OAASM,EAAU,cAAgB,UACvDN,EAAc,YAAcL,EAAK,MAC7BD,EAAAD,EAAQ,iBAAR,KAAAC,EAA0Ba,GAAc,UACxCd,EAAQ,YACZK,EAAQ,aAAcK,EAAAR,EAAK,QAAL,KAAAQ,EAAc,GACpCL,EAAQ,MAAM,QAAUH,EAAK,MAAQ,QAAU,MACjD,EAEMa,EAAcH,GAAkB,CA7GxC,IAAAX,GA8GIA,EAAAE,EAAOS,CAAK,IAAZ,MAAAX,EAAe,OACjB,EAEMe,EAAcC,GAA2B,CAC7C,GAAI,CAACA,EAAO,CACVR,EAAM,EACN,MACF,CACAP,EAAO,CAAE,GAAGA,EAAM,OAAQe,EAAM,MAAO,EACvCR,EAAM,EACNT,EAAQ,eAAeiB,EAAM,MAAM,EAC/BA,EAAM,QAAU,MAAMF,EAAWE,EAAM,KAAK,CAClD,EAEMC,EAAWZ,EAAG,MAAO,CAAE,MAAO,CAAE,GAAGX,GAAa,GAAGS,EAAK,MAAO,CAAE,CAAC,EACxEF,EAAK,OAAO,QAAQ,CAACiB,EAAGP,IAAU,CAChC,IAAMD,EAAQL,EAAG,QAAS,CACxB,GAAI,oBAAoBM,CAAK,GAC7B,KAAM,OACN,UAAW,UACX,aAAcA,IAAU,EAAI,gBAAkB,MAC9C,aAAc,SAASA,EAAQ,CAAC,GAChC,MAAO,CAAE,GAAGhB,GAAY,GAAGQ,EAAK,KAAM,EACtC,QAAS,IAAMO,EAAM,OAAO,EAC5B,QAAS,IAAMK,EAAWI,GAAalB,EAAK,OAAQU,EAAOD,EAAM,KAAK,CAAC,EACvE,UAAYU,GAAyB,CAC/BA,EAAM,MAAQ,cAClBA,EAAM,eAAe,EACrBL,EAAWM,GAAkBpB,EAAK,OAAQU,CAAK,CAAC,EAClD,EACA,QAAUS,GAA0B,CA5I1C,IAAApB,EAAAS,EA6IQW,EAAM,eAAe,EACrB,IAAME,GAAOb,GAAAT,EAAAoB,EAAM,gBAAN,YAAApB,EAAqB,QAAQ,UAA7B,KAAAS,EAAwC,GACrDM,EAAWI,GAAalB,EAAK,OAAQU,EAAOW,CAAI,CAAC,CACnD,CACF,CAAC,EACDpB,EAAO,KAAKQ,CAAK,EACjBO,EAAS,YAAYP,CAAK,CAC5B,CAAC,EAED,IAAMa,EAAYlB,EAChB,MACA,CACE,GAAGmB,EAAK,KAAK,EACb,KAAM,QACN,kBAAmBC,GACnB,MAAO,CAAE,GAAGlC,GAAY,GAAGY,EAAK,KAAM,CACxC,EACAE,EAAG,KAAM,CAAE,GAAIoB,GAAmB,MAAO,CAAE,GAAGjC,GAAY,GAAGW,EAAK,KAAM,CAAE,EAAGJ,EAAQ,KAAK,EAC1FM,EAAG,IAAK,CAAE,MAAO,CAAE,GAAGZ,GAAkB,GAAGU,EAAK,WAAY,CAAE,EAAGJ,EAAQ,WAAW,EACpFkB,EACAb,EACAE,CACF,EAEA,OAAAE,EAAM,EAEC,CACL,UAAAe,EACA,OAASG,GAAsB,CAC7BzB,EAAOyB,EACPlB,EAAM,CACR,EACA,WAAAM,CACF,CACF,CAEO,SAASa,GAAeJ,EAA8B,CAC3DA,EAAU,aAAa,QAAS,EAAE,EAClCA,EAAU,aAAa,gBAAiB,MAAM,EAC9CA,EAAU,MAAM,cAAgB,OAChCA,EAAU,MAAM,QAAU,OAC1BA,EACG,iBACC,uBACF,EACC,QAASK,GAAY,CACpBA,EAAQ,SAAW,EACrB,CAAC,EACHL,EACG,iBAA8B,iBAAiB,EAC/C,QAASM,GAAW,CACnBA,EAAO,aAAa,WAAY,IAAI,EACpCA,EAAO,aAAa,gBAAiB,MAAM,CAC7C,CAAC,CACL,CCvLO,IAAMC,GACXC,GAC2B,CAd7B,IAAAC,EAeE,IAAMC,GAASD,EAAAD,EAAO,YAAP,KAAAC,EAAoBD,EAAO,cACpCG,EAA+C,CACnD,CAACC,GAAkB,OAAQF,CAAM,EACjC,CAACE,GAAkB,WAAYJ,EAAO,UAAU,EAChD,CAACI,GAAkB,KAAMJ,EAAO,WAAW,EAC3C,CAACK,EAAW,MAAOL,EAAO,UAAU,CACtC,EACA,MAAO,CACL,GAAG,OAAO,YACRG,EAAQ,OAAQG,GAAqCA,EAAM,CAAC,IAAM,MAAS,CAC7E,EACA,GAAGC,GAAqBP,CAAM,CAChC,CACF,EAOaQ,GAAoB,CAC/BC,EACAC,IACS,CACT,OAAW,CAACC,EAAMC,CAAK,IAAK,OAAO,QAAQF,CAAS,EAClDD,EAAQ,MAAM,YAAYE,EAAMC,CAAK,CAEzC,EC/BA,IAAMC,GAGF,CACF,aAAc,CAAE,MAAO,wBAAyB,OAAQ,wBAAyB,EACjF,kBAAmB,CACjB,MAAO,6BACP,OAAQ,6BACV,EACA,QAAS,CAAE,MAAO,sBAAuB,OAAQ,sBAAuB,CAC1E,EAEMC,GAAe,CACnB,SAAU,QACV,MAAO,IACP,IAAK,IACL,KAAM,IACN,MAAO,IACP,OAAQ,IACR,gBAAiB,yBACjB,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,QAAS,OACT,OAAQ,YACV,EAEMC,GAAa,CACjB,gBAAiB,UACjB,aAAc,OACd,QAAS,OACT,SAAU,QACV,MAAO,OACP,UAAW,qCACX,UAAW,YACb,EAEMC,GAAa,CACjB,OAAQ,UACR,SAAU,OACV,WAAY,OACZ,WAAY,MACZ,MAAO,SACT,EAEMC,GAAc,CAClB,OAAQ,WACR,SAAU,OACV,WAAY,OACZ,MAAO,SACT,EAEMC,GAAe,CACnB,QAAS,OACT,IAAK,OACL,eAAgB,UAClB,EAEMC,GAAc,CAClB,aAAc,MACd,QAAS,WACT,SAAU,OACV,WAAY,OACZ,OAAQ,UACR,OAAQ,oBACR,gBAAiB,UACjB,MAAO,SACT,EAEMC,GAAYC,GAA6C,CAhF/D,IAAAC,EAiFE,OAAAA,EAAAD,EAAK,gBAAL,KAAAC,EAAsB,SAAS,eAE1B,SAASC,GACdC,EACmB,CACnB,GAAM,CAAE,KAAAH,EAAM,OAAAI,EAAQ,UAAAC,EAAW,SAAAC,EAAU,aAAAC,EAAc,WAAAC,EAAY,KAAAC,CAAK,EACxEN,EACIO,EAAOC,GAAiBR,EAAQ,QAAQ,EACxCS,EAASb,GAASC,CAAI,EACxBa,EAAW,GAETC,EAAU,IAAM,CA5FxB,IAAAb,EA6FQY,IACJA,EAAW,GACX,SAAS,oBAAoB,UAAWE,EAAW,EAAI,GACvDd,EAAAe,EAAQ,aAAR,MAAAf,EAAoB,YAAYe,GAClC,EAEMC,EAAS,IAAM,CACnBH,EAAQ,EACRR,EAAS,EACLM,aAAkB,aAAaA,EAAO,MAAM,CAClD,EAEMM,EAAU,IAAM,CACpBJ,EAAQ,EACRT,EAAU,CACZ,EAEMc,EAAeC,EACnB,SACA,CAAE,KAAM,SAAU,MAAO,CAAE,GAAGtB,GAAa,GAAGW,GAAA,YAAAA,EAAM,MAAO,EAAG,QAASQ,CAAO,EAC9EP,EAAK,EACP,EAEMW,EAAgBD,EACpB,SACA,CACE,KAAM,SACN,MAAO,CAAE,GAAGtB,GAAa,GAAGW,GAAA,YAAAA,EAAM,OAAQ,GAAGF,CAAa,EAC1D,QAASW,CACX,EACAR,EAAK,GACP,EAEMY,EAAQF,EACZ,MACA,CACE,KAAM,SACN,GAAGG,EAAK,gBAAgB,EACxB,aAAc,OACd,kBAAmBC,GACnB,mBAAoBC,GACpB,MAAO,CAAE,GAAG/B,GAAY,GAAGe,GAAA,YAAAA,EAAM,KAAM,CACzC,EACAW,EACE,IACA,CAAE,GAAII,GAAmB,MAAO,CAAE,GAAG7B,GAAY,GAAGc,GAAA,YAAAA,EAAM,KAAM,CAAE,EAClEC,EAAKlB,GAAYY,CAAM,EAAE,KAAK,CAChC,EACAgB,EACE,IACA,CAAE,GAAIK,GAA0B,MAAO,CAAE,GAAG7B,GAAa,GAAGa,GAAA,YAAAA,EAAM,MAAO,CAAE,EAC3EC,EAAKlB,GAAYY,CAAM,EAAE,MAAM,CACjC,EACAgB,EAAG,MAAO,CAAE,MAAOvB,EAAa,EAAGsB,EAAcE,CAAa,CAChE,EAIML,EAAUI,EACd,MACA,CACE,GAAGjB,EAAQ,eACX,CAACuB,EAA0B,EAAG,GAC9B,MAAO,CAAE,GAAGjC,GAAc,GAAGgB,GAAA,YAAAA,EAAM,QAAS,WAAYD,GAAc,SAAU,CAClF,EACAc,CACF,EACInB,EAAQ,eAAewB,GAAkBX,EAASb,EAAQ,aAAa,EAE3E,SAASY,EAAUa,EAAsB,CACvC,GAAIA,EAAM,MAAQ,SAAU,CAC1BA,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACtBX,EAAO,EACP,MACF,CACA,GAAIW,EAAM,MAAQ,MAAO,OACzBA,EAAM,gBAAgB,EAEtB,IAAMC,EAAS9B,GAASC,CAAI,EAC5B,GAAI4B,EAAM,UAAYC,IAAWV,EAAc,CAC7CS,EAAM,eAAe,EACrBP,EAAc,MAAM,EACpB,MACF,CACA,GAAI,CAACO,EAAM,UAAYC,IAAWR,EAAe,CAC/CO,EAAM,eAAe,EACrBT,EAAa,MAAM,EACnB,MACF,CACIU,IAAWV,GAAgBU,IAAWR,IACxCO,EAAM,eAAe,EACrBT,EAAa,MAAM,EAEvB,CAEA,gBAAS,iBAAiB,UAAWJ,EAAW,EAAI,GACnDf,aAAgB,SAAWA,EAAK,KAAOA,GAAM,YAAYgB,CAAO,EACjEG,EAAa,MAAM,EAEZ,CAAE,QAASH,EAAS,QAAAF,CAAQ,CACrC,CC/LO,IAAMgB,GAAwB,CACnCC,EACAC,IAEKA,GAGGD,GAAA,KAAAA,EAAY,CAAC,GAAG,QAASE,GAAY,CAC3C,IAAMC,EAAMF,EAASC,EAAQ,IAAI,EACjC,OAAOC,EAAM,CAAC,CAAE,KAAMD,EAAQ,KAAM,KAAMA,EAAQ,KAAM,IAAAC,CAAI,CAAC,EAAI,CAAC,CACpE,CAAC,EALQ,CAAC,EAQCC,GAA6B,CACxCJ,EACAK,IACY,CAnBd,IAAAC,EAoBE,IAAMC,GAAeD,EAAAN,GAAA,YAAAA,EAAU,SAAV,KAAAM,EAAoB,EACzC,OAAID,EAAM,SAAW,GAAKE,IAAiB,EAClC,GAEFF,EAAM,OAASE,CACxB,ECtBO,SAASC,GAAwB,CACtC,MAAAC,EACA,MAAAC,EACA,UAAAC,CACF,EAA0C,CACxC,IAAMC,EAAOC,EACX,OACA,CAAE,GAAI,0BAA2B,EACjCA,EAAG,OAAQ,CAAE,GAAI,gCAAiC,EAAGJ,CAAK,EAC1D,GACF,EACA,OAAAC,EAAM,QAAQ,CAACI,EAAMC,IAAU,CACzBA,EAAQ,GAAGH,EAAK,YAAY,SAAS,eAAe,IAAI,CAAC,EAC7DA,EAAK,YACHC,EACE,IACA,CACE,GAAI,0BAA0BC,EAAK,IAAI,GACvC,KAAMA,EAAK,IACX,OAAQ,SACR,IAAK,sBACL,MAAOH,CACT,EACAG,EAAK,IACP,CACF,CACF,CAAC,EACMF,CACT,CCZO,IAAMI,GACXC,GAEAA,IAAQ,aAAeA,IAAQ,MAAQA,EAAMC,GAElCC,GACXC,GACkC,CA1BpC,IAAAC,EA2BE,OAAKD,EAGDA,EAAU,QAAUA,EAAU,SAAWE,GACpC,GAEF,OAAO,MAAKD,EAAAD,EAAU,gBAAV,KAAAC,EAA2B,CAAC,CAAC,EAAE,OAAS,EALlD,EAMX,EAEaE,GAAoB,CAC/BC,EACAC,IACmB,CACnB,GAAIA,IAAS,MACX,OAAOC,GACLF,EAAS,IAAKG,IAAa,CAAE,QAAAA,EAAS,YAAa,MAAU,EAAE,EAC/D,MACA,CAAE,iBAAkB,CAAC,EAAG,qBAAsB,CAAC,CAAE,CACnD,EAGF,IAAMC,EAA4C,CAAC,EAC7CC,EAAgD,CAAC,EAEvD,OAAAL,EAAS,QAASG,GAAY,CAC5B,IAAIG,EAAwB,GAC5BH,EAAQ,cAAc,QAASI,GAAY,CACzC,IAAMC,EACJP,IAAS,aAAeM,EAAQ,UAAYA,EAAQ,QACtDF,EAAqBI,GAAeN,EAAQ,KAAMI,EAAQ,IAAI,CAAC,EAC7DC,EACFF,EAAwBA,GAAyBE,CACnD,CAAC,EACDJ,EAAiBD,EAAQ,IAAI,EAAIG,CACnC,CAAC,EAEM,CAAE,iBAAAF,EAAkB,qBAAAC,CAAqB,CAClD,EAEaK,GAAmB,CAC9BV,EACAW,EACAC,IACqB,CACrB,IAAMC,EAAOd,GACXC,EACAR,GAA2BmB,CAAY,CACzC,EACMG,EAAa,CAACC,EAAqBC,IACvCrB,GAAwBiB,EAAYG,EAAaC,CAAW,CAAC,EAE/D,MAAO,CACL,QAAS,CAACD,EAAaC,IAAa,CA/ExC,IAAAnB,EAgFM,OAACiB,EAAWC,EAAaC,CAAW,KACnCnB,EAAAgB,EAAK,iBAAiBE,CAAW,IAAjC,KAAAlB,EAAsC,KACzC,YAAa,CAACkB,EAAaE,EAAaD,IAAa,CAlFzD,IAAAnB,EAmFM,OAACiB,EAAWC,EAAaC,CAAW,KACnCnB,EAAAgB,EAAK,qBAAqBJ,GAAeM,EAAaE,CAAW,CAAC,IAAlE,KAAApB,EACC,IACN,CACF,EAEaqB,GAAoB,CAC/BC,EACAR,EACAC,EACAQ,IACmB,CACnB,IAAMC,EAAUX,GACdS,EAAK,IAAKG,GAAQA,EAAI,OAAO,EAC7BX,EACAC,CACF,EACMR,EAAmB,CAAE,GAAGgB,EAAO,gBAAiB,EAChDf,EAAuB,CAAE,GAAGe,EAAO,oBAAqB,EAE9D,OAAAD,EAAK,QAAQ,CAAC,CAAE,QAAAhB,EAAS,YAAAa,CAAY,IAAM,CACrCrB,GAAwBiB,EAAYT,EAAQ,KAAMa,CAAW,CAAC,IAClEZ,EAAiBmB,EAAkBP,EAAab,EAAQ,IAAI,CAAC,EAC3DkB,EAAQ,QAAQlB,EAAQ,KAAMa,CAAW,EAC3Cb,EAAQ,cAAc,QAASI,GAAY,CACzCF,EAAqBI,GAAeN,EAAQ,KAAMI,EAAQ,KAAMS,CAAW,CAAC,EAC1EK,EAAQ,YAAYlB,EAAQ,KAAMI,EAAQ,KAAMS,CAAW,CAC/D,CAAC,EACH,CAAC,EAEM,CAAE,iBAAAZ,EAAkB,qBAAAC,CAAqB,CAClD,EAEamB,GAAqB,CAChCL,EACAP,IAEAO,EAAK,OAAO,CAACM,EAAkC,CAAE,QAAAtB,EAAS,YAAAa,CAAY,IAAM,CAC1E,IAAMpB,EAAYgB,EAAYT,EAAQ,KAAMa,CAAW,EACvD,OAAIrB,GAAwBC,CAAS,IACnC6B,EAAQF,EAAkBP,EAAab,EAAQ,IAAI,CAAC,EAClDP,EAAU,WAAa,IAEpB6B,CACT,EAAG,CAAC,CAAC,EAQMC,GAAsB,CACjCP,EACAR,IACmB,CACnB,IAAMP,EAA4C,CAAC,EAC7CC,EAAgD,CAAC,EAEvD,OAAAc,EAAK,QAAQ,CAAC,CAAE,QAAAhB,EAAS,YAAAa,CAAY,IAAM,CA9I7C,IAAAnB,EA+IIO,EAAiBmB,EAAkBP,EAAab,EAAQ,IAAI,CAAC,GAC3DN,EAAAc,EAAa,iBAAiBR,EAAQ,IAAI,IAA1C,KAAAN,EAA+C,GACjDM,EAAQ,cAAc,QAASI,GAAY,CAjJ/C,IAAAV,EAkJMQ,EAAqBI,GAAeN,EAAQ,KAAMI,EAAQ,KAAMS,CAAW,CAAC,GAC1EnB,EAAAc,EAAa,qBAAqBF,GAAeN,EAAQ,KAAMI,EAAQ,IAAI,CAAC,IAA5E,KAAAV,EAAiF,EACrF,CAAC,CACH,CAAC,EAEM,CAAE,iBAAAO,EAAkB,qBAAAC,CAAqB,CAClD,EC5IA,IAAMsB,GAAaC,GACjBC,GAAsB,KAAMC,GAAUA,EAAM,KAAOF,CAAE,EAEjDG,GAAqBC,GAA0B,CAfrD,IAAAC,EAAAC,EAgBE,GAAIF,EAAM,SAAS,GAAG,EACpB,OAAOA,EAET,IAAMG,EAASH,EAAM,QAAQI,GAAwB,EAAE,EAAE,KAAK,EAC9D,GAAI,CAACD,EACH,OAAOE,GAET,IAAMC,EAAUH,EAAO,YAAY,EACnC,OAAII,GAAkB,SAASD,CAAO,EAC7BA,GAEFJ,GAAAD,EAAAN,GAAUW,CAAO,IAAjB,YAAAL,EAAoB,QAApB,KAAAC,EAA6B,IAAIC,CAAM,IAAIK,EAA4B,EAChF,EAEMC,GACJC,GACgC,CAhClC,IAAAT,EAiCE,IAAMU,EAASD,GAAA,YAAAA,EAAgB,OAC/B,GAAKC,EAGL,OAAOV,EAAAN,GAAUgB,EAAO,YAAY,CAAC,IAA9B,KAAAV,EAAmCN,GAAUiB,EAAsB,CAC5E,EAEaC,GAA0B,CAAC,CACtC,SAAAC,EACA,WAAAC,CACF,IAAiC,CA3CjC,IAAAd,EAAAC,EA4CE,IAAMc,EAAOF,GAAA,YAAAA,EAAU,OACvB,OAAIE,EACKjB,GAAkBiB,CAAI,GAExBd,GAAAD,EAAAQ,GAAkBM,CAAU,IAA5B,YAAAd,EAA+B,QAA/B,KAAAC,EAAwCG,EACjD,EAEaY,GAA0BC,GAAsC,CAK3E,GAHEA,aAAgB,SACZA,EAAK,eAAeC,EAAoB,EACxCD,EAAK,cAAc,IAAIC,EAAoB,EAAE,EACrC,OAEd,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,GAAKD,GACXC,EAAM,YAAcC,IACnBH,aAAgB,SAAWA,EAAK,KAAOA,GAAM,YAAYE,CAAK,CACjE,EC1DO,IAAME,GAAkB,CAAC,QAAS,KAAK,EAWxCC,GAAgD,CACpD,GAAI,CAAE,MAAO,oBAAqB,IAAK,uBAAwB,EAC/D,GAAI,CAAE,MAAO,yFAAoB,IAAK,oGAAqB,EAC3D,GAAI,CAAE,MAAO,uHAAyB,IAAK,wFAAmB,EAC9D,IAAK,CAAE,MAAO,uEAAiB,IAAK,wFAAmB,EACvD,IAAK,CAAE,MAAO,wFAAmB,IAAK,8FAAoB,EAC1D,GAAI,CAAE,MAAO,iEAAgB,IAAK,8FAAoB,EACtD,GAAI,CAAE,MAAO,uGAAwB,IAAK,wFAAmB,EAC7D,GAAI,CAAE,MAAO,6EAAkB,IAAK,kIAA0B,EAC9D,IAAK,CAAE,MAAO,+FAAqB,IAAK,kFAAkB,EAC1D,GAAI,CAAE,MAAO,wIAA2B,IAAK,2HAAwB,EACrE,GAAI,CAAE,MAAO,4EAAiB,IAAK,8FAAoB,EACvD,GAAI,CAAE,MAAO,sEAAgB,IAAK,wFAAmB,EACrD,GAAI,CAAE,MAAO,iHAAwB,IAAK,oGAAqB,EAC/D,GAAI,CAAE,MAAO,uEAAiB,IAAK,8FAAoB,EACvD,GAAI,CAAE,MAAO,uHAAyB,IAAK,yGAAqB,EAChE,GAAI,CAAE,MAAO,uEAAiB,IAAK,sEAAgB,EACnD,GAAI,CAAE,MAAO,iHAAwB,IAAK,4HAAyB,EACnE,GAAI,CAAE,MAAO,yFAAoB,IAAK,8IAA4B,EAClE,GAAI,CAAE,MAAO,iGAAuB,IAAK,kFAAkB,CAC7D,EAGaC,GAAwCD,GAAe,GAGvDE,GAAoBC,GAA2C,CAzC5E,IAAAC,EAAAC,EA0CE,IAAMC,EAAOC,GAAeJ,CAAQ,EACpC,GAAI,CAACG,EACH,OAAO,KAET,IAAME,EAAQF,EAAK,YAAY,EAC/B,OACED,GAAAD,EAAAJ,GAAeQ,CAAK,IAApB,KAAAJ,EAAyBJ,GAAeQ,EAAM,MAAM,GAAG,EAAE,CAAC,CAAC,IAA3D,KAAAH,EAAgE,IAEpE,ECxCO,IAAMI,GAAaC,GAAyB,CACjD,IAAMC,EAAQ,MAAM,KAAKD,EAAK,QAAQ,OAAQ,GAAG,EAAE,KAAK,CAAC,EACzD,OAAOC,EAAM,QAAUC,GACnBD,EAAM,KAAK,EAAE,EACb,GAAGA,EAAM,MAAM,EAAGC,EAAwB,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,QACpE,EAEMC,GAAmF,CACvF,KAAM,CACJ,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,GAAI,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,oBAAqB,CAAC,CACtC,EACA,OAAQ,CACN,CAAC,OAAQ,CAAE,EAAG,sDAAuD,CAAC,EACtE,CAAC,OAAQ,CAAE,EAAG,eAAgB,CAAC,CACjC,CACF,EAoBaC,GAAiB,CAC5BC,EACAC,IACiB,CACjB,IAAMC,EAAOC,EAAG,MAAO,CAAE,MAAO,CAAE,QAAS,UAAW,CAAE,CAAC,EACnDC,EAAQD,EAAG,MAAO,CACtB,MAAO,CACL,QAAS,IACT,UAAW,MACb,CACF,EAAGH,CAAO,EACJK,EAAOF,EAAG,MAAO,CAAE,MAAO,CAAE,SAAU,SAAU,UAAW,CAAE,CAAE,EAAGC,CAAK,EACvEE,EAAQH,EAAG,MAAO,CAAE,GAAIF,EAAQ,GAAI,MAAO,CAAE,QAAS,MAAO,CAAE,EAAGI,CAAI,EACxEE,EAAON,EAAQ,KACfO,EAA8C,KAC9CC,EAAuB,KAErBC,EAAe,IAAM,CACrBF,IAAU,MAAM,aAAaA,CAAK,EACtCA,EAAQ,KACJC,IAAU,MAAQ,OAAO,sBAAyB,YAAY,qBAAqBA,CAAK,EAC5FA,EAAQ,IACV,EAEME,EAASC,GAAsB,CACnC,IAAMC,EAAQ,CAACZ,EAAQ,QAAQ,EAC/BK,EAAM,MAAM,iBAAmBM,EAAW,MAAQ,MAClDN,EAAM,MAAM,WAAaO,EAAQ,OAAS,sBAAsBC,EAAa,GAC7EV,EAAM,MAAM,QAAUQ,EAAW,IAAM,IACvCR,EAAM,MAAM,UAAYQ,EAAW,OAAS,mBAC5CR,EAAM,MAAM,WAAaS,EACrB,OACA,iBAAiBE,EAAO,OAAO,qBAAqBA,EAAO,OAAO,GACtEX,EAAM,MAAM,gBAAkBQ,EAAW,OAAS,KACpD,EAEMI,EAAaC,GAAsB,CAIvC,GAHAX,EAAM,gBAAgB,OAAO,EAC7BA,EAAM,gBAAgB,aAAa,EAC/BA,EAAM,aAAeJ,GAAMA,EAAK,YAAYI,CAAK,EACjD,CAACW,GAAY,OAAO,uBAA0B,WAAY,CAC5DN,EAAM,EAAI,EACV,MACF,CACAA,EAAM,EAAK,EAGXF,EAAQ,sBAAsB,IAAM,CAClCA,EAAQ,sBAAsB,IAAM,CAClCA,EAAQ,KACRE,EAAM,EAAI,CACZ,CAAC,CACH,CAAC,CACH,EAEA,OAAIJ,GAAMS,EAAU,EAAK,EAElB,CACL,KAAAd,EACA,UAAW,IAAMI,EAAM,aAAeJ,EACtC,QAAUgB,GAAkB,CAC1B,GAAIA,IAASX,EAGb,IAFAA,EAAOW,EACPR,EAAa,EACTQ,EAAM,CACRF,EAAUf,EAAQ,QAAQ,CAAC,EAC3B,MACF,CAIA,GAHAK,EAAM,aAAa,QAAS,EAAE,EAC9BA,EAAM,aAAa,cAAe,MAAM,EACxCK,EAAM,EAAK,EACP,CAACV,EAAQ,QAAQ,EAAG,CACtBK,EAAM,OAAO,EACb,MACF,CACAE,EAAQ,WAAW,IAAM,CACvBA,EAAQ,KACRF,EAAM,OAAO,CACf,EAAGS,EAAO,UAAU,EACtB,EACA,QAASL,CACX,CACF,EAuCO,SAASS,GAAsBlB,EAAsD,CAC1F,GAAM,CAAE,QAAAmB,EAAS,KAAAC,EAAM,MAAAC,EAAO,WAAAC,EAAa,GAAO,KAAAC,EAAM,OAAAC,EAAQ,QAAAC,CAAQ,EAAIzB,EACxEM,EAAON,EAAQ,KACf0B,EAAS1B,EAAQ,OAEf2B,EAASJ,EACXrB,EAAG,OAAQ,CAAE,IAAK,OAAQ,MAAOsB,EAAO,KAAM,cAAe,MAAO,EAAGD,CAAI,EAC3E,KAEEK,EAAUC,EACd,MACA,CACE,MAAO,KACP,OAAQ,KACR,QAAS,YACT,KAAM,OACN,OAAQ,eACR,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,QACnB,cAAe,OACf,MAAOL,EAAO,OAChB,EACAK,EAAI,OAAQ,CAAE,EAAG,cAAe,CAAC,CACnC,EAEMC,EAAO5B,EACX,SACA,CACE,KAAM,SACN,MAAOsB,EAAO,KACd,aAAcF,EAAa7B,GAAU4B,CAAK,EAAI,KAC9C,QAAS,IAAM,CACRK,GAAQ1B,EAAQ,SAAS,CAChC,CACF,EACAE,EACE,OACA,CAAE,MAAOsB,EAAO,KAAM,cAAe,MAAO,EAC5CK,EACE,MACA,CACE,MAAO,KACP,OAAQ,KACR,QAAS,YACT,KAAM,OACN,OAAQ,eACR,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,OACrB,EACA,GAAGhC,GAAWuB,CAAI,EAAE,IAAI,CAAC,CAACW,EAAKC,CAAK,IAAMH,EAAIE,EAAKC,CAAK,CAAC,CAC3D,CACF,EACA9B,EACE,OACA,CAAE,MAAOsB,EAAO,IAAK,EACrBtB,EACE,OACA,CAAE,IAAK,OAAQ,MAAO,CAAE,GAAGsB,EAAO,MAAO,GAAIF,EAAaE,EAAO,aAAe,CAAC,CAAG,CAAE,EACtFH,CACF,EACAM,CACF,EACAC,CACF,EAEMK,EAAO/B,EAAG,MAAO,CAAE,MAAOsB,EAAO,IAAK,EAAGxB,EAAQ,OAAO,EACxDkC,EAAWpC,GAAemC,EAAM,CAAE,GAAId,EAAS,KAAAb,EAAM,QAAAmB,CAAQ,CAAC,EAE9DU,EAAY,IAAM,CACtBL,EAAK,aAAa,gBAAiB,OAAOxB,CAAI,CAAC,EAC3CA,EACFwB,EAAK,aAAa,gBAAiBX,CAAO,EAE1CW,EAAK,gBAAgB,eAAe,EAElCJ,EACFI,EAAK,aAAa,gBAAiB,MAAM,EAEzCA,EAAK,gBAAgB,eAAe,EAElCH,IAAQA,EAAO,MAAM,QAAUrB,EAAO,OAAS,IAClDsB,EAAmC,MAAM,UAAYtB,EAAO,iBAAmB,OAC/EsB,EAAmC,MAAM,WACxCH,EAAQ,GAAK,CAACW,GAAqB,EAC/B,aAAatB,EAAO,UAAU,MAAMA,EAAO,SAAS,GACpD,MACR,EACA,OAAAqB,EAAU,EAIH,CACL,QAHcjC,EAAG,MAAO,CAAE,GAAGmC,EAAK,SAAS,EAAG,MAAOb,EAAO,IAAK,EAAGM,EAAMI,EAAS,IAAI,EAIvF,WAAaI,GAAW,GAAQA,GAAUL,EAAK,SAASK,CAAM,GAC9D,SAAU,CAACC,EAAUC,IAAe,CAClCd,EAASc,EACLD,IAAajC,IACfA,EAAOiC,EACPL,EAAS,QAAQK,CAAQ,GAE3BJ,EAAU,CACZ,EACA,QAAS,IAAMD,EAAS,QAAQ,CAClC,CACF,CCrPO,IAAMO,GAAe,CAC1BC,EACAC,EACAC,IACkB,CAhCpB,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAiCE,IAAMC,GAAOL,EAAAH,EAAO,SAAP,KAAAG,EAAiBM,GAAuB,KACrD,MAAO,CACL,OAAAR,EACA,OAAOI,GAAAD,EAAAJ,EAAO,UAAP,KAAAI,EAAkBJ,EAAO,aAAzB,KAAAK,EAAuCI,GAAuB,MACrE,UAAWD,EACX,SAAUA,EACV,SAASF,EAAAN,EAAO,aAAP,KAAAM,EAAqBG,GAAuB,QACrD,QAAQF,EAAAP,EAAO,aAAP,KAAAO,EAAqBE,GAAuB,MACpD,WAAYC,EAAUT,EAAQ,GAAI,EAClC,MAAAC,CACF,CACF,EAEMS,GAAkB,CACtBC,EACA,CAAE,SAAAC,EAAU,aAAAC,EAAc,UAAAC,CAAU,KACf,CACrB,KAAM,CACJ,aAAcH,EAAE,MAAM,MACtB,gBAAiBA,EAAE,MACnB,OAAQ,aAAaA,EAAE,SAAS,GAChC,UAAW,aACX,WAAY,CACd,EACA,KAAM,CACJ,QAAS,OACT,WAAY,SACZ,IAAK,OACL,MAAO,OACP,QAASC,EAAW,YAAc,YAClC,OAAQ,EACR,WAAY,OACZ,OAAQ,EACR,aAAcD,EAAE,MAAM,MACtB,UAAW,OACX,MAAOG,EACP,OAAQ,UACR,WAAY,UACZ,UAAW,YACb,EACA,KAAM,CACJ,QAAS,OACT,WAAY,SACZ,MAAO,OACP,OAAQ,OACR,aAAcH,EAAE,MAAM,QACtB,gBAAiBA,EAAE,WACnB,MAAOA,EAAE,OACT,WAAY,CACd,EACA,KAAM,CACJ,QAAS,OACT,cAAe,SACf,IAAK,MACL,KAAM,EACN,SAAU,CACZ,EACA,MAAO,CACL,SAAU,OACV,WAAY,IACZ,WAAY,KACZ,MAAOE,CACT,EACA,aAAc,CACZ,QAAS,cACT,gBAAiB,EACjB,gBAAiB,WACjB,SAAU,SACV,WAAY,GACd,EACA,KAAM,CACJ,SAAU,OACV,WAAY,IACZ,MAAOC,EACP,QAAS,IACT,WAAY,SACZ,SAAU,SACV,aAAc,UAChB,EACA,QAAS,CAAE,WAAY,EAAG,QAAS,EAAI,EACvC,KAAM,CAGJ,QAASF,EAAW,cAAgB,mBACpC,SAAUA,EAAW,OAAS,OAC9B,WAAY,KACZ,MAAOE,EACP,UAAW,YACb,CACF,GAMaC,GAAmB,CAC9BJ,EACAK,IACgB,CAChB,GAAM,CAAE,SAAAJ,CAAS,EAAII,EACfC,EAASL,EAAW,OAAS,OACnC,MAAO,CACL,QAAS,CACP,MAAO,OACP,OAAQ,MACR,OAAQ,aACR,aAAc,QACd,gBAAiBD,EAAE,QACnB,WAAY,CACd,EACA,aAAc,CACZ,QAAS,OACT,cAAe,SACf,SAAU,EACV,SAAU,SACV,UAAW,EACX,OAAQ,EACR,UAAW,aACX,UAAW,MACb,EACA,YAAa,CACX,QAASC,EAAW,QAAQK,CAAM,QAAU,QAAQA,CAAM,QAC1D,WAAY,CACd,EACA,WAAY,CACV,QAAS,OACT,cAAe,SACf,IAAKC,EACP,EACA,UAAW,CACT,OAAQ,EACR,QAAS,OACT,cAAe,SACf,IAAKA,GACL,SAAU,EACV,UAAW,OACX,mBAAoB,UACpB,UAAW,EACX,QAASN,EAAW,gBAAkB,gBACtC,UAAW,aACX,UAAW,OACX,UAAW,GAAGO,EAAiB,MAAM,gBAAgBC,EAAO,OAAO,OACrE,EACA,WAAY,CACV,QAASR,EAAW,iBAAmB,iBACvC,UAAW,aAAaD,EAAE,QAAQ,GAClC,WAAYA,EAAE,OACd,WAAY,EACZ,UAAW,YACb,EACA,iBAAkB,CAChB,QAAS,OACT,oBAAqB,UACrB,IAAK,MACL,OAAQ,EACR,QAAS,CACX,EACA,UAAWD,GAAgBC,EAAGK,CAAK,CACrC,CACF,EAEMK,GAAO,GAAGF,EAAiB,IAAI,IAAIC,EAAO,OAAO,MAAMA,EAAO,SAAS,QACvEE,GAAS,GAAGH,EAAiB,MAAM,IAAIC,EAAO,KAAK,MAAMA,EAAO,OAAO,QAGvEG,GAAYC,IAA2B,CAC3C,IAAK,OACL,KAAM,IACN,MAAO,IACP,OAAQ,IACR,UAAW,OACX,MAAO,OACP,SAAU,OACV,aAAc,GAAGA,CAAM,IAAIA,CAAM,OACjC,aAAc,OACd,UAAWH,EACb,GAEMI,GAAUC,IAA6B,CAC3C,IAAK,OACL,OAAQC,GACR,KAAMD,IAAS,OAASC,GAAgB,OACxC,MAAOD,IAAS,QAAUC,GAAgB,OAC1C,UAAW,OACX,UAAWL,EACb,GAGaM,GAAW,CACtBC,EACAjB,IAEAA,EAAWiB,EAAO,YAAcA,EAAO,kBAAoB,aAOhDC,GAAgB,CAAC,CAC5B,OAAAD,EACA,SAAAjB,EACA,OAAAY,EACA,SAAAO,CACF,IAAiC,CAC/B,GAAInB,EACF,OAAOiB,EAAO,YACV,CACE,GAAGN,GAASC,CAAM,EAClB,UAAW,OACX,cAAe,kCACjB,EACA,CAAC,EAEP,IAAMQ,EAAeD,EACjB,CAAE,MAAO,OAAOA,CAAQ,uBAAwB,SAAU,MAAO,EACjE,CAAC,EACL,OAAQF,EAAO,gBAAiB,CAC9B,IAAK,eACH,MAAO,CAAE,GAAGJ,GAAO,OAAO,EAAG,GAAGO,CAAM,EACxC,IAAK,cACH,MAAO,CAAE,GAAGP,GAAO,MAAM,EAAG,GAAGO,CAAM,EACvC,IAAK,aACH,MAAO,CACL,GAAGT,GAASC,CAAM,EAClB,UAAW,OACX,YAAa,yBAAyBS,EAAwB,UAC9D,aAAc,yBAAyBA,EAAwB,SACjE,EACF,QACE,OAAOD,CACX,CACF,EC7PO,IAAME,GAAoB,CAC/BC,EACAC,IACM,CACN,IAAMC,EAAgC,CAAE,GAAGF,CAAK,EAChD,OAAW,CAACG,EAAKC,CAAK,IAAK,OAAO,QAAQH,CAAK,EAC7CC,EAAOC,CAAG,EAAI,CAAE,GAAGD,EAAOC,CAAG,EAAG,GAAGC,CAAM,EAE3C,OAAOF,CACT,EAGMG,GAAWD,GACf,OAAO,YACL,OAAO,QAAQA,CAAK,EAAE,OAAO,CAAC,CAAC,CAAEE,CAAK,IAAMA,IAAU,MAAS,CACjE,EAEIC,GAAgBN,GACpB,OAAO,YACL,OAAO,QAAQA,CAAK,EACjB,IAAI,CAAC,CAACE,EAAKC,CAAK,IAAM,CAACD,EAAKE,GAAQD,GAAA,KAAAA,EAAS,CAAC,CAAC,CAAC,CAAU,EAC1D,OAAO,CAAC,CAAC,CAAEA,CAAK,IAAM,OAAO,KAAKA,CAAK,EAAE,OAAS,CAAC,CACxD,EAOII,GAAgBC,GAA+C,CAzCrE,IAAAC,EA0CE,IAAMC,GAAUD,EAAAD,EAAO,UAAP,KAAAC,EAAkBD,EAAO,WACnCG,EAAU,CAAE,gBAAiBH,EAAO,UAAW,EAC/CI,EAAOJ,EAAO,QAAU,aAAaA,EAAO,MAAM,GACxD,OAAOF,GAAa,CAClB,QAAS,CAAE,gBAAiBE,EAAO,OAAQ,EAC3C,MAAO,CAAE,gBAAiBA,EAAO,UAAW,EAC5C,WAAYG,EACZ,YAAaA,EACb,cAAeA,EACf,gBAAiBA,EACjB,kBAAmBA,EACnB,MAAO,CAAE,MAAOH,EAAO,OAAQ,EAC/B,SAAU,CAAE,MAAOA,EAAO,OAAQ,EAClC,YAAa,CAAE,MAAOA,EAAO,OAAQ,EACrC,YAAa,CAAE,MAAOA,EAAO,IAAK,EAClC,gBAAiB,CAAE,MAAOA,EAAO,IAAK,EACtC,kBAAmB,CAAE,MAAOA,EAAO,UAAW,EAC9C,YAAa,CAAE,MAAOA,EAAO,UAAW,EACxC,KAAM,CAAE,MAAOA,EAAO,IAAK,EAC3B,SAAU,CAAE,OAAQI,CAAK,EACzB,iBAAkB,CAAE,gBAAiBF,EAAS,OAAQE,CAAK,EAC3D,aAAc,CACZ,gBAAiBF,EACjB,MAAOF,EAAO,KACd,aAAcI,CAChB,EACA,aAAc,CAAE,WAAYF,EAAS,OAAQE,CAAK,EAClD,aAAc,CAAE,MAAOJ,EAAO,OAAQ,EACtC,mBAAoB,CAAE,MAAOA,EAAO,UAAW,EAC/C,aAAc,CACZ,WAAYA,EAAO,WACnB,OAAQI,EACR,MAAOJ,EAAO,OAChB,CACF,CAAC,CACH,EAGMK,GAAgBL,GAA+C,CAhFrE,IAAAC,EAiFE,IAAMK,EAAW,cAAaL,EAAAD,EAAO,SAAP,KAAAC,EAAiB,SAAS,GACxD,MAAO,CACL,MAAO,CAAE,UAAW,OAAQ,OAAQK,CAAS,EAC7C,iBAAkB,CAAE,UAAW,MAAO,EACtC,WAAY,CAAE,cAAe,OAAQ,aAAcA,CAAS,EAC5D,OAAQ,CAAE,UAAW,OAAQ,WAAY,GAAI,EAC7C,aAAc,CAAE,aAAc,KAAM,CACtC,CACF,EAGMC,GAAaC,IAAgC,CACjD,MAAO,CAAE,UAAW,0CAA2C,EAC/D,WAAY,CACV,QAAS,YACT,aAAc,OACd,gBAAiBC,EAAUD,EAAQ,GAAI,CACzC,EACA,iBAAkB,CAAE,aAAc,MAAO,EACzC,OAAQ,CAAE,WAAY,GAAI,EAC1B,aAAc,CAAE,aAAc,OAAQ,WAAYC,EAAUD,EAAQ,GAAI,CAAE,CAC5E,GAEME,GAAe,CACnBf,EACAK,EACAQ,IAEIb,IAAU,UACLU,GAAaL,CAAM,EAExBL,IAAU,OACLY,GAAUC,CAAM,EAElB,CAAC,EAQGG,GAAqB,CAChCpB,EACAI,EACAK,EACAQ,IAEAlB,GACEA,GAAkBC,EAAMQ,GAAaC,CAAM,CAAC,EAC5CU,GAAaf,EAAOK,EAAQQ,CAAM,CACpC,ECpGF,IAAMI,GAAc,CAClB,eAAgBC,GAChB,qBAAsBA,EACxB,EAGMC,GAAW,CAACC,EAAiBC,KAA0B,CAC3D,WAAYD,EAAE,QACd,OAAQ,aAAaA,EAAE,OAAO,GAC9B,aAAcE,GAAa,QAC3B,MAAAD,CACF,GAEME,GAAa,CACjBH,EACA,CAAE,SAAAI,EAAU,OAAAC,EAAQ,UAAAC,EAAW,aAAAC,EAAc,KAAAC,EAAOC,EAAmB,KACvD,CAChB,QAAS,CACP,gBAAiBT,EAAE,IACnB,UAAW,GAAGU,EAAiB,IAAI,IAAIC,EAAO,KAAK,MAAMA,EAAO,OAAO,OACzE,EAKA,MAAO,CACL,aAAcT,GAAa,MAC3B,gBAAiBF,EAAE,MACnB,GAAGH,GACH,OAAQ,aAAaG,EAAE,SAAS,GAChC,UAAWK,EAASL,EAAE,OAASA,EAAE,YACjC,UAAW,OACX,SAAU,SACV,UAAW,GAAGU,EAAiB,KAAK,IAAIC,EAAO,KAAK,MAAMA,EAAO,OAAO,OAC1E,EAEA,WAAY,CAAE,gBAAiB,aAAc,EAC7C,YAAa,CAAE,gBAAiB,aAAc,EAE9C,MAAO,CACL,WAAY,IACZ,WAAY,IACZ,cAAe,SACjB,EAEA,SAAU,CACR,aAAcT,GAAa,KAC3B,OAAQ,OACR,QAAS,SACT,OAAQ,aAAaF,EAAE,QAAQ,GAC/B,WAAY,IACZ,WAAY,EACZ,gBAAiBA,EAAE,OACrB,EAEA,YAAa,CAAE,WAAY,IAAK,EAEhC,KAAM,CACJ,WAAY,IACZ,eAAgB,YAChB,wBAAyB,MACzB,oBAAqB,KACvB,EAEA,SAAU,CACR,WAAY,IACZ,OAAQ,WACV,EAGA,iBAAkB,CAChB,IAAK,EACL,aAAcE,GAAa,MAC3B,gBAAiBF,EAAE,MACnB,OAAQ,aAAaA,EAAE,SAAS,GAChC,SAAU,SACV,WAAY,CACd,EAEA,WAAY,CACV,IAAK,OACL,QAASI,EAAW,sBAAwB,qBAC9C,EAEA,WAAY,CACV,IAAK,OACL,KAAM,EACN,SAAU,EACV,aAAcF,GAAa,GAC7B,EAEA,oBAAqB,CAAE,IAAK,MAAO,SAAU,CAAE,EAE/C,YAAa,CAAE,WAAY,IAAK,WAAY,IAAK,cAAe,CAAE,EAElE,kBAAmB,CAAE,WAAY,KAAM,cAAe,EAAG,QAAS,GAAK,EAEvE,cAAe,CACb,OAAQ,EACR,QAASE,EAAW,sBAAwB,qBAC9C,EAIA,YAAa,CACX,YAAa,OACb,OAAQ,CACV,EAEA,aAAc,CAAE,WAAY,IAAK,cAAe,CAAE,EAElD,sBAAuB,CACrB,IAAK,MACL,QAASA,EAAW,mBAAqB,kBAC3C,EAEA,gBAAiB,CACf,QAAS,WACT,aAAcF,GAAa,IAC3B,gBAAiBF,EAAE,MACnB,UAAW,MACb,EAEA,gBAAiB,CAAE,WAAY,IAAK,cAAe,CAAE,EAErD,cAAe,CACb,IAAK,OACL,gBAAiB,aACnB,EAGA,gBAAiB,CACf,IAAK,OACL,WAAY,EACZ,gBAAiB,aACnB,EAEA,kBAAmB,CACjB,IAAK,MACL,WAAY,EACZ,gBAAiB,aACnB,EAEA,YAAa,CACX,SAAU,OACV,WAAY,OACZ,MAAOM,EACP,QAAS,GACT,WAAY,EACZ,OAAQ,UACV,EAKA,aAAc,CACZ,OAAQ,WACR,QAAS,OACT,WAAYN,EAAE,MACd,OAAQ,aAAaA,EAAE,SAAS,GAChC,aAAcE,GAAa,KAC7B,EAEA,aAAc,CAAE,MAAOK,EAAc,WAAY,GAAI,EAErD,mBAAoB,CAAE,MAAOD,EAAW,QAAS,GAAK,EAEtD,aAAcP,GAASC,EAAGO,CAAY,EAEtC,OAAQ,CACN,UAAWH,EAAW,OAAS,OAC/B,WAAY,IACZ,WAAY,IACZ,cAAe,CACjB,EAEA,aAAc,CAAE,UAAWJ,EAAE,aAAc,EAE3C,sBAAuB,CACrB,gBAAiBA,EAAE,WACnB,OAAQ,uBACV,EAEA,UAAW,CAAE,QAAS,WAAY,EAElC,YAAa,CAAE,QAAS,WAAY,EAEpC,aAAc,CACZ,OAAQ,aAAaA,EAAE,OAAO,GAC9B,gBAAiB,cACjB,MAAOM,CACT,EAIA,iBAAkB,CAChB,gBAAiBM,GAAWJ,EAAM,SAAS,EAC3C,OAAQ,aAAaR,EAAE,SAAS,GAChC,aAAc,OACd,UAAWA,EAAE,YACb,SAAU,QACV,UAAW,QACX,QAAS,MACT,UAAW,GAAGU,EAAiB,GAAG,UAAUC,EAAO,OAAO,QAC1D,gBAAiB,WACnB,EAEA,aAAc,CACZ,MAAOJ,EACP,gBAAiB,cACjB,aAAcL,GAAa,IAC3B,aAAc,MAChB,EAEA,qBAAsB,CAAE,gBAAiBF,EAAE,UAAW,EAEtD,eAAgB,CACd,MAAO,OACP,OAAQ,OACR,OAAQ,eAAeA,EAAE,gBAAgB,GACzC,UAAW,eAAeA,EAAE,MAAM,GAClC,UAAW,GAAGU,EAAiB,IAAI,wBACnC,aAAc,EACd,WAAY,CACd,CACF,GAMMG,GAAmBT,IAA8C,CACrE,MAAO,CACL,MAAOA,EAAW,oBAAsBU,GACxC,SAAU,MACZ,EACA,MAAO,CAAE,SAAUV,EAAW,OAAS,MAAO,EAC9C,SAAU,CAAE,SAAU,MAAO,EAC7B,YAAa,CAAE,SAAUA,EAAW,OAAS,MAAO,EACpD,kBAAmB,CAAE,SAAUA,EAAW,OAAS,MAAO,EAC1D,gBAAiB,CAAE,SAAU,MAAO,EACpC,YAAa,CAAE,SAAUA,EAAW,OAAS,MAAO,EACpD,SAAU,CAAE,QAAS,SAAU,OAAQ,MAAO,EAC9C,aAAc,CAAE,SAAU,OAAQ,QAAS,UAAW,EACtD,YAAa,CAAE,IAAK,MAAO,EAC3B,OAAQ,CACN,SAAU,OACV,QAASA,EAAW,YAAc,WACpC,CACF,GAEMW,GAAgBf,IAAoC,CACxD,OAAQA,EAAE,OACV,MAAOA,EAAE,MACT,UAAWA,EAAE,UACb,SAAUA,EAAE,SACZ,QAASA,EAAE,QACX,OAAQA,EAAE,OACV,WAAYA,EAAE,WACd,MAAO,CAAE,MAAOE,GAAa,MAAO,QAASA,GAAa,OAAQ,CACpE,GAEMc,GAAqBhB,IAA4B,CACrD,QAAS,OACT,WAAY,SACZ,IAAK,OACL,QAAS,YACT,aAAcE,GAAa,KAC3B,gBAAiBF,EAAE,QACnB,GAAGH,GACH,OAAQ,aAAaG,EAAE,SAAS,GAChC,UAAWA,EAAE,YACb,OAAQ,IACR,UAAW,YACb,GAEMiB,GAAW,CAACjB,EAAiBkB,KAAuC,CACxE,GAAGC,GAAiBJ,GAAaf,CAAC,EAAGkB,CAAK,EAC1C,WAAYA,EAAM,SACd,CACE,SAAU,QACV,IAAK,OACL,KAAM,IACN,MAAO,IACP,OAAQ,gDACR,OAAQ,SACR,MAAO,cACP,SAAU,OACV,UAAW,OACX,GAAGF,GAAkBhB,CAAC,EACtB,UAAW,GAAGU,EAAiB,GAAG,UAAUC,EAAO,OAAO,OAC5D,EACA,CACE,SAAU,QACV,IAAK,MACL,KAAM,MACN,MAAO,OACP,UAAW,wBACX,GAAGK,GAAkBhB,CAAC,EACtB,UAAW,GAAGU,EAAiB,SAAS,UAAUC,EAAO,OAAO,OAClE,EACJ,WAAY,CACV,OAAQ,EACR,SAAU,OACV,WAAY,IACZ,WAAY,GACd,EACA,aAAcS,EAChB,GAEMC,GAAmBrB,IAA6C,CACpE,CAACsB,EAAW,MAAM,EAAGtB,EAAE,OACvB,CAACsB,EAAW,SAAS,EAAGC,EAAUvB,EAAE,OAAQ,GAAI,EAChD,CAACsB,EAAW,WAAW,EAAGtB,EAAE,YAC5B,CAACsB,EAAW,KAAK,EAAGtB,EAAE,iBACtB,CAACsB,EAAW,OAAO,EAAGtB,EAAE,QACxB,CAACsB,EAAW,QAAQ,EAAGtB,EAAE,SACzB,CAACsB,EAAW,OAAO,EAAGtB,EAAE,OAC1B,GAEMwB,GAAiB,CACrBxB,EACA,CAAE,aAAAO,CAAa,KACW,CAC1B,OAAQP,EAAE,OACV,OAAQ,CACN,OAAQ,aAAaA,EAAE,OAAO,GAC9B,aAAcE,GAAa,QAC3B,gBAAiBF,EAAE,QACnB,MAAOO,CACT,CACF,GAEMkB,GAAiB,CACrBzB,EACA,CAAE,aAAAO,EAAc,UAAAD,CAAU,KACH,CACvB,QAAS,CAAE,gBAAiBN,EAAE,GAAI,EAClC,MAAO,CACL,gBAAiBA,EAAE,WACnB,GAAGH,GACH,aAAcK,GAAa,MAC3B,OAAQ,aAAaF,EAAE,SAAS,GAChC,UAAWA,EAAE,YACb,UAAW,GAAGU,EAAiB,GAAG,UAAUC,EAAO,OAAO,OAC5D,EACA,MAAO,CAAE,MAAOJ,EAAc,WAAY,GAAI,EAC9C,OAAQ,CAAE,MAAOD,CAAU,EAC3B,OAAQ,CACN,aAAcJ,GAAa,KAC3B,OAAQ,aAAaF,EAAE,OAAO,GAC9B,gBAAiB,cACjB,MAAOM,EACP,WAAY,GACd,CACF,GAGaoB,GAAiB,CAC5BC,EACAT,IACkB,CAGlB,IAAMU,EAA2B,CAC/B,GAAGV,EACH,OAAQW,GAAeX,EAAM,OAAQY,EAAoB,EACzD,KAAMD,GAAeX,EAAM,KAAMT,EAAkB,CACrD,EACMsB,EAAUC,GAAa,CAC3B,OAAQJ,EAAS,OACjB,KAAMA,EAAS,IACjB,CAAC,EACD,MAAO,CACL,QAAAG,EACA,OAAQE,GAAkBN,EAAMxB,GAAW4B,EAASH,CAAQ,CAAC,EAC7D,WAAYf,GAAgBe,EAAS,QAAQ,EAC7C,MAAOX,GAASc,EAASH,CAAQ,EACjC,aAAcP,GAAgBU,CAAO,EACrC,YAAaP,GAAeO,EAASH,CAAQ,EAC7C,YAAaH,GAAeM,EAASH,CAAQ,CAC/C,CACF,EClZA,IAAMM,GACJC,GAEA,OAAO,YACL,OAAO,QAAQA,CAAM,EAAE,OAAO,CAAC,CAAC,CAAEC,CAAK,IAAM,EAAQA,CAAM,CAC7D,EAGIC,GACJC,GAC2B,CAtB7B,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAuBE,GAAI,CAACnB,EACH,MAAO,CAAC,EAEV,IAAMoB,EAASpB,EAAQ,OACvB,OAAOJ,GAAc,CACnB,WAAYI,EAAQ,gBACpB,QAASA,EAAQ,aACjB,QAASA,EAAQ,aACjB,KAAMA,EAAQ,UACd,WAAYA,EAAQ,eACpB,KAAMA,EAAQ,KACd,OAAQA,EAAQ,YAChB,QAASA,EAAQ,aAEjB,gBACEC,EAAAmB,GAAA,YAAAA,EAAQ,YAAR,YAAAnB,EAAmB,oBAAmBC,EAAAkB,GAAA,YAAAA,EAAQ,SAAR,YAAAlB,EAAgB,iBACxD,kBAAiBC,EAAAiB,GAAA,YAAAA,EAAQ,YAAR,YAAAjB,EAAmB,cAAaC,EAAAgB,GAAA,YAAAA,EAAQ,SAAR,YAAAhB,EAAgB,WACjE,WAAWC,EAAAe,GAAA,YAAAA,EAAQ,iBAAR,YAAAf,EAAwB,gBACnC,aAAaC,EAAAc,GAAA,YAAAA,EAAQ,iBAAR,YAAAd,EAAwB,UACrC,YAAYC,EAAAa,GAAA,YAAAA,EAAQ,UAAR,YAAAb,EAAiB,gBAC7B,cAAcC,EAAAY,GAAA,YAAAA,EAAQ,UAAR,YAAAZ,EAAiB,UAC/B,gBAAgBC,EAAAW,GAAA,YAAAA,EAAQ,UAAR,YAAAX,EAAiB,YACjC,aAAaC,EAAAU,GAAA,YAAAA,EAAQ,WAAR,YAAAV,EAAkB,gBAC/B,eAAeC,EAAAS,GAAA,YAAAA,EAAQ,WAAR,YAAAT,EAAkB,UACjC,sBAAsBC,EAAAQ,GAAA,YAAAA,EAAQ,WAAR,YAAAR,EAAkB,wBACxC,wBAAwBC,EAAAO,GAAA,YAAAA,EAAQ,WAAR,YAAAP,EAAkB,kBAC1C,YAAWC,EAAAd,EAAQ,SAAR,YAAAc,EAAgB,YAAWC,EAAAK,GAAA,YAAAA,EAAQ,SAAR,YAAAL,EAAgB,iBACtD,YAAYC,EAAAhB,EAAQ,SAAR,YAAAgB,EAAgB,SAC5B,aAAaC,EAAAjB,EAAQ,SAAR,YAAAiB,EAAgB,UAC7B,kBAAkBC,EAAAlB,EAAQ,eAAR,YAAAkB,EAAsB,gBACxC,oBAAoBC,EAAAnB,EAAQ,eAAR,YAAAmB,EAAsB,SAC5C,CAAC,CACH,EAWaE,GAAoB,CAC/BC,EACAC,IAC6B,CArE/B,IAAAtB,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAsEE,GAAI,CAACY,EACH,OAAOD,EAET,IAAME,EAAUD,EAAS,UACzB,MAAO,CAEL,MAAOE,GAAaF,EAAS,KAAK,EAAIA,EAAS,MAAQD,EAAS,MAChE,OAAQ,CAAE,GAAGA,EAAS,OAAQ,GAAGvB,GAAWwB,CAAQ,CAAE,EACtD,OAAQA,EAAS,cAAgBD,EAAS,OAC1C,kBAAkBrB,EAAAsB,EAAS,mBAAT,KAAAtB,EAA6BqB,EAAS,iBACxD,cAAcpB,EAAAqB,EAAS,eAAT,KAAArB,EAAyBoB,EAAS,aAChD,qBACEnB,EAAAoB,EAAS,sBAAT,KAAApB,EAAgCmB,EAAS,oBAC3C,cAAclB,EAAAmB,EAAS,eAAT,KAAAnB,EAAyBkB,EAAS,aAChD,iBAAiBjB,EAAAkB,EAAS,kBAAT,KAAAlB,EAA4BiB,EAAS,gBACtD,UAAUhB,EAAAiB,EAAS,WAAT,KAAAjB,EAAqBgB,EAAS,SACxC,qBACEf,EAAAgB,EAAS,sBAAT,KAAAhB,EAAgCe,EAAS,oBAC3C,aAAad,EAAAe,EAAS,cAAT,KAAAf,EAAwBc,EAAS,YAC9C,UAAUb,EAAAc,EAAS,WAAT,KAAAd,EAAqBa,EAAS,SACxC,WAAY,CACV,GAAGA,EAAS,WACZ,GAAGvB,GAAWwB,EAAS,WAAW,CACpC,EACA,SAAUA,EAAS,UAAYD,EAAS,SACxC,SAAUC,EAAS,UAAYD,EAAS,SACxC,WAAWZ,EAAAa,EAAS,YAAT,KAAAb,EAAsBY,EAAS,UAC1C,QAAQX,EAAAY,EAAS,SAAT,KAAAZ,EAAmBW,EAAS,OAGpC,UACEE,GAAWE,GAAgBF,CAAO,EAAIA,EAAUF,EAAS,SAC7D,CACF,EAOaK,GAAoB,CAC/BC,EACAL,EACAM,IAEAC,GACET,GAAkBU,GAAwBH,CAAM,EAAGL,CAAQ,EAC3DM,CACF,EC9GF,IAAMG,GAASC,GACb,KAAK,MAAMA,EAAQC,EAAmB,EAAIA,GAG/BC,GAAgB,CAC3BC,EACAC,IACgC,CAChC,GAAIA,IAAW,GAAKD,IAAS,OAC3B,OAAOA,EAET,GAAI,OAAOA,GAAS,SAClB,OAAOJ,GAAMI,EAAOC,CAAM,EAE5B,IAAMC,EAAQC,GAAa,KAAKH,CAAI,EACpC,OAAOE,EAAQ,GAAGN,GAAM,OAAOM,EAAM,CAAC,CAAC,EAAID,CAAM,CAAC,KAAOD,CAC3D,EAMaI,GAAiB,CAC5BC,EACAJ,IAEIA,IAAW,EACNI,EAEF,OAAO,YACZ,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACC,EAAKC,CAAK,IAAM,CAC3CD,EACAC,EAAM,WAAa,OACfA,EACA,CAAE,GAAGA,EAAO,SAAUR,GAAcQ,EAAM,SAAUN,CAAM,CAAE,CAClE,CAAC,CACH,EAIWO,GAAmBC,GAA8C,CAhD9E,IAAAC,EAiDE,OAAAC,IAA0BD,EAAAD,EAAW,YAAX,KAAAC,EAAwB,IAAkB,GCgEtE,IAAME,GAAkBC,IAA8C,CACpE,MAAO,CACL,MAAOA,EAAW,MAAQ,QAC1B,SAAUA,EAAW,MAAQ,mBAC/B,EACA,QAAS,CAAE,OAAQA,EAAW,OAAS,MAAO,EAC9C,MAAO,CAAE,SAAUA,EAAW,OAAS,MAAO,EAC9C,SAAU,CAAE,SAAUA,EAAW,OAAS,MAAO,EACjD,YAAa,CAAE,SAAUA,EAAW,OAAS,MAAO,EACpD,kBAAmB,CAAE,SAAUA,EAAW,OAAS,MAAO,EAC1D,gBAAiB,CAAE,SAAUA,EAAW,OAAS,MAAO,EACxD,YAAa,CAAE,SAAUA,EAAW,OAAS,MAAO,EACpD,SAAU,CACR,SAAUA,EAAW,OAAS,OAC9B,QAASA,EAAW,UAAY,SAClC,EACA,YAAa,CAAE,IAAKA,EAAW,OAAS,MAAO,EAC/C,KAAM,CACJ,SAAUA,EAAW,OAAS,QAC9B,UAAWA,EAAW,OAAS,MACjC,EACA,aAAc,CACZ,SAAUA,EAAW,OAAS,OAC9B,QAASA,EAAW,WAAa,UACnC,EACA,cAAe,CAAE,aAAcA,EAAW,OAAS,MAAO,EAC1D,OAAQ,CACN,SAAUA,EAAW,OAAS,OAC9B,QAASA,EAAW,YAAc,UACpC,EACA,QAAS,CAAE,SAAUA,EAAW,OAAS,MAAO,CAClD,GAEaC,GAAiB,CAAC,CAC7B,SAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,SAAAC,EACA,YAAAC,EACA,SAAAN,CACF,IAAiC,CAzJjC,IAAAO,EAAAC,EAAAC,EAAAC,GAAAC,GAAAC,EAAAC,GAAAC,EAAAC,EAAAC,EAAAC,GAAAC,GAAAC,GA0JE,IAAMC,EAAaC,GACjBlB,EAAUA,EAAQ,WAAaC,EAC/BC,EACAC,CACF,EACMgB,EAAQF,EAAW,MACnBG,EAASH,EAAW,OACpBI,EAASC,GAAoBL,CAAU,EACvCM,EAASC,GAASH,EAAQxB,CAAQ,EAClC4B,EAAeL,EAAO,SAAWM,GACjCC,EAAYP,EAAO,MAAQQ,GAC3BC,GAAczB,EAAAgB,EAAO,YAAP,KAAAhB,EAAoBgB,EAAO,cACzCU,EAAUX,IAAU,QAIpBY,EACJF,IAAe7B,GAAA,YAAAA,EAAS,iBAAkBA,EAAUgC,GAAuBP,GAIvEQ,GACJ5B,EAAAe,EAAO,YAAP,KAAAf,EAAqByB,GAAUV,EAAO,eAAiBW,EAEnDG,EAAUC,GAAmBC,EAAejB,EAAOC,EAAQa,CAAW,EACtEI,EAAOP,EACTQ,GAAeJ,EAAS,CACtB,OAAQD,EACR,MAAM3B,EAAAc,EAAO,UAAP,KAAAd,EAAkBc,EAAO,WAC/B,aAAAK,EACA,UAAAE,EACA,SAAA9B,EACA,OAAA0B,CACF,CAAC,EACD,KACEgB,EAAYC,GAAgBvB,CAAU,EACtCmB,EAASK,IAAelC,GAAA8B,GAAA,YAAAA,EAAM,SAAN,KAAA9B,GAAgB2B,EAASK,CAAS,EAE1DG,EAAoC9C,GAAeC,CAAQ,EACjE,OAAW,CAAC8C,GAAKC,EAAK,IAAK,OAAO,SAAQpC,GAAA6B,GAAA,YAAAA,EAAM,aAAN,KAAA7B,GAAoB,CAAC,CAAC,EAC9DkC,EAAWC,EAAG,EAAI,CAAE,GAAGD,EAAWC,EAAG,EAAG,GAAGC,EAAM,EAE/C3B,EAAW,WACbyB,EAAW,KAAO,CAChB,GAAGA,EAAW,KACd,OAAQzB,EAAW,SACnB,UAAWA,EAAW,SACtB,SAAU,QAAQA,EAAW,QAAQ,MAAM4B,EAAgB,GAC7D,GAGF,IAAMC,EAAQC,GAAY5B,CAAK,EACzB6B,GAAQvC,EAAA4B,GAAA,YAAAA,EAAM,QAAN,KAAA5B,EACZwC,GAAiBC,GAAa9B,EAAQa,EAAaa,CAAK,EAAG,CACzD,aAAArB,EACA,UAAAE,EACA,SAAA9B,CACF,CAAC,EAEGsD,GAAmBzC,GAAAO,EAAW,mBAAX,KAAAP,GAA+B0C,GAClDC,EAAgBhC,EAAO,cACvBiC,EAAarC,EAAW,OACxBsC,EAAcD,GAAcR,EAAM,MAClCU,EAAeF,GAAcR,EAAM,OAInCW,EAAuBpC,EAAO,YAEhCD,EAAO,QACL,CAAE,GAAGgB,EAAO,QAAS,gBAAiBhB,EAAO,OAAQ,EACrDgB,EAAO,QAHT,CAAE,GAAGA,EAAO,QAAS,gBAAiB,aAAc,EAKlDsB,EAAWC,GAAc,CAC7B,OAAAtC,EACA,SAAAxB,EACA,OAAQ0D,EACR,SAAUtC,EAAW,QACvB,CAAC,EACK2C,GAAoB,CACxB,GAAGxB,EAAO,MACV,GAAGM,EAAW,MACd,aAAca,EACd,GAAIlB,EAAO,CAAC,EAAI,CAAE,gBAAiBjB,EAAO,YAAc,SAAU,EAClE,GAAGsC,CACL,EAEMG,EAAgB,CAAE,aAAcL,CAAa,EAC7CM,EAAmB,CACvB,GAAGD,EACH,gBACEzC,EAAO,eAAiBS,IAAe7B,GAAA,YAAAA,EAAS,gBAAiBgC,GACnE,MAAOZ,EAAO,iBAAmB,SACnC,EAIM2C,GAAwB,CAC5B,GAAGF,EACH,iBAAiBlD,EAAAS,EAAO,YAAP,KAAAT,EAAqB0B,EAAOA,EAAK,QAAQ,WAAa,UACvE,OAAOzB,EAAAQ,EAAO,cAAP,KAAAR,EAAsBqB,EAC7B,YAAaI,EAAO,eAAgBxB,EAAAO,EAAO,cAAP,KAAAP,EAAsBoB,CAC5D,EACM+B,EAAiB,CACrB,GAAGH,EACH,gBAAiBzC,EAAO,aAAeiB,EAAO,cAAgB,WAC9D,MAAOjB,EAAO,eAAiBiB,EAAOV,EAAY,WAClD,aACEb,GAAAM,EAAO,iBAAP,KAAAN,GAA0BM,EAAO,SAAWiB,EAAOA,EAAK,QAAQ,QAAU,UAC9E,EAEM4B,GAAc,CAClB,aAAcT,EACd,YAAapC,EAAO,SAAWiB,EAAOA,EAAK,QAAQ,SAAW,WAC9D,gBAAiBjB,EAAO,cAAgBiB,EAAOA,EAAK,QAAQ,QAAU,WACtE,MAAOjB,EAAO,gBAAkBiB,EAAOZ,EAAe,UACxD,EAGM,CAAE,aAAcyC,GAAa,GAAGC,EAAW,EAAIF,GAC/CG,GAAc/B,EAChB,CACE,GAAIjB,EAAO,aAAe,CAAE,gBAAiBA,EAAO,WAAY,EAChE,MAAO6C,GAAK,KACd,EACAE,GACEE,GAAkB,CACtB,GAAGD,GACH,gBACEhD,EAAO,uBAAyBiB,EAAOA,EAAK,QAAQ,WAAa,WACnE,MAAOjB,EAAO,yBAA2BiB,EAAOZ,EAAe,WAC/D,WAAY,GACd,EAEM6C,GAAyC,CAC7C,CAACC,EAAqB,EAAG,GACzB,CAACC,EAAmB,EAAGzE,EACvB,GAAIsC,EAAO,CAAE,CAACoC,EAAoB,EAAGtD,CAAM,EAAI,CAAC,EAChD,GAAIkC,EAAgB,CAAE,CAACqB,EAAiB,EAAGC,EAAe,EAAI,CAAC,EAC/D,GAAKtD,EAAO,OAA8C,CAAC,EAAtC,CAAE,CAACuD,EAAgB,EAAGC,EAAW,EACtD,GAAGC,GAAuB1D,CAAM,CAClC,EAEA,MAAO,CACL,WAAAH,EACA,OAAAI,EACA,KAAAgB,EACA,OAAAD,EACA,WAAYK,GAAeC,EAAYH,CAAS,EAChD,MAAO,CAAE,GAAGS,EAAO,UAAWP,GAAeO,EAAM,UAAWT,CAAS,CAAE,EACzE,YAAYxB,GAAAsB,GAAA,YAAAA,EAAM,QAAN,KAAAtB,GAAe,KAC3B,OAAAQ,EACA,gBAAiBwD,GAAoB5D,CAAK,EAAE,WAC5C,UAAAoB,EACA,aAAAd,EACA,UAAAE,EACA,YAAAM,EACA,UAAWb,EAAO,OAAQpB,GAAA,YAAAA,EAAS,kBAAmBgC,GACtD,MAAAc,EACA,eAAAwB,GACA,aAAc,CACZ,IAAItD,GAAAqB,GAAA,YAAAA,EAAM,eAAN,KAAArB,GAAsB,CAAC,EAC3B,GAAGgE,GAAuB5D,CAAM,CAClC,EACA,aAAAqC,EACA,WAAAG,GACA,QAAS,CAAE,KAAMC,EAAQ,UAAAC,EAAW,eAAAC,GAAgB,QAAAC,CAAQ,EAC5D,SAAU,CAAE,KAAAC,GAAM,KAAAG,GAAM,SAAAC,EAAS,EACjC,YAAahC,GAAA,YAAAA,EAAM,YACnB,YAAaA,GAAA,YAAAA,EAAM,YACnB,iBAAAc,EACA,cAAAE,EACA,cAAeA,GAAiBF,IAAqB,UACvD,CACF,EAGa8B,GAAkBC,GAC7BA,EAAK,OAAS,CAAE,CAACC,EAAc,EAAGC,EAAO,EAAI,CAAC,ECnUzC,IAAMC,GACXC,GACiC,CACjC,GAAI,OAAO,QAAW,YAGtB,GAAI,CACF,IAAMC,EAAM,OAAO,aAAa,QAC9B,GAAGC,EAA2B,GAAGF,CAAQ,EAC3C,EACA,OAAOC,EAAO,KAAK,MAAMA,CAAG,EAAyB,MACvD,MAAQ,CACN,MACF,CACF,EAEaE,GAAwB,CACnCH,EACAI,IACS,CACT,GAAI,OAAO,QAAW,YACpB,OAEF,IAAMC,EAAM,GAAGH,EAA2B,GAAGF,CAAQ,GACrD,GAAI,CACF,GAAI,CAACI,GAAc,OAAO,KAAKA,CAAU,EAAE,SAAW,EAAG,CACvD,OAAO,aAAa,WAAWC,CAAG,EAClC,MACF,CACA,OAAO,aAAa,QAAQA,EAAK,KAAK,UAAUD,CAAU,CAAC,CAC7D,MAAQ,CAER,CACF,EChCO,IAAME,GAAuB,CAClCC,EACAC,EACAC,IAEAC,GAAqB,CACnB,KAAAH,EACA,eAAgBI,GAChB,QAASH,EACT,gBAAiBI,GACjB,IAAAH,CACF,CAAC,EAMUI,GAAN,KAAsB,CAAtB,cAEL,KAAQ,QAA+B,KAEvC,MAAMN,EAA6BC,EAAkBC,EAA+B,CAC9EA,IAAQ,KAAK,MAAQ,KAAK,SAAW,CAACA,KAC1C,KAAK,OAAO,EACZ,KAAK,IAAMA,EACPA,IAAK,KAAK,QAAUH,GAAqBC,EAAMC,EAAUC,CAAG,GAClE,CAEA,QAAe,CAtCjB,IAAAK,GAuCIA,EAAA,KAAK,UAAL,MAAAA,EAAA,WACA,KAAK,QAAU,KACf,KAAK,IAAM,MACb,CACF,EChBO,IAAMC,GAAmB,CAC9BC,EACAC,EACAC,IACS,CAIT,GAHI,OAAO,UAAa,cAEtBF,aAAgB,SAAWA,EAAK,eAAeC,CAAE,EAAID,EAAK,cAAc,IAAIC,CAAE,EAAE,GACpE,OACd,IAAME,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,GAAKF,EACXE,EAAM,YAAcD,GACnBF,aAAgB,SAAWA,EAAK,KAAOA,GAAM,YAAYG,CAAK,CACjE,EAEMC,GAAI,IAAIC,EAAqB,IAE7BC,GAAe;AAAA;AAAA,0DAGfC,GAAqB;AAAA;AAAA,0DAKrBC,GAAkBC,GACtB,CAACC,EAAiB,MAAOA,EAAiB,SAAS,EAChD,IAAKC,GAAS,cAAcA,CAAI,KAAKF,CAAM;AAAA,IAAO,EAClD,KAAK;AAAA,CAAI,EAODG,GAAY;AAAA;AAAA;AAAA;AAAA,MAInBR,EAAC,IAAIS,EAAc,KAAKC,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA,eAKrBJ,EAAiB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMhCF,GAAeF,EAAY,CAAC;AAAA;AAAA,eAEjBI,EAAiB,IAAI;AAAA;AAAA;AAAA;AAAA,eAIrBA,EAAiB,MAAM;AAAA;AAAA;AAAA;AAAA,eAIvBA,EAAiB,GAAG;AAAA;AAAA;AAAA;AAAA,eAIpBA,EAAiB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMhCN,EAAC,IAAIW,EAAgB,KAAKC,EAAU;AAAA,IACpCZ,EAAC,IAAIW,EAAgB,KAAKC,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMvBN,EAAiB,IAAI;AAAA;AAAA;AAAA,MAGhCF,GAAeD,EAAkB,CAAC;AAAA,iBACvBG,EAAiB,MAAM;AAAA;AAAA;AAAA,iBAGvBA,EAAiB,GAAG;AAAA;AAAA;AAAA,MAG/BN,EAAC;AAAA,MACDA,EAAC;AAAA;AAAA;AAAA;AAAA,EAMDa,GAAI,IAAIZ,EAAqB,KAAKa,EAAoB,YAMtDC,GAAoD,CACxD,CAACC,EAAW,MAAM,EAAG,eACrB,CAACA,EAAW,SAAS,EAAG,4BACxB,CAACA,EAAW,WAAW,EAAG,4BAC1B,CAACA,EAAW,KAAK,EAAG,2BACpB,CAACA,EAAW,OAAO,EAAG,2BACtB,CAACA,EAAW,QAAQ,EAAG,4BACvB,CAACA,EAAW,OAAO,EAAG,2BACxB,EAEMC,GAAKV,GAAiB,OAAOA,CAAI,KAAKQ,GAAgBR,CAAI,CAAC,IAG3DW,GAAI,GAAGL,EAAC,SAASM,EAAiB,KAAKC,EAAc,MAQ9CC,GAAW;AAAA;AAAA;AAAA,IAGpBR,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA;AAAA;AAAA;AAAA,IAIDA,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA,yBACoBI,GAAED,EAAW,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOzCE,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA,wBACmBI,GAAkB,UAAU,KAAKL,GAAED,EAAW,SAAS,CAAC;AAAA,wBACxDC,GAAED,EAAW,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,IAIzCH,EAAC,KAAKU,EAAe,OAAOA,EAAe;AAAA,4BACnBN,GAAED,EAAW,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA,IAI9CH,EAAC;AAAA,kCAC6BW,EAAO,OAAO;AAAA;AAAA;AAAA;AAAA,IAI5CX,EAAC;AAAA;AAAA;AAAA;AAAA,IAIDA,EAAC;AAAA;AAAA;AAAA;AAAA,IAIDA,EAAC;AAAA,wBACmBI,GAAED,EAAW,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA,MAI3CH,EAAC;AAAA;AAAA;AAAA;AAAA,EAeDY,GAAI,IAAIxB,EAAqB,KAAKkB,EAAiB,KAAKC,EAAc,KAEtEM,GAAS,OAAOV,EAAW,MAAM,SAASM,GAAkB,MAAM,cAClEK,GAAQ,OAAOX,EAAW,KAAK,SAASM,GAAkB,UAAU,cACpEM,GAAO,OAAON,GAAkB,IAAI,aACpCO,GAAU,OAAOb,EAAW,OAAO,SAASM,GAAkB,UAAU,cACxEQ,GAAa,OAAOd,EAAW,OAAO,aAEtCe,GAAeC,GAAoC,CACvD,GAAM,CAAE,MAAAC,EAAO,OAAAC,EAAQ,MAAAC,CAAM,EAAIC,GAAaJ,CAAI,EAC5CK,EAASJ,EAAQE,EAAQG,GAAqB,EAC9CC,EAAM,GAAGd,EAAC,sBAAsBO,CAAI,GAC1C,MAAO;AAAA,MACHO,CAAG;AAAA,eACMN,CAAK;AAAA,gBACJC,CAAM;AAAA;AAAA;AAAA,0BAGIP,EAAK;AAAA;AAAA,2CAEYH,EAAO,OAAO;AAAA;AAAA;AAAA,MAGnDe,CAAG;AAAA,MACHA,CAAG;AAAA;AAAA;AAAA,aAGID,EAAkB;AAAA,cACjBA,EAAkB;AAAA,eACjBH,CAAK;AAAA,gBACJA,CAAK;AAAA;AAAA;AAAA,oBAGDP,EAAI;AAAA;AAAA;AAAA;AAAA,oCAIYJ,EAAO,SAAS;AAAA;AAAA;AAAA,MAG9Ce,CAAG;AAAA,0BACiBb,EAAM;AAAA;AAAA;AAAA,MAG1Ba,CAAG;AAAA,8BACqBF,CAAM;AAAA;AAAA;AAAA;AAAA,GAKpC,EAEaG,GAAY;AAAA,IACrBT,GAAY,OAAO,CAAC;AAAA,IACpBA,GAAY,QAAQ,CAAC;AAAA;AAAA;AAAA,IAGrBN,EAAC;AAAA;AAAA;AAAA,0BAGqBI,EAAO;AAAA;AAAA,wBAETC,EAAU;AAAA;AAAA,yCAEON,EAAO,OAAO;AAAA,2BAC5BA,EAAO,OAAO;AAAA;AAAA;AAAA,IAGrCC,EAAC;AAAA,wBACmBC,EAAM;AAAA,oBACVA,EAAM;AAAA;AAAA;AAAA,IAGtBD,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAODA,EAAC;AAAA,IACDA,EAAC;AAAA,IACDA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAODA,EAAC,IAAId,EAAgB,KAAKC,EAAU;AAAA,IACpCa,EAAC,IAAId,EAAgB,KAAKC,EAAU;AAAA,IACpCa,EAAC,IAAId,EAAgB,KAAKC,EAAU;AAAA,IACpCa,EAAC,IAAId,EAAgB,KAAKC,EAAU;AAAA,IACpCa,EAAC,IAAId,EAAgB,KAAKC,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA,MAKlCa,EAAC;AAAA,MACDA,EAAC;AAAA,MACDA,EAAC;AAAA,MACDA,EAAC;AAAA,MACDA,EAAC;AAAA;AAAA;AAAA;AAAA,EAOMgB,GAAsB7C,GACjCD,GAAiBC,EAAM8C,GAAiBlC,EAAS,EAGtCmC,GAAqB/C,GAChCD,GAAiBC,EAAMgD,GAAgBvB,EAAQ,EAGpCwB,GAAsBjD,GACjCD,GAAiBC,EAAMkD,GAAiBN,EAAS,ECvKnD,IAAMO,GAAyB,gBAQzBC,GAAY,CAChBC,EACAC,EACAC,EACAC,EAAoC,CAAC,IAC5B,CACT,OAAW,CAAE,KAAAC,CAAK,IAAK,MAAM,KAAKJ,EAAQ,UAAU,EAC9CI,EAAK,WAAWN,EAAsB,GAAK,EAAEM,KAAQF,IACvDF,EAAQ,gBAAgBI,CAAI,EAGhC,OAAW,CAACA,EAAMC,CAAK,IAAK,OAAO,QAAQH,CAAU,EACnDF,EAAQ,aAAaI,EAAMC,CAAK,EAElCL,EAAQ,gBAAgB,OAAO,EAC/BM,GAAYN,EAASC,CAAK,EAC1BM,GAAkBP,EAASG,CAAS,CACtC,EAEaK,GAAN,KAAsB,CAuD3B,YAAYC,EAAuB,CAnDnC,KAAQ,OAA6B,KACrC,KAAQ,WAAgC,KACxC,KAAQ,qBAAsC,KAC9C,KAAQ,qBAAsC,KAC9C,KAAQ,UAAgC,KACxC,KAAQ,QAA8B,KAGtC,KAAQ,YAAuC,KAC/C,KAAQ,4BAAuD,KAC/D,KAAQ,gBAAwC,CAAC,EACjD,KAAQ,cAAoC,KAC5C,KAAQ,gBAAsC,KAC9C,KAAQ,iBAAgD,KACxD,KAAQ,gBAA8C,KACtD,KAAQ,gBAA0C,KAClD,KAAQ,YAAmC,KAC3C,KAAQ,WAAgC,KACxC,KAAQ,iBAA4C,KACpD,KAAQ,kBAA0D,KAClE,KAAQ,mBAA4D,KACpE,KAAQ,kBAAmC,KAC3C,KAAQ,yBAA0C,KAClD,KAAQ,wBAA+C,KACvD,KAAQ,WAAa,IAAIC,GACzB,KAAQ,SAAoC,KAE5C,KAAQ,iBAA0C,KAClD,KAAQ,aAAmC,KAC3C,KAAQ,cAA0C,KAGlD,KAAQ,KAAyB,KACjC,KAAQ,UAAY,IAAIC,GAExB,KAAQ,aAA+C,CAAE,MAAO,GAAO,IAAK,EAAM,EAClF,KAAQ,YAAmE,CAAC,EAC5E,KAAQ,eAAiB,GAGzB,KAAQ,UAAsC,KAC9C,KAAQ,aAAyC,KACjD,KAAQ,WAAuC,KAC/C,KAAQ,cAAoC,KAC5C,KAAQ,QAA8B,KACtC,KAAQ,cAAoC,KAC5C,KAAQ,iBAAuC,KAC/C,KAAQ,oBAAgD,KACxD,KAAQ,oBAAgD,KACxD,KAAQ,UAAgC,KAGtC,KAAK,QAAUF,EACf,KAAK,UAAYG,GAAuBH,EAAQ,QAASA,EAAQ,aAAa,EAC9E,KAAK,MAAQ,IAAII,GAAkB,CACjC,UAAW,GACX,aAAc,GACd,mBAAoB,GACpB,oBAAqB,GACrB,QAAS,KACT,iBAAkB,CAAC,EACnB,qBAAsB,CAAC,EACvB,6BAA8B,CAAC,EAC/B,gBAAiB,CAAC,EAClB,kBAAmB,CAAC,EACpB,kBAAmB,CAAC,EACpB,0BAA2B,CAAC,EAC5B,kBAAmB,CAAC,EACpB,kBAAmB,CAAC,EACpB,oBAAqB,GACrB,2BAA4B,GAC5B,iBAAkBJ,EAAQ,UAAY,KACtC,aAAc,KACd,WAAY,KACZ,qBAAsB,CAAC,EACvB,yBAA0B,CAAC,EAC3B,YAAa,GACb,kBAAmB,GACnB,oBAAqB,GACrB,iBAAkB,GAClB,uBAAwB,GACxB,sBAAuB,KACvB,uBAAwB,GACxB,yBAA0B,GAC1B,gBAAiB,GACjB,kBAAmB,KACnB,sBAAuB,KACvB,qBAAsB,GACtB,iBAAkB,CAAE,aAAc,GAAI,gBAAiB,GAAI,qBAAsB,EAAG,CACtF,CAAC,EACD,KAAK,WAAaK,GAAiB,oBAAoB,EAEvD,KAAK,YAAcA,GAAiBC,EAAiB,CAGvD,CAEA,MAAM,MAAsB,CAC1B,KAAK,YAAc,KAAK,MAAM,UAAU,CAACC,EAAOC,IAAc,CAC5D,KAAK,kBAAkBD,EAAOC,CAAS,CACzC,CAAC,EAED,KAAK,WAAW,UAAU,IAAM,KAAK,QAAQ,CAAC,EAC9C,KAAK,YAAY,UAAU,IAAM,KAAK,QAAQ,CAAC,EAG/C,KAAK,iBAAmBC,GAAqB,KAAK,QAAQ,QAAQ,EAGlE,KAAK,yBAAyB,EAG9B,MAAM,KAAK,YAAY,CACzB,CAEA,SAAgB,CA5TlB,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GA6TIJ,EAAA,KAAK,kBAAL,MAAAA,EAAsB,SACtBC,EAAA,KAAK,kBAAL,MAAAA,EAAA,YACAC,EAAA,KAAK,cAAL,MAAAA,EAAA,WACA,KAAK,WAAW,QAAQ,EACxB,KAAK,YAAY,QAAQ,GACzBC,EAAA,KAAK,aAAL,MAAAA,EAAiB,UACjB,KAAK,YAAY,GACjBC,EAAA,KAAK,gBAAL,MAAAA,EAAoB,UACpB,KAAK,cAAgB,KACrB,KAAK,gBAAgB,EACrB,KAAK,UAAU,OAAO,EACtB,KAAK,MAAM,QAAQ,EAIf,KAAK,QAAU,KAAK,OAAO,YAC7B,KAAK,OAAO,WAAW,YAAY,KAAK,MAAM,EAI5C,KAAK,uBAAyB,OAChC,SAAS,KAAK,MAAM,SAAW,KAAK,qBACpC,KAAK,qBAAuB,MAE1B,KAAK,uBAAyB,OAChC,SAAS,gBAAgB,MAAM,SAAW,KAAK,qBAC/C,KAAK,qBAAuB,MAG9B,KAAK,OAAS,KACd,KAAK,WAAa,KAClB,KAAK,UAAY,KACjB,KAAK,QAAU,KACf,KAAK,YAAc,KACnB,KAAK,iBAAmB,IAC1B,CAEA,YAAYC,EAA2B,CACrC,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,YAAAA,CAAY,EAC9C,KAAK,kBAAkB,CACzB,CAIQ,mBAA0B,CAChC,GAAI,CAAC,KAAK,SAAW,KAAK,cAAe,OACzC,IAAMC,EAAO,KAAK,WAAW,kBAAkB,KAAK,QAAQ,WAAW,EACnEA,GAAW,KAAK,aAAaA,CAAI,CACvC,CAEQ,WAAWA,EAA2B,CA/WhD,IAAAN,EAAAC,EAAAC,EAAAC,EAAAC,EAgXI,IAAMG,EAAY,KAAK,WAAW,SAClC,OAAK,KAAK,WAAW,KAAK,KAAK,QAAQ,QAASD,CAAI,EAChDC,IACFP,EAAA,KAAK,WAAL,MAAAA,EAAe,OAAO,KAAK,WAAW,MAC/B,KAET,KAAK,aAAa,GAClBC,EAAA,KAAK,WAAL,MAAAA,EAAe,WAAW,IAC1BG,GAAAF,EAAA,KAAK,WAAL,aAAAC,EAAAD,EAAe,WAAU,iBAAzB,MAAAE,EAAA,KAAAD,EAA0C,CAAE,MAAO,SAAU,GACtD,IARuD,EAShE,CAEQ,cAAqB,CA5X/B,IAAAH,EAAAC,EAAAC,EAAAC,EA6XI,KAAK,SAAW,KAChB,IAAMN,EAAQ,KAAK,MAAM,SAAS,EAC5BW,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cAChCS,EAAO,KAAK,KAClB,GAAI,CAAC,KAAK,WAAW,UAAY,CAAC,KAAK,cAAgB,CAACD,GAAW,CAACC,EAAM,OAC1EC,GAAe,KAAK,YAAY,EAChC,IAAMC,EAAO,KAAK,QAAQ,QACpBC,EAASC,GAAiBhB,EAAM,gBAAgB,EAChD,CAAE,OAAAiB,CAAO,EAAIL,EACnB,KAAK,SAAWM,GAAmB,CACjC,OAAOd,EAAAU,GAAA,YAAAA,EAAM,QAAN,KAAAV,EAAeW,EAAO,SAC7B,aAAaV,EAAAS,GAAA,YAAAA,EAAM,cAAN,KAAAT,EAAqBU,EAAO,eACzC,aAAaT,EAAAQ,GAAA,YAAAA,EAAM,cAAN,KAAAR,EAAqBS,EAAO,UACzC,eAAgBA,EAAO,aACvB,KAAM,KAAK,WAAW,KACtB,OAAQ,CACN,MAAOE,EAAO,aACd,MAAOA,EAAO,aACd,YAAaA,EAAO,mBACpB,OAAQA,EAAO,cACf,MAAOA,EAAO,aACd,MAAOA,EAAO,aACd,OAAQ,CAAE,GAAGA,EAAO,OAAQ,GAAGA,EAAO,aAAc,GAAGA,EAAO,aAAc,CAC9E,EACA,YAAaL,EAAK,QAAQ,UAC1B,eAAiBO,GAAW,KAAK,WAAW,UAAUA,CAAM,EAC5D,UAAW,IAAG,CAAQ,KAAK,iBAAiB,EAC9C,CAAC,EACD,KAAK,aAAa,sBAAsB,WAAY,KAAK,SAAS,SAAS,CAC7E,CAEA,MAAc,kBAAkC,CA5ZlD,IAAAhB,EAAAC,EA6ZI,IAAMgB,EAAW,MAAM,KAAK,WAAW,OACrC,KAAK,QAAQ,QACb,KAAK,QAAQ,YACb,IAAG,CAhaT,IAAAjB,EAgaY,OAAAA,EAAA,KAAK,WAAL,YAAAA,EAAe,OAAO,KAAK,WAAW,OAC5Ca,GAAiB,KAAK,MAAM,SAAS,EAAE,gBAAgB,EAAE,SAC3D,EACA,GAAK,KAAK,QACV,IAAI,CAACI,EAAU,EACbjB,EAAA,KAAK,WAAL,MAAAA,EAAe,OAAO,KAAK,WAAW,OACtCC,EAAA,KAAK,WAAL,MAAAA,EAAe,WAAW,GAC1B,MACF,CACA,KAAK,iBAAmB,KACxB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACzB,CAEQ,aAAaiB,EAAqBC,EAA0B,CA9atE,IAAAnB,EA+aI,KAAK,WAAW,kBAAkB,EAClC,IAAMH,EAAQ,KAAK,MAAM,SAAS,EAC5BY,EAAO,KAAK,KAClB,GACE,EAACA,GAAA,MAAAA,EAAM,WAAW,sBAClBZ,EAAM,4BACN,CAAC,KAAK,WACN,CACAsB,EAAO,EACP,MACF,CACI,KAAK,eAAiBtB,EAAM,cAC5BqB,IAAS,mBAAqB,CAAC,KAAK,eAAerB,CAAK,EAAE,KAC9D,KAAK,cAAgBuB,GAAkB,CACrC,KAAM,KAAK,WACX,OAAQF,EACR,SAAUrB,EAAM,iBAChB,UAAW,IAAM,CACf,KAAK,cAAgB,KACrBsB,EAAO,CACT,EACA,SAAU,IAAM,CACd,KAAK,cAAgB,IACvB,EACA,aAAc,CACZ,GAAGV,EAAK,QAAQ,UAChB,YAAaA,EAAK,QAAQ,UAAU,eACtC,EACA,KAAMA,EAAK,YACX,eAAgBA,EAAK,eACrB,cAAeA,EAAK,aACpB,YAAYT,EAAA,KAAK,UAAL,YAAAA,EAAc,MAAM,UAClC,CAAC,EACH,CAQQ,eAAgC,CAxd1C,IAAAA,EA2dI,IAAMqB,GAAgBrB,EAAA,KAAK,QAAQ,iBAAb,YAAAA,EAA6B,OAC7CsB,EAAcD,GAAA,MAAAA,EAAe,SAAS,KAAOA,EAAgB,OAC7DE,EACJF,GAAiB,CAACA,EAAc,SAAS,GAAG,EAAIA,EAAgB,OAClE,MAAO,CACL,MAAO,KAAK,QAAQ,MAKpB,YAAa,KAAK,QAAQ,MAAQ,KAAK,QAAQ,YAC/C,aAAc,KAAK,QAAQ,OAAS,KAAK,QAAQ,cAAgBC,EACjE,cACE,KAAK,QAAQ,QAAU,KAAK,QAAQ,eAAiBC,EACvD,iBAAkB,KAAK,QAAQ,iBAC/B,cAAe,KAAK,QAAQ,aAC9B,CACF,CAEA,MAAc,aAA6B,CA9e7C,IAAAvB,EAAAC,EAAAC,EAAAC,EAAAC,EA+eI,KAAK,gBAAkB,IAAI,gBAC3B,KAAK,MAAM,SAAS,CAAE,UAAW,GAAM,WAAY,IAAK,CAAC,EAEzD,GAAI,CAMF,IAAMoB,EACJ,KAAK,UAAU,eACf,CAAC,KAAK,QAAQ,eACd,CAAC,KAAK,QAAQ,MACV,KAAK,UAAU,cACf,KAAK,UAAU,QACfC,EAAO,MAAMC,GAAoB,CACrC,SAAU,KAAK,QAAQ,SACvB,YAAa,KAAK,QAAQ,YAC1B,aAAc,KAAK,QAAQ,aAC3B,QAASF,EACT,SAAU,KAAK,QAAQ,SACvB,cAAe,KAAK,QAAQ,cAC5B,iBAAkB,KAAK,QAAQ,iBAAmB,MAClD,6BAA8B,KAAK,QAAQ,0BAC3C,OAAQ,KAAK,gBAAgB,OAC7B,GAAG,KAAK,cAAc,CACxB,CAAC,EAEKG,EAAeF,EAAK,OAAO,cAGjCG,GAAsB,KAAK,QAAQ,SAAUD,EAAa,UAAU,EAQpE,IAAIE,EAAoBJ,EAAK,OAAO,mBAChCK,EAAoBL,EAAK,OAAO,mBAChCM,EAAuB,GAC3B,GAAI,KAAK,UAAU,eAAiB,CAAC,KAAK,QAAQ,cAAe,CAC/D,IAAMC,EAAe,MAAMC,GAAyB,CAGlD,aAAajC,EAAA,KAAK,QAAQ,cAAb,KAAAA,EAA4B,GACzC,cAAe,KAAK,UAAU,cAC9B,WAAY,KAAK,QAAQ,SACzB,OAAQ,KAAK,gBAAgB,MAC/B,CAAC,EACD,GAAIgC,EAAc,CAChB,IAAME,EAAUC,GAA0BH,EAAcL,EAAa,QAAQ,EAC7EG,GAAoB7B,EAAAiC,GAAA,YAAAA,EAAS,qBAAT,KAAAjC,EAA+B,GACnD4B,EAAoBK,GAAA,YAAAA,EAAS,mBAC7BH,EAAuB,EAAQG,CACjC,CACF,CAGA,IAAME,EAA4C,CAAC,EAC7CC,EAAwD,CAAC,EAO3DC,EAA0C,CAAC,EAC3CC,EAA8C,CAAC,EAC/CC,EAA6B,GAC3BC,EAAcC,GAClBb,EACAJ,EAAK,OAAO,0BACd,EACMkB,EAAWC,GAAOjB,CAAY,EAC9BkB,EAAoB,GACxB,KAAK,QAAQ,2BACXF,EAAS,OAAS,GAClBG,GAAiBH,EAAUF,CAAW,GAIpCM,EAAkBC,GACtBrB,EAAa,SACbA,EAAa,SACbA,EAAa,qBACf,EACA,GAAIE,IAAsBC,GAAqBC,GAAwBc,GACrE,QAAWI,KAAWF,EAAiB,CACrC,IAAMG,EAAYrB,EAAkBoB,EAAQ,IAAI,EAGhD,GAFAb,EAAiBa,EAAQ,IAAI,EAAI,GAE7BC,GAAaA,EAAU,UAAY,CAACA,EAAU,gBAAiB,CACjEX,EAAyB,KAAKU,CAAO,EACrC,QAAWE,KAAMF,EAAQ,cAAe,CACtC,IAAMG,GAAa,GAAGH,EAAQ,IAAI,IAAIE,EAAG,IAAI,GACvCE,GAAcnD,EAAAgD,EAAU,gBAAV,YAAAhD,EAA0BiD,EAAG,MACjDd,EAA6Be,EAAU,GAAIC,GAAA,YAAAA,EAAa,WAAY,EACtE,CACF,MACEf,EAAqB,KAAKW,CAAO,CAErC,KACK,CACLX,EAAuBS,EACvB,QAAWE,KAAWtB,EAAa,SACjCS,EAAiBa,EAAQ,IAAI,EAAI,EAErC,CAIE,KAAK,QAAQ,2BACbX,EAAqB,SAAW,GAChCC,EAAyB,OAAS,IAElCC,EAA6B,IAG/B,IAAMc,EAAcC,GAAiB,CACnC,OAAQ5B,EACR,kBAAAE,EACA,yBAA0BJ,EAAK,OAAO,2BACtC,oBAAqB,KAAK,QAAQ,oBAClC,0BAA2B,KAAK,QAAQ,yBAC1C,CAAC,EACK+B,EAAsBC,GAC1Bd,EACAhB,EAAa,qBACbc,EACAa,EAAY,kBAAoBA,EAAY,qBACxC,CACE,iBAAkBA,EAAY,iBAC9B,qBAAsBA,EAAY,oBACpC,EACAI,GAAcf,EAAUF,CAAW,CACzC,EAEMkB,EAAmBC,GACvB,KAAK,QAAQ,SACbjC,EAAa,iBACbA,EAAa,oCACf,EAMIkC,EAAc,GACdC,EAAsB,GACtBC,EAAoC,CAAC,EACrCC,EAAsC,KAC1C,GAAIvC,EAAK,OAAO,SAAU,CACxBoC,EAAc,GACd,IAAMI,EAAiBC,GAAgB,EAGnCD,GAAA,MAAAA,EAAgB,UAAYA,EAAe,WAAa,KAAK,QAAQ,SACvEE,GAAkB,GAElBF,GAAA,YAAAA,EAAgB,aAAc,sBAC9BA,EAAe,cAGfF,EAAe,CACb,uBAAwB,GACxB,gBAAiB,EACnB,EACAC,EAAuBC,EAAe,eAEtCA,GAAA,YAAAA,EAAgB,sBAAuB,YACvCA,EAAe,uBAGfF,EAAe,CACb,uBAAwB,GACxB,uBAAwB,GACxB,sBAAuBE,EAAe,qBACxC,EACAE,GAAkB,IAElBF,GAAA,YAAAA,EAAgB,sBAAuB,WACvCA,GAAA,YAAAA,EAAgB,sBAAuB,WAGvCF,EAAe,CACb,uBAAwB,GACxB,kBACEE,EAAe,qBAAuB,UAClC,sDACA,yCACN,qBAAsB,EACxB,EACAE,GAAkB,GAGlBL,EAAsB,EAE1B,CAEA,KAAK,MAAM,SAAS,CAClB,QAASrC,EACT,UAAW,GACX,iBAAAkC,EACA,kBAAmBvB,EACnB,6BAAAC,EACA,gBAAiB+B,GAAmBzB,EAAUF,CAAW,EACzD,qBAAAH,EACA,yBAAAC,EACA,2BAAAC,EACA,GAAGc,EACH,GAAGE,EACH,YAAAK,EACA,oBAAAC,EACA,GAAGC,CACL,CAAC,EAIGC,GACF,KAAK,mBAAmBA,CAAoB,CAEhD,OAASK,EAAc,CACrB,GAAKA,EAAc,OAAS,aAAc,OAC1C,IAAMC,EAAQD,EACVC,EAAM,SAAW,KACnB,KAAK,MAAM,SAAS,CAAE,oBAAqB,GAAM,UAAW,EAAM,CAAC,EACnE,KAAK,QAAQ,SAAS,IAEtB,KAAK,MAAM,SAAS,CAAE,WAAYA,EAAO,UAAW,EAAM,CAAC,GAC3DlE,GAAAD,EAAA,KAAK,SAAQ,UAAb,MAAAC,EAAA,KAAAD,EAAuBmE,GAE3B,CACF,CAEQ,kBAAkBzE,EAAmBC,EAA6B,CAExE,GAAIA,EAAU,WAAa,CAACD,EAAM,WAAaA,EAAM,QAAS,CAC5D,KAAK,UAAU,EACf,MACF,CAGA,GAAIA,EAAM,qBAAuB,CAACC,EAAU,oBAAqB,CAC/D,KAAK,QAAQ,EACb,MACF,CAGA,GAAID,EAAM,YAAc,CAACC,EAAU,WAAY,CAC7C,KAAK,YAAYD,EAAM,WAAW,OAAO,EACzC,MACF,CAGA,GAAIA,EAAM,sBAAwBC,EAAU,qBACxCD,EAAM,mBAAqBC,EAAU,kBACrCD,EAAM,yBAA2BC,EAAU,uBAAwB,CACrE,KAAK,UAAU,EACf,MACF,CAGA,GAAID,EAAM,yBACNA,EAAM,yBAA2BC,EAAU,wBAC3CD,EAAM,oBAAsBC,EAAU,mBACtCD,EAAM,kBAAoBC,EAAU,iBACpCD,EAAM,2BAA6BC,EAAU,0BAA2B,CAC1E,KAAK,UAAU,EACf,MACF,EAIED,EAAM,mBAAqBC,EAAU,kBACrCD,EAAM,uBAAyBC,EAAU,uBAEzC,KAAK,iBAAiBD,CAAK,EAIzBA,EAAM,oBAAsBC,EAAU,mBACxC,KAAK,oBAAoBD,CAAK,EAG5BA,EAAM,oBAAsBC,EAAU,mBACxC,KAAK,sBAAsBD,CAAK,EAI9BA,EAAM,eAAiBC,EAAU,cACnC,KAAK,mBAAmBD,CAAK,GAI3BA,EAAM,qBAAuBC,EAAU,oBACvCD,EAAM,sBAAwBC,EAAU,sBAC1C,KAAK,mBAAmBD,CAAK,CAEjC,CAEQ,QAAQA,EAA8B,CA7xBhD,IAAAG,EAAAC,EA8xBI,OAAOsE,GAAe,CACpB,SAAU,KAAK,QAAQ,SACvB,SAAStE,GAAAD,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,gBAAtB,KAAAC,EAAuC,KAChD,iBAAkB,KAAK,iBACvB,SAAU,KAAK,QAAQ,SACvB,YAAa,KAAK,YAAY,QAC9B,SAAU,KAAK,WAAW,OAC5B,CAAC,CACH,CAGQ,SAAgB,CACtB,IAAMJ,EAAQ,KAAK,MAAM,SAAS,EAC9BA,EAAM,SAAW,CAACA,EAAM,UAC1B,KAAK,UAAU,EACNA,EAAM,WACf,KAAK,cAAc,CAEvB,CAGQ,UAAoB,CAnzB9B,IAAAG,EAAAC,EAozBI,QAAQA,GAAAD,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAO,SAAlB,KAAAC,EAA4B,KAAS,CAACuE,GAAqB,CACrE,CAOQ,YAAY/D,EAAiBgE,EAAoBC,EAAwB,CAC/E,IAAMC,EAAO,KAAK,WAClB,GAAI,CAACA,GAAQ,CAAC,KAAK,QAAS,OAC5B,KAAK,KAAOlE,EACZmE,GAAmBD,CAAI,EACnBlE,EAAK,MAAMoE,GAAkBF,CAAI,EACjClE,EAAK,eAAeqE,GAAmBH,CAAI,EAC/C,KAAK,UAAU,MAAMA,EAAM,KAAK,QAAQ,SAAUlE,EAAK,WAAW,SAAS,EAEvE,KAAK,WACP7B,GAAU,KAAK,UAAW6B,EAAK,aAAc,CAC3C,GAAGA,EAAK,eACR,GAAGsE,EAAK,SAAS,CACnB,CAAC,EAGH,IAAMhG,EAAa,CACjB,GAAG0B,EAAK,eACR,GAAGsE,EAAK,MAAM,EACd,GAAGC,GAAevE,CAAI,EACtB,CAACwE,EAA0B,EAAG,EAChC,EAIMnG,EADO4F,GAAWjE,EAAK,iBAAmBA,EAAK,KAEjD,CAAE,GAAGA,EAAK,KAAM,MAAM,WAAY,WAAAgE,CAAW,EAC7C,CAAE,GAAGhE,EAAK,WAAY,WAAAgE,CAAW,EACrC7F,GAAU,KAAK,QAASE,EAAOC,EAAY0B,EAAK,YAAY,CAC9D,CAEQ,0BAAiC,CAMvC,KAAK,OAAS,SAAS,cAAc,KAAK,EAC1C,KAAK,OAAO,aAAa,uBAAwB,EAAE,EAMnD,KAAK,OAAO,MAAM,SAAW,QAC7B,KAAK,OAAO,MAAM,IAAM,IACxB,KAAK,OAAO,MAAM,KAAO,IACzB,KAAK,OAAO,MAAM,MAAQ,IAC1B,KAAK,OAAO,MAAM,OAAS,IAC3B,KAAK,OAAO,MAAM,OAAS,aAC3B,SAAS,KAAK,YAAY,KAAK,MAAM,EACrC,KAAK,WAAa,KAAK,OAAO,aAAa,CAAE,KAAM,MAAO,CAAC,EAK3D,KAAK,qBAAuB,SAAS,KAAK,MAAM,SAChD,KAAK,qBAAuB,SAAS,gBAAgB,MAAM,SAC3D,SAAS,KAAK,MAAM,SAAW,SAC/B,SAAS,gBAAgB,MAAM,SAAW,SAG1CyE,GAAqB,KAAK,UAAU,EACpCC,GAAuB,KAAK,UAAU,EAGtC,KAAK,WAAa,IAAIC,GACpB,IAAM,KAAK,qBAAqB,EAChC,KAAK,UACP,EAII,KAAK,QAAQ,UAAY,KAC3B,KAAK,UAAYC,EAAG,MAAO,CAAE,KAAM,cAAe,CAAC,EACnD,KAAK,WAAW,YAAY,KAAK,SAAS,GAG5C,KAAK,QAAUA,EAAG,MAAO,CACvB,KAAM,SACN,aAAc,OACd,aAAc,iBAChB,CAAC,EACD,KAAK,WAAW,YAAY,KAAK,OAAO,EACxC,KAAK,cAAc,CACrB,CAEQ,eAAsB,CAn5BhC,IAAArF,EAo5BI,GAAI,CAAC,KAAK,QAAS,OACnB,IAAMS,EAAO,KAAK,QAAQ,KAAK,MAAM,SAAS,CAAC,EACzCgE,EAAaa,GAAwB,CAAE,UAAUtF,EAAA,KAAK,QAAQ,WAAb,YAAAA,EAAuB,IAAK,CAAC,EACpF,KAAK,YAAYS,EAAMgE,EAAY,EAAI,EACvCc,GAAa,KAAK,OAAO,EACzB,GAAM,CAAE,OAAAzE,CAAO,EAAIL,EAEnB,GAAIA,EAAK,iBAAmBA,EAAK,KAAM,CACrC,KAAK,QAAQ,YACX4E,EACE,MACA,CACE,KAAM,SACN,YAAa,SACb,aAAc,yBACd,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,MAAO,CAC9D,EACAA,EAAG,MAAO,CAAE,MAAOvE,EAAO,eAAgB,cAAe,MAAO,CAAC,EACjEuE,EAAG,IAAK,CAAE,MAAO,CAAE,GAAG5E,EAAK,KAAK,MAAM,WAAY,MAAOA,EAAK,YAAa,CAAE,EAAG,YAAY,CAC9F,CACF,EACA,MACF,CAEA,IAAM+E,EAAYH,EAChB,MACA,CACE,KAAM,SACN,YAAa,SACb,aAAc,yBACd,MAAOvE,EAAO,gBAChB,EACAuE,EAAG,MAAO,CAAE,MAAOvE,EAAO,eAAgB,cAAe,MAAO,CAAC,EACjEuE,EAAG,IAAK,CAAE,MAAO,CAAE,GAAGvE,EAAO,YAAa,MAAOL,EAAK,SAAU,CAAE,EAAG,YAAY,CACnF,EACA,KAAK,QAAQ,YACX4E,EAAG,MAAO,CAAE,MAAO,CAAE,GAAGvE,EAAO,QAAS,GAAGL,EAAK,WAAW,OAAQ,CAAE,EAAG+E,CAAS,CACnF,CACF,CAGQ,YAAY/E,EAAiBgF,EAA+B,CA77BtE,IAAAzF,EA87BI,MAAO,CACL,OAAQS,EAAK,OACb,WAAYA,EAAK,WACjB,aAAcA,EAAK,aACnB,UAAWA,EAAK,UAChB,eAAgBA,EAAK,WAAW,OAAO,WACvC,iBAAkBA,EAAK,iBACvB,SAAAgF,EACA,YAAahF,EAAK,YAClB,cAAcT,EAAAS,EAAK,OAAL,YAAAT,EAAW,MAAM,aAC/B,cAAeS,EAAK,cACpB,cAAeA,EAAK,aACtB,CACF,CAEQ,iBAAwB,CAC9B,QAAWiF,KAAQ,OAAO,OAAO,KAAK,WAAW,EAAGA,GAAA,MAAAA,EAAM,UAC1D,KAAK,YAAc,CAAC,CACtB,CAOQ,kBACNC,EACAC,EACAnF,EACAoF,EACa,CA59BjB,IAAA7F,EA69BI,GAAI,CAACS,EAAK,OAAO,oBACf,OAAOmF,EAET,IAAME,GAAQ9F,EAAA+F,GAAiB,KAAK,MAAM,SAAS,EAAE,gBAAgB,IAAvD,YAAA/F,EAA2D2F,GACnED,EAAOM,GAAsB,CACjC,QAAS,kBAAkBL,CAAO,GAClC,KAAMA,IAAY,QAAU,OAAS,SACrC,MAAOG,GAAA,KAAAA,EAAUD,EAAO,SAAWA,EAAO,UAAYI,GAAuBN,CAAO,EACpF,WAAY,CAACG,EACb,KAAMA,GAAQD,EAAO,SAAW,OAChC,KAAM,KAAK,aAAaF,CAAO,GAAK,KAAK,eACzC,OAAQ,KAAK,eACb,SAAU,IAAM,KAAK,oBAAoBA,CAAO,EAChD,OAAQlF,EAAK,MAAM,UACnB,QAAS,IAAM,KAAK,SAAS,EAC7B,QAASmF,CACX,CAAC,EACD,YAAK,YAAYD,CAAO,EAAID,EACrBA,EAAK,OACd,CAEQ,oBAAoBC,EAA8B,CACxD,KAAK,aAAe,CAAE,GAAG,KAAK,aAAc,CAACA,CAAO,EAAG,CAAC,KAAK,aAAaA,CAAO,CAAE,EACnF,KAAK,aAAa,CACpB,CAGQ,cAAqB,CAx/B/B,IAAA3F,EAy/BI,QAAW2F,KAAWO,IACpBlG,EAAA,KAAK,YAAY2F,CAAO,IAAxB,MAAA3F,EAA2B,SACzB,KAAK,aAAa2F,CAAO,GAAK,KAAK,eACnC,KAAK,eAGX,CAEQ,sBAA6B,CAjgCvC,IAAA3F,EAAAC,EAAAC,EAkgCI,IAAMiG,EAAM,KAAK,WACXC,EAAS,GAAQD,IAAQA,EAAI,WAAaA,EAAI,WACpD,GAAIC,IAAW,KAAK,eAAgB,CAClC,GAAI,CAACA,EAAQ,CAIX,IAAMC,GAAUpG,GAAAD,EAAA,KAAK,aAAL,YAAAA,EAAiB,gBAAjB,KAAAC,EAAkC,KAClD,QAAW0F,KAAWO,IAChBhG,EAAA,KAAK,YAAYyF,CAAO,IAAxB,MAAAzF,EAA2B,WAAWmG,KACxC,KAAK,aAAe,CAAE,GAAG,KAAK,aAAc,CAACV,CAAO,EAAG,EAAK,EAGlE,CACA,KAAK,eAAiBS,EACtB,KAAK,aAAa,CACpB,CACA,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,CACvB,CAMQ,wBAA+B,CA3hCzC,IAAApG,EAAAC,EA4hCI,IAAMqG,GAAYtG,EAAA,KAAK,aAAL,MAAAA,EAAiB,UAAY,KAAK,WAAW,iBAAmB,KAC5EH,EAAQ,KAAK,MAAM,SAAS,EAC5BW,GAAUP,EAAAJ,EAAM,UAAN,YAAAI,EAAe,OAAO,cACtC,GAAI,CAACqG,GAAa,CAAC9F,EAAS,OAC5B,IAAM+F,EAAQ/F,EAAQ,SAAS,KAC5ByC,GACCqD,IAAc,gBAAgBrD,EAAQ,IAAI,IAC1CqD,IAAc,uBAAuBrD,EAAQ,IAAI,IACjDA,EAAQ,cAAc,KACnBpE,GAAYyH,IAAc,gBAAgBrD,EAAQ,IAAI,IAAIpE,EAAQ,IAAI,EACzE,CACJ,EACA,GAAI,CAAC0H,EAAO,OACZ,IAAMC,EAAO5D,GAAOpC,CAAO,EACxB,OAAQiG,GAAQA,EAAI,QAAQ,OAASF,EAAM,IAAI,EAC/C,IAAKE,GAAQC,EAAkBD,EAAI,YAAaF,EAAM,IAAI,CAAC,EAC3D,OAAQI,GAAQ9G,EAAM,kBAAkB8G,CAAG,CAAC,EAC/C,GAAIH,EAAK,SAAW,EAAG,OACvB,IAAMI,EAAoB,CAAE,GAAG/G,EAAM,iBAAkB,EACvD,QAAW8G,KAAOH,EAAMI,EAAkBD,CAAG,EAAI,GACjD,KAAK,MAAM,SAAS,CAAE,kBAAAC,CAAkB,CAAC,CAC3C,CAEQ,WAAkB,CAnjC5B,IAAA5G,EAAAC,EAAAC,GAAAC,GAAAC,EAAAyG,GAojCI,IAAMhH,EAAQ,KAAK,MAAM,SAAS,EAClC,GAAI,CAACA,EAAM,SAAW,CAAC,KAAK,QAAS,OAErC,IAAM8B,EAAe9B,EAAM,QAAQ,OAAO,cACpCiH,EAAc,KAAK,QAAQ,SAC3BC,EAAW,KAAK,WAAW,QAC3BtG,EAAO,KAAK,QAAQZ,CAAK,EACzB4E,EAAaa,GAAwB,CACzC,SAAUwB,GAAA,YAAAA,EAAa,KACvB,WAAYnF,EAAa,eAC3B,CAAC,EACD,KAAK,YAAYlB,EAAMgE,EAAY,EAAK,EACxC,KAAK,gBAAgB,EAGrB,KAAK,QAAQ,gBAAgB,iBAAiB,EAC9C,KAAK,QAAQ,gBAAgB,kBAAkB,EAC/C,IAAMuC,EAASC,GAAexG,CAAI,EAG5ByG,EAAkB,CACtB,aAAczG,EAAK,aACnB,gBAAiBA,EAAK,WAAW,OAAO,UAC1C,EACM0G,EAAcxF,EAAa,SAGjC,GAAI9B,EAAM,oBAAqB,CAC7B0F,GAAa,KAAK,OAAO,EACzB,IAAM6B,EAAUC,GAAsB,CACpC,SAAUH,EACV,OAAAF,EACA,SAAAD,EACA,QAASI,EACT,MAAO,IAAM,KAAK,yBAAyB,EAC3C,KAAM,IAAM,KAAK,wBAAwB,EACzC,QAAS,IAAM,KAAK,cAAc,CACpC,CAAC,EACD,KAAK,QAAQ,YAAYC,EAAQ,SAAS,GAC1CpH,EAAA,KAAK,kBAAL,MAAAA,EAAA,WACA,KAAK,gBAAkBsH,GAAkB,KAAK,QAAS,IAAM,KAAK,cAAc,CAAC,EACjF,MACF,CAGA,GAAIzH,EAAM,iBAAkB,CAC1B0F,GAAa,KAAK,OAAO,EACzB,KAAK,iBAAmBgC,GAAmB,CACzC,SAAU1H,EAAM,iBAChB,SAAUqH,EACV,OAAAF,EACA,SAAAD,EACA,QAASI,EACT,aAActH,EAAM,yBACpB,SAAU,IAAM,KAAK,yBAAyB,EAC9C,SAAU,IAAM,KAAK,cAAc,EACnC,cAAe,CAAC2H,EAAOtI,IAAU,CAC/B,IAAMuI,EAAI,KAAK,MAAM,SAAS,EAC9B,KAAK,MAAM,SAAS,CAClB,iBAAkB,CAAE,GAAGA,EAAE,iBAAkB,CAACD,CAAK,EAAGtI,CAAM,CAC5D,CAAC,CACH,CACF,CAAC,EACD,KAAK,QAAQ,YAAY,KAAK,iBAAiB,SAAS,GACxDe,EAAA,KAAK,kBAAL,MAAAA,EAAA,WACA,KAAK,gBAAkBqH,GAAkB,KAAK,QAAS,IAAM,KAAK,cAAc,CAAC,EACjF,MACF,CAGA,GAAIzH,EAAM,uBAAwB,CAChC0F,GAAa,KAAK,OAAO,EACzB,IAAMmC,EAAUC,GAAyB,CACvC,SAAUT,EACV,OAAAF,EACA,SAAAD,EACA,QAASI,EACT,aAActH,EAAM,yBACpB,UAAWA,EAAM,gBACjB,WAAYA,EAAM,uBAClB,MAAOA,EAAM,kBACb,UAAWA,EAAM,sBACjB,SAAUA,EAAM,qBAChB,WAAY,IAAM,KAAK,2BAA2B,EAClD,OAAS+H,GAAwB,CAC3BA,EACF,KAAK,qBAAqB,EACjB/H,EAAM,mBAAqBA,EAAM,qBAC1C,KAAK,wBAAwB,EAE7B,KAAK,cAAc,CAEvB,CACF,CAAC,EACD,KAAK,QAAQ,YAAY6H,EAAQ,SAAS,GAC1CxH,GAAA,KAAK,kBAAL,MAAAA,GAAA,WACA,KAAK,gBAAkBoH,GAAkB,KAAK,QAAS,IAAM,CAAC,CAAC,EAC/D,MACF,CAGA/B,GAAa,KAAK,OAAO,EACzB,KAAK,QAAQ,aAAa,kBAAmB,sBAAsB,EACnE,KAAK,QAAQ,aAAa,mBAAoB,4BAA4B,EAE1E,GAAM,CAAE,OAAAzE,EAAQ,WAAA+G,EAAY,WAAAC,EAAY,MAAAC,EAAO,aAAAC,EAAc,UAAAC,CAAU,EAAIxH,EACrEG,EAASC,GAAiBhB,EAAM,gBAAgB,EAChDqI,EAAc,KAAK,YAAYzH,EAAMZ,EAAM,gBAAgB,EAC3DsI,EAAY,CAAE,GAAGrH,EAAO,KAAM,MAAOL,EAAK,SAAU,EACpD2H,EAAY,CAChB,GAAGtH,EAAO,YACV,GAAG+G,EAAW,YACd,MAAOI,CACT,EAEIxH,EAAK,QAAUsG,GACjB,KAAK,QAAQ,YAAY1B,EAAG,MAAO,CAAE,MAAO0C,EAAM,QAAS,cAAe,MAAO,CAAC,CAAC,EAIrF,IAAMM,EAAU1G,EAAa,SACzB0D,EAAG,MAAO,CACR,GAAGN,EAAK,MAAM,EACd,IAAKpD,EAAa,SAClB,MAAO,CAAE,GAAGb,EAAO,KAAM,GAAG+G,EAAW,IAAK,EAC5C,IAAK,MACP,CAAC,EACD,KAEJ,KAAK,cAAgBxC,EAAG,KAAM,CAC5B,GAAI,uBACJ,GAAGN,EAAK,OAAO,EACf,MAAO,CAAE,GAAGjE,EAAO,MAAO,GAAG+G,EAAW,MAAO,MAAOG,CAAa,CACrE,CAAC,EACD,KAAK,cAAc,YAAc,KAAK,kBACpC,wBACArG,EAAa,uBAAyB,gBACxC,GAMExB,GAAA,KAAK,mBAAL,MAAAA,GAAuB,UACvB,KAAK,YACL,KAAK,iBAAiB,SAAS,aAAe,KAAK,aAEnD,KAAK,iBAAiB,MAAM,EAC5B,KAAK,WAAW,YAAY,KAAK,iBAAiB,QAAQ,GAG5D,IAAMmI,EAAiB,OAAO,KAAK3G,EAAa,sCAAwC,CAAC,CAAC,EACpF4G,EAAe,CACnB5G,EAAa,kBAAoB,UACjC,GAAG2G,EAAe,OAAQE,GAAMA,IAAM7G,EAAa,gBAAgB,CACrE,EAEA,KAAK,iBAAmB8G,GAAuB,CAC7C,UAAWF,EACX,iBAAkB1I,EAAM,iBACxB,KAAM,CACJ,OAAAiB,EACA,WAAA+G,EACA,KAAMpH,EAAK,SAAS,KACpB,KAAMA,EAAK,SAAS,KACpB,SAAUA,EAAK,SAAS,SACxB,eAAgBA,EAAK,cACvB,EACA,SAAWiI,GAAS,KAAK,qBAAqBA,CAAI,EAClD,kBAAmB,KAAK,UAC1B,CAAC,EAED,KAAK,UAAYrD,EAAG,SAAU,CAC5B,MAAO,CACL,GAAGvE,EAAO,SACV,GAAG+G,EAAW,SACd,GAAGpH,EAAK,SAAS,KACjB,QAAS,OACT,QAAS,UACT,WAAY,SACZ,eAAgB,QAClB,EACA,KAAM,SACN,aAAc,uBACd,MAAO,iBACP,QAAS,IAAG,CA7uClB,IAAAT,EA6uCqB,OAAAA,EAAA,KAAK,aAAL,YAAAA,EAAiB,SAClC,CAAC,EACD,KAAK,UAAU,YAAY,KAAK,YAAY,EAAK,CAAC,GAGlDI,EAAA,KAAK,aAAL,MAAAA,EAAiB,eAAe,CAC9B,YAAa,KAAK,QAAQ,YAC1B,QAAS,KAAK,UAAU,QACxB,cAAe,KAAK,UAAU,cAC9B,aAAc,KAAK,UAAU,KAC7B,WAAYuB,EAAa,YACzB,SAAU,KAAK,gBAAgB9B,EAAM,gBAAgB,EACrD,QAAS8B,EACT,SAAU,KAAK,iBAAiB9B,CAAK,EACrC,GAAG,KAAK,cAAc,CACxB,GAGA,IAAM8I,EAAWtD,EAAG,MAAO,CACzB,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,MAAO,WAAY,CAAE,CAC5E,EAAG,KAAK,UAAW,KAAK,iBAAiB,SAAS,EAE5CuD,EAAeC,GAAoBlH,EAAa,aAAa,EAC7DmH,EAA4B,CAAC,EAI/BT,GACFS,EAAW,KACTzD,EACE,MACA,CAAE,MAAO,CAAE,GAAGvE,EAAO,QAAS,eAAgBiI,GAAeH,CAAY,CAAE,CAAE,EAC7EP,CACF,CACF,EAEFS,EAAW,KAAKzD,EAAG,MAAO,CAAE,MAAOvE,EAAO,SAAU,EAAG,KAAK,cAAe6H,CAAQ,CAAC,EAEpF,IAAMK,EAAa3D,EACjB,MACA,CACE,GAAGN,EAAK,QAAQ,EAChB,MAAO,CACL,GAAGjE,EAAO,YACV,GAAG+G,EAAW,YACd,GAAGC,GAAA,YAAAA,EAAY,YACf,MAAOG,CACT,CACF,EACA,GAAGa,CACL,EAGA,KAAK,cAAgBzD,EAAG,MAAO,CAC7B,GAAI,6BACJ,MAAO,CACL,GAAIyC,EACAA,EAAW,UACX,CAAE,GAAGhH,EAAO,cAAe,GAAG+G,EAAW,aAAc,EAC3D,MAAOI,CACT,CACF,CAAC,EAED,IAAMgB,EAAiB5D,EAAG,OAAQ,CAAE,GAAI,qBAAsB,CAAC,EACzD6D,EAAa,KAAK,kBAAkB,cAAevH,EAAa,WAAW,EACjFsH,EAAe,YAAcC,EAE7B,IAAMC,EAAmB,KAAK,kBAC5B,6BACAxH,EAAa,4BAA8B,EAC7C,EACMyH,EAAmB,KAAK,kBAC5B,6BACAzH,EAAa,4BAA8B,gBAC7C,EAEA,KAAK,oBAAsB0D,EAAG,IAAK,CACjC,GAAI,sBACJ,KAAM1D,EAAa,oBAAsB,IACzC,OAAQ,SACR,IAAK,sBACL,MAAOwG,EACP,aAAc,mCAChB,CAAC,EACD,KAAK,oBAAoB,YAAciB,EAEvC,IAAMC,GAAahE,EAAG,OAAQ,CAAE,GAAI,qBAAsB,EACxD,GAAG8D,CAAgB,IACnB,KAAK,mBACP,EAEMG,EAAqBC,GACzB5H,EAAa,SACbA,EAAa,wBACf,EACM6H,EAAuBC,GAC3B9H,EAAa,SACb2H,CACF,EAEMI,GAAmBrE,EAAG,IAAK,CAAE,GAAGN,EAAK,aAAa,EAAG,MAAOqD,CAAU,EAC1Ea,EACAO,GAAwBnE,EAAG,IAAI,EAC/BmE,GAAwBH,EAC1B,EAEMM,EAAahI,EAAa,SAC5B,KAAK,qBAAqB,iBAAkBA,EAAa,SAAS,gBAAkB,EAAE,EACtFA,EAAa,gBACX,KAAK,kBAAkB,kBAAmBA,EAAa,eAAe,EACtE,GAEN,KAAK,cAAc,YACjB,KAAK,kBAAkB,QAAS+H,GAAkBjJ,EAAM,CACtD,QAASyI,EAGT,SAAUvH,EAAa,2BAA6ByH,EAAmB,EACzE,CAAC,CACH,EAGA,KAAK,iBAAmB/D,EAAG,KAAM,CAC/B,GAAI,0BACJ,MAAO,CAAE,GAAGvE,EAAO,SAAU,GAAG+G,EAAW,SAAU,MAAOG,CAAa,CAC3E,CAAC,EACD,KAAK,iBAAiB,YAAc,KAAK,kBACvC,0BACArG,EAAa,yBAA2BiI,EAC1C,EACA,KAAK,cAAc,YAAY,KAAK,gBAAgB,EAKpD,IAAMC,GAAgBxE,EAAG,MAAO,CAC9B,GAAGN,EAAK,UAAU,EAClB,MAAO+C,GAAcrH,EAAK,OAAO,oBAAsBsH,EAAM,WAAa,IAC5E,CAAC,EACD,KAAK,cAAc,YAAY8B,EAAa,EAC5C,KAAK,aAAexE,EAAG,MAAO,CAAE,MAAOvE,EAAO,gBAAiB,CAAC,EAChE+I,GAAc,YAAY,KAAK,YAAY,EAE3C,KAAK,gBAAkB,CAAC,EACxB,KAAK,4BAA8B,KACnC,IAAMC,GAAY,CAACnD,EAAaoD,EAAqBC,IACnD,KAAK,kBAAkBrD,EAAKoD,EAAaC,CAAM,EAC3CC,GAAc,KAAK,yBAAyBpK,EAAOqI,CAAW,EAC9DgC,GAAeD,GAAcA,GAAY,KAAO,KAAK,aAoB3D,GAnBIA,IAAa,KAAK,aAAa,YAAYA,GAAY,SAAS,EAGhE,CAACE,GAAexI,EAAa,QAAQ,GAAK9B,EAAM,yBAAyB,OAAS,IACpF,KAAK,4BAA8BuK,GAAoBvK,EAAM,yBAA0B,CACrF,iBAAkBA,EAAM,iBACxB,kBAAmBA,EAAM,kBACzB,qBAAsBA,EAAM,qBAC5B,6BAA8BA,EAAM,6BACpC,KAAMqI,EACN,mBAAoB,GACpB,KAAMgC,GACN,kBAAmBJ,GACnB,gBAAiB,IAAM,CAAC,EACxB,kBAAoBO,GAAS,KAAK,sBAAsBA,CAAI,EAC5D,oBAAqB,IAAM,CAAC,CAC9B,CAAC,GAGCF,GAAexI,EAAa,QAAQ,EAAG,CACzC,IAAM2I,EAAUC,GAAoB,CAClC,OAAQC,GAAS7I,CAAY,EAC7B,SAAUA,EAAa,SACvB,iBAAkB9B,EAAM,iBACxB,qBAAsBA,EAAM,qBAC5B,kBAAmBA,EAAM,kBACzB,kBAAmBA,EAAM,kBACzB,kBAAmBA,EAAM,kBACzB,kBAAmBA,EAAM,kBACzB,6BAA8BA,EAAM,6BACpC,gBAAiBA,EAAM,gBACvB,KAAMqI,EACN,KAAM,KAAK,aACX,kBAAmB4B,GACnB,gBAAiB,CAACO,EAAMI,IAAgB,KAAK,4BAA4BJ,EAAMI,CAAW,EAC1F,kBAAmB,CAACJ,EAAMI,IAAgB,KAAK,sBAAsBJ,EAAMI,CAAW,EACtF,oBAAqB,CAACC,EAAOC,EAAOF,KAClC,KAAK,gCAAgCC,EAAOC,EAAOF,EAAW,EAChE,iBAAmBA,GAAgB,KAAK,sBAAsBA,CAAW,EACzE,eAAgB,CAACA,EAAaG,IAAW,KAAK,4BAA4BH,EAAaG,CAAM,CAC/F,CAAC,EACD,KAAK,YAAcN,EAAQ,YAC3B,KAAK,gBAAkBA,EAAQ,QACjC,MAAWzK,EAAM,qBAAqB,OAAS,EAC7C,KAAK,YAAcuK,GAAoBvK,EAAM,qBAAsB,CACjE,iBAAkBA,EAAM,iBACxB,kBAAmBA,EAAM,kBACzB,qBAAsBA,EAAM,qBAC5B,gBAAiBA,EAAM,gBACvB,KAAMqI,EACN,mBAAoBrI,EAAM,2BAC1B,KAAMqK,GACN,kBAAmBJ,GACnB,gBAAkBO,GAAS,KAAK,4BAA4BA,CAAI,EAChE,kBAAoBA,GAAS,KAAK,sBAAsBA,CAAI,EAC5D,oBAAqB,CAACK,EAAOC,IAAU,KAAK,gCAAgCD,EAAOC,CAAK,CAC1F,CAAC,EAED,KAAK,YAAc,KAGrB,KAAK,aAAa,EAGlB,IAAME,GAAW,KAAK,eAAepK,EAAM6I,EAAoB1I,EAAO,oBAAoB,EAC1F,GAAIiK,GAAU,CACZ,IAAMC,EACJnJ,EAAa,oBAAsBA,EAAa,2BAC5C,KAAK,kBACH,6BACAA,EAAa,0BACf,EACA,GACNkI,GAAc,YACZ,KAAK,kBAAkB,MAAOgB,GAAUpK,EAAM,CAC5C,QAASkJ,EACT,SAAUmB,CACZ,CAAC,CACH,CACF,CAGA,KAAK,QAAUzF,EAAG,MAAO,CACvB,KAAM,QACN,MAAO,CACL,GAAIyC,EACA,CACE,UAAWf,EAAW,OAAS,OAC/B,WAAYA,EAAW,OAAS,OAChC,YAAaA,EAAW,OAAS,MACnC,EACA,CAAC,EACL,gBAAiB,UACjB,MAAO,UACP,QAAS,OACT,aAAc,MACd,SAAU,OACV,OAAQ,oBACR,QAAS,MACX,CACF,CAAC,EAGD,IAAMgE,GAAgB,KAAK,aAAalL,EAAOY,CAAI,EAE7CuK,EAAiB3F,EACrB,MACA,CAAE,MAAOyC,EAAaA,EAAW,aAAe,CAAE,GAAGhH,EAAO,QAAS,GAAG+G,EAAW,OAAQ,CAAE,EAC7F,KAAK,QACLmB,EACA,KAAK,aACP,EAGIlB,EACFkD,EAAe,YAAY3F,EAAG,MAAO,CAAE,MAAOyC,EAAW,UAAW,EAAGiD,EAAa,CAAC,EAErFC,EAAe,YAAYD,EAAa,EAG1C,KAAK,QAAQ,YAAYC,CAAc,EACvC,KAAK,gBAAkBD,GACvB,KAAK,cAAgBE,GAAkBnK,EAAO,WAAW,EAGzD,KAAK,wBAAwBjB,CAAK,EAClC,KAAK,mBAAmBA,CAAK,GAG7BgH,GAAA,KAAK,kBAAL,MAAAA,GAAA,WACA,KAAK,gBAAkBS,GAAkB,KAAK,QAAS,IAAM,KAAK,cAAc,CAAC,CACnF,CAGQ,iBAAiBzH,EAAsC,CAxgDjE,IAAAG,EAygDI,IAAMQ,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cACtC,OAAKQ,EACD,CAAC2J,GAAe3J,EAAQ,QAAQ,GAAKX,EAAM,yBAAyB,OAAS,EACxE,CAAC,GAAGA,EAAM,yBAA0B,GAAGA,EAAM,oBAAoB,EAEnEmD,GACLxC,EAAQ,SACRA,EAAQ,SACRA,EAAQ,qBACV,EARqB,CAAC,CASxB,CAEQ,eACNC,EACA6I,EACA4B,EACoB,CAzhDxB,IAAAlL,EA0hDI,IAAM2B,GAAe3B,EAAA,KAAK,MAAM,SAAS,EAAE,UAAtB,YAAAA,EAA+B,OAAO,cAC3D,GAAI,CAAC2B,EAAc,OAAO,KAG1B,IAAMwJ,EAAuB,GAC3BxJ,EAAa,oBAAsBA,EAAa,iBAElD,GAAI,CAACwJ,GAAwB,CAACxJ,EAAa,UAAY2H,EAAmB,SAAW,EACnF,OAAO,KAGT,GAAM,CAAE,OAAAxI,EAAQ,WAAA+G,CAAW,EAAIpH,EACzB2K,EAAc3K,EAAK,OAAO,oBAC1B0H,EAAY,CAAE,GAAGrH,EAAO,KAAM,MAAOL,EAAK,SAAU,EACpD4K,EAAYhG,EAAG,MAAO,CAC1B,GAAGN,EAAK,KAAK,EACb,MAAO,CACL,GAAGjE,EAAO,YACV,GAAG+G,EAAW,YACd,MAAOpH,EAAK,UACZ,SAAUoH,EAAW,QAAQ,SAC7B,WAAY,MAGZ,GAAIuD,EACA,CAAC,EACD,CACE,UAAW,qCACX,WAAY,OACZ,UAAW,MACb,CACN,CACF,CAAC,EAEKE,EAAUjG,EAAG,IAAK,CAAE,MAAO,CAAE,OAAQ,IAAK,QAAS+F,EAAc,IAAM,KAAM,CAAE,CAAC,EAEtF,GAAID,EAAsB,CACxB,GAAIxJ,EAAa,gBAAiB,CAChC,IAAM4J,EAAWlG,EAAG,OAAQ,CAAE,GAAI,iBAAkB,CAAC,EACrDkG,EAAS,YAAc,KAAK,kBAAkB,kBAAmB5J,EAAa,eAAe,EAC7F2J,EAAQ,YAAYC,CAAQ,CAC9B,CACA,GAAI5J,EAAa,mBAAoB,CAC/BA,EAAa,iBAAiB2J,EAAQ,YAAY,SAAS,eAAe,GAAG,CAAC,EAClF,IAAME,EAAe,KAAK,kBACxB,6BACA7J,EAAa,4BAA8B,gBAC7C,EACA,KAAK,oBAAsB0D,EAAG,IAAK,CACjC,GAAI,sBACJ,KAAM1D,EAAa,mBACnB,OAAQ,SACR,IAAK,sBACL,MAAOwG,CACT,CAAC,EACD,KAAK,oBAAoB,YAAcqD,EACvCF,EAAQ,YAAY,KAAK,mBAAmB,EAC5CA,EAAQ,YAAY,SAAS,eAAe,GAAG,CAAC,CAClD,CACF,CAmBA,GAjBIhC,EAAmB,OAAS,IAC1B6B,GACFG,EAAQ,YAAYjG,EAAG,IAAI,CAAC,EAG9BiG,EAAQ,YACNG,GAAwB,CACtB,MAAO,KAAK,kBAAkB,iCAAkCP,CAAa,EAC7E,MAAO5B,EAAmB,IAAKoC,IAAU,CACvC,GAAGA,EACH,KAAM,KAAK,kBAAkB,gBAAiBA,EAAK,KAAMA,EAAK,IAAI,CACpE,EAAE,EACF,UAAAvD,CACF,CAAC,CACH,GAGExG,EAAa,SAAU,CACzB,IAAMgK,EAAMhK,EAAa,SAOzB,IALIwJ,GAAwB7B,EAAmB,OAAS,IACtDgC,EAAQ,YAAYjG,EAAG,IAAI,CAAC,EAI1BsG,EAAI,eAAgB,CACtB,IAAMC,EAAQvG,EAAG,OAAQ,CAAE,GAAI,oBAAqB,CAAC,EAKrD,GAJAuG,EAAM,YAAc,KAAK,qBAAqB,iBAAkBD,EAAI,cAAc,EAClFL,EAAQ,YAAYM,CAAK,EACzBN,EAAQ,YAAY,SAAS,eAAe,GAAG,CAAC,EAE5CK,EAAI,cAAe,CACrB,IAAME,EAAQxG,EAAG,IAAK,CACpB,GAAI,qBACJ,KAAMsG,EAAI,cACV,OAAQ,SACR,IAAK,sBACL,MAAOxD,CACT,CAAC,EACD0D,EAAM,YAAc,KAAK,qBACvB,wBACAF,EAAI,uBAAyB,YAC/B,EACAL,EAAQ,YAAYO,CAAK,CAC3B,CAEA,GAAIF,EAAI,gBAAiB,CACvBL,EAAQ,YAAY,SAAS,eAAe,GAAG,CAAC,EAChD,IAAMQ,EAAgBzG,EAAG,OAAQ,CAAE,GAAI,+BAAgC,CAAC,EACxEyG,EAAc,YAAc,KAAK,qBAC/B,iCACAH,EAAI,gCAAkC,aACxC,EACAL,EAAQ,YAAYQ,CAAa,EACjCR,EAAQ,YAAY,SAAS,eAAe,GAAG,CAAC,EAEhD,IAAMS,EAAY1G,EAAG,IAAK,CACxB,GAAI,sBACJ,KAAM,UAAUsG,EAAI,eAAe,GACnC,MAAOxD,CACT,CAAC,EACD4D,EAAU,YAAcJ,EAAI,gBAC5BL,EAAQ,YAAYS,CAAS,CAC/B,CACF,CAGA,GAAIJ,EAAI,cAAe,CACrBL,EAAQ,YAAYjG,EAAG,IAAI,CAAC,EAC5B,IAAM2G,EAAS3G,EAAG,OAAQ,CAAE,GAAI,mBAAoB,CAAC,EAKrD,GAJA2G,EAAO,YAAc,KAAK,qBAAqB,gBAAiBL,EAAI,aAAa,EACjFL,EAAQ,YAAYU,CAAM,EAC1BV,EAAQ,YAAY,SAAS,eAAe,GAAG,CAAC,EAE5CK,EAAI,aAAc,CACpB,IAAMM,EAAS5G,EAAG,IAAK,CACrB,GAAI,oBACJ,KAAMsG,EAAI,aACV,OAAQ,SACR,IAAK,sBACL,MAAOxD,CACT,CAAC,EACD8D,EAAO,YAAc,KAAK,qBACxB,uBACAN,EAAI,sBAAwB,MAC9B,EACAL,EAAQ,YAAYW,CAAM,CAC5B,CACF,CAGA,GAAIN,EAAI,SAAU,CAChBL,EAAQ,YAAYjG,EAAG,IAAI,CAAC,EAC5B,IAAM6G,EAAc7G,EAAG,OAAQ,CAAE,GAAI,cAAe,CAAC,EACrD6G,EAAY,YAAc,KAAK,qBAAqB,WAAYP,EAAI,QAAQ,EAC5EL,EAAQ,YAAYY,CAAW,EAC/BZ,EAAQ,YAAY,SAAS,eAAe,GAAG,CAAC,EAEhD,IAAMa,EAAUR,EAAI,UAAY,UAAUA,EAAI,SAAS,GAAKA,EAAI,QAChE,GAAIQ,EAAS,CACX,IAAMC,EAAU/G,EAAG,IAAK,CACtB,GAAI,eACJ,KAAM8G,EACN,GAAIR,EAAI,UAAY,CAAC,EAAI,CAAE,OAAQ,SAAU,IAAK,qBAAsB,EACxE,MAAOxD,CACT,CAAC,EACDiE,EAAQ,YAAc,KAAK,qBACzB,kBACAT,EAAI,iBAAmB,YACzB,EACAL,EAAQ,YAAYc,CAAO,CAC7B,CACF,CACF,CAEA,OAAAf,EAAU,YAAYC,CAAO,EACtBD,CACT,CAYQ,aAAaxL,EAAmBY,EAA8B,CACpE,IAAMkB,EAAe9B,EAAM,QAAS,OAAO,cACrCkH,EAAW,KAAK,WAAW,QAC3B,CAAE,OAAAjG,EAAQ,WAAA+G,EAAY,WAAAC,CAAW,EAAIrH,EACrC4L,EAASxM,EAAM,2BAEfyM,EAAwB,CAC5B,GAAID,EACAvL,EAAO,cACPiG,EACEjG,EAAO,kBACPA,EAAO,gBAEb,GAAIgH,EAAa,CAAE,WAAY,CAAE,EAAI,CAAC,EACtC,MAAOrH,EAAK,SACd,EACMsK,EAAgB1F,EAAG,MAAO,CAAE,GAAGN,EAAK,QAAQ,EAAG,MAAOuH,CAAe,CAAC,EAEtEC,EAAoB,CACxB,GAAGzL,EAAO,OACV,GAAG+G,EAAW,OACd,GAAIwE,EAAS,CAAC,EAAItF,EAAWjG,EAAO,YAAcA,EAAO,SAC3D,EAGA,OAAIuL,GACF,KAAK,UAAYhH,EAAG,SAAU,CAC5B,GAAImH,GACJ,KAAM,SACN,MAAO,CAAE,GAAGD,EAAY,GAAGzL,EAAO,aAAc,GAAGL,EAAK,QAAQ,SAAU,EAC1E,QAAS,IAAM,KAAK,aAAa,kBAAmB,IAAM,KAAK,aAAa,UAAU,CAAC,CACzF,CAAC,EACD,KAAK,UAAU,YAAc,KAAK,QAAQ,sBAAwB,WAClE,KAAK,aAAe,KACpB,KAAK,WAAa,KAClBsK,EAAc,YAAY,KAAK,SAAS,EACjCA,IAGT,KAAK,aAAe1F,EAAG,SAAU,CAC/B,GAAIoH,GACJ,GAAG1H,EAAK,YAAY,EACpB,KAAM,SACN,MAAO,CAAE,GAAGwH,EAAY,GAAGzL,EAAO,aAAc,GAAGL,EAAK,QAAQ,SAAU,EAC1E,QAAS,IAAM,KAAK,aAAa,aAAc,IAAM,KAAK,aAAa,KAAK,CAAC,CAC/E,CAAC,EACD,KAAK,aAAa,YAAc,KAAK,kBACnC,yBACAkB,EAAa,wBAA0B+K,EACzC,EAEA,KAAK,UAAYrH,EAAG,SAAU,CAC5B,GAAImH,GACJ,GAAGzH,EAAK,iBAAiB,EACzB,KAAM,SACN,MAAO,CAAE,GAAGwH,EAAY,GAAGzL,EAAO,sBAAuB,GAAGL,EAAK,QAAQ,cAAe,EACxF,QAAS,IAAM,KAAK,aAAa,kBAAmB,IAAM,KAAK,aAAa,UAAU,CAAC,CACzF,CAAC,EACD,KAAK,UAAU,YAAc,KAAK,kBAChC,sBACAkB,EAAa,qBAAuBgL,EACtC,EAEA,KAAK,WAAatH,EAAG,SAAU,CAC7B,GAAIuH,GACJ,GAAG7H,EAAK,SAAS,EACjB,KAAM,SACN,MAAO,CACL,GAAGwH,EACH,GAAGzL,EAAO,aACV,GAAGL,EAAK,QAAQ,QAEhB,GAAIsG,EAAW,CAAC,EAAIjG,EAAO,aAC7B,EACA,QAAS,IAAM,KAAK,aAAa,UAAW,IAAM,KAAK,cAAc,CAAC,CACxE,CAAC,EACD,KAAK,WAAW,YAAc,KAAK,kBACjC,sBACAa,EAAa,qBAAuBkL,EACtC,EAEI9F,GAAYtG,EAAK,OAAO,cAC1BsK,EAAc,YAAY,KAAK,YAAY,EAC3CA,EAAc,YACZ1F,EAAG,MAAO,CAAE,MAAO5E,EAAK,MAAM,gBAAiB,EAAG,KAAK,UAAW,KAAK,UAAU,CACnF,GACSsG,GACTgE,EAAc,YAAY,KAAK,YAAY,EAC3CA,EAAc,YAAY,KAAK,SAAS,EACxCA,EAAc,YAAY,KAAK,UAAU,IAEzCA,EAAc,YAAY,KAAK,UAAU,EACzCA,EAAc,YAAY,KAAK,SAAS,EACxCA,EAAc,YAAY,KAAK,YAAY,GAEtCA,EACT,CACQ,gBAAgB+B,EAAiC,CAzzD3D,IAAA9M,EAAAC,EA0zDI,IAAMO,GAAUR,EAAA,KAAK,MAAM,SAAS,EAAE,UAAtB,YAAAA,EAA+B,OAAO,cAItD,MAHI,CAACQ,GAGDsM,IAAoB,WAAaA,IAAoB,MAAQA,IAAoB,KAC5E,WAIL7M,EAAAO,EAAQ,uCAAR,MAAAP,EAA+C6M,GAC1CA,EAIFtM,EAAQ,mBAAqB,MAAQA,EAAQ,mBAAqB,KACrE,UACAA,EAAQ,kBAAoB,SAClC,CAEQ,qBAAqBmG,EAAaoD,EAA6B,CA70DzE,IAAA/J,EA80DI,IAAMH,EAAQ,KAAK,MAAM,SAAS,EAC5BW,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cACtC,GAAI,CAACQ,EAAS,OAAOuJ,EAErB,IAAMrB,EAAO7I,EAAM,iBACnB,GAAI6I,IAAS,WAAaA,IAAS,MAAQA,IAAS,KAAM,OAAOqB,EAEjE,IAAMgD,EAAevM,EAAQ,qCAC7B,GAAI,CAACuM,EAAc,OAAOhD,EAE1B,IAAMiD,EAAiBD,EAAarE,CAAI,EACxC,GAAI,EAACsE,GAAA,MAAAA,EAAgB,UAAU,OAAOjD,EAEtC,IAAM7K,EAAS8N,EAAe,SAAiBrG,CAAG,EAClD,OAAO,OAAOzH,GAAU,UAAYA,EAAQA,EAAQ6K,CACtD,CAEQ,YAAYkD,EAAuB,CACzC,GAAI,CAAC,KAAK,QAAS,OAEnB1H,GAAa,KAAK,OAAO,EAEzB,IAAM2H,EAAe7H,EACnB,MACA,CAAE,MAAO,CAAE,GAAGvE,EAAO,QAAS,WAAY,SAAU,eAAgB,QAAS,CAAE,EAC/EuE,EAAG,MAAO,CACR,KAAM,QACN,MAAO,CACL,gBAAiB,UACjB,MAAO,UACP,QAAS,OACT,aAAc,MACd,SAAU,OACV,OAAQ,oBACR,UAAW,SACX,SAAU,OACZ,CACF,EAAG4H,CAAO,CACZ,EAEA,KAAK,QAAQ,YAAYC,CAAY,CACvC,CAEQ,kBAAkBvG,EAAaoD,EAAqBC,EAAyB,CAz3DvF,IAAAhK,EAAAC,EAAAC,EAAAC,EA03DI,IAAMN,EAAQ,KAAK,MAAM,SAAS,EAC5BW,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cACtC,GAAI,CAACQ,EAAS,OAAOuJ,EAErB,IAAMrB,EAAO7I,EAAM,iBACnB,GAAI6I,IAAS,WAAaA,IAAS,MAAQA,IAAS,KAClD,OAAI/B,IAAQ,8BAAgCnG,EAAQ,2BAC3CA,EAAQ,2BAEVuJ,EAGT,IAAMgD,EAAevM,EAAQ,qCAC7B,GAAI,CAACuM,EAAc,OAAOhD,EAE1B,IAAMiD,EAAiBD,EAAarE,CAAI,EACxC,GAAI,CAACsE,EAAgB,OAAOjD,EAE5B,GAAIC,EAAQ,CACV,GAAIrD,IAAQ,iBAAmBA,IAAQ,uBAAwB,CAC7D,IAAMwG,GAAclN,EAAA+M,EAAe,WAAf,YAAA/M,EAA0B+J,GAC9C,OAAImD,EACE,OAAOA,GAAgB,SAClBxG,IAAQ,gBAAkBwG,EAAcpD,EAE1CpD,IAAQ,gBACXwG,EAAY,MAAQpD,EACpBoD,EAAY,aAAepD,EAE1BA,CACT,CACA,GAAIpD,IAAQ,iBAAmBA,IAAQ,uBAAwB,CAC7D,IAAMyG,GAAclN,EAAA8M,EAAe,WAAf,YAAA9M,EAA0B8J,GAC9C,OAAIoD,EACE,OAAOA,GAAgB,SAClBzG,IAAQ,gBAAkByG,EAAcrD,EAE1CpD,IAAQ,gBACXyG,EAAY,MAAQrD,EACpBqD,EAAY,aAAerD,EAE1BA,CACT,CACA,GAAIpD,EAAI,WAAW,gBAAgB,EACjC,QAAOxG,EAAA6M,EAAe,gBAAf,YAAA7M,EAA+B6J,KAAWD,CAErD,CAEA,IAAM7K,EAAS8N,EAAuBrG,CAAG,EACzC,OAAI,OAAOzH,GAAU,UAAYA,EAAcA,EACxC6K,CACT,CAEQ,qBAAqBrB,EAAoB,CAC/C,KAAK,MAAM,SAAS,CAAE,iBAAkBA,CAAK,CAAC,EAE9C,KAAK,UAAU,CACjB,CAEQ,sBAAsB2E,EAAqB5C,EAA4B,CAC7E,IAAM5K,EAAQ,KAAK,MAAM,SAAS,EAC5B8G,EAAMD,EAAkB+D,EAAa4C,CAAW,EACtD,KAAK,MAAM,SAAS,CAClB,kBAAmB,CACjB,GAAGxN,EAAM,kBACT,CAAC8G,CAAG,EAAG,CAAC9G,EAAM,kBAAkB8G,CAAG,CACrC,CACF,CAAC,CACH,CAEQ,4BAA4B0G,EAAqB5C,EAA4B,CAh8DvF,IAAAzK,EAi8DI,KAAK,WAAW,kBAAkB,EAClC,IAAMH,EAAQ,KAAK,MAAM,SAAS,EAC5BW,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cACtC,GAAI,CAACQ,EAAS,OAEd,IAAMyC,EAAUzC,EAAQ,SAAS,KAAM8M,GAAMA,EAAE,OAASD,CAAW,EACnE,GAAI,CAACpK,EAAS,OAEd,IAAMsK,EAAOC,GAAcvK,EAASwH,EAAa5K,EAAM,gBAAgB,EACvE,KAAK,MAAM,SAAS,CAClB,iBAAkB,CAAE,GAAGA,EAAM,iBAAkB,GAAG0N,EAAK,gBAAiB,EACxE,qBAAsB,CAAE,GAAG1N,EAAM,qBAAsB,GAAG0N,EAAK,oBAAqB,CACtF,CAAC,CACH,CAEQ,gCACNE,EACAJ,EACA5C,EACM,CAp9DV,IAAAzK,EAq9DI,KAAK,WAAW,kBAAkB,EAClC,IAAMH,EAAQ,KAAK,MAAM,SAAS,EAC5BW,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cACtC,GAAI,CAACQ,EAAS,OAEd,IAAMyC,EAAUzC,EAAQ,SAAS,KAAM8M,GAAMA,EAAE,OAASD,CAAW,EACnE,GAAI,CAACpK,EAAS,OAEd,IAAM0D,EAAMD,EAAkB+D,EAAa4C,CAAW,EAChDjK,EAAa,GAAGuD,CAAG,IAAI8G,CAAW,GAClCC,EAAkB,CACtB,GAAG7N,EAAM,qBACT,CAACuD,CAAU,EAAG,CAACvD,EAAM,qBAAqBuD,CAAU,CACtD,EAEA,KAAK,MAAM,SAAS,CAClB,qBAAsBsK,EACtB,iBAAkB,CAChB,GAAG7N,EAAM,iBACT,CAAC8G,CAAG,EAAGgH,GAA2B1K,EAASwH,EAAaiD,CAAe,CACzE,CACF,CAAC,CACH,CAEQ,sBAAsBjD,EAA2B,CACvD,IAAM5K,EAAQ,KAAK,MAAM,SAAS,EAClC,KAAK,MAAM,SAAS,CAClB,kBAAmB,CACjB,GAAGA,EAAM,kBACT,CAAC4K,CAAW,EAAG,CAAC5K,EAAM,kBAAkB4K,CAAW,CACrD,CACF,CAAC,CACH,CAEQ,YAAY5K,EAAmBwN,EAAqB5C,EAA+B,CAv/D7F,IAAAzK,EAAAC,EAw/DI,OAAIkK,IAAenK,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cAAc,QAAQ,GACtDC,EAAAJ,EAAM,kBAAkB6G,EAAkB+D,EAAa4C,CAAW,CAAC,IAAnE,KAAApN,EAAwE,GAE1EJ,EAAM,yBAAyB,KAAMoD,GAAYA,EAAQ,OAASoK,CAAW,CACtF,CAEQ,4BAA4B5C,EAAqBG,EAAwB,CAC/E,KAAK,WAAW,kBAAkB,EAClC,IAAM/K,EAAQ,KAAK,MAAM,SAAS,EAC5B8F,EAAU,KAAK,gBAAgB,KAAMD,GAASA,EAAK,cAAgB+E,CAAW,EACpF,GAAI,CAAC9E,EAAS,OAEd,IAAMiI,EAAWjI,EAAQ,YAAY,OAClC1C,GAAY,CAAC,KAAK,YAAYpD,EAAOoD,EAAQ,KAAM0C,EAAQ,cAAc,CAC5E,EACA,GAAIiI,EAAS,SAAW,EAAG,OAE3B,IAAML,EAAOM,GAAcD,EAAUjI,EAAQ,eAAgB9F,EAAM,iBAAkB+K,CAAM,EAC3F,KAAK,MAAM,SAAS,CAClB,iBAAkB,CAAE,GAAG/K,EAAM,iBAAkB,GAAG0N,EAAK,gBAAiB,EACxE,qBAAsB,CAAE,GAAG1N,EAAM,qBAAsB,GAAG0N,EAAK,oBAAqB,CACtF,CAAC,CACH,CAEQ,yBAAyB1N,EAAmBY,EAA8C,CAhhEpG,IAAAT,EAAAC,EAihEI,IAAMO,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cAChC8N,EAAWtN,GAAA,YAAAA,EAAS,SAC1B,GAAI,CAACA,GAAW,CAACsN,GAAYA,EAAS,SAAW,EAAG,OAAO,KAE3D,IAAMC,EAAUD,EAAS,CAAC,EACpBnI,EAAUqI,GAAqB,CACnC,QAAAD,EACA,SAAUvN,EAAQ,SAClB,iBAAkBX,EAAM,iBACxB,UAAWA,EAAM,kBAAkBkO,EAAQ,IAAI,GAAK,GACpD,QAAQ9N,EAAAJ,EAAM,kBAAkBkO,EAAQ,IAAI,IAApC,KAAA9N,EAAyCJ,EAAM,2BACvD,WAAYoO,GAAkBH,EAAUC,EAAQ,IAAI,EACpD,KAAAtN,EACA,kBAAmB,CAACkG,EAAKoD,EAAaC,IAAW,KAAK,kBAAkBrD,EAAKoD,EAAaC,CAAM,EAChG,iBAAmBS,GAAgB,KAAK,sBAAsBA,CAAW,EACzE,eAAgB,CAACA,EAAaG,IAAW,KAAK,4BAA4BH,EAAaG,CAAM,CAC/F,CAAC,EACD,YAAK,gBAAkB,CAACjF,CAAO,EACxBA,CACT,CAEQ,sBAAsB9F,EAAyB,CACrD,QAAW8F,KAAW,KAAK,gBACzBuI,GACEvI,EACA9F,EAAM,iBACNA,EAAM,kBAAkB8F,EAAQ,WAAW,GAAK,EAClD,CAEJ,CAYA,MAAc,aAAarF,EAAmB,WAA2B,CA1jE3E,IAAAN,EAAAC,EAAAC,EAAAC,EA2jEI,IAAMN,EAAQ,KAAK,MAAM,SAAS,EAClC,GAAIA,EAAM,aAAc,OAGxB,GAAIA,EAAM,2BAA4B,CACpC,KAAK,QAAQ,SAAS,EACtB,KAAK,QAAQ,EACb,MACF,CAGA,GAAIA,EAAM,aAAe,CAACA,EAAM,uBAAyB,CAACA,EAAM,kBAAmB,CACjF,KAAK,MAAM,SAAS,CAClB,aAAc,oEAChB,CAAC,EACD,MACF,CAEA,IAAMW,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cACtC,GAAI,CAACQ,EAAS,OACd,IAAM2N,EAAOvL,GAAOpC,CAAO,EAE3B,GAAI,KAAK,WAAW,UAAU,KAAK,QAAQ,OAAO,EAAG,CAInD,GAAIF,IAAS,WAAY,CACvB,IAAM8N,EAAM,KAAK,iBAKjB,GAJIA,IACF,KAAK,iBAAmB,KACxB,KAAK,MAAM,SAASA,CAAG,GAErB,CAAC,KAAK,eAAe,KAAK,MAAM,SAAS,CAAC,EAAE,GAAI,CAC9C,KAAK,WAAW,UAAU,KAAK,WAAW9N,CAAI,EAClD,MACF,CACF,MACEL,EAAA,KAAK,mBAAL,YAAK,iBAAqB,CACxB,iBAAkBJ,EAAM,iBACxB,qBAAsBA,EAAM,oBAC9B,GACA,KAAK,MAAM,SACTwO,GAAsBF,EAAM7N,EAAM,CAChC,iBAAkBT,EAAM,iBACxB,qBAAsBA,EAAM,oBAC9B,CAAC,CACH,EAEF,KAAK,WAAWS,CAAI,EACpB,MACF,CAEA,GAAIA,IAAS,YAAc,CAAC,KAAK,eAAeT,CAAK,EAAE,GAAI,OAE3D,IAAMqD,EAAYmL,GAAsBF,EAAM7N,EAAM,CAClD,iBAAkBT,EAAM,iBACxB,qBAAsBA,EAAM,oBAC9B,CAAC,EAGGS,IAAS,YACX,KAAK,MAAM,SAAS,CAClB,iBAAkB4C,EAAU,iBAC5B,qBAAsBA,EAAU,oBAClC,CAAC,EAGH,KAAK,gBAAkB,IAAI,gBAC3B,KAAK,MAAM,SAAS,CAAE,aAAc,GAAM,mBAAoB,GAAM,aAAc,IAAK,CAAC,EAExF,GAAI,CACF,IAAMoL,EAAWC,GAAmBJ,EAAMjL,CAAS,EAEnD,MAAMsL,GAAmB,CACvB,YAAa,KAAK,QAAQ,YAC1B,QAAS,KAAK,UAAU,QACxB,cAAe,KAAK,UAAU,cAC9B,WAAY3O,EAAM,QAAS,OAAO,KAClC,SAAAyO,EACA,SAAU,GACV,UAAW,KAAK,QAAQ,cAAgB,CAAE,cAAe,KAAK,QAAQ,aAAc,EAAI,OACxF,8BAA+BzO,EAAM,uBAAyB,OAC9D,kBAAmBA,EAAM,mBAAqB,OAC9C,SAAUA,EAAM,iBAChB,OAAQ,KAAK,gBAAgB,OAC7B,GAAG,KAAK,cAAc,CACxB,CAAC,EAED,KAAK,QAAQ,SAAS,EACtB,KAAK,QAAQ,CACf,OAASwE,EAAK,CACZ,GAAKA,EAAc,OAAS,aAAc,OAC1C,IAAMC,EAAQD,EACR4I,EAAU3I,EAAM,SAAW,8CACjC,KAAK,MAAM,SAAS,CAAE,aAAc2I,EAAS,aAAc,GAAO,mBAAoB,EAAM,CAAC,GAC7F9M,GAAAD,EAAA,KAAK,SAAQ,UAAb,MAAAC,EAAA,KAAAD,EAAuBoE,EACzB,CACF,CACQ,eAAsB,CAC5B,KAAK,WAAW,kBAAkB,EAE9B,CADU,KAAK,MAAM,SAAS,EACxB,eAKV,KAAK,YAAY,EACjBH,GAAkB,EAElB,KAAK,QAAQ,UAAU,EACvB,KAAK,QAAQ,EACf,CAEQ,iBAAiBtE,EAAyB,CAChD,GAAI,KAAK,YAAa,CACpB,OAAW,CAAC8G,EAAK8H,CAAO,IAAK,KAAK,YAAY,gBAC5CA,EAAQ,WAAW5O,EAAM,iBAAiB8G,CAAG,GAAK,EAAK,EAEzD,OAAW,CAACA,EAAK8H,CAAO,IAAK,KAAK,YAAY,gBAC5CA,EAAQ,WAAW5O,EAAM,qBAAqB8G,CAAG,GAAK,EAAK,CAE/D,CACA,KAAK,sBAAsB9G,CAAK,EAEhC,KAAK,wBAAwBA,CAAK,CACpC,CAEQ,eAAeA,EAAmC,CA1rE5D,IAAAG,EA2rEI,IAAMQ,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cACtC,OAAKQ,EACEkO,GACLlO,EACAX,EAAM,iBACNA,EAAM,yBACR,EALqB,CAAE,GAAI,GAAO,OAAQ,iBAAkB,SAAU,CAAC,CAAE,CAM3E,CAEQ,kBAAkBA,EAAmB8O,EAA+B,CApsE9E,IAAA3O,EAqsEI,GAAI,CAAC,KAAK,eAAiB,CAAC,KAAK,gBAAiB,OAClD,IAAM4O,EAAa/O,EAAM,oBAAsBA,EAAM,oBAC/Ce,EAASC,GAAiBhB,EAAM,gBAAgB,EAChDgP,EACJD,GAAc/O,EAAM,2BAChB,KACAiP,GACEH,GACA3O,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cAAc,SACnC+N,GAAY,KAAK,kBAAkB,gBAAiBA,EAAQ,KAAMA,EAAQ,IAAI,EAC/E,CACE,GAAGgB,GACH,iBAAkBnO,EAAO,kBACzB,kBAAmBA,EAAO,mBAC1B,uBAAwBA,EAAO,uBACjC,CACF,EACNoO,GAAkB,KAAK,cAAe,KAAK,gBAAiB,KAAK,UAAWH,CAAI,CAClF,CACQ,wBAAwBhP,EAAyB,CACvD,GAAI,CAAC,KAAK,WAAaA,EAAM,2BAA4B,OAEzD,IAAM+O,EAAa/O,EAAM,oBAAsBA,EAAM,oBAC/C8O,EAAU,KAAK,eAAe9O,CAAK,EACzC,KAAK,kBAAkBA,EAAO8O,CAAO,EAGrC,IAAMM,EAAc,CAACC,EAA+BC,IAAsB,CACnED,IACLA,EAAI,SAAWC,EACfD,EAAI,MAAM,QAAUC,EAAW,MAAQ,IACvCD,EAAI,MAAM,OAASC,EAAW,cAAgB,UAChD,EAEAF,EAAY,KAAK,UAAW,CAACN,EAAQ,IAAMC,CAAU,EACrDK,EAAY,KAAK,aAAcL,CAAU,CAC3C,CAEQ,oBAAoB/O,EAAyB,CACnD,IAAMuP,EAAc1J,GAAkC,CACpD,GAAKA,EACL,OAAW,CAAC2H,EAAagC,CAAS,IAAK3J,EAAK,sBAAuB,CACjE,IAAM4J,EAAczP,EAAM,kBAAkBwN,CAAW,EAEvDgC,EAAU,MAAM,QAAU,CAACC,GAAeD,EAAU,kBAAoB,EAAI,OAAS,OAErF,IAAME,EAAU7J,EAAK,SAAS,IAAI2H,CAAW,EACzCkC,IACDA,EAAmC,MAAM,UAAaD,EAAgC,eAAlB,iBAGvE,IAAME,EAAc9J,EAAK,gBAAgB,IAAI2H,CAAW,EACpDmC,GACFA,EAAY,aAAa,gBAAiB,OAAO,CAACF,CAAW,CAAC,CAElE,CACF,EAEAF,EAAW,KAAK,WAAW,EAC3BA,EAAW,KAAK,2BAA2B,CAC7C,CAEQ,mBAAmBvP,EAAyB,CAC7C,KAAK,UACNA,EAAM,cACR,KAAK,QAAQ,YAAcA,EAAM,aACjC,KAAK,QAAQ,MAAM,QAAU,SAE7B,KAAK,QAAQ,MAAM,QAAU,OAEjC,CAIQ,0BAAiC,CACvC,KAAK,MAAM,SAAS,CAClB,YAAa,GACb,kBAAmB,GACnB,oBAAqB,EACvB,CAAC,CACH,CAEQ,yBAAgC,CACtC,KAAK,MAAM,SAAS,CAClB,oBAAqB,GACrB,iBAAkB,EACpB,CAAC,CACH,CAIA,MAAc,0BAA0C,CACtD,IAAMA,EAAQ,KAAK,MAAM,SAAS,EAC5B4P,EAASC,GAAqB7P,EAAM,gBAAgB,EAC1D,GAAI,OAAO,KAAK4P,CAAM,EAAE,OAAS,EAAG,CAC9B,KAAK,mBACHA,EAAO,eACT,KAAK,iBAAiB,UAAU,YAAcA,EAAO,aACrD,KAAK,iBAAiB,UAAU,MAAM,QAAU,SAE9CA,EAAO,kBACT,KAAK,iBAAiB,aAAa,YAAcA,EAAO,gBACxD,KAAK,iBAAiB,aAAa,MAAM,QAAU,SAEjDA,EAAO,uBACT,KAAK,iBAAiB,kBAAkB,YAAcA,EAAO,qBAC7D,KAAK,iBAAiB,kBAAkB,MAAM,QAAU,UAG5D,MACF,CAEA,KAAK,MAAM,SAAS,CAAE,yBAA0B,EAAK,CAAC,EAEtD,IAAME,EAAiB,KAAK,QAAQ,gBAAkB,WAChDC,EAAcD,IAAmB,QACnC,IAAI,IAAI,KAAK,QAAQ,uBAAyB,uBAAwB,OAAO,SAAS,MAAM,EAAE,KAC9F,OAEJ,GAAI,CACF,IAAME,EAAW,MAAMC,GAA6B,CAClD,YAAa,KAAK,QAAQ,YAC1B,QAAS,KAAK,UAAU,QACxB,aAAcjQ,EAAM,iBAAiB,aACrC,gBAAiBA,EAAM,iBAAiB,gBACxC,qBAAsBA,EAAM,iBAAiB,qBAC7C,oBAAqB+P,CACvB,CAAC,EAED,GAAIC,EAAS,kBAAoBA,EAAS,uBAAwB,CAChE,KAAK,MAAM,SAAS,CAClB,sBAAuBA,EAAS,uBAChC,iBAAkB,GAClB,uBAAwB,GACxB,yBAA0B,GAC1B,uBAAwB,EAC1B,CAAC,EAED,WAAW,IAAM,CACf,KAAK,MAAM,SAAS,CAClB,uBAAwB,GACxB,uBAAwB,EAC1B,CAAC,CACH,EAAG,GAAI,EACP,MACF,CAuBA,GApBAE,GAAiB,CACf,UAAW,qBACX,aAAcF,EAAS,cACvB,iBAAkBA,EAAS,mBAC3B,iBAAkBhQ,EAAM,iBACxB,qBAAsBA,EAAM,qBAC5B,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,YAAa,OAAO,SAAS,KAC7B,SAAU,KAAK,QAAQ,SACvB,QAAS,KAAK,UAAU,OAC1B,CAAC,EAGD,KAAK,MAAM,SAAS,CAClB,iBAAkB,GAClB,uBAAwB,GACxB,yBAA0B,GAC1B,gBAAiB,EACnB,CAAC,EAEG8P,IAAmB,SAAWE,EAAS,wBAAyB,CAClE,IAAMG,EAAQ,OAAO,KACnBH,EAAS,wBACT,0BACA,mDACF,EACA,GAAIG,EACF,KAAK,kBAAoBA,EACzB,KAAK,qBAAqBA,CAAK,MAC1B,CACL,KAAK,MAAM,SAAS,CAClB,yBAA0B,GAC1B,kBAAmB,oDACnB,qBAAsB,EACxB,CAAC,EACD,MACF,CACF,SAAWH,EAAS,wBAAyB,CAC3C,IAAMI,EAAe,OAAO,KAAKJ,EAAS,wBAAyB,QAAQ,EAC3E,GAAI,CAACI,EAAc,CACjB,KAAK,MAAM,SAAS,CAClB,yBAA0B,GAC1B,kBAAmB,kDACnB,qBAAsB,EACxB,CAAC,EACD,MACF,CACA,GAAI,CAAEA,EAAa,OAAS,IAAM,MAAQ,CAAC,CAC7C,CAGA,KAAK,MAAM,SAAS,CAClB,yBAA0B,GAC1B,gBAAiB,EACnB,CAAC,EACD,KAAK,mBAAmBJ,EAAS,aAAc,CACjD,OAASvL,EAAO,CACd,KAAK,MAAM,SAAS,CAAE,yBAA0B,EAAM,CAAC,EACvD,IAAMD,EAAMC,EACR,KAAK,mBACP,KAAK,iBAAiB,aAAa,YAAcD,EAAI,SAAW,mCAChE,KAAK,iBAAiB,aAAa,MAAM,QAAU,QAEvD,CACF,CAIQ,mBAAmB6L,EAAqB,CAC9C,KAAK,yBAA2BA,EAChC,IAAIC,EAAW,EACXC,EAAoB,EACpBC,EAAS,GACPC,EAAe,GACfC,EAAyB,EACzBC,EAAgB,IAEhBC,EAAO,SAAY,CAt6E7B,IAAAzQ,EAu6EM,GAAI,CAAAqQ,EAGJ,IAFAF,IAEIA,EAAWG,EAAc,CAC3B,KAAK,YAAY,EACjB,KAAK,MAAM,SAAS,CAClB,kBAAmB,iEACnB,sBAAuB,kBACvB,qBAAsB,GACtB,gBAAiB,EACnB,CAAC,EACD,MACF,CAEA,GAAI,CACF,IAAMT,EAAW,MAAMa,GAAqB,CAC1C,YAAa,KAAK,QAAQ,YAC1B,QAAS,KAAK,UAAU,QACxB,aAAcR,CAChB,CAAC,EAID,GAFAE,EAAoB,EAEhBP,EAAS,SAAW,WAAY,CAClC,KAAK,YAAY,EACjB,IAAMc,EAAMd,EAAS,0BAA0B7P,EAAA6P,EAAS,mBAAT,YAAA7P,EAA2B,wBAC1E,GAAI,CAAC2Q,EAAK,CACR,KAAK,MAAM,SAAS,CAClB,kBAAmB,sEACnB,qBAAsB,GACtB,gBAAiB,EACnB,CAAC,EACD,MACF,CACA,KAAK,MAAM,SAAS,CAClB,sBAAuBA,EACvB,uBAAwB,GACxB,gBAAiB,EACnB,CAAC,EACDxM,GAAkB,EAClB,MACF,CAEA,GAAI0L,EAAS,SAAW,UAAYA,EAAS,SAAW,UAAW,CACjE,KAAK,YAAY,EACjB,KAAK,MAAM,SAAS,CAClB,kBAAmBe,GAA4Bf,EAAS,WAAYA,EAAS,KAAK,EAClF,sBAAuBA,EAAS,WAChC,qBAAsBA,EAAS,UAC/B,gBAAiB,EACnB,CAAC,EACD,MACF,CAEKQ,IACH,KAAK,kBAAoB,WAAWI,EAAMD,CAAa,EAE3D,OAASlM,EAAO,CACd,IAAMD,EAAMC,EACZ,GAAID,EAAI,SAAW,KAAOA,EAAI,SAAW,IAAK,CAC5C,KAAK,YAAY,EACjB,KAAK,MAAM,SAAS,CAClB,kBAAmB,6CACnB,sBAAuB,kBACvB,qBAAsB,GACtB,gBAAiB,EACnB,CAAC,EACD,MACF,CAGA,GADA+L,IACIA,GAAqBG,EAAwB,CAC/C,KAAK,YAAY,EACjB,KAAK,MAAM,SAAS,CAClB,kBAAmBlM,EAAI,SAAW,uCAClC,qBAAsB,GACtB,gBAAiB,EACnB,CAAC,EACD,MACF,CAEA,KAAK,kBAAoB,WAAWoM,EAAMD,CAAa,CACzD,EACF,EAGA,KAAK,wBAA0B,IAAM,CAC/B,SAAS,QACXH,EAAS,GACL,KAAK,oBACP,aAAa,KAAK,iBAAiB,EACnC,KAAK,kBAAoB,QAG3BA,EAAS,GACTI,EAAK,EAET,EACA,SAAS,iBAAiB,mBAAoB,KAAK,uBAAuB,EAE1E,KAAK,kBAAoB,WAAWA,EAAMD,CAAa,CACzD,CAEQ,aAAoB,CA9gF9B,IAAAxQ,EA+gFQ,KAAK,oBACP,aAAa,KAAK,iBAAiB,EACnC,KAAK,kBAAoB,MAEvB,KAAK,qBACP,cAAc,KAAK,kBAAkB,EACrC,KAAK,mBAAqB,MAExB,KAAK,0BACP,SAAS,oBAAoB,mBAAoB,KAAK,uBAAuB,EAC7E,KAAK,wBAA0B,OAEjCA,EAAA,KAAK,oBAAL,MAAAA,EAAwB,QACxB,KAAK,kBAAoB,IAC3B,CAEQ,qBAAqBgQ,EAAqB,CAChD,KAAK,mBAAqB,YAAY,IAAM,CACtCA,EAAM,QACJ,KAAK,qBACP,cAAc,KAAK,kBAAkB,EACrC,KAAK,mBAAqB,KAGhC,EAAG,GAAG,CACR,CAIQ,4BAAmC,CACzC,KAAK,MAAM,SAAS,CAClB,uBAAwB,GACxB,uBAAwB,EAC1B,CAAC,CACH,CAEQ,yBAAgC,CACtC,KAAK,MAAM,SAAS,CAClB,uBAAwB,GACxB,iBAAkB,GAClB,kBAAmB,KACnB,sBAAuB,KACvB,qBAAsB,GACtB,uBAAwB,EAC1B,CAAC,CACH,CAEQ,sBAA6B,CACnC,KAAK,MAAM,SAAS,CAClB,uBAAwB,GACxB,iBAAkB,GAClB,kBAAmB,KACnB,sBAAuB,KACvB,qBAAsB,GACtB,uBAAwB,GACxB,iBAAkB,CAAE,aAAc,GAAI,gBAAiB,GAAI,qBAAsB,EAAG,CACtF,CAAC,CACH,CAKQ,YAAYa,EAA8B,CA7kFpD,IAAA7Q,EA+kFI,IAAM8Q,EAAQ,CACZ,MAAO,6BACP,MAAO,KACP,OAAQ,KACR,QAAS,YACT,KAAM,OACN,SAPa9Q,EAAA,KAAK,OAAL,YAAAA,EAAW,WAAW,OAAO,gBAAiB,eAQ3D,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,QACnB,cAAe,MACjB,EACA,OAAO6Q,EACHE,EACE,MACAD,EACAC,EAAI,OAAQ,CAAE,EAAG,IAAK,EAAG,IAAK,MAAO,IAAK,OAAQ,IAAK,CAAC,EACxDA,EAAI,OAAQ,CAAE,EAAG,KAAM,EAAG,IAAK,MAAO,IAAK,OAAQ,IAAK,CAAC,CAC3D,EACAA,EACE,MACAD,EACAC,EAAI,UAAW,CAAE,OAAQ,mCAAoC,CAAC,EAC9DA,EAAI,OAAQ,CAAE,EAAG,6DAA8D,CAAC,CAClF,CACN,CAEQ,iBAAwB,CAC9B,GAAI,CAAC,KAAK,WAAa,CAAC,KAAK,WAAY,OAMzC,GAAI,CAAC,KAAK,WAAW,YAAa,CAChC,KAAK,UAAU,MAAM,QAAU,OAC/B,MACF,CAEA,KAAK,UAAU,MAAM,QAAU,OAC/BxL,GAAa,KAAK,SAAS,EAC3B,IAAMsL,EAAU,KAAK,WAAW,UAChC,KAAK,UAAU,YAAY,KAAK,YAAYA,CAAO,CAAC,EAEhDA,GACF,KAAK,UAAU,aAAa,aAAc,sBAAsB,EAChE,KAAK,UAAU,aAAa,QAAS,gBAAgB,IAErD,KAAK,UAAU,aAAa,aAAc,KAAK,WAAW,SAAW,wBAA0B,sBAAsB,EACrH,KAAK,UAAU,aAAa,QAAS,KAAK,WAAW,SAAW,kBAAoB,gBAAgB,EAExG,CAEQ,mBAAmBhR,EAAyB,CApoFtD,IAAAG,EAqoFI,IAAMQ,GAAUR,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAO,cAIhCgR,EAAuB,CAC3B9B,EACA+B,IACG,CACE/B,IACLA,EAAI,YAAcrP,EAAM,mBACpBqR,GACAD,EACJ/B,EAAI,SAAWrP,EAAM,mBACrBqP,EAAI,MAAM,QAAUrP,EAAM,mBAAqB,MAAQ,IACvDqP,EAAI,MAAM,OAASrP,EAAM,mBAAqB,cAAgB,UAChE,EAEAmR,EACE,KAAK,UACLnR,EAAM,2BACF,KAAK,QAAQ,sBAAwB,WACrC,KAAK,kBACH,uBACAW,GAAA,YAAAA,EAAS,sBAAuBmM,EAClC,CACN,EACAqE,EACE,KAAK,aACL,KAAK,kBACH,0BACAxQ,GAAA,YAAAA,EAAS,yBAA0BkM,EACrC,CACF,EAEI,KAAK,aACP,KAAK,WAAW,SAAW7M,EAAM,aACjC,KAAK,WAAW,MAAM,QAAUA,EAAM,aAAe,MAAQ,IAC7D,KAAK,WAAW,MAAM,OAASA,EAAM,aAAe,cAAgB,WAKtE,KAAK,wBAAwBA,CAAK,CACpC,CACF,ECjrFO,IAAMsR,GAAe,CAC1B,KAAM,CACJ,QAAS,OACT,cAAe,SACf,IAAK,OACL,WAAY,SACd,EAKA,YAAa,CACX,QAAS,OACT,UAAW,YACb,EAEA,WAAY,CACV,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,WAAY,CACV,QAAS,OACT,IAAK,OACL,WAAY,SACZ,OAAQ,UACR,SAAU,EACV,SAAU,EACV,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,oBAAqB,CACnB,QAAS,OACT,cAAe,SACf,OAAQ,EACR,QAAS,EACT,UAAW,YACb,EAEA,YAAa,CACX,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,MAAO,UACP,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,kBAAmB,CACjB,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,MAAO,UACP,cAAe,SACf,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,cAAe,CACb,OAAQ,OACR,MAAO,OACP,QAAS,MACT,aAAc,MACd,OAAQ,oBACR,OAAQ,EACR,UAAW,aACX,WAAY,OACZ,iBAAkB,OAClB,cAAe,OACf,OAAQ,UACR,SAAU,WACV,gBAAiB,aACnB,EAEA,sBAAuB,CACrB,QAAS,OACT,cAAe,SACf,OAAQ,EACR,QAAS,EACT,UAAW,aACX,YAAa,MACf,EAEA,gBAAiB,CACf,QAAS,OACT,WAAY,SACZ,IAAK,OACL,eAAgB,gBAChB,OAAQ,EACR,QAAS,EACT,UAAW,aACX,UAAW,MACb,EAEA,eAAgB,CACd,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,OAAQ,UACR,QAAS,EACT,UAAW,MACb,EAEA,gBAAiB,CACf,WAAY,IACZ,SAAU,OACV,WAAY,OACZ,cAAe,QACf,MAAO,UACP,OAAQ,EACR,QAAS,EACT,UAAW,MACb,EAEA,cAAe,CACb,OAAQ,OACR,MAAO,OACP,QAAS,MACT,aAAc,MACd,OAAQ,oBACR,OAAQ,EACR,UAAW,aACX,WAAY,OACZ,iBAAkB,OAClB,cAAe,OACf,OAAQ,UACR,SAAU,WACV,gBAAiB,aACnB,EAEA,iBAAkB,CAChB,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,QAAS,OACT,UAAW,QACX,OAAQ,EACR,UAAW,YACb,EAEA,eAAgB,CACd,MAAO,OACP,OAAQ,OACR,OAAQ,oBACR,UAAW,oBACX,aAAc,MACd,UAAW,0BACX,aAAc,OACd,UAAW,YACb,CACF,ECpJO,IAAMC,GAA8BC,GAE5BA,EAAQ,cAAc,KAAKC,EAAyB,EAEtDC,GAAmB,CAC9BC,EACAC,EACAC,IACW,GAAGC,EAAkBH,EAAaC,CAAW,CAAC,IAAIC,CAAW,GAE7DE,GAA+EC,GAK1FC,GAAkBD,EAAO,SAAUA,EAAO,SAAUA,EAAO,qBAAqB,EAErEE,GACXC,GAEAA,EAAK,OAAgC,CAACC,EAAKC,KACzCD,EAAIN,EAAkBO,EAAI,YAAaA,EAAI,QAAQ,IAAI,CAAC,EAAI,GACrDD,GACN,CAAC,CAAC,EAEME,GACXH,GACoB,CACpB,IAAMI,EAA4C,CAAC,EAC7CC,EAAgD,CAAC,EACvD,OAAAL,EAAK,QAAQ,CAAC,CAAE,QAAAX,EAAS,YAAAG,CAAY,IAAM,CACzCY,EAAiBT,EAAkBH,EAAaH,EAAQ,IAAI,CAAC,EAAI,GACjEA,EAAQ,cAAc,QAASiB,GAAY,CACzCD,EAAqBd,GAAiBC,EAAaH,EAAQ,KAAMiB,EAAQ,IAAI,CAAC,EAAI,EACpF,CAAC,CACH,CAAC,EACM,CAAE,iBAAAF,EAAkB,qBAAAC,CAAqB,CAClD,EAEaE,GAA6B,CACxCP,EACAK,IAEAL,EAAK,MAAM,CAAC,CAAE,QAAAX,EAAS,YAAAG,CAAY,IACjCH,EAAQ,cACL,OAAOC,EAAyB,EAChC,MAAOgB,GACN,EAAQD,EAAqBd,GAAiBC,EAAaH,EAAQ,KAAMiB,EAAQ,IAAI,CAAC,CACxF,CACJ,EAEWE,GAAsB,CACjCnB,EACAG,EACAiB,EACAJ,IAC4B,CAC5B,IAAMK,EAAU,CAAE,GAAGL,CAAqB,EAC1C,OAAAhB,EAAQ,cAAc,QAASiB,GAAY,CACzCI,EAAQnB,GAAiBC,EAAaH,EAAQ,KAAMiB,EAAQ,IAAI,CAAC,EAC/DG,GAAYH,EAAQ,OACxB,CAAC,EACMI,CACT,EAEaC,GAAoB,CAC/BtB,EACAK,EACAF,EACAa,IACgF,CAChF,IAAMO,EAAarB,GAAiBC,EAAaH,EAAQ,KAAMK,CAAW,EACpEmB,EAAO,CAAE,GAAGR,EAAsB,CAACO,CAAU,EAAG,CAACP,EAAqBO,CAAU,CAAE,EAClFE,EAAYR,GAChB,EAAQO,EAAKtB,GAAiBC,EAAaH,EAAQ,KAAMiB,EAAQ,IAAI,CAAC,EAClES,EAAmB1B,EAAQ,cAAc,OAAOC,EAAyB,EACzE0B,EACJD,EAAiB,OAAS,EACtBA,EAAiB,MAAMD,CAAQ,EAC/BzB,EAAQ,cAAc,KAAKyB,CAAQ,EACzC,MAAO,CAAE,qBAAsBD,EAAM,gBAAAG,CAAgB,CACvD,EAEaC,GAA4B,CACvCjB,EACA,CAAE,iBAAAI,EAAkB,qBAAAC,CAAqB,IAEzCL,EAAK,IAAI,CAAC,CAAE,QAAAX,EAAS,YAAAG,CAAY,IAAM,CACrC,IAAM0B,EAAMvB,EAAkBH,EAAaH,EAAQ,IAAI,EACjDyB,EAAYpB,GAChBW,EAAqB,GAAGa,CAAG,IAAIxB,CAAW,EAAE,GAAK,GAC7CyB,EAA6B9B,EAAQ,cAAc,KACtDiB,GAAYA,EAAQ,UAAYQ,EAASR,EAAQ,IAAI,CACxD,EACMc,EAAyB/B,EAAQ,cAAc,KAAMiB,GACzDQ,EAASR,EAAQ,IAAI,CACvB,EACMU,EACJZ,EAAiBc,CAAG,GAAKC,GAA8BC,EACzD,MAAO,CACL,GAAG/B,EACH,GAAIG,EAAc,CAAE,aAAcA,CAAY,EAAI,CAAC,EACnD,SAAUwB,EACV,cAAe3B,EAAQ,cAAc,IAAKiB,IAAa,CACrD,GAAGA,EACH,SAAUQ,EAASR,EAAQ,IAAI,CACjC,EAAE,CACJ,CACF,CAAC,EAEUe,GAAsB,CACjCC,EACAC,EACA,CAAE,iBAAAnB,EAAkB,qBAAAC,CAAqB,IAEzC,KAAK,UAAU,CAACiB,GAAA,KAAAA,EAAe,KAAMC,GAAA,KAAAA,EAAc,KAAMnB,EAAkBC,CAAoB,CAAC,EAErFmB,GAAsBC,GAA4B,CAC7D,IAAMC,EAAUD,GAAA,YAAAA,EAAuC,OACvD,OAAO,OAAOC,GAAW,UAAYA,GAAU,GACjD,ECxGO,SAASC,GACdC,EACAC,EACmB,CAjCrB,IAAAC,GAAAC,EAAAC,EAAAC,GAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAkCE,GAAM,CACJ,iBAAAC,EACA,kBAAAC,EACA,qBAAAC,EACA,SAAAC,EACA,oBAAAC,EACA,SAAAC,EACA,KAAAC,EACA,SAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,oBAAAC,CACF,EAAIvB,EAEEwB,EAAkB,IAAI,IACtBC,EAAa,IAAI,IACjBC,EAAkB,IAAI,IACtBC,EAAwB,IAAI,IAC5BC,EAAW,IAAI,IACfC,EAAgB,IAAI,IACpBC,EAAsB,IAAI,IAC1BC,EAAoB,IAAI,IAExBC,GAAS/B,GAAAiB,GAAA,YAAAA,EAAM,SAAN,KAAAjB,GAAgBgC,GACzBC,GAAahC,EAAAgB,GAAA,YAAAA,EAAM,aAAN,KAAAhB,EAAoB,CACrC,YAAa,CAAE,SAAUiB,EAAW,OAAS,MAAO,EACpD,kBAAmB,CAAE,SAAUA,EAAW,OAAS,MAAO,EAC1D,gBAAiB,CAAE,SAAUA,EAAW,OAAS,MAAO,CAC1D,EACMgB,GAAe/B,IAAAD,EAAAe,GAAA,YAAAA,EAAM,eAAN,KAAAf,EAAsBc,GAAA,YAAAA,EAAU,eAAhC,KAAAb,GAAgD,UAC/DgC,GAAY9B,IAAAD,EAAAa,GAAA,YAAAA,EAAM,YAAN,KAAAb,EAAmBY,GAAA,YAAAA,EAAU,YAA7B,KAAAX,GAA0C,UACtD+B,GAAmB9B,GAAAW,GAAA,YAAAA,EAAM,mBAAN,KAAAX,GAA0B6B,EAC7CE,GAAe7B,IAAAD,GAAAU,GAAA,YAAAA,EAAM,eAAN,KAAAV,GAAsBS,GAAA,YAAAA,EAAU,eAAhC,KAAAR,GAAgD,UAC/D8B,GACJ5B,IAAAD,GAAAQ,GAAA,YAAAA,EAAM,mBAAN,KAAAR,GAA0BO,GAAA,YAAAA,EAAU,mBAApC,KAAAN,GAAwD6B,GAEpDC,EAAYC,EAAG,MAAO,CAC1B,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,MAAO,CACjE,CAAC,EAEKC,EAAgB,CAACC,EAA0BC,IAAsC,CA3EzF,IAAA5C,GA4EI,IAAM6C,EAAWC,EAAkBF,EAAaD,EAAQ,IAAI,EACtDI,GAAiBN,EAAG,KAAK,EACzBO,GAAc7B,EAAkB,gBAAiBwB,EAAQ,KAAMA,EAAQ,IAAI,EAE3EM,EAAUC,EACd,MACA,CACE,MAAO,IACP,OAAQ,KACR,QAAS,WACT,KAAM,OACN,MAAO,6BACP,OAAQb,EACR,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,QACnB,MAAO,CACL,UAAYzB,EAAkBiC,CAAQ,EAAsB,eAAlB,gBAC1C,WAAY,qBACd,EACA,cAAe,MACjB,EACAK,EAAI,OAAQ,CAAE,EAAG,eAAgB,CAAC,CACpC,EACAvB,EAAS,IAAIkB,EAAUI,CAAO,EAE9B,IAAME,GAAmBV,EACvB,MACA,CACE,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,KACd,CACF,EACAQ,CACF,EAEMG,EAAUX,EAAG,KAAM,CACvB,GAAGY,EAAK,eAAe,EACvB,MAAO,CACL,GAAGtB,EAAO,YACV,GAAGE,EAAW,YACd,MAAOC,CACT,CACF,CAAC,EAEDkB,EAAQ,YAAcJ,GAClBM,GAA2BX,CAAO,GACpCS,EAAQ,YAAYG,GAAqB,CAAC,EAE5C3B,EAAc,IAAIiB,EAAUO,CAAO,EAEnC,IAAMI,EAASf,EAAG,KAAM,CACtB,MAAO,CACL,GAAGV,EAAO,kBACV,GAAGE,EAAW,kBACd,MAAOG,CACT,CACF,CAAC,EACDoB,EAAO,YAAcrC,EAAkB,uBAAwBwB,EAAQ,YAAaA,EAAQ,IAAI,EAChGd,EAAoB,IAAIgB,EAAUW,CAAM,EAExC,IAAMC,EAAgBhB,EAAG,MAAO,CAAE,MAAOV,EAAO,mBAAoB,EAAGqB,EAASI,CAAM,EAEhFE,GAAcjB,EAAG,MAAO,CAC5B,MAAOV,EAAO,WACd,KAAM,SACN,SAAU,IACV,gBAAiB,OAAO,CAACnB,EAAkBiC,CAAQ,CAAC,EACpD,gBAAiB,WAAWA,CAAQ,GACpC,aAAc,GAAGjC,EAAkBiC,CAAQ,EAAI,SAAW,UAAU,IAAIG,EAAW,WACnF,QAAS,IAAM3B,EAAkBsB,EAAQ,KAAMC,CAAW,EAC1D,UAAYe,IAAqB,EAC3BA,GAAE,MAAQ,SAAWA,GAAE,MAAQ,OACjCA,GAAE,eAAe,EACjBtC,EAAkBsB,EAAQ,KAAMC,CAAW,EAE/C,CACF,EAAGO,GAAkBM,CAAa,EAClChC,EAAgB,IAAIoB,EAAUa,EAAW,EAGzC,IAAME,GAAiBC,GAAuB,CAC5C,QAASvB,EACT,QAAS3B,EAAiBkC,CAAQ,GAAK,GACvC,SAAU,IAAMzB,EAAgBuB,EAAQ,KAAMC,CAAW,EACzD,MAAO,gCAAgCI,EAAW,GAClD,UAAW,0BAA0BH,CAAQ,GAC7C,KAAM,QACN,SAAU9C,EAAQ,QACpB,CAAC,EACDwB,EAAgB,IAAIsB,EAAUe,EAAc,EAE5C,IAAME,GAAYrB,EAChB,MACA,CAAE,GAAGY,EAAK,SAAS,EAAG,MAAOtB,EAAO,UAAW,EAC/C2B,GACAE,GAAe,OACjB,EAEMG,GAActB,EAAG,MAAO,CAC5B,GAAI,WAAWI,CAAQ,GACvB,MAAOd,EAAO,qBAChB,CAAC,EAED,GAAIY,EAAQ,eAAiBA,EAAQ,cAAc,OAAS,EAC1D,QAAWqB,MAAerB,EAAQ,cAAe,CAC/C,IAAMsB,GAAa,GAAGpB,CAAQ,IAAImB,GAAY,IAAI,GAC5CE,GAAc/C,EAAkB,qBAAsB6C,GAAY,KAAMA,GAAY,IAAI,EAExFG,EAAY1B,EAAG,OAAQ,CAC3B,MAAO,CACL,GAAGV,EAAO,gBACV,GAAGE,EAAW,gBACd,MAAOE,CACT,CACF,CAAC,EACDgC,EAAU,YAAcD,GACxBpC,EAAkB,IAAImC,GAAYE,CAAS,EAEvCC,GAA0BJ,EAAW,GACvCG,EAAU,YAAYZ,GAAqB,CAAC,EAG9C,IAAMc,GAAa5B,EAAG,QAAS,CAC7B,UAAW,yBACX,KAAM,WACN,QAAS5B,EAAqBoD,EAAU,GAAK,GAC7C,aAAc,UAAUC,EAAW,GAAGE,GAA0BJ,EAAW,EAAI,cAAgB,EAAE,GACjG,SAAU,IAAM1C,EAAoB0C,GAAY,KAAMrB,EAAQ,KAAMC,CAAW,CACjF,CAAC,EACDpB,EAAW,IAAIyC,GAAYI,EAAU,EAErC,IAAMC,GAAQ7B,EACZ,MACA,CAAE,GAAGY,EAAK,cAAc,EAAG,MAAOtB,EAAO,eAAgB,EACzDoC,EACAE,EACF,EACAN,GAAY,YAAYO,EAAK,CAC/B,CAGF,OAAA5C,EAAsB,IAAImB,EAAUkB,EAAW,EAE3C,CAACnD,EAAkBiC,CAAQ,KAAK7C,GAAA2C,EAAQ,gBAAR,YAAA3C,GAAuB,QAAS,EAClE+D,GAAY,MAAM,QAAU,OAE5BA,GAAY,MAAM,QAAU,OAG9BhB,GAAe,YAAYe,EAAS,EACpCf,GAAe,YAAYgB,EAAW,EAC/BhB,EACT,EAEA,GAAKwB,GAAezD,CAAQ,EAU1B,QAAW0D,KAASC,GAAuB3D,EAAUhB,EAAUiB,CAAmB,EAAG,CACnF,IAAM2D,EAAUjC,EAAG,MAAO,CACxB,GAAGY,EAAK,SAAS,EACjB,MAAO,CAAE,GAAGtB,EAAO,eAAgB,MAAOG,CAAa,CACzD,CAAC,EACDwC,EAAQ,YAAcvD,EAAkB,gBAAiBqD,EAAM,QAAQ,KAAMA,EAAM,QAAQ,IAAI,EAC3FA,EAAM,QAAQ,WAChBE,EAAQ,YAAYnB,GAAqB,CAAC,EAE5C,IAAMoB,EAAUlC,EACd,MACA,CAAE,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,MAAO,CAAE,EACnEiC,CACF,EACA,QAAW/B,MAAW6B,EAAM,SAC1BG,EAAQ,YAAYjC,EAAcC,GAAS6B,EAAM,QAAQ,IAAI,CAAC,EAEhEhC,EAAU,YAAYmC,CAAO,CAC/B,KA1BA,QAAW,CAAE,QAAAhC,CAAQ,IAAKiC,GAAkB,CAC1C,SAAA9D,EACA,SAAAhB,EACA,sBAAuBiB,CACzB,CAAC,EACCyB,EAAU,YAAYE,EAAcC,CAAO,CAAC,EAwBhD,MAAO,CACL,UAAAH,EACA,gBAAAjB,EACA,WAAAC,EACA,gBAAAC,EACA,sBAAAC,EACA,SAAAC,EACA,cAAAC,EACA,oBAAAC,EACA,kBAAAC,CACF,CACF,CChOO,IAAM+C,GAAkB,CAAC,CAC9B,SAAAC,EACA,QAAAC,EACA,SAAAC,EACA,YAAAC,EACA,SAAAC,EACA,WAAAC,CACF,IAAmC,CA3DnC,IAAAC,EAAAC,EA4DE,IAAMC,EAAaC,GAAkBR,GAAA,YAAAA,EAAS,WAAYC,EAAUC,CAAW,EACzE,CAAE,OAAAO,CAAO,EAAIF,EACbG,EAAgBC,GAAoBJ,CAAU,EAAE,cAChDK,EAASC,GAAgBN,CAAU,EACnCO,EAASC,GAAeC,GAA8BJ,CAAM,EAC5DK,EAAaF,GACjB,CACE,YAAa,CAAE,SAAUZ,EAAW,OAAS,MAAO,EACpD,kBAAmB,CAAE,SAAUA,EAAW,OAAS,MAAO,EAC1D,gBAAiB,CAAE,SAAUA,EAAW,OAAS,MAAO,CAC1D,EACAS,CACF,EACMM,EAAYT,EAAO,MAAQ,UAG3BU,GAASd,EAAAI,EAAO,YAAP,KAAAJ,EAAoBI,EAAO,cAEpCW,EAAmB,CACvB,GAAGN,EAAO,KACV,GAAIL,EAAO,WACP,CACE,GAAGK,EAAO,YACV,gBAAiBL,EAAO,WACxB,aAAcF,EAAW,QAAUc,GAAYd,EAAW,KAAK,EAAE,KACnE,EACA,CAAC,EAEL,GAAIE,EAAO,KAAO,CAAE,MAAOA,EAAO,IAAK,EAAI,CAAC,EAC5C,WAAAL,EACA,GAAIe,EAAS,CAAE,YAAaA,CAAO,EAAI,CAAC,CAC1C,EAEA,MAAO,CACL,WAAAZ,EACA,OAAAO,EACA,WAAAG,EACA,aAAcR,EAAO,SAAW,UAChC,UAAAS,EACA,iBAAkBT,EAAO,YAAcS,EACvC,aAAcT,EAAO,SAAW,UAChC,kBAAkBH,EAAAC,EAAW,mBAAX,KAAAD,EAA+BgB,GACjD,cAAAZ,EACA,UAAAU,EACA,cAAeG,GAAuBd,CAAM,EAG5C,eAAgB,CACd,CAACe,EAAmB,EAAGzB,EACvB,CAAC0B,EAAqB,EAAG,GACzB,CAACC,EAA0B,EAAG,GAC9B,GAAIhB,EAAgB,CAAE,CAACiB,EAAiB,EAAGC,EAAe,EAAI,CAAC,EAC/D,GAAGC,EAAK,MAAM,CAChB,CACF,CACF,ECzDA,IAAMC,GAAsBC,GAGd,KAAK,UAAU,CAACA,EAAM,iBAAkBA,EAAM,oBAAoB,CAAC,EAEpEC,GAAN,KAAuB,CA8B5B,YAAYC,EAAwB,CA1BpC,KAAQ,SAA+B,KACvC,KAAQ,OAA6B,KACrC,KAAQ,WAAgC,KACxC,KAAQ,OAA6B,KAErC,KAAQ,YAAwC,KAChD,KAAQ,QAA8B,KACtC,KAAQ,aAAe,GACvB,KAAQ,kBAAmC,KAC3C,KAAQ,wBAA0B,GAClC,KAAQ,iBAAmB,GAC3B,KAAQ,gBAAkB,EAC1B,KAAQ,YAAmC,KAC3C,KAAQ,gBAA0C,KAElD,KAAQ,UAAY,IAAIC,GACxB,KAAQ,KAA0B,KAMlC,KAAQ,cAA0C,KAClD,KAAQ,iBAAkC,KAC1C,KAAQ,mBAAoC,KAG1C,KAAK,QAAUD,EACf,KAAK,UAAYE,GAAuBF,EAAQ,QAASA,EAAQ,aAAa,EAC9E,KAAK,MAAQ,IAAIG,GAAmB,CAClC,QAAS,KACT,UAAW,GACX,aAAc,GACd,iBAAkBH,EAAQ,UAAY,KACtC,kBAAmB,CAAC,EACpB,iBAAkB,CAAC,EACnB,qBAAsB,CAAC,EACvB,oBAAqB,GACrB,kBAAmB,GACnB,WAAY,KACZ,aAAc,IAChB,CAAC,EACD,KAAK,WAAaI,GAAiB,oBAAoB,EAEvD,KAAK,YAAcA,GAAiBC,EAAiB,CACvD,CAEA,MAAM,MAAsB,CAI1B,GAHA,KAAK,gBAAkB,IAAI,gBAGvB,OAAO,KAAK,QAAQ,QAAW,UAEjC,GADA,KAAK,SAAW,SAAS,cAAc,KAAK,QAAQ,MAAM,EACtD,CAAC,KAAK,SACR,MAAM,IAAI,MAAM,6BAA6B,KAAK,QAAQ,MAAM,EAAE,OAGpE,KAAK,SAAW,KAAK,QAAQ,OAO/B,KAAK,OAAS,SAAS,cAAc,KAAK,EAC1C,KAAK,OAAO,aAAa,8BAA+B,EAAE,EAI1D,KAAK,OAAO,MAAM,QAAU,QAC5B,KAAK,SAAS,YAAY,KAAK,MAAM,EACrC,KAAK,WAAa,KAAK,OAAO,aAAa,CAAE,KAAM,MAAO,CAAC,EAC3DC,GAAqB,KAAK,UAAU,EACpCC,GAAuB,KAAK,UAAU,EAGtC,KAAK,YAAc,KAAK,MAAM,UAAU,CAACT,EAAOU,IAAc,CAC5D,KAAK,kBAAkBV,EAAOU,CAAS,CACzC,CAAC,EAGD,KAAK,WAAW,UAAU,IAAM,KAAK,UAAU,CAAC,EAChD,KAAK,YAAY,UAAU,IAAM,KAAK,UAAU,CAAC,EAGjD,KAAK,cAAc,EAGnB,MAAM,KAAK,YAAY,CACzB,CAEA,SAAgB,CA9JlB,IAAAC,EAAAC,EAAAC,GAiKIF,EAAA,KAAK,kBAAL,MAAAA,EAAsB,SACtBC,EAAA,KAAK,cAAL,MAAAA,EAAA,WACA,KAAK,WAAW,QAAQ,EACxB,KAAK,YAAY,QAAQ,GACzBC,EAAA,KAAK,gBAAL,MAAAA,EAAoB,UACpB,KAAK,cAAgB,KACrB,KAAK,UAAU,OAAO,EACtB,KAAK,MAAM,QAAQ,EAGf,KAAK,QAAU,KAAK,OAAO,YAC7B,KAAK,OAAO,WAAW,YAAY,KAAK,MAAM,EAEhD,KAAK,OAAS,KACd,KAAK,WAAa,KAClB,KAAK,OAAS,KACd,KAAK,YAAc,IACrB,CAEA,YAAYC,EAA2B,CAMrC,GALA,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,YAAAA,CAAY,EAG9C,KAAK,iBAAmB,KACxB,KAAK,mBAAqB,KACtBA,GAAe,CAAC,KAAK,iBAAkB,CACpC,KAAK,YAAY,EACtB,MACF,CAGA,GAAI,KAAK,yBAAyB,EAAG,CAC9B,KAAK,mBAAmB,EAC7B,MACF,CACA,KAAK,cAAc,CACrB,CAMQ,aAAuB,CA3MjC,IAAAH,EA4MI,MAAO,IAAQA,EAAA,KAAK,kBAAL,MAAAA,EAAsB,OAAO,QAC9C,CAEA,MAAc,aAA6B,CA/M7C,IAAAA,EAAAC,EAAAC,EAAAE,EAgNI,IAAMC,EAAa,EAAE,KAAK,gBAC1B,KAAK,iBAAmB,EAAQ,KAAK,QAAQ,YAC7C,KAAK,MAAM,SAAS,CAAE,UAAW,GAAM,WAAY,KAAM,oBAAqB,EAAM,CAAC,EAGrF,IAAMC,EACJ,KAAK,UAAU,OAAS,QAAU,KAAK,QAAQ,aAAe,CAAC,KAAK,QAAQ,cACxE,KAAK,UAAU,cACf,KAAK,UAAU,QACrB,GAAI,CACF,IAAMC,EAAO,MAAMC,GAA0B,CAC3C,SAAU,KAAK,QAAQ,SACvB,eAAgB,KAAK,QAAQ,eAC7B,YAAa,KAAK,QAAQ,YAC1B,YAAa,KAAK,QAAQ,YAC1B,QAASF,EACT,SAAU,KAAK,QAAQ,SACvB,cAAe,KAAK,QAAQ,aAC9B,CAAC,EAED,GAAI,KAAK,YAAY,GAAKD,IAAe,KAAK,gBAC5C,OAGF,IAAMI,EAAeF,EAAK,OAAO,cAC3BG,EAAOC,GAAkBF,CAAY,EAIrCG,EAAY,CAChB,GAAGC,GAAiBH,CAAI,EACxB,GAAGI,GACDJ,EACAK,GACEN,EAAa,SACbO,GAA2BP,EAAa,oBAAoB,CAC9D,CACF,CACF,EAOK,KAAK,mBAAmB,EAE7B,KAAK,MAAM,SAAS,CAClB,QAASA,EACT,UAAW,GACX,iBAAkBQ,GAChB,KAAK,QAAQ,SACbR,EAAa,iBACbA,EAAa,oCACf,EACA,kBAAmBS,GAAyBR,CAAI,EAChD,iBAAkBE,EAAU,iBAC5B,qBAAsBA,EAAU,oBAClC,CAAC,CACH,OAASO,EAAc,CACrB,GAAI,KAAK,YAAY,GAAKd,IAAe,KAAK,gBAC5C,OAEF,IAAMe,EAAQD,EACVC,EAAM,SAAW,KACnB,KAAK,MAAM,SAAS,CAAE,oBAAqB,GAAM,UAAW,EAAM,CAAC,GACnEnB,GAAAD,EAAA,KAAK,SAAQ,WAAb,MAAAC,EAAA,KAAAD,KAEA,KAAK,MAAM,SAAS,CAAE,WAAYoB,EAAO,UAAW,EAAM,CAAC,GAC3DhB,GAAAF,EAAA,KAAK,SAAQ,UAAb,MAAAE,EAAA,KAAAF,EAAuBkB,GAE3B,CACF,CAEQ,0BAAoC,CAC1C,MACE,EAAQ,KAAK,UAAU,eACvB,CAAC,KAAK,QAAQ,eACd,EAAQ,KAAK,QAAQ,aACrB,CAAC,KAAK,uBAEV,CAMA,MAAc,oBAAoC,CAvSpD,IAAApB,EAAAC,EAAAC,EAwSI,GAAK,KAAK,yBAAyB,EACnC,MAAK,wBAA0B,GAC/B,KAAK,MAAM,SAAS,CAAE,kBAAmB,EAAK,CAAC,EAC/C,GAAI,CACF,IAAMmB,EAAS,MAAMC,GAAiC,CACpD,YAAa,KAAK,QAAQ,YAC1B,cAAe,KAAK,UAAU,cAC9B,iBAAkB,KAAK,QAAQ,SAC/B,cAAe,KAAK,QAAQ,eAC5B,WAAY,KAAK,QAAQ,YACzB,QAAQtB,EAAA,KAAK,kBAAL,YAAAA,EAAsB,MAChC,CAAC,EACD,GAAI,KAAK,YAAY,EACnB,OAEEqB,GAAUE,GAAuBF,CAAM,IACzC,KAAK,MAAM,SAAS,CAAE,oBAAqB,EAAK,CAAC,GACjDnB,GAAAD,EAAA,KAAK,SAAQ,WAAb,MAAAC,EAAA,KAAAD,GAEJ,QAAE,CACK,KAAK,YAAY,IACpB,KAAK,MAAM,SAAS,CAAE,kBAAmB,EAAM,CAAC,EAGhD,KAAK,cAAc,EAEvB,EACF,CAEQ,kBAAkBZ,EAAoBU,EAA8B,CAO1E,GALIA,EAAU,WAAa,CAACV,EAAM,WAAaA,EAAM,SACnD,KAAK,UAAU,EAIbA,EAAM,qBAAuBA,EAAM,WAAY,CAC7C,KAAK,QAAU,KAAK,YAAc,KAAK,OAAO,aAAe,KAAK,aACpE,KAAK,WAAW,YAAY,KAAK,MAAM,EACvC,KAAK,OAAS,MAEhB,MACF,EAGIA,EAAM,mBAAqBU,EAAU,kBACrCV,EAAM,uBAAyBU,EAAU,wBAC3C,KAAK,iBAAiBV,CAAK,EAC3B,KAAK,iBAAiBA,CAAK,EAC3B,KAAK,cAAc,GAIjBA,EAAM,oBAAsBU,EAAU,mBACxC,KAAK,oBAAoBV,CAAK,EAI5BA,EAAM,eAAiBU,EAAU,cACnC,KAAK,mBAAmBV,CAAK,CAEjC,CAEQ,eAAsB,CAvWhC,IAAAW,EAAAC,EAwWI,GAAI,CAAC,KAAK,WAAY,OAEtB,IAAMuB,IAAYxB,EAAA,KAAK,QAAQ,WAAb,YAAAA,EAAuB,YAAa,UAEtD,KAAK,OAASyB,EACZ,MACA,CACE,CAACC,EAA0B,EAAG,GAC9B,MAAO,CACL,GAAGC,GAAa,iBAChB,WAAYC,GAAwB,CAAE,UAAU3B,EAAA,KAAK,QAAQ,WAAb,YAAAA,EAAuB,IAAK,CAAC,CAC/E,CACF,EACAwB,EAAG,MAAO,CAAE,MAAOE,GAAa,cAAe,CAAC,EAChDF,EAAG,IAAK,CAAE,MAAO,CAAE,SAAU,OAAQ,WAAY,IAAK,MAAOD,CAAU,CAAE,EAAG,YAAY,CAC1F,EAEA,KAAK,WAAW,YAAY,KAAK,MAAM,CACzC,CAEQ,WAAkB,CA5X5B,IAAAxB,EA6XI,IAAMX,EAAQ,KAAK,MAAM,SAAS,EAGlC,GAFI,CAACA,EAAM,SAAW,CAAC,KAAK,YAExBA,EAAM,qBAAuBA,EAAM,WAAY,OAG/C,KAAK,QAAU,KAAK,OAAO,aAAe,KAAK,YACjD,KAAK,WAAW,YAAY,KAAK,MAAM,EAIzC,KAAK,QAAUoC,EAAG,MAAO,CACvB,KAAM,QACN,MAAO,CACL,gBAAiB,UACjB,MAAO,UACP,QAAS,OACT,aAAc,MACd,SAAU,OACV,OAAQ,oBACR,QAASpC,EAAM,aAAe,QAAU,MAC1C,CACF,CAAC,EACGA,EAAM,eACR,KAAK,QAAQ,YAAcA,EAAM,cAGnC,IAAMwC,EAAOC,GAAgB,CAC3B,SAAU,KAAK,QAAQ,YACvB,QAASzC,EAAM,QACf,SAAU,KAAK,QAAQ,SACvB,YAAa,KAAK,YAAY,QAC9B,SAAU,KAAK,WAAW,QAC1B,WAAYuC,GAAwB,CAClC,UAAU5B,EAAA,KAAK,QAAQ,WAAb,YAAAA,EAAuB,KACjC,WAAYX,EAAM,QAAQ,eAC5B,CAAC,CACH,CAAC,EACD,KAAK,KAAOwC,EACRA,EAAK,eAAeE,GAAmB,KAAK,UAAU,EAC1D,KAAK,UAAU,MAAM,KAAK,WAAY,KAAK,QAAQ,YAAaF,EAAK,WAAW,SAAS,EAGzF,KAAK,YAAcG,GAAqB3C,EAAM,QAAQ,SAAU,CAC9D,iBAAkBA,EAAM,iBACxB,kBAAmBA,EAAM,kBACzB,qBAAsBA,EAAM,qBAC5B,SAAUA,EAAM,QAAQ,SACxB,oBAAqBA,EAAM,QAAQ,sBACnC,SAAU,KAAK,QAAQ,SACvB,KAAAwC,EACA,SAAUxC,EAAM,iBAChB,SAAU,KAAK,WAAW,QAC1B,kBAAmB,CAAC4C,EAAKC,EAAaC,IACpC,KAAK,kBAAkBF,EAAKC,EAAaC,CAAM,EACjD,gBAAiB,CAACC,EAAMC,IAAgB,KAAK,4BAA4BD,EAAMC,CAAW,EAC1F,kBAAmB,CAACD,EAAMC,IAAgB,KAAK,sBAAsBD,EAAMC,CAAW,EACtF,oBAAqB,CAACC,EAAaC,EAAaF,IAC9C,KAAK,gCAAgCC,EAAaC,EAAaF,CAAW,CAC9E,CAAC,EAED,KAAK,OAASZ,EACZ,MACA,CAAE,GAAGI,EAAK,eAAgB,MAAOA,EAAK,SAAU,EAChD,KAAK,QACL,KAAK,YAAY,SACnB,EACAW,GAAkB,KAAK,OAAQX,EAAK,aAAa,EAEjD,KAAK,WAAW,YAAY,KAAK,MAAM,EACvC,KAAK,iBAAiBxC,CAAK,CAC7B,CAEQ,kBAAkB4C,EAAaC,EAAqBC,EAAyB,CAtcvF,IAAAnC,EAAAC,EAAAC,EAucI,IAAMb,EAAQ,KAAK,MAAM,SAAS,EAC5BoD,EAAUpD,EAAM,QACtB,GAAI,CAACoD,EAAS,OAAOP,EAErB,IAAMQ,EAAOrD,EAAM,iBACnB,GAAIqD,IAAS,WAAaA,IAAS,MAAQA,IAAS,KAClD,OAAIT,IAAQ,8BAAgCQ,EAAQ,2BAC3CA,EAAQ,2BAEVP,EAGT,IAAMS,EAAeF,EAAQ,qCAC7B,GAAI,CAACE,EAAc,OAAOT,EAE1B,IAAMU,EAAiBD,EAAaD,CAAI,EACxC,GAAI,CAACE,EAAgB,OAAOV,EAE5B,GAAIC,EAAQ,CACV,GAAIF,IAAQ,iBAAmBA,IAAQ,uBAAwB,CAC7D,IAAMY,GAAc7C,EAAA4C,EAAe,WAAf,YAAA5C,EAA0BmC,GAC9C,OAAIU,EACE,OAAOA,GAAgB,SAClBZ,IAAQ,gBAAkBY,EAAcX,EAE1CD,IAAQ,gBACXY,EAAY,MAAQX,EACpBW,EAAY,aAAeX,EAE1BA,CACT,CACA,GAAID,IAAQ,iBAAmBA,IAAQ,uBAAwB,CAC7D,IAAMa,GAAc7C,EAAA2C,EAAe,WAAf,YAAA3C,EAA0BkC,GAC9C,OAAIW,EACE,OAAOA,GAAgB,SAClBb,IAAQ,gBAAkBa,EAAcZ,EAE1CD,IAAQ,gBACXa,EAAY,MAAQZ,EACpBY,EAAY,aAAeZ,EAE1BA,CACT,CACA,GAAID,EAAI,WAAW,gBAAgB,EACjC,QAAO/B,EAAA0C,EAAe,gBAAf,YAAA1C,EAA+BiC,KAAWD,CAErD,CAEA,IAAMa,EAASH,EAAuBX,CAAG,EACzC,OAAI,OAAOc,GAAU,UAAYA,EAAcA,EACxCb,CACT,CAEQ,sBAAsBK,EAAqBF,EAA4B,CAC7E,IAAMhD,EAAQ,KAAK,MAAM,SAAS,EAC5B4C,EAAMe,EAAkBX,EAAaE,CAAW,EACtD,KAAK,MAAM,SAAS,CAClB,kBAAmB,CACjB,GAAGlD,EAAM,kBACT,CAAC4C,CAAG,EAAG,CAAC5C,EAAM,kBAAkB4C,CAAG,CACrC,CACF,CAAC,CACH,CAEQ,4BAA4BM,EAAqBF,EAA4B,CACnF,IAAMhD,EAAQ,KAAK,MAAM,SAAS,EAC5BoD,EAAUpD,EAAM,QACtB,GAAI,CAACoD,EAAS,OAEd,IAAMQ,EAAUR,EAAQ,SAAS,KAAMS,GAAMA,EAAE,OAASX,CAAW,EACnE,GAAI,CAACU,EAAS,OAEd,IAAMhB,EAAMe,EAAkBX,EAAaE,CAAW,EAChDY,EAAkB,CAAC9D,EAAM,iBAAiB4C,CAAG,EAEnD,KAAK,MAAM,SAAS,CAClB,iBAAkB,CAAE,GAAG5C,EAAM,iBAAkB,CAAC4C,CAAG,EAAGkB,CAAgB,EACtE,qBAAsBC,GACpBH,EACAZ,EACAc,EACA9D,EAAM,oBACR,CACF,CAAC,CACH,CAEQ,gCACNiD,EACAC,EACAF,EACM,CACN,IAAMhD,EAAQ,KAAK,MAAM,SAAS,EAC5BoD,EAAUpD,EAAM,QACtB,GAAI,CAACoD,EAAS,OAEd,IAAMQ,EAAUR,EAAQ,SAAS,KAAMS,GAAMA,EAAE,OAASX,CAAW,EACnE,GAAI,CAACU,EAAS,OAEd,IAAMI,EAAOC,GAAkBL,EAASX,EAAaD,EAAahD,EAAM,oBAAoB,EAE5F,KAAK,MAAM,SAAS,CAClB,qBAAsBgE,EAAK,qBAC3B,iBAAkB,CAChB,GAAGhE,EAAM,iBACT,CAAC2D,EAAkBX,EAAaE,CAAW,CAAC,EAAGc,EAAK,eACtD,CACF,CAAC,CACH,CAEQ,iBAAiBhE,EAA0B,CACjD,GAAK,KAAK,YAEV,QAAW,CAAC4C,EAAKsB,CAAO,IAAK,KAAK,YAAY,gBAC5CA,EAAQ,WAAWlE,EAAM,iBAAiB4C,CAAG,GAAK,EAAK,EAEzD,OAAW,CAACA,EAAKuB,CAAQ,IAAK,KAAK,YAAY,WAC7CA,EAAS,QAAUnE,EAAM,qBAAqB4C,CAAG,GAAK,GAE1D,CAEQ,oBAAoB5C,EAA0B,CA/jBxD,IAAAW,EAAAC,EAgkBI,GAAI,CAAC,KAAK,YAAa,OAEvB,IAAMS,EAAOrB,EAAM,QAAUsB,GAAkBtB,EAAM,OAAO,EAAI,CAAC,EAC3DoE,EAAY,IAAI,IACpB/C,EAAK,IAAKgD,GAAQ,CAACV,EAAkBU,EAAI,YAAaA,EAAI,QAAQ,IAAI,EAAGA,CAAG,CAAC,CAC/E,EAEA,OAAW,CAACC,EAAUC,CAAS,IAAK,KAAK,YAAY,sBAAuB,CAC1E,IAAMX,GAAUjD,EAAAyD,EAAU,IAAIE,CAAQ,IAAtB,YAAA3D,EAAyB,QACnC6D,EAAcxE,EAAM,kBAAkBsE,CAAQ,EAEpDC,EAAU,MAAM,QAAU,CAACC,KAAe5D,EAAAgD,GAAA,YAAAA,EAAS,gBAAT,MAAAhD,EAAwB,QAAS,OAAS,OAEpF,IAAM6D,EAAU,KAAK,YAAY,SAAS,IAAIH,CAAQ,EAClDG,IACDA,EAAmC,MAAM,UAAaD,EAEnD,eADA,iBAIN,IAAME,EAAc,KAAK,YAAY,gBAAgB,IAAIJ,CAAQ,EAC7DI,GACFA,EAAY,aAAa,gBAAiB,OAAO,CAACF,CAAW,CAAC,CAElE,CACF,CAEQ,mBAAmBxE,EAA0B,CAC9C,KAAK,UACNA,EAAM,cACR,KAAK,QAAQ,YAAcA,EAAM,aACjC,KAAK,QAAQ,MAAM,QAAU,SAE7B,KAAK,QAAQ,MAAM,QAAU,OAEjC,CAEQ,+BAAyC,CAC/C,IAAMA,EAAQ,KAAK,MAAM,SAAS,EAC5BoD,EAAUpD,EAAM,QACtB,OAAKoD,EAEEuB,GAA2BrD,GAAkB8B,CAAO,EAAGpD,EAAM,oBAAoB,EAFnE,EAGvB,CAEQ,iBAAiBA,EAA0B,CA7mBrD,IAAAW,EAAAC,EA8mBI,IAAMgE,EAAU,KAAK,8BAA8B,GACnDhE,GAAAD,EAAA,KAAK,SAAQ,qBAAb,MAAAC,EAAA,KAAAD,EAAkCiE,EACpC,CAEA,MAAc,cAAcC,EAAyB,KAAqB,CAlnB5E,IAAAlE,EAonBI,GAAI,KAAK,YAAY,EACnB,OAGF,IAAMX,EAAQ,KAAK,MAAM,SAAS,EAC5Bc,EAAc,KAAK,QAAQ,YAEjC,GACEA,GACAd,EAAM,SACN,KAAK,8BAA8B,GACnC,CAACA,EAAM,cACP,CAACA,EAAM,mBACP,CAACA,EAAM,qBACP,CAAC,KAAK,aACN,CACA,IAAM8E,EAAgBC,GAAoBjE,EAAad,EAAM,QAAQ,KAAMA,CAAK,EAChF,GAAI8E,IAAkB,KAAK,mBAAqBA,IAAkBD,EAChE,OAEF,IAAIlE,EAAA,KAAK,OAAL,MAAAA,EAAW,WAAW,oBAAqB,CAC7C,IAAMqE,EAAYjF,GAAmBC,CAAK,EAC1C,GAAI,KAAK,mBAAqBgF,GAAa,KAAK,qBAAuBA,EACrE,OAEF,KAAK,aAAaA,CAAS,EAC3B,MACF,CACA,MAAM,KAAK,cAAclE,EAAagE,CAAa,CACrD,CACF,CAGQ,aAAaE,EAAyB,CArpBhD,IAAArE,EAAAC,EAAAC,EAspBQ,KAAK,eAAiB,CAAC,KAAK,aAChC,KAAK,cAAgBoE,GAAkB,CACrC,KAAM,KAAK,WACX,OAAQ,kBACR,SAAU,KAAK,MAAM,SAAS,EAAE,iBAChC,gBAAgBtE,EAAA,KAAK,OAAL,YAAAA,EAAW,eAC3B,YAAaE,GAAAD,EAAA,KAAK,OAAL,YAAAA,EAAW,UAAU,aAArB,KAAAC,EAA0D,OACvE,UAAW,IAAM,CACf,KAAK,cAAgB,KACrB,KAAK,mBAAqBmE,EACrB,KAAK,gBAAgB,CAC5B,EACA,SAAU,IAAM,CACd,KAAK,cAAgB,KACrB,KAAK,iBAAmBA,CAC1B,CACF,CAAC,EACH,CAEA,MAAc,iBAAiC,CAC7C,IAAMhF,EAAQ,KAAK,MAAM,SAAS,EAC5Bc,EAAc,KAAK,QAAQ,YACjC,GAAI,KAAK,YAAY,GAAK,CAACA,GAAe,CAACd,EAAM,QAAS,OAKtD,CAJc,MAAM,KAAK,cAC3Bc,EACAiE,GAAoBjE,EAAad,EAAM,QAAQ,KAAMA,CAAK,CAC5D,GACkB,CAAC,KAAK,YAAY,IAGlC,KAAK,mBAAqB,KACrB,KAAK,cAAc,EAE5B,CAGA,MAAc,cAAcc,EAAqBgE,EAAyC,CA1rB5F,IAAAnE,EAAAC,EA2rBI,KAAK,aAAe,GACpB,KAAK,kBAAoBkE,EACzB,GAAI,CACF,MAAM,KAAK,aAAahE,CAAW,CACrC,OAASgB,EAAK,CACZ,YAAK,aAAe,IACpBlB,GAAAD,EAAA,KAAK,SAAQ,UAAb,MAAAC,EAAA,KAAAD,EAAuBmB,GACnBoD,GAAmBpD,CAAG,GACxB,KAAK,kBAAoB,KACpB,KAAK,cAAcgD,CAAa,GAIhC,KAAK,cAAc,EAEnB,EACT,CACA,OAAK,KAAK,cAAc,EACjB,EACT,CAEA,MAAc,aAAaK,EAAmC,CAhtBhE,IAAAxE,EAAAC,EAitBI,IAAMZ,EAAQ,KAAK,MAAM,SAAS,EAC5BoD,EAAUpD,EAAM,QACtB,GAAI,CAACmF,GAAc,CAAC/B,EAClB,WAAK,MAAM,SAAS,CAAE,aAAc,6CAA8C,CAAC,EAC7E,IAAI,MAAM,uCAAuC,EAGzD,GAAI,CACF,KAAK,MAAM,SAAS,CAAE,aAAc,GAAM,aAAc,IAAK,CAAC,EAE9D,MAAMgC,GAAyB,CAC7B,SAAU,KAAK,QAAQ,SACvB,eAAgB,KAAK,QAAQ,eAC7B,YAAaD,EACb,QAAS,KAAK,UAAU,QACxB,cAAe,KAAK,UAAU,cAC9B,WAAY/B,EAAQ,YACpB,SAAUiC,GAA0B/D,GAAkB8B,CAAO,EAAGpD,CAAK,EACrE,SAAU,GACV,UAAW,KAAK,QAAQ,cACpB,CAAE,cAAe,KAAK,QAAQ,aAAc,EAC5C,OACJ,SAAUA,EAAM,gBAClB,CAAC,GAEDY,GAAAD,EAAA,KAAK,SAAQ,WAAb,MAAAC,EAAA,KAAAD,GACA,KAAK,aAAe,EACtB,OAASoB,EAAO,CAEd,IAAMuD,EADMvD,EACQ,SAAW,8CAC/B,WAAK,MAAM,SAAS,CAAE,aAAcuD,CAAQ,CAAC,EAC7C,KAAK,aAAe,GACdvD,CACR,QAAE,CACA,KAAK,MAAM,SAAS,CAAE,aAAc,EAAM,CAAC,CAC7C,CACF,CACF,ECnvBO,IAAMwD,GAAoBC,GAEpBC,GAAkB,CAC7B,UAAW,EACX,cAAe,GACf,SAAU,MACV,QAAS,MACT,aAAc,QACd,WAAY,QACZ,aAAc,EAChB,EAEaC,GAAc,6BAEdC,GAAoD,OAEpDC,GAA6B,CACxC,OAAQ,uDACR,UAAW,4CACX,UAAW,8CACX,OAAQ,mDACR,MAAO,mDACT,EAEaC,GAA0B,gCAE1BC,EAAe,CAC1B,YAAa,0BACb,WAAY,yBACZ,eAAgB,wBAChB,YAAa,0BACb,uBAAwB,4BACxB,OAAQ,0BACR,YAAa,0BACf,EAEaC,GAAsB,iBAEtBC,GAAa,CACxB,SAAU,WACV,QAAS,UACT,UAAW,aACX,QAAS,UACT,QAAS,UACT,eAAgB,kBAChB,aAAc,gBACd,cAAe,iBACf,OAAQ,SACR,MAAO,QACP,QAAUC,GAAwB,WAAWA,CAAW,GACxD,SAAWA,GAAwB,YAAYA,CAAW,GAC1D,QAAS,CAACA,EAAqBC,IAAwB,WAAWD,CAAW,IAAIC,CAAW,EAC9F,EAEaC,GAAiC,UAEjCC,GAAoB,0BAEpBC,GAAe,qBC1C5B,IAAMC,GAAc,CAClBC,EACAC,EACAC,IAEA,GAAGF,GAAWG,EAAiB,yBAAyBF,CAAgB,eAAeC,CAAa,GAEzFE,GAAsB,MAAO,CACxC,iBAAAH,EACA,cAAAC,EACA,WAAAG,EACA,QAAAL,EACA,OAAAM,CACF,IAAkE,CAChE,GAAI,CAACL,GAAoB,CAACC,GAAiB,CAACG,EAC1C,MAAM,IAAI,MAAM,6DAA6D,EAG/E,IAAME,EAAM,GAAGR,GAAYC,EAASC,EAAkBC,CAAa,CAAC,uBAAuBG,CAAU,GAE/FG,EAAW,MAAM,MAAMD,EAAK,CAChC,OAAQ,MACR,QAAS,CAAE,OAAQ,kBAAmB,EACtC,OAAAD,CACF,CAAC,EAED,GAAI,CAACE,EAAS,GACZ,MAAM,MAAMC,GAAcD,EAAUE,GAA2B,MAAM,EAGvE,OAAQ,MAAMF,EAAS,KAAK,CAC9B,EAEaG,GAAY,MAAO,CAC9B,iBAAAV,EACA,cAAAC,EACA,GAAAU,EACA,QAAAC,EACA,QAAAb,EACA,OAAAM,CACF,IAAiD,CAC/C,GAAI,CAACL,GAAoB,CAACC,GAAiB,CAACU,EAC1C,MAAM,IAAI,MAAM,qDAAqD,EAGvE,IAAML,EAAM,GAAGR,GAAYC,EAASC,EAAkBC,CAAa,CAAC,cAE9DM,EAAW,MAAM,MAAMD,EAAK,CAChC,OAAQ,OACR,QAAS,CACP,OAAQ,mBACR,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAU,CAAE,GAAAK,EAAI,QAAAC,CAAQ,CAAC,EACpC,OAAAP,CACF,CAAC,EAED,GAAI,CAACE,EAAS,GACZ,MAAM,MAAMC,GAAcD,EAAUE,GAA2B,SAAS,EAI1E,OADc,MAAMF,EAAS,KAAK,GACtB,MACd,EAEaM,GAAY,MAAO,CAC9B,iBAAAb,EACA,cAAAC,EACA,KAAAa,EACA,IAAAC,EACA,QAAAC,EACA,QAAAjB,EACA,OAAAM,CACF,IAAiD,CAC/C,GAAI,CAACL,GAAoB,CAACC,GAAiB,CAACa,GAAQ,CAACC,EACnD,MAAM,IAAI,MAAM,4DAA4D,EAG9E,IAAMT,EAAM,GAAGR,GAAYC,EAASC,EAAkBC,CAAa,CAAC,cAE9DM,EAAW,MAAM,MAAMD,EAAK,CAChC,OAAQ,OACR,QAAS,CACP,OAAQ,mBACR,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAU,CAAE,KAAAQ,EAAM,IAAAC,EAAK,QAAAC,CAAQ,CAAC,EAC3C,OAAAX,CACF,CAAC,EAED,GAAI,CAACE,EAAS,GACZ,MAAM,MAAMC,GAAcD,EAAUE,GAA2B,SAAS,EAI1E,OADc,MAAMF,EAAS,KAAK,GACtB,MACd,EAEaU,GAAwB,MAAO,CAC1C,YAAAC,EACA,iBAAAlB,EACA,cAAAC,EACA,QAAAF,EACA,cAAAoB,EACA,WAAAf,EACA,SAAAgB,EACA,SAAAC,EACA,OAAAhB,CACF,IAA4E,CAC1E,GAAI,CAACa,GAAe,CAACd,GAAc,CAAC,MAAM,QAAQgB,CAAQ,EACxD,MAAM,IAAI,MAAM,yDAAyD,EAG3E,IAAME,EAAU,CACd,YAAalB,EACb,SAAUmB,GAAiBH,CAAQ,EACnC,qBAAsB,GACtB,OAAQ,MACR,SAAU,GACV,SAAUI,GAAeH,CAAQ,CACnC,EAEMf,EAAM,GAAGR,GAAYqB,GAAiBpB,EAASC,EAAkBC,CAAa,CAAC,kBAC/EwB,EAAiB,KAAK,UAAUH,CAAO,EAEvCf,EAAW,MAAMmB,GAAmBpB,EAAKmB,EAAiBE,GAC9D,MAAMrB,EAAK,CACT,OAAQ,OACR,QAAS,CACP,OAAQ,mBACR,cAAe,UAAUY,CAAW,GACpC,eAAgB,mBAChB,GAAGS,CACL,EACA,KAAMF,EACN,OAAApB,CACF,CAAC,CACH,EAEA,GAAI,CAACE,EAAS,GACZ,MAAM,MAAMC,GAAcD,EAAUE,GAA2B,MAAM,EAGvE,IAAMmB,EAAO,MAAMrB,EAAS,KAAK,EACjC,GAAI,CAACqB,EAAM,OAAO,KAClB,GAAI,CACF,OAAO,KAAK,MAAMA,CAAI,CACxB,MAAQ,CACN,OAAO,IACT,CACF,EAEaC,GAA4B,MAAO,CAC9C,iBAAA7B,EACA,cAAAC,EACA,WAAAG,EACA,SAAAiB,EACA,QAAAtB,EACA,OAAAM,CACF,IAAsE,CACpE,GAAI,CAACL,GAAoB,CAACC,GAAiB,CAACG,GAAc,CAACiB,EACzD,MAAM,IAAI,MAAM,uEAAuE,EAGzF,IAAMf,EAAM,GAAGR,GAAYC,EAASC,EAAkBC,CAAa,CAAC,YAAYG,CAAU,UAAUiB,CAAQ,GAEtGd,EAAW,MAAM,MAAMD,EAAK,CAChC,OAAQ,MACR,QAAS,CAAE,OAAQ,kBAAmB,EACtC,OAAAD,CACF,CAAC,EAED,GAAI,CAACE,EAAS,GACZ,MAAM,MAAMC,GAAcD,EAAUE,GAA2B,KAAK,EAGtE,OAAQ,MAAMF,EAAS,KAAK,CAC9B,EClMA,IAAMuB,GAAoB,CACxB,gBAAiB,oBACjB,iBAAkB,qBAClB,aAAc,gBACd,eAAgB,gDAChB,YAAa,eACb,cAAe,wBACf,gBAAiB,0BACjB,aAAc,sCACd,cAAe,gBACf,sBAAuB,2BACvB,SAAU,WACV,QAAS,OACT,eAAgB,kBAChB,sBAAuB,4CACvB,cAAe,mBACf,WAAY,uBACZ,WAAY,uBACZ,cAAe,iBACf,cAAe,iBACf,aAAc,gBACd,UAAW,iDACX,UAAW,cACX,aAAc,uBACd,eAAgB,0BAChB,SAAU,oBACV,SAAU,2BACV,QAAS,gBACT,UAAW,aACX,OAAQ,UACR,UAAW,kBACX,UAAW,aACX,QAAS,WACT,WAAY,cACZ,cAAe,kBACf,eAAgB,kBAChB,aACE,8EACF,WAAY,iEACZ,YAAa,0DACb,gBAAiB,8CACjB,cAAe,4CACf,iBAAkB,oBAClB,cAAe,gDACf,gBAAiB,0DACjB,mBAAoB,uBACpB,QAAS,UACT,cAAe,iBACf,gBAAiB,mCACjB,SAAU,oBACV,MAAO,OACT,EAEMC,GAAoB,CACxB,gBAAiB,qGACjB,iBAAkB,iHAClB,aAAc,8CACd,eAAgB,4MAChB,YAAa,0DACb,cAAe,yHACf,gBAAiB,qIACjB,aAAc,6IACd,cAAe,wCACf,sBAAuB,+EACvB,SAAU,uCACV,QAAS,2BACT,eAAgB,0DAChB,sBAAuB,uIACvB,cAAe,iGACf,WAAY,8HACZ,WAAY,2GACZ,cAAe,yFACf,cAAe,sEACf,aAAc,gEACd,UAAW,4MACX,UAAW,mFACX,aAAc,+FACd,eAAgB,6IAChB,SAAU,kEACV,SAAU,2JACV,QAAS,8EACT,UAAW,+FACX,OAAQ,2GACR,UAAW,+HACX,UAAW,iHACX,QAAS,sEACT,WAAY,kHACZ,cAAe,8HACf,eAAgB,yFAChB,aACE,6YACF,WAAY,uTACZ,YAAa,8NACb,gBAAiB,yQACjB,cAAe,iPACf,iBAAkB,sGAClB,cAAe,+MACf,gBACE,mOACF,mBAAoB,+FACpB,QAAS,oDACT,cAAe,iGACf,gBAAiB,4IACjB,SAAU,yHACV,MAAO,6CACT,EAEMC,GAAoB,CACxB,gBAAiB,qGACjB,iBAAkB,2GAClB,aAAc,sEACd,eAAgB,gQAChB,YAAa,2GACb,cAAe,+HACf,gBAAiB,yHACjB,aAAc,sNACd,cAAe,mFACf,sBAAuB,0HACvB,SAAU,uCACV,QAAS,2BACT,eAAgB,qGAChB,sBAAuB,uLACvB,cAAe,yFACf,WAAY,oIACZ,WAAY,oIACZ,cAAe,+FACf,cAAe,+FACf,aAAc,sEACd,UAAW,gQACX,UAAW,iHACX,aAAc,gJACd,eAAgB,yHAChB,SAAU,oFACV,SAAU,4KACV,QAAS,4EACT,UAAW,iHACX,OAAQ,0DACR,UAAW,yFACX,UAAW,+FACX,QAAS,sEACT,WAAY,2GACZ,cAAe,8HACf,eAAgB,6HAChB,aACE,sZACF,WACE,6XACF,YAAa,kTACb,gBACE,+RACF,cAAe,kRACf,iBAAkB,uHAClB,cAAe,0NACf,gBACE,wOACF,mBAAoB,uHACpB,QAAS,0DACT,cAAe,mFACf,gBAAiB,iJACjB,SAAU,6JACV,MAAO,mDACT,EAEMC,GAAoB,CACxB,gBAAiB,0DACjB,iBAAkB,sEAClB,aAAc,sEACd,eAAgB,qMAChB,YAAa,oDACb,cAAe,mHACf,gBAAiB,0FACjB,aAAc,mJACd,cAAe,qDACf,sBAAuB,4FACvB,SAAU,uCACV,QAAS,2BACT,eAAgB,uEAChB,sBAAuB,oJACvB,cAAe,gGACf,WAAY,kHACZ,WAAY,iHACZ,cAAe,6EACf,cAAe,4EACf,aAAc,gEACd,UAAW,qMACX,UAAW,kFACX,aAAc,yFACd,eAAgB,0HAChB,SAAU,kEACV,SAAU,0JACV,QAAS,yFACT,UAAW,yFACX,OAAQ,sEACR,UAAW,yFACX,UAAW,sEACX,QAAS,sEACT,WAAY,4GACZ,cAAe,mFACf,eAAgB,2GAChB,aACE,4VACF,WAAY,uTACZ,YAAa,qOACb,gBAAiB,6PACjB,cAAe,6PACf,iBAAkB,+FAClB,cAAe,oLACf,gBACE,gOACF,mBAAoB,+FACpB,QAAS,wCACT,cAAe,mHACf,gBAAiB,sIACjB,SAAU,sIACV,MAAO,uCACT,EAEMC,GAAoB,CACxB,gBAAiB,0DACjB,iBAAkB,gEAClB,aAAc,gEACd,eAAgB,wRAChB,YAAa,kFACb,cAAe,6HACf,gBAAiB,uHACjB,aAAc,wMACd,cAAe,gEACf,sBAAuB,iGACvB,SAAU,iCACV,QAAS,2BACT,eAAgB,kFAChB,sBAAuB,qKACvB,cAAe,iKACf,WAAY,2JACZ,WAAY,iKACZ,cAAe,kIACf,cAAe,wIACf,aAAc,4EACd,UAAW,wRACX,UAAW,gHACX,aAAc,6HACd,eAAgB,yHAChB,SAAU,wEACV,SAAU,6LACV,QAAS,yGACT,UAAW,oGACX,OAAQ,kFACR,UAAW,qHACX,UAAW,8FACX,QAAS,kFACT,WAAY,8FACZ,cAAe,uHACf,eAAgB,sHAChB,aACE,mZACF,WAAY,iSACZ,YAAa,uQACb,gBAAiB,uRACjB,cAAe,2QACf,iBAAkB,4HAClB,cACE,wQACF,gBACE,wSACF,mBAAoB,+FACpB,QAAS,2EACT,cAAe,iHACf,gBAAiB,gMACjB,SAAU,gJACV,MAAO,sCACT,EAEMC,GAAoB,CACxB,gBAAiB,sGACjB,iBAAkB,2GAClB,aAAc,uEACd,eAAgB,gPAChB,YAAa,0FACb,cAAe,yFACf,gBAAiB,gGACjB,aAAc,wJACd,cAAe,wCACf,sBAAuB,yEACvB,SAAU,iCACV,QAAS,2BACT,eAAgB,0DAChB,sBAAuB,sIACvB,cAAe,sGACf,WAAY,yHACZ,WAAY,gGACZ,cAAe,gGACf,cAAe,uEACf,aAAc,gEACd,UAAW,yOACX,UAAW,oFACX,aAAc,wHACd,eAAgB,oJAChB,SAAU,sFACV,SAAU,iMACV,QAAS,gEACT,UAAW,yHACX,OAAQ,uGACR,UAAW,mFACX,UAAW,uGACX,QAAS,oFACT,WAAY,uGACZ,cAAe,gIACf,eAAgB,qGAChB,aACE,0YACF,WACE,8XACF,YAAa,qRACb,gBACE,gUACF,cACE,6SACF,iBAAkB,qGAClB,cAAe,sIACf,gBAAiB,sKACjB,mBAAoB,4GACpB,QAAS,oDACT,cAAe,gGACf,gBAAiB,0KACjB,SAAU,yKACV,MAAO,6CACT,EAEMC,GAAqB,CACzB,gBAAiB,gEACjB,iBAAkB,4EAClB,aAAc,0DACd,eAAgB,4NAChB,YAAa,0DACb,cAAe,qIACf,gBAAiB,yHACjB,aAAc,kJACd,cAAe,8CACf,sBAAuB,2FACvB,SAAU,6CACV,QAAS,2BACT,eAAgB,0DAChB,sBAAuB,iIACvB,cAAe,qGACf,WAAY,8HACZ,WAAY,uHACZ,cAAe,yFACf,cAAe,kFACf,aAAc,kFACd,UAAW,8OACX,UAAW,sEACX,aAAc,iHACd,eAAgB,6GAChB,SAAU,8EACV,SAAU,0JACV,QAAS,uCACT,UAAW,yFACX,OAAQ,4EACR,UAAW,6CACX,UAAW,4EACX,QAAS,sEACT,WAAY,2GACZ,cAAe,2GACf,eAAgB,qGAChB,aACE,uWACF,WAAY,0TACZ,YAAa,iPACb,gBAAiB,mQACjB,cAAe,uPACf,iBAAkB,qGAClB,cAAe,yKACf,gBACE,iOACF,mBAAoB,+FACpB,QAAS,0DACT,cAAe,6EACf,gBAAiB,8JACjB,SAAU,gIACV,MAAO,6CACT,EAEMC,GAAqB,CACzB,gBAAiB,6EACjB,iBAAkB,yFAClB,aAAc,8CACd,eAAgB,kNAChB,YAAa,oDACb,cAAe,6GACf,gBAAiB,yHACjB,aAAc,oHACd,cAAe,kCACf,sBAAuB,yEACvB,SAAU,uCACV,QAAS,2BACT,eAAgB,oDAChB,sBAAuB,iIACvB,cAAe,iGACf,WAAY,wHACZ,WAAY,qGACZ,cAAe,mFACf,cAAe,gEACf,aAAc,gEACd,UAAW,kNACX,UAAW,yFACX,aAAc,yFACd,eAAgB,qHAChB,SAAU,kEACV,SAAU,+IACV,QAAS,0FACT,UAAW,yFACX,OAAQ,qGACR,UAAW,+HACX,UAAW,2GACX,QAAS,gEACT,WAAY,sGACZ,cAAe,wHACf,eAAgB,mFAChB,aACE,mUACF,WAAY,8RACZ,YAAa,4MACb,gBAAiB,kPACjB,cAAe,qOACf,iBAAkB,gGAClB,cAAe,qLACf,gBACE,+MACF,mBAAoB,+FACpB,QAAS,8CACT,cAAe,kGACf,gBAAiB,iIACjB,SAAU,mHACV,MAAO,uCACT,EAEMC,GAAoB,CACxB,gBAAiB,0GACjB,iBAAkB,oGAClB,aAAc,4EACd,eAAgB,6RAChB,YAAa,kFACb,cAAe,iKACf,gBAAiB,mIACjB,aAAc,gRACd,cAAe,8FACf,sBAAuB,uJACvB,SAAU,yDACV,QAAS,2BACT,eAAgB,0GAChB,sBAAuB,iLACvB,cAAe,mIACf,WAAY,2JACZ,WAAY,oOACZ,cAAe,wIACf,cAAe,iNACf,aAAc,gEACd,UAAW,uRACX,UAAW,4EACX,aAAc,2GACd,eAAgB,uGAChB,SAAU,8EACV,SAAU,0MACV,QAAS,iFACT,UAAW,yIACX,OAAQ,sEACR,UAAW,mGACX,UAAW,gHACX,QAAS,8FACT,WAAY,4HACZ,cAAe,6KACf,eAAgB,mLAChB,aACE,mZACF,WACE,qaACF,YACE,qVACF,gBAAiB,mSACjB,cAAe,iRACf,iBAAkB,sHAClB,cAAe,sPACf,gBACE,0QACF,mBAAoB,yFACpB,QAAS,uCACT,cAAe,yIACf,gBAAiB,0LACjB,SAAU,gJACV,MAAO,wDACT,EAEMC,GAAyB,CAC7B,gBAAiB,wFACjB,iBAAkB,8FAClB,aAAc,sEACd,eAAgB,mSAChB,YAAa,4EACb,cAAe,2IACf,gBAAiB,2IACjB,aAAc,iJACd,cAAe,8CACf,sBAAuB,4FACvB,SAAU,8CACV,QAAS,2BACT,eAAgB,0DAChB,sBAAuB,4IACvB,cAAe,mFACf,WAAY,2GACZ,WAAY,iHACZ,cAAe,4EACf,cAAe,kFACf,aAAc,sEACd,UAAW,mSACX,UAAW,4EACX,aAAc,iHACd,eAAgB,qIAChB,SAAU,wEACV,SAAU,wNACV,QAAS,iCACT,UAAW,kHACX,OAAQ,0DACR,UAAW,wFACX,UAAW,iHACX,QAAS,0DACT,WAAY,wHACZ,cAAe,8HACf,eAAgB,oGAChB,aACE,ueACF,WACE,mZACF,YAAa,gTACb,gBACE,8UACF,cAAe,uRACf,iBAAkB,0IAClB,cACE,+PACF,gBACE,mRACF,mBAAoB,iHACpB,QAAS,8CACT,cAAe,6EACf,gBAAiB,2IACjB,SAAU,8KACV,MAAO,4CACT,EAEMC,GAAoB,CACxB,gBAAiB,0DACjB,iBAAkB,sEAClB,aAAc,0DACd,eAAgB,0MAChB,YAAa,oDACb,cAAe,mHACf,gBAAiB,+HACjB,aAAc,sIACd,cAAe,wCACf,sBAAuB,+EACvB,SAAU,uCACV,QAAS,2BACT,eAAgB,0DAChB,sBAAuB,uIACvB,cAAe,2GACf,WAAY,kHACZ,WAAY,2GACZ,cAAe,mFACf,cAAe,4EACf,aAAc,gEACd,UAAW,0MACX,UAAW,4EACX,aAAc,yFACd,eAAgB,4IAChB,SAAU,kEACV,SAAU,gKACV,QAAS,0DACT,UAAW,2GACX,OAAQ,sEACR,UAAW,gEACX,UAAW,4EACX,QAAS,sEACT,WAAY,4GACZ,cAAe,yFACf,eAAgB,+FAChB,aACE,yaACF,WAAY,8SACZ,YAAa,0OACb,gBAAiB,kQACjB,cAAe,4PACf,iBAAkB,qGAClB,cAAe,0LACf,gBACE,gOACF,mBAAoB,+FACpB,QAAS,wCACT,cAAe,0FACf,gBAAiB,wJACjB,SAAU,qIACV,MAAO,uCACT,EAEMC,GAAoB,CACxB,gBAAiB,uHACjB,iBAAkB,mIAClB,aAAc,gEACd,eAAgB,mRAChB,YAAa,mIACb,cAAe,uJACf,gBAAiB,mKACjB,aAAc,gNACd,cAAe,mFACf,sBAAuB,0HACvB,SAAU,uCACV,QAAS,2BACT,eAAgB,qGAChB,sBAAuB,2KACvB,cAAe,qGACf,WAAY,wKACZ,WAAY,qJACZ,cAAe,6HACf,cAAe,0GACf,aAAc,sEACd,UAAW,yRACX,UAAW,4EACX,aAAc,8KACd,eAAgB,4LAChB,SAAU,wEACV,SAAU,8LACV,QAAS,mDACT,UAAW,6HACX,OAAQ,yIACR,UAAW,wFACX,UAAW,+IACX,QAAS,oGACT,WAAY,mIACZ,cAAe,oLACf,eAAgB,yIAChB,aACE,icACF,WACE,6XACF,YAAa,6SACb,gBACE,sSACF,cAAe,2PACf,iBAAkB,yFAClB,cAAe,+NACf,gBACE,mPACF,mBAAoB,qGACpB,QAAS,wFACT,cAAe,mFACf,gBAAiB,2IACjB,SAAU,4JACV,MAAO,iFACT,EAEMC,GAAoB,CACxB,gBAAiB,iHACjB,iBAAkB,6HAClB,aAAc,gEACd,eAAgB,0PAChB,YAAa,kFACb,cAAe,qIACf,gBAAiB,2IACjB,aAAc,0KACd,cAAe,oDACf,sBAAuB,2FACvB,SAAU,uCACV,QAAS,2BACT,eAAgB,sEAChB,sBAAuB,0KACvB,cAAe,yFACf,WAAY,4JACZ,WAAY,sJACZ,cAAe,mIACf,cAAe,6HACf,aAAc,4EACd,UAAW,gQACX,UAAW,4EACX,aAAc,6HACd,eAAgB,wJAChB,SAAU,wEACV,SAAU,4KACV,QAAS,yDACT,UAAW,2GACX,OAAQ,kFACR,UAAW,wFACX,UAAW,2GACX,QAAS,kFACT,WAAY,uHACZ,cAAe,4JACf,eAAgB,yIAChB,aACE,oWACF,WAAY,6TACZ,YAAa,sQACb,gBACE,kUACF,cAAe,mSACf,iBAAkB,2GAClB,cAAe,gOACf,gBACE,mPACF,mBAAoB,iHACpB,QAAS,sEACT,cAAe,iHACf,gBAAiB,+NACjB,SAAU,gJACV,MAAO,+DACT,EAEMC,GAAoB,CACxB,gBAAiB,oDACjB,iBAAkB,gEAClB,aAAc,8CACd,eAAgB,yQAChB,YAAa,oDACb,cAAe,oFACf,gBAAiB,oFACjB,aAAc,oHACd,cAAe,kCACf,sBAAuB,+EACvB,SAAU,6CACV,QAAS,2BACT,eAAgB,0DAChB,sBAAuB,4IACvB,cAAe,qIACf,WAAY,kHACZ,WAAY,yFACZ,cAAe,yFACf,cAAe,gEACf,aAAc,gEACd,UAAW,yQACX,UAAW,yFACX,aAAc,yFACd,eAAgB,6IAChB,SAAU,kEACV,SAAU,iKACV,QAAS,0FACT,UAAW,mFACX,OAAQ,+FACR,UAAW,mHACX,UAAW,4GACX,QAAS,gEACT,WAAY,sGACZ,cAAe,4GACf,eAAgB,0DAChB,aACE,wZACF,WACE,kUACF,YAAa,qPACb,gBACE,iSACF,cAAe,0RACf,iBAAkB,4GAClB,cAAe,mMACf,gBACE,6NACF,mBAAoB,2GACpB,QAAS,8CACT,cAAe,uGACf,gBAAiB,wJACjB,SAAU,iJACV,MAAO,uCACT,EAEMC,GAAoB,CACxB,gBAAiB,oGACjB,iBAAkB,4HAClB,aAAc,oDACd,eAAgB,8SAChB,YAAa,8FACb,cAAe,sJACf,gBAAiB,gJACjB,aAAc,oNACd,cAAe,8CACf,sBAAuB,iGACvB,SAAU,mDACV,QAAS,iFACT,eAAgB,sEAChB,sBAAuB,8JACvB,cAAe,0GACf,WAAY,4HACZ,WAAY,kIACZ,cAAe,mFACf,cAAe,+FACf,aAAc,8FACd,UAAW,4UACX,UAAW,8FACX,aAAc,iKACd,eAAgB,2IAChB,SAAU,8EACV,SAAU,qMACV,QAAS,+DACT,UAAW,iHACX,OAAQ,oGACR,UAAW,+DACX,UAAW,8FACX,QAAS,wFACT,WAAY,gHACZ,cAAe,mIACf,eAAgB,8FAChB,aACE,mZACF,WACE,0XACF,YAAa,mUACb,gBAAiB,uQACjB,cAAe,iQACf,iBAAkB,0GAClB,cAAe,wNACf,gBACE,wPACF,mBAAoB,6HACpB,QAAS,sEACT,cAAe,kFACf,gBAAiB,yKACjB,SAAU,gJACV,MAAO,4CACT,EAEMC,GAAqB,CACzB,gBAAiB,6EACjB,iBAAkB,+FAClB,aAAc,sEACd,eAAgB,2PAChB,YAAa,uEACb,cAAe,+HACf,gBAAiB,yHACjB,aAAc,uLACd,cAAe,2DACf,sBAAuB,kGACvB,SAAU,uCACV,QAAS,2BACT,eAAgB,yFAChB,sBAAuB,uLACvB,cAAe,mHACf,WAAY,4GACZ,WAAY,wHACZ,cAAe,6EACf,cAAe,yFACf,aAAc,kFACd,UAAW,uQACX,UAAW,+FACX,aAAc,8HACd,eAAgB,gKAChB,SAAU,kEACV,SAAU,8KACV,QAAS,sEACT,UAAW,kHACX,OAAQ,uEACR,UAAW,sEACX,UAAW,yFACX,QAAS,mFACT,WAAY,mFACZ,cAAe,sGACf,eAAgB,yFAChB,aACE,6UACF,WAAY,wSACZ,YAAa,oOACb,gBACE,sSACF,cAAe,gSACf,iBAAkB,sGAClB,cACE,yOACF,gBACE,6PACF,mBAAoB,2GACpB,QAAS,uEACT,cAAe,gGACf,gBAAiB,kJACjB,SAAU,uJACV,MAAO,6CACT,EAEMC,GAAoB,CACxB,gBAAiB,sGACjB,iBAAkB,iHAClB,aAAc,qDACd,eAAgB,8SAChB,YAAa,0FACb,cAAe,oFACf,gBAAiB,gGACjB,aAAc,sIACd,cAAe,8CACf,sBAAuB,+EACvB,SAAU,iCACV,QAAS,2BACT,eAAgB,gEAChB,sBAAuB,uIACvB,cAAe,2FACf,WAAY,mHACZ,WAAY,gGACZ,cAAe,0FACf,cAAe,uEACf,aAAc,sEACd,UAAW,uSACX,UAAW,uGACX,aAAc,8HACd,eAAgB,2JAChB,SAAU,0EACV,SAAU,mKACV,QAAS,mFACT,UAAW,6GACX,OAAQ,iGACR,UAAW,0FACX,UAAW,oHACX,QAAS,oFACT,WAAY,oHACZ,cAAe,0HACf,eAAgB,+FAChB,aACE,4VACF,WACE,2UACF,YAAa,+NACb,gBACE,yRACF,cAAe,qQACf,iBAAkB,sGAClB,cAAe,wLACf,gBACE,4MACF,mBAAoB,kHACpB,QAAS,8CACT,cAAe,6GACf,gBAAiB,wJACjB,SAAU,4IACV,MAAO,6CACT,EAEMC,GAAoB,CACxB,gBAAiB,kIACjB,iBAAkB,0GAClB,aAAc,oGACd,eAAgB,wXAChB,YAAa,oGACb,cAAe,6HACf,gBAAiB,iHACjB,aAAc,4OACd,cAAe,sEACf,sBAAuB,iGACvB,SAAU,2BACV,QAAS,2BACT,eAAgB,gHAChB,sBAAuB,mMACvB,cAAe,yIACf,WAAY,qJACZ,WAAY,iKACZ,cAAe,sHACf,cAAe,kIACf,aAAc,0DACd,UAAW,0VACX,UAAW,4HACX,aAAc,2GACd,eAAgB,kJAChB,SAAU,0FACV,SAAU,uNACV,QAAS,iFACT,UAAW,0IACX,OAAQ,gEACR,UAAW,6FACX,UAAW,yFACX,QAAS,yFACT,WAAY,mIACZ,cAAe,iHACf,eAAgB,sHAChB,aACE,odACF,WACE,0aACF,YACE,sWACF,gBACE,sTACF,cAAe,8RACf,iBAAkB,iKAClB,cACE,gUACF,gBACE,kXACF,mBAAoB,uHACpB,QAAS,mDACT,cAAe,8IACf,gBAAiB,sMACjB,SAAU,yIACV,MAAO,0BACT,EAEMC,GAAoB,CACxB,gBAAiB,gHACjB,iBAAkB,0GAClB,aAAc,8FACd,eAAgB,wUAChB,YAAa,kFACb,cAAe,uHACf,gBAAiB,qGACjB,aAAc,4LACd,cAAe,gEACf,sBAAuB,iGACvB,SAAU,iCACV,QAAS,2BACT,eAAgB,4EAChB,sBAAuB,yJACvB,cAAe,6KACf,WAAY,iKACZ,WAAY,2JACZ,cAAe,wIACf,cAAe,kIACf,aAAc,sEACd,UAAW,4TACX,UAAW,8FACX,aAAc,2GACd,eAAgB,kJAChB,SAAU,wEACV,SAAU,0JACV,QAAS,+DACT,UAAW,+FACX,OAAQ,kFACR,UAAW,6FACX,UAAW,gHACX,QAAS,4EACT,WAAY,sHACZ,cAAe,qJACf,eAAgB,0GAChB,aACE,yYACF,WAAY,6SACZ,YAAa,mRACb,gBACE,yUACF,cAAe,qSACf,iBAAkB,wIAClB,cACE,mQACF,gBACE,sRACF,mBAAoB,mFACpB,QAAS,+DACT,cAAe,iHACf,gBAAiB,0NACjB,SAAU,sJACV,MAAO,kDACT,EAEMC,GAAoB,CACxB,gBAAiB,sGACjB,iBAAkB,2GAClB,aAAc,qDACd,eAAgB,0SAChB,YAAa,0FACb,cAAe,kHACf,gBAAiB,sGACjB,aAAc,kLACd,cAAe,iEACf,sBAAuB,kGACvB,SAAU,iCACV,QAAS,2BACT,eAAgB,mFAChB,sBAAuB,+JACvB,cAAe,uGACf,WAAY,mHACZ,WAAY,gGACZ,cAAe,0FACf,cAAe,uEACf,aAAc,gEACd,UAAW,mSACX,UAAW,8GACX,aAAc,wHACd,eAAgB,iKAChB,SAAU,sFACV,SAAU,qLACV,QAAS,oFACT,UAAW,yHACX,OAAQ,iGACR,UAAW,oFACX,UAAW,oHACX,QAAS,oFACT,WAAY,oHACZ,cAAe,oHACf,eAAgB,kHAChB,aACE,uWACF,WACE,0UACF,YAAa,gPACb,gBACE,mSACF,cAAe,sRACf,iBAAkB,yHAClB,cACE,8NACF,gBACE,kPACF,mBAAoB,kHACpB,QAAS,oDACT,cAAe,2FACf,gBAAiB,kJACjB,SAAU,2IACV,MAAO,6CACT,EAEMC,GAAoB,CACxB,gBAAiB,+FACjB,iBAAkB,qGAClB,aAAc,gEACd,eAAgB,8RAChB,YAAa,6EACb,cAAe,6GACf,gBAAiB,uGACjB,aAAc,kLACd,cAAe,2DACf,sBAAuB,kGACvB,SAAU,uCACV,QAAS,2BACT,eAAgB,6EAChB,sBAAuB,qKACvB,cAAe,6EACf,WAAY,8HACZ,WAAY,0IACZ,cAAe,mFACf,cAAe,+FACf,aAAc,sEACd,UAAW,8RACX,UAAW,+FACX,aAAc,kHACd,eAAgB,uGAChB,SAAU,kEACV,SAAU,4KACV,QAAS,6EACT,UAAW,iHACX,OAAQ,0DACR,UAAW,yFACX,UAAW,qGACX,QAAS,wFACT,WAAY,qGACZ,cAAe,kHACf,eAAgB,6HAChB,aACE,qWACF,WAAY,0TACZ,YAAa,8PACb,gBACE,6SACF,cAAe,oRACf,iBAAkB,qGAClB,cAAe,uOACf,gBACE,uQACF,mBAAoB,uHACpB,QAAS,6CACT,cAAe,oFACf,gBAAiB,8JACjB,SAAU,uJACV,MAAO,6CACT,EAEMC,GAAqB,CACzB,gBAAiB,0DACjB,iBAAkB,gEAClB,aAAc,sEACd,eAAgB,8RAChB,YAAa,sEACb,cAAe,iJACf,gBAAiB,iJACjB,aAAc,+JACd,cAAe,kCACf,sBAAuB,mEACvB,SAAU,iCACV,QAAS,2BACT,eAAgB,8CAChB,sBAAuB,wGACvB,cAAe,8HACf,WAAY,kHACZ,WAAY,2IACZ,cAAe,4EACf,cAAe,qGACf,aAAc,gEACd,UAAW,oSACX,UAAW,wFACX,aAAc,2GACd,eAAgB,6GAChB,SAAU,kEACV,SAAU,0JACV,QAAS,wFACT,UAAW,yFACX,OAAQ,gEACR,UAAW,iHACX,UAAW,qGACX,QAAS,sEACT,WAAY,qGACZ,cAAe,wHACf,eAAgB,8FAChB,aACE,8WACF,WAAY,iTACZ,YAAa,uOACb,gBAAiB,6OACjB,cAAe,oNACf,iBAAkB,iHAClB,cAAe,iOACf,gBACE,qPACF,mBAAoB,mIACpB,QAAS,gEACT,cAAe,kHACf,gBAAiB,2LACjB,SAAU,yFACV,MAAO,+DACT,EAEMC,GAAqB,CACzB,gBAAiB,oDACjB,iBAAkB,gEAClB,aAAc,8CACd,eAAgB,4PAChB,YAAa,oDACb,cAAe,oFACf,gBAAiB,oFACjB,aAAc,kJACd,cAAe,kCACf,sBAAuB,+EACvB,SAAU,6CACV,QAAS,2BACT,eAAgB,oDAChB,sBAAuB,0HACvB,cAAe,uGACf,WAAY,wHACZ,WAAY,qGACZ,cAAe,mFACf,cAAe,gEACf,aAAc,gEACd,UAAW,4PACX,UAAW,yFACX,aAAc,yFACd,eAAgB,8GAChB,SAAU,kEACV,SAAU,qJACV,QAAS,oFACT,UAAW,yFACX,OAAQ,mFACR,UAAW,6GACX,UAAW,sGACX,QAAS,gEACT,WAAY,4GACZ,cAAe,wHACf,eAAgB,uEAChB,aACE,6WACF,WACE,oVACF,YAAa,2PACb,gBACE,uSACF,cAAe,gSACf,iBAAkB,sGAClB,cAAe,qNACf,gBACE,yOACF,mBAAoB,qGACpB,QAAS,0DACT,cAAe,uGACf,gBAAiB,wJACjB,SAAU,iJACV,MAAO,uCACT,EAEaC,GAAgD,CAC3D,GAAAvB,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,IAAAC,GACA,IAAAC,GACA,GAAAC,GACA,WAAYC,GACZ,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,IAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,IAAAC,GACA,IAAAC,EACF,EAEME,GAAc,CAACC,EAAkBC,IACrCA,EACID,EAAS,QAAQ,aAAc,CAACE,EAAOC,IACrCA,KAASF,EAAO,OAAOA,EAAKE,CAAK,CAAC,EAAID,CACxC,EACAF,EAEOI,GACVC,GACD,CAACC,EAAgBL,IAA8B,CA9xCjD,IAAAM,EAAAC,EAgyCI,IAAMR,GAAWQ,IADHD,EAAAT,GAAeO,CAAQ,IAAvB,KAAAE,EAA4BhC,IACnB+B,CAAG,IAAT,KAAAE,EAAcjC,GAAG+B,CAAG,EACrC,OAAOP,GAAYC,EAAUC,CAAI,CACnC,EChyCF,IAAMQ,GAAO,CAACC,EAAcC,EAAeC,KAAwBC,IACjEC,EACE,MACA,CACE,MAAO,OAAOJ,CAAI,EAClB,OAAQ,OAAOA,CAAI,EACnB,QAAS,YACT,KAAM,OACN,OAAQC,EACR,eAAgB,OAAOC,CAAW,EAClC,iBAAkB,QAClB,kBAAmB,QACnB,cAAe,OACf,MAAO,CAAE,WAAY,CAAE,CACzB,EACA,GAAGC,CACL,EAEWE,GAAYJ,GACvBF,GACE,GACAE,EACA,EACAG,EAAI,OAAQ,CAAE,EAAG,IAAK,EAAG,KAAM,MAAO,KAAM,OAAQ,KAAM,GAAI,GAAI,CAAC,EACnEA,EAAI,OAAQ,CAAE,EAAG,0BAA2B,CAAC,CAC/C,EAEWE,GAAaL,GACxBF,GAAK,GAAIE,EAAO,IAAKG,EAAI,OAAQ,CAAE,EAAG,iBAAkB,CAAC,CAAC,EAE/CG,GAAaN,GACxBF,GAAK,GAAIE,EAAO,EAAGG,EAAI,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,GAAI,CAAC,EAAGA,EAAI,OAAQ,CAAE,EAAG,aAAc,CAAC,CAAC,EAExFI,GAAaP,GACxBF,GACE,GACAE,EACA,EACAG,EAAI,OAAQ,CACV,EAAG,uRACL,CAAC,CACH,EAEWK,GAAYR,GACvBF,GACE,GACAE,EACA,EACAG,EAAI,OAAQ,CAAE,EAAG,IAAK,EAAG,IAAK,MAAO,KAAM,OAAQ,KAAM,GAAI,GAAI,CAAC,EAClEA,EAAI,OAAQ,CAAE,EAAG,gBAAiB,CAAC,CACrC,EAEWM,GAAc,CAACC,EAAmBV,EAAQ,YACrDG,EACE,MACA,CACE,MAAO,IACP,OAAQ,KACR,QAAS,WACT,KAAM,OACN,OAAQH,EACR,eAAgB,IAChB,iBAAkB,QAClB,kBAAmB,QACnB,cAAe,OACf,MAAO,CACL,UAAWU,EAAW,gBAAkB,eACxC,WAAY,qBACd,CACF,EACAP,EAAI,OAAQ,CAAE,EAAG,eAAgB,CAAC,CACpC,EAEWQ,GAAeC,GAC1BA,EACId,GACE,GACA,eACA,EACAK,EAAI,OAAQ,CAAE,EAAG,IAAK,EAAG,IAAK,MAAO,IAAK,OAAQ,IAAK,CAAC,EACxDA,EAAI,OAAQ,CAAE,EAAG,KAAM,EAAG,IAAK,MAAO,IAAK,OAAQ,IAAK,CAAC,CAC3D,EACAL,GACE,GACA,eACA,EACAK,EAAI,UAAW,CAAE,OAAQ,mCAAoC,CAAC,EAC9DA,EAAI,OAAQ,CAAE,EAAG,6DAA8D,CAAC,CAClF,ECnFC,IAAMU,GAA6BC,GAG3BA,EAAQ,UAAYA,EAAQ,QAE9BC,GAA8BC,GACzCA,EAAQ,cAAc,KAAKH,EAAyB,EAEzCI,GACXC,GAEAA,IAAQ,aAAeA,IAAQ,MAAQA,EAAMC,GAElCC,GAAoB,CAC/BC,EACAC,IACsB,CACtB,IAAMC,EAA2B,CAAE,iBAAkB,CAAC,EAAG,qBAAsB,CAAC,CAAE,EAClF,OAAID,IAAS,MACJE,GAAsBH,EAAS,IAAKL,IAAa,CAAE,QAAAA,CAAQ,EAAE,EAAG,MAAOO,CAAK,GAGrFF,EAAS,QAASL,GAAY,CAC5B,IAAIS,EAAwB,GAC5BT,EAAQ,cAAc,QAASF,GAAY,CACzC,IAAMY,EAAgBJ,IAAS,aAAeT,GAA0BC,CAAO,EAC/ES,EAAM,qBAAqBI,GAAeX,EAAQ,KAAMF,EAAQ,IAAI,CAAC,EAAIY,EACzED,EAAwBA,GAAyBC,CACnD,CAAC,EACDH,EAAM,iBAAiBP,EAAQ,IAAI,EAAIS,CACzC,CAAC,EAEMF,EACT,EAEaK,GAAyB,CACpCZ,EACAa,IACsB,CACtB,IAAMC,EAAO,CAACD,EAAQ,iBAAiBb,EAAQ,IAAI,EAC7Ce,EAAuB,CAAE,GAAGF,EAAQ,oBAAqB,EAC/D,OAAAb,EAAQ,cAAc,QAASF,GAAY,CACzCiB,EAAqBJ,GAAeX,EAAQ,KAAMF,EAAQ,IAAI,CAAC,EAAIgB,GAAQhB,EAAQ,OACrF,CAAC,EACM,CACL,iBAAkB,CAAE,GAAGe,EAAQ,iBAAkB,CAACb,EAAQ,IAAI,EAAGc,CAAK,EACtE,qBAAAC,CACF,CACF,EAEaC,GAA6B,CACxChB,EACAiB,EACAJ,IACsB,CACtB,IAAMK,EAAMP,GAAeX,EAAQ,KAAMiB,CAAW,EAC9CF,EAAuB,CAC3B,GAAGF,EAAQ,qBACX,CAACK,CAAG,EAAG,CAACL,EAAQ,qBAAqBK,CAAG,CAC1C,EACMC,EAAYrB,GAChB,EAAQiB,EAAqBJ,GAAeX,EAAQ,KAAMF,EAAQ,IAAI,CAAC,EACnEsB,EAAWpB,EAAQ,cAAc,OAAOH,EAAyB,EACjEwB,EACJD,EAAS,OAAS,EACdA,EAAS,MAAMD,CAAQ,EACvBnB,EAAQ,cAAc,KAAMF,GAAYA,EAAQ,SAAWqB,EAASrB,CAAO,CAAC,EAClF,MAAO,CACL,iBAAkB,CAAE,GAAGe,EAAQ,iBAAkB,CAACb,EAAQ,IAAI,EAAGqB,CAAgB,EACjF,qBAAAN,CACF,CACF,EAEaO,GAAgC,CAC3CjB,EACAU,IAEAV,EAAS,MAAOL,GACdA,EAAQ,cACL,OAAOH,EAAyB,EAChC,MAAOC,GAAY,EAAQiB,EAAqBJ,GAAeX,EAAQ,KAAMF,EAAQ,IAAI,CAAC,CAAE,CACjG,EAEWyB,GAAmB,CAC9BlB,EACAC,EACAO,IAEAL,GAAsBH,EAAS,IAAKL,IAAa,CAAE,QAAAA,CAAQ,EAAE,EAAGM,EAAMO,CAAO,EAElEW,GAA8B,CACzCnB,EACAoB,IAEApB,EAAS,IAAKL,IAAa,CACzB,KAAMA,EAAQ,KACd,KAAMA,EAAQ,KACd,YAAaA,EAAQ,YACrB,SAAU,EAAQyB,EAAU,iBAAiBzB,EAAQ,IAAI,EACzD,cAAeA,EAAQ,cAAc,IAAKF,IAAa,CACrD,KAAMA,EAAQ,KACd,KAAMA,EAAQ,KACd,QAASA,EAAQ,UAAY,GAC7B,SAAUA,EAAQ,SAClB,SAAUD,GAA0BC,CAAO,EACvC,GACA,EAAQ2B,EAAU,qBAAqBd,GAAeX,EAAQ,KAAMF,EAAQ,IAAI,CAAC,CACvF,EAAE,CACJ,EAAE,EAES4B,GAAkBxB,GAC7BA,EAAI,QAAQ,MAAO,EAAE,EAAE,MAAM,EAAGyB,GAAgB,YAAY,EAEjDC,GAAiB,CAACC,EAAsBC,EAAgBC,IACnEF,IAAW,QACPG,GAAY,KAAKD,EAAM,KAAK,CAAC,EAC7BD,EAAO,QAAQ,MAAO,EAAE,EAAE,QAAUH,GAAgB,aAE7CM,GAAe,CAACJ,EAAsBC,EAAgBC,IACjEF,IAAW,QAAUE,EAAM,KAAK,EAAI,GAAGJ,GAAgB,QAAQ,GAAGG,CAAM,GAE7DI,GAAcL,GACzBA,IAAW,QAAUF,GAAgB,aAAeA,GAAgB,QAEzDQ,GAAiB,IAC5B,MAAM,KAAK,CAAE,OAAQR,GAAgB,SAAU,EAAG,IAAM,EAAE,EAE/CS,GAAiBC,GAC5BA,EAAO,KAAK,EAAE,EAAE,SAAWV,GAAgB,UAEhCW,GAAgB,CAC3BD,EACAE,EACArC,IACoD,CACpD,IAAMsC,EAAQtC,EAAI,QAAQ,MAAO,EAAE,EAAE,MAAM,EAAE,EACvCY,EAAO,CAAC,GAAGuB,CAAM,EACvBvB,EAAKyB,CAAK,EAAIC,EACd,IAAMC,EAAaD,GAASD,EAAQZ,GAAgB,UAAY,EAAIY,EAAQ,EAAI,KAChF,MAAO,CAAE,OAAQzB,EAAM,WAAA2B,CAAW,CACpC,EAEaC,GAAiBC,GAAkE,CAC9F,IAAMC,EAASD,EAAK,QAAQ,MAAO,EAAE,EAAE,MAAM,EAAGhB,GAAgB,SAAS,EACzE,OAAKiB,EACE,CACL,OAAQ,MAAM,KAAK,CAAE,OAAQjB,GAAgB,SAAU,EAAG,CAACkB,EAAGC,IAAG,CAzJrE,IAAAC,EAyJwE,OAAAA,EAAAH,EAAOE,CAAC,IAAR,KAAAC,EAAa,GAAE,EACnF,WAAY,KAAK,IAAIH,EAAO,OAAQjB,GAAgB,UAAY,CAAC,CACnE,EAJoB,IAKtB,EAEaqB,GAAsB,CAACX,EAA+BE,IACjE,CAACF,EAAOE,CAAK,GAAKA,EAAQ,EAAIA,EAAQ,EAAI,KAE/BU,GAAoBC,GAC3BA,aAAiBC,IAAYD,EAAM,SAAW,IAAY,cAC1DA,aAAiBC,IAAYD,EAAM,SAAW,IACzCA,EAAM,iBAAmB,aAAe,eAE1C,kBAGIE,GAA2BF,GACtCA,aAAiBC,KAAaD,EAAM,SAAW,KAAOA,EAAM,OAAS,4BAE1DG,GAAuB,CAClChD,EACAiD,EACAC,IACkB,CAClB,GAAI,CAACA,EAAW,OAAO,KACvB,IAAMC,EAAQnD,EAAS,KAAML,GAC3BA,EAAQ,cAAc,KACnBF,GACCA,EAAQ,UAAY,IAASyD,IAAc,gBAAgBvD,EAAQ,IAAI,IAAIF,EAAQ,IAAI,EAC3F,CACF,EACA,OAAO0D,GAASF,EAAkBE,EAAM,IAAI,EAAIA,EAAM,KAAO,IAC/D,ECvLA,IAAMC,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmERC,GAAwBC,GAA2B,CAC9D,GAAIA,EAAK,cAAc,IAAIC,EAAiB,EAAE,EAAG,OACjD,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,GAAKD,GACXC,EAAM,YAAcJ,GACpBE,EAAK,YAAYE,CAAK,CACxB,EAEaC,EAAiB,CAC5B,cAAe,CACb,QAAS,MACT,cAAe,MACjB,EACA,YAAa,CACX,QAAS,OACT,cAAe,SACf,IAAK,OACL,OAAQ,oBACR,aAAc,OACd,QAAS,OACT,gBAAiB,UACjB,UAAW,YACb,EACA,kBAAmB,CACjB,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,IAAK,KACP,EACA,iBAAkB,CAChB,QAAS,cACT,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,IACZ,MAAO,SACT,EACA,cAAe,CACb,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,IAAK,KACP,EACA,WAAY,CACV,QAAS,cACT,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,IACZ,MAAO,SACT,EACA,WAAY,CACV,QAAS,OACT,WAAY,SACZ,IAAK,MACL,OAAQ,oBACR,aAAc,MACd,QAAS,YACT,gBAAiB,UACjB,UAAW,YACb,EACA,YAAa,CACX,SAAU,OACV,MAAO,UACP,WAAY,GACd,EACA,WAAY,CACV,OAAQ,EACR,SAAU,OACV,MAAO,SACT,EACA,aAAc,CACZ,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,IAAK,MACL,SAAU,MACZ,EACA,YAAa,CACX,QAAS,cACT,WAAY,SACZ,IAAK,MACL,SAAU,OACV,MAAO,SACT,EACA,WAAY,CACV,OAAQ,EACR,SAAU,OACV,MAAO,SACT,EACA,YAAa,CACX,OAAQ,EACR,SAAU,OACV,MAAO,UACP,UAAW,QACb,EACA,OAAQ,CACN,QAAS,OACT,eAAgB,SAChB,IAAK,KACP,EACA,WAAY,CACV,OAAQ,EACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,IAAK,MACL,SAAU,OACV,MAAO,SACT,EACA,WAAY,CACV,OAAQ,EACR,SAAU,OACV,WAAY,IACZ,MAAO,SACT,EACA,UAAW,CACT,OAAQ,EACR,SAAU,OACV,MAAO,SACT,EACA,cAAe,CACb,YAAa,MACf,EACA,UAAW,CACT,MAAO,MACT,EACA,YAAa,CACX,MAAO,MACT,CACF,ECxLA,IAAMC,GAAY,CAACC,EAA0BC,EAAYC,KAAkB,CACzE,GAAAD,EACA,KAAAC,EACA,OAAQ,SACR,IAAK,sBACL,MAAO,CAAE,GAAGF,EAAI,OAAO,KAAM,MAAOA,EAAI,SAAU,CACpD,GAEMG,GAAaH,IAA8B,CAC/C,GAAGA,EAAI,OAAO,YACd,GAAGA,EAAI,WAAW,WACpB,GAEaI,GAAoBJ,GAA0C,CACzE,GAAM,CAAE,QAAAK,EAAS,EAAAC,EAAG,GAAAC,CAAG,EAAIP,EACrBQ,EAAaF,EACjB,6BACAD,EAAQ,4BAA8B,gBACxC,EACMI,EAAOC,EACX,IACA,CACE,GAAGX,GAAUC,EAAK,sBAAuBK,EAAQ,oBAAsB,GAAG,EAC1E,aAAc,GAAGG,CAAU,KAAKD,EAAG,eAAe,CAAC,GACrD,EACAC,CACF,EAEMG,EAAuBC,GAA2BP,EAAQ,SAAUL,EAAI,kBAAkB,EAChG,OAAOU,EACL,IACA,CAAE,GAAGG,EAAK,aAAa,EAAG,MAAOV,GAAUH,CAAG,CAAE,EAChDU,EAAG,OAAQ,CAAE,GAAI,qBAAsB,EAAGJ,EAAE,cAAeD,EAAQ,WAAW,CAAC,EAC/EM,GAAwBD,EAAG,IAAI,EAC/BC,GACED,EACE,OACA,KACAA,EACE,OACA,CAAE,GAAI,qBAAsB,EAC5BJ,EAAE,6BAA8BD,EAAQ,4BAA8B,EAAE,CAC1E,EACA,IACAI,CACF,CACJ,CACF,EAEaK,GAAwBd,GACnCU,EACE,KACA,CACE,GAAI,0BACJ,MAAO,CAAE,GAAGV,EAAI,OAAO,SAAU,GAAGA,EAAI,WAAW,QAAS,CAC9D,EACAA,EAAI,EACF,0BACAA,EAAI,QAAQ,yBAA2Be,EACzC,CACF,EAEIC,GAAgB,CACpBhB,EACAiB,EACAC,IACgB,CAChB,GAAM,CAAE,MAAAC,EAAO,EAAAb,EAAG,GAAAC,EAAI,SAAAa,EAAU,OAAAC,EAAQ,WAAAC,CAAW,EAAItB,EACjDuB,EAAa,CAACJ,EAAM,kBAAkBF,EAAQ,IAAI,EAClDO,EAAOlB,EAAE,gBAAiBW,EAAQ,KAAMA,EAAQ,IAAI,EACpDQ,EAAcnB,EAAE,uBAAwBW,EAAQ,YAAaA,EAAQ,IAAI,EACzES,EAAeT,EAAQ,cAAc,OAAQU,GAAYA,EAAQ,UAAY,EAAK,EAClFC,EAAc,GAAGC,EAAa,sBAAsB,GAAGZ,EAAQ,IAAI,GAEnEa,EAAQpB,EAAG,KAAM,CACrB,GAAI,gBAAgBO,EAAQ,IAAI,GAChC,GAAGJ,EAAK,eAAe,EACvB,MAAO,CAAE,GAAGQ,EAAO,YAAa,GAAGC,EAAW,WAAY,CAC5D,CAAC,EACDQ,EAAM,YAAcN,EAChBO,GAA2Bd,CAAO,GACpCa,EAAM,YAAYE,GAAqBzB,EAAG,UAAU,CAAC,CAAC,EAGxD,IAAM0B,EAAgBvB,EAAG,MAAO,CAAE,MAAOW,EAAO,mBAAoB,EAAGS,CAAK,EACxEL,GACFQ,EAAc,YACZvB,EACE,KACA,CACE,GAAI,uBAAuBO,EAAQ,IAAI,GACvC,MAAO,CAAE,GAAGI,EAAO,kBAAmB,GAAGC,EAAW,iBAAkB,CACxE,EACAG,CACF,CACF,EAGF,IAAMS,EAAWxB,EACf,MACA,CACE,MAAOW,EAAO,WACd,KAAM,SACN,SAAU,IACV,gBAAiB,OAAOE,CAAU,EAClC,gBAAiBK,EACjB,aAAcL,EAAahB,EAAG,kBAAmB,CAAE,KAAAiB,CAAK,CAAC,EAAIjB,EAAG,gBAAiB,CAAE,KAAAiB,CAAK,CAAC,EACzF,CAACW,EAAmB,EAAGC,GAAW,SAASnB,EAAQ,IAAI,EACvD,QAAS,IAAMG,EAAS,kBAAkBH,EAAQ,IAAI,EACtD,UAAYoB,GAAyB,EAC/BA,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACzCA,EAAM,eAAe,EACrBjB,EAAS,kBAAkBH,EAAQ,IAAI,EAE3C,CACF,EACAP,EACE,MACA,CAAE,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,WAAY,KAAM,CAAE,EAChG4B,GAAYf,EAAYvB,EAAI,KAAK,YAAY,CAC/C,EACAiC,CACF,EAEMM,EAAW7B,EAAG,QAAS,CAC3B,UAAW,yBACX,KAAM,WACN,QAAS,EAAQS,EAAM,iBAAiBF,EAAQ,IAAI,EACpD,SAAUC,EACV,aAAcX,EAAG,eAAgB,CAAE,KAAAiB,CAAK,CAAC,EACzC,CAACW,EAAmB,EAAGC,GAAW,QAAQnB,EAAQ,IAAI,EACtD,SAAU,IAAMG,EAAS,gBAAgBH,EAAQ,IAAI,CACvD,CAAC,EAEKuB,EAAoB9B,EAAG,MAAO,CAClC,GAAIkB,EACJ,MAAO,CACL,GAAGP,EAAO,sBACV,QAASE,GAAcG,EAAa,OAAS,EAAI,OAAS,MAC5D,CACF,CAAC,EACD,QAAWC,KAAWD,EAAc,CAClC,IAAMe,EAAcnC,EAAE,qBAAsBqB,EAAQ,KAAMA,EAAQ,IAAI,EAChEe,EAAQhC,EAAG,OAAQ,CACvB,GAAI,gBAAgBO,EAAQ,IAAI,IAAIU,EAAQ,IAAI,GAChD,MAAO,CAAE,GAAGN,EAAO,gBAAiB,GAAGC,EAAW,eAAgB,CACpE,CAAC,EACDoB,EAAM,YAAcD,EAChBE,GAA0BhB,CAAO,GACnCe,EAAM,YAAYV,GAAqBzB,EAAG,UAAU,CAAC,CAAC,EAExD,IAAMqC,EAAkBlC,EAAG,QAAS,CAClC,UAAW,yBACX,KAAM,WACN,QAAS,EAAQS,EAAM,qBAAqB0B,GAAe5B,EAAQ,KAAMU,EAAQ,IAAI,CAAC,EACtF,SAAUT,EACV,aAAcS,EAAQ,SAClBpB,EAAG,wBAAyB,CAAE,KAAMkC,CAAY,CAAC,EACjDlC,EAAG,gBAAiB,CAAE,KAAMkC,CAAY,CAAC,EAC7C,CAACN,EAAmB,EAAGC,GAAW,QAAQnB,EAAQ,KAAMU,EAAQ,IAAI,EACpE,SAAU,IAAMP,EAAS,oBAAoBH,EAAQ,KAAMU,EAAQ,IAAI,CACzE,CAAC,EACDa,EAAkB,YAChB9B,EAAG,MAAO,CAAE,GAAGG,EAAK,cAAc,EAAG,MAAOQ,EAAO,eAAgB,EAAGqB,EAAOE,CAAe,CAC9F,CACF,CAEA,OAAOlC,EACL,MACA,KACAA,EAAG,MAAO,CAAE,GAAGG,EAAK,SAAS,EAAG,MAAOQ,EAAO,UAAW,EAAGa,EAAUK,CAAQ,EAC9EC,CACF,CACF,EAEaM,GAAiB,CAAC9C,EAA0BkB,IAAiC,CACxF,IAAM6B,EAAYrC,EAAG,MAAO,CAC1B,GAAGG,EAAK,UAAU,EAClB,MAAO,CAAE,GAAGb,EAAI,OAAO,iBAAkB,GAAIkB,EAAS8B,EAAe,cAAgB,CAAC,CAAG,EACzF,gBAAiB9B,EAAS,OAAS,IACrC,CAAC,EAED,QAAWD,KAAWjB,EAAI,kBACxB+C,EAAU,YAAY/B,GAAchB,EAAKiB,EAASC,CAAM,CAAC,EAE3D,OAAO6B,CACT,EAEaE,GAAmBjD,GAAiD,CAC/E,GAAM,CAAE,QAAAK,EAAS,EAAAC,EAAG,KAAA4C,EAAM,OAAA7B,EAAQ,WAAAC,EAAY,mBAAA6B,CAAmB,EAAInD,EAC/DoD,EAAM/C,EAAQ,SAGdgD,EAAuB,GAAQhD,EAAQ,oBAAsBA,EAAQ,iBAC3E,GAAI,CAACgD,GAAwB,CAACD,GAAOD,EAAmB,SAAW,EAAG,OAAO,KAE7E,IAAMG,EAAY5C,EAAG,IAAK,CAAE,MAAO,CAAE,OAAQ,EAAG,QAAS,KAAM,CAAE,CAAC,EAC5D6C,EAAY,CAAE,GAAGlC,EAAO,KAAM,MAAOrB,EAAI,SAAU,EAsCzD,GApCIqD,IACFC,EAAU,YACR5C,EACE,OACA,CAAE,GAAI,iBAAkB,EACxBJ,EAAE,kBAAmBD,EAAQ,iBAAmB,uCAAuC,CACzF,CACF,EACIA,EAAQ,qBACViD,EAAU,YAAY,SAAS,eAAe,GAAG,CAAC,EAClDA,EAAU,YACR5C,EACE,IACAX,GAAUC,EAAK,sBAAuBK,EAAQ,kBAAkB,EAChEC,EAAE,6BAA8BD,EAAQ,4BAA8B,gBAAgB,CACxF,CACF,EACAiD,EAAU,YAAY,SAAS,eAAe,GAAG,CAAC,IAIlDH,EAAmB,OAAS,IAC1BE,GAAsBC,EAAU,YAAY5C,EAAG,IAAI,CAAC,EAExD4C,EAAU,YACRE,GAAwB,CACtB,MAAOlD,EAAE,iCAAkCmD,EAAsB,EACjE,MAAON,EAAmB,IAAK1C,IAAU,CACvC,GAAGA,EACH,KAAMH,EAAE,gBAAiBG,EAAK,KAAMA,EAAK,IAAI,CAC/C,EAAE,EACF,UAAA8C,CACF,CAAC,CACH,GAGEH,EAAK,EACHC,GAAwBF,EAAmB,OAAS,IAAGG,EAAU,YAAY5C,EAAG,IAAI,CAAC,EACzF4C,EAAU,YACR5C,EAAG,OAAQ,CAAE,GAAI,oBAAqB,EAAGwC,EAAK,iBAAkBE,EAAI,cAAc,CAAC,CACrF,EACAE,EAAU,YAAY,SAAS,eAAe,GAAG,CAAC,EAC9CF,EAAI,eACNE,EAAU,YACR5C,EACE,IACAX,GAAUC,EAAK,qBAAsBoD,EAAI,aAAa,EACtDF,EAAK,wBAAyBE,EAAI,uBAAyB,YAAY,CACzE,CACF,EAEFE,EAAU,YAAY,SAAS,eAAe,GAAG,CAAC,EAC9CF,EAAI,kBACNE,EAAU,YACR5C,EACE,OACA,CAAE,GAAI,+BAAgC,EACtCwC,EAAK,iCAAkCE,EAAI,gCAAkC,aAAa,CAC5F,CACF,EACAE,EAAU,YAAY,SAAS,eAAe,GAAG,CAAC,EAClDA,EAAU,YACR5C,EACE,IACA,CACE,GAAI,sBACJ,KAAM,UAAU0C,EAAI,eAAe,GACnC,MAAOG,CACT,EACAH,EAAI,eACN,CACF,GAEFE,EAAU,YAAY5C,EAAG,IAAI,CAAC,EAC9B4C,EAAU,YACR5C,EAAG,OAAQ,CAAE,GAAI,mBAAoB,EAAGwC,EAAK,gBAAiBE,EAAI,aAAa,CAAC,CAClF,EACAE,EAAU,YAAY,SAAS,eAAe,GAAG,CAAC,EAC9CF,EAAI,cACNE,EAAU,YACR5C,EACE,IACAX,GAAUC,EAAK,oBAAqBoD,EAAI,YAAY,EACpDF,EAAK,uBAAwBE,EAAI,sBAAwB,YAAY,CACvE,CACF,EAEFE,EAAU,YAAY5C,EAAG,IAAI,CAAC,EAC9B4C,EAAU,YAAY5C,EAAG,OAAQ,CAAE,GAAI,cAAe,EAAGwC,EAAK,WAAYE,EAAI,QAAQ,CAAC,CAAC,EACxFE,EAAU,YAAY,SAAS,eAAe,GAAG,CAAC,EAClD,IAAMI,EAAYR,EAAK,kBAAmBE,EAAI,iBAAmB,YAAY,EACzEA,EAAI,UACNE,EAAU,YACR5C,EACE,IACA,CACE,GAAI,eACJ,KAAM,UAAU0C,EAAI,SAAS,GAC7B,MAAOG,CACT,EACAG,CACF,CACF,EACSN,EAAI,SACbE,EAAU,YAAY5C,EAAG,IAAKX,GAAUC,EAAK,eAAgBoD,EAAI,OAAO,EAAGM,CAAS,CAAC,CAEzF,CAEA,OAAOhD,EACL,MACA,CACE,GAAGG,EAAK,KAAK,EACb,MAAO,CACL,GAAGQ,EAAO,YACV,GAAGC,EAAW,YACd,SAAUA,EAAW,QAAQ,SAC7B,WAAY,MACZ,UAAW,qCACX,WAAY,OACZ,UAAW,MACb,CACF,EACAgC,CACF,CACF,EClVO,IAAMK,GAAY,CAACC,EAAaC,IAAiC,CACtE,GAAI,OAAOD,GAAQ,UAAYA,EAAI,CAAC,IAAM,IAAK,OAAO,KACtD,IAAIE,EAAIF,EAAI,MAAM,CAAC,EAOnB,GANIE,EAAE,SAAW,IACfA,EAAIA,EACD,MAAM,EAAE,EACR,IAAKC,GAAMA,EAAIA,CAAC,EAChB,KAAK,EAAE,GAERD,EAAE,SAAW,GAAK,eAAe,KAAKA,CAAC,EAAG,OAAO,KACrD,IAAM,EAAI,SAASA,EAAG,EAAE,EACxB,MAAO,QAAS,GAAK,GAAM,GAAG,KAAM,GAAK,EAAK,GAAG,KAAK,EAAI,GAAG,KAAKD,CAAK,GACzE,EAEaG,GAAqBC,GAChCA,IAAS,WAAaA,IAAS,MAAQA,IAAS,KAErCC,GAAqBD,GAChC,CAACA,GAAQD,GAAkBC,CAAI,EAAI,UAAYA,EAEpCE,GAAqB,CAChCC,EACAC,IACa,CACb,IAAMC,EAAS,CAAC,SAAS,EACnBC,EAAaL,GAAkBE,CAAe,EAChDG,IAAe,WAAWD,EAAO,KAAKC,CAAU,EACpD,IAAMC,EAAO,OAAO,KAAKH,GAAgB,CAAC,CAAC,EACxC,OAAQJ,GAAS,CAACK,EAAO,SAASL,CAAI,CAAC,EACvC,KAAK,CAACQ,EAAGC,IAAMD,EAAE,cAAcC,EAAG,IAAI,CAAC,EAC1C,MAAO,CAAC,GAAGJ,EAAQ,GAAGE,CAAI,CAC5B,ECfA,IAAMG,GAAwB,UAkCxBC,GAAiBC,IAA8C,CACnE,MAAO,CAAE,SAAUA,EAAW,OAAS,MAAO,EAC9C,SAAU,CAAE,SAAUA,EAAW,OAAS,MAAO,EACjD,YAAa,CAAE,SAAUA,EAAW,OAAS,MAAO,EACpD,kBAAmB,CAAE,SAAUA,EAAW,OAAS,MAAO,EAC1D,gBAAiB,CAAE,SAAUA,EAAW,OAAS,MAAO,EACxD,YAAa,CAAE,SAAUA,EAAW,OAAS,MAAO,EACpD,QAAS,CAAE,SAAUA,EAAW,OAAS,MAAO,EAChD,SAAU,CACR,SAAUA,EAAW,OAAS,OAC9B,QAASA,EAAW,UAAY,SAClC,EACA,KAAM,CACJ,SAAUA,EAAW,OAAS,QAC9B,UAAWA,EAAW,OAAS,MACjC,EACA,aAAc,CACZ,SAAUA,EAAW,OAAS,OAC9B,QAASA,EAAW,WAAa,UACnC,EACA,OAAQ,CACN,SAAUA,EAAW,OAAS,OAC9B,QAASA,EAAW,YAAc,UACpC,CACF,GAEaC,GAAoB,CAAC,CAChC,SAAAC,EACA,QAAAC,EACA,SAAAC,EACA,YAAAC,EACA,SAAAL,CACF,IAAuC,CAlFvC,IAAAM,EAAAC,EAAAC,EAmFE,IAAMC,EAAaC,GAAkBP,EAAQ,WAAYC,EAAUC,CAAW,EACxE,CAAE,OAAAM,CAAO,EAAIF,EACbG,EACJD,EAAO,eAAiBR,EAAQ,eAAiBU,GAC7CC,EAAQC,GAAYN,EAAW,KAAK,EACpCO,EAASC,GAAgBR,CAAU,EACnCS,EAASC,GACbC,GACEC,GAAkBH,EAA+B,CAC/C,MAAO,CAAE,aAAcT,EAAW,QAAUK,EAAM,KAAM,EACxD,OAAQ,CAAE,aAAcL,EAAW,QAAUK,EAAM,MAAO,CAC5D,CAAC,EACDL,EAAW,MACXE,EACAC,CACF,EACAI,CACF,EAEA,MAAO,CACL,WAAAP,EACA,OAAAS,EACA,WAAYC,GAAepB,GAAcC,CAAQ,EAAGgB,CAAM,EAC1D,aAAAJ,EACA,UAAWD,EAAO,MAAQR,EAAQ,iBAAmBU,GACrD,WAAYS,GAAUV,EAAc,GAAI,GAAK,UAC7C,WAAYU,GAAUV,EAAc,GAAI,GAAK,2BAC7C,cAAcN,EAAAK,EAAO,UAAP,KAAAL,EAAkBR,GAChC,aAAcyB,GAAoBpB,EAAQ,aAAa,EACvD,UAAW,CACT,gBAAiBS,EACjB,GAAID,EAAO,gBAAkB,CAAE,MAAOA,EAAO,eAAgB,EAAI,CAAC,CACpE,EACA,eAAgB,CACd,GAAIA,EAAO,UAAY,CAAE,gBAAiBA,EAAO,SAAU,EAAI,CAAC,EAChE,OAAOJ,EAAAI,EAAO,cAAP,KAAAJ,EAAsBK,EAC7B,aAAaJ,EAAAG,EAAO,cAAP,KAAAH,EAAsBI,CACrC,EACA,QAAS,CACP,GAAID,EAAO,WAAa,CAAE,gBAAiBA,EAAO,UAAW,EAAI,CAAC,EAClE,GAAIA,EAAO,aAAe,CAAE,MAAOA,EAAO,YAAa,EAAI,CAAC,EAC5D,GAAIA,EAAO,eAAiB,CAAE,YAAaA,EAAO,cAAe,EAAI,CAAC,CACxE,EAEA,eAAgB,CACd,CAACa,EAAmB,EAAGtB,EACvB,CAACuB,EAA0B,EAAG,GAC9B,GAAGC,EAAK,MAAM,EACd,GAAGC,GAAuBhB,CAAM,CAClC,EACA,cAAe,CACb,cAAeC,EACf,mBAAoBU,GAAUV,EAAc,GAAI,GAAK,2BACrD,GAAGgB,GAAuBjB,CAAM,CAClC,CACF,CACF,EC3HA,IAAMkB,GAAsBC,GAA0C,CACpE,GAAM,CAAE,MAAAC,EAAO,SAAAC,CAAS,EAAIF,EACtBG,EAASF,EAAM,SAAWA,EAAM,aACtC,OAAIA,EAAM,eAAiB,SAClBG,EACL,MACA,CAAE,UAAW,+BAAgC,MAAOC,EAAe,UAAW,EAC9ED,EAAG,OAAQ,CAAE,MAAOC,EAAe,WAAY,EAAGC,GAAgB,QAAQ,EAC1EF,EAAG,QAAS,CACV,GAAIG,EAAa,YACjB,KAAM,MACN,UAAW,UACX,aAAc,eACd,UAAW,+BACX,YAAa,cACb,MAAON,EAAM,OACb,SAAUE,EACV,QAAUK,GAAiBN,EAAS,cAAeM,EAAM,OAA4B,KAAK,CAC5F,CAAC,CACH,EAEKJ,EACL,MACA,CAAE,UAAW,+BAAgC,MAAOC,EAAe,UAAW,EAC9ED,EAAG,QAAS,CACV,GAAIG,EAAa,WACjB,KAAM,QACN,UAAW,QACX,aAAc,QACd,UAAW,+BACX,YAAa,kBACb,MAAON,EAAM,MACb,SAAUE,EACV,QAAUK,GAAiBN,EAAS,aAAcM,EAAM,OAA4B,KAAK,CAC3F,CAAC,CACH,CACF,EAEaC,GAAc,CAACT,EAA0BU,EAAeC,KAAmB,CACtF,YAAaD,EAAQV,EAAI,aAAe,GACxC,gBAAiBU,EAAQV,EAAI,WAAa,GAC1C,WAAYW,IAAU,EAAI,MAAQ,EACpC,GAEaC,GAAgBZ,GAA0C,CACrE,GAAM,CAAE,MAAAC,EAAO,GAAAY,EAAI,SAAAX,EAAU,aAAAY,CAAa,EAAId,EAC9C,OAAIC,EAAM,gBAAkB,EACnBG,EACL,IACA,CAAE,GAAIG,EAAa,OAAQ,MAAOF,EAAe,UAAW,EAC5DU,GAAU,SAAS,EACnBF,EAAG,WAAY,CAAE,QAASZ,EAAM,eAAgB,CAAC,CACnD,EAEKG,EACL,IACA,CAAE,GAAIG,EAAa,OAAQ,MAAOF,EAAe,UAAW,EAC5DD,EACE,SACA,CACE,KAAM,SACN,UAAW,wBACX,MAAO,CAAE,MAAOU,CAAa,EAC7B,SAAUb,EAAM,aAChB,CAACe,EAAmB,EAAGC,GAAW,OAClC,QAAS,IAAMf,EAAS,SAAS,CACnC,EACAD,EAAM,aAAeY,EAAG,SAAS,EAAIA,EAAG,WAAW,CACrD,CACF,CACF,EAEMK,GAAkBlB,GAA0C,CAChE,GAAM,CAAE,MAAAC,EAAO,GAAAY,EAAI,SAAAX,CAAS,EAAIF,EAC1BmB,EAAQlB,EAAM,UAAU,IAAI,CAACS,EAAOC,IACxCP,EAAG,QAAS,CACV,GAAI,GAAGG,EAAa,cAAc,GAAGI,CAAK,GAC1C,KAAM,OACN,UAAW,UACX,aAAc,gBACd,UAAW,IACX,UAAW,6BAA6BV,EAAM,SAAW,8BAAgC,EAAE,GAC3F,MAAOQ,GAAYT,EAAKU,EAAOC,CAAK,EACpC,MAAOD,EACP,SAAUT,EAAM,YAChB,aAAcY,EAAG,WAAY,CAAE,MAAOF,EAAQ,CAAE,CAAC,EACjD,QAAUH,GAAiBN,EAAS,WAAWS,EAAQH,EAAM,OAA4B,KAAK,EAC9F,UAAYA,GAAyBN,EAAS,aAAaS,EAAOH,CAAK,EACvE,QAAUA,GAA0BN,EAAS,WAAWM,CAAK,CAC/D,CAAC,CACH,EAEA,OAAOJ,EACL,MACA,CAAE,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,MAAO,CAAE,EACnEA,EACE,IACA,CAAE,MAAOC,EAAe,WAAY,EACpCQ,EAAG,iBAAkB,CAAE,MAAOP,GAAgB,SAAU,CAAC,CAC3D,EACAF,EAAG,MAAO,CAAE,MAAOC,EAAe,MAAO,EAAG,GAAGc,CAAK,EACpDlB,EAAM,SAAWG,EAAG,IAAK,CAAE,KAAM,QAAS,MAAOC,EAAe,UAAW,EAAGJ,EAAM,QAAQ,EAAI,KAChGW,GAAaZ,CAAG,CAClB,CACF,EAEaoB,GAAqBpB,GAA0C,CAC1E,GAAM,CAAE,MAAAC,EAAO,GAAAY,EAAI,SAAAX,EAAU,aAAAY,CAAa,EAAId,EACxCqB,EAAUpB,EAAM,eAAiB,QACjCqB,EAAcrB,EAAM,aAAeA,EAAM,aAEzCsB,EAAWnB,EACf,MACA,CAAE,MAAOC,EAAe,aAAc,EACtCD,EACE,QACA,CAAE,IAAKiB,EAAUd,EAAa,WAAaA,EAAa,YAAa,MAAOF,EAAe,UAAW,EACtGgB,EAAUG,GAAS,SAAS,EAAIC,GAAU,SAAS,EACzCZ,EAAVQ,EAAa,eAAqB,cAAP,CAC7B,EACApB,EAAM,QACF,KACAG,EACE,SACA,CACE,KAAM,SACN,UAAW,wBACX,MAAO,CAAE,MAAOU,CAAa,EAC7B,SAAUb,EAAM,aAChB,CAACe,EAAmB,EAAGC,GAAW,aAClC,QAAS,IAAMf,EAAS,eAAe,CACzC,EACAmB,EAAUI,GAAUX,CAAY,EAAIU,GAASV,CAAY,EAC/CD,EAAVQ,EAAa,mBAAyB,iBAAP,CACjC,CACN,EAEMK,EAASzB,EAAM,QACjBG,EACE,MACA,CAAE,MAAOC,EAAe,YAAa,EACrCD,EACE,OACA,CAAE,MAAOC,EAAe,WAAY,EACpCsB,GAAU,SAAS,EACnB,GAAGd,EAAG,WAAW,CAAC,IAAIQ,EAAUpB,EAAM,MAAQ,GAAGK,GAAgB,QAAQ,IAAIL,EAAM,MAAM,EAAE,EAC7F,EACAG,EACE,SACA,CACE,KAAM,SACN,UAAW,wBACX,MAAO,CAAE,MAAOU,CAAa,EAC7B,SAAUQ,EACV,CAACN,EAAmB,EAAGC,GAAW,cAClC,QAAS,IAAMf,EAAS,gBAAgB,CAC1C,EACUW,EAAVQ,EAAa,cAAoB,cAAP,CAC5B,CACF,EACAjB,EAAG,IAAK,CAAE,MAAOC,EAAe,UAAW,EAAaQ,EAAVQ,EAAa,iBAAuB,WAAP,CAAmB,EAElG,OAAOjB,EACL,MACA,CACE,GAAIG,EAAa,YACjB,UAAW,0BACX,MAAOF,EAAe,WACxB,EACAD,EACE,MACA,CAAE,MAAOC,EAAe,iBAAkB,EAC1CD,EAAG,OAAQ,CAAE,MAAOC,EAAe,gBAAiB,EAAGuB,GAASd,CAAY,EAAGD,EAAG,eAAe,CAAC,EAClGT,EACE,SACA,CACE,KAAM,SACN,UAAW,wBACX,MAAO,CAAE,MAAOU,CAAa,EAC7B,SAAUQ,EACV,CAACN,EAAmB,EAAGC,GAAW,eAClC,QAAS,IAAMf,EAAS,iBAAiB,CAC3C,EACAW,EAAG,gBAAgB,CACrB,CACF,EACAT,EACE,MACA,CAAE,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,MAAO,CAAE,EACnEmB,EACAxB,GAAmBC,CAAG,EACtB0B,EACAzB,EAAM,YACFG,EAAG,IAAK,CAAE,KAAM,QAAS,MAAOC,EAAe,UAAW,EAAGJ,EAAM,WAAW,EAC9E,KACJA,EAAM,QAAUiB,GAAelB,CAAG,EAAI,IACxC,CACF,CACF,EAEa6B,GAAiB7B,GAAoD,CAChF,GAAM,CAAE,MAAAC,EAAO,QAAA6B,EAAS,EAAAC,EAAG,GAAAlB,EAAI,SAAAX,CAAS,EAAIF,EAC5C,OAAIC,EAAM,OAAS,UAAY,CAACA,EAAM,QAC7B,CACL,MAAOA,EAAM,aAAeY,EAAG,SAAS,EAAIA,EAAG,SAAS,EACxD,SAAU,CAACmB,GAAe/B,EAAM,aAAcA,EAAM,OAAQA,EAAM,KAAK,GAAKA,EAAM,aAClF,OAAQC,EAAS,QACnB,EAEED,EAAM,OAAS,SACV,CACL,MAAOA,EAAM,YAAcY,EAAG,WAAW,EAAIA,EAAG,YAAY,EAC5D,SAAU,CAACoB,GAAchC,EAAM,SAAS,GAAKA,EAAM,YACnD,OAAQC,EAAS,YACnB,EAEK,CACL,MAAO6B,EAAE,sBAAuBD,EAAQ,qBAAuBI,EAAmC,EAClG,SAAU,CAACC,GAA8BnC,EAAI,kBAAmBC,EAAM,oBAAoB,EAC1F,OAAQC,EAAS,gBACnB,CACF,EAEakC,GAAgBpC,GAA0C,CACrE,GAAM,CAAE,MAAAC,EAAO,QAAA6B,EAAS,EAAAC,EAAG,SAAA7B,EAAU,SAAAmC,EAAU,aAAAvB,EAAc,OAAAwB,EAAQ,KAAAC,CAAK,EAAIvC,EACxEwC,EAAWvC,EAAM,OAAS,SAC1BwC,EAAa,CAAE,GAAGH,EAAO,OAAQ,GAAGtC,EAAI,WAAW,MAAO,EAC1D0C,EAAQL,EAAWhC,EAAe,YAAcA,EAAe,UAC/DsC,EAAed,GAAc7B,CAAG,EAEhC4C,EAAUxC,EACd,SACA,CACE,KAAM,SACN,GAAIyC,GACJ,GAAIL,EAAW,CAAC,EAAIM,EAAK,iBAAiB,EAC1C,UAAW,+BACX,MAAON,EACH,CAAE,GAAGC,EAAY,GAAGH,EAAO,aAAc,gBAAiBxB,CAAa,EACvE,CAAE,GAAG2B,EAAY,GAAGH,EAAO,aAAc,GAAGI,EAAO,GAAGH,EAAK,cAAe,EAC9E,SAAUI,EAAa,SACvB,CAAC3B,EAAmB,EAAGC,GAAW,QAClC,QAAS,IAAM0B,EAAa,OAAO,CACrC,EACAA,EAAa,KACf,EAEMI,EAAU3C,EACd,SACA,CACE,KAAM,SACN,GAAI4C,GACJ,GAAGF,EAAK,SAAS,EACjB,MAAO,CACL,GAAGL,EACH,GAAGH,EAAO,aACV,GAAIE,EAAW,CAAC,EAAIE,EACpB,GAAIF,GAAYH,EAAW,CAAC,EAAIhC,EAAe,cAC/C,GAAGkC,EAAK,OACV,EACA,CAACvB,EAAmB,EAAGC,GAAW,QAClC,QAAS,IAAMf,EAAS,UAAU,CACpC,EACA6B,EAAE,sBAAuBD,EAAQ,qBAAuBmB,EAA2B,CACrF,EAEA,GAAIT,EACF,OAAOpC,EACL,MACA,CAAE,GAAG0C,EAAK,QAAQ,EAAG,MAAO,CAAE,GAAGR,EAAO,cAAe,cAAeD,EAAW,SAAW,KAAM,CAAE,EACpGO,EACAG,CACF,EAGF,IAAMG,EAAY9C,EAChB,SACA,CACE,KAAM,SACN,GAAI+C,GACJ,GAAGL,EAAK,YAAY,EACpB,MAAO,CAAE,GAAGL,EAAY,GAAGH,EAAO,aAAc,GAAGI,EAAO,GAAGH,EAAK,SAAU,EAC5E,CAACvB,EAAmB,EAAGC,GAAW,UAClC,QAAS,IAAMf,EAAS,YAAY,CACtC,EACA6B,EAAE,yBAA0BD,EAAQ,wBAA0BsB,EAA8B,CAC9F,EAEA,OAAOf,EACHjC,EAAG,MAAO,CAAE,GAAG0C,EAAK,QAAQ,EAAG,MAAOR,EAAO,iBAAkB,EAAGY,EAAWN,EAASG,CAAO,EAC7F3C,EAAG,MAAO,CAAE,GAAG0C,EAAK,QAAQ,EAAG,MAAOR,EAAO,eAAgB,EAAGS,EAASH,EAASM,CAAS,CACjG,ECpOA,IAAMG,GAAmD,IAAI,IAAyB,CACpF,SACA,QACA,YACA,kBACA,aACF,CAAC,EAEKC,GAAe,KAAsB,CACzC,UAAW,GACX,WAAY,KACZ,QAAS,KACT,KAAM,SACN,WAAY,WACZ,iBAAkB,CAAC,EACnB,qBAAsB,CAAC,EACvB,kBAAmB,CAAC,EACpB,iBAAkB,UAClB,aAAc,SACd,OAAQ,GACR,MAAO,GACP,QAAS,GACT,UAAWC,GAAe,EAC1B,QAAS,GACT,gBAAiB,EACjB,aAAc,GACd,YAAa,GACb,YAAa,KACb,SAAU,KACV,YAAa,CACf,GAEMC,GAAcC,GAA0B,GAAGC,EAAa,cAAc,GAAGD,CAAK,GAE9EE,GAAsBC,GAAiC,CAjH7D,IAAAC,EAkHE,GAAI,CAACD,GAAU,OAAQA,EAAuB,gBAAmB,WAAY,OAC7E,IAAME,EACJ,OAAO,OAAO,YAAe,YAC7B,IAAQD,EAAA,OAAO,WAAW,kCAAkC,IAApD,MAAAA,EAAuD,SAChED,EAAuB,eAAe,CAAE,SAAUE,EAAS,OAAS,SAAU,MAAO,SAAU,CAAC,CACnG,EAEaC,GAAN,KAAyB,CA2B9B,YAAYC,EAA0B,CArBtC,KAAQ,UAAY,IAAIC,GACxB,KAAQ,UAAgC,KACxC,KAAQ,OAA6B,KACrC,KAAQ,WAAgC,KACxC,KAAQ,QAA8B,KACtC,KAAQ,SAA+B,KACvC,KAAQ,iBAAgD,KACxD,KAAQ,WAAgC,KACxC,KAAQ,gBAA8C,KACtD,KAAQ,YAAmC,KAC3C,KAAQ,gBAAkB,IAAI,gBAC9B,KAAQ,YAAqD,KAC7D,KAAQ,eAAgC,KACxC,KAAQ,cAA+B,KACvC,KAAQ,qBAAsC,KAC9C,KAAQ,qBAAsC,KAC9C,KAAQ,WAAa,EACrB,KAAQ,SAA+B,KACvC,KAAQ,UAAY,GAIlB,KAAK,QAAUD,EACf,KAAK,UAAYE,GAAuBF,EAAQ,QAASA,EAAQ,aAAa,EAC9E,KAAK,MAAQ,IAAIG,GAAqBb,GAAa,CAAC,EACpD,KAAK,WAAac,GAAiBC,EAAY,EAE/C,KAAK,YAAcD,GAAiBE,EAAiB,EACrD,KAAK,SAAW,CACd,gBAAkBC,GAAS,KAAK,oBAAoBA,CAAI,EACxD,kBAAoBA,GAAS,KAAK,sBAAsBA,CAAI,EAC5D,oBAAqB,CAACC,EAAaC,IACjC,KAAK,wBAAwBD,EAAaC,CAAW,EACvD,YAAa,IAAM,KAAK,kBAAkB,KAAK,EAC/C,iBAAkB,IAAM,KAAK,kBAAkB,UAAU,EACzD,UAAW,IAAM,KAAK,cAAc,EACpC,SAAU,IAAM,KAAK,aAAa,EAClC,aAAc,IAAM,CACb,KAAK,iBAAiB,CAC7B,EACA,iBAAkB,IAAM,KAAK,qBAAqB,EAClD,eAAgB,IAAM,KAAK,mBAAmB,EAC9C,cAAgBC,GAAU,KAAK,MAAM,SAAS,CAAE,OAAQC,GAAeD,CAAK,CAAE,CAAC,EAC/E,aAAeA,GAAU,KAAK,MAAM,SAAS,CAAE,MAAOA,CAAM,CAAC,EAC7D,gBAAiB,IAAM,KAAK,oBAAoB,EAChD,SAAU,IAAM,KAAK,aAAa,EAClC,WAAY,CAACjB,EAAOiB,IAAU,KAAK,eAAejB,EAAOiB,CAAK,EAC9D,aAAc,CAACjB,EAAOmB,IAAU,KAAK,iBAAiBnB,EAAOmB,CAAK,EAClE,WAAaA,GAAU,KAAK,eAAeA,CAAK,CAClD,CACF,CAEA,MAAM,MAAsB,CAC1B,KAAK,MAAM,EACX,KAAK,YAAc,KAAK,MAAM,UAAU,CAACC,EAAOC,IAAS,KAAK,kBAAkBD,EAAOC,CAAI,CAAC,EAC5F,KAAK,WAAW,UAAU,IAAM,KAAK,OAAO,CAAC,EAC7C,KAAK,YAAY,UAAU,IAAM,KAAK,OAAO,CAAC,EAC9C,KAAK,OAAO,EACZ,MAAM,KAAK,YAAY,CACzB,CAEA,SAAgB,CA5LlB,IAAAjB,EAAAkB,EAAAC,EAAAC,EAAAC,EA6LQ,KAAK,YACT,KAAK,UAAY,GACjB,KAAK,gBAAgB,MAAM,EAC3B,KAAK,cAAc,GACnBrB,EAAA,KAAK,kBAAL,MAAAA,EAAA,YACAkB,EAAA,KAAK,mBAAL,MAAAA,EAAuB,SACvBC,EAAA,KAAK,aAAL,MAAAA,EAAiB,WACjBC,EAAA,KAAK,cAAL,MAAAA,EAAA,WACA,KAAK,MAAM,QAAQ,EACnB,KAAK,WAAW,QAAQ,EACxB,KAAK,YAAY,QAAQ,EACzB,KAAK,UAAU,OAAO,GAClBC,EAAA,KAAK,SAAL,MAAAA,EAAa,YACf,KAAK,OAAO,WAAW,YAAY,KAAK,MAAM,EAE5C,KAAK,uBAAyB,OAChC,SAAS,KAAK,MAAM,SAAW,KAAK,sBAElC,KAAK,uBAAyB,OAChC,SAAS,gBAAgB,MAAM,SAAW,KAAK,sBAEjD,KAAK,OAAS,KACd,KAAK,WAAa,KAClB,KAAK,QAAU,KACf,KAAK,SAAW,KAChB,KAAK,iBAAmB,KAC1B,CAEQ,OAAc,CACpB,KAAK,OAAS,SAAS,cAAc,KAAK,EAC1C,KAAK,OAAO,aAAaC,GAAyB,EAAE,EACpD,KAAK,OAAO,MAAM,SAAW,QAC7B,KAAK,OAAO,MAAM,IAAM,IACxB,KAAK,OAAO,MAAM,KAAO,IACzB,KAAK,OAAO,MAAM,MAAQ,IAC1B,KAAK,OAAO,MAAM,OAAS,IAC3B,KAAK,OAAO,MAAM,OAAS,aAC3B,SAAS,KAAK,YAAY,KAAK,MAAM,EACrC,KAAK,WAAa,KAAK,OAAO,aAAa,CAAE,KAAM,MAAO,CAAC,EAE3D,KAAK,qBAAuB,SAAS,KAAK,MAAM,SAChD,KAAK,qBAAuB,SAAS,gBAAgB,MAAM,SAC3D,SAAS,KAAK,MAAM,SAAW,SAC/B,SAAS,gBAAgB,MAAM,SAAW,SAE1CC,GAAqB,KAAK,UAAU,EACpCC,GAAuB,KAAK,UAAU,EACtCC,GAAqB,KAAK,UAAU,EAEpC,KAAK,WAAa,IAAIC,GACpB,IAAM,KAAK,gBAAgB,EAC3B,KAAK,WACJC,GACCC,GAA0B,CACxB,iBAAkB,KAAK,QAAQ,iBAC/B,cAAe,KAAK,QAAQ,cAC5B,WAAYD,EAAO,WACnB,SAAUA,EAAO,SACjB,QAAS,KAAK,UAAU,QACxB,OAAQA,EAAO,MACjB,CAAC,CACL,EAEA,KAAK,UAAYE,EAAG,MAAO,CAAE,GAAGC,EAAK,SAAS,EAAG,MAAOC,EAAO,QAAS,KAAM,cAAe,CAAC,EAC9F,KAAK,WAAW,YAAY,KAAK,SAAS,EAC1C,KAAK,QAAUF,EAAG,MAAO,CACvB,MAAOE,EAAO,MACd,KAAM,SACN,aAAc,OACd,CAACC,EAA0B,EAAG,EAChC,CAAC,EACD,KAAK,WAAW,YAAY,KAAK,OAAO,CAC1C,CAEQ,iBAAwB,CAvQlC,IAAAhC,EAAAkB,EAwQI,GAAI,KAAK,UAAW,OACpB,IAAMF,EAAQ,KAAK,MAAM,SAAS,EAC5BiB,EAAgBjB,EAAM,QACxBkB,GACElB,EAAM,QAAQ,SACdA,EAAM,mBACNE,GAAAlB,EAAA,KAAK,aAAL,YAAAA,EAAiB,mBAAjB,KAAAkB,EAAqC,IACvC,EACA,KACJ,KAAK,MAAM,SACTe,EACI,CACE,kBAAmB,CAAE,GAAGjB,EAAM,kBAAmB,CAACiB,CAAa,EAAG,EAAM,EACxE,YAAajB,EAAM,YAAc,CACnC,EACA,CAAE,YAAaA,EAAM,YAAc,CAAE,CAC3C,CACF,CAEQ,IAAsB,CAC5B,OAAOmB,GAAYC,GAAe,KAAK,MAAM,SAAS,EAAE,gBAAgB,GAAK,IAAI,CACnF,CAEQ,UAAUC,EAAaC,EAAkBC,EAAyB,CA/R5E,IAAAvC,EAAAkB,EAAAC,EAgSI,GAAM,CAAE,QAAAqB,EAAS,iBAAAC,CAAiB,EAAI,KAAK,MAAM,SAAS,EAC1D,GAAI,CAACD,EAAS,OAAOF,EACrB,GAAII,GAAkBD,CAAgB,EAAG,CACvC,GAAIF,EAAQ,OAAOD,EACnB,IAAMzB,EAAS2B,EAA+CH,CAAG,EACjE,OAAO,OAAOxB,GAAU,UAAYA,EAAQA,EAAQyB,CACtD,CACA,IAAMK,GAAM3C,EAAAwC,EAAQ,uCAAR,YAAAxC,EAA+CyC,GAG3D,GAAI,CAACE,EAAK,OAAOL,EACjB,GAAIC,EAAQ,CACV,GAAIF,IAAQ,iBAAmBA,IAAQ,uBAAwB,CAC7D,IAAMO,GAAU1B,EAAAyB,EAAI,WAAJ,YAAAzB,EAAeqB,GAC/B,OAAKK,EACD,OAAOA,GAAY,SACdP,IAAQ,gBAAkBO,EAAUN,EAEtCD,IAAQ,gBAAkBO,EAAQ,MAAQN,EAAWM,EAAQ,aAAeN,EAJ9DA,CAKvB,CACA,OAAID,EAAI,WAAW,gBAAgB,KAC1BlB,EAAAwB,EAAI,gBAAJ,YAAAxB,EAAoBoB,KAAWD,CAG1C,CACA,IAAMzB,EAAS8B,EAA2CN,CAAG,EAC7D,OAAO,OAAOxB,GAAU,UAAYA,EAAQA,EAAQyB,CACtD,CAEQ,aAAaD,EAAaC,EAA0B,CA7T9D,IAAAtC,EAAAkB,EA8TI,GAAM,CAAE,QAAAsB,EAAS,iBAAAC,CAAiB,EAAI,KAAK,MAAM,SAAS,EAC1D,GAAI,EAACD,GAAA,MAAAA,EAAS,UAAU,OAAOF,EAC/B,IAAMO,EAAQL,EAAQ,SAA2DH,CAAG,GAAKC,EACzF,GAAII,GAAkBD,CAAgB,EAAG,OAAOI,EAChD,IAAMF,GAAM3C,EAAAwC,EAAQ,uCAAR,YAAAxC,EAA+CyC,GAE3D,QADoBvB,EAAAyB,GAAA,YAAAA,EAAK,WAAL,YAAAzB,EAAmEmB,KAClEQ,CACvB,CAEA,MAAc,aAA6B,CAvU7C,IAAA7C,EAAAkB,EAwUI,GAAI,CACF,IAAM4B,EAAO,MAAMC,GAAoB,CACrC,iBAAkB,KAAK,QAAQ,iBAC/B,cAAe,KAAK,QAAQ,cAC5B,WAAY,KAAK,QAAQ,WACzB,QAAS,KAAK,UAAU,QACxB,OAAQ,KAAK,gBAAgB,MAC/B,CAAC,EACD,GAAI,KAAK,UAAW,OACpB,IAAMC,EAAeF,EAAK,OAAO,cAC3BG,EAAeC,GACnBF,EAAa,SACbG,GAA2BH,EAAa,oBAAoB,CAC9D,EACMI,EAA6C,CAAC,EACpDJ,EAAa,SAAS,QAASJ,GAAY,CACzCQ,EAAkBR,EAAQ,IAAI,EAAI,EACpC,CAAC,EACD,KAAK,MAAM,SAAS,CAClB,QAASI,EACT,UAAW,GACX,iBAAkBK,GAAkBL,EAAa,gBAAgB,EACjE,kBAAAI,EACA,GAAGH,CACL,CAAC,EACG,KAAK,UACP,KAAK,gBAAkBK,GAAkB,KAAK,QAAS,IAAG,EAAY,GAExE,KAAK,WAAW,CAClB,OAASC,EAAK,CACZ,GAAI,KAAK,WAAcA,aAAe,OAASA,EAAI,OAAS,aAAe,OAC3E,IAAMC,EAAQD,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,EAChE,KAAK,MAAM,SAAS,CAAE,WAAYC,EAAO,UAAW,EAAM,CAAC,GAC3DtC,GAAAlB,EAAA,KAAK,SAAQ,UAAb,MAAAkB,EAAA,KAAAlB,EAAuBwD,EACzB,CACF,CAEQ,YAAmB,CACzB,GAAM,CAAE,QAAAhB,EAAS,iBAAAC,CAAiB,EAAI,KAAK,MAAM,SAAS,EACtD,EAACD,GAAA,MAAAA,EAAS,cAAe,CAAC,KAAK,YAC9B,KAAK,WAAW,eAAe,CAClC,WAAYA,EAAQ,YACpB,SAAUC,EACV,QAAAD,CACF,CAAC,CACH,CAEQ,YAAYxB,EAAsBwB,EAAoD,CAC5F,IAAMiB,EAAW,KAAK,WAAW,QAE3BC,EAAOC,GAAkB,CAC7B,SAAU,KAAK,QAAQ,WACvB,QAAAnB,EACA,SAAU,KAAK,QAAQ,SACvB,YAAa,KAAK,YAAY,QAC9B,SAAAiB,CACF,CAAC,EACD,MAAO,CACL,MAAAzC,EACA,QAAAwB,EACA,SAAAiB,EACA,KAAAC,EACA,OAAQA,EAAK,OACb,WAAYA,EAAK,WACjB,kBAAmBE,GACjBpB,EAAQ,SACRA,EAAQ,SACRA,EAAQ,qBACV,EACA,mBAAoBqB,GAAsBrB,EAAQ,SAAUA,EAAQ,wBAAwB,EAC5F,aAAckB,EAAK,aACnB,UAAWA,EAAK,UAChB,WAAYA,EAAK,WACjB,EAAG,CAACrB,EAAKC,EAAUC,IAAW,KAAK,UAAUF,EAAKC,EAAUC,CAAM,EAClE,KAAM,CAACF,EAAKC,IAAa,KAAK,aAAaD,EAAKC,CAAQ,EACxD,GAAI,KAAK,GAAG,EACZ,SAAU,KAAK,QACjB,CACF,CAEQ,kBAAkBtB,EAAsBC,EAA2B,CACzE,IAAM6C,EAAW,OAAO,KAAK9C,CAAK,EAAiC,OAChEqB,GAAQrB,EAAMqB,CAAG,IAAMpB,EAAKoB,CAAG,CAClC,EACIyB,EAAQ,SAAW,IACnB9C,EAAM,SAAW8C,EAAQ,MAAOzB,GAAQ7C,GAAe,IAAI6C,CAAG,CAAC,GAAK,KAAK,MAAMrB,EAAO8C,CAAO,GAGjG,KAAK,OAAO,EACd,CAEQ,MAAM9C,EAAsB8C,EAA8C,CAnapF,IAAA9D,EAoaI,IAAM+D,EAAO,KAAK,WAClB,GAAI,CAACA,GAAQ,CAAC/C,EAAM,QAAS,MAAO,GACpC,IAAMgD,EAAM,KAAK,YAAYhD,EAAOA,EAAM,OAAO,EAEjD,GAAI8C,EAAQ,SAAS,QAAQ,EAAG,CAC9B,IAAMG,EAAQF,EAAK,eAAelE,EAAa,WAAW,EACtDoE,GAASA,EAAM,QAAUjD,EAAM,SAAQiD,EAAM,MAAQjD,EAAM,OACjE,CAeA,GAbI8C,EAAQ,SAAS,WAAW,IAC9B9C,EAAM,UAAU,QAAQ,CAACkD,EAAOtE,IAAU,CACxC,IAAMuE,EAAMJ,EAAK,eAAepE,GAAWC,CAAK,CAAC,EAC5CuE,IACDA,EAAI,QAAUD,IAAOC,EAAI,MAAQD,GACrCE,GAAYD,EAAKE,GAAYL,EAAKE,EAAOtE,CAAK,CAAC,EACjD,CAAC,EACG,KAAK,kBACNI,EAAA+D,EAAK,eAAe,KAAK,cAAc,IAAvC,MAAA/D,EAAiE,QAClE,KAAK,eAAiB,OAItB8D,EAAQ,SAAS,iBAAiB,EAAG,CACvC,IAAMQ,EAASP,EAAK,eAAelE,EAAa,MAAM,EAClDyE,GAAQA,EAAO,YAAYC,GAAaP,CAAG,CAAC,CAClD,CAEA,GAAIF,EAAQ,SAAS,aAAa,EAAG,CACnC,IAAMU,EAAOT,EAAK,eAAelE,EAAa,WAAW,EACzD,GAAI2E,EAAM,CACRC,GAAaD,CAAI,EACjB,IAAME,EAAU,KAAK,cAAcV,CAAG,EAClCU,GAASF,EAAK,YAAYE,CAAO,CACvC,CACF,CAEA,IAAMC,EAAUZ,EAAK,cAAiC,IAAIa,EAAmB,KAAKC,GAAW,OAAO,IAAI,EACxG,GAAIF,EAAS,CACX,IAAMG,EAAOC,GAAcf,CAAG,EAC9BW,EAAQ,SAAWG,EAAK,SACpBH,EAAQ,cAAgBG,EAAK,QAAOH,EAAQ,YAAcG,EAAK,MACrE,CACA,MAAO,EACT,CAEQ,aAA+E,CAjdzF,IAAA9E,EAkdI,IAAMgF,GAAShF,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAChC,GAAI,KAAK,eAAgB,CACvB,IAAMiF,EAAK,KAAK,eAChB,YAAK,eAAiB,KACf,CAAE,IAAK,KAAM,GAAAA,EAAI,MAAO,IAAK,CACtC,CACA,OAAKD,EACE,CACL,IAAKA,EAAO,aAAaJ,EAAmB,EAC5C,GAAII,EAAO,IAAM,KACjB,MAAOA,EAAO,OAAS,OAASA,EAAO,OAAS,OAASA,EAAO,eAAiB,IACnF,EALoB,CAAE,IAAK,KAAM,GAAI,KAAM,MAAO,IAAK,CAMzD,CAEQ,aAAajF,EAA+E,CAClG,IAAMgE,EAAO,KAAK,WAClB,GAAI,CAACA,EAAM,OACX,IAAMmB,EACJnF,EAAO,IACHgE,EAAK,cAAc,IAAIa,EAAmB,KAAK7E,EAAO,GAAG,IAAI,EAC7DA,EAAO,GACLgE,EAAK,eAAehE,EAAO,EAAE,EAC7B,KAEHmF,IACLA,EAAQ,MAAM,EACVnF,EAAO,QAAU,OAASmF,EAAQ,OAAS,OAASA,EAAQ,OAAS,SACvEA,EAAQ,kBAAkBnF,EAAO,MAAOA,EAAO,KAAK,EAExD,CAEQ,QAAe,CAjfzB,IAAAC,EAAAkB,EAAAC,EAAAC,EAkfI,GAAI,KAAK,WAAa,CAAC,KAAK,SAAW,CAAC,KAAK,WAAY,OACzD,IAAMJ,EAAQ,KAAK,MAAM,SAAS,EAC5BmE,EAAQ,KAAK,YAAY,EACzBC,GAAYlE,GAAAlB,EAAA,KAAK,WAAL,YAAAA,EAAe,YAAf,KAAAkB,EAA4B,EAE9C,KAAK,uBAAuB,EAC5BuD,GAAa,KAAK,OAAO,EACzB,IAAMY,EAAK,KAAK,GAAG,EACbC,EAAOzD,EAAG,MAAO,CAAE,MAAOE,EAAO,OAAQ,CAAC,EAIhD,GAHA,KAAK,QAAQ,YAAYuD,CAAI,EAC7B,KAAK,SAAW,KAEZtE,EAAM,UAAW,CACnBsE,EAAK,YACHzD,EACE,MACA,CAAE,MAAOE,EAAO,gBAAiB,EACjCF,EAAG,MAAO,CAAE,MAAOE,EAAO,eAAgB,KAAM,SAAU,aAAcsD,EAAG,eAAe,CAAE,CAAC,CAC/F,CACF,EACA,MACF,CAEA,GAAIrE,EAAM,YAAc,CAACA,EAAM,QAAS,CACtCsE,EAAK,YACHzD,EACE,MACA,CAAE,MAAO,CAAE,GAAGE,EAAO,iBAAkB,IAAK,KAAM,CAAE,EACpDF,EAAG,IAAK,CAAE,MAAO0D,EAAe,UAAW,EAAGF,EAAG,iBAAiB,CAAC,EACnExD,EAAG,IAAK,CAAE,MAAO0D,EAAe,SAAU,IAAGpE,EAAAH,EAAM,aAAN,YAAAG,EAAkB,UAAWkE,EAAG,UAAU,CAAC,EACxFxD,EACE,SACA,CACE,KAAM,SACN,MAAO,CAAE,GAAGE,EAAO,OAAQ,GAAGA,EAAO,aAAc,MAAO,MAAO,EACjE,CAAC6C,EAAmB,EAAGC,GAAW,MAClC,QAAS,IAAM,KAAK,cAAc,CACpC,EACAQ,EAAG,OAAO,CACZ,CACF,CACF,EACA,MACF,CAEA,IAAM7C,EAAUxB,EAAM,QAChBgD,EAAM,KAAK,YAAYhD,EAAOwB,CAAO,EACrC,CAAE,KAAAkB,CAAK,EAAIM,EACXwB,EAAcxB,EAAI,EAAE,wBAAyBxB,EAAQ,uBAAyB,gBAAgB,EACpG,KAAK,QAAQ,aAAa,aAAcgD,CAAW,EACnD,OAAW,CAACC,EAAM5E,CAAK,IAAK,OAAO,QAAQ6C,EAAK,cAAc,EAC5D,KAAK,QAAQ,aAAa+B,EAAM5E,CAAK,EAEvC,KAAK,QAAQ,gBAAgB,OAAO,EACpCuD,GAAY,KAAK,QAAS,CACxB,GAAGV,EAAK,OAAO,MACf,MAAOM,EAAI,SAAW,MAAQ,QAC9B,WAAY0B,GAAwB,CAClC,UAAUtE,EAAA,KAAK,QAAQ,WAAb,YAAAA,EAAuB,KACjC,WAAYoB,EAAQ,eACtB,CAAC,CACH,CAAC,EACDmD,GAAkB,KAAK,QAASjC,EAAK,aAAa,EAC9C,KAAK,YACP,KAAK,UAAU,MAAM,gBAAkB,OAAOA,EAAK,OAAO,QAAQ,eAAe,GAE/E,KAAK,YACP,KAAK,UAAU,MAAM,KAAK,WAAY,KAAK,QAAQ,WAAYA,EAAK,WAAW,SAAS,EAE1F4B,EAAK,MAAM,OAAStB,EAAI,SAAW,OAAS,OAE5CsB,EAAK,YAAY,KAAK,aAAatB,EAAKwB,CAAW,CAAC,EACpD,IAAMI,EAAW5E,EAAM,OAAS,SAehC,GAdA,KAAK,SAAWa,EACd,MACA,CAAE,MAAO,CAAE,GAAG6B,EAAK,OAAO,cAAe,aAAcM,EAAI,SAAW,OAAS,MAAO,CAAE,EACxF6B,GAAiB7B,CAAG,EACpB8B,GAAqB9B,CAAG,EACxB+B,GAAe/B,EAAK4B,CAAQ,EAC5BI,GAAgBhC,CAAG,EACnB4B,EAAWK,GAAkBjC,CAAG,EAAI,IACtC,EACAsB,EAAK,YAAY,KAAK,QAAQ,EAC9BA,EAAK,YAAYY,GAAalC,CAAG,CAAC,EAClC,KAAK,SAAS,UAAYoB,EAC1B,KAAK,aAAaD,CAAK,EAEnB,KAAK,cAAe,CACtB,IAAMgB,EAAS,KAAK,cACpB,KAAK,cAAgB,KACrB,WAAW,IAAG,CA5kBpB,IAAAnG,EAAAkB,EA4kBuB,OAAApB,IAAmBoB,GAAAlB,EAAA,KAAK,aAAL,YAAAA,EAAiB,eAAemG,KAAhC,KAAAjF,EAA2C,IAAI,GAAG,EAAE,CAC1F,CACF,CAEQ,cAAc8C,EAA8C,CAClE,IAAMoC,EAAM,KAAK,WACjB,GAAI,EAACA,GAAA,MAAAA,EAAK,cAAepC,EAAI,MAAM,OAAS,SAAU,OAAO,KAC7D,IAAMqC,EAAUD,EAAI,WAAa,CAACA,EAAI,SACtC,OAAOvE,EACL,SACA,CACE,KAAM,SACN,MAAO,CACL,GAAGmC,EAAI,OAAO,SACd,GAAGA,EAAI,WAAW,SAClB,GAAIA,EAAI,KAAK,WAAW,OAAO,YAC3B,CAAE,gBAAiBA,EAAI,KAAK,WAAW,OAAO,WAAY,EAC1D,CAAC,EACL,GAAIA,EAAI,KAAK,WAAW,OAAO,cAC3B,CAAE,MAAOA,EAAI,KAAK,WAAW,OAAO,aAAc,EAClD,CAAC,EACL,QAAS,UACT,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,EACA,aAAcqC,EAAUrC,EAAI,GAAG,YAAY,EAAIA,EAAI,GAAG,YAAY,EAClE,MAAOqC,EAAUrC,EAAI,GAAG,eAAe,EAAIA,EAAI,GAAG,eAAe,EACjE,CAACY,EAAmB,EAAGC,GAAW,QAClC,QAAS,IAAG,CAzmBpB,IAAA7E,EAymBuB,OAAAA,EAAA,KAAK,aAAL,YAAAA,EAAiB,SAClC,EACAsG,GAAYD,CAAO,CACrB,CACF,CAEQ,aAAarC,EAA0BwB,EAAkC,CAC/E,GAAM,CAAE,QAAAhD,EAAS,GAAA6C,EAAI,SAAA5B,EAAU,MAAAzC,EAAO,OAAAe,EAAQ,WAAAwE,EAAY,KAAA7C,CAAK,EAAIM,EAC7DwC,EAAQ3E,EACZ,KACA,CACE,GAAI,uBACJ,GAAGC,EAAK,OAAO,EACf,MAAO,CAAE,GAAGC,EAAO,MAAO,GAAGwE,EAAW,KAAM,CAChD,EACAf,CACF,EACMiB,EAAOjE,EAAQ,SACjBX,EAAG,MAAO,CACR,GAAGC,EAAK,MAAM,EACd,IAAKU,EAAQ,SACb,IAAK6C,EAAG,SAAS,EACjB,MAAO,CAAE,GAAGtD,EAAO,KAAM,GAAGwE,EAAW,IAAK,CAC9C,CAAC,EACD,KAEEG,EAAc7E,EAAG,OAAQ,CAAE,GAAIhC,EAAa,YAAa,MAAO,CAAE,QAAS,MAAO,CAAE,CAAC,EACrF6E,EAAU,KAAK,cAAcV,CAAG,EAClCU,GAASgC,EAAY,YAAYhC,CAAO,EAE5C,IAAMiC,EAASjD,EAAK,WAAW,OAC/B,KAAK,iBAAmBkD,GAAuB,CAC7C,UAAWC,GAAmBrE,EAAQ,iBAAkBA,EAAQ,oCAAoC,EACpG,iBAAkBxB,EAAM,iBACxB,KAAM,CACJ,OAAAe,EACA,WAAAwE,EACA,KAAM,CACJ,GAAII,EAAO,YAAc,CAAE,gBAAiBA,EAAO,WAAY,EAAI,CAAC,EACpE,GAAIA,EAAO,cAAgB,CAAE,MAAOA,EAAO,aAAc,EAAI,CAAC,EAC9D,GAAIA,EAAO,OAAS,CAAE,YAAaA,EAAO,MAAO,EAAI,CAAC,CACxD,EACA,KAAM,CAAC,EACP,SAAU,CACR,GAAIA,EAAO,qBAAuB,CAAE,gBAAiBA,EAAO,oBAAqB,EAAI,CAAC,EACtF,GAAIA,EAAO,uBAAyB,CAAE,MAAOA,EAAO,sBAAuB,EAAI,CAAC,CAClF,EACA,eAAgBjD,EAAK,cACvB,EACA,SAAWoD,GAAS,KAAK,qBAAqBA,CAAI,EAClD,kBAAmB,KAAK,UAC1B,CAAC,EACD,KAAK,iBAAiB,OAAO,aAAalC,GAAqBC,GAAW,QAAQ,EAElF,IAAMkC,EAAWlF,EACf,MACA,CAAE,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,MAAO,WAAY,CAAE,CAAE,EAC9E6E,EACA,KAAK,iBAAiB,SACxB,EAIMM,EACJP,GAAQ/C,EAAK,eAAiB,OAC1B7B,EACE,MACA,CAAE,MAAO,CAAE,GAAGE,EAAO,QAAS,eAAgBkF,GAAevD,EAAK,YAAY,CAAE,CAAE,EAClF+C,CACF,EACA,KACAS,EAAaF,EAAU,KAAOP,EAE9BU,EAAe,CACnB,GAAGpF,EAAO,WACV,cAAe0B,EAAW,SAAW,MACrC,WAAYA,EAAW,UAAY,aACnC,IAAKA,EAAW,OAAS,MAC3B,EAEM2D,EAAS3D,EACX5B,EACE,MACA,CAAE,MAAOsF,CAAa,EACtBtF,EACE,MACA,CAAE,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,OAAQ,MAAO,MAAO,CAAE,EAC/EqF,EACArF,EAAG,MAAO,CAAE,MAAO,CAAE,WAAY,OAAQ,QAAS,OAAQ,WAAY,SAAU,WAAY,CAAE,CAAE,EAAGkF,CAAQ,CAC7G,EACAP,CACF,EACA3E,EAAG,MAAO,CAAE,MAAOsF,CAAa,EAAGtF,EAAG,MAAO,CAAE,MAAOE,EAAO,OAAQ,EAAGmF,EAAYV,CAAK,EAAGO,CAAQ,EAExG,OAAKC,EAIEnF,EACL,MACA,CAAE,GAAGC,EAAK,QAAQ,EAAG,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,MAAO,CAAE,EACtFkF,EACAI,CACF,GAREA,EAAO,aAAa,oBAAqB,QAAQ,EAC1CA,EAQX,CAEQ,wBAA+B,CACrC,IAAMC,EAAO,KAAK,iBACbA,IACLA,EAAK,MAAM,EACP,KAAK,YAAcA,EAAK,SAAS,aAAe,KAAK,YACvD,KAAK,WAAW,YAAYA,EAAK,QAAQ,EAE3C,KAAK,iBAAmB,KAC1B,CAEQ,qBAAqBP,EAAoB,CAC/C,KAAK,MAAM,SAAS,CAAE,iBAAkBA,CAAK,CAAC,EAC9C,KAAK,WAAW,CAClB,CAEQ,oBAAoBnG,EAA2B,CAluBzD,IAAAX,EAmuBI,IAAMgB,EAAQ,KAAK,MAAM,SAAS,EAC5B4B,GAAU5C,EAAAgB,EAAM,UAAN,YAAAhB,EAAe,SAAS,KAAMsH,GAAMA,EAAE,OAAS3G,GAC3D,CAACiC,GAAW5B,EAAM,OAAS,UAC/B,KAAK,MAAM,SAASuG,GAAuB3E,EAAS5B,CAAK,CAAC,CAC5D,CAEQ,wBAAwBL,EAAqBC,EAA2B,CAzuBlF,IAAAZ,EA0uBI,IAAMgB,EAAQ,KAAK,MAAM,SAAS,EAC5B4B,GAAU5C,EAAAgB,EAAM,UAAN,YAAAhB,EAAe,SAAS,KAAMsH,GAAMA,EAAE,OAAS3G,GAC3D,CAACiC,GAAW5B,EAAM,OAAS,UAC/B,KAAK,MAAM,SAASwG,GAA2B5E,EAAShC,EAAaI,CAAK,CAAC,CAC7E,CAEQ,sBAAsBL,EAA2B,CACvD,GAAM,CAAE,kBAAAyC,CAAkB,EAAI,KAAK,MAAM,SAAS,EAClD,KAAK,MAAM,SAAS,CAClB,kBAAmB,CAAE,GAAGA,EAAmB,CAACzC,CAAW,EAAG,CAACyC,EAAkBzC,CAAW,CAAE,CAC5F,CAAC,CACH,CAEQ,kBAAkB8G,EAAwB,CAvvBpD,IAAAzH,EAwvBI,IAAMgB,EAAQ,KAAK,MAAM,SAAS,EAC5BwB,EAAUxB,EAAM,QACtB,GAAI,CAACwB,GAAWxB,EAAM,OAAS,SAAU,OAGzC,IAAM0G,EAAQ9D,GACZpB,EAAQ,SACRA,EAAQ,SACRA,EAAQ,qBACV,EACA,GAAIiF,IAAS,YAAc,CAACE,GAA8BD,EAAO1G,EAAM,oBAAoB,EACzF,OAEF,IAAM4G,EAAYC,GAAiBrF,EAAQ,SAAUiF,EAAMzG,CAAK,GAChEhB,EAAA,KAAK,aAAL,MAAAA,EAAiB,OACjB,KAAK,eACHgB,EAAM,eAAiB,QAAUnB,EAAa,WAAaA,EAAa,YAC1E,KAAK,cAAgBA,EAAa,YAClC,KAAK,MAAM,SAAS,CAClB,iBAAkB+H,EAAU,iBAC5B,qBAAsBA,EAAU,qBAChC,WAAYH,EACZ,KAAM,SACN,QAAS,EACX,CAAC,CACH,CAEQ,mBAA0B,CAChC,KAAK,YAAc,EACnB,KAAK,SAAW,KAChB,KAAK,cAAc,CACrB,CAEQ,sBAA6B,CACnC,KAAK,kBAAkB,EACvB,KAAK,MAAM,SAAS,CAClB,WAAY,WACZ,KAAM,SACN,QAAS,GACT,QAAS,GACT,OAAQ,GACR,MAAO,GACP,UAAW/H,GAAe,EAC1B,gBAAiB,EACjB,aAAc,GACd,YAAa,KACb,SAAU,IACZ,CAAC,CACH,CAEQ,oBAA2B,CACjC,IAAMsB,EAAQ,KAAK,MAAM,SAAS,EAClC,GAAIA,EAAM,SAAWA,EAAM,aAAc,OACzC,IAAM8G,EAAe9G,EAAM,eAAiB,QAAU,SAAW,QACjE,KAAK,eAAiB8G,IAAiB,QAAUjI,EAAa,WAAaA,EAAa,YACxF,KAAK,MAAM,SAAS,CAAE,aAAAiI,EAAc,YAAa,IAAK,CAAC,CACzD,CAEQ,cAAqB,CAC3B,IAAM9G,EAAQ,KAAK,MAAM,SAAS,EAC9BA,EAAM,cAAgB,CAAC+G,GAAe/G,EAAM,aAAcA,EAAM,OAAQA,EAAM,KAAK,GAClF,KAAK,QAAQ,CACpB,CAEQ,cAAqB,CACvB,KAAK,MAAM,SAAS,EAAE,cACrB,KAAK,QAAQ,CACpB,CAEA,MAAc,SAAyB,CACrC,IAAMA,EAAQ,KAAK,MAAM,SAAS,EAC5BgH,EAAU,EAAE,KAAK,WACvB,KAAK,SAAW,KAChB,KAAK,MAAM,SAAS,CAAE,YAAa,KAAM,aAAc,EAAK,CAAC,EAC7D,GAAI,CACF,IAAMC,EAAS,MAAMC,GAAU,CAC7B,iBAAkB,KAAK,QAAQ,iBAC/B,cAAe,KAAK,QAAQ,cAC5B,GAAIC,GAAanH,EAAM,aAAcA,EAAM,OAAQA,EAAM,KAAK,EAC9D,QAASoH,GAAWpH,EAAM,YAAY,EACtC,QAAS,KAAK,UAAU,QACxB,OAAQ,KAAK,gBAAgB,MAC/B,CAAC,EACD,GAAI,KAAK,WAAagH,IAAY,KAAK,WAAY,OACnD,KAAK,eAAiBrI,GAAW,CAAC,EAClC,KAAK,cAAgBA,GAAW,CAAC,EACjC,KAAK,MAAM,SAAS,CAClB,QAASsI,EAAO,KAChB,UAAWvI,GAAe,EAC1B,SAAU,KACV,gBAAiB2I,GAAgB,cACjC,QAAS,GACT,aAAc,EAChB,CAAC,EACD,KAAK,eAAe,CACtB,MAAQ,CACN,GAAI,KAAK,WAAaL,IAAY,KAAK,WAAY,OACnD,KAAK,MAAM,SAAS,CAAE,YAAa,KAAK,GAAG,EAAE,eAAe,EAAG,aAAc,EAAM,CAAC,CACtF,CACF,CAEQ,gBAAuB,CAC7B,KAAK,cAAc,EACnB,KAAK,YAAc,YAAY,IAAM,CACnC,IAAMM,EAAY,KAAK,MAAM,SAAS,EAAE,gBACxC,GAAIA,GAAa,EAAG,CAClB,KAAK,cAAc,EACnB,KAAK,MAAM,SAAS,CAAE,gBAAiB,CAAE,CAAC,EAC1C,MACF,CACA,KAAK,MAAM,SAAS,CAAE,gBAAiBA,EAAY,CAAE,CAAC,CACxD,EAAG,GAAI,CACT,CAEQ,eAAsB,CACxB,KAAK,cACP,cAAc,KAAK,WAAW,EAC9B,KAAK,YAAc,KAEvB,CAEQ,qBAA4B,CAClC,IAAMtH,EAAQ,KAAK,MAAM,SAAS,EAClC,KAAK,kBAAkB,EACvB,KAAK,eACHA,EAAM,eAAiB,QAAUnB,EAAa,WAAaA,EAAa,YAC1E,KAAK,MAAM,SAAS,CAClB,QAAS,GACT,QAAS,GACT,UAAWH,GAAe,EAC1B,gBAAiB,EACjB,aAAc,GACd,YAAa,KACb,SAAU,IACZ,CAAC,CACH,CAEQ,eAAeE,EAAeiB,EAAqB,CACzD,IAAMiE,EAAOyD,GAAc,KAAK,MAAM,SAAS,EAAE,UAAW3I,EAAOiB,CAAK,EACxE,KAAK,eAAiBiE,EAAK,aAAe,KAAOnF,GAAWmF,EAAK,UAAU,EAAI,KAC/E,KAAK,MAAM,SAAS,CAAE,UAAWA,EAAK,MAAO,CAAC,EAC9C,KAAK,eAAiB,IACxB,CAEQ,iBAAiBlF,EAAemB,EAA4B,CAx4BtE,IAAAf,EAAAkB,EAy4BI,GAAIH,EAAM,MAAQ,YAAa,OAC/B,IAAMhB,EAASyI,GAAoB,KAAK,MAAM,SAAS,EAAE,UAAW5I,CAAK,EACrEG,IAAW,QACdmB,GAAAlB,EAAA,KAAK,aAAL,YAAAA,EAAiB,eAAeL,GAAWI,CAAM,KAAjD,MAAAmB,EAAiF,QACpF,CAEQ,eAAeH,EAA6B,CA/4BtD,IAAAf,EAAAkB,EAg5BI,IAAMuH,EAASC,IAAcxH,GAAAlB,EAAAe,EAAM,gBAAN,YAAAf,EAAqB,QAAQ,UAA7B,KAAAkB,EAAwC,EAAE,EAClEuH,IACL1H,EAAM,eAAe,EACrB,KAAK,eAAiBpB,GAAW8I,EAAO,UAAU,EAClD,KAAK,MAAM,SAAS,CAAE,UAAWA,EAAO,MAAO,CAAC,EAChD,KAAK,eAAiB,KACxB,CAEA,MAAc,cAAcE,EAAiBC,EAA+B,CAx5B9E,IAAA5I,EAy5BI,KAAIA,EAAA,KAAK,WAAL,YAAAA,EAAe,WAAY2I,EAAS,OAAO,KAAK,SAAS,YAC7D,IAAMV,EAAS,MAAMY,GAAU,CAC7B,iBAAkB,KAAK,QAAQ,iBAC/B,cAAe,KAAK,QAAQ,cAC5B,KAAMF,EACN,IAAKC,EACL,QAASP,GAAgB,WACzB,QAAS,KAAK,UAAU,QACxB,OAAQ,KAAK,gBAAgB,MAC/B,CAAC,EACD,YAAK,SAAW,CAAE,QAAAM,EAAS,YAAaV,EAAO,YAAa,EACrDA,EAAO,YAChB,CAEA,MAAc,kBAAkC,CAv6BlD,IAAAjI,EAAAkB,EAw6BI,IAAMF,EAAQ,KAAK,MAAM,SAAS,EAC5BwB,EAAUxB,EAAM,QACtB,GAAI,CAACwB,GAAWxB,EAAM,aAAe,CAAC8H,GAAc9H,EAAM,SAAS,EAAG,OACtE,IAAMqE,EAAK,KAAK,GAAG,EACnB,KAAK,MAAM,SAAS,CAAE,SAAU,KAAM,YAAa,EAAK,CAAC,EAEzD,IAAI0D,EACJ,GAAI,CACFA,EAAc,MAAM,KAAK,cAAc/H,EAAM,QAASA,EAAM,UAAU,KAAK,EAAE,CAAC,CAChF,OAASuC,EAAK,CACZ,GAAI,KAAK,UAAW,OACpB,KAAK,MAAM,SAAS,CAAE,SAAU8B,EAAG2D,GAAiBzF,CAAG,CAAC,EAAG,YAAa,EAAM,CAAC,EAC/E,MACF,CACA,GAAI,KAAK,UAAW,OAEpB,IAAM0F,EAAazG,EAAQ,aAAe,KAAK,QAAQ,WACvD,GAAI,CACF,GAAI,KAAK,UAAU,cAAe,CAChC,IAAM0G,EAAS,MAAMC,GAAiC,CACpD,YAAAJ,EACA,cAAe,KAAK,UAAU,cAC9B,iBAAkB,KAAK,QAAQ,iBAC/B,cAAe,KAAK,QAAQ,cAC5B,WAAAE,EACA,OAAQ,KAAK,gBAAgB,MAC/B,CAAC,EACD,GAAI,KAAK,UAAW,OACpB,GAAIC,GAAUE,GAAuBF,CAAM,EAAG,CAC5C,KAAK,SAAS,EACd,MACF,CACF,CAEA,IAAMG,EAAS,KAAK,MAAM,SAAS,EAC7BzB,EAAYC,GAAiBrF,EAAQ,SAAU6G,EAAO,WAAYA,CAAM,EAY9E,GAXA,MAAMC,GAAsB,CAC1B,YAAAP,EACA,iBAAkB,KAAK,QAAQ,iBAC/B,cAAe,KAAK,QAAQ,cAC5B,QAAS,KAAK,UAAU,QACxB,cAAe,KAAK,UAAU,cAC9B,WAAAE,EACA,SAAUM,GAA4B/G,EAAQ,SAAUoF,CAAS,EACjE,SAAUyB,EAAO,iBACjB,OAAQ,KAAK,gBAAgB,MAC/B,CAAC,EACG,KAAK,UAAW,OACpB,KAAK,SAAS,CAChB,OAAS9F,EAAK,CACZ,GAAI,KAAK,UAAW,OACpB,GAAIiG,GAAwBjG,CAAG,EAAG,CAChC,KAAK,SAAS,EACd,MACF,CACA,KAAK,MAAM,SAAS,CAAE,SAAU8B,EAAG,UAAU,EAAG,YAAa,EAAM,CAAC,GACpEnE,GAAAlB,EAAA,KAAK,SAAQ,UAAb,MAAAkB,EAAA,KAAAlB,EAAuBuD,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,EAC3E,CACF,CAEQ,UAAiB,CAp+B3B,IAAAvD,EAAAkB,GAq+BIA,GAAAlB,EAAA,KAAK,SAAQ,aAAb,MAAAkB,EAAA,KAAAlB,GACA,KAAK,QAAQ,CACf,CAEQ,eAAsB,CAz+BhC,IAAAA,EAAAkB,GA0+BIA,GAAAlB,EAAA,KAAK,SAAQ,YAAb,MAAAkB,EAAA,KAAAlB,GACA,KAAK,QAAQ,CACf,CACF,ECl+BA,SAASyJ,GAAgBC,EAAmE,CAC1F,OAAQA,EAAW,CACjB,IAAK,oBACH,MAAO,wEACT,IAAK,kBACH,MAAO,6EACT,IAAK,eACH,MAAO,sDACT,IAAK,yBACH,MAAO,sEACT,IAAK,eACH,MAAO,gEACT,QACE,MAAO,wCACX,CACF,CAEO,SAASC,GAAyBC,EAA0C,CA5BnF,IAAAC,EAAAC,EAAAC,EA+BEC,GAAqB,QAAQ,EAE7B,IAAMC,EAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACnDC,EAAeD,EAAO,IAAI,eAAe,EACzCE,EAAYF,EAAO,IAAI,QAAQ,EAC/BG,EAAwBH,EAAO,IAAI,wBAAwB,EAC3DP,EAAYO,EAAO,IAAI,YAAY,EAEnCI,EAAiBC,GAAgB,EACjCC,GAAcF,GAAA,YAAAA,EAAgB,cAAe,IAC7CG,EAAgBH,GAAA,YAAAA,EAAgB,QAChCI,EAAqBJ,GAAA,YAAAA,EAAgB,aACrCK,EAAqBR,GAAgBO,EAGrCE,EAAaC,GAAiBhB,EAAQ,SAAWY,CAAa,EAAE,QAGlEK,EAAa,GACjB,GAAI,CACFA,EAAa,OAAO,OAAS,OAAO,GACtC,MAAQ,CACNA,EAAa,EACf,CAGA,IAAMC,EAAYC,EAAG,MAAO,CAC1B,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,UAAW,QACX,QAAS,OACT,WAAY,sCACd,CACF,CAAC,EAEKC,EAAWD,EAAG,IAAK,CACvB,MAAO,CAAE,SAAU,OAAQ,WAAY,IAAK,MAAO,UAAW,UAAW,QAAS,CACpF,CAAC,EACDC,EAAS,YAAc,6BAEvB,IAAMC,EAAYF,EAAG,MAAO,CAC1B,MAAO,CACL,MAAO,OACP,OAAQ,OACR,OAAQ,oBACR,UAAW,oBACX,aAAc,MACd,UAAW,0BACX,aAAc,MAChB,CACF,CAAC,EAEDD,EAAU,YAAYG,CAAS,EAC/BH,EAAU,YAAYE,CAAQ,EAC9B,SAAS,KAAK,YAAYF,CAAS,EAEnC,IAAMI,EAAqB,CACzBC,EACAC,IACG,CACHC,GAAmB,CACjB,mBAAoBF,EACpB,sBAAuBC,EACvB,UAAWD,IAAW,WAAa,eAAiB,OACtD,CAAC,EAEDH,EAAS,YAAcG,IAAW,WAC9B,0CACA,sCAEJF,EAAU,MAAM,QAAU,OAE1B,WAAW,IAAM,CACf,OAAO,SAAS,KAAOV,CACzB,EAAG,IAAI,CACT,EAGA,GAAIJ,IAAc,YAAcC,EAAuB,CACrD,GAAIS,GAAc,OAAO,OAAQ,CAC/B,OAAO,OAAO,YAAY,CACxB,KAAM,iCACN,OAAQ,WACR,sBAAAT,CACF,EAAG,OAAO,SAAS,MAAM,EACzBY,EAAS,YAAc,2BACvBC,EAAU,MAAM,QAAU,OAC1B,MACF,EACApB,EAAAD,EAAQ,YAAR,MAAAC,EAAA,KAAAD,EAAoBQ,GACpBc,EAAmB,WAAYd,CAAqB,EACpD,MACF,CAEA,GAAID,IAAc,UAAYA,IAAc,UAAW,CACrD,IAAMmB,EAAW7B,GAAgBC,CAAS,EAC1C,GAAImB,GAAc,OAAO,OAAQ,CAC/B,OAAO,OAAO,YAAY,CACxB,KAAM,iCACN,OAAQV,EACR,UAAAT,EACA,MAAO4B,CACT,EAAG,OAAO,SAAS,MAAM,EACzBN,EAAS,YAAcM,EACvBN,EAAS,MAAM,MAAQ,UACvBC,EAAU,MAAM,QAAU,OAC1B,MACF,EACAnB,EAAAF,EAAQ,UAAR,MAAAE,EAAA,KAAAF,EAAkB,IAAI,MAAM0B,CAAQ,EAAG5B,GAAa,QACpDwB,EAAmBf,CAAS,EAC5B,MACF,CAGA,GAAI,CAACO,EAAoB,CACvBM,EAAS,YAAc,iCACvBA,EAAS,MAAM,MAAQ,UACvBC,EAAU,MAAM,QAAU,QAC1BlB,EAAAH,EAAQ,UAAR,MAAAG,EAAA,KAAAH,EAAkB,IAAI,MAAM,4BAA4B,GACxD,MACF,CAEA,IAAI2B,EAAa,EACXC,EAAc,EAEdC,EAAa,SAAY,CA/JjC,IAAA5B,EAAAC,EAAAC,EAAA2B,EAAAC,EAgKI,GAAI,CACF,IAAMC,EAAW,MAAMC,GAAqB,CAC1C,YAAajC,EAAQ,YACrB,QAASe,EACT,aAAcD,CAChB,CAAC,EAED,GAAIkB,EAAS,SAAW,WAAY,CAClC,IAAMR,EAAMQ,EAAS,0BACnB/B,EAAA+B,EAAS,mBAAT,YAAA/B,EAA2B,wBAE7B,GAAIgB,GAAc,OAAO,OAAQ,CAC/B,OAAO,OAAO,YAAY,CACxB,KAAM,iCACN,OAAQ,WACR,sBAAuBO,CACzB,EAAG,OAAO,SAAS,MAAM,EACzBJ,EAAS,YAAc,2BACvBC,EAAU,MAAM,QAAU,OAC1B,MACF,CAEIG,KAAKtB,EAAAF,EAAQ,YAAR,MAAAE,EAAA,KAAAF,EAAoBwB,IAC7BF,EAAmB,WAAYE,GAAO,MAAS,EAC/C,MACF,CAEA,GAAIQ,EAAS,SAAW,UAAYA,EAAS,SAAW,UAAW,CACjE,IAAMN,EAAWQ,GAAqBF,EAAS,WAAYA,EAAS,KAAK,EAEzE,GAAIf,GAAc,OAAO,OAAQ,CAC/B,OAAO,OAAO,YAAY,CACxB,KAAM,iCACN,OAAQe,EAAS,OACjB,UAAWA,EAAS,WACpB,MAAON,CACT,EAAG,OAAO,SAAS,MAAM,EACzBN,EAAS,YAAcM,EACvBN,EAAS,MAAM,MAAQ,UACvBC,EAAU,MAAM,QAAU,OAC1B,MACF,EAEAlB,EAAAH,EAAQ,UAAR,MAAAG,EAAA,KAAAH,EAAkB,IAAI,MAAM0B,CAAQ,EAAGM,EAAS,YAAc,QAC9DV,EAAmBU,EAAS,MAAM,EAClC,MACF,CAIA,GADAL,IACIA,EAAaC,EAAa,CAC5B,IAAMO,EAAa,uEACnBf,EAAS,YAAce,EACvBf,EAAS,MAAM,MAAQ,UACvBC,EAAU,MAAM,QAAU,QAC1BS,EAAA9B,EAAQ,UAAR,MAAA8B,EAAA,KAAA9B,EAAkB,IAAI,MAAMmC,CAAU,GACtCb,EAAmB,QAAQ,EAC3B,MACF,CAEA,IAAMc,EAAQ,IAAO,KAAK,IAAI,EAAGT,EAAa,CAAC,EAC/CP,EAAS,YAAc,mCACvB,WAAWS,EAAYO,CAAK,CAC9B,OAASC,EAAO,CAEd,GADAV,IACIA,EAAaC,EAAa,CAC5B,IAAMU,EAAUD,EAAgB,SAAW,uCAC3CjB,EAAS,YAAckB,EACvBlB,EAAS,MAAM,MAAQ,UACvBC,EAAU,MAAM,QAAU,QAC1BU,EAAA/B,EAAQ,UAAR,MAAA+B,EAAA,KAAA/B,EAAkBqC,GAClBf,EAAmB,QAAQ,EAC3B,MACF,CAEA,IAAMc,EAAQ,IAAO,KAAK,IAAI,EAAGT,EAAa,CAAC,EAC/C,WAAWE,EAAYO,CAAK,CAC9B,CACF,EAGA,WAAWP,EAAY,GAAI,CAC7B,CAEA,SAASK,GAAqBpC,EAA0ByC,EAAsC,CAC5F,OAAO1C,GAAgBC,CAAS,GAAKyC,GAAiB,wCACxD,CClPO,IAAMC,GAAgC,6BAGhCC,GAAgC,gCAEvCC,GAAiB,QACjBC,GAAgB,iBAEhBC,GAAeC,GACnB,OAAOA,GAAU,SAAW,GAAGA,CAAK,KAAOA,EAEvCC,GAAiBC,GAA8C,CACnE,GAAI,OAAOA,GAAW,SACpB,OAAOA,EAET,IAAMC,EAAU,SAAS,cAA2BD,CAAM,EAC1D,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,6BAA6BD,CAAM,EAAE,EAEvD,OAAOC,CACT,EAOaC,GAAoBC,GAA0C,CA/B3E,IAAAC,EAgCE,IAAMC,EAAOF,EAAQ,IACjBA,EAAQ,IACR,KAAIC,EAAAD,EAAQ,SAAR,KAAAC,EAAkBX,IAA+B,QAAQ,OAAQ,EAAE,CAAC,2BAA2B,mBACjGU,EAAQ,kBAAoBA,EAAQ,MAAQ,EAC9C,CAAC,WACCG,EAAM,IAAI,IAAID,EAAM,OAAO,SAAS,IAAI,EAC9C,OAAIF,EAAQ,UACVG,EAAI,aAAa,IAAI,OAAQH,EAAQ,QAAQ,EAExCG,EAAI,SAAS,CACtB,EAEMC,GAAcC,GAAiC,CACnD,GAAI,OAAOA,GAAS,UAAYA,IAAS,KACvC,OAAO,KAET,IAAMC,EAAUD,EAChB,GAAIC,EAAQ,OAASf,GACnB,OAAO,KAET,IAAMgB,EAASD,EAAQ,OACvB,OAAO,OAAOC,GAAW,UAAY,OAAO,SAASA,CAAM,GAAKA,EAAS,EACrE,KAAK,KAAKA,CAAM,EAChB,IACN,EAQaC,GAAsBR,GAAuD,CAhE1F,IAAAC,EAiEE,GAAI,CAACD,EAAQ,KAAO,CAACA,EAAQ,kBAAoB,CAACA,EAAQ,KACxD,MAAM,IAAI,MAAM,oDAAoD,EAEtES,GAAgCT,EAAQ,IAAI,EAC5C,IAAMU,EAAYd,GAAcI,EAAQ,MAAM,EACxCW,EAAMZ,GAAiBC,CAAO,EAC9BY,EAAcZ,EAAQ,SAAW,QAAaA,EAAQ,SAAW,OAEjEa,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,IAAMF,EACbE,EAAO,OAAQZ,EAAAD,EAAQ,QAAR,KAAAC,EAAiBR,GAChCoB,EAAO,aAAa,8BAA+B,EAAE,EACrDA,EAAO,aAAa,QAAS,iBAAiB,EAC9CA,EAAO,MAAM,QAAU,QACvBA,EAAO,MAAM,MAAQ,OACrBA,EAAO,MAAM,OAAS,IACtBA,EAAO,MAAM,OAASD,EAAclB,GAAYM,EAAQ,MAAyB,EAAIR,GAGrF,IAAMsB,EAAaC,GAAwB,CACzC,GAAIH,GAAeG,EAAM,SAAWF,EAAO,cACzC,OAEF,IAAMN,EAASH,GAAWW,EAAM,IAAI,EAChCR,IAAW,OACbM,EAAO,MAAM,OAAS,GAAGN,CAAM,KAEnC,EAEA,OAAO,iBAAiB,UAAWO,CAAS,EAC5CJ,EAAU,YAAYG,CAAM,EAE5B,IAAIG,EAAY,GAChB,MAAO,CACL,OAAAH,EACA,QAAS,IAAM,CACTG,IAGJA,EAAY,GACZ,OAAO,oBAAoB,UAAWF,CAAS,EAC/CD,EAAO,OAAO,EAChB,CACF,CACF,EvF9FA,IAAII,GAAsC,KACtCC,GAAwC,KACxCC,GAA4C,KAC1CC,GAAuB,IAAI,IAMjC,SAASC,GAAKC,EAA6B,CAEzCC,GAAQ,EAERN,GAAc,IAAIO,GAAgBF,CAAO,EACzCL,GAAY,KAAK,EAAE,MAAOQ,GAAQ,CA7BpC,IAAAC,GA8BIA,EAAAJ,EAAQ,UAAR,MAAAI,EAAA,KAAAJ,EAAkBG,EACpB,CAAC,CACH,CAMA,SAASE,GAAOL,EAA8B,CAExCJ,KACFA,GAAa,QAAQ,EACrBA,GAAe,MAGjBA,GAAe,IAAIU,GAAiBN,CAAO,EAC3CJ,GAAa,KAAK,EAAE,MAAOO,GAAQ,CA9CrC,IAAAC,GA+CIA,EAAAJ,EAAQ,UAAR,MAAAI,EAAA,KAAAJ,EAAkBG,EACpB,CAAC,CACH,CAEA,SAASI,GAAYC,EAA2B,CAC9Cb,IAAA,MAAAA,GAAa,YAAYa,GACzBZ,IAAA,MAAAA,GAAc,YAAYY,EAC5B,CAEA,SAASC,GAAST,EAAgC,CAC5CH,KACFA,GAAe,QAAQ,EACvBA,GAAiB,MAGnBA,GAAiB,IAAIa,GAAmBV,CAAO,EAC/CH,GAAe,KAAK,EAAE,MAAOM,GAAQ,CA/DvC,IAAAC,GAgEIA,EAAAJ,EAAQ,UAAR,MAAAI,EAAA,KAAAJ,EAAkBG,EACpB,CAAC,CACH,CAMA,SAASQ,GAAcX,EAAoD,CACzE,IAAMY,EAASC,GAAmBb,CAAO,EACnCc,EAA+B,CACnC,OAAQF,EAAO,OACf,QAAS,IAAM,CACbd,GAAqB,OAAOgB,CAAO,EACnCF,EAAO,QAAQ,CACjB,CACF,EACA,OAAAd,GAAqB,IAAIgB,CAAO,EACzBA,CACT,CAKA,SAASb,IAAgB,CACnBN,KACFA,GAAY,QAAQ,EACpBA,GAAc,MAEZC,KACFA,GAAa,QAAQ,EACrBA,GAAe,MAEbC,KACFA,GAAe,QAAQ,EACvBA,GAAiB,MAEnB,QAAWe,IAAU,CAAC,GAAGd,EAAoB,EAC3Cc,EAAO,QAAQ,CAEnB,CAMA,SAASG,GAAmBf,EAA0C,CACpEgB,GAAyBhB,CAAO,CAClC,CAEA,IAAMiB,GAAiB,CACrB,KAAAlB,GACA,OAAAM,GACA,SAAAI,GACA,cAAAE,GACA,QAAAV,GACA,mBAAAc,GACA,YAAAR,GACA,QAAS,OACX,EAEOW,GAAQD","names":["src_exports","__export","ApiError","assisted","src_default","destroy","digilockerCallback","init","inline","privacyCenter","updateToken","Store","initialState","partial","prevState","listener","el","tag","attrs","children","element","applyAttrs","appendChildren","svg","key","value","applyStyles","event","UNITLESS_PROPS","styles","stringValue","parent","child","clearElement","createMediaQuery","query","mql","currentMatches","listeners","handler","e","cb","apiCache","CACHE_TTL","getCachedData","key","cached","setCachedData","data","ttl","clearApiCache","InvalidTokenError","b64DecodeUnicode","str","m","p","code","base64UrlDecode","output","jwtDecode","token","options","pos","part","decoded","e","decodeTokenSafely","token","jwtDecode","error","SANDBOX_TOKEN_HEADER","resolveSandboxAuth","options","_a","_b","_c","_d","_e","_f","token","organisationUuid","workspaceUuid","ucic","email","mobile","resolveRequestAuth","accessToken","sandbox","decodedToken","decodeTokenSafely","organisation_uuid","workspace_uuid","buildAuthHeaders","sandboxBodyIdentity","payload","sandboxQueryIdentity","CODE_BY_NAME","CODE_BY_LOWER","c","toLanguageCode","lang","_a","_b","trimmed","lower","CODE_BY_LOWER","CODE_BY_NAME","resolveDisplayLanguage","requested","defaultLanguage","translations","fallback","requestedCode","key","toSubmitPurposes","purposes","purpose","dataElements","element","ApiError","_ApiError","opts","statusFallback","status","extractFromDetail","detail","_a","obj","parseApiError","response","fallbackMessage","_b","_c","_d","body","parsedBody","fromDetail","serverMessage","message","code","HEADER","pending","toHex","bytes","byte","mintIdempotencyKey","source","statusOf","outcome","status","settledOnResolve","result","settledOnReject","error","withIdempotencyKey","url","body","send","signature","entry","oldest","held","settle","settled","HEADER","NOTICE_CHROME_EN","TRANSLATIONS","DEFAULT_CONSENT_API_BASE_URL","DEFAULT_LOGO_POSITION","DEFAULT_ACCEPT_ALL_BUTTON_TEXT","DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT","DEFAULT_DECLINE_BUTTON_TEXT","ACCEPT_ALL_BUTTON_ID","ACCEPT_SELECTED_BUTTON_ID","DECLINE_BUTTON_ID","SUBMITTING_BUTTON_TEXT","LOGO_POSITION_JUSTIFY","REQUIRED_MARKER_GLYPH","REQUIRED_MARKER_ARIA_LABEL","REQUIRED_MARKER_COLOR","REQUIRED_MARKER_GAP","REQUIRED_MARKER_STYLE","DPO_AUDIO_ELEMENT_MAP","PURPOSE_STATUS_ACTIVE","PRODUCT_SECTION_COPY","productName","purposeCount","CONFIRM_HINT_ID","CONFIRM_HINT_COPY","NOTICE_CHROME_EN","productNames","DEFAULT_PURPOSE_PRESELECTION","PURPOSE_STATUS_INACTIVE","OTP_GATE_LENGTH","OTP_GATE_TITLE_ID","OTP_GATE_COPY","PRODUCT_POLICIES_LABEL","DEFAULT_SELECTION_CONTROL","SELECTION_CONTROL_ACCENT","SELECTION_CONTROL_COPY","answer","CONFIRM_DIALOG_ID","CONFIRM_DIALOG_DETAIL_ID","CONFIRM_DIALOG_COPY","INHERIT_FONT_FAMILY","DEFAULT_NOTICE_FONT_ID","NOTICE_FONT_GENERIC_FALLBACK","NOTICE_FONT_CATALOGUE","CSS_FONT_KEYWORDS","UNSAFE_FONT_CHARACTERS","NOTICE_FONT_ROOT_ATTRIBUTE","NOTICE_FONT_STYLE_ID","NOTICE_FONT_CSS","BASE_URL","DEFAULT_CONSENT_API_BASE_URL","fetchConsentContent","noticeId","accessToken","baseUrl","language","specific_uuid","validate_against","include_fully_consented_data","signal","sandboxParams","ORG","WS","sandbox","resolveRequestAuth","apiBaseUrl","cacheKey","cached","getCachedData","url","key","value","sandboxQueryIdentity","response","buildAuthHeaders","parseApiError","data","setCachedData","fetchConsentContentPublic","org_uuid","workspace_uuid","notice_uuid","noticesUrl","submitConsentEvent","ledgerBaseUrl","noticeUuid","purposes","declined","meta_data","guardianVerificationReference","selfDeclaredAdult","payload","toSubmitPurposes","toLanguageCode","requestBody","sandboxBodyIdentity","serialisedBody","withIdempotencyKey","idempotencyHeaders","clearApiCache","submitConsentEventPublic","fetchTTSAudioUrls","endpointMode","initiateGuardianVerification","guardianName","guardianContact","guardianRelationship","frontendCallbackUrl","metadata","_a","decodedToken","decodeTokenSafely","responseData","detail","verifyGuardianStatus","sessionToken","_b","_c","_d","_e","_f","_g","fetchNoticeConsentStatusForScope","accessToken","ledgerBaseUrl","organisationUuid","workspaceUuid","noticeUuid","signal","response","data","body","fetchNoticeConsentStatus","decodedToken","decodeTokenSafely","ORG","WS","isNoticeFullyConsented","status","buildLedgerConsentOverlay","configPurposes","_a","_b","byUuid","p","purpose_selections","cp","lp","purposeStatus","selectedByUuid","de","data_elements","CONSENT_SERVICE_PATH","LEDGER_SERVICE_PATH","ABSOLUTE_HTTP_URL","withoutTrailingSlash","value","resolveEndpoints","baseUrl","ledgerBaseUrl","trimmed","host","DEPRECATION_WARNINGS","issuedWarnings","warnOnce","warning","warnDeprecatedPrivacyCenterSlug","slug","resolveEndpointOptions","resolved","NOTICE_COLOR_KEYS","NOTICE_SELECTION_CONTROLS","NOTICE_CONTROL_STYLES","NOTICE_MOBILE_LAYOUTS","NOTICE_DESKTOP_POSITIONS","NOTICE_BACKDROPS","NOTICE_PHONE_FOOTERS","NOTICE_TEXT_SCALES","DEFAULT_DESKTOP_POSITION","NOTICE_TEXT_SCALE_FACTORS","NOTICE_WIDTH_MIN","NOTICE_WIDTH_MAX","NOTICE_LOGO_SIZE_MIN","NOTICE_LOGO_SIZE_MAX","NOTICE_CUSTOM_CSS_MAX_LENGTH","NOTICE_DISALLOWED_CSS_TOKENS","CSS_SCOPE_AT_RULE","CSS_STRING_SPECIALS_RE","CSS_ESCAPE_RE","CSS_BRACKET_PAIRS","CSS_CLOSING_BRACKETS","CSS_QUOTES","CSS_NEWLINES","CSS_REPLACEMENT_CHARACTER","MAX_CODE_POINT","HEX_RADIX","SURROGATE_MIN","SURROGATE_MAX","NOTICE_HEX_COLOR_RE","DEFAULT_TTS_HIGHLIGHT_BG","NOTICE_THEME_VARS","THEMED_ACCENT","THEMED_CONTROL_OFF","THEMED_TTS_BACKGROUND","TTS_TEXT_ATTRIBUTE","buildTtsCssVariables","colors","NOTICE_THEME_VARS","entry","buildTtsRootAttributes","TTS_TEXT_ATTRIBUTE","decodeCssEscapes","value","CSS_ESCAPE_RE","_match","hex","literal","codePoint","HEX_RADIX","MAX_CODE_POINT","SURROGATE_MIN","SURROGATE_MAX","CSS_REPLACEMENT_CHARACTER","hasBalancedBlocks","css","open","quote","inComment","index","char","CSS_NEWLINES","CSS_QUOTES","CSS_BRACKET_PAIRS","CSS_CLOSING_BRACKETS","isSafeCustomCss","NOTICE_CUSTOM_CSS_MAX_LENGTH","lowered","decoded","NOTICE_DISALLOWED_CSS_TOKENS","token","DEFAULT_APPEARANCE","APPEARANCE_ATTRIBUTE","NOTICE_ROOT_ATTRIBUTE","CLASSIC_LAYOUT","APPEARANCES","isAppearance","value","resolveAppearance","getAppearanceLayout","appearance","resolveNoticeLayout","appearance","_a","_b","_c","defaults","getAppearanceLayout","DEFAULT_DESKTOP_POSITION","isRecord","value","pickColors","raw","colors","key","NOTICE_COLOR_KEYS","NOTICE_HEX_COLOR_RE","pickPx","min","max","pickOption","options","option","pickBoolean","pickCustomCss","isSafeCustomCss","resolveNoticeAppearance","appearance","resolveAppearance","NOTICE_SELECTION_CONTROLS","NOTICE_CONTROL_STYLES","NOTICE_MOBILE_LAYOUTS","NOTICE_DESKTOP_POSITIONS","NOTICE_BACKDROPS","NOTICE_PHONE_FOOTERS","NOTICE_WIDTH_MIN","NOTICE_WIDTH_MAX","NOTICE_LOGO_SIZE_MIN","NOTICE_LOGO_SIZE_MAX","NOTICE_TEXT_SCALES","withColorScheme","prefersDark","HEX_RE","NUM","RGB_RE","BYTE_MAX","PERCENT_MAX","clampByte","n","clampUnit","parseColor","input","value","hex","digits","d","i","rgb","channel","unit","g","b","alpha","a","NAMED_COLORS","ARG","COLOR_FUNCTION_RE","URL_RE","isPassthroughColor","paintableColor","color","fallback","format","r","percent","withAlpha","parsed","mix","t","pa","pb","k","opaqueOver","base","pc","SHADE_BASE","GLASS_DEFAULT_TINT","GLASS_RADIUS","GLASS_BLUR","glassPalette","accent","tint","shade","mix","withAlpha","MOTION","COLLAPSE_EASE","prefersReducedMotion","_a","_b","escapesScope","style","_a","_b","rule","CSS_SCOPE_AT_RULE","applyScopedCustomCss","root","scopeAttribute","scopeId","markerAttribute","css","isSafeCustomCss","id","CSS_STRING_SPECIALS_RE","STYLE_ID","STYLE_CONTENT","THEMED_CONTROL_OFF","THEMED_ACCENT","THEMED_TTS_BACKGROUND","TTS_TEXT_ATTRIBUTE","NOTICE_THEME_VARS","injectCheckboxStyles","root","style","styles","createRequiredMarker","label","REQUIRED_MARKER_ARIA_LABEL","el","REQUIRED_MARKER_STYLE","REQUIRED_MARKER_GLYPH","productPurposeKey","productUuid","purposeUuid","purposeCoversProduct","purpose","scope","isMultiProduct","products","purposeNamesProduct","_a","noticeScopesPurposes","purposes","_b","serverMarksMandatoryProducts","product","gatedProductUuids","rowProductUuid","row","mandatoryProductsFirst","products","mandatory","product","inSavedOrder","purposes","saved","byUuid","p","ordered","uuid","found","rest","groupPurposesByProduct","order","covered","purpose","purposeCoversProduct","group","expandPurposesByProduct","isMultiProduct","rows","noticePurposeRows","sole","row","purposesInRenderOrder","seen","STYLE_RADII","DEFAULT_ACCENT_COLOR","DEFAULT_HEADING_COLOR","DEFAULT_TEXT_COLOR","DEFAULT_PURPOSE_SECTION_HEADING","GLASS_DESKTOP_CARD_WIDTH","SHEET_PANEL_GAP","SOLID_SURFACE_DEFAULTS","APPEARANCE_CACHE_KEY_PREFIX","LAYOUT_STYLE_ID","GLASS_STYLE_ID","SWITCH_STYLE_ID","DOCK_ATTRIBUTE","DOCKED","MOTION_ATTRIBUTE","MOTION_OFF","NOTICE_ID_ATTRIBUTE","CUSTOM_CSS_ATTRIBUTE","CONTROL_ATTRIBUTE","SWITCH_CONTROL","SWITCH_SIZES","SWITCH_THUMB_INSET","PX_LENGTH_RE","FONT_SIZE_PRECISION","DARK_SCHEME_QUERY","CORNER_OFFSET","BOTTOM_BAR_CONTENT_WIDTH","LOGO_WIDTH_RATIO","ACCORDION_NAME_MAX_CHARS","PART_ATTRIBUTE","NOTICE_KEYFRAMES","GLASS_ROW_CLASS","GLASS_VARS","part","name","PART_ATTRIBUTE","dataElementKey","purposeUuid","elementUuid","productUuid","productPurposeKey","buildSelectionForMode","rows","mode","current","selectedPurposes","selectedDataElements","purpose","element","isBlockingRequiredElement","hasRequiredDataElement","seededDataElements","mandatory","granted","primaryOf","tag","bundleFor","code","TRANSLATIONS","primary","key","candidate","noticeChromeCopy","language","toLanguageCode","NOTICE_CHROME_EN","bundle","savedAnswerLabel","copy","answer","NOTICE_CHROME_LANGUAGES","SIZES","groupStyle","optionStyle","dropdownWrapStyle","settledAnswerStyle","selectStyle","lockedBadgeStyle","box","lockedTick","label","glyph","el","svg","checkboxClass","size","className","renderSelectionControl","props","_a","control","onSelect","groupName","locked","lockedLabel","recordedAnswer","language","skin","copy","noticeChromeCopy","options","scale","checked","indeterminate","select","next","held","value","optionLabel","text","savedAnswerLabel","paintRadios","radios","radio","option","SELECTION_CONTROL_ACCENT","nextIndeterminate","mixedOption","selectEl","paint","checkbox","CLASSIC_PURPOSE_LOOK","styles","DEFAULT_HEADING_COLOR","DEFAULT_TEXT_COLOR","DEFAULT_SELECTION_CONTROL","settledMark","consented","label","createGreenCheckmark","el","renderModalPurposes","purposes","options","_a","_b","_c","_d","_e","selectedPurposes","collapsedPurposes","selectedDataElements","initialDataElementSelections","recordedAnswers","look","isAlreadyConsented","productUuid","isRowLocked","getTranslatedText","onPurposeToggle","onPurposeCollapse","onDataElementToggle","responsive","headingColor","textColor","elementControls","purposeControls","collapseButtons","dataElementContainers","chevrons","titleElements","descriptionElements","dataElementLabels","container","purpose","purposeWrapper","stateKey","productPurposeKey","locked","purposeName","chevron","svg","chevronContainer","titleEl","part","hasRequiredDataElement","createRequiredMarker","descEl","textContainer","collapseBtn","e","purposeControl","renderSelectionControl","optionRow","deContainer","dataElement","combinedId","elementName","labelSpan","isBlockingRequiredElement","deRightElement","wasSelected","control","deRow","size","ariaLabel","svgSize","strokeWidth","pathD","checkSvg","LANGUAGE_NATIVE_LABELS","toNativeLabel","name","_a","legacyLook","settings","language","chip","menu","selected","styles","renderLanguageSelector","options","_b","_c","_d","_e","languages","selectedLanguage","onSelect","dropdownContainer","look","isOpen","buttonText","el","chevronSvg","svg","buttonStyle","button","part","toggleDropdown","e","closeDropdown","dropdown","lang","isSelected","restingStyle","resting","hover","item","container","positionDropdown","rect","clickOutsideHandler","path","target","repositionHandler","openDropdown","setupKeyboardTrap","modalEl","onEscape","handler","e","_a","focusableElements","focusable","el","first","last","active","firstFocusable","STORAGE_KEY","isBrowser","saveConsentState","state","stateWithTimestamp","STORAGE_KEY","error","getConsentState","savedState","parsed","clearConsentState","updateConsentState","updates","currentState","TTSManager","onStateChange","root","fetchAudio","fetchTTSAudioUrls","params","_a","response","error","content","ordered","_b","urls","audioSeq","elementSeq","push","url","elementId","purposes","purposesInRenderOrder","purpose","purposeAudio","de","deAudio","mapping","DPO_AUDIO_ELEMENT_MAP","audioUrl","ACCEPT_ALL_BUTTON_ID","ACCEPT_SELECTED_BUTTON_ID","DECLINE_BUTTON_ID","startIndex","index","audio","element","rect","el","renderAgeVerification","options","settings","colors","isMobile","logoUrl","onYes","onNo","onClose","headingColor","textColor","font","logo","el","styles","title","topLeft","closeBtn","closeSvg","svg","topSection","description","question","middleSection","btnBase","yesBtn","noBtn","bottomSection","RELATIONSHIP_OPTIONS","renderGuardianForm","options","_a","formData","settings","colors","isMobile","logoUrl","isSubmitting","onSubmit","onCancel","onFieldChange","headingColor","textColor","borderColor","bgColor","radius","font","accentColor","inputStyle","errorStyle","labelStyle","hintStyle","logo","el","styles","title","topLeft","topSection","subtitle","infoIcon","svg","infoText","infoBanner","nameLabel","nameInput","e","nameHint","nameError","nameGroup","contactLabel","contactInput","contactHint","contactError","contactGroup","relLabel","selectedLabel","o","chevronSvg","selectedSpan","relationshipDisplay","dropdownList","i","option","isSelected","optionEl","doClose","label","checkSvg","dropdownOpen","relContainer","handleClickOutside","doOpen","rect","spaceBelow","dropdownHeight","relationshipError","generalError","fieldsContainer","middleSection","btnBase","submitBtn","cancelBtn","bottomSection","validateGuardianForm","data","errors","getVerificationErrorMessage","errorCode","fallbackError","renderVerificationScreen","options","settings","colors","isMobile","logoUrl","isInitiating","isPolling","isComplete","isAutoTransitioning","error","canRetry","onContinue","onBack","headingColor","textColor","font","accentColor","logo","el","styles","title","topLeft","topSection","middleSection","successCircle","checkSvg","svg","successText","wrapper","spinner","statusMsg","errorCircle","xSvg","failedText","errorBox","btnBase","bottomSection","acceptBtnStyle","declineBtnStyle","continueBtn","retryBtn","goBackBtn","cancelBtn","asString","value","fallback","colorsFromLook","look","acceptAll","acceptSelected","decline","base","rowKey","row","productPurposeKey","recordedSelectionLookup","purposeSelections","productPurposeSelections","purposeUuid","productUuid","_a","perProduct","seedSelection","rows","recordedFor","selectedPurposes","selectedDataElements","recorded","element","_b","_c","dataElementKey","collapseEveryRow","acc","initialCollapsedProducts","groups","defaultOpenProducts","openByDefault","soleSection","group","recordedBaseline","PURPOSE_STATUS_ACTIVE","settleProducts","products","productList","isSettled","consentedPurposes","rowsByProduct","resolved","rowProductUuid","consentedProducts","mandatory","hasRequiredDataElement","deciding","isFullyConsented","productBoxPurposes","purposes","required","purposeToggle","purpose","key","nextState","seeded","seededDataElements","sectionToggle","sectionPurposes","keyProductUuid","next","purposeOverrides","elementOverrides","purposeCheckedFromElements","requiredElements","isBlockingRequiredElement","confirmVerdict","recordedPurposeSelections","isSelected","wasRecorded","isMandatory","satisfies","touched","unresolved","serverMarksMandatoryProducts","baseline","blocking","ok","gated","gatedProductUuids","scoped","noticeScopesPurposes","engagingRows","purposeNamesProduct","engaged","confirmHint","verdict","productName","copy","CONFIRM_HINT_COPY","byUuid","product","names","uuid","submissionPurposes","selection","rowsOf","config","noticePurposeRows","groupsOf","groupPurposesByProduct","seedProductState","purposeSelections","productPurposeSelections","defaultOpenProducts","includeFullyConsentedData","rows","recordedFor","recordedSelectionLookup","hasRecord","settled","settleProducts","seed","initialCollapsedProducts","recordedBaseline","isMultiProduct","seeded","seedSelection","collapseEveryRow","isFullyConsented","productIsRequired","products","productUuid","list","serverMarksMandatoryProducts","gatedProductUuids","noticeConfirmVerdict","selectedPurposes","recordedPurposeSelections","confirmVerdict","CHEVRON_OPEN","CHEVRON_CLOSED","sectionTally","boxPurposes","keyProductUuid","selectedPurposes","selectedCount","purpose","productPurposeKey","showsMidState","tally","drawsSwitch","renderProductSection","options","_a","_b","product","purposes","collapsed","locked","isRequired","getTranslatedText","onToggleCollapse","onToggleSelect","look","CLASSIC_PURPOSE_LOOK","styles","name","headingColor","productBoxPurposes","chevron","svg","collapseButton","el","title","createRequiredMarker","selection","renderSelectionControl","next","PRODUCT_SECTION_COPY","heading","header","part","body","renderProductGroups","_c","container","sections","parts","group","productUuid","section","productIsRequired","rows","renderModalPurposes","purposeUuid","mergePurposeRefs","updateProductSection","refs","merge","pick","renderConfirmHint","style","CONFIRM_HINT_ID","updateConfirmHint","hintEl","anchor","describedButton","text","resolveLogoPosition","raw","DEFAULT_LOGO_POSITION","logoRowJustify","position","LOGO_POSITION_JUSTIFY","shouldHoldForOtp","gate","verified","emptyOtpDigits","length","OTP_GATE_LENGTH","otpCodeOf","digits","isOtpComplete","digit","onlyDigits","value","withDigit","index","current","fillFromStart","code","_","i","_a","typedOver","text","previous","withoutPrevious","applyOtpText","typed","applyOtpBackspace","settleVerify","result","OtpGateSession","mode","token","onBusy","failedMessage","OTP_GATE_COPY","_b","panelStyle","titleStyle","descriptionStyle","digitsStyle","digitStyle","errorStyle","buttonStyle","renderOtpGatePanel","options","_a","view","inputs","look","errorEl","el","confirmButton","isOtpComplete","paint","_b","input","index","blocked","OTP_GATE_COPY","focusDigit","applyEntry","entry","digitRow","_","applyOtpText","event","applyOtpBackspace","text","container","part","OTP_GATE_TITLE_ID","next","lockSelections","control","button","buildThemeCssVariables","colors","_a","accent","entries","NOTICE_THEME_VARS","GLASS_VARS","entry","buildTtsCssVariables","applyCssVariables","element","variables","name","value","ACTION_COPY","overlayStyle","panelStyle","titleStyle","detailStyle","actionsStyle","buttonStyle","activeIn","root","_a","openConfirmDialog","options","action","onConfirm","onCancel","confirmStyle","fontFamily","skin","copy","noticeChromeCopy","opener","disposed","dispose","onKeyDown","overlay","cancel","confirm","cancelButton","el","confirmButton","panel","part","CONFIRM_DIALOG_ID","CONFIRM_DIALOG_DETAIL_ID","NOTICE_FONT_ROOT_ATTRIBUTE","applyCssVariables","event","active","getProductPolicyLinks","products","policies","product","url","shouldShowNoticePolicyLink","links","_a","productCount","renderProductPolicyLine","label","links","linkStyle","line","el","link","index","resolvePurposePreselection","raw","DEFAULT_PURPOSE_PRESELECTION","hasRecordedPurposeState","selection","_a","PURPOSE_STATUS_INACTIVE","buildPreselection","purposes","mode","buildSelectionForMode","purpose","selectedPurposes","selectedDataElements","hasPreselectedElement","element","isPreselected","dataElementKey","openingSelection","preselection","recordedFor","hint","isRecorded","purposeUuid","productUuid","elementUuid","applyPreselection","rows","seeded","opening","row","productPurposeKey","recordedAnswersFor","answers","preselectionForRows","entryById","id","NOTICE_FONT_CATALOGUE","entry","toFontFamilyValue","value","_a","_b","family","UNSAFE_FONT_CHARACTERS","INHERIT_FONT_FAMILY","lowered","CSS_FONT_KEYWORDS","NOTICE_FONT_GENERIC_FALLBACK","toNoticeFontEntry","fontPreference","stored","DEFAULT_NOTICE_FONT_ID","resolveNoticeFontFamily","hostFont","noticeFont","host","injectNoticeFontStyles","root","NOTICE_FONT_STYLE_ID","style","NOTICE_FONT_CSS","NOTICE_SECTIONS","SECTION_LABELS","ENGLISH_SECTION_LABELS","sectionLabelsFor","language","_a","_b","code","toLanguageCode","lower","briefName","text","chars","ACCORDION_NAME_MAX_CHARS","ICON_PATHS","createCollapse","content","options","slot","el","inner","clip","panel","open","timer","frame","clearPending","paint","expanded","still","COLLAPSE_EASE","MOTION","mountOpen","animated","next","renderNoticeAccordion","panelId","icon","title","clampTitle","hint","styles","animate","locked","hintEl","chevron","svg","head","tag","attrs","body","collapse","paintHead","prefersReducedMotion","part","active","nextOpen","nextLocked","solidSurface","colors","accent","radii","_a","_b","_c","_d","_e","edge","SOLID_SURFACE_DEFAULTS","withAlpha","accordionStyles","s","isMobile","headingColor","textColor","buildLayoutParts","input","gutter","SHEET_PANEL_GAP","NOTICE_KEYFRAMES","MOTION","RISE","SETTLE","edgeDock","radius","corner","side","CORNER_OFFSET","isDocked","layout","modalPosition","maxWidth","width","BOTTOM_BAR_CONTENT_WIDTH","mergeNoticeStyles","base","patch","merged","key","style","defined","value","definedPatch","palettePatch","colors","_a","surface","section","edge","minimalPatch","hairline","softPatch","accent","withAlpha","variantPatch","buildVariantStyles","blur","GLASS_BLUR","otpField","p","color","GLASS_RADIUS","stylePatch","isMobile","docked","textColor","headingColor","tint","GLASS_DEFAULT_TINT","NOTICE_KEYFRAMES","MOTION","opaqueOver","responsivePatch","GLASS_DESKTOP_CARD_WIDTH","glassSurface","loaderPillSurface","partsFor","input","buildLayoutParts","GLASS_ROW_CLASS","cssVariablesFor","GLASS_VARS","withAlpha","controlSkinFor","confirmSkinFor","buildGlassSkin","base","resolved","paintableColor","DEFAULT_ACCENT_COLOR","palette","glassPalette","mergeNoticeStyles","definedColors","colors","value","hostColors","palette","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","button","mergeHostSettings","resolved","settings","hostCss","isAppearance","isSafeCustomCss","resolveNoticeLook","served","prefersDark","withColorScheme","resolveNoticeAppearance","round","value","FONT_SIZE_PRECISION","scaleFontSize","size","factor","match","PX_LENGTH_RE","scaleFontSizes","styles","key","style","textScaleFactor","appearance","_a","NOTICE_TEXT_SCALE_FACTORS","baseResponsive","isMobile","buildModalLook","noticeId","content","cachedAppearance","settings","prefersDark","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","appearance","resolveNoticeLook","style","colors","layout","resolveNoticeLayout","docked","isDocked","headingColor","DEFAULT_HEADING_COLOR","textColor","DEFAULT_TEXT_COLOR","brandAccent","isGlass","classicAccent","DEFAULT_ACCENT_COLOR","accentColor","variant","buildVariantStyles","styles","skin","buildGlassSkin","textScale","textScaleFactor","scaleFontSizes","responsive","key","patch","LOGO_WIDTH_RATIO","radii","STYLE_RADII","parts","buildLayoutParts","solidSurface","selectionControl","DEFAULT_SELECTION_CONTROL","drawsSwitches","hostRadius","modalRadius","buttonRadius","overlayStyle","position","modalPosition","modalStyle","button","acceptAll","acceptSelected","decline","chip","_chipRadius","chipColors","menu","selected","rootAttributes","NOTICE_ROOT_ATTRIBUTE","NOTICE_ID_ATTRIBUTE","APPEARANCE_ATTRIBUTE","CONTROL_ATTRIBUTE","SWITCH_CONTROL","MOTION_ATTRIBUTE","MOTION_OFF","buildTtsRootAttributes","getAppearanceLayout","buildThemeCssVariables","dockAttributes","look","DOCK_ATTRIBUTE","DOCKED","readCachedAppearance","noticeId","raw","APPEARANCE_CACHE_KEY_PREFIX","writeCachedAppearance","appearance","key","applyNoticeCustomCss","root","noticeId","css","applyScopedCustomCss","NOTICE_ID_ATTRIBUTE","CUSTOM_CSS_ATTRIBUTE","NoticeCustomCss","_a","injectStyleSheet","root","id","css","style","N","NOTICE_ROOT_ATTRIBUTE","FLOAT_FRAMES","FLOAT_FRAMES_STILL","floatKeyframes","frames","NOTICE_KEYFRAMES","name","layoutCss","DOCK_ATTRIBUTE","DOCKED","MOTION_ATTRIBUTE","MOTION_OFF","G","APPEARANCE_ATTRIBUTE","GLASS_FALLBACKS","GLASS_VARS","v","C","CONTROL_ATTRIBUTE","SWITCH_CONTROL","glassCss","NOTICE_THEME_VARS","GLASS_ROW_CLASS","MOTION","S","ACCENT","TRACK","KNOB","OUTLINE","CHECK_FILL","switchRules","size","width","height","thumb","SWITCH_SIZES","travel","SWITCH_THUMB_INSET","sel","switchCss","injectLayoutStyles","LAYOUT_STYLE_ID","injectGlassStyles","GLASS_STYLE_ID","injectSwitchStyles","SWITCH_STYLE_ID","OWNED_ATTRIBUTE_PREFIX","paintRoot","element","style","attributes","variables","name","value","applyStyles","applyCssVariables","ModalController","options","OtpGateSession","NoticeCustomCss","resolveEndpointOptions","Store","createMediaQuery","DARK_SCHEME_QUERY","state","prevState","readCachedAppearance","_a","_b","_c","_d","_e","accessToken","mode","wasLocked","content","look","lockSelections","gate","chrome","noticeChromeCopy","styles","renderOtpGatePanel","digits","verified","kind","action","openConfirmDialog","legacySubject","legacyEmail","legacyMobile","noticeBaseUrl","data","fetchConsentContent","activeConfig","writeCachedAppearance","purposeSelections","reconsentRequired","ledgerOverlayApplied","ledgerStatus","fetchNoticeConsentStatus","overlay","buildLedgerConsentOverlay","initialCollapsed","initialDataElementSelections","needsConsentPurposes","alreadyConsentedPurposes","isFullyConsentedReviewMode","recordedFor","recordedSelectionLookup","seedRows","rowsOf","reviewsFullRecord","isFullyConsented","orderedPurposes","purposesInRenderOrder","purpose","selection","de","combinedId","deSelection","productSeed","seedProductState","productPreselection","applyPreselection","seedSelection","selectedLanguage","resolveDisplayLanguage","isMinorFlow","showAgeVerification","restoreState","pollingTokenToResume","persistedState","getConsentState","clearConsentState","recordedAnswersFor","err","error","buildModalLook","prefersReducedMotion","fontFamily","loading","root","injectLayoutStyles","injectGlassStyles","injectSwitchStyles","part","dockAttributes","NOTICE_FONT_ROOT_ATTRIBUTE","injectCheckboxStyles","injectNoticeFontStyles","TTSManager","el","resolveNoticeFontFamily","clearElement","loadingEl","language","refs","section","node","titles","label","sectionLabelsFor","renderNoticeAccordion","ENGLISH_SECTION_LABELS","NOTICE_SECTIONS","tts","active","focused","elementId","owner","keys","row","productPurposeKey","key","collapsedPurposes","_f","settingsObj","isMobile","colors","colorsFromLook","subFlowSettings","subFlowLogo","ageRefs","renderAgeVerification","setupKeyboardTrap","renderGuardianForm","field","s","verRefs","renderVerificationScreen","clearName","responsive","sheetParts","parts","headingColor","textColor","purposeLook","linkStyle","textStyle","logoImg","supportedLangs","allLanguages","l","renderLanguageSelector","lang","topRight","logoPosition","resolveLogoPosition","headerRows","logoRowJustify","topSection","noticeTextSpan","noticeText","policyPrefixText","policyAnchorText","policySpan","productPolicyLinks","getProductPolicyLinks","showNoticePolicyLink","shouldShowNoticePolicyLink","noticeAndPolicyP","dpoPreview","DEFAULT_PURPOSE_SECTION_HEADING","purposesGroup","translate","defaultText","itemId","soleSection","purposesHost","isMultiProduct","renderModalPurposes","uuid","grouped","renderProductGroups","groupsOf","productUuid","euuid","puuid","choice","dpoBlock","centerTitle","bottomSection","contentWrapper","renderConfirmHint","policiesLabel","hasPrivacyCenterLine","collapsible","footerDiv","footerP","addlSpan","pcAnchorText","renderProductPolicyLine","link","dpo","gText","gLink","connectorSpan","emailLink","dpText","dpLink","dpoTextSpan","dpoHref","dpoLink","review","containerStyle","baseButton","ACCEPT_SELECTED_BUTTON_ID","ACCEPT_ALL_BUTTON_ID","DEFAULT_ACCEPT_ALL_BUTTON_TEXT","DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT","DECLINE_BUTTON_ID","DEFAULT_DECLINE_BUTTON_TEXT","displayLanguage","translations","translationMap","message","errorContent","purposeData","productData","purposeUuid","p","next","purposeToggle","elementUuid","newDataElements","purposeCheckedFromElements","editable","sectionToggle","products","product","renderProductSection","productIsRequired","updateProductSection","rows","own","buildSelectionForMode","purposes","submissionPurposes","submitConsentEvent","control","noticeConfirmVerdict","verdict","submitting","text","confirmHint","CONFIRM_HINT_COPY","updateConfirmHint","setDisabled","btn","disabled","updateRefs","container","isCollapsed","chevron","collapseBtn","errors","validateGuardianForm","digilockerMode","callbackUrl","response","initiateGuardianVerification","saveConsentState","popup","openedWindow","token","attempts","consecutiveErrors","paused","MAX_ATTEMPTS","MAX_CONSECUTIVE_ERRORS","POLL_INTERVAL","poll","verifyGuardianStatus","ref","getVerificationErrorMessage","playing","attrs","svg","applySubmittingState","idleLabel","SUBMITTING_BUTTON_TEXT","inlineStyles","hasBlockingRequiredElement","purpose","isBlockingRequiredElement","inlineElementKey","productUuid","purposeUuid","elementUuid","productPurposeKey","inlinePurposeRows","config","noticePurposeRows","initialCollapsedPurposes","rows","acc","row","initialSelection","selectedPurposes","selectedDataElements","element","allRequiredElementsChecked","withPurposeElements","selected","updated","toggleDataElement","combinedId","next","isTicked","requiredElements","purposeSelected","buildInlineSubmitPurposes","key","hasSelectedRequiredElement","hasSelectedDataElement","inlineSubmissionKey","accessToken","configUuid","isRetryableFailure","error","status","renderInlinePurposes","purposes","options","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","selectedPurposes","collapsedPurposes","selectedDataElements","products","productPurposeOrder","settings","look","isMobile","getTranslatedText","onPurposeToggle","onPurposeCollapse","onDataElementToggle","purposeControls","checkboxes","collapseButtons","dataElementContainers","chevrons","titleElements","descriptionElements","dataElementLabels","styles","inlineStyles","responsive","headingColor","textColor","descriptionColor","chevronColor","selectionControl","DEFAULT_SELECTION_CONTROL","container","el","renderPurpose","purpose","productUuid","stateKey","productPurposeKey","purposeWrapper","purposeName","chevron","svg","chevronContainer","titleEl","part","hasBlockingRequiredElement","createRequiredMarker","descEl","textContainer","collapseBtn","e","purposeControl","renderSelectionControl","optionRow","deContainer","dataElement","combinedId","elementName","labelSpan","isBlockingRequiredElement","deCheckbox","deRow","isMultiProduct","group","groupPurposesByProduct","heading","section","inlinePurposeRows","buildInlineLook","noticeId","content","settings","prefersDark","isMobile","fontFamily","_a","_b","appearance","resolveNoticeLook","colors","drawsSwitches","resolveNoticeLayout","factor","textScaleFactor","styles","scaleFontSizes","inlineStyles","responsive","textColor","accent","rootStyle","STYLE_RADII","DEFAULT_SELECTION_CONTROL","buildThemeCssVariables","NOTICE_ID_ATTRIBUTE","NOTICE_ROOT_ATTRIBUTE","NOTICE_FONT_ROOT_ATTRIBUTE","CONTROL_ATTRIBUTE","SWITCH_CONTROL","part","selectionSignature","state","InlineController","options","NoticeCustomCss","resolveEndpointOptions","Store","createMediaQuery","DARK_SCHEME_QUERY","injectCheckboxStyles","injectNoticeFontStyles","prevState","_a","_b","_c","accessToken","_d","generation","noticeBaseUrl","data","fetchConsentContentPublic","activeConfig","rows","inlinePurposeRows","selection","initialSelection","preselectionForRows","buildPreselection","resolvePurposePreselection","resolveDisplayLanguage","initialCollapsedPurposes","err","error","status","fetchNoticeConsentStatusForScope","isNoticeFullyConsented","textColor","el","NOTICE_FONT_ROOT_ATTRIBUTE","inlineStyles","resolveNoticeFontFamily","look","buildInlineLook","injectSwitchStyles","renderInlinePurposes","key","defaultText","itemId","uuid","productUuid","elementUuid","purposeUuid","applyCssVariables","content","lang","translations","translationMap","purposeData","productData","value","productPurposeKey","purpose","p","newPurposeState","withPurposeElements","next","toggleDataElement","control","checkbox","rowsByKey","row","stateKey","container","isCollapsed","chevron","collapseBtn","allRequiredElementsChecked","isValid","skipKey","submissionKey","inlineSubmissionKey","signature","openConfirmDialog","isRetryableFailure","tokenToUse","submitConsentEventPublic","buildInlineSubmitPurposes","message","ASSISTED_BASE_URL","DEFAULT_CONSENT_API_BASE_URL","ASSISTED_CONFIG","EMAIL_REGEX","DEFAULT_PURPOSE_PRESELECTION","ASSISTED_FALLBACK_MESSAGES","ASSISTED_HOST_ATTRIBUTE","ASSISTED_IDS","FOCUS_KEY_ATTRIBUTE","FOCUS_KEYS","purposeUuid","elementUuid","ASSISTED_DEFAULT_PRIMARY_COLOR","ASSISTED_STYLE_ID","MOBILE_QUERY","publicScope","baseUrl","organisationUuid","workspaceUuid","ASSISTED_BASE_URL","fetchAssistedNotice","noticeUuid","signal","url","response","parseApiError","ASSISTED_FALLBACK_MESSAGES","createOtp","to","channel","verifyOtp","uuid","otp","purpose","submitAssistedConsent","accessToken","ledgerBaseUrl","purposes","language","payload","toSubmitPurposes","toLanguageCode","serialisedBody","withIdempotencyKey","idempotencyHeaders","text","fetchAssistedTTSAudioUrls","en","hi","bn","gu","kn","ks","gom","mai","ml","mniMtei","mr","ne","or","pa","sa","sat","sd","ta","te","ur","as","brx","doi","STATIC_STRINGS","interpolate","template","vars","match","token","makeStaticT","langCode","key","_a","_b","icon","size","color","strokeWidth","children","svg","lockIcon","checkIcon","clockIcon","phoneIcon","mailIcon","chevronIcon","expanded","speakerIcon","playing","isBlockingRequiredElement","element","hasBlockingRequiredElement","purpose","resolvePurposePreselection","raw","DEFAULT_PURPOSE_PRESELECTION","buildPreselection","purposes","mode","empty","buildSelectionForMode","hasPreselectedElement","isPreselected","dataElementKey","togglePurposeSelection","current","next","selectedDataElements","toggleDataElementSelection","elementUuid","key","isTicked","blocking","purposeSelected","areAllRequiredElementsChecked","selectionForMode","buildAssistedSubmitPurposes","selection","sanitiseMobile","ASSISTED_CONFIG","isContactValid","method","mobile","email","EMAIL_REGEX","otpRecipient","otpChannel","emptyOtpDigits","isOtpComplete","digits","applyOtpDigit","index","digit","focusIndex","applyOtpPaste","text","pasted","_","i","_a","backspaceFocusIndex","verifyFailureKey","error","ApiError","isAlreadyConsentedError","purposeHidingElement","collapsedPurposes","elementId","owner","ASSISTED_CSS","injectAssistedStyles","root","ASSISTED_STYLE_ID","style","assistedStyles","linkAttrs","ctx","id","href","textStyle","renderNoticeText","content","t","ts","anchorText","link","el","showNoticePolicyLink","shouldShowNoticePolicyLink","part","renderPurposeHeading","DEFAULT_PURPOSE_SECTION_HEADING","renderPurpose","purpose","locked","state","handlers","styles","responsive","isExpanded","name","description","dataElements","element","containerId","ASSISTED_IDS","title","hasBlockingRequiredElement","createRequiredMarker","textContainer","collapse","FOCUS_KEY_ATTRIBUTE","FOCUS_KEYS","event","chevronIcon","checkbox","elementsContainer","elementName","label","isBlockingRequiredElement","elementCheckbox","dataElementKey","renderPurposes","container","assistedStyles","renderDpoFooter","tDpo","productPolicyLinks","dpo","hasPrivacyCenterLine","paragraph","linkStyle","renderProductPolicyLine","PRODUCT_POLICIES_LABEL","dpoAnchor","hexToRgba","hex","alpha","h","c","isDefaultLanguage","lang","normaliseLanguage","availableLanguages","defaultLanguage","translations","pinned","normalised","rest","a","b","DEFAULT_CHEVRON_COLOR","responsiveFor","isMobile","buildAssistedLook","noticeId","content","settings","prefersDark","_a","_b","_c","appearance","resolveNoticeLook","colors","primaryColor","ASSISTED_DEFAULT_PRIMARY_COLOR","radii","STYLE_RADII","factor","textScaleFactor","styles","scaleFontSizes","buildVariantStyles","mergeNoticeStyles","hexToRgba","resolveLogoPosition","NOTICE_ID_ATTRIBUTE","NOTICE_FONT_ROOT_ATTRIBUTE","part","buildTtsRootAttributes","buildThemeCssVariables","renderContactField","ctx","state","handlers","locked","el","assistedStyles","ASSISTED_CONFIG","ASSISTED_IDS","event","otpBoxStyle","digit","index","renderResend","ts","primaryColor","clockIcon","FOCUS_KEY_ATTRIBUTE","FOCUS_KEYS","renderOtpEntry","boxes","renderVerifyPanel","isEmail","linksLocked","labelRow","mailIcon","phoneIcon","status","checkIcon","lockIcon","primaryAction","content","t","isContactValid","isOtpComplete","DEFAULT_ACCEPT_SELECTED_BUTTON_TEXT","areAllRequiredElementsChecked","renderFooter","isMobile","styles","look","isVerify","buttonBase","width","primaryState","primary","ACCEPT_SELECTED_BUTTON_ID","part","decline","DECLINE_BUTTON_ID","DEFAULT_DECLINE_BUTTON_TEXT","acceptAll","ACCEPT_ALL_BUTTON_ID","DEFAULT_ACCEPT_ALL_BUTTON_TEXT","PATCHABLE_KEYS","initialState","emptyOtpDigits","otpInputId","index","ASSISTED_IDS","scrollIntoViewSoft","target","_a","reduce","AssistedController","options","NoticeCustomCss","resolveEndpointOptions","Store","createMediaQuery","MOBILE_QUERY","DARK_SCHEME_QUERY","uuid","purposeUuid","elementUuid","value","sanitiseMobile","event","state","prev","_b","_c","_d","_e","ASSISTED_HOST_ATTRIBUTE","injectCheckboxStyles","injectNoticeFontStyles","injectAssistedStyles","TTSManager","params","fetchAssistedTTSAudioUrls","el","part","styles","NOTICE_FONT_ROOT_ATTRIBUTE","hidingPurpose","purposeHidingElement","makeStaticT","toLanguageCode","key","fallback","itemId","content","selectedLanguage","isDefaultLanguage","map","purpose","base","data","fetchAssistedNotice","activeConfig","preselection","buildPreselection","resolvePurposePreselection","collapsedPurposes","normaliseLanguage","setupKeyboardTrap","err","error","isMobile","look","buildAssistedLook","purposesInRenderOrder","getProductPolicyLinks","changed","root","ctx","input","digit","box","applyStyles","otpBoxStyle","resend","renderResend","slot","clearElement","speaker","primary","FOCUS_KEY_ATTRIBUTE","FOCUS_KEYS","next","primaryAction","active","id","element","focus","scrollTop","ts","body","assistedStyles","noticeTitle","name","resolveNoticeFontFamily","applyCssVariables","isVerify","renderNoticeText","renderPurposeHeading","renderPurposes","renderDpoFooter","renderVerifyPanel","renderFooter","reveal","tts","playing","speakerIcon","responsive","title","logo","speakerSlot","colors","renderLanguageSelector","availableLanguages","lang","controls","logoRow","logoRowJustify","headerLogo","sectionStyle","header","refs","p","togglePurposeSelection","toggleDataElementSelection","mode","shown","areAllRequiredElementsChecked","selection","selectionForMode","verifyMethod","isContactValid","request","detail","createOtp","otpRecipient","otpChannel","ASSISTED_CONFIG","remaining","applyOtpDigit","backspaceFocusIndex","pasted","applyOtpPaste","otpUuid","code","verifyOtp","isOtpComplete","accessToken","verifyFailureKey","noticeUuid","status","fetchNoticeConsentStatusForScope","isNoticeFullyConsented","latest","submitAssistedConsent","buildAssistedSubmitPurposes","isAlreadyConsentedError","getErrorMessage","errorCode","handleDigilockerCallback","options","_a","_b","_c","injectCheckboxStyles","params","sessionToken","urlStatus","verificationReference","persistedState","getConsentState","originalUrl","storedBaseUrl","storedSessionToken","activeSessionToken","apiBaseUrl","resolveEndpoints","isInIframe","container","el","statusEl","spinnerEl","redirectToOriginal","result","ref","updateConsentState","errorMsg","retryCount","MAX_RETRIES","pollStatus","_d","_e","response","verifyGuardianStatus","getVerificationError","timeoutMsg","delay","error","errMsg","fallbackError","DEFAULT_PRIVACY_CENTER_ORIGIN","PRIVACY_CENTER_HEIGHT_MESSAGE","DEFAULT_HEIGHT","DEFAULT_TITLE","toCssLength","value","resolveTarget","target","element","privacyCenterUrl","options","_a","base","url","readHeight","data","message","height","mountPrivacyCenter","warnDeprecatedPrivacyCenterSlug","container","src","fixedHeight","iframe","onMessage","event","destroyed","activeModal","activeInline","activeAssisted","activePrivacyCenters","init","options","destroy","ModalController","err","_a","inline","InlineController","updateToken","accessToken","assisted","AssistedController","privacyCenter","handle","mountPrivacyCenter","tracked","digilockerCallback","handleDigilockerCallback","RedactoConsent","src_default"]}
|