{"version":3,"file":"tools-B4rwKdvU.mjs","names":[],"sources":["../src/wallet/tools.ts"],"sourcesContent":["import { createPublicClient, createWalletClient, formatEther, formatUnits, http, parseUnits, type Address, type Hex } from 'viem'\nimport { base } from 'viem/chains'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { decryptKey, normalizeWalletPrivateKey } from './index.js'\n\nexport const BASE_CHAIN_ID = 8453\nexport const USDC_ADDRESS = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' as const\nexport const PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3' as const\nexport const DEFAULT_BASE_RPC_URL = 'https://mainnet.base.org'\nexport const DEFAULT_PAYMENT_APPROVAL_UNITS = 1_000_000n\n// Ceiling for approvals triggered automatically by a 402 `allowance_required`\n// response. The endpoint dictates the amount, so it must be bounded: a\n// malicious or compromised endpoint could otherwise demand — and have the\n// client silently sign — an allowance up to the wallet's entire balance.\n// Override with CHAIN_INSIGHTS_MAX_AUTO_APPROVAL_USDC; larger one-off\n// allowances go through the explicit `wallet ready --payment-usdc` path.\nexport const DEFAULT_MAX_AUTO_APPROVAL_UNITS = 10_000_000n\nexport const PUBLIC_BASE_RPC_URLS = [\n  DEFAULT_BASE_RPC_URL,\n  'https://base-rpc.publicnode.com',\n  'https://base.drpc.org',\n  'https://1rpc.io/base',\n] as const\n\nconst USDC_ABI = [\n  {\n    type: 'function',\n    name: 'balanceOf',\n    stateMutability: 'view',\n    inputs: [{ name: 'account', type: 'address' }],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'allowance',\n    stateMutability: 'view',\n    inputs: [\n      { name: 'owner', type: 'address' },\n      { name: 'spender', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'approve',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'spender', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'bool' }],\n  },\n] as const\n\nexport interface PaymentWalletAccount {\n  address: Address\n  privateKey: Hex\n}\n\nexport interface TopupInfo {\n  wallet_address: string\n  network: 'Base'\n  chain_id: typeof BASE_CHAIN_ID\n  token: 'USDC'\n  token_contract: typeof USDC_ADDRESS\n  topup_url?: string\n}\n\nexport interface WalletReadiness {\n  address: Address\n  balanceUsdc: string\n  balanceEth: string\n  paymentApprovalUsdc: string\n  paymentApprovalUnits: bigint\n  minimumApprovalUnits: bigint\n  hasUsdc: boolean | null\n  hasGas: boolean | null\n  hasPaymentApproval: boolean\n  needsPaymentApproval: boolean\n  ready: boolean\n  nextSteps: string[]\n}\n\nexport interface PaymentApprovalResult {\n  status: 'already_ready' | 'approved'\n  txHash?: Hex\n  paymentApprovalUnits: bigint\n  minimumApprovalUnits: bigint\n}\n\nexport interface PrepareWalletResult {\n  readiness: WalletReadiness\n  approval?: PaymentApprovalResult\n}\n\nexport interface PrepareWalletOptions {\n  account?: PaymentWalletAccount\n  minimumApprovalUnits?: bigint\n  // When set, refuse (before any on-chain action) to approve more than this\n  // many USDC units. Callers that escalate to an endpoint-dictated amount must\n  // pass this so an untrusted endpoint cannot drive an unbounded approval.\n  maxApprovalUnits?: bigint\n  approve?: boolean\n  rpcUrl?: string\n}\n\n/**\n * Resolves the automatic payment-approval ceiling, honoring the\n * CHAIN_INSIGHTS_MAX_AUTO_APPROVAL_USDC override (validated as a positive USDC\n * amount) and otherwise returning DEFAULT_MAX_AUTO_APPROVAL_UNITS.\n */\nexport function resolveMaxAutoApprovalUnits(env: NodeJS.ProcessEnv = process.env): bigint {\n  const raw = env['CHAIN_INSIGHTS_MAX_AUTO_APPROVAL_USDC']?.trim()\n  if (!raw) return DEFAULT_MAX_AUTO_APPROVAL_UNITS\n  return parsePaymentApprovalUnits(raw)\n}\n\nexport interface WalletBalanceFacts {\n  address: Address\n  payment_network: 'base'\n  payment_network_display: 'Base'\n  chain_id: typeof BASE_CHAIN_ID\n  token: 'USDC'\n  token_balance: string\n  gas_token: 'ETH'\n  gas_balance?: string\n}\n\nexport interface WalletBalanceResult {\n  schema: 'chain-insights.result.v1'\n  tool: 'wallet_balance'\n  hint: null\n  facts: {\n    wallet: WalletBalanceFacts\n  }\n}\n\nexport async function getWalletAccount(): Promise<PaymentWalletAccount> {\n  const privateKey = normalizeWalletPrivateKey(await decryptKey()) as Hex\n  const account = privateKeyToAccount(privateKey)\n  return { address: account.address, privateKey }\n}\n\nfunction baseRpcUrls(rpcUrl = process.env['BASE_RPC_URL']): string[] {\n  return [\n    ...(rpcUrl ? [rpcUrl] : []),\n    ...PUBLIC_BASE_RPC_URLS.filter((fallbackUrl) => fallbackUrl !== rpcUrl),\n  ]\n}\n\nexport async function getBalanceUsdc(\n  address: Address | string,\n  rpcUrl = process.env['BASE_RPC_URL'],\n): Promise<string> {\n  for (const url of baseRpcUrls(rpcUrl)) {\n    try {\n      const client = createPublicClient({\n        chain: base,\n        transport: http(url),\n      })\n      const balance = await client.readContract({\n        address: USDC_ADDRESS,\n        abi: USDC_ABI,\n        functionName: 'balanceOf',\n        args: [address as Address],\n      })\n      return formatUnits(balance, 6)\n    } catch {\n      // Try the next public Base RPC endpoint.\n    }\n  }\n\n  return 'unknown'\n}\n\nexport async function getBalanceEth(\n  address: Address | string,\n  rpcUrl = process.env['BASE_RPC_URL'],\n): Promise<string> {\n  for (const url of baseRpcUrls(rpcUrl)) {\n    try {\n      const client = createPublicClient({\n        chain: base,\n        transport: http(url),\n      })\n      const balance = await client.getBalance({ address: address as Address })\n      return formatEther(balance)\n    } catch {\n      // Try the next public Base RPC endpoint.\n    }\n  }\n\n  return 'unknown'\n}\n\nexport async function getPaymentApprovalUnits(\n  address: Address | string,\n  rpcUrl = process.env['BASE_RPC_URL'],\n): Promise<bigint | null> {\n  for (const url of baseRpcUrls(rpcUrl)) {\n    try {\n      const client = createPublicClient({\n        chain: base,\n        transport: http(url),\n      })\n      return await client.readContract({\n        address: USDC_ADDRESS,\n        abi: USDC_ABI,\n        functionName: 'allowance',\n        args: [address as Address, PERMIT2_ADDRESS],\n      })\n    } catch {\n      // Try the next public Base RPC endpoint.\n    }\n  }\n\n  return null\n}\n\nexport async function getPaymentApprovalUsdc(\n  address: Address | string,\n  rpcUrl = process.env['BASE_RPC_URL'],\n): Promise<string> {\n  const allowance = await getPaymentApprovalUnits(address, rpcUrl)\n  return allowance === null ? 'unknown' : formatUnits(allowance, 6)\n}\n\nexport function parsePaymentApprovalUnits(amountUsdc: string): bigint {\n  const trimmed = amountUsdc.trim()\n  if (!/^\\d+(\\.\\d{1,6})?$/.test(trimmed) || !isPositiveDecimal(trimmed)) {\n    throw new Error('Payment setup amount must be a positive USDC value with up to 6 decimals.')\n  }\n  return parseUnits(trimmed, 6)\n}\n\nfunction isPositiveDecimal(value: string): boolean {\n  if (value === 'unknown') return false\n  const parsed = Number.parseFloat(value)\n  return Number.isFinite(parsed) && parsed > 0\n}\n\nfunction decimalStatus(value: string): boolean | null {\n  return value === 'unknown' ? null : isPositiveDecimal(value)\n}\n\nfunction readinessNextSteps(readiness: Pick<WalletReadiness, 'hasUsdc' | 'hasGas' | 'needsPaymentApproval'>): string[] {\n  const nextSteps: string[] = []\n  if (readiness.hasUsdc === false) {\n    nextSteps.push('Run `chain-insights wallet topup` and send USDC on Base to this wallet.')\n  }\n  if (readiness.hasUsdc === null) {\n    nextSteps.push('Base USDC balance could not be confirmed; retry or set BASE_RPC_URL to a working Base RPC endpoint.')\n  }\n  if (readiness.needsPaymentApproval && readiness.hasGas === false) {\n    nextSteps.push('Add a small amount of ETH on Base for the one-time payment setup gas.')\n  }\n  if (readiness.needsPaymentApproval && readiness.hasGas !== false) {\n    nextSteps.push('Run `chain-insights wallet ready` to finish the one-time payment setup.')\n  }\n  if (readiness.hasGas === null) {\n    nextSteps.push('Base ETH gas balance could not be confirmed; retry or set BASE_RPC_URL to a working Base RPC endpoint.')\n  }\n  return nextSteps\n}\n\nfunction buildWalletReadiness(params: {\n  address: Address\n  balanceUsdc: string\n  balanceEth: string\n  paymentApprovalUnits: bigint | null\n  minimumApprovalUnits: bigint\n}): WalletReadiness {\n  const paymentApprovalUnits = params.paymentApprovalUnits ?? 0n\n  const hasUsdc = decimalStatus(params.balanceUsdc)\n  const hasGas = decimalStatus(params.balanceEth)\n  const hasPaymentApproval = paymentApprovalUnits >= params.minimumApprovalUnits\n  const needsPaymentApproval = !hasPaymentApproval\n  const ready = hasUsdc !== false && hasPaymentApproval\n  const readiness = {\n    address: params.address,\n    balanceUsdc: params.balanceUsdc,\n    balanceEth: params.balanceEth,\n    paymentApprovalUsdc: params.paymentApprovalUnits === null ? 'unknown' : formatUnits(paymentApprovalUnits, 6),\n    paymentApprovalUnits,\n    minimumApprovalUnits: params.minimumApprovalUnits,\n    hasUsdc,\n    hasGas,\n    hasPaymentApproval,\n    needsPaymentApproval,\n    ready,\n    nextSteps: [],\n  }\n  return {\n    ...readiness,\n    nextSteps: readinessNextSteps(readiness),\n  }\n}\n\nexport async function getWalletReadiness(\n  account?: PaymentWalletAccount,\n  minimumApprovalUnits = DEFAULT_PAYMENT_APPROVAL_UNITS,\n): Promise<WalletReadiness> {\n  const wallet = account ?? await getWalletAccount()\n  const [balanceUsdc, balanceEth, paymentApprovalUnits] = await Promise.all([\n    getBalanceUsdc(wallet.address),\n    getBalanceEth(wallet.address),\n    getPaymentApprovalUnits(wallet.address),\n  ])\n  return buildWalletReadiness({\n    address: wallet.address,\n    balanceUsdc,\n    balanceEth,\n    paymentApprovalUnits,\n    minimumApprovalUnits,\n  })\n}\n\nexport function formatWalletReadiness(readiness: WalletReadiness, approval?: PaymentApprovalResult): string {\n  const status = readiness.ready ? 'Ready for paid Chain Insights Graph calls' : 'Action needed before paid Chain Insights Graph calls'\n  const setup = readiness.needsPaymentApproval\n    ? `Payment setup: needs one-time setup for up to ${formatUnits(readiness.minimumApprovalUnits, 6)} USDC of paid calls`\n    : 'Payment setup: ready'\n  const setupCompletedLine = approval?.status === 'approved'\n    ? 'Payment setup completed.'\n    : undefined\n  return [\n    status,\n    `Balance: ${readiness.balanceUsdc} USDC`,\n    `Gas: ${readiness.balanceEth} ETH on Base`,\n    setup,\n    setupCompletedLine,\n    'Payment network: Base',\n    `Address: ${readiness.address}`,\n    ...readiness.nextSteps.map((step) => `Next: ${step}`),\n  ].filter(Boolean).join('\\n')\n}\n\nexport async function approvePaymentAllowance(\n  account?: PaymentWalletAccount,\n  minimumApprovalUnits = DEFAULT_PAYMENT_APPROVAL_UNITS,\n  rpcUrl = process.env['BASE_RPC_URL'],\n): Promise<PaymentApprovalResult> {\n  const wallet = account ?? await getWalletAccount()\n  const initialApprovalUnits = await getPaymentApprovalUnits(wallet.address, rpcUrl)\n  if (initialApprovalUnits !== null && initialApprovalUnits >= minimumApprovalUnits) {\n    return {\n      status: 'already_ready',\n      paymentApprovalUnits: initialApprovalUnits,\n      minimumApprovalUnits,\n    }\n  }\n\n  const clientAccount = privateKeyToAccount(wallet.privateKey)\n  for (const url of baseRpcUrls(rpcUrl)) {\n    try {\n      const publicClient = createPublicClient({ chain: base, transport: http(url) })\n      const walletClient = createWalletClient({\n        account: clientAccount,\n        chain: base,\n        transport: http(url),\n      })\n      const txHash = await walletClient.writeContract({\n        address: USDC_ADDRESS,\n        abi: USDC_ABI,\n        functionName: 'approve',\n        args: [PERMIT2_ADDRESS, minimumApprovalUnits],\n      })\n      const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash })\n      if (receipt.status === 'reverted') {\n        throw new Error(`Payment setup transaction reverted: ${txHash}`)\n      }\n      const paymentApprovalUnits = await getPaymentApprovalUnits(wallet.address, url)\n      return {\n        status: 'approved',\n        txHash,\n        paymentApprovalUnits: paymentApprovalUnits ?? minimumApprovalUnits,\n        minimumApprovalUnits,\n      }\n    } catch (err) {\n      if (url === baseRpcUrls(rpcUrl).at(-1)) throw err\n    }\n  }\n\n  throw new Error('Unable to submit payment setup transaction on Base.')\n}\n\nexport async function prepareWalletForPaidCalls(options: PrepareWalletOptions = {}): Promise<PrepareWalletResult> {\n  const minimumApprovalUnits = options.minimumApprovalUnits ?? DEFAULT_PAYMENT_APPROVAL_UNITS\n  if (options.maxApprovalUnits !== undefined && minimumApprovalUnits > options.maxApprovalUnits) {\n    const requested = formatUnits(minimumApprovalUnits, 6)\n    throw new Error(\n      `Requested payment approval of ${requested} USDC exceeds the automatic payment-approval ceiling ` +\n      `of ${formatUnits(options.maxApprovalUnits, 6)} USDC. If this amount is expected, approve it deliberately with ` +\n      `\\`chain-insights wallet ready --payment-usdc ${requested}\\`, or raise the ceiling via ` +\n      `CHAIN_INSIGHTS_MAX_AUTO_APPROVAL_USDC.`,\n    )\n  }\n  const wallet = options.account ?? await getWalletAccount()\n  const readiness = await getWalletReadiness(wallet, minimumApprovalUnits)\n\n  if (!readiness.needsPaymentApproval) {\n    return {\n      readiness,\n      approval: {\n        status: 'already_ready',\n        paymentApprovalUnits: readiness.paymentApprovalUnits,\n        minimumApprovalUnits,\n      },\n    }\n  }\n  if (options.approve === false || readiness.hasGas === false) {\n    return { readiness }\n  }\n\n  const approval = await approvePaymentAllowance(wallet, minimumApprovalUnits, options.rpcUrl)\n  const updatedReadiness = buildWalletReadiness({\n    address: wallet.address,\n    balanceUsdc: readiness.balanceUsdc,\n    balanceEth: readiness.balanceEth,\n    paymentApprovalUnits: approval.paymentApprovalUnits,\n    minimumApprovalUnits,\n  })\n  return { readiness: updatedReadiness, approval }\n}\n\nexport function formatWalletBalance(address: string, balanceUsdc: string, balanceEth?: string): string {\n  return [\n    `Payment wallet: ${address}`,\n    `USDC on Base: ${balanceUsdc}`,\n    balanceEth === undefined ? undefined : `Gas on Base: ${balanceEth} ETH`,\n    'Payment network: Base',\n    'Base ETH is used only for one-time payment setup gas.',\n  ].filter(Boolean).join('\\n')\n}\n\nexport async function getWalletBalanceResult(account?: PaymentWalletAccount): Promise<WalletBalanceResult> {\n  const wallet = account ?? await getWalletAccount()\n  const [balanceUsdc, balanceEth] = await Promise.all([\n    getBalanceUsdc(wallet.address),\n    getBalanceEth(wallet.address),\n  ])\n  return {\n    schema: 'chain-insights.result.v1',\n    tool: 'wallet_balance',\n    hint: null,\n    facts: {\n      wallet: {\n        address: wallet.address,\n        payment_network: 'base',\n        payment_network_display: 'Base',\n        chain_id: BASE_CHAIN_ID,\n        token: 'USDC',\n        token_balance: balanceUsdc,\n        gas_token: 'ETH',\n        ...(balanceEth === undefined ? {} : { gas_balance: balanceEth }),\n      },\n    },\n  }\n}\n\nexport function formatWalletBalanceResult(result: WalletBalanceResult): string {\n  const wallet = result.facts.wallet\n  return formatWalletBalance(wallet.address, wallet.token_balance, wallet.gas_balance)\n}\n\nexport async function getWalletBalanceText(account?: PaymentWalletAccount): Promise<string> {\n  return formatWalletBalanceResult(await getWalletBalanceResult(account))\n}\n\nexport function buildTopupInfo(address: string, topupUrl?: string): TopupInfo {\n  return {\n    wallet_address: address,\n    network: 'Base',\n    chain_id: BASE_CHAIN_ID,\n    token: 'USDC',\n    token_contract: USDC_ADDRESS,\n    ...(topupUrl ? { topup_url: topupUrl } : {}),\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAa,gBAAgB;AAC7B,MAAa,eAAe;AAC5B,MAAa,kBAAkB;AAC/B,MAAa,uBAAuB;AACpC,MAAa,iCAAiC;AAO9C,MAAa,kCAAkC;AAC/C,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;AACF;AAEA,MAAM,WAAW;CACf;EACE,MAAM;EACN,MAAM;EACN,iBAAiB;EACjB,QAAQ,CAAC;GAAE,MAAM;GAAW,MAAM;EAAU,CAAC;EAC7C,SAAS,CAAC;GAAE,MAAM;GAAI,MAAM;EAAU,CAAC;CACzC;CACA;EACE,MAAM;EACN,MAAM;EACN,iBAAiB;EACjB,QAAQ,CACN;GAAE,MAAM;GAAS,MAAM;EAAU,GACjC;GAAE,MAAM;GAAW,MAAM;EAAU,CACrC;EACA,SAAS,CAAC;GAAE,MAAM;GAAI,MAAM;EAAU,CAAC;CACzC;CACA;EACE,MAAM;EACN,MAAM;EACN,iBAAiB;EACjB,QAAQ,CACN;GAAE,MAAM;GAAW,MAAM;EAAU,GACnC;GAAE,MAAM;GAAU,MAAM;EAAU,CACpC;EACA,SAAS,CAAC;GAAE,MAAM;GAAI,MAAM;EAAO,CAAC;CACtC;AACF;;;;;;AA2DA,SAAgB,4BAA4B,MAAyB,QAAQ,KAAa;CACxF,MAAM,MAAM,IAAI,wCAAwC,EAAE,KAAK;CAC/D,IAAI,CAAC,KAAK,OAAO;CACjB,OAAO,0BAA0B,GAAG;AACtC;AAsBA,eAAsB,mBAAkD;CACtE,MAAM,aAAa,0BAA0B,MAAM,WAAW,CAAC;CAE/D,OAAO;EAAE,SADO,oBAAoB,UACZ,CAAC,CAAC;EAAS;CAAW;AAChD;AAEA,SAAS,YAAY,SAAS,QAAQ,IAAI,iBAA2B;CACnE,OAAO,CACL,GAAI,SAAS,CAAC,MAAM,IAAI,CAAC,GACzB,GAAG,qBAAqB,QAAQ,gBAAgB,gBAAgB,MAAM,CACxE;AACF;AAEA,eAAsB,eACpB,SACA,SAAS,QAAQ,IAAI,iBACJ;CACjB,KAAK,MAAM,OAAO,YAAY,MAAM,GAClC,IAAI;EAWF,OAAO,YAAY,MAVJ,mBAAmB;GAChC,OAAO;GACP,WAAW,KAAK,GAAG;EACrB,CAC2B,CAAC,CAAC,aAAa;GACxC,SAAS;GACT,KAAK;GACL,cAAc;GACd,MAAM,CAAC,OAAkB;EAC3B,CAAC,GAC2B,CAAC;CAC/B,QAAQ,CAER;CAGF,OAAO;AACT;AAEA,eAAsB,cACpB,SACA,SAAS,QAAQ,IAAI,iBACJ;CACjB,KAAK,MAAM,OAAO,YAAY,MAAM,GAClC,IAAI;EAMF,OAAO,YAAY,MALJ,mBAAmB;GAChC,OAAO;GACP,WAAW,KAAK,GAAG;EACrB,CAC2B,CAAC,CAAC,WAAW,EAAW,QAAmB,CAAC,CAC7C;CAC5B,QAAQ,CAER;CAGF,OAAO;AACT;AAEA,eAAsB,wBACpB,SACA,SAAS,QAAQ,IAAI,iBACG;CACxB,KAAK,MAAM,OAAO,YAAY,MAAM,GAClC,IAAI;EAKF,OAAO,MAJQ,mBAAmB;GAChC,OAAO;GACP,WAAW,KAAK,GAAG;EACrB,CACkB,CAAC,CAAC,aAAa;GAC/B,SAAS;GACT,KAAK;GACL,cAAc;GACd,MAAM,CAAC,SAAoB,eAAe;EAC5C,CAAC;CACH,QAAQ,CAER;CAGF,OAAO;AACT;AAUA,SAAgB,0BAA0B,YAA4B;CACpE,MAAM,UAAU,WAAW,KAAK;CAChC,IAAI,CAAC,oBAAoB,KAAK,OAAO,KAAK,CAAC,kBAAkB,OAAO,GAClE,MAAM,IAAI,MAAM,2EAA2E;CAE7F,OAAO,WAAW,SAAS,CAAC;AAC9B;AAEA,SAAS,kBAAkB,OAAwB;CACjD,IAAI,UAAU,WAAW,OAAO;CAChC,MAAM,SAAS,OAAO,WAAW,KAAK;CACtC,OAAO,OAAO,SAAS,MAAM,KAAK,SAAS;AAC7C;AAEA,SAAS,cAAc,OAA+B;CACpD,OAAO,UAAU,YAAY,OAAO,kBAAkB,KAAK;AAC7D;AAEA,SAAS,mBAAmB,WAA2F;CACrH,MAAM,YAAsB,CAAC;CAC7B,IAAI,UAAU,YAAY,OACxB,UAAU,KAAK,yEAAyE;CAE1F,IAAI,UAAU,YAAY,MACxB,UAAU,KAAK,qGAAqG;CAEtH,IAAI,UAAU,wBAAwB,UAAU,WAAW,OACzD,UAAU,KAAK,uEAAuE;CAExF,IAAI,UAAU,wBAAwB,UAAU,WAAW,OACzD,UAAU,KAAK,yEAAyE;CAE1F,IAAI,UAAU,WAAW,MACvB,UAAU,KAAK,wGAAwG;CAEzH,OAAO;AACT;AAEA,SAAS,qBAAqB,QAMV;CAClB,MAAM,uBAAuB,OAAO,wBAAwB;CAC5D,MAAM,UAAU,cAAc,OAAO,WAAW;CAChD,MAAM,SAAS,cAAc,OAAO,UAAU;CAC9C,MAAM,qBAAqB,wBAAwB,OAAO;CAC1D,MAAM,uBAAuB,CAAC;CAC9B,MAAM,QAAQ,YAAY,SAAS;CACnC,MAAM,YAAY;EAChB,SAAS,OAAO;EAChB,aAAa,OAAO;EACpB,YAAY,OAAO;EACnB,qBAAqB,OAAO,yBAAyB,OAAO,YAAY,YAAY,sBAAsB,CAAC;EAC3G;EACA,sBAAsB,OAAO;EAC7B;EACA;EACA;EACA;EACA;EACA,WAAW,CAAC;CACd;CACA,OAAO;EACL,GAAG;EACH,WAAW,mBAAmB,SAAS;CACzC;AACF;AAEA,eAAsB,mBACpB,SACA,uBAAuB,gCACG;CAC1B,MAAM,SAAS,WAAW,MAAM,iBAAiB;CACjD,MAAM,CAAC,aAAa,YAAY,wBAAwB,MAAM,QAAQ,IAAI;EACxE,eAAe,OAAO,OAAO;EAC7B,cAAc,OAAO,OAAO;EAC5B,wBAAwB,OAAO,OAAO;CACxC,CAAC;CACD,OAAO,qBAAqB;EAC1B,SAAS,OAAO;EAChB;EACA;EACA;EACA;CACF,CAAC;AACH;AAEA,SAAgB,sBAAsB,WAA4B,UAA0C;CAC1G,MAAM,SAAS,UAAU,QAAQ,8CAA8C;CAC/E,MAAM,QAAQ,UAAU,uBACpB,iDAAiD,YAAY,UAAU,sBAAsB,CAAC,EAAE,uBAChG;CACJ,MAAM,qBAAqB,UAAU,WAAW,aAC5C,6BACA,KAAA;CACJ,OAAO;EACL;EACA,YAAY,UAAU,YAAY;EAClC,QAAQ,UAAU,WAAW;EAC7B;EACA;EACA;EACA,YAAY,UAAU;EACtB,GAAG,UAAU,UAAU,KAAK,SAAS,SAAS,MAAM;CACtD,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI;AAC7B;AAEA,eAAsB,wBACpB,SACA,uBAAuB,gCACvB,SAAS,QAAQ,IAAI,iBACW;CAChC,MAAM,SAAS,WAAW,MAAM,iBAAiB;CACjD,MAAM,uBAAuB,MAAM,wBAAwB,OAAO,SAAS,MAAM;CACjF,IAAI,yBAAyB,QAAQ,wBAAwB,sBAC3D,OAAO;EACL,QAAQ;EACR,sBAAsB;EACtB;CACF;CAGF,MAAM,gBAAgB,oBAAoB,OAAO,UAAU;CAC3D,KAAK,MAAM,OAAO,YAAY,MAAM,GAClC,IAAI;EACF,MAAM,eAAe,mBAAmB;GAAE,OAAO;GAAM,WAAW,KAAK,GAAG;EAAE,CAAC;EAM7E,MAAM,SAAS,MALM,mBAAmB;GACtC,SAAS;GACT,OAAO;GACP,WAAW,KAAK,GAAG;EACrB,CACgC,CAAC,CAAC,cAAc;GAC9C,SAAS;GACT,KAAK;GACL,cAAc;GACd,MAAM,CAAC,iBAAiB,oBAAoB;EAC9C,CAAC;EAED,KAAI,MADkB,aAAa,0BAA0B,EAAE,MAAM,OAAO,CAAC,EAAA,CACjE,WAAW,YACrB,MAAM,IAAI,MAAM,uCAAuC,QAAQ;EAGjE,OAAO;GACL,QAAQ;GACR;GACA,sBAAsB,MAJW,wBAAwB,OAAO,SAAS,GAAG,KAI9B;GAC9C;EACF;CACF,SAAS,KAAK;EACZ,IAAI,QAAQ,YAAY,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM;CAChD;CAGF,MAAM,IAAI,MAAM,qDAAqD;AACvE;AAEA,eAAsB,0BAA0B,UAAgC,CAAC,GAAiC;CAChH,MAAM,uBAAuB,QAAQ,wBAAA;CACrC,IAAI,QAAQ,qBAAqB,KAAA,KAAa,uBAAuB,QAAQ,kBAAkB;EAC7F,MAAM,YAAY,YAAY,sBAAsB,CAAC;EACrD,MAAM,IAAI,MACR,iCAAiC,UAAU,0DACrC,YAAY,QAAQ,kBAAkB,CAAC,EAAE,+GACC,UAAU,oEAE5D;CACF;CACA,MAAM,SAAS,QAAQ,WAAW,MAAM,iBAAiB;CACzD,MAAM,YAAY,MAAM,mBAAmB,QAAQ,oBAAoB;CAEvE,IAAI,CAAC,UAAU,sBACb,OAAO;EACL;EACA,UAAU;GACR,QAAQ;GACR,sBAAsB,UAAU;GAChC;EACF;CACF;CAEF,IAAI,QAAQ,YAAY,SAAS,UAAU,WAAW,OACpD,OAAO,EAAE,UAAU;CAGrB,MAAM,WAAW,MAAM,wBAAwB,QAAQ,sBAAsB,QAAQ,MAAM;CAQ3F,OAAO;EAAE,WAPgB,qBAAqB;GAC5C,SAAS,OAAO;GAChB,aAAa,UAAU;GACvB,YAAY,UAAU;GACtB,sBAAsB,SAAS;GAC/B;EACF,CACmC;EAAG;CAAS;AACjD;AAEA,SAAgB,oBAAoB,SAAiB,aAAqB,YAA6B;CACrG,OAAO;EACL,mBAAmB;EACnB,iBAAiB;EACjB,eAAe,KAAA,IAAY,KAAA,IAAY,gBAAgB,WAAW;EAClE;EACA;CACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI;AAC7B;AAEA,eAAsB,uBAAuB,SAA8D;CACzG,MAAM,SAAS,WAAW,MAAM,iBAAiB;CACjD,MAAM,CAAC,aAAa,cAAc,MAAM,QAAQ,IAAI,CAClD,eAAe,OAAO,OAAO,GAC7B,cAAc,OAAO,OAAO,CAC9B,CAAC;CACD,OAAO;EACL,QAAQ;EACR,MAAM;EACN,MAAM;EACN,OAAO,EACL,QAAQ;GACN,SAAS,OAAO;GAChB,iBAAiB;GACjB,yBAAyB;GACzB,UAAU;GACV,OAAO;GACP,eAAe;GACf,WAAW;GACX,GAAI,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,WAAW;EAChE,EACF;CACF;AACF;AAEA,SAAgB,0BAA0B,QAAqC;CAC7E,MAAM,SAAS,OAAO,MAAM;CAC5B,OAAO,oBAAoB,OAAO,SAAS,OAAO,eAAe,OAAO,WAAW;AACrF;AAEA,eAAsB,qBAAqB,SAAiD;CAC1F,OAAO,0BAA0B,MAAM,uBAAuB,OAAO,CAAC;AACxE;AAEA,SAAgB,eAAe,SAAiB,UAA8B;CAC5E,OAAO;EACL,gBAAgB;EAChB,SAAS;EACT,UAAU;EACV,OAAO;EACP,gBAAgB;EAChB,GAAI,WAAW,EAAE,WAAW,SAAS,IAAI,CAAC;CAC5C;AACF"}