priceos 1.0.21 → 1.0.23
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 +28 -1
- package/dist/{chunk-SMK7KTGQ.js → chunk-L253ULJU.js} +105 -37
- package/dist/chunk-L253ULJU.js.map +1 -0
- package/dist/client.d.ts +7 -5
- package/dist/embed/pricing-table.global.js +7 -7
- package/dist/gen/openapi.d.ts +1325 -935
- package/dist/index.cjs +104 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/next.cjs +267 -50
- package/dist/next.cjs.map +1 -1
- package/dist/next.js +164 -15
- package/dist/next.js.map +1 -1
- package/dist/react.cjs +104 -73
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.ts +29 -6
- package/dist/react.js +102 -73
- package/dist/react.js.map +1 -1
- package/dist/types.d.ts +25 -12
- package/package.json +3 -2
- package/dist/chunk-SMK7KTGQ.js.map +0 -1
package/dist/next.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/next.ts","../src/client.ts"],"sourcesContent":["import { PriceOS, PriceOSError } from \"./client\";\nimport type { CreateCheckoutRequest, TrackUsageResponse } from \"./types\";\n\nexport type PriceOSGetCustomerId = (\n request: Request\n) => string | null | undefined | Promise<string | null | undefined>;\n\nexport type PriceOSPagesRequest = {\n method?: string;\n headers?: Record<string, string | string[] | undefined>;\n url?: string;\n socket?: { encrypted?: boolean };\n body?: unknown;\n};\n\nexport type PriceOSPagesResponse = {\n status?: (code: number) => PriceOSPagesResponse;\n setHeader?: (name: string, value: string | string[]) => void;\n end?: (body?: string) => void;\n statusCode?: number;\n};\n\nexport type PriceOSPagesGetCustomerId = (\n request: PriceOSPagesRequest,\n normalizedRequest: Request\n) => string | null | undefined | Promise<string | null | undefined>;\n\nexport type PriceOSNextHandlerOptions = {\n apiKey?: string;\n basePath?: string;\n getCustomerId?: PriceOSGetCustomerId;\n};\n\nexport type PriceOSRouteHandler = (request: Request) => Promise<Response>;\nexport type PriceOSRouteMethodHandlers = PriceOSRouteHandler & {\n GET: PriceOSRouteHandler;\n POST: PriceOSRouteHandler;\n};\n\nexport type PriceOSPagesHandlerOptions = Omit<PriceOSNextHandlerOptions, \"getCustomerId\"> & {\n getCustomerId?: PriceOSPagesGetCustomerId;\n};\n\ntype TrackUsageRequestBody = {\n featureKey: string;\n amount?: number;\n idempotencyKey?: string;\n eventKey?: string;\n occurredAt?: number;\n metadata?: Record<string, string>;\n};\n\ntype CheckoutRequestBody = {\n stripePriceId: string;\n successUrl: string;\n cancelUrl?: string;\n customerId?: string;\n metadata?: Record<string, string>;\n};\n\nconst DEFAULT_BASE_PATH = \"/api/priceos\";\nconst CUSTOMER_PATH = \"v1/customer\";\nconst FEATURE_ACCESS_PATH = \"v1/feature-access\";\nconst TRACK_USAGE_PATH = \"v1/usage\";\nconst PRICING_TABLE_PATH = \"v1/pricing-table\";\nconst CHECKOUT_PATH = \"v1/checkout\";\n\nconst normalizePath = (value: string) => value.replace(/^\\/+/, \"\");\nconst logTrackUsageError = (message: string, details?: Record<string, unknown>) => {\n if (details === undefined) {\n console.error(\"[priceos/next][trackUsage]\", message);\n return;\n }\n console.error(\"[priceos/next][trackUsage]\", message, details);\n};\n\nconst jsonResponse = (status: number, body: unknown) =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json\" },\n });\n\nconst normalizeCustomerId = (value: string | null | undefined) => {\n if (typeof value !== \"string\") return null;\n const normalized = value.trim();\n return normalized.length ? normalized : null;\n};\n\nconst parseTrackUsageBody = async (request: Request): Promise<{ data?: TrackUsageRequestBody; error?: string }> => {\n let rawBody: unknown;\n try {\n rawBody = await request.json();\n } catch {\n return { error: \"Invalid JSON body\" };\n }\n\n if (!rawBody || typeof rawBody !== \"object\" || Array.isArray(rawBody)) {\n return { error: \"Invalid JSON body\" };\n }\n\n const body = rawBody as Record<string, unknown>;\n\n if (\"customerId\" in body) {\n return { error: \"customerId must be set via getCustomerId\" };\n }\n\n const featureKey = typeof body.featureKey === \"string\" ? body.featureKey.trim() : \"\";\n if (!featureKey) {\n return { error: \"featureKey is required\" };\n }\n\n const amountRaw = body.amount;\n const amount = amountRaw === undefined ? 1 : Number(amountRaw);\n if (!Number.isFinite(amount) || amount <= 0) {\n return { error: \"amount must be a positive number\" };\n }\n\n const idempotencyKeyRaw = body.idempotencyKey ?? body.eventKey;\n const idempotencyKey =\n idempotencyKeyRaw === undefined\n ? undefined\n : typeof idempotencyKeyRaw === \"string\" && idempotencyKeyRaw.trim().length > 0\n ? idempotencyKeyRaw.trim()\n : null;\n if (idempotencyKey === null) {\n return { error: \"idempotencyKey must be a non-empty string\" };\n }\n\n const occurredAtRaw = body.occurredAt;\n const occurredAt = occurredAtRaw === undefined ? undefined : Number(occurredAtRaw);\n if (occurredAtRaw !== undefined && !Number.isFinite(occurredAt)) {\n return { error: \"occurredAt must be a valid Unix timestamp (ms)\" };\n }\n\n const metadataRaw = body.metadata;\n if (metadataRaw !== undefined) {\n if (!metadataRaw || typeof metadataRaw !== \"object\" || Array.isArray(metadataRaw)) {\n return { error: \"metadata must be an object of string values\" };\n }\n for (const [key, value] of Object.entries(metadataRaw as Record<string, unknown>)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n return { error: \"metadata must be an object of string values\" };\n }\n }\n }\n\n return {\n data: {\n featureKey,\n amount,\n ...(idempotencyKey ? { idempotencyKey } : {}),\n ...(occurredAt !== undefined ? { occurredAt } : {}),\n ...(metadataRaw ? { metadata: metadataRaw as Record<string, string> } : {}),\n },\n };\n};\n\nconst resolveCustomerId = async (\n getCustomerId: PriceOSGetCustomerId,\n request: Request\n): Promise<{ customerId?: string; errorResponse?: Response }> => {\n let customerId: string | null | undefined;\n try {\n customerId = await getCustomerId(request);\n } catch {\n return { errorResponse: jsonResponse(500, { error: \"Failed to resolve customerId\" }) };\n }\n\n const normalizedCustomerId = normalizeCustomerId(customerId);\n if (!normalizedCustomerId) {\n return { errorResponse: jsonResponse(401, { error: \"Customer not identified\" }) };\n }\n\n return { customerId: normalizedCustomerId };\n};\n\nconst resolveOptionalCustomerId = async (\n getCustomerId: PriceOSGetCustomerId | undefined,\n request: Request\n): Promise<{ customerId: string | null; errorResponse?: Response }> => {\n if (!getCustomerId) return { customerId: null };\n let customerId: string | null | undefined;\n try {\n customerId = await getCustomerId(request);\n } catch {\n return { customerId: null, errorResponse: jsonResponse(500, { error: \"Failed to resolve customerId\" }) };\n }\n return { customerId: normalizeCustomerId(customerId) };\n};\n\nconst parseCheckoutBody = async (request: Request): Promise<{ data?: CheckoutRequestBody; error?: string }> => {\n let rawBody: unknown;\n try {\n rawBody = await request.json();\n } catch {\n return { error: \"Invalid JSON body\" };\n }\n\n if (!rawBody || typeof rawBody !== \"object\" || Array.isArray(rawBody)) {\n return { error: \"Invalid JSON body\" };\n }\n\n const body = rawBody as Record<string, unknown>;\n const stripePriceId =\n typeof body.stripePriceId === \"string\" && body.stripePriceId.trim().length > 0\n ? body.stripePriceId.trim()\n : \"\";\n if (!stripePriceId) {\n return { error: \"stripePriceId is required\" };\n }\n\n const successUrl =\n typeof body.successUrl === \"string\" && body.successUrl.trim().length > 0\n ? body.successUrl.trim()\n : \"\";\n if (!successUrl) {\n return { error: \"successUrl is required\" };\n }\n\n const cancelUrl =\n typeof body.cancelUrl === \"string\" && body.cancelUrl.trim().length > 0\n ? body.cancelUrl.trim()\n : undefined;\n const customerId =\n typeof body.customerId === \"string\" && body.customerId.trim().length > 0\n ? body.customerId.trim()\n : undefined;\n\n const metadataRaw = body.metadata;\n if (metadataRaw !== undefined) {\n if (!metadataRaw || typeof metadataRaw !== \"object\" || Array.isArray(metadataRaw)) {\n return { error: \"metadata must be an object of string values\" };\n }\n for (const [key, value] of Object.entries(metadataRaw as Record<string, unknown>)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n return { error: \"metadata must be an object of string values\" };\n }\n }\n }\n\n return {\n data: {\n stripePriceId,\n successUrl,\n ...(cancelUrl ? { cancelUrl } : {}),\n ...(customerId ? { customerId } : {}),\n ...(metadataRaw ? { metadata: metadataRaw as Record<string, string> } : {}),\n },\n };\n};\n\nconst handleGetCustomer = async (\n request: Request,\n url: URL,\n client: PriceOS,\n getCustomerId: PriceOSGetCustomerId\n) => {\n if (request.method.toUpperCase() !== \"GET\") {\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n if (url.searchParams.has(\"customerId\")) {\n return jsonResponse(400, { error: \"customerId must be set via getCustomerId\" });\n }\n\n const { customerId, errorResponse } = await resolveCustomerId(getCustomerId, request);\n if (errorResponse || !customerId) {\n return errorResponse ?? jsonResponse(401, { error: \"Customer not identified\" });\n }\n\n try {\n const data = await client.customers.get(customerId);\n return jsonResponse(200, data);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nconst handleTrackUsage = async (\n request: Request,\n url: URL,\n client: PriceOS,\n getCustomerId: PriceOSGetCustomerId\n) => {\n try {\n if (request.method.toUpperCase() !== \"POST\") {\n logTrackUsageError(\"Method not allowed\", {\n path: url.pathname,\n method: request.method,\n });\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n if (url.searchParams.has(\"customerId\")) {\n logTrackUsageError(\"Rejected request with customerId query param\", {\n path: url.pathname,\n method: request.method,\n });\n return jsonResponse(400, { error: \"customerId must be set via getCustomerId\" });\n }\n\n const parsed = await parseTrackUsageBody(request);\n if (!parsed.data) {\n logTrackUsageError(\"Invalid request body\", {\n path: url.pathname,\n method: request.method,\n error: parsed.error ?? \"Invalid request body\",\n });\n return jsonResponse(400, { error: parsed.error ?? \"Invalid request body\" });\n }\n\n const { customerId, errorResponse } = await resolveCustomerId(getCustomerId, request);\n if (errorResponse || !customerId) {\n logTrackUsageError(\"Failed to resolve customerId\", {\n path: url.pathname,\n method: request.method,\n status: errorResponse?.status ?? 401,\n });\n return errorResponse ?? jsonResponse(401, { error: \"Customer not identified\" });\n }\n\n try {\n const data = await client.usage.track({\n customerId,\n ...parsed.data,\n });\n return jsonResponse(200, data as TrackUsageResponse);\n } catch (error) {\n logTrackUsageError(\"Upstream trackUsage call failed\", {\n path: url.pathname,\n method: request.method,\n customerId,\n featureKey: parsed.data.featureKey,\n amount: parsed.data.amount,\n error,\n });\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n } catch (error) {\n logTrackUsageError(\"Unexpected unhandled error\", {\n path: url.pathname,\n method: request.method,\n error,\n });\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nconst handleGetFeatureAccess = async (\n request: Request,\n url: URL,\n client: PriceOS,\n getCustomerId: PriceOSGetCustomerId\n) => {\n if (request.method.toUpperCase() !== \"GET\") {\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n if (url.searchParams.has(\"customerId\")) {\n return jsonResponse(400, { error: \"customerId must be set via getCustomerId\" });\n }\n\n const { customerId, errorResponse } = await resolveCustomerId(getCustomerId, request);\n if (errorResponse || !customerId) {\n return errorResponse ?? jsonResponse(401, { error: \"Customer not identified\" });\n }\n\n try {\n const data = await client.features.getAccess(customerId);\n return jsonResponse(200, data);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nconst handleGetPricingTable = async (\n request: Request,\n url: URL,\n client: PriceOS,\n getCustomerId?: PriceOSGetCustomerId\n) => {\n if (request.method.toUpperCase() !== \"GET\") {\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n const queryCustomerId = normalizeCustomerId(url.searchParams.get(\"customerId\"));\n const queryPricingTableKey = normalizeCustomerId(url.searchParams.get(\"pricingTableKey\"));\n const { customerId: resolvedCustomerId, errorResponse } = await resolveOptionalCustomerId(\n getCustomerId,\n request\n );\n if (errorResponse) return errorResponse;\n\n const customerId = queryCustomerId ?? resolvedCustomerId;\n\n try {\n const data = await client.pricing.getTable({\n ...(customerId ? { customerId } : {}),\n ...(queryPricingTableKey ? { pricingTableKey: queryPricingTableKey } : {}),\n });\n return jsonResponse(200, data);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nconst handleCreateCheckout = async (\n request: Request,\n client: PriceOS,\n getCustomerId?: PriceOSGetCustomerId\n) => {\n if (request.method.toUpperCase() !== \"POST\") {\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n const parsed = await parseCheckoutBody(request);\n if (!parsed.data) {\n return jsonResponse(400, { error: parsed.error ?? \"Invalid request body\" });\n }\n\n const { customerId: resolvedCustomerId, errorResponse } = await resolveOptionalCustomerId(\n getCustomerId,\n request\n );\n if (errorResponse) return errorResponse;\n\n const body: CreateCheckoutRequest = {\n ...parsed.data,\n ...(parsed.data.customerId ?? resolvedCustomerId\n ? { customerId: parsed.data.customerId ?? resolvedCustomerId ?? undefined }\n : {}),\n };\n\n try {\n const data = await client.checkout.create(body);\n return jsonResponse(200, data);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nexport function priceosHandler(options: PriceOSNextHandlerOptions = {}): PriceOSRouteMethodHandlers {\n const envApiKey = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env?.PRICEOS_API_KEY;\n const apiKey = options.apiKey ?? envApiKey;\n const getCustomerId = options.getCustomerId;\n const basePath = (options.basePath ?? DEFAULT_BASE_PATH).replace(/\\/+$/, \"\");\n\n const handler: PriceOSRouteHandler = async (request: Request) => {\n if (!apiKey) {\n return new Response(\"Missing PRICEOS_API_KEY.\", { status: 500 });\n }\n\n let path = \"\";\n const url = new URL(request.url);\n const pathname = url.pathname;\n if (pathname.startsWith(basePath)) {\n path = normalizePath(pathname.slice(basePath.length));\n }\n\n const client = new PriceOS(apiKey);\n\n if (path === CUSTOMER_PATH) {\n if (!getCustomerId) {\n return jsonResponse(500, { error: \"Missing getCustomerId function\" });\n }\n return handleGetCustomer(request, url, client, getCustomerId);\n }\n\n if (path === FEATURE_ACCESS_PATH) {\n if (!getCustomerId) {\n return jsonResponse(500, { error: \"Missing getCustomerId function\" });\n }\n return handleGetFeatureAccess(request, url, client, getCustomerId);\n }\n\n if (path === TRACK_USAGE_PATH) {\n if (!getCustomerId) {\n return jsonResponse(500, { error: \"Missing getCustomerId function\" });\n }\n return handleTrackUsage(request, url, client, getCustomerId);\n }\n\n if (path === PRICING_TABLE_PATH) {\n return handleGetPricingTable(request, url, client, getCustomerId);\n }\n\n if (path === CHECKOUT_PATH) {\n return handleCreateCheckout(request, client, getCustomerId);\n }\n\n return new Response(\"Not found.\", { status: 404 });\n };\n\n return Object.assign(handler, {\n GET: handler,\n POST: handler,\n });\n}\n\nconst getHeaderValue = (\n headers: Record<string, string | string[] | undefined> | undefined,\n key: string\n) => {\n if (!headers) return undefined;\n const value = headers[key] ?? headers[key.toLowerCase()] ?? headers[key.toUpperCase()];\n if (value !== undefined) {\n if (Array.isArray(value)) return value.join(\",\");\n return value;\n }\n const entry = Object.entries(headers).find(([headerKey]) => headerKey.toLowerCase() === key.toLowerCase());\n if (!entry) return undefined;\n const [, entryValue] = entry;\n if (Array.isArray(entryValue)) return entryValue.join(\",\");\n return entryValue;\n};\n\nconst toHeaders = (headers: Record<string, string | string[] | undefined> | undefined) => {\n const result = new Headers();\n if (!headers) return result;\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === \"string\") result.set(key, value);\n if (Array.isArray(value)) result.set(key, value.join(\",\"));\n }\n return result;\n};\n\nconst buildRequest = (req: PriceOSPagesRequest) => {\n const headers = req.headers ?? {};\n const forwardedProto = getHeaderValue(headers, \"x-forwarded-proto\");\n const protocol =\n forwardedProto?.split(\",\")[0]?.trim() ?? (req.socket?.encrypted ? \"https\" : \"http\");\n const host =\n getHeaderValue(headers, \"x-forwarded-host\") ??\n getHeaderValue(headers, \"host\") ??\n \"localhost\";\n const url = new URL(req.url ?? \"/\", `${protocol}://${host}`);\n\n const method = (req.method ?? \"GET\").toUpperCase();\n const normalizedHeaders = toHeaders(headers);\n const init: RequestInit = {\n method,\n headers: normalizedHeaders,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\" && req.body !== undefined) {\n if (typeof req.body === \"string\") {\n init.body = req.body;\n } else {\n init.body = JSON.stringify(req.body);\n if (!normalizedHeaders.has(\"content-type\")) {\n normalizedHeaders.set(\"content-type\", \"application/json\");\n }\n }\n }\n\n return new Request(url, init);\n};\n\nconst sendResponse = async (res: PriceOSPagesResponse, response: Response) => {\n if (typeof res.status === \"function\") {\n res.status(response.status);\n } else {\n res.statusCode = response.status;\n }\n\n if (typeof res.setHeader === \"function\") {\n response.headers.forEach((value, key) => {\n res.setHeader?.(key, value);\n });\n }\n\n const body = await response.text();\n res.end?.(body || undefined);\n};\n\nexport function priceosPagesHandler(options: PriceOSPagesHandlerOptions = {}) {\n return async (req: PriceOSPagesRequest, res: PriceOSPagesResponse) => {\n const getCustomerId = options.getCustomerId;\n const request = buildRequest(req);\n const handler = priceosHandler({\n ...options,\n getCustomerId: getCustomerId ? (normalizedRequest) => getCustomerId(req, normalizedRequest) : undefined,\n });\n const response = await handler(request);\n await sendResponse(res, response);\n };\n}\n","import createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\nimport type { paths } from \"./gen/openapi\";\nimport {\n CreateBonusBody,\n CreateBonusResponse,\n CreateCustomerRequest,\n CreateCustomerResponse,\n CreateCustomerPortalResponse,\n DeleteBonusResponse,\n ListBonusesRequest,\n ListBonusesResponse,\n DeleteUsageEventsBody,\n DeleteUsageEventsResponse,\n DeleteUsageEventResponse,\n DeleteCustomerResponse,\n GetUsageEventResponse,\n GetUsageEventByIdempotencyKeyResponse,\n GetUsageEventByKeyResponse,\n GetCustomerResponse,\n GetFeatureAccessResponse,\n LinkCustomerBody,\n LinkCustomerResponse,\n LimitFeatureKeyFromAccessMap,\n TrackedLimitFeatureKeyFromAccessMap,\n ListUsageEventsBody,\n ListUsageEventsResponse,\n SetUsageBody,\n SetUsageResponse,\n UpdateUsageEventRequest,\n UpdateUsageEventResponse,\n VoidUsageEventRequest,\n VoidUsageEventResponse,\n UpdateBonusRequest,\n UpdateBonusResponse,\n TrackUsageBody,\n TrackUsageBatchBody,\n TrackUsageBatchResponse,\n TrackUsageResponse,\n UpdateCustomerBody,\n UpdateCustomerResponse,\n GetPricingTableRequest,\n GetPricingTableResponse,\n CreateCheckoutRequest,\n CreateCheckoutResponse,\n} from \"./types\";\n\nexport type PriceOSLogLevel = \"none\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n// --- Public options ---\nexport type PriceOSClientOptions = {\n logLevel?: PriceOSLogLevel;\n};\n\nconst RATE_LIMIT_STATUS = 429;\nconst MAX_RETRIES = 4;\nconst BASE_DELAY_MS = 250;\nconst BACKOFF_MULTIPLIER = 2;\nconst JITTER_MS = 250;\nconst RETRY_DELAY_CAP_MS = 5_000;\nconst REQUEST_TIMEOUT_MS = 20_000;\n\nconst LOG_LEVELS: Record<PriceOSLogLevel, number> = {\n none: 0,\n error: 1,\n warning: 2,\n info: 3,\n debug: 4,\n};\n\ntype Logger = {\n error: (message: string, details?: Record<string, unknown>) => void;\n warning: (message: string, details?: Record<string, unknown>) => void;\n info: (message: string, details?: Record<string, unknown>) => void;\n debug: (message: string, details?: Record<string, unknown>) => void;\n};\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst getRetryDelayMs = (retryCount: number): number => {\n const backoff = BASE_DELAY_MS * Math.pow(BACKOFF_MULTIPLIER, retryCount - 1);\n const jitter = Math.random() * JITTER_MS;\n return Math.min(RETRY_DELAY_CAP_MS, backoff + jitter);\n};\n\nconst resolveIdempotencyKey = (input: { idempotencyKey?: string; eventKey?: string }) => {\n const providedEventKey = typeof input.eventKey === \"string\" ? input.eventKey.trim() : \"\";\n const providedIdempotencyKey =\n typeof input.idempotencyKey === \"string\"\n ? String(input.idempotencyKey).trim()\n : \"\";\n return providedIdempotencyKey || providedEventKey;\n};\n\nconst withIdempotencyKey = <T extends { idempotencyKey?: string; eventKey?: string }>(input: T): T => {\n const idempotencyKey = resolveIdempotencyKey(input);\n if (!idempotencyKey) return input;\n const next = {\n ...input,\n idempotencyKey,\n };\n delete (next as { eventKey?: string }).eventKey;\n return next;\n};\n\nconst createLogger = (logLevel: PriceOSLogLevel): Logger => {\n const shouldLog = (level: PriceOSLogLevel): boolean =>\n logLevel !== \"none\" && LOG_LEVELS[level] <= LOG_LEVELS[logLevel];\n\n const write = (\n level: PriceOSLogLevel,\n message: string,\n details?: Record<string, unknown>\n ): void => {\n if (!shouldLog(level)) return;\n const prefix = `[PriceOS] ${level.toUpperCase()}: ${message}`;\n const payload = details && Object.keys(details).length > 0 ? details : undefined;\n\n switch (level) {\n case \"error\":\n payload ? console.error(prefix, payload) : console.error(prefix);\n return;\n case \"warning\":\n payload ? console.warn(prefix, payload) : console.warn(prefix);\n return;\n case \"info\":\n payload ? console.info(prefix, payload) : console.info(prefix);\n return;\n case \"debug\":\n payload ? console.debug(prefix, payload) : console.debug(prefix);\n return;\n }\n };\n\n return {\n error: (message, details) => write(\"error\", message, details),\n warning: (message, details) => write(\"warning\", message, details),\n info: (message, details) => write(\"info\", message, details),\n debug: (message, details) => write(\"debug\", message, details),\n };\n};\n\nconst getUpstreamSignal = (input: RequestInfo | URL, init?: RequestInit): AbortSignal | undefined => {\n if (init?.signal) return init.signal;\n if (typeof Request !== \"undefined\" && input instanceof Request) return input.signal;\n return undefined;\n};\n\nconst stripSignal = (init?: RequestInit): RequestInit | undefined => {\n if (!init) return undefined;\n const { signal: _signal, ...rest } = init;\n return rest;\n};\n\nconst getRequestDetails = (\n input: RequestInfo | URL,\n init?: RequestInit\n): { method: string; url: string } => {\n const method =\n init?.method ??\n (typeof Request !== \"undefined\" && input instanceof Request ? input.method : \"GET\");\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n return { method, url };\n};\n\nconst prepareRetryRequest = async (\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n log: Logger,\n method: string,\n url: string\n): Promise<{ requestInput: RequestInfo | URL; baseInit?: RequestInit; canRetry: boolean }> => {\n if (!(typeof Request !== \"undefined\" && input instanceof Request)) {\n return { requestInput: input, baseInit: stripSignal(init), canRetry: true };\n }\n\n if (input.bodyUsed) {\n log.warning(\"Request body already used; retries disabled\", { method, url });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n\n let body: BodyInit | undefined = undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n try {\n body = await input.clone().arrayBuffer();\n } catch (error) {\n log.warning(\"Unable to clone request body; retries disabled\", { method, url, error });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n }\n\n const headers = new Headers(input.headers);\n const baseInit = { ...stripSignal(init), method, headers, body };\n return { requestInput: input.url, baseInit, canRetry: true };\n};\n\nconst getErrorMessage = (error: unknown): string => {\n const maybeError = error as { error?: unknown } | null;\n if (maybeError && typeof maybeError.error === \"string\") return maybeError.error;\n return \"Request failed\";\n};\n\nconst throwRequestError = (\n log: Logger,\n error: unknown,\n response: Response | undefined,\n context: string\n): never => {\n log.error(\"Request failed\", { context, status: response?.status, error });\n throw new PriceOSError(getErrorMessage(error), { status: response?.status, details: error });\n};\n\nconst createRetryingFetch = (baseFetch: typeof fetch, log: Logger): typeof fetch => {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const { method, url } = getRequestDetails(input, init);\n const upstreamSignal = getUpstreamSignal(input, init);\n const { requestInput, baseInit, canRetry } = await prepareRetryRequest(\n input,\n init,\n log,\n method,\n url\n );\n let attempt = 0;\n while (true) {\n log.debug(\"Request attempt\", { method, url, attempt: attempt + 1, maxRetries: MAX_RETRIES });\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n let removeAbortListener: (() => void) | null = null;\n\n if (upstreamSignal) {\n if (upstreamSignal.aborted) {\n controller.abort();\n } else {\n const onAbort = () => controller.abort();\n upstreamSignal.addEventListener(\"abort\", onAbort);\n removeAbortListener = () => upstreamSignal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n try {\n const requestInit = { ...(baseInit ?? {}), signal: controller.signal };\n const response = await baseFetch(requestInput, requestInit);\n if (response.status !== RATE_LIMIT_STATUS) return response;\n\n const retryAfter = response.headers.get(\"retry-after\") ?? undefined;\n log.warning(\"Rate limit hit (429)\", {\n method,\n url,\n attempt: attempt + 1,\n maxRetries: MAX_RETRIES,\n retryAfter,\n });\n\n if (!canRetry) {\n log.warning(\"Skipping retry because request body is not replayable\", { method, url });\n return response;\n }\n\n if (attempt >= MAX_RETRIES) {\n log.error(\"Rate limit retries exhausted\", { method, url, attempts: attempt + 1 });\n return response;\n }\n\n const delayMs = getRetryDelayMs(attempt + 1);\n log.info(\"Waiting to retry after rate limit\", {\n method,\n url,\n delayMs,\n nextAttempt: attempt + 2,\n maxRetries: MAX_RETRIES,\n });\n await sleep(delayMs);\n attempt += 1;\n } catch (error) {\n if (controller.signal.aborted) {\n const abortedByCaller = upstreamSignal?.aborted ?? false;\n if (abortedByCaller) {\n log.warning(\"Request aborted by caller\", { method, url, attempt: attempt + 1 });\n } else {\n log.error(\"Request timed out\", {\n method,\n url,\n attempt: attempt + 1,\n timeoutMs: REQUEST_TIMEOUT_MS,\n });\n }\n } else {\n log.error(\"Request failed\", { method, url, attempt: attempt + 1, error });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n removeAbortListener?.();\n }\n }\n };\n};\n\nexport type PriceOSCustomersClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n get(customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null>;\n link(input: LinkCustomerBody): Promise<LinkCustomerResponse<TFeatureAccessMap> | null>;\n create(input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>>;\n update(input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>>;\n delete(customerId: string): Promise<DeleteCustomerResponse>;\n createPortal(customerId: string): Promise<CreateCustomerPortalResponse>;\n};\n\ntype FeatureAccessRecord<TFeatureAccessMap> =\n TFeatureAccessMap extends Record<string, unknown> ? TFeatureAccessMap : Record<string, never>;\n\ntype FeatureAccessKey<TFeatureAccessMap> = keyof FeatureAccessRecord<TFeatureAccessMap> & string;\n\nexport type PriceOSFeaturesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n getAccess(customerId: string): Promise<TFeatureAccessMap>;\n getAccess<TFeatureKey extends FeatureAccessKey<TFeatureAccessMap>>(\n customerId: string,\n featureKey: TFeatureKey\n ): Promise<FeatureAccessRecord<TFeatureAccessMap>[TFeatureKey]>;\n};\n\nexport type PriceOSPricingClient = {\n getTable(input?: GetPricingTableRequest): Promise<GetPricingTableResponse>;\n};\n\nexport type PriceOSCheckoutClient = {\n create(input: CreateCheckoutRequest): Promise<CreateCheckoutResponse>;\n};\n\nexport type PriceOSBonusesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n create(\n input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse>;\n list(\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse>;\n update(input: UpdateBonusRequest): Promise<UpdateBonusResponse>;\n delete(bonusId: string): Promise<DeleteBonusResponse>;\n};\n\nexport type PriceOSUsageClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n track(\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse>;\n set(\n input: SetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<SetUsageResponse>;\n getEvent(eventId: string): Promise<GetUsageEventResponse>;\n getEventByIdempotencyKey(idempotencyKey: string): Promise<GetUsageEventByIdempotencyKeyResponse>;\n getEventByKey(eventKey: string): Promise<GetUsageEventByKeyResponse>;\n updateEvent(input: UpdateUsageEventRequest): Promise<UpdateUsageEventResponse>;\n voidEvent(input: VoidUsageEventRequest): Promise<VoidUsageEventResponse>;\n deleteEvent(eventId: string): Promise<DeleteUsageEventResponse>;\n deleteEvents(\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse>;\n trackBatch(\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse>;\n listEvents(\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse>;\n};\n\n// --- Public SDK surface type ---\nexport type PriceOSHttpClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n pricing: PriceOSPricingClient;\n checkout: PriceOSCheckoutClient;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n};\n\nexport class PriceOSError extends Error {\n status?: number;\n details?: unknown;\n\n constructor(message: string, opts?: { status?: number; details?: unknown }) {\n super(message);\n this.name = \"PriceOSError\";\n this.status = opts?.status;\n this.details = opts?.details;\n }\n}\n\nexport class PriceOS<TFeatureAccessMap = GetFeatureAccessResponse>\n implements PriceOSHttpClient<TFeatureAccessMap>\n{\n private client: Client<paths>;\n private header: { \"x-api-key\": string };\n private log: Logger;\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n pricing: PriceOSPricingClient;\n checkout: PriceOSCheckoutClient;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n\n constructor(apiKey: string, opts: PriceOSClientOptions = {}) {\n const logLevel = opts.logLevel ?? \"none\";\n this.log = createLogger(logLevel);\n const baseUrl = \"https://api.priceos.com\";\n this.header = { \"x-api-key\": apiKey };\n const fetchWithRetry = createRetryingFetch(fetch, this.log);\n this.client = createClient<paths>({\n baseUrl,\n fetch: fetchWithRetry,\n headers: {\n \"x-api-key\": apiKey,\n },\n });\n\n this.customers = {\n get: async (customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.GET(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/customers/{customerId}\");\n return (data ?? null) as GetCustomerResponse<TFeatureAccessMap> | null;\n },\n link: async (\n input: LinkCustomerBody\n ): Promise<LinkCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers/link\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers/link\");\n return (data ?? null) as LinkCustomerResponse<TFeatureAccessMap> | null;\n },\n create: async (input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers\");\n return data! as CreateCustomerResponse<TFeatureAccessMap>;\n },\n update: async (input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>> => {\n const { customerId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/customers/{customerId}\");\n return data! as UpdateCustomerResponse<TFeatureAccessMap>;\n },\n delete: async (customerId: string): Promise<DeleteCustomerResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/customers/{customerId}\");\n return data! as DeleteCustomerResponse;\n },\n createPortal: async (customerId: string): Promise<CreateCustomerPortalResponse> => {\n const { data, error, response } = await this.client.POST(\n \"/v1/customers/{customerId}/customer_portal\",\n {\n params: { path: { customerId }, header: this.header },\n }\n );\n if (error) {\n throwRequestError(this.log, error, response, \"POST /v1/customers/{customerId}/customer_portal\");\n }\n return data! as CreateCustomerPortalResponse;\n },\n };\n\n const getFeatureAccessForCustomer = async (customerId: string): Promise<TFeatureAccessMap> => {\n const { data, error, response } = await this.client.GET(\"/v1/feature-access\", {\n params: { query: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/feature-access\");\n return data! as TFeatureAccessMap;\n };\n\n function getFeatureAccess(customerId: string): Promise<TFeatureAccessMap>;\n function getFeatureAccess<TFeatureKey extends FeatureAccessKey<TFeatureAccessMap>>(\n customerId: string,\n featureKey: TFeatureKey\n ): Promise<FeatureAccessRecord<TFeatureAccessMap>[TFeatureKey]>;\n async function getFeatureAccess<TFeatureKey extends FeatureAccessKey<TFeatureAccessMap>>(\n customerId: string,\n featureKey?: TFeatureKey\n ): Promise<TFeatureAccessMap | FeatureAccessRecord<TFeatureAccessMap>[TFeatureKey]> {\n const featureAccess = await getFeatureAccessForCustomer(customerId);\n if (featureKey === undefined) return featureAccess;\n return (featureAccess as FeatureAccessRecord<TFeatureAccessMap>)[featureKey];\n }\n\n this.features = {\n getAccess: getFeatureAccess,\n };\n\n this.pricing = {\n getTable: async (input: GetPricingTableRequest = {}): Promise<GetPricingTableResponse> => {\n const query = {\n ...(typeof input.customerId === \"string\" ? { customerId: input.customerId } : {}),\n ...(typeof input.pricingTableKey === \"string\" ? { pricingTableKey: input.pricingTableKey } : {}),\n };\n const { data, error, response } = await this.client.GET(\"/v1/pricing-table\", {\n params: { query, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/pricing-table\");\n return data! as GetPricingTableResponse;\n },\n };\n\n this.checkout = {\n create: async (input: CreateCheckoutRequest): Promise<CreateCheckoutResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/checkout\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/checkout\");\n return data! as CreateCheckoutResponse;\n },\n };\n\n this.bonuses = {\n create: async (\n input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/bonuses\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/bonuses\");\n return data!;\n },\n list: async (\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/bonuses\", {\n params: { header: this.header, query: input },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/bonuses\");\n return data!;\n },\n update: async (input: UpdateBonusRequest): Promise<UpdateBonusResponse> => {\n const { bonusId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/bonuses/{bonusId}\");\n return data!;\n },\n delete: async (bonusId: string): Promise<DeleteBonusResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/bonuses/{bonusId}\");\n return data!;\n },\n };\n\n this.usage = {\n track: async (\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse> => {\n const body = withIdempotencyKey(input);\n const { data, error, response } = await this.client.POST(\"/v1/usage\", {\n params: { header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage\");\n return data!;\n },\n set: async (\n input: SetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<SetUsageResponse> => {\n const body = withIdempotencyKey(input);\n const { data, error, response } = await this.client.POST(\"/v1/usage/set\", {\n params: { header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/set\");\n return data!;\n },\n getEvent: async (eventId: string): Promise<GetUsageEventResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/usage/{id}\", {\n params: { header: this.header, path: { id: eventId } },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/usage/{id}\");\n return data!;\n },\n getEventByIdempotencyKey: async (\n idempotencyKey: string\n ): Promise<GetUsageEventByIdempotencyKeyResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/usage/idempotency-key/{idempotencyKey}\", {\n params: { header: this.header, path: { idempotencyKey } },\n });\n if (error) {\n throwRequestError(this.log, error, response, \"GET /v1/usage/idempotency-key/{idempotencyKey}\");\n }\n return data!;\n },\n getEventByKey: async (eventKey: string): Promise<GetUsageEventByKeyResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/usage/idempotency-key/{idempotencyKey}\", {\n params: { header: this.header, path: { idempotencyKey: eventKey } },\n });\n if (error) {\n throwRequestError(this.log, error, response, \"GET /v1/usage/idempotency-key/{idempotencyKey}\");\n }\n return data!;\n },\n updateEvent: async (input: UpdateUsageEventRequest): Promise<UpdateUsageEventResponse> => {\n const { id, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/usage/{id}\", {\n params: { header: this.header, path: { id } },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/usage/{id}\");\n return data!;\n },\n voidEvent: async (input: VoidUsageEventRequest): Promise<VoidUsageEventResponse> => {\n const { id, ...body } = input;\n const { data, error, response } = await this.client.POST(\"/v1/usage/{id}/void\", {\n params: { header: this.header, path: { id } },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/{id}/void\");\n return data!;\n },\n deleteEvent: async (eventId: string): Promise<DeleteUsageEventResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/usage/{id}\", {\n params: { header: this.header, path: { id: eventId } },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/usage/{id}\");\n return data!;\n },\n deleteEvents: async (\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/delete\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/delete\");\n return data!;\n },\n trackBatch: async (\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse> => {\n const body = {\n ...input,\n events: input.events.map((event) => withIdempotencyKey(event)),\n };\n const { data, error, response } = await this.client.POST(\"/v1/usage/batch\", {\n params: { header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/batch\");\n return data!;\n },\n listEvents: async (\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/events\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/events\");\n return data!;\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,2BAAyB;AAsDzB,IAAM,oBAAoB;AAC1B,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;AAC3B,IAAM,YAAY;AAClB,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAE3B,IAAM,aAA8C;AAAA,EAClD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AACT;AASA,IAAM,QAAQ,CAAC,OAA8B,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAE7F,IAAM,kBAAkB,CAAC,eAA+B;AACtD,QAAM,UAAU,gBAAgB,KAAK,IAAI,oBAAoB,aAAa,CAAC;AAC3E,QAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,SAAO,KAAK,IAAI,oBAAoB,UAAU,MAAM;AACtD;AAEA,IAAM,wBAAwB,CAAC,UAA0D;AACvF,QAAM,mBAAmB,OAAO,MAAM,aAAa,WAAW,MAAM,SAAS,KAAK,IAAI;AACtF,QAAM,yBACJ,OAAO,MAAM,mBAAmB,WAC5B,OAAO,MAAM,cAAc,EAAE,KAAK,IAClC;AACN,SAAO,0BAA0B;AACnC;AAEA,IAAM,qBAAqB,CAA2D,UAAgB;AACpG,QAAM,iBAAiB,sBAAsB,KAAK;AAClD,MAAI,CAAC,eAAgB,QAAO;AAC5B,QAAM,OAAO;AAAA,IACX,GAAG;AAAA,IACH;AAAA,EACF;AACA,SAAQ,KAA+B;AACvC,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,aAAsC;AAC1D,QAAM,YAAY,CAAC,UACjB,aAAa,UAAU,WAAW,KAAK,KAAK,WAAW,QAAQ;AAEjE,QAAM,QAAQ,CACZ,OACA,SACA,YACS;AACT,QAAI,CAAC,UAAU,KAAK,EAAG;AACvB,UAAM,SAAS,aAAa,MAAM,YAAY,CAAC,KAAK,OAAO;AAC3D,UAAM,UAAU,WAAW,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AAEvE,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,kBAAU,QAAQ,MAAM,QAAQ,OAAO,IAAI,QAAQ,MAAM,MAAM;AAC/D;AAAA,MACF,KAAK;AACH,kBAAU,QAAQ,KAAK,QAAQ,OAAO,IAAI,QAAQ,KAAK,MAAM;AAC7D;AAAA,MACF,KAAK;AACH,kBAAU,QAAQ,KAAK,QAAQ,OAAO,IAAI,QAAQ,KAAK,MAAM;AAC7D;AAAA,MACF,KAAK;AACH,kBAAU,QAAQ,MAAM,QAAQ,OAAO,IAAI,QAAQ,MAAM,MAAM;AAC/D;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,CAAC,SAAS,YAAY,MAAM,SAAS,SAAS,OAAO;AAAA,IAC5D,SAAS,CAAC,SAAS,YAAY,MAAM,WAAW,SAAS,OAAO;AAAA,IAChE,MAAM,CAAC,SAAS,YAAY,MAAM,QAAQ,SAAS,OAAO;AAAA,IAC1D,OAAO,CAAC,SAAS,YAAY,MAAM,SAAS,SAAS,OAAO;AAAA,EAC9D;AACF;AAEA,IAAM,oBAAoB,CAAC,OAA0B,SAAgD;AACnG,MAAI,MAAM,OAAQ,QAAO,KAAK;AAC9B,MAAI,OAAO,YAAY,eAAe,iBAAiB,QAAS,QAAO,MAAM;AAC7E,SAAO;AACT;AAEA,IAAM,cAAc,CAAC,SAAgD;AACnE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,EAAE,QAAQ,SAAS,GAAG,KAAK,IAAI;AACrC,SAAO;AACT;AAEA,IAAM,oBAAoB,CACxB,OACA,SACoC;AACpC,QAAM,SACJ,MAAM,WACL,OAAO,YAAY,eAAe,iBAAiB,UAAU,MAAM,SAAS;AAC/E,QAAM,MACJ,OAAO,UAAU,WACb,QACA,iBAAiB,MACjB,MAAM,SAAS,IACf,MAAM;AACZ,SAAO,EAAE,QAAQ,IAAI;AACvB;AAEA,IAAM,sBAAsB,OAC1B,OACA,MACA,KACA,QACA,QAC4F;AAC5F,MAAI,EAAE,OAAO,YAAY,eAAe,iBAAiB,UAAU;AACjE,WAAO,EAAE,cAAc,OAAO,UAAU,YAAY,IAAI,GAAG,UAAU,KAAK;AAAA,EAC5E;AAEA,MAAI,MAAM,UAAU;AAClB,QAAI,QAAQ,+CAA+C,EAAE,QAAQ,IAAI,CAAC;AAC1E,WAAO,EAAE,cAAc,OAAO,UAAU,YAAY,IAAI,GAAG,UAAU,MAAM;AAAA,EAC7E;AAEA,MAAI,OAA6B;AACjC,MAAI,WAAW,SAAS,WAAW,QAAQ;AACzC,QAAI;AACF,aAAO,MAAM,MAAM,MAAM,EAAE,YAAY;AAAA,IACzC,SAAS,OAAO;AACd,UAAI,QAAQ,kDAAkD,EAAE,QAAQ,KAAK,MAAM,CAAC;AACpF,aAAO,EAAE,cAAc,OAAO,UAAU,YAAY,IAAI,GAAG,UAAU,MAAM;AAAA,IAC7E;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,QAAM,WAAW,EAAE,GAAG,YAAY,IAAI,GAAG,QAAQ,SAAS,KAAK;AAC/D,SAAO,EAAE,cAAc,MAAM,KAAK,UAAU,UAAU,KAAK;AAC7D;AAEA,IAAM,kBAAkB,CAAC,UAA2B;AAClD,QAAM,aAAa;AACnB,MAAI,cAAc,OAAO,WAAW,UAAU,SAAU,QAAO,WAAW;AAC1E,SAAO;AACT;AAEA,IAAM,oBAAoB,CACxB,KACA,OACA,UACA,YACU;AACV,MAAI,MAAM,kBAAkB,EAAE,SAAS,QAAQ,UAAU,QAAQ,MAAM,CAAC;AACxE,QAAM,IAAI,aAAa,gBAAgB,KAAK,GAAG,EAAE,QAAQ,UAAU,QAAQ,SAAS,MAAM,CAAC;AAC7F;AAEA,IAAM,sBAAsB,CAAC,WAAyB,QAA8B;AAClF,SAAO,OAAO,OAA0B,SAA0C;AAChF,UAAM,EAAE,QAAQ,IAAI,IAAI,kBAAkB,OAAO,IAAI;AACrD,UAAM,iBAAiB,kBAAkB,OAAO,IAAI;AACpD,UAAM,EAAE,cAAc,UAAU,SAAS,IAAI,MAAM;AAAA,MACjD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,UAAU;AACd,WAAO,MAAM;AACX,UAAI,MAAM,mBAAmB,EAAE,QAAQ,KAAK,SAAS,UAAU,GAAG,YAAY,YAAY,CAAC;AAC3F,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,kBAAkB;AACzE,UAAI,sBAA2C;AAE/C,UAAI,gBAAgB;AAClB,YAAI,eAAe,SAAS;AAC1B,qBAAW,MAAM;AAAA,QACnB,OAAO;AACL,gBAAM,UAAU,MAAM,WAAW,MAAM;AACvC,yBAAe,iBAAiB,SAAS,OAAO;AAChD,gCAAsB,MAAM,eAAe,oBAAoB,SAAS,OAAO;AAAA,QACjF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,cAAc,EAAE,GAAI,YAAY,CAAC,GAAI,QAAQ,WAAW,OAAO;AACrE,cAAM,WAAW,MAAM,UAAU,cAAc,WAAW;AAC1D,YAAI,SAAS,WAAW,kBAAmB,QAAO;AAElD,cAAM,aAAa,SAAS,QAAQ,IAAI,aAAa,KAAK;AAC1D,YAAI,QAAQ,wBAAwB;AAAA,UAClC;AAAA,UACA;AAAA,UACA,SAAS,UAAU;AAAA,UACnB,YAAY;AAAA,UACZ;AAAA,QACF,CAAC;AAED,YAAI,CAAC,UAAU;AACb,cAAI,QAAQ,yDAAyD,EAAE,QAAQ,IAAI,CAAC;AACpF,iBAAO;AAAA,QACT;AAEA,YAAI,WAAW,aAAa;AAC1B,cAAI,MAAM,gCAAgC,EAAE,QAAQ,KAAK,UAAU,UAAU,EAAE,CAAC;AAChF,iBAAO;AAAA,QACT;AAEA,cAAM,UAAU,gBAAgB,UAAU,CAAC;AAC3C,YAAI,KAAK,qCAAqC;AAAA,UAC5C;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa,UAAU;AAAA,UACvB,YAAY;AAAA,QACd,CAAC;AACD,cAAM,MAAM,OAAO;AACnB,mBAAW;AAAA,MACb,SAAS,OAAO;AACd,YAAI,WAAW,OAAO,SAAS;AAC7B,gBAAM,kBAAkB,gBAAgB,WAAW;AACnD,cAAI,iBAAiB;AACnB,gBAAI,QAAQ,6BAA6B,EAAE,QAAQ,KAAK,SAAS,UAAU,EAAE,CAAC;AAAA,UAChF,OAAO;AACL,gBAAI,MAAM,qBAAqB;AAAA,cAC7B;AAAA,cACA;AAAA,cACA,SAAS,UAAU;AAAA,cACnB,WAAW;AAAA,YACb,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,cAAI,MAAM,kBAAkB,EAAE,QAAQ,KAAK,SAAS,UAAU,GAAG,MAAM,CAAC;AAAA,QAC1E;AACA,cAAM;AAAA,MACR,UAAE;AACA,qBAAa,SAAS;AACtB,8BAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AA6EO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,MAA+C;AAC1E,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS,MAAM;AACpB,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;AAEO,IAAM,UAAN,MAEP;AAAA,EACU;AAAA,EACA;AAAA,EACA;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAAgB,OAA6B,CAAC,GAAG;AAC3D,UAAM,WAAW,KAAK,YAAY;AAClC,SAAK,MAAM,aAAa,QAAQ;AAChC,UAAM,UAAU;AAChB,SAAK,SAAS,EAAE,aAAa,OAAO;AACpC,UAAM,iBAAiB,oBAAoB,OAAO,KAAK,GAAG;AAC1D,SAAK,aAAS,qBAAAA,SAAoB;AAAA,MAChC;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAED,SAAK,YAAY;AAAA,MACf,KAAK,OAAO,eAA+E;AACzF,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,8BAA8B;AAAA,UACpF,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,QACtD,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,gCAAgC;AACxF,eAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,MAAM,OACJ,UAC4D;AAC5D,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,sBAAsB;AAAA,UAC7E,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,yBAAyB;AACjF,eAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,QAAQ,OAAO,UAAqF;AAClG,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,iBAAiB;AAAA,UACxE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,oBAAoB;AAC5E,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,OAAO,UAAkF;AAC/F,cAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,8BAA8B;AAAA,UACpF,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,UACpD;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,gCAAgC;AACxF,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,OAAO,eAAwD;AACrE,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,OAAO,8BAA8B;AAAA,UACvF,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,QACtD,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,mCAAmC;AAC3F,eAAO;AAAA,MACT;AAAA,MACA,cAAc,OAAO,eAA8D;AACjF,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO;AAAA,UAClD;AAAA,UACA;AAAA,YACE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,UACtD;AAAA,QACF;AACA,YAAI,OAAO;AACT,4BAAkB,KAAK,KAAK,OAAO,UAAU,iDAAiD;AAAA,QAChG;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,8BAA8B,OAAO,eAAmD;AAC5F,YAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,sBAAsB;AAAA,QAC5E,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,MACvD,CAAC;AACD,UAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,wBAAwB;AAChF,aAAO;AAAA,IACT;AAOA,mBAAe,iBACb,YACA,YACkF;AAClF,YAAM,gBAAgB,MAAM,4BAA4B,UAAU;AAClE,UAAI,eAAe,OAAW,QAAO;AACrC,aAAQ,cAAyD,UAAU;AAAA,IAC7E;AAEA,SAAK,WAAW;AAAA,MACd,WAAW;AAAA,IACb;AAEA,SAAK,UAAU;AAAA,MACb,UAAU,OAAO,QAAgC,CAAC,MAAwC;AACxF,cAAM,QAAQ;AAAA,UACZ,GAAI,OAAO,MAAM,eAAe,WAAW,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,UAC/E,GAAI,OAAO,MAAM,oBAAoB,WAAW,EAAE,iBAAiB,MAAM,gBAAgB,IAAI,CAAC;AAAA,QAChG;AACA,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,qBAAqB;AAAA,UAC3E,QAAQ,EAAE,OAAO,QAAQ,KAAK,OAAO;AAAA,QACvC,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,uBAAuB;AAC/E,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,WAAW;AAAA,MACd,QAAQ,OAAO,UAAkE;AAC/E,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,gBAAgB;AAAA,UACvE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,mBAAmB;AAC3E,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,UAAU;AAAA,MACb,QAAQ,OACN,UACiC;AACjC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,eAAe;AAAA,UACtE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,kBAAkB;AAC1E,eAAO;AAAA,MACT;AAAA,MACA,MAAM,OACJ,UACiC;AACjC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,eAAe;AAAA,UACrE,QAAQ,EAAE,QAAQ,KAAK,QAAQ,OAAO,MAAM;AAAA,QAC9C,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,iBAAiB;AACzE,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,OAAO,UAA4D;AACzE,cAAM,EAAE,SAAS,GAAG,KAAK,IAAI;AAC7B,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,yBAAyB;AAAA,UAC/E,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,QAAQ,EAAE;AAAA,UACjD;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,2BAA2B;AACnF,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,OAAO,YAAkD;AAC/D,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,OAAO,yBAAyB;AAAA,UAClF,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,QAAQ,EAAE;AAAA,QACnD,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,8BAA8B;AACtF,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,QAAQ;AAAA,MACX,OAAO,OACL,UACgC;AAChC,cAAM,OAAO,mBAAmB,KAAK;AACrC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,aAAa;AAAA,UACpE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,gBAAgB;AACxE,eAAO;AAAA,MACT;AAAA,MACA,KAAK,OACH,UAC8B;AAC9B,cAAM,OAAO,mBAAmB,KAAK;AACrC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,iBAAiB;AAAA,UACxE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,oBAAoB;AAC5E,eAAO;AAAA,MACT;AAAA,MACA,UAAU,OAAO,YAAoD;AACnE,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,kBAAkB;AAAA,UACxE,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,IAAI,QAAQ,EAAE;AAAA,QACvD,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,oBAAoB;AAC5E,eAAO;AAAA,MACT;AAAA,MACA,0BAA0B,OACxB,mBACmD;AACnD,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,8CAA8C;AAAA,UACpG,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,eAAe,EAAE;AAAA,QAC1D,CAAC;AACD,YAAI,OAAO;AACT,4BAAkB,KAAK,KAAK,OAAO,UAAU,gDAAgD;AAAA,QAC/F;AACA,eAAO;AAAA,MACT;AAAA,MACA,eAAe,OAAO,aAA0D;AAC9E,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,8CAA8C;AAAA,UACpG,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,gBAAgB,SAAS,EAAE;AAAA,QACpE,CAAC;AACD,YAAI,OAAO;AACT,4BAAkB,KAAK,KAAK,OAAO,UAAU,gDAAgD;AAAA,QAC/F;AACA,eAAO;AAAA,MACT;AAAA,MACA,aAAa,OAAO,UAAsE;AACxF,cAAM,EAAE,IAAI,GAAG,KAAK,IAAI;AACxB,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,kBAAkB;AAAA,UACxE,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,GAAG,EAAE;AAAA,UAC5C;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,oBAAoB;AAC5E,eAAO;AAAA,MACT;AAAA,MACA,WAAW,OAAO,UAAkE;AAClF,cAAM,EAAE,IAAI,GAAG,KAAK,IAAI;AACxB,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,uBAAuB;AAAA,UAC9E,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,GAAG,EAAE;AAAA,UAC5C;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,0BAA0B;AAClF,eAAO;AAAA,MACT;AAAA,MACA,aAAa,OAAO,YAAuD;AACzE,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,OAAO,kBAAkB;AAAA,UAC3E,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,IAAI,QAAQ,EAAE;AAAA,QACvD,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,uBAAuB;AAC/E,eAAO;AAAA,MACT;AAAA,MACA,cAAc,OACZ,UACuC;AACvC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,oBAAoB;AAAA,UAC3E,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,uBAAuB;AAC/E,eAAO;AAAA,MACT;AAAA,MACA,YAAY,OACV,UACqC;AACrC,cAAM,OAAO;AAAA,UACX,GAAG;AAAA,UACH,QAAQ,MAAM,OAAO,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAAA,QAC/D;AACA,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,mBAAmB;AAAA,UAC1E,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,sBAAsB;AAC9E,eAAO;AAAA,MACT;AAAA,MACA,YAAY,OACV,UACqC;AACrC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,oBAAoB;AAAA,UAC3E,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,uBAAuB;AAC/E,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;;;ADtmBA,IAAM,oBAAoB;AAC1B,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,gBAAgB;AAEtB,IAAM,gBAAgB,CAAC,UAAkB,MAAM,QAAQ,QAAQ,EAAE;AACjE,IAAM,qBAAqB,CAAC,SAAiB,YAAsC;AACjF,MAAI,YAAY,QAAW;AACzB,YAAQ,MAAM,8BAA8B,OAAO;AACnD;AAAA,EACF;AACA,UAAQ,MAAM,8BAA8B,SAAS,OAAO;AAC9D;AAEA,IAAM,eAAe,CAAC,QAAgB,SACpC,IAAI,SAAS,KAAK,UAAU,IAAI,GAAG;AAAA,EACjC;AAAA,EACA,SAAS,EAAE,gBAAgB,mBAAmB;AAChD,CAAC;AAEH,IAAM,sBAAsB,CAAC,UAAqC;AAChE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,WAAW,SAAS,aAAa;AAC1C;AAEA,IAAM,sBAAsB,OAAO,YAAgF;AACjH,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,KAAK;AAAA,EAC/B,QAAQ;AACN,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,MAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AACrE,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,QAAM,OAAO;AAEb,MAAI,gBAAgB,MAAM;AACxB,WAAO,EAAE,OAAO,2CAA2C;AAAA,EAC7D;AAEA,QAAM,aAAa,OAAO,KAAK,eAAe,WAAW,KAAK,WAAW,KAAK,IAAI;AAClF,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,OAAO,yBAAyB;AAAA,EAC3C;AAEA,QAAM,YAAY,KAAK;AACvB,QAAM,SAAS,cAAc,SAAY,IAAI,OAAO,SAAS;AAC7D,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,WAAO,EAAE,OAAO,mCAAmC;AAAA,EACrD;AAEA,QAAM,oBAAoB,KAAK,kBAAkB,KAAK;AACtD,QAAM,iBACJ,sBAAsB,SAClB,SACA,OAAO,sBAAsB,YAAY,kBAAkB,KAAK,EAAE,SAAS,IACzE,kBAAkB,KAAK,IACvB;AACR,MAAI,mBAAmB,MAAM;AAC3B,WAAO,EAAE,OAAO,4CAA4C;AAAA,EAC9D;AAEA,QAAM,gBAAgB,KAAK;AAC3B,QAAM,aAAa,kBAAkB,SAAY,SAAY,OAAO,aAAa;AACjF,MAAI,kBAAkB,UAAa,CAAC,OAAO,SAAS,UAAU,GAAG;AAC/D,WAAO,EAAE,OAAO,iDAAiD;AAAA,EACnE;AAEA,QAAM,cAAc,KAAK;AACzB,MAAI,gBAAgB,QAAW;AAC7B,QAAI,CAAC,eAAe,OAAO,gBAAgB,YAAY,MAAM,QAAQ,WAAW,GAAG;AACjF,aAAO,EAAE,OAAO,8CAA8C;AAAA,IAChE;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAsC,GAAG;AACjF,UAAI,OAAO,QAAQ,YAAY,OAAO,UAAU,UAAU;AACxD,eAAO,EAAE,OAAO,8CAA8C;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3C,GAAI,eAAe,SAAY,EAAE,WAAW,IAAI,CAAC;AAAA,MACjD,GAAI,cAAc,EAAE,UAAU,YAAsC,IAAI,CAAC;AAAA,IAC3E;AAAA,EACF;AACF;AAEA,IAAM,oBAAoB,OACxB,eACA,YAC+D;AAC/D,MAAI;AACJ,MAAI;AACF,iBAAa,MAAM,cAAc,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO,EAAE,eAAe,aAAa,KAAK,EAAE,OAAO,+BAA+B,CAAC,EAAE;AAAA,EACvF;AAEA,QAAM,uBAAuB,oBAAoB,UAAU;AAC3D,MAAI,CAAC,sBAAsB;AACzB,WAAO,EAAE,eAAe,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC,EAAE;AAAA,EAClF;AAEA,SAAO,EAAE,YAAY,qBAAqB;AAC5C;AAEA,IAAM,4BAA4B,OAChC,eACA,YACqE;AACrE,MAAI,CAAC,cAAe,QAAO,EAAE,YAAY,KAAK;AAC9C,MAAI;AACJ,MAAI;AACF,iBAAa,MAAM,cAAc,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO,EAAE,YAAY,MAAM,eAAe,aAAa,KAAK,EAAE,OAAO,+BAA+B,CAAC,EAAE;AAAA,EACzG;AACA,SAAO,EAAE,YAAY,oBAAoB,UAAU,EAAE;AACvD;AAEA,IAAM,oBAAoB,OAAO,YAA8E;AAC7G,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,KAAK;AAAA,EAC/B,QAAQ;AACN,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,MAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AACrE,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,QAAM,OAAO;AACb,QAAM,gBACJ,OAAO,KAAK,kBAAkB,YAAY,KAAK,cAAc,KAAK,EAAE,SAAS,IACzE,KAAK,cAAc,KAAK,IACxB;AACN,MAAI,CAAC,eAAe;AAClB,WAAO,EAAE,OAAO,4BAA4B;AAAA,EAC9C;AAEA,QAAM,aACJ,OAAO,KAAK,eAAe,YAAY,KAAK,WAAW,KAAK,EAAE,SAAS,IACnE,KAAK,WAAW,KAAK,IACrB;AACN,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,OAAO,yBAAyB;AAAA,EAC3C;AAEA,QAAM,YACJ,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,KAAK,EAAE,SAAS,IACjE,KAAK,UAAU,KAAK,IACpB;AACN,QAAM,aACJ,OAAO,KAAK,eAAe,YAAY,KAAK,WAAW,KAAK,EAAE,SAAS,IACnE,KAAK,WAAW,KAAK,IACrB;AAEN,QAAM,cAAc,KAAK;AACzB,MAAI,gBAAgB,QAAW;AAC7B,QAAI,CAAC,eAAe,OAAO,gBAAgB,YAAY,MAAM,QAAQ,WAAW,GAAG;AACjF,aAAO,EAAE,OAAO,8CAA8C;AAAA,IAChE;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAsC,GAAG;AACjF,UAAI,OAAO,QAAQ,YAAY,OAAO,UAAU,UAAU;AACxD,eAAO,EAAE,OAAO,8CAA8C;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACnC,GAAI,cAAc,EAAE,UAAU,YAAsC,IAAI,CAAC;AAAA,IAC3E;AAAA,EACF;AACF;AAEA,IAAM,oBAAoB,OACxB,SACA,KACA,QACA,kBACG;AACH,MAAI,QAAQ,OAAO,YAAY,MAAM,OAAO;AAC1C,WAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5D;AAEA,MAAI,IAAI,aAAa,IAAI,YAAY,GAAG;AACtC,WAAO,aAAa,KAAK,EAAE,OAAO,2CAA2C,CAAC;AAAA,EAChF;AAEA,QAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,eAAe,OAAO;AACpF,MAAI,iBAAiB,CAAC,YAAY;AAChC,WAAO,iBAAiB,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,EAChF;AAEA,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,UAAU,IAAI,UAAU;AAClD,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,aAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEA,IAAM,mBAAmB,OACvB,SACA,KACA,QACA,kBACG;AACH,MAAI;AACF,QAAI,QAAQ,OAAO,YAAY,MAAM,QAAQ;AAC3C,yBAAmB,sBAAsB;AAAA,QACvC,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD,aAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC5D;AAEA,QAAI,IAAI,aAAa,IAAI,YAAY,GAAG;AACtC,yBAAmB,gDAAgD;AAAA,QACjE,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD,aAAO,aAAa,KAAK,EAAE,OAAO,2CAA2C,CAAC;AAAA,IAChF;AAEA,UAAM,SAAS,MAAM,oBAAoB,OAAO;AAChD,QAAI,CAAC,OAAO,MAAM;AAChB,yBAAmB,wBAAwB;AAAA,QACzC,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,QAChB,OAAO,OAAO,SAAS;AAAA,MACzB,CAAC;AACD,aAAO,aAAa,KAAK,EAAE,OAAO,OAAO,SAAS,uBAAuB,CAAC;AAAA,IAC5E;AAEA,UAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,eAAe,OAAO;AACpF,QAAI,iBAAiB,CAAC,YAAY;AAChC,yBAAmB,gCAAgC;AAAA,QACjD,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,QAChB,QAAQ,eAAe,UAAU;AAAA,MACnC,CAAC;AACD,aAAO,iBAAiB,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,IAChF;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,MAAM,MAAM;AAAA,QACpC;AAAA,QACA,GAAG,OAAO;AAAA,MACZ,CAAC;AACD,aAAO,aAAa,KAAK,IAA0B;AAAA,IACrD,SAAS,OAAO;AACd,yBAAmB,mCAAmC;AAAA,QACpD,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,YAAY,OAAO,KAAK;AAAA,QACxB,QAAQ,OAAO,KAAK;AAAA,QACpB;AAAA,MACF,CAAC;AACD,UAAI,iBAAiB,cAAc;AACjC,eAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,MACnE;AACA,aAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,IACtD;AAAA,EACF,SAAS,OAAO;AACd,uBAAmB,8BAA8B;AAAA,MAC/C,MAAM,IAAI;AAAA,MACV,QAAQ,QAAQ;AAAA,MAChB;AAAA,IACF,CAAC;AACD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEA,IAAM,yBAAyB,OAC7B,SACA,KACA,QACA,kBACG;AACH,MAAI,QAAQ,OAAO,YAAY,MAAM,OAAO;AAC1C,WAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5D;AAEA,MAAI,IAAI,aAAa,IAAI,YAAY,GAAG;AACtC,WAAO,aAAa,KAAK,EAAE,OAAO,2CAA2C,CAAC;AAAA,EAChF;AAEA,QAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,eAAe,OAAO;AACpF,MAAI,iBAAiB,CAAC,YAAY;AAChC,WAAO,iBAAiB,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,EAChF;AAEA,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,SAAS,UAAU,UAAU;AACvD,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,aAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEA,IAAM,wBAAwB,OAC5B,SACA,KACA,QACA,kBACG;AACH,MAAI,QAAQ,OAAO,YAAY,MAAM,OAAO;AAC1C,WAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5D;AAEA,QAAM,kBAAkB,oBAAoB,IAAI,aAAa,IAAI,YAAY,CAAC;AAC9E,QAAM,uBAAuB,oBAAoB,IAAI,aAAa,IAAI,iBAAiB,CAAC;AACxF,QAAM,EAAE,YAAY,oBAAoB,cAAc,IAAI,MAAM;AAAA,IAC9D;AAAA,IACA;AAAA,EACF;AACA,MAAI,cAAe,QAAO;AAE1B,QAAM,aAAa,mBAAmB;AAEtC,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,QAAQ,SAAS;AAAA,MACzC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACnC,GAAI,uBAAuB,EAAE,iBAAiB,qBAAqB,IAAI,CAAC;AAAA,IAC1E,CAAC;AACD,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,aAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEA,IAAM,uBAAuB,OAC3B,SACA,QACA,kBACG;AACH,MAAI,QAAQ,OAAO,YAAY,MAAM,QAAQ;AAC3C,WAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5D;AAEA,QAAM,SAAS,MAAM,kBAAkB,OAAO;AAC9C,MAAI,CAAC,OAAO,MAAM;AAChB,WAAO,aAAa,KAAK,EAAE,OAAO,OAAO,SAAS,uBAAuB,CAAC;AAAA,EAC5E;AAEA,QAAM,EAAE,YAAY,oBAAoB,cAAc,IAAI,MAAM;AAAA,IAC9D;AAAA,IACA;AAAA,EACF;AACA,MAAI,cAAe,QAAO;AAE1B,QAAM,OAA8B;AAAA,IAClC,GAAG,OAAO;AAAA,IACV,GAAI,OAAO,KAAK,cAAc,qBAC1B,EAAE,YAAY,OAAO,KAAK,cAAc,sBAAsB,OAAU,IACxE,CAAC;AAAA,EACP;AAEA,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,SAAS,OAAO,IAAI;AAC9C,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,aAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEO,SAAS,eAAe,UAAqC,CAAC,GAA+B;AAClG,QAAM,YAAa,WAChB,SAAS,KAAK;AACjB,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,YAAY,QAAQ,YAAY,mBAAmB,QAAQ,QAAQ,EAAE;AAE3E,QAAM,UAA+B,OAAO,YAAqB;AAC/D,QAAI,CAAC,QAAQ;AACX,aAAO,IAAI,SAAS,4BAA4B,EAAE,QAAQ,IAAI,CAAC;AAAA,IACjE;AAEA,QAAI,OAAO;AACX,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,UAAM,WAAW,IAAI;AACrB,QAAI,SAAS,WAAW,QAAQ,GAAG;AACjC,aAAO,cAAc,SAAS,MAAM,SAAS,MAAM,CAAC;AAAA,IACtD;AAEA,UAAM,SAAS,IAAI,QAAQ,MAAM;AAEjC,QAAI,SAAS,eAAe;AAC1B,UAAI,CAAC,eAAe;AAClB,eAAO,aAAa,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MACtE;AACA,aAAO,kBAAkB,SAAS,KAAK,QAAQ,aAAa;AAAA,IAC9D;AAEA,QAAI,SAAS,qBAAqB;AAChC,UAAI,CAAC,eAAe;AAClB,eAAO,aAAa,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MACtE;AACA,aAAO,uBAAuB,SAAS,KAAK,QAAQ,aAAa;AAAA,IACnE;AAEA,QAAI,SAAS,kBAAkB;AAC7B,UAAI,CAAC,eAAe;AAClB,eAAO,aAAa,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MACtE;AACA,aAAO,iBAAiB,SAAS,KAAK,QAAQ,aAAa;AAAA,IAC7D;AAEA,QAAI,SAAS,oBAAoB;AAC/B,aAAO,sBAAsB,SAAS,KAAK,QAAQ,aAAa;AAAA,IAClE;AAEA,QAAI,SAAS,eAAe;AAC1B,aAAO,qBAAqB,SAAS,QAAQ,aAAa;AAAA,IAC5D;AAEA,WAAO,IAAI,SAAS,cAAc,EAAE,QAAQ,IAAI,CAAC;AAAA,EACnD;AAEA,SAAO,OAAO,OAAO,SAAS;AAAA,IAC5B,KAAK;AAAA,IACL,MAAM;AAAA,EACR,CAAC;AACH;AAEA,IAAM,iBAAiB,CACrB,SACA,QACG;AACH,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,QAAQ,GAAG,KAAK,QAAQ,IAAI,YAAY,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC;AACrF,MAAI,UAAU,QAAW;AACvB,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,KAAK,GAAG;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,QAAQ,OAAO,EAAE,KAAK,CAAC,CAAC,SAAS,MAAM,UAAU,YAAY,MAAM,IAAI,YAAY,CAAC;AACzG,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,CAAC,EAAE,UAAU,IAAI;AACvB,MAAI,MAAM,QAAQ,UAAU,EAAG,QAAO,WAAW,KAAK,GAAG;AACzD,SAAO;AACT;AAEA,IAAM,YAAY,CAAC,YAAuE;AACxF,QAAM,SAAS,IAAI,QAAQ;AAC3B,MAAI,CAAC,QAAS,QAAO;AACrB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,OAAO,UAAU,SAAU,QAAO,IAAI,KAAK,KAAK;AACpD,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,QAA6B;AACjD,QAAM,UAAU,IAAI,WAAW,CAAC;AAChC,QAAM,iBAAiB,eAAe,SAAS,mBAAmB;AAClE,QAAM,WACJ,gBAAgB,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,QAAQ,YAAY,UAAU;AAC9E,QAAM,OACJ,eAAe,SAAS,kBAAkB,KAC1C,eAAe,SAAS,MAAM,KAC9B;AACF,QAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,GAAG,QAAQ,MAAM,IAAI,EAAE;AAE3D,QAAM,UAAU,IAAI,UAAU,OAAO,YAAY;AACjD,QAAM,oBAAoB,UAAU,OAAO;AAC3C,QAAM,OAAoB;AAAA,IACxB;AAAA,IACA,SAAS;AAAA,EACX;AAEA,MAAI,WAAW,SAAS,WAAW,UAAU,IAAI,SAAS,QAAW;AACnE,QAAI,OAAO,IAAI,SAAS,UAAU;AAChC,WAAK,OAAO,IAAI;AAAA,IAClB,OAAO;AACL,WAAK,OAAO,KAAK,UAAU,IAAI,IAAI;AACnC,UAAI,CAAC,kBAAkB,IAAI,cAAc,GAAG;AAC1C,0BAAkB,IAAI,gBAAgB,kBAAkB;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,QAAQ,KAAK,IAAI;AAC9B;AAEA,IAAM,eAAe,OAAO,KAA2B,aAAuB;AAC5E,MAAI,OAAO,IAAI,WAAW,YAAY;AACpC,QAAI,OAAO,SAAS,MAAM;AAAA,EAC5B,OAAO;AACL,QAAI,aAAa,SAAS;AAAA,EAC5B;AAEA,MAAI,OAAO,IAAI,cAAc,YAAY;AACvC,aAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACvC,UAAI,YAAY,KAAK,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,MAAM,QAAQ,MAAS;AAC7B;AAEO,SAAS,oBAAoB,UAAsC,CAAC,GAAG;AAC5E,SAAO,OAAO,KAA0B,QAA8B;AACpE,UAAM,gBAAgB,QAAQ;AAC9B,UAAM,UAAU,aAAa,GAAG;AAChC,UAAM,UAAU,eAAe;AAAA,MAC7B,GAAG;AAAA,MACH,eAAe,gBAAgB,CAAC,sBAAsB,cAAc,KAAK,iBAAiB,IAAI;AAAA,IAChG,CAAC;AACD,UAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,UAAM,aAAa,KAAK,QAAQ;AAAA,EAClC;AACF;","names":["createClient"]}
|
|
1
|
+
{"version":3,"sources":["../src/next.ts","../src/client.ts"],"sourcesContent":["import { PriceOS, PriceOSError } from \"./client\";\nimport type {\n CreateCheckoutResponse,\n CreateCustomerCheckoutRequest,\n CreateCustomerCheckoutResponse,\n CreateCustomerPortalResponse,\n GetCustomerExpand,\n TrackUsageResponse,\n} from \"./types\";\n\nexport type PriceOSGetCustomerId = (\n request: Request\n) => string | null | undefined | Promise<string | null | undefined>;\n\nexport type PriceOSPagesRequest = {\n method?: string;\n headers?: Record<string, string | string[] | undefined>;\n url?: string;\n socket?: { encrypted?: boolean };\n body?: unknown;\n};\n\nexport type PriceOSPagesResponse = {\n status?: (code: number) => PriceOSPagesResponse;\n setHeader?: (name: string, value: string | string[]) => void;\n end?: (body?: string) => void;\n statusCode?: number;\n};\n\nexport type PriceOSPagesGetCustomerId = (\n request: PriceOSPagesRequest,\n normalizedRequest: Request\n) => string | null | undefined | Promise<string | null | undefined>;\n\nexport type PriceOSNextHandlerOptions = {\n apiKey?: string;\n basePath?: string;\n getCustomerId?: PriceOSGetCustomerId;\n};\n\nexport type PriceOSRouteHandler = (request: Request) => Promise<Response>;\nexport type PriceOSRouteMethodHandlers = PriceOSRouteHandler & {\n GET: PriceOSRouteHandler;\n POST: PriceOSRouteHandler;\n};\n\nexport type PriceOSPagesHandlerOptions = Omit<PriceOSNextHandlerOptions, \"getCustomerId\"> & {\n getCustomerId?: PriceOSPagesGetCustomerId;\n};\n\ntype TrackUsageRequestBody = {\n featureKey: string;\n amount?: number;\n idempotencyKey?: string;\n occurredAt?: number;\n metadata?: Record<string, string>;\n};\n\ntype CheckoutRequestBody = {\n stripeProductKey?: string;\n stripePriceId?: string;\n successUrl?: string;\n cancelUrl?: string;\n customerId?: string;\n metadata?: Record<string, string>;\n checkoutParams?: Record<string, unknown>;\n customerInfo?: {\n name?: string;\n email?: string;\n };\n};\n\ntype CustomerPortalRequestBody = {\n customerId?: string;\n};\n\nconst DEFAULT_BASE_PATH = \"/api/priceos\";\nconst CUSTOMER_PATH = \"v1/customer\";\nconst FEATURE_ACCESS_PATH = \"v1/feature-access\";\nconst TRACK_USAGE_PATH = \"v1/usage\";\nconst PRICING_TABLE_PATH = \"v1/pricing-table\";\nconst CHECKOUT_PATH = \"v1/checkout\";\nconst CUSTOMER_PORTAL_PATH = \"v1/customer-portal\";\n\nconst normalizePath = (value: string) => value.replace(/^\\/+/, \"\");\nconst logTrackUsageError = (message: string, details?: Record<string, unknown>) => {\n if (details === undefined) {\n console.error(\"[priceos/next][trackUsage]\", message);\n return;\n }\n console.error(\"[priceos/next][trackUsage]\", message, details);\n};\n\nconst jsonResponse = (status: number, body: unknown) =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json\" },\n });\n\nconst normalizeCustomerId = (value: string | null | undefined) => {\n if (typeof value !== \"string\") return null;\n const normalized = value.trim();\n return normalized.length ? normalized : null;\n};\n\nconst parseCustomerExpand = (url: URL): { data?: { expand?: GetCustomerExpand[] }; error?: string } => {\n const expandValues = [...url.searchParams.getAll(\"expand\"), ...url.searchParams.getAll(\"expand[]\")]\n .flatMap((value) => value.split(\",\"))\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n\n if (!expandValues.length) {\n return { data: {} };\n }\n\n const normalizedValues = Array.from(new Set(expandValues));\n const invalidValue = normalizedValues.find((value) => value !== \"subscriptions\");\n if (invalidValue) {\n return { error: `Invalid expand value: ${invalidValue}` };\n }\n\n return { data: { expand: normalizedValues as GetCustomerExpand[] } };\n};\n\nconst parseTrackUsageBody = async (request: Request): Promise<{ data?: TrackUsageRequestBody; error?: string }> => {\n let rawBody: unknown;\n try {\n rawBody = await request.json();\n } catch {\n return { error: \"Invalid JSON body\" };\n }\n\n if (!rawBody || typeof rawBody !== \"object\" || Array.isArray(rawBody)) {\n return { error: \"Invalid JSON body\" };\n }\n\n const body = rawBody as Record<string, unknown>;\n\n if (\"customerId\" in body) {\n return { error: \"customerId must be set via getCustomerId\" };\n }\n\n const featureKey = typeof body.featureKey === \"string\" ? body.featureKey.trim() : \"\";\n if (!featureKey) {\n return { error: \"featureKey is required\" };\n }\n\n const amountRaw = body.amount;\n const amount = amountRaw === undefined ? 1 : Number(amountRaw);\n if (!Number.isFinite(amount) || amount <= 0) {\n return { error: \"amount must be a positive number\" };\n }\n\n const idempotencyKeyRaw = body.idempotencyKey;\n const idempotencyKey =\n idempotencyKeyRaw === undefined\n ? undefined\n : typeof idempotencyKeyRaw === \"string\" && idempotencyKeyRaw.trim().length > 0\n ? idempotencyKeyRaw.trim()\n : null;\n if (idempotencyKey === null) {\n return { error: \"idempotencyKey must be a non-empty string\" };\n }\n\n const occurredAtRaw = body.occurredAt;\n const occurredAt = occurredAtRaw === undefined ? undefined : Number(occurredAtRaw);\n if (occurredAtRaw !== undefined && !Number.isFinite(occurredAt)) {\n return { error: \"occurredAt must be a valid Unix timestamp (ms)\" };\n }\n\n const metadataRaw = body.metadata;\n if (metadataRaw !== undefined) {\n if (!metadataRaw || typeof metadataRaw !== \"object\" || Array.isArray(metadataRaw)) {\n return { error: \"metadata must be an object of string values\" };\n }\n for (const [key, value] of Object.entries(metadataRaw as Record<string, unknown>)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n return { error: \"metadata must be an object of string values\" };\n }\n }\n }\n\n return {\n data: {\n featureKey,\n amount,\n ...(idempotencyKey ? { idempotencyKey } : {}),\n ...(occurredAt !== undefined ? { occurredAt } : {}),\n ...(metadataRaw ? { metadata: metadataRaw as Record<string, string> } : {}),\n },\n };\n};\n\nconst resolveCustomerId = async (\n getCustomerId: PriceOSGetCustomerId,\n request: Request\n): Promise<{ customerId?: string; errorResponse?: Response }> => {\n let customerId: string | null | undefined;\n try {\n customerId = await getCustomerId(request);\n } catch {\n return { errorResponse: jsonResponse(500, { error: \"Failed to resolve customerId\" }) };\n }\n\n const normalizedCustomerId = normalizeCustomerId(customerId);\n if (!normalizedCustomerId) {\n return { errorResponse: jsonResponse(401, { error: \"Customer not identified\" }) };\n }\n\n return { customerId: normalizedCustomerId };\n};\n\nconst resolveOptionalCustomerId = async (\n getCustomerId: PriceOSGetCustomerId | undefined,\n request: Request\n): Promise<{ customerId: string | null; errorResponse?: Response }> => {\n if (!getCustomerId) return { customerId: null };\n let customerId: string | null | undefined;\n try {\n customerId = await getCustomerId(request);\n } catch {\n return { customerId: null, errorResponse: jsonResponse(500, { error: \"Failed to resolve customerId\" }) };\n }\n return { customerId: normalizeCustomerId(customerId) };\n};\n\nconst parseCheckoutBody = async (request: Request): Promise<{ data?: CheckoutRequestBody; error?: string }> => {\n let rawBody: unknown;\n try {\n rawBody = await request.json();\n } catch {\n return { error: \"Invalid JSON body\" };\n }\n\n if (!rawBody || typeof rawBody !== \"object\" || Array.isArray(rawBody)) {\n return { error: \"Invalid JSON body\" };\n }\n\n const body = rawBody as Record<string, unknown>;\n const stripeProductKey =\n typeof body.stripeProductKey === \"string\" && body.stripeProductKey.trim().length > 0\n ? body.stripeProductKey.trim()\n : undefined;\n const stripePriceId =\n typeof body.stripePriceId === \"string\" && body.stripePriceId.trim().length > 0\n ? body.stripePriceId.trim()\n : undefined;\n if (!stripeProductKey && !stripePriceId) {\n return { error: \"stripeProductKey or stripePriceId is required\" };\n }\n\n const successUrlRaw = body.successUrl;\n if (successUrlRaw !== undefined && typeof successUrlRaw !== \"string\") {\n return { error: \"successUrl must be a non-empty string\" };\n }\n const successUrl = normalizeCustomerId(\n typeof successUrlRaw === \"string\" ? successUrlRaw : undefined\n );\n if (successUrlRaw !== undefined && !successUrl) {\n return { error: \"successUrl must be a non-empty string\" };\n }\n\n const cancelUrl =\n typeof body.cancelUrl === \"string\" && body.cancelUrl.trim().length > 0\n ? body.cancelUrl.trim()\n : undefined;\n const customerId =\n typeof body.customerId === \"string\" && body.customerId.trim().length > 0\n ? body.customerId.trim()\n : undefined;\n\n const metadataRaw = body.metadata;\n if (metadataRaw !== undefined) {\n if (!metadataRaw || typeof metadataRaw !== \"object\" || Array.isArray(metadataRaw)) {\n return { error: \"metadata must be an object of string values\" };\n }\n for (const [key, value] of Object.entries(metadataRaw as Record<string, unknown>)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n return { error: \"metadata must be an object of string values\" };\n }\n }\n }\n\n const checkoutParamsRaw = body.checkoutParams;\n if (checkoutParamsRaw !== undefined && (!checkoutParamsRaw || typeof checkoutParamsRaw !== \"object\" || Array.isArray(checkoutParamsRaw))) {\n return { error: \"checkoutParams must be an object\" };\n }\n\n const customerInfoRaw = body.customerInfo;\n if (customerInfoRaw !== undefined && (!customerInfoRaw || typeof customerInfoRaw !== \"object\" || Array.isArray(customerInfoRaw))) {\n return { error: \"customerInfo must be an object\" };\n }\n const customerInfoRecord = customerInfoRaw as Record<string, unknown> | undefined;\n const customerName = normalizeCustomerId(\n typeof customerInfoRecord?.name === \"string\" ? customerInfoRecord.name : undefined\n );\n const customerEmail = normalizeCustomerId(\n typeof customerInfoRecord?.email === \"string\" ? customerInfoRecord.email : undefined\n );\n\n return {\n data: {\n ...(stripeProductKey ? { stripeProductKey } : {}),\n ...(stripePriceId ? { stripePriceId } : {}),\n ...(successUrl ? { successUrl } : {}),\n ...(cancelUrl ? { cancelUrl } : {}),\n ...(customerId ? { customerId } : {}),\n ...(metadataRaw ? { metadata: metadataRaw as Record<string, string> } : {}),\n ...(checkoutParamsRaw ? { checkoutParams: checkoutParamsRaw as Record<string, unknown> } : {}),\n ...(customerInfoRaw\n ? {\n customerInfo: {\n ...(customerName ? { name: customerName } : {}),\n ...(customerEmail ? { email: customerEmail } : {}),\n },\n }\n : {}),\n },\n };\n};\n\nconst parseCustomerPortalBody = async (\n request: Request\n): Promise<{ data?: CustomerPortalRequestBody; error?: string }> => {\n let rawText = \"\";\n try {\n rawText = await request.text();\n } catch {\n return { error: \"Invalid JSON body\" };\n }\n\n if (!rawText.trim()) return { data: {} };\n\n let rawBody: unknown;\n try {\n rawBody = JSON.parse(rawText);\n } catch {\n return { error: \"Invalid JSON body\" };\n }\n\n if (!rawBody || typeof rawBody !== \"object\" || Array.isArray(rawBody)) {\n return { error: \"Invalid JSON body\" };\n }\n\n const body = rawBody as Record<string, unknown>;\n const customerIdRaw = body.customerId;\n if (customerIdRaw !== undefined && typeof customerIdRaw !== \"string\") {\n return { error: \"customerId must be a non-empty string\" };\n }\n const customerId = normalizeCustomerId(\n typeof customerIdRaw === \"string\" ? customerIdRaw : undefined\n );\n if (customerIdRaw !== undefined && !customerId) {\n return { error: \"customerId must be a non-empty string\" };\n }\n\n return {\n data: customerId ? { customerId } : {},\n };\n};\n\nconst handleGetCustomer = async (\n request: Request,\n url: URL,\n client: PriceOS,\n getCustomerId: PriceOSGetCustomerId\n) => {\n if (request.method.toUpperCase() !== \"GET\") {\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n if (url.searchParams.has(\"customerId\")) {\n return jsonResponse(400, { error: \"customerId must be set via getCustomerId\" });\n }\n\n const { customerId, errorResponse } = await resolveCustomerId(getCustomerId, request);\n if (errorResponse || !customerId) {\n return errorResponse ?? jsonResponse(401, { error: \"Customer not identified\" });\n }\n\n const expandResult = parseCustomerExpand(url);\n if (!expandResult.data) {\n return jsonResponse(400, { error: expandResult.error ?? \"Invalid request\" });\n }\n\n try {\n const data = await client.customers.get(customerId, expandResult.data);\n return jsonResponse(200, data);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nconst handleTrackUsage = async (\n request: Request,\n url: URL,\n client: PriceOS,\n getCustomerId: PriceOSGetCustomerId\n) => {\n try {\n if (request.method.toUpperCase() !== \"POST\") {\n logTrackUsageError(\"Method not allowed\", {\n path: url.pathname,\n method: request.method,\n });\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n if (url.searchParams.has(\"customerId\")) {\n logTrackUsageError(\"Rejected request with customerId query param\", {\n path: url.pathname,\n method: request.method,\n });\n return jsonResponse(400, { error: \"customerId must be set via getCustomerId\" });\n }\n\n const parsed = await parseTrackUsageBody(request);\n if (!parsed.data) {\n logTrackUsageError(\"Invalid request body\", {\n path: url.pathname,\n method: request.method,\n error: parsed.error ?? \"Invalid request body\",\n });\n return jsonResponse(400, { error: parsed.error ?? \"Invalid request body\" });\n }\n\n const { customerId, errorResponse } = await resolveCustomerId(getCustomerId, request);\n if (errorResponse || !customerId) {\n logTrackUsageError(\"Failed to resolve customerId\", {\n path: url.pathname,\n method: request.method,\n status: errorResponse?.status ?? 401,\n });\n return errorResponse ?? jsonResponse(401, { error: \"Customer not identified\" });\n }\n\n try {\n const data = await client.usage.track({\n customerId,\n ...parsed.data,\n });\n return jsonResponse(200, data as TrackUsageResponse);\n } catch (error) {\n logTrackUsageError(\"Upstream trackUsage call failed\", {\n path: url.pathname,\n method: request.method,\n customerId,\n featureKey: parsed.data.featureKey,\n amount: parsed.data.amount,\n error,\n });\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n } catch (error) {\n logTrackUsageError(\"Unexpected unhandled error\", {\n path: url.pathname,\n method: request.method,\n error,\n });\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nconst handleGetFeatureAccess = async (\n request: Request,\n url: URL,\n client: PriceOS,\n getCustomerId: PriceOSGetCustomerId\n) => {\n if (request.method.toUpperCase() !== \"GET\") {\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n if (url.searchParams.has(\"customerId\")) {\n return jsonResponse(400, { error: \"customerId must be set via getCustomerId\" });\n }\n\n const { customerId, errorResponse } = await resolveCustomerId(getCustomerId, request);\n if (errorResponse || !customerId) {\n return errorResponse ?? jsonResponse(401, { error: \"Customer not identified\" });\n }\n\n try {\n const data = await client.features.getAccess(customerId);\n return jsonResponse(200, data);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nconst handleGetPricingTable = async (\n request: Request,\n url: URL,\n client: PriceOS,\n getCustomerId?: PriceOSGetCustomerId\n) => {\n if (request.method.toUpperCase() !== \"GET\") {\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n const queryCustomerId = normalizeCustomerId(url.searchParams.get(\"customerId\"));\n const queryPricingTableKey = normalizeCustomerId(url.searchParams.get(\"pricingTableKey\"));\n const { customerId: resolvedCustomerId, errorResponse } = await resolveOptionalCustomerId(\n getCustomerId,\n request\n );\n if (errorResponse) return errorResponse;\n\n const customerId = queryCustomerId ?? resolvedCustomerId;\n\n try {\n const data = await client.pricing.getTable({\n ...(customerId ? { customerId } : {}),\n ...(queryPricingTableKey ? { pricingTableKey: queryPricingTableKey } : {}),\n });\n return jsonResponse(200, data);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nconst handleCreateCheckout = async (\n request: Request,\n client: PriceOS,\n getCustomerId?: PriceOSGetCustomerId\n) => {\n if (request.method.toUpperCase() !== \"POST\") {\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n const parsed = await parseCheckoutBody(request);\n if (!parsed.data) {\n return jsonResponse(400, { error: parsed.error ?? \"Invalid request body\" });\n }\n\n const { customerId: resolvedCustomerId, errorResponse } = await resolveOptionalCustomerId(\n getCustomerId,\n request\n );\n if (errorResponse) return errorResponse;\n\n if (\n parsed.data.customerId &&\n resolvedCustomerId &&\n parsed.data.customerId !== resolvedCustomerId\n ) {\n return jsonResponse(403, { error: \"customerId must match authenticated customer\" });\n }\n\n const customerId = parsed.data.customerId ?? resolvedCustomerId;\n if (!customerId) {\n return jsonResponse(401, { error: \"Customer not identified\" });\n }\n\n if (parsed.data.stripePriceId) {\n const requestOrigin = new URL(request.url).origin;\n const successUrl = parsed.data.successUrl ?? `${requestOrigin}/settings/billing?checkout=success`;\n const cancelUrl = parsed.data.cancelUrl ?? successUrl;\n try {\n const data = await client.checkout.create({\n stripePriceId: parsed.data.stripePriceId,\n successUrl,\n cancelUrl,\n ...(parsed.data.metadata ? { metadata: parsed.data.metadata } : {}),\n customerId,\n });\n return jsonResponse(200, data as CreateCheckoutResponse);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n }\n\n if (!parsed.data.stripeProductKey) {\n return jsonResponse(400, { error: \"stripeProductKey is required\" });\n }\n\n const checkoutParams: Record<string, unknown> = {\n ...(parsed.data.checkoutParams ?? {}),\n ...(parsed.data.cancelUrl ? { cancel_url: parsed.data.cancelUrl } : {}),\n ...(parsed.data.metadata ? { metadata: parsed.data.metadata } : {}),\n };\n\n const body: CreateCustomerCheckoutRequest = {\n stripeProductKey: parsed.data.stripeProductKey,\n ...(parsed.data.successUrl ? { successUrl: parsed.data.successUrl } : {}),\n ...(parsed.data.customerInfo ? { customerInfo: parsed.data.customerInfo } : {}),\n ...(Object.keys(checkoutParams).length ? { checkoutParams } : {}),\n };\n\n try {\n const data = await client.customers.createCheckout(customerId, body);\n return jsonResponse(200, data as CreateCustomerCheckoutResponse);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nconst handleCreateCustomerPortal = async (\n request: Request,\n client: PriceOS,\n getCustomerId?: PriceOSGetCustomerId\n) => {\n if (request.method.toUpperCase() !== \"POST\") {\n return new Response(\"Method not allowed.\", { status: 405 });\n }\n\n const parsed = await parseCustomerPortalBody(request);\n if (!parsed.data) {\n return jsonResponse(400, { error: parsed.error ?? \"Invalid request body\" });\n }\n\n const { customerId: resolvedCustomerId, errorResponse } = await resolveOptionalCustomerId(\n getCustomerId,\n request\n );\n if (errorResponse) return errorResponse;\n\n if (\n parsed.data.customerId &&\n resolvedCustomerId &&\n parsed.data.customerId !== resolvedCustomerId\n ) {\n return jsonResponse(403, { error: \"customerId must match authenticated customer\" });\n }\n\n const customerId = parsed.data.customerId ?? resolvedCustomerId;\n if (!customerId) {\n return jsonResponse(401, { error: \"Customer not identified\" });\n }\n\n try {\n const data = await client.customers.createPortal(customerId);\n return jsonResponse(200, data as CreateCustomerPortalResponse);\n } catch (error) {\n if (error instanceof PriceOSError) {\n return jsonResponse(error.status ?? 500, { error: error.message });\n }\n return jsonResponse(500, { error: \"Request failed\" });\n }\n};\n\nexport function priceosHandler(options: PriceOSNextHandlerOptions = {}): PriceOSRouteMethodHandlers {\n const envApiKey = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env?.PRICEOS_API_KEY;\n const apiKey = options.apiKey ?? envApiKey;\n const getCustomerId = options.getCustomerId;\n const basePath = (options.basePath ?? DEFAULT_BASE_PATH).replace(/\\/+$/, \"\");\n\n const handler: PriceOSRouteHandler = async (request: Request) => {\n if (!apiKey) {\n return new Response(\"Missing PRICEOS_API_KEY.\", { status: 500 });\n }\n\n let path = \"\";\n const url = new URL(request.url);\n const pathname = url.pathname;\n if (pathname.startsWith(basePath)) {\n path = normalizePath(pathname.slice(basePath.length));\n }\n\n const client = new PriceOS(apiKey);\n\n if (path === CUSTOMER_PATH) {\n if (!getCustomerId) {\n return jsonResponse(500, { error: \"Missing getCustomerId function\" });\n }\n return handleGetCustomer(request, url, client, getCustomerId);\n }\n\n if (path === FEATURE_ACCESS_PATH) {\n if (!getCustomerId) {\n return jsonResponse(500, { error: \"Missing getCustomerId function\" });\n }\n return handleGetFeatureAccess(request, url, client, getCustomerId);\n }\n\n if (path === TRACK_USAGE_PATH) {\n if (!getCustomerId) {\n return jsonResponse(500, { error: \"Missing getCustomerId function\" });\n }\n return handleTrackUsage(request, url, client, getCustomerId);\n }\n\n if (path === PRICING_TABLE_PATH) {\n return handleGetPricingTable(request, url, client, getCustomerId);\n }\n\n if (path === CHECKOUT_PATH) {\n return handleCreateCheckout(request, client, getCustomerId);\n }\n\n if (path === CUSTOMER_PORTAL_PATH) {\n return handleCreateCustomerPortal(request, client, getCustomerId);\n }\n\n return new Response(\"Not found.\", { status: 404 });\n };\n\n return Object.assign(handler, {\n GET: handler,\n POST: handler,\n });\n}\n\nconst getHeaderValue = (\n headers: Record<string, string | string[] | undefined> | undefined,\n key: string\n) => {\n if (!headers) return undefined;\n const value = headers[key] ?? headers[key.toLowerCase()] ?? headers[key.toUpperCase()];\n if (value !== undefined) {\n if (Array.isArray(value)) return value.join(\",\");\n return value;\n }\n const entry = Object.entries(headers).find(([headerKey]) => headerKey.toLowerCase() === key.toLowerCase());\n if (!entry) return undefined;\n const [, entryValue] = entry;\n if (Array.isArray(entryValue)) return entryValue.join(\",\");\n return entryValue;\n};\n\nconst toHeaders = (headers: Record<string, string | string[] | undefined> | undefined) => {\n const result = new Headers();\n if (!headers) return result;\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === \"string\") result.set(key, value);\n if (Array.isArray(value)) result.set(key, value.join(\",\"));\n }\n return result;\n};\n\nconst buildRequest = (req: PriceOSPagesRequest) => {\n const headers = req.headers ?? {};\n const forwardedProto = getHeaderValue(headers, \"x-forwarded-proto\");\n const protocol =\n forwardedProto?.split(\",\")[0]?.trim() ?? (req.socket?.encrypted ? \"https\" : \"http\");\n const host =\n getHeaderValue(headers, \"x-forwarded-host\") ??\n getHeaderValue(headers, \"host\") ??\n \"localhost\";\n const url = new URL(req.url ?? \"/\", `${protocol}://${host}`);\n\n const method = (req.method ?? \"GET\").toUpperCase();\n const normalizedHeaders = toHeaders(headers);\n const init: RequestInit = {\n method,\n headers: normalizedHeaders,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\" && req.body !== undefined) {\n if (typeof req.body === \"string\") {\n init.body = req.body;\n } else {\n init.body = JSON.stringify(req.body);\n if (!normalizedHeaders.has(\"content-type\")) {\n normalizedHeaders.set(\"content-type\", \"application/json\");\n }\n }\n }\n\n return new Request(url, init);\n};\n\nconst sendResponse = async (res: PriceOSPagesResponse, response: Response) => {\n if (typeof res.status === \"function\") {\n res.status(response.status);\n } else {\n res.statusCode = response.status;\n }\n\n if (typeof res.setHeader === \"function\") {\n response.headers.forEach((value, key) => {\n res.setHeader?.(key, value);\n });\n }\n\n const body = await response.text();\n res.end?.(body || undefined);\n};\n\nexport function priceosPagesHandler(options: PriceOSPagesHandlerOptions = {}) {\n return async (req: PriceOSPagesRequest, res: PriceOSPagesResponse) => {\n const getCustomerId = options.getCustomerId;\n const request = buildRequest(req);\n const handler = priceosHandler({\n ...options,\n getCustomerId: getCustomerId ? (normalizedRequest) => getCustomerId(req, normalizedRequest) : undefined,\n });\n const response = await handler(request);\n await sendResponse(res, response);\n };\n}\n","import createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\nimport type { paths } from \"./gen/openapi\";\nimport {\n AddCustomProductRequest,\n AddCustomProductResponse,\n CreateBonusBody,\n CreateBonusResponse,\n CreateCustomerCheckoutRequest,\n CreateCustomerCheckoutResponse,\n CreateCustomerRequest,\n CreateCustomerResponse,\n CreateCustomerPortalResponse,\n DeleteBonusResponse,\n ListBonusesRequest,\n ListBonusesResponse,\n DeleteUsageEventsBody,\n DeleteUsageEventsResponse,\n DeleteUsageEventResponse,\n DeleteCustomerResponse,\n GetUsageEventResponse,\n GetCustomerResponse,\n GetCustomerQuery,\n GetFeatureAccessResponse,\n LinkCustomerBody,\n LinkCustomerResponse,\n LimitFeatureKeyFromAccessMap,\n TrackedLimitFeatureKeyFromAccessMap,\n ListUsageEventsBody,\n ListUsageEventsResponse,\n SetUsageBody,\n SetUsageResponse,\n RemoveCustomProductRequest,\n RemoveCustomProductResponse,\n UpdateUsageEventRequest,\n UpdateUsageEventResponse,\n UpdateBonusRequest,\n UpdateBonusResponse,\n TrackUsageBody,\n TrackUsageBatchBody,\n TrackUsageBatchResponse,\n TrackUsageResponse,\n UpdateCustomerBody,\n UpdateCustomerResponse,\n GetPricingTableRequest,\n GetPricingTableResponse,\n CreateCheckoutRequest,\n CreateCheckoutResponse,\n} from \"./types\";\n\nexport type PriceOSLogLevel = \"none\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n// --- Public options ---\nexport type PriceOSClientOptions = {\n logLevel?: PriceOSLogLevel;\n};\n\nconst RATE_LIMIT_STATUS = 429;\nconst MAX_RETRIES = 4;\nconst BASE_DELAY_MS = 250;\nconst BACKOFF_MULTIPLIER = 2;\nconst JITTER_MS = 250;\nconst RETRY_DELAY_CAP_MS = 5_000;\nconst REQUEST_TIMEOUT_MS = 20_000;\n\nconst LOG_LEVELS: Record<PriceOSLogLevel, number> = {\n none: 0,\n error: 1,\n warning: 2,\n info: 3,\n debug: 4,\n};\n\ntype Logger = {\n error: (message: string, details?: Record<string, unknown>) => void;\n warning: (message: string, details?: Record<string, unknown>) => void;\n info: (message: string, details?: Record<string, unknown>) => void;\n debug: (message: string, details?: Record<string, unknown>) => void;\n};\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst getRetryDelayMs = (retryCount: number): number => {\n const backoff = BASE_DELAY_MS * Math.pow(BACKOFF_MULTIPLIER, retryCount - 1);\n const jitter = Math.random() * JITTER_MS;\n return Math.min(RETRY_DELAY_CAP_MS, backoff + jitter);\n};\n\nconst resolveIdempotencyKey = (input: { idempotencyKey?: string }) => {\n const providedIdempotencyKey =\n typeof input.idempotencyKey === \"string\"\n ? String(input.idempotencyKey).trim()\n : \"\";\n return providedIdempotencyKey;\n};\n\nconst withIdempotencyKey = <T extends { idempotencyKey?: string }>(input: T): T => {\n const idempotencyKey = resolveIdempotencyKey(input);\n if (!idempotencyKey) return input;\n return {\n ...input,\n idempotencyKey,\n };\n};\n\nconst createLogger = (logLevel: PriceOSLogLevel): Logger => {\n const shouldLog = (level: PriceOSLogLevel): boolean =>\n logLevel !== \"none\" && LOG_LEVELS[level] <= LOG_LEVELS[logLevel];\n\n const write = (\n level: PriceOSLogLevel,\n message: string,\n details?: Record<string, unknown>\n ): void => {\n if (!shouldLog(level)) return;\n const prefix = `[PriceOS] ${level.toUpperCase()}: ${message}`;\n const payload = details && Object.keys(details).length > 0 ? details : undefined;\n\n switch (level) {\n case \"error\":\n payload ? console.error(prefix, payload) : console.error(prefix);\n return;\n case \"warning\":\n payload ? console.warn(prefix, payload) : console.warn(prefix);\n return;\n case \"info\":\n payload ? console.info(prefix, payload) : console.info(prefix);\n return;\n case \"debug\":\n payload ? console.debug(prefix, payload) : console.debug(prefix);\n return;\n }\n };\n\n return {\n error: (message, details) => write(\"error\", message, details),\n warning: (message, details) => write(\"warning\", message, details),\n info: (message, details) => write(\"info\", message, details),\n debug: (message, details) => write(\"debug\", message, details),\n };\n};\n\nconst getUpstreamSignal = (input: RequestInfo | URL, init?: RequestInit): AbortSignal | undefined => {\n if (init?.signal) return init.signal;\n if (typeof Request !== \"undefined\" && input instanceof Request) return input.signal;\n return undefined;\n};\n\nconst stripSignal = (init?: RequestInit): RequestInit | undefined => {\n if (!init) return undefined;\n const { signal: _signal, ...rest } = init;\n return rest;\n};\n\nconst getRequestDetails = (\n input: RequestInfo | URL,\n init?: RequestInit\n): { method: string; url: string } => {\n const method =\n init?.method ??\n (typeof Request !== \"undefined\" && input instanceof Request ? input.method : \"GET\");\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n return { method, url };\n};\n\nconst prepareRetryRequest = async (\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n log: Logger,\n method: string,\n url: string\n): Promise<{ requestInput: RequestInfo | URL; baseInit?: RequestInit; canRetry: boolean }> => {\n if (!(typeof Request !== \"undefined\" && input instanceof Request)) {\n return { requestInput: input, baseInit: stripSignal(init), canRetry: true };\n }\n\n if (input.bodyUsed) {\n log.warning(\"Request body already used; retries disabled\", { method, url });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n\n let body: BodyInit | undefined = undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n try {\n body = await input.clone().arrayBuffer();\n } catch (error) {\n log.warning(\"Unable to clone request body; retries disabled\", { method, url, error });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n }\n\n const headers = new Headers(input.headers);\n const baseInit = { ...stripSignal(init), method, headers, body };\n return { requestInput: input.url, baseInit, canRetry: true };\n};\n\nconst getErrorMessage = (error: unknown): string => {\n const maybeError = error as { error?: unknown } | null;\n if (maybeError && typeof maybeError.error === \"string\") return maybeError.error;\n return \"Request failed\";\n};\n\nconst throwRequestError = (\n log: Logger,\n error: unknown,\n response: Response | undefined,\n context: string\n): never => {\n log.error(\"Request failed\", { context, status: response?.status, error });\n throw new PriceOSError(getErrorMessage(error), { status: response?.status, details: error });\n};\n\nconst resolveUrlResponse = (\n data: unknown,\n response: Response | undefined\n): { url: string } | null => {\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const value = (data as { url?: unknown }).url;\n if (typeof value === \"string\" && value.trim().length > 0) {\n return { url: value };\n }\n }\n\n const location = response?.headers.get(\"location\");\n if (location && location.trim().length > 0) {\n return { url: location };\n }\n\n if (response?.redirected && typeof response.url === \"string\" && response.url.trim().length > 0) {\n return { url: response.url };\n }\n\n return null;\n};\n\nconst createRetryingFetch = (baseFetch: typeof fetch, log: Logger): typeof fetch => {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const { method, url } = getRequestDetails(input, init);\n const upstreamSignal = getUpstreamSignal(input, init);\n const { requestInput, baseInit, canRetry } = await prepareRetryRequest(\n input,\n init,\n log,\n method,\n url\n );\n let attempt = 0;\n while (true) {\n log.debug(\"Request attempt\", { method, url, attempt: attempt + 1, maxRetries: MAX_RETRIES });\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n let removeAbortListener: (() => void) | null = null;\n\n if (upstreamSignal) {\n if (upstreamSignal.aborted) {\n controller.abort();\n } else {\n const onAbort = () => controller.abort();\n upstreamSignal.addEventListener(\"abort\", onAbort);\n removeAbortListener = () => upstreamSignal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n try {\n const requestInit = { ...(baseInit ?? {}), signal: controller.signal };\n const response = await baseFetch(requestInput, requestInit);\n if (response.status !== RATE_LIMIT_STATUS) return response;\n\n const retryAfter = response.headers.get(\"retry-after\") ?? undefined;\n log.warning(\"Rate limit hit (429)\", {\n method,\n url,\n attempt: attempt + 1,\n maxRetries: MAX_RETRIES,\n retryAfter,\n });\n\n if (!canRetry) {\n log.warning(\"Skipping retry because request body is not replayable\", { method, url });\n return response;\n }\n\n if (attempt >= MAX_RETRIES) {\n log.error(\"Rate limit retries exhausted\", { method, url, attempts: attempt + 1 });\n return response;\n }\n\n const delayMs = getRetryDelayMs(attempt + 1);\n log.info(\"Waiting to retry after rate limit\", {\n method,\n url,\n delayMs,\n nextAttempt: attempt + 2,\n maxRetries: MAX_RETRIES,\n });\n await sleep(delayMs);\n attempt += 1;\n } catch (error) {\n if (controller.signal.aborted) {\n const abortedByCaller = upstreamSignal?.aborted ?? false;\n if (abortedByCaller) {\n log.warning(\"Request aborted by caller\", { method, url, attempt: attempt + 1 });\n } else {\n log.error(\"Request timed out\", {\n method,\n url,\n attempt: attempt + 1,\n timeoutMs: REQUEST_TIMEOUT_MS,\n });\n }\n } else {\n log.error(\"Request failed\", { method, url, attempt: attempt + 1, error });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n removeAbortListener?.();\n }\n }\n };\n};\n\nexport type PriceOSCustomersClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n get(\n customerId: string,\n options?: { expand?: GetCustomerQuery[\"expand\"] }\n ): Promise<GetCustomerResponse<TFeatureAccessMap> | null>;\n link(input: LinkCustomerBody): Promise<LinkCustomerResponse<TFeatureAccessMap> | null>;\n create(input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>>;\n update(input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>>;\n addCustomProduct(input: AddCustomProductRequest): Promise<AddCustomProductResponse<TFeatureAccessMap>>;\n removeCustomProduct(\n input: RemoveCustomProductRequest\n ): Promise<RemoveCustomProductResponse<TFeatureAccessMap>>;\n delete(customerId: string): Promise<DeleteCustomerResponse>;\n createPortal(customerId: string): Promise<CreateCustomerPortalResponse>;\n createCheckout(\n customerId: string,\n input: CreateCustomerCheckoutRequest\n ): Promise<CreateCustomerCheckoutResponse>;\n};\n\ntype FeatureAccessRecord<TFeatureAccessMap> =\n TFeatureAccessMap extends Record<string, unknown> ? TFeatureAccessMap : Record<string, never>;\n\ntype FeatureAccessKey<TFeatureAccessMap> = keyof FeatureAccessRecord<TFeatureAccessMap> & string;\n\nexport type PriceOSFeaturesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n getAccess(customerId: string): Promise<TFeatureAccessMap>;\n getAccess<TFeatureKey extends FeatureAccessKey<TFeatureAccessMap>>(\n customerId: string,\n featureKey: TFeatureKey\n ): Promise<FeatureAccessRecord<TFeatureAccessMap>[TFeatureKey]>;\n};\n\nexport type PriceOSPricingClient = {\n getTable(input?: GetPricingTableRequest): Promise<GetPricingTableResponse>;\n};\n\nexport type PriceOSCheckoutClient = {\n create(input: CreateCheckoutRequest): Promise<CreateCheckoutResponse>;\n};\n\nexport type PriceOSBonusesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n create(\n input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse>;\n list(\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse>;\n update(input: UpdateBonusRequest): Promise<UpdateBonusResponse>;\n delete(bonusId: string): Promise<DeleteBonusResponse>;\n};\n\nexport type PriceOSUsageClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n track(\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse>;\n set(\n input: SetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<SetUsageResponse>;\n getEvent(eventId: string): Promise<GetUsageEventResponse>;\n updateEvent(input: UpdateUsageEventRequest): Promise<UpdateUsageEventResponse>;\n deleteEvent(eventId: string): Promise<DeleteUsageEventResponse>;\n deleteEvents(\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse>;\n trackBatch(\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse>;\n listEvents(\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse>;\n};\n\n// --- Public SDK surface type ---\nexport type PriceOSHttpClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n pricing: PriceOSPricingClient;\n checkout: PriceOSCheckoutClient;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n};\n\nexport class PriceOSError extends Error {\n status?: number;\n details?: unknown;\n\n constructor(message: string, opts?: { status?: number; details?: unknown }) {\n super(message);\n this.name = \"PriceOSError\";\n this.status = opts?.status;\n this.details = opts?.details;\n }\n}\n\nexport class PriceOS<TFeatureAccessMap = GetFeatureAccessResponse>\n implements PriceOSHttpClient<TFeatureAccessMap>\n{\n private client: Client<paths>;\n private header: { \"x-api-key\": string };\n private log: Logger;\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n pricing: PriceOSPricingClient;\n checkout: PriceOSCheckoutClient;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n\n constructor(apiKey: string, opts: PriceOSClientOptions = {}) {\n const logLevel = opts.logLevel ?? \"none\";\n this.log = createLogger(logLevel);\n const baseUrl = \"https://api.priceos.com\";\n this.header = { \"x-api-key\": apiKey };\n const fetchWithRetry = createRetryingFetch(fetch, this.log);\n this.client = createClient<paths>({\n baseUrl,\n fetch: fetchWithRetry,\n headers: {\n \"x-api-key\": apiKey,\n },\n });\n\n this.customers = {\n get: async (\n customerId: string,\n options?: { expand?: GetCustomerQuery[\"expand\"] }\n ): Promise<GetCustomerResponse<TFeatureAccessMap> | null> => {\n const query = options?.expand?.length ? { expand: options.expand } : undefined;\n const { data, error, response } = await this.client.GET(\"/v1/customers/{customerId}\", {\n params: {\n path: { customerId },\n ...(query ? { query } : {}),\n header: this.header,\n },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/customers/{customerId}\");\n return (data ?? null) as GetCustomerResponse<TFeatureAccessMap> | null;\n },\n link: async (\n input: LinkCustomerBody\n ): Promise<LinkCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers/link\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers/link\");\n return (data ?? null) as LinkCustomerResponse<TFeatureAccessMap> | null;\n },\n create: async (input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers\");\n return data! as CreateCustomerResponse<TFeatureAccessMap>;\n },\n update: async (input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>> => {\n const { customerId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/customers/{customerId}\");\n return data! as UpdateCustomerResponse<TFeatureAccessMap>;\n },\n addCustomProduct: async (\n input: AddCustomProductRequest\n ): Promise<AddCustomProductResponse<TFeatureAccessMap>> => {\n const { customerId, ...body } = input;\n const { data, error, response } = await this.client.POST(\n \"/v1/customers/{customerId}/custom-product/add\",\n {\n params: { path: { customerId }, header: this.header },\n body,\n }\n );\n if (error) {\n throwRequestError(this.log, error, response, \"POST /v1/customers/{customerId}/custom-product/add\");\n }\n return data! as AddCustomProductResponse<TFeatureAccessMap>;\n },\n removeCustomProduct: async (\n input: RemoveCustomProductRequest\n ): Promise<RemoveCustomProductResponse<TFeatureAccessMap>> => {\n const { customerId, ...body } = input;\n const { data, error, response } = await this.client.POST(\n \"/v1/customers/{customerId}/custom-product/remove\",\n {\n params: { path: { customerId }, header: this.header },\n body,\n }\n );\n if (error) {\n throwRequestError(this.log, error, response, \"POST /v1/customers/{customerId}/custom-product/remove\");\n }\n return data! as RemoveCustomProductResponse<TFeatureAccessMap>;\n },\n delete: async (customerId: string): Promise<DeleteCustomerResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/customers/{customerId}\");\n return data! as DeleteCustomerResponse;\n },\n createPortal: async (customerId: string): Promise<CreateCustomerPortalResponse> => {\n const { data, error, response } = await this.client.POST(\n \"/v1/customers/{customerId}/customer_portal\",\n {\n params: { path: { customerId }, header: this.header },\n }\n );\n if (error) {\n throwRequestError(this.log, error, response, \"POST /v1/customers/{customerId}/customer_portal\");\n }\n if (response && !response.ok) {\n throw new PriceOSError(response.statusText || \"Request failed\", { status: response.status });\n }\n const result = resolveUrlResponse(data, response);\n if (result) {\n return result as CreateCustomerPortalResponse;\n }\n throw new PriceOSError(\"Invalid customer portal response\", {\n status: response?.status,\n details: {\n redirected: response?.redirected ?? false,\n responseUrl: response?.url ?? null,\n },\n });\n },\n createCheckout: async (\n customerId: string,\n input: CreateCustomerCheckoutRequest\n ): Promise<CreateCustomerCheckoutResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers/{customerId}/checkout\", {\n params: { path: { customerId }, header: this.header },\n body: input,\n });\n if (error) {\n throwRequestError(this.log, error, response, \"POST /v1/customers/{customerId}/checkout\");\n }\n if (response && !response.ok) {\n throw new PriceOSError(response.statusText || \"Request failed\", { status: response.status });\n }\n const result = resolveUrlResponse(data, response);\n if (result) {\n return result as CreateCustomerCheckoutResponse;\n }\n throw new PriceOSError(\"Invalid checkout response\", {\n status: response?.status,\n details: {\n redirected: response?.redirected ?? false,\n responseUrl: response?.url ?? null,\n },\n });\n },\n };\n\n const getFeatureAccessForCustomer = async (customerId: string): Promise<TFeatureAccessMap> => {\n const { data, error, response } = await this.client.GET(\"/v1/feature-access\", {\n params: { query: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/feature-access\");\n return data! as TFeatureAccessMap;\n };\n\n function getFeatureAccess(customerId: string): Promise<TFeatureAccessMap>;\n function getFeatureAccess<TFeatureKey extends FeatureAccessKey<TFeatureAccessMap>>(\n customerId: string,\n featureKey: TFeatureKey\n ): Promise<FeatureAccessRecord<TFeatureAccessMap>[TFeatureKey]>;\n async function getFeatureAccess<TFeatureKey extends FeatureAccessKey<TFeatureAccessMap>>(\n customerId: string,\n featureKey?: TFeatureKey\n ): Promise<TFeatureAccessMap | FeatureAccessRecord<TFeatureAccessMap>[TFeatureKey]> {\n const featureAccess = await getFeatureAccessForCustomer(customerId);\n if (featureKey === undefined) return featureAccess;\n return (featureAccess as FeatureAccessRecord<TFeatureAccessMap>)[featureKey];\n }\n\n this.features = {\n getAccess: getFeatureAccess,\n };\n\n this.pricing = {\n getTable: async (input: GetPricingTableRequest = {}): Promise<GetPricingTableResponse> => {\n const query = {\n ...(typeof input.customerId === \"string\" ? { customerId: input.customerId } : {}),\n ...(typeof input.pricingTableKey === \"string\" ? { pricingTableKey: input.pricingTableKey } : {}),\n };\n const { data, error, response } = await this.client.GET(\"/v1/pricing-table\", {\n params: { query, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/pricing-table\");\n return data! as GetPricingTableResponse;\n },\n };\n\n this.checkout = {\n create: async (input: CreateCheckoutRequest): Promise<CreateCheckoutResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/checkout\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/checkout\");\n if (response && !response.ok) {\n throw new PriceOSError(response.statusText || \"Request failed\", { status: response.status });\n }\n const result = resolveUrlResponse(data, response);\n if (result) {\n return result as CreateCheckoutResponse;\n }\n throw new PriceOSError(\"Invalid checkout response\", {\n status: response?.status,\n details: {\n redirected: response?.redirected ?? false,\n responseUrl: response?.url ?? null,\n },\n });\n },\n };\n\n this.bonuses = {\n create: async (\n input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/bonuses\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/bonuses\");\n return data!;\n },\n list: async (\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/bonuses\", {\n params: { header: this.header, query: input },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/bonuses\");\n return data!;\n },\n update: async (input: UpdateBonusRequest): Promise<UpdateBonusResponse> => {\n const { bonusId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/bonuses/{bonusId}\");\n return data!;\n },\n delete: async (bonusId: string): Promise<DeleteBonusResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/bonuses/{bonusId}\");\n return data!;\n },\n };\n\n this.usage = {\n track: async (\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse> => {\n const body = withIdempotencyKey(input);\n const { data, error, response } = await this.client.POST(\"/v1/usage\", {\n params: { header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage\");\n return data!;\n },\n set: async (\n input: SetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<SetUsageResponse> => {\n const body = withIdempotencyKey(input);\n const { data, error, response } = await this.client.POST(\"/v1/usage/set\", {\n params: { header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/set\");\n return data!;\n },\n getEvent: async (eventId: string): Promise<GetUsageEventResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/usage/{id}\", {\n params: { header: this.header, path: { id: eventId } },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/usage/{id}\");\n return data!;\n },\n updateEvent: async (input: UpdateUsageEventRequest): Promise<UpdateUsageEventResponse> => {\n const { id, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/usage/{id}\", {\n params: { header: this.header, path: { id } },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/usage/{id}\");\n return data!;\n },\n deleteEvent: async (eventId: string): Promise<DeleteUsageEventResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/usage/{id}\", {\n params: { header: this.header, path: { id: eventId } },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/usage/{id}\");\n return data!;\n },\n deleteEvents: async (\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/delete\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/delete\");\n return data!;\n },\n trackBatch: async (\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse> => {\n const body = {\n ...input,\n events: input.events.map((event) => withIdempotencyKey(event)),\n };\n const { data, error, response } = await this.client.POST(\"/v1/usage/batch\", {\n params: { header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/batch\");\n return data!;\n },\n listEvents: async (\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/events\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/events\");\n return data!;\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,2BAAyB;AAyDzB,IAAM,oBAAoB;AAC1B,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;AAC3B,IAAM,YAAY;AAClB,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAE3B,IAAM,aAA8C;AAAA,EAClD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AACT;AASA,IAAM,QAAQ,CAAC,OAA8B,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAE7F,IAAM,kBAAkB,CAAC,eAA+B;AACtD,QAAM,UAAU,gBAAgB,KAAK,IAAI,oBAAoB,aAAa,CAAC;AAC3E,QAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,SAAO,KAAK,IAAI,oBAAoB,UAAU,MAAM;AACtD;AAEA,IAAM,wBAAwB,CAAC,UAAuC;AACpE,QAAM,yBACJ,OAAO,MAAM,mBAAmB,WAC5B,OAAO,MAAM,cAAc,EAAE,KAAK,IAClC;AACN,SAAO;AACT;AAEA,IAAM,qBAAqB,CAAwC,UAAgB;AACjF,QAAM,iBAAiB,sBAAsB,KAAK;AAClD,MAAI,CAAC,eAAgB,QAAO;AAC5B,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAM,eAAe,CAAC,aAAsC;AAC1D,QAAM,YAAY,CAAC,UACjB,aAAa,UAAU,WAAW,KAAK,KAAK,WAAW,QAAQ;AAEjE,QAAM,QAAQ,CACZ,OACA,SACA,YACS;AACT,QAAI,CAAC,UAAU,KAAK,EAAG;AACvB,UAAM,SAAS,aAAa,MAAM,YAAY,CAAC,KAAK,OAAO;AAC3D,UAAM,UAAU,WAAW,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AAEvE,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,kBAAU,QAAQ,MAAM,QAAQ,OAAO,IAAI,QAAQ,MAAM,MAAM;AAC/D;AAAA,MACF,KAAK;AACH,kBAAU,QAAQ,KAAK,QAAQ,OAAO,IAAI,QAAQ,KAAK,MAAM;AAC7D;AAAA,MACF,KAAK;AACH,kBAAU,QAAQ,KAAK,QAAQ,OAAO,IAAI,QAAQ,KAAK,MAAM;AAC7D;AAAA,MACF,KAAK;AACH,kBAAU,QAAQ,MAAM,QAAQ,OAAO,IAAI,QAAQ,MAAM,MAAM;AAC/D;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,CAAC,SAAS,YAAY,MAAM,SAAS,SAAS,OAAO;AAAA,IAC5D,SAAS,CAAC,SAAS,YAAY,MAAM,WAAW,SAAS,OAAO;AAAA,IAChE,MAAM,CAAC,SAAS,YAAY,MAAM,QAAQ,SAAS,OAAO;AAAA,IAC1D,OAAO,CAAC,SAAS,YAAY,MAAM,SAAS,SAAS,OAAO;AAAA,EAC9D;AACF;AAEA,IAAM,oBAAoB,CAAC,OAA0B,SAAgD;AACnG,MAAI,MAAM,OAAQ,QAAO,KAAK;AAC9B,MAAI,OAAO,YAAY,eAAe,iBAAiB,QAAS,QAAO,MAAM;AAC7E,SAAO;AACT;AAEA,IAAM,cAAc,CAAC,SAAgD;AACnE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,EAAE,QAAQ,SAAS,GAAG,KAAK,IAAI;AACrC,SAAO;AACT;AAEA,IAAM,oBAAoB,CACxB,OACA,SACoC;AACpC,QAAM,SACJ,MAAM,WACL,OAAO,YAAY,eAAe,iBAAiB,UAAU,MAAM,SAAS;AAC/E,QAAM,MACJ,OAAO,UAAU,WACb,QACA,iBAAiB,MACjB,MAAM,SAAS,IACf,MAAM;AACZ,SAAO,EAAE,QAAQ,IAAI;AACvB;AAEA,IAAM,sBAAsB,OAC1B,OACA,MACA,KACA,QACA,QAC4F;AAC5F,MAAI,EAAE,OAAO,YAAY,eAAe,iBAAiB,UAAU;AACjE,WAAO,EAAE,cAAc,OAAO,UAAU,YAAY,IAAI,GAAG,UAAU,KAAK;AAAA,EAC5E;AAEA,MAAI,MAAM,UAAU;AAClB,QAAI,QAAQ,+CAA+C,EAAE,QAAQ,IAAI,CAAC;AAC1E,WAAO,EAAE,cAAc,OAAO,UAAU,YAAY,IAAI,GAAG,UAAU,MAAM;AAAA,EAC7E;AAEA,MAAI,OAA6B;AACjC,MAAI,WAAW,SAAS,WAAW,QAAQ;AACzC,QAAI;AACF,aAAO,MAAM,MAAM,MAAM,EAAE,YAAY;AAAA,IACzC,SAAS,OAAO;AACd,UAAI,QAAQ,kDAAkD,EAAE,QAAQ,KAAK,MAAM,CAAC;AACpF,aAAO,EAAE,cAAc,OAAO,UAAU,YAAY,IAAI,GAAG,UAAU,MAAM;AAAA,IAC7E;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,QAAM,WAAW,EAAE,GAAG,YAAY,IAAI,GAAG,QAAQ,SAAS,KAAK;AAC/D,SAAO,EAAE,cAAc,MAAM,KAAK,UAAU,UAAU,KAAK;AAC7D;AAEA,IAAM,kBAAkB,CAAC,UAA2B;AAClD,QAAM,aAAa;AACnB,MAAI,cAAc,OAAO,WAAW,UAAU,SAAU,QAAO,WAAW;AAC1E,SAAO;AACT;AAEA,IAAM,oBAAoB,CACxB,KACA,OACA,UACA,YACU;AACV,MAAI,MAAM,kBAAkB,EAAE,SAAS,QAAQ,UAAU,QAAQ,MAAM,CAAC;AACxE,QAAM,IAAI,aAAa,gBAAgB,KAAK,GAAG,EAAE,QAAQ,UAAU,QAAQ,SAAS,MAAM,CAAC;AAC7F;AAEA,IAAM,qBAAqB,CACzB,MACA,aAC2B;AAC3B,MAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC5D,UAAM,QAAS,KAA2B;AAC1C,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,aAAO,EAAE,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,WAAW,UAAU,QAAQ,IAAI,UAAU;AACjD,MAAI,YAAY,SAAS,KAAK,EAAE,SAAS,GAAG;AAC1C,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAEA,MAAI,UAAU,cAAc,OAAO,SAAS,QAAQ,YAAY,SAAS,IAAI,KAAK,EAAE,SAAS,GAAG;AAC9F,WAAO,EAAE,KAAK,SAAS,IAAI;AAAA,EAC7B;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAAC,WAAyB,QAA8B;AAClF,SAAO,OAAO,OAA0B,SAA0C;AAChF,UAAM,EAAE,QAAQ,IAAI,IAAI,kBAAkB,OAAO,IAAI;AACrD,UAAM,iBAAiB,kBAAkB,OAAO,IAAI;AACpD,UAAM,EAAE,cAAc,UAAU,SAAS,IAAI,MAAM;AAAA,MACjD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,UAAU;AACd,WAAO,MAAM;AACX,UAAI,MAAM,mBAAmB,EAAE,QAAQ,KAAK,SAAS,UAAU,GAAG,YAAY,YAAY,CAAC;AAC3F,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,kBAAkB;AACzE,UAAI,sBAA2C;AAE/C,UAAI,gBAAgB;AAClB,YAAI,eAAe,SAAS;AAC1B,qBAAW,MAAM;AAAA,QACnB,OAAO;AACL,gBAAM,UAAU,MAAM,WAAW,MAAM;AACvC,yBAAe,iBAAiB,SAAS,OAAO;AAChD,gCAAsB,MAAM,eAAe,oBAAoB,SAAS,OAAO;AAAA,QACjF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,cAAc,EAAE,GAAI,YAAY,CAAC,GAAI,QAAQ,WAAW,OAAO;AACrE,cAAM,WAAW,MAAM,UAAU,cAAc,WAAW;AAC1D,YAAI,SAAS,WAAW,kBAAmB,QAAO;AAElD,cAAM,aAAa,SAAS,QAAQ,IAAI,aAAa,KAAK;AAC1D,YAAI,QAAQ,wBAAwB;AAAA,UAClC;AAAA,UACA;AAAA,UACA,SAAS,UAAU;AAAA,UACnB,YAAY;AAAA,UACZ;AAAA,QACF,CAAC;AAED,YAAI,CAAC,UAAU;AACb,cAAI,QAAQ,yDAAyD,EAAE,QAAQ,IAAI,CAAC;AACpF,iBAAO;AAAA,QACT;AAEA,YAAI,WAAW,aAAa;AAC1B,cAAI,MAAM,gCAAgC,EAAE,QAAQ,KAAK,UAAU,UAAU,EAAE,CAAC;AAChF,iBAAO;AAAA,QACT;AAEA,cAAM,UAAU,gBAAgB,UAAU,CAAC;AAC3C,YAAI,KAAK,qCAAqC;AAAA,UAC5C;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa,UAAU;AAAA,UACvB,YAAY;AAAA,QACd,CAAC;AACD,cAAM,MAAM,OAAO;AACnB,mBAAW;AAAA,MACb,SAAS,OAAO;AACd,YAAI,WAAW,OAAO,SAAS;AAC7B,gBAAM,kBAAkB,gBAAgB,WAAW;AACnD,cAAI,iBAAiB;AACnB,gBAAI,QAAQ,6BAA6B,EAAE,QAAQ,KAAK,SAAS,UAAU,EAAE,CAAC;AAAA,UAChF,OAAO;AACL,gBAAI,MAAM,qBAAqB;AAAA,cAC7B;AAAA,cACA;AAAA,cACA,SAAS,UAAU;AAAA,cACnB,WAAW;AAAA,YACb,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,cAAI,MAAM,kBAAkB,EAAE,QAAQ,KAAK,SAAS,UAAU,GAAG,MAAM,CAAC;AAAA,QAC1E;AACA,cAAM;AAAA,MACR,UAAE;AACA,qBAAa,SAAS;AACtB,8BAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAqFO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,MAA+C;AAC1E,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS,MAAM;AACpB,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;AAEO,IAAM,UAAN,MAEP;AAAA,EACU;AAAA,EACA;AAAA,EACA;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAAgB,OAA6B,CAAC,GAAG;AAC3D,UAAM,WAAW,KAAK,YAAY;AAClC,SAAK,MAAM,aAAa,QAAQ;AAChC,UAAM,UAAU;AAChB,SAAK,SAAS,EAAE,aAAa,OAAO;AACpC,UAAM,iBAAiB,oBAAoB,OAAO,KAAK,GAAG;AAC1D,SAAK,aAAS,qBAAAA,SAAoB;AAAA,MAChC;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAED,SAAK,YAAY;AAAA,MACf,KAAK,OACH,YACA,YAC2D;AAC3D,cAAM,QAAQ,SAAS,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI;AACrE,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,8BAA8B;AAAA,UACpF,QAAQ;AAAA,YACN,MAAM,EAAE,WAAW;AAAA,YACnB,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,YACzB,QAAQ,KAAK;AAAA,UACf;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,gCAAgC;AACxF,eAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,MAAM,OACJ,UAC4D;AAC5D,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,sBAAsB;AAAA,UAC7E,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,yBAAyB;AACjF,eAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,QAAQ,OAAO,UAAqF;AAClG,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,iBAAiB;AAAA,UACxE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,oBAAoB;AAC5E,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,OAAO,UAAkF;AAC/F,cAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,8BAA8B;AAAA,UACpF,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,UACpD;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,gCAAgC;AACxF,eAAO;AAAA,MACT;AAAA,MACA,kBAAkB,OAChB,UACyD;AACzD,cAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO;AAAA,UAClD;AAAA,UACA;AAAA,YACA,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,YACpD;AAAA,UACA;AAAA,QACF;AACA,YAAI,OAAO;AACT,4BAAkB,KAAK,KAAK,OAAO,UAAU,oDAAoD;AAAA,QACnG;AACA,eAAO;AAAA,MACT;AAAA,MACA,qBAAqB,OACnB,UAC4D;AAC5D,cAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO;AAAA,UAClD;AAAA,UACA;AAAA,YACE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,YACpD;AAAA,UACF;AAAA,QACF;AACA,YAAI,OAAO;AACT,4BAAkB,KAAK,KAAK,OAAO,UAAU,uDAAuD;AAAA,QACtG;AACA,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,OAAO,eAAwD;AACrE,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,OAAO,8BAA8B;AAAA,UACvF,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,QACtD,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,mCAAmC;AAC3F,eAAO;AAAA,MACT;AAAA,MACA,cAAc,OAAO,eAA8D;AACjF,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO;AAAA,UAClD;AAAA,UACA;AAAA,YACE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,UACtD;AAAA,QACF;AACA,YAAI,OAAO;AACT,4BAAkB,KAAK,KAAK,OAAO,UAAU,iDAAiD;AAAA,QAChG;AACA,YAAI,YAAY,CAAC,SAAS,IAAI;AAC5B,gBAAM,IAAI,aAAa,SAAS,cAAc,kBAAkB,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,QAC7F;AACA,cAAM,SAAS,mBAAmB,MAAM,QAAQ;AAChD,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AACA,cAAM,IAAI,aAAa,oCAAoC;AAAA,UACzD,QAAQ,UAAU;AAAA,UAClB,SAAS;AAAA,YACP,YAAY,UAAU,cAAc;AAAA,YACpC,aAAa,UAAU,OAAO;AAAA,UAChC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,gBAAgB,OACd,YACA,UAC4C;AAC5C,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,uCAAuC;AAAA,UAC9F,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,UACpD,MAAM;AAAA,QACR,CAAC;AACD,YAAI,OAAO;AACT,4BAAkB,KAAK,KAAK,OAAO,UAAU,0CAA0C;AAAA,QACzF;AACA,YAAI,YAAY,CAAC,SAAS,IAAI;AAC5B,gBAAM,IAAI,aAAa,SAAS,cAAc,kBAAkB,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,QAC7F;AACA,cAAM,SAAS,mBAAmB,MAAM,QAAQ;AAChD,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AACA,cAAM,IAAI,aAAa,6BAA6B;AAAA,UAClD,QAAQ,UAAU;AAAA,UAClB,SAAS;AAAA,YACP,YAAY,UAAU,cAAc;AAAA,YACpC,aAAa,UAAU,OAAO;AAAA,UAChC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,8BAA8B,OAAO,eAAmD;AAC5F,YAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,sBAAsB;AAAA,QAC5E,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO;AAAA,MACvD,CAAC;AACD,UAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,wBAAwB;AAChF,aAAO;AAAA,IACT;AAOA,mBAAe,iBACb,YACA,YACkF;AAClF,YAAM,gBAAgB,MAAM,4BAA4B,UAAU;AAClE,UAAI,eAAe,OAAW,QAAO;AACrC,aAAQ,cAAyD,UAAU;AAAA,IAC7E;AAEA,SAAK,WAAW;AAAA,MACd,WAAW;AAAA,IACb;AAEA,SAAK,UAAU;AAAA,MACb,UAAU,OAAO,QAAgC,CAAC,MAAwC;AACxF,cAAM,QAAQ;AAAA,UACZ,GAAI,OAAO,MAAM,eAAe,WAAW,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,UAC/E,GAAI,OAAO,MAAM,oBAAoB,WAAW,EAAE,iBAAiB,MAAM,gBAAgB,IAAI,CAAC;AAAA,QAChG;AACA,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,qBAAqB;AAAA,UAC3E,QAAQ,EAAE,OAAO,QAAQ,KAAK,OAAO;AAAA,QACvC,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,uBAAuB;AAC/E,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,WAAW;AAAA,MACd,QAAQ,OAAO,UAAkE;AAC/E,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,gBAAgB;AAAA,UACvE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,mBAAmB;AAC3E,YAAI,YAAY,CAAC,SAAS,IAAI;AAC5B,gBAAM,IAAI,aAAa,SAAS,cAAc,kBAAkB,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,QAC7F;AACA,cAAM,SAAS,mBAAmB,MAAM,QAAQ;AAChD,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AACA,cAAM,IAAI,aAAa,6BAA6B;AAAA,UAClD,QAAQ,UAAU;AAAA,UAClB,SAAS;AAAA,YACP,YAAY,UAAU,cAAc;AAAA,YACpC,aAAa,UAAU,OAAO;AAAA,UAChC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,UAAU;AAAA,MACb,QAAQ,OACN,UACiC;AACjC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,eAAe;AAAA,UACtE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,kBAAkB;AAC1E,eAAO;AAAA,MACT;AAAA,MACA,MAAM,OACJ,UACiC;AACjC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,eAAe;AAAA,UACrE,QAAQ,EAAE,QAAQ,KAAK,QAAQ,OAAO,MAAM;AAAA,QAC9C,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,iBAAiB;AACzE,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,OAAO,UAA4D;AACzE,cAAM,EAAE,SAAS,GAAG,KAAK,IAAI;AAC7B,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,yBAAyB;AAAA,UAC/E,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,QAAQ,EAAE;AAAA,UACjD;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,2BAA2B;AACnF,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,OAAO,YAAkD;AAC/D,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,OAAO,yBAAyB;AAAA,UAClF,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,QAAQ,EAAE;AAAA,QACnD,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,8BAA8B;AACtF,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,QAAQ;AAAA,MACX,OAAO,OACL,UACgC;AAChC,cAAM,OAAO,mBAAmB,KAAK;AACrC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,aAAa;AAAA,UACpE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,gBAAgB;AACxE,eAAO;AAAA,MACT;AAAA,MACA,KAAK,OACH,UAC8B;AAC9B,cAAM,OAAO,mBAAmB,KAAK;AACrC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,iBAAiB;AAAA,UACxE,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,oBAAoB;AAC5E,eAAO;AAAA,MACT;AAAA,MACA,UAAU,OAAO,YAAoD;AACnE,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,kBAAkB;AAAA,UACxE,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,IAAI,QAAQ,EAAE;AAAA,QACvD,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,oBAAoB;AAC5E,eAAO;AAAA,MACT;AAAA,MACA,aAAa,OAAO,UAAsE;AACxF,cAAM,EAAE,IAAI,GAAG,KAAK,IAAI;AACxB,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,kBAAkB;AAAA,UACxE,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,GAAG,EAAE;AAAA,UAC5C;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,oBAAoB;AAC5E,eAAO;AAAA,MACT;AAAA,MACA,aAAa,OAAO,YAAuD;AACzE,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,OAAO,kBAAkB;AAAA,UAC3E,QAAQ,EAAE,QAAQ,KAAK,QAAQ,MAAM,EAAE,IAAI,QAAQ,EAAE;AAAA,QACvD,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,uBAAuB;AAC/E,eAAO;AAAA,MACT;AAAA,MACA,cAAc,OACZ,UACuC;AACvC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,oBAAoB;AAAA,UAC3E,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,uBAAuB;AAC/E,eAAO;AAAA,MACT;AAAA,MACA,YAAY,OACV,UACqC;AACrC,cAAM,OAAO;AAAA,UACX,GAAG;AAAA,UACH,QAAQ,MAAM,OAAO,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAAA,QAC/D;AACA,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,mBAAmB;AAAA,UAC1E,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B;AAAA,QACF,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,sBAAsB;AAC9E,eAAO;AAAA,MACT;AAAA,MACA,YAAY,OACV,UACqC;AACrC,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,KAAK,oBAAoB;AAAA,UAC3E,QAAQ,EAAE,QAAQ,KAAK,OAAO;AAAA,UAC9B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,MAAO,mBAAkB,KAAK,KAAK,OAAO,UAAU,uBAAuB;AAC/E,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;;;ADprBA,IAAM,oBAAoB;AAC1B,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,gBAAgB;AACtB,IAAM,uBAAuB;AAE7B,IAAM,gBAAgB,CAAC,UAAkB,MAAM,QAAQ,QAAQ,EAAE;AACjE,IAAM,qBAAqB,CAAC,SAAiB,YAAsC;AACjF,MAAI,YAAY,QAAW;AACzB,YAAQ,MAAM,8BAA8B,OAAO;AACnD;AAAA,EACF;AACA,UAAQ,MAAM,8BAA8B,SAAS,OAAO;AAC9D;AAEA,IAAM,eAAe,CAAC,QAAgB,SACpC,IAAI,SAAS,KAAK,UAAU,IAAI,GAAG;AAAA,EACjC;AAAA,EACA,SAAS,EAAE,gBAAgB,mBAAmB;AAChD,CAAC;AAEH,IAAM,sBAAsB,CAAC,UAAqC;AAChE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,WAAW,SAAS,aAAa;AAC1C;AAEA,IAAM,sBAAsB,CAAC,QAA0E;AACrG,QAAM,eAAe,CAAC,GAAG,IAAI,aAAa,OAAO,QAAQ,GAAG,GAAG,IAAI,aAAa,OAAO,UAAU,CAAC,EAC/F,QAAQ,CAAC,UAAU,MAAM,MAAM,GAAG,CAAC,EACnC,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AAErC,MAAI,CAAC,aAAa,QAAQ;AACxB,WAAO,EAAE,MAAM,CAAC,EAAE;AAAA,EACpB;AAEA,QAAM,mBAAmB,MAAM,KAAK,IAAI,IAAI,YAAY,CAAC;AACzD,QAAM,eAAe,iBAAiB,KAAK,CAAC,UAAU,UAAU,eAAe;AAC/E,MAAI,cAAc;AAChB,WAAO,EAAE,OAAO,yBAAyB,YAAY,GAAG;AAAA,EAC1D;AAEA,SAAO,EAAE,MAAM,EAAE,QAAQ,iBAAwC,EAAE;AACrE;AAEA,IAAM,sBAAsB,OAAO,YAAgF;AACjH,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,KAAK;AAAA,EAC/B,QAAQ;AACN,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,MAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AACrE,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,QAAM,OAAO;AAEb,MAAI,gBAAgB,MAAM;AACxB,WAAO,EAAE,OAAO,2CAA2C;AAAA,EAC7D;AAEA,QAAM,aAAa,OAAO,KAAK,eAAe,WAAW,KAAK,WAAW,KAAK,IAAI;AAClF,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,OAAO,yBAAyB;AAAA,EAC3C;AAEA,QAAM,YAAY,KAAK;AACvB,QAAM,SAAS,cAAc,SAAY,IAAI,OAAO,SAAS;AAC7D,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,WAAO,EAAE,OAAO,mCAAmC;AAAA,EACrD;AAEA,QAAM,oBAAoB,KAAK;AAC/B,QAAM,iBACJ,sBAAsB,SAClB,SACA,OAAO,sBAAsB,YAAY,kBAAkB,KAAK,EAAE,SAAS,IACzE,kBAAkB,KAAK,IACvB;AACR,MAAI,mBAAmB,MAAM;AAC3B,WAAO,EAAE,OAAO,4CAA4C;AAAA,EAC9D;AAEA,QAAM,gBAAgB,KAAK;AAC3B,QAAM,aAAa,kBAAkB,SAAY,SAAY,OAAO,aAAa;AACjF,MAAI,kBAAkB,UAAa,CAAC,OAAO,SAAS,UAAU,GAAG;AAC/D,WAAO,EAAE,OAAO,iDAAiD;AAAA,EACnE;AAEA,QAAM,cAAc,KAAK;AACzB,MAAI,gBAAgB,QAAW;AAC7B,QAAI,CAAC,eAAe,OAAO,gBAAgB,YAAY,MAAM,QAAQ,WAAW,GAAG;AACjF,aAAO,EAAE,OAAO,8CAA8C;AAAA,IAChE;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAsC,GAAG;AACjF,UAAI,OAAO,QAAQ,YAAY,OAAO,UAAU,UAAU;AACxD,eAAO,EAAE,OAAO,8CAA8C;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3C,GAAI,eAAe,SAAY,EAAE,WAAW,IAAI,CAAC;AAAA,MACjD,GAAI,cAAc,EAAE,UAAU,YAAsC,IAAI,CAAC;AAAA,IAC3E;AAAA,EACF;AACF;AAEA,IAAM,oBAAoB,OACxB,eACA,YAC+D;AAC/D,MAAI;AACJ,MAAI;AACF,iBAAa,MAAM,cAAc,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO,EAAE,eAAe,aAAa,KAAK,EAAE,OAAO,+BAA+B,CAAC,EAAE;AAAA,EACvF;AAEA,QAAM,uBAAuB,oBAAoB,UAAU;AAC3D,MAAI,CAAC,sBAAsB;AACzB,WAAO,EAAE,eAAe,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC,EAAE;AAAA,EAClF;AAEA,SAAO,EAAE,YAAY,qBAAqB;AAC5C;AAEA,IAAM,4BAA4B,OAChC,eACA,YACqE;AACrE,MAAI,CAAC,cAAe,QAAO,EAAE,YAAY,KAAK;AAC9C,MAAI;AACJ,MAAI;AACF,iBAAa,MAAM,cAAc,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO,EAAE,YAAY,MAAM,eAAe,aAAa,KAAK,EAAE,OAAO,+BAA+B,CAAC,EAAE;AAAA,EACzG;AACA,SAAO,EAAE,YAAY,oBAAoB,UAAU,EAAE;AACvD;AAEA,IAAM,oBAAoB,OAAO,YAA8E;AAC7G,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,KAAK;AAAA,EAC/B,QAAQ;AACN,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,MAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AACrE,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,QAAM,OAAO;AACb,QAAM,mBACJ,OAAO,KAAK,qBAAqB,YAAY,KAAK,iBAAiB,KAAK,EAAE,SAAS,IAC/E,KAAK,iBAAiB,KAAK,IAC3B;AACN,QAAM,gBACJ,OAAO,KAAK,kBAAkB,YAAY,KAAK,cAAc,KAAK,EAAE,SAAS,IACzE,KAAK,cAAc,KAAK,IACxB;AACN,MAAI,CAAC,oBAAoB,CAAC,eAAe;AACvC,WAAO,EAAE,OAAO,gDAAgD;AAAA,EAClE;AAEA,QAAM,gBAAgB,KAAK;AAC3B,MAAI,kBAAkB,UAAa,OAAO,kBAAkB,UAAU;AACpE,WAAO,EAAE,OAAO,wCAAwC;AAAA,EAC1D;AACA,QAAM,aAAa;AAAA,IACjB,OAAO,kBAAkB,WAAW,gBAAgB;AAAA,EACtD;AACA,MAAI,kBAAkB,UAAa,CAAC,YAAY;AAC9C,WAAO,EAAE,OAAO,wCAAwC;AAAA,EAC1D;AAEA,QAAM,YACJ,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,KAAK,EAAE,SAAS,IACjE,KAAK,UAAU,KAAK,IACpB;AACN,QAAM,aACJ,OAAO,KAAK,eAAe,YAAY,KAAK,WAAW,KAAK,EAAE,SAAS,IACnE,KAAK,WAAW,KAAK,IACrB;AAEN,QAAM,cAAc,KAAK;AACzB,MAAI,gBAAgB,QAAW;AAC7B,QAAI,CAAC,eAAe,OAAO,gBAAgB,YAAY,MAAM,QAAQ,WAAW,GAAG;AACjF,aAAO,EAAE,OAAO,8CAA8C;AAAA,IAChE;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAsC,GAAG;AACjF,UAAI,OAAO,QAAQ,YAAY,OAAO,UAAU,UAAU;AACxD,eAAO,EAAE,OAAO,8CAA8C;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB,KAAK;AAC/B,MAAI,sBAAsB,WAAc,CAAC,qBAAqB,OAAO,sBAAsB,YAAY,MAAM,QAAQ,iBAAiB,IAAI;AACxI,WAAO,EAAE,OAAO,mCAAmC;AAAA,EACrD;AAEA,QAAM,kBAAkB,KAAK;AAC7B,MAAI,oBAAoB,WAAc,CAAC,mBAAmB,OAAO,oBAAoB,YAAY,MAAM,QAAQ,eAAe,IAAI;AAChI,WAAO,EAAE,OAAO,iCAAiC;AAAA,EACnD;AACA,QAAM,qBAAqB;AAC3B,QAAM,eAAe;AAAA,IACnB,OAAO,oBAAoB,SAAS,WAAW,mBAAmB,OAAO;AAAA,EAC3E;AACA,QAAM,gBAAgB;AAAA,IACpB,OAAO,oBAAoB,UAAU,WAAW,mBAAmB,QAAQ;AAAA,EAC7E;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;AAAA,MAC/C,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,MACzC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACnC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACnC,GAAI,cAAc,EAAE,UAAU,YAAsC,IAAI,CAAC;AAAA,MACzE,GAAI,oBAAoB,EAAE,gBAAgB,kBAA6C,IAAI,CAAC;AAAA,MAC5F,GAAI,kBACA;AAAA,QACE,cAAc;AAAA,UACZ,GAAI,eAAe,EAAE,MAAM,aAAa,IAAI,CAAC;AAAA,UAC7C,GAAI,gBAAgB,EAAE,OAAO,cAAc,IAAI,CAAC;AAAA,QAClD;AAAA,MACF,IACA,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAEA,IAAM,0BAA0B,OAC9B,YACkE;AAClE,MAAI,UAAU;AACd,MAAI;AACF,cAAU,MAAM,QAAQ,KAAK;AAAA,EAC/B,QAAQ;AACN,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO,EAAE,MAAM,CAAC,EAAE;AAEvC,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,OAAO;AAAA,EAC9B,QAAQ;AACN,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,MAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AACrE,WAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAEA,QAAM,OAAO;AACb,QAAM,gBAAgB,KAAK;AAC3B,MAAI,kBAAkB,UAAa,OAAO,kBAAkB,UAAU;AACpE,WAAO,EAAE,OAAO,wCAAwC;AAAA,EAC1D;AACA,QAAM,aAAa;AAAA,IACjB,OAAO,kBAAkB,WAAW,gBAAgB;AAAA,EACtD;AACA,MAAI,kBAAkB,UAAa,CAAC,YAAY;AAC9C,WAAO,EAAE,OAAO,wCAAwC;AAAA,EAC1D;AAEA,SAAO;AAAA,IACL,MAAM,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,EACvC;AACF;AAEA,IAAM,oBAAoB,OACxB,SACA,KACA,QACA,kBACG;AACH,MAAI,QAAQ,OAAO,YAAY,MAAM,OAAO;AAC1C,WAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5D;AAEA,MAAI,IAAI,aAAa,IAAI,YAAY,GAAG;AACtC,WAAO,aAAa,KAAK,EAAE,OAAO,2CAA2C,CAAC;AAAA,EAChF;AAEA,QAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,eAAe,OAAO;AACpF,MAAI,iBAAiB,CAAC,YAAY;AAChC,WAAO,iBAAiB,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,EAChF;AAEA,QAAM,eAAe,oBAAoB,GAAG;AAC5C,MAAI,CAAC,aAAa,MAAM;AACtB,WAAO,aAAa,KAAK,EAAE,OAAO,aAAa,SAAS,kBAAkB,CAAC;AAAA,EAC7E;AAEA,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,UAAU,IAAI,YAAY,aAAa,IAAI;AACrE,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,aAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEA,IAAM,mBAAmB,OACvB,SACA,KACA,QACA,kBACG;AACH,MAAI;AACF,QAAI,QAAQ,OAAO,YAAY,MAAM,QAAQ;AAC3C,yBAAmB,sBAAsB;AAAA,QACvC,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD,aAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC5D;AAEA,QAAI,IAAI,aAAa,IAAI,YAAY,GAAG;AACtC,yBAAmB,gDAAgD;AAAA,QACjE,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD,aAAO,aAAa,KAAK,EAAE,OAAO,2CAA2C,CAAC;AAAA,IAChF;AAEA,UAAM,SAAS,MAAM,oBAAoB,OAAO;AAChD,QAAI,CAAC,OAAO,MAAM;AAChB,yBAAmB,wBAAwB;AAAA,QACzC,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,QAChB,OAAO,OAAO,SAAS;AAAA,MACzB,CAAC;AACD,aAAO,aAAa,KAAK,EAAE,OAAO,OAAO,SAAS,uBAAuB,CAAC;AAAA,IAC5E;AAEA,UAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,eAAe,OAAO;AACpF,QAAI,iBAAiB,CAAC,YAAY;AAChC,yBAAmB,gCAAgC;AAAA,QACjD,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,QAChB,QAAQ,eAAe,UAAU;AAAA,MACnC,CAAC;AACD,aAAO,iBAAiB,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,IAChF;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,MAAM,MAAM;AAAA,QACpC;AAAA,QACA,GAAG,OAAO;AAAA,MACZ,CAAC;AACD,aAAO,aAAa,KAAK,IAA0B;AAAA,IACrD,SAAS,OAAO;AACd,yBAAmB,mCAAmC;AAAA,QACpD,MAAM,IAAI;AAAA,QACV,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,YAAY,OAAO,KAAK;AAAA,QACxB,QAAQ,OAAO,KAAK;AAAA,QACpB;AAAA,MACF,CAAC;AACD,UAAI,iBAAiB,cAAc;AACjC,eAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,MACnE;AACA,aAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,IACtD;AAAA,EACF,SAAS,OAAO;AACd,uBAAmB,8BAA8B;AAAA,MAC/C,MAAM,IAAI;AAAA,MACV,QAAQ,QAAQ;AAAA,MAChB;AAAA,IACF,CAAC;AACD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEA,IAAM,yBAAyB,OAC7B,SACA,KACA,QACA,kBACG;AACH,MAAI,QAAQ,OAAO,YAAY,MAAM,OAAO;AAC1C,WAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5D;AAEA,MAAI,IAAI,aAAa,IAAI,YAAY,GAAG;AACtC,WAAO,aAAa,KAAK,EAAE,OAAO,2CAA2C,CAAC;AAAA,EAChF;AAEA,QAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,eAAe,OAAO;AACpF,MAAI,iBAAiB,CAAC,YAAY;AAChC,WAAO,iBAAiB,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,EAChF;AAEA,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,SAAS,UAAU,UAAU;AACvD,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,aAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEA,IAAM,wBAAwB,OAC5B,SACA,KACA,QACA,kBACG;AACH,MAAI,QAAQ,OAAO,YAAY,MAAM,OAAO;AAC1C,WAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5D;AAEA,QAAM,kBAAkB,oBAAoB,IAAI,aAAa,IAAI,YAAY,CAAC;AAC9E,QAAM,uBAAuB,oBAAoB,IAAI,aAAa,IAAI,iBAAiB,CAAC;AACxF,QAAM,EAAE,YAAY,oBAAoB,cAAc,IAAI,MAAM;AAAA,IAC9D;AAAA,IACA;AAAA,EACF;AACA,MAAI,cAAe,QAAO;AAE1B,QAAM,aAAa,mBAAmB;AAEtC,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,QAAQ,SAAS;AAAA,MACzC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACnC,GAAI,uBAAuB,EAAE,iBAAiB,qBAAqB,IAAI,CAAC;AAAA,IAC1E,CAAC;AACD,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,aAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEA,IAAM,uBAAuB,OAC3B,SACA,QACA,kBACG;AACH,MAAI,QAAQ,OAAO,YAAY,MAAM,QAAQ;AAC3C,WAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5D;AAEA,QAAM,SAAS,MAAM,kBAAkB,OAAO;AAC9C,MAAI,CAAC,OAAO,MAAM;AAChB,WAAO,aAAa,KAAK,EAAE,OAAO,OAAO,SAAS,uBAAuB,CAAC;AAAA,EAC5E;AAEA,QAAM,EAAE,YAAY,oBAAoB,cAAc,IAAI,MAAM;AAAA,IAC9D;AAAA,IACA;AAAA,EACF;AACA,MAAI,cAAe,QAAO;AAE1B,MACE,OAAO,KAAK,cACZ,sBACA,OAAO,KAAK,eAAe,oBAC3B;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,+CAA+C,CAAC;AAAA,EACpF;AAEA,QAAM,aAAa,OAAO,KAAK,cAAc;AAC7C,MAAI,CAAC,YAAY;AACf,WAAO,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,EAC/D;AAEA,MAAI,OAAO,KAAK,eAAe;AAC7B,UAAM,gBAAgB,IAAI,IAAI,QAAQ,GAAG,EAAE;AAC3C,UAAM,aAAa,OAAO,KAAK,cAAc,GAAG,aAAa;AAC7D,UAAM,YAAY,OAAO,KAAK,aAAa;AAC3C,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,SAAS,OAAO;AAAA,QACxC,eAAe,OAAO,KAAK;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,GAAI,OAAO,KAAK,WAAW,EAAE,UAAU,OAAO,KAAK,SAAS,IAAI,CAAC;AAAA,QACjE;AAAA,MACF,CAAC;AACD,aAAO,aAAa,KAAK,IAA8B;AAAA,IACzD,SAAS,OAAO;AACd,UAAI,iBAAiB,cAAc;AACjC,eAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,MACnE;AACA,aAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,KAAK,kBAAkB;AACjC,WAAO,aAAa,KAAK,EAAE,OAAO,+BAA+B,CAAC;AAAA,EACpE;AAEA,QAAM,iBAA0C;AAAA,IAC9C,GAAI,OAAO,KAAK,kBAAkB,CAAC;AAAA,IACnC,GAAI,OAAO,KAAK,YAAY,EAAE,YAAY,OAAO,KAAK,UAAU,IAAI,CAAC;AAAA,IACrE,GAAI,OAAO,KAAK,WAAW,EAAE,UAAU,OAAO,KAAK,SAAS,IAAI,CAAC;AAAA,EACnE;AAEA,QAAM,OAAsC;AAAA,IAC1C,kBAAkB,OAAO,KAAK;AAAA,IAC9B,GAAI,OAAO,KAAK,aAAa,EAAE,YAAY,OAAO,KAAK,WAAW,IAAI,CAAC;AAAA,IACvE,GAAI,OAAO,KAAK,eAAe,EAAE,cAAc,OAAO,KAAK,aAAa,IAAI,CAAC;AAAA,IAC7E,GAAI,OAAO,KAAK,cAAc,EAAE,SAAS,EAAE,eAAe,IAAI,CAAC;AAAA,EACjE;AAEA,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,UAAU,eAAe,YAAY,IAAI;AACnE,WAAO,aAAa,KAAK,IAAsC;AAAA,EACjE,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,aAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEA,IAAM,6BAA6B,OACjC,SACA,QACA,kBACG;AACH,MAAI,QAAQ,OAAO,YAAY,MAAM,QAAQ;AAC3C,WAAO,IAAI,SAAS,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5D;AAEA,QAAM,SAAS,MAAM,wBAAwB,OAAO;AACpD,MAAI,CAAC,OAAO,MAAM;AAChB,WAAO,aAAa,KAAK,EAAE,OAAO,OAAO,SAAS,uBAAuB,CAAC;AAAA,EAC5E;AAEA,QAAM,EAAE,YAAY,oBAAoB,cAAc,IAAI,MAAM;AAAA,IAC9D;AAAA,IACA;AAAA,EACF;AACA,MAAI,cAAe,QAAO;AAE1B,MACE,OAAO,KAAK,cACZ,sBACA,OAAO,KAAK,eAAe,oBAC3B;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,+CAA+C,CAAC;AAAA,EACpF;AAEA,QAAM,aAAa,OAAO,KAAK,cAAc;AAC7C,MAAI,CAAC,YAAY;AACf,WAAO,aAAa,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,EAC/D;AAEA,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,UAAU,aAAa,UAAU;AAC3D,WAAO,aAAa,KAAK,IAAoC;AAAA,EAC/D,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,aAAO,aAAa,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE;AACA,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,EACtD;AACF;AAEO,SAAS,eAAe,UAAqC,CAAC,GAA+B;AAClG,QAAM,YAAa,WAChB,SAAS,KAAK;AACjB,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,YAAY,QAAQ,YAAY,mBAAmB,QAAQ,QAAQ,EAAE;AAE3E,QAAM,UAA+B,OAAO,YAAqB;AAC/D,QAAI,CAAC,QAAQ;AACX,aAAO,IAAI,SAAS,4BAA4B,EAAE,QAAQ,IAAI,CAAC;AAAA,IACjE;AAEA,QAAI,OAAO;AACX,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,UAAM,WAAW,IAAI;AACrB,QAAI,SAAS,WAAW,QAAQ,GAAG;AACjC,aAAO,cAAc,SAAS,MAAM,SAAS,MAAM,CAAC;AAAA,IACtD;AAEA,UAAM,SAAS,IAAI,QAAQ,MAAM;AAEjC,QAAI,SAAS,eAAe;AAC1B,UAAI,CAAC,eAAe;AAClB,eAAO,aAAa,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MACtE;AACA,aAAO,kBAAkB,SAAS,KAAK,QAAQ,aAAa;AAAA,IAC9D;AAEA,QAAI,SAAS,qBAAqB;AAChC,UAAI,CAAC,eAAe;AAClB,eAAO,aAAa,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MACtE;AACA,aAAO,uBAAuB,SAAS,KAAK,QAAQ,aAAa;AAAA,IACnE;AAEA,QAAI,SAAS,kBAAkB;AAC7B,UAAI,CAAC,eAAe;AAClB,eAAO,aAAa,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MACtE;AACA,aAAO,iBAAiB,SAAS,KAAK,QAAQ,aAAa;AAAA,IAC7D;AAEA,QAAI,SAAS,oBAAoB;AAC/B,aAAO,sBAAsB,SAAS,KAAK,QAAQ,aAAa;AAAA,IAClE;AAEA,QAAI,SAAS,eAAe;AAC1B,aAAO,qBAAqB,SAAS,QAAQ,aAAa;AAAA,IAC5D;AAEA,QAAI,SAAS,sBAAsB;AACjC,aAAO,2BAA2B,SAAS,QAAQ,aAAa;AAAA,IAClE;AAEA,WAAO,IAAI,SAAS,cAAc,EAAE,QAAQ,IAAI,CAAC;AAAA,EACnD;AAEA,SAAO,OAAO,OAAO,SAAS;AAAA,IAC5B,KAAK;AAAA,IACL,MAAM;AAAA,EACR,CAAC;AACH;AAEA,IAAM,iBAAiB,CACrB,SACA,QACG;AACH,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,QAAQ,GAAG,KAAK,QAAQ,IAAI,YAAY,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC;AACrF,MAAI,UAAU,QAAW;AACvB,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,KAAK,GAAG;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,QAAQ,OAAO,EAAE,KAAK,CAAC,CAAC,SAAS,MAAM,UAAU,YAAY,MAAM,IAAI,YAAY,CAAC;AACzG,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,CAAC,EAAE,UAAU,IAAI;AACvB,MAAI,MAAM,QAAQ,UAAU,EAAG,QAAO,WAAW,KAAK,GAAG;AACzD,SAAO;AACT;AAEA,IAAM,YAAY,CAAC,YAAuE;AACxF,QAAM,SAAS,IAAI,QAAQ;AAC3B,MAAI,CAAC,QAAS,QAAO;AACrB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,OAAO,UAAU,SAAU,QAAO,IAAI,KAAK,KAAK;AACpD,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,QAA6B;AACjD,QAAM,UAAU,IAAI,WAAW,CAAC;AAChC,QAAM,iBAAiB,eAAe,SAAS,mBAAmB;AAClE,QAAM,WACJ,gBAAgB,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,QAAQ,YAAY,UAAU;AAC9E,QAAM,OACJ,eAAe,SAAS,kBAAkB,KAC1C,eAAe,SAAS,MAAM,KAC9B;AACF,QAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,GAAG,QAAQ,MAAM,IAAI,EAAE;AAE3D,QAAM,UAAU,IAAI,UAAU,OAAO,YAAY;AACjD,QAAM,oBAAoB,UAAU,OAAO;AAC3C,QAAM,OAAoB;AAAA,IACxB;AAAA,IACA,SAAS;AAAA,EACX;AAEA,MAAI,WAAW,SAAS,WAAW,UAAU,IAAI,SAAS,QAAW;AACnE,QAAI,OAAO,IAAI,SAAS,UAAU;AAChC,WAAK,OAAO,IAAI;AAAA,IAClB,OAAO;AACL,WAAK,OAAO,KAAK,UAAU,IAAI,IAAI;AACnC,UAAI,CAAC,kBAAkB,IAAI,cAAc,GAAG;AAC1C,0BAAkB,IAAI,gBAAgB,kBAAkB;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,QAAQ,KAAK,IAAI;AAC9B;AAEA,IAAM,eAAe,OAAO,KAA2B,aAAuB;AAC5E,MAAI,OAAO,IAAI,WAAW,YAAY;AACpC,QAAI,OAAO,SAAS,MAAM;AAAA,EAC5B,OAAO;AACL,QAAI,aAAa,SAAS;AAAA,EAC5B;AAEA,MAAI,OAAO,IAAI,cAAc,YAAY;AACvC,aAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACvC,UAAI,YAAY,KAAK,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,MAAM,QAAQ,MAAS;AAC7B;AAEO,SAAS,oBAAoB,UAAsC,CAAC,GAAG;AAC5E,SAAO,OAAO,KAA0B,QAA8B;AACpE,UAAM,gBAAgB,QAAQ;AAC9B,UAAM,UAAU,aAAa,GAAG;AAChC,UAAM,UAAU,eAAe;AAAA,MAC7B,GAAG;AAAA,MACH,eAAe,gBAAgB,CAAC,sBAAsB,cAAc,KAAK,iBAAiB,IAAI;AAAA,IAChG,CAAC;AACD,UAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,UAAM,aAAa,KAAK,QAAQ;AAAA,EAClC;AACF;","names":["createClient"]}
|