{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type {\n  ComposeCompilePartialData,\n  ComposeCompileRequest,\n  ComposeCompileResult,\n  ComposeCompileSuccessData,\n  ComposeManifest,\n  ComposeRouteRequest,\n  SimulateRequest,\n  SimulateResult,\n} from '@lifi/compose-spec';\nimport {\n  checkCompatibility,\n  COMPOSE_VERSION_HEADER,\n  COMPOSER_SDK_VERSION_HEADER,\n  parseVersion,\n} from '@lifi/compose-spec';\n\nimport type {\n  ChainSummary,\n  GetZapPacksOptions,\n  ZapPackOverview,\n} from './discovery.js';\nimport { ComposeError, errorFromHttpResponse } from './errors.js';\nimport {\n  parseCompilePartialEnvelope,\n  parseSimulateResult,\n} from './responseSchemas.js';\n\n// __SDK_VERSION__ is a compile-time constant injected by tsup (via `define` in tsup.config.ts)\n// and by vitest (via `define` in vitest.config.ts). Both read the version from package.json\n// at build/test time and replace this identifier with the literal string value.\n// It is sent as the `COMPOSER_SDK_VERSION_HEADER` request header so the server can identify the caller.\n// Falls back to 'dev' when running via tsx without tsup substitution (e.g. the example harness).\ndeclare const __SDK_VERSION__: string;\n\nconst SDK_VERSION: string =\n  typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'dev';\n// `undefined` for the `dev` sentinel, which disables the response version check.\nconst SDK_VERSION_TRIPLE = parseVersion(SDK_VERSION);\n\n/**\n * Configuration for creating a low-level Compose API client.\n */\nexport interface ComposeClientOptions {\n  /** Base URL of the Compose API. */\n  readonly baseUrl: string;\n  /** Optional custom `fetch` implementation. Defaults to `globalThis.fetch`. */\n  readonly fetch?: typeof globalThis.fetch;\n  /** LI.FI API key, sent as the `x-lifi-api-key` header on every request. Required — the Compose API rejects unauthenticated requests. */\n  readonly apiKey: string;\n}\n\n/**\n * Low-level HTTP client for the Compose API.\n *\n * Handles request serialization, SDK version headers, and error mapping.\n * Prefer using {@link ComposeSdk} for the full builder experience. Use this\n * directly when you need to decouple request building from submission — e.g.\n * build via `sdk.request()` then submit via `client.compile()` with custom\n * retry logic or request inspection.\n */\nexport interface ComposeClient {\n  /**\n   * Fetches the server's operation manifest describing all supported operations,\n   * guards, materialisers, and preconditions.\n   * @returns The manifest document.\n   * @throws {@link ComposeError} on network, validation, or server errors.\n   */\n  readonly getManifest: () => Promise<ComposeManifest>;\n  /**\n   * Fetches the chains the Compose API supports, ascending by `chainId`.\n   *\n   * A chain is listed once the server confirms the VM contract is deployed on\n   * it — the same condition {@link compile}, {@link route} and\n   * {@link simulate} validate against. A chain absent from this list is\n   * rejected outright by those endpoints.\n   *\n   * The converse does not hold: a listed chain can still have no routing edge\n   * for a given token pair, which {@link route} reports as `no_route_error`.\n   * Use {@link getZapPacks} to enumerate the pairs that do route.\n   *\n   * Each entry carries a display `name` alongside its `chainId`. The name is a\n   * deployment-maintained label — render it, but key on `chainId`.\n   *\n   * The list tracks the server's chain registry, which refreshes periodically.\n   * Results are not cached by the SDK; callers should cache as appropriate.\n   *\n   * @returns The supported chains, ascending by `chainId`.\n   * @throws {@link ComposeError} on network or server errors.\n   */\n  readonly getChains: () => Promise<readonly ChainSummary[]>;\n  /**\n   * Submits a compile request and returns the result.\n   *\n   * When the caller passes `simulationPolicy: 'allow-revert'` and the transaction\n   * reverts in simulation, the server responds with HTTP 206 and the SDK returns a\n   * partial result (`status: 'partial'`) instead of throwing. The partial result\n   * includes the transaction (without `gasLimit`) and revert diagnostics.\n   *\n   * @param request - The full compile request including flow and run inputs.\n   * @returns A discriminated result: `status: 'success'` or `status: 'partial'`.\n   * @throws {@link ComposeError} on network, validation, or server errors.\n   */\n  readonly compile: (\n    request: ComposeCompileRequest,\n  ) => Promise<ComposeCompileResult>;\n  /**\n   * Compiles a token pair into a submit-ready transaction via\n   * `POST /compose/route`.\n   *\n   * A convenience path that skips flow authoring: the server builds a one-node\n   * zap flow with a `directDeposit` input from the `fromToken` / `toToken`\n   * pair and runs it through the same pipeline as {@link compile}. The\n   * response is therefore the same discriminated result — HTTP 206 under\n   * `simulationPolicy: 'allow-revert'` yields `status: 'partial'` rather than\n   * throwing, exactly as it does for {@link compile}.\n   *\n   * As of today that flow is a single zap step: one edge of the backend's\n   * routing catalog (a position entry or exit, a wrap or unwrap, a mint or\n   * burn). Enumerate the pairs it covers with {@link getZapPacks}; a pair with\n   * no edge is rejected with `kind: 'no_route_error'`. The endpoint is meant to\n   * author richer flows later, so the single-step limit is the current state of\n   * the server, not the shape of this contract.\n   *\n   * Only synchronous edges are considered unless the request sets\n   * `allowAsyncRoutes: true`, so by default every terminal output comes back\n   * `delivery.when: 'now'` and a pair reachable only after settlement is a\n   * `no_route_error`. Opting in adds the `lifi.zapAsync` fallback, which still\n   * loses to a synchronous edge when the pair has one; read\n   * `outputs[*].delivery.when` to see which representation you got.\n   *\n   * Use {@link compile} for what the server does not author for you: several\n   * chained operations, splits, explicit preconditions, or per-op guards.\n   *\n   * `bigint` amounts in `amount` are serialised to decimal strings\n   * automatically.\n   *\n   * @param request - The from/to token pair, amount, signer, and route options.\n   * @returns A discriminated result: `status: 'success'` or `status: 'partial'`.\n   * @throws {@link ComposeError} on network, validation, or server errors —\n   *   including `NOT_FOUND` (HTTP 404) when no catalog edge covers the pair.\n   */\n  readonly route: (\n    request: ComposeRouteRequest,\n  ) => Promise<ComposeCompileResult>;\n  /**\n   * Fetches the available routing edges grouped by protocol.\n   *\n   * The edge catalog is dynamic — it reflects the current state of the\n   * backend's routing snapshot (protocols, chains, token blacklists).\n   * Results are not cached by the SDK; callers should cache as appropriate.\n   *\n   * @param options - Optional filter to restrict results to specific protocols.\n   * @returns An array of {@link ZapPackOverview} objects, one per protocol.\n   * @throws {@link ComposeError} on network or server errors (503 when the\n   *   routing catalog is not yet initialized).\n   */\n  readonly getZapPacks: (\n    options?: GetZapPacksOptions,\n  ) => Promise<readonly ZapPackOverview[]>;\n  /**\n   * Simulates a raw, pre-encoded transaction against `POST /simulate` and\n   * reports how the watched balances change and how much inner-call gas it\n   * burns.\n   *\n   * The result is a discriminated union on `status`:\n   * - `'ok'` — the simulation ran successfully; `deltas`/`gasUsed` are populated.\n   * - `'revert'` — the simulation ran but the transaction reverted on-chain. A\n   *   revert is a *successful simulation*, not a transport error, so it is\n   *   returned (HTTP 200) rather than thrown — mirroring how {@link compile}\n   *   returns `status: 'partial'` on a simulated revert.\n   * - `'error'` — the request was well-formed but the simulation could not be\n   *   set up or run (HTTP 422); `message` is intentionally generic.\n   *\n   * `bigint` amounts in the request (`value`, requirement `balance`/`allowance`)\n   * are serialised to decimal strings automatically.\n   *\n   * @param request - The raw transaction plus funding `requirements` and the\n   *   `trackedBalances` to watch.\n   * @returns A {@link SimulateResult} (`ok` / `revert` / `error`).\n   * @throws {@link ComposeError} on network failures, HTTP 400 (malformed\n   *   input), 401/403 (auth), 404, 429, and 5xx.\n   */\n  readonly simulate: (request: SimulateRequest) => Promise<SimulateResult>;\n}\n\n/**\n * `JSON.stringify` replacer that renders `bigint` amounts as decimal strings.\n *\n * The compose wire carries token amounts as decimal strings, and `bigint` has\n * no JSON representation, so every payload this client sends goes through it.\n * Exported so the example harness prints a request exactly as it is sent.\n */\nexport const bigintReplacer = (_key: string, value: unknown): unknown =>\n  typeof value === 'bigint' ? value.toString() : value;\n\nconst isNonNullObject = (v: unknown): v is Record<string, unknown> =>\n  typeof v === 'object' && v !== null;\n\n// Non-negative decimal integer string, as the server sends token amounts.\nconst INTEGER_STRING = /^\\d+$/;\n\nconst decodeAmount = (value: unknown, path: string, url: string): bigint => {\n  if (typeof value !== 'string' || !INTEGER_STRING.test(value)) {\n    throw new ComposeError(\n      'UNKNOWN_ERROR',\n      `Malformed compose response: ${path} is ${\n        value === undefined ? 'absent' : 'not an integer string'\n      }`,\n      { url },\n    );\n  }\n  return BigInt(value);\n};\n\n// The two records this seam reads out of a compile-family response body. Each\n// is `unknown` because the seam is what establishes its shape: it validates\n// every field before writing a decoded `bigint` back over the wire string.\ninterface WireAmountBody {\n  outputs?: unknown;\n}\n\n// One `Amount` as it arrives: each leaf is `unknown` until this seam has\n// checked it, and is overwritten in place with the decoded `bigint`.\ninterface WireAmount {\n  estimate?: unknown;\n  minimum?: unknown;\n}\n\nconst malformed = (path: string, what: string, url: string): ComposeError =>\n  new ComposeError(\n    'UNKNOWN_ERROR',\n    `Malformed compose response: ${path} ${what}`,\n    { url },\n  );\n\n// Decode one `Estimate` / `Minimum` leaf in place: `{ basis, value }` with\n// `value` a decimal string on the wire and a `bigint` on `Amount`.\nconst decodeAmountLeaf = (\n  amount: WireAmount,\n  field: 'estimate' | 'minimum',\n  path: string,\n  url: string,\n): void => {\n  const leaf = amount[field];\n  if (leaf === undefined) return;\n  if (!isNonNullObject(leaf)) {\n    throw malformed(`${path}.${field}`, 'is not an object', url);\n  }\n  leaf.value = decodeAmount(leaf.value, `${path}.${field}.value`, url);\n};\n\n// `outputs` is REQUIRED on every compile-family body and is the record a\n// caller reads amounts from, so its structure is checked here — the body is\n// cast, not schema-parsed — before each `value` leaf becomes a `bigint`.\nconst decodeOutputs = (data: WireAmountBody, url: string): void => {\n  const outputs = data.outputs;\n  if (!isNonNullObject(outputs)) {\n    throw malformed(\n      'outputs',\n      outputs === undefined ? 'is absent' : 'is not an object',\n      url,\n    );\n  }\n  for (const key of Object.keys(outputs)) {\n    const entry = outputs[key];\n    if (!isNonNullObject(entry)) {\n      throw malformed(`outputs.${key}`, 'is not an object', url);\n    }\n    const amount = entry.amount;\n    if (!isNonNullObject(amount)) {\n      throw malformed(\n        `outputs.${key}.amount`,\n        amount === undefined ? 'is absent' : 'is not an object',\n        url,\n      );\n    }\n    decodeAmountLeaf(amount, 'estimate', `outputs.${key}.amount`, url);\n    decodeAmountLeaf(amount, 'minimum', `outputs.${key}.amount`, url);\n  }\n};\n\n// THE decode seam for a compile-family response body: every amount the wire\n// renders as a decimal string becomes the `bigint` its declared type promises.\n// The amount record is handled here so the body is narrowed once — a\n// non-object body is not this function's error to raise, since the enveloping\n// parse already rejected it.\nconst decodeWireAmounts = (data: unknown, url: string): void => {\n  if (!isNonNullObject(data)) return;\n  decodeOutputs(data, url);\n};\n\nconst parseBody = async <T>(res: Response, url: string): Promise<T> => {\n  const body = await res.json().catch((_) => null);\n  if (!isNonNullObject(body) || !('data' in body)) {\n    throw new ComposeError('UNKNOWN_ERROR', 'Unexpected response format', {\n      url,\n    });\n  }\n  return body.data as T;\n};\n\nconst parseCompileSuccessBody = async (\n  res: Response,\n  url: string,\n): Promise<ComposeCompileResult> => {\n  const data = await parseBody<ComposeCompileSuccessData>(res, url);\n  decodeWireAmounts(data, url);\n  return { ...data, status: 'success' as const };\n};\n\nconst parsePartialBody = async (\n  res: Response,\n  url: string,\n): Promise<ComposeCompileResult> => {\n  const body = await res.json().catch((_) => null);\n  const envelope = parseCompilePartialEnvelope(body);\n  if (envelope === null) {\n    throw new ComposeError(\n      'UNKNOWN_ERROR',\n      'Unexpected partial response format',\n      { url },\n    );\n  }\n  // `data` is validated as an object by the schema; compose-spec owns its full\n  // shape as a hand-authored type, so we narrow it here rather than re-declaring\n  // that type as a schema. `error` is fully validated — no cast needed.\n  const data = envelope.data as ComposeCompilePartialData;\n  decodeWireAmounts(data, url);\n  return { ...data, status: 'partial' as const, error: envelope.error };\n};\n\n// `/simulate` is un-enveloped: the discriminated body (`{ status, ... }`) is at\n// the top level, NOT wrapped in `{ data }` like `/compose`. So this reads the\n// body directly and validates it against the simulate union rather than reusing\n// `parseBody`.\nconst parseSimulateBody = async (\n  res: Response,\n  url: string,\n): Promise<SimulateResult> => {\n  const body = await res.json().catch((_) => null);\n  const result = parseSimulateResult(body);\n  if (result === null) {\n    throw new ComposeError(\n      'UNKNOWN_ERROR',\n      'Unexpected simulate response format',\n      { url },\n    );\n  }\n  return result;\n};\n// `POST /compose` and `POST /compose/route` differ only in path and request\n// shape: both return the enveloped success data on 200 and the partial\n// envelope on 206, so they share one transport.\ntype ComposeTransport = {\n  readonly fetchFn: typeof fetch;\n  readonly baseHeaders: Record<string, string>;\n};\n\n// A patch bump is additive and a minor bump is breaking, so a 200 from a\n// backend behind this SDK cannot be trusted: the newer flow this SDK authored\n// may have compiled under the server's older semantics without raising an\n// error. This covers the deploy window where the SDK is published to npm ahead\n// of the backend rollout. Only the compile-family POSTs are checked; discovery\n// GETs stay reachable from a mismatched SDK, as on the server. An absent header\n// (a pre-gate backend, a header-stripping proxy) is accepted, mirroring the\n// server's pass-through of a compile that carries no version header.\nconst assertServerVersion = (res: Response, url: string): void => {\n  const serverVersion = res.headers.get(COMPOSE_VERSION_HEADER);\n  if (serverVersion === null || SDK_VERSION_TRIPLE === undefined) return;\n  const serverTriple = parseVersion(serverVersion);\n  if (serverTriple === undefined) return;\n\n  const compatibility = checkCompatibility(SDK_VERSION_TRIPLE, serverTriple);\n  if (compatibility === 'compatible') return;\n\n  const versions = { sdkVersion: SDK_VERSION, serverVersion };\n  if (compatibility === 'sdk_outdated') {\n    throw new ComposeError(\n      'VALIDATION_ERROR',\n      `composer-sdk ${SDK_VERSION} is older than the compose contract served at ${url} (${serverVersion}); upgrade @lifi/composer-sdk and @lifi/compose-spec`,\n      {\n        status: res.status,\n        url,\n        kind: 'sdk_outdated',\n        sdkOutdated: {\n          ...versions,\n          minimumSdkVersion: `${serverTriple.major}.${serverTriple.minor}.0`,\n        },\n      },\n    );\n  }\n  throw new ComposeError(\n    'VALIDATION_ERROR',\n    `composer-sdk ${SDK_VERSION} targets a newer compose contract than the server at ${url} serves (${serverVersion}); pin @lifi/composer-sdk and @lifi/compose-spec to ${serverVersion} or wait for the server rollout`,\n    {\n      status: res.status,\n      url,\n      kind: 'server_outdated',\n      serverOutdated: versions,\n    },\n  );\n};\n\ntype SendInit =\n  | { readonly method: 'GET' }\n  | { readonly method: 'POST'; readonly body: unknown };\n\n// GETs on this API carry no body; POSTs carry a JSON one with `bigint` amounts\n// rendered as decimal strings.\nconst requestInit = (\n  baseHeaders: Record<string, string>,\n  init: SendInit,\n): RequestInit =>\n  init.method === 'GET'\n    ? { method: 'GET', headers: { ...baseHeaders } }\n    : {\n        method: 'POST',\n        headers: { ...baseHeaders, 'Content-Type': 'application/json' },\n        body: JSON.stringify(init.body, bigintReplacer),\n      };\n\n// One fetch path for every route: maps transport failures to `NETWORK_ERROR`.\n// The response version check is not here — only the compile-family POSTs gate\n// on it (see `postCompile`); discovery GETs and `/simulate` are ungated.\nconst send = async (\n  { fetchFn, baseHeaders }: ComposeTransport,\n  url: string,\n  init: SendInit,\n): Promise<Response> => {\n  try {\n    return await fetchFn(url, requestInit(baseHeaders, init));\n  } catch (err) {\n    const message = err instanceof Error ? err.message : String(err);\n    throw new ComposeError('NETWORK_ERROR', message, { cause: err });\n  }\n};\n\nconst postCompile = async (\n  transport: ComposeTransport,\n  url: string,\n  request: ComposeCompileRequest | ComposeRouteRequest,\n): Promise<ComposeCompileResult> => {\n  const res = await send(transport, url, { method: 'POST', body: request });\n  assertServerVersion(res, url);\n  if (res.status === 206) {\n    return await parsePartialBody(res, url);\n  }\n  if (!res.ok) {\n    const body = await res.text();\n    throw errorFromHttpResponse(res.status, body, url);\n  }\n  return await parseCompileSuccessBody(res, url);\n};\n\n// Every enveloped GET on this API behaves identically: no body, no query\n// semantics of its own, `{ data }` on success, an error envelope otherwise.\nconst getJson = async <T>(\n  transport: ComposeTransport,\n  url: string,\n): Promise<T> => {\n  const res = await send(transport, url, { method: 'GET' });\n  if (!res.ok) {\n    const body = await res.text();\n    throw errorFromHttpResponse(res.status, body, url);\n  }\n  return await parseBody<T>(res, url);\n};\n\n/**\n * Creates a low-level Compose API client.\n *\n * @param options - Client configuration including the API base URL.\n * @returns A {@link ComposeClient} instance.\n */\nexport const createComposeClient = (\n  options: ComposeClientOptions,\n): ComposeClient => {\n  if (!options.baseUrl || !/^https?:\\/\\//i.test(options.baseUrl)) {\n    throw new ComposeError(\n      'VALIDATION_ERROR',\n      `Invalid baseUrl: expected an HTTP(S) URL, got \"${options.baseUrl}\"`,\n    );\n  }\n  const trimmedApiKey = options.apiKey?.trim() || undefined;\n  if (!trimmedApiKey) {\n    throw new ComposeError(\n      'VALIDATION_ERROR',\n      'apiKey is required: pass a LI.FI API key to createComposeSdk().',\n    );\n  }\n  const fetchFn = options.fetch ?? globalThis.fetch;\n  const base = options.baseUrl.replace(/\\/$/, '');\n\n  const baseHeaders: Record<string, string> = {\n    Accept: 'application/json',\n    [COMPOSER_SDK_VERSION_HEADER]: SDK_VERSION,\n    'x-lifi-api-key': trimmedApiKey,\n  };\n  const transport: ComposeTransport = { fetchFn, baseHeaders };\n\n  const getManifest = async (): Promise<ComposeManifest> =>\n    getJson<ComposeManifest>(transport, `${base}/compose/manifest`);\n\n  const getChains = async (): Promise<readonly ChainSummary[]> =>\n    getJson<readonly ChainSummary[]>(transport, `${base}/chains`);\n\n  const compile = async (\n    request: ComposeCompileRequest,\n  ): Promise<ComposeCompileResult> =>\n    postCompile(transport, `${base}/compose`, request);\n\n  const route = async (\n    request: ComposeRouteRequest,\n  ): Promise<ComposeCompileResult> =>\n    postCompile(transport, `${base}/compose/route`, request);\n\n  const getZapPacks = async (\n    options?: GetZapPacksOptions,\n  ): Promise<readonly ZapPackOverview[]> => {\n    const params = new URLSearchParams();\n    if (options?.protocols !== undefined) {\n      // Backend expects a single comma-separated value, not repeated keys.\n      const raw = options.protocols;\n      const list = typeof raw === 'string' ? raw : raw.join(',');\n      params.set('protocols', list);\n    }\n    const qs = params.toString();\n    return getJson<readonly ZapPackOverview[]>(\n      transport,\n      `${base}/compose/zap-packs${qs ? `?${qs}` : ''}`,\n    );\n  };\n\n  const simulate = async (\n    request: SimulateRequest,\n  ): Promise<SimulateResult> => {\n    const url = `${base}/simulate`;\n    const res = await send(transport, url, { method: 'POST', body: request });\n    // Only 200 (carries `ok`/`revert`) and 422 (carries the `error` member of\n    // the union) have a discriminated body. 422 is deliberately intercepted\n    // here (not thrown as VALIDATION_ERROR) so callers get one exhaustive\n    // `switch (result.status)`. Every other status is a transport error and is\n    // thrown — including HTTP 400 (malformed input, no `status` body) and any\n    // unexpected 2xx.\n    if (res.status === 200 || res.status === 422) {\n      return await parseSimulateBody(res, url);\n    }\n    const body = await res.text();\n    throw errorFromHttpResponse(res.status, body, url);\n  };\n\n  return { getManifest, getChains, compile, route, getZapPacks, simulate };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,0BAKO;AAOP,oBAAoD;AACpD,6BAGO;AASP,MAAM,cACJ,OAAyC,UAAkB;AAE7D,MAAM,yBAAqB,kCAAa,WAAW;AA2J5C,MAAM,iBAAiB,CAAC,MAAc,UAC3C,OAAO,UAAU,WAAW,MAAM,SAAS,IAAI;AAEjD,MAAM,kBAAkB,CAAC,MACvB,OAAO,MAAM,YAAY,MAAM;AAGjC,MAAM,iBAAiB;AAEvB,MAAM,eAAe,CAAC,OAAgB,MAAc,QAAwB;AAC1E,MAAI,OAAO,UAAU,YAAY,CAAC,eAAe,KAAK,KAAK,GAAG;AAC5D,UAAM,IAAI;AAAA,MACR;AAAA,MACA,+BAA+B,IAAI,OACjC,UAAU,SAAY,WAAW,uBACnC;AAAA,MACA,EAAE,IAAI;AAAA,IACR;AAAA,EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAgBA,MAAM,YAAY,CAAC,MAAc,MAAc,QAC7C,IAAI;AAAA,EACF;AAAA,EACA,+BAA+B,IAAI,IAAI,IAAI;AAAA,EAC3C,EAAE,IAAI;AACR;AAIF,MAAM,mBAAmB,CACvB,QACA,OACA,MACA,QACS;AACT,QAAM,OAAO,OAAO,KAAK;AACzB,MAAI,SAAS,OAAW;AACxB,MAAI,CAAC,gBAAgB,IAAI,GAAG;AAC1B,UAAM,UAAU,GAAG,IAAI,IAAI,KAAK,IAAI,oBAAoB,GAAG;AAAA,EAC7D;AACA,OAAK,QAAQ,aAAa,KAAK,OAAO,GAAG,IAAI,IAAI,KAAK,UAAU,GAAG;AACrE;AAKA,MAAM,gBAAgB,CAAC,MAAsB,QAAsB;AACjE,QAAM,UAAU,KAAK;AACrB,MAAI,CAAC,gBAAgB,OAAO,GAAG;AAC7B,UAAM;AAAA,MACJ;AAAA,MACA,YAAY,SAAY,cAAc;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACA,aAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,YAAM,UAAU,WAAW,GAAG,IAAI,oBAAoB,GAAG;AAAA,IAC3D;AACA,UAAM,SAAS,MAAM;AACrB,QAAI,CAAC,gBAAgB,MAAM,GAAG;AAC5B,YAAM;AAAA,QACJ,WAAW,GAAG;AAAA,QACd,WAAW,SAAY,cAAc;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AACA,qBAAiB,QAAQ,YAAY,WAAW,GAAG,WAAW,GAAG;AACjE,qBAAiB,QAAQ,WAAW,WAAW,GAAG,WAAW,GAAG;AAAA,EAClE;AACF;AAOA,MAAM,oBAAoB,CAAC,MAAe,QAAsB;AAC9D,MAAI,CAAC,gBAAgB,IAAI,EAAG;AAC5B,gBAAc,MAAM,GAAG;AACzB;AAEA,MAAM,YAAY,OAAU,KAAe,QAA4B;AACrE,QAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI;AAC/C,MAAI,CAAC,gBAAgB,IAAI,KAAK,EAAE,UAAU,OAAO;AAC/C,UAAM,IAAI,2BAAa,iBAAiB,8BAA8B;AAAA,MACpE;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,KAAK;AACd;AAEA,MAAM,0BAA0B,OAC9B,KACA,QACkC;AAClC,QAAM,OAAO,MAAM,UAAqC,KAAK,GAAG;AAChE,oBAAkB,MAAM,GAAG;AAC3B,SAAO,EAAE,GAAG,MAAM,QAAQ,UAAmB;AAC/C;AAEA,MAAM,mBAAmB,OACvB,KACA,QACkC;AAClC,QAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI;AAC/C,QAAM,eAAW,oDAA4B,IAAI;AACjD,MAAI,aAAa,MAAM;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,EAAE,IAAI;AAAA,IACR;AAAA,EACF;AAIA,QAAM,OAAO,SAAS;AACtB,oBAAkB,MAAM,GAAG;AAC3B,SAAO,EAAE,GAAG,MAAM,QAAQ,WAAoB,OAAO,SAAS,MAAM;AACtE;AAMA,MAAM,oBAAoB,OACxB,KACA,QAC4B;AAC5B,QAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI;AAC/C,QAAM,aAAS,4CAAoB,IAAI;AACvC,MAAI,WAAW,MAAM;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,EAAE,IAAI;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAiBA,MAAM,sBAAsB,CAAC,KAAe,QAAsB;AAChE,QAAM,gBAAgB,IAAI,QAAQ,IAAI,0CAAsB;AAC5D,MAAI,kBAAkB,QAAQ,uBAAuB,OAAW;AAChE,QAAM,mBAAe,kCAAa,aAAa;AAC/C,MAAI,iBAAiB,OAAW;AAEhC,QAAM,oBAAgB,wCAAmB,oBAAoB,YAAY;AACzE,MAAI,kBAAkB,aAAc;AAEpC,QAAM,WAAW,EAAE,YAAY,aAAa,cAAc;AAC1D,MAAI,kBAAkB,gBAAgB;AACpC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,gBAAgB,WAAW,iDAAiD,GAAG,KAAK,aAAa;AAAA,MACjG;AAAA,QACE,QAAQ,IAAI;AAAA,QACZ;AAAA,QACA,MAAM;AAAA,QACN,aAAa;AAAA,UACX,GAAG;AAAA,UACH,mBAAmB,GAAG,aAAa,KAAK,IAAI,aAAa,KAAK;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,gBAAgB,WAAW,wDAAwD,GAAG,YAAY,aAAa,uDAAuD,aAAa;AAAA,IACnL;AAAA,MACE,QAAQ,IAAI;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB;AAAA,EACF;AACF;AAQA,MAAM,cAAc,CAClB,aACA,SAEA,KAAK,WAAW,QACZ,EAAE,QAAQ,OAAO,SAAS,EAAE,GAAG,YAAY,EAAE,IAC7C;AAAA,EACE,QAAQ;AAAA,EACR,SAAS,EAAE,GAAG,aAAa,gBAAgB,mBAAmB;AAAA,EAC9D,MAAM,KAAK,UAAU,KAAK,MAAM,cAAc;AAChD;AAKN,MAAM,OAAO,OACX,EAAE,SAAS,YAAY,GACvB,KACA,SACsB;AACtB,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,YAAY,aAAa,IAAI,CAAC;AAAA,EAC1D,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAM,IAAI,2BAAa,iBAAiB,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EACjE;AACF;AAEA,MAAM,cAAc,OAClB,WACA,KACA,YACkC;AAClC,QAAM,MAAM,MAAM,KAAK,WAAW,KAAK,EAAE,QAAQ,QAAQ,MAAM,QAAQ,CAAC;AACxE,sBAAoB,KAAK,GAAG;AAC5B,MAAI,IAAI,WAAW,KAAK;AACtB,WAAO,MAAM,iBAAiB,KAAK,GAAG;AAAA,EACxC;AACA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAM,qCAAsB,IAAI,QAAQ,MAAM,GAAG;AAAA,EACnD;AACA,SAAO,MAAM,wBAAwB,KAAK,GAAG;AAC/C;AAIA,MAAM,UAAU,OACd,WACA,QACe;AACf,QAAM,MAAM,MAAM,KAAK,WAAW,KAAK,EAAE,QAAQ,MAAM,CAAC;AACxD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAM,qCAAsB,IAAI,QAAQ,MAAM,GAAG;AAAA,EACnD;AACA,SAAO,MAAM,UAAa,KAAK,GAAG;AACpC;AAQO,MAAM,sBAAsB,CACjC,YACkB;AAClB,MAAI,CAAC,QAAQ,WAAW,CAAC,gBAAgB,KAAK,QAAQ,OAAO,GAAG;AAC9D,UAAM,IAAI;AAAA,MACR;AAAA,MACA,kDAAkD,QAAQ,OAAO;AAAA,IACnE;AAAA,EACF;AACA,QAAM,gBAAgB,QAAQ,QAAQ,KAAK,KAAK;AAChD,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,QAAQ,SAAS,WAAW;AAC5C,QAAM,OAAO,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAE9C,QAAM,cAAsC;AAAA,IAC1C,QAAQ;AAAA,IACR,CAAC,+CAA2B,GAAG;AAAA,IAC/B,kBAAkB;AAAA,EACpB;AACA,QAAM,YAA8B,EAAE,SAAS,YAAY;AAE3D,QAAM,cAAc,YAClB,QAAyB,WAAW,GAAG,IAAI,mBAAmB;AAEhE,QAAM,YAAY,YAChB,QAAiC,WAAW,GAAG,IAAI,SAAS;AAE9D,QAAM,UAAU,OACd,YAEA,YAAY,WAAW,GAAG,IAAI,YAAY,OAAO;AAEnD,QAAM,QAAQ,OACZ,YAEA,YAAY,WAAW,GAAG,IAAI,kBAAkB,OAAO;AAEzD,QAAM,cAAc,OAClBA,aACwC;AACxC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAIA,UAAS,cAAc,QAAW;AAEpC,YAAM,MAAMA,SAAQ;AACpB,YAAM,OAAO,OAAO,QAAQ,WAAW,MAAM,IAAI,KAAK,GAAG;AACzD,aAAO,IAAI,aAAa,IAAI;AAAA,IAC9B;AACA,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO;AAAA,MACL;AAAA,MACA,GAAG,IAAI,qBAAqB,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,WAAW,OACf,YAC4B;AAC5B,UAAM,MAAM,GAAG,IAAI;AACnB,UAAM,MAAM,MAAM,KAAK,WAAW,KAAK,EAAE,QAAQ,QAAQ,MAAM,QAAQ,CAAC;AAOxE,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,aAAO,MAAM,kBAAkB,KAAK,GAAG;AAAA,IACzC;AACA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAM,qCAAsB,IAAI,QAAQ,MAAM,GAAG;AAAA,EACnD;AAEA,SAAO,EAAE,aAAa,WAAW,SAAS,OAAO,aAAa,SAAS;AACzE;","names":["options"]}