@appfunnel-dev/sdk 0.6.0 → 0.8.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/README.md +2 -80
- package/dist/{chunk-BUF5FDKC.cjs → chunk-EVUYCLVY.cjs} +42 -19
- package/dist/chunk-EVUYCLVY.cjs.map +1 -0
- package/dist/{chunk-E6KSJ5UI.js → chunk-H3KHXZSI.js} +42 -20
- package/dist/chunk-H3KHXZSI.js.map +1 -0
- package/dist/chunk-P4SLDMWY.js +104 -0
- package/dist/chunk-P4SLDMWY.js.map +1 -0
- package/dist/chunk-XP44I2MU.cjs +108 -0
- package/dist/chunk-XP44I2MU.cjs.map +1 -0
- package/dist/elements/index.cjs +12217 -0
- package/dist/elements/index.cjs.map +1 -0
- package/dist/elements/index.d.cts +620 -0
- package/dist/elements/index.d.ts +620 -0
- package/dist/elements/index.js +12181 -0
- package/dist/elements/index.js.map +1 -0
- package/dist/index.cjs +958 -150
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +75 -5
- package/dist/index.d.ts +75 -5
- package/dist/index.js +928 -131
- package/dist/index.js.map +1 -1
- package/dist/{internal-BlgQ9C2d.d.cts → internal-C9MOEdND.d.cts} +12 -12
- package/dist/{internal-BlgQ9C2d.d.ts → internal-C9MOEdND.d.ts} +12 -12
- package/dist/internal.cjs +2 -2
- package/dist/internal.d.cts +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.js +1 -1
- package/package.json +17 -2
- package/dist/chunk-BUF5FDKC.cjs.map +0 -1
- package/dist/chunk-E6KSJ5UI.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/hooks/useVariable.ts","../src/hooks/useVariables.ts","../src/hooks/useUser.ts","../src/hooks/useResponse.ts","../src/hooks/useQueryParams.ts","../src/hooks/useData.ts","../src/hooks/useLocale.ts","../src/hooks/useTranslation.ts","../src/hooks/useNavigation.ts","../src/hooks/useProducts.ts","../src/hooks/useTracking.ts","../src/hooks/usePayment.ts","../src/hooks/useDeviceInfo.ts","../src/hooks/usePageData.ts","../src/hooks/useFunnel.ts","../src/components/StripePaymentForm.tsx","../src/components/PaddleCheckout.tsx"],"names":["useFunnelContext","useCallback","useSyncExternalStore","useMemo","forwardRef","InnerPaymentForm","useStripe","useElements","useState","useRef","useEffect","response","result","useImperativeHandle","jsx","PaymentElement","StripePaymentForm","loadStripe","EmbeddedCheckoutProvider","EmbeddedCheckout","Elements"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AppFunnelConfig, PageDefinition } from './types'\n\n/**\n * Type helper for appfunnel.config.ts.\n * Returns the config object unchanged — exists purely for TypeScript autocomplete.\n */\nexport function defineConfig(config: AppFunnelConfig): AppFunnelConfig {\n return config\n}\n\n/**\n * Define page metadata co-located with the page component.\n * Export this from your page file alongside the default React component.\n *\n * @example\n * ```tsx\n * // pages/quiz.tsx\n * import { definePage, useVariable, useNavigation } from '@appfunnel-dev/sdk'\n *\n * export const page = definePage({\n * name: 'Quiz',\n * type: 'default',\n * routes: [\n * { to: 'checkout', when: { variable: 'plan', equals: 'premium' } },\n * { to: 'success' }, // fallback\n * ],\n * })\n *\n * export default function Quiz() {\n * // ...\n * }\n * ```\n *\n * The CLI build step collects all `page` exports and assembles them into\n * the full config (pages map + routes map + computed route manifest for analytics).\n */\nexport function definePage(definition: PageDefinition): PageDefinition {\n return definition\n}\n","import { useSyncExternalStore, useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { VariableValue } from '../types'\n\n/**\n * Read/write a single variable.\n *\n * ```tsx\n * const [email, setEmail] = useVariable<string>('email')\n * const [count, setCount] = useVariable<number>('count')\n * const [agreed, setAgreed] = useVariable<boolean>('agreed')\n * const [tags, setTags] = useVariable<string[]>('tags')\n * ```\n */\nexport function useVariable<T extends VariableValue>(\n id: string,\n): [T, (value: T) => void] {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (callback: () => void) => variableStore.subscribe(callback, { keys: [id] }),\n [variableStore, id],\n )\n\n const getSnapshot = useCallback(\n () => variableStore.get(id) as T,\n [variableStore, id],\n )\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const setValue = useCallback(\n (v: T) => variableStore.set(id, v),\n [variableStore, id],\n )\n\n return [value, setValue]\n}\n","import { useSyncExternalStore, useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { VariableValue } from '../types'\n\n/**\n * Read all variables (including system variables). Read-only.\n * Use useVariable() to write individual variables.\n */\nexport function useVariables(): Record<string, VariableValue> {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (callback: () => void) => variableStore.subscribe(callback),\n [variableStore],\n )\n\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}\n","import { useSyncExternalStore, useCallback, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { UserState } from '../types'\n\n/**\n * Read built-in user state (email, name, customerId).\n *\n * Only re-renders when a `user.*` variable changes.\n * For reading/writing arbitrary user fields, use `useUserProperty('fieldName')`.\n */\nexport function useUser(): UserState {\n\tconst { variableStore } = useFunnelContext()\n\n\tconst subscribe = useCallback(\n\t\t(cb: () => void) => variableStore.subscribe(cb, { prefix: 'user.' }),\n\t\t[variableStore]\n\t)\n\tconst getSnapshot = useCallback(\n\t\t() => variableStore.getState(),\n\t\t[variableStore]\n\t)\n\tconst variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\temail: (variables['user.email'] as string) || '',\n\t\t\tname: (variables['user.name'] as string) || '',\n\t\t\tstripeCustomerId:\n\t\t\t\t(variables['user.stripeCustomerId'] as string) || '',\n\t\t\tpaddleCustomerId:\n\t\t\t\t(variables['user.paddleCustomerId'] as string) || '',\n\t\t\tdateOfBirth: (variables['user.dateOfBirth'] as string) || '',\n\n\t\t\tsetEmail(email: string) {\n\t\t\t\tvariableStore.set('user.email', email)\n\t\t\t},\n\t\t\tsetName(name: string) {\n\t\t\t\tvariableStore.set('user.name', name)\n\t\t\t},\n\t\t\tsetDateOfBirth(dateOfBirth: string) {\n\t\t\t\tvariableStore.set('user.dateOfBirth', dateOfBirth)\n\t\t\t},\n\t\t}),\n\t\t[variables, variableStore]\n\t)\n}\n\n/**\n * Read/write a user property by field name.\n * Auto-prefixes with `user.` — no need to define in config.\n *\n * ```tsx\n * const [dob, setDob] = useUserProperty('dateOfBirth')\n * const [gender, setGender] = useUserProperty('gender')\n * ```\n */\nexport function useUserProperty(\n\tfield: string\n): [string, (value: string) => void] {\n\tconst { variableStore } = useFunnelContext()\n\tconst key = `user.${field}`\n\n\tconst subscribe = useCallback(\n\t\t(cb: () => void) => variableStore.subscribe(cb, { keys: [key] }),\n\t\t[variableStore, key]\n\t)\n\tconst getSnapshot = useCallback(\n\t\t() => (variableStore.get(key) as string) || '',\n\t\t[variableStore, key]\n\t)\n\n\tconst value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n\tconst setValue = useCallback(\n\t\t(v: string) => variableStore.set(key, v),\n\t\t[variableStore, key]\n\t)\n\n\treturn [value, setValue]\n}\n","import { useSyncExternalStore, useCallback, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { VariableValue } from '../types'\n\n/**\n * Read/write a single response variable (answers.*).\n *\n * ```tsx\n * const [goal, setGoal] = useResponse<string>('goal')\n * const [interests, setInterests] = useResponse<string[]>('interests')\n * ```\n */\nexport function useResponse<T extends VariableValue>(\n key: string,\n): [T, (value: T) => void] {\n const { variableStore } = useFunnelContext()\n const prefixedKey = `answers.${key}`\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: [prefixedKey] }),\n [variableStore, prefixedKey],\n )\n const getSnapshot = useCallback(\n () => variableStore.get(prefixedKey) as T,\n [variableStore, prefixedKey],\n )\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const setValue = useCallback(\n (v: T) => variableStore.set(prefixedKey, v),\n [variableStore, prefixedKey],\n )\n\n return [value, setValue]\n}\n\n/**\n * Read all response variables as a flat object (without the `answers.` prefix).\n *\n * Only re-renders when an `answers.*` variable changes.\n *\n * ```tsx\n * const responses = useResponses()\n * // { goal: 'weight_loss', interests: ['yoga', 'running'] }\n * ```\n */\nexport function useResponses(): Record<string, VariableValue> {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { prefix: 'answers.' }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n const variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return useMemo(() => {\n const result: Record<string, VariableValue> = {}\n for (const [key, value] of Object.entries(variables)) {\n if (key.startsWith('answers.')) {\n result[key.slice(8)] = value\n }\n }\n return result\n }, [variables])\n}\n","import { useSyncExternalStore, useCallback, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\n\n/**\n * Read all URL query parameters as a flat object (without the `query.` prefix).\n *\n * Only re-renders when a `query.*` variable changes.\n */\nexport function useQueryParams(): Record<string, string> {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { prefix: 'query.' }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n const variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return useMemo(() => {\n const params: Record<string, string> = {}\n for (const [key, value] of Object.entries(variables)) {\n if (key.startsWith('query.') && typeof value === 'string') {\n params[key.slice(6)] = value\n }\n }\n return params\n }, [variables])\n}\n\n/**\n * Read a single query parameter by name.\n *\n * ```tsx\n * const utmSource = useQueryParam('utm_source')\n * ```\n */\nexport function useQueryParam(key: string): string {\n const { variableStore } = useFunnelContext()\n const prefixedKey = `query.${key}`\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: [prefixedKey] }),\n [variableStore, prefixedKey],\n )\n const getSnapshot = useCallback(\n () => (variableStore.get(prefixedKey) as string) || '',\n [variableStore, prefixedKey],\n )\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}\n","import { useSyncExternalStore, useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { VariableValue } from '../types'\n\n/**\n * Read/write a single data variable (data.*).\n *\n * ```tsx\n * const [tier, setTier] = useData<string>('selectedPlanTier')\n * const [seen, setSeen] = useData<boolean>('hasSeenOnboarding')\n * ```\n */\nexport function useData<T extends VariableValue>(\n key: string,\n): [T, (value: T) => void] {\n const { variableStore } = useFunnelContext()\n const prefixedKey = `data.${key}`\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: [prefixedKey] }),\n [variableStore, prefixedKey],\n )\n const getSnapshot = useCallback(\n () => variableStore.get(prefixedKey) as T,\n [variableStore, prefixedKey],\n )\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const setValue = useCallback(\n (v: T) => variableStore.set(prefixedKey, v),\n [variableStore, prefixedKey],\n )\n\n return [value, setValue]\n}\n","import { useMemo } from 'react'\nimport type { LocaleState } from '../types'\n\n/**\n * Get the user's locale from the browser.\n *\n * Provides language, region, and currency info derived from the browser.\n * Combine with i18n libraries (react-i18next, next-intl, etc.) for translations.\n *\n * ```tsx\n * const { language, region, currency } = useLocale()\n * // language: 'en', region: 'US', currency: 'USD'\n * ```\n */\nexport function useLocale(): LocaleState {\n return useMemo(() => {\n if (typeof navigator === 'undefined') {\n return {\n locale: 'en-US',\n language: 'en',\n region: 'US',\n languages: ['en-US'],\n timeZone: 'UTC',\n is24Hour: false,\n }\n }\n\n const locale = navigator.language || 'en-US'\n const [language, region] = locale.split('-')\n const languages = [...(navigator.languages || [locale])]\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'\n const is24Hour = detect24Hour(locale)\n\n return {\n locale,\n language: language || 'en',\n region: region?.toUpperCase() || 'US',\n languages,\n timeZone,\n is24Hour,\n }\n }, [])\n}\n\n/** Detect if locale likely uses 24h clock */\nfunction detect24Hour(locale: string): boolean {\n try {\n const formatted = new Intl.DateTimeFormat(locale, { hour: 'numeric' }).format(new Date())\n return !formatted.match(/am|pm/i)\n } catch {\n return false\n }\n}\n","import { useSyncExternalStore, useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { TranslationState } from '../types'\n\n/**\n * Access translations for the current locale.\n *\n * ```tsx\n * const { t, locale, setLocale } = useTranslation()\n *\n * return (\n * <div>\n * <h1>{t('welcome', { name: 'John' })}</h1>\n * <button onClick={() => setLocale('de')}>Deutsch</button>\n * </div>\n * )\n * ```\n */\nexport function useTranslation(): TranslationState {\n const { i18n } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => i18n.subscribe(cb),\n [i18n],\n )\n const getSnapshot = useCallback(\n () => i18n.getLocale(),\n [i18n],\n )\n\n const locale = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const t = useCallback(\n (key: string, params?: Record<string, string | number>) => i18n.t(key, params),\n [i18n, locale], // eslint-disable-line react-hooks/exhaustive-deps\n )\n\n const setLocale = useCallback(\n (l: string) => i18n.setLocale(l),\n [i18n],\n )\n\n const availableLocales = i18n.getAvailableLocales()\n\n return { t, locale, setLocale, availableLocales }\n}\n","import { useCallback, useSyncExternalStore } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { NavigationState } from '../types'\n\n/**\n * Navigation hook — evaluates routes, navigates between pages, tracks progress.\n *\n * Only re-renders when the router's current page changes (not on variable changes).\n * Variables are read lazily at navigation time — callbacks are referentially stable.\n */\nexport function useNavigation(): NavigationState {\n const { router, variableStore, tracker } = useFunnelContext()\n\n // Re-render only when the router's current page changes\n useSyncExternalStore(\n useCallback((cb: () => void) => router.subscribe(cb), [router]),\n useCallback(() => router.getSnapshot(), [router]),\n useCallback(() => router.getSnapshot(), [router]),\n )\n\n /** Called after the router has already navigated to `key`. */\n const afterNavigate = useCallback((key: string) => {\n const page = router.getCurrentPage()\n if (page) {\n tracker.track('page.view', {\n pageId: page.key,\n pageKey: page.key,\n pageName: page.name,\n })\n tracker.startPageTracking(page.key)\n }\n variableStore.setMany({\n 'page.currentId': key,\n 'page.currentIndex': router.getPageHistory().length,\n 'page.current': router.getPageHistory().length + 1,\n 'page.startedAt': Date.now(),\n })\n }, [router, tracker, variableStore])\n\n const goToNextPage = useCallback(() => {\n const previousPage = router.getCurrentPage()\n if (previousPage) {\n tracker.stopPageTracking()\n }\n\n // Read variables at call time — not captured in closure\n const variables = variableStore.getState()\n const nextKey = router.goToNextPage(variables)\n if (nextKey) {\n afterNavigate(nextKey)\n }\n }, [router, tracker, variableStore, afterNavigate])\n\n const goBack = useCallback(() => {\n tracker.stopPageTracking()\n const prevKey = router.goBack()\n if (prevKey) {\n afterNavigate(prevKey)\n }\n }, [router, tracker, afterNavigate])\n\n const goToPage = useCallback((pageKey: string) => {\n tracker.stopPageTracking()\n const key = router.goToPage(pageKey)\n if (key) {\n afterNavigate(key)\n }\n }, [router, tracker, afterNavigate])\n\n return {\n goToNextPage,\n goBack,\n goToPage,\n currentPage: router.getCurrentPage(),\n pageHistory: router.getPageHistory(),\n progress: router.getProgress(),\n }\n}\n","import { useCallback, useSyncExternalStore } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { ProductsState } from '../types'\n\n/**\n * Products hook — access product list, selected product, and selection handler.\n *\n * Only re-renders when `products.selectedProductId` changes.\n */\nexport function useProducts(): ProductsState {\n const { products, variableStore, selectProduct: ctxSelect } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: ['products.selectedProductId'] }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.get('products.selectedProductId') as string | null,\n [variableStore],\n )\n\n const selectedId = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const selected = products.find((p) => p.id === selectedId) || null\n\n const select = useCallback((productId: string) => {\n ctxSelect(productId)\n }, [ctxSelect])\n\n return { products, selected, select }\n}\n","import { useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { TrackingState } from '../types'\n\n/**\n * Tracking hook — fire events and identify users.\n */\nexport function useTracking(): TrackingState {\n const { tracker } = useFunnelContext()\n\n const track = useCallback(\n (eventName: string, data?: Record<string, unknown>) => {\n tracker.track(eventName, data)\n },\n [tracker],\n )\n\n const identify = useCallback(\n (email: string) => {\n tracker.identify(email)\n },\n [tracker],\n )\n\n return { track, identify }\n}\n","import { useCallback, useSyncExternalStore, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { PaymentState } from '../types'\n\nconst PAYMENT_KEYS = [\n 'card.last4',\n 'card.brand',\n 'card.expMonth',\n 'card.expYear',\n 'payment.loading',\n 'payment.error',\n 'payment.customerId',\n]\n\n/**\n * Payment hook — reads payment-related variables.\n *\n * Only re-renders when payment/card variables change.\n */\nexport function usePayment(): PaymentState {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: PAYMENT_KEYS }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n const variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return useMemo(() => {\n const last4 = variables['card.last4'] as string || ''\n const brand = variables['card.brand'] as string || ''\n const expMonth = variables['card.expMonth'] as number || 0\n const expYear = variables['card.expYear'] as number || 0\n const customerId = (variables['payment.customerId'] as string) || null\n\n return {\n customerId,\n isAuthorized: !!last4,\n loading: !!variables['payment.loading'],\n error: (variables['payment.error'] as string) || null,\n cardDetails: last4\n ? { last4, brand, expMonth, expYear }\n : null,\n }\n }, [variables])\n}\n","import { useSyncExternalStore, useCallback, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { DeviceInfo } from '../types'\n\nconst DEVICE_KEYS = [\n 'os.name',\n 'os.timezone',\n 'device.type',\n 'device.isMobile',\n 'device.isTablet',\n 'device.screenWidth',\n 'device.screenHeight',\n 'device.viewportWidth',\n 'device.viewportHeight',\n 'device.colorDepth',\n 'device.pixelRatio',\n 'browser.name',\n 'browser.version',\n 'browser.userAgent',\n 'browser.cookieEnabled',\n 'browser.online',\n 'browser.language',\n]\n\n/**\n * Read device, browser, and OS metadata.\n *\n * These values are set once on mount and don't change, so this hook\n * will rarely (if ever) re-render.\n *\n * ```tsx\n * const { device, browser, os } = useDeviceInfo()\n * if (device.isMobile) { ... }\n * ```\n */\nexport function useDeviceInfo(): DeviceInfo {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: DEVICE_KEYS }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n const variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return useMemo(() => ({\n os: {\n name: (variables['os.name'] as string) || '',\n timezone: (variables['os.timezone'] as string) || '',\n },\n device: {\n type: (variables['device.type'] as string) || 'desktop',\n isMobile: !!variables['device.isMobile'],\n isTablet: !!variables['device.isTablet'],\n screenWidth: (variables['device.screenWidth'] as number) || 0,\n screenHeight: (variables['device.screenHeight'] as number) || 0,\n viewportWidth: (variables['device.viewportWidth'] as number) || 0,\n viewportHeight: (variables['device.viewportHeight'] as number) || 0,\n colorDepth: (variables['device.colorDepth'] as number) || 24,\n pixelRatio: (variables['device.pixelRatio'] as number) || 1,\n },\n browser: {\n name: (variables['browser.name'] as string) || '',\n version: (variables['browser.version'] as string) || '',\n userAgent: (variables['browser.userAgent'] as string) || '',\n cookieEnabled: variables['browser.cookieEnabled'] !== false,\n online: variables['browser.online'] !== false,\n language: (variables['browser.language'] as string) || 'en',\n },\n }), [variables])\n}\n","import { useSyncExternalStore, useCallback, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { PageData } from '../types'\n\nconst PAGE_KEYS = [\n 'page.currentId',\n 'page.currentIndex',\n 'page.current',\n 'page.total',\n 'page.progressPercentage',\n 'page.startedAt',\n]\n\n/**\n * Read page-level system variables.\n *\n * Re-renders when page variables change (e.g. on navigation).\n *\n * ```tsx\n * const { currentId, progressPercentage, startedAt } = usePageData()\n * ```\n */\nexport function usePageData(): PageData {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: PAGE_KEYS }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n const variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return useMemo(() => ({\n currentId: (variables['page.currentId'] as string) || '',\n currentIndex: (variables['page.currentIndex'] as number) || 0,\n current: (variables['page.current'] as number) || 1,\n total: (variables['page.total'] as number) || 0,\n progressPercentage: (variables['page.progressPercentage'] as number) || 0,\n startedAt: (variables['page.startedAt'] as number) || 0,\n }), [variables])\n}\n","import { useFunnelContext } from '../components/FunnelProvider'\nimport { useVariables } from './useVariables'\nimport { useUser } from './useUser'\nimport { useResponses } from './useResponse'\nimport { useQueryParams } from './useQueryParams'\nimport { useNavigation } from './useNavigation'\nimport { useProducts } from './useProducts'\nimport { useTracking } from './useTracking'\nimport { usePayment } from './usePayment'\nimport type { FunnelState } from '../types'\n\n/**\n * Convenience hook that combines all SDK hooks.\n * Useful for simple funnels where you don't want multiple hook imports.\n */\nexport function useFunnel(): FunnelState {\n const { funnelId, campaignId, tracker } = useFunnelContext()\n\n return {\n funnelId,\n campaignId,\n sessionId: tracker.getSessionId(),\n variables: useVariables(),\n user: useUser(),\n responses: useResponses(),\n queryParams: useQueryParams(),\n navigation: useNavigation(),\n products: useProducts(),\n tracking: useTracking(),\n payment: usePayment(),\n }\n}\n","import {\n useEffect,\n useState,\n useRef,\n useCallback,\n useMemo,\n forwardRef,\n useImperativeHandle,\n} from 'react'\nimport { loadStripe, type Stripe, type Appearance } from '@stripe/stripe-js'\nimport {\n Elements,\n PaymentElement,\n EmbeddedCheckoutProvider,\n EmbeddedCheckout,\n useStripe,\n useElements,\n} from '@stripe/react-stripe-js'\nimport { useFunnelContext } from './FunnelProvider'\nimport { useVariable } from '../hooks/useVariable'\n\nconst API_BASE_URL = 'https://api.appfunnel.net'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface StripePaymentHandle {\n /** Programmatically submit the payment form */\n submit: () => Promise<void>\n}\n\nexport interface StripePaymentFormProps {\n /** Product ID override (default: currently selected product) */\n productId?: string\n /** \"checkout\" for full payment, \"validate-only\" to just collect card */\n mode?: 'checkout' | 'validate-only'\n /** \"elements\" for PaymentElement, \"embedded\" for Stripe Embedded Checkout */\n variant?: 'elements' | 'embedded'\n /** Called on successful payment */\n onSuccess?: () => void\n /** Called on payment error */\n onError?: (error: string) => void\n /** Called when the Stripe form is ready to accept submissions */\n onReady?: () => void\n /** Additional CSS class */\n className?: string\n /** Stripe Appearance override (elements variant only) */\n appearance?: Appearance\n /** PaymentElement layout option (default: 'tabs') */\n layout?: 'tabs' | 'accordion' | 'auto'\n}\n\n// ============================================================================\n// Inner Form — uses Stripe hooks (mounted inside <Elements>)\n// ============================================================================\n\ninterface InnerFormProps {\n paymentMode: 'setup' | 'payment'\n validateOnly: boolean\n onSuccess?: () => void\n onError?: (error: string) => void\n onReady?: () => void\n layout?: 'tabs' | 'accordion' | 'auto'\n}\n\nconst InnerPaymentForm = forwardRef<StripePaymentHandle, InnerFormProps>(\n function InnerPaymentForm({ paymentMode, validateOnly, onSuccess, onError, onReady, layout }, ref) {\n const stripe = useStripe()\n const elements = useElements()\n const [error, setError] = useState<string | null>(null)\n const { variableStore, campaignId, tracker, products } = useFunnelContext()\n const readyFired = useRef(false)\n\n // Notify parent when Stripe is loaded\n useEffect(() => {\n if (stripe && elements && !readyFired.current) {\n readyFired.current = true\n onReady?.()\n }\n }, [stripe, elements, onReady])\n\n const handleSubmit = useCallback(async () => {\n if (!stripe || !elements) {\n const msg = 'Stripe not loaded'\n setError(msg)\n onError?.(msg)\n return\n }\n\n setError(null)\n variableStore.set('payment.loading', true)\n\n try {\n const confirmFn = paymentMode === 'setup' ? stripe.confirmSetup : stripe.confirmPayment\n const confirmResult = await confirmFn({\n elements,\n redirect: 'if_required',\n confirmParams: { return_url: window.location.href },\n })\n\n if (confirmResult.error) {\n const msg = confirmResult.error.message || 'Payment failed'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n return\n }\n\n tracker.track('checkout.payment_added')\n\n if (validateOnly) {\n const piId = 'paymentIntent' in confirmResult\n ? (confirmResult as Record<string, unknown>).paymentIntent as { id?: string } | undefined\n : undefined\n\n if (!piId?.id) {\n const msg = 'PaymentIntent not found after confirmation'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n return\n }\n\n const response = await fetch(\n `${API_BASE_URL}/campaign/${campaignId}/stripe/validate-card`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n campaignId,\n sessionId: tracker.getSessionId(),\n paymentIntentId: piId.id,\n }),\n },\n )\n\n const result = await response.json()\n\n if (!result.success) {\n const msg = result.error || 'Card validation failed'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n return\n }\n\n variableStore.setMany({\n 'card.last4': result.card.last4,\n 'card.brand': result.card.brand,\n 'card.expMonth': result.card.expMonth,\n 'card.expYear': result.card.expYear,\n 'card.funding': result.card.funding,\n 'payment.error': '',\n })\n\n onSuccess?.()\n return\n }\n\n // ── Normal purchase path ──\n const paymentIntentId = 'paymentIntent' in confirmResult\n ? ((confirmResult as Record<string, unknown>).paymentIntent as { id?: string })?.id\n : undefined\n\n const selectedId = variableStore.get('products.selectedProductId') as string\n const product = products.find((p) => p.id === selectedId)\n\n if (!product?.stripePriceId) {\n const msg = 'No product selected or missing Stripe price'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n return\n }\n\n const response = await fetch(\n `${API_BASE_URL}/campaign/${campaignId}/stripe/purchase`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n campaignId,\n sessionId: tracker.getSessionId(),\n stripePriceId: product.stripePriceId,\n trialPeriodDays: product.hasTrial ? product.trialDays : undefined,\n onSessionPiId: paymentMode === 'payment' ? paymentIntentId : undefined,\n }),\n },\n )\n\n const result = await response.json()\n\n if (result.success) {\n variableStore.set('payment.error', '')\n if (result.eventId || result.eventIds?.firstPeriod) {\n tracker.track('purchase.complete', {\n amount: product.rawPrice ? product.rawPrice / 100 : 0,\n currency: product.currencyCode || 'USD',\n })\n }\n onSuccess?.()\n } else {\n const msg = result.error || 'Failed to process payment'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'An error occurred'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n } finally {\n variableStore.set('payment.loading', false)\n }\n }, [stripe, elements, paymentMode, validateOnly, variableStore, campaignId, tracker, products, onSuccess, onError])\n\n // Expose submit via ref\n useImperativeHandle(ref, () => ({ submit: handleSubmit }), [handleSubmit])\n\n return (\n <div>\n <PaymentElement options={{ layout: layout || 'tabs' }} />\n {error && (\n <div style={{ color: '#ef4444', fontSize: '14px', marginTop: '12px' }}>\n {error}\n </div>\n )}\n </div>\n )\n },\n)\n\n// ============================================================================\n// StripePaymentForm (public component)\n// ============================================================================\n\n/**\n * Stripe payment component supporting PaymentElement and Embedded Checkout.\n *\n * Use a ref to submit the form from an external button:\n * ```tsx\n * const paymentRef = useRef<StripePaymentHandle>(null)\n *\n * <StripePaymentForm ref={paymentRef} onSuccess={goToNextPage} />\n * <button onClick={() => paymentRef.current?.submit()}>Pay Now</button>\n * ```\n */\nexport const StripePaymentForm = forwardRef<StripePaymentHandle, StripePaymentFormProps>(\n function StripePaymentForm(\n {\n productId,\n mode = 'checkout',\n variant = 'elements',\n onSuccess,\n onError,\n onReady,\n className,\n appearance,\n layout,\n },\n ref,\n ) {\n const { campaignId, tracker, variableStore, products } = useFunnelContext()\n const [email] = useVariable<string>('user.email')\n\n const validateOnly = mode === 'validate-only'\n\n // Resolve the product\n const product = useMemo(() => {\n if (productId) return products.find((p) => p.id === productId) || null\n const selectedId = variableStore.get('products.selectedProductId') as string\n return products.find((p) => p.id === selectedId) || null\n }, [productId, products, variableStore])\n\n // Derive payment mode from product\n const paymentMode = useMemo((): 'setup' | 'payment' => {\n if (validateOnly) return 'payment'\n if (product?.hasTrial && !product.paidTrial) return 'setup'\n return 'payment'\n }, [product, validateOnly])\n\n const [stripePromise, setStripePromise] = useState<Promise<Stripe | null> | null>(null)\n const [clientSecret, setClientSecret] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const hasInitialized = useRef(false)\n\n // Create intent when email is available\n useEffect(() => {\n if (!email || !campaignId || hasInitialized.current) return\n if (!product?.storePriceId) return\n\n hasInitialized.current = true\n setIsLoading(true)\n variableStore.set('payment.loading', true)\n\n const createIntent = async () => {\n try {\n // Embedded checkout uses a different endpoint\n if (variant === 'embedded') {\n const response = await fetch(\n `${API_BASE_URL}/campaign/${campaignId}/stripe/checkout-session`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n campaignId,\n sessionId: tracker.getSessionId(),\n customerEmail: email,\n priceId: product.storePriceId,\n trialPeriodDays: product.hasTrial ? product.trialDays : undefined,\n }),\n },\n )\n\n const result = await response.json()\n if (!result.success) throw new Error(result.error || 'Failed to create checkout session')\n\n setStripePromise(loadStripe(result.publishableKey))\n setClientSecret(result.clientSecret)\n } else {\n const endpoint = paymentMode === 'setup'\n ? `/campaign/${campaignId}/stripe/setup-intent`\n : `/campaign/${campaignId}/stripe/payment-intent`\n\n const body: Record<string, unknown> = {\n campaignId,\n sessionId: tracker.getSessionId(),\n customerEmail: email,\n priceId: product.storePriceId,\n }\n\n if (validateOnly) body.validateOnly = true\n\n const response = await fetch(`${API_BASE_URL}${endpoint}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n\n const result = await response.json()\n if (!result.success) throw new Error(result.error || 'Failed to create intent')\n\n setStripePromise(loadStripe(result.publishableKey))\n setClientSecret(result.clientSecret)\n variableStore.set('user.stripeCustomerId', result.customerId)\n }\n\n tracker.track('checkout.start', {\n productId: product.id,\n priceId: product.stripePriceId || product.storePriceId,\n productName: product.displayName,\n })\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Failed to initialize payment'\n setError(msg)\n variableStore.set('payment.error', msg)\n } finally {\n setIsLoading(false)\n variableStore.set('payment.loading', false)\n }\n }\n\n createIntent()\n }, [email, campaignId, product, paymentMode, validateOnly, variant, tracker, variableStore])\n\n if (isLoading) {\n return <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#6b7280' }}>Loading payment form...</div>\n }\n\n if (!email) {\n return <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#ef4444', fontSize: '14px' }}>Email is required to initialize payment</div>\n }\n\n if (error) {\n return <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#ef4444', fontSize: '14px' }}>{error}</div>\n }\n\n if (!stripePromise || !clientSecret) {\n return <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#6b7280' }}>Initializing payment...</div>\n }\n\n // ── Embedded Checkout variant ──\n if (variant === 'embedded') {\n return (\n <div className={className}>\n <EmbeddedCheckoutProvider\n stripe={stripePromise}\n options={{\n clientSecret,\n onComplete: () => {\n tracker.track('purchase.complete', {\n amount: product?.rawPrice ? product.rawPrice / 100 : 0,\n currency: product?.currencyCode || 'USD',\n })\n onSuccess?.()\n },\n }}\n >\n <EmbeddedCheckout />\n </EmbeddedCheckoutProvider>\n </div>\n )\n }\n\n // ── Elements variant (default) ──\n const defaultAppearance: Appearance = {\n theme: 'stripe',\n variables: { colorPrimary: '#3b82f6', borderRadius: '8px' },\n }\n\n return (\n <div className={className}>\n <Elements stripe={stripePromise} options={{ clientSecret, appearance: appearance || defaultAppearance }}>\n <InnerPaymentForm\n ref={ref}\n paymentMode={paymentMode}\n validateOnly={validateOnly}\n onSuccess={onSuccess}\n onError={onError}\n onReady={onReady}\n layout={layout}\n />\n </Elements>\n </div>\n )\n },\n)\n","import { useEffect, useRef, useCallback } from 'react'\nimport { useFunnelContext } from './FunnelProvider'\n\nexport interface PaddleCheckoutProps {\n /** Product ID to checkout (default: currently selected product) */\n productId?: string\n /** Display mode: overlay opens Paddle in a modal, inline renders embedded */\n mode?: 'overlay' | 'inline'\n /** Called on successful checkout */\n onSuccess?: () => void\n /** Called on checkout error */\n onError?: (error: string) => void\n /** Additional CSS class */\n className?: string\n}\n\ndeclare global {\n interface Window {\n Paddle?: {\n Setup: (options: Record<string, unknown>) => void\n Checkout: {\n open: (options: Record<string, unknown>) => void\n }\n }\n }\n}\n\n/**\n * Paddle checkout component.\n * Supports overlay (modal) and inline (embedded) modes.\n */\nexport function PaddleCheckout({\n productId,\n mode = 'overlay',\n onSuccess,\n onError,\n className,\n}: PaddleCheckoutProps) {\n const { variableStore, tracker, products } = useFunnelContext()\n const containerRef = useRef<HTMLDivElement>(null)\n const initializedRef = useRef(false)\n\n // Resolve product\n const product = productId\n ? products.find((p) => p.id === productId)\n : products.find((p) => p.id === (variableStore.get('products.selectedProductId') as string))\n\n const handleCheckoutComplete = useCallback(() => {\n tracker.track('purchase.complete', {\n amount: product?.rawPrice ? product.rawPrice / 100 : 0,\n currency: product?.currencyCode || 'USD',\n })\n onSuccess?.()\n }, [tracker, product, onSuccess])\n\n useEffect(() => {\n if (initializedRef.current || !product?.paddlePriceId) return\n initializedRef.current = true\n\n if (!window.Paddle) {\n onError?.('Paddle.js not loaded. Include the Paddle script in your HTML.')\n return\n }\n\n const email = variableStore.get('user.email') as string || ''\n\n if (mode === 'overlay') {\n window.Paddle.Checkout.open({\n items: [{ priceId: product.paddlePriceId, quantity: 1 }],\n customer: email ? { email } : undefined,\n successCallback: handleCheckoutComplete,\n closeCallback: () => { /* user closed */ },\n })\n } else {\n // Inline mode\n if (containerRef.current) {\n window.Paddle.Checkout.open({\n items: [{ priceId: product.paddlePriceId, quantity: 1 }],\n customer: email ? { email } : undefined,\n settings: {\n displayMode: 'inline',\n frameTarget: containerRef.current.id || 'paddle-checkout',\n frameInitialHeight: 450,\n frameStyle: 'width: 100%; min-width: 312px; background-color: transparent; border: none;',\n },\n successCallback: handleCheckoutComplete,\n })\n }\n }\n\n tracker.track('checkout.start', {\n productId: product.id,\n priceId: product.paddlePriceId,\n productName: product.displayName,\n })\n }, [product, mode, variableStore, tracker, handleCheckoutComplete, onError])\n\n if (!product) {\n return (\n <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#ef4444', fontSize: '14px' }}>\n No product selected\n </div>\n )\n }\n\n if (mode === 'inline') {\n return <div ref={containerRef} id=\"paddle-checkout\" className={className} />\n }\n\n // Overlay mode renders nothing visible\n return null\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/hooks/useVariable.ts","../src/hooks/useVariables.ts","../src/utils/date.ts","../src/hooks/useUser.ts","../src/hooks/useQueryParams.ts","../src/hooks/useData.ts","../src/hooks/useLocale.ts","../src/hooks/useTranslation.ts","../src/hooks/useProducts.ts","../src/hooks/useTracking.ts","../src/hooks/usePayment.ts","../src/hooks/useDeviceInfo.ts","../src/hooks/useSafeArea.ts","../src/hooks/useKeyboard.ts","../src/hooks/usePageData.ts","../src/hooks/useFunnel.ts","../src/components/DemoStripePaymentForm.tsx","../src/components/StripePaymentForm.tsx","../src/components/PaddleCheckout.tsx"],"names":["useFunnelContext","useCallback","useSyncExternalStore","useMemo","loadStripe","useState","useEffect","useRef","useResponses","useNavigation","jsxs","jsx","forwardRef","DemoStripePaymentForm","useImperativeHandle","API_BASE_URL","InnerPaymentForm","useStripe","useElements","response","result","PaymentElement","RealStripePaymentForm","EmbeddedCheckoutProvider","EmbeddedCheckout","Elements","StripePaymentForm"],"mappings":";;;;;;;;;;AAMO,SAAS,aAAa,MAAA,EAA0C;AACrE,EAAA,OAAO,MAAA;AACT;AA4BO,SAAS,WAAW,UAAA,EAA4C;AACrE,EAAA,OAAO,UAAA;AACT;ACrBO,SAAS,YACd,EAAA,EACyB;AACzB,EAAA,MAAM,EAAE,aAAA,EAAc,GAAIA,kCAAA,EAAiB;AAE3C,EAAA,MAAM,SAAA,GAAYC,iBAAA;AAAA,IAChB,CAAC,QAAA,KAAyB,aAAA,CAAc,SAAA,CAAU,QAAA,EAAU,EAAE,IAAA,EAAM,CAAC,EAAE,CAAA,EAAG,CAAA;AAAA,IAC1E,CAAC,eAAe,EAAE;AAAA,GACpB;AAEA,EAAA,MAAM,WAAA,GAAcA,iBAAA;AAAA,IAClB,MAAM,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AAAA,IAC1B,CAAC,eAAe,EAAE;AAAA,GACpB;AAEA,EAAA,MAAM,KAAA,GAAQC,0BAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAEtE,EAAA,MAAM,QAAA,GAAWD,iBAAA;AAAA,IACf,CAAC,CAAA,KAAS,aAAA,CAAc,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IACjC,CAAC,eAAe,EAAE;AAAA,GACpB;AAEA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACzB;AC1BO,SAAS,YAAA,GAA8C;AAC5D,EAAA,MAAM,EAAE,aAAA,EAAc,GAAID,kCAAA,EAAiB;AAE3C,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IAChB,CAAC,QAAA,KAAyB,aAAA,CAAc,SAAA,CAAU,QAAQ,CAAA;AAAA,IAC1D,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAM,cAAc,QAAA,EAAS;AAAA,IAC7B,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,OAAOC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACjE;;;ACjBO,SAAS,UAAU,KAAA,EAAuB;AAChD,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,IAAA,IAAQ,OAAO,EAAA;AACpC,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AAGrB,EAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,CAAA;AAG1C,EAAA,IAAI,qBAAA,CAAsB,KAAK,CAAC,CAAA,SAAU,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAGvD,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,yCAAyC,CAAA;AAClE,EAAA,IAAI,QAAA,EAAU;AACb,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AAEvB,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,GAAA;AAEJ,IAAA,IAAI,CAAA,GAAI,EAAA,IAAM,CAAA,IAAK,EAAA,EAAI;AAEtB,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,KAAA,GAAQ,CAAA;AAAA,IACT,CAAA,MAAA,IAAW,CAAA,GAAI,EAAA,IAAM,CAAA,IAAK,EAAA,EAAI;AAE7B,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,GAAA,GAAM,CAAA;AAAA,IACP,CAAA,MAAO;AAEN,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,GAAA,GAAM,CAAA;AAAA,IACP;AAEA,IAAA,IAAI,SAAS,CAAA,IAAK,KAAA,IAAS,MAAM,GAAA,IAAO,CAAA,IAAK,OAAO,EAAA,EAAI;AACvD,MAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,IAAI,MAAA,CAAO,GAAG,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,IACjF;AAAA,EACD;AAGA,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,yCAAyC,CAAA;AAClE,EAAA,IAAI,QAAA,EAAU;AACb,IAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AACpC,IAAA,IAAI,SAAS,CAAA,IAAK,KAAA,IAAS,MAAM,GAAA,IAAO,CAAA,IAAK,OAAO,EAAA,EAAI;AACvD,MAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,IAAI,MAAA,CAAO,GAAG,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,IACjF;AAAA,EACD;AAGA,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,IAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAEzB,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,GAAA;AAEJ,IAAA,IAAI,CAAA,GAAI,EAAA,IAAM,CAAA,IAAK,EAAA,EAAI;AACtB,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,KAAA,GAAQ,CAAA;AAAA,IACT,CAAA,MAAO;AACN,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,GAAA,GAAM,CAAA;AAAA,IACP;AAEA,IAAA,IAAI,SAAS,CAAA,IAAK,KAAA,IAAS,MAAM,GAAA,IAAO,CAAA,IAAK,OAAO,EAAA,EAAI;AACvD,MAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,IAAI,MAAA,CAAO,GAAG,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,IACjF;AAAA,EACD;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACT,qCAAqC,KAAK,CAAA,+EAAA;AAAA,GAC3C;AACD;AAMO,SAAS,mBAAA,CAAoB,OAAe,MAAA,EAA4B;AAC9E,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,IAAA,IAAQ,OAAO,EAAA;AACpC,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AAGrB,EAAA,IAAI,sBAAsB,IAAA,CAAK,CAAC,KAAK,qBAAA,CAAsB,IAAA,CAAK,CAAC,CAAA,EAAG;AACnE,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAErC,EAAA,IAAI,WAAW,YAAA,EAAc;AAC5B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,yCAAyC,CAAA;AAC3D,IAAA,IAAI,CAAA,SAAU,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACvE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,IACzE;AAAA,EACD;AAEA,EAAA,IAAI,WAAW,YAAA,EAAc;AAC5B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,yCAAyC,CAAA;AAC3D,IAAA,IAAI,CAAA,SAAU,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACvE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,IACzE;AAAA,EACD;AAEA,EAAA,IAAI,WAAW,YAAA,EAAc;AAC5B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,yCAAyC,CAAA;AAC3D,IAAA,IAAI,CAAA,SAAU,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACvE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,IACzE;AAAA,EACD;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACT,CAAA,kCAAA,EAAqC,KAAK,CAAA,mBAAA,EAAsB,MAAM,CAAA,OAAA,EAAU;AAAA,MAC/E,YAAA,EAAc,wBAAA;AAAA,MACd,YAAA,EAAc,wBAAA;AAAA,MACd,YAAA,EAAc;AAAA,KACf,CAAE,MAAM,CAAC,CAAA,EAAA;AAAA,GACV;AACD;;;ACzHO,SAAS,OAAA,GAAqB;AACpC,EAAA,MAAM,EAAE,aAAA,EAAe,OAAA,EAAQ,GAAIF,kCAAA,EAAiB;AAEpD,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IACjB,CAAC,OAAmB,aAAA,CAAc,SAAA,CAAU,IAAI,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,IACnE,CAAC,aAAa;AAAA,GACf;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IACnB,MAAM,cAAc,QAAA,EAAS;AAAA,IAC7B,CAAC,aAAa;AAAA,GACf;AACA,EAAA,MAAM,SAAA,GAAYC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAE1E,EAAA,OAAOC,aAAA;AAAA,IACN,OAAO;AAAA,MACN,KAAA,EAAQ,SAAA,CAAU,YAAY,CAAA,IAAgB,EAAA;AAAA,MAC9C,IAAA,EAAO,SAAA,CAAU,WAAW,CAAA,IAAgB,EAAA;AAAA,MAC5C,gBAAA,EACE,SAAA,CAAU,uBAAuB,CAAA,IAAgB,EAAA;AAAA,MACnD,gBAAA,EACE,SAAA,CAAU,uBAAuB,CAAA,IAAgB,EAAA;AAAA,MACnD,WAAA,EAAc,SAAA,CAAU,kBAAkB,CAAA,IAAgB,EAAA;AAAA,MAC1D,gBAAA,EAAkB,SAAA,CAAU,uBAAuB,CAAA,KAAM,IAAA;AAAA,MAEzD,SAAS,KAAA,EAAe;AACvB,QAAA,aAAA,CAAc,GAAA,CAAI,cAAc,KAAK,CAAA;AAAA,MACtC,CAAA;AAAA,MACA,QAAQ,IAAA,EAAc;AACrB,QAAA,aAAA,CAAc,GAAA,CAAI,aAAa,IAAI,CAAA;AAAA,MACpC,CAAA;AAAA,MACA,eAAe,WAAA,EAAqB;AACnC,QAAA,aAAA,CAAc,GAAA,CAAI,kBAAA,EAAoB,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,MAC7D,CAAA;AAAA,MACA,oBAAoB,OAAA,EAAkB;AACrC,QAAA,aAAA,CAAc,GAAA,CAAI,yBAAyB,OAAO,CAAA;AAAA,MACnD,CAAA;AAAA,MACA,SAAS,KAAA,EAAe;AACvB,QAAA,OAAA,CAAQ,SAAS,KAAK,CAAA;AAAA,MACvB;AAAA,KACD,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,aAAA,EAAe,OAAO;AAAA,GACnC;AACD;AAWO,SAAS,gBACf,KAAA,EACoC;AACpC,EAAA,MAAM,EAAE,aAAA,EAAc,GAAIH,kCAAA,EAAiB;AAC3C,EAAA,MAAM,GAAA,GAAM,QAAQ,KAAK,CAAA,CAAA;AAEzB,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IACjB,CAAC,EAAA,KAAmB,aAAA,CAAc,SAAA,CAAU,EAAA,EAAI,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,CAAA;AAAA,IAC/D,CAAC,eAAe,GAAG;AAAA,GACpB;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IACnB,MAAO,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,IAAgB,EAAA;AAAA,IAC5C,CAAC,eAAe,GAAG;AAAA,GACpB;AAEA,EAAA,MAAM,KAAA,GAAQC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAEtE,EAAA,MAAM,QAAA,GAAWD,iBAAAA;AAAA,IAChB,CAAC,CAAA,KAAc,aAAA,CAAc,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACvC,CAAC,eAAe,GAAG;AAAA,GACpB;AAEA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACxB;AAgBO,SAAS,cAAA,CAAe,SAA6C,YAAA,EAAiD;AAC5H,EAAA,MAAM,EAAE,aAAA,EAAc,GAAID,kCAAA,EAAiB;AAC3C,EAAA,MAAM,GAAA,GAAM,kBAAA;AAEZ,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IACjB,CAAC,EAAA,KAAmB,aAAA,CAAc,SAAA,CAAU,EAAA,EAAI,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,CAAA;AAAA,IAC/D,CAAC,aAAa;AAAA,GACf;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IACnB,MAAO,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,IAAgB,EAAA;AAAA,IAC5C,CAAC,aAAa;AAAA,GACf;AAEA,EAAA,MAAM,KAAA,GAAQC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAEtE,EAAA,MAAM,QAAA,GAAWD,iBAAAA;AAAA,IAChB,CAAC,MAAc,aAAA,CAAc,GAAA,CAAI,KAAK,mBAAA,CAAoB,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IACpE,CAAC,eAAe,MAAM;AAAA,GACvB;AAEA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACxB;ACtHO,SAAS,cAAA,GAAyC;AACvD,EAAA,MAAM,EAAE,aAAA,EAAc,GAAID,kCAAA,EAAiB;AAE3C,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IAChB,CAAC,OAAmB,aAAA,CAAc,SAAA,CAAU,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IACpE,CAAC,aAAa;AAAA,GAChB;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAM,cAAc,QAAA,EAAS;AAAA,IAC7B,CAAC,aAAa;AAAA,GAChB;AACA,EAAA,MAAM,SAAA,GAAYC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAE1E,EAAA,OAAOC,cAAQ,MAAM;AACnB,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,MAAA,IAAI,IAAI,UAAA,CAAW,QAAQ,CAAA,IAAK,OAAO,UAAU,QAAA,EAAU;AACzD,QAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,KAAA;AAAA,MACzB;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB;AASO,SAAS,cAAc,GAAA,EAAqB;AACjD,EAAA,MAAM,EAAE,aAAA,EAAc,GAAIH,kCAAA,EAAiB;AAC3C,EAAA,MAAM,WAAA,GAAc,SAAS,GAAG,CAAA,CAAA;AAEhC,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IAChB,CAAC,EAAA,KAAmB,aAAA,CAAc,SAAA,CAAU,EAAA,EAAI,EAAE,IAAA,EAAM,CAAC,WAAW,CAAA,EAAG,CAAA;AAAA,IACvE,CAAC,eAAe,WAAW;AAAA,GAC7B;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAO,aAAA,CAAc,GAAA,CAAI,WAAW,CAAA,IAAgB,EAAA;AAAA,IACpD,CAAC,eAAe,WAAW;AAAA,GAC7B;AAEA,EAAA,OAAOC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACjE;ACzCO,SAAS,QACd,GAAA,EACyB;AACzB,EAAA,MAAM,EAAE,aAAA,EAAc,GAAIF,kCAAA,EAAiB;AAC3C,EAAA,MAAM,WAAA,GAAc,QAAQ,GAAG,CAAA,CAAA;AAE/B,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IAChB,CAAC,EAAA,KAAmB,aAAA,CAAc,SAAA,CAAU,EAAA,EAAI,EAAE,IAAA,EAAM,CAAC,WAAW,CAAA,EAAG,CAAA;AAAA,IACvE,CAAC,eAAe,WAAW;AAAA,GAC7B;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAM,aAAA,CAAc,GAAA,CAAI,WAAW,CAAA;AAAA,IACnC,CAAC,eAAe,WAAW;AAAA,GAC7B;AAEA,EAAA,MAAM,KAAA,GAAQC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAEtE,EAAA,MAAM,QAAA,GAAWD,iBAAAA;AAAA,IACf,CAAC,CAAA,KAAS,aAAA,CAAc,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA,IAC1C,CAAC,eAAe,WAAW;AAAA,GAC7B;AAEA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACzB;ACrBO,SAAS,SAAA,GAAyB;AACvC,EAAA,OAAOE,cAAQ,MAAM;AACnB,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAW,CAAC,OAAO,CAAA;AAAA,QACnB,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,UAAU,QAAA,IAAY,OAAA;AACrC,IAAA,MAAM,CAAC,QAAA,EAAU,MAAM,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AAC3C,IAAA,MAAM,YAAY,CAAC,GAAI,UAAU,SAAA,IAAa,CAAC,MAAM,CAAE,CAAA;AACvD,IAAA,MAAM,WAAW,IAAA,CAAK,cAAA,EAAe,CAAE,eAAA,GAAkB,QAAA,IAAY,KAAA;AACrE,IAAA,MAAM,QAAA,GAAW,aAAa,MAAM,CAAA;AAEpC,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,UAAU,QAAA,IAAY,IAAA;AAAA,MACtB,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,IAAK,IAAA;AAAA,MACjC,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACP;AAGA,SAAS,aAAa,MAAA,EAAyB;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,MAAA,iBAAO,IAAI,MAAM,CAAA;AACxF,IAAA,OAAO,CAAC,SAAA,CAAU,KAAA,CAAM,QAAQ,CAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AClCO,SAAS,cAAA,GAAmC;AACjD,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIH,kCAAA,EAAiB;AAElC,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IAChB,CAAC,EAAA,KAAmB,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA;AAAA,IACrC,CAAC,IAAI;AAAA,GACP;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAM,KAAK,SAAA,EAAU;AAAA,IACrB,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,MAAA,GAASC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAEvE,EAAA,MAAM,CAAA,GAAID,iBAAAA;AAAA,IACR,CAAC,GAAA,EAAa,MAAA,KAA6C,IAAA,CAAK,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IAC7E,CAAC,MAAM,MAAM;AAAA;AAAA,GACf;AAEA,EAAA,MAAM,SAAA,GAAYA,iBAAAA;AAAA,IAChB,CAAC,CAAA,KAAc,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AAAA,IAC/B,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,gBAAA,GAAmB,KAAK,mBAAA,EAAoB;AAElD,EAAA,OAAO,EAAE,CAAA,EAAG,MAAA,EAAQ,SAAA,EAAW,gBAAA,EAAiB;AAClD;ACpCO,SAAS,WAAA,GAA6B;AAC3C,EAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAe,aAAA,EAAe,SAAA,KAAcD,kCAAA,EAAiB;AAE/E,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IAChB,CAAC,EAAA,KAAmB,aAAA,CAAc,SAAA,CAAU,EAAA,EAAI,EAAE,IAAA,EAAM,CAAC,4BAA4B,CAAA,EAAG,CAAA;AAAA,IACxF,CAAC,aAAa;AAAA,GAChB;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAM,aAAA,CAAc,GAAA,CAAI,4BAA4B,CAAA;AAAA,IACpD,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,MAAM,UAAA,GAAaC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAE3E,EAAA,MAAM,QAAA,GAAW,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,UAAU,CAAA,IAAK,IAAA;AAE9D,EAAA,MAAM,MAAA,GAASD,iBAAAA,CAAY,CAAC,SAAA,KAAsB;AAChD,IAAA,SAAA,CAAU,SAAS,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,EAAO;AACtC;ACvBO,SAAS,WAAA,GAA6B;AAC3C,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAID,kCAAA,EAAiB;AAErC,EAAA,MAAM,KAAA,GAAQC,iBAAAA;AAAA,IACZ,CAAC,WAAmB,IAAA,KAAmC;AACrD,MAAA,OAAA,CAAQ,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;ACdA,IAAM,YAAA,GAAe,2BAAA;AAErB,IAAM,YAAA,GAAe,CAAC,iBAAA,EAAmB,eAAe,CAAA;AAOjD,SAAS,UAAA,GAA2B;AAC1C,EAAA,MAAM,EAAE,aAAA,EAAe,QAAA,EAAU,UAAA,EAAY,OAAA,KAAYD,kCAAA,EAAiB;AAE1E,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IACjB,CAAC,OAAmB,aAAA,CAAc,SAAA,CAAU,IAAI,EAAE,IAAA,EAAM,cAAc,CAAA;AAAA,IACtE,CAAC,aAAa;AAAA,GACf;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IACnB,MAAM,cAAc,QAAA,EAAS;AAAA,IAC7B,CAAC,aAAa;AAAA,GACf;AACA,EAAA,MAAM,SAAA,GAAYC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAE1E,EAAA,MAAM,QAAA,GAAWD,iBAAAA;AAAA,IAChB,OACC,WACA,OAAA,KAIsB;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,6CAA6C,SAAS,CAAA;AAElE,MAAA,IAAK,WAAuC,iBAAA,EAAmB;AAC9D,QAAA,OAAA,CAAQ,GAAA;AAAA,UACP;AAAA,SACD;AACA,QAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,IAAI,CAAA;AACzC,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3C,QAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,EAAE,CAAA;AACrC,QAAA,OAAA,CAAQ,IAAI,oCAA+B,CAAA;AAC3C,QAAA,OAAA,EAAS,SAAA,IAAY;AACrB,QAAA,OAAO,IAAA;AAAA,MACR;AAEA,MAAA,MAAM,aAAa,aAAA,CAAc,GAAA;AAAA,QAChC;AAAA,OACD;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,yBAAA,EAA2B,UAAA,IAAc,QAAQ,CAAA;AAC7D,MAAA,IAAI,CAAC,UAAA,EAAY;AAChB,QAAA,MAAM,GAAA,GAAM,6CAAA;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,GAAG,CAAA;AACvC,QAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,QAAA,OAAA,EAAS,UAAU,GAAG,CAAA;AACtB,QAAA,OAAO,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AACvD,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,2BAAA;AAAA,QACA,OAAA,GACG;AAAA,UACA,IAAI,OAAA,CAAQ,EAAA;AAAA,UACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,eAAe,OAAA,CAAQ;AAAA,SACxB,GACC;AAAA,OACJ;AACA,MAAA,IAAI,CAAC,SAAS,aAAA,EAAe;AAC5B,QAAA,MAAM,GAAA,GAAM,2CAAA;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,GAAG,CAAA;AACvC,QAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,QAAA,OAAA,EAAS,UAAU,GAAG,CAAA;AACtB,QAAA,OAAO,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,QAAA,GAC7B,OAAA,CAAQ,SAAA,GACR,MAAA;AACH,MAAA,MAAM,qBACL,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,iBAAA,GAC1B,QAAQ,iBAAA,GACR,MAAA;AACJ,MAAA,OAAA,CAAQ,IAAI,0BAAA,EAA4B;AAAA,QACvC,eAAA;AAAA,QACA,kBAAA;AAAA,QACA,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAW,OAAA,CAAQ;AAAA,OACnB,CAAA;AAED,MAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,IAAI,CAAA;AACzC,MAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,EAAE,CAAA;AAErC,MAAA,MAAM,WAAA,GAAc;AAAA,QACnB,UAAA;AAAA,QACA,SAAA,EAAW,QAAQ,YAAA,EAAa;AAAA,QAChC,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,eAAA;AAAA,QACA;AAAA,OACD;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,6BAAA;AAAA,QACA,CAAA,EAAG,YAAY,CAAA,UAAA,EAAa,UAAU,CAAA,gBAAA,CAAA;AAAA,QACtC;AAAA,OACD;AAEA,MAAA,IAAI;AACH,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACtB,CAAA,EAAG,YAAY,CAAA,UAAA,EAAa,UAAU,CAAA,gBAAA,CAAA;AAAA,UACtC;AAAA,YACC,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA;AACjC,SACD;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,6BAAA,EAA+B,QAAA,CAAS,MAAM,CAAA;AAC1D,QAAA,IAAI,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,6BAA6B,MAAM,CAAA;AAG/C,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,cAAA,EAAgB;AAC7C,UAAA,OAAA,CAAQ,GAAA;AAAA,YACP;AAAA,WACD;AACA,UAAA,MAAM,EAAE,UAAA,EAAAG,WAAAA,EAAW,GAAI,MAAM,OAAO,mBAAmB,CAAA;AACvD,UAAA,MAAM,iBAAiB,MAAMA,WAAAA;AAAA,YAC5B,MAAA,CAAO;AAAA,WACR;AACA,UAAA,IAAI,CAAC,cAAA,EAAgB;AACpB,YAAA,MAAM,GAAA,GAAM,kCAAA;AACZ,YAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,GAAG,CAAA;AACvC,YAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,YAAA,OAAA,EAAS,UAAU,GAAG,CAAA;AACtB,YAAA,OAAO,KAAA;AAAA,UACR;AAEA,UAAA,OAAA,CAAQ,GAAA;AAAA,YACP;AAAA,WACD;AACA,UAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,eAAe,WAAA,EAAY,GACvD,MAAM,cAAA,CAAe,kBAAA;AAAA,YACpB,MAAA,CAAO,YAAA;AAAA,YACP;AAAA,cACC,gBAAgB,MAAA,CAAO;AAAA;AACxB,WACD;AAED,UAAA,IACC,YAAA,IACA,CAAC,WAAA,IACD,WAAA,CAAY,WAAW,WAAA,EACtB;AACD,YAAA,MAAM,GAAA,GACL,cAAc,OAAA,IACd,+BAAA;AACD,YAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,GAAG,CAAA;AAC3C,YAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,YAAA,OAAA,EAAS,UAAU,GAAG,CAAA;AACtB,YAAA,OAAO,KAAA;AAAA,UACR;AAEA,UAAA,OAAA,CAAQ,GAAA;AAAA,YACP,gEAAA;AAAA,YACA,WAAA,CAAY;AAAA,WACb;AAEA,UAAA,MAAM,gBAAgB,MAAM,KAAA;AAAA,YAC3B,CAAA,EAAG,YAAY,CAAA,UAAA,EAAa,UAAU,CAAA,gBAAA,CAAA;AAAA,YACtC;AAAA,cACC,MAAA,EAAQ,MAAA;AAAA,cACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,cAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACpB,UAAA;AAAA,gBACA,SAAA,EAAW,QAAQ,YAAA,EAAa;AAAA,gBAChC,eAAe,OAAA,CAAQ,aAAA;AAAA,gBACvB,eAAA;AAAA,gBACA,kBAAA;AAAA,gBACA,eAAe,WAAA,CAAY;AAAA,eAC3B;AAAA;AACF,WACD;AACA,UAAA,MAAA,GAAS,MAAM,cAAc,IAAA,EAAK;AAClC,UAAA,OAAA,CAAQ,GAAA,CAAI,8BAA8B,MAAM,CAAA;AAAA,QACjD;AAEA,QAAA,IAAI,OAAO,OAAA,EAAS;AACnB,UAAA,OAAA,CAAQ,GAAA,CAAI,2BAAA,EAA6B,MAAA,CAAO,IAAI,CAAA;AACpD,UAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,EAAE,CAAA;AAErC,UAAA,IAAI,MAAA,CAAO,SAAS,eAAA,EAAiB;AACpC,YAAA,OAAA,CAAQ,GAAA;AAAA,cACP;AAAA,aACD;AACA,YAAA,IAAI,OAAO,IAAA,EAAM;AAChB,cAAA,aAAA,CAAc,OAAA,CAAQ;AAAA,gBACrB,YAAA,EAAc,OAAO,IAAA,CAAK,KAAA;AAAA,gBAC1B,YAAA,EAAc,OAAO,IAAA,CAAK,KAAA;AAAA,gBAC1B,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA;AAAA,gBAC7B,cAAA,EAAgB,OAAO,IAAA,CAAK,OAAA;AAAA,gBAC5B,cAAA,EAAgB,OAAO,IAAA,CAAK;AAAA,eAC5B,CAAA;AAAA,YACF;AAEA,YAAA,IAAI,OAAO,OAAA,EAAS;AACnB,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACP,iEAAA;AAAA,gBACA,MAAA,CAAO;AAAA,eACR;AACA,cAAA,OAAA,CAAQ,MAAM,mBAAA,EAAqB;AAAA,gBAClC,SAAS,MAAA,CAAO,OAAA;AAAA,gBAChB,MAAA,EAAQ,OAAA,CAAQ,QAAA,GACb,OAAA,CAAQ,WAAW,GAAA,GACnB,CAAA;AAAA,gBACH,QAAA,EAAU,QAAQ,YAAA,IAAgB;AAAA,eAClC,CAAA;AAAA,YACF;AAAA,UACD,CAAA,MAAA,IAAW,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AACtC,YAAA,OAAA,CAAQ,GAAA;AAAA,cACP,oDAAA;AAAA,cACA,MAAA,CAAO;AAAA,aACR;AACA,YAAA,aAAA,CAAc,GAAA;AAAA,cACb,wBAAA;AAAA,cACA,MAAA,CAAO;AAAA,aACR;AACA,YAAA,aAAA,CAAc,GAAA,CAAI,gBAAA,EAAkB,MAAA,CAAO,MAAM,CAAA;AAEjD,YAAA,IAAI,OAAO,OAAA,EAAS;AACnB,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACP,4DAAA;AAAA,gBACA,MAAA,CAAO;AAAA,eACR;AACA,cAAA,OAAA,CAAQ,MAAM,mBAAA,EAAqB;AAAA,gBAClC,SAAS,MAAA,CAAO,OAAA;AAAA,gBAChB,MAAA,EAAQ,OAAA,CAAQ,QAAA,GACb,OAAA,CAAQ,WAAW,GAAA,GACnB,CAAA;AAAA,gBACH,QAAA,EAAU,QAAQ,YAAA,IAAgB;AAAA,eAClC,CAAA;AAAA,YACF;AAAA,UACD,CAAA,MAAO;AACN,YAAA,OAAA,CAAQ,GAAA;AAAA,cACP,gDAAA;AAAA,cACA,MAAA,CAAO,cAAA;AAAA,cACP,SAAA;AAAA,cACA,MAAA,CAAO;AAAA,aACR;AACA,YAAA,aAAA,CAAc,GAAA;AAAA,cACb,uBAAA;AAAA,cACA,MAAA,CAAO;AAAA,aACR;AACA,YAAA,aAAA,CAAc,GAAA,CAAI,qBAAA,EAAuB,MAAA,CAAO,MAAM,CAAA;AAEtD,YAAA,IAAI,OAAO,WAAA,EAAa;AACvB,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACP;AAAA,eACD;AACA,cAAA,OAAA,CAAQ,MAAM,mBAAA,EAAqB;AAAA,gBAClC,OAAA,EAAS,OAAO,QAAA,EAAU,WAAA;AAAA,gBAC1B,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAY,MAAA,GAAS,GAAA;AAAA,gBACpC,QAAA,EAAU;AAAA,eACV,CAAA;AAAA,YACF;AAEA,YAAA,IAAI,MAAA,CAAO,UAAU,YAAA,EAAc;AAClC,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACP,oDAAA;AAAA,gBACA,OAAO,QAAA,CAAS;AAAA,eACjB;AACA,cAAA,OAAA,CAAQ,MAAM,sBAAA,EAAwB;AAAA,gBACrC,OAAA,EAAS,OAAO,QAAA,CAAS,YAAA;AAAA,gBACzB,gBAAgB,MAAA,CAAO,cAAA;AAAA,gBACvB,QAAQ,MAAA,CAAO;AAAA,eACf,CAAA;AAAA,YACF;AAEA,YAAA,IAAI,MAAA,CAAO,UAAU,WAAA,EAAa;AACjC,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACP,8DAAA;AAAA,gBACA,OAAO,QAAA,CAAS;AAAA,eACjB;AACA,cAAA,OAAA,CAAQ,MAAM,mBAAA,EAAqB;AAAA,gBAClC,OAAA,EAAS,OAAO,QAAA,CAAS,WAAA;AAAA,gBACzB,MAAA,EAAQ,OAAA,CAAQ,QAAA,GACb,OAAA,CAAQ,WAAW,GAAA,GACnB,CAAA;AAAA,gBACH,QAAA,EAAU,QAAQ,YAAA,IAAgB;AAAA,eAClC,CAAA;AAAA,YACF;AAAA,UACD;AAEA,UAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AACnD,UAAA,OAAA,EAAS,SAAA,IAAY;AACrB,UAAA,OAAO,IAAA;AAAA,QACR,CAAA,MAAO;AACN,UAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,iBAAA;AAC5B,UAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,GAAG,CAAA;AACvC,UAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,UAAA,OAAA,EAAS,UAAU,GAAG,CAAA;AACtB,UAAA,OAAO,KAAA;AAAA,QACR;AAAA,MACD,SAAS,GAAA,EAAK;AACb,QAAA,MAAM,GAAA,GACL,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,iBAAA;AACtC,QAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,GAAG,CAAA;AAC1C,QAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,QAAA,OAAA,EAAS,UAAU,GAAG,CAAA;AACtB,QAAA,OAAO,KAAA;AAAA,MACR,CAAA,SAAE;AACD,QAAA,OAAA,CAAQ,IAAI,iDAA4C,CAAA;AACxD,QAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,KAAK,CAAA;AAAA,MAC3C;AAAA,IACD,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,QAAA,EAAU,UAAA,EAAY,OAAO;AAAA,GAC9C;AAEA,EAAA,OAAOD,aAAAA;AAAA,IACN,OAAO;AAAA,MACN,OAAA,EAAS,CAAC,CAAC,SAAA,CAAU,iBAAiB,CAAA;AAAA,MACtC,KAAA,EAAQ,SAAA,CAAU,eAAe,CAAA,IAAgB,IAAA;AAAA,MACjD;AAAA,KACD,CAAA;AAAA,IACA,CAAC,WAAW,QAAQ;AAAA,GACrB;AACD;ACrUA,IAAM,WAAA,GAAc;AAAA,EAClB,SAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,sBAAA;AAAA,EACA,uBAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,uBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA;AAaO,SAAS,aAAA,GAA4B;AAC1C,EAAA,MAAM,EAAE,aAAA,EAAc,GAAIH,kCAAA,EAAiB;AAE3C,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IAChB,CAAC,OAAmB,aAAA,CAAc,SAAA,CAAU,IAAI,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,IACrE,CAAC,aAAa;AAAA,GAChB;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAM,cAAc,QAAA,EAAS;AAAA,IAC7B,CAAC,aAAa;AAAA,GAChB;AACA,EAAA,MAAM,SAAA,GAAYC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAE1E,EAAA,OAAOC,cAAQ,OAAO;AAAA,IACpB,EAAA,EAAI;AAAA,MACF,IAAA,EAAO,SAAA,CAAU,SAAS,CAAA,IAAgB,EAAA;AAAA,MAC1C,QAAA,EAAW,SAAA,CAAU,aAAa,CAAA,IAAgB;AAAA,KACpD;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAO,SAAA,CAAU,aAAa,CAAA,IAAgB,SAAA;AAAA,MAC9C,QAAA,EAAU,CAAC,CAAC,SAAA,CAAU,iBAAiB,CAAA;AAAA,MACvC,QAAA,EAAU,CAAC,CAAC,SAAA,CAAU,iBAAiB,CAAA;AAAA,MACvC,WAAA,EAAc,SAAA,CAAU,oBAAoB,CAAA,IAAgB,CAAA;AAAA,MAC5D,YAAA,EAAe,SAAA,CAAU,qBAAqB,CAAA,IAAgB,CAAA;AAAA,MAC9D,aAAA,EAAgB,SAAA,CAAU,sBAAsB,CAAA,IAAgB,CAAA;AAAA,MAChE,cAAA,EAAiB,SAAA,CAAU,uBAAuB,CAAA,IAAgB,CAAA;AAAA,MAClE,UAAA,EAAa,SAAA,CAAU,mBAAmB,CAAA,IAAgB,EAAA;AAAA,MAC1D,UAAA,EAAa,SAAA,CAAU,mBAAmB,CAAA,IAAgB;AAAA,KAC5D;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAO,SAAA,CAAU,cAAc,CAAA,IAAgB,EAAA;AAAA,MAC/C,OAAA,EAAU,SAAA,CAAU,iBAAiB,CAAA,IAAgB,EAAA;AAAA,MACrD,SAAA,EAAY,SAAA,CAAU,mBAAmB,CAAA,IAAgB,EAAA;AAAA,MACzD,aAAA,EAAe,SAAA,CAAU,uBAAuB,CAAA,KAAM,KAAA;AAAA,MACtD,MAAA,EAAQ,SAAA,CAAU,gBAAgB,CAAA,KAAM,KAAA;AAAA,MACxC,QAAA,EAAW,SAAA,CAAU,kBAAkB,CAAA,IAAgB;AAAA;AACzD,GACF,CAAA,EAAI,CAAC,SAAS,CAAC,CAAA;AACjB;ACtDO,SAAS,WAAA,GAA8B;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,eAAyB,EAAE,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,GAAG,CAAA;AAE7F,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU;AAAA,MACjB,gBAAA;AAAA,MACA,kCAAA;AAAA,MACA,sCAAA;AAAA,MACA,wCAAA;AAAA,MACA,oCAAA;AAAA,MACA,qBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,GAAG,CAAA;AACV,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAE5B,IAAA,SAAS,IAAA,GAAO;AACd,MAAA,MAAM,KAAA,GAAQ,iBAAiB,EAAE,CAAA;AACjC,MAAA,SAAA,CAAU;AAAA,QACR,GAAA,EAAK,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,IAAK,CAAA;AAAA,QAC9B,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA;AAAA,QAClC,MAAA,EAAQ,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA,IAAK,CAAA;AAAA,QACpC,IAAA,EAAM,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,IAAK;AAAA,OACjC,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,EAAK;AAEL,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,IAAI,CAAA;AACxC,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,IAAI,CAAA;AAEtC,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,IAAI,CAAA;AACzC,MAAA,EAAA,CAAG,MAAA,EAAO;AAAA,IACZ,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,MAAA;AACT;ACtCO,SAAS,WAAA,GAA6B;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,cAAAA,CAAwB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,CAAA;AAC9E,EAAA,MAAM,aAAaE,YAAA,EAAsC;AAEzD,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAGnC,IAAA,IAAI,qBAAqB,SAAA,EAAW;AAClC,MAAA,MAAM,KAAM,SAAA,CAAkB,eAAA;AAC9B,MAAA,EAAA,CAAG,eAAA,GAAkB,IAAA;AAErB,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,MAAM,CAAA,GAAI,GAAG,YAAA,CAAa,MAAA;AAC1B,QAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,UAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,KAAK,MAAA,KAAY,CAAA,GAAI,GAAI,OAAO,IAAA;AACzD,UAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,QACpC,CAAC,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,EAAA,CAAG,gBAAA,CAAiB,kBAAkB,OAAO,CAAA;AAC7C,MAAA,OAAA,EAAQ;AACR,MAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,gBAAA,EAAkB,OAAO,CAAA;AAAA,IAC/D;AAGA,IAAA,MAAM,KAAK,MAAA,CAAO,cAAA;AAClB,IAAA,IAAI,CAAC,EAAA,EAAI;AAIT,IAAA,IAAI,eAAe,MAAA,CAAO,WAAA;AAE1B,IAAA,SAAS,OAAA,GAAU;AACjB,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,GAAI,MAAM,CAAA;AAEtD,MAAA,MAAM,IAAI,QAAA,GAAW,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GAAI,CAAA;AACjD,MAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,QAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,KAAK,MAAA,KAAY,CAAA,GAAI,GAAI,OAAO,IAAA;AACzD,QAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,MACpC,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,SAAS,gBAAA,GAAmB;AAC1B,MAAA,OAAA,EAAQ;AAGR,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,UAAA,CAAW,OAAA,GAAU,UAAA,CAAW,OAAA,EAAS,GAAI,CAAA;AAAA,IAC/C;AAEA,IAAA,SAAS,cAAA,GAAiB;AAGxB,MAAA,YAAA,GAAe,MAAA,CAAO,WAAA;AACtB,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,gBAAgB,CAAA;AAC9C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,qBAAqB,cAAc,CAAA;AAC3D,IAAA,OAAA,EAAQ;AAER,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,gBAAgB,CAAA;AACjD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,cAAc,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,qBAAqB,cAAc,CAAA;AAAA,IAChE,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,KAAA;AACT;AC5FA,IAAM,SAAA,GAAY;AAAA,EAChB,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAA;AAWO,SAAS,WAAA,GAAwB;AACtC,EAAA,MAAM,EAAE,aAAA,EAAc,GAAIN,kCAAA,EAAiB;AAE3C,EAAA,MAAM,SAAA,GAAYC,iBAAAA;AAAA,IAChB,CAAC,OAAmB,aAAA,CAAc,SAAA,CAAU,IAAI,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,IACnE,CAAC,aAAa;AAAA,GAChB;AACA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,MAAM,cAAc,QAAA,EAAS;AAAA,IAC7B,CAAC,aAAa;AAAA,GAChB;AACA,EAAA,MAAM,SAAA,GAAYC,0BAAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAE1E,EAAA,OAAOC,cAAQ,OAAO;AAAA,IACpB,SAAA,EAAY,SAAA,CAAU,gBAAgB,CAAA,IAAgB,EAAA;AAAA,IACtD,YAAA,EAAe,SAAA,CAAU,mBAAmB,CAAA,IAAgB,CAAA;AAAA,IAC5D,OAAA,EAAU,SAAA,CAAU,cAAc,CAAA,IAAgB,CAAA;AAAA,IAClD,KAAA,EAAQ,SAAA,CAAU,YAAY,CAAA,IAAgB,CAAA;AAAA,IAC9C,kBAAA,EAAqB,SAAA,CAAU,yBAAyB,CAAA,IAAgB,CAAA;AAAA,IACxE,SAAA,EAAY,SAAA,CAAU,gBAAgB,CAAA,IAAgB;AAAA,GACxD,CAAA,EAAI,CAAC,SAAS,CAAC,CAAA;AACjB;;;AC5BO,SAAS,SAAA,GAAyB;AACvC,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,KAAYH,kCAAA,EAAiB;AAE3D,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,QAAQ,YAAA,EAAa;AAAA,IAChC,WAAW,YAAA,EAAa;AAAA,IACxB,MAAM,OAAA,EAAQ;AAAA,IACd,WAAWQ,8BAAA,EAAa;AAAA,IACxB,aAAa,cAAA,EAAe;AAAA,IAC5B,YAAYC,+BAAA,EAAc;AAAA,IAC1B,UAAU,WAAA,EAAY;AAAA,IACtB,UAAU,WAAA,EAAY;AAAA,IACtB,SAAS,UAAA;AAAW,GACtB;AACF;ACdA,IAAM,IAAA,GAAO,mEAAA;AAEb,IAAM,UAAA,GAAa,CAAC,OAAA,MAA2C;AAAA,EAC7D,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ,CAAA,UAAA,EAAa,OAAA,GAAU,MAAA,GAAS,SAAS,CAAA,CAAA;AAAA,EACjD,YAAA,EAAc,KAAA;AAAA,EACd,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,IAAA;AAAA,EACZ,OAAA,EAAS,MAAA;AAAA,EACT,eAAA,EAAiB,MAAA;AAAA,EACjB,SAAA,EAAW,YAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,OAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,MAAA;AAAA,EACP,YAAA,EAAc,KAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAMA,SAAS,eAAA,GAAkB;AACzB,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,KAAA,EAAO,UAAA,EAAY,QAAA,EAAS,EAC9D,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,QAAA,EAAU,QAAQ,UAAA,EAAY,GAAA,EAAK,OAAO,SAAA,EAAW,UAAA,EAAY,QAAQ,MAAA,EAAQ,mBAAA,EAAqB,cAAc,KAAA,EAAO,OAAA,EAAS,WAAW,UAAA,EAAY,IAAA,IAAQ,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,oBACtLA,cAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,KAAA,EAAO,SAAA,EAAW,YAAY,MAAA,EAAQ,MAAA,EAAQ,qBAAqB,YAAA,EAAc,KAAA,EAAO,SAAS,SAAA,EAAW,UAAA,EAAY,IAAA,EAAK,EAAG,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,oBACpLA,cAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,KAAA,EAAO,SAAA,EAAW,YAAY,MAAA,EAAQ,MAAA,EAAQ,qBAAqB,YAAA,EAAc,KAAA,EAAO,SAAS,SAAA,EAAW,UAAA,EAAY,IAAA,EAAK,EAAG,QAAA,EAAA,MAAA,EAAI;AAAA,GAAA,EACxL,CAAA;AAEJ;AAEA,SAAS,OAAA,GAAU;AACjB,EAAA,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,KAAA,EAAO,EAAE,OAAA,EAAS,KAAI,EAChF,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAA,EAAM,CAAA,EAAE,KAAA,EAAM,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,MAAA,EAAO,CAAA;AAAA,oBAClEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,GAAA,EAAI,IAAA,EAAK,MAAA,EAAO,CAAA;AAAA,oBACpDA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,MAAK,MAAA,EAAO,CAAA;AAAA,oBAC3DA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,QAAA,EAAS,GAAA,EAAI,IAAA,EAAK,MAAA,EAAO,UAAA,EAAY,IAAA,EAAM,QAAA,EAAA,KAAA,EAAG;AAAA,GAAA,EACpE,CAAA;AAEJ;AAMA,SAAS,gBAAA,CAAiB,EAAE,OAAA,EAAQ,EAA6B;AAC/D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIN,eAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,eAAS,EAAE,CAAA;AACjC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,SAAS,CAAA;AAChD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,UAAA,GAAaE,aAAO,KAAK,CAAA;AAE/B,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,OAAA,IAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,KAAgB;AACxC,IAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACjD,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,KAAK,EAAE,IAAA,EAAK;AAAA,EAC/C,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAAgB;AACpC,IAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAChD,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AACzE,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,uCACG,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,MAAK,EAE7B,QAAA,EAAA;AAAA,oBAAAI,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,QAAO,EACjC,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,sCACpC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAW,EACjC,QAAA,EAAA;AAAA,wBAAAA,cAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,UAAA;AAAA,YACP,QAAA,EAAU,CAAC,CAAA,KAAM,aAAA,CAAc,iBAAiB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,YAC/D,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,CAAA;AAAA,YACrC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,YAClC,WAAA,EAAY,qBAAA;AAAA,YACZ,KAAA,EAAO,UAAA,CAAW,YAAA,KAAiB,MAAM;AAAA;AAAA,SAC3C;AAAA,wBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,OAAO,SAAA,EAAW,kBAAA,EAAmB,EAC3F,QAAA,kBAAAA,cAAA,CAAC,mBAAgB,CAAA,EACnB;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,mBAAA,EAAqB,SAAA,EAAW,GAAA,EAAK,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAO,EAC/F,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBACrCA,cAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,CAAC,CAAA,KAAM,SAAA,CAAU,aAAa,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,YACvD,OAAA,EAAS,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAAA,YACvC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,YAClC,WAAA,EAAY,SAAA;AAAA,YACZ,KAAA,EAAO,UAAA,CAAW,YAAA,KAAiB,QAAQ;AAAA;AAAA;AAC7C,OAAA,EACF,CAAA;AAAA,sCACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,cAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,wCACtC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAW,EACjC,QAAA,EAAA;AAAA,0BAAAA,cAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,GAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,EAAE,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,cACrE,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,cACpC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,cAClC,WAAA,EAAY,KAAA;AAAA,cACZ,KAAA,EAAO,UAAA,CAAW,YAAA,KAAiB,KAAK;AAAA;AAAA,WAC1C;AAAA,0BACAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,OAAO,SAAA,EAAW,kBAAA,EAAmB,EAC3F,QAAA,kBAAAA,cAAA,CAAC,WAAQ,CAAA,EACX;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oCAGC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,QAAO,EACjC,QAAA,EAAA;AAAA,sBAAAA,cAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,sBACjCD,eAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,OAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC1C,OAAA,EAAS,MAAM,eAAA,CAAgB,SAAS,CAAA;AAAA,UACxC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,UAClC,KAAA,EAAO;AAAA,YACL,GAAG,UAAA,CAAW,YAAA,KAAiB,SAAS,CAAA;AAAA,YACxC,UAAA,EAAY,MAAA;AAAA,YACZ,eAAA,EAAiB,CAAA,sKAAA,CAAA;AAAA,YACjB,gBAAA,EAAkB,WAAA;AAAA,YAClB,kBAAA,EAAoB,mBAAA;AAAA,YACpB,YAAA,EAAc;AAAA,WAChB;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAC,cAAA,CAAC,YAAO,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,4BACjBA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BACbA,cAAA,CAAC,YAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BACbA,cAAA,CAAC,YAAO,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,4BACnBA,cAAA,CAAC,YAAO,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,4BACnBA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BAChBA,cAAA,CAAC,YAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BACbA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,4BACnBA,cAAA,CAAC,YAAO,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,4BACtBA,cAAA,CAAC,YAAO,QAAA,EAAA,eAAA,EAAa;AAAA;AAAA;AAAA;AACvB,KAAA,EACF,CAAA;AAAA,oBAGAA,cAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,UAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,KAAK,MAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,IAAA,IAAQ,QAAA,EAAA,oIAAA,EAEhG;AAAA,GAAA,EACF,CAAA;AAEJ;AAMA,SAAS,gBAAA,CAAiB,EAAE,OAAA,EAAS,OAAA,EAAQ,EAA6D;AACxG,EAAA,MAAM,UAAA,GAAaJ,aAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,eAAS,EAAE,CAAA;AACjC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,SAAS,CAAA;AAChD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEpE,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,OAAA,IAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,KAAgB;AACxC,IAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACjD,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,KAAK,EAAE,IAAA,EAAK;AAAA,EAC/C,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAAgB;AACpC,IAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAChD,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AACzE,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,OAAA,MAA2C;AAAA,IACrE,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,WAAA;AAAA,IACT,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,CAAA,UAAA,EAAa,OAAA,GAAU,MAAA,GAAS,SAAS,CAAA,CAAA;AAAA,IACvD,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,OAAA,EAAS,MAAA;AAAA,IACT,eAAA,EAAiB,MAAA;AAAA,IACjB,SAAA,EAAW;AAAA,GACb,CAAA;AAGA,EAAA,MAAM,YAAA,GAAe,OAAA,EAAS,QAAA,GAAW,OAAA,CAAQ,aAAa,OAAA,EAAS,KAAA;AAEvE,EAAA,uBACEI,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAY,IAAA,EAAM,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,QAAO,EAEvH,QAAA,EAAA;AAAA,IAAA,OAAA,oBACCA,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,WAAA,EAAa,YAAA,EAAc,qBAAoB,EACpE,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,QAAA,EAAU,QAAQ,KAAA,EAAO,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAM,EAAG,QAAA,EAAA;AAAA,QAAA,MAAA;AAAA,QAC/D,OAAA,CAAQ,eAAe,OAAA,CAAQ;AAAA,OAAA,EACtC,CAAA;AAAA,sBACAA,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAM,EACjF,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,cAAc,WAAA,EAAY;AAAA,QAAG;AAAA,OAAA,EACxC,CAAA;AAAA,MACC,OAAA,CAAQ,QAAA,oBACPA,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAAG,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,wCACzC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,cAAA,EAAgB,aAAY,EAAI,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,cAAc,WAAA,EAAY;AAAA,UAAG,OAAA,CAAQ;AAAA,SAAA,EAAM,CAAA;AAAA,QAAO,SAAA;AAAA,QAAQ,OAAA,CAAQ;AAAA,OAAA,EAChI,CAAA;AAAA,sBAEFC,cAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAO;AAAA,YACL,SAAA,EAAW,MAAA;AAAA,YACX,OAAA,EAAS,UAAA;AAAA,YACT,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ,mBAAA;AAAA,YACR,eAAA,EAAiB,MAAA;AAAA,YACjB,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,MAAA;AAAA,YACV,MAAA,EAAQ,SAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oCAGD,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,QAAO,EAE5B,QAAA,EAAA;AAAA,sBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,QAAO,EACjC,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,UAAU,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,wBACvEA,cAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,KAAA,EAAO,KAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,OAAA,EAAS,MAAM,eAAA,CAAgB,OAAO,CAAA;AAAA,YACtC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,YAClC,WAAA,EAAY,iBAAA;AAAA,YACZ,KAAA,EAAO,kBAAA,CAAmB,YAAA,KAAiB,OAAO;AAAA;AAAA;AACpD,OAAA,EACF,CAAA;AAAA,sCAGC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,QAAO,EACjC,QAAA,EAAA;AAAA,wBAAAA,cAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,UAAU,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAAG,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBAClFD,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,qBAAqB,YAAA,EAAc,KAAA,EAAO,QAAA,EAAU,QAAA,EAAS,EACjF,QAAA,EAAA;AAAA,0BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAW,EACjC,QAAA,EAAA;AAAA,4BAAAC,cAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,KAAA,EAAO,UAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM,aAAA,CAAc,iBAAiB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBAC/D,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,CAAA;AAAA,gBACrC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,gBAClC,WAAA,EAAY,qBAAA;AAAA,gBACZ,KAAA,EAAO,EAAE,GAAG,kBAAA,CAAmB,iBAAiB,MAAM,CAAA,EAAG,SAAS,MAAA;AAAO;AAAA,aAC3E;AAAA,4BACAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,OAAO,SAAA,EAAW,kBAAA,EAAmB,EAC3F,QAAA,kBAAAA,cAAA,CAAC,mBAAgB,CAAA,EACnB;AAAA,WAAA,EACF,CAAA;AAAA,0BACAD,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,mBAAA,EAAqB,WAAU,EAC5D,QAAA,EAAA;AAAA,4BAAAC,cAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,KAAA,EAAO,MAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM,SAAA,CAAU,aAAa,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBACvD,OAAA,EAAS,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAAA,gBACvC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,gBAClC,WAAA,EAAY,SAAA;AAAA,gBACZ,KAAA,EAAO,EAAE,GAAG,kBAAA,CAAmB,YAAA,KAAiB,QAAQ,CAAA,EAAG,WAAA,EAAa,mBAAA,EAAqB,OAAA,EAAS,MAAA;AAAO;AAAA,aAC/G;AAAA,4CACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAW,EACjC,QAAA,EAAA;AAAA,8BAAAA,cAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,MAAA;AAAA,kBACL,KAAA,EAAO,GAAA;AAAA,kBACP,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,EAAE,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,kBACrE,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,kBACpC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,kBAClC,WAAA,EAAY,KAAA;AAAA,kBACZ,KAAA,EAAO,EAAE,GAAG,kBAAA,CAAmB,iBAAiB,KAAK,CAAA,EAAG,SAAS,MAAA;AAAO;AAAA,eAC1E;AAAA,8BACAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,OAAO,SAAA,EAAW,kBAAA,EAAmB,EAC3F,QAAA,kBAAAA,cAAA,CAAC,WAAQ,CAAA,EACX;AAAA,aAAA,EACF;AAAA,WAAA,EACF;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sCAGC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,QAAO,EACjC,QAAA,EAAA;AAAA,wBAAAA,cAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,UAAU,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAAG,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,wBACjFA,cAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,IAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACvC,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,CAAA;AAAA,YACrC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,YAClC,WAAA,EAAY,mBAAA;AAAA,YACZ,KAAA,EAAO,UAAA,CAAW,YAAA,KAAiB,MAAM;AAAA;AAAA;AAC3C,OAAA,EACF,CAAA;AAAA,sCAGC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,QAAO,EACjC,QAAA,EAAA;AAAA,wBAAAA,cAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,UAAU,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAAG,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,wBACnFD,eAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,OAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC1C,OAAA,EAAS,MAAM,eAAA,CAAgB,SAAS,CAAA;AAAA,YACxC,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,YAClC,KAAA,EAAO;AAAA,cACL,GAAG,UAAA,CAAW,YAAA,KAAiB,SAAS,CAAA;AAAA,cACxC,UAAA,EAAY,MAAA;AAAA,cACZ,eAAA,EAAiB,CAAA,sKAAA,CAAA;AAAA,cACjB,gBAAA,EAAkB,WAAA;AAAA,cAClB,kBAAA,EAAoB,mBAAA;AAAA,cACpB,YAAA,EAAc;AAAA,aAChB;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAC,cAAA,CAAC,YAAO,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,8BACjBA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,8BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,8BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,8BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,8BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,8BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,8BACfA,cAAA,CAAC,YAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,8BACbA,cAAA,CAAC,YAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,8BACbA,cAAA,CAAC,YAAO,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACnBA,cAAA,CAAC,YAAO,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACnBA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,8BAChBA,cAAA,CAAC,YAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,8BACbA,cAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BACdA,cAAA,CAAC,YAAO,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACnBA,cAAA,CAAC,YAAO,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,8BACtBA,cAAA,CAAC,YAAO,QAAA,EAAA,eAAA,EAAa;AAAA;AAAA;AAAA;AACvB,OAAA,EACF,CAAA;AAAA,sBAGAA,cAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAQ,IAAA;AAAA,UACR,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS,MAAA;AAAA,YACT,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ,MAAA;AAAA,YACR,eAAA,EAAiB,SAAA;AAAA,YACjB,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,MAAA;AAAA,YACV,UAAA,EAAY,GAAA;AAAA,YACZ,MAAA,EAAQ,SAAA;AAAA,YACR,UAAA,EAAY,IAAA;AAAA,YACZ,OAAA,EAAS;AAAA,WACX;AAAA,UACD,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBAGAD,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAAG,QAAA,EAAA;AAAA,QAAA,aAAA;AAAA,wBAC5EC,cAAA,CAAC,UAAK,KAAA,EAAO,EAAE,YAAY,GAAA,EAAK,aAAA,EAAe,QAAA,EAAS,EAAG,QAAA,EAAA,QAAA,EAAM;AAAA,OAAA,EAC9E;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,IAAM,qBAAA,GAAwBC,gBAAA;AAAA,EACnC,SAASC,sBAAAA,CACP;AAAA,IACE,SAAA;AAAA,IACA,IAAA,GAAO,UAAA;AAAA,IACP,OAAA,GAAU,UAAA;AAAA,IACV,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,MAAM,EAAE,aAAA,EAAe,OAAA,EAAS,QAAA,KAAab,kCAAA,EAAiB;AAE9D,IAAA,MAAM,eAAe,IAAA,KAAS,eAAA;AAG9B,IAAA,MAAM,OAAA,GAAUG,cAAQ,MAAM;AAC5B,MAAA,IAAI,SAAA,SAAkB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,IAAK,IAAA;AAClE,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,4BAA4B,CAAA;AACjE,MAAA,OAAO,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,UAAU,CAAA,IAAK,IAAA;AAAA,IACtD,CAAA,EAAG,CAAC,SAAA,EAAW,QAAA,EAAU,aAAa,CAAC,CAAA;AAGvC,IAAA,MAAM,aAAA,GAAgBI,aAAO,KAAK,CAAA;AAClC,IAAAD,gBAAU,MAAM;AACd,MAAA,IAAI,cAAc,OAAA,EAAS;AAC3B,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,MAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,KAAK,CAAA;AAC1C,MAAA,OAAA,CAAQ,MAAM,gBAAA,EAAkB;AAAA,QAC9B,WAAW,OAAA,EAAS,EAAA;AAAA,QACpB,OAAA,EAAS,OAAA,EAAS,aAAA,IAAiB,OAAA,EAAS,YAAA;AAAA,QAC5C,aAAa,OAAA,EAAS;AAAA,OACvB,CAAA;AAAA,IACH,CAAA,EAAG,CAAC,OAAA,EAAS,OAAA,EAAS,aAAa,CAAC,CAAA;AAGpC,IAAA,MAAM,YAAA,GAAeL,kBAAY,YAAY;AAC3C,MAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,IAAI,CAAA;AAGzC,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAE3C,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,MAAM,wBAAwB,CAAA;AAEtC,QAAA,IAAI,YAAA,EAAc;AAEhB,UAAA,aAAA,CAAc,OAAA,CAAQ;AAAA,YACpB,YAAA,EAAc,MAAA;AAAA,YACd,YAAA,EAAc,MAAA;AAAA,YACd,eAAA,EAAiB,EAAA;AAAA,YACjB,cAAA,EAAgB,IAAA;AAAA,YAChB,cAAA,EAAgB,QAAA;AAAA,YAChB,eAAA,EAAiB;AAAA,WAClB,CAAA;AACD,UAAA,SAAA,IAAY;AACZ,UAAA;AAAA,QACF;AAGA,QAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,EAAE,CAAA;AACrC,QAAA,OAAA,CAAQ,MAAM,mBAAA,EAAqB;AAAA,UACjC,MAAA,EAAQ,OAAA,EAAS,QAAA,GAAW,OAAA,CAAQ,WAAW,GAAA,GAAM,CAAA;AAAA,UACrD,QAAA,EAAU,SAAS,YAAA,IAAgB;AAAA,SACpC,CAAA;AACD,QAAA,SAAA,IAAY;AAAA,MACd,SAAS,GAAA,EAAc;AACrB,QAAA,MAAM,GAAA,GAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,mBAAA;AACjD,QAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,QAAA,OAAA,GAAU,GAAG,CAAA;AAAA,MACf,CAAA,SAAE;AACA,QAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF,CAAA,EAAG,CAAC,YAAA,EAAc,aAAA,EAAe,SAAS,OAAA,EAAS,SAAA,EAAW,OAAO,CAAC,CAAA;AAGtE,IAAAa,yBAAA,CAAoB,GAAA,EAAK,OAAO,EAAE,MAAA,EAAQ,cAAa,CAAA,EAAI,CAAC,YAAY,CAAC,CAAA;AAEzE,IAAA,uBACEH,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACF,QAAA,EAAA,OAAA,KAAY,UAAA,mBACXA,cAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAkB,OAAA,EAAkB,CAAA,mBAEtDA,cAAA,CAAC,gBAAA,EAAA,EAAiB,SAAkB,CAAA,EAExC,CAAA;AAAA,EAEJ;AACF,CAAA;ACtfA,IAAMI,aAAAA,GAAe,2BAAA;AAiCrB,IAAM,YAAY,MAAM,OAAO,eAAe,WAAA,IAAe,CAAC,CAAE,UAAA,CAAuC,iBAAA;AAevG,IAAM,gBAAA,GAAmBH,gBAAAA;AAAA,EACvB,SAASI,iBAAAA,CAAiB,EAAE,WAAA,EAAa,YAAA,EAAc,WAAW,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO,EAAG,GAAA,EAAK;AACjG,IAAA,MAAM,SAASC,uBAAA,EAAU;AACzB,IAAA,MAAM,WAAWC,yBAAA,EAAY;AAC7B,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIb,eAAwB,IAAI,CAAA;AACtD,IAAA,MAAM,EAAE,aAAA,EAAe,UAAA,EAAY,OAAA,EAAS,QAAA,KAAaL,kCAAA,EAAiB;AAC1E,IAAA,MAAM,UAAA,GAAaO,aAAO,KAAK,CAAA;AAG/B,IAAAD,gBAAU,MAAM;AACd,MAAA,IAAI,MAAA,IAAU,QAAA,IAAY,CAAC,UAAA,CAAW,OAAA,EAAS;AAC7C,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,QAAA,OAAA,IAAU;AAAA,MACZ;AAAA,IACF,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAC,CAAA;AAE9B,IAAA,MAAM,YAAA,GAAeL,kBAAY,YAAY;AAC3C,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,QAAA,EAAU;AACxB,QAAA,MAAM,GAAA,GAAM,mBAAA;AACZ,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,OAAA,GAAU,GAAG,CAAA;AACb,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,IAAI,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,WAAA,KAAgB,OAAA,GAAU,MAAA,CAAO,eAAe,MAAA,CAAO,cAAA;AACzE,QAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,CAAU;AAAA,UACpC,QAAA;AAAA,UACA,QAAA,EAAU,aAAA;AAAA,UACV,aAAA,EAAe,EAAE,UAAA,EAAY,MAAA,CAAO,SAAS,IAAA;AAAK,SACnD,CAAA;AAED,QAAA,IAAI,cAAc,KAAA,EAAO;AACvB,UAAA,MAAM,GAAA,GAAM,aAAA,CAAc,KAAA,CAAM,OAAA,IAAW,gBAAA;AAC3C,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,UAAA,OAAA,GAAU,GAAG,CAAA;AACb,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,MAAM,wBAAwB,CAAA;AAEtC,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,IAAA,GAAO,eAAA,IAAmB,aAAA,GAC3B,aAAA,CAA0C,aAAA,GAC3C,KAAA,CAAA;AAEJ,UAAA,IAAI,CAAC,MAAM,EAAA,EAAI;AACb,YAAA,MAAM,GAAA,GAAM,4CAAA;AACZ,YAAA,QAAA,CAAS,GAAG,CAAA;AACZ,YAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,YAAA,OAAA,GAAU,GAAG,CAAA;AACb,YAAA;AAAA,UACF;AAEA,UAAA,MAAMkB,YAAW,MAAM,KAAA;AAAA,YACrB,CAAA,EAAGJ,aAAY,CAAA,UAAA,EAAa,UAAU,CAAA,qBAAA,CAAA;AAAA,YACtC;AAAA,cACE,MAAA,EAAQ,MAAA;AAAA,cACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,cAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,UAAA;AAAA,gBACA,SAAA,EAAW,QAAQ,YAAA,EAAa;AAAA,gBAChC,iBAAiB,IAAA,CAAK;AAAA,eACvB;AAAA;AACH,WACF;AAEA,UAAA,MAAMK,OAAAA,GAAS,MAAMD,SAAAA,CAAS,IAAA,EAAK;AAEnC,UAAA,IAAI,CAACC,QAAO,OAAA,EAAS;AACnB,YAAA,MAAM,GAAA,GAAMA,QAAO,KAAA,IAAS,wBAAA;AAC5B,YAAA,QAAA,CAAS,GAAG,CAAA;AACZ,YAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,YAAA,OAAA,GAAU,GAAG,CAAA;AACb,YAAA;AAAA,UACF;AAEA,UAAA,aAAA,CAAc,OAAA,CAAQ;AAAA,YACpB,YAAA,EAAcA,QAAO,IAAA,CAAK,KAAA;AAAA,YAC1B,YAAA,EAAcA,QAAO,IAAA,CAAK,KAAA;AAAA,YAC1B,eAAA,EAAiBA,QAAO,IAAA,CAAK,QAAA;AAAA,YAC7B,cAAA,EAAgBA,QAAO,IAAA,CAAK,OAAA;AAAA,YAC5B,cAAA,EAAgBA,QAAO,IAAA,CAAK,OAAA;AAAA,YAC5B,eAAA,EAAiB;AAAA,WAClB,CAAA;AAED,UAAA,SAAA,IAAY;AACZ,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,eAAA,GAAkB,eAAA,IAAmB,aAAA,GACrC,aAAA,CAA0C,eAAmC,EAAA,GAC/E,KAAA,CAAA;AAEJ,QAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,4BAA4B,CAAA;AACjE,QAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,UAAU,CAAA;AAExD,QAAA,IAAI,CAAC,SAAS,aAAA,EAAe;AAC3B,UAAA,MAAM,GAAA,GAAM,6CAAA;AACZ,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,UAAA,OAAA,GAAU,GAAG,CAAA;AACb,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACrB,CAAA,EAAGL,aAAY,CAAA,UAAA,EAAa,UAAU,CAAA,gBAAA,CAAA;AAAA,UACtC;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,UAAA;AAAA,cACA,SAAA,EAAW,QAAQ,YAAA,EAAa;AAAA,cAChC,eAAe,OAAA,CAAQ,aAAA;AAAA,cACvB,eAAA,EAAiB,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,SAAA,GAAY,KAAA,CAAA;AAAA,cACxD,aAAA,EAAe,WAAA,KAAgB,SAAA,GAAY,eAAA,GAAkB,KAAA;AAAA,aAC9D;AAAA;AACH,SACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,EAAE,CAAA;AACrC,UAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,QAAA,EAAU,WAAA,EAAa;AAClD,YAAA,OAAA,CAAQ,MAAM,mBAAA,EAAqB;AAAA,cACjC,MAAA,EAAQ,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,WAAW,GAAA,GAAM,CAAA;AAAA,cACpD,QAAA,EAAU,QAAQ,YAAA,IAAgB;AAAA,aACnC,CAAA;AAAA,UACH;AACA,UAAA,SAAA,IAAY;AAAA,QACd,CAAA,MAAO;AACL,UAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,2BAAA;AAC5B,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,UAAA,OAAA,GAAU,GAAG,CAAA;AAAA,QACf;AAAA,MACF,SAAS,GAAA,EAAc;AACrB,QAAA,MAAM,GAAA,GAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,mBAAA;AACjD,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACtC,QAAA,OAAA,GAAU,GAAG,CAAA;AAAA,MACf,CAAA,SAAE;AACA,QAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,WAAA,EAAa,YAAA,EAAc,aAAA,EAAe,UAAA,EAAY,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,OAAO,CAAC,CAAA;AAGlH,IAAAD,yBAAAA,CAAoB,KAAK,OAAO,EAAE,QAAQ,YAAA,EAAa,CAAA,EAAI,CAAC,YAAY,CAAC,CAAA;AAEzE,IAAA,uBACEJ,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,eAACU,4BAAA,EAAA,EAAe,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,IAAU,QAAO,EAAG,CAAA;AAAA,MACtD,KAAA,oBACCV,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,MAAA,IAC1D,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF,CAAA;AAMA,IAAM,qBAAA,GAAwBC,gBAAAA;AAAA,EAC5B,SAASU,sBAAAA,CACP;AAAA,IACE,SAAA;AAAA,IACA,IAAA,GAAO,UAAA;AAAA,IACP,OAAA,GAAU,UAAA;AAAA,IACV,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,aAAA,EAAe,QAAA,KAAatB,kCAAA,EAAiB;AAC1E,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,WAAA,CAAoB,YAAY,CAAA;AAEhD,IAAA,MAAM,eAAe,IAAA,KAAS,eAAA;AAG9B,IAAA,MAAM,OAAA,GAAUG,cAAQ,MAAM;AAC5B,MAAA,IAAI,SAAA,SAAkB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,IAAK,IAAA;AAClE,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,4BAA4B,CAAA;AACjE,MAAA,OAAO,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,UAAU,CAAA,IAAK,IAAA;AAAA,IACtD,CAAA,EAAG,CAAC,SAAA,EAAW,QAAA,EAAU,aAAa,CAAC,CAAA;AAGvC,IAAA,MAAM,WAAA,GAAcA,cAAQ,MAA2B;AACrD,MAAA,IAAI,cAAc,OAAO,SAAA;AACzB,MAAA,IAAI,OAAA,EAAS,QAAA,IAAY,CAAC,OAAA,CAAQ,WAAW,OAAO,OAAA;AACpD,MAAA,OAAO,SAAA;AAAA,IACT,CAAA,EAAG,CAAC,OAAA,EAAS,YAAY,CAAC,CAAA;AAE1B,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIE,eAAwC,IAAI,CAAA;AACtF,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACpE,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,cAAA,GAAiBE,aAAO,KAAK,CAAA;AAGnC,IAAAD,gBAAU,MAAM;AACd,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,UAAA,IAAc,eAAe,OAAA,EAAS;AACrD,MAAA,IAAI,CAAC,SAAS,YAAA,EAAc;AAE5B,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,IAAI,CAAA;AAEzC,MAAA,MAAM,eAAe,YAAY;AAC/B,QAAA,IAAI;AAEF,UAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,YAAA,MAAM,WAAW,MAAM,KAAA;AAAA,cACrB,CAAA,EAAGS,aAAY,CAAA,UAAA,EAAa,UAAU,CAAA,wBAAA,CAAA;AAAA,cACtC;AAAA,gBACE,MAAA,EAAQ,MAAA;AAAA,gBACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,gBAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,kBACnB,UAAA;AAAA,kBACA,SAAA,EAAW,QAAQ,YAAA,EAAa;AAAA,kBAChC,aAAA,EAAe,KAAA;AAAA,kBACf,SAAS,OAAA,CAAQ,YAAA;AAAA,kBACjB,eAAA,EAAiB,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,SAAA,GAAY,KAAA;AAAA,iBACzD;AAAA;AACH,aACF;AAEA,YAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,YAAA,IAAI,CAAC,OAAO,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,SAAS,mCAAmC,CAAA;AAExF,YAAA,gBAAA,CAAiBX,mBAAA,CAAW,MAAA,CAAO,cAAc,CAAC,CAAA;AAClD,YAAA,eAAA,CAAgB,OAAO,YAAY,CAAA;AAAA,UACrC,CAAA,MAAO;AACL,YAAA,MAAM,WAAW,WAAA,KAAgB,OAAA,GAC7B,aAAa,UAAU,CAAA,oBAAA,CAAA,GACvB,aAAa,UAAU,CAAA,sBAAA,CAAA;AAE3B,YAAA,MAAM,IAAA,GAAgC;AAAA,cACpC,UAAA;AAAA,cACA,SAAA,EAAW,QAAQ,YAAA,EAAa;AAAA,cAChC,aAAA,EAAe,KAAA;AAAA,cACf,SAAS,OAAA,CAAQ;AAAA,aACnB;AAEA,YAAA,IAAI,YAAA,OAAmB,YAAA,GAAe,IAAA;AAEtC,YAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAGW,aAAY,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,cACzD,MAAA,EAAQ,MAAA;AAAA,cACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,cAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,aAC1B,CAAA;AAED,YAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,YAAA,IAAI,CAAC,OAAO,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,SAAS,yBAAyB,CAAA;AAE9E,YAAA,gBAAA,CAAiBX,mBAAA,CAAW,MAAA,CAAO,cAAc,CAAC,CAAA;AAClD,YAAA,eAAA,CAAgB,OAAO,YAAY,CAAA;AACnC,YAAA,aAAA,CAAc,GAAA,CAAI,uBAAA,EAAyB,MAAA,CAAO,UAAU,CAAA;AAAA,UAC9D;AAEA,UAAA,OAAA,CAAQ,MAAM,gBAAA,EAAkB;AAAA,YAC9B,WAAW,OAAA,CAAQ,EAAA;AAAA,YACnB,OAAA,EAAS,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,YAAA;AAAA,YAC1C,aAAa,OAAA,CAAQ;AAAA,WACtB,CAAA;AAAA,QACH,SAAS,GAAA,EAAc;AACrB,UAAA,MAAM,GAAA,GAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,8BAAA;AACjD,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,aAAA,CAAc,GAAA,CAAI,iBAAiB,GAAG,CAAA;AAAA,QACxC,CAAA,SAAE;AACA,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,aAAA,CAAc,GAAA,CAAI,mBAAmB,KAAK,CAAA;AAAA,QAC5C;AAAA,MACF,CAAA;AAEA,MAAA,YAAA,EAAa;AAAA,IACf,CAAA,EAAG,CAAC,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,aAAa,YAAA,EAAc,OAAA,EAAS,OAAA,EAAS,aAAa,CAAC,CAAA;AAE3F,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,uBAAOO,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,SAAA,IAAa,QAAA,EAAA,yBAAA,EAAuB,CAAA;AAAA,IAC9H;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,UAAU,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,MAAA,IAAU,QAAA,EAAA,yCAAA,EAAuC,CAAA;AAAA,IAChK;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,UAAU,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,MAAA,IAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAChI;AAEA,IAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,YAAA,EAAc;AACnC,MAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,SAAA,IAAa,QAAA,EAAA,yBAAA,EAAuB,CAAA;AAAA,IAC9H;AAGA,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAAA,cAAAA;AAAA,QAACY,sCAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,aAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,YAAA;AAAA,YACA,YAAY,MAAM;AAChB,cAAA,OAAA,CAAQ,MAAM,mBAAA,EAAqB;AAAA,gBACjC,MAAA,EAAQ,OAAA,EAAS,QAAA,GAAW,OAAA,CAAQ,WAAW,GAAA,GAAM,CAAA;AAAA,gBACrD,QAAA,EAAU,SAAS,YAAA,IAAgB;AAAA,eACpC,CAAA;AACD,cAAA,SAAA,IAAY;AAAA,YACd;AAAA,WACF;AAAA,UAEA,QAAA,kBAAAZ,eAACa,8BAAA,EAAA,EAAiB;AAAA;AAAA,OACpB,EACF,CAAA;AAAA,IAEJ;AAGA,IAAA,MAAM,iBAAA,GAAgC;AAAA,MACpC,KAAA,EAAO,QAAA;AAAA,MACP,SAAA,EAAW,EAAE,YAAA,EAAc,SAAA,EAAW,cAAc,KAAA;AAAM,KAC5D;AAEA,IAAA,uBACEb,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAAA,eAACc,sBAAA,EAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,OAAA,EAAS,EAAE,YAAA,EAAc,UAAA,EAAY,UAAA,IAAc,iBAAA,IAClF,QAAA,kBAAAd,cAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA;AAAA,OAEJ,CAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AAgBO,IAAM,iBAAA,GAAoBC,gBAAAA;AAAA,EAC/B,SAASc,kBAAAA,CAAkB,KAAA,EAAO,GAAA,EAAK;AACrC,IAAA,IAAI,WAAU,EAAG;AACf,MAAA,uBAAOf,cAAAA,CAAC,qBAAA,EAAA,EAAsB,GAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAAA,IACrD;AACA,IAAA,uBAAOA,cAAAA,CAAC,qBAAA,EAAA,EAAsB,GAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAAA,EACrD;AACF;AC9ZO,SAAS,cAAA,CAAe;AAAA,EAC7B,SAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,aAAA,EAAe,OAAA,EAAS,QAAA,KAAaX,kCAAA,EAAiB;AAC9D,EAAA,MAAM,YAAA,GAAeO,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,cAAA,GAAiBA,aAAO,KAAK,CAAA;AAGnC,EAAA,MAAM,UAAU,SAAA,GACZ,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,SAAS,IACvC,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAQ,aAAA,CAAc,GAAA,CAAI,4BAA4B,CAAY,CAAA;AAE7F,EAAA,MAAM,sBAAA,GAAyBN,kBAAY,MAAM;AAC/C,IAAA,OAAA,CAAQ,MAAM,mBAAA,EAAqB;AAAA,MACjC,MAAA,EAAQ,OAAA,EAAS,QAAA,GAAW,OAAA,CAAQ,WAAW,GAAA,GAAM,CAAA;AAAA,MACrD,QAAA,EAAU,SAAS,YAAA,IAAgB;AAAA,KACpC,CAAA;AACD,IAAA,SAAA,IAAY;AAAA,EACd,CAAA,EAAG,CAAC,OAAA,EAAS,OAAA,EAAS,SAAS,CAAC,CAAA;AAEhC,EAAAK,gBAAU,MAAM;AACd,IAAA,IAAI,cAAA,CAAe,OAAA,IAAW,CAAC,OAAA,EAAS,aAAA,EAAe;AACvD,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAEzB,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,OAAA,GAAU,+DAA+D,CAAA;AACzE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,YAAY,CAAA,IAAe,EAAA;AAE3D,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,IAAA,CAAK;AAAA,QAC1B,KAAA,EAAO,CAAC,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,GAAG,CAAA;AAAA,QACvD,QAAA,EAAU,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,MAAA;AAAA,QAC9B,eAAA,EAAiB,sBAAA;AAAA,QACjB,eAAe,MAAM;AAAA,QAAoB;AAAA,OAC1C,CAAA;AAAA,IACH,CAAA,MAAO;AAEL,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAA,CAAO,MAAA,CAAO,SAAS,IAAA,CAAK;AAAA,UAC1B,KAAA,EAAO,CAAC,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,GAAG,CAAA;AAAA,UACvD,QAAA,EAAU,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,MAAA;AAAA,UAC9B,QAAA,EAAU;AAAA,YACR,WAAA,EAAa,QAAA;AAAA,YACb,WAAA,EAAa,YAAA,CAAa,OAAA,CAAQ,EAAA,IAAM,iBAAA;AAAA,YACxC,kBAAA,EAAoB,GAAA;AAAA,YACpB,UAAA,EAAY;AAAA,WACd;AAAA,UACA,eAAA,EAAiB;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,MAAM,gBAAA,EAAkB;AAAA,MAC9B,WAAW,OAAA,CAAQ,EAAA;AAAA,MACnB,SAAS,OAAA,CAAQ,aAAA;AAAA,MACjB,aAAa,OAAA,CAAQ;AAAA,KACtB,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,IAAA,EAAM,eAAe,OAAA,EAAS,sBAAA,EAAwB,OAAO,CAAC,CAAA;AAE3E,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACEK,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,UAAU,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,MAAA,IAAU,QAAA,EAAA,qBAAA,EAEhH,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAK,YAAA,EAAc,EAAA,EAAG,mBAAkB,SAAA,EAAsB,CAAA;AAAA,EAC5E;AAGA,EAAA,OAAO,IAAA;AACT","file":"index.cjs","sourcesContent":["import type { AppFunnelConfig, PageDefinition } from './types'\n\n/**\n * Type helper for appfunnel.config.ts.\n * Returns the config object unchanged — exists purely for TypeScript autocomplete.\n */\nexport function defineConfig(config: AppFunnelConfig): AppFunnelConfig {\n return config\n}\n\n/**\n * Define page metadata co-located with the page component.\n * Export this from your page file alongside the default React component.\n *\n * @example\n * ```tsx\n * // pages/quiz.tsx\n * import { definePage, useVariable, useNavigation } from '@appfunnel-dev/sdk'\n *\n * export const page = definePage({\n * name: 'Quiz',\n * type: 'default',\n * routes: [\n * { to: 'checkout', when: { variable: 'plan', equals: 'premium' } },\n * { to: 'success' }, // fallback\n * ],\n * })\n *\n * export default function Quiz() {\n * // ...\n * }\n * ```\n *\n * The CLI build step collects all `page` exports and assembles them into\n * the full config (pages map + routes map + computed route manifest for analytics).\n */\nexport function definePage(definition: PageDefinition): PageDefinition {\n return definition\n}\n","import { useSyncExternalStore, useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { VariableValue } from '../types'\n\n/**\n * Read/write a single variable.\n *\n * **Advanced** — this hook is not intended for normal page usage.\n * Prefer accessing variables through the standard page props instead.\n *\n * ```tsx\n * const [email, setEmail] = useVariable<string>('email')\n * const [count, setCount] = useVariable<number>('count')\n * const [agreed, setAgreed] = useVariable<boolean>('agreed')\n * const [tags, setTags] = useVariable<string[]>('tags')\n * ```\n */\nexport function useVariable<T extends VariableValue>(\n id: string,\n): [T, (value: T) => void] {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (callback: () => void) => variableStore.subscribe(callback, { keys: [id] }),\n [variableStore, id],\n )\n\n const getSnapshot = useCallback(\n () => variableStore.get(id) as T,\n [variableStore, id],\n )\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const setValue = useCallback(\n (v: T) => variableStore.set(id, v),\n [variableStore, id],\n )\n\n return [value, setValue]\n}\n","import { useSyncExternalStore, useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { VariableValue } from '../types'\n\n/**\n * Read all variables (including system variables). Read-only.\n * Use useVariable() to write individual variables.\n *\n * **Advanced** — this hook is not intended for normal page usage.\n * Prefer accessing variables through the standard page props instead.\n *\n * Warning: this hook subscribes to ALL variable changes, so the\n * component will re-render on every single variable update.\n */\nexport function useVariables(): Record<string, VariableValue> {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (callback: () => void) => variableStore.subscribe(callback),\n [variableStore],\n )\n\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}\n","export type DateFormat = 'MM/DD/YYYY' | 'DD/MM/YYYY' | 'YYYY-MM-DD'\n\n/**\n * Parse a date string in various formats and return YYYY-MM-DD.\n * Supports: YYYY-MM-DD, MM/DD/YYYY, DD/MM/YYYY, MM-DD-YYYY, DD-MM-YYYY,\n * DD.MM.YYYY, MMDDYYYY, DDMMYYYY, and ISO 8601 datetime strings.\n *\n * For ambiguous formats (DD/MM vs MM/DD), treats the first segment as month\n * if it's ≤ 12 and the second > 12, otherwise defaults to MM/DD/YYYY.\n * Throws if the input cannot be parsed.\n */\nexport function toISODate(input: string): string {\n\tif (!input || !input.trim()) return ''\n\tconst s = input.trim()\n\n\t// Already YYYY-MM-DD\n\tif (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return s\n\n\t// ISO 8601 datetime (e.g. 2024-03-15T00:00:00Z)\n\tif (/^\\d{4}-\\d{2}-\\d{2}T/.test(s)) return s.slice(0, 10)\n\n\t// Separated: slashes, dashes, or dots (e.g. MM/DD/YYYY, DD-MM-YYYY, DD.MM.YYYY)\n\tconst sepMatch = s.match(/^(\\d{1,2})[/\\-.](\\d{1,2})[/\\-.](\\d{4})$/)\n\tif (sepMatch) {\n\t\tconst a = parseInt(sepMatch[1], 10)\n\t\tconst b = parseInt(sepMatch[2], 10)\n\t\tconst year = sepMatch[3]\n\n\t\tlet month: number\n\t\tlet day: number\n\n\t\tif (a > 12 && b <= 12) {\n\t\t\t// a can't be month → DD/MM/YYYY\n\t\t\tday = a\n\t\t\tmonth = b\n\t\t} else if (b > 12 && a <= 12) {\n\t\t\t// b can't be month → MM/DD/YYYY\n\t\t\tmonth = a\n\t\t\tday = b\n\t\t} else {\n\t\t\t// Ambiguous — default to MM/DD/YYYY (US convention)\n\t\t\tmonth = a\n\t\t\tday = b\n\t\t}\n\n\t\tif (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n\t\t\treturn `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`\n\t\t}\n\t}\n\n\t// YYYY/MM/DD\n\tconst ymdSlash = s.match(/^(\\d{4})[/\\-.](\\d{1,2})[/\\-.](\\d{1,2})$/)\n\tif (ymdSlash) {\n\t\tconst year = ymdSlash[1]\n\t\tconst month = parseInt(ymdSlash[2], 10)\n\t\tconst day = parseInt(ymdSlash[3], 10)\n\t\tif (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n\t\t\treturn `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`\n\t\t}\n\t}\n\n\t// 8-digit no separator: MMDDYYYY or DDMMYYYY\n\tif (/^\\d{8}$/.test(s)) {\n\t\tconst a = parseInt(s.slice(0, 2), 10)\n\t\tconst b = parseInt(s.slice(2, 4), 10)\n\t\tconst year = s.slice(4, 8)\n\n\t\tlet month: number\n\t\tlet day: number\n\n\t\tif (a > 12 && b <= 12) {\n\t\t\tday = a\n\t\t\tmonth = b\n\t\t} else {\n\t\t\tmonth = a\n\t\t\tday = b\n\t\t}\n\n\t\tif (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n\t\t\treturn `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`\n\t\t}\n\t}\n\n\tthrow new Error(\n\t\t`[AppFunnel] Invalid date format: \"${input}\". Expected a date string like MM/DD/YYYY, DD/MM/YYYY, YYYY-MM-DD, or MMDDYYYY.`\n\t)\n}\n\n/**\n * Parse a date string with a known format and return YYYY-MM-DD.\n * Throws if the input cannot be parsed.\n */\nexport function toISODateWithFormat(input: string, format: DateFormat): string {\n\tif (!input || !input.trim()) return ''\n\tconst s = input.trim()\n\n\t// Already YYYY-MM-DD or ISO datetime\n\tif (/^\\d{4}-\\d{2}-\\d{2}$/.test(s) || /^\\d{4}-\\d{2}-\\d{2}T/.test(s)) {\n\t\treturn s.slice(0, 10)\n\t}\n\n\tconst digits = s.replace(/[^\\d]/g, '')\n\n\tif (format === 'YYYY-MM-DD') {\n\t\tconst m = s.match(/^(\\d{4})[/\\-.](\\d{1,2})[/\\-.](\\d{1,2})$/)\n\t\tif (m) return `${m[1]}-${m[2].padStart(2, '0')}-${m[3].padStart(2, '0')}`\n\t\tif (digits.length === 8) {\n\t\t\treturn `${digits.slice(0, 4)}-${digits.slice(4, 6)}-${digits.slice(6, 8)}`\n\t\t}\n\t}\n\n\tif (format === 'MM/DD/YYYY') {\n\t\tconst m = s.match(/^(\\d{1,2})[/\\-.](\\d{1,2})[/\\-.](\\d{4})$/)\n\t\tif (m) return `${m[3]}-${m[1].padStart(2, '0')}-${m[2].padStart(2, '0')}`\n\t\tif (digits.length === 8) {\n\t\t\treturn `${digits.slice(4, 8)}-${digits.slice(0, 2)}-${digits.slice(2, 4)}`\n\t\t}\n\t}\n\n\tif (format === 'DD/MM/YYYY') {\n\t\tconst m = s.match(/^(\\d{1,2})[/\\-.](\\d{1,2})[/\\-.](\\d{4})$/)\n\t\tif (m) return `${m[3]}-${m[2].padStart(2, '0')}-${m[1].padStart(2, '0')}`\n\t\tif (digits.length === 8) {\n\t\t\treturn `${digits.slice(4, 8)}-${digits.slice(2, 4)}-${digits.slice(0, 2)}`\n\t\t}\n\t}\n\n\tthrow new Error(\n\t\t`[AppFunnel] Invalid date format: \"${input}\". Expected format ${format} (e.g. ${{\n\t\t\t'MM/DD/YYYY': '03/15/1990 or 03151990',\n\t\t\t'DD/MM/YYYY': '15/03/1990 or 15031990',\n\t\t\t'YYYY-MM-DD': '1990-03-15 or 19900315',\n\t\t}[format]}).`\n\t)\n}\n","import { useSyncExternalStore, useCallback, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport { toISODate, toISODateWithFormat } from '../utils/date'\nimport type { UserState } from '../types'\n\nexport type { DateFormat } from '../utils/date'\n\n/**\n * Read built-in user state (email, name, customerId).\n *\n * Only re-renders when a `user.*` variable changes.\n * For reading/writing arbitrary user fields, use `useUserProperty('fieldName')`.\n */\nexport function useUser(): UserState {\n\tconst { variableStore, tracker } = useFunnelContext()\n\n\tconst subscribe = useCallback(\n\t\t(cb: () => void) => variableStore.subscribe(cb, { prefix: 'user.' }),\n\t\t[variableStore]\n\t)\n\tconst getSnapshot = useCallback(\n\t\t() => variableStore.getState(),\n\t\t[variableStore]\n\t)\n\tconst variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\temail: (variables['user.email'] as string) || '',\n\t\t\tname: (variables['user.name'] as string) || '',\n\t\t\tstripeCustomerId:\n\t\t\t\t(variables['user.stripeCustomerId'] as string) || '',\n\t\t\tpaddleCustomerId:\n\t\t\t\t(variables['user.paddleCustomerId'] as string) || '',\n\t\t\tdateOfBirth: (variables['user.dateOfBirth'] as string) || '',\n\t\t\tmarketingConsent: variables['user.marketingConsent'] === true,\n\n\t\t\tsetEmail(email: string) {\n\t\t\t\tvariableStore.set('user.email', email)\n\t\t\t},\n\t\t\tsetName(name: string) {\n\t\t\t\tvariableStore.set('user.name', name)\n\t\t\t},\n\t\t\tsetDateOfBirth(dateOfBirth: string) {\n\t\t\t\tvariableStore.set('user.dateOfBirth', toISODate(dateOfBirth))\n\t\t\t},\n\t\t\tsetMarketingConsent(consent: boolean) {\n\t\t\t\tvariableStore.set('user.marketingConsent', consent)\n\t\t\t},\n\t\t\tidentify(email: string) {\n\t\t\t\ttracker.identify(email)\n\t\t\t},\n\t\t}),\n\t\t[variables, variableStore, tracker]\n\t)\n}\n\n/**\n * Read/write a user property by field name.\n * Auto-prefixes with `user.` — no need to define in config.\n *\n * ```tsx\n * const [dob, setDob] = useUserProperty('dateOfBirth')\n * const [gender, setGender] = useUserProperty('gender')\n * ```\n */\nexport function useUserProperty(\n\tfield: string\n): [string, (value: string) => void] {\n\tconst { variableStore } = useFunnelContext()\n\tconst key = `user.${field}`\n\n\tconst subscribe = useCallback(\n\t\t(cb: () => void) => variableStore.subscribe(cb, { keys: [key] }),\n\t\t[variableStore, key]\n\t)\n\tconst getSnapshot = useCallback(\n\t\t() => (variableStore.get(key) as string) || '',\n\t\t[variableStore, key]\n\t)\n\n\tconst value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n\tconst setValue = useCallback(\n\t\t(v: string) => variableStore.set(key, v),\n\t\t[variableStore, key]\n\t)\n\n\treturn [value, setValue]\n}\n\n/**\n * Read/write the user's date of birth.\n * Always stores the value as YYYY-MM-DD regardless of input format.\n *\n * @param format - How the input string should be interpreted (default: MM/DD/YYYY).\n *\n * ```tsx\n * const [dob, setDob] = useDateOfBirth() // defaults to MM/DD/YYYY\n * const [dob, setDob] = useDateOfBirth('DD/MM/YYYY') // explicit EU format\n *\n * setDob('03/15/1990') // stored as \"1990-03-15\"\n * setDob('03151990') // stored as \"1990-03-15\"\n * ```\n */\nexport function useDateOfBirth(format: import('../utils/date').DateFormat = 'MM/DD/YYYY'): [string, (value: string) => void] {\n\tconst { variableStore } = useFunnelContext()\n\tconst key = 'user.dateOfBirth'\n\n\tconst subscribe = useCallback(\n\t\t(cb: () => void) => variableStore.subscribe(cb, { keys: [key] }),\n\t\t[variableStore]\n\t)\n\tconst getSnapshot = useCallback(\n\t\t() => (variableStore.get(key) as string) || '',\n\t\t[variableStore]\n\t)\n\n\tconst value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n\tconst setValue = useCallback(\n\t\t(v: string) => variableStore.set(key, toISODateWithFormat(v, format)),\n\t\t[variableStore, format]\n\t)\n\n\treturn [value, setValue]\n}\n","import { useSyncExternalStore, useCallback, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\n\n/**\n * Read all URL query parameters as a flat object (without the `query.` prefix).\n *\n * Only re-renders when a `query.*` variable changes.\n */\nexport function useQueryParams(): Record<string, string> {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { prefix: 'query.' }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n const variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return useMemo(() => {\n const params: Record<string, string> = {}\n for (const [key, value] of Object.entries(variables)) {\n if (key.startsWith('query.') && typeof value === 'string') {\n params[key.slice(6)] = value\n }\n }\n return params\n }, [variables])\n}\n\n/**\n * Read a single query parameter by name.\n *\n * ```tsx\n * const utmSource = useQueryParam('utm_source')\n * ```\n */\nexport function useQueryParam(key: string): string {\n const { variableStore } = useFunnelContext()\n const prefixedKey = `query.${key}`\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: [prefixedKey] }),\n [variableStore, prefixedKey],\n )\n const getSnapshot = useCallback(\n () => (variableStore.get(prefixedKey) as string) || '',\n [variableStore, prefixedKey],\n )\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}\n","import { useSyncExternalStore, useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { VariableValue } from '../types'\n\n/**\n * Read/write a single data variable (data.*).\n *\n * ```tsx\n * const [tier, setTier] = useData<string>('selectedPlanTier')\n * const [seen, setSeen] = useData<boolean>('hasSeenOnboarding')\n * ```\n */\nexport function useData<T extends VariableValue>(\n key: string,\n): [T, (value: T) => void] {\n const { variableStore } = useFunnelContext()\n const prefixedKey = `data.${key}`\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: [prefixedKey] }),\n [variableStore, prefixedKey],\n )\n const getSnapshot = useCallback(\n () => variableStore.get(prefixedKey) as T,\n [variableStore, prefixedKey],\n )\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const setValue = useCallback(\n (v: T) => variableStore.set(prefixedKey, v),\n [variableStore, prefixedKey],\n )\n\n return [value, setValue]\n}\n","import { useMemo } from 'react'\nimport type { LocaleState } from '../types'\n\n/**\n * Get the user's locale from the browser.\n *\n * Provides language, region, and currency info derived from the browser.\n * Combine with i18n libraries (react-i18next, next-intl, etc.) for translations.\n *\n * ```tsx\n * const { language, region, currency } = useLocale()\n * // language: 'en', region: 'US', currency: 'USD'\n * ```\n */\nexport function useLocale(): LocaleState {\n return useMemo(() => {\n if (typeof navigator === 'undefined') {\n return {\n locale: 'en-US',\n language: 'en',\n region: 'US',\n languages: ['en-US'],\n timeZone: 'UTC',\n is24Hour: false,\n }\n }\n\n const locale = navigator.language || 'en-US'\n const [language, region] = locale.split('-')\n const languages = [...(navigator.languages || [locale])]\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'\n const is24Hour = detect24Hour(locale)\n\n return {\n locale,\n language: language || 'en',\n region: region?.toUpperCase() || 'US',\n languages,\n timeZone,\n is24Hour,\n }\n }, [])\n}\n\n/** Detect if locale likely uses 24h clock */\nfunction detect24Hour(locale: string): boolean {\n try {\n const formatted = new Intl.DateTimeFormat(locale, { hour: 'numeric' }).format(new Date())\n return !formatted.match(/am|pm/i)\n } catch {\n return false\n }\n}\n","import { useSyncExternalStore, useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { TranslationState } from '../types'\n\n/**\n * Access translations for the current locale.\n *\n * ```tsx\n * const { t, locale, setLocale } = useTranslation()\n *\n * return (\n * <div>\n * <h1>{t('welcome', { name: 'John' })}</h1>\n * <button onClick={() => setLocale('de')}>Deutsch</button>\n * </div>\n * )\n * ```\n */\nexport function useTranslation(): TranslationState {\n const { i18n } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => i18n.subscribe(cb),\n [i18n],\n )\n const getSnapshot = useCallback(\n () => i18n.getLocale(),\n [i18n],\n )\n\n const locale = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const t = useCallback(\n (key: string, params?: Record<string, string | number>) => i18n.t(key, params),\n [i18n, locale], // eslint-disable-line react-hooks/exhaustive-deps\n )\n\n const setLocale = useCallback(\n (l: string) => i18n.setLocale(l),\n [i18n],\n )\n\n const availableLocales = i18n.getAvailableLocales()\n\n return { t, locale, setLocale, availableLocales }\n}\n","import { useCallback, useSyncExternalStore } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { ProductsState } from '../types'\n\n/**\n * Products hook — access product list, selected product, and selection handler.\n *\n * Only re-renders when `products.selectedProductId` changes.\n */\nexport function useProducts(): ProductsState {\n const { products, variableStore, selectProduct: ctxSelect } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: ['products.selectedProductId'] }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.get('products.selectedProductId') as string | null,\n [variableStore],\n )\n\n const selectedId = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const selected = products.find((p) => p.id === selectedId) || null\n\n const select = useCallback((productId: string) => {\n ctxSelect(productId)\n }, [ctxSelect])\n\n return { products, selected, select }\n}\n","import { useCallback } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { TrackingState } from '../types'\n\n/**\n * Tracking hook — fire custom events.\n */\nexport function useTracking(): TrackingState {\n const { tracker } = useFunnelContext()\n\n const track = useCallback(\n (eventName: string, data?: Record<string, unknown>) => {\n tracker.track(eventName, data)\n },\n [tracker],\n )\n\n return { track }\n}\n","import { useCallback, useSyncExternalStore, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { PaymentState } from '../types'\n\nconst API_BASE_URL = 'https://api.appfunnel.net'\n\nconst PAYMENT_KEYS = ['payment.loading', 'payment.error']\n\n/**\n * Payment hook — reads payment-related variables and provides a purchase action.\n *\n * Only re-renders when payment/card variables change.\n */\nexport function usePayment(): PaymentState {\n\tconst { variableStore, products, campaignId, tracker } = useFunnelContext()\n\n\tconst subscribe = useCallback(\n\t\t(cb: () => void) => variableStore.subscribe(cb, { keys: PAYMENT_KEYS }),\n\t\t[variableStore]\n\t)\n\tconst getSnapshot = useCallback(\n\t\t() => variableStore.getState(),\n\t\t[variableStore]\n\t)\n\tconst variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n\tconst purchase = useCallback(\n\t\tasync (\n\t\t\tproductId: string,\n\t\t\toptions?: {\n\t\t\t\tonSuccess?: () => void\n\t\t\t\tonError?: (error: string) => void\n\t\t\t}\n\t\t): Promise<boolean> => {\n\t\t\tconsole.log('[Purchase] Starting purchase for product:', productId)\n\t\t\t// Dev mode: simulate instant success\n\t\t\tif ((globalThis as Record<string, unknown>).__APPFUNNEL_DEV__) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[Purchase] Dev mode — simulating success (500ms delay)'\n\t\t\t\t)\n\t\t\t\tvariableStore.set('payment.loading', true)\n\t\t\t\tawait new Promise((r) => setTimeout(r, 500))\n\t\t\t\tvariableStore.set('payment.error', '')\n\t\t\t\tconsole.log('[Purchase] Dev mode — success')\n\t\t\t\toptions?.onSuccess?.()\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tconst customerId = variableStore.get(\n\t\t\t\t'user.stripeCustomerId'\n\t\t\t) as string\n\t\t\tconsole.log('[Purchase] Customer ID:', customerId || '(none)')\n\t\t\tif (!customerId) {\n\t\t\t\tconst msg = 'Please complete payment authorization first'\n\t\t\t\tconsole.error('[Purchase] Failed:', msg)\n\t\t\t\tvariableStore.set('payment.error', msg)\n\t\t\t\toptions?.onError?.(msg)\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst product = products.find((p) => p.id === productId)\n\t\t\tconsole.log(\n\t\t\t\t'[Purchase] Product found:',\n\t\t\t\tproduct\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tid: product.id,\n\t\t\t\t\t\t\tname: product.name,\n\t\t\t\t\t\t\tstripePriceId: product.stripePriceId,\n\t\t\t\t\t\t}\n\t\t\t\t\t: '(not found)'\n\t\t\t)\n\t\t\tif (!product?.stripePriceId) {\n\t\t\t\tconst msg = 'Product not found or missing Stripe price'\n\t\t\t\tconsole.error('[Purchase] Failed:', msg)\n\t\t\t\tvariableStore.set('payment.error', msg)\n\t\t\t\toptions?.onError?.(msg)\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\t// Resolve trial fields from product\n\t\t\tconst trialPeriodDays = product.hasTrial\n\t\t\t\t? product.trialDays\n\t\t\t\t: undefined\n\t\t\tconst trialChargePriceId =\n\t\t\t\tproduct.paidTrial && product.trialStorePriceId\n\t\t\t\t\t? product.trialStorePriceId\n\t\t\t\t\t: undefined\n\t\t\tconsole.log('[Purchase] Trial config:', {\n\t\t\t\ttrialPeriodDays,\n\t\t\t\ttrialChargePriceId,\n\t\t\t\thasTrial: product.hasTrial,\n\t\t\t\tpaidTrial: product.paidTrial,\n\t\t\t})\n\n\t\t\tvariableStore.set('payment.loading', true)\n\t\t\tvariableStore.set('payment.error', '')\n\n\t\t\tconst requestBody = {\n\t\t\t\tcampaignId,\n\t\t\t\tsessionId: tracker.getSessionId(),\n\t\t\t\tstripePriceId: product.stripePriceId,\n\t\t\t\ttrialPeriodDays,\n\t\t\t\ttrialChargePriceId,\n\t\t\t}\n\t\t\tconsole.log(\n\t\t\t\t'[Purchase] Sending request:',\n\t\t\t\t`${API_BASE_URL}/campaign/${campaignId}/stripe/purchase`,\n\t\t\t\trequestBody\n\t\t\t)\n\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(\n\t\t\t\t\t`${API_BASE_URL}/campaign/${campaignId}/stripe/purchase`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\t\tbody: JSON.stringify(requestBody),\n\t\t\t\t\t}\n\t\t\t\t)\n\n\t\t\t\tconsole.log('[Purchase] Response status:', response.status)\n\t\t\t\tlet result = await response.json()\n\t\t\t\tconsole.log('[Purchase] Response body:', result)\n\n\t\t\t\t// Handle 3DS authentication if required\n\t\t\t\tif (!result.success && result.requiresAction) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'[Purchase] 3DS authentication required, loading Stripe...'\n\t\t\t\t\t)\n\t\t\t\t\tconst { loadStripe } = await import('@stripe/stripe-js')\n\t\t\t\t\tconst stripeInstance = await loadStripe(\n\t\t\t\t\t\tresult.publishableKey\n\t\t\t\t\t)\n\t\t\t\t\tif (!stripeInstance) {\n\t\t\t\t\t\tconst msg = 'Failed to load payment processor'\n\t\t\t\t\t\tconsole.error('[Purchase] Failed:', msg)\n\t\t\t\t\t\tvariableStore.set('payment.error', msg)\n\t\t\t\t\t\toptions?.onError?.(msg)\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'[Purchase] Confirming card payment with 3DS...'\n\t\t\t\t\t)\n\t\t\t\t\tconst { error: confirmError, paymentIntent: confirmedPi } =\n\t\t\t\t\t\tawait stripeInstance.confirmCardPayment(\n\t\t\t\t\t\t\tresult.clientSecret,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpayment_method: result.paymentMethodId,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tconfirmError ||\n\t\t\t\t\t\t!confirmedPi ||\n\t\t\t\t\t\tconfirmedPi.status !== 'succeeded'\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\tconfirmError?.message ||\n\t\t\t\t\t\t\t'Payment authentication failed'\n\t\t\t\t\t\tconsole.error('[Purchase] 3DS failed:', msg)\n\t\t\t\t\t\tvariableStore.set('payment.error', msg)\n\t\t\t\t\t\toptions?.onError?.(msg)\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'[Purchase] 3DS succeeded, retrying purchase with confirmed PI:',\n\t\t\t\t\t\tconfirmedPi.id\n\t\t\t\t\t)\n\t\t\t\t\t// Retry with confirmed payment intent\n\t\t\t\t\tconst retryResponse = await fetch(\n\t\t\t\t\t\t`${API_BASE_URL}/campaign/${campaignId}/stripe/purchase`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\t\t\tcampaignId,\n\t\t\t\t\t\t\t\tsessionId: tracker.getSessionId(),\n\t\t\t\t\t\t\t\tstripePriceId: product.stripePriceId,\n\t\t\t\t\t\t\t\ttrialPeriodDays,\n\t\t\t\t\t\t\t\ttrialChargePriceId,\n\t\t\t\t\t\t\t\tonSessionPiId: confirmedPi.id,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t\tresult = await retryResponse.json()\n\t\t\t\t\tconsole.log('[Purchase] Retry response:', result)\n\t\t\t\t}\n\n\t\t\t\tif (result.success) {\n\t\t\t\t\tconsole.log('[Purchase] Success! Type:', result.type)\n\t\t\t\t\tvariableStore.set('payment.error', '')\n\n\t\t\t\t\tif (result.type === 'validate_only') {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t'[Purchase] Validate-only — setting card variables'\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (result.card) {\n\t\t\t\t\t\t\tvariableStore.setMany({\n\t\t\t\t\t\t\t\t'card.last4': result.card.last4,\n\t\t\t\t\t\t\t\t'card.brand': result.card.brand,\n\t\t\t\t\t\t\t\t'card.expMonth': result.card.expMonth,\n\t\t\t\t\t\t\t\t'card.expYear': result.card.expYear,\n\t\t\t\t\t\t\t\t'card.funding': result.card.funding,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (result.eventId) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t'[Purchase] Tracking purchase.complete (validate_only), eventId:',\n\t\t\t\t\t\t\t\tresult.eventId\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\ttracker.track('purchase.complete', {\n\t\t\t\t\t\t\t\teventId: result.eventId,\n\t\t\t\t\t\t\t\tamount: product.rawPrice\n\t\t\t\t\t\t\t\t\t? product.rawPrice / 100\n\t\t\t\t\t\t\t\t\t: 0,\n\t\t\t\t\t\t\t\tcurrency: product.currencyCode || 'USD',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (result.type === 'one_time') {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t'[Purchase] One-time charge — paymentIntentId:',\n\t\t\t\t\t\t\tresult.paymentIntentId\n\t\t\t\t\t\t)\n\t\t\t\t\t\tvariableStore.set(\n\t\t\t\t\t\t\t'stripe.paymentIntentId',\n\t\t\t\t\t\t\tresult.paymentIntentId\n\t\t\t\t\t\t)\n\t\t\t\t\t\tvariableStore.set('payment.status', result.status)\n\n\t\t\t\t\t\tif (result.eventId) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t'[Purchase] Tracking purchase.complete (one_time), eventId:',\n\t\t\t\t\t\t\t\tresult.eventId\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\ttracker.track('purchase.complete', {\n\t\t\t\t\t\t\t\teventId: result.eventId,\n\t\t\t\t\t\t\t\tamount: product.rawPrice\n\t\t\t\t\t\t\t\t\t? product.rawPrice / 100\n\t\t\t\t\t\t\t\t\t: 0,\n\t\t\t\t\t\t\t\tcurrency: product.currencyCode || 'USD',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t'[Purchase] Subscription — subscriptionId:',\n\t\t\t\t\t\t\tresult.subscriptionId,\n\t\t\t\t\t\t\t'status:',\n\t\t\t\t\t\t\tresult.status\n\t\t\t\t\t\t)\n\t\t\t\t\t\tvariableStore.set(\n\t\t\t\t\t\t\t'stripe.subscriptionId',\n\t\t\t\t\t\t\tresult.subscriptionId\n\t\t\t\t\t\t)\n\t\t\t\t\t\tvariableStore.set('subscription.status', result.status)\n\n\t\t\t\t\t\tif (result.trialCharge) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t'[Purchase] Tracking trial charge purchase.complete'\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\ttracker.track('purchase.complete', {\n\t\t\t\t\t\t\t\teventId: result.eventIds?.trialCharge,\n\t\t\t\t\t\t\t\tamount: result.trialCharge.amount / 100,\n\t\t\t\t\t\t\t\tcurrency: 'USD',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (result.eventIds?.subscription) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t'[Purchase] Tracking subscription.created, eventId:',\n\t\t\t\t\t\t\t\tresult.eventIds.subscription\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\ttracker.track('subscription.created', {\n\t\t\t\t\t\t\t\teventId: result.eventIds.subscription,\n\t\t\t\t\t\t\t\tsubscriptionId: result.subscriptionId,\n\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (result.eventIds?.firstPeriod) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t'[Purchase] Tracking first-period purchase.complete, eventId:',\n\t\t\t\t\t\t\t\tresult.eventIds.firstPeriod\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\ttracker.track('purchase.complete', {\n\t\t\t\t\t\t\t\teventId: result.eventIds.firstPeriod,\n\t\t\t\t\t\t\t\tamount: product.rawPrice\n\t\t\t\t\t\t\t\t\t? product.rawPrice / 100\n\t\t\t\t\t\t\t\t\t: 0,\n\t\t\t\t\t\t\t\tcurrency: product.currencyCode || 'USD',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log('[Purchase] Calling onSuccess callback')\n\t\t\t\t\toptions?.onSuccess?.()\n\t\t\t\t\treturn true\n\t\t\t\t} else {\n\t\t\t\t\tconst msg = result.error || 'Purchase failed'\n\t\t\t\t\tconsole.error('[Purchase] Failed:', msg)\n\t\t\t\t\tvariableStore.set('payment.error', msg)\n\t\t\t\t\toptions?.onError?.(msg)\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst msg =\n\t\t\t\t\terr instanceof Error ? err.message : 'Purchase failed'\n\t\t\t\tconsole.error('[Purchase] Exception:', err)\n\t\t\t\tvariableStore.set('payment.error', msg)\n\t\t\t\toptions?.onError?.(msg)\n\t\t\t\treturn false\n\t\t\t} finally {\n\t\t\t\tconsole.log('[Purchase] Done — setting loading to false')\n\t\t\t\tvariableStore.set('payment.loading', false)\n\t\t\t}\n\t\t},\n\t\t[variableStore, products, campaignId, tracker]\n\t)\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tloading: !!variables['payment.loading'],\n\t\t\terror: (variables['payment.error'] as string) || null,\n\t\t\tpurchase,\n\t\t}),\n\t\t[variables, purchase]\n\t)\n}\n","import { useSyncExternalStore, useCallback, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { DeviceInfo } from '../types'\n\nconst DEVICE_KEYS = [\n 'os.name',\n 'os.timezone',\n 'device.type',\n 'device.isMobile',\n 'device.isTablet',\n 'device.screenWidth',\n 'device.screenHeight',\n 'device.viewportWidth',\n 'device.viewportHeight',\n 'device.colorDepth',\n 'device.pixelRatio',\n 'browser.name',\n 'browser.version',\n 'browser.userAgent',\n 'browser.cookieEnabled',\n 'browser.online',\n 'browser.language',\n]\n\n/**\n * Read device, browser, and OS metadata.\n *\n * These values are set once on mount and don't change, so this hook\n * will rarely (if ever) re-render.\n *\n * ```tsx\n * const { device, browser, os } = useDeviceInfo()\n * if (device.isMobile) { ... }\n * ```\n */\nexport function useDeviceInfo(): DeviceInfo {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: DEVICE_KEYS }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n const variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return useMemo(() => ({\n os: {\n name: (variables['os.name'] as string) || '',\n timezone: (variables['os.timezone'] as string) || '',\n },\n device: {\n type: (variables['device.type'] as string) || 'desktop',\n isMobile: !!variables['device.isMobile'],\n isTablet: !!variables['device.isTablet'],\n screenWidth: (variables['device.screenWidth'] as number) || 0,\n screenHeight: (variables['device.screenHeight'] as number) || 0,\n viewportWidth: (variables['device.viewportWidth'] as number) || 0,\n viewportHeight: (variables['device.viewportHeight'] as number) || 0,\n colorDepth: (variables['device.colorDepth'] as number) || 24,\n pixelRatio: (variables['device.pixelRatio'] as number) || 1,\n },\n browser: {\n name: (variables['browser.name'] as string) || '',\n version: (variables['browser.version'] as string) || '',\n userAgent: (variables['browser.userAgent'] as string) || '',\n cookieEnabled: variables['browser.cookieEnabled'] !== false,\n online: variables['browser.online'] !== false,\n language: (variables['browser.language'] as string) || 'en',\n },\n }), [variables])\n}\n","import { useState, useEffect } from 'react'\n\nexport interface SafeAreaInsets {\n top: number\n right: number\n bottom: number\n left: number\n}\n\n/**\n * Returns the current safe-area insets (in px) from `env(safe-area-inset-*)`.\n *\n * Useful for positioning fixed elements above the Safari home-indicator bar.\n *\n * ```tsx\n * const { bottom } = useSafeArea()\n * <div style={{ position: 'fixed', bottom: 0, paddingBottom: bottom }} />\n * ```\n */\nexport function useSafeArea(): SafeAreaInsets {\n const [insets, setInsets] = useState<SafeAreaInsets>({ top: 0, right: 0, bottom: 0, left: 0 })\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const el = document.createElement('div')\n el.style.cssText = [\n 'position:fixed',\n 'top:env(safe-area-inset-top,0px)',\n 'right:env(safe-area-inset-right,0px)',\n 'bottom:env(safe-area-inset-bottom,0px)',\n 'left:env(safe-area-inset-left,0px)',\n 'pointer-events:none',\n 'visibility:hidden',\n 'z-index:-1',\n ].join(';')\n document.body.appendChild(el)\n\n function read() {\n const style = getComputedStyle(el)\n setInsets({\n top: parseFloat(style.top) || 0,\n right: parseFloat(style.right) || 0,\n bottom: parseFloat(style.bottom) || 0,\n left: parseFloat(style.left) || 0,\n })\n }\n\n read()\n\n const observer = new ResizeObserver(read)\n observer.observe(el)\n window.addEventListener('resize', read)\n\n return () => {\n observer.disconnect()\n window.removeEventListener('resize', read)\n el.remove()\n }\n }, [])\n\n return insets\n}\n","import { useState, useEffect, useRef } from 'react'\n\nexport interface KeyboardState {\n /** Whether the virtual keyboard is currently visible */\n isOpen: boolean\n /** Height of the keyboard in pixels (0 when closed) */\n height: number\n}\n\n/**\n * Detects the virtual keyboard on mobile devices.\n *\n * Uses the VirtualKeyboard API where available, with a\n * visualViewport fallback for Safari/older browsers.\n *\n * The visualViewport path follows the approach described at\n * https://martijnhols.nl/blog/how-to-get-document-height-ios-safari-osk\n * to handle iOS Safari's delayed viewport updates on keyboard close.\n *\n * ```tsx\n * const { isOpen, height } = useKeyboard()\n * <div style={{ position: 'fixed', bottom: isOpen ? height : 0 }} />\n * ```\n */\nexport function useKeyboard(): KeyboardState {\n const [state, setState] = useState<KeyboardState>({ isOpen: false, height: 0 })\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>()\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n // Prefer the VirtualKeyboard API (Chrome 94+, Edge)\n if ('virtualKeyboard' in navigator) {\n const vk = (navigator as any).virtualKeyboard\n vk.overlaysContent = true\n\n const handler = () => {\n const h = vk.boundingRect.height\n setState(prev => {\n if (prev.height === h && prev.isOpen === (h > 0)) return prev\n return { isOpen: h > 0, height: h }\n })\n }\n\n vk.addEventListener('geometrychange', handler)\n handler()\n return () => vk.removeEventListener('geometrychange', handler)\n }\n\n // Fallback: visualViewport (Safari, most mobile browsers)\n const vv = window.visualViewport\n if (!vv) return\n\n // Cache innerHeight so we don't trigger relayout on every vv resize.\n // Only refresh it on window resize / orientation change.\n let layoutHeight = window.innerHeight\n\n function compute() {\n const kbHeight = Math.max(0, layoutHeight - vv!.height)\n // Threshold to ignore small differences from browser chrome changes\n const h = kbHeight > 40 ? Math.round(kbHeight) : 0\n setState(prev => {\n if (prev.height === h && prev.isOpen === (h > 0)) return prev\n return { isOpen: h > 0, height: h }\n })\n }\n\n function onViewportResize() {\n compute()\n // iOS Safari doesn't immediately update visualViewport when the\n // keyboard closes — schedule a delayed re-check to catch it.\n clearTimeout(timeoutRef.current)\n timeoutRef.current = setTimeout(compute, 1000)\n }\n\n function onWindowResize() {\n // Re-read layout viewport height (triggers relayout, but only on\n // actual window resize / orientation change — not on every keystroke)\n layoutHeight = window.innerHeight\n compute()\n }\n\n vv.addEventListener('resize', onViewportResize)\n window.addEventListener('resize', onWindowResize)\n window.addEventListener('orientationchange', onWindowResize)\n compute()\n\n return () => {\n clearTimeout(timeoutRef.current)\n vv.removeEventListener('resize', onViewportResize)\n window.removeEventListener('resize', onWindowResize)\n window.removeEventListener('orientationchange', onWindowResize)\n }\n }, [])\n\n return state\n}\n","import { useSyncExternalStore, useCallback, useMemo } from 'react'\nimport { useFunnelContext } from '../components/FunnelProvider'\nimport type { PageData } from '../types'\n\nconst PAGE_KEYS = [\n 'page.currentId',\n 'page.currentIndex',\n 'page.current',\n 'page.total',\n 'page.progressPercentage',\n 'page.startedAt',\n]\n\n/**\n * Read page-level system variables.\n *\n * Re-renders when page variables change (e.g. on navigation).\n *\n * ```tsx\n * const { currentId, progressPercentage, startedAt } = usePageData()\n * ```\n */\nexport function usePageData(): PageData {\n const { variableStore } = useFunnelContext()\n\n const subscribe = useCallback(\n (cb: () => void) => variableStore.subscribe(cb, { keys: PAGE_KEYS }),\n [variableStore],\n )\n const getSnapshot = useCallback(\n () => variableStore.getState(),\n [variableStore],\n )\n const variables = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return useMemo(() => ({\n currentId: (variables['page.currentId'] as string) || '',\n currentIndex: (variables['page.currentIndex'] as number) || 0,\n current: (variables['page.current'] as number) || 1,\n total: (variables['page.total'] as number) || 0,\n progressPercentage: (variables['page.progressPercentage'] as number) || 0,\n startedAt: (variables['page.startedAt'] as number) || 0,\n }), [variables])\n}\n","import { useFunnelContext } from '../components/FunnelProvider'\nimport { useVariables } from './useVariables'\nimport { useUser } from './useUser'\nimport { useResponses } from './useResponse'\nimport { useQueryParams } from './useQueryParams'\nimport { useNavigation } from './useNavigation'\nimport { useProducts } from './useProducts'\nimport { useTracking } from './useTracking'\nimport { usePayment } from './usePayment'\nimport type { FunnelState } from '../types'\n\n/**\n * Convenience hook that combines all SDK hooks.\n * Useful for simple funnels where you don't want multiple hook imports.\n */\nexport function useFunnel(): FunnelState {\n const { funnelId, campaignId, tracker } = useFunnelContext()\n\n return {\n funnelId,\n campaignId,\n sessionId: tracker.getSessionId(),\n variables: useVariables(),\n user: useUser(),\n responses: useResponses(),\n queryParams: useQueryParams(),\n navigation: useNavigation(),\n products: useProducts(),\n tracking: useTracking(),\n payment: usePayment(),\n }\n}\n","import {\n useState,\n useCallback,\n useMemo,\n forwardRef,\n useImperativeHandle,\n useEffect,\n useRef,\n} from 'react'\nimport { useFunnelContext } from './FunnelProvider'\nimport type { StripePaymentHandle, StripePaymentFormProps } from './StripePaymentForm'\nimport type { RuntimeProduct } from '../types'\n\n// ============================================================================\n// Shared styles\n// ============================================================================\n\nconst FONT = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\nconst inputStyle = (focused: boolean): React.CSSProperties => ({\n width: '100%',\n padding: '12px',\n border: `1px solid ${focused ? '#666' : '#e0e0e0'}`,\n borderRadius: '6px',\n fontSize: '14px',\n fontFamily: FONT,\n outline: 'none',\n backgroundColor: '#fff',\n boxSizing: 'border-box',\n transition: 'border-color 0.15s',\n})\n\nconst labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: '14px',\n fontWeight: 500,\n color: '#333',\n marginBottom: '6px',\n fontFamily: FONT,\n}\n\n// ============================================================================\n// Card brand icons (simple SVG-based text badges)\n// ============================================================================\n\nfunction CardBrandBadges() {\n return (\n <div style={{ display: 'flex', gap: '4px', alignItems: 'center' }}>\n <span style={{ fontSize: '10px', fontWeight: 700, color: '#1a1f71', background: '#fff', border: '1px solid #e0e0e0', borderRadius: '3px', padding: '2px 4px', fontFamily: FONT }}>VISA</span>\n <span style={{ fontSize: '10px', fontWeight: 700, color: '#eb001b', background: '#fff', border: '1px solid #e0e0e0', borderRadius: '3px', padding: '2px 4px', fontFamily: FONT }}>MC</span>\n <span style={{ fontSize: '10px', fontWeight: 700, color: '#ff6000', background: '#fff', border: '1px solid #e0e0e0', borderRadius: '3px', padding: '2px 4px', fontFamily: FONT }}>DISC</span>\n </div>\n )\n}\n\nfunction CvcIcon() {\n return (\n <svg width=\"20\" height=\"16\" viewBox=\"0 0 20 16\" fill=\"none\" style={{ opacity: 0.4 }}>\n <rect x=\"0.5\" y=\"0.5\" width=\"19\" height=\"15\" rx=\"2\" stroke=\"#888\" />\n <rect x=\"0\" y=\"4\" width=\"20\" height=\"3\" fill=\"#888\" />\n <rect x=\"3\" y=\"10\" width=\"8\" height=\"2\" rx=\"1\" fill=\"#ccc\" />\n <text x=\"14\" y=\"12\" fontSize=\"6\" fill=\"#888\" fontFamily={FONT}>123</text>\n </svg>\n )\n}\n\n// ============================================================================\n// Demo Elements Variant — mimics Stripe PaymentElement\n// ============================================================================\n\nfunction DemoElementsForm({ onReady }: { onReady?: () => void }) {\n const [cardNumber, setCardNumber] = useState('')\n const [expiry, setExpiry] = useState('')\n const [cvc, setCvc] = useState('')\n const [country, setCountry] = useState('Denmark')\n const [focusedField, setFocusedField] = useState<string | null>(null)\n const readyFired = useRef(false)\n\n useEffect(() => {\n if (!readyFired.current) {\n readyFired.current = true\n onReady?.()\n }\n }, [onReady])\n\n const formatCardNumber = (val: string) => {\n const digits = val.replace(/\\D/g, '').slice(0, 16)\n return digits.replace(/(.{4})/g, '$1 ').trim()\n }\n\n const formatExpiry = (val: string) => {\n const digits = val.replace(/\\D/g, '').slice(0, 4)\n if (digits.length > 2) return digits.slice(0, 2) + ' / ' + digits.slice(2)\n return digits\n }\n\n return (\n <div style={{ fontFamily: FONT }}>\n {/* Card number */}\n <div style={{ marginBottom: '14px' }}>\n <label style={labelStyle}>Card number</label>\n <div style={{ position: 'relative' }}>\n <input\n type=\"text\"\n value={cardNumber}\n onChange={(e) => setCardNumber(formatCardNumber(e.target.value))}\n onFocus={() => setFocusedField('card')}\n onBlur={() => setFocusedField(null)}\n placeholder=\"1234 1234 1234 1234\"\n style={inputStyle(focusedField === 'card')}\n />\n <div style={{ position: 'absolute', right: '12px', top: '50%', transform: 'translateY(-50%)' }}>\n <CardBrandBadges />\n </div>\n </div>\n </div>\n\n {/* Expiry + CVC */}\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '12px', marginBottom: '14px' }}>\n <div>\n <label style={labelStyle}>Expiry date</label>\n <input\n type=\"text\"\n value={expiry}\n onChange={(e) => setExpiry(formatExpiry(e.target.value))}\n onFocus={() => setFocusedField('expiry')}\n onBlur={() => setFocusedField(null)}\n placeholder=\"MM / YY\"\n style={inputStyle(focusedField === 'expiry')}\n />\n </div>\n <div>\n <label style={labelStyle}>Security code</label>\n <div style={{ position: 'relative' }}>\n <input\n type=\"text\"\n value={cvc}\n onChange={(e) => setCvc(e.target.value.replace(/\\D/g, '').slice(0, 4))}\n onFocus={() => setFocusedField('cvc')}\n onBlur={() => setFocusedField(null)}\n placeholder=\"CVC\"\n style={inputStyle(focusedField === 'cvc')}\n />\n <div style={{ position: 'absolute', right: '12px', top: '50%', transform: 'translateY(-50%)' }}>\n <CvcIcon />\n </div>\n </div>\n </div>\n </div>\n\n {/* Country */}\n <div style={{ marginBottom: '14px' }}>\n <label style={labelStyle}>Country</label>\n <select\n value={country}\n onChange={(e) => setCountry(e.target.value)}\n onFocus={() => setFocusedField('country')}\n onBlur={() => setFocusedField(null)}\n style={{\n ...inputStyle(focusedField === 'country'),\n appearance: 'none',\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23666' viewBox='0 0 16 16'%3E%3Cpath d='M8 11L3 6h10z'/%3E%3C/svg%3E\")`,\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'right 12px center',\n paddingRight: '32px',\n }}\n >\n <option>Australia</option>\n <option>Austria</option>\n <option>Belgium</option>\n <option>Brazil</option>\n <option>Canada</option>\n <option>Denmark</option>\n <option>Finland</option>\n <option>France</option>\n <option>Germany</option>\n <option>Ireland</option>\n <option>Italy</option>\n <option>Japan</option>\n <option>Netherlands</option>\n <option>New Zealand</option>\n <option>Norway</option>\n <option>Poland</option>\n <option>Portugal</option>\n <option>Spain</option>\n <option>Sweden</option>\n <option>Switzerland</option>\n <option>United Kingdom</option>\n <option>United States</option>\n </select>\n </div>\n\n {/* Terms */}\n <p style={{ fontSize: '12px', color: '#6b7280', lineHeight: 1.5, margin: 0, fontFamily: FONT }}>\n By providing your card information, you allow the merchant to charge your card for future payments in accordance with their terms.\n </p>\n </div>\n )\n}\n\n// ============================================================================\n// Demo Embedded Variant — mimics Stripe Embedded Checkout\n// ============================================================================\n\nfunction DemoEmbeddedForm({ product, onReady }: { product: RuntimeProduct | null; onReady?: () => void }) {\n const readyFired = useRef(false)\n const [email, setEmail] = useState('')\n const [cardNumber, setCardNumber] = useState('')\n const [expiry, setExpiry] = useState('')\n const [cvc, setCvc] = useState('')\n const [name, setName] = useState('')\n const [country, setCountry] = useState('Denmark')\n const [focusedField, setFocusedField] = useState<string | null>(null)\n\n useEffect(() => {\n if (!readyFired.current) {\n readyFired.current = true\n onReady?.()\n }\n }, [onReady])\n\n const formatCardNumber = (val: string) => {\n const digits = val.replace(/\\D/g, '').slice(0, 16)\n return digits.replace(/(.{4})/g, '$1 ').trim()\n }\n\n const formatExpiry = (val: string) => {\n const digits = val.replace(/\\D/g, '').slice(0, 4)\n if (digits.length > 2) return digits.slice(0, 2) + ' / ' + digits.slice(2)\n return digits\n }\n\n const embeddedInputStyle = (focused: boolean): React.CSSProperties => ({\n width: '100%',\n padding: '10px 12px',\n border: 'none',\n borderBottom: `1px solid ${focused ? '#666' : '#e0e0e0'}`,\n fontSize: '14px',\n fontFamily: FONT,\n outline: 'none',\n backgroundColor: '#fff',\n boxSizing: 'border-box',\n })\n\n // price/trialPrice are already formatted strings like \"$59.95\"\n const displayPrice = product?.hasTrial ? product.trialPrice : product?.price\n\n return (\n <div style={{ fontFamily: FONT, border: '1px solid #e0e0e0', borderRadius: '12px', overflow: 'hidden', background: '#fff' }}>\n {/* Stripe-style pricing header */}\n {product && (\n <div style={{ padding: '24px 20px', borderBottom: '1px solid #e0e0e0' }}>\n <div style={{ fontSize: '14px', color: '#666', marginBottom: '4px' }}>\n Pay {product.displayName || product.name}\n </div>\n <div style={{ fontSize: '28px', fontWeight: 700, color: '#333', marginBottom: '4px' }}>\n {product.currencyCode?.toUpperCase()}{displayPrice}\n </div>\n {product.hasTrial && (\n <div style={{ fontSize: '13px', color: '#666' }}>\n Then <span style={{ textDecoration: 'underline' }}>{product.currencyCode?.toUpperCase()}{product.price}</span> every {product.period}\n </div>\n )}\n <button\n type=\"button\"\n style={{\n marginTop: '12px',\n padding: '6px 14px',\n borderRadius: '6px',\n border: '1px solid #e0e0e0',\n backgroundColor: '#fff',\n color: '#333',\n fontSize: '13px',\n cursor: 'default',\n fontFamily: FONT,\n }}\n >\n View details ▾\n </button>\n </div>\n )}\n\n <div style={{ padding: '20px' }}>\n {/* Email */}\n <div style={{ marginBottom: '16px' }}>\n <label style={{ ...labelStyle, fontSize: '13px', color: '#666' }}>Email</label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onFocus={() => setFocusedField('email')}\n onBlur={() => setFocusedField(null)}\n placeholder=\"you@example.com\"\n style={embeddedInputStyle(focusedField === 'email')}\n />\n </div>\n\n {/* Card info section */}\n <div style={{ marginBottom: '16px' }}>\n <label style={{ ...labelStyle, fontSize: '13px', color: '#666' }}>Card information</label>\n <div style={{ border: '1px solid #e0e0e0', borderRadius: '6px', overflow: 'hidden' }}>\n <div style={{ position: 'relative' }}>\n <input\n type=\"text\"\n value={cardNumber}\n onChange={(e) => setCardNumber(formatCardNumber(e.target.value))}\n onFocus={() => setFocusedField('card')}\n onBlur={() => setFocusedField(null)}\n placeholder=\"1234 1234 1234 1234\"\n style={{ ...embeddedInputStyle(focusedField === 'card'), padding: '12px' }}\n />\n <div style={{ position: 'absolute', right: '12px', top: '50%', transform: 'translateY(-50%)' }}>\n <CardBrandBadges />\n </div>\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr' }}>\n <input\n type=\"text\"\n value={expiry}\n onChange={(e) => setExpiry(formatExpiry(e.target.value))}\n onFocus={() => setFocusedField('expiry')}\n onBlur={() => setFocusedField(null)}\n placeholder=\"MM / YY\"\n style={{ ...embeddedInputStyle(focusedField === 'expiry'), borderRight: '1px solid #e0e0e0', padding: '12px' }}\n />\n <div style={{ position: 'relative' }}>\n <input\n type=\"text\"\n value={cvc}\n onChange={(e) => setCvc(e.target.value.replace(/\\D/g, '').slice(0, 4))}\n onFocus={() => setFocusedField('cvc')}\n onBlur={() => setFocusedField(null)}\n placeholder=\"CVC\"\n style={{ ...embeddedInputStyle(focusedField === 'cvc'), padding: '12px' }}\n />\n <div style={{ position: 'absolute', right: '12px', top: '50%', transform: 'translateY(-50%)' }}>\n <CvcIcon />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Cardholder name */}\n <div style={{ marginBottom: '16px' }}>\n <label style={{ ...labelStyle, fontSize: '13px', color: '#666' }}>Cardholder name</label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onFocus={() => setFocusedField('name')}\n onBlur={() => setFocusedField(null)}\n placeholder=\"Full name on card\"\n style={inputStyle(focusedField === 'name')}\n />\n </div>\n\n {/* Country */}\n <div style={{ marginBottom: '20px' }}>\n <label style={{ ...labelStyle, fontSize: '13px', color: '#666' }}>Country or region</label>\n <select\n value={country}\n onChange={(e) => setCountry(e.target.value)}\n onFocus={() => setFocusedField('country')}\n onBlur={() => setFocusedField(null)}\n style={{\n ...inputStyle(focusedField === 'country'),\n appearance: 'none',\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23666' viewBox='0 0 16 16'%3E%3Cpath d='M8 11L3 6h10z'/%3E%3C/svg%3E\")`,\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'right 12px center',\n paddingRight: '32px',\n }}\n >\n <option>Australia</option>\n <option>Austria</option>\n <option>Belgium</option>\n <option>Brazil</option>\n <option>Canada</option>\n <option>Denmark</option>\n <option>Finland</option>\n <option>France</option>\n <option>Germany</option>\n <option>Ireland</option>\n <option>Italy</option>\n <option>Japan</option>\n <option>Netherlands</option>\n <option>New Zealand</option>\n <option>Norway</option>\n <option>Poland</option>\n <option>Portugal</option>\n <option>Spain</option>\n <option>Sweden</option>\n <option>Switzerland</option>\n <option>United Kingdom</option>\n <option>United States</option>\n </select>\n </div>\n\n {/* Subscribe button (embedded variant manages its own submit) */}\n <button\n type=\"button\"\n disabled\n style={{\n width: '100%',\n padding: '14px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: '#0570de',\n color: '#fff',\n fontSize: '16px',\n fontWeight: 600,\n cursor: 'default',\n fontFamily: FONT,\n opacity: 0.7,\n }}\n >\n Subscribe\n </button>\n\n {/* Powered by Stripe */}\n <div style={{ textAlign: 'center', marginTop: '12px', fontSize: '12px', color: '#aaa' }}>\n Powered by <span style={{ fontWeight: 700, letterSpacing: '-0.3px' }}>stripe</span>\n </div>\n </div>\n </div>\n )\n}\n\n\n// ============================================================================\n// DemoStripePaymentForm — public component (same interface as real one)\n// ============================================================================\n\nexport const DemoStripePaymentForm = forwardRef<StripePaymentHandle, StripePaymentFormProps>(\n function DemoStripePaymentForm(\n {\n productId,\n mode = 'checkout',\n variant = 'elements',\n onSuccess,\n onError,\n onReady,\n className,\n },\n ref,\n ) {\n const { variableStore, tracker, products } = useFunnelContext()\n\n const validateOnly = mode === 'validate-only'\n\n // Resolve the product (same logic as the real component)\n const product = useMemo(() => {\n if (productId) return products.find((p) => p.id === productId) || null\n const selectedId = variableStore.get('products.selectedProductId') as string\n return products.find((p) => p.id === selectedId) || null\n }, [productId, products, variableStore])\n\n // Fire checkout.start on mount\n const hasFiredStart = useRef(false)\n useEffect(() => {\n if (hasFiredStart.current) return\n hasFiredStart.current = true\n variableStore.set('payment.loading', false)\n tracker.track('checkout.start', {\n productId: product?.id,\n priceId: product?.stripePriceId || product?.storePriceId,\n productName: product?.displayName,\n })\n }, [product, tracker, variableStore])\n\n // Simulate submit — emulates the real purchase flow\n const handleSubmit = useCallback(async () => {\n variableStore.set('payment.loading', true)\n\n // Brief delay to simulate network\n await new Promise((r) => setTimeout(r, 800))\n\n try {\n tracker.track('checkout.payment_added')\n\n if (validateOnly) {\n // Simulate card validation\n variableStore.setMany({\n 'card.last4': '4242',\n 'card.brand': 'visa',\n 'card.expMonth': 12,\n 'card.expYear': 2030,\n 'card.funding': 'credit',\n 'payment.error': '',\n })\n onSuccess?.()\n return\n }\n\n // Simulate purchase\n variableStore.set('payment.error', '')\n tracker.track('purchase.complete', {\n amount: product?.rawPrice ? product.rawPrice / 100 : 0,\n currency: product?.currencyCode || 'USD',\n })\n onSuccess?.()\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'An error occurred'\n variableStore.set('payment.error', msg)\n onError?.(msg)\n } finally {\n variableStore.set('payment.loading', false)\n }\n }, [validateOnly, variableStore, tracker, product, onSuccess, onError])\n\n // Expose submit via ref\n useImperativeHandle(ref, () => ({ submit: handleSubmit }), [handleSubmit])\n\n return (\n <div className={className}>\n {variant === 'embedded' ? (\n <DemoEmbeddedForm product={product} onReady={onReady} />\n ) : (\n <DemoElementsForm onReady={onReady} />\n )}\n </div>\n )\n },\n)\n","import {\n useEffect,\n useState,\n useRef,\n useCallback,\n useMemo,\n forwardRef,\n useImperativeHandle,\n} from 'react'\nimport { loadStripe, type Stripe, type Appearance } from '@stripe/stripe-js'\nimport {\n Elements,\n PaymentElement,\n EmbeddedCheckoutProvider,\n EmbeddedCheckout,\n useStripe,\n useElements,\n} from '@stripe/react-stripe-js'\nimport { useFunnelContext } from './FunnelProvider'\nimport { useVariable } from '../hooks/useVariable'\nimport { DemoStripePaymentForm } from './DemoStripePaymentForm'\n\nconst API_BASE_URL = 'https://api.appfunnel.net'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface StripePaymentHandle {\n /** Programmatically submit the payment form */\n submit: () => Promise<void>\n}\n\nexport interface StripePaymentFormProps {\n /** Product ID override (default: currently selected product) */\n productId?: string\n /** \"checkout\" for full payment, \"validate-only\" to just collect card */\n mode?: 'checkout' | 'validate-only'\n /** \"elements\" for PaymentElement, \"embedded\" for Stripe Embedded Checkout */\n variant?: 'elements' | 'embedded'\n /** Called on successful payment */\n onSuccess?: () => void\n /** Called on payment error */\n onError?: (error: string) => void\n /** Called when the Stripe form is ready to accept submissions */\n onReady?: () => void\n /** Additional CSS class */\n className?: string\n /** Stripe Appearance override (elements variant only) */\n appearance?: Appearance\n /** PaymentElement layout option (default: 'tabs') */\n layout?: 'tabs' | 'accordion' | 'auto'\n}\n\n/** Check if we're running in dev mode */\nconst isDevMode = () => typeof globalThis !== 'undefined' && !!(globalThis as Record<string, unknown>).__APPFUNNEL_DEV__\n\n// ============================================================================\n// Inner Form — uses Stripe hooks (mounted inside <Elements>)\n// ============================================================================\n\ninterface InnerFormProps {\n paymentMode: 'setup' | 'payment'\n validateOnly: boolean\n onSuccess?: () => void\n onError?: (error: string) => void\n onReady?: () => void\n layout?: 'tabs' | 'accordion' | 'auto'\n}\n\nconst InnerPaymentForm = forwardRef<StripePaymentHandle, InnerFormProps>(\n function InnerPaymentForm({ paymentMode, validateOnly, onSuccess, onError, onReady, layout }, ref) {\n const stripe = useStripe()\n const elements = useElements()\n const [error, setError] = useState<string | null>(null)\n const { variableStore, campaignId, tracker, products } = useFunnelContext()\n const readyFired = useRef(false)\n\n // Notify parent when Stripe is loaded\n useEffect(() => {\n if (stripe && elements && !readyFired.current) {\n readyFired.current = true\n onReady?.()\n }\n }, [stripe, elements, onReady])\n\n const handleSubmit = useCallback(async () => {\n if (!stripe || !elements) {\n const msg = 'Stripe not loaded'\n setError(msg)\n onError?.(msg)\n return\n }\n\n setError(null)\n variableStore.set('payment.loading', true)\n\n try {\n const confirmFn = paymentMode === 'setup' ? stripe.confirmSetup : stripe.confirmPayment\n const confirmResult = await confirmFn({\n elements,\n redirect: 'if_required',\n confirmParams: { return_url: window.location.href },\n })\n\n if (confirmResult.error) {\n const msg = confirmResult.error.message || 'Payment failed'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n return\n }\n\n tracker.track('checkout.payment_added')\n\n if (validateOnly) {\n const piId = 'paymentIntent' in confirmResult\n ? (confirmResult as Record<string, unknown>).paymentIntent as { id?: string } | undefined\n : undefined\n\n if (!piId?.id) {\n const msg = 'PaymentIntent not found after confirmation'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n return\n }\n\n const response = await fetch(\n `${API_BASE_URL}/campaign/${campaignId}/stripe/validate-card`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n campaignId,\n sessionId: tracker.getSessionId(),\n paymentIntentId: piId.id,\n }),\n },\n )\n\n const result = await response.json()\n\n if (!result.success) {\n const msg = result.error || 'Card validation failed'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n return\n }\n\n variableStore.setMany({\n 'card.last4': result.card.last4,\n 'card.brand': result.card.brand,\n 'card.expMonth': result.card.expMonth,\n 'card.expYear': result.card.expYear,\n 'card.funding': result.card.funding,\n 'payment.error': '',\n })\n\n onSuccess?.()\n return\n }\n\n // ── Normal purchase path ──\n const paymentIntentId = 'paymentIntent' in confirmResult\n ? ((confirmResult as Record<string, unknown>).paymentIntent as { id?: string })?.id\n : undefined\n\n const selectedId = variableStore.get('products.selectedProductId') as string\n const product = products.find((p) => p.id === selectedId)\n\n if (!product?.stripePriceId) {\n const msg = 'No product selected or missing Stripe price'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n return\n }\n\n const response = await fetch(\n `${API_BASE_URL}/campaign/${campaignId}/stripe/purchase`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n campaignId,\n sessionId: tracker.getSessionId(),\n stripePriceId: product.stripePriceId,\n trialPeriodDays: product.hasTrial ? product.trialDays : undefined,\n onSessionPiId: paymentMode === 'payment' ? paymentIntentId : undefined,\n }),\n },\n )\n\n const result = await response.json()\n\n if (result.success) {\n variableStore.set('payment.error', '')\n if (result.eventId || result.eventIds?.firstPeriod) {\n tracker.track('purchase.complete', {\n amount: product.rawPrice ? product.rawPrice / 100 : 0,\n currency: product.currencyCode || 'USD',\n })\n }\n onSuccess?.()\n } else {\n const msg = result.error || 'Failed to process payment'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'An error occurred'\n setError(msg)\n variableStore.set('payment.error', msg)\n onError?.(msg)\n } finally {\n variableStore.set('payment.loading', false)\n }\n }, [stripe, elements, paymentMode, validateOnly, variableStore, campaignId, tracker, products, onSuccess, onError])\n\n // Expose submit via ref\n useImperativeHandle(ref, () => ({ submit: handleSubmit }), [handleSubmit])\n\n return (\n <div>\n <PaymentElement options={{ layout: layout || 'tabs' }} />\n {error && (\n <div style={{ color: '#ef4444', fontSize: '14px', marginTop: '12px' }}>\n {error}\n </div>\n )}\n </div>\n )\n },\n)\n\n// ============================================================================\n// StripePaymentForm (public component)\n// ============================================================================\n\nconst RealStripePaymentForm = forwardRef<StripePaymentHandle, StripePaymentFormProps>(\n function RealStripePaymentForm(\n {\n productId,\n mode = 'checkout',\n variant = 'elements',\n onSuccess,\n onError,\n onReady,\n className,\n appearance,\n layout,\n },\n ref,\n ) {\n const { campaignId, tracker, variableStore, products } = useFunnelContext()\n const [email] = useVariable<string>('user.email')\n\n const validateOnly = mode === 'validate-only'\n\n // Resolve the product\n const product = useMemo(() => {\n if (productId) return products.find((p) => p.id === productId) || null\n const selectedId = variableStore.get('products.selectedProductId') as string\n return products.find((p) => p.id === selectedId) || null\n }, [productId, products, variableStore])\n\n // Derive payment mode from product\n const paymentMode = useMemo((): 'setup' | 'payment' => {\n if (validateOnly) return 'payment'\n if (product?.hasTrial && !product.paidTrial) return 'setup'\n return 'payment'\n }, [product, validateOnly])\n\n const [stripePromise, setStripePromise] = useState<Promise<Stripe | null> | null>(null)\n const [clientSecret, setClientSecret] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const hasInitialized = useRef(false)\n\n // Create intent when email is available\n useEffect(() => {\n if (!email || !campaignId || hasInitialized.current) return\n if (!product?.storePriceId) return\n\n hasInitialized.current = true\n setIsLoading(true)\n variableStore.set('payment.loading', true)\n\n const createIntent = async () => {\n try {\n // Embedded checkout uses a different endpoint\n if (variant === 'embedded') {\n const response = await fetch(\n `${API_BASE_URL}/campaign/${campaignId}/stripe/checkout-session`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n campaignId,\n sessionId: tracker.getSessionId(),\n customerEmail: email,\n priceId: product.storePriceId,\n trialPeriodDays: product.hasTrial ? product.trialDays : undefined,\n }),\n },\n )\n\n const result = await response.json()\n if (!result.success) throw new Error(result.error || 'Failed to create checkout session')\n\n setStripePromise(loadStripe(result.publishableKey))\n setClientSecret(result.clientSecret)\n } else {\n const endpoint = paymentMode === 'setup'\n ? `/campaign/${campaignId}/stripe/setup-intent`\n : `/campaign/${campaignId}/stripe/payment-intent`\n\n const body: Record<string, unknown> = {\n campaignId,\n sessionId: tracker.getSessionId(),\n customerEmail: email,\n priceId: product.storePriceId,\n }\n\n if (validateOnly) body.validateOnly = true\n\n const response = await fetch(`${API_BASE_URL}${endpoint}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n\n const result = await response.json()\n if (!result.success) throw new Error(result.error || 'Failed to create intent')\n\n setStripePromise(loadStripe(result.publishableKey))\n setClientSecret(result.clientSecret)\n variableStore.set('user.stripeCustomerId', result.customerId)\n }\n\n tracker.track('checkout.start', {\n productId: product.id,\n priceId: product.stripePriceId || product.storePriceId,\n productName: product.displayName,\n })\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Failed to initialize payment'\n setError(msg)\n variableStore.set('payment.error', msg)\n } finally {\n setIsLoading(false)\n variableStore.set('payment.loading', false)\n }\n }\n\n createIntent()\n }, [email, campaignId, product, paymentMode, validateOnly, variant, tracker, variableStore])\n\n if (isLoading) {\n return <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#6b7280' }}>Loading payment form...</div>\n }\n\n if (!email) {\n return <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#ef4444', fontSize: '14px' }}>Email is required to initialize payment</div>\n }\n\n if (error) {\n return <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#ef4444', fontSize: '14px' }}>{error}</div>\n }\n\n if (!stripePromise || !clientSecret) {\n return <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#6b7280' }}>Initializing payment...</div>\n }\n\n // ── Embedded Checkout variant ──\n if (variant === 'embedded') {\n return (\n <div className={className}>\n <EmbeddedCheckoutProvider\n stripe={stripePromise}\n options={{\n clientSecret,\n onComplete: () => {\n tracker.track('purchase.complete', {\n amount: product?.rawPrice ? product.rawPrice / 100 : 0,\n currency: product?.currencyCode || 'USD',\n })\n onSuccess?.()\n },\n }}\n >\n <EmbeddedCheckout />\n </EmbeddedCheckoutProvider>\n </div>\n )\n }\n\n // ── Elements variant (default) ──\n const defaultAppearance: Appearance = {\n theme: 'stripe',\n variables: { colorPrimary: '#3b82f6', borderRadius: '8px' },\n }\n\n return (\n <div className={className}>\n <Elements stripe={stripePromise} options={{ clientSecret, appearance: appearance || defaultAppearance }}>\n <InnerPaymentForm\n ref={ref}\n paymentMode={paymentMode}\n validateOnly={validateOnly}\n onSuccess={onSuccess}\n onError={onError}\n onReady={onReady}\n layout={layout}\n />\n </Elements>\n </div>\n )\n },\n)\n\n/**\n * Stripe payment component supporting PaymentElement and Embedded Checkout.\n *\n * In dev mode (`globalThis.__APPFUNNEL_DEV__`), renders a demo form that\n * simulates Stripe UI and emulates purchases without real Stripe calls.\n *\n * Use a ref to submit the form from an external button:\n * ```tsx\n * const paymentRef = useRef<StripePaymentHandle>(null)\n *\n * <StripePaymentForm ref={paymentRef} onSuccess={goToNextPage} />\n * <button onClick={() => paymentRef.current?.submit()}>Pay Now</button>\n * ```\n */\nexport const StripePaymentForm = forwardRef<StripePaymentHandle, StripePaymentFormProps>(\n function StripePaymentForm(props, ref) {\n if (isDevMode()) {\n return <DemoStripePaymentForm ref={ref} {...props} />\n }\n return <RealStripePaymentForm ref={ref} {...props} />\n },\n)\n","import { useEffect, useRef, useCallback } from 'react'\nimport { useFunnelContext } from './FunnelProvider'\n\nexport interface PaddleCheckoutProps {\n /** Product ID to checkout (default: currently selected product) */\n productId?: string\n /** Display mode: overlay opens Paddle in a modal, inline renders embedded */\n mode?: 'overlay' | 'inline'\n /** Called on successful checkout */\n onSuccess?: () => void\n /** Called on checkout error */\n onError?: (error: string) => void\n /** Additional CSS class */\n className?: string\n}\n\ndeclare global {\n interface Window {\n Paddle?: {\n Setup: (options: Record<string, unknown>) => void\n Checkout: {\n open: (options: Record<string, unknown>) => void\n }\n }\n }\n}\n\n/**\n * Paddle checkout component.\n * Supports overlay (modal) and inline (embedded) modes.\n */\nexport function PaddleCheckout({\n productId,\n mode = 'overlay',\n onSuccess,\n onError,\n className,\n}: PaddleCheckoutProps) {\n const { variableStore, tracker, products } = useFunnelContext()\n const containerRef = useRef<HTMLDivElement>(null)\n const initializedRef = useRef(false)\n\n // Resolve product\n const product = productId\n ? products.find((p) => p.id === productId)\n : products.find((p) => p.id === (variableStore.get('products.selectedProductId') as string))\n\n const handleCheckoutComplete = useCallback(() => {\n tracker.track('purchase.complete', {\n amount: product?.rawPrice ? product.rawPrice / 100 : 0,\n currency: product?.currencyCode || 'USD',\n })\n onSuccess?.()\n }, [tracker, product, onSuccess])\n\n useEffect(() => {\n if (initializedRef.current || !product?.paddlePriceId) return\n initializedRef.current = true\n\n if (!window.Paddle) {\n onError?.('Paddle.js not loaded. Include the Paddle script in your HTML.')\n return\n }\n\n const email = variableStore.get('user.email') as string || ''\n\n if (mode === 'overlay') {\n window.Paddle.Checkout.open({\n items: [{ priceId: product.paddlePriceId, quantity: 1 }],\n customer: email ? { email } : undefined,\n successCallback: handleCheckoutComplete,\n closeCallback: () => { /* user closed */ },\n })\n } else {\n // Inline mode\n if (containerRef.current) {\n window.Paddle.Checkout.open({\n items: [{ priceId: product.paddlePriceId, quantity: 1 }],\n customer: email ? { email } : undefined,\n settings: {\n displayMode: 'inline',\n frameTarget: containerRef.current.id || 'paddle-checkout',\n frameInitialHeight: 450,\n frameStyle: 'width: 100%; min-width: 312px; background-color: transparent; border: none;',\n },\n successCallback: handleCheckoutComplete,\n })\n }\n }\n\n tracker.track('checkout.start', {\n productId: product.id,\n priceId: product.paddlePriceId,\n productName: product.displayName,\n })\n }, [product, mode, variableStore, tracker, handleCheckoutComplete, onError])\n\n if (!product) {\n return (\n <div className={className} style={{ padding: '20px', textAlign: 'center', color: '#ef4444', fontSize: '14px' }}>\n No product selected\n </div>\n )\n }\n\n if (mode === 'inline') {\n return <div ref={containerRef} id=\"paddle-checkout\" className={className} />\n }\n\n // Overlay mode renders nothing visible\n return null\n}\n"]}
|