@gengage/assistant-fe 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +61 -0
- package/README.md +232 -0
- package/dist/assistant-fe.css +1 -0
- package/dist/chat/api.d.ts +87 -0
- package/dist/chat/api.d.ts.map +1 -0
- package/dist/chat/attachment-utils.d.ts +10 -0
- package/dist/chat/attachment-utils.d.ts.map +1 -0
- package/dist/chat/catalog.d.ts +1114 -0
- package/dist/chat/catalog.d.ts.map +1 -0
- package/dist/chat/components/AIGroupingCards.d.ts +4 -0
- package/dist/chat/components/AIGroupingCards.d.ts.map +1 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts +4 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts.map +1 -0
- package/dist/chat/components/AITopPicks.d.ts +4 -0
- package/dist/chat/components/AITopPicks.d.ts.map +1 -0
- package/dist/chat/components/CategoriesContainer.d.ts +4 -0
- package/dist/chat/components/CategoriesContainer.d.ts.map +1 -0
- package/dist/chat/components/ChatDrawer.d.ts +140 -0
- package/dist/chat/components/ChatDrawer.d.ts.map +1 -0
- package/dist/chat/components/ChoicePrompter.d.ts +16 -0
- package/dist/chat/components/ChoicePrompter.d.ts.map +1 -0
- package/dist/chat/components/ComparisonTable.d.ts +47 -0
- package/dist/chat/components/ComparisonTable.d.ts.map +1 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts +11 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts.map +1 -0
- package/dist/chat/components/GroundingReviewCard.d.ts +4 -0
- package/dist/chat/components/GroundingReviewCard.d.ts.map +1 -0
- package/dist/chat/components/KvkkBanner.d.ts +6 -0
- package/dist/chat/components/KvkkBanner.d.ts.map +1 -0
- package/dist/chat/components/Launcher.d.ts +25 -0
- package/dist/chat/components/Launcher.d.ts.map +1 -0
- package/dist/chat/components/PanelTopBar.d.ts +20 -0
- package/dist/chat/components/PanelTopBar.d.ts.map +1 -0
- package/dist/chat/components/ProactivePopup.d.ts +11 -0
- package/dist/chat/components/ProactivePopup.d.ts.map +1 -0
- package/dist/chat/components/ProsAndCons.d.ts +9 -0
- package/dist/chat/components/ProsAndCons.d.ts.map +1 -0
- package/dist/chat/components/ReviewHighlights.d.ts +3 -0
- package/dist/chat/components/ReviewHighlights.d.ts.map +1 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts +23 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts.map +1 -0
- package/dist/chat/components/actionClassifier.d.ts +13 -0
- package/dist/chat/components/actionClassifier.d.ts.map +1 -0
- package/dist/chat/components/productMentionLinker.d.ts +26 -0
- package/dist/chat/components/productMentionLinker.d.ts.map +1 -0
- package/dist/chat/components/renderUISpec.d.ts +15 -0
- package/dist/chat/components/renderUISpec.d.ts.map +1 -0
- package/dist/chat/components/typewriter.d.ts +25 -0
- package/dist/chat/components/typewriter.d.ts.map +1 -0
- package/dist/chat/extendedModeManager.d.ts +33 -0
- package/dist/chat/extendedModeManager.d.ts.map +1 -0
- package/dist/chat/index.d.ts +192 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/locales/en.d.ts +3 -0
- package/dist/chat/locales/en.d.ts.map +1 -0
- package/dist/chat/locales/index.d.ts +6 -0
- package/dist/chat/locales/index.d.ts.map +1 -0
- package/dist/chat/locales/tr.d.ts +3 -0
- package/dist/chat/locales/tr.d.ts.map +1 -0
- package/dist/chat/types.d.ts +212 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat.cjs +2 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.iife.js +59 -0
- package/dist/chat.iife.js.map +1 -0
- package/dist/chat.js +11 -0
- package/dist/chat.js.map +1 -0
- package/dist/common/action-router.d.ts +30 -0
- package/dist/common/action-router.d.ts.map +1 -0
- package/dist/common/activity-tracker.d.ts +38 -0
- package/dist/common/activity-tracker.d.ts.map +1 -0
- package/dist/common/analytics-events.d.ts +90 -0
- package/dist/common/analytics-events.d.ts.map +1 -0
- package/dist/common/analytics.d.ts +58 -0
- package/dist/common/analytics.d.ts.map +1 -0
- package/dist/common/api-paths.d.ts +14 -0
- package/dist/common/api-paths.d.ts.map +1 -0
- package/dist/common/client.d.ts +20 -0
- package/dist/common/client.d.ts.map +1 -0
- package/dist/common/communication-bridge.d.ts +51 -0
- package/dist/common/communication-bridge.d.ts.map +1 -0
- package/dist/common/config-schema.d.ts +241 -0
- package/dist/common/config-schema.d.ts.map +1 -0
- package/dist/common/context.d.ts +28 -0
- package/dist/common/context.d.ts.map +1 -0
- package/dist/common/customization-factories.d.ts +63 -0
- package/dist/common/customization-factories.d.ts.map +1 -0
- package/dist/common/events.d.ts +47 -0
- package/dist/common/events.d.ts.map +1 -0
- package/dist/common/global-error-toast.d.ts +6 -0
- package/dist/common/global-error-toast.d.ts.map +1 -0
- package/dist/common/index.d.ts +36 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/indexed-db.d.ts +74 -0
- package/dist/common/indexed-db.d.ts.map +1 -0
- package/dist/common/overlay.d.ts +64 -0
- package/dist/common/overlay.d.ts.map +1 -0
- package/dist/common/preflight.d.ts +12 -0
- package/dist/common/preflight.d.ts.map +1 -0
- package/dist/common/renderer/dom.d.ts +4 -0
- package/dist/common/renderer/dom.d.ts.map +1 -0
- package/dist/common/renderer/index.d.ts +5 -0
- package/dist/common/renderer/index.d.ts.map +1 -0
- package/dist/common/renderer/overrides.d.ts +24 -0
- package/dist/common/renderer/overrides.d.ts.map +1 -0
- package/dist/common/renderer/registry.d.ts +3 -0
- package/dist/common/renderer/registry.d.ts.map +1 -0
- package/dist/common/renderer/types.d.ts +20 -0
- package/dist/common/renderer/types.d.ts.map +1 -0
- package/dist/common/safe-html.d.ts +19 -0
- package/dist/common/safe-html.d.ts.map +1 -0
- package/dist/common/streaming.d.ts +32 -0
- package/dist/common/streaming.d.ts.map +1 -0
- package/dist/common/theme-utils.d.ts +16 -0
- package/dist/common/theme-utils.d.ts.map +1 -0
- package/dist/common/types.d.ts +298 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/ui-theme.d.ts +10 -0
- package/dist/common/ui-theme.d.ts.map +1 -0
- package/dist/common/uuidv7.d.ts +8 -0
- package/dist/common/uuidv7.d.ts.map +1 -0
- package/dist/common/v1-protocol-adapter.d.ts +66 -0
- package/dist/common/v1-protocol-adapter.d.ts.map +1 -0
- package/dist/common/widget-base.d.ts +75 -0
- package/dist/common/widget-base.d.ts.map +1 -0
- package/dist/common.cjs +2 -0
- package/dist/common.cjs.map +1 -0
- package/dist/common.js +584 -0
- package/dist/common.js.map +1 -0
- package/dist/index-CFA70IGF.js +3626 -0
- package/dist/index-CFA70IGF.js.map +1 -0
- package/dist/index-Dfl89zpe.cjs +13 -0
- package/dist/index-Dfl89zpe.cjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/qna/api.d.ts +22 -0
- package/dist/qna/api.d.ts.map +1 -0
- package/dist/qna/catalog.d.ts +140 -0
- package/dist/qna/catalog.d.ts.map +1 -0
- package/dist/qna/components/ButtonRow.d.ts +16 -0
- package/dist/qna/components/ButtonRow.d.ts.map +1 -0
- package/dist/qna/components/TextInput.d.ts +12 -0
- package/dist/qna/components/TextInput.d.ts.map +1 -0
- package/dist/qna/components/renderUISpec.d.ts +8 -0
- package/dist/qna/components/renderUISpec.d.ts.map +1 -0
- package/dist/qna/index.d.ts +34 -0
- package/dist/qna/index.d.ts.map +1 -0
- package/dist/qna/locales/en.d.ts +3 -0
- package/dist/qna/locales/en.d.ts.map +1 -0
- package/dist/qna/locales/index.d.ts +6 -0
- package/dist/qna/locales/index.d.ts.map +1 -0
- package/dist/qna/locales/tr.d.ts +3 -0
- package/dist/qna/locales/tr.d.ts.map +1 -0
- package/dist/qna/types.d.ts +62 -0
- package/dist/qna/types.d.ts.map +1 -0
- package/dist/qna.cjs +2 -0
- package/dist/qna.cjs.map +1 -0
- package/dist/qna.css +1 -0
- package/dist/qna.iife.js +48 -0
- package/dist/qna.iife.js.map +1 -0
- package/dist/qna.js +435 -0
- package/dist/qna.js.map +1 -0
- package/dist/simrel/api.d.ts +26 -0
- package/dist/simrel/api.d.ts.map +1 -0
- package/dist/simrel/catalog.d.ts +319 -0
- package/dist/simrel/catalog.d.ts.map +1 -0
- package/dist/simrel/components/GroupTabs.d.ts +17 -0
- package/dist/simrel/components/GroupTabs.d.ts.map +1 -0
- package/dist/simrel/components/ProductCard.d.ts +17 -0
- package/dist/simrel/components/ProductCard.d.ts.map +1 -0
- package/dist/simrel/components/ProductGrid.d.ts +17 -0
- package/dist/simrel/components/ProductGrid.d.ts.map +1 -0
- package/dist/simrel/components/renderUISpec.d.ts +8 -0
- package/dist/simrel/components/renderUISpec.d.ts.map +1 -0
- package/dist/simrel/index.d.ts +36 -0
- package/dist/simrel/index.d.ts.map +1 -0
- package/dist/simrel/locales/en.d.ts +3 -0
- package/dist/simrel/locales/en.d.ts.map +1 -0
- package/dist/simrel/locales/index.d.ts +6 -0
- package/dist/simrel/locales/index.d.ts.map +1 -0
- package/dist/simrel/locales/tr.d.ts +3 -0
- package/dist/simrel/locales/tr.d.ts.map +1 -0
- package/dist/simrel/types.d.ts +111 -0
- package/dist/simrel/types.d.ts.map +1 -0
- package/dist/simrel.cjs +2 -0
- package/dist/simrel.cjs.map +1 -0
- package/dist/simrel.css +1 -0
- package/dist/simrel.iife.js +48 -0
- package/dist/simrel.iife.js.map +1 -0
- package/dist/simrel.js +620 -0
- package/dist/simrel.js.map +1 -0
- package/dist/types-CeON7iBO.cjs +48 -0
- package/dist/types-CeON7iBO.cjs.map +1 -0
- package/dist/types-yxW8WA7u.js +4132 -0
- package/dist/types-yxW8WA7u.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sources":["../src/common/config-schema.ts","../src/common/overlay.ts","../src/common/analytics.ts","../src/common/theme-utils.ts","../src/common/customization-factories.ts","../src/common/preflight.ts","../src/common/client.ts"],"sourcesContent":["import { z } from 'zod';\n\nconst WidgetToggleSchema = z.object({\n enabled: z.boolean().default(true),\n});\n\nconst MountSelectorsSchema = z.object({\n chat: z.string().optional(),\n qna: z.string().optional(),\n simrel: z.string().optional(),\n});\n\nconst TransportSchema = z.object({});\n\nexport const AnalyticsAuthModeSchema = z.enum(['none', 'x-api-key-header', 'bearer-header', 'body-api-key']);\n\nconst AnalyticsAuthSchema = z.object({\n mode: AnalyticsAuthModeSchema.default('none'),\n key: z.string().optional(),\n headerName: z.string().optional(),\n bodyField: z.string().default('api_key'),\n});\n\nconst AnalyticsSchema = z.object({\n enabled: z.boolean().default(true),\n endpoint: z.string().default('/analytics'),\n auth: AnalyticsAuthSchema.default({ mode: 'none', bodyField: 'api_key' }),\n fireAndForget: z.boolean().default(true),\n useBeacon: z.boolean().default(true),\n keepaliveFetch: z.boolean().default(true),\n timeoutMs: z.number().int().positive().default(4000),\n maxRetries: z.number().int().min(0).max(5).default(1),\n});\n\nexport const DEFAULT_IDEMPOTENCY_KEY = '__gengageWidgetsInit';\n\nconst GTMSchema = z.object({\n idempotencyKey: z.string().default(DEFAULT_IDEMPOTENCY_KEY),\n requireDomReady: z.boolean().default(true),\n});\n\nexport const UnknownActionPolicySchema = z.enum(['log-and-ignore', 'throw', 'delegate']);\n\nconst ActionHandlingSchema = z.object({\n unknownActionPolicy: UnknownActionPolicySchema.default('log-and-ignore'),\n allowScriptCall: z.boolean().default(true),\n});\n\nexport const AccountRuntimeConfigSchema = z.object({\n version: z.literal('1'),\n accountId: z.string().min(1),\n middlewareUrl: z.string().url(),\n locale: z.string().optional(),\n widgets: z.object({\n chat: WidgetToggleSchema.default({ enabled: true }),\n qna: WidgetToggleSchema.default({ enabled: true }),\n simrel: WidgetToggleSchema.default({ enabled: true }),\n }),\n mounts: MountSelectorsSchema.default({}),\n transport: TransportSchema.default({}),\n analytics: AnalyticsSchema.default({\n enabled: true,\n endpoint: '/analytics',\n auth: { mode: 'none', bodyField: 'api_key' },\n fireAndForget: true,\n useBeacon: true,\n keepaliveFetch: true,\n timeoutMs: 4000,\n maxRetries: 1,\n }),\n gtm: GTMSchema.default({\n idempotencyKey: '__gengageWidgetsInit',\n requireDomReady: true,\n }),\n actionHandling: ActionHandlingSchema.default({\n unknownActionPolicy: 'log-and-ignore',\n allowScriptCall: true,\n }),\n});\n\nexport type AccountRuntimeConfig = z.infer<typeof AccountRuntimeConfigSchema>;\nexport type AnalyticsAuthMode = z.infer<typeof AnalyticsAuthModeSchema>;\nexport type UnknownActionPolicy = z.infer<typeof UnknownActionPolicySchema>;\n\nexport function parseAccountRuntimeConfig(input: unknown): AccountRuntimeConfig {\n return AccountRuntimeConfigSchema.parse(input);\n}\n\nexport function safeParseAccountRuntimeConfig(input: unknown): ReturnType<typeof AccountRuntimeConfigSchema.safeParse> {\n return AccountRuntimeConfigSchema.safeParse(input);\n}\n\nexport function createDefaultAccountRuntimeConfig(params: {\n accountId: string;\n middlewareUrl: string;\n locale?: string;\n}): AccountRuntimeConfig {\n return parseAccountRuntimeConfig({\n version: '1',\n accountId: params.accountId,\n middlewareUrl: params.middlewareUrl,\n locale: params.locale,\n widgets: {\n chat: { enabled: true },\n qna: { enabled: true },\n simrel: { enabled: true },\n },\n });\n}\n","import { GengageChat } from '../chat/index.js';\nimport type { ChatI18n, ChatWidgetConfig } from '../chat/types.js';\nimport { GengageQNA } from '../qna/index.js';\nimport type { QNAWidgetConfig } from '../qna/types.js';\nimport { GengageSimRel } from '../simrel/index.js';\nimport type { SimRelWidgetConfig } from '../simrel/types.js';\nimport { DEFAULT_IDEMPOTENCY_KEY } from './config-schema.js';\nimport { resolveSession } from './context.js';\nimport { wireQNAToChat } from './events.js';\nimport type { PageContext, SessionContext, WidgetTheme } from './types.js';\n\nconst DEFAULT_OVERLAY_KEY_PREFIX = `${DEFAULT_IDEMPOTENCY_KEY}_overlay_`;\nconst DEFAULT_QNA_MOUNT = '#gengage-qna';\nconst DEFAULT_SIMREL_MOUNT = '#gengage-simrel';\n\ninterface OverlayRegistryState {\n instances: Record<string, OverlayWidgetsRuntime>;\n pending: Record<string, Promise<OverlayWidgetsRuntime>>;\n}\n\ninterface WindowWithOverlayRegistry extends Window {\n __gengageOverlayRegistry?: OverlayRegistryState;\n}\n\nfunction getOverlayRegistry(): OverlayRegistryState {\n const win = window as WindowWithOverlayRegistry;\n if (!win.__gengageOverlayRegistry) {\n win.__gengageOverlayRegistry = {\n instances: {},\n pending: {},\n };\n }\n return win.__gengageOverlayRegistry;\n}\n\nfunction buildInitialPageContext(options: OverlayWidgetsOptions): PageContext {\n const base: PageContext = {\n pageType: options.pageContext?.pageType ?? (options.sku !== undefined ? 'pdp' : 'other'),\n };\n\n const incoming = options.pageContext;\n if (incoming?.sku !== undefined) base.sku = incoming.sku;\n if (incoming?.price !== undefined) base.price = incoming.price;\n if (incoming?.categoryTree !== undefined) base.categoryTree = incoming.categoryTree;\n if (incoming?.url !== undefined) base.url = incoming.url;\n if (incoming?.extra !== undefined) base.extra = incoming.extra;\n\n if (options.sku !== undefined) {\n base.sku = options.sku;\n }\n\n return base;\n}\n\nfunction mergePageContext(current: PageContext, patch: Partial<PageContext>): PageContext {\n const next: PageContext = {\n ...current,\n ...patch,\n pageType: patch.pageType ?? current.pageType,\n };\n if (patch.sku === undefined && current.sku !== undefined) {\n next.sku = current.sku;\n }\n return next;\n}\n\nfunction resolveMountTarget(target: HTMLElement | string): HTMLElement | string | null {\n if (target instanceof HTMLElement) return target;\n if (document.querySelector(target)) return target;\n return null;\n}\n\nfunction buildOverlayKey(options: OverlayWidgetsOptions): string {\n return options.idempotencyKey ?? `${DEFAULT_OVERLAY_KEY_PREFIX}${options.accountId}`;\n}\n\nexport interface OverlayChatOptions {\n enabled?: boolean;\n variant?: ChatWidgetConfig['variant'];\n mountTarget?: HTMLElement | string;\n launcherSvg?: string;\n hideMobileLauncher?: boolean;\n mobileBreakpoint?: number;\n mobileInitialState?: 'half' | 'full';\n i18n?: Partial<ChatI18n>;\n actionHandling?: ChatWidgetConfig['actionHandling'];\n}\n\nexport interface OverlayQNAOptions {\n enabled?: boolean;\n mountTarget?: HTMLElement | string;\n ctaText?: string;\n inputPlaceholder?: QNAWidgetConfig['inputPlaceholder'];\n}\n\nexport interface OverlaySimRelOptions {\n enabled?: boolean;\n mountTarget?: HTMLElement | string;\n discountType?: SimRelWidgetConfig['discountType'];\n}\n\nexport interface OverlayWidgetsOptions {\n accountId: string;\n middlewareUrl: string;\n locale?: string;\n session?: Partial<SessionContext>;\n pageContext?: Partial<PageContext>;\n sku?: string;\n theme?: WidgetTheme;\n idempotencyKey?: string;\n wireQnaToChat?: boolean;\n chat?: OverlayChatOptions;\n qna?: OverlayQNAOptions;\n simrel?: OverlaySimRelOptions;\n onAddToCart?: SimRelWidgetConfig['onAddToCart'];\n onProductNavigate?: SimRelWidgetConfig['onProductNavigate'];\n}\n\nexport interface OverlayWidgetsController {\n readonly idempotencyKey: string;\n readonly session: SessionContext;\n readonly chat: GengageChat | null;\n readonly qna: GengageQNA | null;\n readonly simrel: GengageSimRel | null;\n openChat(options?: { state?: 'half' | 'full' }): void;\n closeChat(): void;\n updateContext(patch: Partial<PageContext>): Promise<void>;\n updateSku(sku: string, pageType?: PageContext['pageType']): Promise<void>;\n destroy(): void;\n}\n\nclass OverlayWidgetsRuntime implements OverlayWidgetsController {\n private _chat: GengageChat | null = null;\n private _qna: GengageQNA | null = null;\n private _simrel: GengageSimRel | null = null;\n private _pageContext: PageContext;\n private _destroyed = false;\n private _queue: Promise<void> = Promise.resolve();\n private _warnedQnaMountMissing = false;\n private _warnedSimRelMountMissing = false;\n\n readonly idempotencyKey: string;\n readonly session: SessionContext;\n\n constructor(\n private readonly options: OverlayWidgetsOptions,\n private readonly onDestroy: () => void,\n ) {\n this.idempotencyKey = buildOverlayKey(options);\n this.session = resolveSession(options.session);\n this._pageContext = buildInitialPageContext(options);\n }\n\n get chat(): GengageChat | null {\n return this._chat;\n }\n\n get qna(): GengageQNA | null {\n return this._qna;\n }\n\n get simrel(): GengageSimRel | null {\n return this._simrel;\n }\n\n async init(): Promise<void> {\n if (!window.gengage) window.gengage = {};\n window.gengage.sessionId = this.session.sessionId;\n window.gengage.pageContext = this._pageContext;\n\n await this._initChat();\n await this._syncPdpWidgets();\n\n if (this.options.wireQnaToChat !== false) {\n wireQNAToChat();\n }\n\n window.gengage.overlay = this;\n }\n\n openChat(options?: { state?: 'half' | 'full' }): void {\n this._chat?.open(options);\n }\n\n closeChat(): void {\n this._chat?.close();\n }\n\n async updateContext(patch: Partial<PageContext>): Promise<void> {\n if (this._destroyed) return;\n await this._enqueue(async () => {\n this._pageContext = mergePageContext(this._pageContext, patch);\n\n if (!window.gengage) window.gengage = {};\n window.gengage.pageContext = this._pageContext;\n\n this._chat?.update(patch);\n this._qna?.update(patch);\n this._simrel?.update(patch);\n await this._syncPdpWidgets();\n });\n }\n\n async updateSku(sku: string, pageType: PageContext['pageType'] = 'pdp'): Promise<void> {\n await this.updateContext({ sku, pageType });\n }\n\n destroy(): void {\n if (this._destroyed) return;\n this._destroyed = true;\n\n this._chat?.destroy();\n this._qna?.destroy();\n this._simrel?.destroy();\n\n this._chat = null;\n this._qna = null;\n this._simrel = null;\n\n if (window.gengage?.overlay === this) {\n delete window.gengage.overlay;\n }\n\n this.onDestroy();\n }\n\n private async _initChat(): Promise<void> {\n if (this.options.chat?.enabled === false) return;\n\n const middlewareUrl = this.options.middlewareUrl;\n\n const config: ChatWidgetConfig = {\n accountId: this.options.accountId,\n middlewareUrl,\n session: this.session,\n pageContext: this._pageContext,\n variant: this.options.chat?.variant ?? 'floating',\n };\n\n if (this.options.theme !== undefined) config.theme = this.options.theme;\n if (this.options.locale !== undefined) config.locale = this.options.locale;\n if (this.options.chat?.mountTarget !== undefined) config.mountTarget = this.options.chat.mountTarget;\n if (this.options.chat?.launcherSvg !== undefined) config.launcherSvg = this.options.chat.launcherSvg;\n if (this.options.chat?.hideMobileLauncher !== undefined) {\n config.hideMobileLauncher = this.options.chat.hideMobileLauncher;\n }\n if (this.options.chat?.mobileBreakpoint !== undefined) {\n config.mobileBreakpoint = this.options.chat.mobileBreakpoint;\n }\n if (this.options.chat?.mobileInitialState !== undefined) {\n config.mobileInitialState = this.options.chat.mobileInitialState;\n }\n if (this.options.chat?.i18n !== undefined) config.i18n = this.options.chat.i18n;\n if (this.options.chat?.actionHandling !== undefined) {\n config.actionHandling = this.options.chat.actionHandling;\n }\n\n this._chat = new GengageChat();\n await this._chat.init(config);\n }\n\n private async _syncPdpWidgets(): Promise<void> {\n if (this._destroyed) return;\n const sku = this._pageContext.sku;\n const isPdp = this._pageContext.pageType === 'pdp' && sku !== undefined && sku.length > 0;\n\n if (!isPdp) {\n this._destroyPdpWidgets();\n return;\n }\n\n const middlewareUrl = this.options.middlewareUrl;\n\n if (this.options.qna?.enabled !== false) {\n const qnaTarget = this.options.qna?.mountTarget ?? DEFAULT_QNA_MOUNT;\n const mountTarget = resolveMountTarget(qnaTarget);\n\n if (mountTarget) {\n this._warnedQnaMountMissing = false;\n if (!this._qna) {\n const qna = new GengageQNA();\n const qnaConfig: QNAWidgetConfig = {\n accountId: this.options.accountId,\n middlewareUrl,\n session: this.session,\n pageContext: {\n pageType: 'pdp',\n sku,\n },\n mountTarget,\n };\n if (this.options.theme !== undefined) qnaConfig.theme = this.options.theme;\n if (this.options.qna?.ctaText !== undefined) qnaConfig.ctaText = this.options.qna.ctaText;\n if (this.options.qna?.inputPlaceholder !== undefined) {\n qnaConfig.inputPlaceholder = this.options.qna.inputPlaceholder;\n }\n await qna.init(qnaConfig);\n this._qna = qna;\n } else {\n this._qna.show();\n this._qna.update({ pageType: 'pdp', sku });\n }\n } else {\n this._qna?.destroy();\n this._qna = null;\n if (!this._warnedQnaMountMissing) {\n console.warn(`[gengage] QNA mount target not found: ${qnaTarget}`);\n this._warnedQnaMountMissing = true;\n }\n }\n } else {\n this._qna?.destroy();\n this._qna = null;\n }\n\n if (this.options.simrel?.enabled !== false) {\n const simRelTarget = this.options.simrel?.mountTarget ?? DEFAULT_SIMREL_MOUNT;\n const mountTarget = resolveMountTarget(simRelTarget);\n\n if (mountTarget) {\n this._warnedSimRelMountMissing = false;\n if (!this._simrel) {\n const simrel = new GengageSimRel();\n const simRelConfig: SimRelWidgetConfig = {\n accountId: this.options.accountId,\n middlewareUrl,\n session: this.session,\n sku,\n mountTarget,\n };\n if (this.options.theme !== undefined) simRelConfig.theme = this.options.theme;\n if (this.options.simrel?.discountType !== undefined) {\n simRelConfig.discountType = this.options.simrel.discountType;\n }\n if (this.options.onAddToCart !== undefined) {\n simRelConfig.onAddToCart = this.options.onAddToCart;\n }\n if (this.options.onProductNavigate !== undefined) {\n simRelConfig.onProductNavigate = this.options.onProductNavigate;\n } else {\n simRelConfig.onProductNavigate = (url, productSku, sessionId) => {\n this._chat?.saveSession(sessionId ?? this.session.sessionId, productSku);\n window.location.href = url;\n };\n }\n await simrel.init(simRelConfig);\n this._simrel = simrel;\n } else {\n this._simrel.show();\n this._simrel.update({ pageType: 'pdp', sku });\n }\n } else {\n this._simrel?.destroy();\n this._simrel = null;\n if (!this._warnedSimRelMountMissing) {\n console.warn(`[gengage] SimRel mount target not found: ${simRelTarget}`);\n this._warnedSimRelMountMissing = true;\n }\n }\n } else {\n this._simrel?.destroy();\n this._simrel = null;\n }\n }\n\n private _destroyPdpWidgets(): void {\n this._qna?.destroy();\n this._simrel?.destroy();\n this._qna = null;\n this._simrel = null;\n }\n\n private _enqueue(fn: () => Promise<void>): Promise<void> {\n const next = this._queue.then(fn);\n this._queue = next.catch(() => undefined);\n return next;\n }\n}\n\nexport async function initOverlayWidgets(options: OverlayWidgetsOptions): Promise<OverlayWidgetsController> {\n const key = buildOverlayKey(options);\n const registry = getOverlayRegistry();\n\n const existing = registry.instances[key];\n if (existing) return existing;\n\n const pending = registry.pending[key];\n if (pending) return pending;\n\n const runtime = new OverlayWidgetsRuntime(options, () => {\n const liveRegistry = getOverlayRegistry();\n delete liveRegistry.instances[key];\n delete liveRegistry.pending[key];\n });\n\n const runtimeInit = runtime\n .init()\n .then(() => {\n registry.instances[key] = runtime;\n delete registry.pending[key];\n return runtime;\n })\n .catch((err) => {\n delete registry.pending[key];\n throw err;\n });\n\n registry.pending[key] = runtimeInit;\n return runtimeInit;\n}\n\nexport function getOverlayWidgets(idempotencyKey: string): OverlayWidgetsController | null {\n const registry = getOverlayRegistry();\n return registry.instances[idempotencyKey] ?? null;\n}\n\nexport function destroyOverlayWidgets(idempotencyKey: string): void {\n const controller = getOverlayWidgets(idempotencyKey);\n controller?.destroy();\n}\n\nexport function buildOverlayIdempotencyKey(accountId: string): string {\n return `${DEFAULT_OVERLAY_KEY_PREFIX}${accountId}`;\n}\n","import { normalizeMiddlewareUrl } from './api-paths.js';\nimport type { AnalyticsAuthMode } from './config-schema.js';\n\nexport interface AnalyticsEnvelope {\n event_name: string;\n event_version: '1';\n timestamp_ms: number;\n account_id: string;\n session_id: string;\n correlation_id: string;\n view_id?: string;\n user_id?: string;\n widget?: 'chat' | 'qna' | 'simrel';\n page_type?: string;\n sku?: string;\n payload: Record<string, unknown>;\n}\n\nexport interface AnalyticsAuthConfig {\n mode?: AnalyticsAuthMode;\n key?: string;\n headerName?: string;\n bodyField?: string;\n}\n\nexport interface AnalyticsClientConfig {\n enabled?: boolean;\n middlewareUrl: string;\n endpoint?: string;\n auth?: AnalyticsAuthConfig;\n fireAndForget?: boolean;\n useBeacon?: boolean;\n keepaliveFetch?: boolean;\n timeoutMs?: number;\n maxRetries?: number;\n batchSize?: number;\n flushIntervalMs?: number;\n}\n\nexport type AnalyticsInput = Omit<AnalyticsEnvelope, 'event_version' | 'timestamp_ms'> &\n Partial<Pick<AnalyticsEnvelope, 'event_version' | 'timestamp_ms'>>;\n\ninterface AnalyticsTransportBody {\n events: AnalyticsEnvelope[];\n [extra: string]: unknown;\n}\n\nconst DEFAULT_ANALYTICS_CONFIG: Required<Omit<AnalyticsClientConfig, 'auth' | 'middlewareUrl'>> = {\n enabled: true,\n endpoint: '/analytics',\n fireAndForget: true,\n useBeacon: true,\n keepaliveFetch: true,\n timeoutMs: 4000,\n maxRetries: 1,\n batchSize: 10,\n flushIntervalMs: 250,\n};\n\nconst DEFAULT_AUTH: Required<AnalyticsAuthConfig> = {\n mode: 'none',\n key: '',\n headerName: 'X-API-Key',\n bodyField: 'api_key',\n};\n\nexport class AnalyticsClient {\n private readonly config: Required<Omit<AnalyticsClientConfig, 'auth'>> & { auth: Required<AnalyticsAuthConfig> };\n private readonly queue: AnalyticsEnvelope[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly onPageHideBound: () => void;\n\n constructor(config: AnalyticsClientConfig) {\n this.config = {\n ...DEFAULT_ANALYTICS_CONFIG,\n ...config,\n auth: {\n ...DEFAULT_AUTH,\n ...(config.auth ?? {}),\n },\n };\n\n this.onPageHideBound = () => {\n if (this.queue.length === 0) return;\n void this.flushAll({ preferBeacon: true });\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('pagehide', this.onPageHideBound);\n }\n }\n\n track(input: AnalyticsInput): void {\n if (!this.config.enabled) return;\n const envelope = normalizeAnalyticsInput(input);\n this.queue.push(envelope);\n\n if (this.queue.length >= this.config.batchSize) {\n this.scheduleImmediateFlush();\n return;\n }\n\n this.scheduleFlush();\n }\n\n async flush(options: { preferBeacon?: boolean } = {}): Promise<void> {\n if (!this.config.enabled || this.queue.length === 0) return;\n\n const batch = this.queue.splice(0, this.config.batchSize);\n const body = this.buildTransportBody(batch);\n const endpoint = resolveAnalyticsEndpoint(this.config.endpoint, this.config.middlewareUrl);\n const preferBeacon = options.preferBeacon ?? this.config.useBeacon;\n\n await this.sendWithRetry(endpoint, body, preferBeacon);\n }\n\n /** Drain the entire queue, flushing in batch-sized chunks. */\n async flushAll(options: { preferBeacon?: boolean } = {}): Promise<void> {\n while (this.queue.length > 0) {\n await this.flush(options);\n }\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n if (typeof window !== 'undefined') {\n window.removeEventListener('pagehide', this.onPageHideBound);\n }\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) return;\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n void this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private scheduleImmediateFlush(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n void this.flush();\n }\n\n private buildTransportBody(events: AnalyticsEnvelope[]): AnalyticsTransportBody {\n const body: AnalyticsTransportBody = { events };\n if (this.config.auth.mode === 'body-api-key' && this.config.auth.key) {\n body[this.config.auth.bodyField] = this.config.auth.key;\n }\n return body;\n }\n\n private async sendWithRetry(endpoint: string, body: AnalyticsTransportBody, preferBeacon: boolean): Promise<void> {\n let attempt = 0;\n while (attempt <= this.config.maxRetries) {\n attempt += 1;\n try {\n const sent = await this.send(endpoint, body, preferBeacon);\n if (sent) return;\n } catch {\n // fire-and-forget transport: swallow and continue retry cycle\n }\n }\n }\n\n private async send(endpoint: string, body: AnalyticsTransportBody, preferBeacon: boolean): Promise<boolean> {\n const payload = JSON.stringify(body);\n const canUseBeacon =\n preferBeacon &&\n this.config.useBeacon &&\n this.config.auth.mode !== 'x-api-key-header' &&\n this.config.auth.mode !== 'bearer-header' &&\n hasSendBeacon();\n\n if (canUseBeacon) {\n const ok = navigator.sendBeacon(endpoint, payload);\n if (ok) return true;\n }\n\n if (typeof fetch === 'undefined') return false;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.config.auth.mode === 'x-api-key-header' && this.config.auth.key) {\n headers[this.config.auth.headerName] = this.config.auth.key;\n }\n if (this.config.auth.mode === 'bearer-header' && this.config.auth.key) {\n headers.Authorization = `Bearer ${this.config.auth.key}`;\n }\n\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timeout = controller ? setTimeout(() => controller.abort(), this.config.timeoutMs) : null;\n\n try {\n const requestInit: RequestInit = {\n method: 'POST',\n headers,\n body: payload,\n keepalive: this.config.keepaliveFetch && this.config.fireAndForget,\n };\n if (controller) {\n requestInit.signal = controller.signal;\n }\n const response = await fetch(endpoint, requestInit);\n return response.ok;\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n }\n}\n\nexport function createAnalyticsClient(config: AnalyticsClientConfig): AnalyticsClient {\n return new AnalyticsClient(config);\n}\n\nfunction normalizeAnalyticsInput(input: AnalyticsInput): AnalyticsEnvelope {\n const envelope: AnalyticsEnvelope = {\n event_name: input.event_name,\n event_version: input.event_version ?? '1',\n timestamp_ms: input.timestamp_ms ?? Date.now(),\n account_id: input.account_id,\n session_id: input.session_id,\n correlation_id: input.correlation_id,\n payload: input.payload,\n };\n\n if (input.view_id !== undefined) envelope.view_id = input.view_id;\n if (input.user_id !== undefined) envelope.user_id = input.user_id;\n if (input.widget !== undefined) envelope.widget = input.widget;\n if (input.page_type !== undefined) envelope.page_type = input.page_type;\n if (input.sku !== undefined) envelope.sku = input.sku;\n\n return envelope;\n}\n\nfunction resolveAnalyticsEndpoint(endpoint: string, middlewareUrl: string): string {\n if (/^https?:\\/\\//i.test(endpoint)) return endpoint;\n const baseUrl = normalizeMiddlewareUrl(middlewareUrl);\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n return `${baseUrl}${normalizedEndpoint}`;\n}\n\nfunction hasSendBeacon(): boolean {\n return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\n}\n","import type { WidgetTheme } from './types.js';\n\n/**\n * Shared baseline tokens used by account customizations.\n *\n * These values come from historical Gengage host defaults and are\n * intentionally conservative so account themes can override only what differs.\n */\nexport const BASE_WIDGET_THEME: WidgetTheme = {\n primaryColor: '#000000',\n primaryForeground: '#ffffff',\n backgroundColor: '#ffffff',\n foregroundColor: '#222222',\n borderRadius: '8px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontSize: '14px',\n zIndex: '1000',\n\n '--glov-chatbot-width': '420px',\n '--glov-left-spacing': '260px',\n '--chatbot-padding': '16px',\n '--root-wrapper-background-color': '#F2F2F2',\n '--root-wrapper-border-color': '#E5E5E5',\n\n '--gengage-chat-width': '400px',\n '--gengage-chat-shell-radius': '12px',\n '--gengage-chat-header-height': '60px',\n '--gengage-chat-conversation-width': '396px',\n '--gengage-chat-panel-min-width': '320px',\n '--gengage-chat-panel-max-width': '860px',\n '--gengage-chat-input-height': '48px',\n '--gengage-qna-pill-radius': '999px',\n '--gengage-qna-input-radius': '14px',\n '--gengage-simrel-card-radius': '14px',\n};\n\n/**\n * Merge account overrides on top of the shared base theme.\n *\n * Account customization files should call this helper so shared defaults stay\n * centralized under src/common.\n */\nexport function withBaseTheme(overrides: WidgetTheme): WidgetTheme {\n return { ...BASE_WIDGET_THEME, ...overrides };\n}\n","import type { ChatWidgetConfig } from '../chat/types.js';\nimport type { QNAWidgetConfig } from '../qna/types.js';\nimport type { SimRelWidgetConfig } from '../simrel/types.js';\nimport type { AnalyticsClientConfig } from './analytics.js';\nimport type { WidgetTheme } from './types.js';\n\nexport const DEFAULT_CUSTOMIZATION_LOCALE = 'tr';\n\nexport interface AccountIdentityConfig {\n accountId: string;\n middlewareUrl: string;\n locale?: string;\n}\n\nexport interface AccountIdentity {\n ACCOUNT_ID: string;\n MIDDLEWARE_URL: string;\n LOCALE: string;\n}\n\ninterface BaseAccountWidgetConfigInput {\n accountId: string;\n middlewareUrl: string;\n sessionId: string;\n theme?: WidgetTheme;\n}\n\nexport interface FloatingChatConfigInput extends BaseAccountWidgetConfigInput {\n locale?: string;\n}\n\nexport interface PdpQnaConfigInput extends BaseAccountWidgetConfigInput {\n sku: string;\n mountTarget: QNAWidgetConfig['mountTarget'];\n}\n\nexport interface PdpSimRelConfigInput extends BaseAccountWidgetConfigInput {\n sku: string;\n mountTarget: SimRelWidgetConfig['mountTarget'];\n}\n\ntype FloatingChatConfigOverrides = Omit<\n Partial<ChatWidgetConfig>,\n 'accountId' | 'middlewareUrl' | 'session' | 'variant' | 'theme' | 'locale'\n>;\ntype PdpQnaConfigOverrides = Omit<\n Partial<QNAWidgetConfig>,\n 'accountId' | 'middlewareUrl' | 'session' | 'pageContext' | 'mountTarget' | 'theme'\n>;\ntype SimRelAccountConfig = Omit<SimRelWidgetConfig, 'onAddToCart' | 'onProductNavigate'>;\ntype PdpSimRelConfigOverrides = Omit<\n Partial<SimRelAccountConfig>,\n 'accountId' | 'middlewareUrl' | 'session' | 'sku' | 'mountTarget' | 'theme'\n>;\ntype DefaultAnalyticsConfigOverrides = Omit<AnalyticsClientConfig, 'middlewareUrl'>;\n\n/**\n * Shared account identity factory used by all customization folders.\n * Keeps middleware URL + locale defaults centralized in the SDK layer.\n */\nexport function createAccountIdentity(config: AccountIdentityConfig): AccountIdentity {\n return {\n ACCOUNT_ID: config.accountId,\n MIDDLEWARE_URL: config.middlewareUrl,\n LOCALE: config.locale ?? DEFAULT_CUSTOMIZATION_LOCALE,\n };\n}\n\n/**\n * Shared floating-chat baseline used by account customizations.\n * Account files only pass differences via `overrides`.\n */\nexport function createFloatingChatConfig(\n input: FloatingChatConfigInput,\n overrides: FloatingChatConfigOverrides = {},\n): ChatWidgetConfig {\n const config: ChatWidgetConfig = {\n accountId: input.accountId,\n middlewareUrl: input.middlewareUrl,\n session: { sessionId: input.sessionId },\n variant: 'floating',\n locale: input.locale ?? DEFAULT_CUSTOMIZATION_LOCALE,\n ...overrides,\n };\n if (input.theme !== undefined) {\n config.theme = input.theme;\n }\n return config;\n}\n\n/**\n * Shared PDP QNA baseline used by account customizations.\n */\nexport function createPdpQnaConfig(input: PdpQnaConfigInput, overrides: PdpQnaConfigOverrides = {}): QNAWidgetConfig {\n const config: QNAWidgetConfig = {\n accountId: input.accountId,\n middlewareUrl: input.middlewareUrl,\n session: { sessionId: input.sessionId },\n pageContext: { pageType: 'pdp', sku: input.sku },\n mountTarget: input.mountTarget,\n ...overrides,\n };\n if (input.theme !== undefined) {\n config.theme = input.theme;\n }\n return config;\n}\n\n/**\n * Shared PDP SimRel baseline used by account customizations.\n * Host-level commerce callbacks stay in account init wrappers.\n */\nexport function createPdpSimRelConfig(\n input: PdpSimRelConfigInput,\n overrides: PdpSimRelConfigOverrides = {},\n): SimRelAccountConfig {\n const config: SimRelAccountConfig = {\n accountId: input.accountId,\n middlewareUrl: input.middlewareUrl,\n session: { sessionId: input.sessionId },\n sku: input.sku,\n mountTarget: input.mountTarget,\n ...overrides,\n };\n if (input.theme !== undefined) {\n config.theme = input.theme;\n }\n return config;\n}\n\n/**\n * Shared analytics defaults for account customization wrappers.\n */\nexport function createDefaultAnalyticsConfig(\n middlewareUrl: string,\n overrides: DefaultAnalyticsConfigOverrides = {},\n): AnalyticsClientConfig {\n return {\n enabled: true,\n middlewareUrl,\n endpoint: '/analytics',\n fireAndForget: true,\n useBeacon: true,\n ...overrides,\n };\n}\n","import type { AccountRuntimeConfig } from './config-schema.js';\n\nexport interface PreflightWarning {\n code: string;\n message: string;\n severity: 'warn' | 'error';\n}\n\nexport interface PreflightResult {\n ok: boolean;\n warnings: PreflightWarning[];\n}\n\nfunction isValidSelector(selector: string): boolean {\n try {\n document.querySelector(selector);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function preflightDiagnostics(config: AccountRuntimeConfig): PreflightResult {\n const warnings: PreflightWarning[] = [];\n\n const mounts = config.mounts;\n const mountEntries: Array<[string, string | undefined]> = [\n ['qna', mounts.qna],\n ['simrel', mounts.simrel],\n ['chat', mounts.chat],\n ];\n\n for (const [widget, selector] of mountEntries) {\n if (selector === undefined) continue;\n\n if (!isValidSelector(selector)) {\n warnings.push({\n code: 'INVALID_SELECTOR',\n message: `[gengage preflight] ${widget} mount selector is invalid CSS: \"${selector}\"`,\n severity: 'error',\n });\n continue;\n }\n\n if (!document.querySelector(selector)) {\n warnings.push({\n code: 'MOUNT_NOT_FOUND',\n message: `[gengage preflight] ${widget} mount target not found: \"${selector}\" — widget will skip or wait for DOM`,\n severity: 'warn',\n });\n }\n }\n\n const idempotencyKey = config.gtm.idempotencyKey;\n if ((window as unknown as Record<string, unknown>)[idempotencyKey] !== undefined) {\n warnings.push({\n code: 'DUPLICATE_IDEMPOTENCY',\n message: `[gengage preflight] window[\"${idempotencyKey}\"] already exists — widgets may have already initialized`,\n severity: 'warn',\n });\n }\n\n for (const w of warnings) {\n if (w.severity === 'error') {\n console.error(w.message);\n } else {\n console.warn(w.message);\n }\n }\n\n return {\n ok: warnings.every((w) => w.severity !== 'error'),\n warnings,\n };\n}\n","import type { AccountRuntimeConfig } from './config-schema.js';\nimport { safeParseAccountRuntimeConfig } from './config-schema.js';\nimport { initOverlayWidgets } from './overlay.js';\nimport type { OverlayWidgetsController, OverlayWidgetsOptions } from './overlay.js';\nimport { preflightDiagnostics } from './preflight.js';\nimport type { PageContext } from './types.js';\n\nexport interface HostActions {\n onAddToCart?: (info: { sku: string; quantity?: number; cartCode?: string }) => void;\n onProductNavigate?: (url: string, sku: string, sessionId: string | null) => void;\n onScriptCall?: (name: string, payload: unknown) => void;\n}\n\nexport interface GengageClientOptions {\n runtimeConfig: AccountRuntimeConfig | unknown;\n contextResolver?: () => Partial<PageContext>;\n hostActions?: HostActions;\n preflight?: boolean;\n}\n\nfunction parseConfig(raw: AccountRuntimeConfig | unknown): AccountRuntimeConfig {\n const result = safeParseAccountRuntimeConfig(raw);\n if (!result.success) {\n const messages = result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');\n throw new Error(`[gengage] Invalid runtime config: ${messages}`);\n }\n return result.data;\n}\n\nfunction mapConfigToOverlayOptions(\n config: AccountRuntimeConfig,\n hostActions?: HostActions,\n initialContext?: Partial<PageContext>,\n): OverlayWidgetsOptions {\n const options: OverlayWidgetsOptions = {\n accountId: config.accountId,\n middlewareUrl: config.middlewareUrl,\n idempotencyKey: config.gtm.idempotencyKey,\n };\n\n if (config.locale !== undefined) options.locale = config.locale;\n\n if (initialContext !== undefined) {\n options.pageContext = initialContext;\n if (initialContext.sku !== undefined) options.sku = initialContext.sku;\n }\n\n options.chat = {\n enabled: config.widgets.chat.enabled,\n };\n if (config.mounts.chat !== undefined) {\n options.chat.mountTarget = config.mounts.chat;\n }\n\n options.qna = {\n enabled: config.widgets.qna.enabled,\n };\n if (config.mounts.qna !== undefined) {\n options.qna.mountTarget = config.mounts.qna;\n }\n\n options.simrel = {\n enabled: config.widgets.simrel.enabled,\n };\n if (config.mounts.simrel !== undefined) {\n options.simrel.mountTarget = config.mounts.simrel;\n }\n\n if (hostActions?.onAddToCart !== undefined) {\n options.onAddToCart = hostActions.onAddToCart;\n }\n\n if (hostActions?.onProductNavigate !== undefined) {\n options.onProductNavigate = hostActions.onProductNavigate;\n }\n\n return options;\n}\n\nexport async function initGengageClient(options: GengageClientOptions): Promise<OverlayWidgetsController> {\n const config = parseConfig(options.runtimeConfig);\n\n if (options.preflight !== false) {\n const result = preflightDiagnostics(config);\n if (!result.ok) {\n const errors = result.warnings.filter((w) => w.severity === 'error');\n throw new Error(`[gengage] Preflight failed: ${errors.map((e) => e.message).join('; ')}`);\n }\n }\n\n const initialContext = options.contextResolver?.();\n\n const overlayOptions = mapConfigToOverlayOptions(config, options.hostActions, initialContext);\n const controller = await initOverlayWidgets(overlayOptions);\n\n if (options.contextResolver !== undefined) {\n const resolver = options.contextResolver;\n window.addEventListener('gengage:context:update', () => {\n const ctx = resolver();\n void controller.updateContext(ctx);\n });\n }\n\n return controller;\n}\n"],"names":["WidgetToggleSchema","z.object","z.boolean","MountSelectorsSchema","z.string","TransportSchema","AnalyticsAuthModeSchema","z.enum","AnalyticsAuthSchema","AnalyticsSchema","z.number","DEFAULT_IDEMPOTENCY_KEY","GTMSchema","UnknownActionPolicySchema","ActionHandlingSchema","AccountRuntimeConfigSchema","z.literal","parseAccountRuntimeConfig","input","safeParseAccountRuntimeConfig","createDefaultAccountRuntimeConfig","params","DEFAULT_OVERLAY_KEY_PREFIX","DEFAULT_QNA_MOUNT","DEFAULT_SIMREL_MOUNT","getOverlayRegistry","win","buildInitialPageContext","options","base","incoming","mergePageContext","current","patch","next","resolveMountTarget","target","buildOverlayKey","OverlayWidgetsRuntime","onDestroy","resolveSession","wireQNAToChat","sku","pageType","middlewareUrl","config","GengageChat","qnaTarget","mountTarget","qna","GengageQNA","qnaConfig","simRelTarget","simrel","GengageSimRel","simRelConfig","url","productSku","sessionId","fn","initOverlayWidgets","key","registry","existing","pending","runtime","liveRegistry","runtimeInit","err","getOverlayWidgets","idempotencyKey","destroyOverlayWidgets","buildOverlayIdempotencyKey","accountId","DEFAULT_ANALYTICS_CONFIG","DEFAULT_AUTH","AnalyticsClient","envelope","normalizeAnalyticsInput","batch","body","endpoint","resolveAnalyticsEndpoint","preferBeacon","events","attempt","payload","hasSendBeacon","headers","controller","timeout","requestInit","createAnalyticsClient","baseUrl","normalizeMiddlewareUrl","normalizedEndpoint","BASE_WIDGET_THEME","withBaseTheme","overrides","DEFAULT_CUSTOMIZATION_LOCALE","createAccountIdentity","createFloatingChatConfig","createPdpQnaConfig","createPdpSimRelConfig","createDefaultAnalyticsConfig","isValidSelector","selector","preflightDiagnostics","warnings","mounts","mountEntries","widget","w","parseConfig","raw","result","messages","i","mapConfigToOverlayOptions","hostActions","initialContext","initGengageClient","errors","e","overlayOptions","resolver","ctx"],"mappings":";;;;;;AAEA,MAAMA,IAAqBC,EAAS;AAAA,EAClC,SAASC,IAAY,QAAQ,EAAI;AACnC,CAAC,GAEKC,IAAuBF,EAAS;AAAA,EACpC,MAAMG,EAAE,EAAS,SAAA;AAAA,EACjB,KAAKA,EAAE,EAAS,SAAA;AAAA,EAChB,QAAQA,EAAE,EAAS,SAAA;AACrB,CAAC,GAEKC,IAAkBJ,EAAS,EAAE,GAEtBK,IAA0BC,EAAO,CAAC,QAAQ,oBAAoB,iBAAiB,cAAc,CAAC,GAErGC,IAAsBP,EAAS;AAAA,EACnC,MAAMK,EAAwB,QAAQ,MAAM;AAAA,EAC5C,KAAKF,EAAE,EAAS,SAAA;AAAA,EAChB,YAAYA,EAAE,EAAS,SAAA;AAAA,EACvB,WAAWA,IAAW,QAAQ,SAAS;AACzC,CAAC,GAEKK,IAAkBR,EAAS;AAAA,EAC/B,SAASC,EAAE,EAAU,QAAQ,EAAI;AAAA,EACjC,UAAUE,EAAE,EAAS,QAAQ,YAAY;AAAA,EACzC,MAAMI,EAAoB,QAAQ,EAAE,MAAM,QAAQ,WAAW,WAAW;AAAA,EACxE,eAAeN,EAAE,EAAU,QAAQ,EAAI;AAAA,EACvC,WAAWA,EAAE,EAAU,QAAQ,EAAI;AAAA,EACnC,gBAAgBA,EAAE,EAAU,QAAQ,EAAI;AAAA,EACxC,WAAWQ,EAAE,EAAS,MAAM,SAAA,EAAW,QAAQ,GAAI;AAAA,EACnD,YAAYA,EAAE,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AACtD,CAAC,GAEYC,IAA0B,wBAEjCC,IAAYX,EAAS;AAAA,EACzB,gBAAgBG,EAAE,EAAS,QAAQO,CAAuB;AAAA,EAC1D,iBAAiBT,IAAY,QAAQ,EAAI;AAC3C,CAAC,GAEYW,IAA4BN,EAAO,CAAC,kBAAkB,SAAS,UAAU,CAAC,GAEjFO,IAAuBb,EAAS;AAAA,EACpC,qBAAqBY,EAA0B,QAAQ,gBAAgB;AAAA,EACvE,iBAAiBX,IAAY,QAAQ,EAAI;AAC3C,CAAC,GAEYa,IAA6Bd,EAAS;AAAA,EACjD,SAASe,EAAU,GAAG;AAAA,EACtB,WAAWZ,EAAE,EAAS,IAAI,CAAC;AAAA,EAC3B,eAAeA,EAAE,EAAS,IAAA;AAAA,EAC1B,QAAQA,EAAE,EAAS,SAAA;AAAA,EACnB,SAASH,EAAS;AAAA,IAChB,MAAMD,EAAmB,QAAQ,EAAE,SAAS,IAAM;AAAA,IAClD,KAAKA,EAAmB,QAAQ,EAAE,SAAS,IAAM;AAAA,IACjD,QAAQA,EAAmB,QAAQ,EAAE,SAAS,IAAM;AAAA,EAAA,CACrD;AAAA,EACD,QAAQG,EAAqB,QAAQ,EAAE;AAAA,EACvC,WAAWE,EAAgB,QAAQ,EAAE;AAAA,EACrC,WAAWI,EAAgB,QAAQ;AAAA,IACjC,SAAS;AAAA,IACT,UAAU;AAAA,IACV,MAAM,EAAE,MAAM,QAAQ,WAAW,UAAA;AAAA,IACjC,eAAe;AAAA,IACf,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,YAAY;AAAA,EAAA,CACb;AAAA,EACD,KAAKG,EAAU,QAAQ;AAAA,IACrB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EAAA,CAClB;AAAA,EACD,gBAAgBE,EAAqB,QAAQ;AAAA,IAC3C,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,EAAA,CAClB;AACH,CAAC;AAMM,SAASG,EAA0BC,GAAsC;AAC9E,SAAOH,EAA2B,MAAMG,CAAK;AAC/C;AAEO,SAASC,EAA8BD,GAAyE;AACrH,SAAOH,EAA2B,UAAUG,CAAK;AACnD;AAEO,SAASE,GAAkCC,GAIzB;AACvB,SAAOJ,EAA0B;AAAA,IAC/B,SAAS;AAAA,IACT,WAAWI,EAAO;AAAA,IAClB,eAAeA,EAAO;AAAA,IACtB,QAAQA,EAAO;AAAA,IACf,SAAS;AAAA,MACP,MAAM,EAAE,SAAS,GAAA;AAAA,MACjB,KAAK,EAAE,SAAS,GAAA;AAAA,MAChB,QAAQ,EAAE,SAAS,GAAA;AAAA,IAAK;AAAA,EAC1B,CACD;AACH;ACjGA,MAAMC,IAA6B,GAAGX,CAAuB,aACvDY,IAAoB,gBACpBC,IAAuB;AAW7B,SAASC,IAA2C;AAClD,QAAMC,IAAM;AACZ,SAAKA,EAAI,6BACPA,EAAI,2BAA2B;AAAA,IAC7B,WAAW,CAAA;AAAA,IACX,SAAS,CAAA;AAAA,EAAC,IAGPA,EAAI;AACb;AAEA,SAASC,EAAwBC,GAA6C;AAC5E,QAAMC,IAAoB;AAAA,IACxB,UAAUD,EAAQ,aAAa,aAAaA,EAAQ,QAAQ,SAAY,QAAQ;AAAA,EAAA,GAG5EE,IAAWF,EAAQ;AACzB,SAAIE,GAAU,QAAQ,WAAWD,EAAK,MAAMC,EAAS,MACjDA,GAAU,UAAU,WAAWD,EAAK,QAAQC,EAAS,QACrDA,GAAU,iBAAiB,WAAWD,EAAK,eAAeC,EAAS,eACnEA,GAAU,QAAQ,WAAWD,EAAK,MAAMC,EAAS,MACjDA,GAAU,UAAU,WAAWD,EAAK,QAAQC,EAAS,QAErDF,EAAQ,QAAQ,WAClBC,EAAK,MAAMD,EAAQ,MAGdC;AACT;AAEA,SAASE,EAAiBC,GAAsBC,GAA0C;AACxF,QAAMC,IAAoB;AAAA,IACxB,GAAGF;AAAA,IACH,GAAGC;AAAA,IACH,UAAUA,EAAM,YAAYD,EAAQ;AAAA,EAAA;AAEtC,SAAIC,EAAM,QAAQ,UAAaD,EAAQ,QAAQ,WAC7CE,EAAK,MAAMF,EAAQ,MAEdE;AACT;AAEA,SAASC,EAAmBC,GAA2D;AAErF,SADIA,aAAkB,eAClB,SAAS,cAAcA,CAAM,IAAUA,IACpC;AACT;AAEA,SAASC,EAAgBT,GAAwC;AAC/D,SAAOA,EAAQ,kBAAkB,GAAGN,CAA0B,GAAGM,EAAQ,SAAS;AACpF;AAyDA,MAAMU,EAA0D;AAAA,EAa9D,YACmBV,GACAW,GACjB;AAFiB,SAAA,UAAAX,GACA,KAAA,YAAAW,GAdnB,KAAQ,QAA4B,MACpC,KAAQ,OAA0B,MAClC,KAAQ,UAAgC,MAExC,KAAQ,aAAa,IACrB,KAAQ,SAAwB,QAAQ,QAAA,GACxC,KAAQ,yBAAyB,IACjC,KAAQ,4BAA4B,IASlC,KAAK,iBAAiBF,EAAgBT,CAAO,GAC7C,KAAK,UAAUY,EAAeZ,EAAQ,OAAO,GAC7C,KAAK,eAAeD,EAAwBC,CAAO;AAAA,EACrD;AAAA,EAEA,IAAI,OAA2B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,MAAyB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAA+B;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAsB;AAC1B,IAAK,OAAO,YAAS,OAAO,UAAU,CAAA,IACtC,OAAO,QAAQ,YAAY,KAAK,QAAQ,WACxC,OAAO,QAAQ,cAAc,KAAK,cAElC,MAAM,KAAK,UAAA,GACX,MAAM,KAAK,gBAAA,GAEP,KAAK,QAAQ,kBAAkB,MACjCa,EAAA,GAGF,OAAO,QAAQ,UAAU;AAAA,EAC3B;AAAA,EAEA,SAASb,GAA6C;AACpD,SAAK,OAAO,KAAKA,CAAO;AAAA,EAC1B;AAAA,EAEA,YAAkB;AAChB,SAAK,OAAO,MAAA;AAAA,EACd;AAAA,EAEA,MAAM,cAAcK,GAA4C;AAC9D,IAAI,KAAK,cACT,MAAM,KAAK,SAAS,YAAY;AAC9B,WAAK,eAAeF,EAAiB,KAAK,cAAcE,CAAK,GAExD,OAAO,YAAS,OAAO,UAAU,CAAA,IACtC,OAAO,QAAQ,cAAc,KAAK,cAElC,KAAK,OAAO,OAAOA,CAAK,GACxB,KAAK,MAAM,OAAOA,CAAK,GACvB,KAAK,SAAS,OAAOA,CAAK,GAC1B,MAAM,KAAK,gBAAA;AAAA,IACb,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAUS,GAAaC,IAAoC,OAAsB;AACrF,UAAM,KAAK,cAAc,EAAE,KAAAD,GAAK,UAAAC,GAAU;AAAA,EAC5C;AAAA,EAEA,UAAgB;AACd,IAAI,KAAK,eACT,KAAK,aAAa,IAElB,KAAK,OAAO,QAAA,GACZ,KAAK,MAAM,QAAA,GACX,KAAK,SAAS,QAAA,GAEd,KAAK,QAAQ,MACb,KAAK,OAAO,MACZ,KAAK,UAAU,MAEX,OAAO,SAAS,YAAY,QAC9B,OAAO,OAAO,QAAQ,SAGxB,KAAK,UAAA;AAAA,EACP;AAAA,EAEA,MAAc,YAA2B;AACvC,QAAI,KAAK,QAAQ,MAAM,YAAY,GAAO;AAE1C,UAAMC,IAAgB,KAAK,QAAQ,eAE7BC,IAA2B;AAAA,MAC/B,WAAW,KAAK,QAAQ;AAAA,MACxB,eAAAD;AAAA,MACA,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,SAAS,KAAK,QAAQ,MAAM,WAAW;AAAA,IAAA;AAGzC,IAAI,KAAK,QAAQ,UAAU,WAAWC,EAAO,QAAQ,KAAK,QAAQ,QAC9D,KAAK,QAAQ,WAAW,WAAWA,EAAO,SAAS,KAAK,QAAQ,SAChE,KAAK,QAAQ,MAAM,gBAAgB,WAAWA,EAAO,cAAc,KAAK,QAAQ,KAAK,cACrF,KAAK,QAAQ,MAAM,gBAAgB,WAAWA,EAAO,cAAc,KAAK,QAAQ,KAAK,cACrF,KAAK,QAAQ,MAAM,uBAAuB,WAC5CA,EAAO,qBAAqB,KAAK,QAAQ,KAAK,qBAE5C,KAAK,QAAQ,MAAM,qBAAqB,WAC1CA,EAAO,mBAAmB,KAAK,QAAQ,KAAK,mBAE1C,KAAK,QAAQ,MAAM,uBAAuB,WAC5CA,EAAO,qBAAqB,KAAK,QAAQ,KAAK,qBAE5C,KAAK,QAAQ,MAAM,SAAS,WAAWA,EAAO,OAAO,KAAK,QAAQ,KAAK,OACvE,KAAK,QAAQ,MAAM,mBAAmB,WACxCA,EAAO,iBAAiB,KAAK,QAAQ,KAAK,iBAG5C,KAAK,QAAQ,IAAIC,EAAA,GACjB,MAAM,KAAK,MAAM,KAAKD,CAAM;AAAA,EAC9B;AAAA,EAEA,MAAc,kBAAiC;AAC7C,QAAI,KAAK,WAAY;AACrB,UAAMH,IAAM,KAAK,aAAa;AAG9B,QAAI,EAFU,KAAK,aAAa,aAAa,SAASA,MAAQ,UAAaA,EAAI,SAAS,IAE5E;AACV,WAAK,mBAAA;AACL;AAAA,IACF;AAEA,UAAME,IAAgB,KAAK,QAAQ;AAEnC,QAAI,KAAK,QAAQ,KAAK,YAAY,IAAO;AACvC,YAAMG,IAAY,KAAK,QAAQ,KAAK,eAAexB,GAC7CyB,IAAcb,EAAmBY,CAAS;AAEhD,UAAIC;AAEF,YADA,KAAK,yBAAyB,IACzB,KAAK;AAoBR,eAAK,KAAK,KAAA,GACV,KAAK,KAAK,OAAO,EAAE,UAAU,OAAO,KAAAN,GAAK;AAAA,aArB3B;AACd,gBAAMO,IAAM,IAAIC,EAAA,GACVC,IAA6B;AAAA,YACjC,WAAW,KAAK,QAAQ;AAAA,YACxB,eAAAP;AAAA,YACA,SAAS,KAAK;AAAA,YACd,aAAa;AAAA,cACX,UAAU;AAAA,cACV,KAAAF;AAAA,YAAA;AAAA,YAEF,aAAAM;AAAA,UAAA;AAEF,UAAI,KAAK,QAAQ,UAAU,WAAWG,EAAU,QAAQ,KAAK,QAAQ,QACjE,KAAK,QAAQ,KAAK,YAAY,WAAWA,EAAU,UAAU,KAAK,QAAQ,IAAI,UAC9E,KAAK,QAAQ,KAAK,qBAAqB,WACzCA,EAAU,mBAAmB,KAAK,QAAQ,IAAI,mBAEhD,MAAMF,EAAI,KAAKE,CAAS,GACxB,KAAK,OAAOF;AAAA,QACd;AAAA;AAKA,aAAK,MAAM,QAAA,GACX,KAAK,OAAO,MACP,KAAK,2BACR,QAAQ,KAAK,yCAAyCF,CAAS,EAAE,GACjE,KAAK,yBAAyB;AAAA,IAGpC;AACE,WAAK,MAAM,QAAA,GACX,KAAK,OAAO;AAGd,QAAI,KAAK,QAAQ,QAAQ,YAAY,IAAO;AAC1C,YAAMK,IAAe,KAAK,QAAQ,QAAQ,eAAe5B,GACnDwB,IAAcb,EAAmBiB,CAAY;AAEnD,UAAIJ;AAEF,YADA,KAAK,4BAA4B,IAC5B,KAAK;AA2BR,eAAK,QAAQ,KAAA,GACb,KAAK,QAAQ,OAAO,EAAE,UAAU,OAAO,KAAAN,GAAK;AAAA,aA5B3B;AACjB,gBAAMW,IAAS,IAAIC,EAAA,GACbC,IAAmC;AAAA,YACvC,WAAW,KAAK,QAAQ;AAAA,YACxB,eAAAX;AAAA,YACA,SAAS,KAAK;AAAA,YACd,KAAAF;AAAA,YACA,aAAAM;AAAA,UAAA;AAEF,UAAI,KAAK,QAAQ,UAAU,WAAWO,EAAa,QAAQ,KAAK,QAAQ,QACpE,KAAK,QAAQ,QAAQ,iBAAiB,WACxCA,EAAa,eAAe,KAAK,QAAQ,OAAO,eAE9C,KAAK,QAAQ,gBAAgB,WAC/BA,EAAa,cAAc,KAAK,QAAQ,cAEtC,KAAK,QAAQ,sBAAsB,SACrCA,EAAa,oBAAoB,KAAK,QAAQ,oBAE9CA,EAAa,oBAAoB,CAACC,GAAKC,GAAYC,MAAc;AAC/D,iBAAK,OAAO,YAAYA,KAAa,KAAK,QAAQ,WAAWD,CAAU,GACvE,OAAO,SAAS,OAAOD;AAAA,UACzB,GAEF,MAAMH,EAAO,KAAKE,CAAY,GAC9B,KAAK,UAAUF;AAAA,QACjB;AAAA;AAKA,aAAK,SAAS,QAAA,GACd,KAAK,UAAU,MACV,KAAK,8BACR,QAAQ,KAAK,4CAA4CD,CAAY,EAAE,GACvE,KAAK,4BAA4B;AAAA,IAGvC;AACE,WAAK,SAAS,QAAA,GACd,KAAK,UAAU;AAAA,EAEnB;AAAA,EAEQ,qBAA2B;AACjC,SAAK,MAAM,QAAA,GACX,KAAK,SAAS,QAAA,GACd,KAAK,OAAO,MACZ,KAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,SAASO,GAAwC;AACvD,UAAMzB,IAAO,KAAK,OAAO,KAAKyB,CAAE;AAChC,gBAAK,SAASzB,EAAK,MAAM,MAAA;AAAA,KAAe,GACjCA;AAAA,EACT;AACF;AAEA,eAAsB0B,EAAmBhC,GAAmE;AAC1G,QAAMiC,IAAMxB,EAAgBT,CAAO,GAC7BkC,IAAWrC,EAAA,GAEXsC,IAAWD,EAAS,UAAUD,CAAG;AACvC,MAAIE,EAAU,QAAOA;AAErB,QAAMC,IAAUF,EAAS,QAAQD,CAAG;AACpC,MAAIG,EAAS,QAAOA;AAEpB,QAAMC,IAAU,IAAI3B,EAAsBV,GAAS,MAAM;AACvD,UAAMsC,IAAezC,EAAA;AACrB,WAAOyC,EAAa,UAAUL,CAAG,GACjC,OAAOK,EAAa,QAAQL,CAAG;AAAA,EACjC,CAAC,GAEKM,IAAcF,EACjB,KAAA,EACA,KAAK,OACJH,EAAS,UAAUD,CAAG,IAAII,GAC1B,OAAOH,EAAS,QAAQD,CAAG,GACpBI,EACR,EACA,MAAM,CAACG,MAAQ;AACd,iBAAON,EAAS,QAAQD,CAAG,GACrBO;AAAA,EACR,CAAC;AAEH,SAAAN,EAAS,QAAQD,CAAG,IAAIM,GACjBA;AACT;AAEO,SAASE,EAAkBC,GAAyD;AAEzF,SADiB7C,EAAA,EACD,UAAU6C,CAAc,KAAK;AAC/C;AAEO,SAASC,GAAsBD,GAA8B;AAElE,EADmBD,EAAkBC,CAAc,GACvC,QAAA;AACd;AAEO,SAASE,GAA2BC,GAA2B;AACpE,SAAO,GAAGnD,CAA0B,GAAGmD,CAAS;AAClD;ACxXA,MAAMC,IAA4F;AAAA,EAChG,SAAS;AAAA,EACT,UAAU;AAAA,EACV,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,iBAAiB;AACnB,GAEMC,IAA8C;AAAA,EAClD,MAAM;AAAA,EACN,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,WAAW;AACb;AAEO,MAAMC,EAAgB;AAAA,EAM3B,YAAY/B,GAA+B;AAJ3C,SAAiB,QAA6B,CAAA,GAC9C,KAAQ,aAAmD,MAIzD,KAAK,SAAS;AAAA,MACZ,GAAG6B;AAAA,MACH,GAAG7B;AAAA,MACH,MAAM;AAAA,QACJ,GAAG8B;AAAA,QACH,GAAI9B,EAAO,QAAQ,CAAA;AAAA,MAAC;AAAA,IACtB,GAGF,KAAK,kBAAkB,MAAM;AAC3B,MAAI,KAAK,MAAM,WAAW,KACrB,KAAK,SAAS,EAAE,cAAc,IAAM;AAAA,IAC3C,GAEI,OAAO,SAAW,OACpB,OAAO,iBAAiB,YAAY,KAAK,eAAe;AAAA,EAE5D;AAAA,EAEA,MAAM3B,GAA6B;AACjC,QAAI,CAAC,KAAK,OAAO,QAAS;AAC1B,UAAM2D,IAAWC,EAAwB5D,CAAK;AAG9C,QAFA,KAAK,MAAM,KAAK2D,CAAQ,GAEpB,KAAK,MAAM,UAAU,KAAK,OAAO,WAAW;AAC9C,WAAK,uBAAA;AACL;AAAA,IACF;AAEA,SAAK,cAAA;AAAA,EACP;AAAA,EAEA,MAAM,MAAMjD,IAAsC,IAAmB;AACnE,QAAI,CAAC,KAAK,OAAO,WAAW,KAAK,MAAM,WAAW,EAAG;AAErD,UAAMmD,IAAQ,KAAK,MAAM,OAAO,GAAG,KAAK,OAAO,SAAS,GAClDC,IAAO,KAAK,mBAAmBD,CAAK,GACpCE,IAAWC,EAAyB,KAAK,OAAO,UAAU,KAAK,OAAO,aAAa,GACnFC,IAAevD,EAAQ,gBAAgB,KAAK,OAAO;AAEzD,UAAM,KAAK,cAAcqD,GAAUD,GAAMG,CAAY;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,SAASvD,IAAsC,IAAmB;AACtE,WAAO,KAAK,MAAM,SAAS;AACzB,YAAM,KAAK,MAAMA,CAAO;AAAA,EAE5B;AAAA,EAEA,UAAgB;AACd,IAAI,KAAK,eACP,aAAa,KAAK,UAAU,GAC5B,KAAK,aAAa,OAEhB,OAAO,SAAW,OACpB,OAAO,oBAAoB,YAAY,KAAK,eAAe;AAAA,EAE/D;AAAA,EAEQ,gBAAsB;AAC5B,IAAI,KAAK,eACT,KAAK,aAAa,WAAW,MAAM;AACjC,WAAK,aAAa,MACb,KAAK,MAAA;AAAA,IACZ,GAAG,KAAK,OAAO,eAAe;AAAA,EAChC;AAAA,EAEQ,yBAA+B;AACrC,IAAI,KAAK,eACP,aAAa,KAAK,UAAU,GAC5B,KAAK,aAAa,OAEf,KAAK,MAAA;AAAA,EACZ;AAAA,EAEQ,mBAAmBwD,GAAqD;AAC9E,UAAMJ,IAA+B,EAAE,QAAAI,EAAA;AACvC,WAAI,KAAK,OAAO,KAAK,SAAS,kBAAkB,KAAK,OAAO,KAAK,QAC/DJ,EAAK,KAAK,OAAO,KAAK,SAAS,IAAI,KAAK,OAAO,KAAK,MAE/CA;AAAA,EACT;AAAA,EAEA,MAAc,cAAcC,GAAkBD,GAA8BG,GAAsC;AAChH,QAAIE,IAAU;AACd,WAAOA,KAAW,KAAK,OAAO,cAAY;AACxC,MAAAA,KAAW;AACX,UAAI;AAEF,YADa,MAAM,KAAK,KAAKJ,GAAUD,GAAMG,CAAY,EAC/C;AAAA,MACZ,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,KAAKF,GAAkBD,GAA8BG,GAAyC;AAC1G,UAAMG,IAAU,KAAK,UAAUN,CAAI;AAQnC,QANEG,KACA,KAAK,OAAO,aACZ,KAAK,OAAO,KAAK,SAAS,sBAC1B,KAAK,OAAO,KAAK,SAAS,mBAC1BI,EAAA,KAGW,UAAU,WAAWN,GAAUK,CAAO;AACzC,aAAO;AAGjB,QAAI,OAAO,QAAU,IAAa,QAAO;AAEzC,UAAME,IAAkC;AAAA,MACtC,gBAAgB;AAAA,IAAA;AAElB,IAAI,KAAK,OAAO,KAAK,SAAS,sBAAsB,KAAK,OAAO,KAAK,QACnEA,EAAQ,KAAK,OAAO,KAAK,UAAU,IAAI,KAAK,OAAO,KAAK,MAEtD,KAAK,OAAO,KAAK,SAAS,mBAAmB,KAAK,OAAO,KAAK,QAChEA,EAAQ,gBAAgB,UAAU,KAAK,OAAO,KAAK,GAAG;AAGxD,UAAMC,IAAa,OAAO,kBAAoB,MAAc,IAAI,oBAAoB,MAC9EC,IAAUD,IAAa,WAAW,MAAMA,EAAW,SAAS,KAAK,OAAO,SAAS,IAAI;AAE3F,QAAI;AACF,YAAME,IAA2B;AAAA,QAC/B,QAAQ;AAAA,QACR,SAAAH;AAAA,QACA,MAAMF;AAAA,QACN,WAAW,KAAK,OAAO,kBAAkB,KAAK,OAAO;AAAA,MAAA;AAEvD,aAAIG,MACFE,EAAY,SAASF,EAAW,UAEjB,MAAM,MAAMR,GAAUU,CAAW,GAClC;AAAA,IAClB,UAAA;AACE,MAAID,kBAAsBA,CAAO;AAAA,IACnC;AAAA,EACF;AACF;AAEO,SAASE,GAAsB/C,GAAgD;AACpF,SAAO,IAAI+B,EAAgB/B,CAAM;AACnC;AAEA,SAASiC,EAAwB5D,GAA0C;AACzE,QAAM2D,IAA8B;AAAA,IAClC,YAAY3D,EAAM;AAAA,IAClB,eAAeA,EAAM,iBAAiB;AAAA,IACtC,cAAcA,EAAM,gBAAgB,KAAK,IAAA;AAAA,IACzC,YAAYA,EAAM;AAAA,IAClB,YAAYA,EAAM;AAAA,IAClB,gBAAgBA,EAAM;AAAA,IACtB,SAASA,EAAM;AAAA,EAAA;AAGjB,SAAIA,EAAM,YAAY,WAAW2D,EAAS,UAAU3D,EAAM,UACtDA,EAAM,YAAY,WAAW2D,EAAS,UAAU3D,EAAM,UACtDA,EAAM,WAAW,WAAW2D,EAAS,SAAS3D,EAAM,SACpDA,EAAM,cAAc,WAAW2D,EAAS,YAAY3D,EAAM,YAC1DA,EAAM,QAAQ,WAAW2D,EAAS,MAAM3D,EAAM,MAE3C2D;AACT;AAEA,SAASK,EAAyBD,GAAkBrC,GAA+B;AACjF,MAAI,gBAAgB,KAAKqC,CAAQ,EAAG,QAAOA;AAC3C,QAAMY,IAAUC,EAAuBlD,CAAa,GAC9CmD,IAAqBd,EAAS,WAAW,GAAG,IAAIA,IAAW,IAAIA,CAAQ;AAC7E,SAAO,GAAGY,CAAO,GAAGE,CAAkB;AACxC;AAEA,SAASR,IAAyB;AAChC,SAAO,OAAO,YAAc,OAAe,OAAO,UAAU,cAAe;AAC7E;AClPO,MAAMS,KAAiC;AAAA,EAC5C,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EAER,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,mCAAmC;AAAA,EACnC,+BAA+B;AAAA,EAE/B,wBAAwB;AAAA,EACxB,+BAA+B;AAAA,EAC/B,gCAAgC;AAAA,EAChC,qCAAqC;AAAA,EACrC,kCAAkC;AAAA,EAClC,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,gCAAgC;AAClC;AAQO,SAASC,GAAcC,GAAqC;AACjE,SAAO,EAAE,GAAGF,IAAmB,GAAGE,EAAA;AACpC;ACtCO,MAAMC,IAA+B;AAsDrC,SAASC,GAAsBvD,GAAgD;AACpF,SAAO;AAAA,IACL,YAAYA,EAAO;AAAA,IACnB,gBAAgBA,EAAO;AAAA,IACvB,QAAQA,EAAO,UAAUsD;AAAA,EAAA;AAE7B;AAMO,SAASE,GACdnF,GACAgF,IAAyC,IACvB;AAClB,QAAMrD,IAA2B;AAAA,IAC/B,WAAW3B,EAAM;AAAA,IACjB,eAAeA,EAAM;AAAA,IACrB,SAAS,EAAE,WAAWA,EAAM,UAAA;AAAA,IAC5B,SAAS;AAAA,IACT,QAAQA,EAAM,UAAUiF;AAAA,IACxB,GAAGD;AAAA,EAAA;AAEL,SAAIhF,EAAM,UAAU,WAClB2B,EAAO,QAAQ3B,EAAM,QAEhB2B;AACT;AAKO,SAASyD,GAAmBpF,GAA0BgF,IAAmC,IAAqB;AACnH,QAAMrD,IAA0B;AAAA,IAC9B,WAAW3B,EAAM;AAAA,IACjB,eAAeA,EAAM;AAAA,IACrB,SAAS,EAAE,WAAWA,EAAM,UAAA;AAAA,IAC5B,aAAa,EAAE,UAAU,OAAO,KAAKA,EAAM,IAAA;AAAA,IAC3C,aAAaA,EAAM;AAAA,IACnB,GAAGgF;AAAA,EAAA;AAEL,SAAIhF,EAAM,UAAU,WAClB2B,EAAO,QAAQ3B,EAAM,QAEhB2B;AACT;AAMO,SAAS0D,GACdrF,GACAgF,IAAsC,IACjB;AACrB,QAAMrD,IAA8B;AAAA,IAClC,WAAW3B,EAAM;AAAA,IACjB,eAAeA,EAAM;AAAA,IACrB,SAAS,EAAE,WAAWA,EAAM,UAAA;AAAA,IAC5B,KAAKA,EAAM;AAAA,IACX,aAAaA,EAAM;AAAA,IACnB,GAAGgF;AAAA,EAAA;AAEL,SAAIhF,EAAM,UAAU,WAClB2B,EAAO,QAAQ3B,EAAM,QAEhB2B;AACT;AAKO,SAAS2D,GACd5D,GACAsD,IAA6C,IACtB;AACvB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,eAAAtD;AAAA,IACA,UAAU;AAAA,IACV,eAAe;AAAA,IACf,WAAW;AAAA,IACX,GAAGsD;AAAA,EAAA;AAEP;ACpIA,SAASO,GAAgBC,GAA2B;AAClD,MAAI;AACF,oBAAS,cAAcA,CAAQ,GACxB;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAASC,GAAqB9D,GAA+C;AAClF,QAAM+D,IAA+B,CAAA,GAE/BC,IAAShE,EAAO,QAChBiE,IAAoD;AAAA,IACxD,CAAC,OAAOD,EAAO,GAAG;AAAA,IAClB,CAAC,UAAUA,EAAO,MAAM;AAAA,IACxB,CAAC,QAAQA,EAAO,IAAI;AAAA,EAAA;AAGtB,aAAW,CAACE,GAAQL,CAAQ,KAAKI;AAC/B,QAAIJ,MAAa,QAEjB;AAAA,UAAI,CAACD,GAAgBC,CAAQ,GAAG;AAC9B,QAAAE,EAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,uBAAuBG,CAAM,oCAAoCL,CAAQ;AAAA,UAClF,UAAU;AAAA,QAAA,CACX;AACD;AAAA,MACF;AAEA,MAAK,SAAS,cAAcA,CAAQ,KAClCE,EAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,uBAAuBG,CAAM,6BAA6BL,CAAQ;AAAA,QAC3E,UAAU;AAAA,MAAA,CACX;AAAA;AAIL,QAAMpC,IAAiBzB,EAAO,IAAI;AAClC,EAAK,OAA8CyB,CAAc,MAAM,UACrEsC,EAAS,KAAK;AAAA,IACZ,MAAM;AAAA,IACN,SAAS,+BAA+BtC,CAAc;AAAA,IACtD,UAAU;AAAA,EAAA,CACX;AAGH,aAAW0C,KAAKJ;AACd,IAAII,EAAE,aAAa,UACjB,QAAQ,MAAMA,EAAE,OAAO,IAEvB,QAAQ,KAAKA,EAAE,OAAO;AAI1B,SAAO;AAAA,IACL,IAAIJ,EAAS,MAAM,CAACI,MAAMA,EAAE,aAAa,OAAO;AAAA,IAChD,UAAAJ;AAAA,EAAA;AAEJ;ACtDA,SAASK,GAAYC,GAA2D;AAC9E,QAAMC,IAAShG,EAA8B+F,CAAG;AAChD,MAAI,CAACC,EAAO,SAAS;AACnB,UAAMC,IAAWD,EAAO,MAAM,OAAO,IAAI,CAACE,MAAM,GAAGA,EAAE,KAAK,KAAK,GAAG,CAAC,KAAKA,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAC9F,UAAM,IAAI,MAAM,qCAAqCD,CAAQ,EAAE;AAAA,EACjE;AACA,SAAOD,EAAO;AAChB;AAEA,SAASG,GACPzE,GACA0E,GACAC,GACuB;AACvB,QAAM5F,IAAiC;AAAA,IACrC,WAAWiB,EAAO;AAAA,IAClB,eAAeA,EAAO;AAAA,IACtB,gBAAgBA,EAAO,IAAI;AAAA,EAAA;AAG7B,SAAIA,EAAO,WAAW,WAAWjB,EAAQ,SAASiB,EAAO,SAErD2E,MAAmB,WACrB5F,EAAQ,cAAc4F,GAClBA,EAAe,QAAQ,WAAW5F,EAAQ,MAAM4F,EAAe,OAGrE5F,EAAQ,OAAO;AAAA,IACb,SAASiB,EAAO,QAAQ,KAAK;AAAA,EAAA,GAE3BA,EAAO,OAAO,SAAS,WACzBjB,EAAQ,KAAK,cAAciB,EAAO,OAAO,OAG3CjB,EAAQ,MAAM;AAAA,IACZ,SAASiB,EAAO,QAAQ,IAAI;AAAA,EAAA,GAE1BA,EAAO,OAAO,QAAQ,WACxBjB,EAAQ,IAAI,cAAciB,EAAO,OAAO,MAG1CjB,EAAQ,SAAS;AAAA,IACf,SAASiB,EAAO,QAAQ,OAAO;AAAA,EAAA,GAE7BA,EAAO,OAAO,WAAW,WAC3BjB,EAAQ,OAAO,cAAciB,EAAO,OAAO,SAGzC0E,GAAa,gBAAgB,WAC/B3F,EAAQ,cAAc2F,EAAY,cAGhCA,GAAa,sBAAsB,WACrC3F,EAAQ,oBAAoB2F,EAAY,oBAGnC3F;AACT;AAEA,eAAsB6F,GAAkB7F,GAAkE;AACxG,QAAMiB,IAASoE,GAAYrF,EAAQ,aAAa;AAEhD,MAAIA,EAAQ,cAAc,IAAO;AAC/B,UAAMuF,IAASR,GAAqB9D,CAAM;AAC1C,QAAI,CAACsE,EAAO,IAAI;AACd,YAAMO,IAASP,EAAO,SAAS,OAAO,CAACH,MAAMA,EAAE,aAAa,OAAO;AACnE,YAAM,IAAI,MAAM,+BAA+BU,EAAO,IAAI,CAACC,MAAMA,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1F;AAAA,EACF;AAEA,QAAMH,IAAiB5F,EAAQ,kBAAA,GAEzBgG,IAAiBN,GAA0BzE,GAAQjB,EAAQ,aAAa4F,CAAc,GACtF/B,IAAa,MAAM7B,EAAmBgE,CAAc;AAE1D,MAAIhG,EAAQ,oBAAoB,QAAW;AACzC,UAAMiG,IAAWjG,EAAQ;AACzB,WAAO,iBAAiB,0BAA0B,MAAM;AACtD,YAAMkG,IAAMD,EAAA;AACZ,MAAKpC,EAAW,cAAcqC,CAAG;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,SAAOrC;AACT;"}
|