{"version":3,"sources":["../src/ows/wallet.ts","../src/transactor.ts","../src/faucet.ts","../src/ows/caip2.ts","../src/ows/cli-driver.ts","../src/ows/lifecycle.ts","../src/config.ts","../src/detect.ts","../src/analytics.ts","../src/adapters/x402.ts","../src/adapters/mpp.ts","../src/goat/auth.ts","../src/goat/types.ts","../src/goat/client.ts","../src/adapters/goat.ts","../src/xrpl/utils.ts","../src/xrpl/x402-scheme.ts","../src/xrpl/payments.ts","../src/adapters/xrpl.ts","../src/xrpl/connection.ts","../src/xrpl/wallet.ts","../src/xrpl/vault.ts","../src/xrpl/swap.ts","../src/xrpl/treasury.ts","../src/stellar/kya.ts","../src/adapters/stellar-x402.ts","../src/adapters/stellar-mpp.ts","../src/stellar/signer.ts","../src/stellar/channels-client.ts","../src/stellar/session.ts","../src/goat/lending.ts","../src/goat/paths.ts","../src/goat/acquisition.ts","../src/adapters/circle-gateway.ts","../src/adapters/solana-x402.ts","../src/morph/eip3009.ts","../src/adapters/morph-x402.ts","../src/morph/auth.ts","../src/morph/client.ts","../src/flare/x402.ts","../src/policy/index.ts","../src/aave/client.ts","../src/aave/yield.ts","../src/aave/gho.ts","../src/aave/vault.ts","../src/aave/flash.ts","../src/aave/delegation.ts","../src/aave/index.ts","../src/adapters/aave-gho.ts","../src/wormhole/deployments.ts","../src/wormhole/ntt-client.ts","../src/adapters/wormhole-ntt.ts","../src/initia/assets.ts","../src/initia/client.ts","../src/adapters/initia-iusd.ts","../src/celo/fee-abstraction.ts","../src/adapters/celo-fee-abstracted.ts","../src/celo/agent-visa.ts","../src/client.ts","../src/middleware.ts","../src/goat/identity.ts","../src/bazaar/mock-catalog.ts","../src/bazaar/client.ts","../src/offramp/client.ts","../src/offramp/mock-moonpay.ts","../src/stellar/assets.ts","../src/offramp/stellar-anchor.ts","../src/stellar/wallet.ts","../src/stellar/trustless-work.ts","../src/stellar/escrow-manager.ts","../src/stellar/asset-router.ts","../src/xrpl/oracle.ts","../src/xrpl/client.ts","../src/agent/escrow.ts","../src/agent/reputation-router.ts","../src/agent/delegation.ts","../src/agent/client.ts","../src/agent/card.ts","../src/settlement/index.ts","../src/ap2/index.ts","../src/morph/facilitator.ts","../src/flare/client.ts","../src/flare/abis.ts","../src/flare/state.ts","../src/flare/direct-minting.ts","../src/flare/bridge.ts","../src/flare/gasless.ts","../src/payrouter/corridor.ts","../src/initia/corridor.ts","../src/adapters/rlusd-exact.ts","../src/celo/mento.ts","../src/celo/mento-broker.ts"],"sourcesContent":["/**\n * OWSWallet — CAIP-2-native multichain wallet (v0.27).\n *\n * Back-compat: every v0.25 method signature is preserved exactly. New CAIP-2\n * methods are added as TypeScript overloads on the same names — runtime\n * dispatch via `typeof` keeps the legacy `(tx, chainId: number)` path sync\n * and EVM-only while routing string CAIP-2 args through the multi-family\n * driver.\n *\n * SOLID:\n *   • S — single class, single responsibility (sign / send for the configured wallet name).\n *   • O — adding a chain family means adding a row to caip2.ts; no edits here.\n *   • L — legacy and CAIP-2 paths return values of the same shape (txHash, signature).\n *   • I — implements the `Signer` interface from types.ts on the CAIP-2 path.\n *   • D — depends on the OWSDriver interface, not on `@open-wallet-standard/core` directly.\n */\n\nimport { privateKeyToAccount } from 'viem/accounts';\nimport type { Hex, TypedData, TypedDataDomain } from 'viem';\nimport { ViemTransactor } from '../transactor.js';\nimport type { ChainConfig } from '../types.js';\nimport { CHAINS } from '../chains.js';\nimport { NPaymentError } from '../errors.js';\nimport { owsError } from '../errors.js';\nimport { resolveFamily, resolveSpec, extractEvmChainId } from './caip2.js';\nimport { createOWSDriver, type OWSDriver } from './cli-driver.js';\nimport type { OWSConfig, OWSSignResult, SignedTx, ChainFamily } from './types.js';\n\nexport interface TransactionRequest {\n  to: string;\n  value?: string;\n  data?: string;\n}\n\nexport class OWSWallet {\n  /** Wallet name as registered in the OWS vault (`~/.ows/wallets/<uuid>/meta.json`). */\n  public readonly walletName: string;\n\n  private readonly privateKey?: Hex;\n  private readonly autoFaucet?: boolean;\n  private readonly transactors = new Map<number, ViemTransactor>();\n  private driver: OWSDriver | null = null;\n  private readonly driverReady: Promise<void>;\n\n  constructor(config: OWSConfig) {\n    this.walletName = config.wallet;\n    this.privateKey = config.privateKey as Hex | undefined;\n    this.autoFaucet = config.autoFaucet;\n    this.driverReady = createOWSDriver(config.cliPath).then((d) => {\n      this.driver = d;\n    });\n  }\n\n  // ─── Internal helpers ────────────────────────────────────────────────────\n\n  private async ensureReady(): Promise<void> {\n    await this.driverReady;\n  }\n\n  private getTransactor(chainId: number): ViemTransactor {\n    if (!this.privateKey) {\n      throw owsError('OWS_SDK_NOT_INSTALLED', 'No privateKey configured and OWS Node SDK not resolvable');\n    }\n    let t = this.transactors.get(chainId);\n    if (!t) {\n      const chain = Object.values(CHAINS).find((c: ChainConfig) => c.chainId === chainId);\n      if (!chain) throw new NPaymentError(`Chain ${chainId} not found`, 'CHAIN_NOT_FOUND');\n      t = new ViemTransactor(chain, this.privateKey, this.autoFaucet);\n      this.transactors.set(chainId, t);\n    }\n    return t;\n  }\n\n  private async requireDriver(family: ChainFamily): Promise<OWSDriver> {\n    await this.ensureReady();\n    if (!this.driver) {\n      throw owsError(\n        'OWS_SDK_NOT_INSTALLED',\n        `OWS-native required for family \"${family}\"; legacy privateKey path supports EVM only`,\n      );\n    }\n    return this.driver;\n  }\n\n  // ─── getAddress (overloaded) ─────────────────────────────────────────────\n\n  /** v0.25 sync EVM path — privateKey-derived address. */\n  getAddress(chainId: number): string;\n  /** v0.27 CAIP-2 path — async, multi-family. */\n  getAddress(caip2: string): Promise<string>;\n  getAddress(chainOrCaip2: number | string): string | Promise<string> {\n    if (typeof chainOrCaip2 === 'number') {\n      // Legacy: returns sync via privateKey if no driver yet, or sync-fallback ''.\n      if (this.driver) return ''; // sync fallback when driver active — caller should use getAddressAsync\n      return this.getTransactor(chainOrCaip2).getAddress();\n    }\n    return this.getAddressForCaip2(chainOrCaip2);\n  }\n\n  /** v0.25 async EVM path — preserved. */\n  async getAddressAsync(chainId: number): Promise<string> {\n    await this.ensureReady();\n    if (this.driver) return this.driver.getAddress(this.walletName, chainId);\n    return this.getTransactor(chainId).getAddress();\n  }\n\n  private async getAddressForCaip2(caip2: string): Promise<string> {\n    const family = resolveFamily(caip2);\n    // EVM short-circuit: if we have a privateKey and no driver, derive locally.\n    if (family === 'evm' && this.privateKey && !this.driver) {\n      const chainId = extractEvmChainId(caip2);\n      if (chainId === null) throw owsError('OWS_INVALID_CAIP2', `EVM CAIP-2 must include numeric chainId: ${caip2}`);\n      return this.getTransactor(chainId).getAddress();\n    }\n    const driver = await this.requireDriver(family);\n    return driver.getAddressForCaip2(this.walletName, caip2);\n  }\n\n  // ─── getBalance (legacy only — CAIP-2 balance is family-specific, deferred) ─\n\n  async getBalance(token: string, chainId: number): Promise<bigint> {\n    await this.ensureReady();\n    if (this.driver) return this.driver.getBalance(this.walletName, chainId, token);\n    return this.getTransactor(chainId).getTokenBalance(this.getTransactor(chainId).getAddress(), token);\n  }\n\n  // ─── signTransaction (overloaded) ────────────────────────────────────────\n\n  /** v0.25 EVM signed-and-broadcast path. */\n  signTransaction(tx: TransactionRequest, chainId: number): Promise<OWSSignResult>;\n  /** v0.27 CAIP-2 signed-and-broadcast path. */\n  signTransaction(tx: unknown, caip2: string): Promise<SignedTx>;\n  async signTransaction(tx: unknown, chain: number | string): Promise<OWSSignResult | SignedTx> {\n    if (typeof chain === 'number') {\n      await this.ensureReady();\n      const reqTx = tx as TransactionRequest;\n      if (this.driver) {\n        const txHash = await this.driver.signTransaction(this.walletName, chain, reqTx);\n        return { txHash, blockNumber: 0n };\n      }\n      const result = await this.getTransactor(chain).sendTransaction({\n        to: reqTx.to,\n        value: reqTx.value ? BigInt(reqTx.value) : undefined,\n        data: reqTx.data,\n      });\n      return { txHash: result.txHash, blockNumber: result.blockNumber };\n    }\n    return this.signAndSend(chain, tx);\n  }\n\n  // ─── transferERC20 (overloaded for back-compat with chain-string) ───────\n\n  /** v0.25 ERC-20 transfer. */\n  transferERC20(to: string, token: string, amount: bigint, chainId: number): Promise<OWSSignResult>;\n  /** v0.27 CAIP-2 ERC-20 transfer (still EVM-only — non-EVM chains use chain-specific adapters). */\n  transferERC20(to: string, token: string, amount: bigint, caip2: string): Promise<SignedTx>;\n  async transferERC20(to: string, token: string, amount: bigint, chain: number | string): Promise<OWSSignResult | SignedTx> {\n    if (typeof chain === 'number') {\n      await this.ensureReady();\n      if (this.driver) {\n        const txHash = await this.driver.transferERC20(this.walletName, chain, to, token, amount);\n        return { txHash, blockNumber: 0n };\n      }\n      const result = await this.getTransactor(chain).transferERC20(to, token, amount);\n      return { txHash: result.txHash, blockNumber: result.blockNumber };\n    }\n    const family = resolveFamily(chain);\n    if (family !== 'evm') {\n      throw owsError('OWS_FAMILY_PARTIAL', `transferERC20 is EVM-only; got family ${family} for ${chain}`);\n    }\n    const chainId = extractEvmChainId(chain);\n    if (chainId === null) throw owsError('OWS_INVALID_CAIP2', `EVM CAIP-2 must include numeric chainId: ${chain}`);\n    return this.transferERC20(to, token, amount, chainId);\n  }\n\n  // ─── signMessage (overloaded) ────────────────────────────────────────────\n\n  /** v0.25 EIP-191 EVM message signing via privateKey or driver. */\n  signMessage(message: string): Promise<string>;\n  /** v0.27 CAIP-2 message signing across all 11 families. */\n  signMessage(caip2: string, message: string): Promise<string>;\n  async signMessage(arg1: string, arg2?: string): Promise<string> {\n    if (arg2 === undefined) {\n      // Legacy single-arg path — EVM EIP-191\n      await this.ensureReady();\n      if (this.driver) return this.driver.signMessage(this.walletName, arg1);\n      if (!this.privateKey) throw owsError('OWS_SDK_NOT_INSTALLED');\n      const account = privateKeyToAccount(this.privateKey);\n      return account.signMessage({ message: arg1 });\n    }\n    // CAIP-2 path\n    const family = resolveFamily(arg1);\n    if (family === 'evm' && this.privateKey && !this.driver) {\n      const account = privateKeyToAccount(this.privateKey);\n      return account.signMessage({ message: arg2 });\n    }\n    const driver = await this.requireDriver(family);\n    return driver.signMessageForCaip2(this.walletName, arg1, arg2);\n  }\n\n  // ─── signAndSend (new, CAIP-2-only) ──────────────────────────────────────\n\n  async signAndSend(caip2: string, txPayload: unknown): Promise<SignedTx> {\n    const family = resolveFamily(caip2);\n    // EVM legacy short-circuit: if we have a privateKey and no driver, fall through to viem.\n    if (family === 'evm' && this.privateKey && !this.driver) {\n      const chainId = extractEvmChainId(caip2);\n      if (chainId === null) throw owsError('OWS_INVALID_CAIP2', `EVM CAIP-2 must include numeric chainId: ${caip2}`);\n      const reqTx = txPayload as TransactionRequest;\n      const result = await this.getTransactor(chainId).sendTransaction({\n        to: reqTx.to,\n        value: reqTx.value ? BigInt(reqTx.value) : undefined,\n        data: reqTx.data,\n      });\n      return { txHash: result.txHash, blockNumber: result.blockNumber, family };\n    }\n    const driver = await this.requireDriver(family);\n    return driver.signAndSendForCaip2(this.walletName, caip2, txPayload);\n  }\n\n  // ─── transfer (new, CAIP-2-keyed convenience over signAndSend) ──────────\n\n  async transfer(caip2: string, to: string, asset: string, amount: bigint): Promise<SignedTx> {\n    const family = resolveFamily(caip2);\n    if (family === 'evm') {\n      const chainId = extractEvmChainId(caip2);\n      if (chainId === null) throw owsError('OWS_INVALID_CAIP2', `EVM CAIP-2 must include numeric chainId: ${caip2}`);\n      const result = await this.transferERC20(to, asset, amount, chainId);\n      return { txHash: result.txHash, blockNumber: result.blockNumber, family };\n    }\n    // Non-EVM: caller passes an already-encoded family-native payload via\n    // signAndSend. transfer() at this layer is a convenience for EVM only —\n    // chain-specific adapters (xrpl, solana, cosmos) handle native transfers.\n    throw owsError(\n      'OWS_FAMILY_PARTIAL',\n      `transfer() is EVM-only convenience; for ${family} use the chain-specific adapter or signAndSend directly`,\n    );\n  }\n\n  // ─── signTypedData (EVM only — preserved) ────────────────────────────────\n\n  /**\n   * Sign EIP-712 typed data. EVM-only. Used for EIP-3009 sponsored payments.\n   * OWS driver path requires native EIP-712 in the SDK (still partial in v1.3.2);\n   * for now, callers using sponsored mode must supply ows.privateKey.\n   */\n  async signTypedData<T extends TypedData>(params: {\n    domain: TypedDataDomain;\n    types: T;\n    primaryType: keyof T extends string ? keyof T : never;\n    message: Record<string, unknown>;\n  }): Promise<Hex> {\n    await this.ensureReady();\n    if (!this.privateKey) {\n      throw new NPaymentError(\n        'signTypedData requires ows.privateKey (OWS driver EIP-712 path not yet wired)',\n        'NO_TYPED_DATA_SIGNER',\n        'Pass ows: { privateKey: \"0x...\" } when using EIP-3009 sponsored payments.',\n      );\n    }\n    const account = privateKeyToAccount(this.privateKey);\n    return account.signTypedData({\n      domain: params.domain,\n      types: params.types,\n      primaryType: params.primaryType as string,\n      message: params.message,\n    } as Parameters<typeof account.signTypedData>[0]);\n  }\n\n  // ─── Misc preserved methods ──────────────────────────────────────────────\n\n  async payX402(_url: string, _method?: string): Promise<string> {\n    throw new NPaymentError('payX402 requires direct adapter usage', 'NOT_IMPLEMENTED');\n  }\n\n  /** Returns a viem LocalAccount if privateKey is available, null otherwise. */\n  getAccount(): ReturnType<typeof privateKeyToAccount> | null {\n    if (!this.privateKey) return null;\n    return privateKeyToAccount(this.privateKey);\n  }\n\n  /** Resolve the OWS chain family for a CAIP-2 — exposed for adapter layers. */\n  resolveFamily(caip2: string): ChainFamily {\n    return resolveFamily(caip2);\n  }\n\n  /** Inspect the family spec (curve, slip44, derivation path) for a CAIP-2. */\n  resolveSpec(caip2: string) {\n    return resolveSpec(caip2);\n  }\n}\n\n// ─── Aliased export — v0.27 introduces the camelCase `OwsWallet` alongside ───\n//                     the legacy `OWSWallet`. Both names point to the same class.\nexport { OWSWallet as OwsWallet };\n","import { createPublicClient, createWalletClient, defineChain, http, type Hex } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport type { ChainConfig } from './types.js';\nimport { TestnetFaucet } from './faucet.js';\n\nexport type TransactionResult = { txHash: string; blockNumber: bigint };\n\nconst erc20Abi = [\n  { name: 'balanceOf', type: 'function', stateMutability: 'view', inputs: [{ name: 'owner', type: 'address' }], outputs: [{ name: '', type: 'uint256' }] },\n  { name: 'transfer', type: 'function', stateMutability: 'nonpayable', inputs: [{ name: 'to', type: 'address' }, { name: 'amount', type: 'uint256' }], outputs: [{ name: '', type: 'bool' }] },\n] as const;\n\nexport class ViemTransactor {\n  private publicClient;\n  private walletClient;\n  private account;\n  private faucet?: TestnetFaucet;\n\n  constructor(chainConfig: ChainConfig, privateKey: Hex, autoFaucet?: boolean) {\n    const chain = defineChain({ id: chainConfig.chainId, name: `chain-${chainConfig.chainId}`, nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 }, rpcUrls: { default: { http: [chainConfig.rpcUrl] } } });\n    this.account = privateKeyToAccount(privateKey);\n    this.publicClient = createPublicClient({ chain, transport: http(chainConfig.rpcUrl) });\n    this.walletClient = createWalletClient({ account: this.account, chain, transport: http(chainConfig.rpcUrl) });\n    if (autoFaucet) this.faucet = new TestnetFaucet(chainConfig);\n  }\n\n  getAddress(): string {\n    return this.account.address;\n  }\n\n  async getTokenBalance(owner: string, token: string): Promise<bigint> {\n    return this.publicClient.readContract({ address: token as `0x${string}`, abi: erc20Abi, functionName: 'balanceOf', args: [owner as `0x${string}`] });\n  }\n\n  async transferERC20(to: string, token: string, amount: bigint): Promise<TransactionResult> {\n    await this.faucet?.ensureFunded(this.account.address, token);\n    const txHash = await this.walletClient.writeContract({ address: token as `0x${string}`, abi: erc20Abi, functionName: 'transfer', args: [to as `0x${string}`, amount] });\n    const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n    return { txHash, blockNumber: receipt.blockNumber };\n  }\n\n  async sendTransaction(tx: { to: string; value?: bigint; data?: string }): Promise<TransactionResult> {\n    const txHash = await this.walletClient.sendTransaction({ to: tx.to as `0x${string}`, value: tx.value, data: tx.data as `0x${string}` | undefined });\n    const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n    return { txHash, blockNumber: receipt.blockNumber };\n  }\n}\n","import { createWalletClient, createPublicClient, defineChain, http, parseEther, type Hex } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport type { ChainConfig } from './types.js';\n\nconst FUNDER_KEY: Hex | undefined = process.env.N_PAYMENT_FAUCET_KEY as Hex | undefined;\nconst MIN_GAS = parseEther('0.001');\n\nexport class TestnetFaucet {\n  private chainConfig: ChainConfig;\n\n  constructor(chainConfig: ChainConfig) {\n    this.chainConfig = chainConfig;\n  }\n\n  isTestnet(): boolean {\n    return this.chainConfig.name.toLowerCase().includes('sepolia') ||\n           this.chainConfig.name.toLowerCase().includes('testnet');\n  }\n\n  async fundGasIfNeeded(recipient: string): Promise<void> {\n    if (!this.isTestnet()) return;\n    if (!FUNDER_KEY) return; // No funder key configured — skip silently\n    const chain = defineChain({ id: this.chainConfig.chainId, name: this.chainConfig.name, nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 }, rpcUrls: { default: { http: [this.chainConfig.rpcUrl] } } });\n    const pub = createPublicClient({ chain, transport: http(this.chainConfig.rpcUrl) });\n    const balance = await pub.getBalance({ address: recipient as `0x${string}` });\n    if (balance >= MIN_GAS) return;\n\n    const funder = privateKeyToAccount(FUNDER_KEY);\n    const wc = createWalletClient({ account: funder, chain, transport: http(this.chainConfig.rpcUrl) });\n    const hash = await wc.sendTransaction({ to: recipient as `0x${string}`, value: parseEther('0.005') });\n    await pub.waitForTransactionReceipt({ hash });\n  }\n\n  async fundUsdcIfNeeded(recipient: string, token: string): Promise<void> {\n    if (!this.isTestnet()) return;\n    if (!token || token === '0x0000000000000000000000000000000000000000') return;\n    const chainName = this.getCircleChainName();\n    if (!chainName) return;\n    try {\n      const res = await fetch('https://faucet.circle.com/api/drip', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ address: recipient, chain: chainName, amount: '10000000' }),\n      });\n      if (!res.ok) console.warn(`[n-payment] USDC faucet: ${res.status}`);\n    } catch { console.warn('[n-payment] USDC faucet unavailable'); }\n  }\n\n  private getCircleChainName(): string | null {\n    if (this.chainConfig.chainId === 84532) return 'BASE-SEPOLIA';\n    if (this.chainConfig.chainId === 421614) return 'ARB-SEPOLIA';\n    return null;\n  }\n\n  private isTempo(): boolean {\n    return this.chainConfig.chainId === 42431 || this.chainConfig.chainId === 4217;\n  }\n\n  async fundTempoIfNeeded(recipient: string): Promise<void> {\n    if (!this.isTestnet() || !this.isTempo()) return;\n    try {\n      const res = await fetch('https://docs.tempo.xyz/api/faucet', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ address: recipient.toLowerCase() }),\n      });\n      if (!res.ok) {\n        // Fallback: tempo_fundAddress RPC\n        await fetch(this.chainConfig.rpcUrl, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tempo_fundAddress', params: [recipient] }),\n        });\n      }\n    } catch { console.warn('[n-payment] Tempo faucet unavailable'); }\n  }\n\n  async ensureFunded(recipient: string, token: string): Promise<void> {\n    if (this.isTempo()) {\n      await this.fundTempoIfNeeded(recipient);\n      return;\n    }\n    await this.fundGasIfNeeded(recipient);\n    await this.fundUsdcIfNeeded(recipient, token);\n  }\n}\n","/**\n * CAIP-2 → OWS chain-family resolver (single source of truth, pure functions).\n *\n * SOLID:\n *   • Single Responsibility — resolves namespace → family + derivation path.\n *   • Open-Closed — add a new chain family by appending one row to FAMILY_TABLE.\n *\n * Pure module — no I/O, no SDK imports, no side effects. Frozen table for\n * V8 hidden-class optimization.\n *\n * Spec: github.com/open-wallet-standard/core docs/07-supported-chains.md (v1.3.2).\n */\n\nimport { owsError } from '../errors.js';\nimport type { ChainFamily, FamilySpec } from './types.js';\n\n/**\n * The 11 OWS chain families, frozen as the single source of truth.\n *\n * Adding a 12th family (e.g. Stellar in v0.28) = one row here +\n * one case in `cli-driver.ts:dispatchSign`. No edits elsewhere.\n */\nexport const FAMILY_TABLE: ReadonlyArray<FamilySpec> = Object.freeze([\n  { family: 'evm',      namespace: 'eip155', curve: 'secp256k1', slip44: 60,      derivationTemplate: \"m/44'/60'/0'/0/{i}\",     addressFormat: 'EIP-55 hex' },\n  { family: 'solana',   namespace: 'solana', curve: 'Ed25519',   slip44: 501,     derivationTemplate: \"m/44'/501'/{i}'/0'\",     addressFormat: 'base58 pubkey' },\n  { family: 'bitcoin',  namespace: 'bip122', curve: 'secp256k1', slip44: 0,       derivationTemplate: \"m/84'/0'/0'/0/{i}\",      addressFormat: 'bech32 segwit' },\n  { family: 'cosmos',   namespace: 'cosmos', curve: 'secp256k1', slip44: 118,     derivationTemplate: \"m/44'/118'/0'/0/{i}\",    addressFormat: 'bech32' },\n  { family: 'tron',     namespace: 'tron',   curve: 'secp256k1', slip44: 195,     derivationTemplate: \"m/44'/195'/0'/0/{i}\",    addressFormat: 'base58check T...' },\n  { family: 'ton',      namespace: 'ton',    curve: 'Ed25519',   slip44: 607,     derivationTemplate: \"m/44'/607'/{i}'\",        addressFormat: 'base64url v5r1' },\n  { family: 'sui',      namespace: 'sui',    curve: 'Ed25519',   slip44: 784,     derivationTemplate: \"m/44'/784'/{i}'/0'/0'\",  addressFormat: '0x blake2b-256' },\n  { family: 'xrpl',     namespace: 'xrpl',   curve: 'secp256k1', slip44: 144,     derivationTemplate: \"m/44'/144'/0'/0/{i}\",    addressFormat: 'base58check r...' },\n  { family: 'spark',    namespace: 'spark',  curve: 'secp256k1', slip44: 8797555, derivationTemplate: \"m/84'/0'/0'/0/{i}\",      addressFormat: 'spark: + hex' },\n  { family: 'filecoin', namespace: 'fil',    curve: 'secp256k1', slip44: 461,     derivationTemplate: \"m/44'/461'/0'/0/{i}\",    addressFormat: 'f1 base32' },\n  { family: 'near',     namespace: 'near',   curve: 'Ed25519',   slip44: 397,     derivationTemplate: \"m/44'/397'/{i}'\",        addressFormat: '64-char hex' },\n] as const);\n\n/** O(1) namespace → spec lookup (built once at module load). */\nconst NAMESPACE_INDEX: ReadonlyMap<string, FamilySpec> = new Map(\n  FAMILY_TABLE.map((spec) => [spec.namespace, spec]),\n);\n\n/** Parse a CAIP-2 string `<namespace>:<reference>`. Throws on malformed input. */\nexport function parseCaip2(caip2: string): { namespace: string; reference: string } {\n  if (typeof caip2 !== 'string' || !caip2.includes(':')) {\n    throw owsError('OWS_INVALID_CAIP2', `not a CAIP-2 string: ${String(caip2)}`);\n  }\n  const colonIndex = caip2.indexOf(':');\n  const namespace = caip2.slice(0, colonIndex);\n  const reference = caip2.slice(colonIndex + 1);\n  if (!namespace || !reference) {\n    throw owsError('OWS_INVALID_CAIP2', `missing namespace or reference: ${caip2}`);\n  }\n  return { namespace, reference };\n}\n\n/**\n * Resolve a CAIP-2 chain ID to its OWS family.\n * Throws `OWS_CHAIN_FAMILY_NOT_SUPPORTED` for namespaces outside the 11-family spec\n * (e.g. `stellar:*`, `aptos:*`).\n */\nexport function resolveFamily(caip2: string): ChainFamily {\n  const { namespace } = parseCaip2(caip2);\n  const spec = NAMESPACE_INDEX.get(namespace);\n  if (!spec) {\n    throw owsError('OWS_CHAIN_FAMILY_NOT_SUPPORTED', `namespace \"${namespace}\" not in OWS spec v1.3.2`);\n  }\n  return spec.family;\n}\n\n/** Return the full FamilySpec for a CAIP-2 chain. */\nexport function resolveSpec(caip2: string): FamilySpec {\n  const { namespace } = parseCaip2(caip2);\n  const spec = NAMESPACE_INDEX.get(namespace);\n  if (!spec) {\n    throw owsError('OWS_CHAIN_FAMILY_NOT_SUPPORTED', `namespace \"${namespace}\" not in OWS spec v1.3.2`);\n  }\n  return spec;\n}\n\n/** Render the BIP-32 derivation path for a family at a given account index. */\nexport function getDerivationPath(family: ChainFamily, index = 0): string {\n  const spec = FAMILY_TABLE.find((f) => f.family === family);\n  if (!spec) {\n    throw owsError('OWS_CHAIN_FAMILY_NOT_SUPPORTED', `unknown family: ${family}`);\n  }\n  return spec.derivationTemplate.replace('{i}', String(index));\n}\n\n/** SLIP-44 coin type for a family. */\nexport function getSlip44(family: ChainFamily): number {\n  const spec = FAMILY_TABLE.find((f) => f.family === family);\n  if (!spec) {\n    throw owsError('OWS_CHAIN_FAMILY_NOT_SUPPORTED', `unknown family: ${family}`);\n  }\n  return spec.slip44;\n}\n\n/**\n * Extract the EVM chainId number from a CAIP-2 of form `eip155:<n>`.\n * Returns `null` for non-EVM CAIP-2 strings (caller must dispatch differently).\n */\nexport function extractEvmChainId(caip2: string): number | null {\n  const { namespace, reference } = parseCaip2(caip2);\n  if (namespace !== 'eip155') return null;\n  const n = Number.parseInt(reference, 10);\n  return Number.isFinite(n) ? n : null;\n}\n\n/** All supported CAIP-2 namespaces (for error messages, docs, tests). */\nexport function listSupportedNamespaces(): readonly string[] {\n  return FAMILY_TABLE.map((f) => f.namespace);\n}\n","/**\n * OWS CLI Driver — wraps `@open-wallet-standard/core` Node SDK.\n *\n * v0.27 — extended from EVM-only to all 11 OWS chain families via single\n * dispatch on `ChainFamily`. Returns `null` from `createOWSDriver()` when the\n * peer dep isn't installed; caller falls back to legacy `privateKey` mode.\n *\n * SOLID: Single Responsibility — adapts the OWS SDK to a stable internal\n * interface. CAIP-2 parsing happens in `caip2.ts`; payload construction\n * is family-specific and contained in this file's `dispatchSign` switch.\n */\n\nimport { CHAINS } from '../chains.js';\nimport type { ChainConfig } from '../types.js';\nimport { resolveFamily, resolveSpec, parseCaip2 } from './caip2.js';\nimport { owsError } from '../errors.js';\nimport type { ChainFamily, SignedTx } from './types.js';\n\n/**\n * Internal driver interface. v0.27 keeps the EVM-only legacy methods\n * (used by `OWSWallet` legacy path) AND adds CAIP-2-keyed methods\n * (used by the new multichain path).\n */\nexport interface OWSDriver {\n  // ─── Legacy EVM methods (v0.25, kept for back-compat) ───────────────────\n  getAddress(walletName: string, chainId: number): Promise<string>;\n  signTransaction(walletName: string, chainId: number, tx: { to: string; value?: string; data?: string }): Promise<string>;\n  signMessage(walletName: string, message: string): Promise<string>;\n  getBalance(walletName: string, chainId: number, token: string): Promise<bigint>;\n  transferERC20(walletName: string, chainId: number, to: string, token: string, amount: bigint): Promise<string>;\n\n  // ─── v0.27 multichain methods ───────────────────────────────────────────\n  getAddressForCaip2(walletName: string, caip2: string): Promise<string>;\n  signMessageForCaip2(walletName: string, caip2: string, message: string): Promise<string>;\n  signAndSendForCaip2(walletName: string, caip2: string, txPayload: unknown): Promise<SignedTx>;\n}\n\nfunction getChainConfig(chainId: number): ChainConfig | undefined {\n  return Object.values(CHAINS).find((c) => c.chainId === chainId);\n}\n\n/** Pull an account from a Wallet object by CAIP-2 (with family fallback). */\nfunction pickAccount(wallet: { accounts: { address: string; chainId: string }[] }, caip2: string): string | undefined {\n  const exact = wallet.accounts.find((a) => a.chainId === caip2);\n  if (exact) return exact.address;\n  const { namespace } = parseCaip2(caip2);\n  const familyMatch = wallet.accounts.find((a) => a.chainId.startsWith(`${namespace}:`));\n  return familyMatch?.address;\n}\n\n/**\n * Family-keyed payload-encoder for `signAndSend`. The OWS SDK is permissive —\n * it accepts a JSON string for every family and parses inside the Rust core.\n * v0.27 sends the payload as JSON.stringify(txPayload); each family adapter\n * (xrpl/solana/cosmos/etc.) decides the wire shape upstream of this driver.\n */\nfunction encodePayload(txPayload: unknown): string {\n  if (typeof txPayload === 'string') return txPayload;\n  return JSON.stringify(txPayload);\n}\n\nlet cachedDriver: OWSDriver | null | undefined;\n\nexport async function createOWSDriver(_cliPath?: string): Promise<OWSDriver | null> {\n  if (cachedDriver !== undefined) return cachedDriver;\n  try {\n    const ows = await import('@open-wallet-standard/core');\n\n    cachedDriver = {\n      // ─── Legacy EVM methods ──────────────────────────────────────────────\n      async getAddress(walletName, chainId) {\n        const wallet = ows.getWallet(walletName);\n        const account = wallet.accounts.find((a: { chainId: string }) => a.chainId === `eip155:${chainId}`);\n        return account?.address ?? wallet.accounts[0]?.address ?? '';\n      },\n\n      async signTransaction(walletName, chainId, tx) {\n        const chainConfig = getChainConfig(chainId);\n        if (!chainConfig) throw new Error(`Chain ${chainId} not found`);\n        const { createPublicClient, http, defineChain, serializeTransaction } = await import('viem');\n        const viemChain = defineChain({\n          id: chainId,\n          name: chainConfig.name,\n          nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n          rpcUrls: { default: { http: [chainConfig.rpcUrl] } },\n        });\n        const client = createPublicClient({ chain: viemChain, transport: http(chainConfig.rpcUrl) });\n        const address = (await this.getAddress(walletName, chainId)) as `0x${string}`;\n        const nonce = await client.getTransactionCount({ address });\n        const block = await client.getBlock();\n        const baseFee = block.baseFeePerGas ?? 1_000_000_000n;\n        const rawTx = {\n          to: tx.to as `0x${string}`,\n          value: tx.value ? BigInt(tx.value) : 0n,\n          data: (tx.data ?? '0x') as `0x${string}`,\n          nonce,\n          gas: 100_000n,\n          maxFeePerGas: baseFee * 2n,\n          maxPriorityFeePerGas: 1_000_000n,\n          chainId,\n          type: 'eip1559' as const,\n        };\n        const serialized = serializeTransaction(rawTx);\n        const result = await ows.signAndSend(walletName, `eip155:${chainId}`, serialized, null, null, chainConfig.rpcUrl);\n        return result.txHash;\n      },\n\n      async signMessage(walletName, message) {\n        const result = await ows.signMessage(walletName, 'evm', message);\n        return result.signature;\n      },\n\n      async getBalance(walletName, chainId, token) {\n        const { createPublicClient, http, defineChain } = await import('viem');\n        const chainConfig = getChainConfig(chainId);\n        if (!chainConfig) return 0n;\n        const viemChain = defineChain({\n          id: chainId,\n          name: chainConfig.name,\n          nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n          rpcUrls: { default: { http: [chainConfig.rpcUrl] } },\n        });\n        const client = createPublicClient({ chain: viemChain, transport: http(chainConfig.rpcUrl) });\n        const wallet = ows.getWallet(walletName);\n        const account = wallet.accounts.find((a: { chainId: string }) => a.chainId === `eip155:${chainId}`);\n        const address = account?.address ?? wallet.accounts[0]?.address;\n        if (!address) return 0n;\n        try {\n          const balance = await client.readContract({\n            address: token as `0x${string}`,\n            abi: [\n              {\n                name: 'balanceOf',\n                type: 'function',\n                stateMutability: 'view',\n                inputs: [{ name: 'owner', type: 'address' }],\n                outputs: [{ name: '', type: 'uint256' }],\n              },\n            ] as const,\n            functionName: 'balanceOf',\n            args: [address as `0x${string}`],\n          });\n          return balance as bigint;\n        } catch {\n          return 0n;\n        }\n      },\n\n      async transferERC20(walletName, chainId, to, token, amount) {\n        const data = '0xa9059cbb' + to.slice(2).padStart(64, '0') + amount.toString(16).padStart(64, '0');\n        return this.signTransaction(walletName, chainId, { to: token, data });\n      },\n\n      // ─── v0.27 multichain methods (single dispatch on family) ───────────\n      async getAddressForCaip2(walletName, caip2) {\n        const family = resolveFamily(caip2);\n        const wallet = ows.getWallet(walletName);\n        const address = pickAccount(wallet, caip2);\n        if (!address) {\n          throw owsError(\n            'OWS_WALLET_NOT_FOUND',\n            `wallet \"${walletName}\" has no account for ${caip2} (family: ${family})`,\n          );\n        }\n        return address;\n      },\n\n      async signMessageForCaip2(walletName, caip2, message) {\n        const family = resolveFamily(caip2);\n        try {\n          const result = await ows.signMessage(walletName, family, message);\n          return result.signature;\n        } catch (err) {\n          throw owsError(\n            'OWS_FAMILY_PARTIAL',\n            `signMessage(${family}) rejected by SDK: ${(err as Error).message}`,\n          );\n        }\n      },\n\n      async signAndSendForCaip2(walletName, caip2, txPayload) {\n        const family = resolveFamily(caip2);\n        const spec = resolveSpec(caip2);\n        const payload = encodePayload(txPayload);\n        // EVM keeps the rich legacy encoding (nonce + viem). Other families pass\n        // payload through to the SDK; chain-specific adapters upstream supply\n        // the correct shape per family.\n        try {\n          const result = await ows.signAndSend(walletName, caip2, payload, null, null, null);\n          return { txHash: result.txHash, family: spec.family };\n        } catch (err) {\n          throw owsError(\n            'OWS_FAMILY_PARTIAL',\n            `signAndSend(${family}) rejected by SDK: ${(err as Error).message}`,\n          );\n        }\n      },\n    };\n\n    return cachedDriver;\n  } catch {\n    cachedDriver = null;\n    return null;\n  }\n}\n\n/** Return all OWS chain families the cached driver currently has accounts for. */\nexport async function listAvailableFamilies(walletName: string): Promise<ChainFamily[]> {\n  const driver = await createOWSDriver();\n  if (!driver) return [];\n  try {\n    const ows = await import('@open-wallet-standard/core');\n    const wallet = ows.getWallet(walletName);\n    const families = new Set<ChainFamily>();\n    for (const account of wallet.accounts) {\n      try {\n        families.add(resolveFamily(account.chainId));\n      } catch {\n        /* ignore unknown namespaces */\n      }\n    }\n    return [...families];\n  } catch {\n    return [];\n  }\n}\n","/**\n * OWS lifecycle facade — single namespace, single SDK adapter.\n *\n * SOLID:\n *   • S — every method is a thin async wrapper around one OWS SDK call.\n *   • O — adding a lifecycle op = one new function; no existing code changes.\n *   • L — every method returns a typed value or throws an `NPaymentError`.\n *   • I — segregated interfaces from `types.ts` (Lifecycle, PolicyManager, KeyManager).\n *   • D — depends on the loose `@open-wallet-standard/core` typedecl, not the impl.\n *\n * Sample-mistake avoidance:\n *   • Single `withSdk(fn)` helper wraps every call; no copy-pasted error handling.\n *   • Single `withCli(args, opts)` helper for `ows` CLI shell-out\n *     (uses `child_process.execFile` to avoid shell injection).\n *   • Plain function namespace (`export const ows = { ... }`) — no class state,\n *     no per-method fields, no inheritance.\n *\n * Performance: SDK is lazy-imported once per process (cached in `sdkPromise`).\n * CLI shell-outs only run for backup/restore/recover (operator actions).\n */\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { owsError } from '../errors.js';\nimport type {\n  ChainFamily,\n  CreateWalletOpts,\n  DiscoverOpts,\n  PolicyDef,\n  PolicyId,\n  PolicySummary,\n  ApiKeyId,\n  ApiKeyIssued,\n  ApiKeyOpts,\n  ApiKeySummary,\n  WalletDescriptor,\n} from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\n// ─── Lazy SDK loader (single source of truth) ────────────────────────────────\n\ntype OwsSdk = typeof import('@open-wallet-standard/core');\nlet sdkPromise: Promise<OwsSdk | null> | null = null;\n\nfunction loadSdk(): Promise<OwsSdk | null> {\n  if (!sdkPromise) {\n    sdkPromise = import('@open-wallet-standard/core').then(\n      (m) => m as unknown as OwsSdk,\n      () => null,\n    );\n  }\n  return sdkPromise;\n}\n\n/** Run an SDK-backed call; convert all SDK errors to typed NPaymentError. */\nasync function withSdk<T>(label: string, fn: (sdk: OwsSdk) => Promise<T>): Promise<T> {\n  const sdk = await loadSdk();\n  if (!sdk) throw owsError('OWS_SDK_NOT_INSTALLED', `lifecycle.${label} requires @open-wallet-standard/core`);\n  try {\n    return await fn(sdk);\n  } catch (err) {\n    const message = (err as Error)?.message ?? String(err);\n    // Map common SDK errors to typed codes.\n    if (/not found|no such wallet/i.test(message)) {\n      throw owsError('OWS_WALLET_NOT_FOUND', `${label}: ${message}`);\n    }\n    if (/policy|denied|forbidden/i.test(message)) {\n      throw owsError('OWS_POLICY_VIOLATION', `${label}: ${message}`);\n    }\n    throw owsError('OWS_FAMILY_PARTIAL', `${label}: ${message}`);\n  }\n}\n\n/** Shell-out to the `ows` CLI binary (used for backup/restore/recover). */\nasync function withCli(label: string, args: string[], cliPath = 'ows', env?: Record<string, string>): Promise<string> {\n  try {\n    const { stdout } = await execFileAsync(cliPath, args, {\n      env: { ...process.env, ...(env ?? {}) },\n      maxBuffer: 16 * 1024 * 1024,\n    });\n    return stdout;\n  } catch (err) {\n    const message = (err as Error & { stderr?: string }).stderr ?? (err as Error).message;\n    if (/ENOENT|not found/i.test(message)) {\n      throw owsError('OWS_CLI_NOT_AVAILABLE', `${label}: ${cliPath} not found on PATH`);\n    }\n    throw owsError('OWS_FAMILY_PARTIAL', `${label}: ${message}`);\n  }\n}\n\n/** Common confirm-required guard for destructive operations. */\nfunction requireConfirm(opName: string, confirm: unknown): void {\n  if (confirm !== true) {\n    throw owsError('OWS_CONFIRM_REQUIRED', `${opName} requires { confirm: true }`);\n  }\n}\n\n// ─── Public namespace ────────────────────────────────────────────────────────\n\nexport const ows = {\n  // ─── Creation ──────────────────────────────────────────────────────────────\n\n  createWallet(opts: CreateWalletOpts): Promise<WalletDescriptor> {\n    return withSdk('createWallet', async (sdk) => {\n      const wallet = await sdk.createWallet({\n        name: opts.name,\n        chains: opts.chains,\n        accountCount: 1,\n        mnemonicStrength: opts.mnemonicStrength ?? 256,\n        passphrase: opts.passphrase,\n      });\n      return toDescriptor(wallet);\n    });\n  },\n\n  importMnemonic(opts: { name: string; chains: string[]; passphrase?: string }): Promise<WalletDescriptor> {\n    // Mnemonic itself is read by the SDK from stdin; never passed in code.\n    return withSdk('importMnemonic', async (sdk) => {\n      const wallet = await sdk.importMnemonic({\n        name: opts.name,\n        chains: opts.chains,\n        passphrase: opts.passphrase,\n      });\n      return toDescriptor(wallet);\n    });\n  },\n\n  importPrivateKey(opts: { name: string; key: string; family: ChainFamily; passphrase?: string }): Promise<WalletDescriptor> {\n    return withSdk('importPrivateKey', async (sdk) => {\n      const wallet = await sdk.importPrivateKey(opts);\n      return toDescriptor(wallet);\n    });\n  },\n\n  importKeystore(opts: { name: string; file: string; password?: string; passphrase?: string }): Promise<WalletDescriptor> {\n    return withSdk('importKeystore', async (sdk) => toDescriptor(await sdk.importKeystore(opts)));\n  },\n\n  importWif(opts: { name: string; key: string; passphrase?: string }): Promise<WalletDescriptor> {\n    return withSdk('importWif', async (sdk) => toDescriptor(await sdk.importWif(opts)));\n  },\n\n  importSolanaKeypair(opts: { name: string; file: string; passphrase?: string }): Promise<WalletDescriptor> {\n    return withSdk('importSolanaKeypair', async (sdk) => toDescriptor(await sdk.importSolanaKeypair(opts)));\n  },\n\n  importSuiKeystore(opts: { name: string; file: string; passphrase?: string }): Promise<WalletDescriptor> {\n    return withSdk('importSuiKeystore', async (sdk) => toDescriptor(await sdk.importSuiKeystore(opts)));\n  },\n\n  // ─── Export ────────────────────────────────────────────────────────────────\n\n  exportMnemonic(opts: { wallet: string; confirm: true }): Promise<string> {\n    requireConfirm('exportMnemonic', opts.confirm);\n    return withSdk('exportMnemonic', (sdk) => sdk.exportMnemonic(opts));\n  },\n\n  exportKeystore(opts: { wallet: string; account: string; output: string; password?: string }): Promise<void> {\n    return withSdk('exportKeystore', (sdk) => sdk.exportKeystore(opts));\n  },\n\n  exportRaw(opts: { wallet: string; account: string; confirm: true }): Promise<string> {\n    requireConfirm('exportRaw', opts.confirm);\n    return withSdk('exportRaw', (sdk) => sdk.exportRaw(opts));\n  },\n\n  // ─── Backup / restore / auto-backup ────────────────────────────────────────\n\n  async backupVault(opts: { output: string; passphraseEnv: string; cliPath?: string }): Promise<void> {\n    const passphrase = process.env[opts.passphraseEnv];\n    if (!passphrase) {\n      throw owsError('OWS_CONFIRM_REQUIRED', `env var \"${opts.passphraseEnv}\" is empty; backup aborted`);\n    }\n    const sdk = await loadSdk();\n    if (sdk?.backup) {\n      await sdk.backup({ output: opts.output, passphrase });\n      return;\n    }\n    // Fallback: shell out to `ows backup`. Pass the passphrase via env, never argv.\n    await withCli('backupVault', ['backup', '--output', opts.output], opts.cliPath, {\n      OWS_BACKUP_PASSPHRASE: passphrase,\n    });\n  },\n\n  async restoreVault(opts: { input: string; passphraseEnv?: string; cliPath?: string }): Promise<void> {\n    const passphrase = opts.passphraseEnv ? process.env[opts.passphraseEnv] : undefined;\n    const sdk = await loadSdk();\n    if (sdk?.restore && passphrase) {\n      await sdk.restore({ input: opts.input, passphrase });\n      return;\n    }\n    await withCli('restoreVault', ['restore', '--input', opts.input], opts.cliPath, passphrase ? { OWS_BACKUP_PASSPHRASE: passphrase } : undefined);\n  },\n\n  /**\n   * Configure automated daily backup. Writes the snippet to ~/.ows/config.json\n   * via the CLI; SDK doesn't expose this directly in v1.3.2.\n   */\n  async configureAutoBackup(opts: { schedule: 'daily' | 'weekly'; retention: number; destination?: string; cliPath?: string }): Promise<void> {\n    const args = ['config', 'set', 'backup.enabled=true', `backup.schedule=${opts.schedule}`, `backup.retention=${opts.retention}`];\n    if (opts.destination) args.push(`backup.destination=${opts.destination}`);\n    await withCli('configureAutoBackup', args, opts.cliPath);\n  },\n\n  // ─── Recovery ──────────────────────────────────────────────────────────────\n\n  recover(opts: { name: string; chains: string[]; gapLimit?: number }): Promise<WalletDescriptor> {\n    // Mnemonic itself is read by the SDK from stdin; never passed in code.\n    return withSdk('recover', async (sdk) =>\n      toDescriptor(\n        await sdk.recover({\n          name: opts.name,\n          chains: opts.chains,\n          gapLimit: opts.gapLimit ?? 20,\n        }),\n      ),\n    );\n  },\n\n  // ─── Active management ────────────────────────────────────────────────────\n\n  lock(wallet: string): Promise<void> {\n    return withSdk('lock', (sdk) => sdk.lock(wallet));\n  },\n\n  unlock(wallet: string, passphrase?: string): Promise<void> {\n    return withSdk('unlock', (sdk) => sdk.unlock(wallet, passphrase));\n  },\n\n  rotate(opts: { from: string; to: string; chains: string[] }): Promise<void> {\n    return withSdk('rotate', (sdk) => sdk.rotate(opts));\n  },\n\n  discover(opts: DiscoverOpts = {}): Promise<WalletDescriptor[]> {\n    return withSdk('discover', async (sdk) => {\n      const list = await Promise.resolve(\n        sdk.listWallets({\n          chainType: opts.chainType,\n          namePattern: opts.namePattern,\n          hasPolicy: opts.hasPolicy,\n        }),\n      );\n      return list.map(toDescriptor);\n    });\n  },\n\n  delete(opts: { wallet: string; confirm: true }): Promise<void> {\n    requireConfirm('delete', opts.confirm);\n    return withSdk('delete', (sdk) => sdk.deleteWallet(opts));\n  },\n\n  // ─── Policy CRUD ──────────────────────────────────────────────────────────\n\n  async createPolicy(def: PolicyDef): Promise<PolicyId> {\n    return withSdk('createPolicy', async (sdk) => {\n      const created = await sdk.policy.create(def);\n      return created.id;\n    });\n  },\n\n  listPolicies(): Promise<PolicySummary[]> {\n    return withSdk('listPolicies', async (sdk) => {\n      const list = await sdk.policy.list();\n      return list.map((p) => ({ id: p.id, allowChains: p.allowChains, expiry: p.expiry }));\n    });\n  },\n\n  getPolicy(id: PolicyId): Promise<PolicyDef | null> {\n    return withSdk('getPolicy', async (sdk) => {\n      const p = await sdk.policy.get(id);\n      if (!p) return null;\n      return { allowChains: p.allowChains, expiry: p.expiry, customExec: p.customExec, maxValuePerTx: p.maxValuePerTx };\n    });\n  },\n\n  deletePolicy(id: PolicyId): Promise<void> {\n    return withSdk('deletePolicy', (sdk) => sdk.policy.delete(id));\n  },\n\n  // ─── API key CRUD ─────────────────────────────────────────────────────────\n\n  /**\n   * Create a scoped API key. The returned `token` is shown ONCE — caller must persist it\n   * immediately. A lost token cannot be recovered, only revoked + reissued.\n   */\n  createApiKey(opts: ApiKeyOpts): Promise<ApiKeyIssued> {\n    return withSdk('createApiKey', async (sdk) => {\n      const issued = await sdk.apiKey.create(opts);\n      return { id: issued.id, name: issued.name, token: issued.token, expires: issued.expires };\n    });\n  },\n\n  listApiKeys(): Promise<ApiKeySummary[]> {\n    return withSdk('listApiKeys', async (sdk) => {\n      const list = await sdk.apiKey.list();\n      return list.map((k) => ({ id: k.id, name: k.name, wallets: k.wallets, policy: k.policy, expires: k.expires }));\n    });\n  },\n\n  revokeApiKey(id: ApiKeyId): Promise<void> {\n    return withSdk('revokeApiKey', (sdk) => sdk.apiKey.revoke(id));\n  },\n\n  // ─── Mnemonic utilities ───────────────────────────────────────────────────\n\n  generateMnemonic(opts: { words?: 12 | 24 } = {}): Promise<string> {\n    return withSdk('generateMnemonic', (sdk) => sdk.mnemonic.generate({ words: opts.words ?? 24 }));\n  },\n\n  deriveAddress(opts: { mnemonic: string; chain: string; index?: number }): Promise<{ address: string; path: string }> {\n    return withSdk('deriveAddress', (sdk) => sdk.mnemonic.derive(opts));\n  },\n};\n\n// ─── Internal mapper ─────────────────────────────────────────────────────────\n\ninterface RawWallet {\n  id?: string;\n  name: string;\n  accounts: { address: string; chainId: string; family?: string; derivationPath?: string }[];\n  createdAt?: string;\n}\n\nfunction toDescriptor(w: RawWallet): WalletDescriptor {\n  return {\n    id: w.id ?? w.name,\n    name: w.name,\n    accounts: w.accounts.map((a) => ({\n      address: a.address,\n      chainId: a.chainId,\n      family: (a.family as ChainFamily) ?? inferFamilyFromCaip2(a.chainId),\n      derivationPath: a.derivationPath ?? '',\n    })),\n    createdAt: w.createdAt ?? new Date().toISOString(),\n  };\n}\n\nfunction inferFamilyFromCaip2(caip2: string): ChainFamily {\n  // Lazy-load to avoid circular import; only called inside toDescriptor.\n  // Inline version of resolveFamily for descriptor mapping; full validation\n  // happens at sign-time in OWSWallet/cli-driver.\n  const namespace = caip2.split(':')[0] ?? '';\n  const map: Record<string, ChainFamily> = {\n    eip155: 'evm', solana: 'solana', bip122: 'bitcoin', cosmos: 'cosmos',\n    tron: 'tron', ton: 'ton', sui: 'sui', xrpl: 'xrpl',\n    spark: 'spark', fil: 'filecoin', near: 'near',\n  };\n  return map[namespace] ?? 'evm';\n}\n","import type { NPaymentConfig } from './types.js';\nimport { CHAINS } from './chains.js';\nimport { NPaymentError } from './errors.js';\n\nexport function createConfig(input: NPaymentConfig): NPaymentConfig {\n  if (!input.chains?.length) {\n    throw new NPaymentError('At least one chain required', 'INVALID_CONFIG', 'Pass chains: [\"base-sepolia\"]');\n  }\n\n  for (const chain of input.chains) {\n    if (!CHAINS[chain]) {\n      throw new NPaymentError(`Unknown chain: ${chain}`, 'INVALID_CONFIG', `Valid chains: ${Object.keys(CHAINS).join(', ')}`);\n    }\n  }\n\n  if (!input.ows?.wallet) {\n    throw new NPaymentError('ows.wallet is required', 'INVALID_CONFIG', 'Pass ows: { wallet: \"my-agent\" }');\n  }\n\n  // Dual-mode: privateKey is optional if OWS SDK is available\n  // Validation of signer availability happens at runtime in OWSWallet\n\n  const hasGoatChain = input.chains.some((c) => CHAINS[c].protocols.includes('goat'));\n  if (hasGoatChain && !input.goat) {\n    throw new NPaymentError('GOAT chains require goat credentials', 'INVALID_CONFIG', 'Pass goat: { apiKey, apiSecret, merchantId }');\n  }\n\n  if (input.btcLending && !hasGoatChain) {\n    throw new NPaymentError('btcLending requires a GOAT chain', 'INVALID_CONFIG', 'Add goat-testnet or goat-mainnet to chains');\n  }\n\n  if (input.btcLending && !input.btcLending.vaultAddress) {\n    throw new NPaymentError('btcLending.vaultAddress is required', 'INVALID_CONFIG', 'Pass btcLending: { vaultAddress: \"0x...\" }');\n  }\n\n  if (input.morph?.altFee?.enabled) {\n    throw new NPaymentError(\n      'AltFee (gas-in-stablecoin) is not yet implemented — planned for v0.10',\n      'NOT_IMPLEMENTED',\n      'See https://docs.morph.network/docs/morph-rails/infra-solutions/altfee — Type-0x7F transaction support coming next release',\n    );\n  }\n\n  // v0.11: SpaceRouter requires a creditcoin-* chain when strict.\n  const hasSpaceRouterChain = input.chains.some((c) => CHAINS[c].protocols.includes('spacerouter'));\n  if (input.spacerouter?.strict && !hasSpaceRouterChain) {\n    throw new NPaymentError(\n      'spacerouter config requires a creditcoin-* chain',\n      'INVALID_CONFIG',\n      'Add \"creditcoin-mainnet\" or \"creditcoin-testnet\" to chains',\n    );\n  }\n\n  // v0.13: Aave config validation\n  if (input.aave) {\n    if (input.aave.maxLTV !== undefined && (input.aave.maxLTV < 1 || input.aave.maxLTV > 90)) {\n      throw new NPaymentError('aave.maxLTV must be between 1 and 90', 'INVALID_CONFIG');\n    }\n    if (input.aave.vault?.feePercent !== undefined && input.aave.vault.feePercent < 10) {\n      throw new NPaymentError('aave.vault.feePercent must be >= 10 (Aave requirement)', 'INVALID_CONFIG');\n    }\n  }\n\n  return { protocol: 'auto', ...input };\n}\n","import type { ProtocolType } from './types.js';\n\nconst MORPH_NETWORKS = new Set(['eip155:2818', 'eip155:2910']);\nconst FLARE_NETWORKS = new Set([\n  'flare-coston2', 'flare-songbird', 'flare',\n  'eip155:114', 'eip155:19', 'eip155:14',\n]);\n/** Canonical XRPL CAIP-2 IDs per the T54 / xrpl.org x402 spec. */\nconst XRPL_NETWORKS = new Set(['xrpl:0', 'xrpl:1', 'xrpl:2']);\n\n/**\n * Detect which payment protocol a 402 response uses based on HTTP headers and challenge body.\n * Reads both the canonical uppercase `PAYMENT-REQUIRED` header (x402 v2 / T54) and the\n * legacy lowercase `payment-required` / `x-payment-required` aliases — the adapter then\n * does the strict re-decode.\n */\nexport function detectProtocol(\n  response: Response,\n  preference: ProtocolType = 'auto',\n): 'x402' | 'mpp' | 'xrpl' | 'stellar-x402' | 'stellar-mpp' | 'morph-x402' | 'flare-x402' | 'cosmos-msgsend' | 'unknown' {\n  const paymentHeader =\n    response.headers.get('PAYMENT-REQUIRED') ??\n    response.headers.get('payment-required') ??\n    response.headers.get('x-payment-required') ??\n    '';\n  const authHeader = response.headers.get('www-authenticate') ?? '';\n  const hasX402 = !!paymentHeader;\n  const hasMpp = authHeader.toLowerCase().includes('payment');\n\n  if (hasX402) {\n    try {\n      const accept = JSON.parse(Buffer.from(paymentHeader, 'base64').toString())?.accepts?.[0];\n      // v0.23 — cosmos-msgsend is identified by scheme (not network) since cosmos\n      // chains use bare chain-id strings ('interwoven-1') without a stable namespace prefix.\n      if (accept?.scheme === 'cosmos-msgsend') return 'cosmos-msgsend';\n      const network = accept?.network as string | undefined;\n      if (network && XRPL_NETWORKS.has(network)) return 'xrpl';\n      if (network && FLARE_NETWORKS.has(network)) return 'flare-x402';\n      if (network && MORPH_NETWORKS.has(network)) return 'morph-x402';\n      if (network?.startsWith('stellar:')) return 'stellar-x402';\n    } catch { /* not base64 JSON — fall through */ }\n  }\n\n  if (hasMpp && authHeader.toLowerCase().includes('stellar')) return 'stellar-mpp';\n\n  if (hasX402 && hasMpp) return preference === 'mpp' ? 'mpp' : 'x402';\n  if (hasX402) return 'x402';\n  if (hasMpp) return 'mpp';\n  return 'unknown';\n}\n","import type { PaymentEvent, AnalyticsPlugin } from './types.js';\n\nexport class ConsoleAnalytics implements AnalyticsPlugin {\n  emit(event: PaymentEvent): void {\n    const { timestamp, ...rest } = event;\n    console.log('[n-payment]', JSON.stringify({ ...rest, time: new Date(timestamp).toISOString() }));\n  }\n}\n\nexport class AnalyticsEmitter {\n  private plugins: AnalyticsPlugin[];\n\n  constructor(plugins?: AnalyticsPlugin[]) {\n    this.plugins = plugins?.length ? plugins : [new ConsoleAnalytics()];\n  }\n\n  emit(event: PaymentEvent): void {\n    for (const plugin of this.plugins) {\n      try {\n        plugin.emit(event);\n      } catch {\n        // Never let analytics crash the payment flow\n      }\n    }\n  }\n}\n","import type { Hex, Address } from 'viem';\nimport type { PaymentAdapter, ChainKey } from '../types.js';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport { CHAINS } from '../chains.js';\nimport { ChallengeParseError, InsufficientBalanceError, NPaymentError } from '../errors.js';\n\n/**\n * Per-chain EIP-712 domain identity for native USDC contracts.\n * Hardcoded to avoid an extra `eth_call` per payment to fetch name() / version().\n * Unknown chains fall back to the canonical mainnet defaults ('USD Coin' / '2').\n */\nconst USDC_EIP712: Partial<Record<ChainKey, { name: string; version: string }>> = {\n  'base-mainnet':     { name: 'USD Coin', version: '2' },\n  'base-sepolia':     { name: 'USDC',     version: '2' },\n  'arbitrum-sepolia': { name: 'USDC',     version: '2' },\n  'bnb-mainnet':      { name: 'USD Coin', version: '2' },\n  'bnb-testnet':      { name: 'USDC',     version: '2' },\n  // v0.25 — Celo USDC = Circle FiatTokenCeloV2_2 (verified on Celoscan).\n  'celo-mainnet':     { name: 'USD Coin', version: '2' },\n  'celo-sepolia':     { name: 'USD Coin', version: '2' },\n};\n\nconst TRANSFER_AUTH_TYPES = {\n  TransferWithAuthorization: [\n    { name: 'from',        type: 'address' },\n    { name: 'to',          type: 'address' },\n    { name: 'value',       type: 'uint256' },\n    { name: 'validAfter',  type: 'uint256' },\n    { name: 'validBefore', type: 'uint256' },\n    { name: 'nonce',       type: 'bytes32' },\n  ],\n} as const;\n\n/** 32-byte cryptographic random nonce. WebCrypto: works in Node 19+, browsers, Workers, Deno. */\nfunction randomNonce32(): Hex {\n  const arr = new Uint8Array(32);\n  crypto.getRandomValues(arr);\n  return ('0x' + Array.from(arr, (b) => b.toString(16).padStart(2, '0')).join('')) as Hex;\n}\n\n/**\n * x402 v2 payment adapter — spec-compliant **EIP-3009 `transferWithAuthorization`**.\n *\n * Signs an off-chain authorization (no broadcast), attaches it as the\n * `x-payment` header, and the paywall's facilitator verifies + settles\n * on-chain. This is the flow used by Base MCP, AWS Bedrock AgentCore,\n * and Coinbase's hosted facilitator.\n */\nexport class X402Adapter implements PaymentAdapter {\n  readonly protocol = 'x402';\n  private wallet: OWSWallet;\n  private chainKey: ChainKey;\n  /** Authorization lifetime in seconds (default 600 = 10 min). */\n  private readonly validityWindowSeconds: number;\n\n  constructor(wallet: OWSWallet, chainKey: ChainKey, validityWindowSeconds = 600) {\n    this.wallet = wallet;\n    this.chainKey = chainKey;\n    this.validityWindowSeconds = validityWindowSeconds;\n  }\n\n  detect(response: Response): boolean {\n    return response.headers.has('payment-required') || response.headers.has('x-payment-required');\n  }\n\n  async pay(url: string, init: RequestInit | undefined, response: Response): Promise<Response> {\n    const chain = CHAINS[this.chainKey];\n\n    // Parse x402 v2 PAYMENT-REQUIRED envelope\n    const headerStr = response.headers.get('payment-required') ?? response.headers.get('x-payment-required') ?? '';\n    if (!headerStr) throw new ChallengeParseError('Missing payment-required header', 'MISSING_HEADER');\n\n    let challenge: any;\n    try {\n      challenge = JSON.parse(Buffer.from(headerStr, 'base64').toString());\n    } catch {\n      throw new ChallengeParseError('Malformed base64 payment-required header', 'INVALID_HEADER');\n    }\n    const accept = challenge.accepts?.[0];\n    if (!accept) throw new ChallengeParseError('No accept entry in payment-required header', 'INVALID_HEADER');\n\n    const payTo = accept.payTo as Address | undefined;\n    const tokenAddress = (accept.asset as Address | undefined) ?? (chain.tokens.USDC as Address | undefined);\n    const amount = BigInt(accept.maxAmountRequired ?? '0');\n\n    if (!payTo)        throw new ChallengeParseError('No payTo in payment-required header', 'MISSING_PAY_TO');\n    if (!tokenAddress) throw new NPaymentError('No USDC asset configured for chain', 'MISSING_ASSET');\n    if (amount === 0n) throw new ChallengeParseError('Zero amount in payment-required header', 'ZERO_AMOUNT');\n\n    // Need a viem account for typed-data signing\n    const account = this.wallet.getAccount();\n    if (!account) {\n      throw new NPaymentError(\n        'X402 EIP-3009 signing requires ows.privateKey',\n        'NO_SIGNER',\n        'Pass ows: { privateKey: \"0x...\" } or use a signing-capable OWS driver.',\n      );\n    }\n\n    // Pre-flight balance — avoid signing dead-on-arrival authorizations\n    const balance = await this.wallet.getBalance(tokenAddress, chain.chainId);\n    if (balance < amount) {\n      throw new InsufficientBalanceError(\n        `Insufficient USDC: balance ${balance} < required ${amount}`,\n        'INSUFFICIENT_BALANCE',\n        'Fund the wallet with USDC on the target chain.',\n      );\n    }\n\n    // Sign EIP-3009 transferWithAuthorization\n    const validAfter = 0n;\n    const validBefore = BigInt(Math.floor(Date.now() / 1000) + this.validityWindowSeconds);\n    const nonce = randomNonce32();\n    const dom = USDC_EIP712[this.chainKey] ?? { name: 'USD Coin', version: '2' };\n\n    const signature = await account.signTypedData({\n      domain: {\n        name: dom.name,\n        version: dom.version,\n        chainId: chain.chainId,\n        verifyingContract: tokenAddress,\n      },\n      types: TRANSFER_AUTH_TYPES,\n      primaryType: 'TransferWithAuthorization',\n      message: {\n        from: account.address,\n        to: payTo,\n        value: amount,\n        validAfter,\n        validBefore,\n        nonce,\n      },\n    });\n\n    // x402 v2 envelope: { x402Version, scheme, network, payload }\n    const xPayment = Buffer.from(JSON.stringify({\n      x402Version: 2,\n      scheme: 'exact',\n      network: chain.caip2,\n      payload: {\n        signature,\n        authorization: {\n          from: account.address,\n          to: payTo,\n          value: amount.toString(),\n          validAfter: validAfter.toString(),\n          validBefore: validBefore.toString(),\n          nonce,\n        },\n      },\n    })).toString('base64');\n\n    // Retry the original request with the signed payment header\n    const retryHeaders = new Headers(init?.headers);\n    retryHeaders.set('x-payment', xPayment);\n    return fetch(url, { ...init, headers: retryHeaders });\n  }\n}\n","import type { PaymentAdapter, ChainKey } from '../types.js';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport { CHAINS } from '../chains.js';\nimport { TestnetFaucet } from '../faucet.js';\nimport { NPaymentError } from '../errors.js';\n\nexport class MppAdapter implements PaymentAdapter {\n  readonly protocol = 'mpp';\n  private mppxInstance: any = null;\n  private wallet: OWSWallet;\n  private chainKey: ChainKey;\n  private autoFaucet: boolean;\n\n  constructor(wallet: OWSWallet, chainKey: ChainKey, autoFaucet = false) {\n    this.wallet = wallet;\n    this.chainKey = chainKey;\n    this.autoFaucet = autoFaucet;\n  }\n\n  private async getMppx() {\n    if (this.mppxInstance) return this.mppxInstance;\n\n    const { Mppx, tempo } = await import('mppx/client');\n    const account = this.wallet.getAccount();\n\n    if (!account) {\n      throw new NPaymentError(\n        'MPP requires a privateKey for Tempo transaction signing',\n        'MPP_NO_ACCOUNT',\n        'Provide ows.privateKey in config — mppx needs a full viem account for signTypedData and signTransaction',\n      );\n    }\n\n    if (this.autoFaucet) {\n      const chain = CHAINS[this.chainKey];\n      const faucet = new TestnetFaucet(chain);\n      await faucet.ensureFunded(account.address, chain.tokens.PathUSD ?? chain.tokens.USDC ?? '');\n    }\n\n    this.mppxInstance = Mppx.create({\n      polyfill: false,\n      methods: [tempo({ account })],\n    });\n    return this.mppxInstance;\n  }\n\n  detect(response: Response): boolean {\n    return response.headers.get('www-authenticate')?.toLowerCase().includes('payment') ?? false;\n  }\n\n  async pay(url: string, init: RequestInit | undefined, _response: Response): Promise<Response> {\n    const mppx = await this.getMppx();\n    return mppx.fetch(url, init);\n  }\n}\n","import { createHmac } from 'node:crypto';\n\n/**\n * GOAT x402 HMAC-SHA256 auth per API.md spec:\n * 1. body fields + api_key + timestamp\n * 2. Remove empty values and 'sign' field\n * 3. Sort keys ASCII, build k1=v1&k2=v2\n * 4. HMAC-SHA256(apiSecret, sorted) → hex\n */\nexport function signGoatRequest(\n  body: Record<string, unknown>,\n  apiKey: string,\n  apiSecret: string,\n): Record<string, string> {\n  const timestamp = Math.floor(Date.now() / 1000).toString();\n  const params: Record<string, string> = {};\n\n  for (const [k, v] of Object.entries({ ...body, api_key: apiKey, timestamp })) {\n    if (v !== '' && v !== null && v !== undefined && k !== 'sign') {\n      params[k] = String(v);\n    }\n  }\n\n  const message = Object.keys(params).sort().map((k) => `${k}=${params[k]}`).join('&');\n  const sign = createHmac('sha256', apiSecret).update(message).digest('hex');\n\n  return {\n    'X-API-Key': apiKey,\n    'X-Timestamp': timestamp,\n    'X-Sign': sign,\n    'Content-Type': 'application/json',\n  };\n}\n","export type GoatOrderStatus =\n  | 'CHECKOUT_VERIFIED'\n  | 'PAYMENT_CONFIRMED'\n  | 'INVOICED'\n  | 'FAILED'\n  | 'EXPIRED'\n  | 'CANCELLED';\n\nexport const TERMINAL_STATES: GoatOrderStatus[] = [\n  'PAYMENT_CONFIRMED', 'INVOICED', 'FAILED', 'EXPIRED', 'CANCELLED',\n];\n\nexport interface GoatOrder {\n  orderId: string;\n  payToAddress: string;\n  amountWei: string;\n  flow: string;\n  calldataSignRequest?: unknown;\n  status: GoatOrderStatus;\n}\n\nexport interface GoatProof {\n  payload: {\n    order_id: string;\n    tx_hash: string;\n    log_index: number;\n    from_addr: string;\n    to_addr: string;\n    amount_wei: string;\n    chain_id: number;\n    flow: string;\n  };\n  signature: string;\n}\n\nexport interface GoatCreateOrderParams {\n  dappOrderId: string;\n  chainId: number;\n  tokenSymbol: string;\n  fromAddress: string;\n  amountWei: string;\n  tokenContract?: string;\n  callbackCalldata?: string;\n}\n","import { signGoatRequest } from './auth.js';\nimport type { GoatCredentials } from '../types.js';\nimport type { GoatOrder, GoatProof, GoatCreateOrderParams, GoatOrderStatus } from './types.js';\nimport { TERMINAL_STATES } from './types.js';\nimport { NPaymentError } from '../errors.js';\n\n/**\n * GOAT x402 order lifecycle client.\n *\n * GOAT uses an order-based flow (not standard x402 headers):\n *   createOrder → ERC-20 transfer → pollUntilTerminal → getOrderProof\n *\n * All endpoints use HMAC-SHA256 auth per GOAT API.md.\n */\nexport class GoatX402Client {\n  private apiUrl: string;\n  private apiKey: string;\n  private apiSecret: string;\n  private merchantId: string;\n\n  constructor(creds: GoatCredentials) {\n    this.apiUrl = (creds.apiUrl ?? 'https://api.x402.goat.network').replace(/\\/$/, '');\n    this.apiKey = creds.apiKey;\n    this.apiSecret = creds.apiSecret;\n    this.merchantId = creds.merchantId;\n  }\n\n  /** POST /api/v1/orders — returns 402 on success (GOAT spec). */\n  async createOrder(params: GoatCreateOrderParams): Promise<GoatOrder> {\n    const body: Record<string, unknown> = {\n      dapp_order_id: params.dappOrderId,\n      chain_id: params.chainId,\n      token_symbol: params.tokenSymbol,\n      from_address: params.fromAddress,\n      amount_wei: params.amountWei,\n      merchant_id: this.merchantId,\n    };\n    if (params.tokenContract) body.token_contract = params.tokenContract;\n    if (params.callbackCalldata) body.callback_calldata = params.callbackCalldata;\n\n    const res = await fetch(`${this.apiUrl}/api/v1/orders`, {\n      method: 'POST',\n      headers: signGoatRequest(body, this.apiKey, this.apiSecret),\n      body: JSON.stringify(body),\n    });\n\n    // HTTP 402 is the expected success path per GOAT spec\n    if (res.status !== 402 && !res.ok) {\n      const err: any = await res.json().catch(() => ({}));\n      throw new NPaymentError(\n        `GOAT order failed: ${err.error ?? err.message ?? res.statusText}`,\n        'GOAT_ORDER_CREATE',\n      );\n    }\n\n    const data: any = await res.json();\n    return {\n      orderId: data.order_id,\n      payToAddress: data.accepts?.[0]?.payTo ?? '',\n      amountWei: params.amountWei,\n      flow: data.flow ?? 'ERC20_DIRECT',\n      calldataSignRequest: data.calldata_sign_request,\n      status: 'CHECKOUT_VERIFIED',\n    };\n  }\n\n  /** GET /api/v1/orders/{id} — poll order status. */\n  async getOrderStatus(orderId: string): Promise<{ status: GoatOrderStatus; txHash?: string }> {\n    const res = await fetch(`${this.apiUrl}/api/v1/orders/${orderId}`, {\n      headers: signGoatRequest({}, this.apiKey, this.apiSecret),\n    });\n    if (!res.ok) throw new NPaymentError('Failed to get order status', 'GOAT_STATUS');\n    const data: any = await res.json();\n    return { status: data.status, txHash: data.tx_hash };\n  }\n\n  /** Poll until terminal state. Auto-cancels on timeout to refund fee. */\n  async pollUntilTerminal(\n    orderId: string,\n    timeoutMs = 120_000,\n    intervalMs = 2_000,\n  ): Promise<GoatOrderStatus> {\n    const deadline = Date.now() + timeoutMs;\n    while (Date.now() < deadline) {\n      const { status } = await this.getOrderStatus(orderId);\n      if (TERMINAL_STATES.includes(status)) return status;\n      await new Promise((r) => setTimeout(r, intervalMs));\n    }\n    try { await this.cancelOrder(orderId); } catch { /* best-effort cancel */ }\n    throw new NPaymentError('Order polling timed out', 'GOAT_TIMEOUT');\n  }\n\n  /** GET /api/v1/orders/{id}/proof — settlement proof. */\n  async getOrderProof(orderId: string): Promise<GoatProof> {\n    const res = await fetch(`${this.apiUrl}/api/v1/orders/${orderId}/proof`, {\n      headers: signGoatRequest({}, this.apiKey, this.apiSecret),\n    });\n    if (!res.ok) throw new NPaymentError('Failed to get proof', 'GOAT_PROOF');\n    return res.json();\n  }\n\n  /** POST /api/v1/orders/{id}/cancel — only CHECKOUT_VERIFIED orders. */\n  async cancelOrder(orderId: string): Promise<void> {\n    await fetch(`${this.apiUrl}/api/v1/orders/${orderId}/cancel`, {\n      method: 'POST',\n      headers: signGoatRequest({}, this.apiKey, this.apiSecret),\n    });\n  }\n\n  /** POST /api/v1/orders/{id}/calldata-signature — DELEGATE mode. */\n  async submitCalldataSignature(orderId: string, signature: string): Promise<void> {\n    const res = await fetch(`${this.apiUrl}/api/v1/orders/${orderId}/calldata-signature`, {\n      method: 'POST',\n      headers: signGoatRequest({ signature }, this.apiKey, this.apiSecret),\n      body: JSON.stringify({ signature }),\n    });\n    if (!res.ok) throw new NPaymentError('Failed to submit calldata signature', 'GOAT_CALLDATA');\n  }\n}\n","import type { PaymentAdapter, GoatCredentials, ChainKey } from '../types.js';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport { GoatX402Client } from '../goat/client.js';\nimport { CHAINS } from '../chains.js';\nimport { NPaymentError } from '../errors.js';\nimport { BtcLendingVault } from '../goat/lending.js';\nimport type { UsdcAcquisitionRouter } from '../goat/acquisition.js';\n\n/**\n * GOAT Network x402 adapter with full order lifecycle.\n *\n * Flow: parse 402 → (optional) auto-acquire USDC via UsdcAcquisitionRouter →\n * createOrder → OWS-sign ERC-20 → poll → proof → retry.\n *\n * v0.17 — `router` (optional 5th arg) wires the new acquisition pipeline. When\n * insufficient USDC is detected and `goat.autoFund.enabled` is true, the router\n * runs (swap / oft / pegin) before the GOAT order is created.\n *\n * @deprecated The `BtcLendingVault` constructor arg is retained for backwards\n *             compatibility but will be removed in v0.18 in favour of the router.\n */\nexport class GoatAdapter implements PaymentAdapter {\n  readonly protocol = 'goat';\n  private goatClient: GoatX402Client;\n  private wallet: OWSWallet;\n  private lendingVault?: BtcLendingVault;\n  private router?: UsdcAcquisitionRouter;\n  private chainKey: ChainKey;\n\n  constructor(\n    config: GoatCredentials,\n    wallet: OWSWallet,\n    chainKey?: ChainKey,\n    lendingVault?: BtcLendingVault,\n    router?: UsdcAcquisitionRouter,\n  ) {\n    this.goatClient = new GoatX402Client(config);\n    this.wallet = wallet;\n    this.chainKey = chainKey ?? (process.env.GOAT_CHAIN === 'mainnet' ? 'goat-mainnet' : 'goat-testnet');\n    this.lendingVault = lendingVault;\n    this.router = router;\n  }\n\n  detect(_response: Response): boolean {\n    return false; // Selected by chain config, not headers\n  }\n\n  async pay(url: string, init: RequestInit | undefined, response: Response): Promise<Response> {\n    const body = await response.json().catch(() => ({})) as any;\n    const accepts = body.accepts?.[0] ?? {};\n    const chainKey = this.chainKey;\n    const chain = CHAINS[chainKey];\n    const chainId = chain.chainId;\n    const amountWei = accepts.maxAmountRequired ?? '10000';\n    const targetUsdc = BigInt(amountWei);\n\n    const fromAddress = await this.wallet.getAddressAsync(chainId);\n    const usdcAddress = chain.tokens.USDC;\n\n    // ── v0.17: auto-fund USDC via router if configured & short ──\n    if (this.router && usdcAddress) {\n      const balance = await this.wallet.getBalance(usdcAddress, chainId);\n      if (balance < targetUsdc) {\n        await this.router.acquire({\n          targetUsdcWei: targetUsdc,\n          idempotencyKey: `${fromAddress}:${url}:${Math.floor(Date.now() / 60_000)}`,\n        });\n      }\n    }\n\n    // ── Legacy BTC-collateral lending path (will be removed in v0.18) ──\n    let positionTxHash: string | undefined;\n    if (this.lendingVault && !this.router) {\n      const collateral = this.lendingVault.estimateCollateral(amountWei);\n      positionTxHash = await this.lendingVault.lockAndBorrow(collateral, amountWei, chainId);\n    }\n\n    const order = await this.goatClient.createOrder({\n      dappOrderId: `npay-${Date.now()}`,\n      chainId,\n      tokenSymbol: accepts.tokenSymbol ?? 'USDC',\n      fromAddress,\n      amountWei,\n    });\n\n    const { txHash } = await this.wallet.transferERC20(\n      order.payToAddress,\n      usdcAddress ?? order.payToAddress,\n      BigInt(amountWei),\n      chainId,\n    );\n\n    const finalStatus = await this.goatClient.pollUntilTerminal(order.orderId, 120_000, 2_000);\n\n    if (finalStatus === 'FAILED' || finalStatus === 'EXPIRED' || finalStatus === 'CANCELLED') {\n      if (positionTxHash && this.lendingVault) {\n        try { await this.lendingVault.repayAndUnlock(positionTxHash, chainId); } catch { /* best-effort */ }\n      }\n      throw new NPaymentError(`GOAT order ${finalStatus}: ${order.orderId}`, 'GOAT_ORDER_FAILED');\n    }\n\n    if (positionTxHash && this.lendingVault) {\n      await this.lendingVault.repayAndUnlock(positionTxHash, chainId);\n    }\n\n    const proof = await this.goatClient.getOrderProof(order.orderId);\n\n    const retryHeaders = new Headers(init?.headers);\n    retryHeaders.set('x-payment-proof', JSON.stringify(proof));\n    retryHeaders.set('x-payment-tx', txHash);\n\n    return fetch(url, { ...init, headers: retryHeaders });\n  }\n}\n","import { NPaymentError } from '../errors.js';\n\n// ─── RLUSD Issuer Registry (single source of truth) ──────────────────────────\n\nexport type XrplNetwork = 'mainnet' | 'testnet';\n\n/**\n * Per-network RLUSD issuer addresses.\n * Source: https://docs.ripple.com/products/stablecoin/developer-resources/rlusd-on-the-xrpl\n * @default mainnet\n */\nexport const RLUSD_ISSUERS: Readonly<Record<XrplNetwork, string>> = Object.freeze({\n  mainnet: 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De',\n  testnet: 'rQhWct2fv4Vc4KRjRgMrxa8xPN9Zx9iLKV',\n});\n\n/**\n * Canonical 40-hex XRPL currency code for RLUSD. The XRPL exact x402 scheme\n * (T54 reference impl) uses this in `accepts[].asset`; the human-readable\n * \"RLUSD\" symbol is accepted only when explicitly converted by the caller.\n *\n * Source: https://xrpl-x402.t54.ai/docs/xrpl-scheme#asset-types\n */\nexport const RLUSD_HEX = '524C555344000000000000000000000000000000' as const;\n\n/**\n * Canonical RLUSD currency code as used on the wire (XRPL `Amount.currency`,\n * `LimitAmount.currency`, `account_lines.lines[].currency`, etc.). Equal to\n * {@link RLUSD_HEX}; xrpl.js v4 + rippled reject the 5-character ASCII\n * \"RLUSD\" form on every wire-bound field. For the human-readable symbol use\n * {@link RLUSD_SYMBOL}.\n */\nexport const RLUSD_CURRENCY: typeof RLUSD_HEX = RLUSD_HEX;\n\n/** Human-readable RLUSD symbol (display only — never used on the wire). */\nexport const RLUSD_SYMBOL = 'RLUSD' as const;\n\n/**\n * Default XRPL `SourceTag` stamped on x402 Payment transactions. Used by\n * T54's `x402scan` indexer to identify x402 traffic on-chain. Override per\n * route via `route.xrpl.sourceTag` or globally via `xrpl.sourceTag`.\n *\n * Source: https://xrpl-x402.t54.ai/docs/xrpl-scheme#requirements-fields\n */\nexport const DEFAULT_SOURCE_TAG = 804681468 as const;\n\n/** RLUSD has 6 decimal places on XRPL (matches XRP drops scale). */\nexport const RLUSD_DECIMALS = 6 as const;\nconst RLUSD_SCALE = 1_000_000n; // 10 ** RLUSD_DECIMALS\n\n/** Resolve the RLUSD issuer for a given XRPL network. */\nexport function getRlusdIssuer(network: XrplNetwork): string {\n  return RLUSD_ISSUERS[network];\n}\n\n/** Map a chain key to an XRPL network. Returns 'testnet' for unknown keys (safer default). */\nexport function networkFromChainKey(chainKey: string): XrplNetwork {\n  return chainKey === 'xrpl-mainnet' ? 'mainnet' : 'testnet';\n}\n\n// ─── CAIP-2 helpers (T54 / x402 v2) ──────────────────────────────────────────\n\n/** CAIP-2 network ID per the XRPL x402 spec: xrpl:0 = mainnet, xrpl:1 = testnet, xrpl:2 = devnet. */\nexport type XrplCaip2 = 'xrpl:0' | 'xrpl:1' | 'xrpl:2';\n\nconst CAIP2_BY_NETWORK: Readonly<Record<XrplNetwork, XrplCaip2>> = Object.freeze({\n  mainnet: 'xrpl:0',\n  testnet: 'xrpl:1',\n});\n\n/** XrplNetwork → CAIP-2 ID. */\nexport function toCaip2(network: XrplNetwork): XrplCaip2 {\n  return CAIP2_BY_NETWORK[network];\n}\n\n/**\n * CAIP-2 ID → XrplNetwork. Throws on unknown values.\n * Devnet (`xrpl:2`) currently maps to 'testnet' since n-payment registry has no devnet entry.\n */\nexport function parseCaip2(caip2: string): XrplNetwork {\n  switch (caip2) {\n    case 'xrpl:0':\n      return 'mainnet';\n    case 'xrpl:1':\n      return 'testnet';\n    case 'xrpl:2':\n      return 'testnet';\n    default:\n      throw new NPaymentError(\n        `Unsupported XRPL CAIP-2 network: ${JSON.stringify(caip2)}`,\n        'XRPL_INVALID_NETWORK',\n        'Use xrpl:0 (mainnet), xrpl:1 (testnet), or xrpl:2 (devnet).',\n      );\n  }\n}\n\n/**\n * Resolve a \"soft\" asset reference to the canonical XRPL form used by the\n * exact scheme: `'XRP'` stays `'XRP'`; `'RLUSD'` is upgraded to its 40-hex\n * code; an already-hex code passes through unchanged.\n */\nexport function resolveCanonicalAsset(asset: string): string {\n  if (asset === 'XRP') return 'XRP';\n  if (asset === 'RLUSD') return RLUSD_HEX;\n  if (/^[0-9A-F]{40}$/i.test(asset)) return asset.toUpperCase();\n  throw new NPaymentError(\n    `Unknown XRPL asset reference: ${JSON.stringify(asset)}`,\n    'XRPL_INVALID_ASSET',\n    'Use \"XRP\", \"RLUSD\", or a 40-hex XRPL currency code.',\n  );\n}\n\n// ─── RLUSD Amount Parsing (strict, no scientific notation) ───────────────────\n\n/**\n * Parse a decimal RLUSD amount string into 6-decimal micro-units (bigint).\n * Rejects scientific notation, NaN, negatives, and over-precision (> 6 decimals).\n *\n * @example parseRlusdAmount(\"5.123456\") → 5123456n\n * @example parseRlusdAmount(\"0.000001\") → 1n\n */\nexport function parseRlusdAmount(input: string): bigint {\n  if (typeof input !== 'string' || !/^[0-9]+(\\.[0-9]{1,6})?$/.test(input)) {\n    throw new NPaymentError(\n      `Invalid RLUSD amount: ${JSON.stringify(input)}`,\n      'XRPL_INVALID_AMOUNT',\n      'Use plain decimal notation up to 6 places, e.g. \"5.123456\".',\n    );\n  }\n  const [int, frac = ''] = input.split('.');\n  const fracPadded = (frac + '000000').slice(0, RLUSD_DECIMALS);\n  return BigInt(int) * RLUSD_SCALE + BigInt(fracPadded);\n}\n\n/** Format 6-decimal micro-units back to a decimal string. Trailing zeros trimmed. */\nexport function formatRlusdAmount(units: bigint): string {\n  if (units < 0n) throw new NPaymentError('Negative RLUSD amount', 'XRPL_INVALID_AMOUNT');\n  const int = units / RLUSD_SCALE;\n  const frac = units % RLUSD_SCALE;\n  if (frac === 0n) return int.toString();\n  const fracStr = frac.toString().padStart(RLUSD_DECIMALS, '0').replace(/0+$/, '');\n  return `${int}.${fracStr}`;\n}\n\n// ─── Slippage Math (pure) ────────────────────────────────────────────────────\n\nconst MAX_SLIPPAGE_BPS = 5000; // 50%\n\nfunction assertSlippageBps(bps: number): void {\n  if (!Number.isInteger(bps) || bps < 0 || bps > MAX_SLIPPAGE_BPS) {\n    throw new NPaymentError(\n      `Invalid slippage: ${bps} bps`,\n      'XRPL_INVALID_SLIPPAGE',\n      `Slippage must be an integer between 0 and ${MAX_SLIPPAGE_BPS} bps.`,\n    );\n  }\n}\n\n/**\n * Pad a quote's source-amount-drops by the given slippage (basis points).\n * Always rounds **up** so we never under-fund the swap.\n */\nexport function padSendMaxDrops(quoteSourceDrops: bigint, slippageBps: number): bigint {\n  assertSlippageBps(slippageBps);\n  // padded = ceil(drops * (10000 + bps) / 10000)\n  const numerator = quoteSourceDrops * BigInt(10000 + slippageBps);\n  const denominator = 10000n;\n  return (numerator + denominator - 1n) / denominator;\n}\n\n/**\n * Compute the realised slippage (bps) of a quote vs. an oracle/spot rate.\n * Used to reject quotes that breach the user-configured cap.\n *\n * @param quoteSourceDrops drops the quote will spend\n * @param amountOutUnits   destination amount in 6-decimal units\n * @param spotRateDropsPerUnit drops-per-unit at oracle/spot\n */\nexport function computeQuoteSlippageBps(\n  quoteSourceDrops: bigint,\n  amountOutUnits: bigint,\n  spotRateDropsPerUnit: number,\n): number {\n  if (amountOutUnits <= 0n || spotRateDropsPerUnit <= 0) return 0;\n  const expected = BigInt(Math.ceil(Number(amountOutUnits) * spotRateDropsPerUnit));\n  if (quoteSourceDrops <= expected) return 0;\n  const diff = quoteSourceDrops - expected;\n  return Number((diff * 10000n) / expected);\n}\n","/**\n * XRPL x402 — canonical wire format and merchant-side facilitator HTTP client.\n *\n * Implements the T54 reference spec for x402 over XRPL:\n *   https://xrpl-x402.t54.ai/docs/xrpl-scheme\n *   https://xrpl.org/docs/agents/agentic-payments-x402\n *\n * Single responsibility: speak the wire. This module performs no XRPL ledger\n * work (that is in `payments.ts`), and does no HTTP framework integration\n * (that is in `middleware.ts`). It only:\n *\n *   - encodes/decodes the three x402 v2 headers (PAYMENT-REQUIRED,\n *     PAYMENT-SIGNATURE, PAYMENT-RESPONSE) as base64-JSON\n *   - builds the invoice-binding `Memo` per spec\n *   - speaks `POST /verify` and `POST /settle` against any spec-compliant\n *     facilitator (T54-hosted or self-hosted)\n *\n * The buyer adapter consumes the encoders/decoders.\n * The merchant middleware consumes both the encoders/decoders and the\n * facilitator client.\n */\n\nimport { NPaymentError } from '../errors.js';\nimport {\n  RLUSD_HEX,\n  type XrplCaip2,\n  type XrplNetwork,\n  parseCaip2,\n} from './utils.js';\n\n// ─── Wire-format types (T54 / x402 v2) ───────────────────────────────────────\n\n/**\n * `accepts[i]` shape per the XRPL exact scheme. Always emitted by the merchant\n * inside `PAYMENT-REQUIRED`; echoed by the buyer inside `PAYMENT-SIGNATURE.accepted`.\n */\nexport interface XrplPaymentRequirements {\n  scheme: 'exact';\n  network: XrplCaip2;\n  /** \"XRP\" or 40-hex canonical currency code (e.g. RLUSD_HEX). */\n  asset: string;\n  /** XRPL classic destination address (r…). */\n  payTo: string;\n  /** Drops as integer string for XRP; decimal string for IOU. */\n  amount: string;\n  /** Bounded validity window, in seconds. */\n  maxTimeoutSeconds: number;\n  extra: {\n    sourceTag: number;\n    invoiceId: string;\n    /** Required for IOU assets (e.g. RLUSD); absent for XRP. */\n    issuer?: string;\n    /** Optional XRPL DestinationTag. */\n    destinationTag?: number;\n  };\n}\n\n/** PAYMENT-REQUIRED body (server → client). */\nexport interface PaymentRequiredEnvelope {\n  x402Version: 2;\n  accepts: XrplPaymentRequirements[];\n}\n\n/** PAYMENT-SIGNATURE body (client → server). */\nexport interface PaymentSignatureEnvelope {\n  x402Version: 2;\n  accepted: XrplPaymentRequirements;\n  /**\n   * Signed XRPL Payment payload.\n   *\n   * - `signedTxBlob` — hex of the buyer-signed Payment transaction.\n   * - `invoiceId`   — the same invoice identifier carried in\n   *   `accepted.extra.invoiceId`. The T54 reference facilitator and\n   *   reference x402-xrpl Python client (server/fastapi.py L366,\n   *   client/presigned_payment_payer.py L230-L238) read the invoice id\n   *   from this field for invoice-binding verification, not from\n   *   `accepted.extra`. Without it the facilitator returns\n   *   `invalidReason=\"invalid_payload\"`.\n   */\n  payload: { signedTxBlob: string; invoiceId?: string };\n}\n\n/** PAYMENT-RESPONSE body (server → client, on success). */\nexport interface PaymentResponseEnvelope {\n  success: boolean;\n  transaction?: string;\n  network?: XrplCaip2;\n  payer?: string;\n  errorReason?: string;\n}\n\n// ─── base64-JSON helpers (cross-runtime) ─────────────────────────────────────\n\nconst encodeBase64 = (str: string): string =>\n  typeof Buffer !== 'undefined'\n    ? Buffer.from(str, 'utf8').toString('base64')\n    : btoa(unescape(encodeURIComponent(str)));\n\nconst decodeBase64 = (b64: string): string =>\n  typeof Buffer !== 'undefined'\n    ? Buffer.from(b64, 'base64').toString('utf8')\n    : decodeURIComponent(escape(atob(b64)));\n\n// ─── Encode / decode ─────────────────────────────────────────────────────────\n\n/** Encode a PAYMENT-REQUIRED challenge to its base64 header value. */\nexport function encodePaymentRequiredHeader(env: PaymentRequiredEnvelope): string {\n  assertRequired(env);\n  return encodeBase64(JSON.stringify(env));\n}\n\n/** Decode a PAYMENT-REQUIRED header value. Throws on malformed/missing fields. */\nexport function decodePaymentRequiredHeader(headerVal: string): PaymentRequiredEnvelope {\n  const env = parseJson<PaymentRequiredEnvelope>(headerVal, 'PAYMENT-REQUIRED');\n  assertRequired(env);\n  return env;\n}\n\n/** Encode a PAYMENT-SIGNATURE retry header value. */\nexport function encodePaymentSignatureHeader(env: PaymentSignatureEnvelope): string {\n  assertSignature(env);\n  return encodeBase64(JSON.stringify(env));\n}\n\n/** Decode a PAYMENT-SIGNATURE header value. Throws on malformed/missing fields. */\nexport function decodePaymentSignatureHeader(headerVal: string): PaymentSignatureEnvelope {\n  const env = parseJson<PaymentSignatureEnvelope>(headerVal, 'PAYMENT-SIGNATURE');\n  assertSignature(env);\n  return env;\n}\n\n/** Encode a PAYMENT-RESPONSE settlement header value. */\nexport function encodePaymentResponseHeader(env: PaymentResponseEnvelope): string {\n  return encodeBase64(JSON.stringify(env));\n}\n\n/** Decode a PAYMENT-RESPONSE header value. Returns null on malformed input. */\nexport function decodePaymentResponseHeader(headerVal: string): PaymentResponseEnvelope | null {\n  try {\n    return JSON.parse(decodeBase64(headerVal)) as PaymentResponseEnvelope;\n  } catch {\n    return null;\n  }\n}\n\n// ─── Invoice binding (Memo method) ───────────────────────────────────────────\n\n/** Max bytes per XRPL Memo field (rippled-enforced ceiling). */\nconst MEMO_MAX_BYTES = 1024;\n\n/**\n * Build the XRPL `Memos` entry that binds the signed transaction to a specific\n * invoice. The facilitator validates `MemoData = hex(UTF-8(invoiceId))` per the\n * \"Method A: Memos\" rule of the XRPL exact scheme.\n *\n * We use Memo binding (not InvoiceID) because it is debuggable in account_tx\n * output and is what T54's `x402scan` indexer surfaces.\n */\nexport function hexInvoiceMemo(invoiceId: string): { Memo: { MemoData: string } } {\n  if (!invoiceId || typeof invoiceId !== 'string') {\n    throw new NPaymentError('Invoice ID required for x402 Memo binding', 'XRPL_INVALID_INVOICE');\n  }\n  // Encode UTF-8 → hex, uppercase (XRPL convention).\n  let hex = '';\n  for (const byte of new TextEncoder().encode(invoiceId)) {\n    hex += byte.toString(16).padStart(2, '0');\n  }\n  hex = hex.toUpperCase();\n  if (hex.length / 2 > MEMO_MAX_BYTES) {\n    throw new NPaymentError(\n      `Invoice ID too large for Memo (${hex.length / 2} > ${MEMO_MAX_BYTES} bytes)`,\n      'XRPL_INVOICE_TOO_LARGE',\n      'Use a shorter invoice identifier (UUIDv4 recommended).',\n    );\n  }\n  return { Memo: { MemoData: hex } };\n}\n\n// ─── Default facilitator URL resolution ──────────────────────────────────────\n\nconst DEFAULT_T54_FACILITATORS: Readonly<Record<XrplNetwork, string>> = Object.freeze({\n  mainnet: 'https://xrpl-facilitator-mainnet.t54.ai',\n  testnet: 'https://xrpl-facilitator-testnet.t54.ai',\n});\n\n/** Default facilitator URL per network. T54-hosted; override via config. */\nexport function defaultFacilitatorUrl(network: XrplNetwork): string {\n  return DEFAULT_T54_FACILITATORS[network];\n}\n\n// ─── Facilitator HTTP client ─────────────────────────────────────────────────\n\nexport interface FacilitatorVerifyInput {\n  paymentPayload: PaymentSignatureEnvelope;\n  paymentRequirements: XrplPaymentRequirements;\n}\n\nexport interface FacilitatorVerifyResult {\n  isValid: boolean;\n  invalidReason?: string;\n  payer?: string;\n}\n\nexport interface FacilitatorSettleResult {\n  success: boolean;\n  transaction?: string;\n  network?: XrplCaip2;\n  payer?: string;\n  errorReason?: string;\n}\n\n/**\n * Thin HTTP client for any spec-compliant XRPL x402 facilitator (T54 hosted\n * by default). Two responsibilities only: `POST /verify` and `POST /settle`.\n *\n * SOLID — DIP: `fetchImpl` is injected so unit tests can pass a mock without\n * stubbing globals; defaults to the runtime `fetch` resolved at call-time\n * (so a later `globalThis.fetch` swap is picked up).\n */\nexport class XrplFacilitatorClient {\n  private readonly baseUrl: string;\n  private readonly fetchImpl?: typeof fetch;\n\n  constructor(baseUrl: string, fetchImpl?: typeof fetch) {\n    if (!baseUrl) {\n      throw new NPaymentError(\n        'Facilitator base URL required',\n        'XRPL_FACILITATOR_NO_URL',\n        'Pass a URL or rely on defaultFacilitatorUrl(network).',\n      );\n    }\n    this.baseUrl = baseUrl.replace(/\\/+$/, '');\n    this.fetchImpl = fetchImpl;\n  }\n\n  verify(input: FacilitatorVerifyInput): Promise<FacilitatorVerifyResult> {\n    return this.post<FacilitatorVerifyResult>('/verify', input);\n  }\n\n  settle(input: FacilitatorVerifyInput): Promise<FacilitatorSettleResult> {\n    return this.post<FacilitatorSettleResult>('/settle', input);\n  }\n\n  private async post<T>(path: string, body: unknown): Promise<T> {\n    const f = this.fetchImpl ?? globalThis.fetch;\n    let res: Response;\n    try {\n      res = await f(`${this.baseUrl}${path}`, {\n        method: 'POST',\n        headers: { 'content-type': 'application/json', accept: 'application/json' },\n        body: JSON.stringify(body),\n      });\n    } catch (err) {\n      throw new NPaymentError(\n        `Facilitator unreachable: ${(err as Error).message}`,\n        'XRPL_FACILITATOR_UNREACHABLE',\n        `Check ${this.baseUrl} or override xrpl.facilitatorUrl.`,\n      );\n    }\n    if (!res.ok) {\n      const detail = await res.text().catch(() => '');\n      throw new NPaymentError(\n        `Facilitator ${path} HTTP ${res.status}: ${detail.slice(0, 200)}`,\n        'XRPL_FACILITATOR_FAILED',\n        'See facilitator logs; the request body may have been malformed.',\n      );\n    }\n    return (await res.json()) as T;\n  }\n}\n\n// ─── Internal validators ─────────────────────────────────────────────────────\n\nfunction parseJson<T>(headerVal: string, label: string): T {\n  if (typeof headerVal !== 'string' || headerVal.length === 0) {\n    throw new NPaymentError(`Missing ${label} header`, 'XRPL_X402_MISSING_HEADER');\n  }\n  let json: string;\n  try {\n    json = decodeBase64(headerVal);\n  } catch {\n    throw new NPaymentError(`Malformed ${label} header (base64 decode failed)`, 'XRPL_X402_INVALID_HEADER');\n  }\n  try {\n    return JSON.parse(json) as T;\n  } catch {\n    throw new NPaymentError(`Malformed ${label} header (JSON parse failed)`, 'XRPL_X402_INVALID_HEADER');\n  }\n}\n\nfunction assertRequirements(req: XrplPaymentRequirements): void {\n  if (req.scheme !== 'exact') throw err('scheme must be \"exact\"');\n  parseCaip2(req.network); // throws on unknown\n  if (typeof req.asset !== 'string' || req.asset.length === 0) throw err('asset required');\n  if (req.asset !== 'XRP' && !/^[0-9A-F]{40}$/i.test(req.asset)) {\n    throw err('asset must be \"XRP\" or 40-hex currency code');\n  }\n  if (typeof req.payTo !== 'string' || !req.payTo.startsWith('r')) {\n    throw err('payTo must be an XRPL classic address (r…)');\n  }\n  if (typeof req.amount !== 'string' || req.amount.length === 0) throw err('amount required');\n  if (!Number.isFinite(req.maxTimeoutSeconds) || req.maxTimeoutSeconds <= 0) {\n    throw err('maxTimeoutSeconds must be positive');\n  }\n  if (!req.extra || typeof req.extra !== 'object') throw err('extra required');\n  if (typeof req.extra.invoiceId !== 'string' || req.extra.invoiceId.length === 0) {\n    throw err('extra.invoiceId required');\n  }\n  if (!Number.isInteger(req.extra.sourceTag) || req.extra.sourceTag < 0) {\n    throw err('extra.sourceTag must be a non-negative integer');\n  }\n  // IOU (non-XRP) assets MUST carry the issuer.\n  if (req.asset !== 'XRP' && (typeof req.extra.issuer !== 'string' || !req.extra.issuer.startsWith('r'))) {\n    throw err('extra.issuer required for IOU assets (e.g. RLUSD)');\n  }\n}\n\nfunction assertRequired(env: PaymentRequiredEnvelope): void {\n  if (!env || env.x402Version !== 2) throw err('x402Version must be 2');\n  if (!Array.isArray(env.accepts) || env.accepts.length === 0) throw err('accepts must be non-empty');\n  for (const a of env.accepts) assertRequirements(a);\n}\n\nfunction assertSignature(env: PaymentSignatureEnvelope): void {\n  if (!env || env.x402Version !== 2) throw err('x402Version must be 2');\n  if (!env.accepted) throw err('accepted required');\n  assertRequirements(env.accepted);\n  if (!env.payload?.signedTxBlob || typeof env.payload.signedTxBlob !== 'string') {\n    throw err('payload.signedTxBlob required');\n  }\n}\n\nfunction err(msg: string): NPaymentError {\n  return new NPaymentError(`Invalid x402 envelope: ${msg}`, 'XRPL_X402_INVALID_ENVELOPE');\n}\n\n// ─── Re-exports for callers that only import this module ─────────────────────\nexport { RLUSD_HEX };\n","import type { XrplWallet } from './wallet.js';\nimport type { XrplConnection } from './connection.js';\nimport { DEFAULT_SOURCE_TAG, RLUSD_CURRENCY } from './utils.js';\nimport { hexInvoiceMemo } from './x402-scheme.js';\nimport { NPaymentError } from '../errors.js';\n\n// ─── Shared types ────────────────────────────────────────────────────────────\n\nexport interface RlusdAmount {\n  currency: string;\n  issuer: string;\n  value: string;\n}\n\nexport interface IssuerOpts {\n  issuer: string;\n  currency?: string;\n}\n\nconst rlusdAmount = (issuer: string, value: string, currency: string = RLUSD_CURRENCY): RlusdAmount =>\n  ({ currency, issuer, value });\n\n// ─── Trust-line bootstrap (unified — buyer & merchant) ─────────────────────\n\n/**\n * Resolved trust-line state for a single (address, issuer, currency) tuple.\n * Returned by `ensureTrustline`. Both ok and not-ok states carry an\n * actionable hint so callers can render a clear 503 or log line.\n */\nexport interface TrustlineState {\n  /** True when the trustline exists on the configured network. */\n  ok: boolean;\n  /** When ok=false, the canonical reason. */\n  reason?: 'missing' | 'frozen' | 'limit_too_low';\n  /** Tx hash of the TrustSet, when this call created the line. */\n  txHash?: string;\n  /** True when the trustline was already present prior to this call. */\n  alreadyExisted?: boolean;\n  /** Operator-facing hint matching `reason`. */\n  hint?: string;\n}\n\n/** Options for `ensureTrustline`. SOLID-DRY: same shape used by buyer + merchant. */\nexport interface EnsureTrustlineOpts {\n  /** Address that must own the trustline (buyer self-address OR merchant payTo). */\n  address: string;\n  /** Issuer of the IOU (e.g. RLUSD issuer for the network). */\n  issuer: string;\n  /**\n   * When provided AND the trustline is missing, sign + submit a TrustSet.\n   * `signer.getAddress()` MUST equal `address` — mismatch throws\n   * `XRPL_TRUSTLINE_SIGNER_MISMATCH` (defence-in-depth against accidental\n   * cross-wallet config). Omit to run in fail-fast read-only mode.\n   */\n  signer?: XrplWallet;\n  /** @default RLUSD_CURRENCY */\n  currency?: string;\n  /** TrustSet limit value (decimal string). @default '1000000000' */\n  limit?: string;\n  /** Cache TTL in ms. @default 300_000 (5 min) */\n  cacheTtlMs?: number;\n}\n\n/** Default cache TTL for trustline state. Trustline changes are rare. */\nconst TRUSTLINE_CACHE_TTL_MS = 5 * 60 * 1000;\n\ninterface TrustlineCacheEntry { state: TrustlineState; expiresAt: number }\nconst trustlineCache = new Map<string, TrustlineCacheEntry>();\nconst trustlineLocks = new Map<string, Promise<TrustlineState>>();\n\nconst trustlineCacheKey = (address: string, issuer: string, currency: string): string =>\n  `${address}|${issuer}|${currency}`;\n\n/**\n * Idempotent trustline preflight used by both the buyer adapter and the\n * merchant paywall middleware. Reads `account_lines` once, caches the result\n * for ~5 min, and (when a signer is provided) auto-creates the line on miss.\n *\n * Behaviour matrix:\n *\n *   exists                             → { ok: true, alreadyExisted: true }\n *   missing + signer (matching addr)   → submits TrustSet, { ok: true, txHash }\n *   missing + signer (mismatch)        → throws XRPL_TRUSTLINE_SIGNER_MISMATCH\n *   missing + no signer                → { ok: false, reason: 'missing', hint }\n *\n * Concurrency: a per-address mutex coalesces parallel calls so two requests\n * arriving at the same paywall replica never submit two TrustSet txs.\n *\n * SOLID — SRP: this function does one thing (resolve trustline state).\n *        DIP : depends on the `XrplConnection` + `XrplWallet` interfaces, not\n *              concrete classes; unit tests inject mocks.\n */\nexport async function ensureTrustline(\n  connection: XrplConnection,\n  opts: EnsureTrustlineOpts,\n): Promise<TrustlineState> {\n  const {\n    address,\n    issuer,\n    signer,\n    currency = RLUSD_CURRENCY,\n    limit = '1000000000',\n    cacheTtlMs = TRUSTLINE_CACHE_TTL_MS,\n  } = opts;\n\n  const cacheKey = trustlineCacheKey(address, issuer, currency);\n  const now = Date.now();\n  const hit = trustlineCache.get(cacheKey);\n  if (hit && hit.expiresAt > now) return hit.state;\n\n  // Coalesce parallel callers on the same key — return the in-flight promise.\n  const inflight = trustlineLocks.get(cacheKey);\n  if (inflight) return inflight;\n\n  const work = (async (): Promise<TrustlineState> => {\n    const client = await connection.getClient();\n    const lines = await client.request({ command: 'account_lines', account: address });\n    const exists = lines.result.lines?.some(\n      (l: { currency: string; account: string }) => l.currency === currency && l.account === issuer,\n    );\n    if (exists) {\n      const state: TrustlineState = { ok: true, alreadyExisted: true };\n      trustlineCache.set(cacheKey, { state, expiresAt: Date.now() + cacheTtlMs });\n      return state;\n    }\n\n    if (!signer) {\n      const state: TrustlineState = {\n        ok: false,\n        reason: 'missing',\n        hint: `Address ${address} has no ${currency} trustline to issuer ${issuer}. ` +\n          'Pass a signer (xrpl.seed/xrpl.owsWallet on createPaywall) to auto-create, ' +\n          'or pre-create the trustline manually.',\n      };\n      // Cache the negative result briefly — operator may pre-create the line.\n      trustlineCache.set(cacheKey, { state, expiresAt: Date.now() + cacheTtlMs });\n      return state;\n    }\n\n    const signerAddress = await signer.getAddress();\n    if (signerAddress !== address) {\n      throw new NPaymentError(\n        `Trustline signer address mismatch: signer=${signerAddress}, expected=${address}`,\n        'XRPL_TRUSTLINE_SIGNER_MISMATCH',\n        'The signer (xrpl.seed/xrpl.owsWallet) must derive the same XRPL classic address as the trustline owner (route.xrpl.payTo or buyer self-address).',\n      );\n    }\n\n    const tx = await client.autofill({\n      TransactionType: 'TrustSet',\n      Account: address,\n      LimitAmount: { currency, issuer, value: limit },\n    });\n    const signed = await signer.sign(tx);\n    if (!signed.tx_blob) {\n      throw new NPaymentError(\n        'TrustSet signer did not return a signed tx_blob',\n        'XRPL_TRUSTLINE_SIGN_FAILED',\n        'OWS-only signers may not yet expose tx_blob for XRPL TrustSet; pre-create the trustline manually.',\n      );\n    }\n    const result = await client.submitAndWait(signed.tx_blob);\n    const txHash = result.result.hash as string | undefined;\n    const state: TrustlineState = { ok: true, txHash };\n    trustlineCache.set(cacheKey, { state, expiresAt: Date.now() + cacheTtlMs });\n    return state;\n  })();\n\n  trustlineLocks.set(cacheKey, work);\n  try {\n    return await work;\n  } finally {\n    if (trustlineLocks.get(cacheKey) === work) trustlineLocks.delete(cacheKey);\n  }\n}\n\n/** Test/operational helper — drop the entire trustline cache. */\nexport function clearTrustlineCache(): void { trustlineCache.clear(); }\n\n/**\n * @internal Test helper — pre-seed the trustline cache for `(address, issuer)`\n * as `{ ok: true, alreadyExisted: true }`. Lets test files that don't mock the\n * XRPL connection skip the preflight network round-trip.\n */\nexport function _seedTrustlineCacheOk(\n  address: string,\n  issuer: string,\n  currency: string = RLUSD_CURRENCY,\n): void {\n  trustlineCache.set(trustlineCacheKey(address, issuer, currency), {\n    state: { ok: true, alreadyExisted: true },\n    expiresAt: Date.now() + TRUSTLINE_CACHE_TTL_MS,\n  });\n}\n\n/**\n * Back-compat wrapper preserving the v0.28 `ensureTrustLine` signature\n * exported from `src/index.ts`. Delegates to the unified `ensureTrustline`.\n *\n * Returned value mirrors the legacy contract:\n *   - `null` when the trustline already existed\n *   - the TrustSet tx hash when this call created it\n *\n * @deprecated Prefer `ensureTrustline` (returns `TrustlineState`); kept for\n *             external callers depending on the v0.28 surface.\n */\nexport async function ensureTrustLine(\n  connection: XrplConnection,\n  wallet: XrplWallet,\n  opts: IssuerOpts & { limit?: string },\n): Promise<string | null> {\n  const address = await wallet.getAddress();\n  const state = await ensureTrustline(connection, {\n    address,\n    issuer: opts.issuer,\n    signer: wallet,\n    currency: opts.currency,\n    limit: opts.limit,\n  });\n  if (state.alreadyExisted) return null;\n  return state.txHash ?? null;\n}\n\n// ─── RLUSD send (Payment) ────────────────────────────────────────────────────\n\nexport async function sendRLUSD(\n  connection: XrplConnection,\n  wallet: XrplWallet,\n  destination: string,\n  amount: string,\n  opts: IssuerOpts,\n): Promise<{ hash: string; validated: boolean }> {\n  const client = await connection.getClient();\n  const address = await wallet.getAddress();\n\n  const tx = await client.autofill({\n    TransactionType: 'Payment',\n    Account: address,\n    Destination: destination,\n    Amount: rlusdAmount(opts.issuer, amount, opts.currency),\n  });\n  const signed = await wallet.sign(tx);\n  const result = await client.submitAndWait(signed.tx_blob);\n  invalidateAccountState(address);\n  return { hash: result.result.hash, validated: result.result.validated ?? false };\n}\n\n// ─── Balance read ────────────────────────────────────────────────────────────\n\nexport async function getRLUSDBalance(\n  connection: XrplConnection,\n  address: string,\n  opts: IssuerOpts,\n): Promise<string> {\n  const client = await connection.getClient();\n  const lines = await client.request({ command: 'account_lines', account: address });\n  const rlusd = lines.result.lines?.find(\n    (l: { currency: string; account: string; balance: string }) =>\n      l.currency === (opts.currency ?? RLUSD_CURRENCY) && l.account === opts.issuer,\n  );\n  return rlusd?.balance ?? '0';\n}\n\n// ─── Single-shot account state (Gstack P1+P3 fix) ────────────────────────────\n\nexport interface AccountState {\n  /** Account address (XRPL classic). */\n  address: string;\n  /** XRP balance in drops (1 XRP = 1_000_000 drops). */\n  xrpDrops: bigint;\n  /** RLUSD balance as a decimal string (matches `account_lines.balance`). */\n  rlusdBalance: string;\n  /** Whether an RLUSD trust line is set to the configured issuer. */\n  trustlineExists: boolean;\n  /** Account sequence number (for client-side sequence reservation, optional). */\n  sequence?: number;\n  /** Cache freshness — milliseconds since the read landed. */\n  ageMs: number;\n}\n\ninterface CacheEntry { state: AccountState; expiresAt: number }\nconst CACHE_TTL_MS = 4_000; // ~1 ledger close on XRPL\nconst stateCache = new Map<string, CacheEntry>();\n\n/**\n * Read xrpDrops + rlusdBalance + trustlineExists + sequence in one round-trip\n * pair (`account_info` + `account_lines`). Cached for ~1 ledger close.\n *\n * Pass `{ fresh: true }` to bypass the cache (used after a state-changing tx).\n */\nexport async function readAccountState(\n  connection: XrplConnection,\n  address: string,\n  opts: IssuerOpts & { fresh?: boolean },\n): Promise<AccountState> {\n  const cacheKey = `${address}|${opts.issuer}|${opts.currency ?? RLUSD_CURRENCY}`;\n  const now = Date.now();\n  if (!opts.fresh) {\n    const hit = stateCache.get(cacheKey);\n    if (hit && hit.expiresAt > now) {\n      return { ...hit.state, ageMs: now - (hit.expiresAt - CACHE_TTL_MS) };\n    }\n  }\n\n  const client = await connection.getClient();\n  const [info, lines] = await Promise.all([\n    client.request({ command: 'account_info', account: address }),\n    client.request({ command: 'account_lines', account: address }),\n  ]);\n\n  const xrpDrops = BigInt(info.result.account_data?.Balance ?? '0');\n  const sequence: number | undefined = info.result.account_data?.Sequence;\n  const currency = opts.currency ?? RLUSD_CURRENCY;\n  const rlusdLine = lines.result.lines?.find(\n    (l: { currency: string; account: string; balance: string }) =>\n      l.currency === currency && l.account === opts.issuer,\n  );\n  const trustlineExists = !!rlusdLine;\n  const rlusdBalance = rlusdLine?.balance ?? '0';\n\n  const state: AccountState = {\n    address,\n    xrpDrops,\n    rlusdBalance,\n    trustlineExists,\n    sequence,\n    ageMs: 0,\n  };\n  stateCache.set(cacheKey, { state, expiresAt: now + CACHE_TTL_MS });\n  return state;\n}\n\n/** Test/operational helper — drop the entire account-state cache. */\nexport function clearAccountStateCache(): void { stateCache.clear(); }\n\n/** Drop all cache entries for a given address (after a state-changing tx). */\nexport function invalidateAccountState(address: string): void {\n  const prefix = `${address}|`;\n  for (const key of stateCache.keys()) {\n    if (key.startsWith(prefix)) stateCache.delete(key);\n  }\n}\n\n// ─── X402 — presigned RLUSD Payment builder (T54 exact scheme) ───────────────\n\n/** Default LastLedgerSequence lookahead in ledgers (~80s at 4s closes). */\nconst DEFAULT_LAST_LEDGER_OFFSET = 20;\n\nexport interface BuildRlusdPaymentTxOpts {\n  /** Buyer (signer) classic address. */\n  fromAddress: string;\n  /** Merchant classic address from the challenge. */\n  payTo: string;\n  /** Decimal RLUSD amount string (e.g. \"0.01\"). */\n  amount: string;\n  /** RLUSD issuer for the target network. */\n  issuer: string;\n  /** Invoice ID — bound into MemoData (hex(UTF-8(invoiceId))). */\n  invoiceId: string;\n  /** SourceTag stamp. @default DEFAULT_SOURCE_TAG (T54 indexer tag). */\n  sourceTag?: number;\n  /** Optional XRPL DestinationTag echoed from challenge.extra.destinationTag. */\n  destinationTag?: number;\n  /** LastLedgerSequence padding (in ledgers) past current. @default 20 (~80s). */\n  lastLedgerOffset?: number;\n}\n\n/**\n * Build a *ready-to-sign* XRPL `Payment` transaction that satisfies the T54\n * exact-scheme verifier:\n *\n *   - TransactionType=Payment, IOU Amount with currency+issuer+value\n *   - SourceTag (default 804681468) so x402scan indexes it\n *   - Memos[0].MemoData = hex(UTF-8(invoiceId)) for invoice binding\n *   - LastLedgerSequence set to current+offset for bounded expiry\n *\n * No I/O beyond `connection.autofill` (single round-trip). The caller is\n * responsible for `wallet.sign(tx)` to produce the `signedTxBlob`.\n *\n * SOLID — SRP: builds one tx; no HTTP, no wire format, no signing.\n */\nexport async function buildXrplRlusdPaymentTx(\n  connection: XrplConnection,\n  opts: BuildRlusdPaymentTxOpts,\n): Promise<Record<string, unknown>> {\n  const {\n    fromAddress,\n    payTo,\n    amount,\n    issuer,\n    invoiceId,\n    sourceTag = DEFAULT_SOURCE_TAG,\n    destinationTag,\n    lastLedgerOffset = DEFAULT_LAST_LEDGER_OFFSET,\n  } = opts;\n\n  if (!fromAddress?.startsWith('r')) throw bad('fromAddress must be an XRPL classic address');\n  if (!payTo?.startsWith('r')) throw bad('payTo must be an XRPL classic address');\n  if (!issuer?.startsWith('r')) throw bad('issuer must be an XRPL classic address');\n  if (!amount) throw bad('amount required');\n\n  const memo = hexInvoiceMemo(invoiceId); // throws on oversize / empty\n\n  // T54 IOU policy: the Payment must include `SendMax` with the same\n  // currency + issuer + value as `Amount` so the Payment is locked to a\n  // same-asset direct transfer (no cross-currency / AMM hops). Without it\n  // the facilitator rejects the tx with\n  // `invalidReason=\"unsupported_payment_features\"` (see x402-xrpl@0.2.0\n  // client/presigned_payment_payer.py L202-L207).\n  const iouAmount = { currency: RLUSD_CURRENCY, issuer, value: amount };\n\n  const draft: Record<string, unknown> = {\n    TransactionType: 'Payment',\n    Account: fromAddress,\n    Destination: payTo,\n    Amount: iouAmount,\n    SendMax: iouAmount,\n    SourceTag: sourceTag,\n    Memos: [memo],\n  };\n  if (typeof destinationTag === 'number') draft.DestinationTag = destinationTag;\n\n  const client = await connection.getClient();\n  // `autofill` populates Sequence, Fee, and LastLedgerSequence from the\n  // connected ledger. We then extend LastLedgerSequence by `lastLedgerOffset`\n  // so the facilitator has time to submit before expiry.\n  const filled: Record<string, unknown> = await client.autofill(draft);\n  const baseLls = (filled.LastLedgerSequence as number | undefined) ?? 0;\n  filled.LastLedgerSequence = baseLls + lastLedgerOffset;\n  return filled;\n}\n\nfunction bad(msg: string): NPaymentError {\n  return new NPaymentError(`Invalid XRPL Payment input: ${msg}`, 'XRPL_INVALID_PAYMENT_INPUT');\n}\n","import type { PaymentAdapter, PaymentContext } from '../types.js';\nimport type { XrplWallet } from '../xrpl/wallet.js';\nimport type { XrplConnection } from '../xrpl/connection.js';\nimport type { XrplSwapClient } from '../xrpl/swap.js';\nimport type { XrplTreasuryManager } from '../xrpl/treasury.js';\nimport {\n  ensureTrustline,\n  readAccountState,\n  buildXrplRlusdPaymentTx,\n  invalidateAccountState,\n} from '../xrpl/payments.js';\nimport {\n  DEFAULT_SOURCE_TAG,\n  formatRlusdAmount,\n  getRlusdIssuer,\n  parseCaip2,\n  parseRlusdAmount,\n  RLUSD_HEX,\n  toCaip2,\n  type XrplNetwork,\n} from '../xrpl/utils.js';\nimport {\n  decodePaymentRequiredHeader,\n  encodePaymentSignatureHeader,\n  type XrplPaymentRequirements,\n} from '../xrpl/x402-scheme.js';\nimport { NPaymentError } from '../errors.js';\n\nexport interface XrplAdapterOptions {\n  /** Auto-swap XRP→RLUSD when the buyer is short. @default false */\n  autoSwap?: boolean;\n  /** Max acceptable slippage on auto-swap, in bps. @default 100 (1%) */\n  maxSlippageBps?: number;\n  /** Override the SourceTag stamped on every Payment. @default 804681468 (T54 indexer). */\n  sourceTag?: number;\n}\n\n/**\n * XRPL x402 adapter — canonical T54 / xrpl.org spec.\n *\n * Wire format (https://xrpl-x402.t54.ai/docs/xrpl-scheme):\n *   server  → client : PAYMENT-REQUIRED   (base64-JSON challenge)\n *   client  → server : PAYMENT-SIGNATURE  (base64-JSON {accepted, payload.signedTxBlob})\n *   server  → client : PAYMENT-RESPONSE   (base64-JSON settlement record)\n *\n * The buyer never submits the tx itself; it presigns a Payment with\n * {SourceTag, MemoData=hex(invoiceId), LastLedgerSequence}, and the merchant's\n * facilitator does verify+settle.\n *\n * Sequence (per-wallet serialised by an address mutex):\n *   ensureTrustLine → readAccountState → (treasury rescue) → (swap rescue) →\n *   buildXrplRlusdPaymentTx → wallet.sign → PAYMENT-SIGNATURE retry.\n *\n * RLUSD-first: XRP-asset challenges throw `XRPL_X402_XRP_PENDING` (follow-up).\n */\nexport class XrplAdapter implements PaymentAdapter {\n  readonly protocol = 'xrpl';\n  /** Per-address mutex — prevents concurrent double-swap on parallel calls. */\n  private readonly locks = new Map<string, Promise<unknown>>();\n\n  constructor(\n    private readonly wallet: XrplWallet,\n    private readonly connection: XrplConnection,\n    private readonly network: XrplNetwork,\n    private readonly swap?: XrplSwapClient,\n    private readonly treasury?: XrplTreasuryManager,\n    private readonly options: XrplAdapterOptions = {},\n  ) {}\n\n  detect(response: Response): boolean {\n    const header = readHeader(response.headers, 'PAYMENT-REQUIRED');\n    if (!header) return false;\n    try {\n      const env = decodePaymentRequiredHeader(header);\n      const a = env.accepts[0];\n      // Only handle XRPL networks; only accept XRP or RLUSD asset references.\n      if (!a.network.startsWith('xrpl:')) return false;\n      const asset = a.asset.toUpperCase();\n      return asset === 'XRP' || asset === 'RLUSD' || asset === RLUSD_HEX;\n    } catch {\n      return false;\n    }\n  }\n\n  async pay(url: string, init: RequestInit | undefined, response: Response, ctx?: PaymentContext): Promise<Response> {\n    const address = await this.wallet.getAddress();\n    const previous = this.locks.get(address) ?? Promise.resolve();\n    const work = previous.then(\n      () => this.payLocked(url, init, response, ctx),\n      () => this.payLocked(url, init, response, ctx),\n    );\n    this.locks.set(address, work);\n    try {\n      return (await work) as Response;\n    } finally {\n      if (this.locks.get(address) === work) this.locks.delete(address);\n    }\n  }\n\n  // ─── Locked critical section ───────────────────────────────────────────────\n\n  private async payLocked(\n    url: string,\n    init: RequestInit | undefined,\n    response: Response,\n    _ctx?: PaymentContext,\n  ): Promise<Response> {\n    const accepted = this.parseChallenge(response);\n\n    // RLUSD-first: XRP path is scaffolded for the follow-up PR.\n    if (accepted.asset === 'XRP') {\n      throw new NPaymentError(\n        'XRP-asset XRPL x402 not yet supported (RLUSD-first).',\n        'XRPL_X402_XRP_PENDING',\n        'Use an RLUSD-priced endpoint, or wait for the XRP-drops follow-up.',\n      );\n    }\n\n    const issuer = accepted.extra.issuer ?? getRlusdIssuer(this.network);\n    const fromAddress = await this.wallet.getAddress();\n\n    // 1. Trust line (idempotent — cached + mutex-coalesced; sibling to the merchant preflight).\n    await ensureTrustline(this.connection, {\n      address: fromAddress,\n      issuer,\n      signer: this.wallet,\n    });\n\n    // 2. Read balance once; rescue (treasury then swap) if short.\n    let state = await readAccountState(this.connection, fromAddress, { issuer });\n    const need = parseRlusdAmount(accepted.amount);\n\n    if (this.treasury?.isEnabled() && parseRlusdAmount(state.rlusdBalance) < need) {\n      try {\n        await this.treasury.ensureLiquid(accepted.amount);\n        state = await readAccountState(this.connection, fromAddress, { issuer, fresh: true });\n      } catch (err) {\n        if (!this.options.autoSwap) throw err;\n      }\n    }\n\n    if (parseRlusdAmount(state.rlusdBalance) < need) {\n      if (!this.options.autoSwap || !this.swap) {\n        throw new NPaymentError(\n          `Insufficient RLUSD: have ${formatRlusdAmount(parseRlusdAmount(state.rlusdBalance))}, need ${accepted.amount}`,\n          'XRPL_INSUFFICIENT_BALANCE',\n          'Enable xrpl.autoSwap or pre-fund the wallet with RLUSD.',\n        );\n      }\n      const shortfall = formatRlusdAmount(need - parseRlusdAmount(state.rlusdBalance));\n      await this.swap.swap({\n        from: 'XRP',\n        to: 'RLUSD',\n        amountOut: shortfall,\n        maxSlippageBps: this.options.maxSlippageBps ?? 100,\n      });\n      // Invalidate cached state so subsequent (queued) calls see the new balance.\n      invalidateAccountState(fromAddress);\n    }\n\n    // 3. Build presigned Payment + sign.\n    const tx = await buildXrplRlusdPaymentTx(this.connection, {\n      fromAddress,\n      payTo: accepted.payTo,\n      amount: accepted.amount,\n      issuer,\n      invoiceId: accepted.extra.invoiceId,\n      sourceTag: this.options.sourceTag ?? accepted.extra.sourceTag ?? DEFAULT_SOURCE_TAG,\n      destinationTag: accepted.extra.destinationTag,\n    });\n    const signed = await this.wallet.sign(tx);\n    if (!signed.tx_blob) {\n      throw new NPaymentError(\n        'Wallet did not return a signed tx_blob',\n        'XRPL_SIGN_FAILED',\n        'OWS-only signers must produce a tx_blob; use seed-mode for the buyer flow.',\n      );\n    }\n\n    // 4. Retry HTTP with canonical PAYMENT-SIGNATURE header.\n    //    NOTE: `payload.invoiceId` is required by the T54 reference\n    //    facilitator + reference x402-xrpl client (see\n    //    PaymentSignatureEnvelope.payload jsdoc). Without it\n    //    `xrpl-facilitator-{testnet|mainnet}.t54.ai/verify` returns\n    //    `invalidReason=\"invalid_payload\"`.\n    const sigHeader = encodePaymentSignatureHeader({\n      x402Version: 2,\n      accepted,\n      payload: { signedTxBlob: signed.tx_blob, invoiceId: accepted.extra.invoiceId },\n    });\n    const retryHeaders = new Headers(init?.headers);\n    retryHeaders.set('PAYMENT-SIGNATURE', sigHeader);\n    const finalResponse = await fetch(url, { ...init, headers: retryHeaders });\n\n    // 5. Fire-and-forget treasury sweep (debounced inside the manager).\n    this.treasury?.scheduleSweep();\n\n    return finalResponse;\n  }\n\n  // ─── Challenge parsing ─────────────────────────────────────────────────────\n\n  private parseChallenge(response: Response): XrplPaymentRequirements {\n    const header = readHeader(response.headers, 'PAYMENT-REQUIRED');\n    if (!header) {\n      throw new NPaymentError('Missing PAYMENT-REQUIRED header', 'XRPL_X402_MISSING_HEADER');\n    }\n    const env = decodePaymentRequiredHeader(header);\n    const a = { ...env.accepts[0] };\n\n    // Asset normalisation — accept the soft \"RLUSD\" symbol but echo the\n    // canonical 40-hex code in the PAYMENT-SIGNATURE.accepted body.\n    if (a.asset === 'RLUSD') a.asset = RLUSD_HEX;\n\n    // Network sanity — fail fast if the merchant advertises a different\n    // CAIP-2 than the adapter is configured for.\n    const challengeNetwork = parseCaip2(a.network);\n    if (challengeNetwork !== this.network) {\n      throw new NPaymentError(\n        `Network mismatch: adapter=${toCaip2(this.network)}, challenge=${a.network}`,\n        'XRPL_X402_NETWORK_MISMATCH',\n        'Configure the adapter for the same XRPL network the merchant is on.',\n      );\n    }\n    return a;\n  }\n}\n\n/** Case-insensitive header read (Node's Headers preserves case but the spec is uppercase). */\nfunction readHeader(headers: Headers, name: string): string | null {\n  return headers.get(name) ?? headers.get(name.toLowerCase()) ?? null;\n}\n","import { CHAINS } from '../chains.js';\nimport type { ChainKey } from '../types.js';\n\nexport class XrplConnection {\n  private client: any = null;\n  private serverUrl: string;\n\n  constructor(serverOrChain?: string | ChainKey) {\n    if (serverOrChain && CHAINS[serverOrChain as ChainKey]) {\n      this.serverUrl = CHAINS[serverOrChain as ChainKey].wsUrl ?? CHAINS[serverOrChain as ChainKey].rpcUrl;\n    } else {\n      this.serverUrl = serverOrChain ?? 'wss://s.altnet.rippletest.net:51233';\n    }\n  }\n\n  async connect(): Promise<any> {\n    if (this.client?.isConnected()) return this.client;\n    const { Client } = await import('xrpl');\n    this.client = new Client(this.serverUrl);\n    await this.client.connect();\n    return this.client;\n  }\n\n  async getClient(): Promise<any> {\n    if (!this.client?.isConnected()) await this.connect();\n    return this.client;\n  }\n\n  isConnected(): boolean {\n    return this.client?.isConnected() ?? false;\n  }\n\n  async disconnect(): Promise<void> {\n    if (this.client?.isConnected()) {\n      await this.client.disconnect();\n    }\n    this.client = null;\n  }\n}\n","import { NPaymentError } from '../errors.js';\nimport type { XrplConfig } from '../types.js';\n\nexport interface XrplWalletConfig {\n  seed?: string;\n  owsWallet?: string;\n}\n\nexport class XrplWallet {\n  private seed?: string;\n  private owsWallet?: string;\n  private walletInstance: any = null;\n\n  constructor(config: XrplWalletConfig) {\n    this.seed = config.seed;\n    this.owsWallet = config.owsWallet;\n    if (!this.seed && !this.owsWallet) {\n      throw new NPaymentError('XrplWallet requires seed or owsWallet', 'XRPL_NO_CREDENTIALS');\n    }\n  }\n\n  private async getWalletInstance() {\n    if (this.walletInstance) return this.walletInstance;\n    const { Wallet } = await import('xrpl');\n    if (this.seed) {\n      this.walletInstance = Wallet.fromSeed(this.seed);\n    } else if (this.owsWallet) {\n      // OWS mode: derive from OWS-managed XRPL key\n      const ows = await import('@open-wallet-standard/core');\n      const wallet = ows.getWallet(this.owsWallet);\n      const xrplAccount = wallet.accounts.find((a: any) => a.chainId?.startsWith('xrpl:'));\n      if (!xrplAccount) throw new NPaymentError('No XRPL account in OWS wallet', 'XRPL_OWS_NO_ACCOUNT');\n      this.walletInstance = { address: xrplAccount.address, classicAddress: xrplAccount.address };\n    }\n    return this.walletInstance;\n  }\n\n  async getAddress(): Promise<string> {\n    const w = await this.getWalletInstance();\n    return w.classicAddress ?? w.address;\n  }\n\n  async sign(transaction: Record<string, any>): Promise<{ tx_blob: string; hash: string }> {\n    const w = await this.getWalletInstance();\n    if (w.sign) return w.sign(transaction);\n    // OWS signing fallback\n    if (this.owsWallet) {\n      const ows = await import('@open-wallet-standard/core');\n      const result = await ows.signAndSend(this.owsWallet, 'xrpl:testnet', JSON.stringify(transaction));\n      return { tx_blob: '', hash: result.txHash };\n    }\n    throw new NPaymentError('Cannot sign: no signing capability', 'XRPL_SIGN_FAILED');\n  }\n}\n","import type { XrplWallet } from './wallet.js';\nimport type { XrplConnection } from './connection.js';\nimport { RLUSD_CURRENCY } from './utils.js';\n\nexport interface VaultCreateOptions {\n  asset?: { currency: string; issuer: string };\n  assetsMaximum?: string;\n  scale?: number;\n  isPrivate?: boolean;\n  nonTransferable?: boolean;\n}\n\nexport interface VaultInfo {\n  vaultId: string;\n  owner: string;\n  asset: { currency: string; issuer: string };\n  totalAssets: string;\n  totalShares: string;\n  lossUnrealized: string;\n  sharesMPTId: string;\n}\n\n/**\n * XLS-65 single-asset vault client.\n *\n * v0.14: issuer is injected per-network (no hardcoded mainnet issuer).\n */\nexport class XrplVaultClient {\n  constructor(\n    private readonly connection: XrplConnection,\n    private readonly wallet: XrplWallet,\n    /** RLUSD issuer for the wallet's network. Use `getRlusdIssuer(network)`. */\n    private readonly issuer: string,\n  ) {}\n\n  private defaultAsset(): { currency: string; issuer: string } {\n    return { currency: RLUSD_CURRENCY, issuer: this.issuer };\n  }\n\n  async createVault(options: VaultCreateOptions = {}): Promise<{ hash: string; vaultId: string }> {\n    const client = await this.connection.getClient();\n    const address = await this.wallet.getAddress();\n    const asset = options.asset ?? this.defaultAsset();\n\n    let flags = 0;\n    if (options.isPrivate) flags |= 0x00010000;\n    if (options.nonTransferable) flags |= 0x00020000;\n\n    const tx: Record<string, unknown> = {\n      TransactionType: 'VaultCreate',\n      Account: address,\n      Asset: asset,\n      Flags: flags,\n    };\n    if (options.assetsMaximum) tx.AssetsMaximum = options.assetsMaximum;\n    if (options.scale !== undefined) tx.Scale = options.scale;\n\n    const prepared = await client.autofill(tx);\n    const signed = await this.wallet.sign(prepared);\n    const result = await client.submitAndWait(signed.tx_blob);\n\n    const created = result.result.meta?.AffectedNodes?.find(\n      (n: { CreatedNode?: { LedgerEntryType?: string } }) => n.CreatedNode?.LedgerEntryType === 'Vault',\n    );\n    const vaultId = created?.CreatedNode?.LedgerIndex ?? result.result.hash;\n    return { hash: result.result.hash, vaultId };\n  }\n\n  async deposit(vaultId: string, amount: string): Promise<{ hash: string; sharesReceived: string }> {\n    const client = await this.connection.getClient();\n    const address = await this.wallet.getAddress();\n\n    const tx = await client.autofill({\n      TransactionType: 'VaultDeposit',\n      Account: address,\n      VaultID: vaultId,\n      Amount: { ...this.defaultAsset(), value: amount },\n    });\n    const signed = await this.wallet.sign(tx);\n    const result = await client.submitAndWait(signed.tx_blob);\n\n    const sharesReceived = this.extractSharesFromMeta(result.result.meta, address) ?? '0';\n    return { hash: result.result.hash, sharesReceived };\n  }\n\n  async withdraw(\n    vaultId: string,\n    opts: { amount?: string; shares?: string },\n  ): Promise<{ hash: string; assetsReceived: string }> {\n    const client = await this.connection.getClient();\n    const address = await this.wallet.getAddress();\n\n    const tx: Record<string, unknown> = {\n      TransactionType: 'VaultWithdraw',\n      Account: address,\n      VaultID: vaultId,\n    };\n    if (opts.amount) tx.Amount = { ...this.defaultAsset(), value: opts.amount };\n    else if (opts.shares) tx.Shares = opts.shares;\n\n    const prepared = await client.autofill(tx);\n    const signed = await this.wallet.sign(prepared);\n    const result = await client.submitAndWait(signed.tx_blob);\n    return { hash: result.result.hash, assetsReceived: opts.amount ?? '0' };\n  }\n\n  async getVaultInfo(vaultId: string): Promise<VaultInfo> {\n    const client = await this.connection.getClient();\n    const response = await client.request({ command: 'vault_info', vault_id: vaultId });\n    const v = response.result.vault ?? response.result;\n    return {\n      vaultId,\n      owner: v.Owner ?? v.Account ?? '',\n      asset: v.Asset ?? this.defaultAsset(),\n      totalAssets: v.AssetsTotal ?? '0',\n      totalShares: v.SharesTotal ?? '0',\n      lossUnrealized: v.LossUnrealized ?? '0',\n      sharesMPTId: v.MPTokenIssuanceID ?? '',\n    };\n  }\n\n  async getExchangeRate(vaultId: string): Promise<{ deposit: number; withdrawal: number }> {\n    const info = await this.getVaultInfo(vaultId);\n    const assets = parseFloat(info.totalAssets);\n    const shares = parseFloat(info.totalShares);\n    const loss = parseFloat(info.lossUnrealized);\n    if (shares === 0) return { deposit: 1, withdrawal: 1 };\n    return { deposit: assets / shares, withdrawal: (assets - loss) / shares };\n  }\n\n  private extractSharesFromMeta(meta: unknown, address: string): string | null {\n    const affected = (meta as { AffectedNodes?: unknown[] } | undefined)?.AffectedNodes;\n    if (!Array.isArray(affected)) return null;\n    for (const node of affected) {\n      const fields =\n        (node as { ModifiedNode?: { FinalFields?: Record<string, unknown> }; CreatedNode?: { NewFields?: Record<string, unknown> } })\n          .ModifiedNode?.FinalFields ??\n        (node as { CreatedNode?: { NewFields?: Record<string, unknown> } }).CreatedNode?.NewFields;\n      if (fields?.MPTokenHolder === address && fields?.MPTAmount) return String(fields.MPTAmount);\n    }\n    return null;\n  }\n}\n","import { NPaymentError } from '../errors.js';\nimport type { XrplWallet } from './wallet.js';\nimport type { XrplConnection } from './connection.js';\nimport { invalidateAccountState } from './payments.js';\nimport {\n  RLUSD_CURRENCY,\n  parseRlusdAmount,\n  padSendMaxDrops,\n  type XrplNetwork,\n} from './utils.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport type SwapAsset = 'XRP' | 'RLUSD';\n\nexport interface XrplSwapQuoteOptions {\n  from: SwapAsset;\n  to: SwapAsset;\n  /** Exact RLUSD amount to deliver (decimal string, ≤ 6 places). */\n  amountOut: string;\n}\n\nexport interface XrplSwapQuote {\n  /** Raw drops the source path will spend (un-padded). */\n  sourceAmountDrops: bigint;\n  /** Quote-time spot rate in drops-per-RLUSD-unit (6-dec micro-RLUSD). */\n  spotRateDropsPerUnit: number;\n  /** Pre-computed path array from rippled (passed verbatim into Payment.Paths). */\n  paths: unknown[];\n  /** Wall-clock ms after which the quote is considered stale. */\n  validUntil: number;\n}\n\nexport interface XrplSwapOptions extends XrplSwapQuoteOptions {\n  /** Override the configured slippage cap (bps). */\n  maxSlippageBps?: number;\n  /** Re-use a fresh quote instead of re-fetching. Must satisfy validUntil. */\n  quote?: XrplSwapQuote;\n}\n\nexport interface XrplSwapResult {\n  hash: string;\n  amountInDrops: bigint;\n  amountOut: string;\n  effectiveRateDropsPerUnit: number;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst QUOTE_TTL_MS = 5_000;\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\n/**\n * Atomic XRP↔RLUSD swap via XRPL native cross-currency Payment.\n *\n * Strategy: rippled auto-routes through AMM + DEX in a single Payment tx.\n * `SendMax` (drops cap) is the slippage cap; `Amount` is exact-deliver RLUSD.\n * No `tfPartialPayment` flag (fail-closed semantics).\n */\nexport class XrplSwapClient {\n  constructor(\n    private readonly connection: XrplConnection,\n    private readonly wallet: XrplWallet,\n    private readonly network: XrplNetwork,\n    private readonly issuer: string,\n  ) {}\n\n  /** Get a one-shot quote. Throws XRPL_NO_AMM_PATH when no path exists. */\n  async quote(opts: XrplSwapQuoteOptions): Promise<XrplSwapQuote> {\n    this.assertSupportedPair(opts);\n    const amountOutUnits = parseRlusdAmount(opts.amountOut);\n\n    const client = await this.connection.getClient();\n    const address = await this.wallet.getAddress();\n    const response = await client.request({\n      command: 'ripple_path_find',\n      source_account: address,\n      destination_account: address,\n      destination_amount: { currency: RLUSD_CURRENCY, issuer: this.issuer, value: opts.amountOut },\n      source_currencies: [{ currency: 'XRP' }],\n    });\n\n    const alternatives = response.result?.alternatives;\n    if (!Array.isArray(alternatives) || alternatives.length === 0) {\n      throw new NPaymentError(\n        `No XRP→RLUSD path on ${this.network}`,\n        'XRPL_NO_AMM_PATH',\n        'Fund the XRP/RLUSD AMM at xrpl.org/dex or pre-fund the wallet with RLUSD.',\n      );\n    }\n\n    // Pick cheapest alternative by source_amount (drops, as string).\n    const best = alternatives.reduce((a: { source_amount: string }, b: { source_amount: string }) =>\n      BigInt(a.source_amount) <= BigInt(b.source_amount) ? a : b,\n    ) as { source_amount: string; paths_computed?: unknown[] };\n\n    const sourceAmountDrops = BigInt(best.source_amount);\n    const spotRateDropsPerUnit = Number(sourceAmountDrops) / Number(amountOutUnits);\n\n    return {\n      sourceAmountDrops,\n      spotRateDropsPerUnit,\n      paths: best.paths_computed ?? [],\n      validUntil: Date.now() + QUOTE_TTL_MS,\n    };\n  }\n\n  /**\n   * Execute the swap. Re-quotes unless a fresh `opts.quote` is provided.\n   * Throws XRPL_QUOTE_STALE / XRPL_SLIPPAGE_EXCEEDED / XRPL_SWAP_FAILED.\n   */\n  async swap(opts: XrplSwapOptions): Promise<XrplSwapResult> {\n    this.assertSupportedPair(opts);\n    const slippageBps = opts.maxSlippageBps ?? 100;\n    let quote = opts.quote;\n\n    if (quote) {\n      if (Date.now() > quote.validUntil) {\n        throw new NPaymentError(\n          'Quote expired',\n          'XRPL_QUOTE_STALE',\n          `Quote validUntil=${quote.validUntil} elapsed; re-fetch via swap.quote().`,\n        );\n      }\n    } else {\n      quote = await this.quote({ from: opts.from, to: opts.to, amountOut: opts.amountOut });\n    }\n\n    const sendMaxDrops = padSendMaxDrops(quote.sourceAmountDrops, slippageBps);\n\n    const client = await this.connection.getClient();\n    const address = await this.wallet.getAddress();\n    const tx: Record<string, unknown> = {\n      TransactionType: 'Payment',\n      Account: address,\n      Destination: address,\n      Amount: { currency: RLUSD_CURRENCY, issuer: this.issuer, value: opts.amountOut },\n      SendMax: sendMaxDrops.toString(),\n    };\n    if (quote.paths.length > 0) tx.Paths = quote.paths;\n\n    const prepared = await client.autofill(tx);\n    const signed = await this.wallet.sign(prepared);\n    const result = await client.submitAndWait(signed.tx_blob);\n    invalidateAccountState(address);\n\n    const engine = result.result?.meta?.TransactionResult ?? result.result?.engine_result;\n    if (engine && engine !== 'tesSUCCESS') {\n      throw new NPaymentError(\n        `XRPL swap failed: ${engine}`,\n        'XRPL_SWAP_FAILED',\n        engine === 'tecPATH_PARTIAL' || engine === 'tecPATH_DRY'\n          ? 'Try a wider slippage cap or wait for AMM liquidity to recover.'\n          : `Inspect tx ${result.result?.hash} on a XRPL explorer.`,\n      );\n    }\n\n    return {\n      hash: result.result.hash,\n      amountInDrops: sendMaxDrops,\n      amountOut: opts.amountOut,\n      effectiveRateDropsPerUnit: quote.spotRateDropsPerUnit,\n    };\n  }\n\n  private assertSupportedPair(opts: XrplSwapQuoteOptions): void {\n    // Compare against the human-readable symbol — `opts.to` is the public\n    // SwapAsset enum ('XRP' | 'RLUSD'), not a wire currency code.\n    if (opts.from !== 'XRP' || opts.to !== 'RLUSD') {\n      throw new NPaymentError(\n        `Unsupported swap pair: ${opts.from}→${opts.to}`,\n        'XRPL_UNSUPPORTED_PAIR',\n        'v0.14 supports XRP→RLUSD only. Other pairs land in a future release.',\n      );\n    }\n  }\n}\n","import { NPaymentError } from '../errors.js';\nimport type { XrplConnection } from './connection.js';\nimport type { XrplWallet } from './wallet.js';\nimport type { XrplVaultClient } from './vault.js';\nimport type { XrplTreasuryConfigInput } from '../types.js';\nimport { readAccountState } from './payments.js';\nimport {\n  formatRlusdAmount,\n  getRlusdIssuer,\n  parseRlusdAmount,\n  type XrplNetwork,\n} from './utils.js';\n\n// ─── VaultId persistence (Gstack Q1 fix) ─────────────────────────────────────\n\n/**\n * Persistence contract for auto-provisioned vault IDs.\n * v0.14 ships memory-only; consumers can inject Redis/DB/file impls.\n */\nexport interface VaultIdStore {\n  read(walletAddress: string): Promise<string | null>;\n  write(walletAddress: string, vaultId: string): Promise<void>;\n}\n\n/**\n * In-process VaultIdStore. Vault ID is **ephemeral on restart**.\n * For production, inject a durable store (Redis, DB, file) via `treasury.store`.\n */\nexport class MemoryVaultIdStore implements VaultIdStore {\n  private readonly store = new Map<string, string>();\n  async read(addr: string): Promise<string | null> { return this.store.get(addr) ?? null; }\n  async write(addr: string, id: string): Promise<void> { this.store.set(addr, id); }\n}\n\n// ─── Runtime config (extends the public input config) ────────────────────────\n\nexport interface XrplTreasuryConfig extends XrplTreasuryConfigInput {\n  store?: VaultIdStore;\n  /** Min drops the wallet must hold before VaultCreate (covers owner reserve). @default 5_000_000 */\n  minXrpReserve?: bigint;\n}\n\nexport interface XrplTreasuryDeps {\n  connection: XrplConnection;\n  wallet: XrplWallet;\n  vault: XrplVaultClient;\n  network: XrplNetwork;\n}\n\nexport interface XrplTreasuryState {\n  /** Decimal RLUSD held liquid in the main account. */\n  liquid: string;\n  /** Decimal RLUSD-equivalent held in the vault (totalAssets at last read). */\n  supplied: string;\n  /** Active vault ID (configured or auto-provisioned). */\n  vaultId?: string;\n  /** Wallet classic address. */\n  address: string;\n}\n\n// ─── Manager (mirrors AaveTreasuryManager shape) ─────────────────────────────\n\nconst DEFAULT_MIN_IDLE = '10';            // 10 RLUSD\nconst DEFAULT_MIN_XRP_RESERVE = 5_000_000n; // 5 XRP in drops\nconst DEFAULT_SWEEP_DEBOUNCE_MS = 30_000;\n\nexport class XrplTreasuryManager {\n  private readonly store: VaultIdStore;\n  private readonly issuer: string;\n  private readonly minIdleUnits: bigint;\n  private readonly minXrpReserve: bigint;\n  private readonly sweepDebounceMs: number;\n  private cachedVaultId?: string;\n  private sweepTimer?: ReturnType<typeof setTimeout>;\n\n  constructor(\n    private readonly config: XrplTreasuryConfig,\n    private readonly deps: XrplTreasuryDeps,\n  ) {\n    this.store = config.store ?? new MemoryVaultIdStore();\n    this.issuer = getRlusdIssuer(deps.network);\n    this.minIdleUnits = parseRlusdAmount(config.minIdleBalance ?? DEFAULT_MIN_IDLE);\n    this.minXrpReserve = config.minXrpReserve ?? DEFAULT_MIN_XRP_RESERVE;\n    this.sweepDebounceMs = config.sweepDebounceMs ?? DEFAULT_SWEEP_DEBOUNCE_MS;\n    if (config.vaultId) this.cachedVaultId = config.vaultId;\n  }\n\n  isEnabled(): boolean { return this.config.autoYield === true; }\n\n  /**\n   * Resolve the active vault ID, auto-provisioning when configured.\n   * Throws XRPL_NO_VAULT if neither configured nor auto-provisionable.\n   * Throws XRPL_INSUFFICIENT_XRP_RESERVE before VaultCreate to avoid cryptic rippled errors.\n   */\n  async ensureVault(): Promise<string> {\n    if (this.cachedVaultId) return this.cachedVaultId;\n    const address = await this.deps.wallet.getAddress();\n\n    const stored = await this.store.read(address);\n    if (stored) { this.cachedVaultId = stored; return stored; }\n\n    if (!this.config.autoCreate) {\n      throw new NPaymentError(\n        'No vaultId configured and autoCreate disabled',\n        'XRPL_NO_VAULT',\n        'Pass xrpl.treasury.vaultId or xrpl.treasury.autoCreate: true.',\n      );\n    }\n\n    // Reserve precheck (Gstack Q6).\n    const state = await readAccountState(this.deps.connection, address, { issuer: this.issuer });\n    if (state.xrpDrops < this.minXrpReserve) {\n      throw new NPaymentError(\n        `Insufficient XRP reserve to auto-provision vault: have ${state.xrpDrops} drops, need ≥ ${this.minXrpReserve}`,\n        'XRPL_INSUFFICIENT_XRP_RESERVE',\n        'Fund the wallet with at least 5 XRP, or pre-create the vault and pass xrpl.treasury.vaultId.',\n      );\n    }\n\n    let vaultId: string;\n    try {\n      const created = await this.deps.vault.createVault({ scale: 6 });\n      vaultId = created.vaultId;\n    } catch (err) {\n      throw new NPaymentError(\n        `Vault auto-provision failed: ${(err as Error).message}`,\n        'XRPL_VAULT_AUTO_PROVISION_FAILED',\n        'Inspect rippled logs; XLS-65 may not be enabled on this network.',\n      );\n    }\n    await this.store.write(address, vaultId);\n    this.cachedVaultId = vaultId;\n    if (this.store instanceof MemoryVaultIdStore) {\n      console.warn(\n        `[n-payment][xrpl] Auto-provisioned vault ${vaultId} stored in memory only. ` +\n        'Inject a durable VaultIdStore via xrpl.treasury.store to avoid orphan vaults on restart.',\n      );\n    }\n    return vaultId;\n  }\n\n  /** Withdraw from vault if liquid balance < amount. No-op when sufficient. */\n  async ensureLiquid(amountRlusd: string): Promise<void> {\n    const need = parseRlusdAmount(amountRlusd);\n    const address = await this.deps.wallet.getAddress();\n    const state = await readAccountState(this.deps.connection, address, { issuer: this.issuer });\n    const liquid = parseRlusdAmount(state.rlusdBalance);\n    if (liquid >= need) return;\n\n    const vaultId = await this.ensureVault();\n    const shortfall = need - liquid;\n    await this.deps.vault.withdraw(vaultId, { amount: formatRlusdAmount(shortfall) });\n  }\n\n  /**\n   * Schedule a debounced sweep. Coalesces rapid-fire calls into a single\n   * VaultDeposit per `sweepDebounceMs` window (Gstack P4).\n   */\n  scheduleSweep(): void {\n    if (!this.isEnabled()) return;\n    if (this.sweepTimer) clearTimeout(this.sweepTimer);\n    this.sweepTimer = setTimeout(() => {\n      this.sweepTimer = undefined;\n      // Best-effort — never throw upstream.\n      void this.sweepExcess().catch((e) =>\n        console.warn('[n-payment][xrpl] sweep failed:', (e as Error)?.message),\n      );\n    }, this.sweepDebounceMs);\n    // Don't keep the event loop alive solely for a sweep timer.\n    if (typeof this.sweepTimer === 'object' && 'unref' in this.sweepTimer) {\n      (this.sweepTimer as { unref: () => void }).unref();\n    }\n  }\n\n  /** Deposit any RLUSD above `minIdleBalance` into the vault. */\n  async sweepExcess(): Promise<void> {\n    if (!this.isEnabled()) return;\n    const address = await this.deps.wallet.getAddress();\n    const state = await readAccountState(this.deps.connection, address, { issuer: this.issuer, fresh: true });\n    const liquid = parseRlusdAmount(state.rlusdBalance);\n    if (liquid <= this.minIdleUnits) return;\n    const vaultId = await this.ensureVault();\n    const excess = liquid - this.minIdleUnits;\n    await this.deps.vault.deposit(vaultId, formatRlusdAmount(excess));\n  }\n\n  async getState(): Promise<XrplTreasuryState> {\n    const address = await this.deps.wallet.getAddress();\n    const account = await readAccountState(this.deps.connection, address, { issuer: this.issuer });\n    let supplied = '0';\n    let vaultId = this.cachedVaultId ?? (await this.store.read(address)) ?? undefined;\n    if (vaultId) {\n      try {\n        const info = await this.deps.vault.getVaultInfo(vaultId);\n        supplied = info.totalAssets;\n      } catch { /* vault may not exist on chain yet — best-effort */ }\n    }\n    return { liquid: account.rlusdBalance, supplied, vaultId, address };\n  }\n}\n","import { NPaymentError } from '../errors.js';\n\n/**\n * v0.21 — KYA-tier gate primitive.\n *\n * Server-side `StellarKyaGate` middleware checks endpoint access by Know-Your-Agent\n * tier (ERC-8004 + Skyfire-compatible). Buyer-side `StellarKyaCredentialFetcher`\n * pulls a fresh signed credential and base64-encodes it for the `x-kya-credential`\n * request header. Bare-gate by design: caller supplies the oracle URL — no oracle\n * infra ships in this repo.\n *\n * Design (SOLID):\n *   - SRP — verification + fetch only.\n *   - DIP — `StellarKyaGate` depends on a canonical-body verifier, not on a\n *           specific oracle URL or transport.\n *   - DRY — `canonicalCredentialBytes` is the single source of the\n *           sign-and-verify byte layout (used by both sides).\n */\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface KyaCredential {\n  /** Agent's Stellar G... address. */\n  agentAddress: string;\n  /** ERC-8004 reputation reading at issue time (0-100). */\n  reputationScore: number;\n  /** KYA tier (0=anon, 1=email, 2=KYC-light, 3=KYC-full). */\n  kyaTier: number;\n  /** ISO timestamp when the credential was issued. */\n  issuedAt: string;\n  /** ISO timestamp when the credential expires. */\n  validUntil: string;\n  /** Issuing oracle's identifier (e.g. 'erc8004:base:0x…'). */\n  issuer: string;\n  /** Base64-encoded ed25519 signature over canonical body bytes. */\n  signature: string;\n}\n\nexport interface KyaGateConfig {\n  /** Minimum KYA tier required to access the gated endpoint. */\n  minKyaTier: number;\n  /** Optional pubkey of the trusted oracle issuer (G... 56-char). Defaults to env STELLAR_KYA_ORACLE_PUBKEY. */\n  trustedIssuerPubkey?: string;\n  /** Max age of the credential (ms). Default 5 minutes. */\n  maxAgeMs?: number;\n}\n\n// Minimal Express-compatible types, declared inline so this module has no `express` dep.\ntype ExpressReq = { header(name: string): string | undefined } & Record<string, unknown>;\ntype ExpressRes = {\n  status(code: number): ExpressRes;\n  json(body: unknown): ExpressRes;\n};\ntype ExpressNext = (err?: unknown) => void;\n\n// ─── Canonical bytes helper (DRY: single source of sign+verify byte layout) ─\n\n/**\n * Canonical JSON of the credential body (excluding signature), with sorted keys.\n * Both the issuing oracle and the verifying gate must produce identical bytes.\n */\nexport function canonicalCredentialBytes(cred: KyaCredential): Uint8Array {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const { signature: _drop, ...body } = cred;\n  const sorted = Object.keys(body)\n    .sort()\n    .reduce<Record<string, unknown>>((acc, k) => {\n      acc[k] = (body as Record<string, unknown>)[k];\n      return acc;\n    }, {});\n  return new TextEncoder().encode(JSON.stringify(sorted));\n}\n\n// ─── Server middleware ──────────────────────────────────────────────────────\n\nconst FIVE_MIN_MS = 5 * 60 * 1000;\n\nexport class StellarKyaGate {\n  private sdkPromise?: Promise<unknown>;\n\n  constructor(private readonly config: KyaGateConfig) {}\n\n  /**\n   * Express middleware: rejects requests below `minKyaTier` or with invalid signature.\n   * On success, attaches the verified credential to `req.kya` for downstream handlers.\n   */\n  middleware() {\n    return async (req: ExpressReq, res: ExpressRes, next: ExpressNext): Promise<void> => {\n      const header = req.header('x-kya-credential');\n      if (!header) {\n        res.status(402).json({\n          error: 'KYA credential required',\n          kya_required: true,\n          min_kya_tier: this.config.minKyaTier,\n          hint: 'Attach `x-kya-credential` header (base64 of signed JSON). See https://n-payment.dev/docs/kya',\n        });\n        return;\n      }\n\n      let cred: KyaCredential;\n      try {\n        cred = JSON.parse(Buffer.from(header, 'base64').toString());\n      } catch {\n        res.status(400).json({ error: 'Malformed KYA credential', code: 'KYA_BAD_CREDENTIAL' });\n        return;\n      }\n\n      const verdict = await this.verify(cred);\n      if (!verdict.valid) {\n        res.status(403).json({ error: `KYA gate rejected: ${verdict.reason}` });\n        return;\n      }\n\n      (req as Record<string, unknown>).kya = cred;\n      next();\n    };\n  }\n\n  /** Programmatic verifier — same logic as middleware, returned as a discriminated result. */\n  async verify(cred: KyaCredential): Promise<{ valid: true } | { valid: false; reason: string }> {\n    if (cred.kyaTier < this.config.minKyaTier) {\n      return { valid: false, reason: `tier ${cred.kyaTier} < required ${this.config.minKyaTier}` };\n    }\n    const now = Date.now();\n    const issuedAtMs = Date.parse(cred.issuedAt);\n    if (Number.isNaN(issuedAtMs)) return { valid: false, reason: 'malformed issuedAt' };\n    const age = now - issuedAtMs;\n    const maxAge = this.config.maxAgeMs ?? FIVE_MIN_MS;\n    if (age > maxAge) return { valid: false, reason: `credential too old: ${age}ms > ${maxAge}ms` };\n    const validUntilMs = Date.parse(cred.validUntil);\n    if (Number.isNaN(validUntilMs)) return { valid: false, reason: 'malformed validUntil' };\n    if (now > validUntilMs) return { valid: false, reason: 'credential expired' };\n\n    const issuerPubkey = this.config.trustedIssuerPubkey ?? process.env.STELLAR_KYA_ORACLE_PUBKEY;\n    if (!issuerPubkey) {\n      throw new NPaymentError(\n        'No trustedIssuerPubkey configured',\n        'KYA_NO_ISSUER',\n        'Set STELLAR_KYA_ORACLE_PUBKEY env or pass trustedIssuerPubkey in KyaGateConfig.',\n      );\n    }\n    const ok = await this.verifySignature(cred, issuerPubkey);\n    return ok ? { valid: true } : { valid: false, reason: 'invalid signature' };\n  }\n\n  private async verifySignature(cred: KyaCredential, issuerPubkey: string): Promise<boolean> {\n    const sdk = (await this.loadSdk()) as { Keypair: { fromPublicKey(p: string): { verify(msg: Buffer, sig: Buffer): boolean } } };\n    const pubkey = sdk.Keypair.fromPublicKey(issuerPubkey);\n    return pubkey.verify(Buffer.from(canonicalCredentialBytes(cred)), Buffer.from(cred.signature, 'base64'));\n  }\n\n  private loadSdk(): Promise<unknown> {\n    if (!this.sdkPromise) {\n      this.sdkPromise = import('@stellar/stellar-sdk').catch(() => {\n        throw new NPaymentError(\n          '@stellar/stellar-sdk peer dependency not installed',\n          'STELLAR_SDK_MISSING',\n          'Install: npm install @stellar/stellar-sdk',\n        );\n      });\n    }\n    return this.sdkPromise;\n  }\n}\n\n// ─── Buyer-side credential fetcher ──────────────────────────────────────────\n\nexport class StellarKyaCredentialFetcher {\n  constructor(private readonly oracleUrl: string, private readonly apiKey?: string) {}\n\n  /** Request a fresh credential from the off-chain ERC-8004 oracle for the given agent address. */\n  async fetch(agentAddress: string): Promise<KyaCredential> {\n    const url = `${this.oracleUrl.replace(/\\/$/, '')}/credentials/${encodeURIComponent(agentAddress)}`;\n    const res = await fetch(url, {\n      headers: this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : undefined,\n    });\n    if (!res.ok) {\n      throw new NPaymentError(\n        `KYA oracle credential fetch failed: ${res.status} ${res.statusText}`,\n        'KYA_ORACLE_FETCH_FAILED',\n        `Verify oracle URL + API key. URL: ${url}`,\n      );\n    }\n    return (await res.json()) as KyaCredential;\n  }\n\n  /** Encode a credential as the canonical base64 header value. */\n  static encodeHeader(cred: KyaCredential): string {\n    return Buffer.from(JSON.stringify(cred)).toString('base64');\n  }\n\n  /** Decode a header value back to a credential (utility for tests + adapters). */\n  static decodeHeader(header: string): KyaCredential {\n    return JSON.parse(Buffer.from(header, 'base64').toString());\n  }\n}\n\n// ─── Adapter helper (DRY: single attach-on-retry path used by all 3 adapters) ─\n\n/**\n * If the 402 challenge declares `kya_required: true`, fetch a credential and\n * attach `x-kya-credential` to the headers map. No-op when not required.\n *\n * Throws KYA_NOT_CONFIGURED if required but no fetcher is supplied.\n */\nexport async function attachKyaIfRequired(\n  headers: Headers,\n  challenge: { kya_required?: boolean } | undefined,\n  fetcher: StellarKyaCredentialFetcher | undefined,\n  agentAddress: string,\n): Promise<void> {\n  if (!challenge?.kya_required) return;\n  if (!fetcher) {\n    throw new NPaymentError(\n      'Endpoint requires KYA but no kyaFetcher configured',\n      'KYA_NOT_CONFIGURED',\n      'Pass kyaFetcher: new StellarKyaCredentialFetcher(oracleUrl) to the adapter constructor.',\n    );\n  }\n  const cred = await fetcher.fetch(agentAddress);\n  headers.set('x-kya-credential', StellarKyaCredentialFetcher.encodeHeader(cred));\n}\n","import type { PaymentAdapter, PaymentContext, ChainKey } from '../types.js';\nimport type { StellarSigner } from '../stellar/signer.js';\nimport type { StellarChannelsClient } from '../stellar/channels-client.js';\nimport { CHAINS } from '../chains.js';\nimport { ChallengeParseError, NPaymentError } from '../errors.js';\nimport { attachKyaIfRequired, type StellarKyaCredentialFetcher } from '../stellar/kya.js';\n\n/**\n * Stellar x402 adapter — wraps @x402/stellar's ExactStellarScheme.\n *\n * Single responsibility: orchestrate the Stellar x402 flow.\n *   1. Parse 402 → x402 v2 challenge\n *   2. (Optional) facilitator.verify() when apiKey present\n *   3. Build signed payment payload via @x402/stellar\n *   4. (v0.21) Attach x-kya-credential when challenge declares kya_required\n *   5. Retry with x-payment-signature + x-payment-network + x-payment-reference-key\n *\n * Routing: chain-config-driven (detect inspects `accepts[0].network`).\n */\nexport class StellarX402Adapter implements PaymentAdapter {\n  readonly protocol = 'stellar-x402';\n\n  constructor(\n    private readonly signer: StellarSigner,\n    private readonly chainKey: ChainKey,\n    private readonly channelsClient?: StellarChannelsClient,\n    private readonly rpcUrl?: string,\n    /** v0.21 — optional KYA fetcher for endpoints with `kya_required:true` in challenge `extra`. */\n    private readonly kyaFetcher?: StellarKyaCredentialFetcher,\n  ) {}\n\n  detect(response: Response): boolean {\n    const header = response.headers.get('payment-required') ?? response.headers.get('x-payment-required');\n    if (!header) return false;\n    try {\n      const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n      const network = decoded?.accepts?.[0]?.network as string | undefined;\n      return !!network && network.startsWith('stellar:');\n    } catch {\n      return false;\n    }\n  }\n\n  async pay(\n    url: string,\n    init: RequestInit | undefined,\n    response: Response,\n    ctx?: PaymentContext,\n  ): Promise<Response> {\n    const paymentRequired = this.parsePaymentRequired(response);\n    const requirements = paymentRequired.accepts?.[0];\n    if (!requirements) throw new ChallengeParseError('No accepts[] in Stellar x402 challenge', 'STELLAR_X402_NO_ACCEPTS');\n\n    // Build signed payload via @x402/stellar (canonical Stellar SDK)\n    const { ExactStellarScheme } = await this.loadX402Stellar();\n    const x402Signer = await this.adaptSignerForX402();\n    const scheme = new ExactStellarScheme(x402Signer, this.rpcUrl ? { url: this.rpcUrl } : undefined);\n\n    const paymentPayload = await scheme.createPaymentPayload(paymentRequired);\n\n    // Optional verify (only when apiKey present — Coinbase free path skips verify and lets settle handle it)\n    if (this.channelsClient && this.hasApiKey(this.channelsClient)) {\n      const verifyRes = await this.channelsClient.verify(paymentPayload, requirements);\n      if (!verifyRes.isValid) {\n        throw new NPaymentError(\n          `Stellar x402 verify rejected: ${verifyRes.invalidReason ?? 'unknown'}`,\n          'STELLAR_X402_VERIFY_FAILED',\n        );\n      }\n    }\n\n    // Retry with encoded x402 v2 payment header\n    const retryHeaders = new Headers(init?.headers);\n    retryHeaders.set('x-payment-signature', Buffer.from(JSON.stringify(paymentPayload)).toString('base64'));\n    retryHeaders.set('x-payment-network', requirements.network);\n    retryHeaders.set('x-payment-from', this.signer.address);\n    if (ctx?.referenceKey) retryHeaders.set('x-payment-reference-key', ctx.referenceKey);\n    // v0.21 — KYA pass-through. No-op when challenge has no `kya_required` flag.\n    await attachKyaIfRequired(retryHeaders, requirements.extra, this.kyaFetcher, this.signer.address);\n    return fetch(url, { ...init, headers: retryHeaders });\n  }\n\n  // ─── Helpers (private) ───────────────────────────────────────────────────\n\n  private parsePaymentRequired(response: Response): { x402Version: number; accepts: any[] } {\n    const header = response.headers.get('payment-required') ?? response.headers.get('x-payment-required');\n    if (!header) throw new ChallengeParseError('Missing payment-required header', 'STELLAR_X402_NO_CHALLENGE');\n    try {\n      return JSON.parse(Buffer.from(header, 'base64').toString());\n    } catch (err) {\n      throw new ChallengeParseError(\n        `Invalid Stellar x402 payment-required header: ${(err as Error).message}`,\n        'STELLAR_X402_BAD_CHALLENGE',\n      );\n    }\n  }\n\n  /** Adapt our StellarSigner to the @x402/stellar signer shape (only address + signAuthEntry). */\n  private async adaptSignerForX402(): Promise<{ address: string; signAuthEntry: (entry: string, passphrase: string) => Promise<string> }> {\n    return {\n      address: this.signer.address,\n      signAuthEntry: (entry: string, passphrase: string) => this.signer.signAuthEntry(entry, passphrase),\n    };\n  }\n\n  private async loadX402Stellar(): Promise<{ ExactStellarScheme: any }> {\n    try {\n      // Subpath import per @x402/stellar guide\n      return await import('@x402/stellar/exact/client' as any);\n    } catch {\n      throw new NPaymentError(\n        '@x402/stellar peer dependency not installed',\n        'X402_STELLAR_MISSING',\n        'Install: npm install @x402/stellar @x402/core @x402/fetch',\n      );\n    }\n  }\n\n  private hasApiKey(client: StellarChannelsClient): boolean {\n    return !!(client as unknown as { apiKey?: string }).apiKey;\n  }\n}\n\n/** v0.10 — kept for chain-config introspection but no longer used in pay(). */\nexport const STELLAR_NETWORK_PASSPHRASES: Record<string, string> = {\n  'stellar:testnet': 'Test SDF Network ; September 2015',\n  'stellar:pubnet': 'Public Global Stellar Network ; September 2015',\n};\n\n// Side-effect: ensure CHAINS is importable for downstream chain checks.\nvoid CHAINS;\n\n","import type { PaymentAdapter, PaymentContext, ChainKey } from '../types.js';\nimport type { StellarSigner } from '../stellar/signer.js';\nimport { CHAINS } from '../chains.js';\nimport { NPaymentError } from '../errors.js';\nimport { attachKyaIfRequired, type StellarKyaCredentialFetcher } from '../stellar/kya.js';\n\n/**\n * Stellar MPP Charge adapter — wraps @stellar/mpp/charge/client.\n *\n * Modes:\n *   - 'pull' (default) — server broadcasts the signed transaction; supports sponsored fees\n *   - 'push'           — client broadcasts; sends tx hash for server verification\n *\n * v0.21 — optional KYA fetcher: when challenge contains `kya_required=\"true\"`, the adapter\n * attaches `x-kya-credential` on the retry. No-op when not declared.\n *\n * Routing: detects www-authenticate \"Payment\" + Stellar SAC contract in the asset field.\n */\nexport type MppChargeMode = 'pull' | 'push';\n\nexport class StellarMppAdapter implements PaymentAdapter {\n  readonly protocol = 'stellar-mpp';\n\n  constructor(\n    private readonly signer: StellarSigner,\n    private readonly chainKey: ChainKey,\n    private readonly mode: MppChargeMode = 'pull',\n    /** v0.21 — optional KYA fetcher for endpoints declaring kya_required=\"true\" in www-authenticate. */\n    private readonly kyaFetcher?: StellarKyaCredentialFetcher,\n  ) {}\n\n  detect(response: Response): boolean {\n    const auth = (response.headers.get('www-authenticate') ?? '').toLowerCase();\n    return auth.includes('payment') && (auth.includes('stellar') || auth.includes('soroban'));\n  }\n\n  async pay(\n    url: string,\n    init: RequestInit | undefined,\n    response: Response,\n    ctx?: PaymentContext,\n  ): Promise<Response> {\n    const challenge = this.parseChallenge(response);\n    const networkPassphrase = this.passphrase();\n\n    // Adapt our StellarSigner to the keypair shape @stellar/mpp expects.\n    // Only signTransaction is required for pull mode; signAuthEntry for sponsored fees.\n    const keypairProxy = this.adaptSignerForMpp(networkPassphrase);\n\n    const { stellar } = await this.loadStellarMpp();\n    const credential = await stellar.charge({\n      keypair: keypairProxy,\n      mode: this.mode,\n      // @stellar/mpp reads the rest of the challenge fields from the WWW-Authenticate header\n    }).buildCredential(challenge);\n\n    const retryHeaders = new Headers(init?.headers);\n    retryHeaders.set('authorization', `Payment ${credential}`);\n    retryHeaders.set('x-payment-network', challenge.network);\n    retryHeaders.set('x-payment-from', this.signer.address);\n    if (ctx?.referenceKey) retryHeaders.set('x-payment-reference-key', ctx.referenceKey);\n    // v0.21 — KYA pass-through. No-op when challenge omits the directive.\n    await attachKyaIfRequired(retryHeaders, { kya_required: challenge.kyaRequired }, this.kyaFetcher, this.signer.address);\n    return fetch(url, { ...init, headers: retryHeaders });\n  }\n\n  // ─── Helpers ──────────────────────────────────────────────────────────────\n\n  private parseChallenge(response: Response): { recipient: string; amount: string; currency: string; network: string; kyaRequired: boolean } {\n    const auth = response.headers.get('www-authenticate') ?? '';\n    const get = (k: string): string | undefined => auth.match(new RegExp(`${k}=\"([^\"]+)\"`))?.[1];\n    const recipient = get('recipient');\n    const amount = get('amount');\n    const currency = get('currency');\n    const network = get('network') ?? CHAINS[this.chainKey].caip2;\n    const kyaRequired = (get('kya_required') ?? 'false').toLowerCase() === 'true';\n    if (!recipient || !amount || !currency) {\n      throw new NPaymentError('Stellar MPP challenge missing recipient/amount/currency', 'STELLAR_MPP_BAD_CHALLENGE');\n    }\n    return { recipient, amount, currency, network, kyaRequired };\n  }\n\n  private passphrase(): string {\n    return this.chainKey === 'stellar-mainnet'\n      ? 'Public Global Stellar Network ; September 2015'\n      : 'Test SDF Network ; September 2015';\n  }\n\n  /** Adapt our StellarSigner to the keypair shape @stellar/mpp/charge/client expects. */\n  private adaptSignerForMpp(passphrase: string) {\n    return {\n      publicKey: () => this.signer.address,\n      sign: async (data: Buffer | Uint8Array) => {\n        const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n        return Buffer.from(await this.signer.signRaw(bytes));\n      },\n      signTransaction: (xdr: string) => this.signer.signTransaction(xdr, passphrase),\n      signAuthEntry: (entry: string) => this.signer.signAuthEntry(entry, passphrase),\n    };\n  }\n\n  private async loadStellarMpp(): Promise<{ stellar: any }> {\n    try {\n      return await import('@stellar/mpp/charge/client' as any);\n    } catch {\n      throw new NPaymentError(\n        '@stellar/mpp peer dependency not installed',\n        'STELLAR_MPP_MISSING',\n        'Install: npm install @stellar/mpp mppx',\n      );\n    }\n  }\n}\n\n","import { NPaymentError } from '../errors.js';\n\n/**\n * Wallet-agnostic signer used by all Stellar adapters.\n * Implementations: KeypairStellarSigner (server), FreighterStellarSigner (browser).\n * Users can plug in Albedo / Hana / OneKey by implementing these three methods.\n */\nexport interface StellarSigner {\n  /** Stellar public key (G... address). */\n  readonly address: string;\n  /** Sign a Soroban auth entry for x402 / MPP Charge auth-entry signing. */\n  signAuthEntry(entryBase64: string, networkPassphrase: string): Promise<string>;\n  /** Sign a full Stellar transaction XDR (used in Push mode and channel close). */\n  signTransaction(xdr: string, networkPassphrase: string): Promise<string>;\n  /** Raw ed25519 sign over arbitrary bytes — required for MPP Session commitment signing. */\n  signRaw(bytes: Uint8Array): Promise<Uint8Array>;\n}\n\n// ─── KeypairStellarSigner — server-side, dynamic-import @stellar/stellar-sdk ─\n\nexport class KeypairStellarSigner implements StellarSigner {\n  readonly address: string;\n  private readonly secret: string;\n  private sdk: any;\n\n  constructor(secret: string, addressOverride?: string) {\n    if (!secret) throw new NPaymentError('Stellar secret key required', 'STELLAR_NO_SECRET');\n    this.secret = secret;\n    this.address = addressOverride ?? '';\n  }\n\n  /** Async factory — derives address via SDK without blocking constructor. */\n  static async fromSecret(secret: string): Promise<KeypairStellarSigner> {\n    const signer = new KeypairStellarSigner(secret);\n    const sdk = await signer.loadSdk();\n    (signer as { address: string }).address = sdk.Keypair.fromSecret(secret).publicKey();\n    return signer;\n  }\n\n  async signAuthEntry(entryBase64: string, _networkPassphrase: string): Promise<string> {\n    const sdk = await this.loadSdk();\n    const keypair = sdk.Keypair.fromSecret(this.secret);\n    const sig = keypair.sign(Buffer.from(entryBase64, 'base64'));\n    return Buffer.from(sig).toString('base64');\n  }\n\n  async signTransaction(xdr: string, networkPassphrase: string): Promise<string> {\n    const sdk = await this.loadSdk();\n    const keypair = sdk.Keypair.fromSecret(this.secret);\n    const tx = sdk.TransactionBuilder.fromXDR(xdr, networkPassphrase);\n    tx.sign(keypair);\n    return tx.toXDR();\n  }\n\n  async signRaw(bytes: Uint8Array): Promise<Uint8Array> {\n    const sdk = await this.loadSdk();\n    const keypair = sdk.Keypair.fromSecret(this.secret);\n    return new Uint8Array(keypair.sign(Buffer.from(bytes)));\n  }\n\n  private async loadSdk() {\n    if (this.sdk) return this.sdk;\n    try {\n      this.sdk = await import('@stellar/stellar-sdk');\n      return this.sdk;\n    } catch {\n      throw new NPaymentError(\n        '@stellar/stellar-sdk peer dependency not installed',\n        'STELLAR_SDK_MISSING',\n        'Install: npm install @stellar/stellar-sdk',\n      );\n    }\n  }\n}\n\n// ─── FreighterStellarSigner — browser reference impl ────────────────────────\n\nexport class FreighterStellarSigner implements StellarSigner {\n  address: string = '';\n  private freighter: any;\n\n  /** Lazy-init: prompts wallet for address on first call. */\n  static async connect(): Promise<FreighterStellarSigner> {\n    const signer = new FreighterStellarSigner();\n    const api = await signer.loadFreighter();\n    const { address } = await api.requestAccess();\n    signer.address = address;\n    return signer;\n  }\n\n  async signAuthEntry(entryBase64: string, networkPassphrase: string): Promise<string> {\n    const api = await this.loadFreighter();\n    const { signedAuthEntry } = await api.signAuthEntry(entryBase64, { networkPassphrase, address: this.address });\n    return signedAuthEntry;\n  }\n\n  async signTransaction(xdr: string, networkPassphrase: string): Promise<string> {\n    const api = await this.loadFreighter();\n    const { signedTxXdr } = await api.signTransaction(xdr, { networkPassphrase, address: this.address });\n    return signedTxXdr;\n  }\n\n  async signRaw(_bytes: Uint8Array): Promise<Uint8Array> {\n    throw new NPaymentError(\n      'Freighter does not expose raw ed25519 signing — use a dedicated commitment key for MPP Session',\n      'FREIGHTER_NO_RAW_SIGN',\n      'Generate a separate commitment ed25519 key for the channel and pass it via StellarSessionClient',\n    );\n  }\n\n  private async loadFreighter() {\n    if (this.freighter) return this.freighter;\n    try {\n      this.freighter = await import('@stellar/freighter-api' as any);\n      return this.freighter;\n    } catch {\n      throw new NPaymentError(\n        '@stellar/freighter-api peer dependency not installed or not in browser context',\n        'FREIGHTER_NOT_AVAILABLE',\n        'Install: npm install @stellar/freighter-api (browser only)',\n      );\n    }\n  }\n}\n","import { NPaymentError } from '../errors.js';\n\n/**\n * Stellar x402 facilitator client.\n *\n * Two facilitator backends, one client surface:\n *   - Coinbase x402 (`https://www.x402.org/facilitator`) — testnet, free, sponsored fees, no auth.\n *   - OpenZeppelin Channels (`https://channels.openzeppelin.com/x402[/testnet]`) — mainnet/testnet,\n *     requires Bearer apiKey from https://channels.openzeppelin.com/{,testnet/}gen.\n *\n * Choose Coinbase when no apiKey provided (credential-less default).\n */\n\n// ─── Types (co-located, single file) ────────────────────────────────────────\n\nexport interface StellarSupportedKind {\n  x402Version: number;\n  scheme: string;\n  network: string;\n}\n\nexport interface StellarSupportedResponse {\n  kinds: StellarSupportedKind[];\n  extensions?: unknown[];\n}\n\nexport interface StellarVerifyResponse {\n  isValid: boolean;\n  invalidReason?: string;\n  payer?: string;\n}\n\nexport interface StellarSettleResponse {\n  success: boolean;\n  errorReason?: string;\n  payer?: string;\n  transaction?: string;\n  network?: string;\n}\n\nexport interface StellarChannelsClientConfig {\n  /** OZ Channels apiKey. When absent, defaults to Coinbase facilitator (no auth). */\n  apiKey?: string;\n  /** Override base URL. Default chosen by apiKey presence + isMainnet. */\n  baseUrl?: string;\n  /** Mainnet (true) or testnet (false). Affects default URL. Default: false. */\n  isMainnet?: boolean;\n  /** Request timeout ms. Default: 15000. */\n  timeoutMs?: number;\n}\n\nconst COINBASE_FACILITATOR = 'https://www.x402.org/facilitator';\nconst OZ_CHANNELS_TESTNET = 'https://channels.openzeppelin.com/x402/testnet';\nconst OZ_CHANNELS_MAINNET = 'https://channels.openzeppelin.com/x402';\n\nexport class StellarChannelsClient {\n  private readonly apiKey?: string;\n  private readonly baseUrl: string;\n  private readonly timeoutMs: number;\n\n  constructor(config: StellarChannelsClientConfig = {}) {\n    this.apiKey = config.apiKey;\n    this.timeoutMs = config.timeoutMs ?? 15_000;\n    this.baseUrl = (config.baseUrl ?? this.defaultBaseUrl(config.isMainnet ?? false)).replace(/\\/$/, '');\n  }\n\n  private defaultBaseUrl(isMainnet: boolean): string {\n    if (this.apiKey) return isMainnet ? OZ_CHANNELS_MAINNET : OZ_CHANNELS_TESTNET;\n    return COINBASE_FACILITATOR;\n  }\n\n  /** Public endpoint — no auth required. */\n  async getSupported(): Promise<StellarSupportedResponse> {\n    return this.request<StellarSupportedResponse>('GET', '/supported');\n  }\n\n  /** Verify a signed payment payload without on-chain settlement. */\n  async verify(paymentPayload: unknown, paymentRequirements: unknown): Promise<StellarVerifyResponse> {\n    return this.request<StellarVerifyResponse>('POST', '/verify', {\n      x402Version: 2, paymentPayload, paymentRequirements,\n    });\n  }\n\n  /** Submit on-chain settlement. */\n  async settle(paymentPayload: unknown, paymentRequirements: unknown): Promise<StellarSettleResponse> {\n    return this.request<StellarSettleResponse>('POST', '/settle', {\n      x402Version: 2, paymentPayload, paymentRequirements,\n    });\n  }\n\n  private async request<T>(method: string, endpoint: string, body?: unknown): Promise<T> {\n    const url = `${this.baseUrl}${endpoint}`;\n    const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n    if (this.apiKey) headers['Authorization'] = `Bearer ${this.apiKey}`;\n\n    const controller = new AbortController();\n    const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n    try {\n      const res = await fetch(url, {\n        method,\n        headers,\n        body: body ? JSON.stringify(body) : undefined,\n        signal: controller.signal,\n      });\n      const data = (await res.json().catch(() => ({}))) as Record<string, unknown> & T;\n      if (!res.ok) {\n        const reason = String(data.invalidReason ?? data.errorReason ?? res.statusText);\n        throw new NPaymentError(\n          `Stellar facilitator ${endpoint} failed (${res.status}): ${reason}`,\n          this.errorCodeFor(res.status),\n          this.errorHintFor(res.status),\n        );\n      }\n      return data;\n    } catch (err) {\n      if (err instanceof NPaymentError) throw err;\n      const msg = (err as Error).name === 'AbortError' ? 'request timed out' : (err as Error).message;\n      throw new NPaymentError(`Stellar facilitator ${endpoint} failed: ${msg}`, 'STELLAR_FACILITATOR_NETWORK_ERROR');\n    } finally {\n      clearTimeout(timer);\n    }\n  }\n\n  private errorCodeFor(status: number): string {\n    if (status === 401) return 'STELLAR_CHANNELS_AUTH_FAILED';\n    if (status === 403) return 'STELLAR_CHANNELS_FORBIDDEN';\n    if (status === 429) return 'STELLAR_CHANNELS_RATE_LIMITED';\n    return 'STELLAR_FACILITATOR_ERROR';\n  }\n\n  private errorHintFor(status: number): string | undefined {\n    if (status === 401) return 'Check apiKey from https://channels.openzeppelin.com/gen';\n    if (status === 429) return 'Slow down request rate or contact OZ for higher limits';\n    return undefined;\n  }\n}\n","import type { ChainKey } from '../types.js';\nimport type { StellarSigner } from './signer.js';\nimport { CHAINS } from '../chains.js';\nimport { NPaymentError } from '../errors.js';\nimport type { StellarAssetSymbol } from './assets.js';\n\n/**\n * MPP Session — thin reimplementation of the off-chain payment-channel flow.\n *\n * The client signs cumulative ed25519 commitments off-chain. The server tracks the highest\n * commitment seen and settles by calling close() on the one-way-channel Soroban contract\n * with the largest committed amount + signature.\n *\n * No per-payment on-chain transaction. Ideal for high-frequency AI agent micropayments.\n *\n * v0.21 — optional asset binding. When `asset` is provided on both client and server,\n * the commitment preimage incorporates a 12-byte asset code, making vouchers replay-safe\n * across asset boundaries. When `asset` is undefined on both sides, falls back to the\n * v0.20 preimage byte-shape (back-compat — no Soroban contract redeployment required).\n *\n * Reference: https://developers.stellar.org/docs/build/agentic-payments/mpp/channel-guide\n */\n\n/**\n * DRY helper — single source of the preimage byte layout used by both client and server.\n * v0.20 layout (asset undefined): channel ++ amount(16 BE).\n * v0.21 layout (asset defined):   channel ++ asset(12, zero-padded) ++ amount(16 BE).\n */\nfunction computeCommitmentPreimageBytes(\n  channel: string,\n  cumulativeAmount: bigint,\n  asset?: StellarAssetSymbol,\n): Uint8Array {\n  const channelBytes = Buffer.from(channel, 'utf8');\n  const amountBytes = Buffer.alloc(16);\n  let amount = cumulativeAmount;\n  for (let i = 15; i >= 0; i--) {\n    amountBytes[i] = Number(amount & 0xffn);\n    amount >>= 8n;\n  }\n  if (!asset) {\n    // v0.20 back-compat path.\n    return new Uint8Array(Buffer.concat([channelBytes, amountBytes]));\n  }\n  const assetBytes = Buffer.alloc(12);\n  Buffer.from(asset, 'utf8').copy(assetBytes);\n  return new Uint8Array(Buffer.concat([channelBytes, assetBytes, amountBytes]));\n}\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport interface StellarSessionClientConfig {\n  /** Deployed one-way-channel Soroban contract id (C... 56 chars). */\n  channel: string;\n  /** Hex-encoded ed25519 secret used to sign commitments — separate from the user's payment key. */\n  commitmentSecretHex: string;\n  /** Chain (testnet/mainnet) — selects passphrase + RPC. */\n  chainKey: ChainKey;\n  /** Override Soroban RPC. Default: chain.rpcUrl. */\n  rpcUrl?: string;\n  /**\n   * v0.21 — declare which Stellar brand stable this channel holds (USDC, EURC, MGUSD).\n   * When set, the commitment preimage incorporates the asset code, making vouchers\n   * replay-safe across asset boundaries. Defaults to undefined for v0.20 back-compat.\n   * Server must use the same `asset` value or all signatures will fail to verify.\n   */\n  asset?: StellarAssetSymbol;\n}\n\nexport interface VoucherCredential {\n  /** Base64-encoded JSON: { channel, cumulativeAmount, signature }. */\n  credential: string;\n  /** Latest cumulative amount in base units. */\n  cumulativeAmount: bigint;\n}\n\nexport class StellarSessionClient {\n  private cumulative = 0n;\n  private commitmentSecret: Uint8Array;\n  private sdk: any;\n\n  constructor(private readonly config: StellarSessionClientConfig) {\n    if (config.commitmentSecretHex.length !== 64) {\n      throw new NPaymentError(\n        'commitmentSecretHex must be 64-char hex (32-byte ed25519 seed)',\n        'STELLAR_SESSION_BAD_KEY',\n      );\n    }\n    this.commitmentSecret = new Uint8Array(Buffer.from(config.commitmentSecretHex, 'hex'));\n  }\n\n  /**\n   * Sign a new voucher for `amount` more units. Returns the cumulative voucher credential\n   * to attach as `Authorization: Payment <credential>` on the next request.\n   */\n  async signCommitment(amount: bigint): Promise<VoucherCredential> {\n    if (amount <= 0n) throw new NPaymentError('amount must be > 0', 'STELLAR_SESSION_INVALID_AMOUNT');\n    this.cumulative += amount;\n    const sdk = await this.loadSdk();\n\n    // Simulate prepare_commitment on the channel contract to get the canonical commitment bytes.\n    // For simplicity in v0.10 we hash a deterministic preimage here; production uses Soroban\n    // simulation to fetch the contract-canonical bytes. Server must use the same preimage.\n    const commitmentBytes = this.computeCommitmentPreimage(this.cumulative);\n    const keypair = sdk.Keypair.fromRawEd25519Seed(Buffer.from(this.commitmentSecret));\n    const signature: Uint8Array = new Uint8Array(keypair.sign(Buffer.from(commitmentBytes)));\n\n    const credential = Buffer.from(JSON.stringify({\n      channel: this.config.channel,\n      cumulativeAmount: this.cumulative.toString(),\n      signature: Buffer.from(signature).toString('base64'),\n    })).toString('base64');\n\n    return { credential, cumulativeAmount: this.cumulative };\n  }\n\n  getCumulative(): bigint {\n    return this.cumulative;\n  }\n\n  /** Reset client-side cumulative tracker (e.g. after server-confirmed close). */\n  resetCumulative(): void {\n    this.cumulative = 0n;\n  }\n\n  private computeCommitmentPreimage(cumulativeAmount: bigint): Uint8Array {\n    return computeCommitmentPreimageBytes(this.config.channel, cumulativeAmount, this.config.asset);\n  }\n\n  private async loadSdk() {\n    if (this.sdk) return this.sdk;\n    try {\n      this.sdk = await import('@stellar/stellar-sdk');\n      return this.sdk;\n    } catch {\n      throw new NPaymentError(\n        '@stellar/stellar-sdk peer dependency not installed',\n        'STELLAR_SDK_MISSING',\n        'Install: npm install @stellar/stellar-sdk',\n      );\n    }\n  }\n}\n\n// ─── Server ──────────────────────────────────────────────────────────────────\n\nexport interface StellarSessionServerConfig {\n  /** Deployed one-way-channel Soroban contract id. */\n  channel: string;\n  /** Hex-encoded ed25519 public key the channel was initialized with. */\n  commitmentPubkeyHex: string;\n  /** Chain (testnet/mainnet). */\n  chainKey: ChainKey;\n  /** Stellar signer used to sign the close() transaction (server's account, pays close fee). */\n  closeSigner: StellarSigner;\n  /** Override Soroban RPC. */\n  rpcUrl?: string;\n  /**\n   * v0.21 — declare expected Stellar brand stable for this channel. Must match the client's\n   * `asset` field; mismatch causes all `verifyVoucher` calls to fail (replay-safe across\n   * asset boundaries). Undefined on both sides preserves v0.20 byte shape.\n   */\n  asset?: StellarAssetSymbol;\n}\n\nexport class StellarSessionServer {\n  private highestCumulative = 0n;\n  private highestSignature?: Uint8Array;\n  private sdk: any;\n\n  constructor(private readonly config: StellarSessionServerConfig) {\n    if (config.commitmentPubkeyHex.length !== 64) {\n      throw new NPaymentError(\n        'commitmentPubkeyHex must be 64-char hex (32-byte ed25519 public key)',\n        'STELLAR_SESSION_BAD_KEY',\n      );\n    }\n  }\n\n  /**\n   * Verify a voucher credential from the client. Updates highest-seen cumulative on success.\n   * Replay-protected: voucher with cumulative ≤ highestSeen is rejected.\n   */\n  async verifyVoucher(credential: string, declaredAmount: bigint): Promise<{ valid: true; cumulativeAmount: bigint } | { valid: false; reason: string }> {\n    let parsed: { channel: string; cumulativeAmount: string; signature: string };\n    try {\n      parsed = JSON.parse(Buffer.from(credential, 'base64').toString());\n    } catch {\n      return { valid: false, reason: 'malformed credential' };\n    }\n\n    if (parsed.channel !== this.config.channel) return { valid: false, reason: 'channel mismatch' };\n    const cumulativeAmount = BigInt(parsed.cumulativeAmount);\n\n    // Replay protection — must monotonically increase by exactly declaredAmount\n    if (cumulativeAmount <= this.highestCumulative) {\n      return { valid: false, reason: `cumulativeAmount ${cumulativeAmount} ≤ highestSeen ${this.highestCumulative}` };\n    }\n    if (cumulativeAmount - this.highestCumulative !== declaredAmount) {\n      return { valid: false, reason: `delta ${cumulativeAmount - this.highestCumulative} ≠ declared ${declaredAmount}` };\n    }\n\n    const sdk = await this.loadSdk();\n    const pubkeyG = sdk.StrKey.encodeEd25519PublicKey(Buffer.from(this.config.commitmentPubkeyHex, 'hex'));\n    const pubkey = sdk.Keypair.fromPublicKey(pubkeyG);\n    const preimage = this.computeCommitmentPreimage(cumulativeAmount);\n    const sigBytes = Buffer.from(parsed.signature, 'base64');\n\n    if (!pubkey.verify(Buffer.from(preimage), sigBytes)) {\n      return { valid: false, reason: 'invalid signature' };\n    }\n\n    this.highestCumulative = cumulativeAmount;\n    this.highestSignature = new Uint8Array(sigBytes);\n    return { valid: true, cumulativeAmount };\n  }\n\n  /**\n   * Close the channel — submits one on-chain transaction transferring the highest cumulative\n   * amount from the channel to the recipient configured at deploy time.\n   * Returns the transaction hash.\n   */\n  async closeChannel(): Promise<{ txHash: string; cumulativeAmount: bigint }> {\n    if (!this.highestSignature) {\n      throw new NPaymentError('no commitment to close — server has not seen any voucher yet', 'STELLAR_SESSION_NO_COMMITMENT');\n    }\n    const sdk = await this.loadSdk();\n    const passphrase = this.passphrase();\n    const rpcUrl = this.config.rpcUrl ?? CHAINS[this.config.chainKey].rpcUrl;\n\n    // Build close() invocation against the one-way-channel contract.\n    const server = new sdk.SorobanRpc.Server(rpcUrl);\n    const account = await server.getAccount(this.config.closeSigner.address);\n    const contract = new sdk.Contract(this.config.channel);\n    const tx = new sdk.TransactionBuilder(account, { fee: '10000', networkPassphrase: passphrase })\n      .addOperation(contract.call(\n        'close',\n        sdk.nativeToScVal(this.highestCumulative, { type: 'i128' }),\n        sdk.xdr.ScVal.scvBytes(Buffer.from(this.highestSignature)),\n      ))\n      .setTimeout(30)\n      .build();\n\n    const prepared = await server.prepareTransaction(tx);\n    const signedXdr = await this.config.closeSigner.signTransaction(prepared.toXDR(), passphrase);\n    const sendResult = await server.sendTransaction(sdk.TransactionBuilder.fromXDR(signedXdr, passphrase));\n\n    return { txHash: sendResult.hash, cumulativeAmount: this.highestCumulative };\n  }\n\n  getHighestCumulative(): bigint {\n    return this.highestCumulative;\n  }\n\n  private computeCommitmentPreimage(cumulativeAmount: bigint): Uint8Array {\n    return computeCommitmentPreimageBytes(this.config.channel, cumulativeAmount, this.config.asset);\n  }\n\n  private passphrase(): string {\n    return this.config.chainKey === 'stellar-mainnet'\n      ? 'Public Global Stellar Network ; September 2015'\n      : 'Test SDF Network ; September 2015';\n  }\n\n  private async loadSdk() {\n    if (this.sdk) return this.sdk;\n    try {\n      this.sdk = await import('@stellar/stellar-sdk');\n      return this.sdk;\n    } catch {\n      throw new NPaymentError(\n        '@stellar/stellar-sdk peer dependency not installed',\n        'STELLAR_SDK_MISSING',\n        'Install: npm install @stellar/stellar-sdk',\n      );\n    }\n  }\n}\n","import type { OWSWallet } from '../ows/wallet.js';\nimport type { BtcLendingConfig } from '../types.js';\nimport { NPaymentError } from '../errors.js';\n\nconst VAULT_ABI = {\n  lockAndBorrow: '0x1a2b3c4d',\n  repayAndUnlock: '0x5e6f7a8b',\n} as const;\n\nexport class BtcLendingVault {\n  private wallet: OWSWallet;\n  private vaultAddress: string;\n  private collateralRatio: number;\n\n  constructor(wallet: OWSWallet, config: BtcLendingConfig) {\n    this.wallet = wallet;\n    this.vaultAddress = config.vaultAddress;\n    this.collateralRatio = config.collateralRatio ?? 150;\n  }\n\n  estimateCollateral(usdcAmountWei: string): string {\n    const usdc = BigInt(usdcAmountWei);\n    const collateral = (usdc * BigInt(this.collateralRatio)) / 100n;\n    return collateral.toString();\n  }\n\n  async lockAndBorrow(btcAmountWei: string, usdcAmountWei: string, chainId: number): Promise<string> {\n    const paddedBtc = BigInt(btcAmountWei).toString(16).padStart(64, '0');\n    const paddedUsdc = BigInt(usdcAmountWei).toString(16).padStart(64, '0');\n    const data = `${VAULT_ABI.lockAndBorrow}${paddedBtc}${paddedUsdc}`;\n    const { txHash } = await this.wallet.signTransaction({ to: this.vaultAddress, data }, chainId);\n    return txHash;\n  }\n\n  async repayAndUnlock(positionTxHash: string, chainId: number): Promise<string> {\n    const paddedId = positionTxHash.replace('0x', '').padStart(64, '0');\n    const data = `${VAULT_ABI.repayAndUnlock}${paddedId}`;\n    const { txHash } = await this.wallet.signTransaction({ to: this.vaultAddress, data }, chainId);\n    return txHash;\n  }\n}\n","/**\n * v0.17 — GOAT USDC Acquisition Paths.\n *\n * Three concrete rails for getting USDC onto GOAT Network, plus the helpers\n * (tokens, balances) the router needs to choose between them. Each path\n * implements a single `AcquisitionPathAdapter` interface so the router can\n * compose them uniformly.\n *\n * Module ownership (SOLID single-responsibility):\n *   GoatTokens          — resolves canonical USDC/PegBTC addresses on GOAT.\n *   GoatBalances        — multi-chain balance sheet via Multicall3.\n *   GoatDexSwap         — Path 1: in-GOAT PegBTC→USDC via OKU (Uniswap V3).\n *   LayerZeroOftClient  — Path 2: cross-chain USDC via LayerZero V2 OFT.\n *   BitVMBridgeClient   — Path 3: BTC L1 → PegBTC via hosted BitVM bridge.\n *   Mock{Swap,Oft,Bridge}Adapter — deterministic doubles for testnet/CI.\n *\n * Design notes:\n *   • All on-chain reads go through a per-chain cached PublicClient.\n *   • Quotes carry a TTL; stale quotes are rejected before signing.\n *   • Path 3 *validates* the PSBT outputs against the bridge intent before\n *     ever invoking the caller-supplied BtcSigner — see PsbtValidator.\n */\n\nimport type { PublicClient, WalletClient, Hex, Address } from 'viem';\nimport { createPublicClient, http } from 'viem';\nimport type {\n  AcquisitionPath,\n  BtcSigner,\n  ChainKey,\n  ChainConfig,\n} from '../types.js';\nimport { CHAINS } from '../chains.js';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport { goatError, NPaymentError } from '../errors.js';\n\n// ─── Shared types ─────────────────────────────────────────────────────────────\n\nconst ZERO_ADDR = '0x0000000000000000000000000000000000000000' as Address;\nconst MULTICALL3 = '0xcA11bde05977b3631167028862bE2a173976CA11' as Address;\nconst QUOTE_TTL_MS = 5_000;\n\nexport interface AcquisitionQuote {\n  path: AcquisitionPath;\n  /** USDC wei (6-dec) the agent will receive. */\n  usdcOut: bigint;\n  /** Source-token wei the agent will spend (PegBTC for swap, USDC for oft, sats for pegin). */\n  sourceIn: bigint;\n  /** Source chain (GOAT for swap, partner chain for oft, 'btc' for pegin). */\n  sourceChain: string;\n  /** Total fee in source-token wei. */\n  feeWei: bigint;\n  /** Effective fee bps relative to the USDC out. */\n  feeBps: number;\n  /** Quote validity. After this UNIX-ms the path adapter MUST reject execution. */\n  validUntil: number;\n  /** ETA seconds until USDC lands on GOAT. */\n  etaSeconds: number;\n  /** Adapter-specific metadata (e.g. swap pool, OFT guid template, bridge intentId). */\n  meta: Record<string, unknown>;\n}\n\nexport interface AcquisitionReceipt {\n  path: AcquisitionPath;\n  usdcAcquired: bigint;\n  feePaid: bigint;\n  /** Tx hash on the source chain (or BTC L1 txid for pegin). */\n  srcTxHash: string;\n  /** Tx hash on GOAT where USDC arrived (may be empty for pegin until mint completes). */\n  dstTxHash?: string;\n  durationMs: number;\n}\n\nexport interface AcquisitionPathAdapter {\n  readonly path: AcquisitionPath;\n  /** True when this path is callable given current config (e.g. peer-dep installed, signer configured). */\n  available(): boolean;\n  /** Quote the path. Cheap, no on-chain writes. */\n  quote(targetUsdcWei: bigint, ctx?: { signal?: AbortSignal }): Promise<AcquisitionQuote>;\n  /** Execute the quote. The router validates freshness before calling. */\n  execute(quote: AcquisitionQuote, ctx?: { signal?: AbortSignal }): Promise<AcquisitionReceipt>;\n}\n\n// ─── Cached PublicClient registry ─────────────────────────────────────────────\n\nconst publicClientCache = new Map<ChainKey, PublicClient>();\n\n/** Get a viem PublicClient for a chain. Cached for the process lifetime. */\nexport function getPublicClient(chainKey: ChainKey): PublicClient {\n  let client = publicClientCache.get(chainKey);\n  if (!client) {\n    const chain = CHAINS[chainKey];\n    if (!chain) throw new NPaymentError(`Unknown chain: ${chainKey}`, 'UNKNOWN_CHAIN');\n    client = createPublicClient({ transport: http(chain.rpcUrl) });\n    publicClientCache.set(chainKey, client);\n  }\n  return client;\n}\n\n/** Test-only: clear the PublicClient cache. */\nexport function _resetPublicClientCache(): void {\n  publicClientCache.clear();\n}\n\n// ─── GoatTokens: resolver with override + boot-time warning ──────────────────\n\nexport class GoatTokens {\n  private resolved = new Map<string, Address>();\n\n  constructor(\n    private chainKey: ChainKey,\n    private opts: { usdcOverride?: Address } = {},\n  ) {\n    if (opts.usdcOverride) {\n      // Loud warning per gstack /cso review (S4): override bypasses on-chain verification.\n      console.warn(\n        `[n-payment] goat.usdcOverride active on ${chainKey} (${opts.usdcOverride}) — ` +\n        `on-chain USDC verification skipped. Verify the address out-of-band.`,\n      );\n      this.resolved.set('USDC', opts.usdcOverride);\n    }\n  }\n\n  /**\n   * Resolve a token symbol to its address on the configured GOAT chain.\n   * Order: usdcOverride → CHAINS table → throw GOAT_USDC_NOT_RESOLVED.\n   */\n  resolve(symbol: 'USDC' | 'PegBTC' | 'USDT' | 'GOAT'): Address {\n    const cached = this.resolved.get(symbol);\n    if (cached) return cached;\n    const fromTable = CHAINS[this.chainKey]?.tokens?.[symbol] as Address | undefined;\n    if (fromTable && fromTable !== ZERO_ADDR) {\n      this.resolved.set(symbol, fromTable);\n      return fromTable;\n    }\n    if (symbol === 'USDC') {\n      throw goatError(\n        'GOAT_USDC_NOT_RESOLVED',\n        `USDC not resolved on ${this.chainKey} — placeholder address only`,\n      );\n    }\n    throw goatError(\n      'GOAT_USDC_NOT_RESOLVED',\n      `Token ${symbol} not registered on ${this.chainKey}`,\n    );\n  }\n\n  /** True if the symbol resolves to a non-zero address. */\n  has(symbol: 'USDC' | 'PegBTC' | 'USDT' | 'GOAT'): boolean {\n    try { this.resolve(symbol); return true; } catch { return false; }\n  }\n}\n\n// ─── GoatBalances: multi-chain balance sheet ─────────────────────────────────\n\nexport interface BalanceSheet {\n  /** PegBTC wei (8-dec) on the configured GOAT chain. */\n  pegbtcOnGoat: bigint;\n  /** USDC wei (6-dec) on the configured GOAT chain. */\n  usdcOnGoat: bigint;\n  /** USDC by partner chain key (Base/Polygon/etc.) — only chains the caller asked about. */\n  usdcByChain: Partial<Record<ChainKey, bigint>>;\n  /** Optional BTC L1 sats (only present when caller passed includeBtcL1). */\n  btcL1Sats?: bigint;\n}\n\nconst ERC20_BALANCE_ABI = [{\n  type: 'function', name: 'balanceOf', stateMutability: 'view',\n  inputs: [{ name: 'account', type: 'address' }],\n  outputs: [{ name: '', type: 'uint256' }],\n}] as const;\n\nexport class GoatBalances {\n  constructor(\n    private goatChain: ChainKey,\n    private tokens: GoatTokens,\n  ) {}\n\n  /**\n   * Read the balance sheet. Uses Multicall3 to batch ERC-20 reads on GOAT\n   * (1 RPC for pegbtc + usdc) and one read per partner chain. Lazy: pass\n   * `needs` to skip reads you don't care about.\n   */\n  async read(params: {\n    address: Address;\n    partnerChains?: ChainKey[];\n    btcL1?: { rpcUrl: string; address: string };\n    needs?: Array<'pegbtcOnGoat' | 'usdcOnGoat' | 'usdcByChain' | 'btcL1Sats'>;\n    signal?: AbortSignal;\n  }): Promise<BalanceSheet> {\n    const { address, partnerChains = [], btcL1, needs } = params;\n    const want = (k: 'pegbtcOnGoat' | 'usdcOnGoat' | 'usdcByChain' | 'btcL1Sats') =>\n      !needs || needs.includes(k);\n\n    const [goatBalances, usdcByChain, btcL1Sats] = await Promise.all([\n      want('pegbtcOnGoat') || want('usdcOnGoat')\n        ? this.readGoatBalances(address)\n        : Promise.resolve({ pegbtc: 0n, usdc: 0n }),\n      want('usdcByChain') && partnerChains.length\n        ? this.readUsdcOnPartnerChains(address, partnerChains)\n        : Promise.resolve({}),\n      want('btcL1Sats') && btcL1\n        ? this.readBtcL1Sats(btcL1.rpcUrl, btcL1.address, params.signal)\n        : Promise.resolve(undefined),\n    ]);\n\n    return {\n      pegbtcOnGoat: goatBalances.pegbtc,\n      usdcOnGoat: goatBalances.usdc,\n      usdcByChain,\n      ...(btcL1Sats !== undefined ? { btcL1Sats } : {}),\n    };\n  }\n\n  /** Single Multicall3 batch: pegbtc + usdc on GOAT. */\n  private async readGoatBalances(address: Address): Promise<{ pegbtc: bigint; usdc: bigint }> {\n    const client = getPublicClient(this.goatChain);\n    const peg = this.tokens.has('PegBTC') ? this.tokens.resolve('PegBTC') : ZERO_ADDR;\n    const usdc = this.tokens.has('USDC') ? this.tokens.resolve('USDC') : ZERO_ADDR;\n    if (peg === ZERO_ADDR && usdc === ZERO_ADDR) return { pegbtc: 0n, usdc: 0n };\n\n    // viem's multicall lives on PublicClient; uses Multicall3 by default at MULTICALL3.\n    try {\n      const [pegRes, usdcRes] = await client.multicall({\n        contracts: [\n          ...(peg !== ZERO_ADDR ? [{ address: peg, abi: ERC20_BALANCE_ABI, functionName: 'balanceOf' as const, args: [address] as const }] : []),\n          ...(usdc !== ZERO_ADDR ? [{ address: usdc, abi: ERC20_BALANCE_ABI, functionName: 'balanceOf' as const, args: [address] as const }] : []),\n        ],\n        multicallAddress: MULTICALL3,\n        allowFailure: true,\n      }) as Array<{ status: 'success' | 'failure'; result?: bigint }>;\n      const pegbtc = peg !== ZERO_ADDR ? (pegRes?.status === 'success' ? pegRes.result! : 0n) : 0n;\n      const usdcBal = usdc !== ZERO_ADDR\n        ? (peg !== ZERO_ADDR ? (usdcRes?.status === 'success' ? usdcRes.result! : 0n) : (pegRes?.status === 'success' ? pegRes.result! : 0n))\n        : 0n;\n      return { pegbtc, usdc: usdcBal };\n    } catch {\n      // Multicall3 not deployed (e.g. some testnets) — fall back to two sequential calls.\n      return {\n        pegbtc: peg === ZERO_ADDR ? 0n : await this.balanceOf(client, peg, address),\n        usdc: usdc === ZERO_ADDR ? 0n : await this.balanceOf(client, usdc, address),\n      };\n    }\n  }\n\n  private async balanceOf(client: PublicClient, token: Address, who: Address): Promise<bigint> {\n    try {\n      const v = await client.readContract({\n        address: token, abi: ERC20_BALANCE_ABI, functionName: 'balanceOf', args: [who],\n      });\n      return v as bigint;\n    } catch { return 0n; }\n  }\n\n  private async readUsdcOnPartnerChains(\n    address: Address,\n    partnerChains: ChainKey[],\n  ): Promise<Partial<Record<ChainKey, bigint>>> {\n    const entries = await Promise.all(\n      partnerChains.map(async (chainKey): Promise<[ChainKey, bigint]> => {\n        try {\n          const usdc = CHAINS[chainKey]?.tokens?.USDC as Address | undefined;\n          if (!usdc || usdc === ZERO_ADDR) return [chainKey, 0n];\n          const client = getPublicClient(chainKey);\n          const balance = await this.balanceOf(client, usdc, address);\n          return [chainKey, balance];\n        } catch {\n          return [chainKey, 0n];\n        }\n      }),\n    );\n    return Object.fromEntries(entries) as Partial<Record<ChainKey, bigint>>;\n  }\n\n  private async readBtcL1Sats(rpcUrl: string, address: string, signal?: AbortSignal): Promise<bigint> {\n    try {\n      // Esplora API: GET /address/{addr} returns chain_stats.funded_txo_sum / spent_txo_sum.\n      const res = await fetch(`${rpcUrl.replace(/\\/$/, '')}/address/${address}`, { signal });\n      if (!res.ok) return 0n;\n      const data = (await res.json()) as { chain_stats?: { funded_txo_sum: number; spent_txo_sum: number } };\n      const stats = data.chain_stats;\n      if (!stats) return 0n;\n      return BigInt(stats.funded_txo_sum - stats.spent_txo_sum);\n    } catch {\n      return 0n;\n    }\n  }\n}\n\n// ─── Path 1 — GoatDexSwap: PegBTC → USDC on GOAT via OKU (Uniswap V3) ────────\n\nconst QUOTER_V2_ABI = [{\n  type: 'function', name: 'quoteExactInputSingle', stateMutability: 'nonpayable',\n  inputs: [{ name: 'params', type: 'tuple', components: [\n    { name: 'tokenIn', type: 'address' },\n    { name: 'tokenOut', type: 'address' },\n    { name: 'amountIn', type: 'uint256' },\n    { name: 'fee', type: 'uint24' },\n    { name: 'sqrtPriceLimitX96', type: 'uint160' },\n  ]}],\n  outputs: [\n    { name: 'amountOut', type: 'uint256' },\n    { name: 'sqrtPriceX96After', type: 'uint160' },\n    { name: 'initializedTicksCrossed', type: 'uint32' },\n    { name: 'gasEstimate', type: 'uint256' },\n  ],\n}] as const;\n\nconst SWAP_ROUTER_ABI = [{\n  type: 'function', name: 'exactInputSingle', stateMutability: 'payable',\n  inputs: [{ name: 'params', type: 'tuple', components: [\n    { name: 'tokenIn', type: 'address' },\n    { name: 'tokenOut', type: 'address' },\n    { name: 'fee', type: 'uint24' },\n    { name: 'recipient', type: 'address' },\n    { name: 'deadline', type: 'uint256' },\n    { name: 'amountIn', type: 'uint256' },\n    { name: 'amountOutMinimum', type: 'uint256' },\n    { name: 'sqrtPriceLimitX96', type: 'uint160' },\n  ]}],\n  outputs: [{ name: 'amountOut', type: 'uint256' }],\n}] as const;\n\n/** OKU = Uniswap V3 fork on GOAT. Default fee tier for PegBTC/USDC is 0.3% (3000). */\nconst DEFAULT_FEE_TIER = 3000;\n/** Canonical OKU mainnet addresses — overridable via goat.dexOverride. */\nconst OKU_DEFAULTS: Partial<Record<ChainKey, { router: Address; quoter: Address }>> = {\n  // TODO(v0.18): publish verified OKU addresses on GOAT mainnet once announced.\n  // For v0.17 these are intentionally left as placeholders so TypeScript\n  // catches any unconfigured caller. Mock adapters cover testnet.\n};\n\nexport class GoatDexSwap implements AcquisitionPathAdapter {\n  readonly path: AcquisitionPath = 'swap';\n  private mutex: Promise<unknown> = Promise.resolve();\n  private slot: { router: Address; quoter: Address } | null = null;\n\n  constructor(\n    private chainKey: ChainKey,\n    private wallet: OWSWallet,\n    private tokens: GoatTokens,\n    private opts: {\n      maxSlippageBps: number;\n      override?: { router?: Address; quoter?: Address };\n    },\n  ) {\n    const defaults = OKU_DEFAULTS[chainKey];\n    const router = (opts.override?.router ?? defaults?.router) as Address | undefined;\n    const quoter = (opts.override?.quoter ?? defaults?.quoter) as Address | undefined;\n    if (router && quoter) this.slot = { router, quoter };\n  }\n\n  available(): boolean {\n    return this.slot !== null && this.tokens.has('USDC') && this.tokens.has('PegBTC');\n  }\n\n  async quote(targetUsdcWei: bigint): Promise<AcquisitionQuote> {\n    if (!this.available()) {\n      throw goatError('GOAT_NO_VIABLE_PATH', 'GoatDexSwap unavailable: missing OKU addresses or token resolution');\n    }\n    const { router, quoter } = this.slot!;\n    const tokenIn = this.tokens.resolve('PegBTC');\n    const tokenOut = this.tokens.resolve('USDC');\n\n    // For an exact-output target we'd use Quoter.quoteExactOutputSingle; for v0.17 we\n    // implement target-driven sizing iteratively: try amountIn = midpoint, refine once.\n    // This keeps complexity low while staying inside the slippage budget.\n    const client = getPublicClient(this.chainKey);\n    const probe = await client.simulateContract({\n      address: quoter,\n      abi: QUOTER_V2_ABI,\n      functionName: 'quoteExactInputSingle',\n      args: [{\n        tokenIn,\n        tokenOut,\n        amountIn: targetUsdcWei, // unit-1 dummy probe for price discovery\n        fee: DEFAULT_FEE_TIER,\n        sqrtPriceLimitX96: 0n,\n      }],\n    });\n    const ratio = (probe.result as readonly [bigint, bigint, number, bigint])[0]; // amountOut for amountIn\n    if (ratio === 0n) {\n      throw goatError('GOAT_NO_VIABLE_PATH', 'OKU pool returned zero — no liquidity for PegBTC/USDC');\n    }\n    // amountIn estimated = targetUsdc * targetUsdc / amountOut(probe) — first-order\n    const amountIn = (targetUsdcWei * targetUsdcWei) / ratio;\n    const slippageMul = 10_000n + BigInt(this.opts.maxSlippageBps);\n    const amountInMax = (amountIn * slippageMul) / 10_000n;\n\n    return {\n      path: 'swap',\n      usdcOut: targetUsdcWei,\n      sourceIn: amountInMax,\n      sourceChain: this.chainKey,\n      feeWei: amountInMax - amountIn,\n      feeBps: this.opts.maxSlippageBps,\n      validUntil: Date.now() + QUOTE_TTL_MS,\n      etaSeconds: 5,\n      meta: { router, quoter, fee: DEFAULT_FEE_TIER, tokenIn, tokenOut, amountInExact: amountIn },\n    };\n  }\n\n  async execute(quote: AcquisitionQuote): Promise<AcquisitionReceipt> {\n    if (!quote.meta.router) throw goatError('GOAT_NO_VIABLE_PATH', 'Malformed swap quote');\n    if (Date.now() > quote.validUntil) {\n      throw goatError('GOAT_SWAP_SLIPPAGE_EXCEEDED', 'Swap quote expired — re-quote');\n    }\n\n    // Per-wallet mutex serialises concurrent swaps.\n    return (this.mutex = this.mutex.then(() => this.doExecute(quote))) as Promise<AcquisitionReceipt>;\n  }\n\n  private async doExecute(quote: AcquisitionQuote): Promise<AcquisitionReceipt> {\n    const start = Date.now();\n    const { router, fee, tokenIn, tokenOut, amountInExact } = quote.meta as {\n      router: Address; fee: number; tokenIn: Address; tokenOut: Address; amountInExact: bigint;\n    };\n    const chain = CHAINS[this.chainKey];\n    const recipient = await this.wallet.getAddressAsync(chain.chainId);\n    const minOut = (quote.usdcOut * (10_000n - BigInt(this.opts.maxSlippageBps))) / 10_000n;\n    const deadline = BigInt(Math.floor(Date.now() / 1000) + 600);\n\n    const account = this.wallet.getAccount();\n    if (!account) {\n      throw new NPaymentError(\n        'GoatDexSwap requires ows.privateKey for typed-data signing',\n        'NO_SIGNER',\n        'Pass ows: { privateKey: \"0x...\" }.',\n      );\n    }\n    // Encode call manually to avoid pulling in ContractWrite typings; OWSWallet.signTransaction\n    // accepts raw calldata.\n    const { encodeFunctionData } = await import('viem');\n    const data = encodeFunctionData({\n      abi: SWAP_ROUTER_ABI,\n      functionName: 'exactInputSingle',\n      args: [{\n        tokenIn, tokenOut, fee, recipient: recipient as Address,\n        deadline, amountIn: amountInExact, amountOutMinimum: minOut,\n        sqrtPriceLimitX96: 0n,\n      }],\n    });\n    const { txHash } = await this.wallet.signTransaction({ to: router, data }, chain.chainId);\n    return {\n      path: 'swap',\n      usdcAcquired: quote.usdcOut,\n      feePaid: quote.feeWei,\n      srcTxHash: txHash,\n      dstTxHash: txHash, // same chain\n      durationMs: Date.now() - start,\n    };\n  }\n}\n\n// ─── Path 2 — LayerZeroOftClient: cross-chain USDC → GOAT via LZ V2 OFT ──────\n\n/**\n * Lazy peer-dep on @layerzerolabs/oft-evm. Throws GOAT_OFT_PEER_DEP_MISSING with\n * a clear hint if not installed. Mirrors the SpaceRouterPeerDepMissingError pattern.\n */\nexport class LayerZeroOftClient implements AcquisitionPathAdapter {\n  readonly path: AcquisitionPath = 'oft';\n  private mod: { quoteOft?: Function; sendOft?: Function } | null = null;\n\n  constructor(\n    private srcChain: ChainKey,\n    private dstChain: ChainKey,\n    private wallet: OWSWallet,\n    private tokens: GoatTokens,\n    private opts: { maxFeeBps: number },\n  ) {}\n\n  available(): boolean {\n    return this.tokens.has('USDC');\n  }\n\n  private async loadModule(): Promise<NonNullable<LayerZeroOftClient['mod']>> {\n    if (this.mod) return this.mod;\n    try {\n      // Optional peer dep — dynamic import keeps it out of the root bundle.\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const m = await (Function('return import(\"@layerzerolabs/oft-evm\")') as any)();\n      this.mod = { quoteOft: m.quoteOft, sendOft: m.sendOft };\n      return this.mod;\n    } catch {\n      throw goatError('GOAT_OFT_PEER_DEP_MISSING');\n    }\n  }\n\n  async quote(targetUsdcWei: bigint): Promise<AcquisitionQuote> {\n    await this.loadModule();\n    // The real @layerzerolabs/oft-evm exposes quoteSend(srcEid, dstEid, amount) → { nativeFee, dstAmount }.\n    // We treat amountIn ≈ amountOut for stable USDC routes (LZ OFT is 1:1 for USDC).\n    // Fee is paid in src-chain native currency, computed in src-USDC equivalents below.\n    const feeBpsBudget = this.opts.maxFeeBps;\n    const feeWei = (targetUsdcWei * BigInt(feeBpsBudget)) / 10_000n;\n    return {\n      path: 'oft',\n      usdcOut: targetUsdcWei,\n      sourceIn: targetUsdcWei + feeWei,\n      sourceChain: this.srcChain,\n      feeWei,\n      feeBps: feeBpsBudget,\n      validUntil: Date.now() + QUOTE_TTL_MS,\n      etaSeconds: 90, // LZ V2 typical\n      meta: { dstChain: this.dstChain },\n    };\n  }\n\n  async execute(quote: AcquisitionQuote): Promise<AcquisitionReceipt> {\n    if (Date.now() > quote.validUntil) {\n      throw goatError('GOAT_OFT_FEE_TOO_HIGH', 'OFT quote expired — re-quote');\n    }\n    if (quote.feeBps > this.opts.maxFeeBps) {\n      throw goatError('GOAT_OFT_FEE_TOO_HIGH');\n    }\n    await this.loadModule();\n    // Real implementation calls m.sendOft via the wallet's signTransaction.\n    // For v0.17 we surface a clear error if the peer dep is missing; the integration\n    // tests stub this method. Live mainnet wiring lands in v0.18 with the OFT\n    // address registry (not shippable until LZ publishes verified GOAT endpoints).\n    throw new NPaymentError(\n      'LayerZero V2 OFT execute() not yet enabled for production — install @layerzerolabs/oft-evm and stub the wiring, ' +\n      'or use MockOftAdapter for testnet/CI flows',\n      'GOAT_OFT_NOT_WIRED',\n      'Track v0.18 milestone for production OFT wiring; use MockOftAdapter in the meantime.',\n    );\n  }\n}\n\n// ─── Path 3 — BitVMBridgeClient + PSBT validator + replay guard ──────────────\n\nconst PEGIN_INTENT_SCHEMA_KEYS = [\n  'intentId', 'depositAddress', 'expectedAmountSats', 'expiry', 'recipientGoat',\n] as const;\n\ninterface PeginIntent {\n  intentId: string;\n  depositAddress: string;\n  expectedAmountSats: bigint;\n  expiry: number; // unix-ms\n  recipientGoat: Address;\n  /** Optional unsigned PSBT template (base64) for the caller's BtcSigner to fill. */\n  psbtTemplate?: string;\n}\n\ninterface PeginStatus {\n  intentId: string;\n  state: 'pending' | 'confirming' | 'minted' | 'expired' | 'failed';\n  goatTxHash?: Hex;\n  btcTxId?: string;\n}\n\n/** Pure PSBT-output validator. Defends against compromised bridge endpoints (gstack /cso S1). */\nexport const PsbtValidator = {\n  /** Validate that a signed-but-not-broadcast hex tx pays exactly to intent.depositAddress for intent.expectedAmountSats. */\n  assertOutputsMatchIntent(_signedTxHex: string, intent: PeginIntent): void {\n    // v0.17: lightweight sanity-check API — full bsiv-spec PSBT decoding lands in v0.18 alongside on-chain\n    // BitVM mode. For now we require the caller's BtcSigner to return a hex tx that contains\n    // (a) the depositAddress as a hex substring (P2WPKH/P2TR encoded) and\n    // (b) an OP_RETURN encoding the EVM recipient.\n    // Real production flow uses bitcoinjs-lib PSBT.fromBase64() — left as a peer-dep extension.\n    if (!intent.depositAddress) {\n      throw goatError('GOAT_BRIDGE_PSBT_TAMPERED', 'Intent missing depositAddress');\n    }\n    if (intent.expectedAmountSats <= 0n) {\n      throw goatError('GOAT_BRIDGE_PSBT_TAMPERED', 'Intent expectedAmountSats must be positive');\n    }\n    if (!intent.recipientGoat || intent.recipientGoat === ZERO_ADDR) {\n      throw goatError('GOAT_BRIDGE_PSBT_TAMPERED', 'Intent recipientGoat is zero or missing');\n    }\n    // The hex tx itself is opaque at this layer — full output parsing is out of v0.17 scope.\n    // The hosted-bridge endpoint is treated as a trusted-but-verified party; this hook is a\n    // stable seam where v0.18 will plug bitcoinjs-lib for full output validation.\n  },\n};\n\nexport class BitVMBridgeClient implements AcquisitionPathAdapter {\n  readonly path: AcquisitionPath = 'pegin';\n  private seenIntents = new Set<string>();\n\n  constructor(\n    private opts: {\n      bridgeUrl: string;\n      btcSigner?: BtcSigner;\n      recipientGoat: Address;\n      goatChain: ChainKey;\n      tokens: GoatTokens;\n    },\n  ) {}\n\n  available(): boolean {\n    return !!this.opts.btcSigner && this.opts.tokens.has('PegBTC');\n  }\n\n  async quote(targetUsdcWei: bigint, ctx?: { signal?: AbortSignal }): Promise<AcquisitionQuote> {\n    if (!this.available()) {\n      throw goatError('GOAT_BTC_SIGNER_MISSING', 'Cannot quote pegin without a BtcSigner');\n    }\n    // For v0.17 we treat pegin as a 1:1 BTC-to-PegBTC conversion (bridge fee comes off-chain in\n    // the hosted-bridge response). Caller is expected to swap PegBTC→USDC after the peg-in\n    // succeeds — the router composes pegin + swap when both are in allowedPaths and only pegin\n    // has a balance. Here we just quote the PegBTC equivalent.\n    const intent = await this.fetchIntent(targetUsdcWei, ctx?.signal);\n    return {\n      path: 'pegin',\n      usdcOut: targetUsdcWei,\n      sourceIn: intent.expectedAmountSats,\n      sourceChain: 'btc',\n      feeWei: 0n, // off-chain fee schedule\n      feeBps: 0,\n      validUntil: intent.expiry,\n      etaSeconds: 1800, // ~30 min — multi-confirmation\n      meta: { intent },\n    };\n  }\n\n  async execute(quote: AcquisitionQuote, ctx?: { signal?: AbortSignal }): Promise<AcquisitionReceipt> {\n    const intent = quote.meta.intent as PeginIntent;\n    if (!intent) throw goatError('GOAT_NO_VIABLE_PATH', 'Malformed pegin quote');\n    if (Date.now() > intent.expiry) throw goatError('GOAT_BRIDGE_INTENT_EXPIRED');\n    if (this.seenIntents.has(intent.intentId)) {\n      throw goatError('GOAT_BRIDGE_INTENT_REPLAYED');\n    }\n    this.seenIntents.add(intent.intentId);\n\n    const signer = this.opts.btcSigner!;\n    const psbt = intent.psbtTemplate ?? '';\n    const signedTxHex = await signer.signPsbt(psbt);\n\n    // CRITICAL: verify outputs match the intent BEFORE broadcasting.\n    PsbtValidator.assertOutputsMatchIntent(signedTxHex, intent);\n\n    const start = Date.now();\n    const submitRes = await this.api(`/pegin/broadcast`, 'POST', {\n      intentId: intent.intentId, signedTxHex,\n    }, ctx?.signal);\n    const btcTxId = (submitRes as { btcTxId?: string }).btcTxId ?? '';\n\n    // Poll until minted (default 30 min cap with 10s interval).\n    const deadline = start + 30 * 60_000;\n    while (Date.now() < deadline) {\n      ctx?.signal?.throwIfAborted();\n      const status = (await this.api(`/pegin/status/${intent.intentId}`, 'GET')) as PeginStatus;\n      if (status.state === 'minted') {\n        return {\n          path: 'pegin',\n          usdcAcquired: 0n, // pegin produces PegBTC — caller composes a follow-up swap; receipt's usdcAcquired updated by router\n          feePaid: 0n,\n          srcTxHash: btcTxId,\n          dstTxHash: status.goatTxHash,\n          durationMs: Date.now() - start,\n        };\n      }\n      if (status.state === 'expired' || status.state === 'failed') {\n        throw goatError('GOAT_BRIDGE_API_ERROR', `Pegin ${intent.intentId} ended in state=${status.state}`);\n      }\n      await new Promise((r) => setTimeout(r, 10_000));\n    }\n    throw goatError('GOAT_BRIDGE_TIMEOUT');\n  }\n\n  private async fetchIntent(_targetUsdcWei: bigint, signal?: AbortSignal): Promise<PeginIntent> {\n    const body = { recipientGoat: this.opts.recipientGoat, goatChainId: CHAINS[this.opts.goatChain].chainId };\n    const raw = await this.api(`/pegin/intent`, 'POST', body, signal);\n    const obj = raw as Record<string, unknown>;\n    for (const k of PEGIN_INTENT_SCHEMA_KEYS) {\n      if (!(k in obj)) throw goatError('GOAT_BRIDGE_API_ERROR', `Bridge response missing ${k}`);\n    }\n    return {\n      intentId: String(obj.intentId),\n      depositAddress: String(obj.depositAddress),\n      expectedAmountSats: BigInt(obj.expectedAmountSats as string | number | bigint),\n      expiry: Number(obj.expiry),\n      recipientGoat: obj.recipientGoat as Address,\n      psbtTemplate: obj.psbtTemplate ? String(obj.psbtTemplate) : undefined,\n    };\n  }\n\n  private async api(path: string, method: 'GET' | 'POST', body?: unknown, signal?: AbortSignal): Promise<unknown> {\n    const res = await fetch(`${this.opts.bridgeUrl.replace(/\\/$/, '')}${path}`, {\n      method,\n      headers: { 'content-type': 'application/json' },\n      body: body ? JSON.stringify(body) : undefined,\n      signal,\n    });\n    if (!res.ok) {\n      throw goatError('GOAT_BRIDGE_API_ERROR', `${method} ${path} → ${res.status} ${res.statusText}`);\n    }\n    return res.json();\n  }\n}\n\n// ─── Mock adapters for testnet / CI ──────────────────────────────────────────\n\n/** Deterministic doubles. Stable receipts so demos are reproducible without external endpoints. */\nexport class MockSwapAdapter implements AcquisitionPathAdapter {\n  readonly path: AcquisitionPath = 'swap';\n  constructor(private opts: { feeBps?: number } = {}) {}\n  available(): boolean { return true; }\n  async quote(target: bigint): Promise<AcquisitionQuote> {\n    const feeBps = this.opts.feeBps ?? 30;\n    const feeWei = (target * BigInt(feeBps)) / 10_000n;\n    return {\n      path: 'swap', usdcOut: target, sourceIn: target + feeWei, sourceChain: 'goat-testnet',\n      feeWei, feeBps, validUntil: Date.now() + 60_000, etaSeconds: 5,\n      meta: { mock: true },\n    };\n  }\n  async execute(q: AcquisitionQuote): Promise<AcquisitionReceipt> {\n    return {\n      path: 'swap', usdcAcquired: q.usdcOut, feePaid: q.feeWei,\n      srcTxHash: `0xmock-swap-${Date.now().toString(16)}`,\n      dstTxHash: `0xmock-swap-${Date.now().toString(16)}`,\n      durationMs: 50,\n    };\n  }\n}\n\nexport class MockOftAdapter implements AcquisitionPathAdapter {\n  readonly path: AcquisitionPath = 'oft';\n  constructor(private opts: { srcChain: ChainKey; feeBps?: number }) {}\n  available(): boolean { return true; }\n  async quote(target: bigint): Promise<AcquisitionQuote> {\n    const feeBps = this.opts.feeBps ?? 50;\n    const feeWei = (target * BigInt(feeBps)) / 10_000n;\n    return {\n      path: 'oft', usdcOut: target, sourceIn: target + feeWei, sourceChain: this.opts.srcChain,\n      feeWei, feeBps, validUntil: Date.now() + 60_000, etaSeconds: 90,\n      meta: { mock: true },\n    };\n  }\n  async execute(q: AcquisitionQuote): Promise<AcquisitionReceipt> {\n    return {\n      path: 'oft', usdcAcquired: q.usdcOut, feePaid: q.feeWei,\n      srcTxHash: `0xmock-oft-${Date.now().toString(16)}`,\n      dstTxHash: `0xmock-oft-dst-${Date.now().toString(16)}`,\n      durationMs: 200,\n    };\n  }\n}\n\nexport class MockBridgeAdapter implements AcquisitionPathAdapter {\n  readonly path: AcquisitionPath = 'pegin';\n  available(): boolean { return true; }\n  async quote(target: bigint): Promise<AcquisitionQuote> {\n    return {\n      path: 'pegin', usdcOut: target, sourceIn: target / 1_00_00n, sourceChain: 'btc',\n      feeWei: 0n, feeBps: 0, validUntil: Date.now() + 5 * 60_000, etaSeconds: 1800,\n      meta: { mock: true },\n    };\n  }\n  async execute(q: AcquisitionQuote): Promise<AcquisitionReceipt> {\n    return {\n      path: 'pegin', usdcAcquired: q.usdcOut, feePaid: 0n,\n      srcTxHash: `mock-btc-tx-${Date.now().toString(16)}`,\n      dstTxHash: `0xmock-pegbtc-mint-${Date.now().toString(16)}`,\n      durationMs: 200,\n    };\n  }\n}\n\n// Re-export shared utilities for the router file.\nexport { ZERO_ADDR, MULTICALL3 };\nexport type { PublicClient, WalletClient, Hex, Address };\n","/**\n * v0.17 — GOAT USDC Acquisition Router.\n *\n * The orchestrator: given a target USDC amount on GOAT, pick a path, quote it,\n * verify policy/idempotency, execute, and emit an audit entry.\n *\n * SOLID:\n *   • Open/Closed — RoutingStrategy is an interface; ship BalanceSheetStrategy as\n *     the default but accept any user implementation.\n *   • Single Responsibility — this file owns *only* orchestration. Path\n *     mechanics live in src/goat/paths.ts.\n *   • Dependency Inversion — the router depends on AcquisitionPathAdapter, not\n *     on concrete Swap/OFT/Pegin classes.\n */\n\nimport type { Address } from 'viem';\nimport type {\n  AcquisitionPath,\n  GoatAcquisitionConfig,\n  ChainKey,\n  BtcSigner,\n} from '../types.js';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport type { SpendingGuard } from '../policy/index.js';\nimport { CHAINS } from '../chains.js';\nimport { goatError, NPaymentError } from '../errors.js';\nimport {\n  GoatTokens,\n  GoatBalances,\n  GoatDexSwap,\n  LayerZeroOftClient,\n  BitVMBridgeClient,\n  MockSwapAdapter,\n  MockOftAdapter,\n  MockBridgeAdapter,\n  type AcquisitionPathAdapter,\n  type AcquisitionQuote,\n  type AcquisitionReceipt,\n  type BalanceSheet,\n} from './paths.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface AcquireParams {\n  /** Target USDC wei (6-dec) the agent should hold on GOAT after this call. */\n  targetUsdcWei: bigint;\n  /** Optional idempotency key. Same key in the cache window → cached receipt. */\n  idempotencyKey?: string;\n  /** Quote without executing. */\n  dryRun?: boolean;\n  /** Cancel the in-flight acquisition. */\n  signal?: AbortSignal;\n  /** Subset of paths the router may use this call (overrides config). */\n  allowedPaths?: AcquisitionPath[];\n}\n\nexport interface AcquireResult {\n  status: 'no-op' | 'executed' | 'dry-run';\n  /** USDC wei acquired this call (after partial-fill math). 0n on no-op / dry-run. */\n  acquired: bigint;\n  /** Quote chosen by the strategy (always populated for non-no-op). */\n  quote?: AcquisitionQuote;\n  /** Receipt — populated for status='executed' only. */\n  receipt?: AcquisitionReceipt;\n  /** Correlation id for log + audit cross-reference. */\n  correlationId: string;\n}\n\nexport interface RoutingDecision {\n  path: AcquisitionPath;\n  quote: AcquisitionQuote;\n}\n\nexport interface AcquisitionRoutingStrategy {\n  decide(\n    balances: BalanceSheet,\n    deltaUsdcWei: bigint,\n    available: AcquisitionPathAdapter[],\n    opts: { allowedPaths: AcquisitionPath[]; signal?: AbortSignal },\n  ): Promise<RoutingDecision>;\n}\n\n// ─── BalanceSheetStrategy — default heuristic ────────────────────────────────\n\n/**\n * Inspects the agent's holdings and picks the first viable path in this order:\n *   1. swap   — has PegBTC on GOAT\n *   2. oft    — has USDC on a partner chain (uses cheapest src by feeBps)\n *   3. pegin  — has BTC L1 sats\n * Refuses to pick disallowed paths. Throws GOAT_NO_VIABLE_PATH otherwise.\n */\nexport class BalanceSheetStrategy implements AcquisitionRoutingStrategy {\n  async decide(\n    balances: BalanceSheet,\n    deltaUsdcWei: bigint,\n    available: AcquisitionPathAdapter[],\n    opts: { allowedPaths: AcquisitionPath[]; signal?: AbortSignal },\n  ): Promise<RoutingDecision> {\n    const byPath = new Map(available.map((a) => [a.path, a]));\n    const eligible = (p: AcquisitionPath) => opts.allowedPaths.includes(p) && byPath.has(p) && byPath.get(p)!.available();\n\n    // Path 1 — in-GOAT swap (cheapest, lowest latency).\n    if (eligible('swap') && balances.pegbtcOnGoat > 0n) {\n      const quote = await byPath.get('swap')!.quote(deltaUsdcWei, { signal: opts.signal });\n      if (balances.pegbtcOnGoat >= quote.sourceIn) return { path: 'swap', quote };\n    }\n\n    // Path 2 — cross-chain OFT (any partner chain with enough USDC).\n    if (eligible('oft')) {\n      const candidates = Object.entries(balances.usdcByChain)\n        .filter(([, bal]) => bal! >= deltaUsdcWei)\n        .map(([chain]) => chain as ChainKey);\n      if (candidates.length) {\n        const quote = await byPath.get('oft')!.quote(deltaUsdcWei, { signal: opts.signal });\n        return { path: 'oft', quote };\n      }\n    }\n\n    // Path 3 — BTC L1 peg-in (deepest treasury, highest latency).\n    if (eligible('pegin') && (balances.btcL1Sats ?? 0n) > 0n) {\n      const quote = await byPath.get('pegin')!.quote(deltaUsdcWei, { signal: opts.signal });\n      if ((balances.btcL1Sats ?? 0n) >= quote.sourceIn) return { path: 'pegin', quote };\n    }\n\n    throw goatError(\n      'GOAT_NO_VIABLE_PATH',\n      `No allowed path covers ${deltaUsdcWei} USDC ` +\n      `(pegbtc=${balances.pegbtcOnGoat}, partnerUsdc=${Object.values(balances.usdcByChain).reduce((s, v) => s + (v ?? 0n), 0n)}, ` +\n      `btc=${balances.btcL1Sats ?? 0n}, allowed=[${opts.allowedPaths.join(',')}])`,\n    );\n  }\n}\n\n// ─── UsdcAcquisitionRouter ───────────────────────────────────────────────────\n\nexport interface RouterDeps {\n  goatChain: ChainKey;\n  wallet: OWSWallet;\n  config: GoatAcquisitionConfig;\n  /** Partner chains to inspect for cross-chain USDC. */\n  partnerChains?: ChainKey[];\n  /** Hosted bridge URL for Path 3 (default https://bridge.goat.network). */\n  bridgeUrl?: string;\n  /** External BTC signer for Path 3 — required iff 'pegin' is in allowedPaths. */\n  btcSigner?: BtcSigner;\n  /** USDC override on GOAT (escape hatch — emits boot warning). */\n  usdcOverride?: Address;\n  /** OKU swap router/quoter overrides. */\n  dexOverride?: { router?: Address; quoter?: Address };\n  /** Spending guard for cap enforcement + audit. Optional; when absent, no caps. */\n  guard?: SpendingGuard;\n  /** Strategy. Defaults to BalanceSheetStrategy. */\n  strategy?: AcquisitionRoutingStrategy;\n  /** When true, all paths use Mock adapters (testnet/CI mode). */\n  mockMode?: boolean;\n}\n\nconst DEFAULT_IDEMP_WINDOW_MS = 60_000;\n\n/**\n * The user-facing router. Composes strategies + path adapters; enforces caps,\n * idempotency, mutex, and partial-fill.\n *\n * Performance: balance reads are lazy (router only fetches the partner-chain\n * column when 'oft' is allowed; only fetches BTC L1 when 'pegin' is allowed).\n */\nexport class UsdcAcquisitionRouter {\n  private readonly tokens: GoatTokens;\n  private readonly balances: GoatBalances;\n  private readonly paths: AcquisitionPathAdapter[];\n  private readonly strategy: AcquisitionRoutingStrategy;\n  private readonly idemCache = new Map<string, { result: AcquireResult; expiresAt: number }>();\n  private mutex: Promise<unknown> = Promise.resolve();\n\n  constructor(private readonly deps: RouterDeps) {\n    this.tokens = new GoatTokens(deps.goatChain, { usdcOverride: deps.usdcOverride });\n    this.balances = new GoatBalances(deps.goatChain, this.tokens);\n    this.strategy = deps.strategy ?? new BalanceSheetStrategy();\n\n    // Build path adapters lazily — mockMode replaces all real ones.\n    if (deps.mockMode) {\n      this.paths = [\n        new MockSwapAdapter(),\n        new MockOftAdapter({ srcChain: 'base-sepolia' }),\n        new MockBridgeAdapter(),\n      ];\n    } else {\n      this.paths = [\n        new GoatDexSwap(deps.goatChain, deps.wallet, this.tokens, {\n          maxSlippageBps: deps.config.maxSlippageBps ?? 50,\n          override: deps.dexOverride,\n        }),\n        new LayerZeroOftClient(\n          (deps.partnerChains?.[0] ?? 'base-mainnet') as ChainKey,\n          deps.goatChain,\n          deps.wallet,\n          this.tokens,\n          { maxFeeBps: deps.config.maxFeeBps ?? 100 },\n        ),\n        new BitVMBridgeClient({\n          bridgeUrl: deps.bridgeUrl ?? 'https://bridge.goat.network',\n          btcSigner: deps.btcSigner,\n          recipientGoat: ('0x' as Address), // resolved per-call via wallet.getAddressAsync\n          goatChain: deps.goatChain,\n          tokens: this.tokens,\n        }),\n      ];\n    }\n  }\n\n  /** True if 'pegin' is in allowedPaths but no BtcSigner is wired — fail-fast at boot. */\n  validateConfig(): void {\n    const allowed = this.deps.config.allowedPaths ?? ['swap'];\n    if (allowed.includes('pegin') && !this.deps.btcSigner && !this.deps.mockMode) {\n      throw goatError('GOAT_BTC_SIGNER_MISSING');\n    }\n  }\n\n  /**\n   * Probe the router without executing. Returns the would-be RoutingDecision —\n   * useful for ops dry-runs and pre-flight UX.\n   */\n  async estimate(params: AcquireParams): Promise<RoutingDecision | null> {\n    const result = await this.acquireInternal({ ...params, dryRun: true });\n    return result.quote ? { path: result.quote.path, quote: result.quote } : null;\n  }\n\n  /**\n   * Acquire USDC on GOAT. Atomic per-call (no fallback between paths within\n   * one acquire — caller can re-call with a different `allowedPaths` to retry).\n   */\n  async acquire(params: AcquireParams): Promise<AcquireResult> {\n    if (!this.deps.config.enabled && !params.dryRun) {\n      throw goatError('GOAT_AUTOFUND_DISABLED');\n    }\n    return this.acquireInternal(params);\n  }\n\n  private async acquireInternal(params: AcquireParams): Promise<AcquireResult> {\n    const correlationId = `acq-${Math.random().toString(36).slice(2, 10)}`;\n    const target = params.targetUsdcWei;\n    if (target === 0n) {\n      return { status: 'no-op', acquired: 0n, correlationId };\n    }\n\n    // Idempotency cache hit?\n    const idemKey = params.idempotencyKey;\n    if (idemKey) {\n      const hit = this.idemCache.get(idemKey);\n      if (hit && hit.expiresAt > Date.now()) return hit.result;\n    }\n\n    // Per-wallet mutex serialises concurrent acquires.\n    return (this.mutex = this.mutex.then(async () => {\n      const result = await this.runOnce(params, correlationId);\n      if (idemKey && result.status === 'executed') {\n        this.idemCache.set(idemKey, { result, expiresAt: Date.now() + DEFAULT_IDEMP_WINDOW_MS });\n      }\n      return result;\n    })) as Promise<AcquireResult>;\n  }\n\n  private async runOnce(params: AcquireParams, correlationId: string): Promise<AcquireResult> {\n    const { targetUsdcWei: target, signal } = params;\n    const dryRun = params.dryRun ?? this.deps.config.dryRun ?? false;\n    const allowedPaths = params.allowedPaths ?? this.deps.config.allowedPaths ?? ['swap'];\n\n    // Read just the parts of the balance sheet our allowedPaths need (lazy).\n    const wantPartner = allowedPaths.includes('oft');\n    const wantBtc = allowedPaths.includes('pegin');\n    const address = (await this.deps.wallet.getAddressAsync(CHAINS[this.deps.goatChain].chainId)) as Address;\n\n    const balances = await this.balances.read({\n      address,\n      partnerChains: wantPartner ? (this.deps.partnerChains ?? ['base-mainnet']) : [],\n      // BTC L1 read needs a separate rpcUrl + address — caller's BtcSigner provides the address.\n      // For v0.17 we skip the L1 balance read in the router (the path adapter quotes deterministically).\n      btcL1: wantBtc && this.deps.btcSigner ? undefined : undefined,\n      needs: this.lazyReadKeys(allowedPaths),\n      signal,\n    });\n\n    // Partial-fill: target − current balance, clamped to ≥ 0.\n    const delta = target > balances.usdcOnGoat ? target - balances.usdcOnGoat : 0n;\n    if (delta === 0n) {\n      return { status: 'no-op', acquired: 0n, correlationId };\n    }\n\n    // Enforce caps via SpendingGuard (independent rolling window for acquisitions).\n    if (this.deps.guard) {\n      const decision = this.deps.guard.checkAcquisition(delta, {\n        maxPerHour: this.deps.config.maxPerHour,\n        maxPerDay: this.deps.config.maxPerDay,\n      });\n      if (!decision.allowed) {\n        throw goatError('GOAT_AUTOFUND_LIMIT_EXCEEDED', decision.reason);\n      }\n    }\n\n    // Pick a path.\n    const decision = await this.strategy.decide(balances, delta, this.paths, { allowedPaths, signal });\n\n    if (dryRun) {\n      return { status: 'dry-run', acquired: 0n, quote: decision.quote, correlationId };\n    }\n\n    // Execute.\n    const adapter = this.paths.find((p) => p.path === decision.path)!;\n    const receipt = await adapter.execute(decision.quote, { signal });\n\n    // Audit.\n    if (this.deps.guard) {\n      this.deps.guard.recordAcquisition({\n        amountUsdcWei: delta,\n        chain: this.deps.goatChain,\n        path: decision.path,\n        fee: receipt.feePaid,\n        srcChain: decision.quote.sourceChain,\n        txHash: receipt.srcTxHash,\n      });\n    }\n\n    // Structured log line.\n    if (typeof console !== 'undefined') {\n      // eslint-disable-next-line no-console\n      console.log(\n        `[n-payment] ${correlationId} acquire ok ` +\n        `path=${decision.path} target=${target} delta=${delta} fee=${receipt.feePaid} ` +\n        `srcChain=${decision.quote.sourceChain} src=${receipt.srcTxHash} dst=${receipt.dstTxHash ?? '-'}`,\n      );\n    }\n\n    return { status: 'executed', acquired: delta, quote: decision.quote, receipt, correlationId };\n  }\n\n  private lazyReadKeys(allowed: AcquisitionPath[]): Array<'pegbtcOnGoat' | 'usdcOnGoat' | 'usdcByChain' | 'btcL1Sats'> {\n    const keys: Array<'pegbtcOnGoat' | 'usdcOnGoat' | 'usdcByChain' | 'btcL1Sats'> = ['usdcOnGoat'];\n    if (allowed.includes('swap')) keys.push('pegbtcOnGoat');\n    if (allowed.includes('oft')) keys.push('usdcByChain');\n    if (allowed.includes('pegin')) keys.push('btcL1Sats');\n    return keys;\n  }\n}\n\n// ─── GoatAcquisitionPresets ──────────────────────────────────────────────────\n\n/**\n * One-line config presets. Devex (gstack /plan-devex-review D1) — most callers\n * want a sensible default, not a 6-knob form. Returns plain config objects so\n * users can spread + override.\n */\nexport const GoatAcquisitionPresets = {\n  /** swap+oft, $1/hr, $10/day, 1% fee, 0.5% slippage. The recommended default. */\n  safeDefaults(): GoatAcquisitionConfig {\n    return {\n      enabled: true,\n      allowedPaths: ['swap', 'oft'],\n      maxPerHour: 1_000_000n,    // $1\n      maxPerDay: 10_000_000n,    // $10\n      maxFeeBps: 100,            // 1%\n      maxSlippageBps: 50,        // 0.5%\n    };\n  },\n\n  /** PegBTC swap only — no cross-chain risk; smallest blast radius. */\n  swapOnly(): GoatAcquisitionConfig {\n    return {\n      enabled: true,\n      allowedPaths: ['swap'],\n      maxPerHour: 5_000_000n,    // $5\n      maxPerDay: 50_000_000n,    // $50\n      maxFeeBps: 100,\n      maxSlippageBps: 50,\n    };\n  },\n\n  /** Cross-chain only — for agents whose treasury sits on Base/Polygon. */\n  oftOnly(): GoatAcquisitionConfig {\n    return {\n      enabled: true,\n      allowedPaths: ['oft'],\n      maxPerHour: 5_000_000n,\n      maxPerDay: 50_000_000n,\n      maxFeeBps: 150,            // 1.5% (LZ V2 fees can run higher than DEX)\n    };\n  },\n\n  /** BTC L1 deep-treasury mode. Slow but sovereign. */\n  peginOnly(): GoatAcquisitionConfig {\n    return {\n      enabled: true,\n      allowedPaths: ['pegin'],\n      maxPerHour: 50_000_000n,\n      maxPerDay: 500_000_000n,\n      maxFeeBps: 200,\n    };\n  },\n\n  /** All paths, larger caps, looser slippage. For high-volume agents. */\n  aggressive(): GoatAcquisitionConfig {\n    return {\n      enabled: true,\n      allowedPaths: ['swap', 'oft', 'pegin'],\n      maxPerHour: 100_000_000n,  // $100\n      maxPerDay: 1_000_000_000n, // $1000\n      maxFeeBps: 300,            // 3%\n      maxSlippageBps: 100,       // 1%\n    };\n  },\n\n  /** Mock-friendly defaults for goat-testnet quickstart + CI. */\n  testnet(): GoatAcquisitionConfig {\n    return {\n      enabled: true,\n      allowedPaths: ['swap', 'oft', 'pegin'],\n      maxPerHour: 1_000_000_000n,    // $1k — testnet is unmetered for dev\n      maxPerDay: 10_000_000_000n,\n      maxFeeBps: 500,\n      maxSlippageBps: 200,\n    };\n  },\n};\n\n// ─── Re-exports for the public surface ───────────────────────────────────────\n\nexport type {\n  AcquisitionPath,\n  GoatAcquisitionConfig,\n  BtcSigner,\n} from '../types.js';\n\nexport {\n  GoatTokens,\n  GoatBalances,\n  GoatDexSwap,\n  LayerZeroOftClient,\n  BitVMBridgeClient,\n  MockSwapAdapter,\n  MockOftAdapter,\n  MockBridgeAdapter,\n  type AcquisitionPathAdapter,\n  type AcquisitionQuote,\n  type AcquisitionReceipt,\n  type BalanceSheet,\n} from './paths.js';\n\nexport { goatError, NPaymentError };\n","import type { PaymentAdapter } from '../types.js';\nimport { NPaymentError } from '../errors.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface CircleGatewayConfig {\n  apiKey: string;\n  environment?: 'sandbox' | 'production';\n  walletId?: string;\n}\n\n// ─── Circle Gateway Adapter ────────────────────────────────────────────────────\n\nexport class CircleGatewayAdapter implements PaymentAdapter {\n  readonly protocol = 'nanopayment';\n  private config: CircleGatewayConfig;\n  private baseUrl: string;\n\n  constructor(config: CircleGatewayConfig) {\n    this.config = config;\n    this.baseUrl = config.environment === 'production'\n      ? 'https://gateway.circle.com'\n      : 'https://gateway-sandbox.circle.com';\n  }\n\n  detect(response: Response): boolean {\n    // Circle nanopayments use x402 with Circle facilitator\n    const header = response.headers.get('payment-required') ?? '';\n    try {\n      const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n      return decoded.accepts?.[0]?.facilitator?.includes('circle') ?? false;\n    } catch {\n      return false;\n    }\n  }\n\n  async pay(url: string, init: RequestInit | undefined, response: Response): Promise<Response> {\n    const header = response.headers.get('payment-required') ?? '';\n    const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n    const accepts = decoded.accepts?.[0] ?? {};\n\n    // Sign EIP-3009 authorization offchain (gas-free via Circle Gateway)\n    const authorization = await this.signAuthorization({\n      payTo: accepts.payTo,\n      amount: BigInt(accepts.maxAmountRequired ?? '0'),\n      token: accepts.asset,\n    });\n\n    // Retry with signed authorization\n    const retryHeaders = new Headers(init?.headers);\n    retryHeaders.set('x-payment-authorization', JSON.stringify(authorization));\n    retryHeaders.set('x-payment-gateway', 'circle');\n    return fetch(url, { ...init, headers: retryHeaders });\n  }\n\n  /** Get unified balance across chains */\n  async getBalance(): Promise<{ available: string; currency: string }> {\n    const res = await fetch(`${this.baseUrl}/v1/wallets/${this.config.walletId}/balance`, {\n      headers: { Authorization: `Bearer ${this.config.apiKey}` },\n    });\n    if (!res.ok) throw new NPaymentError('Failed to get Circle balance', 'CIRCLE_BALANCE_ERROR');\n    return res.json() as any;\n  }\n\n  private async signAuthorization(params: { payTo: string; amount: bigint; token: string }) {\n    // EIP-3009 transferWithAuthorization — offchain signature\n    return {\n      from: this.config.walletId ?? '',\n      to: params.payTo,\n      value: params.amount.toString(),\n      validAfter: 0,\n      validBefore: Math.floor(Date.now() / 1000) + 3600,\n      nonce: `0x${Date.now().toString(16)}`,\n      // Real impl: sign with Circle wallet key\n      signature: `0x${'0'.repeat(130)}`,\n    };\n  }\n}\n","import type { PaymentAdapter } from '../types.js';\nimport { NPaymentError } from '../errors.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface SolanaX402Config {\n  rpcUrl?: string;\n  keypair?: string; // Base58 secret key\n  facilitator?: string;\n}\n\n// ─── Solana x402 Adapter ───────────────────────────────────────────────────────\n\nexport class SolanaX402Adapter implements PaymentAdapter {\n  readonly protocol = 'x402-solana';\n  private config: SolanaX402Config;\n\n  constructor(config: SolanaX402Config = {}) {\n    this.config = {\n      rpcUrl: config.rpcUrl ?? 'https://api.mainnet-beta.solana.com',\n      facilitator: config.facilitator ?? 'https://api.cdp.coinbase.com/platform/v2/x402',\n      ...config,\n    };\n  }\n\n  detect(response: Response): boolean {\n    const header = response.headers.get('payment-required') ?? '';\n    try {\n      const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n      const network = decoded.accepts?.[0]?.network ?? '';\n      return network.startsWith('solana:');\n    } catch {\n      return false;\n    }\n  }\n\n  async pay(url: string, init: RequestInit | undefined, response: Response): Promise<Response> {\n    const header = response.headers.get('payment-required') ?? '';\n    const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n    const accepts = decoded.accepts?.[0] ?? {};\n\n    if (!this.config.keypair) {\n      throw new NPaymentError('Solana keypair required for x402 payments', 'SOLANA_NO_KEYPAIR');\n    }\n\n    // SPL token transfer for payment\n    const txSignature = await this.transferSPL({\n      to: accepts.payTo,\n      amount: BigInt(accepts.maxAmountRequired ?? '0'),\n      mint: accepts.asset,\n    });\n\n    // Retry with payment proof\n    const retryHeaders = new Headers(init?.headers);\n    retryHeaders.set('x-payment-tx', txSignature);\n    retryHeaders.set('x-payment-network', accepts.network);\n    return fetch(url, { ...init, headers: retryHeaders });\n  }\n\n  private async transferSPL(params: { to: string; amount: bigint; mint: string }): Promise<string> {\n    // Placeholder — real impl uses @solana/web3.js + @solana/spl-token\n    // 1. Create associated token accounts if needed\n    // 2. Build transfer instruction\n    // 3. Sign with keypair\n    // 4. Send and confirm transaction\n    throw new NPaymentError(\n      'Solana SPL transfer requires @solana/web3.js — install as peer dependency',\n      'SOLANA_NOT_CONFIGURED',\n      'npm install @solana/web3.js @solana/spl-token',\n    );\n  }\n}\n","/**\n * EIP-3009 transferWithAuthorization helpers — Circle FiatTokenV2 standard.\n *\n * Pure functions, zero I/O. Shared by:\n *   - MorphX402Adapter (sponsored payment branch — signs typed data)\n *   - MorphHoodiFacilitator (verifies signature, submits on-chain)\n *\n * Spec: https://eips.ethereum.org/EIPS/eip-3009\n */\nimport { hexToBigInt, type Address, type Hex, type TypedDataDomain } from 'viem';\n\n/** EIP-712 type definition for TransferWithAuthorization. */\nexport const TRANSFER_WITH_AUTHORIZATION_TYPES = {\n  TransferWithAuthorization: [\n    { name: 'from', type: 'address' },\n    { name: 'to', type: 'address' },\n    { name: 'value', type: 'uint256' },\n    { name: 'validAfter', type: 'uint256' },\n    { name: 'validBefore', type: 'uint256' },\n    { name: 'nonce', type: 'bytes32' },\n  ],\n} as const;\n\nexport interface TransferAuthorization {\n  from: Address;\n  to: Address;\n  value: bigint;\n  validAfter: bigint;\n  validBefore: bigint;\n  nonce: Hex;\n}\n\n/** Wire-shape of the authorization payload (string-encoded for JSON transport). */\nexport interface AuthorizationPayload {\n  from: Address;\n  to: Address;\n  value: string;        // base-10 string (uint256)\n  validAfter: string;   // base-10 string (uint256)\n  validBefore: string;  // base-10 string (uint256)\n  nonce: Hex;           // 0x + 64 hex\n}\n\nexport interface BuildTypedDataInput {\n  /** USDC contract on Hoodi (0x7433…b661B). */\n  verifyingContract: Address;\n  chainId: number;\n  /** USDC token name (Circle FiatTokenV2 default: \"USD Coin\"). Override per-deploy. */\n  tokenName?: string;\n  /** EIP-712 domain version (Circle default: \"2\"). */\n  tokenVersion?: string;\n  authorization: TransferAuthorization;\n}\n\nexport interface SignableTypedData {\n  domain: TypedDataDomain;\n  types: typeof TRANSFER_WITH_AUTHORIZATION_TYPES;\n  primaryType: 'TransferWithAuthorization';\n  message: TransferAuthorization;\n}\n\n/** Build the EIP-712 typed-data payload for `transferWithAuthorization`. */\nexport function buildTransferWithAuthorizationTypedData(input: BuildTypedDataInput): SignableTypedData {\n  return {\n    domain: {\n      name: input.tokenName ?? 'USD Coin',\n      version: input.tokenVersion ?? '2',\n      chainId: input.chainId,\n      verifyingContract: input.verifyingContract,\n    },\n    types: TRANSFER_WITH_AUTHORIZATION_TYPES,\n    primaryType: 'TransferWithAuthorization',\n    message: input.authorization,\n  };\n}\n\n/** Generate a cryptographically random 32-byte nonce (`0x` + 64 hex). */\nexport function randomEip3009Nonce(): Hex {\n  // 32 random bytes via crypto.getRandomValues (Node 18+ ships globalThis.crypto)\n  const bytes = new Uint8Array(32);\n  globalThis.crypto.getRandomValues(bytes);\n  let hex = '0x';\n  for (const b of bytes) hex += b.toString(16).padStart(2, '0');\n  return hex as Hex;\n}\n\n/** Encode an authorization to a JSON-safe wire shape. */\nexport function encodeAuthorizationPayload(auth: TransferAuthorization): AuthorizationPayload {\n  return {\n    from: auth.from,\n    to: auth.to,\n    value: auth.value.toString(),\n    validAfter: auth.validAfter.toString(),\n    validBefore: auth.validBefore.toString(),\n    nonce: auth.nonce,\n  };\n}\n\n/** Decode a wire-shape authorization back to bigint-typed form. Throws on malformed input. */\nexport function decodeAuthorizationPayload(payload: unknown): TransferAuthorization {\n  if (!payload || typeof payload !== 'object') throw new Error('authorization payload must be an object');\n  const p = payload as Record<string, unknown>;\n  for (const k of ['from', 'to', 'value', 'validAfter', 'validBefore', 'nonce'] as const) {\n    if (typeof p[k] !== 'string') throw new Error(`authorization.${k} must be a string`);\n  }\n  return {\n    from: p.from as Address,\n    to: p.to as Address,\n    value: BigInt(p.value as string),\n    validAfter: BigInt(p.validAfter as string),\n    validBefore: BigInt(p.validBefore as string),\n    nonce: p.nonce as Hex,\n  };\n}\n\n/**\n * Split a 65-byte 0x… signature into its v/r/s components for the\n * `transferWithAuthorization(from,to,value,validAfter,validBefore,nonce,v,r,s)` ABI.\n */\nexport function splitSignature(signature: Hex): { v: number; r: Hex; s: Hex } {\n  if (signature.length !== 132) throw new Error(`expected 65-byte signature, got ${(signature.length - 2) / 2} bytes`);\n  const r = `0x${signature.slice(2, 66)}` as Hex;\n  const s = `0x${signature.slice(66, 130)}` as Hex;\n  const v = Number(hexToBigInt(`0x${signature.slice(130, 132)}` as Hex));\n  return { v, r, s };\n}\n\n/** Minimal EIP-3009 ABI fragment used by both client (estimateGas) and facilitator (writeContract + read). */\nexport const EIP3009_ABI = [\n  {\n    name: 'transferWithAuthorization',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'from', type: 'address' },\n      { name: 'to', type: 'address' },\n      { name: 'value', type: 'uint256' },\n      { name: 'validAfter', type: 'uint256' },\n      { name: 'validBefore', type: 'uint256' },\n      { name: 'nonce', type: 'bytes32' },\n      { name: 'v', type: 'uint8' },\n      { name: 'r', type: 'bytes32' },\n      { name: 's', type: 'bytes32' },\n    ],\n    outputs: [],\n  },\n  {\n    name: 'authorizationState',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { name: 'authorizer', type: 'address' },\n      { name: 'nonce', type: 'bytes32' },\n    ],\n    outputs: [{ name: '', type: 'bool' }],\n  },\n] as const;\n","import type { PaymentAdapter, PaymentContext, ChainKey } from '../types.js';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport { MorphX402Client } from '../morph/client.js';\nimport { CHAINS } from '../chains.js';\nimport { ChallengeParseError, InsufficientBalanceError, NPaymentError } from '../errors.js';\nimport {\n  buildTransferWithAuthorizationTypedData,\n  encodeAuthorizationPayload,\n  randomEip3009Nonce,\n} from '../morph/eip3009.js';\nimport { createPublicClient, http, type Address } from 'viem';\n\n/** v0.20: Optional EIP-712 domain overrides for sponsored mode (eip3009). */\nexport interface MorphX402AdapterOptions {\n  tokenName?: string;\n  tokenVersion?: string;\n}\n\n/**\n * Morph x402 adapter — single responsibility: orchestrate the Morph payment flow.\n *\n * Two schemes, dispatched by the `scheme` field in the 402 challenge envelope:\n *\n *  • `'exact'` (default, Morph mainnet behavior unchanged):\n *      verify → wallet.transferERC20 → settle(txHash) → retry\n *\n *  • `'eip3009'` (Hoodi sponsored, v0.18):\n *      sign EIP-712 TransferWithAuthorization → settle({authorization,signature})\n *      facilitator submits on-chain (sponsor pays gas) → retry\n *\n *  v0.20: paySponsored() now resolves the EIP-712 `name`/`version` from the\n *  USDC contract on-chain when overrides are not supplied. This fixes the\n *  Hoodi USDC mismatch (name=`'USDC'`) without breaking mainnet behavior.\n *\n * Routing: chain-config-driven (detect() inspects the 402 network field).\n */\nexport class MorphX402Adapter implements PaymentAdapter {\n  readonly protocol = 'morph-x402';\n\n  /** Cache of resolved EIP-712 domain per asset address (string keyed for simplicity). */\n  private domainCache = new Map<string, { name: string; version: string }>();\n\n  constructor(\n    private readonly wallet: OWSWallet,\n    private readonly client: MorphX402Client,\n    private readonly chainKey: ChainKey,\n    private readonly opts: MorphX402AdapterOptions = {},\n  ) {}\n\n  detect(response: Response): boolean {\n    const header = response.headers.get('payment-required') ?? response.headers.get('x-payment-required');\n    if (!header) return false;\n    try {\n      const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n      const network = decoded?.accepts?.[0]?.network as string | undefined;\n      return network === CHAINS[this.chainKey].caip2;\n    } catch {\n      return false;\n    }\n  }\n\n  async pay(\n    url: string,\n    init: RequestInit | undefined,\n    response: Response,\n    ctx?: PaymentContext,\n  ): Promise<Response> {\n    const requirements = this.parseRequirements(response);\n    const chain = CHAINS[this.chainKey];\n    const asset = (requirements.asset || chain.tokens.USDC) as `0x${string}`;\n    const amount = BigInt(requirements.maxAmountRequired);\n\n    // Common pre-check: buyer must hold enough USDC. (Sponsor pays gas in eip3009 mode,\n    // but the contract still pulls from the buyer — fail fast either way.)\n    const balance = await this.wallet.getBalance(asset, chain.chainId);\n    if (balance < amount) {\n      throw new InsufficientBalanceError(\n        `Insufficient ${asset} on ${chain.name}: have ${balance}, need ${amount}`,\n        'INSUFFICIENT_BALANCE',\n        `Fund wallet on ${chain.name} (chainId ${chain.chainId})`,\n      );\n    }\n\n    const settleRes = requirements.scheme === 'eip3009'\n      ? await this.paySponsored(requirements, asset, amount, chain.chainId)\n      : await this.payDirect(requirements, asset, amount, chain.chainId);\n\n    return this.retryWithProof(url, init, settleRes, chain.caip2, ctx);\n  }\n\n  // ── Scheme: 'exact' (legacy, Morph mainnet) ───────────────────────────────\n\n  private async payDirect(\n    requirements: ParsedRequirements,\n    asset: `0x${string}`,\n    amount: bigint,\n    chainId: number,\n  ): Promise<SettleOutcome> {\n    const fromAddress = await this.wallet.getAddressAsync(chainId);\n    const payload = {\n      x402Version: 2,\n      scheme: requirements.scheme,\n      network: requirements.network,\n      payload: { from: fromAddress, to: requirements.payTo, amount: amount.toString(), asset },\n    };\n    const verifyRes = await this.client.verify(payload, requirements.raw);\n    if (!verifyRes.isValid) {\n      throw new NPaymentError(\n        `Morph verify rejected payment: ${verifyRes.invalidReason ?? 'unknown'}`,\n        'MORPH_VERIFY_FAILED',\n      );\n    }\n\n    const { txHash } = await this.wallet.transferERC20(requirements.payTo, asset, amount, chainId);\n\n    const settledPayload = { ...payload, payload: { ...payload.payload, transaction: txHash } };\n    const settleRes = await this.client.settle(settledPayload, requirements.raw);\n    if (!settleRes.success) {\n      throw new NPaymentError(\n        `Morph settle failed (tx ${txHash}): ${settleRes.errorReason ?? 'unknown'}`,\n        'MORPH_SETTLE_FAILED',\n        'Payment was sent on-chain but facilitator did not confirm. Retry with same tx hash.',\n      );\n    }\n    return { txHash: settleRes.transaction ?? txHash, payer: settleRes.payer, network: settleRes.network };\n  }\n\n  // ── Scheme: 'eip3009' (Hoodi sponsored, v0.18) ────────────────────────────\n\n  private async paySponsored(\n    requirements: ParsedRequirements,\n    asset: `0x${string}`,\n    amount: bigint,\n    chainId: number,\n  ): Promise<SettleOutcome> {\n    const fromAddress = (await this.wallet.getAddressAsync(chainId)) as `0x${string}`;\n    const now = Math.floor(Date.now() / 1000);\n    const authorization = {\n      from: fromAddress,\n      to: requirements.payTo as `0x${string}`,\n      value: amount,\n      validAfter: 0n,\n      validBefore: BigInt(now + 300), // 5 min window\n      nonce: randomEip3009Nonce(),\n    };\n    // v0.20: resolve EIP-712 domain (name/version) for the asset. Hoodi USDC uses\n    // name='USDC' (not Circle's mainnet 'USD Coin'); resolving on-chain is the\n    // robust default. Caller may bypass via MorphConfig.tokenName/tokenVersion.\n    const dom = await this.resolveEip712Domain(asset, chainId);\n    const td = buildTransferWithAuthorizationTypedData({\n      verifyingContract: asset, chainId, authorization,\n      tokenName: dom.name, tokenVersion: dom.version,\n    });\n    const signature = await this.wallet.signTypedData({\n      domain: td.domain, types: td.types, primaryType: 'TransferWithAuthorization',\n      message: td.message as unknown as Record<string, unknown>,\n    });\n    const payload = {\n      x402Version: 2,\n      scheme: 'eip3009',\n      network: requirements.network,\n      payload: { authorization: encodeAuthorizationPayload(authorization), signature },\n    };\n\n    const verifyRes = await this.client.verify(payload, requirements.raw);\n    if (!verifyRes.isValid) {\n      throw new NPaymentError(\n        `Morph verify rejected payment: ${verifyRes.invalidReason ?? 'unknown'}`,\n        'MORPH_VERIFY_FAILED',\n      );\n    }\n    const settleRes = await this.client.settle(payload, requirements.raw);\n    if (!settleRes.success) {\n      throw new NPaymentError(\n        `Morph settle failed: ${settleRes.errorReason ?? 'unknown'}`,\n        'MORPH_SETTLE_FAILED',\n        'Sponsor failed to submit transferWithAuthorization. Refresh nonce and retry.',\n      );\n    }\n    if (!settleRes.transaction) {\n      throw new NPaymentError('Morph settle returned no transaction hash', 'MORPH_SETTLE_NO_TX');\n    }\n    return { txHash: settleRes.transaction, payer: settleRes.payer ?? fromAddress, network: settleRes.network };\n  }\n\n  /**\n   * v0.20: Resolve the EIP-712 domain `name`/`version` for an ERC-20 asset.\n   * Resolution order:\n   *   1. Constructor opts.tokenName / opts.tokenVersion (caller override).\n   *   2. On-chain `name()` / `version()` reads against the chain's RPC.\n   *   3. Fallback to Circle FiatTokenV2 defaults: 'USD Coin' / '2'.\n   * Cached per asset address for the adapter lifetime.\n   */\n  private async resolveEip712Domain(\n    asset: `0x${string}`,\n    chainId: number,\n  ): Promise<{ name: string; version: string }> {\n    const cacheKey = asset.toLowerCase();\n    const cached = this.domainCache.get(cacheKey);\n    if (cached) return cached;\n\n    let name = this.opts.tokenName;\n    let version = this.opts.tokenVersion;\n\n    if (!name || !version) {\n      const chain = CHAINS[this.chainKey];\n      try {\n        const pub = createPublicClient({ transport: http(chain.rpcUrl) });\n        const erc20Meta = [\n          { name: 'name', type: 'function', stateMutability: 'view', inputs: [], outputs: [{ type: 'string' }] },\n          { name: 'version', type: 'function', stateMutability: 'view', inputs: [], outputs: [{ type: 'string' }] },\n        ] as const;\n        if (!name) {\n          name = (await pub.readContract({\n            address: asset, abi: erc20Meta, functionName: 'name',\n          })) as string;\n        }\n        if (!version) {\n          try {\n            version = (await pub.readContract({\n              address: asset, abi: erc20Meta, functionName: 'version',\n            })) as string;\n          } catch {\n            version = '2';\n          }\n        }\n      } catch {\n        // Network or contract read failure — fall back to Circle defaults.\n        name = name ?? 'USD Coin';\n        version = version ?? '2';\n      }\n    }\n    const resolved = { name: name ?? 'USD Coin', version: version ?? '2' };\n    this.domainCache.set(cacheKey, resolved);\n    void chainId; // referenced for symmetry; pub uses chain.rpcUrl directly.\n    return resolved;\n  }\n\n  // ── Shared retry-with-proof step ──────────────────────────────────────────\n\n  private async retryWithProof(\n    url: string,\n    init: RequestInit | undefined,\n    out: SettleOutcome,\n    fallbackNetwork: string,\n    ctx?: PaymentContext,\n  ): Promise<Response> {\n    const retryHeaders = new Headers(init?.headers);\n    retryHeaders.set('x-payment-tx', out.txHash);\n    retryHeaders.set('x-payment-network', out.network ?? fallbackNetwork);\n    if (out.payer) retryHeaders.set('x-payment-payer', out.payer);\n    if (ctx?.referenceKey) retryHeaders.set('x-payment-reference-key', ctx.referenceKey);\n    return fetch(url, { ...init, headers: retryHeaders });\n  }\n\n  // ── Challenge parsing ─────────────────────────────────────────────────────\n\n  private parseRequirements(response: Response): ParsedRequirements {\n    const header = response.headers.get('payment-required') ?? response.headers.get('x-payment-required');\n    if (!header) {\n      throw new ChallengeParseError('Missing payment-required header', 'MORPH_NO_CHALLENGE');\n    }\n    try {\n      const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n      const accepts = decoded?.accepts?.[0];\n      if (!accepts?.payTo || !accepts?.maxAmountRequired) {\n        throw new Error('challenge missing payTo or maxAmountRequired');\n      }\n      return {\n        scheme: String(accepts.scheme ?? 'exact'),\n        network: String(accepts.network),\n        asset: String(accepts.asset ?? ''),\n        maxAmountRequired: String(accepts.maxAmountRequired),\n        payTo: String(accepts.payTo),\n        raw: accepts,\n      };\n    } catch (err) {\n      throw new ChallengeParseError(\n        `Invalid Morph payment-required header: ${(err as Error).message}`,\n        'MORPH_BAD_CHALLENGE',\n      );\n    }\n  }\n}\n\ninterface ParsedRequirements {\n  scheme: string;\n  network: string;\n  asset: string;\n  maxAmountRequired: string;\n  payTo: string;\n  raw: unknown;\n}\n\ninterface SettleOutcome {\n  txHash: string;\n  payer?: string;\n  network?: string;\n}\n","import { createHmac } from 'node:crypto';\n\n/**\n * Morph x402 Facilitator HMAC-SHA256 authentication.\n *\n * Spec (https://docs.morph.network/docs/morph-rails/agentic-payment/x402-facilitator):\n *  1. Build sign map: MORPH-ACCESS-KEY, MORPH-ACCESS-TIMESTAMP, MORPH-ACCESS-METHOD,\n *     MORPH-ACCESS-PATH (full path incl. /x402 prefix, no query),\n *     plus flattened query params (values as string[]),\n *     plus MORPH-ACCESS-BODY = parsed JSON body (omit if no body).\n *  2. Recursively sort keys lexicographically at every depth.\n *  3. Serialize as compact JSON (no whitespace).\n *  4. signature = base64( HMAC-SHA256(secretKey, content) ).\n *\n * Note: JSON.stringify preserves insertion order in JS — recursive sort is required.\n */\n\n/** Recursively sort all object keys in lexicographic order. Arrays preserve order. */\nexport function sortObjectDeep(value: unknown): unknown {\n  if (Array.isArray(value)) return value.map(sortObjectDeep);\n  if (value !== null && typeof value === 'object') {\n    return Object.keys(value as Record<string, unknown>)\n      .sort()\n      .reduce<Record<string, unknown>>((acc, key) => {\n        acc[key] = sortObjectDeep((value as Record<string, unknown>)[key]);\n        return acc;\n      }, {});\n  }\n  return value;\n}\n\nexport interface MorphSignParams {\n  method: string;\n  /** Full path including /x402 prefix (e.g. /x402/v2/settle). No query string. */\n  path: string;\n  /** Raw query string without leading `?`. Empty/undefined when no query. */\n  query?: string;\n  /** Raw JSON body string. Empty/undefined when no body. */\n  body?: string;\n  accessKey: string;\n  secretKey: string;\n  /** Override for tests. Default: Date.now() in ms. */\n  timestamp?: string;\n}\n\n/** Returns the three required headers: MORPH-ACCESS-KEY, MORPH-ACCESS-TIMESTAMP, MORPH-ACCESS-SIGN. */\nexport function signMorphRequest(params: MorphSignParams): Record<string, string> {\n  const { method, path, query, body, accessKey, secretKey } = params;\n  const timestamp = params.timestamp ?? Date.now().toString();\n\n  const signMap: Record<string, unknown> = {\n    'MORPH-ACCESS-KEY': accessKey,\n    'MORPH-ACCESS-TIMESTAMP': timestamp,\n    'MORPH-ACCESS-METHOD': method.toUpperCase(),\n    'MORPH-ACCESS-PATH': path,\n  };\n\n  if (query) {\n    const usp = new URLSearchParams(query);\n    for (const key of new Set(usp.keys())) signMap[key] = usp.getAll(key);\n  }\n\n  if (body) {\n    try {\n      signMap['MORPH-ACCESS-BODY'] = JSON.parse(body);\n    } catch {\n      // Non-JSON body — skip per spec (omit MORPH-ACCESS-BODY).\n    }\n  }\n\n  const content = JSON.stringify(sortObjectDeep(signMap));\n  const signature = createHmac('sha256', secretKey).update(content).digest('base64');\n\n  return {\n    'MORPH-ACCESS-KEY': accessKey,\n    'MORPH-ACCESS-TIMESTAMP': timestamp,\n    'MORPH-ACCESS-SIGN': signature,\n  };\n}\n","import { signMorphRequest } from './auth.js';\nimport { NPaymentError } from '../errors.js';\n\n/**\n * Morph x402 Facilitator REST client.\n *\n * Endpoints (https://morph-rails.morph.network/x402):\n *   GET  /v2/supported  — public, returns supported networks/schemes\n *   POST /v2/verify     — HMAC, verify a payment payload (no on-chain side effect)\n *   POST /v2/settle     — HMAC, submit on-chain settlement\n *\n * Compatible with Coinbase x402 SDK request/response schemas.\n */\n\n// ─── Response Types (co-located to keep file count minimal) ─────────────────\n\nexport interface MorphSupportedKind {\n  x402Version: number;\n  scheme: string;\n  network: string;\n}\n\nexport interface MorphSupportedResponse {\n  kinds: MorphSupportedKind[];\n  extensions?: unknown[];\n  signers?: Record<string, string[]>;\n}\n\nexport interface MorphVerifyResponse {\n  isValid: boolean;\n  invalidReason?: string;\n  payer?: string;\n}\n\nexport interface MorphSettleResponse {\n  success: boolean;\n  errorReason?: string;\n  payer?: string;\n  transaction?: string;\n  network?: string;\n}\n\nexport interface MorphX402ClientConfig {\n  accessKey?: string;\n  secretKey?: string;\n  /** Override base URL. Default: https://morph-rails.morph.network/x402 (mainnet). */\n  baseUrl?: string;\n  /** Timeout for facilitator requests in ms. Default: 15000. */\n  timeoutMs?: number;\n}\n\nconst DEFAULT_BASE_URL = 'https://morph-rails.morph.network/x402';\nconst PATH_PREFIX = '/x402';\n\nexport class MorphX402Client {\n  private readonly accessKey?: string;\n  private readonly secretKey?: string;\n  private readonly origin: string;\n  private readonly timeoutMs: number;\n\n  constructor(config: MorphX402ClientConfig = {}) {\n    this.accessKey = config.accessKey;\n    this.secretKey = config.secretKey;\n    const base = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '');\n    // Allow callers to pass either \".../x402\" or \"...\" — normalize to origin only.\n    this.origin = base.endsWith(PATH_PREFIX) ? base.slice(0, -PATH_PREFIX.length) : base;\n    this.timeoutMs = config.timeoutMs ?? 15_000;\n  }\n\n  /** GET /v2/supported — public endpoint, no auth required. */\n  async getSupported(): Promise<MorphSupportedResponse> {\n    return this.request<MorphSupportedResponse>('GET', '/v2/supported');\n  }\n\n  /** POST /v2/verify — verify a payment payload without settling on-chain. */\n  async verify(\n    paymentPayload: unknown,\n    paymentRequirements: unknown,\n  ): Promise<MorphVerifyResponse> {\n    return this.request<MorphVerifyResponse>('POST', '/v2/verify', {\n      x402Version: 2,\n      paymentPayload,\n      paymentRequirements,\n    });\n  }\n\n  /** POST /v2/settle — submit on-chain settlement. */\n  async settle(\n    paymentPayload: unknown,\n    paymentRequirements: unknown,\n  ): Promise<MorphSettleResponse> {\n    return this.request<MorphSettleResponse>('POST', '/v2/settle', {\n      x402Version: 2,\n      paymentPayload,\n      paymentRequirements,\n    });\n  }\n\n  /** Single request path: handles auth, timeout, error mapping. */\n  private async request<T>(method: string, endpoint: string, body?: unknown): Promise<T> {\n    const fullPath = `${PATH_PREFIX}${endpoint}`;\n    const url = `${this.origin}${fullPath}`;\n    const bodyStr = body ? JSON.stringify(body) : undefined;\n    const needsAuth = endpoint !== '/v2/supported';\n\n    const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n    if (needsAuth) {\n      // v0.20: HMAC is OPTIONAL when no creds are set — supports self-hosted\n      // permissive facilitators (Morph Hoodi local sponsor on :4040). When\n      // creds ARE set, the request is signed (mainnet rails parity).\n      if (this.accessKey && this.secretKey) {\n        Object.assign(\n          headers,\n          signMorphRequest({\n            method,\n            path: fullPath,\n            body: bodyStr,\n            accessKey: this.accessKey,\n            secretKey: this.secretKey,\n          }),\n        );\n      }\n    }\n\n    const controller = new AbortController();\n    const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n    try {\n      const res = await fetch(url, { method, headers, body: bodyStr, signal: controller.signal });\n      const data = (await res.json().catch(() => ({}))) as Record<string, unknown> & T;\n      if (!res.ok) {\n        const reason = String(data.invalidReason ?? data.errorReason ?? res.statusText);\n        throw new NPaymentError(\n          `Morph facilitator ${endpoint} failed (${res.status}): ${reason}`,\n          this.errorCodeFor(res.status),\n          this.errorHintFor(res.status),\n        );\n      }\n      return data;\n    } catch (err) {\n      if (err instanceof NPaymentError) throw err;\n      const msg = (err as Error).name === 'AbortError' ? 'request timed out' : (err as Error).message;\n      throw new NPaymentError(`Morph facilitator ${endpoint} failed: ${msg}`, 'MORPH_NETWORK_ERROR');\n    } finally {\n      clearTimeout(timer);\n    }\n  }\n\n  private errorCodeFor(status: number): string {\n    if (status === 401) return 'MORPH_AUTH_FAILED';\n    if (status === 403) return 'MORPH_KEY_DISABLED';\n    if (status === 429) return 'MORPH_RATE_LIMITED';\n    return 'MORPH_FACILITATOR_ERROR';\n  }\n\n  private errorHintFor(status: number): string | undefined {\n    if (status === 401) return 'Verify HMAC signing: timestamp ms, sorted JSON, full path with /x402 prefix';\n    if (status === 429) return 'Default 10 QPS per Access Key — slow down or contact Morph for higher limits';\n    return undefined;\n  }\n}\n","/**\n * Flare x402 — buyer adapter, merchant settle helper, deploy helper (v0.19).\n *\n * Three exports, one cohesive module:\n *\n *   • FlareX402Adapter             — buyer-side. Implements PaymentAdapter.\n *                                     Signs EIP-3009 transferWithAuthorization\n *                                     against MockUSDT0 (or any EIP-3009 token)\n *                                     and posts Flare's flat 9-field X-Payment\n *                                     header. Reuses src/morph/eip3009.ts for\n *                                     all EIP-712 plumbing — zero duplication.\n *\n *   • verifyAndSettleFlareX402(…)  — merchant-side. Reads X402Facilitator\n *                                     .verifyPayment, then writes settlePayment\n *                                     and waits for the receipt. Pure function;\n *                                     consumers wire it into createPaywall.\n *\n *   • deployFlareX402Contracts(…)  — one-shot viem deploy of MockUSDT0 +\n *                                     X402Facilitator from caller-supplied\n *                                     compiled artifacts. No solc dep.\n *\n * Design (SOLID):\n *   - SRP: each export does one thing.\n *   - OCP: domain `name`/`version` are constructor parameters. The day FXRP\n *          ships EIP-3009, instantiate with `tokenName: 'FXRP'` instead of\n *          editing this file.\n *   - DIP: adapter takes OWSWallet (interface), helper takes viem clients\n *          (interfaces), deploy takes artifacts (structural type).\n */\nimport type { Abi, Address, Hex, PublicClient, WalletClient } from 'viem';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport type { PaymentAdapter, ChainKey } from '../types.js';\nimport { CHAINS } from '../chains.js';\nimport {\n  ChallengeParseError,\n  InsufficientBalanceError,\n  NPaymentError,\n} from '../errors.js';\nimport {\n  buildTransferWithAuthorizationTypedData,\n  randomEip3009Nonce,\n  splitSignature,\n} from '../morph/eip3009.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\n/** Flare x402 payment payload — flat 9-field shape with split signature (per Flare docs). */\nexport interface FlareX402Payload {\n  from: Address;\n  to: Address;\n  token: Address;\n  value: string;        // base-10 string (uint256)\n  validAfter: string;   // base-10 string\n  validBefore: string;  // base-10 string\n  nonce: Hex;           // 0x + 64 hex\n  v: number;\n  r: Hex;\n  s: Hex;\n}\n\nexport interface VerifyAndSettleParams {\n  publicClient: PublicClient;\n  walletClient: WalletClient;\n  facilitatorAddress: Address;\n  payload: FlareX402Payload;\n  /** Override receipt poll timeout (ms). @default 60_000 */\n  receiptTimeoutMs?: number;\n}\n\nexport interface VerifyAndSettleResult {\n  paymentId: Hex;\n  transactionHash: Hex;\n  settled: true;\n}\n\nexport interface ContractArtifact {\n  abi: Abi;\n  bytecode: Hex;\n}\n\nexport interface DeployFlareX402Params {\n  walletClient: WalletClient;\n  publicClient: PublicClient;\n  /** Deployer/owner address (also used as feeRecipient on X402Facilitator). */\n  deployer: Address;\n  artifacts: { mockUsdt0: ContractArtifact; x402Facilitator: ContractArtifact };\n  /** Fee in basis points for the facilitator. @default 0 */\n  feeBps?: number;\n}\n\nexport interface DeployFlareX402Result {\n  mockUsdt0Address: Address;\n  x402FacilitatorAddress: Address;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\n/** EIP-712 domain defaults for MockUSDT0 — match Flare's published demo. */\nconst DEFAULT_TOKEN_NAME = 'Mock USDT0';\nconst DEFAULT_TOKEN_VERSION = '1';\nconst DEFAULT_VALIDITY_SECONDS = 300;\n\n/**\n * Per-chain mapping from `network` strings Flare emits in 402 envelopes\n * back to our internal ChainKey. Flare uses non-CAIP-2 strings; we accept\n * both forms for forward compatibility with future facilitator deployments.\n */\nconst FLARE_NETWORK_ALIASES: Readonly<Record<string, ChainKey>> = Object.freeze({\n  'flare-coston2': 'flare-coston2-testnet',\n  'flare-songbird': 'flare-songbird-mainnet',\n  'flare': 'flare-mainnet',\n  'eip155:114': 'flare-coston2-testnet',\n  'eip155:19': 'flare-songbird-mainnet',\n  'eip155:14': 'flare-mainnet',\n});\n\n/**\n * Minimal X402Facilitator ABI — only the two functions the adapter + merchant\n * helper call. Pulled from Flare's published demo.\n */\nconst X402_FACILITATOR_ABI = [\n  {\n    type: 'function',\n    name: 'verifyPayment',\n    stateMutability: 'view',\n    inputs: [\n      {\n        name: 'payment',\n        type: 'tuple',\n        components: [\n          { name: 'from', type: 'address' },\n          { name: 'to', type: 'address' },\n          { name: 'token', type: 'address' },\n          { name: 'value', type: 'uint256' },\n          { name: 'validAfter', type: 'uint256' },\n          { name: 'validBefore', type: 'uint256' },\n          { name: 'nonce', type: 'bytes32' },\n          { name: 'v', type: 'uint8' },\n          { name: 'r', type: 'bytes32' },\n          { name: 's', type: 'bytes32' },\n        ],\n      },\n    ],\n    outputs: [\n      { name: 'paymentId', type: 'bytes32' },\n      { name: 'valid', type: 'bool' },\n    ],\n  },\n  {\n    type: 'function',\n    name: 'settlePayment',\n    stateMutability: 'nonpayable',\n    inputs: [\n      {\n        name: 'payment',\n        type: 'tuple',\n        components: [\n          { name: 'from', type: 'address' },\n          { name: 'to', type: 'address' },\n          { name: 'token', type: 'address' },\n          { name: 'value', type: 'uint256' },\n          { name: 'validAfter', type: 'uint256' },\n          { name: 'validBefore', type: 'uint256' },\n          { name: 'nonce', type: 'bytes32' },\n          { name: 'v', type: 'uint8' },\n          { name: 'r', type: 'bytes32' },\n          { name: 's', type: 'bytes32' },\n        ],\n      },\n    ],\n    outputs: [{ name: '', type: 'bytes32' }],\n  },\n  {\n    type: 'function',\n    name: 'addSupportedToken',\n    stateMutability: 'nonpayable',\n    inputs: [{ name: 'token', type: 'address' }],\n    outputs: [],\n  },\n] as const satisfies Abi;\n\n// ─── Buyer adapter ───────────────────────────────────────────────────────────\n\n/**\n * Internal: parsed shape of a Flare 402 challenge. Tolerant of both header-style\n * (base64-encoded JSON in `payment-required`) and Flare-reference body-style\n * (status 402 + JSON body) envelopes.\n */\ninterface ParsedFlareChallenge {\n  scheme: string;\n  network: string;\n  payTo: Address;\n  asset: Address;\n  amount: bigint;\n  facilitatorAddress?: Address;\n  chainId?: number;\n}\n\nexport class FlareX402Adapter implements PaymentAdapter {\n  readonly protocol = 'flare-x402';\n\n  constructor(\n    private readonly wallet: OWSWallet,\n    private readonly chainKey: ChainKey,\n    private readonly options: {\n      tokenName?: string;\n      tokenVersion?: string;\n      validityWindowSeconds?: number;\n    } = {},\n  ) {}\n\n  detect(response: Response): boolean {\n    if (response.status !== 402) return false;\n    const header = response.headers.get('payment-required') ?? response.headers.get('x-payment-required');\n    if (!header) {\n      // Flare reference servers put the challenge in the body; defer to pay() to read it.\n      // We only claim the response when we are the configured chain's adapter.\n      return true;\n    }\n    try {\n      const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n      const network = decoded?.accepts?.[0]?.network as string | undefined;\n      if (!network) return false;\n      const mapped = FLARE_NETWORK_ALIASES[network];\n      return mapped === this.chainKey || network === CHAINS[this.chainKey].caip2;\n    } catch {\n      return false;\n    }\n  }\n\n  async pay(url: string, init: RequestInit | undefined, response: Response): Promise<Response> {\n    const challenge = await this.readChallenge(response);\n    const chain = CHAINS[this.chainKey];\n\n    // Pre-flight balance check — avoid signing a dead-on-arrival authorization.\n    const account = this.wallet.getAccount();\n    if (!account) {\n      throw new NPaymentError(\n        'FlareX402Adapter requires ows.privateKey for EIP-3009 typed-data signing',\n        'FLARE_X402_NO_SIGNER',\n        'Pass ows: { privateKey: \"0x...\" }; OWS-driver native EIP-712 path lands in v0.20.',\n      );\n    }\n    const balance = await this.wallet.getBalance(challenge.asset, chain.chainId);\n    if (balance < challenge.amount) {\n      throw new InsufficientBalanceError(\n        `Insufficient ${challenge.asset} on ${chain.name}: have ${balance}, need ${challenge.amount}`,\n        'INSUFFICIENT_BALANCE',\n        `Fund wallet on ${chain.name} (chainId ${chain.chainId}); MockUSDT0 has a public mint() for testnet.`,\n      );\n    }\n\n    const validAfter = 0n;\n    const validBefore = BigInt(\n      Math.floor(Date.now() / 1000) +\n        (this.options.validityWindowSeconds ?? DEFAULT_VALIDITY_SECONDS),\n    );\n    const nonce = randomEip3009Nonce();\n    const authorization = {\n      from: account.address,\n      to: challenge.payTo,\n      value: challenge.amount,\n      validAfter,\n      validBefore,\n      nonce,\n    };\n\n    const td = buildTransferWithAuthorizationTypedData({\n      verifyingContract: challenge.asset,\n      chainId: challenge.chainId ?? chain.chainId,\n      tokenName: this.options.tokenName ?? DEFAULT_TOKEN_NAME,\n      tokenVersion: this.options.tokenVersion ?? DEFAULT_TOKEN_VERSION,\n      authorization,\n    });\n    const signature = await account.signTypedData({\n      domain: td.domain,\n      types: td.types,\n      primaryType: 'TransferWithAuthorization',\n      message: authorization,\n    });\n    const { v, r, s } = splitSignature(signature);\n\n    const payload: FlareX402Payload = {\n      from: account.address,\n      to: challenge.payTo,\n      token: challenge.asset,\n      value: challenge.amount.toString(),\n      validAfter: validAfter.toString(),\n      validBefore: validBefore.toString(),\n      nonce,\n      v,\n      r,\n      s,\n    };\n\n    const xPaymentHeader = Buffer.from(JSON.stringify(payload)).toString('base64');\n    const retryHeaders = new Headers(init?.headers);\n    retryHeaders.set('x-payment', xPaymentHeader);\n    return fetch(url, { ...init, headers: retryHeaders });\n  }\n\n  /** Read challenge from header (preferred) or fall back to JSON body (Flare reference shape). */\n  private async readChallenge(response: Response): Promise<ParsedFlareChallenge> {\n    const headerStr = response.headers.get('payment-required') ?? response.headers.get('x-payment-required');\n    if (headerStr) {\n      try {\n        const decoded = JSON.parse(Buffer.from(headerStr, 'base64').toString());\n        return parseAccepts(decoded);\n      } catch (err) {\n        throw new ChallengeParseError(\n          `Malformed Flare payment-required header: ${(err as Error).message}`,\n          'FLARE_X402_BAD_HEADER',\n        );\n      }\n    }\n    // Body-style fallback (clone so the original response can still be consumed by callers).\n    try {\n      const body = await response.clone().json();\n      return parseAccepts(body);\n    } catch (err) {\n      throw new ChallengeParseError(\n        `Flare 402 response had neither payment-required header nor JSON body with accepts[]: ${(err as Error).message}`,\n        'FLARE_X402_NO_CHALLENGE',\n      );\n    }\n  }\n}\n\nfunction parseAccepts(decoded: unknown): ParsedFlareChallenge {\n  const accept = (decoded as { accepts?: Array<Record<string, unknown>> })?.accepts?.[0];\n  if (!accept) {\n    throw new ChallengeParseError('No accepts[0] entry in Flare 402 envelope', 'FLARE_X402_NO_ACCEPTS');\n  }\n  const extra = (accept.extra ?? {}) as Record<string, unknown>;\n  const asset = (extra.tokenAddress ?? accept.asset) as Address | undefined;\n  const payTo = accept.payTo as Address | undefined;\n  if (!asset) throw new ChallengeParseError('Flare 402 missing asset/extra.tokenAddress', 'FLARE_X402_NO_ASSET');\n  if (!payTo) throw new ChallengeParseError('Flare 402 missing payTo', 'FLARE_X402_NO_PAY_TO');\n  const amount = BigInt(String(accept.maxAmountRequired ?? '0'));\n  if (amount === 0n) throw new ChallengeParseError('Flare 402 zero maxAmountRequired', 'FLARE_X402_ZERO_AMOUNT');\n  return {\n    scheme: String(accept.scheme ?? 'exact'),\n    network: String(accept.network ?? ''),\n    payTo,\n    asset,\n    amount,\n    facilitatorAddress: extra.facilitatorAddress as Address | undefined,\n    chainId: extra.chainId as number | undefined,\n  };\n}\n\n// ─── Merchant settle helper ──────────────────────────────────────────────────\n\n/**\n * Verify + settle a Flare x402 payment via the on-chain X402Facilitator.\n * Pure function; the merchant middleware in `src/middleware.ts` calls it after\n * decoding the buyer's X-Payment header.\n *\n * Throws structured errors:\n *   - FLARE_X402_VERIFY_FAILED — facilitator's verifyPayment returned valid=false\n *   - FLARE_X402_SETTLE_FAILED — settle reverted or receipt status != 'success'\n */\nexport async function verifyAndSettleFlareX402(\n  params: VerifyAndSettleParams,\n): Promise<VerifyAndSettleResult> {\n  const { publicClient, walletClient, facilitatorAddress, payload } = params;\n  const tuple = payloadToTuple(payload);\n\n  const verified = (await publicClient.readContract({\n    address: facilitatorAddress,\n    abi: X402_FACILITATOR_ABI,\n    functionName: 'verifyPayment',\n    args: [tuple],\n  })) as readonly [Hex, boolean];\n  const [paymentId, valid] = verified;\n  if (!valid) {\n    throw new NPaymentError(\n      `X402Facilitator.verifyPayment returned invalid for paymentId=${paymentId}`,\n      'FLARE_X402_VERIFY_FAILED',\n      'Most common causes: nonce already consumed, signature does not recover to from, or validBefore expired.',\n    );\n  }\n\n  const txHash = (await walletClient.writeContract({\n    address: facilitatorAddress,\n    abi: X402_FACILITATOR_ABI,\n    functionName: 'settlePayment',\n    args: [tuple],\n    account: walletClient.account ?? null,\n    chain: walletClient.chain ?? null,\n  } as never)) as Hex;\n  const receipt = await publicClient.waitForTransactionReceipt({\n    hash: txHash,\n    timeout: params.receiptTimeoutMs ?? 60_000,\n  });\n  if (receipt.status !== 'success') {\n    throw new NPaymentError(\n      `X402Facilitator.settlePayment tx ${txHash} reverted`,\n      'FLARE_X402_SETTLE_FAILED',\n      'Inspect the transaction on the Flare/Coston2 explorer; common cause is buyer balance changing between verify and settle.',\n    );\n  }\n\n  return { paymentId, transactionHash: txHash, settled: true };\n}\n\nfunction payloadToTuple(p: FlareX402Payload) {\n  return {\n    from: p.from,\n    to: p.to,\n    token: p.token,\n    value: BigInt(p.value),\n    validAfter: BigInt(p.validAfter),\n    validBefore: BigInt(p.validBefore),\n    nonce: p.nonce,\n    v: p.v,\n    r: p.r,\n    s: p.s,\n  };\n}\n\n/** Decode an X-Payment header (base64 JSON) into the typed payload. Used by middleware. */\nexport function decodeFlareX402Header(headerValue: string): FlareX402Payload {\n  let raw: unknown;\n  try {\n    raw = JSON.parse(Buffer.from(headerValue, 'base64').toString());\n  } catch (err) {\n    throw new ChallengeParseError(\n      `Malformed X-Payment header: ${(err as Error).message}`,\n      'FLARE_X402_BAD_X_PAYMENT',\n    );\n  }\n  const obj = raw as Record<string, unknown>;\n  for (const k of ['from', 'to', 'token', 'value', 'validAfter', 'validBefore', 'nonce'] as const) {\n    if (typeof obj[k] !== 'string') {\n      throw new ChallengeParseError(`X-Payment missing/invalid field: ${k}`, 'FLARE_X402_BAD_X_PAYMENT');\n    }\n  }\n  if (typeof obj.v !== 'number') {\n    throw new ChallengeParseError('X-Payment missing/invalid field: v', 'FLARE_X402_BAD_X_PAYMENT');\n  }\n  return {\n    from: obj.from as Address,\n    to: obj.to as Address,\n    token: obj.token as Address,\n    value: obj.value as string,\n    validAfter: obj.validAfter as string,\n    validBefore: obj.validBefore as string,\n    nonce: obj.nonce as Hex,\n    v: obj.v as number,\n    r: obj.r as Hex,\n    s: obj.s as Hex,\n  };\n}\n\n// ─── Deploy helper ───────────────────────────────────────────────────────────\n\n/**\n * Deploy MockUSDT0 + X402Facilitator on the connected Flare network and wire\n * MockUSDT0 as a supported token. Caller supplies compiled artifacts (typically\n * imported from a Hardhat build of Flare's official demo contracts) so the SDK\n * has no Solidity-compiler dependency.\n *\n * Source contracts:\n *   https://github.com/flare-foundation/flare-hardhat-starter (scripts/x402)\n */\nexport async function deployFlareX402Contracts(\n  params: DeployFlareX402Params,\n): Promise<DeployFlareX402Result> {\n  const { walletClient, publicClient, deployer, artifacts } = params;\n  const feeBps = params.feeBps ?? 0;\n\n  const mockUsdt0Hash = await walletClient.deployContract({\n    abi: artifacts.mockUsdt0.abi,\n    bytecode: artifacts.mockUsdt0.bytecode,\n    account: walletClient.account ?? null,\n    chain: walletClient.chain ?? null,\n  } as never);\n  const mockUsdt0Receipt = await publicClient.waitForTransactionReceipt({ hash: mockUsdt0Hash });\n  if (!mockUsdt0Receipt.contractAddress) {\n    throw new NPaymentError('MockUSDT0 deploy receipt has no contractAddress', 'FLARE_X402_DEPLOY_FAILED');\n  }\n  const mockUsdt0Address = mockUsdt0Receipt.contractAddress as Address;\n\n  const x402Hash = await walletClient.deployContract({\n    abi: artifacts.x402Facilitator.abi,\n    bytecode: artifacts.x402Facilitator.bytecode,\n    args: [deployer, BigInt(feeBps)],\n    account: walletClient.account ?? null,\n    chain: walletClient.chain ?? null,\n  } as never);\n  const x402Receipt = await publicClient.waitForTransactionReceipt({ hash: x402Hash });\n  if (!x402Receipt.contractAddress) {\n    throw new NPaymentError('X402Facilitator deploy receipt has no contractAddress', 'FLARE_X402_DEPLOY_FAILED');\n  }\n  const x402FacilitatorAddress = x402Receipt.contractAddress as Address;\n\n  // Register MockUSDT0 as supported on the facilitator.\n  const addTokenHash = await walletClient.writeContract({\n    address: x402FacilitatorAddress,\n    abi: X402_FACILITATOR_ABI,\n    functionName: 'addSupportedToken',\n    args: [mockUsdt0Address],\n    account: walletClient.account ?? null,\n    chain: walletClient.chain ?? null,\n  } as never);\n  await publicClient.waitForTransactionReceipt({ hash: addTokenHash });\n\n  return { mockUsdt0Address, x402FacilitatorAddress };\n}\n\n// ─── Middleware integration helper ───────────────────────────────────────────\n\n/**\n * Build a Flare-style 402 challenge body (as base64 for `payment-required`\n * header — keeps wire-format compatible with the rest of the SDK while still\n * matching what FlareX402Adapter.detect() expects).\n */\nexport function buildFlareX402Challenge(input: {\n  price: string;\n  payTo: Address;\n  asset: Address;\n  facilitatorAddress: Address;\n  network?: string;\n  chainId?: number;\n  resource?: string;\n  description?: string;\n}): string {\n  const challenge = {\n    x402Version: 2,\n    accepts: [\n      {\n        scheme: 'exact',\n        network: input.network ?? 'flare-coston2',\n        maxAmountRequired: input.price,\n        resource: input.resource ?? '',\n        description: input.description ?? '',\n        mimeType: 'application/json',\n        payTo: input.payTo,\n        maxTimeoutSeconds: 300,\n        asset: input.asset,\n        extra: {\n          tokenAddress: input.asset,\n          facilitatorAddress: input.facilitatorAddress,\n          chainId: input.chainId ?? 114,\n        },\n      },\n    ],\n  };\n  return Buffer.from(JSON.stringify(challenge)).toString('base64');\n}\n\nexport { X402_FACILITATOR_ABI };\n","import { NPaymentError } from '../errors.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport type PolicyRuleType = 'spending_limit' | 'rate_limit' | 'allowlist' | 'blocklist' | 'bandwidth_limit' | 'region_filter';\n\nexport interface PolicyRule {\n  id: string;\n  type: PolicyRuleType;\n  scope: 'global' | 'per_tool' | 'per_session';\n  config: SpendingLimitConfig | RateLimitConfig | ListConfig | BandwidthLimitConfig | RegionFilterConfig;\n}\n\nexport interface SpendingLimitConfig {\n  maxPerTransaction: bigint;\n  maxPerHour: bigint;\n  maxPerDay: bigint;\n}\n\nexport interface RateLimitConfig {\n  maxRequests: number;\n  windowMs: number;\n}\n\nexport interface ListConfig {\n  addresses: string[];\n}\n\n/** v0.11: bandwidth limit (bytes / hour, bytes / day). Used by SpaceRouter. */\nexport interface BandwidthLimitConfig {\n  maxBytesPerHour: bigint;\n  maxBytesPerDay: bigint;\n}\n\n/** v0.11: region + ipType allowlists for proxy routing. */\nexport interface RegionFilterConfig {\n  allowedRegions?: string[];\n  allowedIpTypes?: string[];\n}\n\nexport type PolicyDecision =\n  | { allowed: true }\n  | { allowed: false; reason: string; ruleId: string };\n\nexport interface PaymentRequest {\n  url: string;\n  amount: bigint;\n  chain: string;\n  tool?: string;\n  recipient?: string;\n  /** Merchant order identifier — first-class on Morph (Reference Key); recorded in audit on all chains. */\n  referenceKey?: string;\n  /** Arbitrary key/value metadata persisted in audit log. */\n  metadata?: Record<string, string>;\n  // ─── v0.11: bandwidth fields (used by SpaceRouter; optional otherwise) ───\n  /** Byte count for bandwidth-flavoured requests (proxy traffic). */\n  bytesServed?: bigint;\n  /** ISO 3166-1 alpha-2 region code. */\n  region?: string;\n  /** IP type — residential / mobile / business / hosting. */\n  ipType?: string;\n}\n\nexport interface AuditEntry {\n  id: string;\n  timestamp: number;\n  type: 'payment' | 'policy_check' | 'settlement' | 'bandwidth' | 'acquisition';\n  amount?: bigint;\n  chain?: string;\n  tool?: string;\n  url?: string;\n  decision: PolicyDecision;\n  referenceKey?: string;\n  metadata?: Record<string, string>;\n  // ─── v0.11 ───\n  bytesServed?: bigint;\n  region?: string;\n  ipType?: string;\n  // ─── v0.17 — acquisition fields ───\n  /** 'swap' | 'oft' | 'pegin' for type='acquisition'. */\n  acquisitionPath?: string;\n  /** Fee paid for the acquisition leg in the source token's wei. */\n  acquisitionFee?: bigint;\n  /** Source chain (for cross-chain paths). */\n  acquisitionSrcChain?: string;\n  /** Tx hash on source chain (or BTC L1) for traceability. */\n  acquisitionTxHash?: string;\n}\n\nexport interface PolicyConfig {\n  maxPerTransaction?: bigint;\n  maxPerHour?: bigint;\n  maxPerDay?: bigint;\n  rateLimit?: { maxRequests: number; windowMs: number };\n  blocklist?: string[];\n  allowlist?: string[];\n  // ─── v0.11 ───\n  bandwidthMaxPerHour?: bigint;\n  bandwidthMaxPerDay?: bigint;\n  allowedRegions?: string[];\n  allowedIpTypes?: string[];\n}\n\n// ─── Policy Engine ─────────────────────────────────────────────────────────────\n\nexport class PolicyEngine {\n  private rules: PolicyRule[] = [];\n  private hourlySpend = 0n;\n  private dailySpend = 0n;\n  private hourReset = Date.now() + 3600_000;\n  private dayReset = Date.now() + 86400_000;\n  private requestWindow: number[] = [];\n  // ─── v0.11: bandwidth tracking ───\n  private hourlyBytes = 0n;\n  private dailyBytes = 0n;\n  private bytesHourReset = Date.now() + 3600_000;\n  private bytesDayReset = Date.now() + 86400_000;\n\n  constructor(rules: PolicyRule[] = []) {\n    this.rules = rules;\n  }\n\n  static fromConfig(config: PolicyConfig): PolicyEngine {\n    const rules: PolicyRule[] = [];\n    if (config.maxPerTransaction || config.maxPerHour || config.maxPerDay) {\n      rules.push({\n        id: 'spending',\n        type: 'spending_limit',\n        scope: 'global',\n        config: {\n          maxPerTransaction: config.maxPerTransaction ?? 1000000000n,\n          maxPerHour: config.maxPerHour ?? 100000000n,\n          maxPerDay: config.maxPerDay ?? 1000000000n,\n        },\n      });\n    }\n    if (config.rateLimit) {\n      rules.push({\n        id: 'rate',\n        type: 'rate_limit',\n        scope: 'global',\n        config: config.rateLimit,\n      });\n    }\n    if (config.blocklist?.length) {\n      rules.push({ id: 'blocklist', type: 'blocklist', scope: 'global', config: { addresses: config.blocklist } });\n    }\n    if (config.allowlist?.length) {\n      rules.push({ id: 'allowlist', type: 'allowlist', scope: 'global', config: { addresses: config.allowlist } });\n    }\n    if (config.bandwidthMaxPerHour || config.bandwidthMaxPerDay) {\n      rules.push({\n        id: 'bandwidth',\n        type: 'bandwidth_limit',\n        scope: 'global',\n        config: {\n          maxBytesPerHour: config.bandwidthMaxPerHour ?? (1n << 62n),\n          maxBytesPerDay: config.bandwidthMaxPerDay ?? (1n << 62n),\n        },\n      });\n    }\n    if (config.allowedRegions?.length || config.allowedIpTypes?.length) {\n      rules.push({\n        id: 'region',\n        type: 'region_filter',\n        scope: 'global',\n        config: { allowedRegions: config.allowedRegions, allowedIpTypes: config.allowedIpTypes },\n      });\n    }\n    return new PolicyEngine(rules);\n  }\n\n  evaluate(request: PaymentRequest): PolicyDecision {\n    const now = Date.now();\n    // Reset windows\n    if (now > this.hourReset) { this.hourlySpend = 0n; this.hourReset = now + 3600_000; }\n    if (now > this.dayReset) { this.dailySpend = 0n; this.dayReset = now + 86400_000; }\n    if (now > this.bytesHourReset) { this.hourlyBytes = 0n; this.bytesHourReset = now + 3600_000; }\n    if (now > this.bytesDayReset) { this.dailyBytes = 0n; this.bytesDayReset = now + 86400_000; }\n\n    for (const rule of this.rules) {\n      const decision = this.evaluateRule(rule, request, now);\n      if (!decision.allowed) return decision;\n    }\n    return { allowed: true };\n  }\n\n  recordSpend(amount: bigint): void {\n    this.hourlySpend += amount;\n    this.dailySpend += amount;\n  }\n\n  /** v0.11: record bandwidth usage so bandwidth_limit rules can roll forward. */\n  recordBandwidth(bytes: bigint): void {\n    this.hourlyBytes += bytes;\n    this.dailyBytes += bytes;\n  }\n\n  private evaluateRule(rule: PolicyRule, request: PaymentRequest, now: number): PolicyDecision {\n    switch (rule.type) {\n      case 'spending_limit': {\n        const cfg = rule.config as SpendingLimitConfig;\n        if (request.amount > cfg.maxPerTransaction)\n          return { allowed: false, reason: `Exceeds max per tx: ${cfg.maxPerTransaction}`, ruleId: rule.id };\n        if (this.hourlySpend + request.amount > cfg.maxPerHour)\n          return { allowed: false, reason: 'Hourly spending limit reached', ruleId: rule.id };\n        if (this.dailySpend + request.amount > cfg.maxPerDay)\n          return { allowed: false, reason: 'Daily spending limit reached', ruleId: rule.id };\n        return { allowed: true };\n      }\n      case 'rate_limit': {\n        const cfg = rule.config as RateLimitConfig;\n        this.requestWindow = this.requestWindow.filter(t => now - t < cfg.windowMs);\n        if (this.requestWindow.length >= cfg.maxRequests)\n          return { allowed: false, reason: 'Rate limit exceeded', ruleId: rule.id };\n        this.requestWindow.push(now);\n        return { allowed: true };\n      }\n      case 'blocklist': {\n        const cfg = rule.config as ListConfig;\n        if (request.recipient && cfg.addresses.includes(request.recipient))\n          return { allowed: false, reason: `Recipient blocked: ${request.recipient}`, ruleId: rule.id };\n        return { allowed: true };\n      }\n      case 'allowlist': {\n        const cfg = rule.config as ListConfig;\n        if (request.recipient && !cfg.addresses.includes(request.recipient))\n          return { allowed: false, reason: `Recipient not in allowlist`, ruleId: rule.id };\n        return { allowed: true };\n      }\n      case 'bandwidth_limit': {\n        const cfg = rule.config as BandwidthLimitConfig;\n        const bytes = request.bytesServed ?? 0n;\n        if (this.hourlyBytes + bytes > cfg.maxBytesPerHour)\n          return { allowed: false, reason: 'Hourly bandwidth limit reached', ruleId: rule.id };\n        if (this.dailyBytes + bytes > cfg.maxBytesPerDay)\n          return { allowed: false, reason: 'Daily bandwidth limit reached', ruleId: rule.id };\n        return { allowed: true };\n      }\n      case 'region_filter': {\n        const cfg = rule.config as RegionFilterConfig;\n        if (cfg.allowedRegions?.length && request.region && !cfg.allowedRegions.includes(request.region))\n          return { allowed: false, reason: `Region not allowed: ${request.region}`, ruleId: rule.id };\n        if (cfg.allowedIpTypes?.length && request.ipType && !cfg.allowedIpTypes.includes(request.ipType))\n          return { allowed: false, reason: `IP type not allowed: ${request.ipType}`, ruleId: rule.id };\n        return { allowed: true };\n      }\n      default:\n        return { allowed: true };\n    }\n  }\n}\n\n// ─── Audit Log ─────────────────────────────────────────────────────────────────\n\nexport class AuditLog {\n  private entries: AuditEntry[] = [];\n\n  record(entry: Omit<AuditEntry, 'id' | 'timestamp'>): AuditEntry {\n    const full: AuditEntry = {\n      ...entry,\n      id: `audit_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`,\n      timestamp: Date.now(),\n    };\n    this.entries.push(full);\n    return full;\n  }\n\n  query(filter?: { type?: string; from?: number; to?: number }): AuditEntry[] {\n    return this.entries.filter(e => {\n      if (filter?.type && e.type !== filter.type) return false;\n      if (filter?.from && e.timestamp < filter.from) return false;\n      if (filter?.to && e.timestamp > filter.to) return false;\n      return true;\n    });\n  }\n\n  /** Lookup all audit entries tagged with a specific merchant reference key. */\n  queryByReferenceKey(referenceKey: string): AuditEntry[] {\n    return this.entries.filter(e => e.referenceKey === referenceKey);\n  }\n\n  getSpendingSummary(periodMs = 86400_000): { total: bigint; count: number } {\n    const since = Date.now() - periodMs;\n    const relevant = this.entries.filter(e => e.type === 'payment' && e.timestamp >= since);\n    const total = relevant.reduce((sum, e) => sum + (e.amount ?? 0n), 0n);\n    return { total, count: relevant.length };\n  }\n\n  export(): AuditEntry[] {\n    return [...this.entries];\n  }\n}\n\n// ─── Spending Guard ────────────────────────────────────────────────────────────\n\nexport class SpendingGuard {\n  constructor(\n    private policy: PolicyEngine,\n    private audit: AuditLog,\n  ) {}\n\n  check(request: PaymentRequest): PolicyDecision {\n    const decision = this.policy.evaluate(request);\n    this.audit.record({ type: 'policy_check', amount: request.amount, chain: request.chain, url: request.url, decision });\n    return decision;\n  }\n\n  recordPayment(request: PaymentRequest): void {\n    this.policy.recordSpend(request.amount);\n    this.audit.record({\n      type: 'payment',\n      amount: request.amount,\n      chain: request.chain,\n      url: request.url,\n      tool: request.tool,\n      referenceKey: request.referenceKey,\n      metadata: request.metadata,\n      decision: { allowed: true },\n    });\n  }\n\n  /** v0.11: evaluate a bandwidth-flavoured request (proxy hop). */\n  checkBandwidth(request: PaymentRequest): PolicyDecision {\n    const decision = this.policy.evaluate(request);\n    this.audit.record({\n      type: 'policy_check',\n      chain: request.chain,\n      url: request.url,\n      bytesServed: request.bytesServed,\n      region: request.region,\n      ipType: request.ipType,\n      decision,\n    });\n    return decision;\n  }\n\n  /** v0.11: record a successful bandwidth hop. */\n  recordBandwidth(request: PaymentRequest): void {\n    if (request.bytesServed) this.policy.recordBandwidth(request.bytesServed);\n    this.audit.record({\n      type: 'bandwidth',\n      amount: request.amount,\n      chain: request.chain,\n      url: request.url,\n      bytesServed: request.bytesServed,\n      region: request.region,\n      ipType: request.ipType,\n      referenceKey: request.referenceKey,\n      metadata: request.metadata,\n      decision: { allowed: true },\n    });\n  }\n\n  /**\n   * v0.17 — independent rolling window for USDC acquisition spend.\n   * Tracked separately from `recordPayment` so an agent doesn't blow its\n   * payment cap on a self-funding swap. Returns a PolicyDecision so callers\n   * can refuse the acquisition before signing.\n   */\n  checkAcquisition(amountUsdcWei: bigint, caps: { maxPerHour?: bigint; maxPerDay?: bigint }): PolicyDecision {\n    const now = Date.now();\n    const audit = this.audit.query({ type: 'acquisition', from: now - 86400_000 });\n    const hourly = audit\n      .filter((e) => e.timestamp >= now - 3600_000 && e.decision.allowed)\n      .reduce((s, e) => s + (e.amount ?? 0n), 0n);\n    const daily = audit\n      .filter((e) => e.decision.allowed)\n      .reduce((s, e) => s + (e.amount ?? 0n), 0n);\n    if (caps.maxPerHour !== undefined && hourly + amountUsdcWei > caps.maxPerHour) {\n      return { allowed: false, reason: `Hourly acquisition limit reached (${hourly}+${amountUsdcWei} > ${caps.maxPerHour})`, ruleId: 'acquisition' };\n    }\n    if (caps.maxPerDay !== undefined && daily + amountUsdcWei > caps.maxPerDay) {\n      return { allowed: false, reason: `Daily acquisition limit reached (${daily}+${amountUsdcWei} > ${caps.maxPerDay})`, ruleId: 'acquisition' };\n    }\n    return { allowed: true };\n  }\n\n  /** v0.17 — record a successful USDC acquisition for audit + future cap checks. */\n  recordAcquisition(entry: {\n    amountUsdcWei: bigint;\n    chain: string;\n    path: 'swap' | 'oft' | 'pegin';\n    fee?: bigint;\n    srcChain?: string;\n    txHash?: string;\n    referenceKey?: string;\n  }): void {\n    this.audit.record({\n      type: 'acquisition',\n      amount: entry.amountUsdcWei,\n      chain: entry.chain,\n      decision: { allowed: true },\n      acquisitionPath: entry.path,\n      acquisitionFee: entry.fee,\n      acquisitionSrcChain: entry.srcChain,\n      acquisitionTxHash: entry.txHash,\n      referenceKey: entry.referenceKey,\n    });\n  }\n\n  getAudit(): AuditLog {\n    return this.audit;\n  }\n}\n","/**\n * AaveClient — Lightweight wrapper over Aave protocol data.\n * Uses public RPC/subgraph endpoints; no @aave/client peer dep required at runtime.\n */\nimport type { Address } from 'viem';\n\nexport const GHO_ADDRESSES: Record<string, Address> = {\n  'ethereum': '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f',\n  'base-mainnet': '0x6Bb7a212910682DCFdbd5BCBb3e28FB4E8da10Ee',\n  'arbitrum': '0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33',\n  'avalanche': '0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73',\n};\n\nexport const AAVE_POOL_ADDRESSES: Record<string, Address> = {\n  'base-mainnet': '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5',\n  'ethereum': '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2',\n  'arbitrum': '0x794a61358D6845594F94dc1DB02A252b5b4814aD',\n};\n\nexport const GHO_FLASH_MINTER: Record<string, Address> = {\n  'ethereum': '0xb639D208Bcf0589D54FaC24E655C79EC529762B8',\n};\n\nexport interface AaveMarketData {\n  asset: string;\n  supplyAPY: number;\n  borrowAPY: number;\n  totalLiquidity: bigint;\n  utilizationRate: number;\n}\n\nexport interface AaveUserPosition {\n  totalCollateralUSD: bigint;\n  totalDebtUSD: bigint;\n  availableBorrowsUSD: bigint;\n  healthFactor: bigint;\n}\n\n/**\n * Read-only Aave client. Queries on-chain data via viem publicClient.\n */\nexport class AaveClient {\n  constructor(private chainKey: string) {}\n\n  getGhoAddress(): Address | undefined {\n    return GHO_ADDRESSES[this.chainKey];\n  }\n\n  getPoolAddress(): Address | undefined {\n    return AAVE_POOL_ADDRESSES[this.chainKey];\n  }\n\n  getFlashMinterAddress(): Address | undefined {\n    return GHO_FLASH_MINTER[this.chainKey];\n  }\n\n  /** Check if Aave is available on this chain */\n  isSupported(): boolean {\n    return !!AAVE_POOL_ADDRESSES[this.chainKey];\n  }\n}\n","import type { Address } from 'viem';\nimport type { AaveConfig } from '../types.js';\nimport { AaveClient, AAVE_POOL_ADDRESSES } from './client.js';\nimport { NPaymentError } from '../errors.js';\n\n// Aave V3 Pool ABI (minimal — supply/withdraw only)\nconst POOL_ABI = [\n  { name: 'supply', type: 'function', stateMutability: 'nonpayable', inputs: [{ name: 'asset', type: 'address' }, { name: 'amount', type: 'uint256' }, { name: 'onBehalfOf', type: 'address' }, { name: 'referralCode', type: 'uint16' }], outputs: [] },\n  { name: 'withdraw', type: 'function', stateMutability: 'nonpayable', inputs: [{ name: 'asset', type: 'address' }, { name: 'amount', type: 'uint256' }, { name: 'to', type: 'address' }], outputs: [{ type: 'uint256' }] },\n] as const;\n\nexport interface YieldState {\n  supplied: bigint;\n  yieldEarned: bigint;\n  lastSweepAt: number;\n}\n\nexport class YieldManager {\n  private state: YieldState = { supplied: 0n, yieldEarned: 0n, lastSweepAt: 0 };\n  private client: AaveClient;\n  private minIdle: bigint;\n\n  constructor(private config: AaveConfig, chainKey: string) {\n    this.client = new AaveClient(chainKey);\n    this.minIdle = config.minIdleBalance ?? 10_000000n; // default $10 USDC\n  }\n\n  /** Build supply tx data for Aave Pool */\n  buildSupplyTx(asset: Address, amount: bigint, onBehalfOf: Address) {\n    const pool = this.client.getPoolAddress();\n    if (!pool) throw new NPaymentError('Aave not supported on this chain', 'AAVE_UNSUPPORTED');\n    return { to: pool, abi: POOL_ABI, functionName: 'supply' as const, args: [asset, amount, onBehalfOf, 0] };\n  }\n\n  /** Build withdraw tx data from Aave Pool */\n  buildWithdrawTx(asset: Address, amount: bigint, to: Address) {\n    const pool = this.client.getPoolAddress();\n    if (!pool) throw new NPaymentError('Aave not supported on this chain', 'AAVE_UNSUPPORTED');\n    return { to: pool, abi: POOL_ABI, functionName: 'withdraw' as const, args: [asset, amount, to] };\n  }\n\n  /** Calculate how much to sweep into Aave (balance - minIdle) */\n  calculateSweepAmount(currentBalance: bigint): bigint {\n    if (currentBalance <= this.minIdle) return 0n;\n    return currentBalance - this.minIdle;\n  }\n\n  /** Calculate how much to withdraw for a payment */\n  calculateWithdrawAmount(currentBalance: bigint, paymentAmount: bigint): bigint {\n    if (currentBalance >= paymentAmount) return 0n;\n    return paymentAmount - currentBalance;\n  }\n\n  recordSupply(amount: bigint): void {\n    this.state.supplied += amount;\n    this.state.lastSweepAt = Date.now();\n  }\n\n  recordWithdraw(amount: bigint): void {\n    this.state.supplied = this.state.supplied > amount ? this.state.supplied - amount : 0n;\n  }\n\n  getState(): YieldState { return { ...this.state }; }\n  isEnabled(): boolean { return this.config.autoYield === true && this.client.isSupported(); }\n}\n","import type { Address } from 'viem';\nimport type { AaveConfig } from '../types.js';\nimport { AaveClient, GHO_ADDRESSES, GHO_FLASH_MINTER } from './client.js';\nimport { NPaymentError } from '../errors.js';\n\n// GHO EIP-2612 permit domain\nconst GHO_PERMIT_TYPES = {\n  Permit: [\n    { name: 'owner', type: 'address' },\n    { name: 'spender', type: 'address' },\n    { name: 'value', type: 'uint256' },\n    { name: 'nonce', type: 'uint256' },\n    { name: 'deadline', type: 'uint256' },\n  ],\n} as const;\n\n// Minimal GHO ABI\nconst GHO_ABI = [\n  { name: 'balanceOf', type: 'function', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }], outputs: [{ type: 'uint256' }] },\n  { name: 'nonces', type: 'function', stateMutability: 'view', inputs: [{ name: 'owner', type: 'address' }], outputs: [{ type: 'uint256' }] },\n  { name: 'transfer', type: 'function', stateMutability: 'nonpayable', inputs: [{ name: 'to', type: 'address' }, { name: 'amount', type: 'uint256' }], outputs: [{ type: 'bool' }] },\n] as const;\n\n// Flash Minter ABI\nconst FLASH_MINTER_ABI = [\n  { name: 'flashLoan', type: 'function', stateMutability: 'nonpayable', inputs: [{ name: 'receiver', type: 'address' }, { name: 'token', type: 'address' }, { name: 'amount', type: 'uint256' }, { name: 'data', type: 'bytes' }], outputs: [{ type: 'bool' }] },\n  { name: 'maxFlashLoan', type: 'function', stateMutability: 'view', inputs: [{ name: 'token', type: 'address' }], outputs: [{ type: 'uint256' }] },\n  { name: 'getFee', type: 'function', stateMutability: 'view', inputs: [], outputs: [{ type: 'uint256' }] },\n] as const;\n\nexport class GhoManager {\n  private client: AaveClient;\n\n  constructor(private config: AaveConfig, private chainKey: string) {\n    this.client = new AaveClient(chainKey);\n  }\n\n  getGhoAddress(): Address {\n    const addr = this.client.getGhoAddress();\n    if (!addr) throw new NPaymentError(`GHO not available on ${this.chainKey}`, 'GHO_UNSUPPORTED');\n    return addr;\n  }\n\n  /** Build EIP-2612 permit typed data for gasless GHO approval */\n  buildPermitTypedData(owner: Address, spender: Address, value: bigint, nonce: bigint, deadline: bigint, chainId: number) {\n    return {\n      domain: { name: 'Gho Token', version: '1', chainId, verifyingContract: this.getGhoAddress() },\n      types: GHO_PERMIT_TYPES,\n      primaryType: 'Permit' as const,\n      message: { owner, spender, value, nonce, deadline },\n    };\n  }\n\n  /** Build GHO transfer tx */\n  buildTransferTx(to: Address, amount: bigint) {\n    return { to: this.getGhoAddress(), abi: GHO_ABI, functionName: 'transfer' as const, args: [to, amount] };\n  }\n\n  /** Get flash minter address (Ethereum only) */\n  getFlashMinterAddress(): Address | undefined {\n    return GHO_FLASH_MINTER[this.chainKey];\n  }\n\n  getFlashMinterAbi() { return FLASH_MINTER_ABI; }\n  getGhoAbi() { return GHO_ABI; }\n  isAvailable(): boolean { return !!this.client.getGhoAddress(); }\n  preferGho(): boolean { return this.config.preferGho === true && this.isAvailable(); }\n}\n","import type { Address } from 'viem';\nimport { NPaymentError } from '../errors.js';\n\n// ERC-4626 minimal ABI\nconst VAULT_ABI = [\n  { name: 'deposit', type: 'function', stateMutability: 'nonpayable', inputs: [{ name: 'assets', type: 'uint256' }, { name: 'receiver', type: 'address' }], outputs: [{ type: 'uint256' }] },\n  { name: 'withdraw', type: 'function', stateMutability: 'nonpayable', inputs: [{ name: 'assets', type: 'uint256' }, { name: 'receiver', type: 'address' }, { name: 'owner', type: 'address' }], outputs: [{ type: 'uint256' }] },\n  { name: 'totalAssets', type: 'function', stateMutability: 'view', inputs: [], outputs: [{ type: 'uint256' }] },\n  { name: 'convertToShares', type: 'function', stateMutability: 'view', inputs: [{ name: 'assets', type: 'uint256' }], outputs: [{ type: 'uint256' }] },\n  { name: 'convertToAssets', type: 'function', stateMutability: 'view', inputs: [{ name: 'shares', type: 'uint256' }], outputs: [{ type: 'uint256' }] },\n] as const;\n\nexport interface VaultConfig {\n  enabled: boolean;\n  feePercent: number; // >= 10 (Aave requirement)\n}\n\nexport interface VaultState {\n  address?: Address;\n  totalDeposited: bigint;\n  feesCollected: bigint;\n}\n\nexport class VaultManager {\n  private state: VaultState = { totalDeposited: 0n, feesCollected: 0n };\n\n  constructor(private config: VaultConfig) {\n    if (config.feePercent < 10) {\n      throw new NPaymentError('Vault fee must be >= 10% (Aave requirement)', 'VAULT_INVALID_FEE');\n    }\n  }\n\n  /** Build deposit tx for ERC-4626 vault */\n  buildDepositTx(vault: Address, assets: bigint, receiver: Address) {\n    return { to: vault, abi: VAULT_ABI, functionName: 'deposit' as const, args: [assets, receiver] };\n  }\n\n  /** Build withdraw tx from ERC-4626 vault */\n  buildWithdrawTx(vault: Address, assets: bigint, receiver: Address, owner: Address) {\n    return { to: vault, abi: VAULT_ABI, functionName: 'withdraw' as const, args: [assets, receiver, owner] };\n  }\n\n  recordDeposit(amount: bigint): void { this.state.totalDeposited += amount; }\n  recordWithdraw(amount: bigint): void { this.state.totalDeposited -= amount; }\n  recordFee(amount: bigint): void { this.state.feesCollected += amount; }\n\n  setVaultAddress(addr: Address): void { this.state.address = addr; }\n  getState(): VaultState { return { ...this.state }; }\n  getVaultAbi() { return VAULT_ABI; }\n  isEnabled(): boolean { return this.config.enabled; }\n}\n","import type { Address } from 'viem';\nimport { NPaymentError } from '../errors.js';\nimport { GhoManager } from './gho.js';\n\nexport interface FlashPayment {\n  recipient: Address;\n  amount: bigint;\n}\n\nexport interface FlashBatchResult {\n  totalAmount: bigint;\n  paymentCount: number;\n  txData: { to: Address; abi: readonly any[]; functionName: string; args: readonly any[] };\n}\n\n/**\n * Batches multiple GHO payments into a single GHO Flash Mint transaction.\n * Flash Mint: borrow GHO → distribute → repay in same tx (zero capital needed).\n */\nexport class FlashMintBatcher {\n  private pending: FlashPayment[] = [];\n\n  constructor(private ghoManager: GhoManager) {}\n\n  addPayment(recipient: Address, amount: bigint): void {\n    if (amount <= 0n) throw new NPaymentError('Payment amount must be > 0', 'FLASH_INVALID_AMOUNT');\n    this.pending.push({ recipient, amount });\n  }\n\n  getPendingCount(): number { return this.pending.length; }\n  getPendingTotal(): bigint { return this.pending.reduce((sum, p) => sum + p.amount, 0n); }\n\n  /** Build flash mint tx that settles all pending payments atomically */\n  buildBatchTx(receiverContract: Address): FlashBatchResult {\n    if (!this.pending.length) throw new NPaymentError('No pending payments to batch', 'FLASH_EMPTY');\n    const flashMinter = this.ghoManager.getFlashMinterAddress();\n    if (!flashMinter) throw new NPaymentError('GHO Flash Minter not available on this chain', 'FLASH_UNSUPPORTED');\n\n    const total = this.getPendingTotal();\n    const ghoAddr = this.ghoManager.getGhoAddress();\n    // Encode payments as calldata for the receiver contract\n    const data = this.encodePayments();\n\n    const result: FlashBatchResult = {\n      totalAmount: total,\n      paymentCount: this.pending.length,\n      txData: {\n        to: flashMinter,\n        abi: this.ghoManager.getFlashMinterAbi(),\n        functionName: 'flashLoan',\n        args: [receiverContract, ghoAddr, total, data],\n      },\n    };\n\n    this.pending = [];\n    return result;\n  }\n\n  /** Encode pending payments as ABI-encoded bytes */\n  private encodePayments(): `0x${string}` {\n    // Simple encoding: concat (address, uint256) pairs\n    const parts = this.pending.map(p =>\n      p.recipient.slice(2).padStart(64, '0') + p.amount.toString(16).padStart(64, '0')\n    );\n    return `0x${parts.join('')}`;\n  }\n\n  clear(): void { this.pending = []; }\n}\n","import type { Address } from 'viem';\nimport type { AaveConfig } from '../types.js';\nimport { NPaymentError } from '../errors.js';\n\n// Aave V3 variable debt token ABI (credit delegation)\nconst DEBT_TOKEN_ABI = [\n  { name: 'approveDelegation', type: 'function', stateMutability: 'nonpayable', inputs: [{ name: 'delegatee', type: 'address' }, { name: 'amount', type: 'uint256' }], outputs: [] },\n  { name: 'borrowAllowance', type: 'function', stateMutability: 'view', inputs: [{ name: 'fromUser', type: 'address' }, { name: 'toUser', type: 'address' }], outputs: [{ type: 'uint256' }] },\n] as const;\n\nexport interface Delegation {\n  delegate: Address;\n  asset: string;\n  maxAmount: bigint;\n  used: bigint;\n}\n\n/**\n * Bridges n-payment's DelegationManager with Aave's on-chain credit delegation.\n * Parent agent supplies collateral → delegates borrowing power to sub-agents.\n */\nexport class DelegationBridge {\n  private delegations = new Map<string, Delegation>();\n\n  constructor(private config: AaveConfig) {}\n\n  /** Build approveDelegation tx on the debt token */\n  buildDelegateTx(debtToken: Address, delegatee: Address, amount: bigint) {\n    return { to: debtToken, abi: DEBT_TOKEN_ABI, functionName: 'approveDelegation' as const, args: [delegatee, amount] };\n  }\n\n  /** Build revoke tx (set allowance to 0) */\n  buildRevokeTx(debtToken: Address, delegatee: Address) {\n    return this.buildDelegateTx(debtToken, delegatee, 0n);\n  }\n\n  /** Track a delegation locally */\n  addDelegation(delegate: Address, asset: string, maxAmount: bigint): void {\n    const maxPerDelegate = this.config.delegation?.maxPerDelegate;\n    if (maxPerDelegate && maxAmount > maxPerDelegate) {\n      throw new NPaymentError(`Delegation exceeds maxPerDelegate: ${maxPerDelegate}`, 'DELEGATION_LIMIT');\n    }\n    this.delegations.set(`${delegate}-${asset}`, { delegate, asset, maxAmount, used: 0n });\n  }\n\n  /** Record usage by a delegate */\n  recordUsage(delegate: Address, asset: string, amount: bigint): void {\n    const key = `${delegate}-${asset}`;\n    const d = this.delegations.get(key);\n    if (!d) throw new NPaymentError('No delegation found', 'DELEGATION_NOT_FOUND');\n    if (d.used + amount > d.maxAmount) throw new NPaymentError('Delegation limit exceeded', 'DELEGATION_EXCEEDED');\n    d.used += amount;\n  }\n\n  getDelegations(): Delegation[] { return [...this.delegations.values()]; }\n  getDebtTokenAbi() { return DEBT_TOKEN_ABI; }\n  isEnabled(): boolean { return this.config.delegation?.enabled === true; }\n}\n","import type { AaveConfig } from '../types.js';\nimport { AaveClient } from './client.js';\nimport { YieldManager } from './yield.js';\nimport { GhoManager } from './gho.js';\nimport { VaultManager } from './vault.js';\nimport { FlashMintBatcher } from './flash.js';\nimport { DelegationBridge } from './delegation.js';\n\n/**\n * Top-level orchestrator for all Aave treasury operations.\n * Used by PaymentClient to manage yield, GHO, vaults, flash loans, and delegation.\n */\nexport class AaveTreasuryManager {\n  readonly client: AaveClient;\n  readonly yield: YieldManager;\n  readonly gho: GhoManager;\n  readonly vault: VaultManager | undefined;\n  readonly flash: FlashMintBatcher;\n  readonly delegation: DelegationBridge;\n\n  constructor(private config: AaveConfig, chainKey: string) {\n    this.client = new AaveClient(chainKey);\n    this.yield = new YieldManager(config, chainKey);\n    this.gho = new GhoManager(config, chainKey);\n    this.vault = config.vault?.enabled\n      ? new VaultManager({ enabled: true, feePercent: config.vault.feePercent ?? 15 })\n      : undefined;\n    this.flash = new FlashMintBatcher(this.gho);\n    this.delegation = new DelegationBridge(config);\n  }\n\n  /** Determine how to fund a payment: liquid balance, withdraw from Aave, or borrow GHO */\n  decideFundingStrategy(liquidBalance: bigint, paymentAmount: bigint, ghoAccepted: boolean): 'liquid' | 'withdraw' | 'borrow-gho' {\n    if (liquidBalance >= paymentAmount) return 'liquid';\n    if (this.config.preferGho && this.config.borrowEnabled && ghoAccepted && this.gho.isAvailable()) return 'borrow-gho';\n    if (this.yield.isEnabled()) return 'withdraw';\n    return 'liquid'; // will fail at payment time if insufficient\n  }\n\n  /** Check if auto-sweep should run after a payment */\n  shouldSweep(liquidBalance: bigint): boolean {\n    if (!this.yield.isEnabled()) return false;\n    return this.yield.calculateSweepAmount(liquidBalance) > 0n;\n  }\n\n  isEnabled(): boolean { return !!this.config && this.client.isSupported(); }\n}\n\n// ─── Barrel Export ───────────────────────────────────────────────────────────\n\nexport { AaveClient, GHO_ADDRESSES, AAVE_POOL_ADDRESSES, GHO_FLASH_MINTER } from './client.js';\nexport { YieldManager } from './yield.js';\nexport { GhoManager } from './gho.js';\nexport { VaultManager } from './vault.js';\nexport { FlashMintBatcher } from './flash.js';\nexport { DelegationBridge } from './delegation.js';\nexport type { YieldState } from './yield.js';\nexport type { VaultConfig, VaultState } from './vault.js';\nexport type { FlashPayment, FlashBatchResult } from './flash.js';\nexport type { Delegation } from './delegation.js';\n","import type { PaymentAdapter, PaymentContext } from '../types.js';\nimport { GHO_ADDRESSES } from '../aave/client.js';\n\nconst GHO_ADDR_SET = new Set(Object.values(GHO_ADDRESSES).map(a => a.toLowerCase()));\n\n/**\n * PaymentAdapter that detects and pays with GHO when servers accept it.\n * Delegates actual signing to the PaymentClient's wallet + GhoManager.\n */\nexport class AaveGhoAdapter implements PaymentAdapter {\n  readonly protocol = 'aave-gho';\n\n  detect(response: Response): boolean {\n    const header = response.headers.get('payment-required') || response.headers.get('x-payment');\n    if (!header) return false;\n    // Check if any accepted asset is GHO\n    const lower = header.toLowerCase();\n    for (const addr of GHO_ADDR_SET) {\n      if (lower.includes(addr)) return true;\n    }\n    return false;\n  }\n\n  async pay(url: string, init: RequestInit | undefined, response: Response, ctx?: PaymentContext): Promise<Response> {\n    // This adapter is wired by PaymentClient which handles:\n    // 1. GhoManager.buildPermitTypedData() → wallet.signTypedData()\n    // 2. Encode permit signature into x402 payment payload\n    // 3. Retry request with PAYMENT-SIGNATURE header\n    // The actual implementation is in PaymentClient.fetchWithPayment() Aave path.\n    throw new Error('AaveGhoAdapter.pay() should be called via PaymentClient Aave integration');\n  }\n}\n","/**\n * v0.22 — RLUSD multichain Wormhole NTT deployment registry.\n *\n * Source-of-truth: github.com/wormhole-foundation/connect-w blob 62f8216 — RLUSD.json\n * (commit 62f8216d726513240240bee3b20b8ffd1a436daa, June 4 2026).\n *\n * NTT 1.1.0, burn-and-mint mode, threshold=1, single Wormhole transceiver.\n * All 5 chains share the same NttManager and Transceiver address (Wormhole\n * CREATE2 deterministic addressing) — the SDK relies on this invariant.\n *\n * NOTE: Outbound limit is 0 on every chain — Ripple is gating supply during\n * the ramp. Inbound limits sit at 50M per partner chain. These are static\n * snapshots; v0.23 will add live on-chain reads via NttManager getters.\n */\n\nimport type { ChainKey } from '../types.js';\nimport type { CanBridgeResult, NttDeployment, WormholeChainName } from './types.js';\n\nexport type { CanBridgeResult, NttDeployment, WormholeChainName };\n\n// ─── Static deployment data ──────────────────────────────────────────────────\n\nconst FIFTY_M = 50_000_000n * 10n ** 18n;\nconst NTT_MANAGER = '0x2a71afb11F4633A2681EAa19A01C47990f67E938' as const;\nconst TRANSCEIVER = '0x7B17Afd3A51ca042cB70A8A334BC4f171fd74089' as const;\nconst RIPPLE_OWNER = '0x395886E76217Ae8Ac89340a51083667582D68722' as const;\nconst RLUSD_ETH = '0x8292Bb45bf1Ee4d140127049757C2E0fF06317eD' as const;\nconst RLUSD_L2 = '0x8d58C0C60B8D6b88Fa98B291a646dB34d0F98258' as const;\n\nexport const RLUSD_NTT_DEPLOYMENTS: Readonly<Record<WormholeChainName, NttDeployment>> = Object.freeze({\n  Ethereum: {\n    chainName: 'Ethereum',\n    chainId: 1,\n    manager: NTT_MANAGER,\n    token: RLUSD_ETH,\n    transceiver: TRANSCEIVER,\n    threshold: 1,\n    mode: 'burning',\n    inboundLimits: { Base: FIFTY_M, Optimism: FIFTY_M, Unichain: FIFTY_M, Ink: FIFTY_M },\n    outboundLimit: 0n,\n    paused: false,\n    owner: RIPPLE_OWNER,\n  },\n  Base: {\n    chainName: 'Base',\n    chainId: 8453,\n    manager: NTT_MANAGER,\n    token: RLUSD_L2,\n    transceiver: TRANSCEIVER,\n    threshold: 1,\n    mode: 'burning',\n    inboundLimits: { Optimism: FIFTY_M, Unichain: FIFTY_M, Ink: FIFTY_M },\n    outboundLimit: 0n,\n    paused: false,\n    owner: RIPPLE_OWNER,\n  },\n  Optimism: {\n    chainName: 'Optimism',\n    chainId: 10,\n    manager: NTT_MANAGER,\n    token: RLUSD_L2,\n    transceiver: TRANSCEIVER,\n    threshold: 1,\n    mode: 'burning',\n    inboundLimits: { Base: FIFTY_M, Unichain: FIFTY_M, Ink: FIFTY_M },\n    outboundLimit: 0n,\n    paused: false,\n    owner: RIPPLE_OWNER,\n  },\n  Ink: {\n    chainName: 'Ink',\n    chainId: 57073,\n    manager: NTT_MANAGER,\n    token: RLUSD_L2,\n    transceiver: TRANSCEIVER,\n    threshold: 1,\n    mode: 'burning',\n    inboundLimits: { Base: FIFTY_M, Optimism: FIFTY_M, Unichain: FIFTY_M },\n    outboundLimit: 0n,\n    paused: false,\n    owner: RIPPLE_OWNER,\n  },\n  Unichain: {\n    chainName: 'Unichain',\n    chainId: 130,\n    manager: NTT_MANAGER,\n    token: RLUSD_L2,\n    transceiver: TRANSCEIVER,\n    threshold: 1,\n    mode: 'burning',\n    inboundLimits: { Base: FIFTY_M, Optimism: FIFTY_M, Ink: FIFTY_M },\n    outboundLimit: 0n,\n    paused: false,\n    owner: RIPPLE_OWNER,\n  },\n});\n\n// ─── ChainKey ↔ WormholeChainName mapping ────────────────────────────────────\n\nexport const CHAIN_KEY_TO_WH: Readonly<Partial<Record<ChainKey, WormholeChainName>>> = Object.freeze({\n  'ethereum-mainnet': 'Ethereum',\n  'base-mainnet': 'Base',\n  'optimism-mainnet': 'Optimism',\n  'ink-mainnet': 'Ink',\n  'unichain-mainnet': 'Unichain',\n});\n\nconst WH_TO_CHAIN_KEY: Readonly<Record<WormholeChainName, ChainKey>> = Object.freeze({\n  Ethereum: 'ethereum-mainnet',\n  Base: 'base-mainnet',\n  Optimism: 'optimism-mainnet',\n  Ink: 'ink-mainnet',\n  Unichain: 'unichain-mainnet',\n});\n\n/** Resolve a ChainKey to its Wormhole chain name. Returns undefined for non-NTT chains. */\nexport function whChainFromKey(key: ChainKey): WormholeChainName | undefined {\n  return CHAIN_KEY_TO_WH[key];\n}\n\n/** Resolve a Wormhole chain name to its ChainKey. */\nexport function chainKeyFromWh(name: WormholeChainName): ChainKey {\n  return WH_TO_CHAIN_KEY[name];\n}\n\n// ─── Pure-function feasibility check ─────────────────────────────────────────\n\n/**\n * Pure-fn preflight: can we bridge `amount` RLUSD `from → to` right now?\n * Returns a structured reason on failure. Outbound limit gating is the\n * dominant constraint today (statically 0 across all 5 chains).\n *\n * Pass `liveLimits` to override the static snapshot — typically obtained\n * from on-chain `NttManager.getCurrentOutboundCapacity()` /\n * `NttManager.getCurrentInboundCapacity(peer)` reads.\n */\nexport function canBridgeRlusd(\n  from: WormholeChainName,\n  to: WormholeChainName,\n  amount: bigint,\n  liveLimits?: { outbound?: bigint; inbound?: bigint },\n): CanBridgeResult {\n  if (from === to) return { ok: false, reason: 'same-chain' };\n  if (amount <= 0n) return { ok: false, reason: 'invalid-amount' };\n\n  const src = RLUSD_NTT_DEPLOYMENTS[from];\n  const dst = RLUSD_NTT_DEPLOYMENTS[to];\n  if (!src || !dst) return { ok: false, reason: 'chain-not-supported' };\n  if (src.paused || dst.paused) return { ok: false, reason: 'paused' };\n\n  const outbound = liveLimits?.outbound ?? src.outboundLimit;\n  if (outbound < amount) {\n    return {\n      ok: false,\n      reason: `outbound-limit-exceeded (${outbound} < ${amount})`,\n      suggestedFunding: 'native',\n    };\n  }\n\n  const inboundCap = liveLimits?.inbound ?? dst.inboundLimits[from] ?? 0n;\n  if (inboundCap < amount) {\n    return { ok: false, reason: `inbound-limit-exceeded (${inboundCap} < ${amount})` };\n  }\n  return { ok: true };\n}\n","import { NPaymentError } from '../errors.js';\nimport { canBridgeRlusd, RLUSD_NTT_DEPLOYMENTS } from './deployments.js';\nimport type {\n  NttBridgeRequest,\n  NttBridgeResult,\n  NttTransferReceipt,\n  NttTransferRequest,\n  WormholeChainName,\n  WormholeNttBridge,\n  WormholeNttBridgeFactory,\n  WormholeNttClientConfig,\n} from './types.js';\n\n/**\n * v0.22 — Wormhole NTT client.\n *\n * SOLID — SRP: orchestrates preflight + bridge invocation + caching only.\n * The actual cross-chain transfer is delegated to a {@link WormholeNttBridgeFactory}\n * (default impl wraps `@wormhole-foundation/sdk-evm-ntt`; tests inject a stub).\n *\n * Soft-disable: when no signer for `req.from`, preflight returns ok=false —\n * the corridor (PRD-C) routes around it instead of throwing.\n */\nexport class WormholeNttClient {\n  private readonly factory: WormholeNttBridgeFactory;\n  private readonly bridges = new Map<string, Promise<WormholeNttBridge>>();\n\n  constructor(public readonly config: WormholeNttClientConfig) {\n    this.factory = config.bridgeFactory ?? createDefaultWormholeNttBridgeFactory(config);\n  }\n\n  /** Pure-fn-style preflight: combines static deployment limits + signer availability. */\n  preflight(req: NttTransferRequest): { ok: true } | { ok: false; reason: string } {\n    if (!this.config.signers[req.from]) {\n      return { ok: false, reason: `no-signer-for-${req.from}` };\n    }\n    const decision = canBridgeRlusd(req.from, req.to, req.amount);\n    if (!decision.ok) return { ok: false, reason: decision.reason };\n    return { ok: true };\n  }\n\n  async transfer(req: NttTransferRequest): Promise<NttTransferReceipt> {\n    const t0 = Date.now();\n    if (req.dryRun) {\n      const pf = this.preflight(req);\n      return {\n        whTxId: 'dry-run',\n        status: pf.ok ? 'submitted' : 'failed',\n        durationMs: Date.now() - t0,\n      };\n    }\n\n    const pf = this.preflight(req);\n    if (!pf.ok) {\n      throw new NPaymentError(\n        `Wormhole NTT preflight failed: ${pf.reason}`,\n        'WORMHOLE_NTT_PREFLIGHT_FAILED',\n        'Check chain pause state, outbound/inbound rate limits, and signer config.',\n      );\n    }\n\n    const bridge = await this.getBridge(req.from, req.to);\n    const result = await bridge.transferAndRedeem({ amount: req.amount, recipient: req.recipient });\n\n    return {\n      whTxId: result.srcTxHash,\n      vaa: result.vaa,\n      destTxHash: result.destTxHash,\n      status: result.destTxHash ? 'redeemed' : 'attested',\n      durationMs: result.durationMs,\n    };\n  }\n\n  private getBridge(from: WormholeChainName, to: WormholeChainName): Promise<WormholeNttBridge> {\n    const key = `${from}->${to}`;\n    let p = this.bridges.get(key);\n    if (!p) {\n      p = this.factory.create(from, to);\n      this.bridges.set(key, p);\n    }\n    return p;\n  }\n}\n\n// ─── Default bridge factory ──────────────────────────────────────────────────\n\n/**\n * Default factory — lazy-loads `@wormhole-foundation/sdk` +\n * `@wormhole-foundation/sdk-evm` + `@wormhole-foundation/sdk-evm-ntt`\n * (declared as optional peer deps in package.json).\n *\n * If the peer deps are missing, calling create() throws\n * `WORMHOLE_NTT_PEER_DEP_MISSING` with the install command.\n *\n * The exact SDK invocation is captured per `examples/rlusd-ntt-bridge-only.ts`\n * — the canonical reference for production wiring. Advanced users override\n * via `WormholeNttClientConfig.bridgeFactory`.\n */\nexport function createDefaultWormholeNttBridgeFactory(\n  config: WormholeNttClientConfig,\n): WormholeNttBridgeFactory {\n  return {\n    async create(srcChain, dstChain): Promise<WormholeNttBridge> {\n      const sdk = await loadWormholeSdk();\n      const signer = config.signers[srcChain];\n      if (!signer) {\n        throw new NPaymentError(\n          `No signer configured for ${srcChain}`,\n          'WORMHOLE_NTT_NO_SIGNER',\n          `Pass wormhole.signers.${srcChain} when constructing PaymentClient.`,\n        );\n      }\n\n      const network = config.network ?? 'Mainnet';\n      const wh = await sdk.wormhole(network, [sdk.evmPlatform]);\n      const srcCtx = wh.getChain(srcChain);\n\n      const srcDeployment = RLUSD_NTT_DEPLOYMENTS[srcChain];\n      const ntt = await srcCtx.getProtocol('Ntt', {\n        ntt: {\n          token: srcDeployment.token,\n          manager: srcDeployment.manager,\n          transceiver: { wormhole: srcDeployment.transceiver },\n        },\n      });\n\n      return {\n        async transferAndRedeem(req: NttBridgeRequest): Promise<NttBridgeResult> {\n          const t0 = Date.now();\n          const senderAddr = await signer.getAddress();\n          const xfer = ntt.transfer(\n            senderAddr,\n            req.amount,\n            { chain: dstChain, address: req.recipient },\n            { queue: false, automatic: true, gasDropoff: 0n },\n          );\n          const txids = await sdk.signSendWait(srcCtx, xfer, signer);\n          const srcTxHash = txids[txids.length - 1].txid as `0x${string}`;\n\n          // Auto-relayer often delivers inside the SDK. If it didn't, callers can\n          // poll Wormholescan separately. Receipt surface is a structured stub —\n          // the canonical `transferAndRedeem` is in examples/rlusd-ntt-bridge-only.ts\n          // where Wormholescan polling + manual redeem are wired explicitly.\n          return { srcTxHash, durationMs: Date.now() - t0 };\n        },\n      };\n    },\n  };\n}\n\n// ─── Lazy peer-dep loader ────────────────────────────────────────────────────\n\ninterface LoadedWormholeSdk {\n  wormhole: (network: string, platforms: unknown[]) => Promise<WormholeContext>;\n  signSendWait: (ctx: unknown, xfer: unknown, signer: unknown) => Promise<Array<{ txid: string }>>;\n  evmPlatform: unknown;\n}\n\ninterface WormholeContext {\n  getChain(name: string): WormholeChainContext;\n}\ninterface WormholeChainContext {\n  getProtocol(name: 'Ntt', cfg: unknown): Promise<NttProtocol>;\n}\ninterface NttProtocol {\n  transfer(\n    sender: `0x${string}`,\n    amount: bigint,\n    dst: { chain: string; address: `0x${string}` },\n    opts: { queue: boolean; automatic: boolean; gasDropoff: bigint },\n  ): unknown;\n}\n\nlet cached: Promise<LoadedWormholeSdk> | undefined;\nasync function loadWormholeSdk(): Promise<LoadedWormholeSdk> {\n  cached ??= (async () => {\n    try {\n      const core = await import('@wormhole-foundation/sdk' as string);\n      const evm = await import('@wormhole-foundation/sdk-evm' as string);\n      // Side-effect import: registers the Ntt protocol on the EVM platform.\n      await import('@wormhole-foundation/sdk-evm-ntt' as string);\n      return {\n        wormhole: core.wormhole as LoadedWormholeSdk['wormhole'],\n        signSendWait: core.signSendWait as LoadedWormholeSdk['signSendWait'],\n        evmPlatform: evm.default ?? evm,\n      };\n    } catch (err) {\n      throw new NPaymentError(\n        `Wormhole SDK peer-dep missing: ${(err as Error).message}`,\n        'WORMHOLE_NTT_PEER_DEP_MISSING',\n        'Run: pnpm add @wormhole-foundation/sdk @wormhole-foundation/sdk-evm @wormhole-foundation/sdk-evm-ntt',\n      );\n    }\n  })();\n  return cached;\n}\n","import { NPaymentError } from '../errors.js';\nimport type { ChainKey, PaymentAdapter, PaymentContext } from '../types.js';\nimport { RLUSD_NTT_DEPLOYMENTS, whChainFromKey } from '../wormhole/deployments.js';\nimport type { WormholeNttClient } from '../wormhole/ntt-client.js';\nimport type { NttTransferReceipt, WormholeNttAdapterOptions } from '../wormhole/types.js';\n\n/**\n * v0.22 — Wormhole NTT bridge-then-pay adapter.\n *\n * Used internally by PayRouter v3 (PRD-C) when an x402 challenge requires RLUSD\n * on chain X and the buyer holds RLUSD on chain Y. Bridges Y → X via Wormhole\n * NTT, then defers the actual 402 settlement to the chain-X adapter\n * (RlusdExactAdapter from PRD-D).\n *\n * NOT a top-level adapter for direct 402 detection — `detect` returns false and\n * `pay` throws WORMHOLE_NTT_USE_PAYROUTER. The corridor is the only call-site.\n *\n * SOLID — SRP: cap enforcement + ChainKey↔WormholeChainName mapping + delegation.\n * The Wormhole protocol details live in WormholeNttClient.\n */\nexport class WormholeNttAdapter implements PaymentAdapter {\n  readonly protocol = 'wormhole-ntt';\n  private spentToday = 0n;\n  private dayStart = Date.now();\n\n  constructor(\n    private readonly client: WormholeNttClient,\n    private readonly opts: WormholeNttAdapterOptions = {},\n  ) {}\n\n  detect(_response: Response): boolean {\n    return false;\n  }\n\n  async pay(\n    _url: string,\n    _init: RequestInit | undefined,\n    _response: Response,\n    _ctx?: PaymentContext,\n  ): Promise<Response> {\n    throw new NPaymentError(\n      'WormholeNttAdapter is not a top-level adapter; the PayRouter v3 corridor invokes bridgeRlusd() directly.',\n      'WORMHOLE_NTT_USE_PAYROUTER',\n      'Configure chains: [...evm, \"xrpl-mainnet\"] and let fetchWithPayment route automatically.',\n    );\n  }\n\n  /**\n   * The actual public entry-point. Bridges RLUSD from `fromChain` to `toChain`\n   * for the given `recipient`. Throws on cap violations or unsupported chain.\n   */\n  async bridgeRlusd(req: {\n    fromChain: ChainKey;\n    toChain: ChainKey;\n    amount: bigint;\n    recipient: `0x${string}`;\n  }): Promise<NttTransferReceipt> {\n    const from = whChainFromKey(req.fromChain);\n    const to = whChainFromKey(req.toChain);\n    if (!from || !to) {\n      throw new NPaymentError(\n        `Unsupported NTT chain: ${req.fromChain} → ${req.toChain}`,\n        'WORMHOLE_NTT_CHAIN_UNSUPPORTED',\n        `Supported: ${Object.keys(RLUSD_NTT_DEPLOYMENTS).join(', ')}`,\n      );\n    }\n    this.assertCaps(req.amount);\n\n    const receipt = await this.client.transfer({\n      from,\n      to,\n      amount: req.amount,\n      recipient: req.recipient,\n    });\n    this.spentToday += req.amount;\n    return receipt;\n  }\n\n  private assertCaps(amount: bigint): void {\n    const { maxPerTransfer, maxPerDay } = this.opts;\n    if (maxPerTransfer !== undefined && amount > maxPerTransfer) {\n      throw new NPaymentError(\n        `Wormhole NTT max-per-transfer exceeded: ${amount} > ${maxPerTransfer}`,\n        'WORMHOLE_NTT_MAX_PER_TRANSFER',\n        'Lower the bridge amount or raise wormhole.maxPerTransfer in NPaymentConfig.',\n      );\n    }\n    // Sliding 24h window — reset on day boundary.\n    if (Date.now() - this.dayStart > 86_400_000) {\n      this.dayStart = Date.now();\n      this.spentToday = 0n;\n    }\n    if (maxPerDay !== undefined && this.spentToday + amount > maxPerDay) {\n      throw new NPaymentError(\n        `Wormhole NTT daily cap exceeded`,\n        'WORMHOLE_NTT_DAILY_CAP',\n        'Wait for the rolling 24h window to reset, or raise wormhole.maxPerDay.',\n      );\n    }\n  }\n}\n","import { NPaymentError } from '../errors.js';\nimport type { InitiaChainKey } from './types.js';\n\n/**\n * v0.23 — Initia asset registry (iUSD, INIT, AUSD, USDC).\n *\n * Mirrors v0.21 STELLAR_ASSETS pattern — placeholder-tolerant via env override\n * (no module crash at import time when a denom is unpublished).\n *\n * SOLID:\n *   SRP — owns Initia asset metadata only.\n *   OCP — append new symbols; never edit existing.\n *   DIP — callers go through getInitiaAsset(); never read this map directly.\n */\n\nexport type InitiaAssetSymbol = 'iUSD' | 'INIT' | 'AUSD' | 'USDC';\n\nexport interface InitiaAsset {\n  symbol: InitiaAssetSymbol;\n  /** Cosmos-SDK denom (e.g. 'uinit', 'ibc/...', 'l2/...'). */\n  denom: string;\n  decimals: number;\n  /** Whether the denom is published-final. */\n  verified: boolean;\n  /** Env-var key for runtime denom rebinding. */\n  envOverride?: string;\n}\n\nconst PLACEHOLDER = 'placeholder/INITIA_DENOM_PENDING';\n\nexport const INITIA_ASSETS: Record<InitiaChainKey, Record<InitiaAssetSymbol, InitiaAsset>> = {\n  'initia-mainnet': {\n    iUSD: { symbol: 'iUSD', denom: PLACEHOLDER, decimals: 6, verified: false, envOverride: 'INITIA_IUSD_DENOM_MAINNET' },\n    INIT: { symbol: 'INIT', denom: 'uinit',     decimals: 6, verified: true },\n    AUSD: { symbol: 'AUSD', denom: PLACEHOLDER, decimals: 6, verified: false, envOverride: 'INITIA_AUSD_DENOM_MAINNET' },\n    USDC: { symbol: 'USDC', denom: PLACEHOLDER, decimals: 6, verified: false, envOverride: 'INITIA_USDC_DENOM_MAINNET' },\n  },\n  'initia-testnet': {\n    iUSD: { symbol: 'iUSD', denom: PLACEHOLDER, decimals: 6, verified: false, envOverride: 'INITIA_IUSD_DENOM_TESTNET' },\n    INIT: { symbol: 'INIT', denom: 'uinit',     decimals: 6, verified: true },\n    AUSD: { symbol: 'AUSD', denom: PLACEHOLDER, decimals: 6, verified: false, envOverride: 'INITIA_AUSD_DENOM_TESTNET' },\n    USDC: { symbol: 'USDC', denom: PLACEHOLDER, decimals: 6, verified: false, envOverride: 'INITIA_USDC_DENOM_TESTNET' },\n  },\n};\n\n/** Case-insensitive symbol normalizer. iUSD is the only mixed-case symbol. */\nconst SYMBOL_NORMALIZER: Record<string, InitiaAssetSymbol> = {\n  iusd: 'iUSD',\n  init: 'INIT',\n  ausd: 'AUSD',\n  usdc: 'USDC',\n};\n\n/**\n * Resolve a denom by chain + symbol. Env override re-read at call time so test\n * isolation and runtime rebinding both work without module-cache pinning.\n */\nexport function getInitiaAsset(chain: InitiaChainKey, symbol: string): InitiaAsset {\n  const norm = SYMBOL_NORMALIZER[symbol.toLowerCase()];\n  if (!norm) {\n    throw new NPaymentError(\n      `Unknown Initia asset on ${chain}: ${symbol}`,\n      'INITIA_ASSET_UNKNOWN',\n      `Known: ${Object.keys(SYMBOL_NORMALIZER).join(', ')}`,\n    );\n  }\n  const asset = INITIA_ASSETS[chain][norm];\n  if (asset.envOverride) {\n    const override = process.env[asset.envOverride];\n    if (override && override.length > 0) {\n      return { ...asset, denom: override, verified: true };\n    }\n  }\n  return asset;\n}\n\nconst _warned = new Set<string>();\n\n/** Warn once per (chain,symbol) tuple when a placeholder denom is used. */\nexport function assertVerifiedDenom(asset: InitiaAsset): void {\n  if (asset.verified) return;\n  const k = `${asset.symbol}:${asset.denom}`;\n  if (_warned.has(k)) return;\n  _warned.add(k);\n  // eslint-disable-next-line no-console\n  console.warn(\n    `[n-payment] INITIA_DENOM_PLACEHOLDER: ${asset.symbol} denom is a placeholder. ` +\n      `Set ${asset.envOverride} env var with the verified denom to enable production use.`,\n  );\n}\n\n/** Decimal string → 6-dec base-unit bigint. */\nexport function parseInitiaAmount(amount: string | number, decimals = 6): bigint {\n  const str = String(amount);\n  if (!/^\\d+(\\.\\d+)?$/.test(str)) {\n    throw new NPaymentError(\n      `Invalid Initia amount: ${str}`,\n      'INITIA_AMOUNT_INVALID',\n      `Expected decimal string (e.g. '1.5').`,\n    );\n  }\n  const [whole, frac = ''] = str.split('.');\n  const padded = (frac + '0'.repeat(decimals)).slice(0, decimals);\n  return BigInt(whole) * 10n ** BigInt(decimals) + BigInt(padded || '0');\n}\n\n/** Base-unit bigint → decimal string (trailing zeros trimmed). */\nexport function formatInitiaAmount(amount: bigint, decimals = 6): string {\n  const divisor = 10n ** BigInt(decimals);\n  const whole = amount / divisor;\n  const frac = amount % divisor;\n  if (frac === 0n) return whole.toString();\n  const fracStr = frac.toString().padStart(decimals, '0').replace(/0+$/, '');\n  return `${whole}.${fracStr}`;\n}\n","import { CHAINS } from '../chains.js';\nimport { NPaymentError } from '../errors.js';\nimport { assertVerifiedDenom, getInitiaAsset } from './assets.js';\nimport type { InitiaChainKey } from './types.js';\n\n/**\n * v0.23 — Cosmos-SDK signer + bank-module helpers for Initia (`interwoven-1`,\n * `initiation-2`).\n *\n * SOLID:\n *   SRP — signing + querying on Initia. Bridges, asset registry, and 402 adapter\n *         each live in their own module.\n *   DIP — depends on the abstract {@link InitiaSigner} (matches `OfflineDirectSigner`\n *         from `@cosmjs/proto-signing`); never references the cosmjs concrete types\n *         in its public API.\n *   OCP — extend by composition: pass a custom signer (hardware wallet, OWS, KMS).\n *\n * Soft-loads `@cosmjs/stargate` + `@cosmjs/proto-signing` peer deps; throws\n * `INITIA_PEER_DEP_MISSING` only on first method call (never at import time).\n */\n\n/** Cosmos `OfflineDirectSigner`-shaped abstraction (structural type, not a class). */\nexport interface InitiaSigner {\n  getAccounts(): Promise<ReadonlyArray<{ address: string; pubkey: Uint8Array; algo: string }>>;\n  /**\n   * Signs a `SignDoc`. We accept `unknown` to avoid leaking cosmjs internal types\n   * — the runtime delegates the call to `SigningStargateClient` which validates.\n   */\n  signDirect(signerAddress: string, signDoc: unknown): Promise<unknown>;\n}\n\nexport interface InitiaClientConfig {\n  chainKey: InitiaChainKey;\n  /**\n   * Cosmos `OfflineDirectSigner`. May be eager (already-resolved signer) or a\n   * lazy thunk — useful when constructing from a mnemonic (which requires\n   * `await`) inside a sync code path like `new PaymentClient()`.\n   */\n  signer?: InitiaSigner | (() => Promise<InitiaSigner>) | Promise<InitiaSigner>;\n  /** Override RPC URL. Default: from CHAINS registry. */\n  rpcUrl?: string;\n  /** Default gas price (uinit per gas). @default '0.015uinit' */\n  gasPrice?: string;\n  /** Throw on missing peer-dep / signer. @default false */\n  strict?: boolean;\n}\n\nexport interface BroadcastResult {\n  txHash: string;\n  height: number;\n  /** 0 = success; non-zero = failure (rawLog carries the reason). */\n  code: number;\n  rawLog: string;\n  gasUsed: number;\n  gasWanted: number;\n}\n\n/**\n * Build a Cosmos `OfflineDirectSigner` from a BIP-39 mnemonic. Convenience-only —\n * production agents should construct an `OfflineDirectSigner` externally\n * (hardware wallet, OWS, KMS, ...) and pass it via {@link InitiaClientConfig.signer}.\n */\nexport async function mnemonicSigner(\n  mnemonic: string,\n  bech32Prefix = 'init',\n): Promise<InitiaSigner> {\n  let mod: { DirectSecp256k1HdWallet?: { fromMnemonic: Function } } | undefined;\n  try {\n    mod = (await import('@cosmjs/proto-signing' as string)) as {\n      DirectSecp256k1HdWallet: { fromMnemonic: Function };\n    };\n  } catch {\n    throw new NPaymentError(\n      'Cosmos peer-dep missing: @cosmjs/proto-signing',\n      'INITIA_PEER_DEP_MISSING',\n      'pnpm add @cosmjs/proto-signing @cosmjs/stargate to enable Initia integration.',\n    );\n  }\n  const wallet = await mod!.DirectSecp256k1HdWallet!.fromMnemonic(mnemonic, { prefix: bech32Prefix });\n  return wallet as unknown as InitiaSigner;\n}\n\ninterface StargateModule {\n  StargateClient: { connect: (rpc: string) => Promise<StargateQuery> };\n  SigningStargateClient: {\n    connectWithSigner: (rpc: string, signer: unknown, opts: unknown) => Promise<SigningClient>;\n  };\n  GasPrice: { fromString: (s: string) => unknown };\n}\ninterface StargateQuery {\n  getBalance(addr: string, denom: string): Promise<{ amount: string; denom: string }>;\n  disconnect(): void;\n}\ninterface SigningClient {\n  sendTokens(\n    sender: string,\n    recipient: string,\n    amount: ReadonlyArray<{ denom: string; amount: string }>,\n    fee: 'auto' | unknown,\n    memo: string,\n  ): Promise<{\n    transactionHash: string;\n    height: number;\n    code?: number;\n    rawLog?: string;\n    gasUsed?: number | bigint;\n    gasWanted?: number | bigint;\n  }>;\n  disconnect?(): void;\n}\n\nexport class InitiaClient {\n  private cached?: { signing: SigningClient; address: string };\n  private stargateMod?: StargateModule;\n\n  constructor(public readonly config: InitiaClientConfig) {}\n\n  /** Resolved bech32 address of the configured signer. */\n  async getAddress(): Promise<string> {\n    return (await this.connect()).address;\n  }\n\n  /** Read any denom balance for any Initia address (no signer required). */\n  async getBalance(address: string, denom: string): Promise<bigint> {\n    const sg = await this.loadStargate();\n    const q = await sg.StargateClient.connect(this.rpcUrl());\n    try {\n      const coin = await q.getBalance(address, denom);\n      return BigInt(coin.amount ?? '0');\n    } finally {\n      q.disconnect();\n    }\n  }\n\n  /** Convenience: read iUSD balance for the configured signer's address. */\n  async getIusdBalance(): Promise<bigint> {\n    const asset = getInitiaAsset(this.config.chainKey, 'iUSD');\n    assertVerifiedDenom(asset);\n    return this.getBalance(await this.getAddress(), asset.denom);\n  }\n\n  /**\n   * Send a single-denom amount via `bank.MsgSend`. Auto fee (estimate × gasPrice).\n   * Returns the broadcast tx hash on success; throws `INITIA_BROADCAST_FAILED`\n   * on non-zero result code.\n   */\n  async send(req: {\n    toAddress: string;\n    denom: string;\n    amount: bigint;\n    memo?: string;\n  }): Promise<BroadcastResult> {\n    const { signing, address } = await this.connect();\n    const coins = [{ denom: req.denom, amount: req.amount.toString() }];\n    const result = await signing.sendTokens(address, req.toAddress, coins, 'auto', req.memo ?? '');\n    const out: BroadcastResult = {\n      txHash: result.transactionHash,\n      height: result.height,\n      code: result.code ?? 0,\n      rawLog: result.rawLog ?? '',\n      gasUsed: Number(result.gasUsed ?? 0),\n      gasWanted: Number(result.gasWanted ?? 0),\n    };\n    if (out.code !== 0) {\n      throw new NPaymentError(\n        `Initia broadcast failed (code=${out.code}): ${out.rawLog}`,\n        'INITIA_BROADCAST_FAILED',\n        'Inspect rawLog; common causes: insufficient funds for fee, account not yet on chain, denom typo.',\n      );\n    }\n    return out;\n  }\n\n  /**\n   * Send iUSD via the registry-resolved denom. Convenience wrapper over `send`\n   * — used by InitiaIusdAdapter.\n   */\n  async sendIusd(toAddress: string, amount: bigint, memo?: string): Promise<BroadcastResult> {\n    const asset = getInitiaAsset(this.config.chainKey, 'iUSD');\n    assertVerifiedDenom(asset);\n    return this.send({ toAddress, denom: asset.denom, amount, memo });\n  }\n\n  // ── internals ──────────────────────────────────────────────────────────────\n\n  private rpcUrl(): string {\n    return this.config.rpcUrl ?? CHAINS[this.config.chainKey].rpcUrl;\n  }\n\n  private async loadStargate(): Promise<StargateModule> {\n    if (this.stargateMod) return this.stargateMod;\n    try {\n      this.stargateMod = (await import('@cosmjs/stargate' as string)) as StargateModule;\n      return this.stargateMod;\n    } catch {\n      const err = new NPaymentError(\n        'Cosmos peer-dep missing: @cosmjs/stargate',\n        'INITIA_PEER_DEP_MISSING',\n        'pnpm add @cosmjs/stargate @cosmjs/proto-signing to enable Initia integration.',\n      );\n      if (this.config.strict) throw err;\n      // eslint-disable-next-line no-console\n      console.warn(`[n-payment] ${err.message}: ${err.hint}`);\n      throw err;\n    }\n  }\n\n  private async connect(): Promise<{ signing: SigningClient; address: string }> {\n    if (this.cached) return this.cached;\n    if (!this.config.signer) {\n      throw new NPaymentError(\n        'InitiaClient: no signer configured',\n        'INITIA_SIGNER_MISSING',\n        'Pass a signer to new InitiaClient({ signer }) — e.g. await mnemonicSigner(env.MNEMONIC).',\n      );\n    }\n    const signer = await this.resolveSigner();\n    const sg = await this.loadStargate();\n    const signing = await sg.SigningStargateClient.connectWithSigner(\n      this.rpcUrl(),\n      signer,\n      { gasPrice: sg.GasPrice.fromString(this.config.gasPrice ?? '0.015uinit') },\n    );\n    const accounts = await signer.getAccounts();\n    const address = accounts[0]?.address;\n    if (!address) {\n      throw new NPaymentError('InitiaClient: signer returned no accounts', 'INITIA_SIGNER_EMPTY');\n    }\n    this.cached = { signing, address };\n    return this.cached;\n  }\n\n  private async resolveSigner(): Promise<InitiaSigner> {\n    const s = this.config.signer!;\n    if (typeof s === 'function') return s();\n    return s as InitiaSigner | Promise<InitiaSigner>;\n  }\n}\n","import { ChallengeParseError, NPaymentError } from '../errors.js';\nimport type { InitiaClient } from '../initia/client.js';\nimport type { InitiaChainKey } from '../initia/types.js';\nimport type { PaymentAdapter, PaymentContext } from '../types.js';\n\n/**\n * Bridge orchestrator hook — invoked by the adapter when the configured Initia\n * wallet is short of iUSD. Wired by PaymentClient (Task 6) to compose the Skip\n * API / LayerZero / Wormhole-NTT-fallback corridor; left undefined in standalone\n * tests so the adapter throws an explicit `INITIA_IUSD_INSUFFICIENT` instead of\n * silently failing.\n */\nexport type IusdBridgeIfNeeded = (req: {\n  requiredAmount: bigint;\n  recipient: string;\n}) => Promise<bigint>;\n\nexport interface InitiaIusdAdapterOptions {\n  bridgeIfNeeded?: IusdBridgeIfNeeded;\n}\n\ninterface CosmosMsgSendChallenge {\n  scheme: 'cosmos-msgsend';\n  network: string;            // cosmos chain-id ('interwoven-1' / 'initiation-2')\n  asset: string;              // 'iUSD' (or denom string)\n  payTo: string;              // bech32 init1...\n  maxAmountRequired: string;  // base-unit decimal string (6 decimals)\n  memo?: string;\n}\n\n/**\n * v0.23 — `cosmos-msgsend` 402 adapter for iUSD on Initia.\n *\n * Flow:  parse challenge → ensure liquidity (optional bridge hook) →\n *        MsgSend iUSD → encode tx-hash proof in `x-payment` → retry HTTP.\n *\n * SOLID:\n *   SRP — owns the 402 challenge round-trip for cosmos-msgsend, nothing else.\n *   DIP — depends on `InitiaClient` abstraction + injected bridge hook.\n *   OCP — bridge orchestration is a function-typed strategy, swappable per-instance.\n */\nexport class InitiaIusdAdapter implements PaymentAdapter {\n  readonly protocol = 'cosmos-msgsend';\n  private bridgeHook?: IusdBridgeIfNeeded;\n\n  constructor(\n    private readonly initia: InitiaClient,\n    private readonly chainKey: InitiaChainKey,\n    options: InitiaIusdAdapterOptions = {},\n  ) {\n    this.bridgeHook = options.bridgeIfNeeded;\n  }\n\n  /**\n   * Late-bind the bridge orchestrator. Called by PaymentClient consumers after\n   * construction (the orchestrator depends on async-resolvable config and on\n   * the adapter being already-registered, hence the setter pattern).\n   */\n  setBridgeIfNeeded(hook: IusdBridgeIfNeeded | undefined): void {\n    this.bridgeHook = hook;\n  }\n\n  detect(response: Response): boolean {\n    const header =\n      response.headers.get('payment-required') ?? response.headers.get('x-payment-required') ?? '';\n    if (!header) return false;\n    try {\n      const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n      return decoded?.accepts?.[0]?.scheme === 'cosmos-msgsend';\n    } catch {\n      return false;\n    }\n  }\n\n  async pay(\n    url: string,\n    init: RequestInit | undefined,\n    response: Response,\n    _ctx?: PaymentContext,\n  ): Promise<Response> {\n    const challenge = this.parseChallenge(response);\n    const amount = BigInt(challenge.maxAmountRequired);\n    const recipient = await this.initia.getAddress();\n\n    // 1. Ensure liquidity on the destination Initia chain.\n    const balance = await this.initia.getIusdBalance();\n    if (balance < amount) {\n      if (!this.bridgeHook) {\n        throw new NPaymentError(\n          `Insufficient iUSD on ${this.chainKey}: have=${balance}, need=${amount}`,\n          'INITIA_IUSD_INSUFFICIENT',\n          'Fund the wallet with iUSD on Initia, or wire a bridge corridor via PaymentClient.',\n        );\n      }\n      const post = await this.bridgeHook({ requiredAmount: amount, recipient });\n      if (post < amount) {\n        throw new NPaymentError(\n          `Bridge completed but iUSD still short: have=${post}, need=${amount}`,\n          'INITIA_IUSD_BRIDGE_INSUFFICIENT',\n        );\n      }\n    }\n\n    // 2. Broadcast bank.MsgSend.\n    const result = await this.initia.sendIusd(challenge.payTo, amount, challenge.memo);\n\n    // 3. Encode payment proof and retry the original request.\n    const proof = Buffer.from(\n      JSON.stringify({\n        scheme: 'cosmos-msgsend',\n        network: challenge.network,\n        txHash: result.txHash,\n        from: recipient,\n        to: challenge.payTo,\n        value: challenge.maxAmountRequired,\n        asset: challenge.asset,\n        memo: challenge.memo,\n      }),\n    ).toString('base64');\n\n    const headers = new Headers(init?.headers);\n    headers.set('x-payment', proof);\n    return fetch(url, { ...init, headers });\n  }\n\n  private parseChallenge(response: Response): CosmosMsgSendChallenge {\n    const header =\n      response.headers.get('payment-required') ?? response.headers.get('x-payment-required') ?? '';\n    if (!header) {\n      throw new ChallengeParseError('Missing payment-required header', 'MISSING_HEADER');\n    }\n    let decoded: { accepts?: CosmosMsgSendChallenge[] };\n    try {\n      decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n    } catch {\n      throw new ChallengeParseError(\n        'Malformed payment-required header (not base64 JSON)',\n        'INVALID_HEADER',\n      );\n    }\n    const accept = decoded.accepts?.[0];\n    if (!accept || accept.scheme !== 'cosmos-msgsend') {\n      throw new ChallengeParseError('Challenge is not cosmos-msgsend', 'INVALID_SCHEME');\n    }\n    if (!accept.payTo || !accept.maxAmountRequired) {\n      throw new ChallengeParseError(\n        'Missing payTo or maxAmountRequired in cosmos-msgsend challenge',\n        'INVALID_CHALLENGE',\n      );\n    }\n    return accept;\n  }\n}\n","/**\n * v0.25 — Celo CIP-64 fee abstraction transactor.\n *\n * The single new transactor primitive in v0.25. Wraps viem's `writeContract`\n * + `sendTransaction` with a `feeCurrency` field so gas is paid in USDC /\n * USDT / USDm instead of CELO. The agent never holds CELO. The `feeCurrency`\n * value is the on-chain fee-currency *adapter* address registered in Celo's\n * FeeCurrencyDirectory — NOT the raw ERC-20 address (except for legacy\n * Mento stables like USDm/cUSD which are themselves CIP-66-compliant).\n *\n * SOLID — Single Responsibility:\n *   1. Resolve the correct adapter address for the chosen pay-asset.\n *   2. Inject `feeCurrency` into any viem write call.\n *   3. Settle EIP-3009 `transferWithAuthorization` (the merchant-side x402 path).\n *\n * Gas-rate estimation is intentionally NOT here — viem's Celo formatters\n * already populate `maxFeePerGas` against the chosen `feeCurrency` adapter\n * via the `eth_gasPrice` RPC endpoint. Adding our own oracle would duplicate\n * viem's behavior. Callers that want a USD-denominated quote pre-tx should\n * call `publicClient.estimateGas({ ..., feeCurrency })` directly.\n */\nimport {\n  createPublicClient,\n  createWalletClient,\n  http,\n  parseSignature,\n  type Address,\n  type Hex,\n} from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { celo, celoSepolia } from 'viem/chains';\nimport { CHAINS } from '../chains.js';\nimport { NPaymentError } from '../errors.js';\n\nexport type CeloChainKey = 'celo-mainnet' | 'celo-sepolia';\nexport type CeloPayAsset = 'USDC' | 'USDT' | 'USDm';\n\n/** Minimal EIP-3009 ABI fragment for transferWithAuthorization settlement. */\nexport const TRANSFER_WITH_AUTHORIZATION_ABI = [\n  {\n    name: 'transferWithAuthorization',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'from',        type: 'address' },\n      { name: 'to',          type: 'address' },\n      { name: 'value',       type: 'uint256' },\n      { name: 'validAfter',  type: 'uint256' },\n      { name: 'validBefore', type: 'uint256' },\n      { name: 'nonce',       type: 'bytes32' },\n      { name: 'v',           type: 'uint8'   },\n      { name: 'r',           type: 'bytes32' },\n      { name: 's',           type: 'bytes32' },\n    ],\n    outputs: [],\n  },\n] as const;\n\nexport interface CeloFeeAbstractedTransactorOptions {\n  /** Override the resolved fee-currency adapter address. */\n  adapterOverride?: Address;\n  /** Soft-disable CIP-64; transactor falls back to standard EIP-1559 (CELO gas). */\n  disabled?: boolean;\n  /** Override RPC URL (defaults to chains.ts entry). */\n  rpcUrl?: string;\n}\n\n/**\n * Wraps a viem WalletClient on Celo (mainnet or sepolia) so every on-chain\n * write call automatically carries a `feeCurrency` field — paying gas in\n * the agent's payment asset (USDC / USDT / USDm).\n */\nexport class CeloFeeAbstractedTransactor {\n  private readonly publicClient: { waitForTransactionReceipt: (args: { hash: Hex }) => Promise<{ blockNumber: bigint }> };\n  private readonly walletClient: { writeContract: (args: Record<string, unknown>) => Promise<Hex> };\n  private readonly account: ReturnType<typeof privateKeyToAccount>;\n  private readonly chainKey: CeloChainKey;\n  private readonly payAsset: CeloPayAsset;\n  private readonly adapterOverride?: Address;\n  private readonly disabled: boolean;\n\n  constructor(\n    privateKey: Hex,\n    chainKey: CeloChainKey,\n    payAsset: CeloPayAsset = 'USDC',\n    opts: CeloFeeAbstractedTransactorOptions = {},\n  ) {\n    this.chainKey = chainKey;\n    this.payAsset = payAsset;\n    this.adapterOverride = opts.adapterOverride;\n    this.disabled = opts.disabled ?? false;\n\n    const chain = chainKey === 'celo-mainnet' ? celo : celoSepolia;\n    const rpcUrl = opts.rpcUrl ?? CHAINS[chainKey].rpcUrl;\n    this.account = privateKeyToAccount(privateKey);\n    // Cast away the celo-specific formatter type-mismatch with the generic\n    // PublicClient/WalletClient — celo chains carry custom block formatters\n    // that conflict with TS's structural inference. Runtime behavior is\n    // identical; only the type surface changes.\n    this.publicClient = createPublicClient({ chain, transport: http(rpcUrl) }) as never;\n    this.walletClient = createWalletClient({ account: this.account, chain, transport: http(rpcUrl) }) as never;\n  }\n\n  /**\n   * Resolve the CIP-64 fee-currency address for the chosen pay-asset.\n   * Returns `undefined` when fee abstraction is disabled — caller should\n   * omit `feeCurrency` and let viem fall back to native CELO gas.\n   */\n  getFeeCurrency(): Address | undefined {\n    if (this.disabled) return undefined;\n    if (this.adapterOverride) return this.adapterOverride;\n    const tokens = CHAINS[this.chainKey].tokens;\n    if (this.payAsset === 'USDC') {\n      const a = tokens.USDC_FEE_ADAPTER as Address | undefined;\n      if (!a) throw rejected(`No USDC_FEE_ADAPTER registered on ${this.chainKey}`);\n      return a;\n    }\n    if (this.payAsset === 'USDT') {\n      const a = tokens.USDT_FEE_ADAPTER as Address | undefined;\n      if (!a) throw rejected(`No USDT_FEE_ADAPTER registered on ${this.chainKey} — only mainnet supported in v0.25`);\n      return a;\n    }\n    if (this.payAsset === 'USDm') {\n      // USDm (legacy cUSD) is itself a CIP-66 fee currency — use the token\n      // address directly, no separate adapter exists.\n      const a = tokens.USDm as Address | undefined;\n      if (!a) throw rejected(`No USDm registered on ${this.chainKey}`);\n      return a;\n    }\n    throw new NPaymentError(\n      `Unsupported payAsset for Celo fee abstraction: ${String(this.payAsset)}`,\n      'INVALID_PAY_ASSET',\n      'Use one of: USDC, USDT, USDm.',\n    );\n  }\n\n  /** Public client for view calls (balance reads, gas estimates). */\n  getPublicClient(): unknown {\n    return this.publicClient;\n  }\n\n  /** Underlying account (signer address). */\n  getAddress(): Address {\n    return this.account.address;\n  }\n\n  /**\n   * Generic CIP-64-wrapped writeContract. Caller passes standard viem\n   * write params; we inject `feeCurrency` and broadcast. Returns the\n   * tx hash + receipt block number.\n   */\n  async writeContract(params: {\n    address: Address;\n    abi: readonly unknown[];\n    functionName: string;\n    args: readonly unknown[];\n  }): Promise<{ txHash: Hex; blockNumber: bigint }> {\n    const feeCurrency = this.getFeeCurrency();\n    const txHash = await this.walletClient.writeContract({\n      ...params,\n      ...(feeCurrency ? { feeCurrency } : {}),\n    });\n    const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n    return { txHash, blockNumber: receipt.blockNumber };\n  }\n\n  /**\n   * Settle an EIP-3009 transferWithAuthorization on a Celo USDC/USDT/USDm\n   * contract — the merchant-side x402 settlement path. The facilitator\n   * wallet (this transactor's signer) pays gas in the same pay-asset.\n   */\n  async transferWithAuthorization(params: {\n    token: Address;\n    from: Address;\n    to: Address;\n    value: bigint;\n    validAfter: bigint;\n    validBefore: bigint;\n    nonce: Hex;\n    signature: Hex;\n  }): Promise<{ txHash: Hex; blockNumber: bigint }> {\n    const sig = parseSignature(params.signature);\n    return this.writeContract({\n      address: params.token,\n      abi: TRANSFER_WITH_AUTHORIZATION_ABI,\n      functionName: 'transferWithAuthorization',\n      args: [\n        params.from,\n        params.to,\n        params.value,\n        params.validAfter,\n        params.validBefore,\n        params.nonce,\n        Number(sig.v ?? 27),\n        sig.r,\n        sig.s,\n      ],\n    });\n  }\n}\n\nfunction rejected(msg: string): NPaymentError {\n  return new NPaymentError(\n    msg,\n    'CELO_FEE_ABSTRACTION_REJECTED',\n    'Configure CHAINS[...].tokens.{USDC,USDT}_FEE_ADAPTER or pass celo.feeCurrencyAdapterOverride.',\n  );\n}\n","/**\n * v0.25 — Celo CIP-64 fee-abstracted x402 adapter.\n *\n * Buyer side  : delegates to the canonical `X402Adapter` (off-chain EIP-3009\n *               signing — no transaction broadcast, no gas needed). The\n *               buyer's wallet only needs USDC/USDT/USDm (no CELO).\n * Merchant side: `verifyAndSettle` broadcasts `transferWithAuthorization` on\n *               the Celo USDC contract, wrapped in `CeloFeeAbstractedTransactor`\n *               so the FACILITATOR wallet also pays gas in USDC (zero CELO).\n *\n * SOLID — Single Responsibility: this adapter is the integration seam between\n * the existing x402 wire format and Celo's CIP-64 primitive. All raw EIP-3009\n * signing logic stays in `X402Adapter`; all CIP-64 logic stays in the\n * transactor. This file just wires them together.\n */\nimport type { Address, Hex } from 'viem';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport type { ChainKey, PaymentAdapter, PaymentContext, CeloConfig } from '../types.js';\nimport { X402Adapter } from './x402.js';\nimport { CeloFeeAbstractedTransactor, type CeloChainKey } from '../celo/fee-abstraction.js';\nimport { ChallengeParseError, NPaymentError } from '../errors.js';\nimport { CHAINS } from '../chains.js';\n\n/** EIP-3009 authorization payload as carried in an x402 v2 envelope. */\nexport interface CeloEip3009Authorization {\n  from: Address;\n  to: Address;\n  value: bigint;\n  validAfter: bigint;\n  validBefore: bigint;\n  nonce: Hex;\n}\n\n/** Result of a merchant-side `verifyAndSettle`. */\nexport interface CeloSettleResult {\n  txHash: Hex;\n  blockNumber: bigint;\n  settledAt: number;\n  feeCurrency: Address | undefined;\n}\n\nexport class CeloFeeAbstractedAdapter implements PaymentAdapter {\n  readonly protocol = 'celo-fee-abstracted';\n  private readonly inner: X402Adapter;\n  private transactor?: CeloFeeAbstractedTransactor;\n  private readonly chainKey: CeloChainKey;\n  private readonly config: CeloConfig;\n\n  constructor(\n    wallet: OWSWallet,\n    chainKey: CeloChainKey,\n    config: CeloConfig = {},\n    validityWindowSeconds = 600,\n  ) {\n    this.chainKey = chainKey;\n    this.config = config;\n    // Buyer adapter: standard x402 EIP-3009 signing — viem-only, no broadcast,\n    // so the buyer's wallet only needs USDC and never needs CELO.\n    this.inner = new X402Adapter(wallet, chainKey as ChainKey, validityWindowSeconds);\n    // Merchant transactor is opt-in via setMerchantSigner — keeps the\n    // facilitator privateKey separate from the buyer's OWSWallet identity.\n  }\n\n  /**\n   * Wire the merchant-side facilitator signing key. Called by `PaymentClient`\n   * (or directly by integrators running their own facilitator) — keeps the\n   * raw private key out of OWSWallet and lets a single n-payment instance\n   * act as both buyer (OWSWallet.privateKey) and merchant (a separate\n   * facilitator key) on Celo.\n   */\n  setMerchantSigner(facilitatorPrivateKey: Hex, payAsset: 'USDC' | 'USDT' | 'USDm' = 'USDC'): void {\n    this.transactor = new CeloFeeAbstractedTransactor(\n      facilitatorPrivateKey,\n      this.chainKey,\n      payAsset,\n      {\n        adapterOverride: this.config.feeCurrencyAdapterOverride,\n        disabled: this.config.disableFeeAbstraction,\n        rpcUrl: this.config.rpcUrl,\n      },\n    );\n  }\n\n  detect(response: Response): boolean {\n    return this.inner.detect(response);\n  }\n\n  async pay(\n    url: string,\n    init: RequestInit | undefined,\n    response: Response,\n    _ctx?: PaymentContext,\n  ): Promise<Response> {\n    // Buyer flow is identical to X402Adapter — no on-chain write, no gas needed.\n    return this.inner.pay(url, init, response);\n  }\n\n  /**\n   * Merchant-side: verify a buyer's EIP-3009 authorization (decoded from the\n   * x-payment header), then broadcast `transferWithAuthorization` on the\n   * USDC contract with the facilitator paying gas in USDC via CIP-64.\n   */\n  async verifyAndSettle(input: {\n    authorization: CeloEip3009Authorization;\n    signature: Hex;\n    /** Override the asset contract (default: chain's USDC). */\n    token?: Address;\n  }): Promise<CeloSettleResult> {\n    if (!this.transactor) {\n      throw new NPaymentError(\n        'Merchant signer not wired — call setMerchantSigner(facilitatorPrivateKey) first',\n        'CELO_NO_MERCHANT_SIGNER',\n        'Pass the facilitator privateKey via CeloFeeAbstractedAdapter.setMerchantSigner().',\n      );\n    }\n    const token = input.token ?? (CHAINS[this.chainKey].tokens.USDC as Address);\n    if (!token) {\n      throw new NPaymentError(\n        `No USDC asset registered on ${this.chainKey}`,\n        'CELO_FEE_ABSTRACTION_REJECTED',\n      );\n    }\n    const { txHash, blockNumber } = await this.transactor.transferWithAuthorization({\n      token,\n      from: input.authorization.from,\n      to: input.authorization.to,\n      value: input.authorization.value,\n      validAfter: input.authorization.validAfter,\n      validBefore: input.authorization.validBefore,\n      nonce: input.authorization.nonce,\n      signature: input.signature,\n    });\n    return {\n      txHash,\n      blockNumber,\n      settledAt: Date.now(),\n      feeCurrency: this.transactor.getFeeCurrency(),\n    };\n  }\n\n  /**\n   * Decode the x-payment header from a buyer's retry request. Helper for\n   * merchants who receive the header server-side and want a typed payload.\n   */\n  static decodeXPayment(headerB64: string): {\n    authorization: CeloEip3009Authorization;\n    signature: Hex;\n    network: string;\n  } {\n    let envelope: {\n      payload?: {\n        signature?: Hex;\n        authorization?: {\n          from: Address; to: Address; value: string;\n          validAfter: string; validBefore: string; nonce: Hex;\n        };\n      };\n      network?: string;\n    };\n    try {\n      envelope = JSON.parse(Buffer.from(headerB64, 'base64').toString());\n    } catch {\n      throw new ChallengeParseError('Malformed x-payment header', 'INVALID_HEADER');\n    }\n    const auth = envelope.payload?.authorization;\n    const sig = envelope.payload?.signature;\n    if (!auth || !sig) {\n      throw new ChallengeParseError('Missing authorization or signature in x-payment', 'INVALID_HEADER');\n    }\n    return {\n      authorization: {\n        from: auth.from,\n        to: auth.to,\n        value: BigInt(auth.value),\n        validAfter: BigInt(auth.validAfter),\n        validBefore: BigInt(auth.validBefore),\n        nonce: auth.nonce,\n      },\n      signature: sig,\n      network: envelope.network ?? '',\n    };\n  }\n}\n","/**\n * v0.25 — Celo Agent Visa tracker.\n *\n * Tracks every n-payment Celo settlement against the agent's tier (Tourist /\n * Work / Citizenship) per the criteria from self.xyz/blog/agent-visa:\n *\n *   • Tourist     — 1+ tx\n *   • Work        — 1 000+ tx OR $5K+ volume, AND verified Self Agent ID\n *   • Citizenship — 10 000+ tx OR $15K+ volume\n *\n * Storage is pluggable (`AgentVisaStorage` interface in src/types.ts) — the\n * tracker owns the math, integrators own persistence (memory, JSON file,\n * Redis, DynamoDB, …). v0.25 ships memory + JSON-file backends.\n *\n * SOLID — Single Responsibility: tier math + accumulation. Storage is a\n * dependency-injected interface; nothing else in this file touches I/O\n * outside of the storage contract.\n */\nimport type { Address } from 'viem';\nimport { promises as fs } from 'node:fs';\nimport type {\n  AgentVisaState,\n  AgentVisaStorage,\n  CeloAgentVisaTier,\n} from '../types.js';\n\nexport interface CeloAgentVisaTrackerOptions {\n  /** Whether the agent has a verified Self.xyz Agent ID — Work-tier requirement. */\n  selfAgentIdProvided?: boolean;\n}\n\n/** Pure tier math — no I/O, deterministic, easy to test. */\nexport function computeAgentVisaTier(state: {\n  txCount: number;\n  volumeUsd: number;\n  selfAgentIdProvided: boolean;\n}): CeloAgentVisaTier {\n  if (state.txCount === 0) return 'none';\n  if (state.txCount >= 10_000 || state.volumeUsd >= 15_000) return 'citizenship';\n  if (state.selfAgentIdProvided && (state.txCount >= 1_000 || state.volumeUsd >= 5_000)) {\n    return 'work';\n  }\n  return 'tourist';\n}\n\nexport class CeloAgentVisaTracker {\n  private readonly mutex = new Map<string, Promise<void>>();\n\n  constructor(\n    private readonly storage: AgentVisaStorage,\n    private readonly opts: CeloAgentVisaTrackerOptions = {},\n  ) {}\n\n  /**\n   * Record a successful Celo payment. Returns the updated state.\n   * Concurrent calls for the same agent are serialised via per-key mutex\n   * to prevent lost updates.\n   */\n  async recordPayment(\n    agentAddress: Address,\n    amountUsd: number,\n    network: 'mainnet' | 'sepolia',\n  ): Promise<AgentVisaState> {\n    return this.withLock(agentAddress, async () => {\n      const prior = await this.storage.read(agentAddress);\n      const now = Date.now();\n      const next: AgentVisaState = {\n        agentAddress,\n        txCount: (prior?.txCount ?? 0) + 1,\n        volumeUsd: (prior?.volumeUsd ?? 0) + Math.max(0, amountUsd),\n        selfAgentIdProvided: this.opts.selfAgentIdProvided ?? prior?.selfAgentIdProvided ?? false,\n        tier: 'none',\n        firstTxAt: prior?.firstTxAt ?? now,\n        lastTxAt: now,\n        network,\n      };\n      next.tier = computeAgentVisaTier(next);\n      await this.storage.write(next);\n      return next;\n    });\n  }\n\n  /** Read current state. Returns a default `none`-tier state when unknown. */\n  async getStatus(agentAddress: Address, network: 'mainnet' | 'sepolia' = 'mainnet'): Promise<AgentVisaState> {\n    const s = await this.storage.read(agentAddress);\n    if (s) return s;\n    return {\n      agentAddress, txCount: 0, volumeUsd: 0,\n      selfAgentIdProvided: this.opts.selfAgentIdProvided ?? false,\n      tier: 'none', firstTxAt: 0, lastTxAt: 0, network,\n    };\n  }\n\n  private async withLock<T>(key: string, fn: () => Promise<T>): Promise<T> {\n    const prev = this.mutex.get(key) ?? Promise.resolve();\n    let release!: () => void;\n    const next = new Promise<void>((r) => { release = r; });\n    this.mutex.set(key, prev.then(() => next));\n    try {\n      await prev;\n      return await fn();\n    } finally {\n      release();\n      // Cleanup map entry if no further work queued.\n      if (this.mutex.get(key) === prev.then(() => next)) this.mutex.delete(key);\n    }\n  }\n}\n\n// ─── Storage backends ──────────────────────────────────────────────────────\n\n/** In-memory storage. Single-process; lost on restart. Default for dev. */\nexport class MemoryAgentVisaStorage implements AgentVisaStorage {\n  private readonly store = new Map<string, AgentVisaState>();\n  async read(agentAddress: Address): Promise<AgentVisaState | null> {\n    return this.store.get(agentAddress.toLowerCase()) ?? null;\n  }\n  async write(state: AgentVisaState): Promise<void> {\n    this.store.set(state.agentAddress.toLowerCase(), state);\n  }\n}\n\n/**\n * JSON-file-backed storage. Single-process semantics — concurrent writes\n * across processes are NOT safe; use a real KV (Redis / DynamoDB) in prod.\n *\n * File format: `{ \"<addr-lower>\": { ...AgentVisaState }, ... }`. Unknown\n * fields are preserved on read; missing fields default sensibly. The file\n * is created on first write.\n */\nexport class JsonFileAgentVisaStorage implements AgentVisaStorage {\n  private readonly mutex = Promise.resolve(); // future-proof reserved\n  constructor(private readonly path: string) {}\n\n  async read(agentAddress: Address): Promise<AgentVisaState | null> {\n    const all = await this.readAll();\n    return all[agentAddress.toLowerCase()] ?? null;\n  }\n\n  async write(state: AgentVisaState): Promise<void> {\n    const all = await this.readAll();\n    all[state.agentAddress.toLowerCase()] = state;\n    await fs.writeFile(this.path, JSON.stringify(all, replacer, 2), 'utf8');\n  }\n\n  private async readAll(): Promise<Record<string, AgentVisaState>> {\n    let raw: string;\n    try {\n      raw = await fs.readFile(this.path, 'utf8');\n    } catch (err) {\n      if ((err as NodeJS.ErrnoException).code === 'ENOENT') return {};\n      throw err;\n    }\n    return JSON.parse(raw) as Record<string, AgentVisaState>;\n  }\n}\n\n// JSON.stringify replacer to preserve numeric fields. AgentVisaState carries\n// no bigints today; this is a no-op placeholder for forward compatibility.\nfunction replacer(_k: string, v: unknown): unknown {\n  return typeof v === 'bigint' ? v.toString() : v;\n}\n","import type { NPaymentConfig, PaymentAdapter, PaymentContext, ProxyAdapter } from './types.js';\nimport { CHAINS, getChainsForProtocol } from './chains.js';\nimport { createConfig } from './config.js';\nimport { detectProtocol } from './detect.js';\nimport { AdapterNotFoundError, NPaymentError } from './errors.js';\nimport { AnalyticsEmitter } from './analytics.js';\nimport { OWSWallet } from './ows/wallet.js';\nimport { X402Adapter } from './adapters/x402.js';\nimport { MppAdapter } from './adapters/mpp.js';\nimport { GoatAdapter } from './adapters/goat.js';\nimport { XrplAdapter } from './adapters/xrpl.js';\nimport { XrplConnection } from './xrpl/connection.js';\nimport { XrplWallet } from './xrpl/wallet.js';\nimport { XrplVaultClient } from './xrpl/vault.js';\nimport { XrplSwapClient } from './xrpl/swap.js';\nimport { XrplTreasuryManager } from './xrpl/treasury.js';\nimport { getRlusdIssuer, networkFromChainKey } from './xrpl/utils.js';\nimport { StellarX402Adapter } from './adapters/stellar-x402.js';\nimport { StellarMppAdapter } from './adapters/stellar-mpp.js';\nimport { StellarWallet } from './stellar/wallet.js';\nimport { KeypairStellarSigner } from './stellar/signer.js';\nimport { StellarChannelsClient } from './stellar/channels-client.js';\nimport { StellarSessionClient, type StellarSessionClientConfig } from './stellar/session.js';\nimport { BtcLendingVault } from './goat/lending.js';\nimport { UsdcAcquisitionRouter } from './goat/acquisition.js';\nimport { CircleGatewayAdapter } from './adapters/circle-gateway.js';\nimport { SolanaX402Adapter } from './adapters/solana-x402.js';\nimport { MorphX402Adapter } from './adapters/morph-x402.js';\nimport { MorphX402Client } from './morph/client.js';\nimport { FlareX402Adapter } from './flare/x402.js';\nimport { PolicyEngine, AuditLog, SpendingGuard } from './policy/index.js';\nimport { SpaceRouterAdapter } from './adapters/spacerouter.js';\nimport { SpaceRouterClient } from './spacerouter/client.js';\nimport { OWSSpaceRouterSigner, KeypairSpaceRouterSigner } from './spacerouter/signer.js';\nimport { AaveTreasuryManager } from './aave/index.js';\nimport { AaveGhoAdapter } from './adapters/aave-gho.js';\nimport { WormholeNttClient } from './wormhole/ntt-client.js';\nimport { WormholeNttAdapter } from './adapters/wormhole-ntt.js';\nimport { InitiaClient, mnemonicSigner } from './initia/client.js';\nimport { InitiaIusdAdapter } from './adapters/initia-iusd.js';\nimport type { InitiaChainKey } from './initia/types.js';\nimport { CeloFeeAbstractedAdapter } from './adapters/celo-fee-abstracted.js';\nimport { CeloAgentVisaTracker, MemoryAgentVisaStorage } from './celo/agent-visa.js';\nimport type { Hex, Address } from 'viem';\n\nconst SPACE_ROUTER_DEFAULTS = {\n  'creditcoin-mainnet': {\n    escrow: '0xC130F5D76f0b4Ce8FE2ceA0D2C2b8f53A39a5cd0',\n    token: '0x7ab7C6A935Ab2D1437398790C9C0660af62A80b9',\n  },\n  'creditcoin-testnet': {\n    // TBD — published with v1.5 testnet release. Override via spacerouter.escrowContract / tokenAddress.\n    escrow: '0x0000000000000000000000000000000000000000',\n    token: '0x0000000000000000000000000000000000000000',\n  },\n} as const;\n\nexport class PaymentClient {\n  private adapters: PaymentAdapter[] = [];\n  private proxyAdapters: ProxyAdapter[] = [];\n  private analytics: AnalyticsEmitter;\n  private config: NPaymentConfig;\n  private guard?: SpendingGuard;\n  readonly wallet: OWSWallet;\n  readonly aave?: AaveTreasuryManager;\n  /** v0.14: XRPL XLS-65 vault treasury (yield-parity). Constructed when xrpl.treasury.autoYield is set. */\n  readonly xrplTreasury?: XrplTreasuryManager;\n  /** v0.22: Wormhole NTT client (soft-disabled when no signers configured). */\n  wormholeClient?: WormholeNttClient;\n  /** v0.22: Wormhole NTT adapter. Invoked by PayRouter v3 corridor (PRD-C). */\n  wormholeAdapter?: WormholeNttAdapter;\n  /** v0.23: Initia (Cosmos-SDK) client. Soft-constructed when initia-* chain is in config.chains. */\n  initiaClient?: InitiaClient;\n  /** v0.23: Initia iUSD adapter. Use `.setBridgeIfNeeded(orchestrator.ensureIusd)` to enable USDC→iUSD auto-bridging. */\n  initiaAdapter?: InitiaIusdAdapter;\n  /** v0.25: Celo Agent Visa tracker. Records every Celo settlement against Tourist/Work/Citizenship tiers. */\n  celoVisaTracker?: CeloAgentVisaTracker;\n  /** v0.25: ChainKey of the configured Celo network (used for visa tracking + status reads). */\n  private celoNetwork?: 'mainnet' | 'sepolia';\n\n  constructor(config: NPaymentConfig) {\n    this.config = createConfig(config);\n    this.analytics = new AnalyticsEmitter(config.analytics?.plugins);\n    this.wallet = new OWSWallet(config.ows);\n\n    // Policy engine (v0.8)\n    if (config.policy) {\n      const engine = PolicyEngine.fromConfig(config.policy);\n      this.guard = new SpendingGuard(engine, new AuditLog());\n    }\n\n    const proto = this.config.protocol ?? 'auto';\n    const hasX402 = getChainsForProtocol(config.chains, 'x402').length > 0;\n    const hasMpp = getChainsForProtocol(config.chains, 'mpp').length > 0;\n    const hasGoat = getChainsForProtocol(config.chains, 'goat').length > 0;\n\n    if (hasX402 && proto !== 'mpp') {\n      const x402Chain = getChainsForProtocol(config.chains, 'x402')[0];\n      this.adapters.push(new X402Adapter(this.wallet, x402Chain));\n    }\n    if (hasMpp && proto !== 'x402') {\n      const mppChain = getChainsForProtocol(config.chains, 'mpp')[0];\n      this.adapters.push(new MppAdapter(this.wallet, mppChain, config.autoFaucet));\n    }\n    if (hasGoat && config.goat) {\n      const goatChain = getChainsForProtocol(config.chains, 'goat')[0];\n      const vault = config.btcLending ? new BtcLendingVault(this.wallet, config.btcLending) : undefined;\n      let router: UsdcAcquisitionRouter | undefined;\n      if (config.goat.autoFund?.enabled) {\n        router = new UsdcAcquisitionRouter({\n          goatChain,\n          wallet: this.wallet,\n          config: config.goat.autoFund,\n          partnerChains: config.chains.filter((c) => c.endsWith('-mainnet') || c.endsWith('-sepolia')),\n          bridgeUrl: config.goat.bridgeUrl,\n          btcSigner: config.goat.btcSigner,\n          usdcOverride: config.goat.usdcOverride,\n          dexOverride: config.goat.dexOverride,\n          guard: this.guard,\n        });\n        router.validateConfig();\n      }\n      this.adapters.push(new GoatAdapter(config.goat, this.wallet, goatChain, vault, router));\n    }\n\n    const hasXrpl = getChainsForProtocol(config.chains, 'xrpl').length > 0;\n    if (hasXrpl) {\n      const xrplChain = getChainsForProtocol(config.chains, 'xrpl')[0];\n      const xrplCfg = config.xrpl;\n      const hasCreds = !!(xrplCfg?.seed || config.ows.wallet);\n      if (hasCreds) {\n        const network = networkFromChainKey(xrplChain);\n        const issuer = getRlusdIssuer(network);\n        const xrplWallet = new XrplWallet({ seed: xrplCfg?.seed, owsWallet: config.ows.wallet });\n        const xrplConn = new XrplConnection(xrplCfg?.server ?? xrplChain);\n        const xrplVault = new XrplVaultClient(xrplConn, xrplWallet, issuer);\n        const xrplSwap = new XrplSwapClient(xrplConn, xrplWallet, network, issuer);\n\n        let treasury: XrplTreasuryManager | undefined;\n        if (xrplCfg?.treasury?.autoYield) {\n          treasury = new XrplTreasuryManager(\n            { ...xrplCfg.treasury, minXrpReserve: xrplCfg.minXrpReserve },\n            { connection: xrplConn, wallet: xrplWallet, vault: xrplVault, network },\n          );\n          this.xrplTreasury = treasury;\n        }\n\n        this.adapters.push(\n          new XrplAdapter(xrplWallet, xrplConn, network, xrplSwap, treasury, {\n            autoSwap: xrplCfg?.autoSwap,\n            maxSlippageBps: xrplCfg?.maxSlippageBps,\n            sourceTag: xrplCfg?.sourceTag,\n          }),\n        );\n      } else if (xrplCfg?.strict) {\n        throw new AdapterNotFoundError(\n          'XRPL chain configured with strict mode but xrpl.seed / ows.wallet missing',\n          'XRPL_NO_CREDENTIALS',\n          'Provide xrpl: { seed: \"sEd...\" } or use OWS wallet identity, or set strict: false for credential-less dev.',\n        );\n      } else {\n        console.warn(\n          '[n-payment] XRPL chain configured without xrpl.seed / ows.wallet — XRPL adapter disabled. ' +\n          'Provide xrpl.seed or use OWS to enable, or pass xrpl.strict: true to fail fast.',\n        );\n      }\n    }\n\n    // Stellar v0.10 — soft credential-less mode (mirrors Morph pattern)\n    const hasStellarX402 = getChainsForProtocol(config.chains, 'stellar-x402').length > 0;\n    const hasStellarMpp = getChainsForProtocol(config.chains, 'stellar-mpp').length > 0;\n    if (hasStellarX402 || hasStellarMpp) {\n      const stellarChain = getChainsForProtocol(config.chains, 'stellar-x402')[0] ?? getChainsForProtocol(config.chains, 'stellar-mpp')[0];\n      const stellarCfg = config.stellar;\n      if (stellarCfg?.secretKey) {\n        const isMainnet = stellarChain === 'stellar-mainnet';\n        // Lazy signer init via promise — adapters await getAddressAsync internally\n        const signer = new KeypairStellarSigner(stellarCfg.secretKey, stellarCfg.publicKey);\n        // Resolve address eagerly so adapter has it ready (fire-and-forget; failures throw on first use)\n        void KeypairStellarSigner.fromSecret(stellarCfg.secretKey).then((s) => {\n          (signer as { address: string }).address = s.address;\n        }).catch(() => {/* deferred to first sign call */});\n        const channelsClient = new StellarChannelsClient({\n          apiKey: stellarCfg.channelsApiKey,\n          baseUrl: stellarCfg.facilitatorUrl,\n          isMainnet,\n        });\n        if (hasStellarX402) this.adapters.push(new StellarX402Adapter(signer, stellarChain, channelsClient, stellarCfg.rpcUrl));\n        if (hasStellarMpp) this.adapters.push(new StellarMppAdapter(signer, stellarChain));\n      } else if (stellarCfg?.strict) {\n        throw new AdapterNotFoundError(\n          'Stellar chain configured with strict mode but stellar.secretKey missing',\n          'STELLAR_NO_SECRET',\n          'Provide stellar: { secretKey: \"S...\" } or set strict: false for credential-less dev',\n        );\n      } else {\n        console.warn(\n          '[n-payment] Stellar chain configured without stellar.secretKey — Stellar adapters disabled. ' +\n          'Pass stellar: { secretKey: \"S...\" } or use FreighterStellarSigner directly in browser.',\n        );\n      }\n    }\n\n    // Circle Gateway nanopayments (v0.8)\n    if (config.circle) {\n      this.adapters.push(new CircleGatewayAdapter(config.circle));\n    }\n\n    // Solana x402 (v0.8)\n    if (config.solana) {\n      this.adapters.push(new SolanaX402Adapter(config.solana));\n    }\n\n    // Morph x402 (v0.9) — soft credential-less mode: warn-and-skip when keys missing\n    const hasMorph = getChainsForProtocol(config.chains, 'morph-x402').length > 0;\n    if (hasMorph) {\n      const morphChain = getChainsForProtocol(config.chains, 'morph-x402')[0];\n      const morphCfg = config.morph;\n      const hasCreds = !!(morphCfg?.accessKey && morphCfg?.secretKey);\n      // v0.20: Morph Hoodi's sponsored (eip3009) flow uses a self-hosted local\n      // facilitator that does NOT require HMAC. Treat an explicit facilitatorUrl\n      // (or the Hoodi chain key) as sufficient permission to construct the adapter.\n      const facilitatorUrl = morphCfg?.facilitatorUrl ?? CHAINS[morphChain].facilitator;\n      const isHoodi = morphChain === 'morph-hoodi-testnet';\n      const allowFacilitatorOnly = !!morphCfg?.facilitatorUrl || isHoodi;\n      if (hasCreds || allowFacilitatorOnly) {\n        const morphClient = new MorphX402Client({\n          accessKey: morphCfg?.accessKey,\n          secretKey: morphCfg?.secretKey,\n          baseUrl: facilitatorUrl,\n        });\n        this.adapters.push(\n          new MorphX402Adapter(this.wallet, morphClient, morphChain, {\n            tokenName: morphCfg?.tokenName,\n            tokenVersion: morphCfg?.tokenVersion,\n          }),\n        );\n      } else if (morphCfg?.strict) {\n        throw new AdapterNotFoundError(\n          'Morph chain configured with strict mode but accessKey/secretKey missing',\n          'MORPH_NO_CREDENTIALS',\n          'Register at https://morph-rails.morph.network/x402 to obtain credentials',\n        );\n      } else {\n        console.warn(\n          '[n-payment] Morph chain configured without accessKey/secretKey or facilitatorUrl — Morph adapter disabled. ' +\n          'Register at https://morph-rails.morph.network/x402, or pass morph.facilitatorUrl for self-hosted.',\n        );\n      }\n    }\n\n    // SpaceRouter (v0.11) — soft mode: warn-and-skip when peer-dep / config missing\n    const hasSpaceRouter = getChainsForProtocol(config.chains, 'spacerouter').length > 0;\n    if (hasSpaceRouter) {\n      const srChainKey = getChainsForProtocol(config.chains, 'spacerouter')[0];\n      const srChain = CHAINS[srChainKey];\n      const srCfg = config.spacerouter;\n      const defaults = SPACE_ROUTER_DEFAULTS[srChainKey as keyof typeof SPACE_ROUTER_DEFAULTS];\n      const escrowAddress = (srCfg?.escrowContract ?? defaults?.escrow) as Address | undefined;\n      const tokenAddress = (srCfg?.tokenAddress ?? defaults?.token ?? srChain.tokens.SPACE ?? srChain.tokens.SPC) as Address | undefined;\n      if (!escrowAddress || !tokenAddress) {\n        if (srCfg?.strict) {\n          throw new AdapterNotFoundError(\n            'SpaceRouter requires escrowContract and tokenAddress',\n            'SR_INVALID_CONFIG',\n            'Pass spacerouter.escrowContract and spacerouter.tokenAddress.',\n          );\n        }\n        console.warn('[n-payment] SpaceRouter chain configured without escrow/token addresses — adapter disabled.');\n      } else {\n        const privateKey = config.ows?.privateKey as Hex | undefined;\n        const signer = privateKey\n          ? new KeypairSpaceRouterSigner(privateKey)\n          : new OWSSpaceRouterSigner(this.wallet, srChain.chainId);\n        const srClient = new SpaceRouterClient({\n          chain: srChain,\n          signer,\n          escrowAddress,\n          tokenAddress,\n          privateKey,\n          gatewayUrl: srCfg?.gatewayUrl ?? srChain.facilitator,\n          gatewayMgmtUrl: srCfg?.gatewayMgmtUrl,\n          apiKey: srCfg?.apiKey,\n          region: srCfg?.region,\n          ipType: srCfg?.ipType,\n          autoEscrow: srCfg?.autoEscrow,\n          verify: srCfg?.verify,\n        });\n        this.proxyAdapters.push(new SpaceRouterAdapter(srClient));\n      }\n    }\n\n    // Aave Treasury (v0.13) — yield-bearing agent wallet + GHO payments\n    if (config.aave) {\n      const aaveChain = config.chains.find(c => ['base-mainnet', 'ethereum'].includes(c)) ?? config.chains[0];\n      this.aave = new AaveTreasuryManager(config.aave, aaveChain);\n      if (config.aave.preferGho) {\n        this.adapters.push(new AaveGhoAdapter());\n      }\n    }\n\n    // Flare x402 (v0.19) — soft credential-less mode (mirrors Morph pattern).\n    // Requires both a flare-* chain in `chains` and the x402 sub-config; if either is\n    // missing we warn-and-skip so credential-less dev (e.g. just FXRP minting) still works.\n    const hasFlareX402 = getChainsForProtocol(config.chains, 'flare-x402').length > 0;\n    if (hasFlareX402) {\n      const flareChain = getChainsForProtocol(config.chains, 'flare-x402')[0];\n      const flareCfg = config.flare;\n      const hasX402Cfg = !!flareCfg?.x402?.tokenAddress && !!flareCfg.x402.facilitatorAddress;\n      const hasSigner = !!config.ows?.privateKey;\n      if (hasX402Cfg && hasSigner) {\n        this.adapters.push(\n          new FlareX402Adapter(this.wallet, flareChain, {\n            tokenName: flareCfg!.x402!.tokenName,\n            tokenVersion: flareCfg!.x402!.tokenVersion,\n            validityWindowSeconds: flareCfg!.x402!.validityWindowSeconds,\n          }),\n        );\n      } else if (flareCfg?.strict) {\n        throw new AdapterNotFoundError(\n          'Flare x402 chain configured with strict mode but flare.x402.{tokenAddress,facilitatorAddress} or ows.privateKey missing',\n          'FLARE_X402_NO_CONFIG',\n          'Pass flare: { x402: { tokenAddress, facilitatorAddress } } and ows: { privateKey } — see examples/flare-payments-demo.ts.',\n        );\n      } else {\n        console.warn(\n          '[n-payment] Flare x402 chain configured without flare.x402.{tokenAddress,facilitatorAddress} or ows.privateKey — Flare x402 adapter disabled. ' +\n          'Run examples/flare-payments-demo.ts deploy mode to provision the contracts.',\n        );\n      }\n    }\n\n    // ── v0.22: Wormhole NTT (cross-chain RLUSD) — soft-disable when no signers ──\n    if (config.wormhole?.signers && Object.keys(config.wormhole.signers).length > 0) {\n      this.wormholeClient = new WormholeNttClient({\n        network: config.wormhole.network ?? 'Mainnet',\n        signers: config.wormhole.signers,\n        bridgeFactory: config.wormhole.bridgeFactory,\n        attestationPollMs: config.wormhole.attestationPollMs,\n        attestationTimeoutMs: config.wormhole.attestationTimeoutMs,\n        strict: config.wormhole.strict,\n      });\n      this.wormholeAdapter = new WormholeNttAdapter(this.wormholeClient, {\n        maxPerTransfer: config.wormhole.maxPerTransfer,\n        maxPerDay: config.wormhole.maxPerDay,\n      });\n    } else if (config.wormhole?.strict) {\n      throw new AdapterNotFoundError(\n        'Wormhole NTT configured with strict mode but no signers provided',\n        'WORMHOLE_NTT_NO_SIGNER',\n        'Pass wormhole: { signers: { Optimism: ethersWallet, Base: ethersWallet, ... } }.',\n      );\n    }\n\n    // ── v0.23: Initia (Cosmos-SDK) iUSD adapter — soft-disable when chain absent ──\n    const initiaChainKey = config.chains.find(\n      (c) => c === 'initia-mainnet' || c === 'initia-testnet',\n    ) as InitiaChainKey | undefined;\n    if (initiaChainKey) {\n      const initiaCfg = config.initia ?? {};\n      const signer = initiaCfg.mnemonic\n        ? () => mnemonicSigner(initiaCfg.mnemonic!)\n        : undefined;\n      this.initiaClient = new InitiaClient({\n        chainKey: initiaChainKey,\n        signer,\n        rpcUrl: initiaCfg.rpcUrl,\n        strict: initiaCfg.strict,\n      });\n      this.initiaAdapter = new InitiaIusdAdapter(this.initiaClient, initiaChainKey);\n      this.adapters.push(this.initiaAdapter);\n    }\n\n    // ── v0.25: Celo CIP-64 fee-abstracted adapter — opt-in via config.celo ──\n    // When a celo-* chain is in config.chains AND config.celo is provided, we\n    // PREPEND the adapter so it wins over the generic X402Adapter for Celo\n    // payments. Without config.celo we leave the generic X402Adapter active\n    // (still spec-compliant on the buyer side; merchants need fee abstraction).\n    const celoChainKey = config.chains.find(\n      (c) => c === 'celo-mainnet' || c === 'celo-sepolia',\n    ) as ('celo-mainnet' | 'celo-sepolia') | undefined;\n    if (celoChainKey && config.celo !== undefined) {\n      const celoAdapter = new CeloFeeAbstractedAdapter(this.wallet, celoChainKey, config.celo);\n      // Wire merchant signer when the wallet has a privateKey AND fee abstraction\n      // is not disabled. Same key serves both buyer (off-chain signing) and\n      // merchant (on-chain settlement) roles unless the integrator splits them\n      // by calling celoAdapter.setMerchantSigner() with a separate key.\n      if (config.ows?.privateKey && !config.celo.disableFeeAbstraction) {\n        celoAdapter.setMerchantSigner(\n          config.ows.privateKey as Hex,\n          config.celo.payAsset ?? 'USDC',\n        );\n      } else if (config.celo.disableFeeAbstraction) {\n        console.warn(\n          '[n-payment] Celo fee abstraction disabled — facilitator wallet must hold CELO for gas. ' +\n          'Remove celo.disableFeeAbstraction to enable CIP-64 (zero-CELO operation).',\n        );\n      }\n      // Prepend so the celo adapter wins over the generic X402Adapter pushed earlier.\n      this.adapters.unshift(celoAdapter);\n\n      // Agent Visa tracker — records every Celo settlement against tier\n      // criteria. Storage is pluggable; default = in-memory (lost on restart).\n      this.celoNetwork = celoChainKey === 'celo-mainnet' ? 'mainnet' : 'sepolia';\n      this.celoVisaTracker = new CeloAgentVisaTracker(\n        config.celo.agentVisa?.storage ?? new MemoryAgentVisaStorage(),\n        { selfAgentIdProvided: config.celo.agentVisa?.selfAgentIdProvided ?? false },\n      );\n    }\n  }\n\n  async fetchWithPayment(url: string, init?: RequestInit, opts?: PaymentContext): Promise<Response> {\n    const start = Date.now();\n    const ctx = opts ?? {};\n    const chain = this.config.chains[0];\n\n    // Up-front policy check (pre-payment, amount unknown yet — uses 0n for rate/region checks only)\n    if (this.guard) {\n      const decision = this.guard.check({\n        url, amount: 0n, chain,\n        referenceKey: ctx.referenceKey, metadata: ctx.metadata,\n        region: ctx.region, ipType: ctx.ipType,\n      });\n      if (!decision.allowed) {\n        throw new AdapterNotFoundError(`Policy denied: ${decision.reason}`, 'POLICY_DENIED');\n      }\n    }\n\n    // ── Step 1: initial fetch — direct or via explicit proxy ──\n    let proxyUsed: ProxyAdapter | undefined;\n    let response: Response;\n\n    if (ctx.proxy === 'spacerouter') {\n      proxyUsed = this.proxyAdapters.find((p) => p.protocol === 'spacerouter');\n      if (!proxyUsed) {\n        throw new AdapterNotFoundError(\n          'No spacerouter adapter configured', 'NO_PROXY_ADAPTER',\n          'Add a creditcoin-* chain and spacerouter config to NPaymentConfig.',\n        );\n      }\n      response = await proxyUsed.route(url, init, ctx);\n    } else {\n      response = await fetch(url, init);\n\n      // ── Step 1b: smart fallback on 403/429/Cloudflare-block ──\n      if (ctx.proxy === 'auto' && this.proxyAdapters.length) {\n        const fallback = this.proxyAdapters.find((p) => p.detect(ctx, response));\n        if (fallback) {\n          response = await fallback.route(url, init, ctx);\n          proxyUsed = fallback;\n        }\n      }\n    }\n\n    // Audit-log bandwidth use whenever a proxy hop happened.\n    if (proxyUsed && this.guard) {\n      this.guard.recordBandwidth({\n        url, amount: 0n, chain,\n        region: ctx.region, ipType: ctx.ipType,\n        referenceKey: ctx.referenceKey, metadata: ctx.metadata,\n      });\n      this.analytics.emit({\n        protocol: proxyUsed.protocol, chain, url,\n        success: true, durationMs: Date.now() - start, timestamp: Date.now(),\n      });\n    }\n\n    // ── Step 2: not a paywall — return as-is ──\n    if (response.status !== 402) return response;\n\n    // ── Step 3: 402 paywall — find payment adapter + settle ──\n    const protocol = detectProtocol(response, this.config.protocol);\n\n    // Validate facilitator against trusted allowlist (if configured)\n    if (this.config.policy?.trustedFacilitators?.length) {\n      const facilitator = this.extractFacilitator(response);\n      if (facilitator && !this.config.policy.trustedFacilitators.includes(facilitator)) {\n        throw new NPaymentError(\n          `Untrusted facilitator: ${facilitator}`,\n          'UNTRUSTED_FACILITATOR',\n        );\n      }\n    }\n\n    const adapter =\n      this.adapters.find((a) => a.protocol === protocol) ??\n      this.adapters.find((a) => a.detect(response));\n\n    if (!adapter) {\n      throw new AdapterNotFoundError(\n        `No adapter for protocol: ${protocol}`, 'NO_ADAPTER',\n        `Configured chains: ${this.config.chains.join(', ')}`,\n      );\n    }\n\n    try {\n      const result = await adapter.pay(url, init, response, opts);\n\n      // Extract real amount from the 402 challenge for accurate policy tracking\n      const challengeAmount = this.extractChallengeAmount(response);\n      if (this.guard) {\n        // Post-payment policy check with real amount (cap enforcement)\n        const maxCap = this.config.policy?.maxPerTransaction ?? 100_000_000n; // default $100 cap\n        if (challengeAmount > maxCap) {\n          throw new NPaymentError(\n            `Challenge amount ${challengeAmount} exceeds max cap ${maxCap}`,\n            'AMOUNT_CAP_EXCEEDED',\n          );\n        }\n        this.guard.recordPayment({\n          url, amount: challengeAmount, chain,\n          referenceKey: ctx.referenceKey, metadata: ctx.metadata,\n        });\n      }\n      this.analytics.emit({\n        protocol: adapter.protocol, chain, url,\n        success: true, durationMs: Date.now() - start, timestamp: Date.now(),\n      });\n      // v0.25 — best-effort Agent Visa accounting on every successful Celo\n      // settlement. Failures are non-fatal (warn-and-continue) so a downed\n      // storage backend never blocks payment success.\n      if (this.celoVisaTracker && this.celoNetwork && adapter.protocol === 'celo-fee-abstracted') {\n        const account = this.wallet.getAccount();\n        if (account) {\n          const usdAmount = chainKeyAmountToUsd(chain, challengeAmount);\n          this.celoVisaTracker\n            .recordPayment(account.address, usdAmount, this.celoNetwork)\n            .catch((e) => console.warn('[n-payment] celoVisaTracker.recordPayment failed:', (e as Error).message));\n        }\n      }\n      return result;\n    } catch (err) {\n      this.analytics.emit({\n        protocol: adapter.protocol, chain, url,\n        success: false, durationMs: Date.now() - start, timestamp: Date.now(),\n        error: (err as Error).message,\n      });\n      throw err;\n    }\n  }\n\n  /** Get the spending guard for audit access */\n  getGuard(): SpendingGuard | undefined {\n    return this.guard;\n  }\n\n  /**\n   * v0.25 — Read the agent's Celo Agent Visa status. Returns `undefined` if\n   * Celo is not configured. Use `agentAddress` override when running a\n   * facilitator that pays for multiple agents.\n   */\n  async getCeloVisaStatus(agentAddress?: Address): Promise<import('./types.js').AgentVisaState | undefined> {\n    if (!this.celoVisaTracker || !this.celoNetwork) return undefined;\n    const addr = agentAddress ?? (this.wallet.getAccount()?.address as Address | undefined);\n    if (!addr) return undefined;\n    return this.celoVisaTracker.getStatus(addr, this.celoNetwork);\n  }\n\n  /** Graceful shutdown — flushes any open proxy adapter resources (e.g. SpaceRouter receipts). */\n  async close(): Promise<void> {\n    for (const p of this.proxyAdapters) {\n      if (p.close) await p.close();\n    }\n  }\n\n  /**\n   * Create an MPP Session client for high-frequency off-chain micropayments via the\n   * one-way-channel Soroban contract. Channel must already be deployed and pre-funded.\n   */\n  createStellarSession(config: StellarSessionClientConfig): StellarSessionClient {\n    return new StellarSessionClient(config);\n  }\n\n  /** Extract payment amount from a 402 challenge response (best-effort). */\n  private extractChallengeAmount(response: Response): bigint {\n    try {\n      const header = response.headers.get('payment-required') ?? '';\n      if (!header) return 0n;\n      const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n      const amount = decoded.accepts?.[0]?.maxAmountRequired;\n      return amount ? BigInt(amount) : 0n;\n    } catch {\n      return 0n;\n    }\n  }\n\n  /** Extract facilitator URL from a 402 challenge (best-effort). */\n  private extractFacilitator(response: Response): string | undefined {\n    try {\n      const header = response.headers.get('payment-required') ?? '';\n      if (!header) return undefined;\n      const decoded = JSON.parse(Buffer.from(header, 'base64').toString());\n      return decoded.accepts?.[0]?.facilitator ?? undefined;\n    } catch {\n      return undefined;\n    }\n  }\n}\n\nexport function createPaymentClient(config: NPaymentConfig): PaymentClient {\n  return new PaymentClient(config);\n}\n\n/**\n * v0.25 — Best-effort USD-amount converter for the Agent Visa volume\n * tracker. Celo's USDC/USDT use 6 decimals and USDm uses 18 decimals; we\n * default to 6-dec scaling (matches every chain in the SDK that emits a\n * `maxAmountRequired` field). Returns 0 for non-Celo chains so the tracker\n * can be called unconditionally.\n */\nfunction chainKeyAmountToUsd(chainKey: string, amount: bigint): number {\n  if (chainKey !== 'celo-mainnet' && chainKey !== 'celo-sepolia') return 0;\n  // Default: 6-dec USDC/USDT; integrators using USDm (18-dec) will overcount\n  // by 1e12 — they should pass `policy.maxPerTransaction` accordingly. The\n  // tier math caps at $15K so the worst-case error is bounded.\n  return Number(amount) / 1_000_000;\n}\n","import { CHAINS } from './chains.js';\nimport type { PaywallConfig, PaywallRouteConfig } from './types.js';\nimport { buildFlareX402Challenge, decodeFlareX402Header, verifyAndSettleFlareX402 } from './flare/x402.js';\nimport {\n  decodePaymentSignatureHeader,\n  defaultFacilitatorUrl,\n  encodePaymentRequiredHeader,\n  encodePaymentResponseHeader,\n  XrplFacilitatorClient,\n  type XrplPaymentRequirements,\n} from './xrpl/x402-scheme.js';\nimport { getRlusdIssuer, parseCaip2, RLUSD_HEX, DEFAULT_SOURCE_TAG, type XrplNetwork } from './xrpl/utils.js';\nimport { XrplConnection } from './xrpl/connection.js';\nimport { XrplWallet } from './xrpl/wallet.js';\nimport { ensureTrustline } from './xrpl/payments.js';\nimport { NPaymentError } from './errors.js';\nimport type { Address, PublicClient, WalletClient } from 'viem';\n\ntype Req = { method: string; path: string; headers: Record<string, any>; hostname?: string };\ntype Res = { status(code: number): Res; json(body: any): void; setHeader(name: string, value: string): void };\ntype Next = () => void;\n\n/**\n * v0.19: Optional Flare merchant settle deps. Inject via the second arg to\n * createPaywall when any route has `flare: {…}`. Kept off the PaywallConfig\n * surface to avoid forcing viem on consumers who do not use Flare.\n */\nexport interface FlareMerchantDeps {\n  publicClient: PublicClient;\n  walletClient: WalletClient;\n}\n\n/**\n * Express middleware that returns dual 402 challenges (x402 + MPP)\n * and verifies payment headers from either protocol.\n *\n * When mppx is installed, uses mppx/server for proper MPP credential verification.\n * Otherwise falls back to header-presence check.\n */\nexport function createPaywall(config: PaywallConfig, flareDeps?: FlareMerchantDeps) {\n  // v0.29: Build the optional merchant XRPL signer once. Mirrors XrplWallet's\n  // dual-mode (raw seed | OWS-managed key). When neither is set, the paywall\n  // runs in fail-fast mode and any RLUSD route with a missing trustline 503s.\n  const xrplMerchantWallet: XrplWallet | undefined = (config.xrpl?.seed || config.xrpl?.owsWallet)\n    ? new XrplWallet({ seed: config.xrpl.seed, owsWallet: config.xrpl.owsWallet })\n    : undefined;\n\n  return (req: Req, res: Res, next: Next) => {\n    const routeKey = `${req.method} ${req.path}`;\n    const route = config.routes[routeKey];\n    if (!route) return next();\n\n    // ── v0.19: Flare x402 (on-chain X402Facilitator) — handle first because the\n    //          buyer header is `x-payment`, which is *also* used by other rails. ─\n    if (route.flare) {\n      const xPayment = req.headers['x-payment'] as string | undefined;\n      if (xPayment) {\n        if (!flareDeps) {\n          res.status(500).json({ error: 'Flare merchant deps missing — pass flareDeps to createPaywall' });\n          return;\n        }\n        const payload = (() => {\n          try { return decodeFlareX402Header(xPayment); }\n          catch (err) { res.status(402).json({ error: (err as Error).message }); return null; }\n        })();\n        if (!payload) return;\n        if (BigInt(payload.value) < BigInt(route.price)) {\n          res.status(402).json({ error: 'Insufficient payment', required: route.price, received: payload.value });\n          return;\n        }\n        verifyAndSettleFlareX402({\n          publicClient: flareDeps.publicClient,\n          walletClient: flareDeps.walletClient,\n          facilitatorAddress: route.flare.facilitatorAddress as Address,\n          payload,\n        })\n          .then((settle) => {\n            res.setHeader(\n              'x-payment-response',\n              Buffer.from(\n                JSON.stringify({\n                  paymentId: settle.paymentId,\n                  transactionHash: settle.transactionHash,\n                  settled: true,\n                }),\n              ).toString('base64'),\n            );\n            next();\n          })\n          .catch((err: Error) => {\n            res.status(402).json({ error: 'Flare verification/settlement failed', message: err.message });\n          });\n        return;\n      }\n      // No payment yet — render Flare-flavoured 402 challenge.\n      const flareCfg = route.flare;\n      const challenge = buildFlareX402Challenge({\n        price: route.price,\n        payTo: flareCfg.payTo,\n        asset: flareCfg.asset,\n        facilitatorAddress: flareCfg.facilitatorAddress,\n        network: flareCfg.network,\n        chainId: flareCfg.chainId,\n        resource: req.path,\n        description: route.description,\n      });\n      res.setHeader('payment-required', challenge);\n      res.status(402).json({ error: 'Payment required', protocols: ['flare-x402'] });\n      return;\n    }\n\n    // ── v0.28: XRPL x402 (T54 canonical) — owns the request when route.xrpl is set ─\n    if (route.xrpl) {\n      handleXrplRoute(req, res, next, route, xrplMerchantWallet);\n      return;\n    }\n\n    // ── Check x402 payment ──────────────────────────────────────────────\n    if ((req.headers['payment-signature'] || req.headers['x-payment-tx']) && route.x402) {\n      // Verify payment via facilitator if configured\n      const facilitatorUrl = route.x402.facilitator ?? config.facilitator;\n      if (facilitatorUrl) {\n        verifyX402Payment(facilitatorUrl, req.headers, route).then((valid) => {\n          if (valid) return next();\n          res.status(402).json({ error: 'Payment verification failed' });\n        }).catch(() => {\n          res.status(402).json({ error: 'Payment verification unavailable' });\n        });\n        return;\n      }\n      // No facilitator configured — pass through (dev mode)\n      return next();\n    }\n\n    // ── Check MPP payment (Authorization: Payment <credential>) ─────────\n    const authHeader = req.headers['authorization'] as string | undefined;\n    if (authHeader?.startsWith('Payment ') && route.mpp) {\n      return next();\n    }\n\n    // ── Check Morph payment (x402-compatible, identified by Morph CAIP-2) ─\n    const paymentNetwork = req.headers['x-payment-network'];\n    if (req.headers['x-payment-tx'] && route.morph &&\n        (paymentNetwork === 'eip155:2818' || paymentNetwork === 'eip155:2910')) {\n      return next();\n    }\n\n    // ── No payment — return 402 with BOTH challenges ────────────────────\n    if (route.x402 && !route.morph) {\n      const network = route.x402.network ?? 'eip155:84532';\n      const asset = route.x402.asset ?? CHAINS['base-sepolia'].tokens.USDC;\n      const challenge = Buffer.from(JSON.stringify({\n        x402Version: 2,\n        accepts: [{ scheme: 'exact', network, maxAmountRequired: route.price, asset, payTo: route.x402.payTo }],\n      })).toString('base64');\n      res.setHeader('payment-required', challenge);\n    }\n\n    if (route.morph) {\n      const network = route.morph.network ?? 'eip155:2818';\n      const asset = route.morph.asset ?? CHAINS['morph-mainnet'].tokens.USDC;\n      const scheme = route.morph.scheme ?? 'exact';\n      const challenge = Buffer.from(JSON.stringify({\n        x402Version: 2,\n        accepts: [{ scheme, network, maxAmountRequired: route.price, asset, payTo: route.morph.payTo }],\n      })).toString('base64');\n      res.setHeader('payment-required', challenge);\n    }\n\n    if (route.mpp) {\n      const recipient = route.mpp.recipient ?? config.mpp?.recipient ?? '';\n      const currency = route.mpp.currency ?? config.mpp?.currency ?? '0x20c0000000000000000000000000000000000000';\n      // MPP challenge format per mppx spec: WWW-Authenticate header with Payment scheme\n      res.setHeader(\n        'www-authenticate',\n        `Payment realm=\"${req.hostname ?? 'api'}\", method=\"tempo\", intent=\"charge\", currency=\"${currency}\", amount=\"${route.price}\", recipient=\"${recipient}\"`,\n      );\n    }\n\n    const protocols = [route.x402 && !route.morph && 'x402', route.mpp && 'mpp', route.morph && 'morph-x402'].filter(Boolean);\n    res.status(402).json({ error: 'Payment required', protocols });\n  };\n}\n\n/**\n * Creates an MPP-only Express middleware using mppx/express directly.\n * Use this when you want proper on-chain verification of MPP credentials.\n *\n * @example\n * ```ts\n * import { createMppPaywall } from 'n-payment';\n * const mppMiddleware = await createMppPaywall({\n *   currency: '0x20c0000000000000000000000000000000000000',\n *   recipient: '0xYourAddress',\n * });\n * app.get('/api/data', mppMiddleware.charge({ amount: '0.01' }), handler);\n * ```\n */\nexport async function createMppPaywall(config: { currency: string; recipient: string; realm?: string }) {\n  const { Mppx, tempo } = await import('mppx/express' as any);\n  return Mppx.create({\n    ...(config.realm && { realm: config.realm }),\n    methods: [tempo({ currency: config.currency, recipient: config.recipient })],\n  });\n}\n\n// ─── v0.28: XRPL x402 (T54 canonical) merchant handler ──────────────────────\n\n/**\n * Per-process invoice cache. Maps invoiceId → { route, expiresAt, consumed }.\n * Replace with Redis / SQLite for prod via the v0.28 idempotency-store interface.\n */\ninterface XrplInvoiceRecord {\n  routeKey: string;\n  expiresAt: number;\n  consumed: boolean;\n}\nconst xrplInvoices = new Map<string, XrplInvoiceRecord>();\nconst XRPL_INVOICE_TTL_MS = 10 * 60 * 1000; // 10 minutes — the spec's maxTimeoutSeconds default.\n\n/**\n * Test/operational helper — purge the in-memory invoice cache.\n * Public so harnesses can guarantee determinism across runs.\n */\nexport function clearXrplInvoiceCache(): void {\n  xrplInvoices.clear();\n}\n\n/** Cached facilitator clients keyed by URL — avoids re-allocating per request. */\nconst xrplFacilitators = new Map<string, XrplFacilitatorClient>();\nfunction getFacilitator(url: string): XrplFacilitatorClient {\n  let c = xrplFacilitators.get(url);\n  if (!c) {\n    c = new XrplFacilitatorClient(url);\n    xrplFacilitators.set(url, c);\n  }\n  return c;\n}\n\n/**\n * Per-process XRPL connection cache (one per network). Created lazily on\n * first RLUSD trustline preflight; reused across requests. Avoids opening\n * a fresh WebSocket on every paid call.\n */\nconst xrplConnectionsByNet = new Map<XrplNetwork, XrplConnection>();\nfunction getXrplConnection(network: XrplNetwork): XrplConnection {\n  let c = xrplConnectionsByNet.get(network);\n  if (!c) {\n    c = new XrplConnection(network === 'mainnet' ? 'xrpl-mainnet' : 'xrpl-testnet');\n    xrplConnectionsByNet.set(network, c);\n  }\n  return c;\n}\n\n/** Test/operational helper — clear connection cache (and disconnect each). */\nexport function clearXrplConnectionCache(): void {\n  for (const c of xrplConnectionsByNet.values()) void c.disconnect().catch(() => {});\n  xrplConnectionsByNet.clear();\n}\n\n/**\n * Build the canonical PAYMENT-REQUIRED challenge from a route + a freshly\n * minted invoiceId. Returns the encoded header value.\n */\nfunction buildXrplChallenge(\n  route: PaywallRouteConfig,\n  invoiceId: string,\n): string {\n  const cfg = route.xrpl!;\n  const network = cfg.network ?? 'xrpl:1';\n  const xrplNet = parseCaip2(network);\n  const assetSymbol = cfg.asset ?? 'RLUSD';\n  const requirements: XrplPaymentRequirements = {\n    scheme: 'exact',\n    network,\n    asset: assetSymbol === 'RLUSD' ? RLUSD_HEX : 'XRP',\n    payTo: cfg.payTo,\n    amount: route.price,\n    maxTimeoutSeconds: 600,\n    extra: {\n      sourceTag: cfg.sourceTag ?? DEFAULT_SOURCE_TAG,\n      invoiceId,\n    },\n  };\n  if (assetSymbol === 'RLUSD') {\n    requirements.extra.issuer = getRlusdIssuer(xrplNet);\n  }\n  return encodePaymentRequiredHeader({ x402Version: 2, accepts: [requirements] });\n}\n\n/**\n * Owns the request when `route.xrpl` is set. Two paths:\n *\n *   1. PAYMENT-SIGNATURE header present → decode → check invoice cache →\n *      facilitator.verify → facilitator.settle → set PAYMENT-RESPONSE → next().\n *   2. No header → mint invoiceId → emit PAYMENT-REQUIRED → 402.\n *\n * Both paths first run a merchant-trustline preflight (cache-hit ~ free) so\n * an RLUSD route never advertises a destination that cannot receive the IOU.\n *\n * Errors short-circuit to 402/503 with `{ error, reason }` so buyers can retry.\n */\nfunction handleXrplRoute(req: Req, res: Res, next: Next, route: PaywallRouteConfig, signer?: XrplWallet): void {\n  void runXrplRoute(req, res, next, route, signer).catch((err) => {\n    // Last-resort safety net — preflight + settle paths catch their own errors.\n    if (typeof (res as { headersSent?: boolean }).headersSent === 'boolean'\n        && (res as { headersSent?: boolean }).headersSent) return;\n    res.status(500).json({ error: 'Internal xrpl handler error', reason: (err as Error).message });\n  });\n}\n\nasync function runXrplRoute(\n  req: Req,\n  res: Res,\n  next: Next,\n  route: PaywallRouteConfig,\n  signer?: XrplWallet,\n): Promise<void> {\n  const cfg = route.xrpl!;\n  const xrplNet = parseCaip2(cfg.network ?? 'xrpl:1');\n  const assetSymbol = cfg.asset ?? 'RLUSD';\n\n  // ── Merchant trustline preflight (RLUSD only — XRP needs no trustline). ─\n  if (assetSymbol === 'RLUSD') {\n    const issuer = getRlusdIssuer(xrplNet);\n    let state;\n    try {\n      state = await ensureTrustline(getXrplConnection(xrplNet), {\n        address: cfg.payTo,\n        issuer,\n        signer,\n      });\n    } catch (err) {\n      const e = err as NPaymentError;\n      res.status(503).json({\n        error: e.code ?? 'XRPL_MERCHANT_TRUSTLINE_FAILED',\n        reason: e.message,\n        hint: e.hint,\n      });\n      return;\n    }\n    if (!state.ok) {\n      res.status(503).json({\n        error: 'XRPL_MERCHANT_NO_TRUSTLINE',\n        reason: state.reason,\n        hint: signer\n          ? 'Trustline auto-create failed; verify the configured xrpl.seed has XRP for the reserve.'\n          : 'Set xrpl.seed (or xrpl.owsWallet) on createPaywall, OR pre-create the trustline manually.',\n      });\n      return;\n    }\n  }\n\n  const sigHeader =\n    (req.headers['payment-signature'] as string | undefined) ??\n    (req.headers['PAYMENT-SIGNATURE'] as string | undefined);\n\n  // Path 1: settlement attempt.\n  if (sigHeader) {\n    await settleXrplPayment(req, res, next, route, sigHeader);\n    return;\n  }\n\n  // Path 2: emit canonical PAYMENT-REQUIRED challenge.\n  const invoiceId = cfg.invoiceId ?? randomInvoiceId();\n  const routeKey = `${req.method} ${req.path}`;\n  xrplInvoices.set(invoiceId, {\n    routeKey,\n    expiresAt: Date.now() + XRPL_INVOICE_TTL_MS,\n    consumed: false,\n  });\n  const challenge = buildXrplChallenge(route, invoiceId);\n  res.setHeader('PAYMENT-REQUIRED', challenge);\n  res.status(402).json({\n    error: 'Payment required',\n    protocols: ['xrpl-x402'],\n    description: cfg.description ?? route.description,\n    invoiceId,\n  });\n}\n\nasync function settleXrplPayment(\n  req: Req,\n  res: Res,\n  next: Next,\n  route: PaywallRouteConfig,\n  sigHeader: string,\n): Promise<void> {\n  const cfg = route.xrpl!;\n  const xrplNet = parseCaip2(cfg.network ?? 'xrpl:1');\n  const facilitatorUrl = cfg.facilitatorUrl ?? defaultFacilitatorUrl(xrplNet);\n\n  // 1. Decode the buyer's PAYMENT-SIGNATURE.\n  let envelope;\n  try {\n    envelope = decodePaymentSignatureHeader(sigHeader);\n  } catch (err) {\n    res.status(402).json({ error: 'invalid_signature', reason: (err as NPaymentError).message });\n    return;\n  }\n  const accepted = envelope.accepted;\n\n  // 2. Bind to outstanding invoice — the buyer echoes the same invoiceId\n  //    we issued in the challenge. Reject unknown / consumed / expired.\n  const invoice = xrplInvoices.get(accepted.extra.invoiceId);\n  if (!invoice) {\n    res.status(402).json({ error: 'unknown_invoice' });\n    return;\n  }\n  if (invoice.consumed) {\n    res.status(402).json({ error: 'invoice_already_consumed' });\n    return;\n  }\n  if (invoice.expiresAt < Date.now()) {\n    xrplInvoices.delete(accepted.extra.invoiceId);\n    res.status(402).json({ error: 'invoice_expired' });\n    return;\n  }\n  if (invoice.routeKey !== `${req.method} ${req.path}`) {\n    res.status(402).json({ error: 'invoice_route_mismatch' });\n    return;\n  }\n  // Cheap shape sanity — payTo / amount / network / asset must echo the\n  // route's challenge contract before we burn a facilitator round-trip.\n  const expectedAsset = (cfg.asset ?? 'RLUSD') === 'RLUSD' ? RLUSD_HEX : 'XRP';\n  if (\n    accepted.payTo !== cfg.payTo ||\n    accepted.amount !== route.price ||\n    accepted.network !== (cfg.network ?? 'xrpl:1') ||\n    accepted.asset !== expectedAsset\n  ) {\n    res.status(402).json({ error: 'requirements_mismatch' });\n    return;\n  }\n\n  // 3. Facilitator: verify, then settle.\n  const fac = getFacilitator(facilitatorUrl);\n  let v;\n  try {\n    v = await fac.verify({ paymentPayload: envelope, paymentRequirements: accepted });\n  } catch (err) {\n    res.status(402).json({ error: 'verify_failed', reason: (err as NPaymentError).message });\n    return;\n  }\n  if (!v.isValid) {\n    res.status(402).json({ error: 'verify_invalid', reason: v.invalidReason });\n    return;\n  }\n\n  let s;\n  try {\n    s = await fac.settle({ paymentPayload: envelope, paymentRequirements: accepted });\n  } catch (err) {\n    res.status(402).json({ error: 'settle_failed', reason: (err as NPaymentError).message });\n    return;\n  }\n  if (!s.success) {\n    res.status(402).json({ error: 'settle_invalid', reason: s.errorReason });\n    return;\n  }\n\n  // 4. Mark consumed + emit PAYMENT-RESPONSE then hand off to the route.\n  invoice.consumed = true;\n  res.setHeader(\n    'PAYMENT-RESPONSE',\n    encodePaymentResponseHeader({\n      success: true,\n      transaction: s.transaction,\n      network: accepted.network,\n      payer: s.payer ?? v.payer,\n    }),\n  );\n  next();\n}\n\n/** UUIDv4-style invoice id (no extra dep — uses crypto.getRandomValues). */\nfunction randomInvoiceId(): string {\n  const bytes = new Uint8Array(16);\n  crypto.getRandomValues(bytes);\n  bytes[6] = (bytes[6] & 0x0f) | 0x40;\n  bytes[8] = (bytes[8] & 0x3f) | 0x80;\n  const hex: string[] = [];\n  for (const b of bytes) hex.push(b.toString(16).padStart(2, '0'));\n  return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10, 16).join('')}`;\n}\n\n/**\n * Health endpoint that returns pricing info for all configured routes.\n */\nexport function createHealthEndpoint(config: PaywallConfig) {  return (_req: Req, res: Res) => {\n    const routes = Object.entries(config.routes).map(([route, cfg]) => ({\n      route,\n      price: cfg.price,\n      description: cfg.description,\n      protocols: [cfg.x402 && !cfg.morph && 'x402', cfg.mpp && 'mpp', cfg.morph && 'morph-x402'].filter(Boolean),\n    }));\n    res.status(200).json({ status: 'ok', routes });\n  };\n}\n\n/** Verify x402 payment signature via facilitator /verify endpoint. */\nasync function verifyX402Payment(\n  facilitatorUrl: string,\n  headers: Record<string, any>,\n  route: PaywallRouteConfig,\n): Promise<boolean> {\n  try {\n    const res = await fetch(`${facilitatorUrl}/verify`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        paymentSignature: headers['payment-signature'],\n        paymentTx: headers['x-payment-tx'],\n        payTo: route.x402?.payTo,\n        maxAmountRequired: route.price,\n        network: route.x402?.network ?? 'eip155:84532',\n      }),\n    });\n    return res.ok;\n  } catch {\n    return false;\n  }\n}\n\n// ─── v0.22 — RLUSD self-verification (PRD-D Primitive A & B) ────────────────\n\n/** ERC-20 Transfer event topic0: keccak256('Transfer(address,address,uint256)'). */\nconst ERC20_TRANSFER_TOPIC =\n  '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\nconst ZERO_ADDRESS_TOPIC =\n  '0x0000000000000000000000000000000000000000000000000000000000000000';\n\n/** Idempotency: in-memory cache of consumed tx hashes. Replace with Redis / SQLite for prod. */\nconst idempotencyCache = new Set<string>();\n\n/** Decode an indexed-address topic to a lowercased 0x... string. */\nfunction decodeAddressTopic(topic: string): string {\n  return ('0x' + topic.slice(-40)).toLowerCase();\n}\n\n/**\n * Decode the X-PAYMENT base64 envelope into a strictly-typed payload.\n * Returns null if shape is invalid — callers respond with 402.\n */\nexport function decodeRlusdExactPayment(headerVal: string): {\n  scheme: 'exact';\n  network: string;\n  txHash: string;\n  from: string;\n  to: string;\n  value: string;\n  asset: string;\n} | null {\n  try {\n    const decoded = JSON.parse(Buffer.from(headerVal, 'base64').toString());\n    if (decoded.scheme !== 'exact' || typeof decoded.txHash !== 'string') return null;\n    return decoded;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Self-verify a `scheme: 'exact'` RLUSD payment via on-chain Transfer log.\n * No facilitator dependency. Caller passes a viem-shape PublicClient that\n * supports getTransactionReceipt + getBlockNumber.\n *\n * SOLID — DIP: depends on a minimal viem-style interface, not the concrete\n * viem package, so callers can inject ethers/etherjs/web3.js shims.\n */\nexport interface RlusdRpcClient {\n  getTransactionReceipt(args: { hash: `0x${string}` }): Promise<{\n    status: 'success' | 'reverted' | number;\n    blockNumber: bigint;\n    logs: Array<{ address: string; topics: readonly string[]; data: string }>;\n  } | null>;\n  getBlockNumber(): Promise<bigint>;\n}\n\nexport interface VerifyRlusdExactInput {\n  headerVal: string;\n  expectedAsset: `0x${string}`;\n  expectedTo: `0x${string}`;\n  expectedMinValue: bigint;\n  rpc: RlusdRpcClient;\n  /** Max block age allowed for replay protection. Default 1000. */\n  maxBlockAge?: bigint;\n}\n\nexport type VerifyRlusdResult =\n  | { ok: true; txHash: string }\n  | { ok: false; reason: string };\n\nexport async function verifyExactRlusdPayment(\n  input: VerifyRlusdExactInput,\n): Promise<VerifyRlusdResult> {\n  const payload = decodeRlusdExactPayment(input.headerVal);\n  if (!payload) return { ok: false, reason: 'invalid-header' };\n\n  const txHash = payload.txHash as `0x${string}`;\n  if (idempotencyCache.has(txHash)) return { ok: false, reason: 'tx-already-consumed' };\n\n  const receipt = await input.rpc.getTransactionReceipt({ hash: txHash });\n  if (!receipt) return { ok: false, reason: 'tx-not-confirmed' };\n  const status = receipt.status;\n  const ok = status === 'success' || status === 1;\n  if (!ok) return { ok: false, reason: 'tx-reverted' };\n\n  // Recency: tx must be in last N blocks (replay window protection).\n  const tip = await input.rpc.getBlockNumber();\n  const ageLimit = input.maxBlockAge ?? 1000n;\n  if (tip - receipt.blockNumber > ageLimit) return { ok: false, reason: 'tx-too-old' };\n\n  // Match: ERC-20 Transfer(from=<any>, to=expectedTo, value≥expectedMinValue) on expectedAsset.\n  const transferLog = receipt.logs.find(\n    (l) =>\n      l.address.toLowerCase() === input.expectedAsset.toLowerCase() &&\n      l.topics[0] === ERC20_TRANSFER_TOPIC &&\n      l.topics.length === 3 &&\n      decodeAddressTopic(l.topics[2]!) === input.expectedTo.toLowerCase() &&\n      BigInt(l.data) >= input.expectedMinValue,\n  );\n  if (!transferLog) return { ok: false, reason: 'transfer-log-missing-or-mismatch' };\n\n  idempotencyCache.add(txHash);\n  return { ok: true, txHash };\n}\n\n/**\n * Self-verify a `wormhole-ntt-transfer` payment by reading the dest-chain mint\n * event (PRD-D Primitive B). The NTT redemption mint to the merchant IS the proof.\n */\nexport interface VerifyWormholeNttInput {\n  headerVal: string;\n  /** RLUSD ERC-20 on the destination chain. */\n  expectedAsset: `0x${string}`;\n  expectedTo: `0x${string}`;\n  expectedMinValue: bigint;\n  rpc: RlusdRpcClient;\n  maxBlockAge?: bigint;\n}\n\nexport async function verifyWormholeNttPayment(\n  input: VerifyWormholeNttInput,\n): Promise<VerifyRlusdResult> {\n  let payload: { scheme: string; destTxHash?: string; destNetwork?: string };\n  try {\n    payload = JSON.parse(Buffer.from(input.headerVal, 'base64').toString());\n  } catch {\n    return { ok: false, reason: 'invalid-header' };\n  }\n  if (payload.scheme !== 'wormhole-ntt-transfer' || !payload.destTxHash) {\n    return { ok: false, reason: 'wrong-scheme-or-missing-dest-tx' };\n  }\n  const destTxHash = payload.destTxHash as `0x${string}`;\n  if (idempotencyCache.has(destTxHash)) return { ok: false, reason: 'tx-already-consumed' };\n\n  const receipt = await input.rpc.getTransactionReceipt({ hash: destTxHash });\n  if (!receipt) return { ok: false, reason: 'dest-tx-not-confirmed' };\n  const ok = receipt.status === 'success' || receipt.status === 1;\n  if (!ok) return { ok: false, reason: 'dest-tx-reverted' };\n\n  const tip = await input.rpc.getBlockNumber();\n  const ageLimit = input.maxBlockAge ?? 1000n;\n  if (tip - receipt.blockNumber > ageLimit) return { ok: false, reason: 'tx-too-old' };\n\n  // NTT redemption: ERC-20 Transfer(from=0x0, to=merchant, value≥expectedMinValue) — i.e. mint.\n  const mintLog = receipt.logs.find(\n    (l) =>\n      l.address.toLowerCase() === input.expectedAsset.toLowerCase() &&\n      l.topics[0] === ERC20_TRANSFER_TOPIC &&\n      l.topics.length === 3 &&\n      l.topics[1] === ZERO_ADDRESS_TOPIC &&\n      decodeAddressTopic(l.topics[2]!) === input.expectedTo.toLowerCase() &&\n      BigInt(l.data) >= input.expectedMinValue,\n  );\n  if (!mintLog) return { ok: false, reason: 'redemption-log-missing-or-mismatch' };\n\n  idempotencyCache.add(destTxHash);\n  return { ok: true, txHash: destTxHash };\n}\n\n/** Test-only utility — clears the in-memory idempotency cache between vitest runs. */\nexport function _clearRlusdIdempotencyCache(): void {\n  idempotencyCache.clear();\n}\n","import type { Hex, Address } from 'viem';\nimport type { OWSWallet } from '../ows/wallet.js';\n\nexport const GOAT_IDENTITY_REGISTRY: Address = '0x8004A169FB4a3325136EB29fA0ceB6D2e539a432';\nexport const GOAT_REPUTATION_REGISTRY: Address = '0x8004BAa17C55a88189AE136b182e5fdA19dE9b63';\n\nconst ZERO_BYTES32 = '0x0000000000000000000000000000000000000000000000000000000000000000' as Hex;\n\nconst IDENTITY_ABI = [\n  {\n    name: 'register', type: 'function', stateMutability: 'nonpayable',\n    inputs: [{ name: 'agentURI', type: 'string' }],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n] as const;\n\nconst REPUTATION_ABI = [\n  {\n    name: 'giveFeedback', type: 'function', stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'agentId', type: 'uint256' }, { name: 'value', type: 'int256' },\n      { name: 'valueDecimals', type: 'uint8' }, { name: 'tag1', type: 'bytes32' },\n      { name: 'tag2', type: 'bytes32' }, { name: 'endpoint', type: 'string' },\n      { name: 'feedbackURI', type: 'string' }, { name: 'feedbackHash', type: 'bytes32' },\n    ],\n    outputs: [],\n  },\n  {\n    name: 'getSummary', type: 'function', stateMutability: 'view',\n    inputs: [\n      { name: 'agentId', type: 'uint256' }, { name: 'clientAddresses', type: 'address[]' },\n      { name: 'tag1', type: 'bytes32' }, { name: 'tag2', type: 'bytes32' },\n    ],\n    outputs: [{ name: '', type: 'tuple', components: [\n      { name: 'count', type: 'uint256' }, { name: 'sum', type: 'int256' },\n    ]}],\n  },\n] as const;\n\n/**\n * ERC-8004 agent identity + reputation on GOAT Network.\n * Uses OWSWallet for signing — no private key exposure.\n */\nexport class GoatIdentity {\n  private wallet: OWSWallet;\n  private rpcUrl: string;\n  private chainId: number;\n\n  constructor(wallet: OWSWallet, rpcUrl = 'https://rpc.goat.network', chainId = 2345) {\n    this.wallet = wallet;\n    this.rpcUrl = rpcUrl;\n    this.chainId = chainId;\n  }\n\n  async registerAgent(agentURI: string): Promise<Hex> {\n    const { encodeFunctionData } = await import('viem');\n    const data = encodeFunctionData({ abi: IDENTITY_ABI, functionName: 'register', args: [agentURI] });\n    const result = await this.wallet.signTransaction({ to: GOAT_IDENTITY_REGISTRY, data }, this.chainId);\n    return result.txHash as Hex;\n  }\n\n  async giveFeedback(agentId: bigint, value: number, endpoint: string): Promise<Hex> {\n    const { encodeFunctionData } = await import('viem');\n    const data = encodeFunctionData({\n      abi: REPUTATION_ABI, functionName: 'giveFeedback',\n      args: [agentId, BigInt(value), 2, ZERO_BYTES32, ZERO_BYTES32, endpoint, '', ZERO_BYTES32],\n    });\n    const result = await this.wallet.signTransaction({ to: GOAT_REPUTATION_REGISTRY, data }, this.chainId);\n    return result.txHash as Hex;\n  }\n\n  async getSummary(agentId: bigint): Promise<{ count: bigint; sum: bigint }> {\n    const { createPublicClient, http } = await import('viem');\n    const client = createPublicClient({ transport: http(this.rpcUrl) });\n    return client.readContract({\n      address: GOAT_REPUTATION_REGISTRY, abi: REPUTATION_ABI,\n      functionName: 'getSummary', args: [agentId, [], ZERO_BYTES32, ZERO_BYTES32],\n    }) as any;\n  }\n}\n","import type { BazaarResource } from '../types.js';\n\nexport const MOCK_CATALOG: BazaarResource[] = [\n  {\n    resource: 'http://localhost:4021/api/weather',\n    type: 'http',\n    description: 'Weather data for any city',\n    accepts: [{ scheme: 'exact', network: 'eip155:84532', asset: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', maxAmountRequired: '10000', payTo: '0x0000000000000000000000000000000000000001' }],\n  },\n  {\n    resource: 'http://localhost:4021/api/translate',\n    type: 'http',\n    description: 'Translate text between languages',\n    accepts: [{ scheme: 'exact', network: 'eip155:84532', asset: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', maxAmountRequired: '50000', payTo: '0x0000000000000000000000000000000000000001' }],\n  },\n  {\n    resource: 'http://localhost:4021/api/generate-image',\n    type: 'http',\n    description: 'Generate image from text prompt',\n    accepts: [{ scheme: 'exact', network: 'eip155:84532', asset: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', maxAmountRequired: '100000', payTo: '0x0000000000000000000000000000000000000001' }],\n  },\n];\n","import type { BazaarResource, BazaarSearchResult } from '../types.js';\nimport { MOCK_CATALOG } from './mock-catalog.js';\n\nexport interface BazaarClientConfig {\n  facilitatorUrl?: string;\n  mockCatalog?: boolean;\n}\n\nexport class BazaarClient {\n  private facilitatorUrl?: string;\n  private useMock: boolean;\n\n  constructor(config: BazaarClientConfig = {}) {\n    this.facilitatorUrl = config.facilitatorUrl;\n    this.useMock = config.mockCatalog ?? !config.facilitatorUrl;\n  }\n\n  async listServices(params?: { type?: 'http' | 'mcp' }): Promise<BazaarResource[]> {\n    if (this.useMock) {\n      const t = params?.type ?? 'http';\n      return MOCK_CATALOG.filter((r) => r.type === t);\n    }\n    const url = `${this.facilitatorUrl}/discovery/resources${params?.type ? `?type=${params.type}` : ''}`;\n    const res = await fetch(url);\n    if (!res.ok) throw new Error(`Bazaar API error: ${res.status}`);\n    const data = await res.json() as any;\n    return data.items ?? data;\n  }\n\n  async search(query: string): Promise<BazaarSearchResult> {\n    if (this.useMock) {\n      const q = query.toLowerCase();\n      const resources = MOCK_CATALOG.filter((r) =>\n        r.description?.toLowerCase().includes(q) || r.resource.toLowerCase().includes(q)\n      );\n      return { resources, total: resources.length };\n    }\n    const url = `${this.facilitatorUrl}/discovery/resources/search`;\n    const res = await fetch(url, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ query }),\n    });\n    if (!res.ok) throw new Error(`Bazaar search error: ${res.status}`);\n    return res.json() as Promise<BazaarSearchResult>;\n  }\n}\n\nexport function createBazaarClient(config?: BazaarClientConfig): BazaarClient {\n  return new BazaarClient(config);\n}\n","import type { OffRampAdapter, OffRampQuoteParams, OffRampQuote, OffRampWithdrawParams, OffRampReceipt } from '../types.js';\n\nexport class OffRampClient {\n  constructor(private adapter: OffRampAdapter) {}\n\n  get provider(): string { return this.adapter.provider; }\n\n  getSupportedCurrencies(): Promise<string[]> { return this.adapter.getSupportedCurrencies(); }\n  getQuote(params: OffRampQuoteParams): Promise<OffRampQuote> { return this.adapter.getQuote(params); }\n  withdraw(params: OffRampWithdrawParams): Promise<OffRampReceipt> { return this.adapter.withdraw(params); }\n}\n","import type { OffRampAdapter, OffRampQuoteParams, OffRampQuote, OffRampWithdrawParams, OffRampReceipt } from '../types.js';\n\nexport class MockMoonPayAdapter implements OffRampAdapter {\n  readonly provider = 'moonpay-mock';\n\n  async getSupportedCurrencies(): Promise<string[]> {\n    return ['USD', 'EUR', 'VND'];\n  }\n\n  async getQuote(params: OffRampQuoteParams): Promise<OffRampQuote> {\n    const feePercent = 0.5;\n    const amount = parseFloat(params.amount);\n    const fiatAmount = (amount * (1 - feePercent / 100)).toFixed(2);\n    return { fiatAmount, fiatCurrency: params.fiatCurrency, feePercent, estimatedDays: 2 };\n  }\n\n  async withdraw(params: OffRampWithdrawParams): Promise<OffRampReceipt> {\n    const amount = parseFloat(params.amount);\n    const fiatAmount = (amount * 0.995).toFixed(2);\n    const arrival = new Date(Date.now() + 2 * 86400000).toISOString();\n    return { id: `mock-${Date.now()}`, status: 'processing', fiatAmount, fiatCurrency: 'USD', estimatedArrival: arrival };\n  }\n}\n","import { NPaymentError } from '../errors.js';\n\n/**\n * v0.21 — Stellar brand-stablecoin registry.\n *\n * Single source of truth for the brand stables that coexist on Stellar today.\n * Curated set: USDC + EURC + MGUSD (MoneyGram, launched 2026-06-02). RLUSD and\n * PYUSD are deferred until verified Stellar issuers exist (avoids placeholder\n * drift across modules).\n *\n * Pattern matches v0.17 `goat.usdcOverride` — unverified issuer addresses ship\n * as placeholders behind an env override, never blocking the SDK at import time.\n *\n * Design (SOLID):\n *   - SRP — this module owns asset metadata + decimal helpers, nothing else.\n *   - OCP — additional brand stables added via PR (env override at runtime).\n *   - DIP — downstream (`session`, `asset-router`, `stellar-anchor`, `kya`)\n *           depend on `getStellarAsset` not on hard-coded issuer strings.\n */\n\nexport type StellarAssetSymbol = 'USDC' | 'EURC' | 'MGUSD';\n\nexport interface StellarAsset {\n  /** Canonical Stellar asset code (≤12 chars). */\n  code: StellarAssetSymbol;\n  /** Stellar G... issuer address (56 chars). May be placeholder pending publication. */\n  issuer: string;\n  /** Display symbol (= code in v0.21). */\n  symbol: string;\n  /** Stellar canonical decimals = 7. Carried explicitly for parse/format helpers. */\n  decimals: 7;\n  /** Brand owner (for routing heuristics + display). */\n  brand: 'circle' | 'circle-eur' | 'moneygram';\n  /** Underlying issuance infra (modular-stack thesis). */\n  infra: 'circle' | 'm0';\n  /** Whether the issuer address is verified or a placeholder pending publication. */\n  verified: boolean;\n  /** Optional Anchor Directory hint for SEP-24/31 lookup in `offramp/stellar-anchor`. */\n  anchorDirectoryEntry?: { home_domain: string; name: string };\n  /** Env-var key for runtime issuer rebinding (verified=true override path). */\n  envOverride?: string;\n}\n\n/**\n * Stellar's \"null account\" — 56-char base32 G-prefix shape, all-zero ed25519 pubkey.\n * Used as a placeholder until the real Bridge MGUSD issuer is published; downstream\n * code that calls Soroban will surface STELLAR_ASSET_PLACEHOLDER_ISSUER before any\n * on-chain interaction. Operators set STELLAR_MGUSD_ISSUER to override at runtime.\n */\nexport const MGUSD_ISSUER_PLACEHOLDER =\n  'GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHATTHEHELLOMGUSD'.slice(0, 56);\n\n/** Module-load-time map; env overrides re-resolved at call time in `getStellarAsset`. */\nexport const STELLAR_ASSETS: Record<StellarAssetSymbol, StellarAsset> = {\n  USDC: {\n    code: 'USDC',\n    issuer: 'GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN',\n    symbol: 'USDC',\n    decimals: 7,\n    brand: 'circle',\n    infra: 'circle',\n    verified: true,\n    anchorDirectoryEntry: { home_domain: 'circle.com', name: 'Circle' },\n  },\n  EURC: {\n    code: 'EURC',\n    issuer: 'GDHU6WRG4IEQXM5NZ4BMPKOXHW76MZM4Y2IEMFDVXBSDP6SJY4ITNPP2',\n    symbol: 'EURC',\n    decimals: 7,\n    brand: 'circle-eur',\n    infra: 'circle',\n    verified: true,\n    anchorDirectoryEntry: { home_domain: 'circle.com', name: 'Circle EURC' },\n  },\n  MGUSD: {\n    code: 'MGUSD',\n    issuer: MGUSD_ISSUER_PLACEHOLDER,\n    symbol: 'MGUSD',\n    decimals: 7,\n    brand: 'moneygram',\n    infra: 'm0',\n    verified: false,\n    anchorDirectoryEntry: { home_domain: 'moneygram.com', name: 'MoneyGram' },\n    envOverride: 'STELLAR_MGUSD_ISSUER',\n  },\n};\n\nexport const STELLAR_ASSET_SYMBOLS = Object.keys(STELLAR_ASSETS) as StellarAssetSymbol[];\n\n/**\n * Resolve an asset by symbol (case-insensitive). Re-reads env overrides at call time\n * so test isolation and runtime rebinding both work (no module-cache pinning).\n */\nexport function getStellarAsset(symbol: string): StellarAsset {\n  const upper = symbol.toUpperCase() as StellarAssetSymbol;\n  const asset = STELLAR_ASSETS[upper];\n  if (!asset) {\n    throw new NPaymentError(\n      `Unknown Stellar asset: ${symbol}`,\n      'STELLAR_ASSET_UNKNOWN',\n      `Known assets: ${STELLAR_ASSET_SYMBOLS.join(', ')}`,\n    );\n  }\n  if (asset.envOverride) {\n    const override = process.env[asset.envOverride];\n    if (override && override.length > 0) {\n      return { ...asset, issuer: override, verified: true };\n    }\n  }\n  return asset;\n}\n\n/** Warn-once helper for placeholder issuers — operators see exactly one line per asset per process. */\nconst _warned = new Set<string>();\nexport function assertVerifiedIssuer(asset: StellarAsset): void {\n  if (asset.verified) return;\n  if (_warned.has(asset.code)) return;\n  _warned.add(asset.code);\n  // Use console.warn so test runners can capture it without throwing.\n  // eslint-disable-next-line no-console\n  console.warn(\n    `[n-payment] STELLAR_ASSET_PLACEHOLDER_ISSUER: ${asset.code} issuer is a placeholder. ` +\n      `Set ${asset.envOverride ?? `STELLAR_${asset.code}_ISSUER`} env var with the verified issuer address.`,\n  );\n}\n\n/**\n * Parse a decimal display string (e.g. `'1.5'`) into base-unit bigint (e.g. `15_000_000n` for 7 decimals).\n * Truncates excess fractional digits (does not round) — matches v0.20 `parseSpace` semantics.\n */\nexport function parseStellarAsset(amount: string | number, symbol: string): bigint {\n  const asset = getStellarAsset(symbol);\n  const str = String(amount);\n  if (!/^\\d+(\\.\\d+)?$/.test(str)) {\n    throw new NPaymentError(\n      `Invalid amount for ${symbol}: ${str}`,\n      'STELLAR_ASSET_INVALID_AMOUNT',\n      `Expected decimal string with up to ${asset.decimals} decimals (e.g. '1.5').`,\n    );\n  }\n  const [whole, frac = ''] = str.split('.');\n  const padded = (frac + '0'.repeat(asset.decimals)).slice(0, asset.decimals);\n  return BigInt(whole) * 10n ** BigInt(asset.decimals) + BigInt(padded || '0');\n}\n\n/**\n * Format a base-unit bigint into a decimal display string. `displayDecimals` lets callers\n * truncate trailing zeros (e.g. `'1.50'` instead of `'1.5000000'`). Defaults to asset decimals.\n */\nexport function formatStellarAsset(\n  amount: bigint,\n  symbol: string,\n  displayDecimals?: number,\n): string {\n  const asset = getStellarAsset(symbol);\n  const dd = displayDecimals ?? asset.decimals;\n  const divisor = 10n ** BigInt(asset.decimals);\n  const whole = amount / divisor;\n  if (dd === 0) return whole.toString();\n  const frac = amount % divisor;\n  const fracStr = frac.toString().padStart(asset.decimals, '0').slice(0, dd);\n  return `${whole}.${fracStr}`;\n}\n","import { NPaymentError } from '../errors.js';\nimport type { StellarSigner } from '../stellar/signer.js';\nimport { assertVerifiedIssuer, getStellarAsset, type StellarAssetSymbol } from '../stellar/assets.js';\n\n/**\n * v0.21 → v0.30 — Stellar Anchor Directory off-ramp client (SEP-10 / SEP-24 / SEP-31 / SEP-38).\n *\n * v0.21: SEP-10 auth + SEP-24 interactive withdraw client, DIP-friendly registry.\n * v0.30: SEP-38 quote() + SEP-31 b2bPayout() + stellarAgentKit() facade + testnet flag\n *        surfaced through facade opts. Byte-identical additive at the public surface.\n *\n * v0.30 additionally closes two v0.28 audit carryovers as side-effects:\n *   - SF-1 (fire-and-forget fetches) — every fetch in this module now flows through\n *     fetchWithTimeout with an AbortController and configurable timeoutMs.\n *   - SF-6 (default-on verified issuer) — assertVerifiedIssuer is pre-flighted at\n *     the entry of every value-moving method (initiate, quote, b2bPayout).\n *\n * SOLID:\n *   - SRP — one method per SEP; sep10Auth remains the only auth path.\n *   - OCP — quote() and b2bPayout() extend the existing class without touching\n *           the SEP-24 initiate() body.\n *   - DIP — depends on AnchorRegistry + StellarSigner abstractions.\n *   - DRY — sep10Auth serves SEP-24, SEP-31, and SEP-38 identically.\n */\n\n// ─── Timeout-aware fetch helper (SF-1 closure) ──────────────────────────────\n\nconst DEFAULT_TIMEOUT_MS = 12_000;\n\n/**\n * Every fetch call in this module flows through this helper. Rejects with\n * NPaymentError('OFFRAMP_TIMEOUT', ...) when the anchor doesn't respond within\n * `ms`. Preserves any caller-supplied AbortSignal via signal composition.\n */\nasync function fetchWithTimeout(url: string, init: RequestInit = {}, ms: number = DEFAULT_TIMEOUT_MS): Promise<Response> {\n  const controller = new AbortController();\n  const external = init.signal;\n  if (external) {\n    if (external.aborted) controller.abort();\n    else external.addEventListener('abort', () => controller.abort(), { once: true });\n  }\n  const timer = setTimeout(() => controller.abort(), ms);\n  try {\n    return await fetch(url, { ...init, signal: controller.signal });\n  } catch (err) {\n    if ((err as Error | undefined)?.name === 'AbortError') {\n      let origin = url;\n      try { origin = new URL(url).origin; } catch { /* keep url */ }\n      throw new NPaymentError(\n        `Anchor request timed out after ${ms}ms: ${url}`,\n        'OFFRAMP_TIMEOUT',\n        `Increase input.timeoutMs (currently ${ms}) or check anchor health at ${origin}.`,\n      );\n    }\n    throw err;\n  } finally {\n    clearTimeout(timer);\n  }\n}\n\n// ─── Anchor descriptors ─────────────────────────────────────────────────────\n\nexport interface AnchorDescriptor {\n  /** Anchor home_domain (e.g. 'moneygram.com'). */\n  homeDomain: string;\n  /** Display name for UX surfacing. */\n  name: string;\n  /** Stellar brand stables this anchor accepts. */\n  supportedAssets: StellarAssetSymbol[];\n  /** Fiat currencies this anchor pays out (e.g. ['USD','MXN']). */\n  supportedFiat: string[];\n  /** ISO country codes the anchor serves. 'GLOBAL' = no jurisdiction restriction. */\n  supportedCountries: string[];\n  /** Service URLs hydrated lazily from `<home_domain>/.well-known/stellar.toml`. */\n  serviceUrls: AnchorServiceUrls;\n  /**\n   * v0.30 — Optional pre-computed corridor rows for LLM-prompt-friendly listing\n   * via stellarAgentKit().corridors(). Anchors without this fall back to a\n   * cartesian product of (supportedAssets × supportedFiat × supportedCountries).\n   */\n  supportedCorridors?: Array<{\n    from: StellarAssetSymbol;\n    to: string;            // ISO 4217 fiat code\n    countries: string[];   // ISO 3166-1 alpha-2, or ['GLOBAL']\n  }>;\n}\n\nexport interface AnchorServiceUrls {\n  transferServer?: string;       // SEP-24\n  transferServerSep31?: string;  // SEP-31 (DIRECT_PAYMENT_SERVER)\n  quoteServer?: string;          // v0.30 — SEP-38 (ANCHOR_QUOTE_SERVER)\n  webAuthEndpoint?: string;      // SEP-10\n  kycServer?: string;            // SEP-12\n}\n\nexport interface AnchorRegistry {\n  list(): Promise<AnchorDescriptor[]>;\n  byDomain(homeDomain: string): Promise<AnchorDescriptor | null>;\n  /** Filter to anchors that can off-ramp the given (asset, fiat, country) tuple. */\n  filter(asset: StellarAssetSymbol, fiat: string, country: string): Promise<AnchorDescriptor[]>;\n}\n\n/**\n * Default v0.30 anchor list. MoneyGram listed first so MGUSD/USDC → USD queries\n * naturally surface it. Service URLs hydrated lazily via stellar.toml.\n *\n * NOTE (2026-07-06 grounding, PRD §Background): moneygram.com/.well-known/stellar.toml\n * publishes validators only — real MoneyGram Access anchor endpoints are allowlisted\n * per-wallet after MoneyGram onboarding. Operators point the SDK at their assigned\n * host (mainnet: previewstellar.moneygram.com; testnet: sandbox host) via\n * STELLAR_ANCHOR_MONEYGRAM_COM_TOML_URL env override — handled by DefaultAnchorRegistry.\n *\n * supportedCountries=['GLOBAL'] reflects MoneyGram's documented 174-country off-ramp\n * corridor (per developer.moneygram.com/ramps).\n */\nconst DEFAULT_ANCHORS: AnchorDescriptor[] = [\n  {\n    homeDomain: 'moneygram.com',\n    name: 'MoneyGram Access',\n    supportedAssets: ['USDC', 'MGUSD'],\n    supportedFiat: ['USD', 'MXN', 'PHP', 'INR', 'NGN', 'EUR', 'GBP', 'BRL'],\n    supportedCountries: ['GLOBAL'],\n    serviceUrls: {},\n    supportedCorridors: [\n      { from: 'USDC', to: 'USD', countries: ['GLOBAL'] },\n      { from: 'MGUSD', to: 'USD', countries: ['GLOBAL'] },\n    ],\n  },\n  {\n    homeDomain: 'vibrantapp.com',\n    name: 'Vibrant',\n    supportedAssets: ['USDC', 'EURC'],\n    supportedFiat: ['USD', 'ARS', 'BRL'],\n    supportedCountries: ['AR', 'BR', 'US'],\n    serviceUrls: {},\n  },\n  {\n    homeDomain: 'lobstr.co',\n    name: 'LOBSTR',\n    supportedAssets: ['USDC', 'EURC'],\n    supportedFiat: ['USD', 'EUR'],\n    supportedCountries: ['EU'],\n    serviceUrls: {},\n  },\n];\n\nexport class DefaultAnchorRegistry implements AnchorRegistry {\n  private readonly defaults: AnchorDescriptor[];\n  private readonly custom: AnchorDescriptor[] = [];\n\n  constructor(defaults: AnchorDescriptor[] = DEFAULT_ANCHORS) {\n    // Deep-copy so external mutation can't poison the registry.\n    this.defaults = defaults.map((a) => ({\n      ...a,\n      serviceUrls: { ...a.serviceUrls },\n      supportedCorridors: a.supportedCorridors?.map((c) => ({ ...c, countries: [...c.countries] })),\n    }));\n  }\n\n  add(d: AnchorDescriptor): void {\n    this.custom.push({\n      ...d,\n      serviceUrls: { ...d.serviceUrls },\n      supportedCorridors: d.supportedCorridors?.map((c) => ({ ...c, countries: [...c.countries] })),\n    });\n  }\n\n  async list(): Promise<AnchorDescriptor[]> {\n    return [...this.defaults, ...this.custom];\n  }\n\n  async byDomain(homeDomain: string): Promise<AnchorDescriptor | null> {\n    const all = await this.list();\n    const found = all.find((a) => a.homeDomain === homeDomain) ?? null;\n    if (found) await this.hydrateServiceUrls(found);\n    return found;\n  }\n\n  async filter(\n    asset: StellarAssetSymbol,\n    fiat: string,\n    country: string,\n  ): Promise<AnchorDescriptor[]> {\n    const all = await this.list();\n    const matches = all.filter(\n      (a) =>\n        a.supportedAssets.includes(asset) &&\n        a.supportedFiat.includes(fiat) &&\n        (a.supportedCountries.includes(country) || a.supportedCountries.includes('GLOBAL')),\n    );\n    for (const m of matches) await this.hydrateServiceUrls(m);\n    return matches;\n  }\n\n  /** Fetch and parse `<home_domain>/.well-known/stellar.toml`. Idempotent — skips if hydrated. */\n  private async hydrateServiceUrls(a: AnchorDescriptor): Promise<void> {\n    if (a.serviceUrls.transferServer || a.serviceUrls.transferServerSep31) return;\n\n    const tomlUrl =\n      process.env[`STELLAR_ANCHOR_${a.homeDomain.replace(/\\./g, '_').toUpperCase()}_TOML_URL`] ??\n      `https://${a.homeDomain}/.well-known/stellar.toml`;\n\n    let toml: string;\n    try {\n      const res = await fetchWithTimeout(tomlUrl, {});\n      if (!res.ok) {\n        throw new NPaymentError(\n          `stellar.toml fetch failed for ${a.homeDomain}: ${res.status}`,\n          'ANCHOR_TOML_FETCH_FAILED',\n        );\n      }\n      toml = await res.text();\n    } catch (err) {\n      if (err instanceof NPaymentError) throw err;\n      throw new NPaymentError(\n        `stellar.toml fetch failed for ${a.homeDomain}: ${(err as Error).message}`,\n        'ANCHOR_TOML_FETCH_FAILED',\n      );\n    }\n\n    const get = (k: string): string | undefined => {\n      const m = toml.match(new RegExp(`^${k}\\\\s*=\\\\s*\"([^\"]+)\"`, 'm'));\n      return m?.[1];\n    };\n    a.serviceUrls.transferServer = get('TRANSFER_SERVER') ?? get('TRANSFER_SERVER_SEP0024');\n    a.serviceUrls.transferServerSep31 = get('DIRECT_PAYMENT_SERVER');\n    a.serviceUrls.quoteServer = get('ANCHOR_QUOTE_SERVER');\n    a.serviceUrls.webAuthEndpoint = get('WEB_AUTH_ENDPOINT');\n    a.serviceUrls.kycServer = get('KYC_SERVER');\n  }\n}\n\n// ─── OffRamp surface (SEP-24) ───────────────────────────────────────────────\n\nexport interface OffRampInitiateInput {\n  asset: StellarAssetSymbol;\n  amount: string;          // decimal display string\n  fiat: string;            // ISO code, e.g. 'USD'\n  country: string;         // ISO 3166-1 alpha-2\n  signer: StellarSigner;\n  /** Stellar mainnet (true) vs testnet (false). Default: true. */\n  isMainnet?: boolean;\n  /** Force a specific anchor by home_domain (skips filter). */\n  preferAnchor?: string;\n  /** v0.30 — per-request timeout in ms (default 12000). */\n  timeoutMs?: number;\n}\n\nexport interface OffRampHandle {\n  /** Anchor's transaction id (opaque). */\n  transactionId: string;\n  /** Anchor's hosted URL — open in browser/webview to complete KYC + payout instructions. */\n  moreInfoUrl: string;\n  /** Descriptor of the anchor used. */\n  anchor: AnchorDescriptor;\n  /** Poll the anchor's `/transaction` endpoint for the latest status. */\n  status(): Promise<{ status: string; updatedAt: string; statusEta?: number }>;\n}\n\n// ─── v0.30 — SEP-38 quote surface ───────────────────────────────────────────\n\nexport interface OffRampQuoteInput {\n  asset: StellarAssetSymbol;\n  amount: string;               // sell amount, decimal display\n  fiat: string;\n  country: string;\n  signer: StellarSigner;\n  isMainnet?: boolean;\n  preferAnchor?: string;\n  timeoutMs?: number;\n}\n\nexport interface OffRampQuoteResult {\n  /** Price of 1 unit asset expressed in fiat (decimal display). */\n  rate: string;\n  /** RFC-3339 timestamp after which the quote is no longer honored. */\n  expiresAt: string;\n  /** Fixed fee in asset units (decimal display), if any. */\n  feeFixed?: string;\n  /** Percent fee (decimal display), if any. */\n  feePercent?: string;\n  /** Opaque quote id — can be passed into b2bPayout via `quoteId`. */\n  quoteId?: string;\n  /** The anchor used. */\n  anchor: AnchorDescriptor;\n}\n\n// ─── v0.30 — SEP-31 b2bPayout surface ───────────────────────────────────────\n\nexport interface OffRampB2BInput {\n  asset: StellarAssetSymbol;\n  amount: string;\n  fiat: string;\n  country: string;\n  signer: StellarSigner;\n  isMainnet?: boolean;\n  preferAnchor?: string;\n  timeoutMs?: number;\n  /** Optional linkage to a prior SEP-38 quote (recommended for fee-locked flows). */\n  quoteId?: string;\n  /** Pre-registered SEP-12 receiver id. If absent, receiverInfoUrl is returned for out-of-band registration. */\n  receiverId?: string;\n  /** SEP-9 KYC fields the anchor requires (see anchor docs for exact set). */\n  fields?: Record<string, string>;\n}\n\nexport interface OffRampB2BHandle extends OffRampHandle {\n  /** Anchor-hosted URL for SEP-12 receiver registration when receiverId is absent or unrecognised. */\n  receiverInfoUrl: string;\n}\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class StellarAnchorClient {\n  constructor(private readonly registry: AnchorRegistry = new DefaultAnchorRegistry()) {}\n\n  /** Find anchors capable of (asset, fiat, country). */\n  async findAnchor(\n    asset: StellarAssetSymbol,\n    fiat: string,\n    country: string,\n  ): Promise<AnchorDescriptor[]> {\n    return this.registry.filter(asset, fiat, country);\n  }\n\n  /** Initiate an SEP-24 interactive withdraw and return a handle for status polling. */\n  async initiate(input: OffRampInitiateInput): Promise<OffRampHandle> {\n    // v0.30 — SF-6 closure: verified-issuer pre-flight before any value moves.\n    assertVerifiedIssuer(getStellarAsset(input.asset));\n\n    const anchor = await this.selectAnchor(input);\n    if (!anchor.serviceUrls.transferServer || !anchor.serviceUrls.webAuthEndpoint) {\n      throw new NPaymentError(\n        `Anchor ${anchor.name} stellar.toml missing TRANSFER_SERVER or WEB_AUTH_ENDPOINT`,\n        'ANCHOR_TOML_INCOMPLETE',\n        `Operator: set STELLAR_ANCHOR_${anchor.homeDomain.replace(/\\./g, '_').toUpperCase()}_TOML_URL or wait for the anchor to publish its .toml.`,\n      );\n    }\n\n    const timeoutMs = input.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n    const isMainnet = input.isMainnet ?? true;\n    const jwt = await this.sep10Auth(anchor, input.signer, isMainnet, timeoutMs);\n\n    const initRes = await fetchWithTimeout(\n      `${anchor.serviceUrls.transferServer}/transactions/withdraw/interactive`,\n      {\n        method: 'POST',\n        headers: { Authorization: `Bearer ${jwt}`, 'Content-Type': 'application/json' },\n        body: JSON.stringify({\n          asset_code: input.asset,\n          amount: input.amount,\n          account: input.signer.address,\n        }),\n      },\n      timeoutMs,\n    );\n    if (!initRes.ok) {\n      throw new NPaymentError(\n        `SEP-24 withdraw initiate failed: ${initRes.status} ${initRes.statusText}`,\n        'OFFRAMP_INITIATE_FAILED',\n      );\n    }\n    const data = (await initRes.json()) as { id: string; url: string };\n\n    return {\n      transactionId: data.id,\n      moreInfoUrl: data.url,\n      anchor,\n      status: () => this.pollStatus(anchor, jwt, data.id, timeoutMs),\n    };\n  }\n\n  /**\n   * v0.30 — SEP-38 pre-flight quote. Returns the anchor's current rate + fee\n   * + expiresAt + opaque quoteId that b2bPayout can reference.\n   */\n  async quote(input: OffRampQuoteInput): Promise<OffRampQuoteResult> {\n    assertVerifiedIssuer(getStellarAsset(input.asset));\n\n    const anchor = await this.selectAnchor(input);\n    if (!anchor.serviceUrls.quoteServer || !anchor.serviceUrls.webAuthEndpoint) {\n      throw new NPaymentError(\n        `Anchor ${anchor.name} does not publish ANCHOR_QUOTE_SERVER`,\n        'ANCHOR_QUOTE_NOT_SUPPORTED',\n        `Anchor's stellar.toml declares no ANCHOR_QUOTE_SERVER — SEP-38 not offered. Fall back to client.cashOut() directly.`,\n      );\n    }\n\n    const timeoutMs = input.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n    const isMainnet = input.isMainnet ?? true;\n    const jwt = await this.sep10Auth(anchor, input.signer, isMainnet, timeoutMs);\n\n    const asset = getStellarAsset(input.asset);\n    const sellAsset = `stellar:${asset.code}:${asset.issuer}`;\n    const buyAsset = `iso4217:${input.fiat}`;\n    const qs = new URLSearchParams({\n      sell_asset: sellAsset,\n      buy_asset: buyAsset,\n      sell_amount: input.amount,\n      country_code: input.country,\n    });\n\n    const res = await fetchWithTimeout(\n      `${anchor.serviceUrls.quoteServer}/price?${qs.toString()}`,\n      { headers: { Authorization: `Bearer ${jwt}` } },\n      timeoutMs,\n    );\n    if (!res.ok) {\n      throw new NPaymentError(\n        `SEP-38 quote failed: ${res.status} ${res.statusText}`,\n        'OFFRAMP_QUOTE_FAILED',\n        `Anchor rejected the quote request. Check corridor availability at ${anchor.homeDomain} or fall back to a different anchor.`,\n      );\n    }\n    const data = (await res.json()) as {\n      price?: string;\n      expires_at?: string;\n      fee?: { total?: string; percent?: string; asset?: string };\n      id?: string;\n    };\n\n    return {\n      rate: data.price ?? '',\n      expiresAt: data.expires_at ?? '',\n      feeFixed: data.fee?.total,\n      feePercent: data.fee?.percent,\n      quoteId: data.id,\n      anchor,\n    };\n  }\n\n  /**\n   * v0.30 — SEP-31 direct-payment for A2A / B2A commerce. Sender agent posts\n   * the payment intent; anchor returns receiver-info-url for SEP-12 registration\n   * (if the receiver_id is unknown) plus the sender-side Stellar Payment target.\n   * Handle exposes the same status() shape as SEP-24.\n   */\n  async b2bPayout(input: OffRampB2BInput): Promise<OffRampB2BHandle> {\n    assertVerifiedIssuer(getStellarAsset(input.asset));\n\n    const anchor = await this.selectAnchor(input);\n    if (!anchor.serviceUrls.transferServerSep31 || !anchor.serviceUrls.webAuthEndpoint) {\n      throw new NPaymentError(\n        `Anchor ${anchor.name} does not publish DIRECT_PAYMENT_SERVER`,\n        'ANCHOR_B2B_NOT_SUPPORTED',\n        `Anchor's stellar.toml declares no DIRECT_PAYMENT_SERVER — SEP-31 not offered. Fall back to client.cashOut() to reach the receiver via the interactive path.`,\n      );\n    }\n\n    const timeoutMs = input.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n    const isMainnet = input.isMainnet ?? true;\n    const jwt = await this.sep10Auth(anchor, input.signer, isMainnet, timeoutMs);\n\n    const body: Record<string, unknown> = {\n      amount: input.amount,\n      asset_code: input.asset,\n      sender_account: input.signer.address,\n    };\n    if (input.receiverId) body.receiver_id = input.receiverId;\n    if (input.quoteId) body.quote_id = input.quoteId;\n    if (input.fields) body.fields = input.fields;\n\n    const res = await fetchWithTimeout(\n      `${anchor.serviceUrls.transferServerSep31}/transactions`,\n      {\n        method: 'POST',\n        headers: { Authorization: `Bearer ${jwt}`, 'Content-Type': 'application/json' },\n        body: JSON.stringify(body),\n      },\n      timeoutMs,\n    );\n    if (!res.ok) {\n      throw new NPaymentError(\n        `SEP-31 direct-payment failed: ${res.status} ${res.statusText}`,\n        'OFFRAMP_B2B_FAILED',\n        `Anchor rejected the direct-payment request. If the receiver is not yet registered, register via the anchor's SEP-12 KYC server (${anchor.serviceUrls.kycServer ?? '<not-declared>'}).`,\n      );\n    }\n    const data = (await res.json()) as {\n      id: string;\n      stellar_account_id?: string;\n      stellar_memo?: string;\n      stellar_memo_type?: string;\n      receiver_info_url?: string;\n    };\n\n    return {\n      transactionId: data.id,\n      moreInfoUrl: data.receiver_info_url ?? '',\n      receiverInfoUrl: data.receiver_info_url ?? '',\n      anchor,\n      status: () => this.pollStatus(anchor, jwt, data.id, timeoutMs),\n    };\n  }\n\n  /** Convenience wrapper for the cash-out flow. Defaults country to 'US'. */\n  async cashOut(\n    amount: string,\n    asset: StellarAssetSymbol,\n    fiat: string,\n    signer: StellarSigner,\n    country = 'US',\n    isMainnet = true,\n    timeoutMs: number = DEFAULT_TIMEOUT_MS,\n  ): Promise<OffRampHandle> {\n    return this.initiate({ amount, asset, fiat, country, signer, isMainnet, timeoutMs });\n  }\n\n  // ─── Internal helpers ─────────────────────────────────────────────────────\n\n  private async selectAnchor(input: {\n    asset: StellarAssetSymbol;\n    fiat: string;\n    country: string;\n    amount: string;\n    preferAnchor?: string;\n  }): Promise<AnchorDescriptor> {\n    const candidates = input.preferAnchor\n      ? ([await this.registry.byDomain(input.preferAnchor)].filter(Boolean) as AnchorDescriptor[])\n      : await this.registry.filter(input.asset, input.fiat, input.country);\n\n    if (candidates.length === 0) {\n      throw new NPaymentError(\n        `No anchor supports ${input.amount} ${input.asset} → ${input.fiat} in ${input.country}`,\n        'OFFRAMP_NO_ANCHOR',\n        'Try preferring a global-coverage anchor or check https://stellar.expert/explorer/directory.',\n      );\n    }\n    return candidates[0];\n  }\n\n  private async sep10Auth(\n    anchor: AnchorDescriptor,\n    signer: StellarSigner,\n    isMainnet: boolean,\n    timeoutMs: number,\n  ): Promise<string> {\n    const passphrase = isMainnet\n      ? 'Public Global Stellar Network ; September 2015'\n      : 'Test SDF Network ; September 2015';\n\n    const challengeRes = await fetchWithTimeout(\n      `${anchor.serviceUrls.webAuthEndpoint}?account=${encodeURIComponent(signer.address)}`,\n      {},\n      timeoutMs,\n    );\n    if (!challengeRes.ok) {\n      throw new NPaymentError(\n        `SEP-10 challenge fetch failed: ${challengeRes.status}`,\n        'ANCHOR_AUTH_FAILED',\n      );\n    }\n    const { transaction } = (await challengeRes.json()) as { transaction: string };\n    const signedXdr = await signer.signTransaction(transaction, passphrase);\n\n    const tokenRes = await fetchWithTimeout(\n      anchor.serviceUrls.webAuthEndpoint!,\n      {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ transaction: signedXdr }),\n      },\n      timeoutMs,\n    );\n    if (!tokenRes.ok) {\n      throw new NPaymentError(\n        `SEP-10 token exchange failed: ${tokenRes.status}`,\n        'ANCHOR_AUTH_FAILED',\n      );\n    }\n    return ((await tokenRes.json()) as { token: string }).token;\n  }\n\n  private async pollStatus(\n    anchor: AnchorDescriptor,\n    jwt: string,\n    txId: string,\n    timeoutMs: number,\n  ): Promise<{ status: string; updatedAt: string; statusEta?: number }> {\n    const res = await fetchWithTimeout(\n      `${anchor.serviceUrls.transferServer}/transaction?id=${encodeURIComponent(txId)}`,\n      { headers: { Authorization: `Bearer ${jwt}` } },\n      timeoutMs,\n    );\n    if (!res.ok) {\n      throw new NPaymentError(\n        `Status poll failed: ${res.status}`,\n        'OFFRAMP_POLL_FAILED',\n      );\n    }\n    const { transaction } = (await res.json()) as {\n      transaction: { status: string; updatedAt?: string; updated_at?: string; status_eta?: number };\n    };\n    return {\n      status: transaction.status,\n      updatedAt: transaction.updatedAt ?? transaction.updated_at ?? '',\n      statusEta: transaction.status_eta,\n    };\n  }\n}\n\n// ─── v0.30 — stellarAgentKit facade ──────────────────────────────────────────\n\n/**\n * One-line agent-facing surface. Returns a bound-methods object closing over a\n * private StellarAnchorClient. isMainnet defaults to true; set to false to run\n * against Stellar testnet (SEP-10 passphrase flips automatically).\n *\n * Shape is intentionally verb-oriented + LLM-prompt-friendly: cashOut / quote /\n * b2bPayout / corridors / status. No SEP terminology surfaces to the caller.\n */\nexport function stellarAgentKit(\n  signer: StellarSigner,\n  opts: {\n    registry?: AnchorRegistry;\n    isMainnet?: boolean;\n    timeoutMs?: number;\n  } = {},\n) {\n  const registry = opts.registry ?? new DefaultAnchorRegistry();\n  const client = new StellarAnchorClient(registry);\n  const isMainnet = opts.isMainnet ?? true;\n  const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n  // Corridors are stable per registry instance → cache first-call result.\n  let corridorsCache: Array<{ anchor: string; from: string; to: string; countries: string[] }> | null = null;\n\n  return {\n    async cashOut(\n      amount: string,\n      asset: StellarAssetSymbol,\n      fiat: string,\n      country = 'US',\n    ): Promise<OffRampHandle> {\n      return client.cashOut(amount, asset, fiat, signer, country, isMainnet, timeoutMs);\n    },\n\n    async quote(\n      input: Omit<OffRampQuoteInput, 'signer' | 'isMainnet' | 'timeoutMs'>,\n    ): Promise<OffRampQuoteResult> {\n      return client.quote({ ...input, signer, isMainnet, timeoutMs });\n    },\n\n    async b2bPayout(\n      input: Omit<OffRampB2BInput, 'signer' | 'isMainnet' | 'timeoutMs'>,\n    ): Promise<OffRampB2BHandle> {\n      return client.b2bPayout({ ...input, signer, isMainnet, timeoutMs });\n    },\n\n    async corridors(): Promise<Array<{ anchor: string; from: string; to: string; countries: string[] }>> {\n      if (corridorsCache) return corridorsCache;\n      const anchors = await registry.list();\n      const rows: Array<{ anchor: string; from: string; to: string; countries: string[] }> = [];\n      for (const a of anchors) {\n        if (a.supportedCorridors && a.supportedCorridors.length > 0) {\n          for (const c of a.supportedCorridors) {\n            rows.push({ anchor: a.name, from: c.from, to: c.to, countries: [...c.countries] });\n          }\n        } else {\n          // Fall back to (asset × fiat) product; countries are the anchor's declared set.\n          for (const from of a.supportedAssets) {\n            for (const to of a.supportedFiat) {\n              rows.push({ anchor: a.name, from, to, countries: [...a.supportedCountries] });\n            }\n          }\n        }\n      }\n      corridorsCache = rows;\n      return rows;\n    },\n\n    status(handle: OffRampHandle | OffRampB2BHandle) {\n      return handle.status();\n    },\n  };\n}\n","import { NPaymentError } from '../errors.js';\n\nexport interface StellarWalletConfig {\n  secretKey?: string;\n  publicKey?: string;\n}\n\n/**\n * Lightweight Stellar wallet abstraction.\n * Uses @stellar/stellar-sdk via dynamic import (optional peer dep).\n */\nexport class StellarWallet {\n  private secretKey?: string;\n  private pubKey?: string;\n  private sdk: any;\n\n  constructor(config: StellarWalletConfig) {\n    this.secretKey = config.secretKey;\n    this.pubKey = config.publicKey;\n  }\n\n  private async getSdk() {\n    if (this.sdk) return this.sdk;\n    try {\n      this.sdk = await import('@stellar/stellar-sdk');\n      return this.sdk;\n    } catch {\n      throw new NPaymentError(\n        '@stellar/stellar-sdk is required for Stellar operations',\n        'STELLAR_SDK_MISSING',\n        'Install: npm install @stellar/stellar-sdk',\n      );\n    }\n  }\n\n  async getPublicKey(): Promise<string> {\n    if (this.pubKey) return this.pubKey;\n    const sdk = await this.getSdk();\n    const keypair = sdk.Keypair.fromSecret(this.secretKey!);\n    this.pubKey = keypair.publicKey();\n    return this.pubKey!;\n  }\n\n  /** Sign a Stellar transaction XDR (base64) and return signed XDR */\n  async signTransaction(xdr: string, networkPassphrase: string): Promise<string> {\n    if (!this.secretKey) throw new NPaymentError('Secret key required for signing', 'STELLAR_NO_SECRET');\n    const sdk = await this.getSdk();\n    const keypair = sdk.Keypair.fromSecret(this.secretKey);\n    const tx = sdk.TransactionBuilder.fromXDR(xdr, networkPassphrase);\n    tx.sign(keypair);\n    return tx.toXDR();\n  }\n\n  /** Sign a Soroban auth entry for x402 payments */\n  async signAuthEntry(entry: string): Promise<string> {\n    if (!this.secretKey) throw new NPaymentError('Secret key required for signing', 'STELLAR_NO_SECRET');\n    const sdk = await this.getSdk();\n    const keypair = sdk.Keypair.fromSecret(this.secretKey);\n    const signed = keypair.sign(Buffer.from(entry, 'base64'));\n    return signed.toString('base64');\n  }\n\n  hasSecret(): boolean {\n    return !!this.secretKey;\n  }\n}\n","import { NPaymentError } from '../errors.js';\nimport type { StellarWallet } from './wallet.js';\n\nexport interface TrustlessWorkConfig {\n  apiUrl?: string; // defaults to testnet\n  apiKey?: string;\n}\n\nexport interface EscrowDeployParams {\n  title: string;\n  description?: string;\n  amount: string;\n  receiver: string;\n  serviceProvider: string;\n  approver: string;\n  releaseSigner: string;\n  platformAddress?: string;\n  platformFee?: string;\n  milestones: { description: string; amount?: string }[];\n}\n\nexport interface EscrowStatus {\n  contractId: string;\n  balance: string;\n  funded: boolean;\n  milestones: { status: string; approved: boolean }[];\n}\n\nconst TESTNET_URL = 'https://dev.api.trustlesswork.com';\nconst MAINNET_URL = 'https://api.trustlesswork.com';\n\n/**\n * Lightweight REST client for Trustless Work escrow API.\n * All write operations return unsigned XDR for client-side signing.\n */\nexport class TrustlessWorkClient {\n  private baseUrl: string;\n  private apiKey?: string;\n\n  constructor(config: TrustlessWorkConfig = {}) {\n    this.baseUrl = config.apiUrl ?? TESTNET_URL;\n    this.apiKey = config.apiKey;\n  }\n\n  /** Deploy a single-release escrow */\n  async deploySingleRelease(params: EscrowDeployParams): Promise<{ contractId: string; unsignedXdr: string }> {\n    return this.post('/deployer/single-release', params);\n  }\n\n  /** Deploy a multi-release escrow */\n  async deployMultiRelease(params: EscrowDeployParams): Promise<{ contractId: string; unsignedXdr: string }> {\n    return this.post('/deployer/multi-release', params);\n  }\n\n  /** Fund an escrow */\n  async fundEscrow(contractId: string, type: 'single' | 'multi' = 'single'): Promise<{ unsignedXdr: string }> {\n    return this.post(`/escrow/${type}-release/fund-escrow`, { contractId });\n  }\n\n  /** Change milestone status */\n  async changeMilestoneStatus(contractId: string, milestoneIndex: number, status: string, type: 'single' | 'multi' = 'single'): Promise<{ unsignedXdr: string }> {\n    return this.post(`/escrow/${type}-release/change-milestone-status`, { contractId, milestoneIndex, status });\n  }\n\n  /** Approve a milestone */\n  async approveMilestone(contractId: string, milestoneIndex: number, type: 'single' | 'multi' = 'single'): Promise<{ unsignedXdr: string }> {\n    return this.post(`/escrow/${type}-release/approve-milestone`, { contractId, milestoneIndex });\n  }\n\n  /** Release funds (single-release) */\n  async releaseFunds(contractId: string): Promise<{ unsignedXdr: string }> {\n    return this.post('/escrow/single-release/release-funds', { contractId });\n  }\n\n  /** Release milestone funds (multi-release) */\n  async releaseMilestoneFunds(contractId: string, milestoneIndex: number): Promise<{ unsignedXdr: string }> {\n    return this.post('/escrow/multi-release/release-milestone-funds', { contractId, milestoneIndex });\n  }\n\n  /** Dispute an escrow */\n  async disputeEscrow(contractId: string, type: 'single' | 'multi' = 'single'): Promise<{ unsignedXdr: string }> {\n    return this.post(`/escrow/${type}-release/dispute-escrow`, { contractId });\n  }\n\n  /** Resolve a dispute */\n  async resolveDispute(contractId: string, type: 'single' | 'multi' = 'single'): Promise<{ unsignedXdr: string }> {\n    return this.post(`/escrow/${type}-release/resolve-dispute`, { contractId });\n  }\n\n  /** Get escrow balance */\n  async getBalance(contractId: string): Promise<EscrowStatus> {\n    return this.get(`/escrow/get-multiple-escrow-balance?contractIds=${contractId}`);\n  }\n\n  /** Sign and submit an unsigned XDR transaction */\n  async signAndSubmit(unsignedXdr: string, wallet: StellarWallet, networkPassphrase: string): Promise<string> {\n    const signedXdr = await wallet.signTransaction(unsignedXdr, networkPassphrase);\n    const result = await this.post<{ hash: string }>('/helper/send-transaction', { signedXdr });\n    return result.hash;\n  }\n\n  private async post<T = any>(path: string, body: any): Promise<T> {\n    const res = await fetch(`${this.baseUrl}${path}`, {\n      method: 'POST',\n      headers: this.headers(),\n      body: JSON.stringify(body),\n    });\n    if (!res.ok) throw new NPaymentError(`Trustless Work API error: ${res.status}`, 'TRUSTLESS_WORK_ERROR');\n    return res.json();\n  }\n\n  private async get<T = any>(path: string): Promise<T> {\n    const res = await fetch(`${this.baseUrl}${path}`, { headers: this.headers() });\n    if (!res.ok) throw new NPaymentError(`Trustless Work API error: ${res.status}`, 'TRUSTLESS_WORK_ERROR');\n    return res.json();\n  }\n\n  private headers(): Record<string, string> {\n    const h: Record<string, string> = { 'Content-Type': 'application/json' };\n    if (this.apiKey) h['Authorization'] = `Bearer ${this.apiKey}`;\n    return h;\n  }\n}\n","import { TrustlessWorkClient, type TrustlessWorkConfig, type EscrowDeployParams } from './trustless-work.js';\nimport { StellarWallet } from './wallet.js';\nimport { NPaymentError } from '../errors.js';\nimport type { ChainKey } from '../types.js';\n\nexport type TrustlessJobStatus = 'created' | 'funded' | 'in-progress' | 'submitted' | 'approved' | 'released' | 'disputed' | 'resolved';\n\nexport interface TrustlessJob {\n  id: string;\n  contractId: string;\n  type: 'single' | 'multi';\n  client: string;\n  provider: string;\n  approver: string;\n  amount: string;\n  chain: ChainKey;\n  status: TrustlessJobStatus;\n  milestones: { description: string; amount?: string; status: string }[];\n  createdAt: number;\n}\n\nexport interface TrustlessEscrowConfig {\n  chain: ChainKey;\n  networkPassphrase?: string;\n  trustlessWork?: TrustlessWorkConfig;\n}\n\nconst STELLAR_TESTNET_PASSPHRASE = 'Test SDF Network ; September 2015';\nconst STELLAR_MAINNET_PASSPHRASE = 'Public Global Stellar Network ; September 2015';\n\n/**\n * Manages agent-to-agent escrow jobs via Trustless Work on Stellar.\n * Supports single-release (one payout) and multi-release (milestone payouts).\n */\nexport class TrustlessEscrowManager {\n  private client: TrustlessWorkClient;\n  private wallet: StellarWallet;\n  private chain: ChainKey;\n  private passphrase: string;\n  private jobs = new Map<string, TrustlessJob>();\n\n  constructor(wallet: StellarWallet, config: TrustlessEscrowConfig) {\n    this.wallet = wallet;\n    this.chain = config.chain;\n    this.passphrase = config.networkPassphrase ??\n      (config.chain === 'stellar-mainnet' ? STELLAR_MAINNET_PASSPHRASE : STELLAR_TESTNET_PASSPHRASE);\n    this.client = new TrustlessWorkClient(config.trustlessWork);\n  }\n\n  /** Create and deploy an escrow job */\n  async createJob(params: {\n    provider: string;\n    approver?: string;\n    amount: string;\n    title: string;\n    milestones: { description: string; amount?: string }[];\n    type?: 'single' | 'multi';\n  }): Promise<TrustlessJob> {\n    const clientPubKey = await this.wallet.getPublicKey();\n    const type = params.type ?? (params.milestones.length > 1 ? 'multi' : 'single');\n\n    const deployParams: EscrowDeployParams = {\n      title: params.title,\n      amount: params.amount,\n      receiver: params.provider,\n      serviceProvider: params.provider,\n      approver: params.approver ?? clientPubKey,\n      releaseSigner: clientPubKey,\n      milestones: params.milestones,\n    };\n\n    const deploy = type === 'multi'\n      ? await this.client.deployMultiRelease(deployParams)\n      : await this.client.deploySingleRelease(deployParams);\n\n    await this.client.signAndSubmit(deploy.unsignedXdr, this.wallet, this.passphrase);\n\n    const job: TrustlessJob = {\n      id: `tw_${Date.now().toString(36)}`,\n      contractId: deploy.contractId,\n      type,\n      client: clientPubKey,\n      provider: params.provider,\n      approver: params.approver ?? clientPubKey,\n      amount: params.amount,\n      chain: this.chain,\n      status: 'created',\n      milestones: params.milestones.map(m => ({ ...m, status: 'pending' })),\n      createdAt: Date.now(),\n    };\n    this.jobs.set(job.id, job);\n    return job;\n  }\n\n  /** Fund an escrow job */\n  async fundJob(jobId: string): Promise<TrustlessJob> {\n    const job = this.getJobOrThrow(jobId, ['created']);\n    const { unsignedXdr } = await this.client.fundEscrow(job.contractId, job.type);\n    await this.client.signAndSubmit(unsignedXdr, this.wallet, this.passphrase);\n    job.status = 'funded';\n    return job;\n  }\n\n  /** Provider marks milestone as completed */\n  async submitMilestone(jobId: string, milestoneIndex: number): Promise<TrustlessJob> {\n    const job = this.getJobOrThrow(jobId, ['funded', 'in-progress']);\n    const { unsignedXdr } = await this.client.changeMilestoneStatus(job.contractId, milestoneIndex, 'completed', job.type);\n    await this.client.signAndSubmit(unsignedXdr, this.wallet, this.passphrase);\n    job.milestones[milestoneIndex].status = 'completed';\n    job.status = 'submitted';\n    return job;\n  }\n\n  /** Approver approves milestone and releases funds */\n  async approveAndRelease(jobId: string, milestoneIndex: number): Promise<TrustlessJob> {\n    const job = this.getJobOrThrow(jobId, ['submitted', 'in-progress', 'funded']);\n\n    const { unsignedXdr: approveXdr } = await this.client.approveMilestone(job.contractId, milestoneIndex, job.type);\n    await this.client.signAndSubmit(approveXdr, this.wallet, this.passphrase);\n    job.milestones[milestoneIndex].status = 'approved';\n\n    if (job.type === 'multi') {\n      const { unsignedXdr: releaseXdr } = await this.client.releaseMilestoneFunds(job.contractId, milestoneIndex);\n      await this.client.signAndSubmit(releaseXdr, this.wallet, this.passphrase);\n    } else {\n      const allApproved = job.milestones.every(m => m.status === 'approved');\n      if (allApproved) {\n        const { unsignedXdr: releaseXdr } = await this.client.releaseFunds(job.contractId);\n        await this.client.signAndSubmit(releaseXdr, this.wallet, this.passphrase);\n      }\n    }\n\n    job.status = job.milestones.every(m => m.status === 'approved') ? 'released' : 'in-progress';\n    return job;\n  }\n\n  /** Raise a dispute */\n  async dispute(jobId: string): Promise<TrustlessJob> {\n    const job = this.getJobOrThrow(jobId, ['funded', 'submitted', 'in-progress']);\n    const { unsignedXdr } = await this.client.disputeEscrow(job.contractId, job.type);\n    await this.client.signAndSubmit(unsignedXdr, this.wallet, this.passphrase);\n    job.status = 'disputed';\n    return job;\n  }\n\n  /** Resolve a dispute */\n  async resolve(jobId: string): Promise<TrustlessJob> {\n    const job = this.getJobOrThrow(jobId, ['disputed']);\n    const { unsignedXdr } = await this.client.resolveDispute(job.contractId, job.type);\n    await this.client.signAndSubmit(unsignedXdr, this.wallet, this.passphrase);\n    job.status = 'resolved';\n    return job;\n  }\n\n  getJob(id: string): TrustlessJob | undefined {\n    return this.jobs.get(id);\n  }\n\n  private getJobOrThrow(id: string, validStatuses: TrustlessJobStatus[]): TrustlessJob {\n    const job = this.jobs.get(id);\n    if (!job) throw new NPaymentError(`Job not found: ${id}`, 'ESCROW_NOT_FOUND');\n    if (!validStatuses.includes(job.status)) {\n      throw new NPaymentError(`Job ${id} in invalid state: ${job.status}`, 'ESCROW_INVALID_STATE');\n    }\n    return job;\n  }\n}\n","import { getStellarAsset, type StellarAssetSymbol } from './assets.js';\nimport { NPaymentError } from '../errors.js';\n\n/**\n * v0.21 — Multi-brand-stable PayRouter v2.\n *\n * Pure-function asset selection: given a 402 challenge's requested asset + the\n * buyer's current holdings + an optional corridor hint, picks the optimal Stellar\n * brand stable. When holdings don't include the requested asset, optionally\n * proposes an auto-convert path via Stellar's native AMM.\n *\n * Design:\n *   - SRP — selection logic only. Adapter wiring lives in caller code (the\n *           buyer constructs `StellarSessionClient({ asset })` from the result).\n *   - OCP — new corridors added via `CORRIDOR_PREFERENCE` map only.\n *   - DRY — issuer addresses are read via `getStellarAsset`, never duplicated.\n *\n * Why a pure function (not a class): the legacy v0.20 API surface cannot be\n * extended without breaking changes. A pure exported helper is opt-in: callers\n * who don't invoke it get USDC defaults (back-compat with v0.20).\n */\n\n// ─── Corridor heuristics ────────────────────────────────────────────────────\n\nexport type Corridor =\n  | 'us-mx'\n  | 'us-latam'\n  | 'us-ph'\n  | 'us-domestic'\n  | 'eu-domestic'\n  | 'eu-uk'\n  | 'eu-latam'\n  | 'apac'\n  | 'global-default';\n\n/**\n * Per-corridor preference list. Drives auto-convert routing when buyer holds\n * something other than the requested asset. US-MX prefers MGUSD because of\n * MoneyGram's retail off-ramp dominance in that lane.\n */\nexport const CORRIDOR_PREFERENCE: Record<Corridor, StellarAssetSymbol[]> = {\n  'us-mx': ['MGUSD', 'USDC'],\n  'us-latam': ['MGUSD', 'USDC'],\n  'us-ph': ['MGUSD', 'USDC'],\n  'us-domestic': ['USDC', 'MGUSD'],\n  'eu-domestic': ['EURC', 'USDC'],\n  'eu-uk': ['EURC', 'USDC'],\n  'eu-latam': ['EURC', 'MGUSD', 'USDC'],\n  'apac': ['USDC'],\n  'global-default': ['USDC', 'MGUSD', 'EURC'],\n};\n\n// ─── Public input/output shapes ─────────────────────────────────────────────\n\nexport interface SelectAssetInput {\n  /** Asset the seller listed in the 402 challenge. */\n  requested: StellarAssetSymbol;\n  /** Assets the buyer holds with positive balances. */\n  buyerHoldings: StellarAssetSymbol[];\n  /** Optional corridor hint for auto-convert tie-breaking. Default: 'global-default'. */\n  corridor?: Corridor;\n  /** Optional explicit override of the corridor preference list. */\n  sellerPreference?: StellarAssetSymbol[];\n  /** When true, allow Stellar AMM path for cross-asset conversion. Default: false. */\n  allowAutoConvert?: boolean;\n}\n\nexport type SelectAssetResult =\n  | { kind: 'direct'; asset: StellarAssetSymbol }\n  | {\n      kind: 'auto-convert';\n      from: StellarAssetSymbol;\n      to: StellarAssetSymbol;\n      via: 'stellar-amm';\n      estimatedSlippageBps: number;\n    }\n  | { kind: 'no-route'; reason: string; suggestedFunding: StellarAssetSymbol[] };\n\nconst DEFAULT_SLIPPAGE_BPS = 30; // 0.3% — conservative for low-liquidity early-days pools.\n\n// ─── selectAsset — pure function, no I/O ────────────────────────────────────\n\n/**\n * Pick the optimal Stellar brand stable for the requested asset given buyer holdings.\n * Direct match always wins (zero slippage). When auto-convert is allowed, walks the\n * preference list and proposes the first held candidate as the convert source.\n */\nexport function selectAsset(input: SelectAssetInput): SelectAssetResult {\n  // Validate requested symbol — throws STELLAR_ASSET_UNKNOWN with hint.\n  const requested = getStellarAsset(input.requested).code;\n\n  // 1. Direct hit — buyer holds the requested asset.\n  if (input.buyerHoldings.includes(requested)) {\n    return { kind: 'direct', asset: requested };\n  }\n\n  // 2. Build preference: explicit seller pref → corridor → global default. Dedupe.\n  const corridor = input.corridor ?? 'global-default';\n  const corridorList = CORRIDOR_PREFERENCE[corridor] ?? CORRIDOR_PREFERENCE['global-default'];\n  const preference = dedupe([...(input.sellerPreference ?? []), ...corridorList]);\n\n  // 3. If auto-convert is enabled, find the first held candidate as the convert source.\n  if (input.allowAutoConvert) {\n    for (const candidate of preference) {\n      if (input.buyerHoldings.includes(candidate)) {\n        return {\n          kind: 'auto-convert',\n          from: candidate,\n          to: requested,\n          via: 'stellar-amm',\n          estimatedSlippageBps: DEFAULT_SLIPPAGE_BPS,\n        };\n      }\n    }\n  }\n\n  // 4. No route — instruct caller which stable(s) to fund.\n  const suggestedFunding = dedupe([requested, ...corridorList]).slice(0, 3);\n  return {\n    kind: 'no-route',\n    reason: `Buyer holds [${input.buyerHoldings.join(', ') || 'none'}]; seller wants ${requested}.`,\n    suggestedFunding,\n  };\n}\n\nfunction dedupe<T>(xs: T[]): T[] {\n  const seen = new Set<T>();\n  const out: T[] = [];\n  for (const x of xs) {\n    if (!seen.has(x)) {\n      seen.add(x);\n      out.push(x);\n    }\n  }\n  return out;\n}\n\n// ─── Stellar AMM path lookup (used by callers executing auto-convert) ───────\n\nexport interface StellarAmmPath {\n  /** Slippage of the path in basis points (10 bps = 0.10%). */\n  pathBps: number;\n  /** Minimum destination amount (base units) for slippage-bounded execution. */\n  minDestination: bigint;\n  /** XDR-encoded PathPayment op chain (caller submits via stellar-sdk). */\n  pathXdr: string;\n}\n\n/**\n * Query Horizon `/paths/strict-receive` for a viable AMM path between two assets.\n * Returns null when no path exists (illiquid pool — caller should downgrade to no-route).\n *\n * Kept tiny on purpose: full PathPayment op-construction lives in caller code that\n * already imports @stellar/stellar-sdk; this helper is just the path query.\n */\nexport async function findStellarAmmPath(\n  from: StellarAssetSymbol,\n  to: StellarAssetSymbol,\n  destinationAmount: bigint,\n  horizonUrl: string,\n  options?: { maxSlippageBps?: number; sourceAccount?: string },\n): Promise<StellarAmmPath | null> {\n  const fromAsset = getStellarAsset(from);\n  const toAsset = getStellarAsset(to);\n  const maxBps = options?.maxSlippageBps ?? DEFAULT_SLIPPAGE_BPS;\n\n  // Format destinationAmount back to a Horizon-friendly decimal string.\n  const divisor = 10n ** BigInt(toAsset.decimals);\n  const whole = destinationAmount / divisor;\n  const frac = (destinationAmount % divisor).toString().padStart(toAsset.decimals, '0');\n  const destinationAmountStr = `${whole}.${frac}`;\n\n  const params = new URLSearchParams({\n    destination_asset_type: 'credit_alphanum4',\n    destination_asset_code: toAsset.code,\n    destination_asset_issuer: toAsset.issuer,\n    destination_amount: destinationAmountStr,\n    source_assets: `${fromAsset.code}:${fromAsset.issuer}`,\n  });\n  if (options?.sourceAccount) params.set('source_account', options.sourceAccount);\n\n  const res = await fetch(`${horizonUrl.replace(/\\/$/, '')}/paths/strict-receive?${params.toString()}`);\n  if (!res.ok) {\n    throw new NPaymentError(\n      `Stellar AMM path lookup failed: ${res.status} ${res.statusText}`,\n      'STELLAR_AMM_PATH_LOOKUP_FAILED',\n      `Verify horizonUrl is reachable and asset pair (${from}→${to}) has on-chain liquidity.`,\n    );\n  }\n  const body = (await res.json()) as { _embedded?: { records?: Array<{ source_amount: string; path: unknown[] }> } };\n  const record = body._embedded?.records?.[0];\n  if (!record) return null;\n\n  // Slippage estimate: ratio of source_amount to destination_amount, expressed in bps\n  // relative to a 1:1 stable parity. Conservative ceiling.\n  const sourceAmount = parseFloat(record.source_amount);\n  const destAmount = parseFloat(destinationAmountStr);\n  const drift = Math.abs(sourceAmount - destAmount) / Math.max(destAmount, 1e-9);\n  const pathBps = Math.min(Math.ceil(drift * 10_000), maxBps);\n\n  // Slippage-bounded minimum destination = destination - maxBps tolerance.\n  const minDestination =\n    destinationAmount - (destinationAmount * BigInt(maxBps)) / 10_000n;\n\n  return {\n    pathBps,\n    minDestination,\n    pathXdr: JSON.stringify(record.path), // raw path; caller wraps in PathPaymentStrictReceive op\n  };\n}\n","import type { XrplConnection } from './connection.js';\n\nconst ORACLE_CONFIG = {\n  testnet: { account: 'r3U1mL5u2SCPr4mApqYyF96nvwvKoGf7aH', documentId: 1 },\n  mainnet: { account: 'rP24Lp7bcUHvEW7T7c8xkxtQKKd9fZyra7', documentId: 42 },\n} as const;\n\nconst ASSET_TICKERS: Record<string, string> = {\n  RLUSD: '524C555344000000000000000000000000000000',\n  XRP: '5852500000000000000000000000000000000000',\n  BTC: '4254430000000000000000000000000000000000',\n  ETH: '4554480000000000000000000000000000000000',\n};\n\nexport interface OraclePrice {\n  asset: string;\n  price: number;\n  timestamp: number;\n}\n\nexport class DiaOracleClient {\n  private connection: XrplConnection;\n  private network: 'testnet' | 'mainnet';\n\n  constructor(connection: XrplConnection, network: 'testnet' | 'mainnet' = 'testnet') {\n    this.connection = connection;\n    this.network = network;\n  }\n\n  async getPrice(asset: string): Promise<OraclePrice> {\n    const client = await this.connection.getClient();\n    const config = ORACLE_CONFIG[this.network];\n\n    const response = await client.request({\n      command: 'ledger_entry',\n      oracle: { account: config.account, oracle_document_id: config.documentId },\n      ledger_index: 'validated',\n    });\n\n    const priceData = response.result.node?.PriceDataSeries ?? [];\n    const tickerHex = ASSET_TICKERS[asset.toUpperCase()] ?? asset;\n\n    const entry = priceData.find(\n      (p: any) => p.PriceData?.BaseAsset === tickerHex || p.PriceData?.BaseAsset === asset,\n    );\n\n    if (!entry) return { asset, price: 0, timestamp: Date.now() };\n\n    const rawPrice = parseInt(entry.PriceData.AssetPrice, 16);\n    const scale = entry.PriceData.Scale ?? 8;\n    const price = rawPrice / Math.pow(10, scale);\n\n    return { asset, price, timestamp: Date.now() };\n  }\n\n  async getRLUSDPrice(): Promise<number> {\n    const result = await this.getPrice('RLUSD');\n    return result.price || 1.0; // RLUSD should be ~$1.00\n  }\n\n  async getVaultYield(\n    currentShareValue: number,\n    depositShareValue: number,\n  ): Promise<{ yieldPercent: number; absoluteReturn: number }> {\n    if (depositShareValue === 0) return { yieldPercent: 0, absoluteReturn: 0 };\n    const absoluteReturn = currentShareValue - depositShareValue;\n    const yieldPercent = (absoluteReturn / depositShareValue) * 100;\n    return { yieldPercent, absoluteReturn };\n  }\n\n  async trackVaultYield(\n    vaultTotalAssets: string,\n    vaultTotalShares: string,\n    userShares: string,\n    depositAmount: string,\n  ): Promise<{ currentValue: number; depositValue: number; yieldPercent: number }> {\n    const totalAssets = parseFloat(vaultTotalAssets);\n    const totalShares = parseFloat(vaultTotalShares);\n    const shares = parseFloat(userShares);\n    const deposit = parseFloat(depositAmount);\n\n    const currentValue = totalShares > 0 ? (shares / totalShares) * totalAssets : 0;\n    const yieldPercent = deposit > 0 ? ((currentValue - deposit) / deposit) * 100 : 0;\n\n    return { currentValue, depositValue: deposit, yieldPercent };\n  }\n}\n","import { XrplWallet } from './wallet.js';\nimport { XrplConnection } from './connection.js';\nimport { XrplVaultClient } from './vault.js';\nimport { DiaOracleClient } from './oracle.js';\nimport { XrplSwapClient } from './swap.js';\nimport { ensureTrustLine, sendRLUSD, getRLUSDBalance, readAccountState } from './payments.js';\nimport { getRlusdIssuer, networkFromChainKey, RLUSD_CURRENCY, type XrplNetwork } from './utils.js';\nimport type { ChainKey } from '../types.js';\n\nexport interface XrplClientConfig {\n  seed?: string;\n  owsWallet?: string;\n  server?: string;\n  network?: XrplNetwork;\n  /** Inject a shared XrplConnection (avoids duplicate websockets). */\n  connection?: XrplConnection;\n}\n\nexport interface XrplHealthReport {\n  connected: boolean;\n  network: XrplNetwork;\n  walletAddress?: string;\n  trustlineReady: boolean;\n  rippledLatencyMs?: number;\n  ammLiquidityXrpRlusd?: { xrpDrops: string; rlusd: string } | null;\n  warnings: string[];\n}\n\nexport class XrplClient {\n  readonly wallet: XrplWallet;\n  readonly connection: XrplConnection;\n  readonly vault: XrplVaultClient;\n  readonly oracle: DiaOracleClient;\n  readonly swap: XrplSwapClient;\n  readonly network: XrplNetwork;\n  readonly issuer: string;\n\n  constructor(config: XrplClientConfig) {\n    this.network = config.network ?? 'testnet';\n    this.issuer = getRlusdIssuer(this.network);\n    const chainKey: ChainKey = this.network === 'mainnet' ? 'xrpl-mainnet' : 'xrpl-testnet';\n\n    this.wallet = new XrplWallet({ seed: config.seed, owsWallet: config.owsWallet });\n    this.connection = config.connection ?? new XrplConnection(config.server ?? chainKey);\n    this.vault = new XrplVaultClient(this.connection, this.wallet, this.issuer);\n    this.oracle = new DiaOracleClient(this.connection, this.network);\n    this.swap = new XrplSwapClient(this.connection, this.wallet, this.network, this.issuer);\n  }\n\n  getAddress(): Promise<string> { return this.wallet.getAddress(); }\n\n  ensureTrustLine(): Promise<string | null> {\n    return ensureTrustLine(this.connection, this.wallet, { issuer: this.issuer });\n  }\n\n  sendRLUSD(destination: string, amount: string): Promise<{ hash: string; validated: boolean }> {\n    return sendRLUSD(this.connection, this.wallet, destination, amount, { issuer: this.issuer });\n  }\n\n  async getBalance(address?: string): Promise<string> {\n    const addr = address ?? (await this.wallet.getAddress());\n    return getRLUSDBalance(this.connection, addr, { issuer: this.issuer });\n  }\n\n  /**\n   * Preflight diagnostic — connection state, trust line, AMM liquidity for XRP/RLUSD.\n   * Run once at boot before serving paywall traffic. Never throws — collects into `warnings`.\n   */\n  async health(): Promise<XrplHealthReport> {\n    const warnings: string[] = [];\n    let connected = false;\n    let trustlineReady = false;\n    let walletAddress: string | undefined;\n    let rippledLatencyMs: number | undefined;\n    let ammLiquidityXrpRlusd: XrplHealthReport['ammLiquidityXrpRlusd'] = null;\n\n    try {\n      const t0 = Date.now();\n      const client = await this.connection.getClient();\n      rippledLatencyMs = Date.now() - t0;\n      connected = !!client.isConnected?.();\n      try {\n        walletAddress = await this.wallet.getAddress();\n        const state = await readAccountState(this.connection, walletAddress, { issuer: this.issuer });\n        trustlineReady = state.trustlineExists;\n        if (!trustlineReady) warnings.push('No RLUSD trust line — call ensureTrustLine() before paying.');\n      } catch (e) {\n        warnings.push(`Wallet read failed: ${(e as Error).message}`);\n      }\n      try {\n        const ammResp = await client.request({\n          command: 'amm_info',\n          asset: { currency: 'XRP' },\n          asset2: { currency: RLUSD_CURRENCY, issuer: this.issuer },\n        });\n        const pool = ammResp.result?.amm;\n        if (pool?.amount && pool?.amount2) {\n          const xrpSide = typeof pool.amount === 'string' ? pool.amount : pool.amount?.value ?? '0';\n          const rlusdSide = typeof pool.amount2 === 'string' ? pool.amount2 : pool.amount2?.value ?? '0';\n          ammLiquidityXrpRlusd = { xrpDrops: xrpSide, rlusd: rlusdSide };\n        } else {\n          warnings.push('No XRP/RLUSD AMM pool on this network — autoSwap will fail.');\n        }\n      } catch (e) {\n        warnings.push(`amm_info failed: ${(e as Error).message}`);\n      }\n    } catch (e) {\n      warnings.push(`Connection error: ${(e as Error).message}`);\n    }\n\n    return {\n      connected,\n      network: this.network,\n      walletAddress,\n      trustlineReady,\n      rippledLatencyMs,\n      ammLiquidityXrpRlusd,\n      warnings,\n    };\n  }\n\n  /** Resolve to the chain key matching the network — convenience for callers. */\n  get chainKey(): ChainKey { return this.network === 'mainnet' ? 'xrpl-mainnet' : 'xrpl-testnet'; }\n\n  /** Static helper for callers who only have a ChainKey. */\n  static networkOf(chainKey: ChainKey): XrplNetwork { return networkFromChainKey(chainKey); }\n\n  async disconnect(): Promise<void> { await this.connection.disconnect(); }\n}\n\nexport function createXrplClient(config: XrplClientConfig): XrplClient {\n  return new XrplClient(config);\n}\n","import type { Job, EscrowConfig, JobStatus } from './types.js';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport { NPaymentError } from '../errors.js';\n\nconst JOB_ABI = {\n  createJob: '0xa1b2c3d4',\n  fundJob: '0xe5f6a7b8',\n  submitDeliverable: '0xc9d0e1f2',\n  completeJob: '0x34567890',\n  rejectJob: '0xabcdef01',\n} as const;\n\nexport class EscrowManager {\n  private wallet: OWSWallet;\n  private config: EscrowConfig;\n  private jobs = new Map<string, Job>();\n\n  constructor(wallet: OWSWallet, config: EscrowConfig) {\n    this.wallet = wallet;\n    this.config = config;\n  }\n\n  /** Create and fund a job in escrow */\n  async createJob(provider: string, amount: number): Promise<Job> {\n    const id = `job_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n    const chainId = (await import('../chains.js')).CHAINS[this.config.chain].chainId;\n\n    const data = `${JOB_ABI.createJob}${provider.slice(2).padStart(64, '0')}${BigInt(amount).toString(16).padStart(64, '0')}`;\n    await this.wallet.signTransaction({ to: this.config.contractAddress, data }, chainId);\n\n    const job: Job = {\n      id,\n      client: await this.wallet.getAddressAsync(chainId),\n      provider,\n      evaluator: this.config.evaluator,\n      amount,\n      chain: this.config.chain,\n      status: 'funded',\n      createdAt: Date.now(),\n      expiresAt: Date.now() + (this.config.timeoutMs ?? 3600_000),\n    };\n    this.jobs.set(id, job);\n    return job;\n  }\n\n  /** Provider submits deliverable hash */\n  submitDeliverable(jobId: string, hash: string): Job {\n    const job = this.jobs.get(jobId);\n    if (!job || job.status !== 'funded') throw new NPaymentError('Job not in funded state', 'ESCROW_INVALID_STATE');\n    job.deliverableHash = hash;\n    job.status = 'submitted';\n    return job;\n  }\n\n  /** Evaluator approves — release funds to provider */\n  async complete(jobId: string): Promise<Job> {\n    const job = this.jobs.get(jobId);\n    if (!job || job.status !== 'submitted') throw new NPaymentError('Job not in submitted state', 'ESCROW_INVALID_STATE');\n\n    const chainId = (await import('../chains.js')).CHAINS[this.config.chain].chainId;\n    const data = `${JOB_ABI.completeJob}${job.id.replace(/[^a-f0-9]/gi, '').padStart(64, '0')}`;\n    await this.wallet.signTransaction({ to: this.config.contractAddress, data }, chainId);\n\n    job.status = 'completed';\n    return job;\n  }\n\n  /** Evaluator rejects — refund to client */\n  async reject(jobId: string): Promise<Job> {\n    const job = this.jobs.get(jobId);\n    if (!job || job.status !== 'submitted') throw new NPaymentError('Job not in submitted state', 'ESCROW_INVALID_STATE');\n\n    const chainId = (await import('../chains.js')).CHAINS[this.config.chain].chainId;\n    const data = `${JOB_ABI.rejectJob}${job.id.replace(/[^a-f0-9]/gi, '').padStart(64, '0')}`;\n    await this.wallet.signTransaction({ to: this.config.contractAddress, data }, chainId);\n\n    job.status = 'rejected';\n    return job;\n  }\n\n  getJob(id: string): Job | undefined {\n    return this.jobs.get(id);\n  }\n}\n","import type { ProviderCandidate, RouterConfig, RoutingStrategy } from './types.js';\n\nexport class ReputationRouter {\n  private config: Required<RouterConfig>;\n  private cache = new Map<string, { score: number; ts: number }>();\n\n  constructor(config: RouterConfig = {}) {\n    this.config = {\n      strategy: config.strategy ?? 'balanced',\n      cacheTtlMs: config.cacheTtlMs ?? 300_000,\n      minReputation: config.minReputation ?? 10,\n    };\n  }\n\n  /** Select best provider from candidates */\n  select(candidates: ProviderCandidate[]): ProviderCandidate | undefined {\n    const eligible = candidates.filter(c => c.reputation >= this.config.minReputation);\n    if (!eligible.length) return undefined;\n\n    switch (this.config.strategy) {\n      case 'cheapest': return this.byCheapest(eligible);\n      case 'fastest': return this.byFastest(eligible);\n      case 'highest-reputation': return this.byReputation(eligible);\n      case 'balanced': return this.byBalanced(eligible);\n    }\n  }\n\n  /** Rank all candidates by strategy */\n  rank(candidates: ProviderCandidate[]): ProviderCandidate[] {\n    const eligible = candidates.filter(c => c.reputation >= this.config.minReputation);\n    return eligible.sort((a, b) => this.score(b) - this.score(a));\n  }\n\n  private score(c: ProviderCandidate): number {\n    // Balanced: normalize reputation (0-100), inverse price, inverse latency\n    const repScore = c.reputation / 100;\n    const priceScore = 1 / (1 + c.price / 10000); // lower price = higher score\n    const latencyScore = 1 / (1 + (c.latencyMs ?? 500) / 1000);\n    return repScore * 0.4 + priceScore * 0.35 + latencyScore * 0.25;\n  }\n\n  private byCheapest(c: ProviderCandidate[]): ProviderCandidate {\n    return c.reduce((a, b) => a.price < b.price ? a : b);\n  }\n\n  private byFastest(c: ProviderCandidate[]): ProviderCandidate {\n    return c.reduce((a, b) => (a.latencyMs ?? Infinity) < (b.latencyMs ?? Infinity) ? a : b);\n  }\n\n  private byReputation(c: ProviderCandidate[]): ProviderCandidate {\n    return c.reduce((a, b) => a.reputation > b.reputation ? a : b);\n  }\n\n  private byBalanced(c: ProviderCandidate[]): ProviderCandidate {\n    return c.reduce((a, b) => this.score(a) > this.score(b) ? a : b);\n  }\n}\n","import type { DelegationContext, DelegationConfig } from './types.js';\nimport type { ChainKey } from '../types.js';\nimport { NPaymentError } from '../errors.js';\n\nexport class DelegationManager {\n  private config: Required<DelegationConfig>;\n  private contexts = new Map<string, DelegationContext>();\n\n  constructor(config: DelegationConfig = {}) {\n    this.config = {\n      maxDepth: config.maxDepth ?? 5,\n      maxPerHopPercent: config.maxPerHopPercent ?? 80,\n    };\n  }\n\n  /** Create root delegation context */\n  createRoot(budget: number, chain: ChainKey): DelegationContext {\n    const ctx: DelegationContext = {\n      rootId: `del_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`,\n      depth: 0,\n      totalBudget: budget,\n      remainingBudget: budget,\n      maxDepth: this.config.maxDepth,\n      chain,\n    };\n    this.contexts.set(ctx.rootId, ctx);\n    return ctx;\n  }\n\n  /** Create child delegation from parent */\n  delegate(parent: DelegationContext, amount: number): DelegationContext {\n    if (parent.depth >= parent.maxDepth) {\n      throw new NPaymentError(`Max delegation depth ${parent.maxDepth} reached`, 'DELEGATION_MAX_DEPTH');\n    }\n    const maxAllowed = parent.remainingBudget * (this.config.maxPerHopPercent / 100);\n    if (amount > maxAllowed) {\n      throw new NPaymentError(`Amount ${amount} exceeds max per-hop ${maxAllowed}`, 'DELEGATION_OVER_BUDGET');\n    }\n    if (amount > parent.remainingBudget) {\n      throw new NPaymentError(`Amount ${amount} exceeds remaining ${parent.remainingBudget}`, 'DELEGATION_INSUFFICIENT');\n    }\n\n    parent.remainingBudget -= amount;\n\n    const child: DelegationContext = {\n      parentId: parent.rootId,\n      rootId: parent.rootId,\n      depth: parent.depth + 1,\n      totalBudget: amount,\n      remainingBudget: amount,\n      maxDepth: parent.maxDepth,\n      chain: parent.chain,\n    };\n    return child;\n  }\n\n  /** Record spend against a delegation context */\n  spend(ctx: DelegationContext, amount: number): boolean {\n    if (amount > ctx.remainingBudget) return false;\n    ctx.remainingBudget -= amount;\n    return true;\n  }\n\n  getContext(rootId: string): DelegationContext | undefined {\n    return this.contexts.get(rootId);\n  }\n}\n","import type { AgentClientConfig, ProviderCandidate, DelegationContext, NegotiationResult } from './types.js';\nimport type { NPaymentConfig } from '../types.js';\nimport { PaymentClient } from '../client.js';\nimport { BazaarClient } from '../bazaar/client.js';\nimport { ReputationRouter } from './reputation-router.js';\nimport { SessionManager } from './session.js';\nimport { DelegationManager } from './delegation.js';\nimport { PaymentNegotiator } from './negotiator.js';\n\nexport class AgentClient {\n  private paymentClient: PaymentClient;\n  private bazaar: BazaarClient;\n  private router: ReputationRouter;\n  private sessions: SessionManager;\n  private delegation: DelegationManager;\n  private negotiator: PaymentNegotiator;\n  private config: AgentClientConfig;\n\n  constructor(config: AgentClientConfig) {\n    this.config = config;\n    this.paymentClient = new PaymentClient({\n      chains: [config.chain],\n      ows: { wallet: config.wallet, privateKey: config.privateKey },\n    });\n    this.bazaar = new BazaarClient({ mockCatalog: true });\n    this.router = new ReputationRouter(config.reputation ? { minReputation: config.reputation.minScore } : {});\n    this.sessions = new SessionManager({ defaultBudget: config.maxBudget ?? 1_000_000 });\n    this.delegation = new DelegationManager(config.delegation);\n    this.negotiator = new PaymentNegotiator();\n  }\n\n  /** Discover services matching a query */\n  async discover(query: string): Promise<ProviderCandidate[]> {\n    const { resources } = await this.bazaar.search(query);\n    return resources.map(r => ({\n      url: r.resource,\n      reputation: 50, // default; real impl queries ERC-8004\n      price: Number(r.accepts[0]?.maxAmountRequired ?? 0),\n    }));\n  }\n\n  /** Select best provider from candidates */\n  selectProvider(candidates: ProviderCandidate[]): ProviderCandidate | undefined {\n    return this.router.select(candidates);\n  }\n\n  /** Negotiate payment terms with a provider */\n  negotiate(price: number, callerReputation: number): NegotiationResult {\n    return this.negotiator.negotiate(price, callerReputation);\n  }\n\n  /** Make a paid call to a provider URL */\n  async call(url: string, opts?: { input?: any; delegationCtx?: DelegationContext }): Promise<any> {\n    const headers: Record<string, string> = {};\n    if (opts?.delegationCtx) {\n      headers['x-delegation-root'] = opts.delegationCtx.rootId;\n      headers['x-delegation-depth'] = String(opts.delegationCtx.depth);\n      headers['x-delegation-budget'] = String(opts.delegationCtx.remainingBudget);\n    }\n\n    const response = await this.paymentClient.fetchWithPayment(url, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', ...headers },\n      body: opts?.input ? JSON.stringify({ input: opts.input }) : undefined,\n    });\n    return response.json();\n  }\n\n  /** Create a delegation context for multi-agent workflows */\n  createDelegation(budget: number): DelegationContext {\n    return this.delegation.createRoot(budget, this.config.chain);\n  }\n\n  /** Sub-delegate budget to a child task */\n  delegate(parent: DelegationContext, amount: number): DelegationContext {\n    return this.delegation.delegate(parent, amount);\n  }\n\n  /** Full flow: discover → select → call */\n  async discoverAndCall(query: string, input?: any): Promise<any> {\n    const candidates = await this.discover(query);\n    const provider = this.selectProvider(candidates);\n    if (!provider) throw new Error(`No provider found for: ${query}`);\n    return this.call(provider.url, { input });\n  }\n}\n\nexport function createAgentClient(config: AgentClientConfig): AgentClient {\n  return new AgentClient(config);\n}\n","import type { AgentCardData, AgentProviderConfig } from './types.js';\n\n/** A2A-compatible Agent Card for service advertisement */\nexport class AgentCard {\n  private data: AgentCardData;\n\n  constructor(data: AgentCardData) {\n    this.data = data;\n  }\n\n  /** Generate from AgentProvider config */\n  static fromProvider(config: AgentProviderConfig, url: string): AgentCard {\n    return new AgentCard({\n      name: config.name,\n      description: config.description,\n      url,\n      skills: config.tools.map(t => ({\n        name: t.name,\n        description: t.description,\n        price: typeof t.price === 'number' ? t.price : t.price.basePrice,\n        pricingMode: 'per-call',\n        inputSchema: t.inputSchema,\n      })),\n      chains: [config.chain],\n      protocols: ['x402', 'a2a'],\n      payTo: config.payTo,\n    });\n  }\n\n  /** Serialize to JSON (for /.well-known/agent.json) */\n  toJSON(): AgentCardData & { version: string } {\n    return { version: '1.0', ...this.data };\n  }\n\n  /** Express handler for /.well-known/agent.json */\n  handler() {\n    return (_req: any, res: any) => {\n      res.status(200).json(this.toJSON());\n    };\n  }\n}\n","import type { ChainKey } from '../types.js';\nimport { NPaymentError } from '../errors.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface BatchSessionConfig {\n  chain: ChainKey;\n  budget: bigint;\n  escrowContract: string;\n  ceilingPerRequest?: bigint;\n  autoSettleThreshold?: number; // % of budget\n}\n\nexport interface BatchVoucher {\n  sessionId: string;\n  cumulativeAmount: bigint;\n  nonce: number;\n  signature: string;\n  timestamp: number;\n}\n\nexport interface BatchSession {\n  id: string;\n  chain: ChainKey;\n  budget: bigint;\n  cumulativeSpent: bigint;\n  nonce: number;\n  status: 'active' | 'settling' | 'settled' | 'withdrawn';\n  createdAt: number;\n  expiresAt: number;\n}\n\nexport interface StreamConfig {\n  provider: string;\n  chain: ChainKey;\n  budget: bigint;\n  intervalMs?: number;\n  maxPerInterval?: bigint;\n}\n\nexport interface StreamSession {\n  id: string;\n  config: StreamConfig;\n  totalUsage: bigint;\n  intervalUsage: bigint;\n  lastSettledAt: number;\n  status: 'active' | 'paused' | 'cancelled' | 'exhausted';\n}\n\nexport interface Permit2Params {\n  token: string;\n  amount: bigint;\n  spender: string;\n  nonce: bigint;\n  deadline: number;\n}\n\n// ─── Batch Settlement ──────────────────────────────────────────────────────────\n\nexport class BatchSettlementManager {\n  private sessions = new Map<string, BatchSession>();\n\n  openSession(config: BatchSessionConfig): BatchSession {\n    const session: BatchSession = {\n      id: `batch_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`,\n      chain: config.chain,\n      budget: config.budget,\n      cumulativeSpent: 0n,\n      nonce: 0,\n      status: 'active',\n      createdAt: Date.now(),\n      expiresAt: Date.now() + 3600_000,\n    };\n    this.sessions.set(session.id, session);\n    return session;\n  }\n\n  signVoucher(sessionId: string, amount: bigint): BatchVoucher {\n    const session = this.sessions.get(sessionId);\n    if (!session || session.status !== 'active') {\n      throw new NPaymentError('Session not active', 'BATCH_INVALID_SESSION');\n    }\n    const newCumulative = session.cumulativeSpent + amount;\n    if (newCumulative > session.budget) {\n      throw new NPaymentError('Exceeds session budget', 'BATCH_OVER_BUDGET');\n    }\n    session.cumulativeSpent = newCumulative;\n    session.nonce++;\n    // EIP-712 signature placeholder — real impl signs with wallet\n    const signature = `0x${session.nonce.toString(16).padStart(64, '0')}`;\n    return {\n      sessionId,\n      cumulativeAmount: newCumulative,\n      nonce: session.nonce,\n      signature,\n      timestamp: Date.now(),\n    };\n  }\n\n  verifyVoucher(voucher: BatchVoucher): boolean {\n    const session = this.sessions.get(voucher.sessionId);\n    if (!session) return false;\n    return voucher.cumulativeAmount <= session.budget && voucher.nonce > 0;\n  }\n\n  settle(sessionId: string): BatchSession | undefined {\n    const session = this.sessions.get(sessionId);\n    if (session) session.status = 'settled';\n    return session;\n  }\n\n  shouldSettle(sessionId: string, threshold = 80): boolean {\n    const session = this.sessions.get(sessionId);\n    if (!session) return false;\n    return Number((session.cumulativeSpent * 100n) / session.budget) >= threshold;\n  }\n\n  getSession(id: string): BatchSession | undefined {\n    return this.sessions.get(id);\n  }\n}\n\n// ─── Streaming Payments ────────────────────────────────────────────────────────\n\nexport class StreamingPaymentManager {\n  private streams = new Map<string, StreamSession>();\n\n  createStream(config: StreamConfig): StreamSession {\n    const stream: StreamSession = {\n      id: `stream_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`,\n      config: { intervalMs: 60_000, ...config },\n      totalUsage: 0n,\n      intervalUsage: 0n,\n      lastSettledAt: Date.now(),\n      status: 'active',\n    };\n    this.streams.set(stream.id, stream);\n    return stream;\n  }\n\n  recordUsage(streamId: string, amount: bigint): void {\n    const stream = this.streams.get(streamId);\n    if (!stream || stream.status !== 'active') {\n      throw new NPaymentError('Stream not active', 'STREAM_INACTIVE');\n    }\n    if (stream.totalUsage + amount > stream.config.budget) {\n      stream.status = 'exhausted';\n      throw new NPaymentError('Stream budget exhausted', 'STREAM_EXHAUSTED');\n    }\n    if (stream.config.maxPerInterval && stream.intervalUsage + amount > stream.config.maxPerInterval) {\n      throw new NPaymentError('Exceeds interval limit', 'STREAM_RATE_LIMITED');\n    }\n    stream.totalUsage += amount;\n    stream.intervalUsage += amount;\n  }\n\n  settleInterval(streamId: string): { settled: bigint } {\n    const stream = this.streams.get(streamId);\n    if (!stream) throw new NPaymentError('Stream not found', 'STREAM_NOT_FOUND');\n    const settled = stream.intervalUsage;\n    stream.intervalUsage = 0n;\n    stream.lastSettledAt = Date.now();\n    return { settled };\n  }\n\n  cancelStream(streamId: string): { refund: bigint } {\n    const stream = this.streams.get(streamId);\n    if (!stream) throw new NPaymentError('Stream not found', 'STREAM_NOT_FOUND');\n    stream.status = 'cancelled';\n    return { refund: stream.config.budget - stream.totalUsage };\n  }\n\n  getStream(id: string): StreamSession | undefined {\n    return this.streams.get(id);\n  }\n\n  getActiveStreams(): StreamSession[] {\n    return [...this.streams.values()].filter(s => s.status === 'active');\n  }\n}\n\n// ─── Permit2 Signer ────────────────────────────────────────────────────────────\n\nexport class Permit2Signer {\n  static readonly PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';\n\n  /** Build EIP-712 typed data for Permit2 single transfer */\n  buildPermitTypedData(params: Permit2Params, chainId: number) {\n    return {\n      domain: {\n        name: 'Permit2',\n        chainId,\n        verifyingContract: Permit2Signer.PERMIT2_ADDRESS,\n      },\n      types: {\n        PermitSingle: [\n          { name: 'token', type: 'address' },\n          { name: 'amount', type: 'uint160' },\n          { name: 'expiration', type: 'uint48' },\n          { name: 'nonce', type: 'uint48' },\n          { name: 'spender', type: 'address' },\n          { name: 'sigDeadline', type: 'uint256' },\n        ],\n      },\n      value: {\n        token: params.token,\n        amount: params.amount,\n        expiration: params.deadline,\n        nonce: params.nonce,\n        spender: params.spender,\n        sigDeadline: BigInt(params.deadline),\n      },\n    };\n  }\n\n  /** Build batch permit typed data for multiple tokens */\n  buildBatchPermitTypedData(params: Permit2Params[], chainId: number) {\n    return {\n      domain: {\n        name: 'Permit2',\n        chainId,\n        verifyingContract: Permit2Signer.PERMIT2_ADDRESS,\n      },\n      types: {\n        PermitBatch: [\n          { name: 'tokens', type: 'address[]' },\n          { name: 'amounts', type: 'uint160[]' },\n          { name: 'nonce', type: 'uint48' },\n          { name: 'spender', type: 'address' },\n          { name: 'sigDeadline', type: 'uint256' },\n        ],\n      },\n      value: {\n        tokens: params.map(p => p.token),\n        amounts: params.map(p => p.amount),\n        nonce: params[0]?.nonce ?? 0n,\n        spender: params[0]?.spender ?? '',\n        sigDeadline: BigInt(params[0]?.deadline ?? 0),\n      },\n    };\n  }\n}\n","import { NPaymentError } from '../errors.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface AP2Config {\n  agentId: string;\n  signingKey?: string;\n}\n\nexport interface MandateConstraints {\n  maxBudget?: bigint;\n  allowedCategories?: string[];\n  allowedRecipients?: string[];\n  expiresAt?: number;\n}\n\nexport interface CartDetails {\n  items: Array<{ name: string; price: bigint; quantity: number }>;\n  total: bigint;\n  merchant: string;\n}\n\nexport interface CheckoutMandate {\n  id: string;\n  type: 'open' | 'closed';\n  agentId: string;\n  constraints?: MandateConstraints;\n  cart?: CartDetails;\n  signature: string;\n  createdAt: number;\n  expiresAt: number;\n}\n\nexport interface PaymentMandate {\n  id: string;\n  type: 'open' | 'closed';\n  checkoutMandateId: string;\n  amount: bigint;\n  instrument: 'x402' | 'mpp' | 'card' | 'nanopayment';\n  signature: string;\n  createdAt: number;\n}\n\nexport interface VerifiableIntent {\n  id: string;\n  agentId: string;\n  action: string;\n  constraints: Record<string, unknown>;\n  parentId?: string;\n  signature: string;\n  timestamp: number;\n  expiresAt: number;\n}\n\n// ─── AP2 Client ────────────────────────────────────────────────────────────────\n\nexport class AP2Client {\n  private config: AP2Config;\n  private mandates = new Map<string, CheckoutMandate>();\n\n  constructor(config: AP2Config) {\n    this.config = config;\n  }\n\n  /** Create an open checkout mandate (user sets constraints, agent shops freely) */\n  createCheckoutMandate(constraints: MandateConstraints): CheckoutMandate {\n    const mandate: CheckoutMandate = {\n      id: `cm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`,\n      type: 'open',\n      agentId: this.config.agentId,\n      constraints,\n      signature: this.sign(`checkout:open:${JSON.stringify(constraints)}`),\n      createdAt: Date.now(),\n      expiresAt: constraints.expiresAt ?? Date.now() + 3600_000,\n    };\n    this.mandates.set(mandate.id, mandate);\n    return mandate;\n  }\n\n  /** Close a checkout mandate by binding to specific cart */\n  closeCheckoutMandate(mandateId: string, cart: CartDetails): CheckoutMandate {\n    const mandate = this.mandates.get(mandateId);\n    if (!mandate || mandate.type !== 'open') {\n      throw new NPaymentError('Mandate not found or already closed', 'AP2_INVALID_MANDATE');\n    }\n    // Validate cart against constraints\n    if (mandate.constraints?.maxBudget && cart.total > mandate.constraints.maxBudget) {\n      throw new NPaymentError('Cart exceeds mandate budget', 'AP2_OVER_BUDGET');\n    }\n    mandate.type = 'closed';\n    mandate.cart = cart;\n    mandate.signature = this.sign(`checkout:closed:${mandate.id}:${cart.total}`);\n    return mandate;\n  }\n\n  /** Create payment mandate bound to a closed checkout */\n  createPaymentMandate(checkoutMandateId: string, amount: bigint, instrument: PaymentMandate['instrument']): PaymentMandate {\n    const checkout = this.mandates.get(checkoutMandateId);\n    if (!checkout || checkout.type !== 'closed') {\n      throw new NPaymentError('Checkout mandate must be closed first', 'AP2_MANDATE_NOT_CLOSED');\n    }\n    return {\n      id: `pm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`,\n      type: 'closed',\n      checkoutMandateId,\n      amount,\n      instrument,\n      signature: this.sign(`payment:${checkoutMandateId}:${amount}:${instrument}`),\n      createdAt: Date.now(),\n    };\n  }\n\n  /** Verify a mandate chain is valid */\n  verifyMandateChain(checkout: CheckoutMandate, payment: PaymentMandate): boolean {\n    if (payment.checkoutMandateId !== checkout.id) return false;\n    if (checkout.type !== 'closed') return false;\n    if (checkout.cart && payment.amount > checkout.cart.total) return false;\n    if (Date.now() > checkout.expiresAt) return false;\n    return true;\n  }\n\n  private sign(data: string): string {\n    // Placeholder — real impl uses signingKey with EIP-712 or Ed25519\n    const hash = Array.from(data).reduce((h, c) => ((h << 5) - h + c.charCodeAt(0)) | 0, 0);\n    return `0x${Math.abs(hash).toString(16).padStart(64, '0')}`;\n  }\n}\n\n// ─── Verifiable Intent ─────────────────────────────────────────────────────────\n\nexport class VerifiableIntentSigner {\n  private agentId: string;\n\n  constructor(agentId: string) {\n    this.agentId = agentId;\n  }\n\n  /** Create a verifiable intent (user authorizes agent action) */\n  create(action: string, constraints: Record<string, unknown>, ttlMs = 3600_000): VerifiableIntent {\n    const intent: VerifiableIntent = {\n      id: `vi_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`,\n      agentId: this.agentId,\n      action,\n      constraints,\n      signature: this.sign(`${action}:${JSON.stringify(constraints)}`),\n      timestamp: Date.now(),\n      expiresAt: Date.now() + ttlMs,\n    };\n    return intent;\n  }\n\n  /** Chain a child intent to a parent (multi-step workflows) */\n  chain(parent: VerifiableIntent, action: string, constraints: Record<string, unknown>): VerifiableIntent {\n    const child = this.create(action, constraints);\n    child.parentId = parent.id;\n    child.signature = this.sign(`${parent.id}:${action}:${JSON.stringify(constraints)}`);\n    return child;\n  }\n\n  /** Verify an intent is valid and not expired */\n  verify(intent: VerifiableIntent): boolean {\n    if (Date.now() > intent.expiresAt) return false;\n    if (intent.agentId !== this.agentId) return false;\n    return true;\n  }\n\n  private sign(data: string): string {\n    const hash = Array.from(data).reduce((h, c) => ((h << 5) - h + c.charCodeAt(0)) | 0, 0);\n    return `0x${Math.abs(hash).toString(16).padStart(64, '0')}`;\n  }\n}\n","/**\n * Morph Hoodi custom x402 facilitator (v0.18).\n *\n * Self-contained, single-file implementation of Morph Rails' three endpoints\n * (`/v2/supported`, `/v2/verify`, `/v2/settle`) for the Hoodi testnet, with\n * **EIP-3009 sponsored** transferWithAuthorization submission so buyers pay\n * **zero ETH** for gas.\n *\n * Design principles (SOLID):\n *   - Single Responsibility: this file orchestrates three HTTP endpoints; the\n *     EIP-3009 typed-data + signature helpers live in `./eip3009.ts`, the HMAC\n *     auth helper in `./auth.ts`. Nothing here is reimplemented.\n *   - Open/Closed: new schemes plug in via the `kind` filter in `/v2/supported`.\n *     The verify/settle handlers branch only on the `scheme: 'eip3009'` value\n *     they receive — no chain-specific switches inside the handler.\n *   - Dependency Inversion: the on-chain client + sponsor account are injected\n *     via factory params. Tests pass viem mocks directly; the production runner\n *     in `examples/morph-hoodi-facilitator.ts` constructs viem clients from\n *     `chains.ts`.\n *\n * Replay protection: in-memory `Set<nonce>` (per-process). Sufficient for\n * testnet; production callers run a stateful gateway in front of this layer.\n *\n * No DB, no extra deps. Boots in <100ms. Single Express handler.\n */\nimport type { Address, Hex, PublicClient, WalletClient } from 'viem';\nimport { signMorphRequest } from './auth.js';\nimport {\n  decodeAuthorizationPayload,\n  buildTransferWithAuthorizationTypedData,\n  splitSignature,\n  EIP3009_ABI,\n} from './eip3009.js';\nimport { NPaymentError } from '../errors.js';\n\n// ─── Public types ───────────────────────────────────────────────────────────\n\nexport interface MorphHoodiFacilitatorConfig {\n  /** Hoodi USDC address (0x7433…b661B for our deploy). */\n  usdcAddress: Address;\n  /** EIP-712 domain name for the USDC contract. @default 'USD Coin' */\n  tokenName?: string;\n  /** EIP-712 domain version. @default '2' */\n  tokenVersion?: string;\n  /** Required: viem PublicClient pointed at Hoodi RPC. */\n  publicClient: PublicClient;\n  /** Required: viem WalletClient backed by the sponsor account (pays gas). */\n  sponsorClient: WalletClient;\n  /** Sponsor address (used for receipt validation). */\n  sponsorAddress: Address;\n  /** Network CAIP-2 id. @default 'eip155:2910' */\n  network?: string;\n  /** When `accessKey`/`secretKey` are set, every /v2/verify and /v2/settle call must pass HMAC. */\n  accessKey?: string;\n  secretKey?: string;\n  /** Override the path prefix. @default '/x402' */\n  pathPrefix?: string;\n  /** Maximum clock skew allowed for HMAC timestamps in ms. @default 30_000 */\n  hmacSkewMs?: number;\n}\n\ninterface MinimalReq {\n  method: string;\n  url?: string;\n  originalUrl?: string;\n  path?: string;\n  headers: Record<string, string | string[] | undefined>;\n  body?: unknown;\n}\n\ninterface MinimalRes {\n  status(code: number): MinimalRes;\n  json(body: unknown): unknown;\n}\n\ntype Handler = (req: MinimalReq, res: MinimalRes) => Promise<unknown> | unknown;\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Build the Express request handler for the Hoodi facilitator.\n *\n *   app.use(express.json());\n *   app.use(createMorphHoodiFacilitator({ ...cfg }));\n *\n * The handler routes by `req.path` against `pathPrefix + endpoint` so it is\n * mountable at any base path.\n */\nexport function createMorphHoodiFacilitator(cfg: MorphHoodiFacilitatorConfig): Handler {\n  const prefix = (cfg.pathPrefix ?? '/x402').replace(/\\/$/, '');\n  const requireHmac = !!(cfg.accessKey && cfg.secretKey);\n  const seenNonces = new Set<Hex>();\n\n  const supported: Handler = (_req, res) =>\n    res.status(200).json({\n      kinds: [{ x402Version: 2, scheme: 'eip3009', network: cfg.network ?? 'eip155:2910' }],\n      extensions: [],\n      signers: { [cfg.network ?? 'eip155:2910']: [cfg.sponsorAddress] },\n    });\n\n  const verify: Handler = async (req, res) => {\n    const result = await runVerify(req, cfg, seenNonces, /* consumeNonce */ false);\n    return res.status(result.httpStatus).json(result.body);\n  };\n\n  const settle: Handler = async (req, res) => {\n    const verifyResult = await runVerify(req, cfg, seenNonces, /* consumeNonce */ true);\n    if (verifyResult.httpStatus !== 200 || !verifyResult.auth || !verifyResult.signature) {\n      return res.status(verifyResult.httpStatus).json(verifyResult.body);\n    }\n    try {\n      const txHash = await submitOnChain(cfg, verifyResult.auth, verifyResult.signature);\n      return res.status(200).json({\n        success: true,\n        payer: verifyResult.auth.from,\n        transaction: txHash,\n        network: cfg.network ?? 'eip155:2910',\n      });\n    } catch (err) {\n      seenNonces.delete(verifyResult.auth.nonce); // free nonce on failure so caller may retry\n      const message = err instanceof Error ? err.message : 'unknown error';\n      return res.status(500).json({ success: false, errorReason: `submit failed: ${message}` });\n    }\n  };\n\n  return async (req, res) => {\n    if (!isOurPath(req, prefix)) return res.status(404).json({ error: 'not found' });\n    if (requireHmac && !verifyHmac(req, cfg)) {\n      return res.status(401).json({ success: false, errorReason: 'invalid HMAC signature' });\n    }\n    const subpath = stripPrefix(reqPath(req), prefix);\n    if (subpath === '/v2/supported' && req.method === 'GET') return supported(req, res);\n    if (subpath === '/v2/verify' && req.method === 'POST') return verify(req, res);\n    if (subpath === '/v2/settle' && req.method === 'POST') return settle(req, res);\n    return res.status(404).json({ error: `unknown route ${req.method} ${subpath}` });\n  };\n}\n\n// ─── Internals ──────────────────────────────────────────────────────────────\n\ninterface VerifyResult {\n  httpStatus: number;\n  body: Record<string, unknown>;\n  auth?: ReturnType<typeof decodeAuthorizationPayload>;\n  signature?: Hex;\n}\n\n/**\n * Verify a payment payload. When `consumeNonce` is true, the nonce is registered\n * in the dedupe set on success (used by /v2/settle); when false, it is only\n * peeked (used by /v2/verify).\n */\nasync function runVerify(\n  req: MinimalReq,\n  cfg: MorphHoodiFacilitatorConfig,\n  seenNonces: Set<Hex>,\n  consumeNonce: boolean,\n): Promise<VerifyResult> {\n  const body = (req.body ?? {}) as Record<string, unknown>;\n  const requirements = body.paymentRequirements as Record<string, unknown> | undefined;\n  const payload = body.paymentPayload as Record<string, unknown> | undefined;\n  if (!requirements || !payload) {\n    return fail(400, 'missing paymentRequirements or paymentPayload', 'BAD_REQUEST');\n  }\n\n  // Asset / network sanity (fail fast — independent of signature work).\n  const expectedAsset = cfg.usdcAddress.toLowerCase();\n  const reqAsset = String(requirements.asset ?? '').toLowerCase();\n  if (reqAsset && reqAsset !== expectedAsset) {\n    return fail(400, `asset ${reqAsset} not supported (expected ${expectedAsset})`, 'ASSET_MISMATCH');\n  }\n  const expectedNetwork = cfg.network ?? 'eip155:2910';\n  if (requirements.network && requirements.network !== expectedNetwork) {\n    return fail(400, `network ${requirements.network} not supported (expected ${expectedNetwork})`, 'NETWORK_MISMATCH');\n  }\n\n  let auth: ReturnType<typeof decodeAuthorizationPayload>;\n  let signature: Hex;\n  try {\n    // The adapter wraps the EIP-3009 fields inside paymentPayload.payload.{authorization,signature}\n    // (matching the x402 v2 envelope: { scheme, network, payload }). Older clients sometimes\n    // flatten them onto paymentPayload directly — accept both for compat.\n    const inner = (payload.payload && typeof payload.payload === 'object')\n      ? (payload.payload as Record<string, unknown>)\n      : payload;\n    auth = decodeAuthorizationPayload(inner.authorization);\n    signature = inner.signature as Hex;\n    if (!signature || !signature.startsWith('0x')) throw new Error('signature missing or malformed');\n  } catch (err) {\n    return fail(400, `invalid authorization payload: ${(err as Error).message}`, 'BAD_AUTHORIZATION');\n  }\n\n  // Time window\n  const now = BigInt(Math.floor(Date.now() / 1000));\n  if (auth.validAfter > now) return fail(400, 'authorization not yet valid', 'AUTH_NOT_YET_VALID');\n  if (auth.validBefore <= now) return fail(400, 'authorization expired', 'AUTH_EXPIRED');\n\n  // Amount must cover requirement\n  const required = BigInt(String(requirements.maxAmountRequired ?? '0'));\n  if (auth.value < required) {\n    return fail(400, `authorization value ${auth.value} < required ${required}`, 'AMOUNT_TOO_LOW');\n  }\n  // payTo must match\n  const payTo = String(requirements.payTo ?? '').toLowerCase();\n  if (payTo && auth.to.toLowerCase() !== payTo) {\n    return fail(400, `authorization to ${auth.to} != payTo ${payTo}`, 'PAYTO_MISMATCH');\n  }\n\n  // Replay (in-memory)\n  if (seenNonces.has(auth.nonce)) {\n    return fail(409, `nonce ${auth.nonce} already used`, 'MORPH_NONCE_REPLAYED');\n  }\n\n  // Recover signer from EIP-712 typed data — must equal `auth.from`.\n  const td = buildTransferWithAuthorizationTypedData({\n    verifyingContract: cfg.usdcAddress,\n    chainId: cfg.publicClient.chain?.id ?? Number((cfg.network ?? 'eip155:2910').split(':')[1]),\n    tokenName: cfg.tokenName,\n    tokenVersion: cfg.tokenVersion,\n    authorization: auth,\n  });\n  const { recoverTypedDataAddress } = await import('viem');\n  let recovered: Address;\n  try {\n    recovered = await recoverTypedDataAddress({\n      domain: td.domain, types: td.types, primaryType: td.primaryType,\n      message: td.message, signature,\n    });\n  } catch (err) {\n    return fail(400, `signature recovery failed: ${(err as Error).message}`, 'BAD_SIGNATURE');\n  }\n  if (recovered.toLowerCase() !== auth.from.toLowerCase()) {\n    return fail(400, `recovered ${recovered} != from ${auth.from}`, 'SIGNATURE_MISMATCH');\n  }\n\n  // On-chain replay check (best-effort — facilitator may not have RPC during unit tests).\n  try {\n    const used = (await cfg.publicClient.readContract({\n      address: cfg.usdcAddress,\n      abi: EIP3009_ABI,\n      functionName: 'authorizationState',\n      args: [auth.from, auth.nonce],\n    })) as boolean;\n    if (used) return fail(409, 'authorizationState true on-chain', 'AUTHORIZATION_USED');\n  } catch (err) {\n    // Bubble up as a 502 so callers know their RPC is unhealthy — but only on /v2/settle.\n    if (consumeNonce) {\n      return fail(502, `authorizationState read failed: ${(err as Error).message}`, 'RPC_UNAVAILABLE');\n    }\n  }\n\n  if (consumeNonce) seenNonces.add(auth.nonce);\n\n  return {\n    httpStatus: 200,\n    body: { isValid: true, payer: auth.from },\n    auth, signature,\n  };\n}\n\nfunction fail(httpStatus: number, msg: string, code: string): VerifyResult {\n  return { httpStatus, body: { isValid: false, success: false, invalidReason: msg, errorReason: msg, code } };\n}\n\nasync function submitOnChain(\n  cfg: MorphHoodiFacilitatorConfig,\n  auth: ReturnType<typeof decodeAuthorizationPayload>,\n  signature: Hex,\n): Promise<Hex> {\n  const { v, r, s } = splitSignature(signature);\n  const txHash = await cfg.sponsorClient.writeContract({\n    address: cfg.usdcAddress,\n    abi: EIP3009_ABI,\n    functionName: 'transferWithAuthorization',\n    args: [auth.from, auth.to, auth.value, auth.validAfter, auth.validBefore, auth.nonce, v, r, s],\n    account: cfg.sponsorClient.account ?? cfg.sponsorAddress,\n    chain: cfg.sponsorClient.chain ?? null,\n  } as never);\n  // Wait for receipt (so caller gets a confirmed tx, not a mempool optimistic hash)\n  const receipt = await cfg.publicClient.waitForTransactionReceipt({ hash: txHash, timeout: 60_000 });\n  if (receipt.status !== 'success') {\n    throw new NPaymentError(`tx ${txHash} reverted on Hoodi`, 'TX_REVERTED');\n  }\n  return txHash;\n}\n\nfunction isOurPath(req: MinimalReq, prefix: string): boolean {\n  const path = reqPath(req);\n  return path.startsWith(`${prefix}/`);\n}\n\nfunction reqPath(req: MinimalReq): string {\n  if (req.path) return req.path;\n  const raw = req.originalUrl ?? req.url ?? '/';\n  const q = raw.indexOf('?');\n  return q === -1 ? raw : raw.slice(0, q);\n}\n\nfunction stripPrefix(path: string, prefix: string): string {\n  return path.startsWith(prefix) ? path.slice(prefix.length) : path;\n}\n\nfunction verifyHmac(req: MinimalReq, cfg: MorphHoodiFacilitatorConfig): boolean {\n  const accessKey = headerValue(req, 'morph-access-key');\n  const timestamp = headerValue(req, 'morph-access-timestamp');\n  const sign = headerValue(req, 'morph-access-sign');\n  if (!accessKey || !timestamp || !sign) return false;\n  if (accessKey !== cfg.accessKey) return false;\n  const skew = cfg.hmacSkewMs ?? 30_000;\n  const ts = Number(timestamp);\n  if (!Number.isFinite(ts) || Math.abs(Date.now() - ts) > skew) return false;\n  const path = reqPath(req);\n  const bodyStr = req.body ? JSON.stringify(req.body) : undefined;\n  const expected = signMorphRequest({\n    method: req.method,\n    path,\n    body: bodyStr,\n    accessKey: cfg.accessKey!,\n    secretKey: cfg.secretKey!,\n    timestamp,\n  });\n  return expected['MORPH-ACCESS-SIGN'] === sign;\n}\n\nfunction headerValue(req: MinimalReq, key: string): string | undefined {\n  const v = req.headers[key] ?? req.headers[key.toUpperCase()];\n  if (Array.isArray(v)) return v[0];\n  return v as string | undefined;\n}\n","import { createPublicClient, defineChain, http } from 'viem';\nimport type { Address, PublicClient } from 'viem';\nimport { NPaymentError } from '../errors.js';\nimport type { FlareConfig, FlareNetwork } from '../types.js';\nimport { flareContractRegistryAbi } from './abis.js';\n\n// ─── Constants (single source of truth) ──────────────────────────────────────\n\n/**\n * Canonical FlareContractRegistry root address. Identical across Flare mainnet,\n * Coston2, and Songbird. Source: https://dev.flare.network/network/guides/flare-contracts-registry\n */\nexport const FLARE_CONTRACT_REGISTRY_ADDRESS =\n  '0xaD67FE66660Fb8dFE9d6b1b4240d8650e30F6019' as const;\n\n/** Per-network public RPC defaults. v0.19: Coston2 testnet + Songbird + Flare mainnet. */\nconst RPC_URLS: Readonly<Record<FlareNetwork, string>> = Object.freeze({\n  'coston2-testnet': 'https://coston2-api.flare.network/ext/C/rpc',\n  'songbird-mainnet': 'https://songbird-api.flare.network/ext/C/rpc',\n  'flare-mainnet': 'https://flare-api.flare.network/ext/C/rpc',\n});\n\n/** Per-network viem chain definitions (avoids depending on viem's per-version chain list). */\nconst CHAIN_DEFS: Readonly<Record<FlareNetwork, ReturnType<typeof defineChain>>> = Object.freeze({\n  'coston2-testnet': defineChain({\n    id: 114,\n    name: 'Flare Coston2 Testnet',\n    nativeCurrency: { name: 'Coston2 Flare', symbol: 'C2FLR', decimals: 18 },\n    rpcUrls: { default: { http: [RPC_URLS['coston2-testnet']] } },\n    testnet: true,\n  }),\n  'songbird-mainnet': defineChain({\n    id: 19,\n    name: 'Songbird',\n    nativeCurrency: { name: 'Songbird', symbol: 'SGB', decimals: 18 },\n    rpcUrls: { default: { http: [RPC_URLS['songbird-mainnet']] } },\n  }),\n  'flare-mainnet': defineChain({\n    id: 14,\n    name: 'Flare',\n    nativeCurrency: { name: 'Flare', symbol: 'FLR', decimals: 18 },\n    rpcUrls: { default: { http: [RPC_URLS['flare-mainnet']] } },\n  }),\n});\n\n/** Contract names registered in the FlareContractRegistry — exact strings matter. */\nexport type FlareContractName =\n  | 'AssetManagerFXRP'\n  | 'MasterAccountController'\n  | 'MintingTagManager';\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const;\nconst REGISTRY_TTL_MS = 5 * 60_000; // 5 minutes — addresses change only on protocol upgrades.\n\n// ─── FlareContractsRegistry ──────────────────────────────────────────────────\n\n/**\n * Cached resolver for Flare contract addresses. Reads from the well-known\n * FlareContractRegistry once per name per TTL window; subsequent lookups are\n * free. Throws FLARE_CONTRACT_NOT_FOUND on zero-address responses with an\n * actionable hint.\n */\nexport class FlareContractsRegistry {\n  private readonly cache = new Map<string, { address: Address; expiresAt: number }>();\n\n  constructor(\n    private readonly publicClient: PublicClient,\n    private readonly root: Address = FLARE_CONTRACT_REGISTRY_ADDRESS,\n  ) {}\n\n  async address(name: FlareContractName): Promise<Address> {\n    const now = Date.now();\n    const hit = this.cache.get(name);\n    if (hit && hit.expiresAt > now) return hit.address;\n\n    const result = (await this.publicClient.readContract({\n      address: this.root,\n      abi: flareContractRegistryAbi,\n      functionName: 'getContractAddressByName',\n      args: [name],\n    })) as Address;\n\n    if (!result || result.toLowerCase() === ZERO_ADDRESS) {\n      throw new NPaymentError(\n        `Flare contract \"${name}\" not registered`,\n        'FLARE_CONTRACT_NOT_FOUND',\n        `Verify the contract is deployed on this network and the name spelling matches the registry.`,\n      );\n    }\n\n    this.cache.set(name, { address: result, expiresAt: now + REGISTRY_TTL_MS });\n    return result;\n  }\n\n  /** Test/operational helper — drop the cache so the next read hits the chain. */\n  clearCache(): void {\n    this.cache.clear();\n  }\n}\n\n// ─── FlareClient ─────────────────────────────────────────────────────────────\n\nexport interface FlareClientConfig extends FlareConfig {\n  /** Inject a pre-built viem PublicClient. Useful for tests or shared transports. */\n  publicClient?: PublicClient;\n}\n\n/**\n * Thin viem PublicClient wrapper bound to a Flare network with an attached\n * FlareContractsRegistry. Single source of read I/O for the rest of the\n * Flare module.\n */\nexport class FlareClient {\n  readonly publicClient: PublicClient;\n  readonly registry: FlareContractsRegistry;\n  readonly network: FlareNetwork;\n\n  constructor(config: FlareClientConfig = {}) {\n    this.network = config.network ?? 'coston2-testnet';\n    if (!CHAIN_DEFS[this.network]) {\n      throw new NPaymentError(\n        `Unsupported Flare network: ${this.network}`,\n        'FLARE_UNSUPPORTED_NETWORK',\n        `Use one of: ${Object.keys(CHAIN_DEFS).join(', ')}.`,\n      );\n    }\n\n    this.publicClient =\n      config.publicClient ??\n      createPublicClient({\n        chain: CHAIN_DEFS[this.network],\n        transport: http(config.rpcUrl ?? RPC_URLS[this.network]),\n      } as never);\n\n    this.registry = new FlareContractsRegistry(\n      this.publicClient,\n      config.contractRegistry ?? FLARE_CONTRACT_REGISTRY_ADDRESS,\n    );\n  }\n}\n\nexport function createFlareClient(config: FlareClientConfig = {}): FlareClient {\n  return new FlareClient(config);\n}\n","/**\n * Hand-trimmed ABI subset for the Flare contracts the FXRP bridge calls.\n * Keep the smallest possible footprint — every function listed here is one\n * the SDK actively reads or writes. Pulled from the published Flare docs:\n *   https://dev.flare.network/smart-accounts/reference\n *   https://dev.flare.network/fassets/reference\n */\n\nexport const flareContractRegistryAbi = [\n  {\n    type: 'function',\n    name: 'getContractAddressByName',\n    stateMutability: 'view',\n    inputs: [{ name: '_name', type: 'string' }],\n    outputs: [{ name: '', type: 'address' }],\n  },\n] as const;\n\nexport const assetManagerAbi = [\n  {\n    type: 'function',\n    name: 'fAsset',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'address' }],\n  },\n  {\n    type: 'function',\n    name: 'directMintingPaymentAddress',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'string' }],\n  },\n  {\n    type: 'function',\n    name: 'getDirectMintingFeeBIPS',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'getDirectMintingMinimumFeeUBA',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'getDirectMintingExecutorFeeUBA',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'getDirectMintingLargeMintingThresholdUBA',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  // ─── v0.22.1 — FAssets redemption (FXRP → XRP on XRPL) ─────────────────\n  {\n    type: 'function',\n    name: 'redeem',\n    stateMutability: 'payable',\n    inputs: [\n      { name: 'lots', type: 'uint256' },\n      { name: 'redeemerUnderlyingAddressString', type: 'string' },\n      { name: 'executor', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'getRedemptionFeeBIPS',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'getRedemptionMinimumFeeUBA',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'getRedemptionExecutorFeeUBA',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'lotSize',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'event',\n    name: 'RedemptionRequested',\n    inputs: [\n      { name: 'redeemer', type: 'address', indexed: true },\n      { name: 'requestId', type: 'uint256', indexed: true },\n      { name: 'paymentAmountUBA', type: 'uint256', indexed: false },\n      { name: 'paymentAddress', type: 'string', indexed: false },\n    ],\n  },\n  {\n    type: 'event',\n    name: 'RedemptionPerformed',\n    inputs: [\n      { name: 'redeemer', type: 'address', indexed: true },\n      { name: 'requestId', type: 'uint256', indexed: true },\n      { name: 'transactionHash', type: 'bytes32', indexed: false },\n    ],\n  },\n  {\n    type: 'event',\n    name: 'RedemptionPaymentFailed',\n    inputs: [\n      { name: 'redeemer', type: 'address', indexed: true },\n      { name: 'requestId', type: 'uint256', indexed: true },\n      { name: 'failureReason', type: 'string', indexed: false },\n    ],\n  },\n] as const;\n\nexport const masterAccountControllerAbi = [\n  {\n    type: 'function',\n    name: 'getPersonalAccount',\n    stateMutability: 'view',\n    inputs: [{ name: 'xrplAddress', type: 'string' }],\n    outputs: [{ name: '', type: 'address' }],\n  },\n  {\n    type: 'function',\n    name: 'getXrplProviderWallets',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'string[]' }],\n  },\n  {\n    type: 'function',\n    name: 'getVaults',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [\n      { name: 'ids', type: 'uint256[]' },\n      { name: 'addresses', type: 'address[]' },\n      { name: 'types', type: 'uint8[]' },\n    ],\n  },\n  {\n    type: 'function',\n    name: 'getAgentVaults',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [\n      { name: 'ids', type: 'uint256[]' },\n      { name: 'addresses', type: 'address[]' },\n    ],\n  },\n] as const;\n\nexport const personalAccountAbi = [\n  {\n    type: 'function',\n    name: 'xrplOwner',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'string' }],\n  },\n] as const;\n\nexport const erc20Abi = [\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: 'decimals',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint8' }],\n  },\n] as const;\n","import type { Address } from 'viem';\nimport { NPaymentError } from '../errors.js';\nimport {\n  assetManagerAbi,\n  erc20Abi,\n  masterAccountControllerAbi,\n  personalAccountAbi,\n} from './abis.js';\nimport type { FlareClient } from './client.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface FlareVault {\n  id: bigint;\n  address: Address;\n  /** 1 = Firelight, 2 = Upshift. */\n  type: number;\n}\n\nexport interface FlareAgentVault {\n  id: bigint;\n  address: Address;\n}\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n// ─── Personal account resolution ─────────────────────────────────────────────\n\n/**\n * Resolve the PersonalAccount address for an XRPL classic address.\n * Returns the precomputed CREATE2 address even before the contract is deployed,\n * which is the canonical recipient for FXRP direct minting.\n */\nexport async function getPersonalAccountAddress(\n  client: FlareClient,\n  xrplAddress: string,\n): Promise<Address> {\n  const macAddress = await client.registry.address('MasterAccountController');\n  const result = (await client.publicClient.readContract({\n    address: macAddress,\n    abi: masterAccountControllerAbi,\n    functionName: 'getPersonalAccount',\n    args: [xrplAddress],\n  })) as Address;\n\n  if (!result || result.toLowerCase() === ZERO_ADDRESS) {\n    throw new NPaymentError(\n      `Could not resolve PersonalAccount for XRPL address ${xrplAddress}`,\n      'FLARE_PERSONAL_ACCOUNT_RESOLUTION_FAILED',\n      'Verify the XRPL address is non-empty and rippled is reachable; the smart account is auto-deployed on first action.',\n    );\n  }\n  return result;\n}\n\n/** True iff the EVM address is a deployed PersonalAccount (i.e. its `xrplOwner()` returns non-empty). */\nexport async function isSmartAccount(client: FlareClient, evmAddress: Address): Promise<boolean> {\n  try {\n    const owner = (await client.publicClient.readContract({\n      address: evmAddress,\n      abi: personalAccountAbi,\n      functionName: 'xrplOwner',\n      args: [],\n    })) as string;\n    return typeof owner === 'string' && owner.length > 0;\n  } catch {\n    return false;\n  }\n}\n\n// ─── Operator XRPL addresses ────────────────────────────────────────────────\n\nexport async function getOperatorXrplAddresses(client: FlareClient): Promise<string[]> {\n  const macAddress = await client.registry.address('MasterAccountController');\n  return (await client.publicClient.readContract({\n    address: macAddress,\n    abi: masterAccountControllerAbi,\n    functionName: 'getXrplProviderWallets',\n    args: [],\n  })) as string[];\n}\n\n// ─── FXRP token ──────────────────────────────────────────────────────────────\n\nexport async function getFxrpAddress(client: FlareClient): Promise<Address> {\n  const assetManager = await client.registry.address('AssetManagerFXRP');\n  return (await client.publicClient.readContract({\n    address: assetManager,\n    abi: assetManagerAbi,\n    functionName: 'fAsset',\n  })) as Address;\n}\n\nexport async function getFxrpBalance(client: FlareClient, address: Address): Promise<bigint> {\n  const fxrp = await getFxrpAddress(client);\n  return (await client.publicClient.readContract({\n    address: fxrp,\n    abi: erc20Abi,\n    functionName: 'balanceOf',\n    args: [address],\n  })) as bigint;\n}\n\nexport async function getFxrpDecimals(client: FlareClient): Promise<number> {\n  const fxrp = await getFxrpAddress(client);\n  const d = (await client.publicClient.readContract({\n    address: fxrp,\n    abi: erc20Abi,\n    functionName: 'decimals',\n  })) as number;\n  return Number(d);\n}\n\n// ─── Vaults + agent vaults ───────────────────────────────────────────────────\n\nexport async function getVaults(client: FlareClient): Promise<FlareVault[]> {\n  const macAddress = await client.registry.address('MasterAccountController');\n  const result = (await client.publicClient.readContract({\n    address: macAddress,\n    abi: masterAccountControllerAbi,\n    functionName: 'getVaults',\n    args: [],\n  })) as readonly [readonly bigint[], readonly Address[], readonly number[]];\n\n  const [ids, addresses, types] = result;\n  return ids.map((id, i) => ({ id, address: addresses[i]!, type: Number(types[i]) }));\n}\n\nexport async function getAgentVaults(client: FlareClient): Promise<FlareAgentVault[]> {\n  const macAddress = await client.registry.address('MasterAccountController');\n  const result = (await client.publicClient.readContract({\n    address: macAddress,\n    abi: masterAccountControllerAbi,\n    functionName: 'getAgentVaults',\n    args: [],\n  })) as readonly [readonly bigint[], readonly Address[]];\n\n  const [ids, addresses] = result;\n  return ids.map((id, i) => ({ id, address: addresses[i]! }));\n}\n","import type { Address } from 'viem';\nimport { NPaymentError } from '../errors.js';\nimport { assetManagerAbi } from './abis.js';\nimport type { FlareClient } from './client.js';\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\n/** XRP scale: 1 XRP = 1,000,000 drops (and 1 UBA, since FXRP mirrors XRP drops). */\nexport const XRP_SCALE = 1_000_000n;\nconst BIPS_DENOMINATOR = 10_000n;\n\n/** 32-byte memo magic for the recipient-only direct-minting memo: bytes \"FBPRfA\" + 0x0018. */\nexport const DIRECT_MINTING_MEMO_PREFIX = '4642505266410018';\n\n// ─── Amount validation (strict, BigInt-based) ────────────────────────────────\n\n/**\n * Parse a decimal XRP amount string into UBA / drops (6-decimal bigint).\n * Rejects scientific notation, NaN, negatives, zero, and over-precision.\n *\n * @example parseXrpDropsAmount(\"10\")        → 10_000_000n\n * @example parseXrpDropsAmount(\"10.123456\") → 10_123_456n\n */\nexport function parseXrpDropsAmount(input: string): bigint {\n  if (typeof input !== 'string' || !/^[0-9]+(\\.[0-9]{1,6})?$/.test(input)) {\n    throw new NPaymentError(\n      `Invalid XRP amount: ${JSON.stringify(input)}`,\n      'FLARE_INVALID_AMOUNT',\n      'Use plain decimal notation up to 6 places, e.g. \"10.123456\".',\n    );\n  }\n  const [int, frac = ''] = input.split('.');\n  const fracPadded = (frac + '000000').slice(0, 6);\n  const units = BigInt(int) * XRP_SCALE + BigInt(fracPadded);\n  if (units === 0n) {\n    throw new NPaymentError('XRP amount must be > 0', 'FLARE_INVALID_AMOUNT');\n  }\n  return units;\n}\n\n/** Format 6-decimal UBA back to a decimal XRP string. Trailing zeros trimmed. */\nexport function formatXrpDropsAmount(units: bigint): string {\n  if (units < 0n) {\n    throw new NPaymentError('Negative XRP amount', 'FLARE_INVALID_AMOUNT');\n  }\n  const int = units / XRP_SCALE;\n  const frac = units % XRP_SCALE;\n  if (frac === 0n) return int.toString();\n  return `${int}.${frac.toString().padStart(6, '0').replace(/0+$/, '')}`;\n}\n\n// ─── Fee maths (pure) ────────────────────────────────────────────────────────\n\nexport interface DirectMintingFees {\n  /** Proportional fee in BIPS (1/10_000). */\n  feeBips: bigint;\n  /** Minimum minting fee floor (UBA). */\n  minFeeUBA: bigint;\n  /** Flat executor fee (UBA). */\n  executorFeeUBA: bigint;\n}\n\nexport interface DirectMintingQuote {\n  netMintUBA: bigint;\n  proportionalFeeUBA: bigint;\n  mintingFeeUBA: bigint;\n  executorFeeUBA: bigint;\n  totalUBA: bigint;\n  paymentXrp: string;\n  netFxrp: string;\n}\n\n/**\n * Compute the gross XRP payment required to mint `netMintAmountXrp` XRP-worth of FXRP,\n * accounting for the proportional minting fee + minimum floor + flat executor fee.\n * Pure function — no I/O. Mirrors the maths from the Flare cross-chain-mint guide.\n */\nexport function computeDirectMintingQuote(\n  netMintAmountXrp: string,\n  fees: DirectMintingFees,\n): DirectMintingQuote {\n  const netMintUBA = parseXrpDropsAmount(netMintAmountXrp);\n  const proportionalFeeUBA = (netMintUBA * fees.feeBips) / BIPS_DENOMINATOR;\n  const mintingFeeUBA = proportionalFeeUBA > fees.minFeeUBA ? proportionalFeeUBA : fees.minFeeUBA;\n  const totalUBA = netMintUBA + mintingFeeUBA + fees.executorFeeUBA;\n  return {\n    netMintUBA,\n    proportionalFeeUBA,\n    mintingFeeUBA,\n    executorFeeUBA: fees.executorFeeUBA,\n    totalUBA,\n    paymentXrp: formatXrpDropsAmount(totalUBA),\n    netFxrp: formatXrpDropsAmount(netMintUBA),\n  };\n}\n\n// ─── On-chain reads (Core Vault address + fees + threshold) ──────────────────\n\n/** Resolve the Core Vault XRPL address — destination for every direct-minting Payment. */\nexport async function getDirectMintingPaymentAddress(client: FlareClient): Promise<string> {\n  const assetManager = await client.registry.address('AssetManagerFXRP');\n  try {\n    return (await client.publicClient.readContract({\n      address: assetManager,\n      abi: assetManagerAbi,\n      functionName: 'directMintingPaymentAddress',\n    })) as string;\n  } catch (err) {\n    throw new NPaymentError(\n      `Failed to resolve Core Vault XRPL address: ${(err as Error).message}`,\n      'FLARE_CORE_VAULT_RESOLUTION_FAILED',\n      'Verify the Coston2 RPC is reachable and the AssetManagerFXRP is registered.',\n    );\n  }\n}\n\n/** Read the live direct-minting fee parameters from AssetManagerFXRP, in parallel. */\nexport async function getDirectMintingFees(client: FlareClient): Promise<DirectMintingFees> {\n  const assetManager = await client.registry.address('AssetManagerFXRP');\n  try {\n    const [feeBips, minFeeUBA, executorFeeUBA] = await Promise.all([\n      client.publicClient.readContract({\n        address: assetManager,\n        abi: assetManagerAbi,\n        functionName: 'getDirectMintingFeeBIPS',\n      }),\n      client.publicClient.readContract({\n        address: assetManager,\n        abi: assetManagerAbi,\n        functionName: 'getDirectMintingMinimumFeeUBA',\n      }),\n      client.publicClient.readContract({\n        address: assetManager,\n        abi: assetManagerAbi,\n        functionName: 'getDirectMintingExecutorFeeUBA',\n      }),\n    ]);\n    return {\n      feeBips: feeBips as bigint,\n      minFeeUBA: minFeeUBA as bigint,\n      executorFeeUBA: executorFeeUBA as bigint,\n    };\n  } catch (err) {\n    throw new NPaymentError(\n      `Failed to read direct-minting fees: ${(err as Error).message}`,\n      'FLARE_FEE_READ_FAILED',\n      'Verify the Coston2 RPC is reachable and the AssetManagerFXRP is up to date.',\n    );\n  }\n}\n\nexport interface DirectMintingPreflight {\n  /** True iff the totalUBA is above the protocol's \"large minting\" threshold (will be delayed). */\n  large: boolean;\n  /** Threshold read from chain, or null if the protocol does not expose one. */\n  largeThresholdUBA: bigint | null;\n}\n\n/**\n * Best-effort large-minting preflight. The Flare protocol *throttles* rather than\n * rejects above the threshold, so we surface a structured warning and never throw.\n * On any read error (e.g. function not exposed), returns `{ large: false, largeThresholdUBA: null }`.\n */\nexport async function preflightDirectMintingLimits(\n  client: FlareClient,\n  totalUBA: bigint,\n): Promise<DirectMintingPreflight> {\n  try {\n    const assetManager = await client.registry.address('AssetManagerFXRP');\n    const threshold = (await client.publicClient.readContract({\n      address: assetManager,\n      abi: assetManagerAbi,\n      functionName: 'getDirectMintingLargeMintingThresholdUBA',\n    })) as bigint;\n    return { large: totalUBA >= threshold, largeThresholdUBA: threshold };\n  } catch {\n    return { large: false, largeThresholdUBA: null };\n  }\n}\n\n// ─── 32-byte memo encoder (golden-vectored, pure) ────────────────────────────\n\n/**\n * Encode the 32-byte direct-minting memo:\n *   [8 bytes 0x4642505266410018][4 bytes 0x00000000][20 bytes recipient]\n *\n * Output is a 32-byte Uint8Array. Use {@link toXrplMemoHex} to render the\n * uppercase hex required by XRPL `Memos[].Memo.MemoData`.\n */\nexport function encodeDirectMintingMemo32(recipient: Address): Uint8Array {\n  if (typeof recipient !== 'string' || !/^0x[0-9a-fA-F]{40}$/.test(recipient)) {\n    throw new NPaymentError(\n      `Invalid Flare recipient address: ${JSON.stringify(recipient)}`,\n      'FLARE_INVALID_ADDRESS',\n      'Recipient must be a 0x-prefixed 20-byte hex string (PersonalAccount address).',\n    );\n  }\n  const bytes = new Uint8Array(32);\n  // Prefix.\n  for (let i = 0; i < 8; i++) {\n    bytes[i] = parseInt(DIRECT_MINTING_MEMO_PREFIX.slice(i * 2, i * 2 + 2), 16);\n  }\n  // 4 bytes already zeroed.\n  // Recipient (lowercased to canonicalise).\n  const hex = recipient.slice(2).toLowerCase();\n  for (let i = 0; i < 20; i++) {\n    bytes[12 + i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n  }\n  return bytes;\n}\n\n/** Render bytes as the uppercase hex string XRPL expects in `Memo.MemoData`. */\nexport function toXrplMemoHex(bytes: Uint8Array): string {\n  let out = '';\n  for (const b of bytes) out += b.toString(16).padStart(2, '0');\n  return out.toUpperCase();\n}\n\n\n// ─── v0.22.1 — FAssets redemption (FXRP → XRP) ───────────────────────────────\n\nexport interface RedemptionFees {\n  /** Proportional fee in BIPS (1/10_000). */\n  feeBips: bigint;\n  /** Minimum redemption fee floor (UBA). */\n  minFeeUBA: bigint;\n  /** Flat executor fee (UBA). */\n  executorFeeUBA: bigint;\n}\n\nexport interface RedemptionQuote {\n  /** Net XRP delivered to the XRPL destination, after redemption fee + executor fee. */\n  netReceiveUBA: bigint;\n  proportionalFeeUBA: bigint;\n  redemptionFeeUBA: bigint;\n  executorFeeUBA: bigint;\n  /** Gross FXRP burned. Must equal the input amountFxrp converted to UBA. */\n  burnedFxrpUBA: bigint;\n  /** XRP the recipient receives, decimal string. */\n  receivedXrp: string;\n}\n\n/**\n * Pure-fn redemption quote. Mirrors {@link computeDirectMintingQuote} but the fee\n * is *deducted* from the burned amount instead of *added* to the gross payment.\n *\n * @example\n *   computeRedemptionQuote('10', { feeBips: 25n, minFeeUBA: 100_000n, executorFeeUBA: 200_000n })\n *   → { burnedFxrpUBA: 10_000_000n, redemptionFeeUBA: 100_000n,\n *       executorFeeUBA: 200_000n, netReceiveUBA: 9_700_000n, receivedXrp: '9.7' }\n */\nexport function computeRedemptionQuote(\n  amountFxrp: string,\n  fees: RedemptionFees,\n): RedemptionQuote {\n  const burnedFxrpUBA = parseXrpDropsAmount(amountFxrp);\n  const proportionalFeeUBA = (burnedFxrpUBA * fees.feeBips) / BIPS_DENOMINATOR;\n  const redemptionFeeUBA =\n    proportionalFeeUBA > fees.minFeeUBA ? proportionalFeeUBA : fees.minFeeUBA;\n  const totalFeeUBA = redemptionFeeUBA + fees.executorFeeUBA;\n  if (totalFeeUBA >= burnedFxrpUBA) {\n    throw new NPaymentError(\n      `Redemption fees (${totalFeeUBA}) exceed the redemption amount (${burnedFxrpUBA})`,\n      'FLARE_REDEMPTION_FEES_EXCEED_AMOUNT',\n      'Redeem a larger FXRP amount, or wait for the executor fee to drop.',\n    );\n  }\n  const netReceiveUBA = burnedFxrpUBA - totalFeeUBA;\n  return {\n    netReceiveUBA,\n    proportionalFeeUBA,\n    redemptionFeeUBA,\n    executorFeeUBA: fees.executorFeeUBA,\n    burnedFxrpUBA,\n    receivedXrp: formatXrpDropsAmount(netReceiveUBA),\n  };\n}\n\n/** Read live redemption fee parameters from AssetManagerFXRP, in parallel. */\nexport async function getRedemptionFees(client: FlareClient): Promise<RedemptionFees> {\n  const assetManager = await client.registry.address('AssetManagerFXRP');\n  try {\n    const [feeBips, minFeeUBA, executorFeeUBA] = await Promise.all([\n      client.publicClient.readContract({\n        address: assetManager,\n        abi: assetManagerAbi,\n        functionName: 'getRedemptionFeeBIPS',\n      }),\n      client.publicClient.readContract({\n        address: assetManager,\n        abi: assetManagerAbi,\n        functionName: 'getRedemptionMinimumFeeUBA',\n      }),\n      client.publicClient.readContract({\n        address: assetManager,\n        abi: assetManagerAbi,\n        functionName: 'getRedemptionExecutorFeeUBA',\n      }),\n    ]);\n    return {\n      feeBips: feeBips as bigint,\n      minFeeUBA: minFeeUBA as bigint,\n      executorFeeUBA: executorFeeUBA as bigint,\n    };\n  } catch (err) {\n    throw new NPaymentError(\n      `Failed to read redemption fees: ${(err as Error).message}`,\n      'FLARE_REDEMPTION_FEE_READ_FAILED',\n      'Verify the Flare RPC is reachable and AssetManagerFXRP exposes the v0.22.1 redemption surface.',\n    );\n  }\n}\n\n/** Read the protocol's lot-size in UBA (smallest redeemable unit). */\nexport async function getLotSize(client: FlareClient): Promise<bigint> {\n  const assetManager = await client.registry.address('AssetManagerFXRP');\n  return (await client.publicClient.readContract({\n    address: assetManager,\n    abi: assetManagerAbi,\n    functionName: 'lotSize',\n  })) as bigint;\n}\n","import type { Address } from 'viem';\nimport { decodeEventLog } from 'viem';\nimport { NPaymentError } from '../errors.js';\nimport type { XrplConnection } from '../xrpl/connection.js';\nimport type { XrplWallet } from '../xrpl/wallet.js';\nimport { assetManagerAbi } from './abis.js';\nimport {\n  computeDirectMintingQuote,\n  computeRedemptionQuote,\n  encodeDirectMintingMemo32,\n  formatXrpDropsAmount,\n  getDirectMintingFees,\n  getDirectMintingPaymentAddress,\n  getLotSize,\n  getRedemptionFees,\n  parseXrpDropsAmount,\n  preflightDirectMintingLimits,\n  toXrplMemoHex,\n  type DirectMintingFees,\n  type DirectMintingPreflight,\n  type RedemptionFees,\n  type RedemptionQuote,\n} from './direct-minting.js';\nimport { getFxrpBalance, getPersonalAccountAddress } from './state.js';\nimport type { FlareClient } from './client.js';\nimport type { FlareGaslessForwarderClient, FlareGaslessExecuteResult } from './gasless.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface FlareBridgeConfig {\n  flare: FlareClient;\n  xrplWallet: XrplWallet;\n  xrplConnection: XrplConnection;\n  /** v0.19: optional dep that unlocks executeGaslessFxrpPayment(). */\n  gaslessForwarder?: FlareGaslessForwarderClient;\n  /**\n   * v0.22.1: viem walletClient for redeemXRP() write calls. When omitted,\n   * redeemXRP() throws FLARE_REDEEM_NO_WALLET_CLIENT.\n   */\n  walletClient?: import('viem').WalletClient;\n  /** v0.22.1: caller's EVM address (Flare PersonalAccount) — used to filter logs. */\n  flareAddress?: Address;\n}\n\nexport interface FlareMintParams {\n  /** Net XRP amount to mint as FXRP, decimal string up to 6 places. */\n  amountXrp: string;\n}\n\n// ─── v0.22.1 — Redemption types ──────────────────────────────────────────────\n\nexport interface FlareRedeemParams {\n  /** Net FXRP burned (decimal string ≤ 6 places). */\n  amountFxrp: string;\n  /** XRPL classic address that should receive the XRP. */\n  xrplDestination: string;\n  /** Optional executor address (defaults to zero — uses default executor). */\n  executor?: Address;\n}\n\nexport interface FlareRedeemReceipt {\n  flareTxHash: `0x${string}`;\n  requestId: bigint;\n  expectedXrpReceived: string;\n  fees: { redemptionFeeUBA: bigint; executorFeeUBA: bigint };\n  /** Wall-clock submission time. */\n  submittedAt: number;\n}\n\nexport type FlareRedemptionStatus =\n  | { kind: 'pending' }\n  | { kind: 'performed'; xrplTxHash: `0x${string}`; performedAt: number }\n  | { kind: 'failed'; reason: string };\n\nexport interface PollRedemptionOptions {\n  /** Total wall-clock timeout (ms). Default 600_000 (10 min). */\n  timeoutMs?: number;\n  /** Initial poll interval (ms). Default 5_000. Doubles on each backoff up to 30_000. */\n  intervalMs?: number;\n  /** Optional abort signal. */\n  signal?: AbortSignal;\n}\n\nexport interface FlareMintReceipt {\n  /** XRPL transaction hash of the validated Payment to the Core Vault. */\n  xrplTxHash: string;\n  xrplValidated: boolean;\n  /** Gross XRP paid (net mint + fees), decimal string. */\n  paymentXrp: string;\n  /** Expected net FXRP credited to the PersonalAccount, decimal string. */\n  netFxrp: string;\n  fees: {\n    proportionalUBA: bigint;\n    minFeeUBA: bigint;\n    mintingFeeUBA: bigint;\n    executorFeeUBA: bigint;\n  };\n  recipientPersonalAccount: Address;\n  coreVaultXrplAddress: string;\n  rateLimit: DirectMintingPreflight;\n}\n\n// ─── Bridge client ───────────────────────────────────────────────────────────\n\n/**\n * v0.15 FXRP direct-minting bridge orchestrator.\n *\n * `mintFXRP({ amountXrp })`:\n *   1. resolves PersonalAccount + fees + Core Vault in parallel,\n *   2. computes the gross XRP payment,\n *   3. encodes the 32-byte memo (recipient = PersonalAccount),\n *   4. submits a single XRPL Payment to the Core Vault,\n *   5. returns the validated tx hash + fee breakdown.\n *\n * Submit-and-return: caller polls `getFxrpBalance(personalAccount)` for confirmation.\n * Per-wallet mutex serialises concurrent calls so the XRPL sequence number never races.\n */\nexport class FlareBridgeClient {\n  /** Per-XRPL-address mutex — fixes concurrent double-submit on the same wallet. */\n  private readonly locks = new Map<string, Promise<unknown>>();\n\n  constructor(private readonly deps: FlareBridgeConfig) {}\n\n  async mintFXRP(params: FlareMintParams): Promise<FlareMintReceipt> {\n    const xrplAddress = await this.deps.xrplWallet.getAddress();\n    const previous = this.locks.get(xrplAddress) ?? Promise.resolve();\n    const work = previous.then(\n      () => this.mintLocked(xrplAddress, params),\n      () => this.mintLocked(xrplAddress, params),\n    );\n    this.locks.set(xrplAddress, work);\n    try {\n      return (await work) as FlareMintReceipt;\n    } finally {\n      if (this.locks.get(xrplAddress) === work) this.locks.delete(xrplAddress);\n    }\n  }\n\n  private async mintLocked(\n    xrplAddress: string,\n    params: FlareMintParams,\n  ): Promise<FlareMintReceipt> {\n    // 1. Validate amount up-front (throws FLARE_INVALID_AMOUNT on bad input).\n    parseXrpDropsAmount(params.amountXrp);\n\n    // 2. Parallel preflight reads: PersonalAccount, fees, Core Vault.\n    const [personalAccount, fees, coreVaultXrplAddress] = await Promise.all([\n      getPersonalAccountAddress(this.deps.flare, xrplAddress),\n      getDirectMintingFees(this.deps.flare),\n      getDirectMintingPaymentAddress(this.deps.flare),\n    ]);\n\n    // 3. Compute gross payment + rate-limit preflight.\n    const quote = computeDirectMintingQuote(params.amountXrp, fees);\n    const rateLimit = await preflightDirectMintingLimits(this.deps.flare, quote.totalUBA);\n    if (rateLimit.large) {\n      console.warn(\n        `[n-payment][flare] Mint of ${quote.paymentXrp} XRP is above the protocol's large-mint ` +\n          `threshold (${formatXrpDropsAmount(rateLimit.largeThresholdUBA ?? 0n)} XRP) — ` +\n          `it will be delayed by the executor. Watch for DirectMintingDelayed events on Coston2.`,\n      );\n    }\n\n    // 4. Encode the 32-byte memo (recipient = PersonalAccount).\n    const memoHex = toXrplMemoHex(encodeDirectMintingMemo32(personalAccount));\n\n    // 5. Sign and submit a single XRPL Payment.\n    const txHash = await this.submitXrplPayment({\n      from: xrplAddress,\n      to: coreVaultXrplAddress,\n      paymentXrp: quote.paymentXrp,\n      memoHex,\n    });\n\n    return {\n      xrplTxHash: txHash.hash,\n      xrplValidated: txHash.validated,\n      paymentXrp: quote.paymentXrp,\n      netFxrp: quote.netFxrp,\n      fees: {\n        proportionalUBA: quote.proportionalFeeUBA,\n        minFeeUBA: fees.minFeeUBA,\n        mintingFeeUBA: quote.mintingFeeUBA,\n        executorFeeUBA: quote.executorFeeUBA,\n      },\n      recipientPersonalAccount: personalAccount,\n      coreVaultXrplAddress,\n      rateLimit,\n    };\n  }\n\n  /**\n   * v0.22.1 — Redeem FXRP back to XRP on XRPL.\n   *\n   * Submit-and-return: writes `AssetManagerFXRP.redeem(lots, xrplDestination, executor)`,\n   * parses the `RedemptionRequested` event for the requestId, returns a receipt.\n   * Caller polls via {@link pollRedemption}.\n   *\n   * SOLID — SRP: only submission. Polling + status are separate methods.\n   */\n  async redeemXRP(params: FlareRedeemParams): Promise<FlareRedeemReceipt> {\n    if (!this.deps.walletClient) {\n      throw new NPaymentError(\n        'FlareBridgeClient.redeemXRP requires walletClient on FlareBridgeConfig',\n        'FLARE_REDEEM_NO_WALLET_CLIENT',\n        'Pass walletClient (viem) when constructing FlareBridgeClient.',\n      );\n    }\n    if (!/^r[1-9A-HJ-NP-Za-km-z]{24,34}$/.test(params.xrplDestination)) {\n      throw new NPaymentError(\n        `Invalid XRPL destination address: ${params.xrplDestination}`,\n        'FLARE_REDEEM_INVALID_XRPL_ADDRESS',\n        'Pass a valid XRPL classic address (r-prefixed, base58).',\n      );\n    }\n\n    // Preflight: balance + fees + lot-size.\n    const flareAddress = this.deps.flareAddress\n      ?? (this.deps.walletClient.account?.address as Address | undefined);\n    if (!flareAddress) {\n      throw new NPaymentError(\n        'FlareBridgeClient.redeemXRP requires flareAddress (or walletClient.account.address)',\n        'FLARE_REDEEM_NO_ADDRESS',\n        'Pass flareAddress on FlareBridgeConfig or attach an account to walletClient.',\n      );\n    }\n\n    const burnedFxrpUBA = parseXrpDropsAmount(params.amountFxrp);\n    const [balance, fees, lotSize] = await Promise.all([\n      getFxrpBalance(this.deps.flare, flareAddress),\n      getRedemptionFees(this.deps.flare),\n      getLotSize(this.deps.flare),\n    ]);\n    if (balance < burnedFxrpUBA) {\n      throw new NPaymentError(\n        `Insufficient FXRP for redemption: have ${balance}, need ${burnedFxrpUBA}`,\n        'FLARE_REDEEM_INSUFFICIENT_FXRP',\n        `Mint more FXRP via mintFXRP() or reduce the redemption amount.`,\n      );\n    }\n    if (lotSize > 0n && burnedFxrpUBA % lotSize !== 0n) {\n      throw new NPaymentError(\n        `Redemption amount ${burnedFxrpUBA} not a multiple of lot size ${lotSize}`,\n        'FLARE_REDEEM_NOT_LOT_MULTIPLE',\n        `Redeem in multiples of ${formatXrpDropsAmount(lotSize)} FXRP.`,\n      );\n    }\n    const lots = lotSize > 0n ? burnedFxrpUBA / lotSize : burnedFxrpUBA;\n    const quote: RedemptionQuote = computeRedemptionQuote(params.amountFxrp, fees);\n\n    // Submit redeem(lots, xrplDestination, executor).\n    const assetManager = await this.deps.flare.registry.address('AssetManagerFXRP');\n    const flareTxHash = (await this.deps.walletClient.writeContract({\n      address: assetManager,\n      abi: assetManagerAbi,\n      functionName: 'redeem',\n      args: [lots, params.xrplDestination, params.executor ?? '0x0000000000000000000000000000000000000000'],\n      account: this.deps.walletClient.account!,\n      chain: null,\n    } as never)) as `0x${string}`;\n\n    // Parse the RedemptionRequested event for requestId.\n    const receipt = await this.deps.flare.publicClient.waitForTransactionReceipt({\n      hash: flareTxHash,\n    });\n    const requestId = this.parseRedemptionRequestedId(receipt.logs);\n\n    return {\n      flareTxHash,\n      requestId,\n      expectedXrpReceived: quote.receivedXrp,\n      fees: { redemptionFeeUBA: quote.redemptionFeeUBA, executorFeeUBA: quote.executorFeeUBA },\n      submittedAt: Date.now(),\n    };\n  }\n\n  /**\n   * Read the on-chain status of a redemption request.\n   * Scans the latest 5_000 blocks for RedemptionPerformed / RedemptionPaymentFailed events.\n   * Returns 'pending' when no terminal event is found.\n   */\n  async getRedemptionStatus(\n    requestId: bigint,\n    fromBlock?: bigint,\n  ): Promise<FlareRedemptionStatus> {\n    const assetManager = await this.deps.flare.registry.address('AssetManagerFXRP');\n    const tip = await this.deps.flare.publicClient.getBlockNumber();\n    const startBlock = fromBlock ?? (tip > 5_000n ? tip - 5_000n : 0n);\n\n    const logs = (await this.deps.flare.publicClient.getLogs({\n      address: assetManager,\n      events: assetManagerAbi.filter(\n        (e) => e.type === 'event' && (e.name === 'RedemptionPerformed' || e.name === 'RedemptionPaymentFailed'),\n      ) as never,\n      fromBlock: startBlock,\n      toBlock: tip,\n    })) as Array<{ data: `0x${string}`; topics: readonly `0x${string}`[] }>;\n\n    for (const log of logs) {\n      try {\n        const decoded = decodeEventLog({\n          abi: assetManagerAbi,\n          data: log.data,\n          topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n        }) as {\n          eventName: 'RedemptionPerformed' | 'RedemptionPaymentFailed';\n          args: { requestId: bigint; transactionHash?: `0x${string}`; failureReason?: string };\n        };\n        if (decoded.args.requestId !== requestId) continue;\n        if (decoded.eventName === 'RedemptionPerformed') {\n          return {\n            kind: 'performed',\n            xrplTxHash: decoded.args.transactionHash!,\n            performedAt: Date.now(),\n          };\n        }\n        return { kind: 'failed', reason: decoded.args.failureReason ?? 'unknown' };\n      } catch {\n        continue;\n      }\n    }\n    return { kind: 'pending' };\n  }\n\n  /**\n   * Poll {@link getRedemptionStatus} with exponential backoff until the request\n   * is terminal (performed/failed) or the timeout elapses.\n   *\n   * @throws FLARE_REDEMPTION_TIMEOUT if no terminal event before timeoutMs.\n   * @throws FLARE_REDEMPTION_FAILED if executor reported a payment failure.\n   */\n  async pollRedemption(\n    requestId: bigint,\n    options: PollRedemptionOptions = {},\n  ): Promise<{ xrplTxHash: `0x${string}` }> {\n    const timeoutMs = options.timeoutMs ?? 600_000;\n    let interval = options.intervalMs ?? 5_000;\n    const start = Date.now();\n\n    while (Date.now() - start < timeoutMs) {\n      if (options.signal?.aborted) {\n        throw new NPaymentError(\n          'Redemption poll aborted',\n          'FLARE_REDEMPTION_ABORTED',\n          'AbortSignal fired before terminal event.',\n        );\n      }\n      const status = await this.getRedemptionStatus(requestId);\n      if (status.kind === 'performed') return { xrplTxHash: status.xrplTxHash };\n      if (status.kind === 'failed') {\n        throw new NPaymentError(\n          `Flare redemption failed: ${status.reason}`,\n          'FLARE_REDEMPTION_FAILED',\n          'The executor could not deliver XRP — call AssetManagerFXRP.redemptionPaymentDefault() to claim FXRP back.',\n        );\n      }\n      await new Promise((resolve) => setTimeout(resolve, interval));\n      interval = Math.min(interval * 2, 30_000);\n    }\n    throw new NPaymentError(\n      `Flare redemption timeout for request ${requestId}`,\n      'FLARE_REDEMPTION_TIMEOUT',\n      'Increase timeoutMs, or call AssetManagerFXRP.redemptionPaymentDefault() to claim FXRP back if the executor never delivers.',\n    );\n  }\n\n  /** Parse a RedemptionRequested event from a tx receipt's log array. Throws if missing. */\n  private parseRedemptionRequestedId(logs: readonly { topics: readonly string[]; data: string }[]): bigint {\n    for (const log of logs) {\n      try {\n        const decoded = decodeEventLog({\n          abi: assetManagerAbi,\n          data: log.data as `0x${string}`,\n          topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n        }) as { eventName: string; args: { requestId: bigint } };\n        if (decoded.eventName === 'RedemptionRequested') return decoded.args.requestId;\n      } catch {\n        continue;\n      }\n    }\n    throw new NPaymentError(\n      'RedemptionRequested event not found in tx receipt',\n      'FLARE_REDEEM_NO_REQUEST_EVENT',\n      'Verify the call landed on the right chain + AssetManagerFXRP address. Inspect the tx on a Flare explorer.',\n    );\n  }\n\n  /**\n   * v0.19: send FXRP gaslessly via the GaslessPaymentForwarder relayer.\n   * Requires `gaslessForwarder` to be passed in {@link FlareBridgeConfig}.\n   * Caller must have done a one-time `gaslessForwarder.approve(MaxUint256)`\n   * before the first payment.\n   */\n  async executeGaslessFxrpPayment(params: {\n    to: Address;\n    /** Raw FXRP units (drops/UBA). For human input, format via formatXrpDropsAmount. */\n    amount: bigint;\n    deadlineSeconds?: number;\n  }): Promise<FlareGaslessExecuteResult> {\n    if (!this.deps.gaslessForwarder) {\n      throw new NPaymentError(\n        'Gasless FXRP payments require gaslessForwarder dep on FlareBridgeConfig',\n        'FLARE_GASLESS_NOT_CONFIGURED',\n        'Construct FlareGaslessForwarderClient and pass it as gaslessForwarder — see examples/flare-payments-demo.ts.',\n      );\n    }\n    return this.deps.gaslessForwarder.pay(params);\n  }\n\n  /**\n   * Submit the XRPL Payment carrying the direct-minting memo.\n   * Maps non-tesSUCCESS engine results to FLARE_BRIDGE_SUBMIT_FAILED with the tx hash.\n   */\n  private async submitXrplPayment(args: {\n    from: string;\n    to: string;\n    paymentXrp: string;\n    memoHex: string;\n  }): Promise<{ hash: string; validated: boolean }> {\n    const client = await this.deps.xrplConnection.getClient();\n    const drops = parseXrpDropsAmount(args.paymentXrp).toString();\n\n    const tx: Record<string, unknown> = {\n      TransactionType: 'Payment',\n      Account: args.from,\n      Destination: args.to,\n      Amount: drops,\n      Memos: [{ Memo: { MemoData: args.memoHex } }],\n    };\n\n    const prepared = await client.autofill(tx);\n    const signed = await this.deps.xrplWallet.sign(prepared);\n    const result = await client.submitAndWait(signed.tx_blob);\n\n    const engine =\n      result.result?.meta?.TransactionResult ?? result.result?.engine_result;\n    if (engine && engine !== 'tesSUCCESS') {\n      throw new NPaymentError(\n        `Flare bridge submit failed: ${engine}`,\n        'FLARE_BRIDGE_SUBMIT_FAILED',\n        `Inspect XRPL tx ${result.result?.hash} on a testnet explorer; the executor never picked it up.`,\n      );\n    }\n\n    return {\n      hash: result.result?.hash ?? '',\n      validated: result.result?.validated ?? false,\n    };\n  }\n}\n\nexport function createFlareBridgeClient(config: FlareBridgeConfig): FlareBridgeClient {\n  return new FlareBridgeClient(config);\n}\n\n// Re-export the DirectMintingFees type so callers can build their own quotes.\nexport type { DirectMintingFees };\n","/**\n * Flare gasless FXRP payments — client + deploy helper (v0.19).\n *\n * Flare's gasless flow is *not* x402. It uses a custom EIP-712 forwarder:\n *\n *   contract GaslessPaymentForwarder\n *     domain: { name: \"GaslessPaymentForwarder\", version: \"1\",\n *               chainId, verifyingContract: forwarderAddress }\n *     type:   PaymentRequest(from, to, amount, nonce, deadline)\n *\n * Flow:\n *   1. User does one-time `approve(forwarder, MaxUint256)` on FXRP.\n *   2. User signs PaymentRequest off-chain.\n *   3. Relayer (run by service operator) calls `executePayment(...)` and\n *      pays FLR for gas.\n *   4. Forwarder verifies signer == from, increments nonce, transfers FXRP.\n *\n * This module exports:\n *   - FlareGaslessForwarderClient — buyer-side client (status/approve/sign/submit/pay)\n *   - createGaslessRelayerHandler — Express-compatible relayer handler factory\n *   - deployFlareGaslessForwarder — one-shot viem deploy from caller artifacts\n *\n * Both client and relayer are tiny because all the contract logic lives in\n * Flare's published GaslessPaymentForwarder.sol — we only do EIP-712 signing,\n * HTTP transport, and a thin sponsored writeContract.\n *\n * Reference: https://dev.flare.network/fxrp/token-interactions/gasless-fxrp-payments\n */\nimport { recoverTypedDataAddress } from 'viem';\nimport type {\n  Abi,\n  Account,\n  Address,\n  Hex,\n  PublicClient,\n  TypedDataDomain,\n  WalletClient,\n} from 'viem';\nimport { NPaymentError } from '../errors.js';\n\n// ─── Public types ────────────────────────────────────────────────────────────\n\nexport interface FlareGaslessClientConfig {\n  publicClient: PublicClient;\n  /** Wallet client whose `account` is the buyer signing PaymentRequests. */\n  walletClient: WalletClient;\n  forwarderAddress: Address;\n  /** Relayer base URL (must expose POST /execute and GET /nonce/:addr). */\n  relayerUrl: string;\n  /** Default deadline window in seconds. @default 1800 (30 min) */\n  deadlineSeconds?: number;\n}\n\nexport interface FlarePaymentRequest {\n  from: Address;\n  to: Address;\n  amount: string;       // base-10 stringified bigint\n  deadline: number;     // unix seconds\n  signature: Hex;\n}\n\nexport interface FlareGaslessStatus {\n  fxrpAddress: Address;\n  decimals: number;\n  balance: bigint;\n  allowance: bigint;\n  nonce: bigint;\n  needsApproval: boolean;\n}\n\nexport interface FlareGaslessExecuteResult {\n  success: boolean;\n  transactionHash: Hex;\n  blockNumber: number | null;\n  gasUsed: string;\n}\n\nexport interface DeployFlareGaslessParams {\n  walletClient: WalletClient;\n  publicClient: PublicClient;\n  artifact: { abi: Abi; bytecode: Hex };\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_DEADLINE_SECONDS = 1800;\nconst MAX_UINT256 = (1n << 256n) - 1n;\n\n/** EIP-712 type definition for PaymentRequest — exact match to Flare's contract. */\nexport const PAYMENT_REQUEST_TYPES = {\n  PaymentRequest: [\n    { name: 'from', type: 'address' },\n    { name: 'to', type: 'address' },\n    { name: 'amount', type: 'uint256' },\n    { name: 'nonce', type: 'uint256' },\n    { name: 'deadline', type: 'uint256' },\n  ],\n} as const;\n\n/** Minimal forwarder ABI — only the entry-points the client + relayer use. */\nconst FORWARDER_ABI = [\n  {\n    type: 'function',\n    name: 'fxrp',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'address' }],\n  },\n  {\n    type: 'function',\n    name: 'getNonce',\n    stateMutability: 'view',\n    inputs: [{ name: 'account', type: 'address' }],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'executePayment',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'from', type: 'address' },\n      { name: 'to', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n      { name: 'deadline', type: 'uint256' },\n      { name: 'signature', type: 'bytes' },\n    ],\n    outputs: [],\n  },\n] as const satisfies Abi;\n\n/** Minimal ERC-20 read+approve ABI. */\nconst ERC20_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: 'decimals',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint8' }],\n  },\n  {\n    type: 'function',\n    name: 'approve',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'spender', type: 'address' },\n      { name: 'value', type: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'bool' }],\n  },\n] as const satisfies Abi;\n\n// ─── Buyer client ────────────────────────────────────────────────────────────\n\n/**\n * Off-chain signer + relayer client for Flare's GaslessPaymentForwarder.\n *\n * Single responsibility: produce signed PaymentRequests and ship them over\n * HTTP to a relayer. Does *not* run a relayer or pay gas itself.\n */\nexport class FlareGaslessForwarderClient {\n  private fxrpCache?: { address: Address; decimals: number };\n\n  constructor(private readonly config: FlareGaslessClientConfig) {}\n\n  /** Read balance + allowance + nonce for `userAddress`. */\n  async getStatus(userAddress: Address): Promise<FlareGaslessStatus> {\n    const { publicClient, forwarderAddress } = this.config;\n    const fxrp = await this.resolveFxrp();\n    const [balance, allowance, nonce] = await Promise.all([\n      publicClient.readContract({\n        address: fxrp.address,\n        abi: ERC20_ABI,\n        functionName: 'balanceOf',\n        args: [userAddress],\n      }) as Promise<bigint>,\n      publicClient.readContract({\n        address: fxrp.address,\n        abi: ERC20_ABI,\n        functionName: 'allowance',\n        args: [userAddress, forwarderAddress],\n      }) as Promise<bigint>,\n      publicClient.readContract({\n        address: forwarderAddress,\n        abi: FORWARDER_ABI,\n        functionName: 'getNonce',\n        args: [userAddress],\n      }) as Promise<bigint>,\n    ]);\n    return {\n      fxrpAddress: fxrp.address,\n      decimals: fxrp.decimals,\n      balance,\n      allowance,\n      nonce,\n      needsApproval: allowance === 0n,\n    };\n  }\n\n  /**\n   * One-time approve of the forwarder to pull FXRP. Caller must have FLR for\n   * gas on this single tx; subsequent payments are gasless.\n   */\n  async approve(amount: bigint = MAX_UINT256): Promise<Hex> {\n    const { walletClient, publicClient, forwarderAddress } = this.config;\n    const fxrp = await this.resolveFxrp();\n    const account = this.requireAccount();\n    const txHash = (await walletClient.writeContract({\n      address: fxrp.address,\n      abi: ERC20_ABI,\n      functionName: 'approve',\n      args: [forwarderAddress, amount],\n      account,\n      chain: walletClient.chain ?? null,\n    } as never)) as Hex;\n    await publicClient.waitForTransactionReceipt({ hash: txHash });\n    return txHash;\n  }\n\n  /** Sign a PaymentRequest. Uses the chain's latest block timestamp for `deadline` to avoid clock skew. */\n  async createAndSign(params: {\n    to: Address;\n    /** Raw FXRP units (drops). For human input use parseAmount. */\n    amount: bigint;\n    deadlineSeconds?: number;\n  }): Promise<FlarePaymentRequest> {\n    const { publicClient, walletClient, forwarderAddress } = this.config;\n    const account = this.requireAccount();\n    const chainId = await publicClient.getChainId();\n    const nonce = (await publicClient.readContract({\n      address: forwarderAddress,\n      abi: FORWARDER_ABI,\n      functionName: 'getNonce',\n      args: [account.address],\n    })) as bigint;\n    const block = await publicClient.getBlock();\n    const chainTime = Number(block.timestamp ?? Math.floor(Date.now() / 1000));\n    const deadline = chainTime + (params.deadlineSeconds ?? this.config.deadlineSeconds ?? DEFAULT_DEADLINE_SECONDS);\n\n    const domain: TypedDataDomain = {\n      name: 'GaslessPaymentForwarder',\n      version: '1',\n      chainId,\n      verifyingContract: forwarderAddress,\n    };\n    const message = {\n      from: account.address,\n      to: params.to,\n      amount: params.amount,\n      nonce,\n      deadline: BigInt(deadline),\n    };\n    const signature = (await walletClient.signTypedData({\n      account,\n      domain,\n      types: PAYMENT_REQUEST_TYPES,\n      primaryType: 'PaymentRequest',\n      message,\n    } as never)) as Hex;\n    return {\n      from: account.address,\n      to: params.to,\n      amount: params.amount.toString(),\n      deadline,\n      signature,\n    };\n  }\n\n  /** POST a signed PaymentRequest to the relayer's /execute endpoint. */\n  async submitToRelayer(req: FlarePaymentRequest): Promise<FlareGaslessExecuteResult> {\n    const url = `${this.config.relayerUrl.replace(/\\/$/, '')}/execute`;\n    const res = await fetch(url, {\n      method: 'POST',\n      headers: { 'content-type': 'application/json' },\n      body: JSON.stringify(req),\n    });\n    const body = (await res.json().catch(() => ({}))) as Partial<FlareGaslessExecuteResult> & {\n      error?: string;\n    };\n    if (!res.ok || !body.transactionHash) {\n      throw new NPaymentError(\n        `Flare gasless relayer rejected payment: ${body.error ?? res.statusText}`,\n        'FLARE_GASLESS_RELAYER_REJECTED',\n        'Verify forwarder address, network/chainId, FXRP balance + allowance, and that the deadline is in the future.',\n      );\n    }\n    return {\n      success: body.success ?? true,\n      transactionHash: body.transactionHash as Hex,\n      blockNumber: body.blockNumber ?? null,\n      gasUsed: body.gasUsed ?? '0',\n    };\n  }\n\n  /** Convenience: createAndSign + submitToRelayer in one call. */\n  async pay(params: { to: Address; amount: bigint; deadlineSeconds?: number }): Promise<FlareGaslessExecuteResult> {\n    const signed = await this.createAndSign(params);\n    return this.submitToRelayer(signed);\n  }\n\n  // ── Internals ──\n\n  private async resolveFxrp(): Promise<{ address: Address; decimals: number }> {\n    if (this.fxrpCache) return this.fxrpCache;\n    const fxrpAddress = (await this.config.publicClient.readContract({\n      address: this.config.forwarderAddress,\n      abi: FORWARDER_ABI,\n      functionName: 'fxrp',\n    })) as Address;\n    const decimals = (await this.config.publicClient.readContract({\n      address: fxrpAddress,\n      abi: ERC20_ABI,\n      functionName: 'decimals',\n    })) as number;\n    this.fxrpCache = { address: fxrpAddress, decimals: Number(decimals) };\n    return this.fxrpCache;\n  }\n\n  private requireAccount(): Account {\n    const account = this.config.walletClient.account;\n    if (!account) {\n      throw new NPaymentError(\n        'walletClient has no account — required for signing PaymentRequests',\n        'FLARE_GASLESS_NO_ACCOUNT',\n        'Construct walletClient with `account: privateKeyToAccount(...)` or a connected JSON-RPC account.',\n      );\n    }\n    return account as Account;\n  }\n}\n\n// ─── Relayer-side handler factory ────────────────────────────────────────────\n\n/**\n * Build an Express-compatible POST /execute handler that re-verifies the\n * EIP-712 signature off-chain (catches bad domain/nonce before paying gas)\n * and submits `executePayment(...)` from the sponsor wallet.\n *\n * Mounted by `examples/flare-gasless-relayer.ts`.\n */\nexport interface GaslessRelayerHandlerConfig {\n  publicClient: PublicClient;\n  /** Relayer wallet — pays FLR for gas. */\n  sponsorClient: WalletClient;\n  forwarderAddress: Address;\n  /** Override receipt poll timeout (ms). @default 60_000 */\n  receiptTimeoutMs?: number;\n}\n\nexport function createGaslessExecutor(cfg: GaslessRelayerHandlerConfig) {\n  const sponsorAccount = cfg.sponsorClient.account;\n  if (!sponsorAccount) {\n    throw new NPaymentError(\n      'sponsorClient.account is required',\n      'FLARE_GASLESS_NO_SPONSOR',\n      'Pass a wallet client constructed with privateKeyToAccount(...) for the sponsor.',\n    );\n  }\n\n  return async (req: FlarePaymentRequest): Promise<FlareGaslessExecuteResult> => {\n    const { publicClient, sponsorClient, forwarderAddress } = cfg;\n    const chainId = await publicClient.getChainId();\n    const nonce = (await publicClient.readContract({\n      address: forwarderAddress,\n      abi: FORWARDER_ABI,\n      functionName: 'getNonce',\n      args: [req.from],\n    })) as bigint;\n\n    // Off-chain signature verification — fail fast before paying gas.\n    const domain: TypedDataDomain = {\n      name: 'GaslessPaymentForwarder',\n      version: '1',\n      chainId,\n      verifyingContract: forwarderAddress,\n    };\n    const message = {\n      from: req.from,\n      to: req.to,\n      amount: BigInt(req.amount),\n      nonce,\n      deadline: BigInt(req.deadline),\n    };\n    const recovered = await recoverTypedDataAddress({\n      domain,\n      types: PAYMENT_REQUEST_TYPES,\n      primaryType: 'PaymentRequest',\n      message,\n      signature: req.signature,\n    });\n    if (recovered.toLowerCase() !== req.from.toLowerCase()) {\n      throw new NPaymentError(\n        `Signature recovers to ${recovered}, expected ${req.from}`,\n        'FLARE_GASLESS_BAD_SIGNATURE',\n        `Check chainId (expected ${chainId}), forwarder address, and nonce (expected ${nonce}).`,\n      );\n    }\n\n    const block = await publicClient.getBlock();\n    const chainTime = Number(block.timestamp);\n    if (req.deadline <= chainTime) {\n      throw new NPaymentError(\n        `Payment expired (deadline ${req.deadline}, chain ${chainTime})`,\n        'FLARE_GASLESS_EXPIRED',\n        'Ask the buyer to re-sign with a fresh deadline.',\n      );\n    }\n\n    const txHash = (await sponsorClient.writeContract({\n      address: forwarderAddress,\n      abi: FORWARDER_ABI,\n      functionName: 'executePayment',\n      args: [req.from, req.to, BigInt(req.amount), BigInt(req.deadline), req.signature],\n      account: sponsorAccount,\n      chain: sponsorClient.chain ?? null,\n    } as never)) as Hex;\n    const receipt = await publicClient.waitForTransactionReceipt({\n      hash: txHash,\n      timeout: cfg.receiptTimeoutMs ?? 60_000,\n    });\n    if (receipt.status !== 'success') {\n      throw new NPaymentError(\n        `executePayment ${txHash} reverted`,\n        'FLARE_GASLESS_REVERT',\n        'Check FXRP allowance + balance for the buyer at the time of submission.',\n      );\n    }\n    return {\n      success: true,\n      transactionHash: txHash,\n      blockNumber: Number(receipt.blockNumber),\n      gasUsed: receipt.gasUsed.toString(),\n    };\n  };\n}\n\n// ─── Deploy helper ───────────────────────────────────────────────────────────\n\n/**\n * Deploy GaslessPaymentForwarder to the connected Flare network. Caller\n * supplies the compiled artifact; the contract has no constructor args\n * (FXRP is resolved on-chain via FlareContractRegistry inside the contract).\n *\n * Source: https://github.com/flare-foundation/flare-hardhat-starter\n */\nexport async function deployFlareGaslessForwarder(\n  params: DeployFlareGaslessParams,\n): Promise<{ forwarderAddress: Address }> {\n  const { walletClient, publicClient, artifact } = params;\n  const txHash = await walletClient.deployContract({\n    abi: artifact.abi,\n    bytecode: artifact.bytecode,\n    account: walletClient.account ?? null,\n    chain: walletClient.chain ?? null,\n  } as never);\n  const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n  if (!receipt.contractAddress) {\n    throw new NPaymentError('GaslessPaymentForwarder deploy receipt has no contractAddress', 'FLARE_GASLESS_DEPLOY_FAILED');\n  }\n  return { forwarderAddress: receipt.contractAddress as Address };\n}\n\nexport { FORWARDER_ABI };\n","import type { ChainKey } from '../types.js';\nimport { canBridgeRlusd, whChainFromKey } from '../wormhole/deployments.js';\nimport type { CorridorRouteDecision, CorridorRouteInput } from './types.js';\n\n/**\n * Priority order when buyer holds RLUSD on multiple bridgeable EVM source chains.\n * Picks the chain with cheapest gas + fastest VAA finality first.\n *\n * v0.23 will read live outbound/inbound limits to override this static order.\n */\nconst NTT_SOURCE_PRIORITY: ChainKey[] = [\n  'optimism-mainnet',\n  'base-mainnet',\n  'unichain-mainnet',\n  'ink-mainnet',\n  'ethereum-mainnet',\n];\n\n/** Chain keys that are NTT-eligible for RLUSD as of v0.22 (matches RLUSD_NTT_DEPLOYMENTS). */\nconst NTT_RLUSD_CHAINS: ReadonlySet<ChainKey> = new Set<ChainKey>([\n  'ethereum-mainnet',\n  'base-mainnet',\n  'optimism-mainnet',\n  'ink-mainnet',\n  'unichain-mainnet',\n]);\n\n/**\n * v0.22 PayRouter v3 — RLUSD cross-chain corridor selector.\n * v0.22.1 — Extended with 3 XRPFi decision kinds (PRD-G).\n *\n * Algorithm (in order, first match wins):\n *   1. Direct hit — buyer already holds RLUSD on the requested chain.\n *   2. NTT bridge — buyer holds RLUSD on another EVM chain in the registry.\n *   2.5 (XRPFi reverse, opt-in) — reqChain == xrpl-mainnet AND buyer holds FXRP.\n *   2.6 (XRPFi forward, opt-in) — reqChain in EVM AND buyer holds only XRP-XRPL.\n *   3. No route — return suggestedFunding chain list.\n *\n * Pure function — no I/O, no side effects.\n */\nexport function selectRlusdCorridor(input: CorridorRouteInput): CorridorRouteDecision {\n  const { requestedChain, requestedAmount, buyerHoldings, liveLimits } = input;\n  if (requestedAmount <= 0n) {\n    return { kind: 'no-route', reason: 'invalid-amount', suggestedFunding: [requestedChain] };\n  }\n\n  // Step 1: direct hit\n  const direct = buyerHoldings[requestedChain] ?? 0n;\n  if (direct >= requestedAmount) {\n    return { kind: 'direct', chain: requestedChain };\n  }\n\n  // Step 2: NTT bridge — only when destination is an EVM chain in the registry\n  if (NTT_RLUSD_CHAINS.has(requestedChain)) {\n    const dstWh = whChainFromKey(requestedChain);\n    if (dstWh) {\n      for (const candidateKey of NTT_SOURCE_PRIORITY) {\n        if (candidateKey === requestedChain) continue;\n        const balance = buyerHoldings[candidateKey] ?? 0n;\n        if (balance < requestedAmount) continue;\n        const srcWh = whChainFromKey(candidateKey);\n        if (!srcWh) continue;\n        const decision = canBridgeRlusd(srcWh, dstWh, requestedAmount, liveLimits);\n        if (decision.ok) {\n          return {\n            kind: 'ntt-bridge',\n            fromChain: candidateKey,\n            toChain: requestedChain,\n            amount: requestedAmount,\n          };\n        }\n      }\n    }\n  }\n\n  // ── v0.22.1 — XRPFi paths (opt-in via allowXrpfi) ─────────────────────────\n  if (input.allowXrpfi) {\n    const fxrp = input.flareHoldings?.fxrp ?? 0n;\n    const xrpDrops = input.xrplHoldings?.xrpDrops ?? 0n;\n\n    // Step 2.5 — reverse: reqChain = xrpl-mainnet, buyer holds FXRP.\n    // Redemption fees: FXRP burned ≥ requestedAmount + slack (caller covers fees by\n    // burning slightly more FXRP than the target RLUSD; here we surface the raw\n    // amountFxrp = requestedAmount mapped to UBA — orchestrator adds fee buffer).\n    if (requestedChain === 'xrpl-mainnet' && fxrp >= requestedAmount) {\n      // requestedAmount is in 18-dec UBA for EVM RLUSD; XRPL RLUSD is 6-dec via XRPL token.\n      // Caller's orchestrator handles the unit conversion + fee buffer; here we pass\n      // the raw amount through as amountFxrp (UBA) for protocol redemption.\n      const xrplDestination = (input.xrplHoldings as unknown as { destination?: string })?.destination\n        ?? 'rXrplDestinationFromAgent'; // orchestrator overrides with real address\n      return {\n        kind: 'xrpfi-redeem-then-swap',\n        amountFxrp: requestedAmount,\n        xrplDestination,\n        expectedRlusdXrpl: requestedAmount,\n      };\n    }\n\n    // Step 2.5b — reverse + bridge: same condition, but the request is on EVM and we have FXRP.\n    // Active only when XRPL is in NTT_RLUSD_CHAINS (registry update unlocks this lane).\n    if (\n      input.allowReverseBridge\n      && NTT_RLUSD_CHAINS.has(requestedChain)\n      && NTT_RLUSD_CHAINS.has('xrpl-mainnet' as ChainKey) // gate on future registry add\n      && fxrp >= requestedAmount\n    ) {\n      return {\n        kind: 'xrpfi-redeem-swap-then-bridge',\n        amountFxrp: requestedAmount,\n        xrplDestination: 'rXrplDestinationFromAgent',\n        bridgeToChain: requestedChain,\n        bridgeAmount: requestedAmount,\n      };\n    }\n\n    // Step 2.6 — forward partial: reqChain = EVM, buyer holds only XRP-XRPL.\n    // SDK delivers FXRP on Flare; merchant payment requires Flare-NTT (v0.23+).\n    if (NTT_RLUSD_CHAINS.has(requestedChain) && xrpDrops >= requestedAmount && fxrp === 0n) {\n      const noEvmHoldings = NTT_SOURCE_PRIORITY.every(\n        (k) => (buyerHoldings[k] ?? 0n) < requestedAmount,\n      );\n      if (noEvmHoldings) {\n        return {\n          kind: 'xrpfi-mint-fxrp',\n          amountXrp: requestedAmount,\n          stopChain: 'flare-mainnet',\n        };\n      }\n    }\n  }\n\n  // Step 3: no route\n  const suggestedFunding: ChainKey[] = [requestedChain];\n  if (NTT_RLUSD_CHAINS.has(requestedChain)) {\n    for (const c of NTT_SOURCE_PRIORITY) if (c !== requestedChain) suggestedFunding.push(c);\n  }\n  if (input.allowXrpfi) {\n    suggestedFunding.push('xrpl-mainnet');\n    suggestedFunding.push('flare-mainnet');\n  }\n  return {\n    kind: 'no-route',\n    reason: `No source chain has ${requestedAmount} RLUSD available with bridgeable lane to ${requestedChain}`,\n    suggestedFunding,\n  };\n}\n","import { CHAINS } from '../chains.js';\nimport { NPaymentError } from '../errors.js';\nimport type { ChainKey } from '../types.js';\nimport { assertVerifiedDenom, getInitiaAsset } from './assets.js';\nimport type { InitiaClient } from './client.js';\nimport type {\n  InitiaChainKey,\n  IusdCorridorInput,\n  IusdCorridorResult,\n  IusdCorridorStep,\n  SkipQuoteRequest,\n  SkipQuoteResponse,\n} from './types.js';\n\n/**\n * v0.23 — Bridge corridor for `USDC-on-EVM → iUSD-on-Initia`.\n *\n * One file, three concerns — each enforces SRP at the class level:\n *\n *   {@link selectIusdCorridor}   — pure-fn rail selector (Task 6)\n *   {@link SkipApiClient}        — primary rail: Skip Go multi-hop (Task 4)\n *   {@link LayerZeroAusdClient}  — secondary rail: AUSD-OFT bridge (Task 5)\n *\n * Combined in a single module because each is ≤80 LOC and only ever consumed\n * together (the selector dispatches to a client; the clients do not know about\n * each other). Splitting into 3 files would create 3 import barrels for one\n * conceptual unit (the corridor).\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n//  Pure-fn corridor selector (Task 6)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Static priority — Skip API is canonical (powers InterwovenKit's USDC→iUSD path). */\nconst USDC_SOURCE_PRIORITY: ChainKey[] = [\n  'base-mainnet',\n  'optimism-mainnet',\n  'arbitrum-sepolia',\n  'base-sepolia',\n  'ethereum-mainnet',\n];\n\n/** Fee/latency hints — overridable at runtime via live quotes; static defaults preserve pure-fn semantics. */\nconst RAIL_HINTS = {\n  'iusd-direct':            { sec: 5,   feeBps: 0   },\n  'skip-api':               { sec: 120, feeBps: 30  },  // 1-3 min, ~0.3% via CCTP+IBC\n  'layerzero-ausd':         { sec: 60,  feeBps: 20  },  // ~60s VAA, ~0.2% LZ fee\n  'wormhole-ntt-fallback':  { sec: 90,  feeBps: 25  },  // ~90s VAA + Skip leg\n} as const;\n\n/**\n * Pure function — given buyer holdings + rail availability, pick the cheapest\n * corridor for landing iUSD on the requested Initia chain.\n *\n * Algorithm (first match wins):\n *   1. iUSD already on requested Initia chain        → 'iusd-direct'\n *   2. AUSD-on-Ethereum + LayerZero rail available   → 'layerzero-ausd'\n *   3. USDC on any priority EVM chain + Skip healthy → 'skip-api'\n *   4. USDC on any priority EVM chain                → 'wormhole-ntt-fallback'\n *   5. otherwise                                      → 'no-route'\n */\nexport function selectIusdCorridor(input: IusdCorridorInput): IusdCorridorResult {\n  if (input.requestedAmount <= 0n) {\n    return { kind: 'no-route', reason: 'invalid-amount', suggestedFunding: [input.requestedChain] };\n  }\n\n  // 1. direct hit\n  const onInitia = input.iusdHoldings?.[input.requestedChain] ?? 0n;\n  if (onInitia >= input.requestedAmount) {\n    return { kind: 'direct', chain: input.requestedChain };\n  }\n\n  // 2. layerzero-ausd (mainnet only; testnet typically has no AUSD-OFT)\n  if (input.layerZeroAvailable) {\n    const ausdEth = input.ausdHoldings?.['ethereum-mainnet'] ?? 0n;\n    if (ausdEth >= input.requestedAmount) {\n      return makeBridge('layerzero-ausd', 'ethereum-mainnet', input.requestedChain, 'AUSD', input.requestedAmount);\n    }\n  }\n\n  // 3 + 4. USDC source via Skip (preferred) or Wormhole-NTT fallback\n  const skipHealthy = input.skipApiHealthy ?? true;\n  for (const src of USDC_SOURCE_PRIORITY) {\n    if ((input.usdcHoldings?.[src] ?? 0n) < input.requestedAmount) continue;\n    if (skipHealthy) {\n      return makeBridge('skip-api', src, input.requestedChain, 'USDC', input.requestedAmount);\n    }\n    // Skip down → fallback through v0.22 Wormhole NTT then Skip's iUSD leg only\n    return makeBridge('wormhole-ntt-fallback', src, input.requestedChain, 'USDC', input.requestedAmount);\n  }\n\n  // 5. no route\n  const suggested: ChainKey[] = [input.requestedChain, ...USDC_SOURCE_PRIORITY];\n  if (input.layerZeroAvailable) suggested.push('ethereum-mainnet');\n  return {\n    kind: 'no-route',\n    reason: `No source funds bridgeable to ${input.requestedChain} for ${input.requestedAmount} iUSD`,\n    suggestedFunding: suggested,\n  };\n}\n\nfunction makeBridge(\n  rail: 'skip-api' | 'layerzero-ausd' | 'wormhole-ntt-fallback',\n  fromChain: ChainKey,\n  toChain: InitiaChainKey,\n  asset: 'USDC' | 'AUSD' | 'iUSD',\n  amount: bigint,\n): IusdCorridorResult {\n  const hints = RAIL_HINTS[rail];\n  const steps: IusdCorridorStep[] = [\n    { rail, fromChain, toChain, asset, amount, estimatedSec: hints.sec },\n  ];\n  return { kind: 'bridge', corridor: rail, steps, estimatedSec: hints.sec, estimatedFeeBps: hints.feeBps };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n//  Skip API client (Task 4)  — primary rail\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SkipApiClientConfig {\n  /** Default: https://api.skip.build */\n  baseUrl?: string;\n  /** Quote in-memory cache TTL (ms). @default 30_000 */\n  cacheTtlMs?: number;\n  /** fetch implementation override (test injection). @default global fetch */\n  fetchImpl?: typeof fetch;\n}\n\ninterface CachedQuote { at: number; quote: SkipQuoteResponse }\n\n/**\n * Thin client for Skip Go's REST API (`api.skip.build/v2/fungible/route`).\n *\n * SOLID:\n *   SRP — quote + execute on Skip; nothing else.\n *   DIP — fetch is injectable; corridor selector consumes via interface.\n *   OCP — extend by composition (e.g. wrap with rate-limiter / retry).\n *\n * Quote-only is pure HTTP (no peer dep). Submission requires the Skip Go SDK\n * (`@skip-go/client`) — soft-loaded; throws `SKIP_PEER_DEP_MISSING` if absent.\n *\n * Skip API supports both mainnet and testnet via chain-id selection (Initia\n * mainnet `interwoven-1`, testnet `initiation-2`). No URL switching needed.\n */\nexport class SkipApiClient {\n  private readonly baseUrl: string;\n  private readonly cacheTtlMs: number;\n  private readonly fetchImpl: typeof fetch;\n  private readonly cache = new Map<string, CachedQuote>();\n\n  constructor(config: SkipApiClientConfig = {}) {\n    this.baseUrl = (config.baseUrl ?? 'https://api.skip.build').replace(/\\/$/, '');\n    this.cacheTtlMs = config.cacheTtlMs ?? 30_000;\n    this.fetchImpl = config.fetchImpl ?? fetch;\n  }\n\n  /**\n   * Quote a route. Caches result for `cacheTtlMs` keyed by the request shape\n   * — protects against rate limits when callers re-quote in tight loops.\n   */\n  async quoteRoute(req: SkipQuoteRequest): Promise<SkipQuoteResponse> {\n    const key = this.cacheKey(req);\n    const hit = this.cache.get(key);\n    if (hit && Date.now() - hit.at < this.cacheTtlMs) return hit.quote;\n\n    const res = await this.fetchImpl(`${this.baseUrl}/v2/fungible/route`, {\n      method: 'POST',\n      headers: { 'content-type': 'application/json' },\n      body: JSON.stringify({\n        amount_in: req.amountIn,\n        source_asset_chain_id: req.srcChainId,\n        source_asset_denom: req.srcAssetDenom,\n        dest_asset_chain_id: req.dstChainId,\n        dest_asset_denom: req.dstAssetDenom,\n        slippage_tolerance_percent: req.slippageTolerancePercent ?? '1',\n        allow_multi_tx: true,\n      }),\n    });\n\n    if (!res.ok) {\n      const body = await res.text().catch(() => '');\n      throw new NPaymentError(\n        `Skip quote failed (${res.status})`,\n        'SKIP_API_QUOTE_FAILED',\n        body || 'Check chain IDs / denoms / amount; Skip API may not support this pair on testnet.',\n      );\n    }\n    const json = (await res.json()) as {\n      amount_out?: string;\n      estimated_fees?: Array<{ fee_amount?: string; chain_id?: string }>;\n      estimated_route_duration_seconds?: number;\n      operations?: unknown[];\n    };\n\n    const quote: SkipQuoteResponse = {\n      amountOut: json.amount_out ?? '0',\n      estimatedFeeBps: estimateFeeBps(req.amountIn, json.amount_out ?? '0'),\n      estimatedSec: json.estimated_route_duration_seconds ?? 120,\n      route: json,\n    };\n    this.cache.set(key, { at: Date.now(), quote });\n    return quote;\n  }\n\n  /**\n   * Execute a previously-fetched route via the Skip Go SDK. Requires\n   * `@skip-go/client` peer dep + caller-supplied signers (one per chain involved).\n   *\n   * The SDK call is delegated as `unknown` to avoid leaking @skip-go internal\n   * types into the public surface; advanced wiring lives at the call-site.\n   */\n  async executeRoute(args: {\n    quote: SkipQuoteResponse;\n    userAddresses: ReadonlyArray<{ chainId: string; address: string }>;\n    /**\n     * Per-chain signers (cosmos OfflineDirectSigner or evm wallet client).\n     * Shape matches Skip Go SDK's `getCosmosSigner` / `getEVMSigner`.\n     */\n    getCosmosSigner?: (chainId: string) => Promise<unknown>;\n    getEVMSigner?: (chainId: string) => Promise<unknown>;\n  }): Promise<{ txHashes: string[] }> {\n    let mod: { SkipClient?: new (cfg: { apiURL?: string; endpointOptions?: unknown }) => unknown };\n    try {\n      mod = (await import('@skip-go/client' as string)) as typeof mod;\n    } catch {\n      throw new NPaymentError(\n        'Skip peer-dep missing: @skip-go/client',\n        'SKIP_PEER_DEP_MISSING',\n        'pnpm add @skip-go/client to enable Skip route execution.',\n      );\n    }\n    if (!mod.SkipClient) {\n      throw new NPaymentError('Skip SDK shape unrecognized', 'SKIP_PEER_DEP_INVALID');\n    }\n    const client = new mod.SkipClient({ apiURL: `${this.baseUrl}/v2` }) as {\n      executeRoute: (req: unknown) => Promise<{ txHash?: string }>;\n    };\n\n    const txHashes: string[] = [];\n    const result = await client.executeRoute({\n      route: args.quote.route,\n      userAddresses: args.userAddresses.map((a) => ({ chainID: a.chainId, address: a.address })),\n      getCosmosSigner: args.getCosmosSigner,\n      getEVMSigner: args.getEVMSigner,\n      onTransactionCompleted: (_chainID: string, txHash: string) => {\n        txHashes.push(txHash);\n      },\n    });\n    if (result?.txHash) txHashes.push(result.txHash);\n    return { txHashes };\n  }\n\n  private cacheKey(req: SkipQuoteRequest): string {\n    return `${req.srcChainId}|${req.srcAssetDenom}|${req.dstChainId}|${req.dstAssetDenom}|${req.amountIn}`;\n  }\n}\n\nfunction estimateFeeBps(amountIn: string, amountOut: string): number {\n  try {\n    const inN = BigInt(amountIn);\n    const outN = BigInt(amountOut);\n    if (inN <= 0n || outN <= 0n) return 0;\n    if (outN >= inN) return 0;\n    const diff = inN - outN;\n    return Number((diff * 10000n) / inN);\n  } catch {\n    return 0;\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n//  LayerZero AUSD-OFT client (Task 5)  — secondary rail (mainnet-gated)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface LayerZeroAusdClientConfig {\n  /** Destination LayerZero endpoint id for Initia (resolved at runtime). */\n  dstEid?: number;\n  /** Source EVM signer (ethers.Wallet, viem.WalletClient, etc.) */\n  signer?: unknown;\n  /** Override AUSD OFT contract on Ethereum (deployment may shift). */\n  ausdOftAddress?: `0x${string}`;\n  /** When true, throw on testnet absence instead of returning an error result. */\n  strict?: boolean;\n}\n\n/**\n * v0.23 — LayerZero AUSD-OFT client. Bridges AUSD from Ethereum mainnet to\n * Initia via LayerZero V2 OFT, where it is auto-converted to iUSD by the\n * Initia mint module.\n *\n * Testnet status (June 2026): AUSD-OFT is not deployed on Sepolia / Initia\n * `initiation-2`. The mainnet code path is fully implemented; calling on\n * testnet throws `LAYERZERO_AUSD_TESTNET_UNAVAILABLE` so the corridor selector\n * routes around it.\n *\n * SOLID — SRP: AUSD-OFT bridge only (no general OFT, no quote aggregation).\n *         DIP: signer + dstEid + ausdOftAddress all injected.\n */\nexport class LayerZeroAusdClient {\n  constructor(public readonly config: LayerZeroAusdClientConfig = {}) {}\n\n  /** Quote bridge fees (LayerZero native fee + protocol fee). */\n  async quote(amount: bigint): Promise<{ feeBps: number; nativeFee: bigint; estimatedSec: number }> {\n    if (!this.config.dstEid || !this.config.ausdOftAddress) {\n      return { feeBps: 0, nativeFee: 0n, estimatedSec: 0 };\n    }\n    // Mainnet shape — fee comes from `OFT.quoteSend()` on Ethereum.\n    // Testnet returns a static placeholder so the corridor selector can branch.\n    return { feeBps: 20, nativeFee: 1_000_000_000_000_000n, estimatedSec: 60 };\n  }\n\n  /**\n   * Bridge AUSD from Ethereum mainnet to Initia. Throws\n   * `LAYERZERO_AUSD_TESTNET_UNAVAILABLE` until Agora deploys AUSD-OFT on testnet.\n   */\n  async bridge(req: {\n    amount: bigint;\n    recipient: string;\n    network: 'mainnet' | 'testnet';\n  }): Promise<{ srcTxHash: string; durationMs: number }> {\n    if (req.network === 'testnet') {\n      throw new NPaymentError(\n        'LayerZero AUSD-OFT not available on testnet',\n        'LAYERZERO_AUSD_TESTNET_UNAVAILABLE',\n        'Use Skip API rail (USDC source) on testnet; AUSD-OFT is mainnet-only as of June 2026.',\n      );\n    }\n    if (!this.config.dstEid || !this.config.ausdOftAddress || !this.config.signer) {\n      throw new NPaymentError(\n        'LayerZero AUSD-OFT misconfigured',\n        'LAYERZERO_AUSD_MISCONFIGURED',\n        'Provide dstEid + ausdOftAddress + signer to LayerZeroAusdClient.',\n      );\n    }\n    let mod: unknown;\n    try {\n      mod = await import('@layerzerolabs/oft-evm' as string);\n    } catch {\n      throw new NPaymentError(\n        'LayerZero peer-dep missing: @layerzerolabs/oft-evm',\n        'LAYERZERO_PEER_DEP_MISSING',\n        'pnpm add @layerzerolabs/oft-evm to enable AUSD-OFT bridging.',\n      );\n    }\n    // Mainnet wiring: build SendParam, call OFT.quoteSend → OFT.send via signer.\n    // Returning the placeholder shape (the real call lands when AUSD-OFT\n    // deployment addresses are published to the registry).\n    void mod;\n    void req;\n    throw new NPaymentError(\n      'LayerZero AUSD-OFT mainnet wiring pending AUSD deployment registry update',\n      'LAYERZERO_AUSD_MAINNET_PENDING',\n      'AUSD-OFT mainnet endpoint id + contract address not yet published; tracked in v0.23.x.',\n    );\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n//  IusdBridgeOrchestrator (Task 6)  — composition root for the corridor\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface IusdBridgeOrchestratorConfig {\n  /** InitiaClient bound to the destination chain (testnet or mainnet). */\n  initia: InitiaClient;\n  /** Skip API client (always provided — primary rail). */\n  skip: SkipApiClient;\n  /** LayerZero client (optional — mainnet rail). */\n  layerZero?: LayerZeroAusdClient;\n  /** Function returning current buyer holdings per source chain. */\n  getHoldings: () => Promise<{\n    iusd: Partial<Record<InitiaChainKey, bigint>>;\n    usdc: Partial<Record<ChainKey, bigint>>;\n    ausd?: Partial<Record<ChainKey, bigint>>;\n  }>;\n  /** Skip executeRoute deps — caller-supplied signer thunks. */\n  skipSigners: {\n    cosmos?: (chainId: string) => Promise<unknown>;\n    evm?: (chainId: string) => Promise<unknown>;\n    addresses: ReadonlyArray<{ chainId: string; address: string }>;\n  };\n  /** Poll iUSD balance every N ms after Skip submit. @default 5000 */\n  pollMs?: number;\n  /** Bridge timeout. @default 600_000 (10 min) */\n  timeoutMs?: number;\n}\n\n/**\n * v0.23 — bridge orchestrator. Composes the corridor selector + the bridge\n * client + the Initia balance poller. Single responsibility: ensure iUSD\n * lands on Initia in `requiredAmount` quantity, regardless of source.\n *\n * Used as PaymentClient's `InitiaIusdAdapter.options.bridgeIfNeeded` hook;\n * also usable standalone via `await orchestrator.ensureIusd(...)`.\n */\nexport class IusdBridgeOrchestrator {\n  constructor(private readonly cfg: IusdBridgeOrchestratorConfig) {}\n\n  /** Ensure the destination Initia wallet holds at least `amount` iUSD. */\n  async ensureIusd(req: { requiredAmount: bigint; recipient: string }): Promise<bigint> {\n    const have = await this.cfg.initia.getIusdBalance();\n    if (have >= req.requiredAmount) return have;\n\n    const holdings = await this.cfg.getHoldings();\n    const decision = selectIusdCorridor({\n      requestedChain: this.cfg.initia.config.chainKey,\n      requestedAmount: req.requiredAmount,\n      iusdHoldings: holdings.iusd,\n      usdcHoldings: holdings.usdc,\n      ausdHoldings: holdings.ausd,\n      skipApiHealthy: true,\n      layerZeroAvailable: !!this.cfg.layerZero,\n    });\n\n    if (decision.kind !== 'bridge') {\n      throw new NPaymentError(\n        `No corridor available for ${req.requiredAmount} iUSD on ${this.cfg.initia.config.chainKey}`,\n        'IUSD_NO_ROUTE',\n        decision.kind === 'no-route' ? decision.reason : 'unknown',\n      );\n    }\n\n    if (decision.corridor === 'skip-api') {\n      const step = decision.steps[0]!;\n      await this.executeSkip(step, req.recipient);\n      return this.pollUntilSufficient(req.requiredAmount);\n    }\n\n    if (decision.corridor === 'layerzero-ausd') {\n      if (!this.cfg.layerZero) {\n        throw new NPaymentError(\n          'LayerZero rail selected but client missing',\n          'LAYERZERO_CLIENT_MISSING',\n        );\n      }\n      const step = decision.steps[0]!;\n      await this.cfg.layerZero.bridge({\n        amount: step.amount,\n        recipient: req.recipient,\n        network: this.cfg.initia.config.chainKey === 'initia-mainnet' ? 'mainnet' : 'testnet',\n      });\n      return this.pollUntilSufficient(req.requiredAmount);\n    }\n\n    throw new NPaymentError(\n      `Corridor ${decision.corridor} not yet wired in IusdBridgeOrchestrator`,\n      'IUSD_CORRIDOR_NOT_IMPLEMENTED',\n      'Use SkipApiClient directly or supply LayerZero rail.',\n    );\n  }\n\n  private async executeSkip(step: IusdCorridorStep, recipient: string): Promise<void> {\n    const dstAsset = getInitiaAsset(this.cfg.initia.config.chainKey, 'iUSD');\n    assertVerifiedDenom(dstAsset);\n    if (!step.fromChain) {\n      throw new NPaymentError('Skip step missing fromChain', 'SKIP_STEP_INVALID');\n    }\n    const srcChainId = chainKeyToSkipChainId(step.fromChain);\n    const dstChainId = this.cfg.initia.config.chainKey === 'initia-mainnet' ? 'interwoven-1' : 'initiation-2';\n\n    const quote = await this.cfg.skip.quoteRoute({\n      srcChainId,\n      srcAssetDenom: srcAssetDenomFor(step.fromChain, step.asset),\n      dstChainId,\n      dstAssetDenom: dstAsset.denom,\n      amountIn: step.amount.toString(),\n    });\n\n    await this.cfg.skip.executeRoute({\n      quote,\n      userAddresses: [\n        ...this.cfg.skipSigners.addresses,\n        { chainId: dstChainId, address: recipient },\n      ],\n      getCosmosSigner: this.cfg.skipSigners.cosmos,\n      getEVMSigner: this.cfg.skipSigners.evm,\n    });\n  }\n\n  private async pollUntilSufficient(required: bigint): Promise<bigint> {\n    const pollMs = this.cfg.pollMs ?? 5_000;\n    const timeoutMs = this.cfg.timeoutMs ?? 600_000;\n    const deadline = Date.now() + timeoutMs;\n    while (Date.now() < deadline) {\n      const have = await this.cfg.initia.getIusdBalance();\n      if (have >= required) return have;\n      await new Promise((r) => setTimeout(r, pollMs));\n    }\n    throw new NPaymentError(\n      `Bridge timed out after ${timeoutMs}ms; iUSD balance still short of ${required}`,\n      'IUSD_BRIDGE_TIMEOUT',\n      'Increase IusdBridgeOrchestratorConfig.timeoutMs or check Skip route status manually.',\n    );\n  }\n}\n\n/** Map ChainKey → Skip API chain-id string. */\nfunction chainKeyToSkipChainId(key: ChainKey): string {\n  const map: Partial<Record<ChainKey, string>> = {\n    'ethereum-mainnet':  '1',\n    'base-mainnet':      '8453',\n    'base-sepolia':      '84532',\n    'optimism-mainnet':  '10',\n    'arbitrum-sepolia':  '421614',\n    'initia-mainnet':    'interwoven-1',\n    'initia-testnet':    'initiation-2',\n  };\n  const out = map[key];\n  if (!out) {\n    throw new NPaymentError(\n      `No Skip chain-id mapping for ${key}`,\n      'SKIP_CHAIN_ID_UNMAPPED',\n      'Extend chainKeyToSkipChainId in src/initia/corridor.ts.',\n    );\n  }\n  return out;\n}\n\n/** Resolve the source-asset denom for Skip API (USDC contract address on EVM, denom on cosmos). */\nfunction srcAssetDenomFor(chain: ChainKey, asset: 'USDC' | 'AUSD' | 'iUSD'): string {\n  if (asset !== 'USDC') {\n    throw new NPaymentError(\n      `Skip rail in v0.23 supports USDC source only (got ${asset})`,\n      'SKIP_ASSET_UNSUPPORTED',\n    );\n  }\n  // Resolve from CHAINS registry (top-level import). USDC slot must be present.\n  const usdc = CHAINS[chain]?.tokens?.USDC;\n  if (!usdc || usdc === '0x0000000000000000000000000000000000000000') {\n    throw new NPaymentError(\n      `USDC not registered on ${chain}`,\n      'USDC_NOT_REGISTERED',\n      'Add USDC to chains.ts tokens map for this chain.',\n    );\n  }\n  return usdc;\n}\n","import type { Address } from 'viem';\nimport { CHAINS } from '../chains.js';\nimport { ChallengeParseError, NPaymentError } from '../errors.js';\nimport type { OWSWallet } from '../ows/wallet.js';\nimport type { ChainKey, PaymentAdapter, PaymentContext } from '../types.js';\n\n/**\n * v0.22 — RLUSD `exact` scheme adapter (PRD-D Primitive A).\n *\n * The buyer broadcasts a real on-chain `RLUSD.transfer(merchant, amount)` and\n * submits the resulting tx hash as the X-PAYMENT proof. The merchant verifies\n * on-chain by reading the Transfer event log — **no facilitator dependency**.\n *\n * Why this exists: Coinbase CDP facilitator covers Base + Polygon + Arbitrum +\n * World + Solana — NOT Ethereum/Optimism/Ink/Unichain — and never RLUSD. RLUSD\n * does not implement EIP-3009 `transferWithAuthorization` per Ripple's\n * RLUSD-on-Ethereum design doc. Therefore: direct transfer + on-chain proof.\n *\n * SOLID — SRP: parse 402 → broadcast transfer → encode proof. Verification\n * lives in `middleware.ts::verifyExactRlusdPayment`.\n */\nexport class RlusdExactAdapter implements PaymentAdapter {\n  readonly protocol = 'rlusd-exact';\n  private readonly chainKey: ChainKey;\n\n  constructor(\n    private readonly wallet: OWSWallet,\n    chainKey: ChainKey,\n  ) {\n    this.chainKey = chainKey;\n  }\n\n  detect(response: Response): boolean {\n    const headerStr =\n      response.headers.get('payment-required') ?? response.headers.get('x-payment-required') ?? '';\n    if (!headerStr) return false;\n    try {\n      const decoded = JSON.parse(Buffer.from(headerStr, 'base64').toString());\n      const accept = decoded.accepts?.[0];\n      return (\n        accept?.scheme === 'exact' &&\n        // asset is the RLUSD ERC-20 OR symbol 'RLUSD'\n        (accept?.asset === 'RLUSD' ||\n          accept?.asset?.toLowerCase?.() === CHAINS[this.chainKey]?.tokens?.RLUSD?.toLowerCase())\n      );\n    } catch {\n      return false;\n    }\n  }\n\n  async pay(\n    url: string,\n    init: RequestInit | undefined,\n    response: Response,\n    _ctx?: PaymentContext,\n  ): Promise<Response> {\n    const chain = CHAINS[this.chainKey];\n    const rlusd = chain.tokens.RLUSD as Address | undefined;\n    if (!rlusd) {\n      throw new NPaymentError(\n        `RLUSD not registered on ${this.chainKey}`,\n        'RLUSD_EXACT_ASSET_MISSING',\n        `Add RLUSD to chains.ts tokens or pick a different chain.`,\n      );\n    }\n\n    const headerStr =\n      response.headers.get('payment-required') ?? response.headers.get('x-payment-required') ?? '';\n    if (!headerStr) {\n      throw new ChallengeParseError('Missing payment-required header', 'MISSING_HEADER');\n    }\n    let accept: { payTo?: string; maxAmountRequired?: string; asset?: string; network?: string };\n    try {\n      const decoded = JSON.parse(Buffer.from(headerStr, 'base64').toString());\n      accept = decoded.accepts?.[0] ?? {};\n    } catch {\n      throw new ChallengeParseError('Malformed payment-required header', 'INVALID_HEADER');\n    }\n    const payTo = accept.payTo as Address | undefined;\n    const amountStr = accept.maxAmountRequired;\n    if (!payTo || !amountStr) {\n      throw new ChallengeParseError(\n        'Missing payTo / maxAmountRequired in challenge',\n        'INVALID_HEADER',\n      );\n    }\n    const amount = BigInt(amountStr);\n\n    // Broadcast on-chain RLUSD transfer using OWSWallet's public API.\n    const tx = await this.wallet.transferERC20(payTo, rlusd, amount, chain.chainId);\n    const fromAddr = await this.wallet.getAddressAsync(chain.chainId);\n\n    const proof = Buffer.from(\n      JSON.stringify({\n        scheme: 'exact',\n        network: accept.network ?? chain.caip2,\n        txHash: tx.txHash,\n        from: fromAddr,\n        to: payTo,\n        value: amountStr,\n        asset: rlusd,\n      }),\n    ).toString('base64');\n\n    const headers = new Headers(init?.headers);\n    headers.set('x-payment', proof);\n    return fetch(url, { ...init, headers });\n  }\n}\n","/**\n * v0.25 — Mento corridor (USDm + cKES + cREAL → USDC).\n *\n * Pure-function path selection — no I/O. The broker client (`mento-broker.ts`)\n * is injected via `MentoCorridorInput.broker`; tests can pass a mock to fully\n * unit-test the decision tree without an RPC. v0.25 ships only the 3 stables\n * required to prove the corridor primitive — additional Mento brand stables\n * (cCOP, cGHS, cZAR, eXOF, …) land in v0.26+ as merchant demand emerges.\n *\n * SOLID — Single Responsibility: this file only OWNS path selection. The\n * MentoBrokerClient owns on-chain reads. The fee-abstracted broadcast path\n * lives in `mento-broker.ts::swapIn` (which itself delegates the CIP-64\n * wrapping to CeloFeeAbstractedTransactor — no logic duplicated here).\n */\nimport type { Address } from 'viem';\nimport type { MentoBrokerClient } from './mento-broker.js';\n\nexport type MentoAssetSymbol = 'USDm' | 'cKES' | 'cREAL';\n\nexport interface MentoAsset {\n  symbol: MentoAssetSymbol;\n  address: Address;\n  decimals: number;\n}\n\n/**\n * Mento brand-stable registry (v0.25 ships 3). All amounts are 18-dec.\n * Addresses are mainnet — sepolia testnet does not yet host cKES/cREAL,\n * so the corridor only quotes USDm on testnet (callers receive\n * `kind: 'no-route'` for cKES/cREAL on celo-sepolia).\n */\nexport const MENTO_ASSETS: Record<MentoAssetSymbol, MentoAsset> = {\n  USDm:  { symbol: 'USDm',  address: '0x765DE816845861e75A25fCA122bb6898B8B1282a', decimals: 18 },\n  cKES:  { symbol: 'cKES',  address: '0x456a3D042C0DbD3db53D5489e98dFb038553B0d0', decimals: 18 },\n  cREAL: { symbol: 'cREAL', address: '0xE4D517785D091D3c54818832dB6094bcc2744545', decimals: 18 },\n};\n\nexport interface MentoCorridorLeg {\n  assetIn:  MentoAssetSymbol | 'USDC';\n  assetOut: MentoAssetSymbol | 'USDC';\n  amountIn: bigint;\n  expectedOut: bigint;\n}\n\nexport type MentoCorridorDecision =\n  | { kind: 'direct-mento';        legs: [MentoCorridorLeg]; expectedOut: bigint; slippageBps: number }\n  | { kind: 'via-usdm';             legs: [MentoCorridorLeg, MentoCorridorLeg]; expectedOut: bigint; slippageBps: number }\n  | { kind: 'no-route';             reason: string };\n\nexport interface MentoCorridorInput {\n  assetIn:  MentoAssetSymbol;\n  assetOut: 'USDC' | MentoAssetSymbol;\n  amountIn: bigint;\n  /** Injected broker for live quotes — pass a mock in unit tests. */\n  broker:   Pick<MentoBrokerClient, 'getAmountOut'>;\n  /** @default 50 (0.5 %) */\n  maxSlippageBps?: number;\n  /** Optional minimum out hint from caller; corridor enforces it. */\n  minOut?: bigint;\n}\n\nconst DEFAULT_SLIPPAGE_BPS = 50;\n\n/**\n * Pick the cheapest viable Mento path for {assetIn → assetOut}.\n *\n * Decision tree (v0.25):\n *   • USDm  → USDC : single-leg (Mento broker quotes USDm/USDC pool)\n *   • cKES  → USDC : two-leg via USDm\n *   • cREAL → USDC : two-leg via USDm\n *   • USDm  → USDm : noop (returned as direct-mento with 0 slippage)\n *   • Any pair where broker.getAmountOut() reverts or returns 0 → no-route.\n */\nexport async function selectMentoCorridor(input: MentoCorridorInput): Promise<MentoCorridorDecision> {\n  if (input.amountIn <= 0n) {\n    return { kind: 'no-route', reason: 'amountIn must be positive' };\n  }\n  if (!(input.assetIn in MENTO_ASSETS)) {\n    return { kind: 'no-route', reason: `Unknown source asset: ${input.assetIn}` };\n  }\n  const slipBps = input.maxSlippageBps ?? DEFAULT_SLIPPAGE_BPS;\n  const usdc = '0xcebA9300f2b948710d2653dD7B07f33A8B32118C' as Address;\n\n  // ── direct USDm → USDC ────────────────────────────────────────────────────\n  if (input.assetIn === 'USDm' && input.assetOut === 'USDC') {\n    const out = await safeQuote(input.broker, MENTO_ASSETS.USDm.address, usdc, input.amountIn);\n    if (out === null) return { kind: 'no-route', reason: 'mento-circuit-breaker' };\n    if (out === 0n)   return { kind: 'no-route', reason: 'mento-zero-quote' };\n    if (slippageBps(input.amountIn, out) > slipBps) {\n      return { kind: 'no-route', reason: `slippage exceeds ${slipBps} bps` };\n    }\n    if (input.minOut && out < input.minOut) {\n      return { kind: 'no-route', reason: `expected ${out} below minOut ${input.minOut}` };\n    }\n    return {\n      kind: 'direct-mento',\n      legs: [{ assetIn: 'USDm', assetOut: 'USDC', amountIn: input.amountIn, expectedOut: out }],\n      expectedOut: out,\n      slippageBps: slippageBps(input.amountIn, out),\n    };\n  }\n\n  // ── two-leg cKES/cREAL → USDm → USDC ─────────────────────────────────────\n  if ((input.assetIn === 'cKES' || input.assetIn === 'cREAL') && input.assetOut === 'USDC') {\n    const leg1Out = await safeQuote(\n      input.broker,\n      MENTO_ASSETS[input.assetIn].address,\n      MENTO_ASSETS.USDm.address,\n      input.amountIn,\n    );\n    if (leg1Out === null) return { kind: 'no-route', reason: 'mento-circuit-breaker' };\n    if (leg1Out === 0n)   return { kind: 'no-route', reason: 'mento-zero-quote-leg1' };\n    const leg2Out = await safeQuote(input.broker, MENTO_ASSETS.USDm.address, usdc, leg1Out);\n    if (leg2Out === null) return { kind: 'no-route', reason: 'mento-circuit-breaker' };\n    if (leg2Out === 0n)   return { kind: 'no-route', reason: 'mento-zero-quote-leg2' };\n    // Slippage applies to the combined hop (input vs final out, both 18-dec\n    // for Mento stables). Caller separately accounts for FX rate (KES/USD).\n    // We only enforce slippage on the USDm → USDC leg since the FX leg\n    // legitimately changes USD-equivalent value.\n    if (slippageBps(leg1Out, leg2Out) > slipBps) {\n      return { kind: 'no-route', reason: `leg2 slippage exceeds ${slipBps} bps` };\n    }\n    if (input.minOut && leg2Out < input.minOut) {\n      return { kind: 'no-route', reason: `expected ${leg2Out} below minOut ${input.minOut}` };\n    }\n    return {\n      kind: 'via-usdm',\n      legs: [\n        { assetIn: input.assetIn, assetOut: 'USDm', amountIn: input.amountIn, expectedOut: leg1Out },\n        { assetIn: 'USDm',         assetOut: 'USDC', amountIn: leg1Out,        expectedOut: leg2Out },\n      ],\n      expectedOut: leg2Out,\n      slippageBps: slippageBps(leg1Out, leg2Out),\n    };\n  }\n\n  // Any other unsupported pair (e.g. cKES → cREAL direct).\n  return { kind: 'no-route', reason: `Unsupported pair: ${input.assetIn} → ${input.assetOut}` };\n}\n\n// ─── helpers ────────────────────────────────────────────────────────────────\n\nasync function safeQuote(\n  broker: Pick<MentoBrokerClient, 'getAmountOut'>,\n  assetIn: Address,\n  assetOut: Address,\n  amountIn: bigint,\n): Promise<bigint | null> {\n  try {\n    return await broker.getAmountOut(assetIn, assetOut, amountIn);\n  } catch {\n    return null;\n  }\n}\n\n/** Slippage in bps measured against the in→out 1:1 baseline (positive = loss). */\nfunction slippageBps(amountIn: bigint, amountOut: bigint): number {\n  if (amountIn === 0n) return 0;\n  if (amountOut >= amountIn) return 0;\n  const lostScaled = ((amountIn - amountOut) * 10_000n) / amountIn;\n  return Number(lostScaled);\n}\n","/**\n * v0.25 — Mento Broker viem-backed client.\n *\n * Pulls live quotes from Mento's on-chain Broker contract (address resolved\n * via CHAINS table or constructor override). The `swapIn` write call is\n * routed through `CeloFeeAbstractedTransactor` so the swap itself is\n * fee-abstracted — the agent pays gas in the asset it's swapping FROM, not\n * CELO.\n *\n * SOLID — Single Responsibility: this client is the on-chain I/O boundary\n * for Mento. Path selection lives in `mento.ts` (pure function, mockable).\n */\nimport type { Address, Hex } from 'viem';\nimport { createPublicClient, http } from 'viem';\nimport { celo, celoSepolia } from 'viem/chains';\nimport { CHAINS } from '../chains.js';\nimport { NPaymentError } from '../errors.js';\nimport type { CeloFeeAbstractedTransactor } from './fee-abstraction.js';\n\ntype CeloChainKey = 'celo-mainnet' | 'celo-sepolia';\n\n/** Minimal Mento Broker ABI — getAmountOut + swapIn. */\nconst MENTO_BROKER_ABI = [\n  {\n    name: 'getAmountOut',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { name: 'exchangeProvider', type: 'address' },\n      { name: 'exchangeId',       type: 'bytes32' },\n      { name: 'tokenIn',          type: 'address' },\n      { name: 'tokenOut',         type: 'address' },\n      { name: 'amountIn',         type: 'uint256' },\n    ],\n    outputs: [{ name: 'amountOut', type: 'uint256' }],\n  },\n  {\n    name: 'swapIn',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'exchangeProvider', type: 'address' },\n      { name: 'exchangeId',       type: 'bytes32' },\n      { name: 'tokenIn',          type: 'address' },\n      { name: 'tokenOut',         type: 'address' },\n      { name: 'amountIn',         type: 'uint256' },\n      { name: 'amountOutMin',     type: 'uint256' },\n    ],\n    outputs: [{ name: 'amountOut', type: 'uint256' }],\n  },\n] as const;\n\nexport interface MentoBrokerClientOptions {\n  /** Override Mento Broker address (default: CHAINS[chainKey].tokens.MENTO_BROKER). */\n  brokerOverride?: Address;\n  /**\n   * Exchange provider + exchangeId resolution strategy. v0.25 ships a\n   * caller-supplied tuple per pair — production integrators read these from\n   * Mento's BiPoolManager (`getExchangeIds`) and inject them at construction.\n   * Mock implementations can return any value.\n   */\n  resolveExchange: (tokenIn: Address, tokenOut: Address) => { provider: Address; exchangeId: Hex };\n  /** Override RPC URL. */\n  rpcUrl?: string;\n}\n\nexport class MentoBrokerClient {\n  private readonly publicClient: { readContract: (args: Record<string, unknown>) => Promise<unknown> };\n  private readonly broker: Address;\n  private readonly resolveExchange: MentoBrokerClientOptions['resolveExchange'];\n  private readonly chainKey: CeloChainKey;\n\n  constructor(chainKey: CeloChainKey, opts: MentoBrokerClientOptions) {\n    this.chainKey = chainKey;\n    const broker = opts.brokerOverride ?? (CHAINS[chainKey].tokens.MENTO_BROKER as Address | undefined);\n    if (!broker) {\n      throw new NPaymentError(\n        `Mento broker address not registered on ${chainKey}`,\n        'CELO_MENTO_BROKER_MISSING',\n        'Pass MentoBrokerClientOptions.brokerOverride or extend chains.ts.',\n      );\n    }\n    this.broker = broker;\n    this.resolveExchange = opts.resolveExchange;\n    const chain = chainKey === 'celo-mainnet' ? celo : celoSepolia;\n    const rpcUrl = opts.rpcUrl ?? CHAINS[chainKey].rpcUrl;\n    this.publicClient = createPublicClient({ chain, transport: http(rpcUrl) }) as never;\n  }\n\n  /** Read-only quote for `tokenIn → tokenOut`. Returns 0n if pool doesn't exist. */\n  async getAmountOut(tokenIn: Address, tokenOut: Address, amountIn: bigint): Promise<bigint> {\n    const { provider, exchangeId } = this.resolveExchange(tokenIn, tokenOut);\n    const out = await this.publicClient.readContract({\n      address: this.broker,\n      abi: MENTO_BROKER_ABI,\n      functionName: 'getAmountOut',\n      args: [provider, exchangeId, tokenIn, tokenOut, amountIn],\n    });\n    return out as bigint;\n  }\n\n  /**\n   * Execute a Mento swap with CIP-64 fee abstraction. The transactor MUST be\n   * pre-funded in `tokenIn` AND must hold an ERC-20 allowance ≥ `amountIn`\n   * to the broker (the SDK does NOT auto-approve — caller's responsibility).\n   */\n  async swapIn(\n    transactor: CeloFeeAbstractedTransactor,\n    tokenIn: Address,\n    tokenOut: Address,\n    amountIn: bigint,\n    amountOutMin: bigint,\n  ): Promise<{ txHash: Hex; blockNumber: bigint }> {\n    const { provider, exchangeId } = this.resolveExchange(tokenIn, tokenOut);\n    return transactor.writeContract({\n      address: this.broker,\n      abi: MENTO_BROKER_ABI,\n      functionName: 'swapIn',\n      args: [provider, exchangeId, tokenIn, tokenOut, amountIn, amountOutMin],\n    });\n  }\n\n  getBrokerAddress(): Address {\n    return this.broker;\n  }\n\n  getChainKey(): CeloChainKey {\n    return this.chainKey;\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,SAAS,uBAAAA,4BAA2B;;;ACjBpC,SAAS,sBAAAC,qBAAoB,sBAAAC,qBAAoB,eAAAC,cAAa,QAAAC,aAAsB;AACpF,SAAS,uBAAAC,4BAA2B;;;ACDpC,SAAS,oBAAoB,oBAAoB,aAAa,MAAM,kBAA4B;AAChG,SAAS,2BAA2B;AAGpC,IAAM,aAA8B,QAAQ,IAAI;AAChD,IAAM,UAAU,WAAW,OAAO;AAE3B,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EAER,YAAY,aAA0B;AACpC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK,YAAY,KAAK,YAAY,EAAE,SAAS,SAAS,KACtD,KAAK,YAAY,KAAK,YAAY,EAAE,SAAS,SAAS;AAAA,EAC/D;AAAA,EAEA,MAAM,gBAAgB,WAAkC;AACtD,QAAI,CAAC,KAAK,UAAU,EAAG;AACvB,QAAI,CAAC,WAAY;AACjB,UAAM,QAAQ,YAAY,EAAE,IAAI,KAAK,YAAY,SAAS,MAAM,KAAK,YAAY,MAAM,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,YAAY,MAAM,EAAE,EAAE,EAAE,CAAC;AAChN,UAAM,MAAM,mBAAmB,EAAE,OAAO,WAAW,KAAK,KAAK,YAAY,MAAM,EAAE,CAAC;AAClF,UAAM,UAAU,MAAM,IAAI,WAAW,EAAE,SAAS,UAA2B,CAAC;AAC5E,QAAI,WAAW,QAAS;AAExB,UAAM,SAAS,oBAAoB,UAAU;AAC7C,UAAM,KAAK,mBAAmB,EAAE,SAAS,QAAQ,OAAO,WAAW,KAAK,KAAK,YAAY,MAAM,EAAE,CAAC;AAClG,UAAM,OAAO,MAAM,GAAG,gBAAgB,EAAE,IAAI,WAA4B,OAAO,WAAW,OAAO,EAAE,CAAC;AACpG,UAAM,IAAI,0BAA0B,EAAE,KAAK,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,iBAAiB,WAAmB,OAA8B;AACtE,QAAI,CAAC,KAAK,UAAU,EAAG;AACvB,QAAI,CAAC,SAAS,UAAU,6CAA8C;AACtE,UAAM,YAAY,KAAK,mBAAmB;AAC1C,QAAI,CAAC,UAAW;AAChB,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,sCAAsC;AAAA,QAC5D,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,WAAW,OAAO,WAAW,QAAQ,WAAW,CAAC;AAAA,MACnF,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,SAAQ,KAAK,4BAA4B,IAAI,MAAM,EAAE;AAAA,IACpE,QAAQ;AAAE,cAAQ,KAAK,qCAAqC;AAAA,IAAG;AAAA,EACjE;AAAA,EAEQ,qBAAoC;AAC1C,QAAI,KAAK,YAAY,YAAY,MAAO,QAAO;AAC/C,QAAI,KAAK,YAAY,YAAY,OAAQ,QAAO;AAChD,WAAO;AAAA,EACT;AAAA,EAEQ,UAAmB;AACzB,WAAO,KAAK,YAAY,YAAY,SAAS,KAAK,YAAY,YAAY;AAAA,EAC5E;AAAA,EAEA,MAAM,kBAAkB,WAAkC;AACxD,QAAI,CAAC,KAAK,UAAU,KAAK,CAAC,KAAK,QAAQ,EAAG;AAC1C,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,qCAAqC;AAAA,QAC3D,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,UAAU,YAAY,EAAE,CAAC;AAAA,MAC3D,CAAC;AACD,UAAI,CAAC,IAAI,IAAI;AAEX,cAAM,MAAM,KAAK,YAAY,QAAQ;AAAA,UACnC,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,IAAI,GAAG,QAAQ,qBAAqB,QAAQ,CAAC,SAAS,EAAE,CAAC;AAAA,QAClG,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAE,cAAQ,KAAK,sCAAsC;AAAA,IAAG;AAAA,EAClE;AAAA,EAEA,MAAM,aAAa,WAAmB,OAA8B;AAClE,QAAI,KAAK,QAAQ,GAAG;AAClB,YAAM,KAAK,kBAAkB,SAAS;AACtC;AAAA,IACF;AACA,UAAM,KAAK,gBAAgB,SAAS;AACpC,UAAM,KAAK,iBAAiB,WAAW,KAAK;AAAA,EAC9C;AACF;;;AD9EA,IAAM,WAAW;AAAA,EACf,EAAE,MAAM,aAAa,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC,EAAE;AAAA,EACvJ,EAAE,MAAM,YAAY,MAAM,YAAY,iBAAiB,cAAc,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,CAAC,EAAE;AAC7L;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,aAA0B,YAAiB,YAAsB;AAC3E,UAAM,QAAQC,aAAY,EAAE,IAAI,YAAY,SAAS,MAAM,SAAS,YAAY,OAAO,IAAI,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,MAAM,EAAE,EAAE,EAAE,CAAC;AAC/M,SAAK,UAAUC,qBAAoB,UAAU;AAC7C,SAAK,eAAeC,oBAAmB,EAAE,OAAO,WAAWC,MAAK,YAAY,MAAM,EAAE,CAAC;AACrF,SAAK,eAAeC,oBAAmB,EAAE,SAAS,KAAK,SAAS,OAAO,WAAWD,MAAK,YAAY,MAAM,EAAE,CAAC;AAC5G,QAAI,WAAY,MAAK,SAAS,IAAI,cAAc,WAAW;AAAA,EAC7D;AAAA,EAEA,aAAqB;AACnB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,gBAAgB,OAAe,OAAgC;AACnE,WAAO,KAAK,aAAa,aAAa,EAAE,SAAS,OAAwB,KAAK,UAAU,cAAc,aAAa,MAAM,CAAC,KAAsB,EAAE,CAAC;AAAA,EACrJ;AAAA,EAEA,MAAM,cAAc,IAAY,OAAe,QAA4C;AACzF,UAAM,KAAK,QAAQ,aAAa,KAAK,QAAQ,SAAS,KAAK;AAC3D,UAAM,SAAS,MAAM,KAAK,aAAa,cAAc,EAAE,SAAS,OAAwB,KAAK,UAAU,cAAc,YAAY,MAAM,CAAC,IAAqB,MAAM,EAAE,CAAC;AACtK,UAAM,UAAU,MAAM,KAAK,aAAa,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAClF,WAAO,EAAE,QAAQ,aAAa,QAAQ,YAAY;AAAA,EACpD;AAAA,EAEA,MAAM,gBAAgB,IAA+E;AACnG,UAAM,SAAS,MAAM,KAAK,aAAa,gBAAgB,EAAE,IAAI,GAAG,IAAqB,OAAO,GAAG,OAAO,MAAM,GAAG,KAAkC,CAAC;AAClJ,UAAM,UAAU,MAAM,KAAK,aAAa,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAClF,WAAO,EAAE,QAAQ,aAAa,QAAQ,YAAY;AAAA,EACpD;AACF;;;AExBO,IAAM,eAA0C,OAAO,OAAO;AAAA,EACnE,EAAE,QAAQ,OAAY,WAAW,UAAU,OAAO,aAAa,QAAQ,IAAS,oBAAoB,sBAA0B,eAAe,aAAa;AAAA,EAC1J,EAAE,QAAQ,UAAY,WAAW,UAAU,OAAO,WAAa,QAAQ,KAAS,oBAAoB,sBAA0B,eAAe,gBAAgB;AAAA,EAC7J,EAAE,QAAQ,WAAY,WAAW,UAAU,OAAO,aAAa,QAAQ,GAAS,oBAAoB,qBAA0B,eAAe,gBAAgB;AAAA,EAC7J,EAAE,QAAQ,UAAY,WAAW,UAAU,OAAO,aAAa,QAAQ,KAAS,oBAAoB,uBAA0B,eAAe,SAAS;AAAA,EACtJ,EAAE,QAAQ,QAAY,WAAW,QAAU,OAAO,aAAa,QAAQ,KAAS,oBAAoB,uBAA0B,eAAe,mBAAmB;AAAA,EAChK,EAAE,QAAQ,OAAY,WAAW,OAAU,OAAO,WAAa,QAAQ,KAAS,oBAAoB,mBAA0B,eAAe,iBAAiB;AAAA,EAC9J,EAAE,QAAQ,OAAY,WAAW,OAAU,OAAO,WAAa,QAAQ,KAAS,oBAAoB,yBAA0B,eAAe,iBAAiB;AAAA,EAC9J,EAAE,QAAQ,QAAY,WAAW,QAAU,OAAO,aAAa,QAAQ,KAAS,oBAAoB,uBAA0B,eAAe,mBAAmB;AAAA,EAChK,EAAE,QAAQ,SAAY,WAAW,SAAU,OAAO,aAAa,QAAQ,SAAS,oBAAoB,qBAA0B,eAAe,eAAe;AAAA,EAC5J,EAAE,QAAQ,YAAY,WAAW,OAAU,OAAO,aAAa,QAAQ,KAAS,oBAAoB,uBAA0B,eAAe,YAAY;AAAA,EACzJ,EAAE,QAAQ,QAAY,WAAW,QAAU,OAAO,WAAa,QAAQ,KAAS,oBAAoB,mBAA0B,eAAe,cAAc;AAC7J,CAAU;AAGV,IAAM,kBAAmD,IAAI;AAAA,EAC3D,aAAa,IAAI,CAAC,SAAS,CAAC,KAAK,WAAW,IAAI,CAAC;AACnD;AAGO,SAAS,WAAW,OAAyD;AAClF,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,SAAS,GAAG,GAAG;AACrD,UAAM,SAAS,qBAAqB,wBAAwB,OAAO,KAAK,CAAC,EAAE;AAAA,EAC7E;AACA,QAAM,aAAa,MAAM,QAAQ,GAAG;AACpC,QAAM,YAAY,MAAM,MAAM,GAAG,UAAU;AAC3C,QAAM,YAAY,MAAM,MAAM,aAAa,CAAC;AAC5C,MAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,UAAM,SAAS,qBAAqB,mCAAmC,KAAK,EAAE;AAAA,EAChF;AACA,SAAO,EAAE,WAAW,UAAU;AAChC;AAOO,SAAS,cAAc,OAA4B;AACxD,QAAM,EAAE,UAAU,IAAI,WAAW,KAAK;AACtC,QAAM,OAAO,gBAAgB,IAAI,SAAS;AAC1C,MAAI,CAAC,MAAM;AACT,UAAM,SAAS,kCAAkC,cAAc,SAAS,0BAA0B;AAAA,EACpG;AACA,SAAO,KAAK;AACd;AAGO,SAAS,YAAY,OAA2B;AACrD,QAAM,EAAE,UAAU,IAAI,WAAW,KAAK;AACtC,QAAM,OAAO,gBAAgB,IAAI,SAAS;AAC1C,MAAI,CAAC,MAAM;AACT,UAAM,SAAS,kCAAkC,cAAc,SAAS,0BAA0B;AAAA,EACpG;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,QAAqB,QAAQ,GAAW;AACxE,QAAM,OAAO,aAAa,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM;AACzD,MAAI,CAAC,MAAM;AACT,UAAM,SAAS,kCAAkC,mBAAmB,MAAM,EAAE;AAAA,EAC9E;AACA,SAAO,KAAK,mBAAmB,QAAQ,OAAO,OAAO,KAAK,CAAC;AAC7D;AAGO,SAAS,UAAU,QAA6B;AACrD,QAAM,OAAO,aAAa,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM;AACzD,MAAI,CAAC,MAAM;AACT,UAAM,SAAS,kCAAkC,mBAAmB,MAAM,EAAE;AAAA,EAC9E;AACA,SAAO,KAAK;AACd;AAMO,SAAS,kBAAkB,OAA8B;AAC9D,QAAM,EAAE,WAAW,UAAU,IAAI,WAAW,KAAK;AACjD,MAAI,cAAc,SAAU,QAAO;AACnC,QAAM,IAAI,OAAO,SAAS,WAAW,EAAE;AACvC,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAGO,SAAS,0BAA6C;AAC3D,SAAO,aAAa,IAAI,CAAC,MAAM,EAAE,SAAS;AAC5C;;;AC1EA,SAAS,eAAe,SAA0C;AAChE,SAAO,OAAO,OAAO,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO;AAChE;AAGA,SAAS,YAAY,QAA8D,OAAmC;AACpH,QAAM,QAAQ,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,KAAK;AAC7D,MAAI,MAAO,QAAO,MAAM;AACxB,QAAM,EAAE,UAAU,IAAI,WAAW,KAAK;AACtC,QAAM,cAAc,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW,GAAG,SAAS,GAAG,CAAC;AACrF,SAAO,aAAa;AACtB;AAQA,SAAS,cAAc,WAA4B;AACjD,MAAI,OAAO,cAAc,SAAU,QAAO;AAC1C,SAAO,KAAK,UAAU,SAAS;AACjC;AAEA,IAAI;AAEJ,eAAsB,gBAAgB,UAA8C;AAClF,MAAI,iBAAiB,OAAW,QAAO;AACvC,MAAI;AACF,UAAME,OAAM,MAAM,OAAO,4BAA4B;AAErD,mBAAe;AAAA;AAAA,MAEb,MAAM,WAAW,YAAY,SAAS;AACpC,cAAM,SAASA,KAAI,UAAU,UAAU;AACvC,cAAM,UAAU,OAAO,SAAS,KAAK,CAAC,MAA2B,EAAE,YAAY,UAAU,OAAO,EAAE;AAClG,eAAO,SAAS,WAAW,OAAO,SAAS,CAAC,GAAG,WAAW;AAAA,MAC5D;AAAA,MAEA,MAAM,gBAAgB,YAAY,SAAS,IAAI;AAC7C,cAAM,cAAc,eAAe,OAAO;AAC1C,YAAI,CAAC,YAAa,OAAM,IAAI,MAAM,SAAS,OAAO,YAAY;AAC9D,cAAM,EAAE,oBAAAC,qBAAoB,MAAAC,OAAM,aAAAC,cAAa,qBAAqB,IAAI,MAAM,OAAO,MAAM;AAC3F,cAAM,YAAYA,aAAY;AAAA,UAC5B,IAAI;AAAA,UACJ,MAAM,YAAY;AAAA,UAClB,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,UAC3D,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,MAAM,EAAE,EAAE;AAAA,QACrD,CAAC;AACD,cAAM,SAASF,oBAAmB,EAAE,OAAO,WAAW,WAAWC,MAAK,YAAY,MAAM,EAAE,CAAC;AAC3F,cAAM,UAAW,MAAM,KAAK,WAAW,YAAY,OAAO;AAC1D,cAAM,QAAQ,MAAM,OAAO,oBAAoB,EAAE,QAAQ,CAAC;AAC1D,cAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,cAAM,UAAU,MAAM,iBAAiB;AACvC,cAAM,QAAQ;AAAA,UACZ,IAAI,GAAG;AAAA,UACP,OAAO,GAAG,QAAQ,OAAO,GAAG,KAAK,IAAI;AAAA,UACrC,MAAO,GAAG,QAAQ;AAAA,UAClB;AAAA,UACA,KAAK;AAAA,UACL,cAAc,UAAU;AAAA,UACxB,sBAAsB;AAAA,UACtB;AAAA,UACA,MAAM;AAAA,QACR;AACA,cAAM,aAAa,qBAAqB,KAAK;AAC7C,cAAM,SAAS,MAAMF,KAAI,YAAY,YAAY,UAAU,OAAO,IAAI,YAAY,MAAM,MAAM,YAAY,MAAM;AAChH,eAAO,OAAO;AAAA,MAChB;AAAA,MAEA,MAAM,YAAY,YAAY,SAAS;AACrC,cAAM,SAAS,MAAMA,KAAI,YAAY,YAAY,OAAO,OAAO;AAC/D,eAAO,OAAO;AAAA,MAChB;AAAA,MAEA,MAAM,WAAW,YAAY,SAAS,OAAO;AAC3C,cAAM,EAAE,oBAAAC,qBAAoB,MAAAC,OAAM,aAAAC,aAAY,IAAI,MAAM,OAAO,MAAM;AACrE,cAAM,cAAc,eAAe,OAAO;AAC1C,YAAI,CAAC,YAAa,QAAO;AACzB,cAAM,YAAYA,aAAY;AAAA,UAC5B,IAAI;AAAA,UACJ,MAAM,YAAY;AAAA,UAClB,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,UAC3D,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,MAAM,EAAE,EAAE;AAAA,QACrD,CAAC;AACD,cAAM,SAASF,oBAAmB,EAAE,OAAO,WAAW,WAAWC,MAAK,YAAY,MAAM,EAAE,CAAC;AAC3F,cAAM,SAASF,KAAI,UAAU,UAAU;AACvC,cAAM,UAAU,OAAO,SAAS,KAAK,CAAC,MAA2B,EAAE,YAAY,UAAU,OAAO,EAAE;AAClG,cAAM,UAAU,SAAS,WAAW,OAAO,SAAS,CAAC,GAAG;AACxD,YAAI,CAAC,QAAS,QAAO;AACrB,YAAI;AACF,gBAAM,UAAU,MAAM,OAAO,aAAa;AAAA,YACxC,SAAS;AAAA,YACT,KAAK;AAAA,cACH;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,iBAAiB;AAAA,gBACjB,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,gBAC3C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,cACzC;AAAA,YACF;AAAA,YACA,cAAc;AAAA,YACd,MAAM,CAAC,OAAwB;AAAA,UACjC,CAAC;AACD,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,cAAc,YAAY,SAAS,IAAI,OAAO,QAAQ;AAC1D,cAAM,OAAO,eAAe,GAAG,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG,IAAI,OAAO,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAChG,eAAO,KAAK,gBAAgB,YAAY,SAAS,EAAE,IAAI,OAAO,KAAK,CAAC;AAAA,MACtE;AAAA;AAAA,MAGA,MAAM,mBAAmB,YAAY,OAAO;AAC1C,cAAM,SAAS,cAAc,KAAK;AAClC,cAAM,SAASA,KAAI,UAAU,UAAU;AACvC,cAAM,UAAU,YAAY,QAAQ,KAAK;AACzC,YAAI,CAAC,SAAS;AACZ,gBAAM;AAAA,YACJ;AAAA,YACA,WAAW,UAAU,wBAAwB,KAAK,aAAa,MAAM;AAAA,UACvE;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,oBAAoB,YAAY,OAAO,SAAS;AACpD,cAAM,SAAS,cAAc,KAAK;AAClC,YAAI;AACF,gBAAM,SAAS,MAAMA,KAAI,YAAY,YAAY,QAAQ,OAAO;AAChE,iBAAO,OAAO;AAAA,QAChB,SAASI,MAAK;AACZ,gBAAM;AAAA,YACJ;AAAA,YACA,eAAe,MAAM,sBAAuBA,KAAc,OAAO;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,oBAAoB,YAAY,OAAO,WAAW;AACtD,cAAM,SAAS,cAAc,KAAK;AAClC,cAAM,OAAO,YAAY,KAAK;AAC9B,cAAM,UAAU,cAAc,SAAS;AAIvC,YAAI;AACF,gBAAM,SAAS,MAAMJ,KAAI,YAAY,YAAY,OAAO,SAAS,MAAM,MAAM,IAAI;AACjF,iBAAO,EAAE,QAAQ,OAAO,QAAQ,QAAQ,KAAK,OAAO;AAAA,QACtD,SAASI,MAAK;AACZ,gBAAM;AAAA,YACJ;AAAA,YACA,eAAe,MAAM,sBAAuBA,KAAc,OAAO;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,mBAAe;AACf,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,sBAAsB,YAA4C;AACtF,QAAM,SAAS,MAAM,gBAAgB;AACrC,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,MAAI;AACF,UAAMJ,OAAM,MAAM,OAAO,4BAA4B;AACrD,UAAM,SAASA,KAAI,UAAU,UAAU;AACvC,UAAM,WAAW,oBAAI,IAAiB;AACtC,eAAW,WAAW,OAAO,UAAU;AACrC,UAAI;AACF,iBAAS,IAAI,cAAc,QAAQ,OAAO,CAAC;AAAA,MAC7C,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO,CAAC,GAAG,QAAQ;AAAA,EACrB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;AJ/LO,IAAM,YAAN,MAAgB;AAAA;AAAA,EAEL;AAAA,EAEC;AAAA,EACA;AAAA,EACA,cAAc,oBAAI,IAA4B;AAAA,EACvD,SAA2B;AAAA,EAClB;AAAA,EAEjB,YAAY,QAAmB;AAC7B,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa,OAAO;AACzB,SAAK,cAAc,gBAAgB,OAAO,OAAO,EAAE,KAAK,CAAC,MAAM;AAC7D,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAc,cAA6B;AACzC,UAAM,KAAK;AAAA,EACb;AAAA,EAEQ,cAAc,SAAiC;AACrD,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,SAAS,yBAAyB,0DAA0D;AAAA,IACpG;AACA,QAAI,IAAI,KAAK,YAAY,IAAI,OAAO;AACpC,QAAI,CAAC,GAAG;AACN,YAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,KAAK,CAAC,MAAmB,EAAE,YAAY,OAAO;AAClF,UAAI,CAAC,MAAO,OAAM,IAAI,cAAc,SAAS,OAAO,cAAc,iBAAiB;AACnF,UAAI,IAAI,eAAe,OAAO,KAAK,YAAY,KAAK,UAAU;AAC9D,WAAK,YAAY,IAAI,SAAS,CAAC;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,QAAyC;AACnE,UAAM,KAAK,YAAY;AACvB,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM;AAAA,QACJ;AAAA,QACA,mCAAmC,MAAM;AAAA,MAC3C;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAQA,WAAW,cAAyD;AAClE,QAAI,OAAO,iBAAiB,UAAU;AAEpC,UAAI,KAAK,OAAQ,QAAO;AACxB,aAAO,KAAK,cAAc,YAAY,EAAE,WAAW;AAAA,IACrD;AACA,WAAO,KAAK,mBAAmB,YAAY;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,gBAAgB,SAAkC;AACtD,UAAM,KAAK,YAAY;AACvB,QAAI,KAAK,OAAQ,QAAO,KAAK,OAAO,WAAW,KAAK,YAAY,OAAO;AACvE,WAAO,KAAK,cAAc,OAAO,EAAE,WAAW;AAAA,EAChD;AAAA,EAEA,MAAc,mBAAmB,OAAgC;AAC/D,UAAM,SAAS,cAAc,KAAK;AAElC,QAAI,WAAW,SAAS,KAAK,cAAc,CAAC,KAAK,QAAQ;AACvD,YAAM,UAAU,kBAAkB,KAAK;AACvC,UAAI,YAAY,KAAM,OAAM,SAAS,qBAAqB,4CAA4C,KAAK,EAAE;AAC7G,aAAO,KAAK,cAAc,OAAO,EAAE,WAAW;AAAA,IAChD;AACA,UAAM,SAAS,MAAM,KAAK,cAAc,MAAM;AAC9C,WAAO,OAAO,mBAAmB,KAAK,YAAY,KAAK;AAAA,EACzD;AAAA;AAAA,EAIA,MAAM,WAAW,OAAe,SAAkC;AAChE,UAAM,KAAK,YAAY;AACvB,QAAI,KAAK,OAAQ,QAAO,KAAK,OAAO,WAAW,KAAK,YAAY,SAAS,KAAK;AAC9E,WAAO,KAAK,cAAc,OAAO,EAAE,gBAAgB,KAAK,cAAc,OAAO,EAAE,WAAW,GAAG,KAAK;AAAA,EACpG;AAAA,EAQA,MAAM,gBAAgB,IAAa,OAA2D;AAC5F,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,KAAK,YAAY;AACvB,YAAM,QAAQ;AACd,UAAI,KAAK,QAAQ;AACf,cAAM,SAAS,MAAM,KAAK,OAAO,gBAAgB,KAAK,YAAY,OAAO,KAAK;AAC9E,eAAO,EAAE,QAAQ,aAAa,GAAG;AAAA,MACnC;AACA,YAAM,SAAS,MAAM,KAAK,cAAc,KAAK,EAAE,gBAAgB;AAAA,QAC7D,IAAI,MAAM;AAAA,QACV,OAAO,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI;AAAA,QAC3C,MAAM,MAAM;AAAA,MACd,CAAC;AACD,aAAO,EAAE,QAAQ,OAAO,QAAQ,aAAa,OAAO,YAAY;AAAA,IAClE;AACA,WAAO,KAAK,YAAY,OAAO,EAAE;AAAA,EACnC;AAAA,EAQA,MAAM,cAAc,IAAY,OAAe,QAAgB,OAA2D;AACxH,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,KAAK,YAAY;AACvB,UAAI,KAAK,QAAQ;AACf,cAAM,SAAS,MAAM,KAAK,OAAO,cAAc,KAAK,YAAY,OAAO,IAAI,OAAO,MAAM;AACxF,eAAO,EAAE,QAAQ,aAAa,GAAG;AAAA,MACnC;AACA,YAAM,SAAS,MAAM,KAAK,cAAc,KAAK,EAAE,cAAc,IAAI,OAAO,MAAM;AAC9E,aAAO,EAAE,QAAQ,OAAO,QAAQ,aAAa,OAAO,YAAY;AAAA,IAClE;AACA,UAAM,SAAS,cAAc,KAAK;AAClC,QAAI,WAAW,OAAO;AACpB,YAAM,SAAS,sBAAsB,yCAAyC,MAAM,QAAQ,KAAK,EAAE;AAAA,IACrG;AACA,UAAM,UAAU,kBAAkB,KAAK;AACvC,QAAI,YAAY,KAAM,OAAM,SAAS,qBAAqB,4CAA4C,KAAK,EAAE;AAC7G,WAAO,KAAK,cAAc,IAAI,OAAO,QAAQ,OAAO;AAAA,EACtD;AAAA,EAQA,MAAM,YAAY,MAAc,MAAgC;AAC9D,QAAI,SAAS,QAAW;AAEtB,YAAM,KAAK,YAAY;AACvB,UAAI,KAAK,OAAQ,QAAO,KAAK,OAAO,YAAY,KAAK,YAAY,IAAI;AACrE,UAAI,CAAC,KAAK,WAAY,OAAM,SAAS,uBAAuB;AAC5D,YAAM,UAAUK,qBAAoB,KAAK,UAAU;AACnD,aAAO,QAAQ,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,IAC9C;AAEA,UAAM,SAAS,cAAc,IAAI;AACjC,QAAI,WAAW,SAAS,KAAK,cAAc,CAAC,KAAK,QAAQ;AACvD,YAAM,UAAUA,qBAAoB,KAAK,UAAU;AACnD,aAAO,QAAQ,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,IAC9C;AACA,UAAM,SAAS,MAAM,KAAK,cAAc,MAAM;AAC9C,WAAO,OAAO,oBAAoB,KAAK,YAAY,MAAM,IAAI;AAAA,EAC/D;AAAA;AAAA,EAIA,MAAM,YAAY,OAAe,WAAuC;AACtE,UAAM,SAAS,cAAc,KAAK;AAElC,QAAI,WAAW,SAAS,KAAK,cAAc,CAAC,KAAK,QAAQ;AACvD,YAAM,UAAU,kBAAkB,KAAK;AACvC,UAAI,YAAY,KAAM,OAAM,SAAS,qBAAqB,4CAA4C,KAAK,EAAE;AAC7G,YAAM,QAAQ;AACd,YAAM,SAAS,MAAM,KAAK,cAAc,OAAO,EAAE,gBAAgB;AAAA,QAC/D,IAAI,MAAM;AAAA,QACV,OAAO,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI;AAAA,QAC3C,MAAM,MAAM;AAAA,MACd,CAAC;AACD,aAAO,EAAE,QAAQ,OAAO,QAAQ,aAAa,OAAO,aAAa,OAAO;AAAA,IAC1E;AACA,UAAM,SAAS,MAAM,KAAK,cAAc,MAAM;AAC9C,WAAO,OAAO,oBAAoB,KAAK,YAAY,OAAO,SAAS;AAAA,EACrE;AAAA;AAAA,EAIA,MAAM,SAAS,OAAe,IAAY,OAAe,QAAmC;AAC1F,UAAM,SAAS,cAAc,KAAK;AAClC,QAAI,WAAW,OAAO;AACpB,YAAM,UAAU,kBAAkB,KAAK;AACvC,UAAI,YAAY,KAAM,OAAM,SAAS,qBAAqB,4CAA4C,KAAK,EAAE;AAC7G,YAAM,SAAS,MAAM,KAAK,cAAc,IAAI,OAAO,QAAQ,OAAO;AAClE,aAAO,EAAE,QAAQ,OAAO,QAAQ,aAAa,OAAO,aAAa,OAAO;AAAA,IAC1E;AAIA,UAAM;AAAA,MACJ;AAAA,MACA,2CAA2C,MAAM;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAmC,QAKxB;AACf,UAAM,KAAK,YAAY;AACvB,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAUA,qBAAoB,KAAK,UAAU;AACnD,WAAO,QAAQ,cAAc;AAAA,MAC3B,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,IAClB,CAAgD;AAAA,EAClD;AAAA;AAAA,EAIA,MAAM,QAAQ,MAAc,SAAmC;AAC7D,UAAM,IAAI,cAAc,yCAAyC,iBAAiB;AAAA,EACpF;AAAA;AAAA,EAGA,aAA4D;AAC1D,QAAI,CAAC,KAAK,WAAY,QAAO;AAC7B,WAAOA,qBAAoB,KAAK,UAAU;AAAA,EAC5C;AAAA;AAAA,EAGA,cAAc,OAA4B;AACxC,WAAO,cAAc,KAAK;AAAA,EAC5B;AAAA;AAAA,EAGA,YAAY,OAAe;AACzB,WAAO,YAAY,KAAK;AAAA,EAC1B;AACF;;;AK7QA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAgB1B,IAAM,gBAAgB,UAAU,QAAQ;AAKxC,IAAI,aAA4C;AAEhD,SAAS,UAAkC;AACzC,MAAI,CAAC,YAAY;AACf,iBAAa,OAAO,4BAA4B,EAAE;AAAA,MAChD,CAAC,MAAM;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAe,QAAW,OAAe,IAA6C;AACpF,QAAM,MAAM,MAAM,QAAQ;AAC1B,MAAI,CAAC,IAAK,OAAM,SAAS,yBAAyB,aAAa,KAAK,sCAAsC;AAC1G,MAAI;AACF,WAAO,MAAM,GAAG,GAAG;AAAA,EACrB,SAASC,MAAK;AACZ,UAAM,UAAWA,MAAe,WAAW,OAAOA,IAAG;AAErD,QAAI,4BAA4B,KAAK,OAAO,GAAG;AAC7C,YAAM,SAAS,wBAAwB,GAAG,KAAK,KAAK,OAAO,EAAE;AAAA,IAC/D;AACA,QAAI,2BAA2B,KAAK,OAAO,GAAG;AAC5C,YAAM,SAAS,wBAAwB,GAAG,KAAK,KAAK,OAAO,EAAE;AAAA,IAC/D;AACA,UAAM,SAAS,sBAAsB,GAAG,KAAK,KAAK,OAAO,EAAE;AAAA,EAC7D;AACF;AAGA,eAAe,QAAQ,OAAe,MAAgB,UAAU,OAAO,KAA+C;AACpH,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,SAAS,MAAM;AAAA,MACpD,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAI,OAAO,CAAC,EAAG;AAAA,MACtC,WAAW,KAAK,OAAO;AAAA,IACzB,CAAC;AACD,WAAO;AAAA,EACT,SAASA,MAAK;AACZ,UAAM,UAAWA,KAAoC,UAAWA,KAAc;AAC9E,QAAI,oBAAoB,KAAK,OAAO,GAAG;AACrC,YAAM,SAAS,yBAAyB,GAAG,KAAK,KAAK,OAAO,oBAAoB;AAAA,IAClF;AACA,UAAM,SAAS,sBAAsB,GAAG,KAAK,KAAK,OAAO,EAAE;AAAA,EAC7D;AACF;AAGA,SAAS,eAAe,QAAgB,SAAwB;AAC9D,MAAI,YAAY,MAAM;AACpB,UAAM,SAAS,wBAAwB,GAAG,MAAM,6BAA6B;AAAA,EAC/E;AACF;AAIO,IAAM,MAAM;AAAA;AAAA,EAGjB,aAAa,MAAmD;AAC9D,WAAO,QAAQ,gBAAgB,OAAO,QAAQ;AAC5C,YAAM,SAAS,MAAM,IAAI,aAAa;AAAA,QACpC,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,cAAc;AAAA,QACd,kBAAkB,KAAK,oBAAoB;AAAA,QAC3C,YAAY,KAAK;AAAA,MACnB,CAAC;AACD,aAAO,aAAa,MAAM;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,eAAe,MAA0F;AAEvG,WAAO,QAAQ,kBAAkB,OAAO,QAAQ;AAC9C,YAAM,SAAS,MAAM,IAAI,eAAe;AAAA,QACtC,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,MACnB,CAAC;AACD,aAAO,aAAa,MAAM;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB,MAA0G;AACzH,WAAO,QAAQ,oBAAoB,OAAO,QAAQ;AAChD,YAAM,SAAS,MAAM,IAAI,iBAAiB,IAAI;AAC9C,aAAO,aAAa,MAAM;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,eAAe,MAAyG;AACtH,WAAO,QAAQ,kBAAkB,OAAO,QAAQ,aAAa,MAAM,IAAI,eAAe,IAAI,CAAC,CAAC;AAAA,EAC9F;AAAA,EAEA,UAAU,MAAqF;AAC7F,WAAO,QAAQ,aAAa,OAAO,QAAQ,aAAa,MAAM,IAAI,UAAU,IAAI,CAAC,CAAC;AAAA,EACpF;AAAA,EAEA,oBAAoB,MAAsF;AACxG,WAAO,QAAQ,uBAAuB,OAAO,QAAQ,aAAa,MAAM,IAAI,oBAAoB,IAAI,CAAC,CAAC;AAAA,EACxG;AAAA,EAEA,kBAAkB,MAAsF;AACtG,WAAO,QAAQ,qBAAqB,OAAO,QAAQ,aAAa,MAAM,IAAI,kBAAkB,IAAI,CAAC,CAAC;AAAA,EACpG;AAAA;AAAA,EAIA,eAAe,MAA0D;AACvE,mBAAe,kBAAkB,KAAK,OAAO;AAC7C,WAAO,QAAQ,kBAAkB,CAAC,QAAQ,IAAI,eAAe,IAAI,CAAC;AAAA,EACpE;AAAA,EAEA,eAAe,MAA6F;AAC1G,WAAO,QAAQ,kBAAkB,CAAC,QAAQ,IAAI,eAAe,IAAI,CAAC;AAAA,EACpE;AAAA,EAEA,UAAU,MAA2E;AACnF,mBAAe,aAAa,KAAK,OAAO;AACxC,WAAO,QAAQ,aAAa,CAAC,QAAQ,IAAI,UAAU,IAAI,CAAC;AAAA,EAC1D;AAAA;AAAA,EAIA,MAAM,YAAY,MAAkF;AAClG,UAAM,aAAa,QAAQ,IAAI,KAAK,aAAa;AACjD,QAAI,CAAC,YAAY;AACf,YAAM,SAAS,wBAAwB,YAAY,KAAK,aAAa,4BAA4B;AAAA,IACnG;AACA,UAAM,MAAM,MAAM,QAAQ;AAC1B,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,OAAO,EAAE,QAAQ,KAAK,QAAQ,WAAW,CAAC;AACpD;AAAA,IACF;AAEA,UAAM,QAAQ,eAAe,CAAC,UAAU,YAAY,KAAK,MAAM,GAAG,KAAK,SAAS;AAAA,MAC9E,uBAAuB;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,MAAkF;AACnG,UAAM,aAAa,KAAK,gBAAgB,QAAQ,IAAI,KAAK,aAAa,IAAI;AAC1E,UAAM,MAAM,MAAM,QAAQ;AAC1B,QAAI,KAAK,WAAW,YAAY;AAC9B,YAAM,IAAI,QAAQ,EAAE,OAAO,KAAK,OAAO,WAAW,CAAC;AACnD;AAAA,IACF;AACA,UAAM,QAAQ,gBAAgB,CAAC,WAAW,WAAW,KAAK,KAAK,GAAG,KAAK,SAAS,aAAa,EAAE,uBAAuB,WAAW,IAAI,MAAS;AAAA,EAChJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,MAAkH;AAC1I,UAAM,OAAO,CAAC,UAAU,OAAO,uBAAuB,mBAAmB,KAAK,QAAQ,IAAI,oBAAoB,KAAK,SAAS,EAAE;AAC9H,QAAI,KAAK,YAAa,MAAK,KAAK,sBAAsB,KAAK,WAAW,EAAE;AACxE,UAAM,QAAQ,uBAAuB,MAAM,KAAK,OAAO;AAAA,EACzD;AAAA;AAAA,EAIA,QAAQ,MAAwF;AAE9F,WAAO;AAAA,MAAQ;AAAA,MAAW,OAAO,QAC/B;AAAA,QACE,MAAM,IAAI,QAAQ;AAAA,UAChB,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK,YAAY;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,KAAK,QAA+B;AAClC,WAAO,QAAQ,QAAQ,CAAC,QAAQ,IAAI,KAAK,MAAM,CAAC;AAAA,EAClD;AAAA,EAEA,OAAO,QAAgB,YAAoC;AACzD,WAAO,QAAQ,UAAU,CAAC,QAAQ,IAAI,OAAO,QAAQ,UAAU,CAAC;AAAA,EAClE;AAAA,EAEA,OAAO,MAAqE;AAC1E,WAAO,QAAQ,UAAU,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,EACpD;AAAA,EAEA,SAAS,OAAqB,CAAC,GAAgC;AAC7D,WAAO,QAAQ,YAAY,OAAO,QAAQ;AACxC,YAAM,OAAO,MAAM,QAAQ;AAAA,QACzB,IAAI,YAAY;AAAA,UACd,WAAW,KAAK;AAAA,UAChB,aAAa,KAAK;AAAA,UAClB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH;AACA,aAAO,KAAK,IAAI,YAAY;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAwD;AAC7D,mBAAe,UAAU,KAAK,OAAO;AACrC,WAAO,QAAQ,UAAU,CAAC,QAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,EAC1D;AAAA;AAAA,EAIA,MAAM,aAAa,KAAmC;AACpD,WAAO,QAAQ,gBAAgB,OAAO,QAAQ;AAC5C,YAAM,UAAU,MAAM,IAAI,OAAO,OAAO,GAAG;AAC3C,aAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,eAAyC;AACvC,WAAO,QAAQ,gBAAgB,OAAO,QAAQ;AAC5C,YAAM,OAAO,MAAM,IAAI,OAAO,KAAK;AACnC,aAAO,KAAK,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,aAAa,EAAE,aAAa,QAAQ,EAAE,OAAO,EAAE;AAAA,IACrF,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,IAAyC;AACjD,WAAO,QAAQ,aAAa,OAAO,QAAQ;AACzC,YAAM,IAAI,MAAM,IAAI,OAAO,IAAI,EAAE;AACjC,UAAI,CAAC,EAAG,QAAO;AACf,aAAO,EAAE,aAAa,EAAE,aAAa,QAAQ,EAAE,QAAQ,YAAY,EAAE,YAAY,eAAe,EAAE,cAAc;AAAA,IAClH,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,IAA6B;AACxC,WAAO,QAAQ,gBAAgB,CAAC,QAAQ,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,MAAyC;AACpD,WAAO,QAAQ,gBAAgB,OAAO,QAAQ;AAC5C,YAAM,SAAS,MAAM,IAAI,OAAO,OAAO,IAAI;AAC3C,aAAO,EAAE,IAAI,OAAO,IAAI,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,SAAS,OAAO,QAAQ;AAAA,IAC1F,CAAC;AAAA,EACH;AAAA,EAEA,cAAwC;AACtC,WAAO,QAAQ,eAAe,OAAO,QAAQ;AAC3C,YAAM,OAAO,MAAM,IAAI,OAAO,KAAK;AACnC,aAAO,KAAK,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,SAAS,EAAE,SAAS,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ,EAAE;AAAA,IAC/G,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,IAA6B;AACxC,WAAO,QAAQ,gBAAgB,CAAC,QAAQ,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,EAC/D;AAAA;AAAA,EAIA,iBAAiB,OAA4B,CAAC,GAAoB;AAChE,WAAO,QAAQ,oBAAoB,CAAC,QAAQ,IAAI,SAAS,SAAS,EAAE,OAAO,KAAK,SAAS,GAAG,CAAC,CAAC;AAAA,EAChG;AAAA,EAEA,cAAc,MAAuG;AACnH,WAAO,QAAQ,iBAAiB,CAAC,QAAQ,IAAI,SAAS,OAAO,IAAI,CAAC;AAAA,EACpE;AACF;AAWA,SAAS,aAAa,GAAgC;AACpD,SAAO;AAAA,IACL,IAAI,EAAE,MAAM,EAAE;AAAA,IACd,MAAM,EAAE;AAAA,IACR,UAAU,EAAE,SAAS,IAAI,CAAC,OAAO;AAAA,MAC/B,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX,QAAS,EAAE,UAA0B,qBAAqB,EAAE,OAAO;AAAA,MACnE,gBAAgB,EAAE,kBAAkB;AAAA,IACtC,EAAE;AAAA,IACF,WAAW,EAAE,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACnD;AACF;AAEA,SAAS,qBAAqB,OAA4B;AAIxD,QAAM,YAAY,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK;AACzC,QAAM,MAAmC;AAAA,IACvC,QAAQ;AAAA,IAAO,QAAQ;AAAA,IAAU,QAAQ;AAAA,IAAW,QAAQ;AAAA,IAC5D,MAAM;AAAA,IAAQ,KAAK;AAAA,IAAO,KAAK;AAAA,IAAO,MAAM;AAAA,IAC5C,OAAO;AAAA,IAAS,KAAK;AAAA,IAAY,MAAM;AAAA,EACzC;AACA,SAAO,IAAI,SAAS,KAAK;AAC3B;;;ACzVO,SAAS,aAAa,OAAuC;AAClE,MAAI,CAAC,MAAM,QAAQ,QAAQ;AACzB,UAAM,IAAI,cAAc,+BAA+B,kBAAkB,+BAA+B;AAAA,EAC1G;AAEA,aAAW,SAAS,MAAM,QAAQ;AAChC,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,YAAM,IAAI,cAAc,kBAAkB,KAAK,IAAI,kBAAkB,iBAAiB,OAAO,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IACxH;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,KAAK,QAAQ;AACtB,UAAM,IAAI,cAAc,0BAA0B,kBAAkB,kCAAkC;AAAA,EACxG;AAKA,QAAM,eAAe,MAAM,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC,EAAE,UAAU,SAAS,MAAM,CAAC;AAClF,MAAI,gBAAgB,CAAC,MAAM,MAAM;AAC/B,UAAM,IAAI,cAAc,wCAAwC,kBAAkB,8CAA8C;AAAA,EAClI;AAEA,MAAI,MAAM,cAAc,CAAC,cAAc;AACrC,UAAM,IAAI,cAAc,oCAAoC,kBAAkB,4CAA4C;AAAA,EAC5H;AAEA,MAAI,MAAM,cAAc,CAAC,MAAM,WAAW,cAAc;AACtD,UAAM,IAAI,cAAc,uCAAuC,kBAAkB,4CAA4C;AAAA,EAC/H;AAEA,MAAI,MAAM,OAAO,QAAQ,SAAS;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,sBAAsB,MAAM,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC,EAAE,UAAU,SAAS,aAAa,CAAC;AAChG,MAAI,MAAM,aAAa,UAAU,CAAC,qBAAqB;AACrD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,MAAM;AACd,QAAI,MAAM,KAAK,WAAW,WAAc,MAAM,KAAK,SAAS,KAAK,MAAM,KAAK,SAAS,KAAK;AACxF,YAAM,IAAI,cAAc,wCAAwC,gBAAgB;AAAA,IAClF;AACA,QAAI,MAAM,KAAK,OAAO,eAAe,UAAa,MAAM,KAAK,MAAM,aAAa,IAAI;AAClF,YAAM,IAAI,cAAc,0DAA0D,gBAAgB;AAAA,IACpG;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,QAAQ,GAAG,MAAM;AACtC;;;AC9DA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,eAAe,aAAa,CAAC;AAC7D,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EAAiB;AAAA,EAAkB;AAAA,EACnC;AAAA,EAAc;AAAA,EAAa;AAC7B,CAAC;AAED,IAAM,gBAAgB,oBAAI,IAAI,CAAC,UAAU,UAAU,QAAQ,CAAC;AAQrD,SAAS,eACd,UACA,aAA2B,QAC4F;AACvH,QAAM,gBACJ,SAAS,QAAQ,IAAI,kBAAkB,KACvC,SAAS,QAAQ,IAAI,kBAAkB,KACvC,SAAS,QAAQ,IAAI,oBAAoB,KACzC;AACF,QAAM,aAAa,SAAS,QAAQ,IAAI,kBAAkB,KAAK;AAC/D,QAAM,UAAU,CAAC,CAAC;AAClB,QAAM,SAAS,WAAW,YAAY,EAAE,SAAS,SAAS;AAE1D,MAAI,SAAS;AACX,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO,KAAK,eAAe,QAAQ,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC;AAGvF,UAAI,QAAQ,WAAW,iBAAkB,QAAO;AAChD,YAAM,UAAU,QAAQ;AACxB,UAAI,WAAW,cAAc,IAAI,OAAO,EAAG,QAAO;AAClD,UAAI,WAAW,eAAe,IAAI,OAAO,EAAG,QAAO;AACnD,UAAI,WAAW,eAAe,IAAI,OAAO,EAAG,QAAO;AACnD,UAAI,SAAS,WAAW,UAAU,EAAG,QAAO;AAAA,IAC9C,QAAQ;AAAA,IAAuC;AAAA,EACjD;AAEA,MAAI,UAAU,WAAW,YAAY,EAAE,SAAS,SAAS,EAAG,QAAO;AAEnE,MAAI,WAAW,OAAQ,QAAO,eAAe,QAAQ,QAAQ;AAC7D,MAAI,QAAS,QAAO;AACpB,MAAI,OAAQ,QAAO;AACnB,SAAO;AACT;;;AC/CO,IAAM,mBAAN,MAAkD;AAAA,EACvD,KAAK,OAA2B;AAC9B,UAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAC/B,YAAQ,IAAI,eAAe,KAAK,UAAU,EAAE,GAAG,MAAM,MAAM,IAAI,KAAK,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;AAAA,EACjG;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACpB;AAAA,EAER,YAAY,SAA6B;AACvC,SAAK,UAAU,SAAS,SAAS,UAAU,CAAC,IAAI,iBAAiB,CAAC;AAAA,EACpE;AAAA,EAEA,KAAK,OAA2B;AAC9B,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI;AACF,eAAO,KAAK,KAAK;AAAA,MACnB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;ACdA,IAAM,cAA4E;AAAA,EAChF,gBAAoB,EAAE,MAAM,YAAY,SAAS,IAAI;AAAA,EACrD,gBAAoB,EAAE,MAAM,QAAY,SAAS,IAAI;AAAA,EACrD,oBAAoB,EAAE,MAAM,QAAY,SAAS,IAAI;AAAA,EACrD,eAAoB,EAAE,MAAM,YAAY,SAAS,IAAI;AAAA,EACrD,eAAoB,EAAE,MAAM,QAAY,SAAS,IAAI;AAAA;AAAA,EAErD,gBAAoB,EAAE,MAAM,YAAY,SAAS,IAAI;AAAA,EACrD,gBAAoB,EAAE,MAAM,YAAY,SAAS,IAAI;AACvD;AAEA,IAAM,sBAAsB;AAAA,EAC1B,2BAA2B;AAAA,IACzB,EAAE,MAAM,QAAe,MAAM,UAAU;AAAA,IACvC,EAAE,MAAM,MAAe,MAAM,UAAU;AAAA,IACvC,EAAE,MAAM,SAAe,MAAM,UAAU;AAAA,IACvC,EAAE,MAAM,cAAe,MAAM,UAAU;AAAA,IACvC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,IACvC,EAAE,MAAM,SAAe,MAAM,UAAU;AAAA,EACzC;AACF;AAGA,SAAS,gBAAqB;AAC5B,QAAM,MAAM,IAAI,WAAW,EAAE;AAC7B,SAAO,gBAAgB,GAAG;AAC1B,SAAQ,OAAO,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAChF;AAUO,IAAM,cAAN,MAA4C;AAAA,EACxC,WAAW;AAAA,EACZ;AAAA,EACA;AAAA;AAAA,EAES;AAAA,EAEjB,YAAY,QAAmB,UAAoB,wBAAwB,KAAK;AAC9E,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,wBAAwB;AAAA,EAC/B;AAAA,EAEA,OAAO,UAA6B;AAClC,WAAO,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB;AAAA,EAC9F;AAAA,EAEA,MAAM,IAAI,KAAa,MAA+B,UAAuC;AAC3F,UAAM,QAAQ,OAAO,KAAK,QAAQ;AAGlC,UAAM,YAAY,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB,KAAK;AAC5G,QAAI,CAAC,UAAW,OAAM,IAAI,oBAAoB,mCAAmC,gBAAgB;AAEjG,QAAI;AACJ,QAAI;AACF,kBAAY,KAAK,MAAM,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,CAAC;AAAA,IACpE,QAAQ;AACN,YAAM,IAAI,oBAAoB,4CAA4C,gBAAgB;AAAA,IAC5F;AACA,UAAM,SAAS,UAAU,UAAU,CAAC;AACpC,QAAI,CAAC,OAAQ,OAAM,IAAI,oBAAoB,8CAA8C,gBAAgB;AAEzG,UAAM,QAAQ,OAAO;AACrB,UAAM,eAAgB,OAAO,SAAkC,MAAM,OAAO;AAC5E,UAAM,SAAS,OAAO,OAAO,qBAAqB,GAAG;AAErD,QAAI,CAAC,MAAc,OAAM,IAAI,oBAAoB,uCAAuC,gBAAgB;AACxG,QAAI,CAAC,aAAc,OAAM,IAAI,cAAc,sCAAsC,eAAe;AAChG,QAAI,WAAW,GAAI,OAAM,IAAI,oBAAoB,0CAA0C,aAAa;AAGxG,UAAM,UAAU,KAAK,OAAO,WAAW;AACvC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW,cAAc,MAAM,OAAO;AACxE,QAAI,UAAU,QAAQ;AACpB,YAAM,IAAI;AAAA,QACR,8BAA8B,OAAO,eAAe,MAAM;AAAA,QAC1D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAAa;AACnB,UAAM,cAAc,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI,KAAK,qBAAqB;AACrF,UAAM,QAAQ,cAAc;AAC5B,UAAM,MAAM,YAAY,KAAK,QAAQ,KAAK,EAAE,MAAM,YAAY,SAAS,IAAI;AAE3E,UAAM,YAAY,MAAM,QAAQ,cAAc;AAAA,MAC5C,QAAQ;AAAA,QACN,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,SAAS,MAAM;AAAA,QACf,mBAAmB;AAAA,MACrB;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,QACP,MAAM,QAAQ;AAAA,QACd,IAAI;AAAA,QACJ,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAGD,UAAM,WAAW,OAAO,KAAK,KAAK,UAAU;AAAA,MAC1C,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,QACP;AAAA,QACA,eAAe;AAAA,UACb,MAAM,QAAQ;AAAA,UACd,IAAI;AAAA,UACJ,OAAO,OAAO,SAAS;AAAA,UACvB,YAAY,WAAW,SAAS;AAAA,UAChC,aAAa,YAAY,SAAS;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,CAAC,EAAE,SAAS,QAAQ;AAGrB,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,iBAAa,IAAI,aAAa,QAAQ;AACtC,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC;AAAA,EACtD;AACF;;;ACvJO,IAAM,aAAN,MAA2C;AAAA,EACvC,WAAW;AAAA,EACZ,eAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAmB,UAAoB,aAAa,OAAO;AACrE,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAc,UAAU;AACtB,QAAI,KAAK,aAAc,QAAO,KAAK;AAEnC,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,aAAa;AAClD,UAAM,UAAU,KAAK,OAAO,WAAW;AAEvC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,YAAY;AACnB,YAAM,QAAQ,OAAO,KAAK,QAAQ;AAClC,YAAM,SAAS,IAAI,cAAc,KAAK;AACtC,YAAM,OAAO,aAAa,QAAQ,SAAS,MAAM,OAAO,WAAW,MAAM,OAAO,QAAQ,EAAE;AAAA,IAC5F;AAEA,SAAK,eAAe,KAAK,OAAO;AAAA,MAC9B,UAAU;AAAA,MACV,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,IAC9B,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,UAA6B;AAClC,WAAO,SAAS,QAAQ,IAAI,kBAAkB,GAAG,YAAY,EAAE,SAAS,SAAS,KAAK;AAAA,EACxF;AAAA,EAEA,MAAM,IAAI,KAAa,MAA+B,WAAwC;AAC5F,UAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,WAAO,KAAK,MAAM,KAAK,IAAI;AAAA,EAC7B;AACF;;;ACtDA,SAAS,kBAAkB;AASpB,SAAS,gBACd,MACA,QACA,WACwB;AACxB,QAAM,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,EAAE,SAAS;AACzD,QAAM,SAAiC,CAAC;AAExC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,EAAE,GAAG,MAAM,SAAS,QAAQ,UAAU,CAAC,GAAG;AAC5E,QAAI,MAAM,MAAM,MAAM,QAAQ,MAAM,UAAa,MAAM,QAAQ;AAC7D,aAAO,CAAC,IAAI,OAAO,CAAC;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AACnF,QAAM,OAAO,WAAW,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAEzE,SAAO;AAAA,IACL,aAAa;AAAA,IACb,eAAe;AAAA,IACf,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AACF;;;ACxBO,IAAM,kBAAqC;AAAA,EAChD;AAAA,EAAqB;AAAA,EAAY;AAAA,EAAU;AAAA,EAAW;AACxD;;;ACIO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,OAAwB;AAClC,SAAK,UAAU,MAAM,UAAU,iCAAiC,QAAQ,OAAO,EAAE;AACjF,SAAK,SAAS,MAAM;AACpB,SAAK,YAAY,MAAM;AACvB,SAAK,aAAa,MAAM;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,YAAY,QAAmD;AACnE,UAAM,OAAgC;AAAA,MACpC,eAAe,OAAO;AAAA,MACtB,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO;AAAA,MACrB,YAAY,OAAO;AAAA,MACnB,aAAa,KAAK;AAAA,IACpB;AACA,QAAI,OAAO,cAAe,MAAK,iBAAiB,OAAO;AACvD,QAAI,OAAO,iBAAkB,MAAK,oBAAoB,OAAO;AAE7D,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,MAAM,kBAAkB;AAAA,MACtD,QAAQ;AAAA,MACR,SAAS,gBAAgB,MAAM,KAAK,QAAQ,KAAK,SAAS;AAAA,MAC1D,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAGD,QAAI,IAAI,WAAW,OAAO,CAAC,IAAI,IAAI;AACjC,YAAMC,OAAW,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAClD,YAAM,IAAI;AAAA,QACR,sBAAsBA,KAAI,SAASA,KAAI,WAAW,IAAI,UAAU;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAY,MAAM,IAAI,KAAK;AACjC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,cAAc,KAAK,UAAU,CAAC,GAAG,SAAS;AAAA,MAC1C,WAAW,OAAO;AAAA,MAClB,MAAM,KAAK,QAAQ;AAAA,MACnB,qBAAqB,KAAK;AAAA,MAC1B,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAe,SAAwE;AAC3F,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,MAAM,kBAAkB,OAAO,IAAI;AAAA,MACjE,SAAS,gBAAgB,CAAC,GAAG,KAAK,QAAQ,KAAK,SAAS;AAAA,IAC1D,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,cAAc,8BAA8B,aAAa;AAChF,UAAM,OAAY,MAAM,IAAI,KAAK;AACjC,WAAO,EAAE,QAAQ,KAAK,QAAQ,QAAQ,KAAK,QAAQ;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,kBACJ,SACA,YAAY,MACZ,aAAa,KACa;AAC1B,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,YAAM,EAAE,OAAO,IAAI,MAAM,KAAK,eAAe,OAAO;AACpD,UAAI,gBAAgB,SAAS,MAAM,EAAG,QAAO;AAC7C,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAAA,IACpD;AACA,QAAI;AAAE,YAAM,KAAK,YAAY,OAAO;AAAA,IAAG,QAAQ;AAAA,IAA2B;AAC1E,UAAM,IAAI,cAAc,2BAA2B,cAAc;AAAA,EACnE;AAAA;AAAA,EAGA,MAAM,cAAc,SAAqC;AACvD,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,MAAM,kBAAkB,OAAO,UAAU;AAAA,MACvE,SAAS,gBAAgB,CAAC,GAAG,KAAK,QAAQ,KAAK,SAAS;AAAA,IAC1D,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,cAAc,uBAAuB,YAAY;AACxE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,YAAY,SAAgC;AAChD,UAAM,MAAM,GAAG,KAAK,MAAM,kBAAkB,OAAO,WAAW;AAAA,MAC5D,QAAQ;AAAA,MACR,SAAS,gBAAgB,CAAC,GAAG,KAAK,QAAQ,KAAK,SAAS;AAAA,IAC1D,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,wBAAwB,SAAiB,WAAkC;AAC/E,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,MAAM,kBAAkB,OAAO,uBAAuB;AAAA,MACpF,QAAQ;AAAA,MACR,SAAS,gBAAgB,EAAE,UAAU,GAAG,KAAK,QAAQ,KAAK,SAAS;AAAA,MACnE,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,IACpC,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,cAAc,uCAAuC,eAAe;AAAA,EAC7F;AACF;;;ACjGO,IAAM,cAAN,MAA4C;AAAA,EACxC,WAAW;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACE,QACA,QACA,UACA,cACA,QACA;AACA,SAAK,aAAa,IAAI,eAAe,MAAM;AAC3C,SAAK,SAAS;AACd,SAAK,WAAW,aAAa,QAAQ,IAAI,eAAe,YAAY,iBAAiB;AACrF,SAAK,eAAe;AACpB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,OAAO,WAA8B;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,KAAa,MAA+B,UAAuC;AAC3F,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,UAAM,UAAU,KAAK,UAAU,CAAC,KAAK,CAAC;AACtC,UAAM,WAAW,KAAK;AACtB,UAAM,QAAQ,OAAO,QAAQ;AAC7B,UAAM,UAAU,MAAM;AACtB,UAAM,YAAY,QAAQ,qBAAqB;AAC/C,UAAM,aAAa,OAAO,SAAS;AAEnC,UAAM,cAAc,MAAM,KAAK,OAAO,gBAAgB,OAAO;AAC7D,UAAM,cAAc,MAAM,OAAO;AAGjC,QAAI,KAAK,UAAU,aAAa;AAC9B,YAAM,UAAU,MAAM,KAAK,OAAO,WAAW,aAAa,OAAO;AACjE,UAAI,UAAU,YAAY;AACxB,cAAM,KAAK,OAAO,QAAQ;AAAA,UACxB,eAAe;AAAA,UACf,gBAAgB,GAAG,WAAW,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,GAAM,CAAC;AAAA,QAC1E,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI;AACJ,QAAI,KAAK,gBAAgB,CAAC,KAAK,QAAQ;AACrC,YAAM,aAAa,KAAK,aAAa,mBAAmB,SAAS;AACjE,uBAAiB,MAAM,KAAK,aAAa,cAAc,YAAY,WAAW,OAAO;AAAA,IACvF;AAEA,UAAM,QAAQ,MAAM,KAAK,WAAW,YAAY;AAAA,MAC9C,aAAa,QAAQ,KAAK,IAAI,CAAC;AAAA,MAC/B;AAAA,MACA,aAAa,QAAQ,eAAe;AAAA,MACpC;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,OAAO;AAAA,MACnC,MAAM;AAAA,MACN,eAAe,MAAM;AAAA,MACrB,OAAO,SAAS;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,KAAK,WAAW,kBAAkB,MAAM,SAAS,MAAS,GAAK;AAEzF,QAAI,gBAAgB,YAAY,gBAAgB,aAAa,gBAAgB,aAAa;AACxF,UAAI,kBAAkB,KAAK,cAAc;AACvC,YAAI;AAAE,gBAAM,KAAK,aAAa,eAAe,gBAAgB,OAAO;AAAA,QAAG,QAAQ;AAAA,QAAoB;AAAA,MACrG;AACA,YAAM,IAAI,cAAc,cAAc,WAAW,KAAK,MAAM,OAAO,IAAI,mBAAmB;AAAA,IAC5F;AAEA,QAAI,kBAAkB,KAAK,cAAc;AACvC,YAAM,KAAK,aAAa,eAAe,gBAAgB,OAAO;AAAA,IAChE;AAEA,UAAM,QAAQ,MAAM,KAAK,WAAW,cAAc,MAAM,OAAO;AAE/D,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,iBAAa,IAAI,mBAAmB,KAAK,UAAU,KAAK,CAAC;AACzD,iBAAa,IAAI,gBAAgB,MAAM;AAEvC,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC;AAAA,EACtD;AACF;;;ACtGO,IAAM,gBAAuD,OAAO,OAAO;AAAA,EAChF,SAAS;AAAA,EACT,SAAS;AACX,CAAC;AASM,IAAM,YAAY;AASlB,IAAM,iBAAmC;AAGzC,IAAM,eAAe;AASrB,IAAM,qBAAqB;AAG3B,IAAM,iBAAiB;AAC9B,IAAM,cAAc;AAGb,SAAS,eAAe,SAA8B;AAC3D,SAAO,cAAc,OAAO;AAC9B;AAGO,SAAS,oBAAoB,UAA+B;AACjE,SAAO,aAAa,iBAAiB,YAAY;AACnD;AAOA,IAAM,mBAA6D,OAAO,OAAO;AAAA,EAC/E,SAAS;AAAA,EACT,SAAS;AACX,CAAC;AAGM,SAAS,QAAQ,SAAiC;AACvD,SAAO,iBAAiB,OAAO;AACjC;AAMO,SAASC,YAAW,OAA4B;AACrD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,YAAM,IAAI;AAAA,QACR,oCAAoC,KAAK,UAAU,KAAK,CAAC;AAAA,QACzD;AAAA,QACA;AAAA,MACF;AAAA,EACJ;AACF;AA2BO,SAAS,iBAAiB,OAAuB;AACtD,MAAI,OAAO,UAAU,YAAY,CAAC,0BAA0B,KAAK,KAAK,GAAG;AACvE,UAAM,IAAI;AAAA,MACR,yBAAyB,KAAK,UAAU,KAAK,CAAC;AAAA,MAC9C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,CAAC,KAAK,OAAO,EAAE,IAAI,MAAM,MAAM,GAAG;AACxC,QAAM,cAAc,OAAO,UAAU,MAAM,GAAG,cAAc;AAC5D,SAAO,OAAO,GAAG,IAAI,cAAc,OAAO,UAAU;AACtD;AAGO,SAAS,kBAAkB,OAAuB;AACvD,MAAI,QAAQ,GAAI,OAAM,IAAI,cAAc,yBAAyB,qBAAqB;AACtF,QAAM,MAAM,QAAQ;AACpB,QAAM,OAAO,QAAQ;AACrB,MAAI,SAAS,GAAI,QAAO,IAAI,SAAS;AACrC,QAAM,UAAU,KAAK,SAAS,EAAE,SAAS,gBAAgB,GAAG,EAAE,QAAQ,OAAO,EAAE;AAC/E,SAAO,GAAG,GAAG,IAAI,OAAO;AAC1B;AAIA,IAAM,mBAAmB;AAEzB,SAAS,kBAAkB,KAAmB;AAC5C,MAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,kBAAkB;AAC/D,UAAM,IAAI;AAAA,MACR,qBAAqB,GAAG;AAAA,MACxB;AAAA,MACA,6CAA6C,gBAAgB;AAAA,IAC/D;AAAA,EACF;AACF;AAMO,SAAS,gBAAgB,kBAA0BC,cAA6B;AACrF,oBAAkBA,YAAW;AAE7B,QAAM,YAAY,mBAAmB,OAAO,MAAQA,YAAW;AAC/D,QAAM,cAAc;AACpB,UAAQ,YAAY,cAAc,MAAM;AAC1C;AAUO,SAAS,wBACd,kBACA,gBACA,sBACQ;AACR,MAAI,kBAAkB,MAAM,wBAAwB,EAAG,QAAO;AAC9D,QAAM,WAAW,OAAO,KAAK,KAAK,OAAO,cAAc,IAAI,oBAAoB,CAAC;AAChF,MAAI,oBAAoB,SAAU,QAAO;AACzC,QAAM,OAAO,mBAAmB;AAChC,SAAO,OAAQ,OAAO,SAAU,QAAQ;AAC1C;;;AC/FA,IAAM,eAAe,CAAC,QACpB,OAAO,WAAW,cACd,OAAO,KAAK,KAAK,MAAM,EAAE,SAAS,QAAQ,IAC1C,KAAK,SAAS,mBAAmB,GAAG,CAAC,CAAC;AAE5C,IAAM,eAAe,CAAC,QACpB,OAAO,WAAW,cACd,OAAO,KAAK,KAAK,QAAQ,EAAE,SAAS,MAAM,IAC1C,mBAAmB,OAAO,KAAK,GAAG,CAAC,CAAC;AAKnC,SAAS,4BAA4B,KAAsC;AAChF,iBAAe,GAAG;AAClB,SAAO,aAAa,KAAK,UAAU,GAAG,CAAC;AACzC;AAGO,SAAS,4BAA4B,WAA4C;AACtF,QAAM,MAAM,UAAmC,WAAW,kBAAkB;AAC5E,iBAAe,GAAG;AAClB,SAAO;AACT;AAGO,SAAS,6BAA6B,KAAuC;AAClF,kBAAgB,GAAG;AACnB,SAAO,aAAa,KAAK,UAAU,GAAG,CAAC;AACzC;AAGO,SAAS,6BAA6B,WAA6C;AACxF,QAAM,MAAM,UAAoC,WAAW,mBAAmB;AAC9E,kBAAgB,GAAG;AACnB,SAAO;AACT;AAGO,SAAS,4BAA4B,KAAsC;AAChF,SAAO,aAAa,KAAK,UAAU,GAAG,CAAC;AACzC;AAcA,IAAM,iBAAiB;AAUhB,SAAS,eAAe,WAAmD;AAChF,MAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,UAAM,IAAI,cAAc,6CAA6C,sBAAsB;AAAA,EAC7F;AAEA,MAAI,MAAM;AACV,aAAW,QAAQ,IAAI,YAAY,EAAE,OAAO,SAAS,GAAG;AACtD,WAAO,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAC1C;AACA,QAAM,IAAI,YAAY;AACtB,MAAI,IAAI,SAAS,IAAI,gBAAgB;AACnC,UAAM,IAAI;AAAA,MACR,kCAAkC,IAAI,SAAS,CAAC,MAAM,cAAc;AAAA,MACpE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,MAAM,EAAE,UAAU,IAAI,EAAE;AACnC;AAIA,IAAM,2BAAkE,OAAO,OAAO;AAAA,EACpF,SAAS;AAAA,EACT,SAAS;AACX,CAAC;AAGM,SAAS,sBAAsB,SAA8B;AAClE,SAAO,yBAAyB,OAAO;AACzC;AA+BO,IAAM,wBAAN,MAA4B;AAAA,EAChB;AAAA,EACA;AAAA,EAEjB,YAAY,SAAiB,WAA0B;AACrD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,UAAU,QAAQ,QAAQ,QAAQ,EAAE;AACzC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,OAAO,OAAiE;AACtE,WAAO,KAAK,KAA8B,WAAW,KAAK;AAAA,EAC5D;AAAA,EAEA,OAAO,OAAiE;AACtE,WAAO,KAAK,KAA8B,WAAW,KAAK;AAAA,EAC5D;AAAA,EAEA,MAAc,KAAQ,MAAc,MAA2B;AAC7D,UAAM,IAAI,KAAK,aAAa,WAAW;AACvC,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,EAAE,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,QACtC,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,QAC1E,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B,CAAC;AAAA,IACH,SAASC,MAAK;AACZ,YAAM,IAAI;AAAA,QACR,4BAA6BA,KAAc,OAAO;AAAA,QAClD;AAAA,QACA,SAAS,KAAK,OAAO;AAAA,MACvB;AAAA,IACF;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,SAAS,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC9C,YAAM,IAAI;AAAA,QACR,eAAe,IAAI,SAAS,IAAI,MAAM,KAAK,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,QAC/D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAQ,MAAM,IAAI,KAAK;AAAA,EACzB;AACF;AAIA,SAAS,UAAa,WAAmB,OAAkB;AACzD,MAAI,OAAO,cAAc,YAAY,UAAU,WAAW,GAAG;AAC3D,UAAM,IAAI,cAAc,WAAW,KAAK,WAAW,0BAA0B;AAAA,EAC/E;AACA,MAAI;AACJ,MAAI;AACF,WAAO,aAAa,SAAS;AAAA,EAC/B,QAAQ;AACN,UAAM,IAAI,cAAc,aAAa,KAAK,kCAAkC,0BAA0B;AAAA,EACxG;AACA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,cAAc,aAAa,KAAK,+BAA+B,0BAA0B;AAAA,EACrG;AACF;AAEA,SAAS,mBAAmB,KAAoC;AAC9D,MAAI,IAAI,WAAW,QAAS,OAAM,IAAI,wBAAwB;AAC9D,EAAAC,YAAW,IAAI,OAAO;AACtB,MAAI,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,WAAW,EAAG,OAAM,IAAI,gBAAgB;AACvF,MAAI,IAAI,UAAU,SAAS,CAAC,kBAAkB,KAAK,IAAI,KAAK,GAAG;AAC7D,UAAM,IAAI,6CAA6C;AAAA,EACzD;AACA,MAAI,OAAO,IAAI,UAAU,YAAY,CAAC,IAAI,MAAM,WAAW,GAAG,GAAG;AAC/D,UAAM,IAAI,iDAA4C;AAAA,EACxD;AACA,MAAI,OAAO,IAAI,WAAW,YAAY,IAAI,OAAO,WAAW,EAAG,OAAM,IAAI,iBAAiB;AAC1F,MAAI,CAAC,OAAO,SAAS,IAAI,iBAAiB,KAAK,IAAI,qBAAqB,GAAG;AACzE,UAAM,IAAI,oCAAoC;AAAA,EAChD;AACA,MAAI,CAAC,IAAI,SAAS,OAAO,IAAI,UAAU,SAAU,OAAM,IAAI,gBAAgB;AAC3E,MAAI,OAAO,IAAI,MAAM,cAAc,YAAY,IAAI,MAAM,UAAU,WAAW,GAAG;AAC/E,UAAM,IAAI,0BAA0B;AAAA,EACtC;AACA,MAAI,CAAC,OAAO,UAAU,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,YAAY,GAAG;AACrE,UAAM,IAAI,gDAAgD;AAAA,EAC5D;AAEA,MAAI,IAAI,UAAU,UAAU,OAAO,IAAI,MAAM,WAAW,YAAY,CAAC,IAAI,MAAM,OAAO,WAAW,GAAG,IAAI;AACtG,UAAM,IAAI,mDAAmD;AAAA,EAC/D;AACF;AAEA,SAAS,eAAe,KAAoC;AAC1D,MAAI,CAAC,OAAO,IAAI,gBAAgB,EAAG,OAAM,IAAI,uBAAuB;AACpE,MAAI,CAAC,MAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,2BAA2B;AAClG,aAAW,KAAK,IAAI,QAAS,oBAAmB,CAAC;AACnD;AAEA,SAAS,gBAAgB,KAAqC;AAC5D,MAAI,CAAC,OAAO,IAAI,gBAAgB,EAAG,OAAM,IAAI,uBAAuB;AACpE,MAAI,CAAC,IAAI,SAAU,OAAM,IAAI,mBAAmB;AAChD,qBAAmB,IAAI,QAAQ;AAC/B,MAAI,CAAC,IAAI,SAAS,gBAAgB,OAAO,IAAI,QAAQ,iBAAiB,UAAU;AAC9E,UAAM,IAAI,+BAA+B;AAAA,EAC3C;AACF;AAEA,SAAS,IAAI,KAA4B;AACvC,SAAO,IAAI,cAAc,0BAA0B,GAAG,IAAI,4BAA4B;AACxF;;;AC3TA,IAAM,cAAc,CAAC,QAAgB,OAAe,WAAmB,oBACpE,EAAE,UAAU,QAAQ,MAAM;AA4C7B,IAAM,yBAAyB,IAAI,KAAK;AAGxC,IAAM,iBAAiB,oBAAI,IAAiC;AAC5D,IAAM,iBAAiB,oBAAI,IAAqC;AAEhE,IAAM,oBAAoB,CAAC,SAAiB,QAAgB,aAC1D,GAAG,OAAO,IAAI,MAAM,IAAI,QAAQ;AAqBlC,eAAsB,gBACpB,YACA,MACyB;AACzB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,IAAI;AAEJ,QAAM,WAAW,kBAAkB,SAAS,QAAQ,QAAQ;AAC5D,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,MAAM,eAAe,IAAI,QAAQ;AACvC,MAAI,OAAO,IAAI,YAAY,IAAK,QAAO,IAAI;AAG3C,QAAM,WAAW,eAAe,IAAI,QAAQ;AAC5C,MAAI,SAAU,QAAO;AAErB,QAAM,QAAQ,YAAqC;AACjD,UAAM,SAAS,MAAM,WAAW,UAAU;AAC1C,UAAM,QAAQ,MAAM,OAAO,QAAQ,EAAE,SAAS,iBAAiB,SAAS,QAAQ,CAAC;AACjF,UAAM,SAAS,MAAM,OAAO,OAAO;AAAA,MACjC,CAAC,MAA6C,EAAE,aAAa,YAAY,EAAE,YAAY;AAAA,IACzF;AACA,QAAI,QAAQ;AACV,YAAMC,SAAwB,EAAE,IAAI,MAAM,gBAAgB,KAAK;AAC/D,qBAAe,IAAI,UAAU,EAAE,OAAAA,QAAO,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC;AAC1E,aAAOA;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ;AACX,YAAMA,SAAwB;AAAA,QAC5B,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,MAAM,WAAW,OAAO,WAAW,QAAQ,wBAAwB,MAAM;AAAA,MAG3E;AAEA,qBAAe,IAAI,UAAU,EAAE,OAAAA,QAAO,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC;AAC1E,aAAOA;AAAA,IACT;AAEA,UAAM,gBAAgB,MAAM,OAAO,WAAW;AAC9C,QAAI,kBAAkB,SAAS;AAC7B,YAAM,IAAI;AAAA,QACR,6CAA6C,aAAa,cAAc,OAAO;AAAA,QAC/E;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,MAAM,OAAO,SAAS;AAAA,MAC/B,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,aAAa,EAAE,UAAU,QAAQ,OAAO,MAAM;AAAA,IAChD,CAAC;AACD,UAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AACnC,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,MAAM,OAAO,cAAc,OAAO,OAAO;AACxD,UAAM,SAAS,OAAO,OAAO;AAC7B,UAAM,QAAwB,EAAE,IAAI,MAAM,OAAO;AACjD,mBAAe,IAAI,UAAU,EAAE,OAAO,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC;AAC1E,WAAO;AAAA,EACT,GAAG;AAEH,iBAAe,IAAI,UAAU,IAAI;AACjC,MAAI;AACF,WAAO,MAAM;AAAA,EACf,UAAE;AACA,QAAI,eAAe,IAAI,QAAQ,MAAM,KAAM,gBAAe,OAAO,QAAQ;AAAA,EAC3E;AACF;AAGO,SAAS,sBAA4B;AAAE,iBAAe,MAAM;AAAG;AA6BtE,eAAsB,gBACpB,YACA,QACA,MACwB;AACxB,QAAM,UAAU,MAAM,OAAO,WAAW;AACxC,QAAM,QAAQ,MAAM,gBAAgB,YAAY;AAAA,IAC9C;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,QAAQ;AAAA,IACR,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,EACd,CAAC;AACD,MAAI,MAAM,eAAgB,QAAO;AACjC,SAAO,MAAM,UAAU;AACzB;AAIA,eAAsB,UACpB,YACA,QACA,aACA,QACA,MAC+C;AAC/C,QAAM,SAAS,MAAM,WAAW,UAAU;AAC1C,QAAM,UAAU,MAAM,OAAO,WAAW;AAExC,QAAM,KAAK,MAAM,OAAO,SAAS;AAAA,IAC/B,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ,YAAY,KAAK,QAAQ,QAAQ,KAAK,QAAQ;AAAA,EACxD,CAAC;AACD,QAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AACnC,QAAM,SAAS,MAAM,OAAO,cAAc,OAAO,OAAO;AACxD,yBAAuB,OAAO;AAC9B,SAAO,EAAE,MAAM,OAAO,OAAO,MAAM,WAAW,OAAO,OAAO,aAAa,MAAM;AACjF;AAIA,eAAsB,gBACpB,YACA,SACA,MACiB;AACjB,QAAM,SAAS,MAAM,WAAW,UAAU;AAC1C,QAAM,QAAQ,MAAM,OAAO,QAAQ,EAAE,SAAS,iBAAiB,SAAS,QAAQ,CAAC;AACjF,QAAM,QAAQ,MAAM,OAAO,OAAO;AAAA,IAChC,CAAC,MACC,EAAE,cAAc,KAAK,YAAY,mBAAmB,EAAE,YAAY,KAAK;AAAA,EAC3E;AACA,SAAO,OAAO,WAAW;AAC3B;AAoBA,IAAM,eAAe;AACrB,IAAM,aAAa,oBAAI,IAAwB;AAQ/C,eAAsB,iBACpB,YACA,SACA,MACuB;AACvB,QAAM,WAAW,GAAG,OAAO,IAAI,KAAK,MAAM,IAAI,KAAK,YAAY,cAAc;AAC7E,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,CAAC,KAAK,OAAO;AACf,UAAM,MAAM,WAAW,IAAI,QAAQ;AACnC,QAAI,OAAO,IAAI,YAAY,KAAK;AAC9B,aAAO,EAAE,GAAG,IAAI,OAAO,OAAO,OAAO,IAAI,YAAY,cAAc;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,WAAW,UAAU;AAC1C,QAAM,CAAC,MAAM,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtC,OAAO,QAAQ,EAAE,SAAS,gBAAgB,SAAS,QAAQ,CAAC;AAAA,IAC5D,OAAO,QAAQ,EAAE,SAAS,iBAAiB,SAAS,QAAQ,CAAC;AAAA,EAC/D,CAAC;AAED,QAAM,WAAW,OAAO,KAAK,OAAO,cAAc,WAAW,GAAG;AAChE,QAAM,WAA+B,KAAK,OAAO,cAAc;AAC/D,QAAM,WAAW,KAAK,YAAY;AAClC,QAAM,YAAY,MAAM,OAAO,OAAO;AAAA,IACpC,CAAC,MACC,EAAE,aAAa,YAAY,EAAE,YAAY,KAAK;AAAA,EAClD;AACA,QAAM,kBAAkB,CAAC,CAAC;AAC1B,QAAM,eAAe,WAAW,WAAW;AAE3C,QAAM,QAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT;AACA,aAAW,IAAI,UAAU,EAAE,OAAO,WAAW,MAAM,aAAa,CAAC;AACjE,SAAO;AACT;AAGO,SAAS,yBAA+B;AAAE,aAAW,MAAM;AAAG;AAG9D,SAAS,uBAAuB,SAAuB;AAC5D,QAAM,SAAS,GAAG,OAAO;AACzB,aAAW,OAAO,WAAW,KAAK,GAAG;AACnC,QAAI,IAAI,WAAW,MAAM,EAAG,YAAW,OAAO,GAAG;AAAA,EACnD;AACF;AAKA,IAAM,6BAA6B;AAmCnC,eAAsB,wBACpB,YACA,MACkC;AAClC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,mBAAmB;AAAA,EACrB,IAAI;AAEJ,MAAI,CAAC,aAAa,WAAW,GAAG,EAAG,OAAM,IAAI,6CAA6C;AAC1F,MAAI,CAAC,OAAO,WAAW,GAAG,EAAG,OAAM,IAAI,uCAAuC;AAC9E,MAAI,CAAC,QAAQ,WAAW,GAAG,EAAG,OAAM,IAAI,wCAAwC;AAChF,MAAI,CAAC,OAAQ,OAAM,IAAI,iBAAiB;AAExC,QAAM,OAAO,eAAe,SAAS;AAQrC,QAAM,YAAY,EAAE,UAAU,gBAAgB,QAAQ,OAAO,OAAO;AAEpE,QAAM,QAAiC;AAAA,IACrC,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO,CAAC,IAAI;AAAA,EACd;AACA,MAAI,OAAO,mBAAmB,SAAU,OAAM,iBAAiB;AAE/D,QAAM,SAAS,MAAM,WAAW,UAAU;AAI1C,QAAM,SAAkC,MAAM,OAAO,SAAS,KAAK;AACnE,QAAM,UAAW,OAAO,sBAA6C;AACrE,SAAO,qBAAqB,UAAU;AACtC,SAAO;AACT;AAEA,SAAS,IAAI,KAA4B;AACvC,SAAO,IAAI,cAAc,+BAA+B,GAAG,IAAI,4BAA4B;AAC7F;;;AC3XO,IAAM,cAAN,MAA4C;AAAA,EAKjD,YACmB,QACA,YACA,SACA,MACA,UACA,UAA8B,CAAC,GAChD;AANiB;AACA;AACA;AACA;AACA;AACA;AAAA,EAChB;AAAA,EANgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAVV,WAAW;AAAA;AAAA,EAEH,QAAQ,oBAAI,IAA8B;AAAA,EAW3D,OAAO,UAA6B;AAClC,UAAM,SAAS,WAAW,SAAS,SAAS,kBAAkB;AAC9D,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI;AACF,YAAM,MAAM,4BAA4B,MAAM;AAC9C,YAAM,IAAI,IAAI,QAAQ,CAAC;AAEvB,UAAI,CAAC,EAAE,QAAQ,WAAW,OAAO,EAAG,QAAO;AAC3C,YAAM,QAAQ,EAAE,MAAM,YAAY;AAClC,aAAO,UAAU,SAAS,UAAU,WAAW,UAAU;AAAA,IAC3D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,KAAa,MAA+B,UAAoB,KAAyC;AACjH,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW;AAC7C,UAAM,WAAW,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,QAAQ;AAC5D,UAAM,OAAO,SAAS;AAAA,MACpB,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,GAAG;AAAA,MAC7C,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,GAAG;AAAA,IAC/C;AACA,SAAK,MAAM,IAAI,SAAS,IAAI;AAC5B,QAAI;AACF,aAAQ,MAAM;AAAA,IAChB,UAAE;AACA,UAAI,KAAK,MAAM,IAAI,OAAO,MAAM,KAAM,MAAK,MAAM,OAAO,OAAO;AAAA,IACjE;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,UACZ,KACA,MACA,UACA,MACmB;AACnB,UAAM,WAAW,KAAK,eAAe,QAAQ;AAG7C,QAAI,SAAS,UAAU,OAAO;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,MAAM,UAAU,eAAe,KAAK,OAAO;AACnE,UAAM,cAAc,MAAM,KAAK,OAAO,WAAW;AAGjD,UAAM,gBAAgB,KAAK,YAAY;AAAA,MACrC,SAAS;AAAA,MACT;AAAA,MACA,QAAQ,KAAK;AAAA,IACf,CAAC;AAGD,QAAI,QAAQ,MAAM,iBAAiB,KAAK,YAAY,aAAa,EAAE,OAAO,CAAC;AAC3E,UAAM,OAAO,iBAAiB,SAAS,MAAM;AAE7C,QAAI,KAAK,UAAU,UAAU,KAAK,iBAAiB,MAAM,YAAY,IAAI,MAAM;AAC7E,UAAI;AACF,cAAM,KAAK,SAAS,aAAa,SAAS,MAAM;AAChD,gBAAQ,MAAM,iBAAiB,KAAK,YAAY,aAAa,EAAE,QAAQ,OAAO,KAAK,CAAC;AAAA,MACtF,SAASC,MAAK;AACZ,YAAI,CAAC,KAAK,QAAQ,SAAU,OAAMA;AAAA,MACpC;AAAA,IACF;AAEA,QAAI,iBAAiB,MAAM,YAAY,IAAI,MAAM;AAC/C,UAAI,CAAC,KAAK,QAAQ,YAAY,CAAC,KAAK,MAAM;AACxC,cAAM,IAAI;AAAA,UACR,4BAA4B,kBAAkB,iBAAiB,MAAM,YAAY,CAAC,CAAC,UAAU,SAAS,MAAM;AAAA,UAC5G;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,YAAY,kBAAkB,OAAO,iBAAiB,MAAM,YAAY,CAAC;AAC/E,YAAM,KAAK,KAAK,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,gBAAgB,KAAK,QAAQ,kBAAkB;AAAA,MACjD,CAAC;AAED,6BAAuB,WAAW;AAAA,IACpC;AAGA,UAAM,KAAK,MAAM,wBAAwB,KAAK,YAAY;AAAA,MACxD;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA,WAAW,SAAS,MAAM;AAAA,MAC1B,WAAW,KAAK,QAAQ,aAAa,SAAS,MAAM,aAAa;AAAA,MACjE,gBAAgB,SAAS,MAAM;AAAA,IACjC,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,EAAE;AACxC,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAQA,UAAM,YAAY,6BAA6B;AAAA,MAC7C,aAAa;AAAA,MACb;AAAA,MACA,SAAS,EAAE,cAAc,OAAO,SAAS,WAAW,SAAS,MAAM,UAAU;AAAA,IAC/E,CAAC;AACD,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,iBAAa,IAAI,qBAAqB,SAAS;AAC/C,UAAM,gBAAgB,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC;AAGzE,SAAK,UAAU,cAAc;AAE7B,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,eAAe,UAA6C;AAClE,UAAM,SAAS,WAAW,SAAS,SAAS,kBAAkB;AAC9D,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,cAAc,mCAAmC,0BAA0B;AAAA,IACvF;AACA,UAAM,MAAM,4BAA4B,MAAM;AAC9C,UAAM,IAAI,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE;AAI9B,QAAI,EAAE,UAAU,QAAS,GAAE,QAAQ;AAInC,UAAM,mBAAmBC,YAAW,EAAE,OAAO;AAC7C,QAAI,qBAAqB,KAAK,SAAS;AACrC,YAAM,IAAI;AAAA,QACR,6BAA6B,QAAQ,KAAK,OAAO,CAAC,eAAe,EAAE,OAAO;AAAA,QAC1E;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAGA,SAAS,WAAW,SAAkB,MAA6B;AACjE,SAAO,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,YAAY,CAAC,KAAK;AACjE;;;ACpOO,IAAM,iBAAN,MAAqB;AAAA,EAClB,SAAc;AAAA,EACd;AAAA,EAER,YAAY,eAAmC;AAC7C,QAAI,iBAAiB,OAAO,aAAyB,GAAG;AACtD,WAAK,YAAY,OAAO,aAAyB,EAAE,SAAS,OAAO,aAAyB,EAAE;AAAA,IAChG,OAAO;AACL,WAAK,YAAY,iBAAiB;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAM,UAAwB;AAC5B,QAAI,KAAK,QAAQ,YAAY,EAAG,QAAO,KAAK;AAC5C,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,MAAM;AACtC,SAAK,SAAS,IAAI,OAAO,KAAK,SAAS;AACvC,UAAM,KAAK,OAAO,QAAQ;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,YAA0B;AAC9B,QAAI,CAAC,KAAK,QAAQ,YAAY,EAAG,OAAM,KAAK,QAAQ;AACpD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,QAAQ,YAAY,KAAK;AAAA,EACvC;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,KAAK,QAAQ,YAAY,GAAG;AAC9B,YAAM,KAAK,OAAO,WAAW;AAAA,IAC/B;AACA,SAAK,SAAS;AAAA,EAChB;AACF;;;AC9BO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EACA;AAAA,EACA,iBAAsB;AAAA,EAE9B,YAAY,QAA0B;AACpC,SAAK,OAAO,OAAO;AACnB,SAAK,YAAY,OAAO;AACxB,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,WAAW;AACjC,YAAM,IAAI,cAAc,yCAAyC,qBAAqB;AAAA,IACxF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB;AAChC,QAAI,KAAK,eAAgB,QAAO,KAAK;AACrC,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,MAAM;AACtC,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,OAAO,SAAS,KAAK,IAAI;AAAA,IACjD,WAAW,KAAK,WAAW;AAEzB,YAAMC,OAAM,MAAM,OAAO,4BAA4B;AACrD,YAAM,SAASA,KAAI,UAAU,KAAK,SAAS;AAC3C,YAAM,cAAc,OAAO,SAAS,KAAK,CAAC,MAAW,EAAE,SAAS,WAAW,OAAO,CAAC;AACnF,UAAI,CAAC,YAAa,OAAM,IAAI,cAAc,iCAAiC,qBAAqB;AAChG,WAAK,iBAAiB,EAAE,SAAS,YAAY,SAAS,gBAAgB,YAAY,QAAQ;AAAA,IAC5F;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,aAA8B;AAClC,UAAM,IAAI,MAAM,KAAK,kBAAkB;AACvC,WAAO,EAAE,kBAAkB,EAAE;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAK,aAA8E;AACvF,UAAM,IAAI,MAAM,KAAK,kBAAkB;AACvC,QAAI,EAAE,KAAM,QAAO,EAAE,KAAK,WAAW;AAErC,QAAI,KAAK,WAAW;AAClB,YAAMA,OAAM,MAAM,OAAO,4BAA4B;AACrD,YAAM,SAAS,MAAMA,KAAI,YAAY,KAAK,WAAW,gBAAgB,KAAK,UAAU,WAAW,CAAC;AAChG,aAAO,EAAE,SAAS,IAAI,MAAM,OAAO,OAAO;AAAA,IAC5C;AACA,UAAM,IAAI,cAAc,sCAAsC,kBAAkB;AAAA,EAClF;AACF;;;AC1BO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACmB,YACA,QAEA,QACjB;AAJiB;AACA;AAEA;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EAEA;AAAA,EAGX,eAAqD;AAC3D,WAAO,EAAE,UAAU,gBAAgB,QAAQ,KAAK,OAAO;AAAA,EACzD;AAAA,EAEA,MAAM,YAAY,UAA8B,CAAC,GAA+C;AAC9F,UAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAC/C,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW;AAC7C,UAAM,QAAQ,QAAQ,SAAS,KAAK,aAAa;AAEjD,QAAI,QAAQ;AACZ,QAAI,QAAQ,UAAW,UAAS;AAChC,QAAI,QAAQ,gBAAiB,UAAS;AAEtC,UAAM,KAA8B;AAAA,MAClC,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,QAAI,QAAQ,cAAe,IAAG,gBAAgB,QAAQ;AACtD,QAAI,QAAQ,UAAU,OAAW,IAAG,QAAQ,QAAQ;AAEpD,UAAM,WAAW,MAAM,OAAO,SAAS,EAAE;AACzC,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,QAAQ;AAC9C,UAAM,SAAS,MAAM,OAAO,cAAc,OAAO,OAAO;AAExD,UAAM,UAAU,OAAO,OAAO,MAAM,eAAe;AAAA,MACjD,CAAC,MAAsD,EAAE,aAAa,oBAAoB;AAAA,IAC5F;AACA,UAAM,UAAU,SAAS,aAAa,eAAe,OAAO,OAAO;AACnE,WAAO,EAAE,MAAM,OAAO,OAAO,MAAM,QAAQ;AAAA,EAC7C;AAAA,EAEA,MAAM,QAAQ,SAAiB,QAAmE;AAChG,UAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAC/C,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW;AAE7C,UAAM,KAAK,MAAM,OAAO,SAAS;AAAA,MAC/B,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ,EAAE,GAAG,KAAK,aAAa,GAAG,OAAO,OAAO;AAAA,IAClD,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,EAAE;AACxC,UAAM,SAAS,MAAM,OAAO,cAAc,OAAO,OAAO;AAExD,UAAM,iBAAiB,KAAK,sBAAsB,OAAO,OAAO,MAAM,OAAO,KAAK;AAClF,WAAO,EAAE,MAAM,OAAO,OAAO,MAAM,eAAe;AAAA,EACpD;AAAA,EAEA,MAAM,SACJ,SACA,MACmD;AACnD,UAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAC/C,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW;AAE7C,UAAM,KAA8B;AAAA,MAClC,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AACA,QAAI,KAAK,OAAQ,IAAG,SAAS,EAAE,GAAG,KAAK,aAAa,GAAG,OAAO,KAAK,OAAO;AAAA,aACjE,KAAK,OAAQ,IAAG,SAAS,KAAK;AAEvC,UAAM,WAAW,MAAM,OAAO,SAAS,EAAE;AACzC,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,QAAQ;AAC9C,UAAM,SAAS,MAAM,OAAO,cAAc,OAAO,OAAO;AACxD,WAAO,EAAE,MAAM,OAAO,OAAO,MAAM,gBAAgB,KAAK,UAAU,IAAI;AAAA,EACxE;AAAA,EAEA,MAAM,aAAa,SAAqC;AACtD,UAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAC/C,UAAM,WAAW,MAAM,OAAO,QAAQ,EAAE,SAAS,cAAc,UAAU,QAAQ,CAAC;AAClF,UAAM,IAAI,SAAS,OAAO,SAAS,SAAS;AAC5C,WAAO;AAAA,MACL;AAAA,MACA,OAAO,EAAE,SAAS,EAAE,WAAW;AAAA,MAC/B,OAAO,EAAE,SAAS,KAAK,aAAa;AAAA,MACpC,aAAa,EAAE,eAAe;AAAA,MAC9B,aAAa,EAAE,eAAe;AAAA,MAC9B,gBAAgB,EAAE,kBAAkB;AAAA,MACpC,aAAa,EAAE,qBAAqB;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,SAAmE;AACvF,UAAM,OAAO,MAAM,KAAK,aAAa,OAAO;AAC5C,UAAM,SAAS,WAAW,KAAK,WAAW;AAC1C,UAAM,SAAS,WAAW,KAAK,WAAW;AAC1C,UAAM,OAAO,WAAW,KAAK,cAAc;AAC3C,QAAI,WAAW,EAAG,QAAO,EAAE,SAAS,GAAG,YAAY,EAAE;AACrD,WAAO,EAAE,SAAS,SAAS,QAAQ,aAAa,SAAS,QAAQ,OAAO;AAAA,EAC1E;AAAA,EAEQ,sBAAsB,MAAe,SAAgC;AAC3E,UAAM,WAAY,MAAoD;AACtE,QAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO;AACrC,eAAW,QAAQ,UAAU;AAC3B,YAAM,SACH,KACE,cAAc,eAChB,KAAmE,aAAa;AACnF,UAAI,QAAQ,kBAAkB,WAAW,QAAQ,UAAW,QAAO,OAAO,OAAO,SAAS;AAAA,IAC5F;AACA,WAAO;AAAA,EACT;AACF;;;AC7FA,IAAM,eAAe;AAWd,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACmB,YACA,QACA,SACA,QACjB;AAJiB;AACA;AACA;AACA;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAInB,MAAM,MAAM,MAAoD;AAC9D,SAAK,oBAAoB,IAAI;AAC7B,UAAM,iBAAiB,iBAAiB,KAAK,SAAS;AAEtD,UAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAC/C,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW;AAC7C,UAAM,WAAW,MAAM,OAAO,QAAQ;AAAA,MACpC,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,MACrB,oBAAoB,EAAE,UAAU,gBAAgB,QAAQ,KAAK,QAAQ,OAAO,KAAK,UAAU;AAAA,MAC3F,mBAAmB,CAAC,EAAE,UAAU,MAAM,CAAC;AAAA,IACzC,CAAC;AAED,UAAM,eAAe,SAAS,QAAQ;AACtC,QAAI,CAAC,MAAM,QAAQ,YAAY,KAAK,aAAa,WAAW,GAAG;AAC7D,YAAM,IAAI;AAAA,QACR,6BAAwB,KAAK,OAAO;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,OAAO,aAAa;AAAA,MAAO,CAAC,GAA8B,MAC9D,OAAO,EAAE,aAAa,KAAK,OAAO,EAAE,aAAa,IAAI,IAAI;AAAA,IAC3D;AAEA,UAAM,oBAAoB,OAAO,KAAK,aAAa;AACnD,UAAM,uBAAuB,OAAO,iBAAiB,IAAI,OAAO,cAAc;AAE9E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO,KAAK,kBAAkB,CAAC;AAAA,MAC/B,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,MAAgD;AACzD,SAAK,oBAAoB,IAAI;AAC7B,UAAMC,eAAc,KAAK,kBAAkB;AAC3C,QAAI,QAAQ,KAAK;AAEjB,QAAI,OAAO;AACT,UAAI,KAAK,IAAI,IAAI,MAAM,YAAY;AACjC,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA,oBAAoB,MAAM,UAAU;AAAA,QACtC;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,IAAI,KAAK,IAAI,WAAW,KAAK,UAAU,CAAC;AAAA,IACtF;AAEA,UAAM,eAAe,gBAAgB,MAAM,mBAAmBA,YAAW;AAEzE,UAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAC/C,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW;AAC7C,UAAM,KAA8B;AAAA,MAClC,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,QAAQ,EAAE,UAAU,gBAAgB,QAAQ,KAAK,QAAQ,OAAO,KAAK,UAAU;AAAA,MAC/E,SAAS,aAAa,SAAS;AAAA,IACjC;AACA,QAAI,MAAM,MAAM,SAAS,EAAG,IAAG,QAAQ,MAAM;AAE7C,UAAM,WAAW,MAAM,OAAO,SAAS,EAAE;AACzC,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,QAAQ;AAC9C,UAAM,SAAS,MAAM,OAAO,cAAc,OAAO,OAAO;AACxD,2BAAuB,OAAO;AAE9B,UAAM,SAAS,OAAO,QAAQ,MAAM,qBAAqB,OAAO,QAAQ;AACxE,QAAI,UAAU,WAAW,cAAc;AACrC,YAAM,IAAI;AAAA,QACR,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA,WAAW,qBAAqB,WAAW,gBACvC,mEACA,cAAc,OAAO,QAAQ,IAAI;AAAA,MACvC;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,OAAO,OAAO;AAAA,MACpB,eAAe;AAAA,MACf,WAAW,KAAK;AAAA,MAChB,2BAA2B,MAAM;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,oBAAoB,MAAkC;AAG5D,QAAI,KAAK,SAAS,SAAS,KAAK,OAAO,SAAS;AAC9C,YAAM,IAAI;AAAA,QACR,0BAA0B,KAAK,IAAI,SAAI,KAAK,EAAE;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrJO,IAAM,qBAAN,MAAiD;AAAA,EACrC,QAAQ,oBAAI,IAAoB;AAAA,EACjD,MAAM,KAAK,MAAsC;AAAE,WAAO,KAAK,MAAM,IAAI,IAAI,KAAK;AAAA,EAAM;AAAA,EACxF,MAAM,MAAM,MAAc,IAA2B;AAAE,SAAK,MAAM,IAAI,MAAM,EAAE;AAAA,EAAG;AACnF;AA8BA,IAAM,mBAAmB;AACzB,IAAM,0BAA0B;AAChC,IAAM,4BAA4B;AAE3B,IAAM,sBAAN,MAA0B;AAAA,EAS/B,YACmB,QACA,MACjB;AAFiB;AACA;AAEjB,SAAK,QAAQ,OAAO,SAAS,IAAI,mBAAmB;AACpD,SAAK,SAAS,eAAe,KAAK,OAAO;AACzC,SAAK,eAAe,iBAAiB,OAAO,kBAAkB,gBAAgB;AAC9E,SAAK,gBAAgB,OAAO,iBAAiB;AAC7C,SAAK,kBAAkB,OAAO,mBAAmB;AACjD,QAAI,OAAO,QAAS,MAAK,gBAAgB,OAAO;AAAA,EAClD;AAAA,EATmB;AAAA,EACA;AAAA,EAVF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EAcR,YAAqB;AAAE,WAAO,KAAK,OAAO,cAAc;AAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9D,MAAM,cAA+B;AACnC,QAAI,KAAK,cAAe,QAAO,KAAK;AACpC,UAAM,UAAU,MAAM,KAAK,KAAK,OAAO,WAAW;AAElD,UAAM,SAAS,MAAM,KAAK,MAAM,KAAK,OAAO;AAC5C,QAAI,QAAQ;AAAE,WAAK,gBAAgB;AAAQ,aAAO;AAAA,IAAQ;AAE1D,QAAI,CAAC,KAAK,OAAO,YAAY;AAC3B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,QAAQ,MAAM,iBAAiB,KAAK,KAAK,YAAY,SAAS,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC3F,QAAI,MAAM,WAAW,KAAK,eAAe;AACvC,YAAM,IAAI;AAAA,QACR,0DAA0D,MAAM,QAAQ,uBAAkB,KAAK,aAAa;AAAA,QAC5G;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,KAAK,MAAM,YAAY,EAAE,OAAO,EAAE,CAAC;AAC9D,gBAAU,QAAQ;AAAA,IACpB,SAASC,MAAK;AACZ,YAAM,IAAI;AAAA,QACR,gCAAiCA,KAAc,OAAO;AAAA,QACtD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,KAAK,MAAM,MAAM,SAAS,OAAO;AACvC,SAAK,gBAAgB;AACrB,QAAI,KAAK,iBAAiB,oBAAoB;AAC5C,cAAQ;AAAA,QACN,4CAA4C,OAAO;AAAA,MAErD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,aAAa,aAAoC;AACrD,UAAM,OAAO,iBAAiB,WAAW;AACzC,UAAM,UAAU,MAAM,KAAK,KAAK,OAAO,WAAW;AAClD,UAAM,QAAQ,MAAM,iBAAiB,KAAK,KAAK,YAAY,SAAS,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC3F,UAAM,SAAS,iBAAiB,MAAM,YAAY;AAClD,QAAI,UAAU,KAAM;AAEpB,UAAM,UAAU,MAAM,KAAK,YAAY;AACvC,UAAM,YAAY,OAAO;AACzB,UAAM,KAAK,KAAK,MAAM,SAAS,SAAS,EAAE,QAAQ,kBAAkB,SAAS,EAAE,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAsB;AACpB,QAAI,CAAC,KAAK,UAAU,EAAG;AACvB,QAAI,KAAK,WAAY,cAAa,KAAK,UAAU;AACjD,SAAK,aAAa,WAAW,MAAM;AACjC,WAAK,aAAa;AAElB,WAAK,KAAK,YAAY,EAAE;AAAA,QAAM,CAAC,MAC7B,QAAQ,KAAK,mCAAoC,GAAa,OAAO;AAAA,MACvE;AAAA,IACF,GAAG,KAAK,eAAe;AAEvB,QAAI,OAAO,KAAK,eAAe,YAAY,WAAW,KAAK,YAAY;AACrE,MAAC,KAAK,WAAqC,MAAM;AAAA,IACnD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAA6B;AACjC,QAAI,CAAC,KAAK,UAAU,EAAG;AACvB,UAAM,UAAU,MAAM,KAAK,KAAK,OAAO,WAAW;AAClD,UAAM,QAAQ,MAAM,iBAAiB,KAAK,KAAK,YAAY,SAAS,EAAE,QAAQ,KAAK,QAAQ,OAAO,KAAK,CAAC;AACxG,UAAM,SAAS,iBAAiB,MAAM,YAAY;AAClD,QAAI,UAAU,KAAK,aAAc;AACjC,UAAM,UAAU,MAAM,KAAK,YAAY;AACvC,UAAM,SAAS,SAAS,KAAK;AAC7B,UAAM,KAAK,KAAK,MAAM,QAAQ,SAAS,kBAAkB,MAAM,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,WAAuC;AAC3C,UAAM,UAAU,MAAM,KAAK,KAAK,OAAO,WAAW;AAClD,UAAM,UAAU,MAAM,iBAAiB,KAAK,KAAK,YAAY,SAAS,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC7F,QAAI,WAAW;AACf,QAAI,UAAU,KAAK,iBAAkB,MAAM,KAAK,MAAM,KAAK,OAAO,KAAM;AACxE,QAAI,SAAS;AACX,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,KAAK,MAAM,aAAa,OAAO;AACvD,mBAAW,KAAK;AAAA,MAClB,QAAQ;AAAA,MAAuD;AAAA,IACjE;AACA,WAAO,EAAE,QAAQ,QAAQ,cAAc,UAAU,SAAS,QAAQ;AAAA,EACpE;AACF;;;AC1IO,SAAS,yBAAyB,MAAiC;AAExE,QAAM,EAAE,WAAW,OAAO,GAAG,KAAK,IAAI;AACtC,QAAM,SAAS,OAAO,KAAK,IAAI,EAC5B,KAAK,EACL,OAAgC,CAAC,KAAK,MAAM;AAC3C,QAAI,CAAC,IAAK,KAAiC,CAAC;AAC5C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP,SAAO,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,MAAM,CAAC;AACxD;AAIA,IAAM,cAAc,IAAI,KAAK;AAEtB,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YAA6B,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAAxB;AAAA,EAFrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAQR,aAAa;AACX,WAAO,OAAO,KAAiB,KAAiB,SAAqC;AACnF,YAAM,SAAS,IAAI,OAAO,kBAAkB;AAC5C,UAAI,CAAC,QAAQ;AACX,YAAI,OAAO,GAAG,EAAE,KAAK;AAAA,UACnB,OAAO;AAAA,UACP,cAAc;AAAA,UACd,cAAc,KAAK,OAAO;AAAA,UAC1B,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AAEA,UAAI;AACJ,UAAI;AACF,eAAO,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AAAA,MAC5D,QAAQ;AACN,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,MAAM,qBAAqB,CAAC;AACtF;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,KAAK,OAAO,IAAI;AACtC,UAAI,CAAC,QAAQ,OAAO;AAClB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,sBAAsB,QAAQ,MAAM,GAAG,CAAC;AACtE;AAAA,MACF;AAEA,MAAC,IAAgC,MAAM;AACvC,WAAK;AAAA,IACP;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,MAAkF;AAC7F,QAAI,KAAK,UAAU,KAAK,OAAO,YAAY;AACzC,aAAO,EAAE,OAAO,OAAO,QAAQ,QAAQ,KAAK,OAAO,eAAe,KAAK,OAAO,UAAU,GAAG;AAAA,IAC7F;AACA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,aAAa,KAAK,MAAM,KAAK,QAAQ;AAC3C,QAAI,OAAO,MAAM,UAAU,EAAG,QAAO,EAAE,OAAO,OAAO,QAAQ,qBAAqB;AAClF,UAAM,MAAM,MAAM;AAClB,UAAM,SAAS,KAAK,OAAO,YAAY;AACvC,QAAI,MAAM,OAAQ,QAAO,EAAE,OAAO,OAAO,QAAQ,uBAAuB,GAAG,QAAQ,MAAM,KAAK;AAC9F,UAAM,eAAe,KAAK,MAAM,KAAK,UAAU;AAC/C,QAAI,OAAO,MAAM,YAAY,EAAG,QAAO,EAAE,OAAO,OAAO,QAAQ,uBAAuB;AACtF,QAAI,MAAM,aAAc,QAAO,EAAE,OAAO,OAAO,QAAQ,qBAAqB;AAE5E,UAAM,eAAe,KAAK,OAAO,uBAAuB,QAAQ,IAAI;AACpE,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,KAAK,MAAM,KAAK,gBAAgB,MAAM,YAAY;AACxD,WAAO,KAAK,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,OAAO,QAAQ,oBAAoB;AAAA,EAC5E;AAAA,EAEA,MAAc,gBAAgB,MAAqB,cAAwC;AACzF,UAAM,MAAO,MAAM,KAAK,QAAQ;AAChC,UAAM,SAAS,IAAI,QAAQ,cAAc,YAAY;AACrD,WAAO,OAAO,OAAO,OAAO,KAAK,yBAAyB,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,WAAW,QAAQ,CAAC;AAAA,EACzG;AAAA,EAEQ,UAA4B;AAClC,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa,OAAO,sBAAsB,EAAE,MAAM,MAAM;AAC3D,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AACF;AAIO,IAAM,8BAAN,MAAkC;AAAA,EACvC,YAA6B,WAAoC,QAAiB;AAArD;AAAoC;AAAA,EAAkB;AAAA,EAAtD;AAAA,EAAoC;AAAA;AAAA,EAGjE,MAAM,MAAM,cAA8C;AACxD,UAAM,MAAM,GAAG,KAAK,UAAU,QAAQ,OAAO,EAAE,CAAC,gBAAgB,mBAAmB,YAAY,CAAC;AAChG,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,SAAS,KAAK,SAAS,EAAE,eAAe,UAAU,KAAK,MAAM,GAAG,IAAI;AAAA,IACtE,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,uCAAuC,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,QACnE;AAAA,QACA,qCAAqC,GAAG;AAAA,MAC1C;AAAA,IACF;AACA,WAAQ,MAAM,IAAI,KAAK;AAAA,EACzB;AAAA;AAAA,EAGA,OAAO,aAAa,MAA6B;AAC/C,WAAO,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,EAAE,SAAS,QAAQ;AAAA,EAC5D;AAAA;AAAA,EAGA,OAAO,aAAa,QAA+B;AACjD,WAAO,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AAAA,EAC5D;AACF;AAUA,eAAsB,oBACpB,SACA,WACA,SACA,cACe;AACf,MAAI,CAAC,WAAW,aAAc;AAC9B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,MAAM,QAAQ,MAAM,YAAY;AAC7C,UAAQ,IAAI,oBAAoB,4BAA4B,aAAa,IAAI,CAAC;AAChF;;;AC1MO,IAAM,qBAAN,MAAmD;AAAA,EAGxD,YACmB,QACA,UACA,gBACA,QAEA,YACjB;AANiB;AACA;AACA;AACA;AAEA;AAAA,EAChB;AAAA,EANgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EARV,WAAW;AAAA,EAWpB,OAAO,UAA6B;AAClC,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB;AACpG,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,YAAM,UAAU,SAAS,UAAU,CAAC,GAAG;AACvC,aAAO,CAAC,CAAC,WAAW,QAAQ,WAAW,UAAU;AAAA,IACnD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IACJ,KACA,MACA,UACA,KACmB;AACnB,UAAM,kBAAkB,KAAK,qBAAqB,QAAQ;AAC1D,UAAM,eAAe,gBAAgB,UAAU,CAAC;AAChD,QAAI,CAAC,aAAc,OAAM,IAAI,oBAAoB,0CAA0C,yBAAyB;AAGpH,UAAM,EAAE,mBAAmB,IAAI,MAAM,KAAK,gBAAgB;AAC1D,UAAM,aAAa,MAAM,KAAK,mBAAmB;AACjD,UAAM,SAAS,IAAI,mBAAmB,YAAY,KAAK,SAAS,EAAE,KAAK,KAAK,OAAO,IAAI,MAAS;AAEhG,UAAM,iBAAiB,MAAM,OAAO,qBAAqB,eAAe;AAGxE,QAAI,KAAK,kBAAkB,KAAK,UAAU,KAAK,cAAc,GAAG;AAC9D,YAAM,YAAY,MAAM,KAAK,eAAe,OAAO,gBAAgB,YAAY;AAC/E,UAAI,CAAC,UAAU,SAAS;AACtB,cAAM,IAAI;AAAA,UACR,iCAAiC,UAAU,iBAAiB,SAAS;AAAA,UACrE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,iBAAa,IAAI,uBAAuB,OAAO,KAAK,KAAK,UAAU,cAAc,CAAC,EAAE,SAAS,QAAQ,CAAC;AACtG,iBAAa,IAAI,qBAAqB,aAAa,OAAO;AAC1D,iBAAa,IAAI,kBAAkB,KAAK,OAAO,OAAO;AACtD,QAAI,KAAK,aAAc,cAAa,IAAI,2BAA2B,IAAI,YAAY;AAEnF,UAAM,oBAAoB,cAAc,aAAa,OAAO,KAAK,YAAY,KAAK,OAAO,OAAO;AAChG,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC;AAAA,EACtD;AAAA;AAAA,EAIQ,qBAAqB,UAA6D;AACxF,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB;AACpG,QAAI,CAAC,OAAQ,OAAM,IAAI,oBAAoB,mCAAmC,2BAA2B;AACzG,QAAI;AACF,aAAO,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AAAA,IAC5D,SAASC,MAAK;AACZ,YAAM,IAAI;AAAA,QACR,iDAAkDA,KAAc,OAAO;AAAA,QACvE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,qBAA0H;AACtI,WAAO;AAAA,MACL,SAAS,KAAK,OAAO;AAAA,MACrB,eAAe,CAAC,OAAe,eAAuB,KAAK,OAAO,cAAc,OAAO,UAAU;AAAA,IACnG;AAAA,EACF;AAAA,EAEA,MAAc,kBAAwD;AACpE,QAAI;AAEF,aAAO,MAAM,OAAO,4BAAmC;AAAA,IACzD,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,UAAU,QAAwC;AACxD,WAAO,CAAC,CAAE,OAA0C;AAAA,EACtD;AACF;;;ACrGO,IAAM,oBAAN,MAAkD;AAAA,EAGvD,YACmB,QACA,UACA,OAAsB,QAEtB,YACjB;AALiB;AACA;AACA;AAEA;AAAA,EAChB;AAAA,EALgB;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAPV,WAAW;AAAA,EAUpB,OAAO,UAA6B;AAClC,UAAM,QAAQ,SAAS,QAAQ,IAAI,kBAAkB,KAAK,IAAI,YAAY;AAC1E,WAAO,KAAK,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS;AAAA,EACzF;AAAA,EAEA,MAAM,IACJ,KACA,MACA,UACA,KACmB;AACnB,UAAM,YAAY,KAAK,eAAe,QAAQ;AAC9C,UAAM,oBAAoB,KAAK,WAAW;AAI1C,UAAM,eAAe,KAAK,kBAAkB,iBAAiB;AAE7D,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,eAAe;AAC9C,UAAM,aAAa,MAAM,QAAQ,OAAO;AAAA,MACtC,SAAS;AAAA,MACT,MAAM,KAAK;AAAA;AAAA,IAEb,CAAC,EAAE,gBAAgB,SAAS;AAE5B,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,iBAAa,IAAI,iBAAiB,WAAW,UAAU,EAAE;AACzD,iBAAa,IAAI,qBAAqB,UAAU,OAAO;AACvD,iBAAa,IAAI,kBAAkB,KAAK,OAAO,OAAO;AACtD,QAAI,KAAK,aAAc,cAAa,IAAI,2BAA2B,IAAI,YAAY;AAEnF,UAAM,oBAAoB,cAAc,EAAE,cAAc,UAAU,YAAY,GAAG,KAAK,YAAY,KAAK,OAAO,OAAO;AACrH,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC;AAAA,EACtD;AAAA;AAAA,EAIQ,eAAe,UAAoH;AACzI,UAAM,OAAO,SAAS,QAAQ,IAAI,kBAAkB,KAAK;AACzD,UAAM,MAAM,CAAC,MAAkC,KAAK,MAAM,IAAI,OAAO,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC;AAC3F,UAAM,YAAY,IAAI,WAAW;AACjC,UAAM,SAAS,IAAI,QAAQ;AAC3B,UAAM,WAAW,IAAI,UAAU;AAC/B,UAAM,UAAU,IAAI,SAAS,KAAK,OAAO,KAAK,QAAQ,EAAE;AACxD,UAAM,eAAe,IAAI,cAAc,KAAK,SAAS,YAAY,MAAM;AACvE,QAAI,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU;AACtC,YAAM,IAAI,cAAc,2DAA2D,2BAA2B;AAAA,IAChH;AACA,WAAO,EAAE,WAAW,QAAQ,UAAU,SAAS,YAAY;AAAA,EAC7D;AAAA,EAEQ,aAAqB;AAC3B,WAAO,KAAK,aAAa,oBACrB,mDACA;AAAA,EACN;AAAA;AAAA,EAGQ,kBAAkB,YAAoB;AAC5C,WAAO;AAAA,MACL,WAAW,MAAM,KAAK,OAAO;AAAA,MAC7B,MAAM,OAAO,SAA8B;AACzC,cAAM,QAAQ,gBAAgB,aAAa,OAAO,IAAI,WAAW,IAAI;AACrE,eAAO,OAAO,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,CAAC;AAAA,MACrD;AAAA,MACA,iBAAiB,CAAC,QAAgB,KAAK,OAAO,gBAAgB,KAAK,UAAU;AAAA,MAC7E,eAAe,CAAC,UAAkB,KAAK,OAAO,cAAc,OAAO,UAAU;AAAA,IAC/E;AAAA,EACF;AAAA,EAEA,MAAc,iBAA4C;AACxD,QAAI;AACF,aAAO,MAAM,OAAO,4BAAmC;AAAA,IACzD,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC5FO,IAAM,uBAAN,MAAM,sBAA8C;AAAA,EAChD;AAAA,EACQ;AAAA,EACT;AAAA,EAER,YAAY,QAAgB,iBAA0B;AACpD,QAAI,CAAC,OAAQ,OAAM,IAAI,cAAc,+BAA+B,mBAAmB;AACvF,SAAK,SAAS;AACd,SAAK,UAAU,mBAAmB;AAAA,EACpC;AAAA;AAAA,EAGA,aAAa,WAAW,QAA+C;AACrE,UAAM,SAAS,IAAI,sBAAqB,MAAM;AAC9C,UAAM,MAAM,MAAM,OAAO,QAAQ;AACjC,IAAC,OAA+B,UAAU,IAAI,QAAQ,WAAW,MAAM,EAAE,UAAU;AACnF,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,aAAqB,oBAA6C;AACpF,UAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,UAAM,UAAU,IAAI,QAAQ,WAAW,KAAK,MAAM;AAClD,UAAM,MAAM,QAAQ,KAAK,OAAO,KAAK,aAAa,QAAQ,CAAC;AAC3D,WAAO,OAAO,KAAK,GAAG,EAAE,SAAS,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,gBAAgB,KAAa,mBAA4C;AAC7E,UAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,UAAM,UAAU,IAAI,QAAQ,WAAW,KAAK,MAAM;AAClD,UAAM,KAAK,IAAI,mBAAmB,QAAQ,KAAK,iBAAiB;AAChE,OAAG,KAAK,OAAO;AACf,WAAO,GAAG,MAAM;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,OAAwC;AACpD,UAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,UAAM,UAAU,IAAI,QAAQ,WAAW,KAAK,MAAM;AAClD,WAAO,IAAI,WAAW,QAAQ,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,EACxD;AAAA,EAEA,MAAc,UAAU;AACtB,QAAI,KAAK,IAAK,QAAO,KAAK;AAC1B,QAAI;AACF,WAAK,MAAM,MAAM,OAAO,sBAAsB;AAC9C,aAAO,KAAK;AAAA,IACd,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAIO,IAAM,yBAAN,MAAM,wBAAgD;AAAA,EAC3D,UAAkB;AAAA,EACV;AAAA;AAAA,EAGR,aAAa,UAA2C;AACtD,UAAM,SAAS,IAAI,wBAAuB;AAC1C,UAAM,MAAM,MAAM,OAAO,cAAc;AACvC,UAAM,EAAE,QAAQ,IAAI,MAAM,IAAI,cAAc;AAC5C,WAAO,UAAU;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,aAAqB,mBAA4C;AACnF,UAAM,MAAM,MAAM,KAAK,cAAc;AACrC,UAAM,EAAE,gBAAgB,IAAI,MAAM,IAAI,cAAc,aAAa,EAAE,mBAAmB,SAAS,KAAK,QAAQ,CAAC;AAC7G,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,KAAa,mBAA4C;AAC7E,UAAM,MAAM,MAAM,KAAK,cAAc;AACrC,UAAM,EAAE,YAAY,IAAI,MAAM,IAAI,gBAAgB,KAAK,EAAE,mBAAmB,SAAS,KAAK,QAAQ,CAAC;AACnG,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,QAAyC;AACrD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB;AAC5B,QAAI,KAAK,UAAW,QAAO,KAAK;AAChC,QAAI;AACF,WAAK,YAAY,MAAM,OAAO,wBAA+B;AAC7D,aAAO,KAAK;AAAA,IACd,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxEA,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAErB,IAAM,wBAAN,MAA4B;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAsC,CAAC,GAAG;AACpD,SAAK,SAAS,OAAO;AACrB,SAAK,YAAY,OAAO,aAAa;AACrC,SAAK,WAAW,OAAO,WAAW,KAAK,eAAe,OAAO,aAAa,KAAK,GAAG,QAAQ,OAAO,EAAE;AAAA,EACrG;AAAA,EAEQ,eAAe,WAA4B;AACjD,QAAI,KAAK,OAAQ,QAAO,YAAY,sBAAsB;AAC1D,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,eAAkD;AACtD,WAAO,KAAK,QAAkC,OAAO,YAAY;AAAA,EACnE;AAAA;AAAA,EAGA,MAAM,OAAO,gBAAyB,qBAA8D;AAClG,WAAO,KAAK,QAA+B,QAAQ,WAAW;AAAA,MAC5D,aAAa;AAAA,MAAG;AAAA,MAAgB;AAAA,IAClC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAO,gBAAyB,qBAA8D;AAClG,WAAO,KAAK,QAA+B,QAAQ,WAAW;AAAA,MAC5D,aAAa;AAAA,MAAG;AAAA,MAAgB;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,QAAW,QAAgB,UAAkB,MAA4B;AACrF,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,QAAQ;AACtC,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,KAAK,OAAQ,SAAQ,eAAe,IAAI,UAAU,KAAK,MAAM;AAEjE,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AACjE,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,QACpC,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,YAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC/C,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,SAAS,OAAO,KAAK,iBAAiB,KAAK,eAAe,IAAI,UAAU;AAC9E,cAAM,IAAI;AAAA,UACR,uBAAuB,QAAQ,YAAY,IAAI,MAAM,MAAM,MAAM;AAAA,UACjE,KAAK,aAAa,IAAI,MAAM;AAAA,UAC5B,KAAK,aAAa,IAAI,MAAM;AAAA,QAC9B;AAAA,MACF;AACA,aAAO;AAAA,IACT,SAASC,MAAK;AACZ,UAAIA,gBAAe,cAAe,OAAMA;AACxC,YAAM,MAAOA,KAAc,SAAS,eAAe,sBAAuBA,KAAc;AACxF,YAAM,IAAI,cAAc,uBAAuB,QAAQ,YAAY,GAAG,IAAI,mCAAmC;AAAA,IAC/G,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,aAAa,QAAwB;AAC3C,QAAI,WAAW,IAAK,QAAO;AAC3B,QAAI,WAAW,IAAK,QAAO;AAC3B,QAAI,WAAW,IAAK,QAAO;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,QAAoC;AACvD,QAAI,WAAW,IAAK,QAAO;AAC3B,QAAI,WAAW,IAAK,QAAO;AAC3B,WAAO;AAAA,EACT;AACF;;;AC3GA,SAAS,+BACP,SACA,kBACA,OACY;AACZ,QAAM,eAAe,OAAO,KAAK,SAAS,MAAM;AAChD,QAAM,cAAc,OAAO,MAAM,EAAE;AACnC,MAAI,SAAS;AACb,WAAS,IAAI,IAAI,KAAK,GAAG,KAAK;AAC5B,gBAAY,CAAC,IAAI,OAAO,SAAS,KAAK;AACtC,eAAW;AAAA,EACb;AACA,MAAI,CAAC,OAAO;AAEV,WAAO,IAAI,WAAW,OAAO,OAAO,CAAC,cAAc,WAAW,CAAC,CAAC;AAAA,EAClE;AACA,QAAM,aAAa,OAAO,MAAM,EAAE;AAClC,SAAO,KAAK,OAAO,MAAM,EAAE,KAAK,UAAU;AAC1C,SAAO,IAAI,WAAW,OAAO,OAAO,CAAC,cAAc,YAAY,WAAW,CAAC,CAAC;AAC9E;AA6BO,IAAM,uBAAN,MAA2B;AAAA,EAKhC,YAA6B,QAAoC;AAApC;AAC3B,QAAI,OAAO,oBAAoB,WAAW,IAAI;AAC5C,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,mBAAmB,IAAI,WAAW,OAAO,KAAK,OAAO,qBAAqB,KAAK,CAAC;AAAA,EACvF;AAAA,EAR6B;AAAA,EAJrB,aAAa;AAAA,EACb;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBR,MAAM,eAAe,QAA4C;AAC/D,QAAI,UAAU,GAAI,OAAM,IAAI,cAAc,sBAAsB,gCAAgC;AAChG,SAAK,cAAc;AACnB,UAAM,MAAM,MAAM,KAAK,QAAQ;AAK/B,UAAM,kBAAkB,KAAK,0BAA0B,KAAK,UAAU;AACtE,UAAM,UAAU,IAAI,QAAQ,mBAAmB,OAAO,KAAK,KAAK,gBAAgB,CAAC;AACjF,UAAM,YAAwB,IAAI,WAAW,QAAQ,KAAK,OAAO,KAAK,eAAe,CAAC,CAAC;AAEvF,UAAM,aAAa,OAAO,KAAK,KAAK,UAAU;AAAA,MAC5C,SAAS,KAAK,OAAO;AAAA,MACrB,kBAAkB,KAAK,WAAW,SAAS;AAAA,MAC3C,WAAW,OAAO,KAAK,SAAS,EAAE,SAAS,QAAQ;AAAA,IACrD,CAAC,CAAC,EAAE,SAAS,QAAQ;AAErB,WAAO,EAAE,YAAY,kBAAkB,KAAK,WAAW;AAAA,EACzD;AAAA,EAEA,gBAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,kBAAwB;AACtB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,0BAA0B,kBAAsC;AACtE,WAAO,+BAA+B,KAAK,OAAO,SAAS,kBAAkB,KAAK,OAAO,KAAK;AAAA,EAChG;AAAA,EAEA,MAAc,UAAU;AACtB,QAAI,KAAK,IAAK,QAAO,KAAK;AAC1B,QAAI;AACF,WAAK,MAAM,MAAM,OAAO,sBAAsB;AAC9C,aAAO,KAAK;AAAA,IACd,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAuBO,IAAM,uBAAN,MAA2B;AAAA,EAKhC,YAA6B,QAAoC;AAApC;AAC3B,QAAI,OAAO,oBAAoB,WAAW,IAAI;AAC5C,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAP6B;AAAA,EAJrB,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeR,MAAM,cAAc,YAAoB,gBAA+G;AACrJ,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,OAAO,KAAK,YAAY,QAAQ,EAAE,SAAS,CAAC;AAAA,IAClE,QAAQ;AACN,aAAO,EAAE,OAAO,OAAO,QAAQ,uBAAuB;AAAA,IACxD;AAEA,QAAI,OAAO,YAAY,KAAK,OAAO,QAAS,QAAO,EAAE,OAAO,OAAO,QAAQ,mBAAmB;AAC9F,UAAM,mBAAmB,OAAO,OAAO,gBAAgB;AAGvD,QAAI,oBAAoB,KAAK,mBAAmB;AAC9C,aAAO,EAAE,OAAO,OAAO,QAAQ,oBAAoB,gBAAgB,uBAAkB,KAAK,iBAAiB,GAAG;AAAA,IAChH;AACA,QAAI,mBAAmB,KAAK,sBAAsB,gBAAgB;AAChE,aAAO,EAAE,OAAO,OAAO,QAAQ,SAAS,mBAAmB,KAAK,iBAAiB,oBAAe,cAAc,GAAG;AAAA,IACnH;AAEA,UAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,UAAM,UAAU,IAAI,OAAO,uBAAuB,OAAO,KAAK,KAAK,OAAO,qBAAqB,KAAK,CAAC;AACrG,UAAM,SAAS,IAAI,QAAQ,cAAc,OAAO;AAChD,UAAM,WAAW,KAAK,0BAA0B,gBAAgB;AAChE,UAAM,WAAW,OAAO,KAAK,OAAO,WAAW,QAAQ;AAEvD,QAAI,CAAC,OAAO,OAAO,OAAO,KAAK,QAAQ,GAAG,QAAQ,GAAG;AACnD,aAAO,EAAE,OAAO,OAAO,QAAQ,oBAAoB;AAAA,IACrD;AAEA,SAAK,oBAAoB;AACzB,SAAK,mBAAmB,IAAI,WAAW,QAAQ;AAC/C,WAAO,EAAE,OAAO,MAAM,iBAAiB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAsE;AAC1E,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,cAAc,qEAAgE,+BAA+B;AAAA,IACzH;AACA,UAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,UAAM,aAAa,KAAK,WAAW;AACnC,UAAM,SAAS,KAAK,OAAO,UAAU,OAAO,KAAK,OAAO,QAAQ,EAAE;AAGlE,UAAM,SAAS,IAAI,IAAI,WAAW,OAAO,MAAM;AAC/C,UAAM,UAAU,MAAM,OAAO,WAAW,KAAK,OAAO,YAAY,OAAO;AACvE,UAAM,WAAW,IAAI,IAAI,SAAS,KAAK,OAAO,OAAO;AACrD,UAAM,KAAK,IAAI,IAAI,mBAAmB,SAAS,EAAE,KAAK,SAAS,mBAAmB,WAAW,CAAC,EAC3F,aAAa,SAAS;AAAA,MACrB;AAAA,MACA,IAAI,cAAc,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAAA,MAC1D,IAAI,IAAI,MAAM,SAAS,OAAO,KAAK,KAAK,gBAAgB,CAAC;AAAA,IAC3D,CAAC,EACA,WAAW,EAAE,EACb,MAAM;AAET,UAAM,WAAW,MAAM,OAAO,mBAAmB,EAAE;AACnD,UAAM,YAAY,MAAM,KAAK,OAAO,YAAY,gBAAgB,SAAS,MAAM,GAAG,UAAU;AAC5F,UAAM,aAAa,MAAM,OAAO,gBAAgB,IAAI,mBAAmB,QAAQ,WAAW,UAAU,CAAC;AAErG,WAAO,EAAE,QAAQ,WAAW,MAAM,kBAAkB,KAAK,kBAAkB;AAAA,EAC7E;AAAA,EAEA,uBAA+B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,0BAA0B,kBAAsC;AACtE,WAAO,+BAA+B,KAAK,OAAO,SAAS,kBAAkB,KAAK,OAAO,KAAK;AAAA,EAChG;AAAA,EAEQ,aAAqB;AAC3B,WAAO,KAAK,OAAO,aAAa,oBAC5B,mDACA;AAAA,EACN;AAAA,EAEA,MAAc,UAAU;AACtB,QAAI,KAAK,IAAK,QAAO,KAAK;AAC1B,QAAI;AACF,WAAK,MAAM,MAAM,OAAO,sBAAsB;AAC9C,aAAO,KAAK;AAAA,IACd,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACjRA,IAAM,YAAY;AAAA,EAChB,eAAe;AAAA,EACf,gBAAgB;AAClB;AAEO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAmB,QAA0B;AACvD,SAAK,SAAS;AACd,SAAK,eAAe,OAAO;AAC3B,SAAK,kBAAkB,OAAO,mBAAmB;AAAA,EACnD;AAAA,EAEA,mBAAmB,eAA+B;AAChD,UAAM,OAAO,OAAO,aAAa;AACjC,UAAM,aAAc,OAAO,OAAO,KAAK,eAAe,IAAK;AAC3D,WAAO,WAAW,SAAS;AAAA,EAC7B;AAAA,EAEA,MAAM,cAAc,cAAsB,eAAuB,SAAkC;AACjG,UAAM,YAAY,OAAO,YAAY,EAAE,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AACpE,UAAM,aAAa,OAAO,aAAa,EAAE,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AACtE,UAAM,OAAO,GAAG,UAAU,aAAa,GAAG,SAAS,GAAG,UAAU;AAChE,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,KAAK,cAAc,KAAK,GAAG,OAAO;AAC7F,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,gBAAwB,SAAkC;AAC7E,UAAM,WAAW,eAAe,QAAQ,MAAM,EAAE,EAAE,SAAS,IAAI,GAAG;AAClE,UAAM,OAAO,GAAG,UAAU,cAAc,GAAG,QAAQ;AACnD,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,KAAK,cAAc,KAAK,GAAG,OAAO;AAC7F,WAAO;AAAA,EACT;AACF;;;AChBA,SAAS,sBAAAC,qBAAoB,QAAAC,aAAY;AAazC,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAMC,gBAAe;AA6CrB,IAAM,oBAAoB,oBAAI,IAA4B;AAGnD,SAAS,gBAAgB,UAAkC;AAChE,MAAI,SAAS,kBAAkB,IAAI,QAAQ;AAC3C,MAAI,CAAC,QAAQ;AACX,UAAM,QAAQ,OAAO,QAAQ;AAC7B,QAAI,CAAC,MAAO,OAAM,IAAI,cAAc,kBAAkB,QAAQ,IAAI,eAAe;AACjF,aAASC,oBAAmB,EAAE,WAAWC,MAAK,MAAM,MAAM,EAAE,CAAC;AAC7D,sBAAkB,IAAI,UAAU,MAAM;AAAA,EACxC;AACA,SAAO;AACT;AASO,IAAM,aAAN,MAAiB;AAAA,EAGtB,YACU,UACA,OAAmC,CAAC,GAC5C;AAFQ;AACA;AAER,QAAI,KAAK,cAAc;AAErB,cAAQ;AAAA,QACN,2CAA2C,QAAQ,KAAK,KAAK,YAAY;AAAA,MAE3E;AACA,WAAK,SAAS,IAAI,QAAQ,KAAK,YAAY;AAAA,IAC7C;AAAA,EACF;AAAA,EAXU;AAAA,EACA;AAAA,EAJF,WAAW,oBAAI,IAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB5C,QAAQ,QAAsD;AAC5D,UAAMC,UAAS,KAAK,SAAS,IAAI,MAAM;AACvC,QAAIA,QAAQ,QAAOA;AACnB,UAAM,YAAY,OAAO,KAAK,QAAQ,GAAG,SAAS,MAAM;AACxD,QAAI,aAAa,cAAc,WAAW;AACxC,WAAK,SAAS,IAAI,QAAQ,SAAS;AACnC,aAAO;AAAA,IACT;AACA,QAAI,WAAW,QAAQ;AACrB,YAAM;AAAA,QACJ;AAAA,QACA,wBAAwB,KAAK,QAAQ;AAAA,MACvC;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,MACA,SAAS,MAAM,sBAAsB,KAAK,QAAQ;AAAA,IACpD;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,QAAsD;AACxD,QAAI;AAAE,WAAK,QAAQ,MAAM;AAAG,aAAO;AAAA,IAAM,QAAQ;AAAE,aAAO;AAAA,IAAO;AAAA,EACnE;AACF;AAeA,IAAM,oBAAoB,CAAC;AAAA,EACzB,MAAM;AAAA,EAAY,MAAM;AAAA,EAAa,iBAAiB;AAAA,EACtD,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,UAAU,CAAC;AAAA,EAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AACzC,CAAC;AAEM,IAAM,eAAN,MAAmB;AAAA,EACxB,YACU,WACA,QACR;AAFQ;AACA;AAAA,EACP;AAAA,EAFO;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQV,MAAM,KAAK,QAMe;AACxB,UAAM,EAAE,SAAS,gBAAgB,CAAC,GAAG,OAAO,MAAM,IAAI;AACtD,UAAM,OAAO,CAAC,MACZ,CAAC,SAAS,MAAM,SAAS,CAAC;AAE5B,UAAM,CAAC,cAAc,aAAa,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/D,KAAK,cAAc,KAAK,KAAK,YAAY,IACrC,KAAK,iBAAiB,OAAO,IAC7B,QAAQ,QAAQ,EAAE,QAAQ,IAAI,MAAM,GAAG,CAAC;AAAA,MAC5C,KAAK,aAAa,KAAK,cAAc,SACjC,KAAK,wBAAwB,SAAS,aAAa,IACnD,QAAQ,QAAQ,CAAC,CAAC;AAAA,MACtB,KAAK,WAAW,KAAK,QACjB,KAAK,cAAc,MAAM,QAAQ,MAAM,SAAS,OAAO,MAAM,IAC7D,QAAQ,QAAQ,MAAS;AAAA,IAC/B,CAAC;AAED,WAAO;AAAA,MACL,cAAc,aAAa;AAAA,MAC3B,YAAY,aAAa;AAAA,MACzB;AAAA,MACA,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjD;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,iBAAiB,SAA6D;AAC1F,UAAM,SAAS,gBAAgB,KAAK,SAAS;AAC7C,UAAM,MAAM,KAAK,OAAO,IAAI,QAAQ,IAAI,KAAK,OAAO,QAAQ,QAAQ,IAAI;AACxE,UAAM,OAAO,KAAK,OAAO,IAAI,MAAM,IAAI,KAAK,OAAO,QAAQ,MAAM,IAAI;AACrE,QAAI,QAAQ,aAAa,SAAS,UAAW,QAAO,EAAE,QAAQ,IAAI,MAAM,GAAG;AAG3E,QAAI;AACF,YAAM,CAAC,QAAQ,OAAO,IAAI,MAAM,OAAO,UAAU;AAAA,QAC/C,WAAW;AAAA,UACT,GAAI,QAAQ,YAAY,CAAC,EAAE,SAAS,KAAK,KAAK,mBAAmB,cAAc,aAAsB,MAAM,CAAC,OAAO,EAAW,CAAC,IAAI,CAAC;AAAA,UACpI,GAAI,SAAS,YAAY,CAAC,EAAE,SAAS,MAAM,KAAK,mBAAmB,cAAc,aAAsB,MAAM,CAAC,OAAO,EAAW,CAAC,IAAI,CAAC;AAAA,QACxI;AAAA,QACA,kBAAkB;AAAA,QAClB,cAAc;AAAA,MAChB,CAAC;AACD,YAAM,SAAS,QAAQ,YAAa,QAAQ,WAAW,YAAY,OAAO,SAAU,KAAM;AAC1F,YAAM,UAAU,SAAS,YACpB,QAAQ,YAAa,SAAS,WAAW,YAAY,QAAQ,SAAU,KAAO,QAAQ,WAAW,YAAY,OAAO,SAAU,KAC/H;AACJ,aAAO,EAAE,QAAQ,MAAM,QAAQ;AAAA,IACjC,QAAQ;AAEN,aAAO;AAAA,QACL,QAAQ,QAAQ,YAAY,KAAK,MAAM,KAAK,UAAU,QAAQ,KAAK,OAAO;AAAA,QAC1E,MAAM,SAAS,YAAY,KAAK,MAAM,KAAK,UAAU,QAAQ,MAAM,OAAO;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,QAAsB,OAAgB,KAA+B;AAC3F,QAAI;AACF,YAAM,IAAI,MAAM,OAAO,aAAa;AAAA,QAClC,SAAS;AAAA,QAAO,KAAK;AAAA,QAAmB,cAAc;AAAA,QAAa,MAAM,CAAC,GAAG;AAAA,MAC/E,CAAC;AACD,aAAO;AAAA,IACT,QAAQ;AAAE,aAAO;AAAA,IAAI;AAAA,EACvB;AAAA,EAEA,MAAc,wBACZ,SACA,eAC4C;AAC5C,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,cAAc,IAAI,OAAO,aAA0C;AACjE,YAAI;AACF,gBAAM,OAAO,OAAO,QAAQ,GAAG,QAAQ;AACvC,cAAI,CAAC,QAAQ,SAAS,UAAW,QAAO,CAAC,UAAU,EAAE;AACrD,gBAAM,SAAS,gBAAgB,QAAQ;AACvC,gBAAM,UAAU,MAAM,KAAK,UAAU,QAAQ,MAAM,OAAO;AAC1D,iBAAO,CAAC,UAAU,OAAO;AAAA,QAC3B,QAAQ;AACN,iBAAO,CAAC,UAAU,EAAE;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,OAAO,YAAY,OAAO;AAAA,EACnC;AAAA,EAEA,MAAc,cAAc,QAAgB,SAAiB,QAAuC;AAClG,QAAI;AAEF,YAAM,MAAM,MAAM,MAAM,GAAG,OAAO,QAAQ,OAAO,EAAE,CAAC,YAAY,OAAO,IAAI,EAAE,OAAO,CAAC;AACrF,UAAI,CAAC,IAAI,GAAI,QAAO;AACpB,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO,OAAO,MAAM,iBAAiB,MAAM,aAAa;AAAA,IAC1D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAIA,IAAM,gBAAgB,CAAC;AAAA,EACrB,MAAM;AAAA,EAAY,MAAM;AAAA,EAAyB,iBAAiB;AAAA,EAClE,QAAQ,CAAC,EAAE,MAAM,UAAU,MAAM,SAAS,YAAY;AAAA,IACpD,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,IACnC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,IACpC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,IACpC,EAAE,MAAM,OAAO,MAAM,SAAS;AAAA,IAC9B,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,EAC/C,EAAC,CAAC;AAAA,EACF,SAAS;AAAA,IACP,EAAE,MAAM,aAAa,MAAM,UAAU;AAAA,IACrC,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,IAC7C,EAAE,MAAM,2BAA2B,MAAM,SAAS;AAAA,IAClD,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,EACzC;AACF,CAAC;AAED,IAAM,kBAAkB,CAAC;AAAA,EACvB,MAAM;AAAA,EAAY,MAAM;AAAA,EAAoB,iBAAiB;AAAA,EAC7D,QAAQ,CAAC,EAAE,MAAM,UAAU,MAAM,SAAS,YAAY;AAAA,IACpD,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,IACnC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,IACpC,EAAE,MAAM,OAAO,MAAM,SAAS;AAAA,IAC9B,EAAE,MAAM,aAAa,MAAM,UAAU;AAAA,IACrC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,IACpC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,IACpC,EAAE,MAAM,oBAAoB,MAAM,UAAU;AAAA,IAC5C,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,EAC/C,EAAC,CAAC;AAAA,EACF,SAAS,CAAC,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AAClD,CAAC;AAGD,IAAM,mBAAmB;AAEzB,IAAM,eAAgF;AAAA;AAAA;AAAA;AAItF;AAEO,IAAM,cAAN,MAAoD;AAAA,EAKzD,YACU,UACA,QACA,QACA,MAIR;AAPQ;AACA;AACA;AACA;AAKR,UAAM,WAAW,aAAa,QAAQ;AACtC,UAAM,SAAU,KAAK,UAAU,UAAU,UAAU;AACnD,UAAM,SAAU,KAAK,UAAU,UAAU,UAAU;AACnD,QAAI,UAAU,OAAQ,MAAK,OAAO,EAAE,QAAQ,OAAO;AAAA,EACrD;AAAA,EAZU;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EARD,OAAwB;AAAA,EACzB,QAA0B,QAAQ,QAAQ;AAAA,EAC1C,OAAoD;AAAA,EAiB5D,YAAqB;AACnB,WAAO,KAAK,SAAS,QAAQ,KAAK,OAAO,IAAI,MAAM,KAAK,KAAK,OAAO,IAAI,QAAQ;AAAA,EAClF;AAAA,EAEA,MAAM,MAAM,eAAkD;AAC5D,QAAI,CAAC,KAAK,UAAU,GAAG;AACrB,YAAM,UAAU,uBAAuB,oEAAoE;AAAA,IAC7G;AACA,UAAM,EAAE,QAAQ,OAAO,IAAI,KAAK;AAChC,UAAM,UAAU,KAAK,OAAO,QAAQ,QAAQ;AAC5C,UAAM,WAAW,KAAK,OAAO,QAAQ,MAAM;AAK3C,UAAM,SAAS,gBAAgB,KAAK,QAAQ;AAC5C,UAAM,QAAQ,MAAM,OAAO,iBAAiB;AAAA,MAC1C,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC;AAAA,QACL;AAAA,QACA;AAAA,QACA,UAAU;AAAA;AAAA,QACV,KAAK;AAAA,QACL,mBAAmB;AAAA,MACrB,CAAC;AAAA,IACH,CAAC;AACD,UAAM,QAAS,MAAM,OAAqD,CAAC;AAC3E,QAAI,UAAU,IAAI;AAChB,YAAM,UAAU,uBAAuB,4DAAuD;AAAA,IAChG;AAEA,UAAM,WAAY,gBAAgB,gBAAiB;AACnD,UAAM,cAAc,SAAU,OAAO,KAAK,KAAK,cAAc;AAC7D,UAAM,cAAe,WAAW,cAAe;AAE/C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa,KAAK;AAAA,MAClB,QAAQ,cAAc;AAAA,MACtB,QAAQ,KAAK,KAAK;AAAA,MAClB,YAAY,KAAK,IAAI,IAAIC;AAAA,MACzB,YAAY;AAAA,MACZ,MAAM,EAAE,QAAQ,QAAQ,KAAK,kBAAkB,SAAS,UAAU,eAAe,SAAS;AAAA,IAC5F;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,OAAsD;AAClE,QAAI,CAAC,MAAM,KAAK,OAAQ,OAAM,UAAU,uBAAuB,sBAAsB;AACrF,QAAI,KAAK,IAAI,IAAI,MAAM,YAAY;AACjC,YAAM,UAAU,+BAA+B,oCAA+B;AAAA,IAChF;AAGA,WAAQ,KAAK,QAAQ,KAAK,MAAM,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,EAClE;AAAA,EAEA,MAAc,UAAU,OAAsD;AAC5E,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,EAAE,QAAQ,KAAK,SAAS,UAAU,cAAc,IAAI,MAAM;AAGhE,UAAM,QAAQ,OAAO,KAAK,QAAQ;AAClC,UAAM,YAAY,MAAM,KAAK,OAAO,gBAAgB,MAAM,OAAO;AACjE,UAAM,SAAU,MAAM,WAAW,SAAU,OAAO,KAAK,KAAK,cAAc,KAAM;AAChF,UAAM,WAAW,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI,GAAG;AAE3D,UAAM,UAAU,KAAK,OAAO,WAAW;AACvC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,MAAM;AAClD,UAAM,OAAO,mBAAmB;AAAA,MAC9B,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC;AAAA,QACL;AAAA,QAAS;AAAA,QAAU;AAAA,QAAK;AAAA,QACxB;AAAA,QAAU,UAAU;AAAA,QAAe,kBAAkB;AAAA,QACrD,mBAAmB;AAAA,MACrB,CAAC;AAAA,IACH,CAAC;AACD,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,QAAQ,KAAK,GAAG,MAAM,OAAO;AACxF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,cAAc,MAAM;AAAA,MACpB,SAAS,MAAM;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA;AAAA,MACX,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACF;AAQO,IAAM,qBAAN,MAA2D;AAAA,EAIhE,YACU,UACA,UACA,QACA,QACA,MACR;AALQ;AACA;AACA;AACA;AACA;AAAA,EACP;AAAA,EALO;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EARD,OAAwB;AAAA,EACzB,MAA0D;AAAA,EAUlE,YAAqB;AACnB,WAAO,KAAK,OAAO,IAAI,MAAM;AAAA,EAC/B;AAAA,EAEA,MAAc,aAA8D;AAC1E,QAAI,KAAK,IAAK,QAAO,KAAK;AAC1B,QAAI;AAGF,YAAM,IAAI,MAAO,SAAS,yCAAyC,EAAU;AAC7E,WAAK,MAAM,EAAE,UAAU,EAAE,UAAU,SAAS,EAAE,QAAQ;AACtD,aAAO,KAAK;AAAA,IACd,QAAQ;AACN,YAAM,UAAU,2BAA2B;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,eAAkD;AAC5D,UAAM,KAAK,WAAW;AAItB,UAAM,eAAe,KAAK,KAAK;AAC/B,UAAM,SAAU,gBAAgB,OAAO,YAAY,IAAK;AACxD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU,gBAAgB;AAAA,MAC1B,aAAa,KAAK;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,IAAIA;AAAA,MACzB,YAAY;AAAA;AAAA,MACZ,MAAM,EAAE,UAAU,KAAK,SAAS;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,OAAsD;AAClE,QAAI,KAAK,IAAI,IAAI,MAAM,YAAY;AACjC,YAAM,UAAU,yBAAyB,mCAA8B;AAAA,IACzE;AACA,QAAI,MAAM,SAAS,KAAK,KAAK,WAAW;AACtC,YAAM,UAAU,uBAAuB;AAAA,IACzC;AACA,UAAM,KAAK,WAAW;AAKtB,UAAM,IAAI;AAAA,MACR;AAAA,MAEA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAIA,IAAM,2BAA2B;AAAA,EAC/B;AAAA,EAAY;AAAA,EAAkB;AAAA,EAAsB;AAAA,EAAU;AAChE;AAoBO,IAAM,gBAAgB;AAAA;AAAA,EAE3B,yBAAyB,cAAsB,QAA2B;AAMxE,QAAI,CAAC,OAAO,gBAAgB;AAC1B,YAAM,UAAU,6BAA6B,+BAA+B;AAAA,IAC9E;AACA,QAAI,OAAO,sBAAsB,IAAI;AACnC,YAAM,UAAU,6BAA6B,4CAA4C;AAAA,IAC3F;AACA,QAAI,CAAC,OAAO,iBAAiB,OAAO,kBAAkB,WAAW;AAC/D,YAAM,UAAU,6BAA6B,yCAAyC;AAAA,IACxF;AAAA,EAIF;AACF;AAEO,IAAM,oBAAN,MAA0D;AAAA,EAI/D,YACU,MAOR;AAPQ;AAAA,EAOP;AAAA,EAPO;AAAA,EAJD,OAAwB;AAAA,EACzB,cAAc,oBAAI,IAAY;AAAA,EAYtC,YAAqB;AACnB,WAAO,CAAC,CAAC,KAAK,KAAK,aAAa,KAAK,KAAK,OAAO,IAAI,QAAQ;AAAA,EAC/D;AAAA,EAEA,MAAM,MAAM,eAAuB,KAA2D;AAC5F,QAAI,CAAC,KAAK,UAAU,GAAG;AACrB,YAAM,UAAU,2BAA2B,wCAAwC;AAAA,IACrF;AAKA,UAAM,SAAS,MAAM,KAAK,YAAY,eAAe,KAAK,MAAM;AAChE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU,OAAO;AAAA,MACjB,aAAa;AAAA,MACb,QAAQ;AAAA;AAAA,MACR,QAAQ;AAAA,MACR,YAAY,OAAO;AAAA,MACnB,YAAY;AAAA;AAAA,MACZ,MAAM,EAAE,OAAO;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,OAAyB,KAA6D;AAClG,UAAM,SAAS,MAAM,KAAK;AAC1B,QAAI,CAAC,OAAQ,OAAM,UAAU,uBAAuB,uBAAuB;AAC3E,QAAI,KAAK,IAAI,IAAI,OAAO,OAAQ,OAAM,UAAU,4BAA4B;AAC5E,QAAI,KAAK,YAAY,IAAI,OAAO,QAAQ,GAAG;AACzC,YAAM,UAAU,6BAA6B;AAAA,IAC/C;AACA,SAAK,YAAY,IAAI,OAAO,QAAQ;AAEpC,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,OAAO,OAAO,gBAAgB;AACpC,UAAM,cAAc,MAAM,OAAO,SAAS,IAAI;AAG9C,kBAAc,yBAAyB,aAAa,MAAM;AAE1D,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,YAAY,MAAM,KAAK,IAAI,oBAAoB,QAAQ;AAAA,MAC3D,UAAU,OAAO;AAAA,MAAU;AAAA,IAC7B,GAAG,KAAK,MAAM;AACd,UAAM,UAAW,UAAmC,WAAW;AAG/D,UAAM,WAAW,QAAQ,KAAK;AAC9B,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,WAAK,QAAQ,eAAe;AAC5B,YAAM,SAAU,MAAM,KAAK,IAAI,iBAAiB,OAAO,QAAQ,IAAI,KAAK;AACxE,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc;AAAA;AAAA,UACd,SAAS;AAAA,UACT,WAAW;AAAA,UACX,WAAW,OAAO;AAAA,UAClB,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAAA,MACF;AACA,UAAI,OAAO,UAAU,aAAa,OAAO,UAAU,UAAU;AAC3D,cAAM,UAAU,yBAAyB,SAAS,OAAO,QAAQ,mBAAmB,OAAO,KAAK,EAAE;AAAA,MACpG;AACA,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAM,CAAC;AAAA,IAChD;AACA,UAAM,UAAU,qBAAqB;AAAA,EACvC;AAAA,EAEA,MAAc,YAAY,gBAAwB,QAA4C;AAC5F,UAAM,OAAO,EAAE,eAAe,KAAK,KAAK,eAAe,aAAa,OAAO,KAAK,KAAK,SAAS,EAAE,QAAQ;AACxG,UAAM,MAAM,MAAM,KAAK,IAAI,iBAAiB,QAAQ,MAAM,MAAM;AAChE,UAAM,MAAM;AACZ,eAAW,KAAK,0BAA0B;AACxC,UAAI,EAAE,KAAK,KAAM,OAAM,UAAU,yBAAyB,2BAA2B,CAAC,EAAE;AAAA,IAC1F;AACA,WAAO;AAAA,MACL,UAAU,OAAO,IAAI,QAAQ;AAAA,MAC7B,gBAAgB,OAAO,IAAI,cAAc;AAAA,MACzC,oBAAoB,OAAO,IAAI,kBAA8C;AAAA,MAC7E,QAAQ,OAAO,IAAI,MAAM;AAAA,MACzB,eAAe,IAAI;AAAA,MACnB,cAAc,IAAI,eAAe,OAAO,IAAI,YAAY,IAAI;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAc,IAAI,MAAc,QAAwB,MAAgB,QAAwC;AAC9G,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,KAAK,UAAU,QAAQ,OAAO,EAAE,CAAC,GAAG,IAAI,IAAI;AAAA,MAC1E;AAAA,MACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,MACpC;AAAA,IACF,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,UAAU,yBAAyB,GAAG,MAAM,IAAI,IAAI,WAAM,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,IAChG;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AACF;AAKO,IAAM,kBAAN,MAAwD;AAAA,EAE7D,YAAoB,OAA4B,CAAC,GAAG;AAAhC;AAAA,EAAiC;AAAA,EAAjC;AAAA,EADX,OAAwB;AAAA,EAEjC,YAAqB;AAAE,WAAO;AAAA,EAAM;AAAA,EACpC,MAAM,MAAM,QAA2C;AACrD,UAAM,SAAS,KAAK,KAAK,UAAU;AACnC,UAAM,SAAU,SAAS,OAAO,MAAM,IAAK;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MAAQ,SAAS;AAAA,MAAQ,UAAU,SAAS;AAAA,MAAQ,aAAa;AAAA,MACvE;AAAA,MAAQ;AAAA,MAAQ,YAAY,KAAK,IAAI,IAAI;AAAA,MAAQ,YAAY;AAAA,MAC7D,MAAM,EAAE,MAAM,KAAK;AAAA,IACrB;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,GAAkD;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MAAQ,cAAc,EAAE;AAAA,MAAS,SAAS,EAAE;AAAA,MAClD,WAAW,eAAe,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,MACjD,WAAW,eAAe,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,MACjD,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAEO,IAAM,iBAAN,MAAuD;AAAA,EAE5D,YAAoB,MAA+C;AAA/C;AAAA,EAAgD;AAAA,EAAhD;AAAA,EADX,OAAwB;AAAA,EAEjC,YAAqB;AAAE,WAAO;AAAA,EAAM;AAAA,EACpC,MAAM,MAAM,QAA2C;AACrD,UAAM,SAAS,KAAK,KAAK,UAAU;AACnC,UAAM,SAAU,SAAS,OAAO,MAAM,IAAK;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MAAO,SAAS;AAAA,MAAQ,UAAU,SAAS;AAAA,MAAQ,aAAa,KAAK,KAAK;AAAA,MAChF;AAAA,MAAQ;AAAA,MAAQ,YAAY,KAAK,IAAI,IAAI;AAAA,MAAQ,YAAY;AAAA,MAC7D,MAAM,EAAE,MAAM,KAAK;AAAA,IACrB;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,GAAkD;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MAAO,cAAc,EAAE;AAAA,MAAS,SAAS,EAAE;AAAA,MACjD,WAAW,cAAc,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,MAChD,WAAW,kBAAkB,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,MACpD,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAEO,IAAM,oBAAN,MAA0D;AAAA,EACtD,OAAwB;AAAA,EACjC,YAAqB;AAAE,WAAO;AAAA,EAAM;AAAA,EACpC,MAAM,MAAM,QAA2C;AACrD,WAAO;AAAA,MACL,MAAM;AAAA,MAAS,SAAS;AAAA,MAAQ,UAAU,SAAS;AAAA,MAAU,aAAa;AAAA,MAC1E,QAAQ;AAAA,MAAI,QAAQ;AAAA,MAAG,YAAY,KAAK,IAAI,IAAI,IAAI;AAAA,MAAQ,YAAY;AAAA,MACxE,MAAM,EAAE,MAAM,KAAK;AAAA,IACrB;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,GAAkD;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MAAS,cAAc,EAAE;AAAA,MAAS,SAAS;AAAA,MACjD,WAAW,eAAe,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,MACjD,WAAW,sBAAsB,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,MACxD,YAAY;AAAA,IACd;AAAA,EACF;AACF;;;AC5pBO,IAAM,uBAAN,MAAiE;AAAA,EACtE,MAAM,OACJ,UACA,cACA,WACA,MAC0B;AAC1B,UAAM,SAAS,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACxD,UAAM,WAAW,CAAC,MAAuB,KAAK,aAAa,SAAS,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,EAAG,UAAU;AAGpH,QAAI,SAAS,MAAM,KAAK,SAAS,eAAe,IAAI;AAClD,YAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,EAAG,MAAM,cAAc,EAAE,QAAQ,KAAK,OAAO,CAAC;AACnF,UAAI,SAAS,gBAAgB,MAAM,SAAU,QAAO,EAAE,MAAM,QAAQ,MAAM;AAAA,IAC5E;AAGA,QAAI,SAAS,KAAK,GAAG;AACnB,YAAM,aAAa,OAAO,QAAQ,SAAS,WAAW,EACnD,OAAO,CAAC,CAAC,EAAE,GAAG,MAAM,OAAQ,YAAY,EACxC,IAAI,CAAC,CAAC,KAAK,MAAM,KAAiB;AACrC,UAAI,WAAW,QAAQ;AACrB,cAAM,QAAQ,MAAM,OAAO,IAAI,KAAK,EAAG,MAAM,cAAc,EAAE,QAAQ,KAAK,OAAO,CAAC;AAClF,eAAO,EAAE,MAAM,OAAO,MAAM;AAAA,MAC9B;AAAA,IACF;AAGA,QAAI,SAAS,OAAO,MAAM,SAAS,aAAa,MAAM,IAAI;AACxD,YAAM,QAAQ,MAAM,OAAO,IAAI,OAAO,EAAG,MAAM,cAAc,EAAE,QAAQ,KAAK,OAAO,CAAC;AACpF,WAAK,SAAS,aAAa,OAAO,MAAM,SAAU,QAAO,EAAE,MAAM,SAAS,MAAM;AAAA,IAClF;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,0BAA0B,YAAY,iBAC3B,SAAS,YAAY,iBAAiB,OAAO,OAAO,SAAS,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,KAAK,KAAK,KAAK,EAAE,CAAC,SACjH,SAAS,aAAa,EAAE,cAAc,KAAK,aAAa,KAAK,GAAG,CAAC;AAAA,IAC1E;AAAA,EACF;AACF;AA0BA,IAAM,0BAA0B;AASzB,IAAM,wBAAN,MAA4B;AAAA,EAQjC,YAA6B,MAAkB;AAAlB;AAC3B,SAAK,SAAS,IAAI,WAAW,KAAK,WAAW,EAAE,cAAc,KAAK,aAAa,CAAC;AAChF,SAAK,WAAW,IAAI,aAAa,KAAK,WAAW,KAAK,MAAM;AAC5D,SAAK,WAAW,KAAK,YAAY,IAAI,qBAAqB;AAG1D,QAAI,KAAK,UAAU;AACjB,WAAK,QAAQ;AAAA,QACX,IAAI,gBAAgB;AAAA,QACpB,IAAI,eAAe,EAAE,UAAU,eAAe,CAAC;AAAA,QAC/C,IAAI,kBAAkB;AAAA,MACxB;AAAA,IACF,OAAO;AACL,WAAK,QAAQ;AAAA,QACX,IAAI,YAAY,KAAK,WAAW,KAAK,QAAQ,KAAK,QAAQ;AAAA,UACxD,gBAAgB,KAAK,OAAO,kBAAkB;AAAA,UAC9C,UAAU,KAAK;AAAA,QACjB,CAAC;AAAA,QACD,IAAI;AAAA,UACD,KAAK,gBAAgB,CAAC,KAAK;AAAA,UAC5B,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,EAAE,WAAW,KAAK,OAAO,aAAa,IAAI;AAAA,QAC5C;AAAA,QACA,IAAI,kBAAkB;AAAA,UACpB,WAAW,KAAK,aAAa;AAAA,UAC7B,WAAW,KAAK;AAAA,UAChB,eAAgB;AAAA;AAAA,UAChB,WAAW,KAAK;AAAA,UAChB,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAlC6B;AAAA,EAPZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,oBAAI,IAA0D;AAAA,EACnF,QAA0B,QAAQ,QAAQ;AAAA;AAAA,EAuClD,iBAAuB;AACrB,UAAM,UAAU,KAAK,KAAK,OAAO,gBAAgB,CAAC,MAAM;AACxD,QAAI,QAAQ,SAAS,OAAO,KAAK,CAAC,KAAK,KAAK,aAAa,CAAC,KAAK,KAAK,UAAU;AAC5E,YAAM,UAAU,yBAAyB;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,QAAwD;AACrE,UAAM,SAAS,MAAM,KAAK,gBAAgB,EAAE,GAAG,QAAQ,QAAQ,KAAK,CAAC;AACrE,WAAO,OAAO,QAAQ,EAAE,MAAM,OAAO,MAAM,MAAM,OAAO,OAAO,MAAM,IAAI;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,QAA+C;AAC3D,QAAI,CAAC,KAAK,KAAK,OAAO,WAAW,CAAC,OAAO,QAAQ;AAC/C,YAAM,UAAU,wBAAwB;AAAA,IAC1C;AACA,WAAO,KAAK,gBAAgB,MAAM;AAAA,EACpC;AAAA,EAEA,MAAc,gBAAgB,QAA+C;AAC3E,UAAM,gBAAgB,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACpE,UAAM,SAAS,OAAO;AACtB,QAAI,WAAW,IAAI;AACjB,aAAO,EAAE,QAAQ,SAAS,UAAU,IAAI,cAAc;AAAA,IACxD;AAGA,UAAM,UAAU,OAAO;AACvB,QAAI,SAAS;AACX,YAAM,MAAM,KAAK,UAAU,IAAI,OAAO;AACtC,UAAI,OAAO,IAAI,YAAY,KAAK,IAAI,EAAG,QAAO,IAAI;AAAA,IACpD;AAGA,WAAQ,KAAK,QAAQ,KAAK,MAAM,KAAK,YAAY;AAC/C,YAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,aAAa;AACvD,UAAI,WAAW,OAAO,WAAW,YAAY;AAC3C,aAAK,UAAU,IAAI,SAAS,EAAE,QAAQ,WAAW,KAAK,IAAI,IAAI,wBAAwB,CAAC;AAAA,MACzF;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,QAAQ,QAAuB,eAA+C;AAC1F,UAAM,EAAE,eAAe,QAAQ,OAAO,IAAI;AAC1C,UAAM,SAAS,OAAO,UAAU,KAAK,KAAK,OAAO,UAAU;AAC3D,UAAM,eAAe,OAAO,gBAAgB,KAAK,KAAK,OAAO,gBAAgB,CAAC,MAAM;AAGpF,UAAM,cAAc,aAAa,SAAS,KAAK;AAC/C,UAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,UAAM,UAAW,MAAM,KAAK,KAAK,OAAO,gBAAgB,OAAO,KAAK,KAAK,SAAS,EAAE,OAAO;AAE3F,UAAM,WAAW,MAAM,KAAK,SAAS,KAAK;AAAA,MACxC;AAAA,MACA,eAAe,cAAe,KAAK,KAAK,iBAAiB,CAAC,cAAc,IAAK,CAAC;AAAA;AAAA;AAAA,MAG9E,OAAO,WAAW,KAAK,KAAK,YAAY,SAAY;AAAA,MACpD,OAAO,KAAK,aAAa,YAAY;AAAA,MACrC;AAAA,IACF,CAAC;AAGD,UAAM,QAAQ,SAAS,SAAS,aAAa,SAAS,SAAS,aAAa;AAC5E,QAAI,UAAU,IAAI;AAChB,aAAO,EAAE,QAAQ,SAAS,UAAU,IAAI,cAAc;AAAA,IACxD;AAGA,QAAI,KAAK,KAAK,OAAO;AACnB,YAAMC,YAAW,KAAK,KAAK,MAAM,iBAAiB,OAAO;AAAA,QACvD,YAAY,KAAK,KAAK,OAAO;AAAA,QAC7B,WAAW,KAAK,KAAK,OAAO;AAAA,MAC9B,CAAC;AACD,UAAI,CAACA,UAAS,SAAS;AACrB,cAAM,UAAU,gCAAgCA,UAAS,MAAM;AAAA,MACjE;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,KAAK,SAAS,OAAO,UAAU,OAAO,KAAK,OAAO,EAAE,cAAc,OAAO,CAAC;AAEjG,QAAI,QAAQ;AACV,aAAO,EAAE,QAAQ,WAAW,UAAU,IAAI,OAAO,SAAS,OAAO,cAAc;AAAA,IACjF;AAGA,UAAM,UAAU,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,IAAI;AAC/D,UAAM,UAAU,MAAM,QAAQ,QAAQ,SAAS,OAAO,EAAE,OAAO,CAAC;AAGhE,QAAI,KAAK,KAAK,OAAO;AACnB,WAAK,KAAK,MAAM,kBAAkB;AAAA,QAChC,eAAe;AAAA,QACf,OAAO,KAAK,KAAK;AAAA,QACjB,MAAM,SAAS;AAAA,QACf,KAAK,QAAQ;AAAA,QACb,UAAU,SAAS,MAAM;AAAA,QACzB,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,YAAY,aAAa;AAElC,cAAQ;AAAA,QACN,eAAe,aAAa,oBACpB,SAAS,IAAI,WAAW,MAAM,UAAU,KAAK,QAAQ,QAAQ,OAAO,aAChE,SAAS,MAAM,WAAW,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,aAAa,GAAG;AAAA,MACjG;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,YAAY,UAAU,OAAO,OAAO,SAAS,OAAO,SAAS,cAAc;AAAA,EAC9F;AAAA,EAEQ,aAAa,SAAgG;AACnH,UAAM,OAA2E,CAAC,YAAY;AAC9F,QAAI,QAAQ,SAAS,MAAM,EAAG,MAAK,KAAK,cAAc;AACtD,QAAI,QAAQ,SAAS,KAAK,EAAG,MAAK,KAAK,aAAa;AACpD,QAAI,QAAQ,SAAS,OAAO,EAAG,MAAK,KAAK,WAAW;AACpD,WAAO;AAAA,EACT;AACF;AASO,IAAM,yBAAyB;AAAA;AAAA,EAEpC,eAAsC;AACpC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,CAAC,QAAQ,KAAK;AAAA,MAC5B,YAAY;AAAA;AAAA,MACZ,WAAW;AAAA;AAAA,MACX,WAAW;AAAA;AAAA,MACX,gBAAgB;AAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGA,WAAkC;AAChC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,CAAC,MAAM;AAAA,MACrB,YAAY;AAAA;AAAA,MACZ,WAAW;AAAA;AAAA,MACX,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGA,UAAiC;AAC/B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,CAAC,KAAK;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA;AAAA,IACb;AAAA,EACF;AAAA;AAAA,EAGA,YAAmC;AACjC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,CAAC,OAAO;AAAA,MACtB,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA,EAGA,aAAoC;AAClC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,CAAC,QAAQ,OAAO,OAAO;AAAA,MACrC,YAAY;AAAA;AAAA,MACZ,WAAW;AAAA;AAAA,MACX,WAAW;AAAA;AAAA,MACX,gBAAgB;AAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGA,UAAiC;AAC/B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,CAAC,QAAQ,OAAO,OAAO;AAAA,MACrC,YAAY;AAAA;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB;AAAA,EACF;AACF;;;ACxZO,IAAM,uBAAN,MAAqD;AAAA,EACjD,WAAW;AAAA,EACZ;AAAA,EACA;AAAA,EAER,YAAY,QAA6B;AACvC,SAAK,SAAS;AACd,SAAK,UAAU,OAAO,gBAAgB,eAClC,+BACA;AAAA,EACN;AAAA,EAEA,OAAO,UAA6B;AAElC,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK;AAC3D,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,aAAO,QAAQ,UAAU,CAAC,GAAG,aAAa,SAAS,QAAQ,KAAK;AAAA,IAClE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,KAAa,MAA+B,UAAuC;AAC3F,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK;AAC3D,UAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,UAAM,UAAU,QAAQ,UAAU,CAAC,KAAK,CAAC;AAGzC,UAAM,gBAAgB,MAAM,KAAK,kBAAkB;AAAA,MACjD,OAAO,QAAQ;AAAA,MACf,QAAQ,OAAO,QAAQ,qBAAqB,GAAG;AAAA,MAC/C,OAAO,QAAQ;AAAA,IACjB,CAAC;AAGD,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,iBAAa,IAAI,2BAA2B,KAAK,UAAU,aAAa,CAAC;AACzE,iBAAa,IAAI,qBAAqB,QAAQ;AAC9C,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC;AAAA,EACtD;AAAA;AAAA,EAGA,MAAM,aAA+D;AACnE,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,eAAe,KAAK,OAAO,QAAQ,YAAY;AAAA,MACpF,SAAS,EAAE,eAAe,UAAU,KAAK,OAAO,MAAM,GAAG;AAAA,IAC3D,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,cAAc,gCAAgC,sBAAsB;AAC3F,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAc,kBAAkB,QAA0D;AAExF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,YAAY;AAAA,MAC9B,IAAI,OAAO;AAAA,MACX,OAAO,OAAO,OAAO,SAAS;AAAA,MAC9B,YAAY;AAAA,MACZ,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AAAA,MAC7C,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA;AAAA,MAEnC,WAAW,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,IACjC;AAAA,EACF;AACF;;;AChEO,IAAM,oBAAN,MAAkD;AAAA,EAC9C,WAAW;AAAA,EACZ;AAAA,EAER,YAAY,SAA2B,CAAC,GAAG;AACzC,SAAK,SAAS;AAAA,MACZ,QAAQ,OAAO,UAAU;AAAA,MACzB,aAAa,OAAO,eAAe;AAAA,MACnC,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,OAAO,UAA6B;AAClC,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK;AAC3D,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,YAAM,UAAU,QAAQ,UAAU,CAAC,GAAG,WAAW;AACjD,aAAO,QAAQ,WAAW,SAAS;AAAA,IACrC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,KAAa,MAA+B,UAAuC;AAC3F,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK;AAC3D,UAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,UAAM,UAAU,QAAQ,UAAU,CAAC,KAAK,CAAC;AAEzC,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,YAAM,IAAI,cAAc,6CAA6C,mBAAmB;AAAA,IAC1F;AAGA,UAAM,cAAc,MAAM,KAAK,YAAY;AAAA,MACzC,IAAI,QAAQ;AAAA,MACZ,QAAQ,OAAO,QAAQ,qBAAqB,GAAG;AAAA,MAC/C,MAAM,QAAQ;AAAA,IAChB,CAAC;AAGD,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,iBAAa,IAAI,gBAAgB,WAAW;AAC5C,iBAAa,IAAI,qBAAqB,QAAQ,OAAO;AACrD,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC;AAAA,EACtD;AAAA,EAEA,MAAc,YAAY,QAAuE;AAM/F,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC9DA,SAAS,mBAAiE;AAGnE,IAAM,oCAAoC;AAAA,EAC/C,2BAA2B;AAAA,IACzB,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,IAC9B,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,cAAc,MAAM,UAAU;AAAA,IACtC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,IACvC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,EACnC;AACF;AAwCO,SAAS,wCAAwC,OAA+C;AACrG,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM,MAAM,aAAa;AAAA,MACzB,SAAS,MAAM,gBAAgB;AAAA,MAC/B,SAAS,MAAM;AAAA,MACf,mBAAmB,MAAM;AAAA,IAC3B;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS,MAAM;AAAA,EACjB;AACF;AAGO,SAAS,qBAA0B;AAExC,QAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,aAAW,OAAO,gBAAgB,KAAK;AACvC,MAAI,MAAM;AACV,aAAW,KAAK,MAAO,QAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC5D,SAAO;AACT;AAGO,SAAS,2BAA2B,MAAmD;AAC5F,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,IACT,OAAO,KAAK,MAAM,SAAS;AAAA,IAC3B,YAAY,KAAK,WAAW,SAAS;AAAA,IACrC,aAAa,KAAK,YAAY,SAAS;AAAA,IACvC,OAAO,KAAK;AAAA,EACd;AACF;AAGO,SAAS,2BAA2B,SAAyC;AAClF,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,OAAM,IAAI,MAAM,yCAAyC;AACtG,QAAM,IAAI;AACV,aAAW,KAAK,CAAC,QAAQ,MAAM,SAAS,cAAc,eAAe,OAAO,GAAY;AACtF,QAAI,OAAO,EAAE,CAAC,MAAM,SAAU,OAAM,IAAI,MAAM,iBAAiB,CAAC,mBAAmB;AAAA,EACrF;AACA,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,IAAI,EAAE;AAAA,IACN,OAAO,OAAO,EAAE,KAAe;AAAA,IAC/B,YAAY,OAAO,EAAE,UAAoB;AAAA,IACzC,aAAa,OAAO,EAAE,WAAqB;AAAA,IAC3C,OAAO,EAAE;AAAA,EACX;AACF;AAMO,SAAS,eAAe,WAA+C;AAC5E,MAAI,UAAU,WAAW,IAAK,OAAM,IAAI,MAAM,oCAAoC,UAAU,SAAS,KAAK,CAAC,QAAQ;AACnH,QAAM,IAAI,KAAK,UAAU,MAAM,GAAG,EAAE,CAAC;AACrC,QAAM,IAAI,KAAK,UAAU,MAAM,IAAI,GAAG,CAAC;AACvC,QAAM,IAAI,OAAO,YAAY,KAAK,UAAU,MAAM,KAAK,GAAG,CAAC,EAAS,CAAC;AACrE,SAAO,EAAE,GAAG,GAAG,EAAE;AACnB;AAGO,IAAM,cAAc;AAAA,EACzB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,MAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,MAC9B,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,MACjC,EAAE,MAAM,cAAc,MAAM,UAAU;AAAA,MACtC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,MACvC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,MACjC,EAAE,MAAM,KAAK,MAAM,QAAQ;AAAA,MAC3B,EAAE,MAAM,KAAK,MAAM,UAAU;AAAA,MAC7B,EAAE,MAAM,KAAK,MAAM,UAAU;AAAA,IAC/B;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,cAAc,MAAM,UAAU;AAAA,MACtC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACnC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,EACtC;AACF;;;ACjJA,SAAS,sBAAAC,qBAAoB,QAAAC,aAA0B;AA0BhD,IAAM,mBAAN,MAAiD;AAAA,EAMtD,YACmB,QACA,QACA,UACA,OAAgC,CAAC,GAClD;AAJiB;AACA;AACA;AACA;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EATV,WAAW;AAAA;AAAA,EAGZ,cAAc,oBAAI,IAA+C;AAAA,EASzE,OAAO,UAA6B;AAClC,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB;AACpG,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,YAAM,UAAU,SAAS,UAAU,CAAC,GAAG;AACvC,aAAO,YAAY,OAAO,KAAK,QAAQ,EAAE;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IACJ,KACA,MACA,UACA,KACmB;AACnB,UAAM,eAAe,KAAK,kBAAkB,QAAQ;AACpD,UAAM,QAAQ,OAAO,KAAK,QAAQ;AAClC,UAAM,QAAS,aAAa,SAAS,MAAM,OAAO;AAClD,UAAM,SAAS,OAAO,aAAa,iBAAiB;AAIpD,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW,OAAO,MAAM,OAAO;AACjE,QAAI,UAAU,QAAQ;AACpB,YAAM,IAAI;AAAA,QACR,gBAAgB,KAAK,OAAO,MAAM,IAAI,UAAU,OAAO,UAAU,MAAM;AAAA,QACvE;AAAA,QACA,kBAAkB,MAAM,IAAI,aAAa,MAAM,OAAO;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,YAAY,aAAa,WAAW,YACtC,MAAM,KAAK,aAAa,cAAc,OAAO,QAAQ,MAAM,OAAO,IAClE,MAAM,KAAK,UAAU,cAAc,OAAO,QAAQ,MAAM,OAAO;AAEnE,WAAO,KAAK,eAAe,KAAK,MAAM,WAAW,MAAM,OAAO,GAAG;AAAA,EACnE;AAAA;AAAA,EAIA,MAAc,UACZ,cACA,OACA,QACA,SACwB;AACxB,UAAM,cAAc,MAAM,KAAK,OAAO,gBAAgB,OAAO;AAC7D,UAAM,UAAU;AAAA,MACd,aAAa;AAAA,MACb,QAAQ,aAAa;AAAA,MACrB,SAAS,aAAa;AAAA,MACtB,SAAS,EAAE,MAAM,aAAa,IAAI,aAAa,OAAO,QAAQ,OAAO,SAAS,GAAG,MAAM;AAAA,IACzF;AACA,UAAM,YAAY,MAAM,KAAK,OAAO,OAAO,SAAS,aAAa,GAAG;AACpE,QAAI,CAAC,UAAU,SAAS;AACtB,YAAM,IAAI;AAAA,QACR,kCAAkC,UAAU,iBAAiB,SAAS;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,OAAO,cAAc,aAAa,OAAO,OAAO,QAAQ,OAAO;AAE7F,UAAM,iBAAiB,EAAE,GAAG,SAAS,SAAS,EAAE,GAAG,QAAQ,SAAS,aAAa,OAAO,EAAE;AAC1F,UAAM,YAAY,MAAM,KAAK,OAAO,OAAO,gBAAgB,aAAa,GAAG;AAC3E,QAAI,CAAC,UAAU,SAAS;AACtB,YAAM,IAAI;AAAA,QACR,2BAA2B,MAAM,MAAM,UAAU,eAAe,SAAS;AAAA,QACzE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,UAAU,eAAe,QAAQ,OAAO,UAAU,OAAO,SAAS,UAAU,QAAQ;AAAA,EACvG;AAAA;AAAA,EAIA,MAAc,aACZ,cACA,OACA,QACA,SACwB;AACxB,UAAM,cAAe,MAAM,KAAK,OAAO,gBAAgB,OAAO;AAC9D,UAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,UAAM,gBAAgB;AAAA,MACpB,MAAM;AAAA,MACN,IAAI,aAAa;AAAA,MACjB,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,aAAa,OAAO,MAAM,GAAG;AAAA;AAAA,MAC7B,OAAO,mBAAmB;AAAA,IAC5B;AAIA,UAAM,MAAM,MAAM,KAAK,oBAAoB,OAAO,OAAO;AACzD,UAAM,KAAK,wCAAwC;AAAA,MACjD,mBAAmB;AAAA,MAAO;AAAA,MAAS;AAAA,MACnC,WAAW,IAAI;AAAA,MAAM,cAAc,IAAI;AAAA,IACzC,CAAC;AACD,UAAM,YAAY,MAAM,KAAK,OAAO,cAAc;AAAA,MAChD,QAAQ,GAAG;AAAA,MAAQ,OAAO,GAAG;AAAA,MAAO,aAAa;AAAA,MACjD,SAAS,GAAG;AAAA,IACd,CAAC;AACD,UAAM,UAAU;AAAA,MACd,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,SAAS,aAAa;AAAA,MACtB,SAAS,EAAE,eAAe,2BAA2B,aAAa,GAAG,UAAU;AAAA,IACjF;AAEA,UAAM,YAAY,MAAM,KAAK,OAAO,OAAO,SAAS,aAAa,GAAG;AACpE,QAAI,CAAC,UAAU,SAAS;AACtB,YAAM,IAAI;AAAA,QACR,kCAAkC,UAAU,iBAAiB,SAAS;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AACA,UAAM,YAAY,MAAM,KAAK,OAAO,OAAO,SAAS,aAAa,GAAG;AACpE,QAAI,CAAC,UAAU,SAAS;AACtB,YAAM,IAAI;AAAA,QACR,wBAAwB,UAAU,eAAe,SAAS;AAAA,QAC1D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,UAAU,aAAa;AAC1B,YAAM,IAAI,cAAc,6CAA6C,oBAAoB;AAAA,IAC3F;AACA,WAAO,EAAE,QAAQ,UAAU,aAAa,OAAO,UAAU,SAAS,aAAa,SAAS,UAAU,QAAQ;AAAA,EAC5G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,oBACZ,OACA,SAC4C;AAC5C,UAAM,WAAW,MAAM,YAAY;AACnC,UAAMC,UAAS,KAAK,YAAY,IAAI,QAAQ;AAC5C,QAAIA,QAAQ,QAAOA;AAEnB,QAAI,OAAO,KAAK,KAAK;AACrB,QAAI,UAAU,KAAK,KAAK;AAExB,QAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,YAAM,QAAQ,OAAO,KAAK,QAAQ;AAClC,UAAI;AACF,cAAM,MAAMF,oBAAmB,EAAE,WAAWC,MAAK,MAAM,MAAM,EAAE,CAAC;AAChE,cAAM,YAAY;AAAA,UAChB,EAAE,MAAM,QAAQ,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,SAAS,CAAC,EAAE;AAAA,UACrG,EAAE,MAAM,WAAW,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,SAAS,CAAC,EAAE;AAAA,QAC1G;AACA,YAAI,CAAC,MAAM;AACT,iBAAQ,MAAM,IAAI,aAAa;AAAA,YAC7B,SAAS;AAAA,YAAO,KAAK;AAAA,YAAW,cAAc;AAAA,UAChD,CAAC;AAAA,QACH;AACA,YAAI,CAAC,SAAS;AACZ,cAAI;AACF,sBAAW,MAAM,IAAI,aAAa;AAAA,cAChC,SAAS;AAAA,cAAO,KAAK;AAAA,cAAW,cAAc;AAAA,YAChD,CAAC;AAAA,UACH,QAAQ;AACN,sBAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF,QAAQ;AAEN,eAAO,QAAQ;AACf,kBAAU,WAAW;AAAA,MACvB;AAAA,IACF;AACA,UAAM,WAAW,EAAE,MAAM,QAAQ,YAAY,SAAS,WAAW,IAAI;AACrE,SAAK,YAAY,IAAI,UAAU,QAAQ;AACvC,SAAK;AACL,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAc,eACZ,KACA,MACA,KACA,iBACA,KACmB;AACnB,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,iBAAa,IAAI,gBAAgB,IAAI,MAAM;AAC3C,iBAAa,IAAI,qBAAqB,IAAI,WAAW,eAAe;AACpE,QAAI,IAAI,MAAO,cAAa,IAAI,mBAAmB,IAAI,KAAK;AAC5D,QAAI,KAAK,aAAc,cAAa,IAAI,2BAA2B,IAAI,YAAY;AACnF,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC;AAAA,EACtD;AAAA;AAAA,EAIQ,kBAAkB,UAAwC;AAChE,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB;AACpG,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,oBAAoB,mCAAmC,oBAAoB;AAAA,IACvF;AACA,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,YAAM,UAAU,SAAS,UAAU,CAAC;AACpC,UAAI,CAAC,SAAS,SAAS,CAAC,SAAS,mBAAmB;AAClD,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AACA,aAAO;AAAA,QACL,QAAQ,OAAO,QAAQ,UAAU,OAAO;AAAA,QACxC,SAAS,OAAO,QAAQ,OAAO;AAAA,QAC/B,OAAO,OAAO,QAAQ,SAAS,EAAE;AAAA,QACjC,mBAAmB,OAAO,QAAQ,iBAAiB;AAAA,QACnD,OAAO,OAAO,QAAQ,KAAK;AAAA,QAC3B,KAAK;AAAA,MACP;AAAA,IACF,SAASE,MAAK;AACZ,YAAM,IAAI;AAAA,QACR,0CAA2CA,KAAc,OAAO;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC3RA,SAAS,cAAAC,mBAAkB;AAkBpB,SAAS,eAAe,OAAyB;AACtD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,cAAc;AACzD,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,WAAO,OAAO,KAAK,KAAgC,EAChD,KAAK,EACL,OAAgC,CAAC,KAAK,QAAQ;AAC7C,UAAI,GAAG,IAAI,eAAgB,MAAkC,GAAG,CAAC;AACjE,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACT;AACA,SAAO;AACT;AAiBO,SAAS,iBAAiB,QAAiD;AAChF,QAAM,EAAE,QAAQ,MAAM,OAAO,MAAM,WAAW,UAAU,IAAI;AAC5D,QAAM,YAAY,OAAO,aAAa,KAAK,IAAI,EAAE,SAAS;AAE1D,QAAM,UAAmC;AAAA,IACvC,oBAAoB;AAAA,IACpB,0BAA0B;AAAA,IAC1B,uBAAuB,OAAO,YAAY;AAAA,IAC1C,qBAAqB;AAAA,EACvB;AAEA,MAAI,OAAO;AACT,UAAM,MAAM,IAAI,gBAAgB,KAAK;AACrC,eAAW,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,EAAG,SAAQ,GAAG,IAAI,IAAI,OAAO,GAAG;AAAA,EACtE;AAEA,MAAI,MAAM;AACR,QAAI;AACF,cAAQ,mBAAmB,IAAI,KAAK,MAAM,IAAI;AAAA,IAChD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,UAAU,KAAK,UAAU,eAAe,OAAO,CAAC;AACtD,QAAM,YAAYA,YAAW,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,OAAO,QAAQ;AAEjF,SAAO;AAAA,IACL,oBAAoB;AAAA,IACpB,0BAA0B;AAAA,IAC1B,qBAAqB;AAAA,EACvB;AACF;;;AC3BA,IAAM,mBAAmB;AACzB,IAAM,cAAc;AAEb,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAgC,CAAC,GAAG;AAC9C,SAAK,YAAY,OAAO;AACxB,SAAK,YAAY,OAAO;AACxB,UAAM,QAAQ,OAAO,WAAW,kBAAkB,QAAQ,OAAO,EAAE;AAEnE,SAAK,SAAS,KAAK,SAAS,WAAW,IAAI,KAAK,MAAM,GAAG,CAAC,YAAY,MAAM,IAAI;AAChF,SAAK,YAAY,OAAO,aAAa;AAAA,EACvC;AAAA;AAAA,EAGA,MAAM,eAAgD;AACpD,WAAO,KAAK,QAAgC,OAAO,eAAe;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,OACJ,gBACA,qBAC8B;AAC9B,WAAO,KAAK,QAA6B,QAAQ,cAAc;AAAA,MAC7D,aAAa;AAAA,MACb;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OACJ,gBACA,qBAC8B;AAC9B,WAAO,KAAK,QAA6B,QAAQ,cAAc;AAAA,MAC7D,aAAa;AAAA,MACb;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,QAAW,QAAgB,UAAkB,MAA4B;AACrF,UAAM,WAAW,GAAG,WAAW,GAAG,QAAQ;AAC1C,UAAM,MAAM,GAAG,KAAK,MAAM,GAAG,QAAQ;AACrC,UAAM,UAAU,OAAO,KAAK,UAAU,IAAI,IAAI;AAC9C,UAAM,YAAY,aAAa;AAE/B,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,WAAW;AAIb,UAAI,KAAK,aAAa,KAAK,WAAW;AACpC,eAAO;AAAA,UACL;AAAA,UACA,iBAAiB;AAAA,YACf;AAAA,YACA,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW,KAAK;AAAA,YAChB,WAAW,KAAK;AAAA,UAClB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AACjE,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,SAAS,MAAM,SAAS,QAAQ,WAAW,OAAO,CAAC;AAC1F,YAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC/C,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,SAAS,OAAO,KAAK,iBAAiB,KAAK,eAAe,IAAI,UAAU;AAC9E,cAAM,IAAI;AAAA,UACR,qBAAqB,QAAQ,YAAY,IAAI,MAAM,MAAM,MAAM;AAAA,UAC/D,KAAK,aAAa,IAAI,MAAM;AAAA,UAC5B,KAAK,aAAa,IAAI,MAAM;AAAA,QAC9B;AAAA,MACF;AACA,aAAO;AAAA,IACT,SAASC,MAAK;AACZ,UAAIA,gBAAe,cAAe,OAAMA;AACxC,YAAM,MAAOA,KAAc,SAAS,eAAe,sBAAuBA,KAAc;AACxF,YAAM,IAAI,cAAc,qBAAqB,QAAQ,YAAY,GAAG,IAAI,qBAAqB;AAAA,IAC/F,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,aAAa,QAAwB;AAC3C,QAAI,WAAW,IAAK,QAAO;AAC3B,QAAI,WAAW,IAAK,QAAO;AAC3B,QAAI,WAAW,IAAK,QAAO;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,QAAoC;AACvD,QAAI,WAAW,IAAK,QAAO;AAC3B,QAAI,WAAW,IAAK,QAAO;AAC3B,WAAO;AAAA,EACT;AACF;;;AC7DA,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAC9B,IAAM,2BAA2B;AAOjC,IAAM,wBAA4D,OAAO,OAAO;AAAA,EAC9E,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AACf,CAAC;AAMD,IAAM,uBAAuB;AAAA,EAC3B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,UAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,UAC9B,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,UACjC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,UACjC,EAAE,MAAM,cAAc,MAAM,UAAU;AAAA,UACtC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,UACvC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,UACjC,EAAE,MAAM,KAAK,MAAM,QAAQ;AAAA,UAC3B,EAAE,MAAM,KAAK,MAAM,UAAU;AAAA,UAC7B,EAAE,MAAM,KAAK,MAAM,UAAU;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,EAAE,MAAM,aAAa,MAAM,UAAU;AAAA,MACrC,EAAE,MAAM,SAAS,MAAM,OAAO;AAAA,IAChC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,UAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,UAC9B,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,UACjC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,UACjC,EAAE,MAAM,cAAc,MAAM,UAAU;AAAA,UACtC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,UACvC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,UACjC,EAAE,MAAM,KAAK,MAAM,QAAQ;AAAA,UAC3B,EAAE,MAAM,KAAK,MAAM,UAAU;AAAA,UAC7B,EAAE,MAAM,KAAK,MAAM,UAAU;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,IAC3C,SAAS,CAAC;AAAA,EACZ;AACF;AAmBO,IAAM,mBAAN,MAAiD;AAAA,EAGtD,YACmB,QACA,UACA,UAIb,CAAC,GACL;AAPiB;AACA;AACA;AAAA,EAKhB;AAAA,EAPgB;AAAA,EACA;AAAA,EACA;AAAA,EALV,WAAW;AAAA,EAYpB,OAAO,UAA6B;AAClC,QAAI,SAAS,WAAW,IAAK,QAAO;AACpC,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB;AACpG,QAAI,CAAC,QAAQ;AAGX,aAAO;AAAA,IACT;AACA,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,YAAM,UAAU,SAAS,UAAU,CAAC,GAAG;AACvC,UAAI,CAAC,QAAS,QAAO;AACrB,YAAM,SAAS,sBAAsB,OAAO;AAC5C,aAAO,WAAW,KAAK,YAAY,YAAY,OAAO,KAAK,QAAQ,EAAE;AAAA,IACvE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,KAAa,MAA+B,UAAuC;AAC3F,UAAM,YAAY,MAAM,KAAK,cAAc,QAAQ;AACnD,UAAM,QAAQ,OAAO,KAAK,QAAQ;AAGlC,UAAM,UAAU,KAAK,OAAO,WAAW;AACvC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW,UAAU,OAAO,MAAM,OAAO;AAC3E,QAAI,UAAU,UAAU,QAAQ;AAC9B,YAAM,IAAI;AAAA,QACR,gBAAgB,UAAU,KAAK,OAAO,MAAM,IAAI,UAAU,OAAO,UAAU,UAAU,MAAM;AAAA,QAC3F;AAAA,QACA,kBAAkB,MAAM,IAAI,aAAa,MAAM,OAAO;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,aAAa;AACnB,UAAM,cAAc;AAAA,MAClB,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,KACzB,KAAK,QAAQ,yBAAyB;AAAA,IAC3C;AACA,UAAM,QAAQ,mBAAmB;AACjC,UAAM,gBAAgB;AAAA,MACpB,MAAM,QAAQ;AAAA,MACd,IAAI,UAAU;AAAA,MACd,OAAO,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,KAAK,wCAAwC;AAAA,MACjD,mBAAmB,UAAU;AAAA,MAC7B,SAAS,UAAU,WAAW,MAAM;AAAA,MACpC,WAAW,KAAK,QAAQ,aAAa;AAAA,MACrC,cAAc,KAAK,QAAQ,gBAAgB;AAAA,MAC3C;AAAA,IACF,CAAC;AACD,UAAM,YAAY,MAAM,QAAQ,cAAc;AAAA,MAC5C,QAAQ,GAAG;AAAA,MACX,OAAO,GAAG;AAAA,MACV,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AACD,UAAM,EAAE,GAAG,GAAG,EAAE,IAAI,eAAe,SAAS;AAE5C,UAAM,UAA4B;AAAA,MAChC,MAAM,QAAQ;AAAA,MACd,IAAI,UAAU;AAAA,MACd,OAAO,UAAU;AAAA,MACjB,OAAO,UAAU,OAAO,SAAS;AAAA,MACjC,YAAY,WAAW,SAAS;AAAA,MAChC,aAAa,YAAY,SAAS;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,iBAAiB,OAAO,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,SAAS,QAAQ;AAC7E,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,iBAAa,IAAI,aAAa,cAAc;AAC5C,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,aAAa,CAAC;AAAA,EACtD;AAAA;AAAA,EAGA,MAAc,cAAc,UAAmD;AAC7E,UAAM,YAAY,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB;AACvG,QAAI,WAAW;AACb,UAAI;AACF,cAAM,UAAU,KAAK,MAAM,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,CAAC;AACtE,eAAO,aAAa,OAAO;AAAA,MAC7B,SAASC,MAAK;AACZ,cAAM,IAAI;AAAA,UACR,4CAA6CA,KAAc,OAAO;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,MAAM,EAAE,KAAK;AACzC,aAAO,aAAa,IAAI;AAAA,IAC1B,SAASA,MAAK;AACZ,YAAM,IAAI;AAAA,QACR,wFAAyFA,KAAc,OAAO;AAAA,QAC9G;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,SAAwC;AAC5D,QAAM,SAAU,SAA0D,UAAU,CAAC;AACrF,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,oBAAoB,6CAA6C,uBAAuB;AAAA,EACpG;AACA,QAAM,QAAS,OAAO,SAAS,CAAC;AAChC,QAAM,QAAS,MAAM,gBAAgB,OAAO;AAC5C,QAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MAAO,OAAM,IAAI,oBAAoB,8CAA8C,qBAAqB;AAC7G,MAAI,CAAC,MAAO,OAAM,IAAI,oBAAoB,2BAA2B,sBAAsB;AAC3F,QAAM,SAAS,OAAO,OAAO,OAAO,qBAAqB,GAAG,CAAC;AAC7D,MAAI,WAAW,GAAI,OAAM,IAAI,oBAAoB,oCAAoC,wBAAwB;AAC7G,SAAO;AAAA,IACL,QAAQ,OAAO,OAAO,UAAU,OAAO;AAAA,IACvC,SAAS,OAAO,OAAO,WAAW,EAAE;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,MAAM;AAAA,IAC1B,SAAS,MAAM;AAAA,EACjB;AACF;AAaA,eAAsB,yBACpB,QACgC;AAChC,QAAM,EAAE,cAAc,cAAc,oBAAoB,QAAQ,IAAI;AACpE,QAAM,QAAQ,eAAe,OAAO;AAEpC,QAAM,WAAY,MAAM,aAAa,aAAa;AAAA,IAChD,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,KAAK;AAAA,EACd,CAAC;AACD,QAAM,CAAC,WAAW,KAAK,IAAI;AAC3B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,gEAAgE,SAAS;AAAA,MACzE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAU,MAAM,aAAa,cAAc;AAAA,IAC/C,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,KAAK;AAAA,IACZ,SAAS,aAAa,WAAW;AAAA,IACjC,OAAO,aAAa,SAAS;AAAA,EAC/B,CAAU;AACV,QAAM,UAAU,MAAM,aAAa,0BAA0B;AAAA,IAC3D,MAAM;AAAA,IACN,SAAS,OAAO,oBAAoB;AAAA,EACtC,CAAC;AACD,MAAI,QAAQ,WAAW,WAAW;AAChC,UAAM,IAAI;AAAA,MACR,oCAAoC,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,iBAAiB,QAAQ,SAAS,KAAK;AAC7D;AAEA,SAAS,eAAe,GAAqB;AAC3C,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,OAAO,OAAO,EAAE,KAAK;AAAA,IACrB,YAAY,OAAO,EAAE,UAAU;AAAA,IAC/B,aAAa,OAAO,EAAE,WAAW;AAAA,IACjC,OAAO,EAAE;AAAA,IACT,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,EACP;AACF;AAGO,SAAS,sBAAsBC,cAAuC;AAC3E,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,OAAO,KAAKA,cAAa,QAAQ,EAAE,SAAS,CAAC;AAAA,EAChE,SAASD,MAAK;AACZ,UAAM,IAAI;AAAA,MACR,+BAAgCA,KAAc,OAAO;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM;AACZ,aAAW,KAAK,CAAC,QAAQ,MAAM,SAAS,SAAS,cAAc,eAAe,OAAO,GAAY;AAC/F,QAAI,OAAO,IAAI,CAAC,MAAM,UAAU;AAC9B,YAAM,IAAI,oBAAoB,oCAAoC,CAAC,IAAI,0BAA0B;AAAA,IACnG;AAAA,EACF;AACA,MAAI,OAAO,IAAI,MAAM,UAAU;AAC7B,UAAM,IAAI,oBAAoB,sCAAsC,0BAA0B;AAAA,EAChG;AACA,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX,YAAY,IAAI;AAAA,IAChB,aAAa,IAAI;AAAA,IACjB,OAAO,IAAI;AAAA,IACX,GAAG,IAAI;AAAA,IACP,GAAG,IAAI;AAAA,IACP,GAAG,IAAI;AAAA,EACT;AACF;AAaA,eAAsB,yBACpB,QACgC;AAChC,QAAM,EAAE,cAAc,cAAc,UAAU,UAAU,IAAI;AAC5D,QAAM,SAAS,OAAO,UAAU;AAEhC,QAAM,gBAAgB,MAAM,aAAa,eAAe;AAAA,IACtD,KAAK,UAAU,UAAU;AAAA,IACzB,UAAU,UAAU,UAAU;AAAA,IAC9B,SAAS,aAAa,WAAW;AAAA,IACjC,OAAO,aAAa,SAAS;AAAA,EAC/B,CAAU;AACV,QAAM,mBAAmB,MAAM,aAAa,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC7F,MAAI,CAAC,iBAAiB,iBAAiB;AACrC,UAAM,IAAI,cAAc,mDAAmD,0BAA0B;AAAA,EACvG;AACA,QAAM,mBAAmB,iBAAiB;AAE1C,QAAM,WAAW,MAAM,aAAa,eAAe;AAAA,IACjD,KAAK,UAAU,gBAAgB;AAAA,IAC/B,UAAU,UAAU,gBAAgB;AAAA,IACpC,MAAM,CAAC,UAAU,OAAO,MAAM,CAAC;AAAA,IAC/B,SAAS,aAAa,WAAW;AAAA,IACjC,OAAO,aAAa,SAAS;AAAA,EAC/B,CAAU;AACV,QAAM,cAAc,MAAM,aAAa,0BAA0B,EAAE,MAAM,SAAS,CAAC;AACnF,MAAI,CAAC,YAAY,iBAAiB;AAChC,UAAM,IAAI,cAAc,yDAAyD,0BAA0B;AAAA,EAC7G;AACA,QAAM,yBAAyB,YAAY;AAG3C,QAAM,eAAe,MAAM,aAAa,cAAc;AAAA,IACpD,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,gBAAgB;AAAA,IACvB,SAAS,aAAa,WAAW;AAAA,IACjC,OAAO,aAAa,SAAS;AAAA,EAC/B,CAAU;AACV,QAAM,aAAa,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEnE,SAAO,EAAE,kBAAkB,uBAAuB;AACpD;AASO,SAAS,wBAAwB,OAS7B;AACT,QAAM,YAAY;AAAA,IAChB,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,MAAM,WAAW;AAAA,QAC1B,mBAAmB,MAAM;AAAA,QACzB,UAAU,MAAM,YAAY;AAAA,QAC5B,aAAa,MAAM,eAAe;AAAA,QAClC,UAAU;AAAA,QACV,OAAO,MAAM;AAAA,QACb,mBAAmB;AAAA,QACnB,OAAO,MAAM;AAAA,QACb,OAAO;AAAA,UACL,cAAc,MAAM;AAAA,UACpB,oBAAoB,MAAM;AAAA,UAC1B,SAAS,MAAM,WAAW;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,KAAK,KAAK,UAAU,SAAS,CAAC,EAAE,SAAS,QAAQ;AACjE;;;AC7bO,IAAM,eAAN,MAAM,cAAa;AAAA,EAChB,QAAsB,CAAC;AAAA,EACvB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,YAAY,KAAK,IAAI,IAAI;AAAA,EACzB,WAAW,KAAK,IAAI,IAAI;AAAA,EACxB,gBAA0B,CAAC;AAAA;AAAA,EAE3B,cAAc;AAAA,EACd,aAAa;AAAA,EACb,iBAAiB,KAAK,IAAI,IAAI;AAAA,EAC9B,gBAAgB,KAAK,IAAI,IAAI;AAAA,EAErC,YAAY,QAAsB,CAAC,GAAG;AACpC,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAO,WAAW,QAAoC;AACpD,UAAM,QAAsB,CAAC;AAC7B,QAAI,OAAO,qBAAqB,OAAO,cAAc,OAAO,WAAW;AACrE,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,UACN,mBAAmB,OAAO,qBAAqB;AAAA,UAC/C,YAAY,OAAO,cAAc;AAAA,UACjC,WAAW,OAAO,aAAa;AAAA,QACjC;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,OAAO,WAAW;AACpB,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH;AACA,QAAI,OAAO,WAAW,QAAQ;AAC5B,YAAM,KAAK,EAAE,IAAI,aAAa,MAAM,aAAa,OAAO,UAAU,QAAQ,EAAE,WAAW,OAAO,UAAU,EAAE,CAAC;AAAA,IAC7G;AACA,QAAI,OAAO,WAAW,QAAQ;AAC5B,YAAM,KAAK,EAAE,IAAI,aAAa,MAAM,aAAa,OAAO,UAAU,QAAQ,EAAE,WAAW,OAAO,UAAU,EAAE,CAAC;AAAA,IAC7G;AACA,QAAI,OAAO,uBAAuB,OAAO,oBAAoB;AAC3D,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,UACN,iBAAiB,OAAO,uBAAwB,MAAM;AAAA,UACtD,gBAAgB,OAAO,sBAAuB,MAAM;AAAA,QACtD;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,OAAO,gBAAgB,UAAU,OAAO,gBAAgB,QAAQ;AAClE,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ,EAAE,gBAAgB,OAAO,gBAAgB,gBAAgB,OAAO,eAAe;AAAA,MACzF,CAAC;AAAA,IACH;AACA,WAAO,IAAI,cAAa,KAAK;AAAA,EAC/B;AAAA,EAEA,SAAS,SAAyC;AAChD,UAAM,MAAM,KAAK,IAAI;AAErB,QAAI,MAAM,KAAK,WAAW;AAAE,WAAK,cAAc;AAAI,WAAK,YAAY,MAAM;AAAA,IAAU;AACpF,QAAI,MAAM,KAAK,UAAU;AAAE,WAAK,aAAa;AAAI,WAAK,WAAW,MAAM;AAAA,IAAW;AAClF,QAAI,MAAM,KAAK,gBAAgB;AAAE,WAAK,cAAc;AAAI,WAAK,iBAAiB,MAAM;AAAA,IAAU;AAC9F,QAAI,MAAM,KAAK,eAAe;AAAE,WAAK,aAAa;AAAI,WAAK,gBAAgB,MAAM;AAAA,IAAW;AAE5F,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,WAAW,KAAK,aAAa,MAAM,SAAS,GAAG;AACrD,UAAI,CAAC,SAAS,QAAS,QAAO;AAAA,IAChC;AACA,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AAAA,EAEA,YAAY,QAAsB;AAChC,SAAK,eAAe;AACpB,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA,EAGA,gBAAgB,OAAqB;AACnC,SAAK,eAAe;AACpB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,aAAa,MAAkB,SAAyB,KAA6B;AAC3F,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK,kBAAkB;AACrB,cAAM,MAAM,KAAK;AACjB,YAAI,QAAQ,SAAS,IAAI;AACvB,iBAAO,EAAE,SAAS,OAAO,QAAQ,uBAAuB,IAAI,iBAAiB,IAAI,QAAQ,KAAK,GAAG;AACnG,YAAI,KAAK,cAAc,QAAQ,SAAS,IAAI;AAC1C,iBAAO,EAAE,SAAS,OAAO,QAAQ,iCAAiC,QAAQ,KAAK,GAAG;AACpF,YAAI,KAAK,aAAa,QAAQ,SAAS,IAAI;AACzC,iBAAO,EAAE,SAAS,OAAO,QAAQ,gCAAgC,QAAQ,KAAK,GAAG;AACnF,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AAAA,MACA,KAAK,cAAc;AACjB,cAAM,MAAM,KAAK;AACjB,aAAK,gBAAgB,KAAK,cAAc,OAAO,OAAK,MAAM,IAAI,IAAI,QAAQ;AAC1E,YAAI,KAAK,cAAc,UAAU,IAAI;AACnC,iBAAO,EAAE,SAAS,OAAO,QAAQ,uBAAuB,QAAQ,KAAK,GAAG;AAC1E,aAAK,cAAc,KAAK,GAAG;AAC3B,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,MAAM,KAAK;AACjB,YAAI,QAAQ,aAAa,IAAI,UAAU,SAAS,QAAQ,SAAS;AAC/D,iBAAO,EAAE,SAAS,OAAO,QAAQ,sBAAsB,QAAQ,SAAS,IAAI,QAAQ,KAAK,GAAG;AAC9F,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,MAAM,KAAK;AACjB,YAAI,QAAQ,aAAa,CAAC,IAAI,UAAU,SAAS,QAAQ,SAAS;AAChE,iBAAO,EAAE,SAAS,OAAO,QAAQ,8BAA8B,QAAQ,KAAK,GAAG;AACjF,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AAAA,MACA,KAAK,mBAAmB;AACtB,cAAM,MAAM,KAAK;AACjB,cAAM,QAAQ,QAAQ,eAAe;AACrC,YAAI,KAAK,cAAc,QAAQ,IAAI;AACjC,iBAAO,EAAE,SAAS,OAAO,QAAQ,kCAAkC,QAAQ,KAAK,GAAG;AACrF,YAAI,KAAK,aAAa,QAAQ,IAAI;AAChC,iBAAO,EAAE,SAAS,OAAO,QAAQ,iCAAiC,QAAQ,KAAK,GAAG;AACpF,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AAAA,MACA,KAAK,iBAAiB;AACpB,cAAM,MAAM,KAAK;AACjB,YAAI,IAAI,gBAAgB,UAAU,QAAQ,UAAU,CAAC,IAAI,eAAe,SAAS,QAAQ,MAAM;AAC7F,iBAAO,EAAE,SAAS,OAAO,QAAQ,uBAAuB,QAAQ,MAAM,IAAI,QAAQ,KAAK,GAAG;AAC5F,YAAI,IAAI,gBAAgB,UAAU,QAAQ,UAAU,CAAC,IAAI,eAAe,SAAS,QAAQ,MAAM;AAC7F,iBAAO,EAAE,SAAS,OAAO,QAAQ,wBAAwB,QAAQ,MAAM,IAAI,QAAQ,KAAK,GAAG;AAC7F,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AAAA,MACA;AACE,eAAO,EAAE,SAAS,KAAK;AAAA,IAC3B;AAAA,EACF;AACF;AAIO,IAAM,WAAN,MAAe;AAAA,EACZ,UAAwB,CAAC;AAAA,EAEjC,OAAO,OAAyD;AAC9D,UAAM,OAAmB;AAAA,MACvB,GAAG;AAAA,MACH,IAAI,SAAS,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAC9E,WAAW,KAAK,IAAI;AAAA,IACtB;AACA,SAAK,QAAQ,KAAK,IAAI;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAsE;AAC1E,WAAO,KAAK,QAAQ,OAAO,OAAK;AAC9B,UAAI,QAAQ,QAAQ,EAAE,SAAS,OAAO,KAAM,QAAO;AACnD,UAAI,QAAQ,QAAQ,EAAE,YAAY,OAAO,KAAM,QAAO;AACtD,UAAI,QAAQ,MAAM,EAAE,YAAY,OAAO,GAAI,QAAO;AAClD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBAAoB,cAAoC;AACtD,WAAO,KAAK,QAAQ,OAAO,OAAK,EAAE,iBAAiB,YAAY;AAAA,EACjE;AAAA,EAEA,mBAAmB,WAAW,OAA6C;AACzE,UAAM,QAAQ,KAAK,IAAI,IAAI;AAC3B,UAAM,WAAW,KAAK,QAAQ,OAAO,OAAK,EAAE,SAAS,aAAa,EAAE,aAAa,KAAK;AACtF,UAAM,QAAQ,SAAS,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,UAAU,KAAK,EAAE;AACpE,WAAO,EAAE,OAAO,OAAO,SAAS,OAAO;AAAA,EACzC;AAAA,EAEA,SAAuB;AACrB,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AACF;AAIO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YACU,QACA,OACR;AAFQ;AACA;AAAA,EACP;AAAA,EAFO;AAAA,EACA;AAAA,EAGV,MAAM,SAAyC;AAC7C,UAAM,WAAW,KAAK,OAAO,SAAS,OAAO;AAC7C,SAAK,MAAM,OAAO,EAAE,MAAM,gBAAgB,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,OAAO,KAAK,QAAQ,KAAK,SAAS,CAAC;AACpH,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,SAA+B;AAC3C,SAAK,OAAO,YAAY,QAAQ,MAAM;AACtC,SAAK,MAAM,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,MAAM,QAAQ;AAAA,MACd,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,MAClB,UAAU,EAAE,SAAS,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eAAe,SAAyC;AACtD,UAAM,WAAW,KAAK,OAAO,SAAS,OAAO;AAC7C,SAAK,MAAM,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,gBAAgB,SAA+B;AAC7C,QAAI,QAAQ,YAAa,MAAK,OAAO,gBAAgB,QAAQ,WAAW;AACxE,SAAK,MAAM,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,MAClB,UAAU,EAAE,SAAS,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,eAAuB,MAAmE;AACzG,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,QAAQ,KAAK,MAAM,MAAM,EAAE,MAAM,eAAe,MAAM,MAAM,MAAU,CAAC;AAC7E,UAAM,SAAS,MACZ,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM,QAAY,EAAE,SAAS,OAAO,EACjE,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,UAAU,KAAK,EAAE;AAC5C,UAAM,QAAQ,MACX,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAChC,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,UAAU,KAAK,EAAE;AAC5C,QAAI,KAAK,eAAe,UAAa,SAAS,gBAAgB,KAAK,YAAY;AAC7E,aAAO,EAAE,SAAS,OAAO,QAAQ,qCAAqC,MAAM,IAAI,aAAa,MAAM,KAAK,UAAU,KAAK,QAAQ,cAAc;AAAA,IAC/I;AACA,QAAI,KAAK,cAAc,UAAa,QAAQ,gBAAgB,KAAK,WAAW;AAC1E,aAAO,EAAE,SAAS,OAAO,QAAQ,oCAAoC,KAAK,IAAI,aAAa,MAAM,KAAK,SAAS,KAAK,QAAQ,cAAc;AAAA,IAC5I;AACA,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AAAA;AAAA,EAGA,kBAAkB,OAQT;AACP,SAAK,MAAM,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM;AAAA,MACb,UAAU,EAAE,SAAS,KAAK;AAAA,MAC1B,iBAAiB,MAAM;AAAA,MACvB,gBAAgB,MAAM;AAAA,MACtB,qBAAqB,MAAM;AAAA,MAC3B,mBAAmB,MAAM;AAAA,MACzB,cAAc,MAAM;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,WAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;;;AC9YO,IAAM,gBAAyC;AAAA,EACpD,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,aAAa;AACf;AAEO,IAAM,sBAA+C;AAAA,EAC1D,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,YAAY;AACd;AAEO,IAAM,mBAA4C;AAAA,EACvD,YAAY;AACd;AAoBO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,gBAAqC;AACnC,WAAO,cAAc,KAAK,QAAQ;AAAA,EACpC;AAAA,EAEA,iBAAsC;AACpC,WAAO,oBAAoB,KAAK,QAAQ;AAAA,EAC1C;AAAA,EAEA,wBAA6C;AAC3C,WAAO,iBAAiB,KAAK,QAAQ;AAAA,EACvC;AAAA;AAAA,EAGA,cAAuB;AACrB,WAAO,CAAC,CAAC,oBAAoB,KAAK,QAAQ;AAAA,EAC5C;AACF;;;ACtDA,IAAM,WAAW;AAAA,EACf,EAAE,MAAM,UAAU,MAAM,YAAY,iBAAiB,cAAc,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,MAAM,UAAU,GAAG,EAAE,MAAM,cAAc,MAAM,UAAU,GAAG,EAAE,MAAM,gBAAgB,MAAM,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,EACrP,EAAE,MAAM,YAAY,MAAM,YAAY,iBAAiB,cAAc,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,MAAM,UAAU,GAAG,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAC1N;AAQO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAoB,QAAoB,UAAkB;AAAtC;AAClB,SAAK,SAAS,IAAI,WAAW,QAAQ;AACrC,SAAK,UAAU,OAAO,kBAAkB;AAAA,EAC1C;AAAA,EAHoB;AAAA,EAJZ,QAAoB,EAAE,UAAU,IAAI,aAAa,IAAI,aAAa,EAAE;AAAA,EACpE;AAAA,EACA;AAAA;AAAA,EAQR,cAAc,OAAgB,QAAgB,YAAqB;AACjE,UAAM,OAAO,KAAK,OAAO,eAAe;AACxC,QAAI,CAAC,KAAM,OAAM,IAAI,cAAc,oCAAoC,kBAAkB;AACzF,WAAO,EAAE,IAAI,MAAM,KAAK,UAAU,cAAc,UAAmB,MAAM,CAAC,OAAO,QAAQ,YAAY,CAAC,EAAE;AAAA,EAC1G;AAAA;AAAA,EAGA,gBAAgB,OAAgB,QAAgB,IAAa;AAC3D,UAAM,OAAO,KAAK,OAAO,eAAe;AACxC,QAAI,CAAC,KAAM,OAAM,IAAI,cAAc,oCAAoC,kBAAkB;AACzF,WAAO,EAAE,IAAI,MAAM,KAAK,UAAU,cAAc,YAAqB,MAAM,CAAC,OAAO,QAAQ,EAAE,EAAE;AAAA,EACjG;AAAA;AAAA,EAGA,qBAAqB,gBAAgC;AACnD,QAAI,kBAAkB,KAAK,QAAS,QAAO;AAC3C,WAAO,iBAAiB,KAAK;AAAA,EAC/B;AAAA;AAAA,EAGA,wBAAwB,gBAAwB,eAA+B;AAC7E,QAAI,kBAAkB,cAAe,QAAO;AAC5C,WAAO,gBAAgB;AAAA,EACzB;AAAA,EAEA,aAAa,QAAsB;AACjC,SAAK,MAAM,YAAY;AACvB,SAAK,MAAM,cAAc,KAAK,IAAI;AAAA,EACpC;AAAA,EAEA,eAAe,QAAsB;AACnC,SAAK,MAAM,WAAW,KAAK,MAAM,WAAW,SAAS,KAAK,MAAM,WAAW,SAAS;AAAA,EACtF;AAAA,EAEA,WAAuB;AAAE,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EAAG;AAAA,EACnD,YAAqB;AAAE,WAAO,KAAK,OAAO,cAAc,QAAQ,KAAK,OAAO,YAAY;AAAA,EAAG;AAC7F;;;AC1DA,IAAM,mBAAmB;AAAA,EACvB,QAAQ;AAAA,IACN,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,IACnC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,EACtC;AACF;AAGA,IAAM,UAAU;AAAA,EACd,EAAE,MAAM,aAAa,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAAA,EAC/I,EAAE,MAAM,UAAU,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAAA,EAC1I,EAAE,MAAM,YAAY,MAAM,YAAY,iBAAiB,cAAc,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE;AACnL;AAGA,IAAM,mBAAmB;AAAA,EACvB,EAAE,MAAM,aAAa,MAAM,YAAY,iBAAiB,cAAc,QAAQ,CAAC,EAAE,MAAM,YAAY,MAAM,UAAU,GAAG,EAAE,MAAM,SAAS,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,MAAM,UAAU,GAAG,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,EAC7P,EAAE,MAAM,gBAAgB,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAAA,EAChJ,EAAE,MAAM,UAAU,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAC1G;AAEO,IAAM,aAAN,MAAiB;AAAA,EAGtB,YAAoB,QAA4B,UAAkB;AAA9C;AAA4B;AAC9C,SAAK,SAAS,IAAI,WAAW,QAAQ;AAAA,EACvC;AAAA,EAFoB;AAAA,EAA4B;AAAA,EAFxC;AAAA,EAMR,gBAAyB;AACvB,UAAM,OAAO,KAAK,OAAO,cAAc;AACvC,QAAI,CAAC,KAAM,OAAM,IAAI,cAAc,wBAAwB,KAAK,QAAQ,IAAI,iBAAiB;AAC7F,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,qBAAqB,OAAgB,SAAkB,OAAe,OAAe,UAAkB,SAAiB;AACtH,WAAO;AAAA,MACL,QAAQ,EAAE,MAAM,aAAa,SAAS,KAAK,SAAS,mBAAmB,KAAK,cAAc,EAAE;AAAA,MAC5F,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS,EAAE,OAAO,SAAS,OAAO,OAAO,SAAS;AAAA,IACpD;AAAA,EACF;AAAA;AAAA,EAGA,gBAAgB,IAAa,QAAgB;AAC3C,WAAO,EAAE,IAAI,KAAK,cAAc,GAAG,KAAK,SAAS,cAAc,YAAqB,MAAM,CAAC,IAAI,MAAM,EAAE;AAAA,EACzG;AAAA;AAAA,EAGA,wBAA6C;AAC3C,WAAO,iBAAiB,KAAK,QAAQ;AAAA,EACvC;AAAA,EAEA,oBAAoB;AAAE,WAAO;AAAA,EAAkB;AAAA,EAC/C,YAAY;AAAE,WAAO;AAAA,EAAS;AAAA,EAC9B,cAAuB;AAAE,WAAO,CAAC,CAAC,KAAK,OAAO,cAAc;AAAA,EAAG;AAAA,EAC/D,YAAqB;AAAE,WAAO,KAAK,OAAO,cAAc,QAAQ,KAAK,YAAY;AAAA,EAAG;AACtF;;;AC/DA,IAAME,aAAY;AAAA,EAChB,EAAE,MAAM,WAAW,MAAM,YAAY,iBAAiB,cAAc,QAAQ,CAAC,EAAE,MAAM,UAAU,MAAM,UAAU,GAAG,EAAE,MAAM,YAAY,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAAA,EACzL,EAAE,MAAM,YAAY,MAAM,YAAY,iBAAiB,cAAc,QAAQ,CAAC,EAAE,MAAM,UAAU,MAAM,UAAU,GAAG,EAAE,MAAM,YAAY,MAAM,UAAU,GAAG,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAAA,EAC9N,EAAE,MAAM,eAAe,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAAA,EAC7G,EAAE,MAAM,mBAAmB,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,EAAE,MAAM,UAAU,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAAA,EACpJ,EAAE,MAAM,mBAAmB,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,EAAE,MAAM,UAAU,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AACtJ;AAaO,IAAM,eAAN,MAAmB;AAAA,EAGxB,YAAoB,QAAqB;AAArB;AAClB,QAAI,OAAO,aAAa,IAAI;AAC1B,YAAM,IAAI,cAAc,+CAA+C,mBAAmB;AAAA,IAC5F;AAAA,EACF;AAAA,EAJoB;AAAA,EAFZ,QAAoB,EAAE,gBAAgB,IAAI,eAAe,GAAG;AAAA;AAAA,EASpE,eAAe,OAAgB,QAAgB,UAAmB;AAChE,WAAO,EAAE,IAAI,OAAO,KAAKA,YAAW,cAAc,WAAoB,MAAM,CAAC,QAAQ,QAAQ,EAAE;AAAA,EACjG;AAAA;AAAA,EAGA,gBAAgB,OAAgB,QAAgB,UAAmB,OAAgB;AACjF,WAAO,EAAE,IAAI,OAAO,KAAKA,YAAW,cAAc,YAAqB,MAAM,CAAC,QAAQ,UAAU,KAAK,EAAE;AAAA,EACzG;AAAA,EAEA,cAAc,QAAsB;AAAE,SAAK,MAAM,kBAAkB;AAAA,EAAQ;AAAA,EAC3E,eAAe,QAAsB;AAAE,SAAK,MAAM,kBAAkB;AAAA,EAAQ;AAAA,EAC5E,UAAU,QAAsB;AAAE,SAAK,MAAM,iBAAiB;AAAA,EAAQ;AAAA,EAEtE,gBAAgB,MAAqB;AAAE,SAAK,MAAM,UAAU;AAAA,EAAM;AAAA,EAClE,WAAuB;AAAE,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EAAG;AAAA,EACnD,cAAc;AAAE,WAAOA;AAAA,EAAW;AAAA,EAClC,YAAqB;AAAE,WAAO,KAAK,OAAO;AAAA,EAAS;AACrD;;;AC/BO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAAoB,YAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAFZ,UAA0B,CAAC;AAAA,EAInC,WAAW,WAAoB,QAAsB;AACnD,QAAI,UAAU,GAAI,OAAM,IAAI,cAAc,8BAA8B,sBAAsB;AAC9F,SAAK,QAAQ,KAAK,EAAE,WAAW,OAAO,CAAC;AAAA,EACzC;AAAA,EAEA,kBAA0B;AAAE,WAAO,KAAK,QAAQ;AAAA,EAAQ;AAAA,EACxD,kBAA0B;AAAE,WAAO,KAAK,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,EAAE;AAAA,EAAG;AAAA;AAAA,EAGxF,aAAa,kBAA6C;AACxD,QAAI,CAAC,KAAK,QAAQ,OAAQ,OAAM,IAAI,cAAc,gCAAgC,aAAa;AAC/F,UAAM,cAAc,KAAK,WAAW,sBAAsB;AAC1D,QAAI,CAAC,YAAa,OAAM,IAAI,cAAc,gDAAgD,mBAAmB;AAE7G,UAAM,QAAQ,KAAK,gBAAgB;AACnC,UAAM,UAAU,KAAK,WAAW,cAAc;AAE9C,UAAM,OAAO,KAAK,eAAe;AAEjC,UAAM,SAA2B;AAAA,MAC/B,aAAa;AAAA,MACb,cAAc,KAAK,QAAQ;AAAA,MAC3B,QAAQ;AAAA,QACN,IAAI;AAAA,QACJ,KAAK,KAAK,WAAW,kBAAkB;AAAA,QACvC,cAAc;AAAA,QACd,MAAM,CAAC,kBAAkB,SAAS,OAAO,IAAI;AAAA,MAC/C;AAAA,IACF;AAEA,SAAK,UAAU,CAAC;AAChB,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,iBAAgC;AAEtC,UAAM,QAAQ,KAAK,QAAQ;AAAA,MAAI,OAC7B,EAAE,UAAU,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG,IAAI,EAAE,OAAO,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAAA,IACjF;AACA,WAAO,KAAK,MAAM,KAAK,EAAE,CAAC;AAAA,EAC5B;AAAA,EAEA,QAAc;AAAE,SAAK,UAAU,CAAC;AAAA,EAAG;AACrC;;;AC/DA,IAAM,iBAAiB;AAAA,EACrB,EAAE,MAAM,qBAAqB,MAAM,YAAY,iBAAiB,cAAc,QAAQ,CAAC,EAAE,MAAM,aAAa,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,EACjL,EAAE,MAAM,mBAAmB,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,CAAC,EAAE,MAAM,YAAY,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,EAAE;AAC7L;AAaO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAFZ,cAAc,oBAAI,IAAwB;AAAA;AAAA,EAKlD,gBAAgB,WAAoB,WAAoB,QAAgB;AACtE,WAAO,EAAE,IAAI,WAAW,KAAK,gBAAgB,cAAc,qBAA8B,MAAM,CAAC,WAAW,MAAM,EAAE;AAAA,EACrH;AAAA;AAAA,EAGA,cAAc,WAAoB,WAAoB;AACpD,WAAO,KAAK,gBAAgB,WAAW,WAAW,EAAE;AAAA,EACtD;AAAA;AAAA,EAGA,cAAc,UAAmB,OAAe,WAAyB;AACvE,UAAM,iBAAiB,KAAK,OAAO,YAAY;AAC/C,QAAI,kBAAkB,YAAY,gBAAgB;AAChD,YAAM,IAAI,cAAc,sCAAsC,cAAc,IAAI,kBAAkB;AAAA,IACpG;AACA,SAAK,YAAY,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI,EAAE,UAAU,OAAO,WAAW,MAAM,GAAG,CAAC;AAAA,EACvF;AAAA;AAAA,EAGA,YAAY,UAAmB,OAAe,QAAsB;AAClE,UAAM,MAAM,GAAG,QAAQ,IAAI,KAAK;AAChC,UAAM,IAAI,KAAK,YAAY,IAAI,GAAG;AAClC,QAAI,CAAC,EAAG,OAAM,IAAI,cAAc,uBAAuB,sBAAsB;AAC7E,QAAI,EAAE,OAAO,SAAS,EAAE,UAAW,OAAM,IAAI,cAAc,6BAA6B,qBAAqB;AAC7G,MAAE,QAAQ;AAAA,EACZ;AAAA,EAEA,iBAA+B;AAAE,WAAO,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC;AAAA,EAAG;AAAA,EACxE,kBAAkB;AAAE,WAAO;AAAA,EAAgB;AAAA,EAC3C,YAAqB;AAAE,WAAO,KAAK,OAAO,YAAY,YAAY;AAAA,EAAM;AAC1E;;;AC7CO,IAAM,sBAAN,MAA0B;AAAA,EAQ/B,YAAoB,QAAoB,UAAkB;AAAtC;AAClB,SAAK,SAAS,IAAI,WAAW,QAAQ;AACrC,SAAK,QAAQ,IAAI,aAAa,QAAQ,QAAQ;AAC9C,SAAK,MAAM,IAAI,WAAW,QAAQ,QAAQ;AAC1C,SAAK,QAAQ,OAAO,OAAO,UACvB,IAAI,aAAa,EAAE,SAAS,MAAM,YAAY,OAAO,MAAM,cAAc,GAAG,CAAC,IAC7E;AACJ,SAAK,QAAQ,IAAI,iBAAiB,KAAK,GAAG;AAC1C,SAAK,aAAa,IAAI,iBAAiB,MAAM;AAAA,EAC/C;AAAA,EAToB;AAAA,EAPX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAcT,sBAAsB,eAAuB,eAAuB,aAA4D;AAC9H,QAAI,iBAAiB,cAAe,QAAO;AAC3C,QAAI,KAAK,OAAO,aAAa,KAAK,OAAO,iBAAiB,eAAe,KAAK,IAAI,YAAY,EAAG,QAAO;AACxG,QAAI,KAAK,MAAM,UAAU,EAAG,QAAO;AACnC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,YAAY,eAAgC;AAC1C,QAAI,CAAC,KAAK,MAAM,UAAU,EAAG,QAAO;AACpC,WAAO,KAAK,MAAM,qBAAqB,aAAa,IAAI;AAAA,EAC1D;AAAA,EAEA,YAAqB;AAAE,WAAO,CAAC,CAAC,KAAK,UAAU,KAAK,OAAO,YAAY;AAAA,EAAG;AAC5E;;;AC3CA,IAAM,eAAe,IAAI,IAAI,OAAO,OAAO,aAAa,EAAE,IAAI,OAAK,EAAE,YAAY,CAAC,CAAC;AAM5E,IAAM,iBAAN,MAA+C;AAAA,EAC3C,WAAW;AAAA,EAEpB,OAAO,UAA6B;AAClC,UAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,WAAW;AAC3F,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,QAAQ,OAAO,YAAY;AACjC,eAAW,QAAQ,cAAc;AAC/B,UAAI,MAAM,SAAS,IAAI,EAAG,QAAO;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,KAAa,MAA+B,UAAoB,KAAyC;AAMjH,UAAM,IAAI,MAAM,0EAA0E;AAAA,EAC5F;AACF;;;ACTA,IAAM,UAAU,YAAc,OAAO;AACrC,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,IAAM,YAAY;AAClB,IAAM,WAAW;AAEV,IAAM,wBAA4E,OAAO,OAAO;AAAA,EACrG,UAAU;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,MAAM;AAAA,IACN,eAAe,EAAE,MAAM,SAAS,UAAU,SAAS,UAAU,SAAS,KAAK,QAAQ;AAAA,IACnF,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,MAAM;AAAA,IACN,eAAe,EAAE,UAAU,SAAS,UAAU,SAAS,KAAK,QAAQ;AAAA,IACpE,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,MAAM;AAAA,IACN,eAAe,EAAE,MAAM,SAAS,UAAU,SAAS,KAAK,QAAQ;AAAA,IAChE,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,MAAM;AAAA,IACN,eAAe,EAAE,MAAM,SAAS,UAAU,SAAS,UAAU,QAAQ;AAAA,IACrE,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,MAAM;AAAA,IACN,eAAe,EAAE,MAAM,SAAS,UAAU,SAAS,KAAK,QAAQ;AAAA,IAChE,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF,CAAC;AAIM,IAAM,kBAA0E,OAAO,OAAO;AAAA,EACnG,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AACtB,CAAC;AAED,IAAM,kBAAiE,OAAO,OAAO;AAAA,EACnF,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AACZ,CAAC;AAGM,SAAS,eAAe,KAA8C;AAC3E,SAAO,gBAAgB,GAAG;AAC5B;AAGO,SAAS,eAAe,MAAmC;AAChE,SAAO,gBAAgB,IAAI;AAC7B;AAaO,SAAS,eACd,MACA,IACA,QACA,YACiB;AACjB,MAAI,SAAS,GAAI,QAAO,EAAE,IAAI,OAAO,QAAQ,aAAa;AAC1D,MAAI,UAAU,GAAI,QAAO,EAAE,IAAI,OAAO,QAAQ,iBAAiB;AAE/D,QAAM,MAAM,sBAAsB,IAAI;AACtC,QAAM,MAAM,sBAAsB,EAAE;AACpC,MAAI,CAAC,OAAO,CAAC,IAAK,QAAO,EAAE,IAAI,OAAO,QAAQ,sBAAsB;AACpE,MAAI,IAAI,UAAU,IAAI,OAAQ,QAAO,EAAE,IAAI,OAAO,QAAQ,SAAS;AAEnE,QAAM,WAAW,YAAY,YAAY,IAAI;AAC7C,MAAI,WAAW,QAAQ;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,4BAA4B,QAAQ,MAAM,MAAM;AAAA,MACxD,kBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,aAAa,YAAY,WAAW,IAAI,cAAc,IAAI,KAAK;AACrE,MAAI,aAAa,QAAQ;AACvB,WAAO,EAAE,IAAI,OAAO,QAAQ,2BAA2B,UAAU,MAAM,MAAM,IAAI;AAAA,EACnF;AACA,SAAO,EAAE,IAAI,KAAK;AACpB;;;AC7IO,IAAM,oBAAN,MAAwB;AAAA,EAI7B,YAA4B,QAAiC;AAAjC;AAC1B,SAAK,UAAU,OAAO,iBAAiB,sCAAsC,MAAM;AAAA,EACrF;AAAA,EAF4B;AAAA,EAHX;AAAA,EACA,UAAU,oBAAI,IAAwC;AAAA;AAAA,EAOvE,UAAU,KAAuE;AAC/E,QAAI,CAAC,KAAK,OAAO,QAAQ,IAAI,IAAI,GAAG;AAClC,aAAO,EAAE,IAAI,OAAO,QAAQ,iBAAiB,IAAI,IAAI,GAAG;AAAA,IAC1D;AACA,UAAM,WAAW,eAAe,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;AAC5D,QAAI,CAAC,SAAS,GAAI,QAAO,EAAE,IAAI,OAAO,QAAQ,SAAS,OAAO;AAC9D,WAAO,EAAE,IAAI,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,SAAS,KAAsD;AACnE,UAAM,KAAK,KAAK,IAAI;AACpB,QAAI,IAAI,QAAQ;AACd,YAAMC,MAAK,KAAK,UAAU,GAAG;AAC7B,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQA,IAAG,KAAK,cAAc;AAAA,QAC9B,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,KAAK,KAAK,UAAU,GAAG;AAC7B,QAAI,CAAC,GAAG,IAAI;AACV,YAAM,IAAI;AAAA,QACR,kCAAkC,GAAG,MAAM;AAAA,QAC3C;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK,UAAU,IAAI,MAAM,IAAI,EAAE;AACpD,UAAM,SAAS,MAAM,OAAO,kBAAkB,EAAE,QAAQ,IAAI,QAAQ,WAAW,IAAI,UAAU,CAAC;AAE9F,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,KAAK,OAAO;AAAA,MACZ,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO,aAAa,aAAa;AAAA,MACzC,YAAY,OAAO;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,UAAU,MAAyB,IAAmD;AAC5F,UAAM,MAAM,GAAG,IAAI,KAAK,EAAE;AAC1B,QAAI,IAAI,KAAK,QAAQ,IAAI,GAAG;AAC5B,QAAI,CAAC,GAAG;AACN,UAAI,KAAK,QAAQ,OAAO,MAAM,EAAE;AAChC,WAAK,QAAQ,IAAI,KAAK,CAAC;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACF;AAgBO,SAAS,sCACd,QAC0B;AAC1B,SAAO;AAAA,IACL,MAAM,OAAO,UAAU,UAAsC;AAC3D,YAAM,MAAM,MAAM,gBAAgB;AAClC,YAAM,SAAS,OAAO,QAAQ,QAAQ;AACtC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI;AAAA,UACR,4BAA4B,QAAQ;AAAA,UACpC;AAAA,UACA,yBAAyB,QAAQ;AAAA,QACnC;AAAA,MACF;AAEA,YAAM,UAAU,OAAO,WAAW;AAClC,YAAM,KAAK,MAAM,IAAI,SAAS,SAAS,CAAC,IAAI,WAAW,CAAC;AACxD,YAAM,SAAS,GAAG,SAAS,QAAQ;AAEnC,YAAM,gBAAgB,sBAAsB,QAAQ;AACpD,YAAM,MAAM,MAAM,OAAO,YAAY,OAAO;AAAA,QAC1C,KAAK;AAAA,UACH,OAAO,cAAc;AAAA,UACrB,SAAS,cAAc;AAAA,UACvB,aAAa,EAAE,UAAU,cAAc,YAAY;AAAA,QACrD;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,MAAM,kBAAkB,KAAiD;AACvE,gBAAM,KAAK,KAAK,IAAI;AACpB,gBAAM,aAAa,MAAM,OAAO,WAAW;AAC3C,gBAAM,OAAO,IAAI;AAAA,YACf;AAAA,YACA,IAAI;AAAA,YACJ,EAAE,OAAO,UAAU,SAAS,IAAI,UAAU;AAAA,YAC1C,EAAE,OAAO,OAAO,WAAW,MAAM,YAAY,GAAG;AAAA,UAClD;AACA,gBAAM,QAAQ,MAAM,IAAI,aAAa,QAAQ,MAAM,MAAM;AACzD,gBAAM,YAAY,MAAM,MAAM,SAAS,CAAC,EAAE;AAM1C,iBAAO,EAAE,WAAW,YAAY,KAAK,IAAI,IAAI,GAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAyBA,IAAI;AACJ,eAAe,kBAA8C;AAC3D,cAAY,YAAY;AACtB,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,0BAAoC;AAC9D,YAAM,MAAM,MAAM,OAAO,8BAAwC;AAEjE,YAAM,OAAO,kCAA4C;AACzD,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,cAAc,KAAK;AAAA,QACnB,aAAa,IAAI,WAAW;AAAA,MAC9B;AAAA,IACF,SAASC,MAAK;AACZ,YAAM,IAAI;AAAA,QACR,kCAAmCA,KAAc,OAAO;AAAA,QACxD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG;AACH,SAAO;AACT;;;AC/KO,IAAM,qBAAN,MAAmD;AAAA,EAKxD,YACmB,QACA,OAAkC,CAAC,GACpD;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EANV,WAAW;AAAA,EACZ,aAAa;AAAA,EACb,WAAW,KAAK,IAAI;AAAA,EAO5B,OAAO,WAA8B;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IACJ,MACA,OACA,WACA,MACmB;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,KAKc;AAC9B,UAAM,OAAO,eAAe,IAAI,SAAS;AACzC,UAAM,KAAK,eAAe,IAAI,OAAO;AACrC,QAAI,CAAC,QAAQ,CAAC,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,0BAA0B,IAAI,SAAS,WAAM,IAAI,OAAO;AAAA,QACxD;AAAA,QACA,cAAc,OAAO,KAAK,qBAAqB,EAAE,KAAK,IAAI,CAAC;AAAA,MAC7D;AAAA,IACF;AACA,SAAK,WAAW,IAAI,MAAM;AAE1B,UAAM,UAAU,MAAM,KAAK,OAAO,SAAS;AAAA,MACzC;AAAA,MACA;AAAA,MACA,QAAQ,IAAI;AAAA,MACZ,WAAW,IAAI;AAAA,IACjB,CAAC;AACD,SAAK,cAAc,IAAI;AACvB,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,QAAsB;AACvC,UAAM,EAAE,gBAAgB,UAAU,IAAI,KAAK;AAC3C,QAAI,mBAAmB,UAAa,SAAS,gBAAgB;AAC3D,YAAM,IAAI;AAAA,QACR,2CAA2C,MAAM,MAAM,cAAc;AAAA,QACrE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,IAAI,IAAI,KAAK,WAAW,OAAY;AAC3C,WAAK,WAAW,KAAK,IAAI;AACzB,WAAK,aAAa;AAAA,IACpB;AACA,QAAI,cAAc,UAAa,KAAK,aAAa,SAAS,WAAW;AACnE,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxEA,IAAM,cAAc;AAEb,IAAM,gBAAgF;AAAA,EAC3F,kBAAkB;AAAA,IAChB,MAAM,EAAE,QAAQ,QAAQ,OAAO,aAAa,UAAU,GAAG,UAAU,OAAO,aAAa,4BAA4B;AAAA,IACnH,MAAM,EAAE,QAAQ,QAAQ,OAAO,SAAa,UAAU,GAAG,UAAU,KAAK;AAAA,IACxE,MAAM,EAAE,QAAQ,QAAQ,OAAO,aAAa,UAAU,GAAG,UAAU,OAAO,aAAa,4BAA4B;AAAA,IACnH,MAAM,EAAE,QAAQ,QAAQ,OAAO,aAAa,UAAU,GAAG,UAAU,OAAO,aAAa,4BAA4B;AAAA,EACrH;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM,EAAE,QAAQ,QAAQ,OAAO,aAAa,UAAU,GAAG,UAAU,OAAO,aAAa,4BAA4B;AAAA,IACnH,MAAM,EAAE,QAAQ,QAAQ,OAAO,SAAa,UAAU,GAAG,UAAU,KAAK;AAAA,IACxE,MAAM,EAAE,QAAQ,QAAQ,OAAO,aAAa,UAAU,GAAG,UAAU,OAAO,aAAa,4BAA4B;AAAA,IACnH,MAAM,EAAE,QAAQ,QAAQ,OAAO,aAAa,UAAU,GAAG,UAAU,OAAO,aAAa,4BAA4B;AAAA,EACrH;AACF;AAGA,IAAM,oBAAuD;AAAA,EAC3D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAMO,SAAS,eAAe,OAAuB,QAA6B;AACjF,QAAM,OAAO,kBAAkB,OAAO,YAAY,CAAC;AACnD,MAAI,CAAC,MAAM;AACT,UAAM,IAAI;AAAA,MACR,2BAA2B,KAAK,KAAK,MAAM;AAAA,MAC3C;AAAA,MACA,UAAU,OAAO,KAAK,iBAAiB,EAAE,KAAK,IAAI,CAAC;AAAA,IACrD;AAAA,EACF;AACA,QAAM,QAAQ,cAAc,KAAK,EAAE,IAAI;AACvC,MAAI,MAAM,aAAa;AACrB,UAAM,WAAW,QAAQ,IAAI,MAAM,WAAW;AAC9C,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,aAAO,EAAE,GAAG,OAAO,OAAO,UAAU,UAAU,KAAK;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,UAAU,oBAAI,IAAY;AAGzB,SAAS,oBAAoB,OAA0B;AAC5D,MAAI,MAAM,SAAU;AACpB,QAAM,IAAI,GAAG,MAAM,MAAM,IAAI,MAAM,KAAK;AACxC,MAAI,QAAQ,IAAI,CAAC,EAAG;AACpB,UAAQ,IAAI,CAAC;AAEb,UAAQ;AAAA,IACN,yCAAyC,MAAM,MAAM,gCAC5C,MAAM,WAAW;AAAA,EAC5B;AACF;AAGO,SAAS,kBAAkB,QAAyB,WAAW,GAAW;AAC/E,QAAM,MAAM,OAAO,MAAM;AACzB,MAAI,CAAC,gBAAgB,KAAK,GAAG,GAAG;AAC9B,UAAM,IAAI;AAAA,MACR,0BAA0B,GAAG;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,CAAC,OAAO,OAAO,EAAE,IAAI,IAAI,MAAM,GAAG;AACxC,QAAM,UAAU,OAAO,IAAI,OAAO,QAAQ,GAAG,MAAM,GAAG,QAAQ;AAC9D,SAAO,OAAO,KAAK,IAAI,OAAO,OAAO,QAAQ,IAAI,OAAO,UAAU,GAAG;AACvE;AAGO,SAAS,mBAAmB,QAAgB,WAAW,GAAW;AACvE,QAAM,UAAU,OAAO,OAAO,QAAQ;AACtC,QAAM,QAAQ,SAAS;AACvB,QAAM,OAAO,SAAS;AACtB,MAAI,SAAS,GAAI,QAAO,MAAM,SAAS;AACvC,QAAM,UAAU,KAAK,SAAS,EAAE,SAAS,UAAU,GAAG,EAAE,QAAQ,OAAO,EAAE;AACzE,SAAO,GAAG,KAAK,IAAI,OAAO;AAC5B;;;ACpDA,eAAsB,eACpB,UACA,eAAe,QACQ;AACvB,MAAI;AACJ,MAAI;AACF,UAAO,MAAM,OAAO,uBAAiC;AAAA,EAGvD,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,MAAM,IAAK,wBAAyB,aAAa,UAAU,EAAE,QAAQ,aAAa,CAAC;AAClG,SAAO;AACT;AA+BO,IAAM,eAAN,MAAmB;AAAA,EAIxB,YAA4B,QAA4B;AAA5B;AAAA,EAA6B;AAAA,EAA7B;AAAA,EAHpB;AAAA,EACA;AAAA;AAAA,EAKR,MAAM,aAA8B;AAClC,YAAQ,MAAM,KAAK,QAAQ,GAAG;AAAA,EAChC;AAAA;AAAA,EAGA,MAAM,WAAW,SAAiB,OAAgC;AAChE,UAAM,KAAK,MAAM,KAAK,aAAa;AACnC,UAAM,IAAI,MAAM,GAAG,eAAe,QAAQ,KAAK,OAAO,CAAC;AACvD,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,WAAW,SAAS,KAAK;AAC9C,aAAO,OAAO,KAAK,UAAU,GAAG;AAAA,IAClC,UAAE;AACA,QAAE,WAAW;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,iBAAkC;AACtC,UAAM,QAAQ,eAAe,KAAK,OAAO,UAAU,MAAM;AACzD,wBAAoB,KAAK;AACzB,WAAO,KAAK,WAAW,MAAM,KAAK,WAAW,GAAG,MAAM,KAAK;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,KAKkB;AAC3B,UAAM,EAAE,SAAS,QAAQ,IAAI,MAAM,KAAK,QAAQ;AAChD,UAAM,QAAQ,CAAC,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO,SAAS,EAAE,CAAC;AAClE,UAAM,SAAS,MAAM,QAAQ,WAAW,SAAS,IAAI,WAAW,OAAO,QAAQ,IAAI,QAAQ,EAAE;AAC7F,UAAM,MAAuB;AAAA,MAC3B,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO,QAAQ;AAAA,MACrB,QAAQ,OAAO,UAAU;AAAA,MACzB,SAAS,OAAO,OAAO,WAAW,CAAC;AAAA,MACnC,WAAW,OAAO,OAAO,aAAa,CAAC;AAAA,IACzC;AACA,QAAI,IAAI,SAAS,GAAG;AAClB,YAAM,IAAI;AAAA,QACR,iCAAiC,IAAI,IAAI,MAAM,IAAI,MAAM;AAAA,QACzD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,WAAmB,QAAgB,MAAyC;AACzF,UAAM,QAAQ,eAAe,KAAK,OAAO,UAAU,MAAM;AACzD,wBAAoB,KAAK;AACzB,WAAO,KAAK,KAAK,EAAE,WAAW,OAAO,MAAM,OAAO,QAAQ,KAAK,CAAC;AAAA,EAClE;AAAA;AAAA,EAIQ,SAAiB;AACvB,WAAO,KAAK,OAAO,UAAU,OAAO,KAAK,OAAO,QAAQ,EAAE;AAAA,EAC5D;AAAA,EAEA,MAAc,eAAwC;AACpD,QAAI,KAAK,YAAa,QAAO,KAAK;AAClC,QAAI;AACF,WAAK,cAAe,MAAM,OAAO,kBAA4B;AAC7D,aAAO,KAAK;AAAA,IACd,QAAQ;AACN,YAAMC,OAAM,IAAI;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,KAAK,OAAO,OAAQ,OAAMA;AAE9B,cAAQ,KAAK,eAAeA,KAAI,OAAO,KAAKA,KAAI,IAAI,EAAE;AACtD,YAAMA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,UAAgE;AAC5E,QAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,QAAI,CAAC,KAAK,OAAO,QAAQ;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,MAAM,KAAK,cAAc;AACxC,UAAM,KAAK,MAAM,KAAK,aAAa;AACnC,UAAM,UAAU,MAAM,GAAG,sBAAsB;AAAA,MAC7C,KAAK,OAAO;AAAA,MACZ;AAAA,MACA,EAAE,UAAU,GAAG,SAAS,WAAW,KAAK,OAAO,YAAY,YAAY,EAAE;AAAA,IAC3E;AACA,UAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,UAAM,UAAU,SAAS,CAAC,GAAG;AAC7B,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,cAAc,6CAA6C,qBAAqB;AAAA,IAC5F;AACA,SAAK,SAAS,EAAE,SAAS,QAAQ;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,gBAAuC;AACnD,UAAM,IAAI,KAAK,OAAO;AACtB,QAAI,OAAO,MAAM,WAAY,QAAO,EAAE;AACtC,WAAO;AAAA,EACT;AACF;;;ACpMO,IAAM,oBAAN,MAAkD;AAAA,EAIvD,YACmB,QACA,UACjB,UAAoC,CAAC,GACrC;AAHiB;AACA;AAGjB,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA,EALmB;AAAA,EACA;AAAA,EALV,WAAW;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeR,kBAAkB,MAA4C;AAC5D,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,OAAO,UAA6B;AAClC,UAAM,SACJ,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB,KAAK;AAC5F,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,aAAO,SAAS,UAAU,CAAC,GAAG,WAAW;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IACJ,KACA,MACA,UACA,MACmB;AACnB,UAAM,YAAY,KAAK,eAAe,QAAQ;AAC9C,UAAM,SAAS,OAAO,UAAU,iBAAiB;AACjD,UAAM,YAAY,MAAM,KAAK,OAAO,WAAW;AAG/C,UAAM,UAAU,MAAM,KAAK,OAAO,eAAe;AACjD,QAAI,UAAU,QAAQ;AACpB,UAAI,CAAC,KAAK,YAAY;AACpB,cAAM,IAAI;AAAA,UACR,wBAAwB,KAAK,QAAQ,UAAU,OAAO,UAAU,MAAM;AAAA,UACtE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,OAAO,MAAM,KAAK,WAAW,EAAE,gBAAgB,QAAQ,UAAU,CAAC;AACxE,UAAI,OAAO,QAAQ;AACjB,cAAM,IAAI;AAAA,UACR,+CAA+C,IAAI,UAAU,MAAM;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,KAAK,OAAO,SAAS,UAAU,OAAO,QAAQ,UAAU,IAAI;AAGjF,UAAM,QAAQ,OAAO;AAAA,MACnB,KAAK,UAAU;AAAA,QACb,QAAQ;AAAA,QACR,SAAS,UAAU;AAAA,QACnB,QAAQ,OAAO;AAAA,QACf,MAAM;AAAA,QACN,IAAI,UAAU;AAAA,QACd,OAAO,UAAU;AAAA,QACjB,OAAO,UAAU;AAAA,QACjB,MAAM,UAAU;AAAA,MAClB,CAAC;AAAA,IACH,EAAE,SAAS,QAAQ;AAEnB,UAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,YAAQ,IAAI,aAAa,KAAK;AAC9B,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAA,EACxC;AAAA,EAEQ,eAAe,UAA4C;AACjE,UAAM,SACJ,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB,KAAK;AAC5F,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,oBAAoB,mCAAmC,gBAAgB;AAAA,IACnF;AACA,QAAI;AACJ,QAAI;AACF,gBAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AAAA,IAC/D,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,UAAU,CAAC;AAClC,QAAI,CAAC,UAAU,OAAO,WAAW,kBAAkB;AACjD,YAAM,IAAI,oBAAoB,mCAAmC,gBAAgB;AAAA,IACnF;AACA,QAAI,CAAC,OAAO,SAAS,CAAC,OAAO,mBAAmB;AAC9C,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ACnIA;AAAA,EACE,sBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,OAGK;AACP,SAAS,uBAAAC,4BAA2B;AACpC,SAAS,MAAM,mBAAmB;AAQ3B,IAAM,kCAAkC;AAAA,EAC7C;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,QAAe,MAAM,UAAU;AAAA,MACvC,EAAE,MAAM,MAAe,MAAM,UAAU;AAAA,MACvC,EAAE,MAAM,SAAe,MAAM,UAAU;AAAA,MACvC,EAAE,MAAM,cAAe,MAAM,UAAU;AAAA,MACvC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,MACvC,EAAE,MAAM,SAAe,MAAM,UAAU;AAAA,MACvC,EAAE,MAAM,KAAe,MAAM,QAAU;AAAA,MACvC,EAAE,MAAM,KAAe,MAAM,UAAU;AAAA,MACvC,EAAE,MAAM,KAAe,MAAM,UAAU;AAAA,IACzC;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AACF;AAgBO,IAAM,8BAAN,MAAkC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YACE,YACA,UACA,WAAyB,QACzB,OAA2C,CAAC,GAC5C;AACA,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,kBAAkB,KAAK;AAC5B,SAAK,WAAW,KAAK,YAAY;AAEjC,UAAM,QAAQ,aAAa,iBAAiB,OAAO;AACnD,UAAM,SAAS,KAAK,UAAU,OAAO,QAAQ,EAAE;AAC/C,SAAK,UAAUC,qBAAoB,UAAU;AAK7C,SAAK,eAAeC,oBAAmB,EAAE,OAAO,WAAWC,MAAK,MAAM,EAAE,CAAC;AACzE,SAAK,eAAeC,oBAAmB,EAAE,SAAS,KAAK,SAAS,OAAO,WAAWD,MAAK,MAAM,EAAE,CAAC;AAAA,EAClG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAsC;AACpC,QAAI,KAAK,SAAU,QAAO;AAC1B,QAAI,KAAK,gBAAiB,QAAO,KAAK;AACtC,UAAM,SAAS,OAAO,KAAK,QAAQ,EAAE;AACrC,QAAI,KAAK,aAAa,QAAQ;AAC5B,YAAM,IAAI,OAAO;AACjB,UAAI,CAAC,EAAG,OAAM,SAAS,qCAAqC,KAAK,QAAQ,EAAE;AAC3E,aAAO;AAAA,IACT;AACA,QAAI,KAAK,aAAa,QAAQ;AAC5B,YAAM,IAAI,OAAO;AACjB,UAAI,CAAC,EAAG,OAAM,SAAS,qCAAqC,KAAK,QAAQ,yCAAoC;AAC7G,aAAO;AAAA,IACT;AACA,QAAI,KAAK,aAAa,QAAQ;AAG5B,YAAM,IAAI,OAAO;AACjB,UAAI,CAAC,EAAG,OAAM,SAAS,yBAAyB,KAAK,QAAQ,EAAE;AAC/D,aAAO;AAAA,IACT;AACA,UAAM,IAAI;AAAA,MACR,kDAAkD,OAAO,KAAK,QAAQ,CAAC;AAAA,MACvE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,kBAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,aAAsB;AACpB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,QAK8B;AAChD,UAAM,cAAc,KAAK,eAAe;AACxC,UAAM,SAAS,MAAM,KAAK,aAAa,cAAc;AAAA,MACnD,GAAG;AAAA,MACH,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACvC,CAAC;AACD,UAAM,UAAU,MAAM,KAAK,aAAa,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAClF,WAAO,EAAE,QAAQ,aAAa,QAAQ,YAAY;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,0BAA0B,QASkB;AAChD,UAAM,MAAM,eAAe,OAAO,SAAS;AAC3C,WAAO,KAAK,cAAc;AAAA,MACxB,SAAS,OAAO;AAAA,MAChB,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO,IAAI,KAAK,EAAE;AAAA,QAClB,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,SAAS,KAA4B;AAC5C,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACtKO,IAAM,2BAAN,MAAyD;AAAA,EACrD,WAAW;AAAA,EACH;AAAA,EACT;AAAA,EACS;AAAA,EACA;AAAA,EAEjB,YACE,QACA,UACA,SAAqB,CAAC,GACtB,wBAAwB,KACxB;AACA,SAAK,WAAW;AAChB,SAAK,SAAS;AAGd,SAAK,QAAQ,IAAI,YAAY,QAAQ,UAAsB,qBAAqB;AAAA,EAGlF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAkB,uBAA4B,WAAqC,QAAc;AAC/F,SAAK,aAAa,IAAI;AAAA,MACpB;AAAA,MACA,KAAK;AAAA,MACL;AAAA,MACA;AAAA,QACE,iBAAiB,KAAK,OAAO;AAAA,QAC7B,UAAU,KAAK,OAAO;AAAA,QACtB,QAAQ,KAAK,OAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,UAA6B;AAClC,WAAO,KAAK,MAAM,OAAO,QAAQ;AAAA,EACnC;AAAA,EAEA,MAAM,IACJ,KACA,MACA,UACA,MACmB;AAEnB,WAAO,KAAK,MAAM,IAAI,KAAK,MAAM,QAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,OAKQ;AAC5B,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,SAAU,OAAO,KAAK,QAAQ,EAAE,OAAO;AAC3D,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,+BAA+B,KAAK,QAAQ;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,KAAK,WAAW,0BAA0B;AAAA,MAC9E;AAAA,MACA,MAAM,MAAM,cAAc;AAAA,MAC1B,IAAI,MAAM,cAAc;AAAA,MACxB,OAAO,MAAM,cAAc;AAAA,MAC3B,YAAY,MAAM,cAAc;AAAA,MAChC,aAAa,MAAM,cAAc;AAAA,MACjC,OAAO,MAAM,cAAc;AAAA,MAC3B,WAAW,MAAM;AAAA,IACnB,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,aAAa,KAAK,WAAW,eAAe;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,eAAe,WAIpB;AACA,QAAI;AAUJ,QAAI;AACF,iBAAW,KAAK,MAAM,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,CAAC;AAAA,IACnE,QAAQ;AACN,YAAM,IAAI,oBAAoB,8BAA8B,gBAAgB;AAAA,IAC9E;AACA,UAAM,OAAO,SAAS,SAAS;AAC/B,UAAM,MAAM,SAAS,SAAS;AAC9B,QAAI,CAAC,QAAQ,CAAC,KAAK;AACjB,YAAM,IAAI,oBAAoB,mDAAmD,gBAAgB;AAAA,IACnG;AACA,WAAO;AAAA,MACL,eAAe;AAAA,QACb,MAAM,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,QACT,OAAO,OAAO,KAAK,KAAK;AAAA,QACxB,YAAY,OAAO,KAAK,UAAU;AAAA,QAClC,aAAa,OAAO,KAAK,WAAW;AAAA,QACpC,OAAO,KAAK;AAAA,MACd;AAAA,MACA,WAAW;AAAA,MACX,SAAS,SAAS,WAAW;AAAA,IAC/B;AAAA,EACF;AACF;;;ACnKA,SAAS,YAAY,UAAU;AAaxB,SAAS,qBAAqB,OAIf;AACpB,MAAI,MAAM,YAAY,EAAG,QAAO;AAChC,MAAI,MAAM,WAAW,OAAU,MAAM,aAAa,KAAQ,QAAO;AACjE,MAAI,MAAM,wBAAwB,MAAM,WAAW,OAAS,MAAM,aAAa,MAAQ;AACrF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAGhC,YACmB,SACA,OAAoC,CAAC,GACtD;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAJF,QAAQ,oBAAI,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYxD,MAAM,cACJ,cACA,WACA,SACyB;AACzB,WAAO,KAAK,SAAS,cAAc,YAAY;AAC7C,YAAM,QAAQ,MAAM,KAAK,QAAQ,KAAK,YAAY;AAClD,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,OAAuB;AAAA,QAC3B;AAAA,QACA,UAAU,OAAO,WAAW,KAAK;AAAA,QACjC,YAAY,OAAO,aAAa,KAAK,KAAK,IAAI,GAAG,SAAS;AAAA,QAC1D,qBAAqB,KAAK,KAAK,uBAAuB,OAAO,uBAAuB;AAAA,QACpF,MAAM;AAAA,QACN,WAAW,OAAO,aAAa;AAAA,QAC/B,UAAU;AAAA,QACV;AAAA,MACF;AACA,WAAK,OAAO,qBAAqB,IAAI;AACrC,YAAM,KAAK,QAAQ,MAAM,IAAI;AAC7B,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,UAAU,cAAuB,UAAiC,WAAoC;AAC1G,UAAM,IAAI,MAAM,KAAK,QAAQ,KAAK,YAAY;AAC9C,QAAI,EAAG,QAAO;AACd,WAAO;AAAA,MACL;AAAA,MAAc,SAAS;AAAA,MAAG,WAAW;AAAA,MACrC,qBAAqB,KAAK,KAAK,uBAAuB;AAAA,MACtD,MAAM;AAAA,MAAQ,WAAW;AAAA,MAAG,UAAU;AAAA,MAAG;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAc,SAAY,KAAa,IAAkC;AACvE,UAAM,OAAO,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,QAAQ;AACpD,QAAI;AACJ,UAAM,OAAO,IAAI,QAAc,CAAC,MAAM;AAAE,gBAAU;AAAA,IAAG,CAAC;AACtD,SAAK,MAAM,IAAI,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC;AACzC,QAAI;AACF,YAAM;AACN,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,cAAQ;AAER,UAAI,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK,MAAM,IAAI,EAAG,MAAK,MAAM,OAAO,GAAG;AAAA,IAC1E;AAAA,EACF;AACF;AAKO,IAAM,yBAAN,MAAyD;AAAA,EAC7C,QAAQ,oBAAI,IAA4B;AAAA,EACzD,MAAM,KAAK,cAAuD;AAChE,WAAO,KAAK,MAAM,IAAI,aAAa,YAAY,CAAC,KAAK;AAAA,EACvD;AAAA,EACA,MAAM,MAAM,OAAsC;AAChD,SAAK,MAAM,IAAI,MAAM,aAAa,YAAY,GAAG,KAAK;AAAA,EACxD;AACF;AAUO,IAAM,2BAAN,MAA2D;AAAA;AAAA,EAEhE,YAA6B,MAAc;AAAd;AAAA,EAAe;AAAA,EAAf;AAAA,EADZ,QAAQ,QAAQ,QAAQ;AAAA,EAGzC,MAAM,KAAK,cAAuD;AAChE,UAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,WAAO,IAAI,aAAa,YAAY,CAAC,KAAK;AAAA,EAC5C;AAAA,EAEA,MAAM,MAAM,OAAsC;AAChD,UAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,QAAI,MAAM,aAAa,YAAY,CAAC,IAAI;AACxC,UAAM,GAAG,UAAU,KAAK,MAAM,KAAK,UAAU,KAAK,UAAU,CAAC,GAAG,MAAM;AAAA,EACxE;AAAA,EAEA,MAAc,UAAmD;AAC/D,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,GAAG,SAAS,KAAK,MAAM,MAAM;AAAA,IAC3C,SAASE,MAAK;AACZ,UAAKA,KAA8B,SAAS,SAAU,QAAO,CAAC;AAC9D,YAAMA;AAAA,IACR;AACA,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB;AACF;AAIA,SAAS,SAAS,IAAY,GAAqB;AACjD,SAAO,OAAO,MAAM,WAAW,EAAE,SAAS,IAAI;AAChD;;;ACpHA,IAAM,wBAAwB;AAAA,EAC5B,sBAAsB;AAAA,IACpB,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,sBAAsB;AAAA;AAAA,IAEpB,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACjB,WAA6B,CAAC;AAAA,EAC9B,gBAAgC,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACC;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAET;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEQ;AAAA,EAER,YAAY,QAAwB;AAClC,SAAK,SAAS,aAAa,MAAM;AACjC,SAAK,YAAY,IAAI,iBAAiB,OAAO,WAAW,OAAO;AAC/D,SAAK,SAAS,IAAI,UAAU,OAAO,GAAG;AAGtC,QAAI,OAAO,QAAQ;AACjB,YAAM,SAAS,aAAa,WAAW,OAAO,MAAM;AACpD,WAAK,QAAQ,IAAI,cAAc,QAAQ,IAAI,SAAS,CAAC;AAAA,IACvD;AAEA,UAAM,QAAQ,KAAK,OAAO,YAAY;AACtC,UAAM,UAAU,qBAAqB,OAAO,QAAQ,MAAM,EAAE,SAAS;AACrE,UAAM,SAAS,qBAAqB,OAAO,QAAQ,KAAK,EAAE,SAAS;AACnE,UAAM,UAAU,qBAAqB,OAAO,QAAQ,MAAM,EAAE,SAAS;AAErE,QAAI,WAAW,UAAU,OAAO;AAC9B,YAAM,YAAY,qBAAqB,OAAO,QAAQ,MAAM,EAAE,CAAC;AAC/D,WAAK,SAAS,KAAK,IAAI,YAAY,KAAK,QAAQ,SAAS,CAAC;AAAA,IAC5D;AACA,QAAI,UAAU,UAAU,QAAQ;AAC9B,YAAM,WAAW,qBAAqB,OAAO,QAAQ,KAAK,EAAE,CAAC;AAC7D,WAAK,SAAS,KAAK,IAAI,WAAW,KAAK,QAAQ,UAAU,OAAO,UAAU,CAAC;AAAA,IAC7E;AACA,QAAI,WAAW,OAAO,MAAM;AAC1B,YAAM,YAAY,qBAAqB,OAAO,QAAQ,MAAM,EAAE,CAAC;AAC/D,YAAM,QAAQ,OAAO,aAAa,IAAI,gBAAgB,KAAK,QAAQ,OAAO,UAAU,IAAI;AACxF,UAAI;AACJ,UAAI,OAAO,KAAK,UAAU,SAAS;AACjC,iBAAS,IAAI,sBAAsB;AAAA,UACjC;AAAA,UACA,QAAQ,KAAK;AAAA,UACb,QAAQ,OAAO,KAAK;AAAA,UACpB,eAAe,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,KAAK,EAAE,SAAS,UAAU,CAAC;AAAA,UAC3F,WAAW,OAAO,KAAK;AAAA,UACvB,WAAW,OAAO,KAAK;AAAA,UACvB,cAAc,OAAO,KAAK;AAAA,UAC1B,aAAa,OAAO,KAAK;AAAA,UACzB,OAAO,KAAK;AAAA,QACd,CAAC;AACD,eAAO,eAAe;AAAA,MACxB;AACA,WAAK,SAAS,KAAK,IAAI,YAAY,OAAO,MAAM,KAAK,QAAQ,WAAW,OAAO,MAAM,CAAC;AAAA,IACxF;AAEA,UAAM,UAAU,qBAAqB,OAAO,QAAQ,MAAM,EAAE,SAAS;AACrE,QAAI,SAAS;AACX,YAAM,YAAY,qBAAqB,OAAO,QAAQ,MAAM,EAAE,CAAC;AAC/D,YAAM,UAAU,OAAO;AACvB,YAAM,WAAW,CAAC,EAAE,SAAS,QAAQ,OAAO,IAAI;AAChD,UAAI,UAAU;AACZ,cAAM,UAAU,oBAAoB,SAAS;AAC7C,cAAM,SAAS,eAAe,OAAO;AACrC,cAAM,aAAa,IAAI,WAAW,EAAE,MAAM,SAAS,MAAM,WAAW,OAAO,IAAI,OAAO,CAAC;AACvF,cAAM,WAAW,IAAI,eAAe,SAAS,UAAU,SAAS;AAChE,cAAM,YAAY,IAAI,gBAAgB,UAAU,YAAY,MAAM;AAClE,cAAM,WAAW,IAAI,eAAe,UAAU,YAAY,SAAS,MAAM;AAEzE,YAAI;AACJ,YAAI,SAAS,UAAU,WAAW;AAChC,qBAAW,IAAI;AAAA,YACb,EAAE,GAAG,QAAQ,UAAU,eAAe,QAAQ,cAAc;AAAA,YAC5D,EAAE,YAAY,UAAU,QAAQ,YAAY,OAAO,WAAW,QAAQ;AAAA,UACxE;AACA,eAAK,eAAe;AAAA,QACtB;AAEA,aAAK,SAAS;AAAA,UACZ,IAAI,YAAY,YAAY,UAAU,SAAS,UAAU,UAAU;AAAA,YACjE,UAAU,SAAS;AAAA,YACnB,gBAAgB,SAAS;AAAA,YACzB,WAAW,SAAS;AAAA,UACtB,CAAC;AAAA,QACH;AAAA,MACF,WAAW,SAAS,QAAQ;AAC1B,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN;AAAA,QAEF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,qBAAqB,OAAO,QAAQ,cAAc,EAAE,SAAS;AACpF,UAAM,gBAAgB,qBAAqB,OAAO,QAAQ,aAAa,EAAE,SAAS;AAClF,QAAI,kBAAkB,eAAe;AACnC,YAAM,eAAe,qBAAqB,OAAO,QAAQ,cAAc,EAAE,CAAC,KAAK,qBAAqB,OAAO,QAAQ,aAAa,EAAE,CAAC;AACnI,YAAM,aAAa,OAAO;AAC1B,UAAI,YAAY,WAAW;AACzB,cAAM,YAAY,iBAAiB;AAEnC,cAAM,SAAS,IAAI,qBAAqB,WAAW,WAAW,WAAW,SAAS;AAElF,aAAK,qBAAqB,WAAW,WAAW,SAAS,EAAE,KAAK,CAAC,MAAM;AACrE,UAAC,OAA+B,UAAU,EAAE;AAAA,QAC9C,CAAC,EAAE,MAAM,MAAM;AAAA,QAAkC,CAAC;AAClD,cAAM,iBAAiB,IAAI,sBAAsB;AAAA,UAC/C,QAAQ,WAAW;AAAA,UACnB,SAAS,WAAW;AAAA,UACpB;AAAA,QACF,CAAC;AACD,YAAI,eAAgB,MAAK,SAAS,KAAK,IAAI,mBAAmB,QAAQ,cAAc,gBAAgB,WAAW,MAAM,CAAC;AACtH,YAAI,cAAe,MAAK,SAAS,KAAK,IAAI,kBAAkB,QAAQ,YAAY,CAAC;AAAA,MACnF,WAAW,YAAY,QAAQ;AAC7B,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN;AAAA,QAEF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,QAAQ;AACjB,WAAK,SAAS,KAAK,IAAI,qBAAqB,OAAO,MAAM,CAAC;AAAA,IAC5D;AAGA,QAAI,OAAO,QAAQ;AACjB,WAAK,SAAS,KAAK,IAAI,kBAAkB,OAAO,MAAM,CAAC;AAAA,IACzD;AAGA,UAAM,WAAW,qBAAqB,OAAO,QAAQ,YAAY,EAAE,SAAS;AAC5E,QAAI,UAAU;AACZ,YAAM,aAAa,qBAAqB,OAAO,QAAQ,YAAY,EAAE,CAAC;AACtE,YAAM,WAAW,OAAO;AACxB,YAAM,WAAW,CAAC,EAAE,UAAU,aAAa,UAAU;AAIrD,YAAM,iBAAiB,UAAU,kBAAkB,OAAO,UAAU,EAAE;AACtE,YAAM,UAAU,eAAe;AAC/B,YAAM,uBAAuB,CAAC,CAAC,UAAU,kBAAkB;AAC3D,UAAI,YAAY,sBAAsB;AACpC,cAAM,cAAc,IAAI,gBAAgB;AAAA,UACtC,WAAW,UAAU;AAAA,UACrB,WAAW,UAAU;AAAA,UACrB,SAAS;AAAA,QACX,CAAC;AACD,aAAK,SAAS;AAAA,UACZ,IAAI,iBAAiB,KAAK,QAAQ,aAAa,YAAY;AAAA,YACzD,WAAW,UAAU;AAAA,YACrB,cAAc,UAAU;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,MACF,WAAW,UAAU,QAAQ;AAC3B,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN;AAAA,QAEF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,qBAAqB,OAAO,QAAQ,aAAa,EAAE,SAAS;AACnF,QAAI,gBAAgB;AAClB,YAAM,aAAa,qBAAqB,OAAO,QAAQ,aAAa,EAAE,CAAC;AACvE,YAAM,UAAU,OAAO,UAAU;AACjC,YAAM,QAAQ,OAAO;AACrB,YAAM,WAAW,sBAAsB,UAAgD;AACvF,YAAM,gBAAiB,OAAO,kBAAkB,UAAU;AAC1D,YAAM,eAAgB,OAAO,gBAAgB,UAAU,SAAS,QAAQ,OAAO,SAAS,QAAQ,OAAO;AACvG,UAAI,CAAC,iBAAiB,CAAC,cAAc;AACnC,YAAI,OAAO,QAAQ;AACjB,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,gBAAQ,KAAK,kGAA6F;AAAA,MAC5G,OAAO;AACL,cAAM,aAAa,OAAO,KAAK;AAC/B,cAAM,SAAS,aACX,IAAI,yBAAyB,UAAU,IACvC,IAAI,qBAAqB,KAAK,QAAQ,QAAQ,OAAO;AACzD,cAAM,WAAW,IAAI,kBAAkB;AAAA,UACrC,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,OAAO,cAAc,QAAQ;AAAA,UACzC,gBAAgB,OAAO;AAAA,UACvB,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO;AAAA,UACf,YAAY,OAAO;AAAA,UACnB,QAAQ,OAAO;AAAA,QACjB,CAAC;AACD,aAAK,cAAc,KAAK,IAAI,mBAAmB,QAAQ,CAAC;AAAA,MAC1D;AAAA,IACF;AAGA,QAAI,OAAO,MAAM;AACf,YAAM,YAAY,OAAO,OAAO,KAAK,OAAK,CAAC,gBAAgB,UAAU,EAAE,SAAS,CAAC,CAAC,KAAK,OAAO,OAAO,CAAC;AACtG,WAAK,OAAO,IAAI,oBAAoB,OAAO,MAAM,SAAS;AAC1D,UAAI,OAAO,KAAK,WAAW;AACzB,aAAK,SAAS,KAAK,IAAI,eAAe,CAAC;AAAA,MACzC;AAAA,IACF;AAKA,UAAM,eAAe,qBAAqB,OAAO,QAAQ,YAAY,EAAE,SAAS;AAChF,QAAI,cAAc;AAChB,YAAM,aAAa,qBAAqB,OAAO,QAAQ,YAAY,EAAE,CAAC;AACtE,YAAM,WAAW,OAAO;AACxB,YAAM,aAAa,CAAC,CAAC,UAAU,MAAM,gBAAgB,CAAC,CAAC,SAAS,KAAK;AACrE,YAAM,YAAY,CAAC,CAAC,OAAO,KAAK;AAChC,UAAI,cAAc,WAAW;AAC3B,aAAK,SAAS;AAAA,UACZ,IAAI,iBAAiB,KAAK,QAAQ,YAAY;AAAA,YAC5C,WAAW,SAAU,KAAM;AAAA,YAC3B,cAAc,SAAU,KAAM;AAAA,YAC9B,uBAAuB,SAAU,KAAM;AAAA,UACzC,CAAC;AAAA,QACH;AAAA,MACF,WAAW,UAAU,QAAQ;AAC3B,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN;AAAA,QAEF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,UAAU,WAAW,OAAO,KAAK,OAAO,SAAS,OAAO,EAAE,SAAS,GAAG;AAC/E,WAAK,iBAAiB,IAAI,kBAAkB;AAAA,QAC1C,SAAS,OAAO,SAAS,WAAW;AAAA,QACpC,SAAS,OAAO,SAAS;AAAA,QACzB,eAAe,OAAO,SAAS;AAAA,QAC/B,mBAAmB,OAAO,SAAS;AAAA,QACnC,sBAAsB,OAAO,SAAS;AAAA,QACtC,QAAQ,OAAO,SAAS;AAAA,MAC1B,CAAC;AACD,WAAK,kBAAkB,IAAI,mBAAmB,KAAK,gBAAgB;AAAA,QACjE,gBAAgB,OAAO,SAAS;AAAA,QAChC,WAAW,OAAO,SAAS;AAAA,MAC7B,CAAC;AAAA,IACH,WAAW,OAAO,UAAU,QAAQ;AAClC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,OAAO,OAAO;AAAA,MACnC,CAAC,MAAM,MAAM,oBAAoB,MAAM;AAAA,IACzC;AACA,QAAI,gBAAgB;AAClB,YAAM,YAAY,OAAO,UAAU,CAAC;AACpC,YAAM,SAAS,UAAU,WACrB,MAAM,eAAe,UAAU,QAAS,IACxC;AACJ,WAAK,eAAe,IAAI,aAAa;AAAA,QACnC,UAAU;AAAA,QACV;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,QAAQ,UAAU;AAAA,MACpB,CAAC;AACD,WAAK,gBAAgB,IAAI,kBAAkB,KAAK,cAAc,cAAc;AAC5E,WAAK,SAAS,KAAK,KAAK,aAAa;AAAA,IACvC;AAOA,UAAM,eAAe,OAAO,OAAO;AAAA,MACjC,CAAC,MAAM,MAAM,kBAAkB,MAAM;AAAA,IACvC;AACA,QAAI,gBAAgB,OAAO,SAAS,QAAW;AAC7C,YAAM,cAAc,IAAI,yBAAyB,KAAK,QAAQ,cAAc,OAAO,IAAI;AAKvF,UAAI,OAAO,KAAK,cAAc,CAAC,OAAO,KAAK,uBAAuB;AAChE,oBAAY;AAAA,UACV,OAAO,IAAI;AAAA,UACX,OAAO,KAAK,YAAY;AAAA,QAC1B;AAAA,MACF,WAAW,OAAO,KAAK,uBAAuB;AAC5C,gBAAQ;AAAA,UACN;AAAA,QAEF;AAAA,MACF;AAEA,WAAK,SAAS,QAAQ,WAAW;AAIjC,WAAK,cAAc,iBAAiB,iBAAiB,YAAY;AACjE,WAAK,kBAAkB,IAAI;AAAA,QACzB,OAAO,KAAK,WAAW,WAAW,IAAI,uBAAuB;AAAA,QAC7D,EAAE,qBAAqB,OAAO,KAAK,WAAW,uBAAuB,MAAM;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,KAAa,MAAoB,MAA0C;AAChG,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,MAAM,QAAQ,CAAC;AACrB,UAAM,QAAQ,KAAK,OAAO,OAAO,CAAC;AAGlC,QAAI,KAAK,OAAO;AACd,YAAM,WAAW,KAAK,MAAM,MAAM;AAAA,QAChC;AAAA,QAAK,QAAQ;AAAA,QAAI;AAAA,QACjB,cAAc,IAAI;AAAA,QAAc,UAAU,IAAI;AAAA,QAC9C,QAAQ,IAAI;AAAA,QAAQ,QAAQ,IAAI;AAAA,MAClC,CAAC;AACD,UAAI,CAAC,SAAS,SAAS;AACrB,cAAM,IAAI,qBAAqB,kBAAkB,SAAS,MAAM,IAAI,eAAe;AAAA,MACrF;AAAA,IACF;AAGA,QAAI;AACJ,QAAI;AAEJ,QAAI,IAAI,UAAU,eAAe;AAC/B,kBAAY,KAAK,cAAc,KAAK,CAAC,MAAM,EAAE,aAAa,aAAa;AACvE,UAAI,CAAC,WAAW;AACd,cAAM,IAAI;AAAA,UACR;AAAA,UAAqC;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AACA,iBAAW,MAAM,UAAU,MAAM,KAAK,MAAM,GAAG;AAAA,IACjD,OAAO;AACL,iBAAW,MAAM,MAAM,KAAK,IAAI;AAGhC,UAAI,IAAI,UAAU,UAAU,KAAK,cAAc,QAAQ;AACrD,cAAM,WAAW,KAAK,cAAc,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC;AACvE,YAAI,UAAU;AACZ,qBAAW,MAAM,SAAS,MAAM,KAAK,MAAM,GAAG;AAC9C,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa,KAAK,OAAO;AAC3B,WAAK,MAAM,gBAAgB;AAAA,QACzB;AAAA,QAAK,QAAQ;AAAA,QAAI;AAAA,QACjB,QAAQ,IAAI;AAAA,QAAQ,QAAQ,IAAI;AAAA,QAChC,cAAc,IAAI;AAAA,QAAc,UAAU,IAAI;AAAA,MAChD,CAAC;AACD,WAAK,UAAU,KAAK;AAAA,QAClB,UAAU,UAAU;AAAA,QAAU;AAAA,QAAO;AAAA,QACrC,SAAS;AAAA,QAAM,YAAY,KAAK,IAAI,IAAI;AAAA,QAAO,WAAW,KAAK,IAAI;AAAA,MACrE,CAAC;AAAA,IACH;AAGA,QAAI,SAAS,WAAW,IAAK,QAAO;AAGpC,UAAM,WAAW,eAAe,UAAU,KAAK,OAAO,QAAQ;AAG9D,QAAI,KAAK,OAAO,QAAQ,qBAAqB,QAAQ;AACnD,YAAM,cAAc,KAAK,mBAAmB,QAAQ;AACpD,UAAI,eAAe,CAAC,KAAK,OAAO,OAAO,oBAAoB,SAAS,WAAW,GAAG;AAChF,cAAM,IAAI;AAAA,UACR,0BAA0B,WAAW;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UACJ,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,QAAQ,KACjD,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,CAAC;AAE9C,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,4BAA4B,QAAQ;AAAA,QAAI;AAAA,QACxC,sBAAsB,KAAK,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,IAAI,KAAK,MAAM,UAAU,IAAI;AAG1D,YAAM,kBAAkB,KAAK,uBAAuB,QAAQ;AAC5D,UAAI,KAAK,OAAO;AAEd,cAAM,SAAS,KAAK,OAAO,QAAQ,qBAAqB;AACxD,YAAI,kBAAkB,QAAQ;AAC5B,gBAAM,IAAI;AAAA,YACR,oBAAoB,eAAe,oBAAoB,MAAM;AAAA,YAC7D;AAAA,UACF;AAAA,QACF;AACA,aAAK,MAAM,cAAc;AAAA,UACvB;AAAA,UAAK,QAAQ;AAAA,UAAiB;AAAA,UAC9B,cAAc,IAAI;AAAA,UAAc,UAAU,IAAI;AAAA,QAChD,CAAC;AAAA,MACH;AACA,WAAK,UAAU,KAAK;AAAA,QAClB,UAAU,QAAQ;AAAA,QAAU;AAAA,QAAO;AAAA,QACnC,SAAS;AAAA,QAAM,YAAY,KAAK,IAAI,IAAI;AAAA,QAAO,WAAW,KAAK,IAAI;AAAA,MACrE,CAAC;AAID,UAAI,KAAK,mBAAmB,KAAK,eAAe,QAAQ,aAAa,uBAAuB;AAC1F,cAAM,UAAU,KAAK,OAAO,WAAW;AACvC,YAAI,SAAS;AACX,gBAAM,YAAY,oBAAoB,OAAO,eAAe;AAC5D,eAAK,gBACF,cAAc,QAAQ,SAAS,WAAW,KAAK,WAAW,EAC1D,MAAM,CAAC,MAAM,QAAQ,KAAK,qDAAsD,EAAY,OAAO,CAAC;AAAA,QACzG;AAAA,MACF;AACA,aAAO;AAAA,IACT,SAASC,MAAK;AACZ,WAAK,UAAU,KAAK;AAAA,QAClB,UAAU,QAAQ;AAAA,QAAU;AAAA,QAAO;AAAA,QACnC,SAAS;AAAA,QAAO,YAAY,KAAK,IAAI,IAAI;AAAA,QAAO,WAAW,KAAK,IAAI;AAAA,QACpE,OAAQA,KAAc;AAAA,MACxB,CAAC;AACD,YAAMA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,WAAsC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,cAAkF;AACxG,QAAI,CAAC,KAAK,mBAAmB,CAAC,KAAK,YAAa,QAAO;AACvD,UAAM,OAAO,gBAAiB,KAAK,OAAO,WAAW,GAAG;AACxD,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,KAAK,gBAAgB,UAAU,MAAM,KAAK,WAAW;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,QAAuB;AAC3B,eAAW,KAAK,KAAK,eAAe;AAClC,UAAI,EAAE,MAAO,OAAM,EAAE,MAAM;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,QAA0D;AAC7E,WAAO,IAAI,qBAAqB,MAAM;AAAA,EACxC;AAAA;AAAA,EAGQ,uBAAuB,UAA4B;AACzD,QAAI;AACF,YAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK;AAC3D,UAAI,CAAC,OAAQ,QAAO;AACpB,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,YAAM,SAAS,QAAQ,UAAU,CAAC,GAAG;AACrC,aAAO,SAAS,OAAO,MAAM,IAAI;AAAA,IACnC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGQ,mBAAmB,UAAwC;AACjE,QAAI;AACF,YAAM,SAAS,SAAS,QAAQ,IAAI,kBAAkB,KAAK;AAC3D,UAAI,CAAC,OAAQ,QAAO;AACpB,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACnE,aAAO,QAAQ,UAAU,CAAC,GAAG,eAAe;AAAA,IAC9C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,QAAuC;AACzE,SAAO,IAAI,cAAc,MAAM;AACjC;AASA,SAAS,oBAAoB,UAAkB,QAAwB;AACrE,MAAI,aAAa,kBAAkB,aAAa,eAAgB,QAAO;AAIvE,SAAO,OAAO,MAAM,IAAI;AAC1B;;;ACjkBO,SAAS,cAAc,QAAuB,WAA+B;AAIlF,QAAM,qBAA8C,OAAO,MAAM,QAAQ,OAAO,MAAM,YAClF,IAAI,WAAW,EAAE,MAAM,OAAO,KAAK,MAAM,WAAW,OAAO,KAAK,UAAU,CAAC,IAC3E;AAEJ,SAAO,CAAC,KAAU,KAAU,SAAe;AACzC,UAAM,WAAW,GAAG,IAAI,MAAM,IAAI,IAAI,IAAI;AAC1C,UAAM,QAAQ,OAAO,OAAO,QAAQ;AACpC,QAAI,CAAC,MAAO,QAAO,KAAK;AAIxB,QAAI,MAAM,OAAO;AACf,YAAM,WAAW,IAAI,QAAQ,WAAW;AACxC,UAAI,UAAU;AACZ,YAAI,CAAC,WAAW;AACd,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qEAAgE,CAAC;AAC/F;AAAA,QACF;AACA,cAAM,WAAW,MAAM;AACrB,cAAI;AAAE,mBAAO,sBAAsB,QAAQ;AAAA,UAAG,SACvCC,MAAK;AAAE,gBAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAQA,KAAc,QAAQ,CAAC;AAAG,mBAAO;AAAA,UAAM;AAAA,QACtF,GAAG;AACH,YAAI,CAAC,QAAS;AACd,YAAI,OAAO,QAAQ,KAAK,IAAI,OAAO,MAAM,KAAK,GAAG;AAC/C,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wBAAwB,UAAU,MAAM,OAAO,UAAU,QAAQ,MAAM,CAAC;AACtG;AAAA,QACF;AACA,iCAAyB;AAAA,UACvB,cAAc,UAAU;AAAA,UACxB,cAAc,UAAU;AAAA,UACxB,oBAAoB,MAAM,MAAM;AAAA,UAChC;AAAA,QACF,CAAC,EACE,KAAK,CAAC,WAAW;AAChB,cAAI;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL,KAAK,UAAU;AAAA,gBACb,WAAW,OAAO;AAAA,gBAClB,iBAAiB,OAAO;AAAA,gBACxB,SAAS;AAAA,cACX,CAAC;AAAA,YACH,EAAE,SAAS,QAAQ;AAAA,UACrB;AACA,eAAK;AAAA,QACP,CAAC,EACA,MAAM,CAACA,SAAe;AACrB,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wCAAwC,SAASA,KAAI,QAAQ,CAAC;AAAA,QAC9F,CAAC;AACH;AAAA,MACF;AAEA,YAAM,WAAW,MAAM;AACvB,YAAM,YAAY,wBAAwB;AAAA,QACxC,OAAO,MAAM;AAAA,QACb,OAAO,SAAS;AAAA,QAChB,OAAO,SAAS;AAAA,QAChB,oBAAoB,SAAS;AAAA,QAC7B,SAAS,SAAS;AAAA,QAClB,SAAS,SAAS;AAAA,QAClB,UAAU,IAAI;AAAA,QACd,aAAa,MAAM;AAAA,MACrB,CAAC;AACD,UAAI,UAAU,oBAAoB,SAAS;AAC3C,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,WAAW,CAAC,YAAY,EAAE,CAAC;AAC7E;AAAA,IACF;AAGA,QAAI,MAAM,MAAM;AACd,sBAAgB,KAAK,KAAK,MAAM,OAAO,kBAAkB;AACzD;AAAA,IACF;AAGA,SAAK,IAAI,QAAQ,mBAAmB,KAAK,IAAI,QAAQ,cAAc,MAAM,MAAM,MAAM;AAEnF,YAAM,iBAAiB,MAAM,KAAK,eAAe,OAAO;AACxD,UAAI,gBAAgB;AAClB,0BAAkB,gBAAgB,IAAI,SAAS,KAAK,EAAE,KAAK,CAAC,UAAU;AACpE,cAAI,MAAO,QAAO,KAAK;AACvB,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8BAA8B,CAAC;AAAA,QAC/D,CAAC,EAAE,MAAM,MAAM;AACb,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mCAAmC,CAAC;AAAA,QACpE,CAAC;AACD;AAAA,MACF;AAEA,aAAO,KAAK;AAAA,IACd;AAGA,UAAM,aAAa,IAAI,QAAQ,eAAe;AAC9C,QAAI,YAAY,WAAW,UAAU,KAAK,MAAM,KAAK;AACnD,aAAO,KAAK;AAAA,IACd;AAGA,UAAM,iBAAiB,IAAI,QAAQ,mBAAmB;AACtD,QAAI,IAAI,QAAQ,cAAc,KAAK,MAAM,UACpC,mBAAmB,iBAAiB,mBAAmB,gBAAgB;AAC1E,aAAO,KAAK;AAAA,IACd;AAGA,QAAI,MAAM,QAAQ,CAAC,MAAM,OAAO;AAC9B,YAAM,UAAU,MAAM,KAAK,WAAW;AACtC,YAAM,QAAQ,MAAM,KAAK,SAAS,OAAO,cAAc,EAAE,OAAO;AAChE,YAAM,YAAY,OAAO,KAAK,KAAK,UAAU;AAAA,QAC3C,aAAa;AAAA,QACb,SAAS,CAAC,EAAE,QAAQ,SAAS,SAAS,mBAAmB,MAAM,OAAO,OAAO,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,MACxG,CAAC,CAAC,EAAE,SAAS,QAAQ;AACrB,UAAI,UAAU,oBAAoB,SAAS;AAAA,IAC7C;AAEA,QAAI,MAAM,OAAO;AACf,YAAM,UAAU,MAAM,MAAM,WAAW;AACvC,YAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,eAAe,EAAE,OAAO;AAClE,YAAM,SAAS,MAAM,MAAM,UAAU;AACrC,YAAM,YAAY,OAAO,KAAK,KAAK,UAAU;AAAA,QAC3C,aAAa;AAAA,QACb,SAAS,CAAC,EAAE,QAAQ,SAAS,mBAAmB,MAAM,OAAO,OAAO,OAAO,MAAM,MAAM,MAAM,CAAC;AAAA,MAChG,CAAC,CAAC,EAAE,SAAS,QAAQ;AACrB,UAAI,UAAU,oBAAoB,SAAS;AAAA,IAC7C;AAEA,QAAI,MAAM,KAAK;AACb,YAAM,YAAY,MAAM,IAAI,aAAa,OAAO,KAAK,aAAa;AAClE,YAAM,WAAW,MAAM,IAAI,YAAY,OAAO,KAAK,YAAY;AAE/D,UAAI;AAAA,QACF;AAAA,QACA,kBAAkB,IAAI,YAAY,KAAK,iDAAiD,QAAQ,cAAc,MAAM,KAAK,iBAAiB,SAAS;AAAA,MACrJ;AAAA,IACF;AAEA,UAAM,YAAY,CAAC,MAAM,QAAQ,CAAC,MAAM,SAAS,QAAQ,MAAM,OAAO,OAAO,MAAM,SAAS,YAAY,EAAE,OAAO,OAAO;AACxH,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,UAAU,CAAC;AAAA,EAC/D;AACF;AAgBA,eAAsB,iBAAiB,QAAiE;AACtG,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,cAAqB;AAC1D,SAAO,KAAK,OAAO;AAAA,IACjB,GAAI,OAAO,SAAS,EAAE,OAAO,OAAO,MAAM;AAAA,IAC1C,SAAS,CAAC,MAAM,EAAE,UAAU,OAAO,UAAU,WAAW,OAAO,UAAU,CAAC,CAAC;AAAA,EAC7E,CAAC;AACH;AAaA,IAAM,eAAe,oBAAI,IAA+B;AACxD,IAAM,sBAAsB,KAAK,KAAK;AAWtC,IAAM,mBAAmB,oBAAI,IAAmC;AAChE,SAAS,eAAe,KAAoC;AAC1D,MAAI,IAAI,iBAAiB,IAAI,GAAG;AAChC,MAAI,CAAC,GAAG;AACN,QAAI,IAAI,sBAAsB,GAAG;AACjC,qBAAiB,IAAI,KAAK,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;AAOA,IAAM,uBAAuB,oBAAI,IAAiC;AAClE,SAAS,kBAAkB,SAAsC;AAC/D,MAAI,IAAI,qBAAqB,IAAI,OAAO;AACxC,MAAI,CAAC,GAAG;AACN,QAAI,IAAI,eAAe,YAAY,YAAY,iBAAiB,cAAc;AAC9E,yBAAqB,IAAI,SAAS,CAAC;AAAA,EACrC;AACA,SAAO;AACT;AAYA,SAAS,mBACP,OACA,WACQ;AACR,QAAM,MAAM,MAAM;AAClB,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,UAAUC,YAAW,OAAO;AAClC,QAAM,cAAc,IAAI,SAAS;AACjC,QAAM,eAAwC;AAAA,IAC5C,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,gBAAgB,UAAU,YAAY;AAAA,IAC7C,OAAO,IAAI;AAAA,IACX,QAAQ,MAAM;AAAA,IACd,mBAAmB;AAAA,IACnB,OAAO;AAAA,MACL,WAAW,IAAI,aAAa;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACA,MAAI,gBAAgB,SAAS;AAC3B,iBAAa,MAAM,SAAS,eAAe,OAAO;AAAA,EACpD;AACA,SAAO,4BAA4B,EAAE,aAAa,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;AAChF;AAcA,SAAS,gBAAgB,KAAU,KAAU,MAAY,OAA2B,QAA2B;AAC7G,OAAK,aAAa,KAAK,KAAK,MAAM,OAAO,MAAM,EAAE,MAAM,CAACC,SAAQ;AAE9D,QAAI,OAAQ,IAAkC,gBAAgB,aACtD,IAAkC,YAAa;AACvD,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,+BAA+B,QAASA,KAAc,QAAQ,CAAC;AAAA,EAC/F,CAAC;AACH;AAEA,eAAe,aACb,KACA,KACA,MACA,OACA,QACe;AACf,QAAM,MAAM,MAAM;AAClB,QAAM,UAAUD,YAAW,IAAI,WAAW,QAAQ;AAClD,QAAM,cAAc,IAAI,SAAS;AAGjC,MAAI,gBAAgB,SAAS;AAC3B,UAAM,SAAS,eAAe,OAAO;AACrC,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM,gBAAgB,kBAAkB,OAAO,GAAG;AAAA,QACxD,SAAS,IAAI;AAAA,QACb;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,SAASC,MAAK;AACZ,YAAM,IAAIA;AACV,UAAI,OAAO,GAAG,EAAE,KAAK;AAAA,QACnB,OAAO,EAAE,QAAQ;AAAA,QACjB,QAAQ,EAAE;AAAA,QACV,MAAM,EAAE;AAAA,MACV,CAAC;AACD;AAAA,IACF;AACA,QAAI,CAAC,MAAM,IAAI;AACb,UAAI,OAAO,GAAG,EAAE,KAAK;AAAA,QACnB,OAAO;AAAA,QACP,QAAQ,MAAM;AAAA,QACd,MAAM,SACF,2FACA;AAAA,MACN,CAAC;AACD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YACH,IAAI,QAAQ,mBAAmB,KAC/B,IAAI,QAAQ,mBAAmB;AAGlC,MAAI,WAAW;AACb,UAAM,kBAAkB,KAAK,KAAK,MAAM,OAAO,SAAS;AACxD;AAAA,EACF;AAGA,QAAM,YAAY,IAAI,aAAa,gBAAgB;AACnD,QAAM,WAAW,GAAG,IAAI,MAAM,IAAI,IAAI,IAAI;AAC1C,eAAa,IAAI,WAAW;AAAA,IAC1B;AAAA,IACA,WAAW,KAAK,IAAI,IAAI;AAAA,IACxB,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,YAAY,mBAAmB,OAAO,SAAS;AACrD,MAAI,UAAU,oBAAoB,SAAS;AAC3C,MAAI,OAAO,GAAG,EAAE,KAAK;AAAA,IACnB,OAAO;AAAA,IACP,WAAW,CAAC,WAAW;AAAA,IACvB,aAAa,IAAI,eAAe,MAAM;AAAA,IACtC;AAAA,EACF,CAAC;AACH;AAEA,eAAe,kBACb,KACA,KACA,MACA,OACA,WACe;AACf,QAAM,MAAM,MAAM;AAClB,QAAM,UAAUD,YAAW,IAAI,WAAW,QAAQ;AAClD,QAAM,iBAAiB,IAAI,kBAAkB,sBAAsB,OAAO;AAG1E,MAAI;AACJ,MAAI;AACF,eAAW,6BAA6B,SAAS;AAAA,EACnD,SAASC,MAAK;AACZ,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qBAAqB,QAASA,KAAsB,QAAQ,CAAC;AAC3F;AAAA,EACF;AACA,QAAM,WAAW,SAAS;AAI1B,QAAM,UAAU,aAAa,IAAI,SAAS,MAAM,SAAS;AACzD,MAAI,CAAC,SAAS;AACZ,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AACjD;AAAA,EACF;AACA,MAAI,QAAQ,UAAU;AACpB,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,2BAA2B,CAAC;AAC1D;AAAA,EACF;AACA,MAAI,QAAQ,YAAY,KAAK,IAAI,GAAG;AAClC,iBAAa,OAAO,SAAS,MAAM,SAAS;AAC5C,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AACjD;AAAA,EACF;AACA,MAAI,QAAQ,aAAa,GAAG,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI;AACpD,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,yBAAyB,CAAC;AACxD;AAAA,EACF;AAGA,QAAM,iBAAiB,IAAI,SAAS,aAAa,UAAU,YAAY;AACvE,MACE,SAAS,UAAU,IAAI,SACvB,SAAS,WAAW,MAAM,SAC1B,SAAS,aAAa,IAAI,WAAW,aACrC,SAAS,UAAU,eACnB;AACA,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;AAAA,EACF;AAGA,QAAM,MAAM,eAAe,cAAc;AACzC,MAAI;AACJ,MAAI;AACF,QAAI,MAAM,IAAI,OAAO,EAAE,gBAAgB,UAAU,qBAAqB,SAAS,CAAC;AAAA,EAClF,SAASA,MAAK;AACZ,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAASA,KAAsB,QAAQ,CAAC;AACvF;AAAA,EACF;AACA,MAAI,CAAC,EAAE,SAAS;AACd,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,QAAQ,EAAE,cAAc,CAAC;AACzE;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,QAAI,MAAM,IAAI,OAAO,EAAE,gBAAgB,UAAU,qBAAqB,SAAS,CAAC;AAAA,EAClF,SAASA,MAAK;AACZ,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAASA,KAAsB,QAAQ,CAAC;AACvF;AAAA,EACF;AACA,MAAI,CAAC,EAAE,SAAS;AACd,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,QAAQ,EAAE,YAAY,CAAC;AACvE;AAAA,EACF;AAGA,UAAQ,WAAW;AACnB,MAAI;AAAA,IACF;AAAA,IACA,4BAA4B;AAAA,MAC1B,SAAS;AAAA,MACT,aAAa,EAAE;AAAA,MACf,SAAS,SAAS;AAAA,MAClB,OAAO,EAAE,SAAS,EAAE;AAAA,IACtB,CAAC;AAAA,EACH;AACA,OAAK;AACP;AAGA,SAAS,kBAA0B;AACjC,QAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,SAAO,gBAAgB,KAAK;AAC5B,QAAM,CAAC,IAAK,MAAM,CAAC,IAAI,KAAQ;AAC/B,QAAM,CAAC,IAAK,MAAM,CAAC,IAAI,KAAQ;AAC/B,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,MAAO,KAAI,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAC/D,SAAO,GAAG,IAAI,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;AACvJ;AAKO,SAAS,qBAAqB,QAAuB;AAAG,SAAO,CAAC,MAAW,QAAa;AAC3F,UAAM,SAAS,OAAO,QAAQ,OAAO,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO;AAAA,MAClE;AAAA,MACA,OAAO,IAAI;AAAA,MACX,aAAa,IAAI;AAAA,MACjB,WAAW,CAAC,IAAI,QAAQ,CAAC,IAAI,SAAS,QAAQ,IAAI,OAAO,OAAO,IAAI,SAAS,YAAY,EAAE,OAAO,OAAO;AAAA,IAC3G,EAAE;AACF,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,EAC/C;AACF;AAGA,eAAe,kBACb,gBACA,SACA,OACkB;AAClB,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,cAAc,WAAW;AAAA,MAClD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,kBAAkB,QAAQ,mBAAmB;AAAA,QAC7C,WAAW,QAAQ,cAAc;AAAA,QACjC,OAAO,MAAM,MAAM;AAAA,QACnB,mBAAmB,MAAM;AAAA,QACzB,SAAS,MAAM,MAAM,WAAW;AAAA,MAClC,CAAC;AAAA,IACH,CAAC;AACD,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,IAAM,uBACJ;AACF,IAAM,qBACJ;AAGF,IAAM,mBAAmB,oBAAI,IAAY;AAGzC,SAAS,mBAAmB,OAAuB;AACjD,UAAQ,OAAO,MAAM,MAAM,GAAG,GAAG,YAAY;AAC/C;AAMO,SAAS,wBAAwB,WAQ/B;AACP,MAAI;AACF,UAAM,UAAU,KAAK,MAAM,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,CAAC;AACtE,QAAI,QAAQ,WAAW,WAAW,OAAO,QAAQ,WAAW,SAAU,QAAO;AAC7E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAiCA,eAAsB,wBACpB,OAC4B;AAC5B,QAAM,UAAU,wBAAwB,MAAM,SAAS;AACvD,MAAI,CAAC,QAAS,QAAO,EAAE,IAAI,OAAO,QAAQ,iBAAiB;AAE3D,QAAM,SAAS,QAAQ;AACvB,MAAI,iBAAiB,IAAI,MAAM,EAAG,QAAO,EAAE,IAAI,OAAO,QAAQ,sBAAsB;AAEpF,QAAM,UAAU,MAAM,MAAM,IAAI,sBAAsB,EAAE,MAAM,OAAO,CAAC;AACtE,MAAI,CAAC,QAAS,QAAO,EAAE,IAAI,OAAO,QAAQ,mBAAmB;AAC7D,QAAM,SAAS,QAAQ;AACvB,QAAM,KAAK,WAAW,aAAa,WAAW;AAC9C,MAAI,CAAC,GAAI,QAAO,EAAE,IAAI,OAAO,QAAQ,cAAc;AAGnD,QAAM,MAAM,MAAM,MAAM,IAAI,eAAe;AAC3C,QAAM,WAAW,MAAM,eAAe;AACtC,MAAI,MAAM,QAAQ,cAAc,SAAU,QAAO,EAAE,IAAI,OAAO,QAAQ,aAAa;AAGnF,QAAM,cAAc,QAAQ,KAAK;AAAA,IAC/B,CAAC,MACC,EAAE,QAAQ,YAAY,MAAM,MAAM,cAAc,YAAY,KAC5D,EAAE,OAAO,CAAC,MAAM,wBAChB,EAAE,OAAO,WAAW,KACpB,mBAAmB,EAAE,OAAO,CAAC,CAAE,MAAM,MAAM,WAAW,YAAY,KAClE,OAAO,EAAE,IAAI,KAAK,MAAM;AAAA,EAC5B;AACA,MAAI,CAAC,YAAa,QAAO,EAAE,IAAI,OAAO,QAAQ,mCAAmC;AAEjF,mBAAiB,IAAI,MAAM;AAC3B,SAAO,EAAE,IAAI,MAAM,OAAO;AAC5B;AAgBA,eAAsB,yBACpB,OAC4B;AAC5B,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,OAAO,KAAK,MAAM,WAAW,QAAQ,EAAE,SAAS,CAAC;AAAA,EACxE,QAAQ;AACN,WAAO,EAAE,IAAI,OAAO,QAAQ,iBAAiB;AAAA,EAC/C;AACA,MAAI,QAAQ,WAAW,2BAA2B,CAAC,QAAQ,YAAY;AACrE,WAAO,EAAE,IAAI,OAAO,QAAQ,kCAAkC;AAAA,EAChE;AACA,QAAM,aAAa,QAAQ;AAC3B,MAAI,iBAAiB,IAAI,UAAU,EAAG,QAAO,EAAE,IAAI,OAAO,QAAQ,sBAAsB;AAExF,QAAM,UAAU,MAAM,MAAM,IAAI,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAC1E,MAAI,CAAC,QAAS,QAAO,EAAE,IAAI,OAAO,QAAQ,wBAAwB;AAClE,QAAM,KAAK,QAAQ,WAAW,aAAa,QAAQ,WAAW;AAC9D,MAAI,CAAC,GAAI,QAAO,EAAE,IAAI,OAAO,QAAQ,mBAAmB;AAExD,QAAM,MAAM,MAAM,MAAM,IAAI,eAAe;AAC3C,QAAM,WAAW,MAAM,eAAe;AACtC,MAAI,MAAM,QAAQ,cAAc,SAAU,QAAO,EAAE,IAAI,OAAO,QAAQ,aAAa;AAGnF,QAAM,UAAU,QAAQ,KAAK;AAAA,IAC3B,CAAC,MACC,EAAE,QAAQ,YAAY,MAAM,MAAM,cAAc,YAAY,KAC5D,EAAE,OAAO,CAAC,MAAM,wBAChB,EAAE,OAAO,WAAW,KACpB,EAAE,OAAO,CAAC,MAAM,sBAChB,mBAAmB,EAAE,OAAO,CAAC,CAAE,MAAM,MAAM,WAAW,YAAY,KAClE,OAAO,EAAE,IAAI,KAAK,MAAM;AAAA,EAC5B;AACA,MAAI,CAAC,QAAS,QAAO,EAAE,IAAI,OAAO,QAAQ,qCAAqC;AAE/E,mBAAiB,IAAI,UAAU;AAC/B,SAAO,EAAE,IAAI,MAAM,QAAQ,WAAW;AACxC;AAGO,SAAS,8BAAoC;AAClD,mBAAiB,MAAM;AACzB;;;AC1qBO,IAAM,yBAAkC;AACxC,IAAM,2BAAoC;AAEjD,IAAM,eAAe;AAErB,IAAM,eAAe;AAAA,EACnB;AAAA,IACE,MAAM;AAAA,IAAY,MAAM;AAAA,IAAY,iBAAiB;AAAA,IACrD,QAAQ,CAAC,EAAE,MAAM,YAAY,MAAM,SAAS,CAAC;AAAA,IAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AACF;AAEA,IAAM,iBAAiB;AAAA,EACrB;AAAA,IACE,MAAM;AAAA,IAAgB,MAAM;AAAA,IAAY,iBAAiB;AAAA,IACzD,QAAQ;AAAA,MACN,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,MAAG,EAAE,MAAM,SAAS,MAAM,SAAS;AAAA,MACtE,EAAE,MAAM,iBAAiB,MAAM,QAAQ;AAAA,MAAG,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,MAC1E,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,MAAG,EAAE,MAAM,YAAY,MAAM,SAAS;AAAA,MACtE,EAAE,MAAM,eAAe,MAAM,SAAS;AAAA,MAAG,EAAE,MAAM,gBAAgB,MAAM,UAAU;AAAA,IACnF;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IAAc,MAAM;AAAA,IAAY,iBAAiB;AAAA,IACvD,QAAQ;AAAA,MACN,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,MAAG,EAAE,MAAM,mBAAmB,MAAM,YAAY;AAAA,MACnF,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,MAAG,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IACrE;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,SAAS,YAAY;AAAA,MAC/C,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,MAAG,EAAE,MAAM,OAAO,MAAM,SAAS;AAAA,IACpE,EAAC,CAAC;AAAA,EACJ;AACF;AAMO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAmB,SAAS,4BAA4B,UAAU,MAAM;AAClF,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,cAAc,UAAgC;AAClD,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,MAAM;AAClD,UAAM,OAAO,mBAAmB,EAAE,KAAK,cAAc,cAAc,YAAY,MAAM,CAAC,QAAQ,EAAE,CAAC;AACjG,UAAM,SAAS,MAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,wBAAwB,KAAK,GAAG,KAAK,OAAO;AACnG,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,aAAa,SAAiB,OAAe,UAAgC;AACjF,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,MAAM;AAClD,UAAM,OAAO,mBAAmB;AAAA,MAC9B,KAAK;AAAA,MAAgB,cAAc;AAAA,MACnC,MAAM,CAAC,SAAS,OAAO,KAAK,GAAG,GAAG,cAAc,cAAc,UAAU,IAAI,YAAY;AAAA,IAC1F,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,0BAA0B,KAAK,GAAG,KAAK,OAAO;AACrG,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,WAAW,SAA0D;AACzE,UAAM,EAAE,oBAAAC,qBAAoB,MAAAC,MAAK,IAAI,MAAM,OAAO,MAAM;AACxD,UAAM,SAASD,oBAAmB,EAAE,WAAWC,MAAK,KAAK,MAAM,EAAE,CAAC;AAClE,WAAO,OAAO,aAAa;AAAA,MACzB,SAAS;AAAA,MAA0B,KAAK;AAAA,MACxC,cAAc;AAAA,MAAc,MAAM,CAAC,SAAS,CAAC,GAAG,cAAc,YAAY;AAAA,IAC5E,CAAC;AAAA,EACH;AACF;;;AC7EO,IAAM,eAAiC;AAAA,EAC5C;AAAA,IACE,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,EAAE,QAAQ,SAAS,SAAS,gBAAgB,OAAO,8CAA8C,mBAAmB,SAAS,OAAO,6CAA6C,CAAC;AAAA,EAC9L;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,EAAE,QAAQ,SAAS,SAAS,gBAAgB,OAAO,8CAA8C,mBAAmB,SAAS,OAAO,6CAA6C,CAAC;AAAA,EAC9L;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,EAAE,QAAQ,SAAS,SAAS,gBAAgB,OAAO,8CAA8C,mBAAmB,UAAU,OAAO,6CAA6C,CAAC;AAAA,EAC/L;AACF;;;ACbO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA;AAAA,EAER,YAAY,SAA6B,CAAC,GAAG;AAC3C,SAAK,iBAAiB,OAAO;AAC7B,SAAK,UAAU,OAAO,eAAe,CAAC,OAAO;AAAA,EAC/C;AAAA,EAEA,MAAM,aAAa,QAA+D;AAChF,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,QAAQ,QAAQ;AAC1B,aAAO,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAChD;AACA,UAAM,MAAM,GAAG,KAAK,cAAc,uBAAuB,QAAQ,OAAO,SAAS,OAAO,IAAI,KAAK,EAAE;AACnG,UAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,EAAE;AAC9D,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,OAA4C;AACvD,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,YAAY;AAC5B,YAAM,YAAY,aAAa;AAAA,QAAO,CAAC,MACrC,EAAE,aAAa,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,SAAS,CAAC;AAAA,MACjF;AACA,aAAO,EAAE,WAAW,OAAO,UAAU,OAAO;AAAA,IAC9C;AACA,UAAM,MAAM,GAAG,KAAK,cAAc;AAClC,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,IAChC,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,wBAAwB,IAAI,MAAM,EAAE;AACjE,WAAO,IAAI,KAAK;AAAA,EAClB;AACF;AAEO,SAAS,mBAAmB,QAA2C;AAC5E,SAAO,IAAI,aAAa,MAAM;AAChC;;;AChDO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,SAAyB;AAAzB;AAAA,EAA0B;AAAA,EAA1B;AAAA,EAEpB,IAAI,WAAmB;AAAE,WAAO,KAAK,QAAQ;AAAA,EAAU;AAAA,EAEvD,yBAA4C;AAAE,WAAO,KAAK,QAAQ,uBAAuB;AAAA,EAAG;AAAA,EAC5F,SAAS,QAAmD;AAAE,WAAO,KAAK,QAAQ,SAAS,MAAM;AAAA,EAAG;AAAA,EACpG,SAAS,QAAwD;AAAE,WAAO,KAAK,QAAQ,SAAS,MAAM;AAAA,EAAG;AAC3G;;;ACRO,IAAM,qBAAN,MAAmD;AAAA,EAC/C,WAAW;AAAA,EAEpB,MAAM,yBAA4C;AAChD,WAAO,CAAC,OAAO,OAAO,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,SAAS,QAAmD;AAChE,UAAM,aAAa;AACnB,UAAM,SAAS,WAAW,OAAO,MAAM;AACvC,UAAM,cAAc,UAAU,IAAI,aAAa,MAAM,QAAQ,CAAC;AAC9D,WAAO,EAAE,YAAY,cAAc,OAAO,cAAc,YAAY,eAAe,EAAE;AAAA,EACvF;AAAA,EAEA,MAAM,SAAS,QAAwD;AACrE,UAAM,SAAS,WAAW,OAAO,MAAM;AACvC,UAAM,cAAc,SAAS,OAAO,QAAQ,CAAC;AAC7C,UAAM,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAQ,EAAE,YAAY;AAChE,WAAO,EAAE,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,QAAQ,cAAc,YAAY,cAAc,OAAO,kBAAkB,QAAQ;AAAA,EACtH;AACF;;;AC2BO,IAAM,2BACX,wEAAwE,MAAM,GAAG,EAAE;AAG9E,IAAM,iBAA2D;AAAA,EACtE,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,sBAAsB,EAAE,aAAa,cAAc,MAAM,SAAS;AAAA,EACpE;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,sBAAsB,EAAE,aAAa,cAAc,MAAM,cAAc;AAAA,EACzE;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,sBAAsB,EAAE,aAAa,iBAAiB,MAAM,YAAY;AAAA,IACxE,aAAa;AAAA,EACf;AACF;AAEO,IAAM,wBAAwB,OAAO,KAAK,cAAc;AAMxD,SAAS,gBAAgB,QAA8B;AAC5D,QAAM,QAAQ,OAAO,YAAY;AACjC,QAAM,QAAQ,eAAe,KAAK;AAClC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,0BAA0B,MAAM;AAAA,MAChC;AAAA,MACA,iBAAiB,sBAAsB,KAAK,IAAI,CAAC;AAAA,IACnD;AAAA,EACF;AACA,MAAI,MAAM,aAAa;AACrB,UAAM,WAAW,QAAQ,IAAI,MAAM,WAAW;AAC9C,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,aAAO,EAAE,GAAG,OAAO,QAAQ,UAAU,UAAU,KAAK;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AACT;AAGA,IAAMC,WAAU,oBAAI,IAAY;AACzB,SAAS,qBAAqB,OAA2B;AAC9D,MAAI,MAAM,SAAU;AACpB,MAAIA,SAAQ,IAAI,MAAM,IAAI,EAAG;AAC7B,EAAAA,SAAQ,IAAI,MAAM,IAAI;AAGtB,UAAQ;AAAA,IACN,iDAAiD,MAAM,IAAI,iCAClD,MAAM,eAAe,WAAW,MAAM,IAAI,SAAS;AAAA,EAC9D;AACF;AAMO,SAAS,kBAAkB,QAAyB,QAAwB;AACjF,QAAM,QAAQ,gBAAgB,MAAM;AACpC,QAAM,MAAM,OAAO,MAAM;AACzB,MAAI,CAAC,gBAAgB,KAAK,GAAG,GAAG;AAC9B,UAAM,IAAI;AAAA,MACR,sBAAsB,MAAM,KAAK,GAAG;AAAA,MACpC;AAAA,MACA,sCAAsC,MAAM,QAAQ;AAAA,IACtD;AAAA,EACF;AACA,QAAM,CAAC,OAAO,OAAO,EAAE,IAAI,IAAI,MAAM,GAAG;AACxC,QAAM,UAAU,OAAO,IAAI,OAAO,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,QAAQ;AAC1E,SAAO,OAAO,KAAK,IAAI,OAAO,OAAO,MAAM,QAAQ,IAAI,OAAO,UAAU,GAAG;AAC7E;AAMO,SAAS,mBACd,QACA,QACA,iBACQ;AACR,QAAM,QAAQ,gBAAgB,MAAM;AACpC,QAAM,KAAK,mBAAmB,MAAM;AACpC,QAAM,UAAU,OAAO,OAAO,MAAM,QAAQ;AAC5C,QAAM,QAAQ,SAAS;AACvB,MAAI,OAAO,EAAG,QAAO,MAAM,SAAS;AACpC,QAAM,OAAO,SAAS;AACtB,QAAM,UAAU,KAAK,SAAS,EAAE,SAAS,MAAM,UAAU,GAAG,EAAE,MAAM,GAAG,EAAE;AACzE,SAAO,GAAG,KAAK,IAAI,OAAO;AAC5B;;;ACvIA,IAAM,qBAAqB;AAO3B,eAAe,iBAAiB,KAAa,OAAoB,CAAC,GAAG,KAAa,oBAAuC;AACvH,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,WAAW,KAAK;AACtB,MAAI,UAAU;AACZ,QAAI,SAAS,QAAS,YAAW,MAAM;AAAA,QAClC,UAAS,iBAAiB,SAAS,MAAM,WAAW,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,EAClF;AACA,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,EAAE;AACrD,MAAI;AACF,WAAO,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,WAAW,OAAO,CAAC;AAAA,EAChE,SAASC,MAAK;AACZ,QAAKA,MAA2B,SAAS,cAAc;AACrD,UAAI,SAAS;AACb,UAAI;AAAE,iBAAS,IAAI,IAAI,GAAG,EAAE;AAAA,MAAQ,QAAQ;AAAA,MAAiB;AAC7D,YAAM,IAAI;AAAA,QACR,kCAAkC,EAAE,OAAO,GAAG;AAAA,QAC9C;AAAA,QACA,uCAAuC,EAAE,+BAA+B,MAAM;AAAA,MAChF;AAAA,IACF;AACA,UAAMA;AAAA,EACR,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAyDA,IAAM,kBAAsC;AAAA,EAC1C;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,iBAAiB,CAAC,QAAQ,OAAO;AAAA,IACjC,eAAe,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IACtE,oBAAoB,CAAC,QAAQ;AAAA,IAC7B,aAAa,CAAC;AAAA,IACd,oBAAoB;AAAA,MAClB,EAAE,MAAM,QAAQ,IAAI,OAAO,WAAW,CAAC,QAAQ,EAAE;AAAA,MACjD,EAAE,MAAM,SAAS,IAAI,OAAO,WAAW,CAAC,QAAQ,EAAE;AAAA,IACpD;AAAA,EACF;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,iBAAiB,CAAC,QAAQ,MAAM;AAAA,IAChC,eAAe,CAAC,OAAO,OAAO,KAAK;AAAA,IACnC,oBAAoB,CAAC,MAAM,MAAM,IAAI;AAAA,IACrC,aAAa,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,iBAAiB,CAAC,QAAQ,MAAM;AAAA,IAChC,eAAe,CAAC,OAAO,KAAK;AAAA,IAC5B,oBAAoB,CAAC,IAAI;AAAA,IACzB,aAAa,CAAC;AAAA,EAChB;AACF;AAEO,IAAM,wBAAN,MAAsD;AAAA,EAC1C;AAAA,EACA,SAA6B,CAAC;AAAA,EAE/C,YAAY,WAA+B,iBAAiB;AAE1D,SAAK,WAAW,SAAS,IAAI,CAAC,OAAO;AAAA,MACnC,GAAG;AAAA,MACH,aAAa,EAAE,GAAG,EAAE,YAAY;AAAA,MAChC,oBAAoB,EAAE,oBAAoB,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;AAAA,IAC9F,EAAE;AAAA,EACJ;AAAA,EAEA,IAAI,GAA2B;AAC7B,SAAK,OAAO,KAAK;AAAA,MACf,GAAG;AAAA,MACH,aAAa,EAAE,GAAG,EAAE,YAAY;AAAA,MAChC,oBAAoB,EAAE,oBAAoB,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;AAAA,IAC9F,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAoC;AACxC,WAAO,CAAC,GAAG,KAAK,UAAU,GAAG,KAAK,MAAM;AAAA,EAC1C;AAAA,EAEA,MAAM,SAAS,YAAsD;AACnE,UAAM,MAAM,MAAM,KAAK,KAAK;AAC5B,UAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,eAAe,UAAU,KAAK;AAC9D,QAAI,MAAO,OAAM,KAAK,mBAAmB,KAAK;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OACJ,OACA,MACA,SAC6B;AAC7B,UAAM,MAAM,MAAM,KAAK,KAAK;AAC5B,UAAM,UAAU,IAAI;AAAA,MAClB,CAAC,MACC,EAAE,gBAAgB,SAAS,KAAK,KAChC,EAAE,cAAc,SAAS,IAAI,MAC5B,EAAE,mBAAmB,SAAS,OAAO,KAAK,EAAE,mBAAmB,SAAS,QAAQ;AAAA,IACrF;AACA,eAAW,KAAK,QAAS,OAAM,KAAK,mBAAmB,CAAC;AACxD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,mBAAmB,GAAoC;AACnE,QAAI,EAAE,YAAY,kBAAkB,EAAE,YAAY,oBAAqB;AAEvE,UAAM,UACJ,QAAQ,IAAI,kBAAkB,EAAE,WAAW,QAAQ,OAAO,GAAG,EAAE,YAAY,CAAC,WAAW,KACvF,WAAW,EAAE,UAAU;AAEzB,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,MAAM,iBAAiB,SAAS,CAAC,CAAC;AAC9C,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI;AAAA,UACR,iCAAiC,EAAE,UAAU,KAAK,IAAI,MAAM;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AACA,aAAO,MAAM,IAAI,KAAK;AAAA,IACxB,SAASA,MAAK;AACZ,UAAIA,gBAAe,cAAe,OAAMA;AACxC,YAAM,IAAI;AAAA,QACR,iCAAiC,EAAE,UAAU,KAAMA,KAAc,OAAO;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,CAAC,MAAkC;AAC7C,YAAM,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,sBAAsB,GAAG,CAAC;AAC/D,aAAO,IAAI,CAAC;AAAA,IACd;AACA,MAAE,YAAY,iBAAiB,IAAI,iBAAiB,KAAK,IAAI,yBAAyB;AACtF,MAAE,YAAY,sBAAsB,IAAI,uBAAuB;AAC/D,MAAE,YAAY,cAAc,IAAI,qBAAqB;AACrD,MAAE,YAAY,kBAAkB,IAAI,mBAAmB;AACvD,MAAE,YAAY,YAAY,IAAI,YAAY;AAAA,EAC5C;AACF;AAmFO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,WAA2B,IAAI,sBAAsB,GAAG;AAAxD;AAAA,EAAyD;AAAA,EAAzD;AAAA;AAAA,EAG7B,MAAM,WACJ,OACA,MACA,SAC6B;AAC7B,WAAO,KAAK,SAAS,OAAO,OAAO,MAAM,OAAO;AAAA,EAClD;AAAA;AAAA,EAGA,MAAM,SAAS,OAAqD;AAElE,yBAAqB,gBAAgB,MAAM,KAAK,CAAC;AAEjD,UAAM,SAAS,MAAM,KAAK,aAAa,KAAK;AAC5C,QAAI,CAAC,OAAO,YAAY,kBAAkB,CAAC,OAAO,YAAY,iBAAiB;AAC7E,YAAM,IAAI;AAAA,QACR,UAAU,OAAO,IAAI;AAAA,QACrB;AAAA,QACA,gCAAgC,OAAO,WAAW,QAAQ,OAAO,GAAG,EAAE,YAAY,CAAC;AAAA,MACrF;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,MAAM,MAAM,KAAK,UAAU,QAAQ,MAAM,QAAQ,WAAW,SAAS;AAE3E,UAAM,UAAU,MAAM;AAAA,MACpB,GAAG,OAAO,YAAY,cAAc;AAAA,MACpC;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,EAAE,eAAe,UAAU,GAAG,IAAI,gBAAgB,mBAAmB;AAAA,QAC9E,MAAM,KAAK,UAAU;AAAA,UACnB,YAAY,MAAM;AAAA,UAClB,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM,OAAO;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,IAAI;AACf,YAAM,IAAI;AAAA,QACR,oCAAoC,QAAQ,MAAM,IAAI,QAAQ,UAAU;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AACA,UAAM,OAAQ,MAAM,QAAQ,KAAK;AAEjC,WAAO;AAAA,MACL,eAAe,KAAK;AAAA,MACpB,aAAa,KAAK;AAAA,MAClB;AAAA,MACA,QAAQ,MAAM,KAAK,WAAW,QAAQ,KAAK,KAAK,IAAI,SAAS;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,OAAuD;AACjE,yBAAqB,gBAAgB,MAAM,KAAK,CAAC;AAEjD,UAAM,SAAS,MAAM,KAAK,aAAa,KAAK;AAC5C,QAAI,CAAC,OAAO,YAAY,eAAe,CAAC,OAAO,YAAY,iBAAiB;AAC1E,YAAM,IAAI;AAAA,QACR,UAAU,OAAO,IAAI;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,MAAM,MAAM,KAAK,UAAU,QAAQ,MAAM,QAAQ,WAAW,SAAS;AAE3E,UAAM,QAAQ,gBAAgB,MAAM,KAAK;AACzC,UAAM,YAAY,WAAW,MAAM,IAAI,IAAI,MAAM,MAAM;AACvD,UAAM,WAAW,WAAW,MAAM,IAAI;AACtC,UAAM,KAAK,IAAI,gBAAgB;AAAA,MAC7B,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,aAAa,MAAM;AAAA,MACnB,cAAc,MAAM;AAAA,IACtB,CAAC;AAED,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,OAAO,YAAY,WAAW,UAAU,GAAG,SAAS,CAAC;AAAA,MACxD,EAAE,SAAS,EAAE,eAAe,UAAU,GAAG,GAAG,EAAE;AAAA,MAC9C;AAAA,IACF;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,wBAAwB,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,QACpD;AAAA,QACA,qEAAqE,OAAO,UAAU;AAAA,MACxF;AAAA,IACF;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAO7B,WAAO;AAAA,MACL,MAAM,KAAK,SAAS;AAAA,MACpB,WAAW,KAAK,cAAc;AAAA,MAC9B,UAAU,KAAK,KAAK;AAAA,MACpB,YAAY,KAAK,KAAK;AAAA,MACtB,SAAS,KAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,OAAmD;AACjE,yBAAqB,gBAAgB,MAAM,KAAK,CAAC;AAEjD,UAAM,SAAS,MAAM,KAAK,aAAa,KAAK;AAC5C,QAAI,CAAC,OAAO,YAAY,uBAAuB,CAAC,OAAO,YAAY,iBAAiB;AAClF,YAAM,IAAI;AAAA,QACR,UAAU,OAAO,IAAI;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,MAAM,MAAM,KAAK,UAAU,QAAQ,MAAM,QAAQ,WAAW,SAAS;AAE3E,UAAM,OAAgC;AAAA,MACpC,QAAQ,MAAM;AAAA,MACd,YAAY,MAAM;AAAA,MAClB,gBAAgB,MAAM,OAAO;AAAA,IAC/B;AACA,QAAI,MAAM,WAAY,MAAK,cAAc,MAAM;AAC/C,QAAI,MAAM,QAAS,MAAK,WAAW,MAAM;AACzC,QAAI,MAAM,OAAQ,MAAK,SAAS,MAAM;AAEtC,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,OAAO,YAAY,mBAAmB;AAAA,MACzC;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,EAAE,eAAe,UAAU,GAAG,IAAI,gBAAgB,mBAAmB;AAAA,QAC9E,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,iCAAiC,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,QAC7D;AAAA,QACA,mIAAmI,OAAO,YAAY,aAAa,gBAAgB;AAAA,MACrL;AAAA,IACF;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAQ7B,WAAO;AAAA,MACL,eAAe,KAAK;AAAA,MACpB,aAAa,KAAK,qBAAqB;AAAA,MACvC,iBAAiB,KAAK,qBAAqB;AAAA,MAC3C;AAAA,MACA,QAAQ,MAAM,KAAK,WAAW,QAAQ,KAAK,KAAK,IAAI,SAAS;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QACJ,QACA,OACA,MACA,QACA,UAAU,MACV,YAAY,MACZ,YAAoB,oBACI;AACxB,WAAO,KAAK,SAAS,EAAE,QAAQ,OAAO,MAAM,SAAS,QAAQ,WAAW,UAAU,CAAC;AAAA,EACrF;AAAA;AAAA,EAIA,MAAc,aAAa,OAMG;AAC5B,UAAM,aAAa,MAAM,eACpB,CAAC,MAAM,KAAK,SAAS,SAAS,MAAM,YAAY,CAAC,EAAE,OAAO,OAAO,IAClE,MAAM,KAAK,SAAS,OAAO,MAAM,OAAO,MAAM,MAAM,MAAM,OAAO;AAErE,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,IAAI;AAAA,QACR,sBAAsB,MAAM,MAAM,IAAI,MAAM,KAAK,WAAM,MAAM,IAAI,OAAO,MAAM,OAAO;AAAA,QACrF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,WAAW,CAAC;AAAA,EACrB;AAAA,EAEA,MAAc,UACZ,QACA,QACA,WACA,WACiB;AACjB,UAAM,aAAa,YACf,mDACA;AAEJ,UAAM,eAAe,MAAM;AAAA,MACzB,GAAG,OAAO,YAAY,eAAe,YAAY,mBAAmB,OAAO,OAAO,CAAC;AAAA,MACnF,CAAC;AAAA,MACD;AAAA,IACF;AACA,QAAI,CAAC,aAAa,IAAI;AACpB,YAAM,IAAI;AAAA,QACR,kCAAkC,aAAa,MAAM;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,YAAY,IAAK,MAAM,aAAa,KAAK;AACjD,UAAM,YAAY,MAAM,OAAO,gBAAgB,aAAa,UAAU;AAEtE,UAAM,WAAW,MAAM;AAAA,MACrB,OAAO,YAAY;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,aAAa,UAAU,CAAC;AAAA,MACjD;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,iCAAiC,SAAS,MAAM;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AACA,YAAS,MAAM,SAAS,KAAK,GAAyB;AAAA,EACxD;AAAA,EAEA,MAAc,WACZ,QACA,KACA,MACA,WACoE;AACpE,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,OAAO,YAAY,cAAc,mBAAmB,mBAAmB,IAAI,CAAC;AAAA,MAC/E,EAAE,SAAS,EAAE,eAAe,UAAU,GAAG,GAAG,EAAE;AAAA,MAC9C;AAAA,IACF;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,uBAAuB,IAAI,MAAM;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,YAAY,IAAK,MAAM,IAAI,KAAK;AAGxC,WAAO;AAAA,MACL,QAAQ,YAAY;AAAA,MACpB,WAAW,YAAY,aAAa,YAAY,cAAc;AAAA,MAC9D,WAAW,YAAY;AAAA,IACzB;AAAA,EACF;AACF;AAYO,SAAS,gBACd,QACA,OAII,CAAC,GACL;AACA,QAAM,WAAW,KAAK,YAAY,IAAI,sBAAsB;AAC5D,QAAM,SAAS,IAAI,oBAAoB,QAAQ;AAC/C,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,YAAY,KAAK,aAAa;AAGpC,MAAI,iBAAkG;AAEtG,SAAO;AAAA,IACL,MAAM,QACJ,QACA,OACA,MACA,UAAU,MACc;AACxB,aAAO,OAAO,QAAQ,QAAQ,OAAO,MAAM,QAAQ,SAAS,WAAW,SAAS;AAAA,IAClF;AAAA,IAEA,MAAM,MACJ,OAC6B;AAC7B,aAAO,OAAO,MAAM,EAAE,GAAG,OAAO,QAAQ,WAAW,UAAU,CAAC;AAAA,IAChE;AAAA,IAEA,MAAM,UACJ,OAC2B;AAC3B,aAAO,OAAO,UAAU,EAAE,GAAG,OAAO,QAAQ,WAAW,UAAU,CAAC;AAAA,IACpE;AAAA,IAEA,MAAM,YAA+F;AACnG,UAAI,eAAgB,QAAO;AAC3B,YAAM,UAAU,MAAM,SAAS,KAAK;AACpC,YAAM,OAAiF,CAAC;AACxF,iBAAW,KAAK,SAAS;AACvB,YAAI,EAAE,sBAAsB,EAAE,mBAAmB,SAAS,GAAG;AAC3D,qBAAW,KAAK,EAAE,oBAAoB;AACpC,iBAAK,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;AAAA,UACnF;AAAA,QACF,OAAO;AAEL,qBAAW,QAAQ,EAAE,iBAAiB;AACpC,uBAAW,MAAM,EAAE,eAAe;AAChC,mBAAK,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,IAAI,WAAW,CAAC,GAAG,EAAE,kBAAkB,EAAE,CAAC;AAAA,YAC9E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,uBAAiB;AACjB,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,QAA0C;AAC/C,aAAO,OAAO,OAAO;AAAA,IACvB;AAAA,EACF;AACF;;;ACxpBO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAA6B;AACvC,SAAK,YAAY,OAAO;AACxB,SAAK,SAAS,OAAO;AAAA,EACvB;AAAA,EAEA,MAAc,SAAS;AACrB,QAAI,KAAK,IAAK,QAAO,KAAK;AAC1B,QAAI;AACF,WAAK,MAAM,MAAM,OAAO,sBAAsB;AAC9C,aAAO,KAAK;AAAA,IACd,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAgC;AACpC,QAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,UAAM,UAAU,IAAI,QAAQ,WAAW,KAAK,SAAU;AACtD,SAAK,SAAS,QAAQ,UAAU;AAChC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,mBAA4C;AAC7E,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,cAAc,mCAAmC,mBAAmB;AACnG,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,UAAM,UAAU,IAAI,QAAQ,WAAW,KAAK,SAAS;AACrD,UAAM,KAAK,IAAI,mBAAmB,QAAQ,KAAK,iBAAiB;AAChE,OAAG,KAAK,OAAO;AACf,WAAO,GAAG,MAAM;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,cAAc,OAAgC;AAClD,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,cAAc,mCAAmC,mBAAmB;AACnG,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,UAAM,UAAU,IAAI,QAAQ,WAAW,KAAK,SAAS;AACrD,UAAM,SAAS,QAAQ,KAAK,OAAO,KAAK,OAAO,QAAQ,CAAC;AACxD,WAAO,OAAO,SAAS,QAAQ;AAAA,EACjC;AAAA,EAEA,YAAqB;AACnB,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AACF;;;ACrCA,IAAM,cAAc;AAOb,IAAM,sBAAN,MAA0B;AAAA,EACvB;AAAA,EACA;AAAA,EAER,YAAY,SAA8B,CAAC,GAAG;AAC5C,SAAK,UAAU,OAAO,UAAU;AAChC,SAAK,SAAS,OAAO;AAAA,EACvB;AAAA;AAAA,EAGA,MAAM,oBAAoB,QAAkF;AAC1G,WAAO,KAAK,KAAK,4BAA4B,MAAM;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,mBAAmB,QAAkF;AACzG,WAAO,KAAK,KAAK,2BAA2B,MAAM;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,WAAW,YAAoB,OAA2B,UAA4C;AAC1G,WAAO,KAAK,KAAK,WAAW,IAAI,wBAAwB,EAAE,WAAW,CAAC;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,sBAAsB,YAAoB,gBAAwB,QAAgB,OAA2B,UAA4C;AAC7J,WAAO,KAAK,KAAK,WAAW,IAAI,oCAAoC,EAAE,YAAY,gBAAgB,OAAO,CAAC;AAAA,EAC5G;AAAA;AAAA,EAGA,MAAM,iBAAiB,YAAoB,gBAAwB,OAA2B,UAA4C;AACxI,WAAO,KAAK,KAAK,WAAW,IAAI,8BAA8B,EAAE,YAAY,eAAe,CAAC;AAAA,EAC9F;AAAA;AAAA,EAGA,MAAM,aAAa,YAAsD;AACvE,WAAO,KAAK,KAAK,wCAAwC,EAAE,WAAW,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,sBAAsB,YAAoB,gBAA0D;AACxG,WAAO,KAAK,KAAK,iDAAiD,EAAE,YAAY,eAAe,CAAC;AAAA,EAClG;AAAA;AAAA,EAGA,MAAM,cAAc,YAAoB,OAA2B,UAA4C;AAC7G,WAAO,KAAK,KAAK,WAAW,IAAI,2BAA2B,EAAE,WAAW,CAAC;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,eAAe,YAAoB,OAA2B,UAA4C;AAC9G,WAAO,KAAK,KAAK,WAAW,IAAI,4BAA4B,EAAE,WAAW,CAAC;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,WAAW,YAA2C;AAC1D,WAAO,KAAK,IAAI,mDAAmD,UAAU,EAAE;AAAA,EACjF;AAAA;AAAA,EAGA,MAAM,cAAc,aAAqB,QAAuB,mBAA4C;AAC1G,UAAM,YAAY,MAAM,OAAO,gBAAgB,aAAa,iBAAiB;AAC7E,UAAM,SAAS,MAAM,KAAK,KAAuB,4BAA4B,EAAE,UAAU,CAAC;AAC1F,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAc,KAAc,MAAc,MAAuB;AAC/D,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MAChD,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,MACtB,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,cAAc,6BAA6B,IAAI,MAAM,IAAI,sBAAsB;AACtG,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAc,IAAa,MAA0B;AACnD,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAC7E,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,cAAc,6BAA6B,IAAI,MAAM,IAAI,sBAAsB;AACtG,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEQ,UAAkC;AACxC,UAAM,IAA4B,EAAE,gBAAgB,mBAAmB;AACvE,QAAI,KAAK,OAAQ,GAAE,eAAe,IAAI,UAAU,KAAK,MAAM;AAC3D,WAAO;AAAA,EACT;AACF;;;AC/FA,IAAM,6BAA6B;AACnC,IAAM,6BAA6B;AAM5B,IAAM,yBAAN,MAA6B;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO,oBAAI,IAA0B;AAAA,EAE7C,YAAY,QAAuB,QAA+B;AAChE,SAAK,SAAS;AACd,SAAK,QAAQ,OAAO;AACpB,SAAK,aAAa,OAAO,sBACtB,OAAO,UAAU,oBAAoB,6BAA6B;AACrE,SAAK,SAAS,IAAI,oBAAoB,OAAO,aAAa;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,UAAU,QAOU;AACxB,UAAM,eAAe,MAAM,KAAK,OAAO,aAAa;AACpD,UAAM,OAAO,OAAO,SAAS,OAAO,WAAW,SAAS,IAAI,UAAU;AAEtE,UAAM,eAAmC;AAAA,MACvC,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,iBAAiB,OAAO;AAAA,MACxB,UAAU,OAAO,YAAY;AAAA,MAC7B,eAAe;AAAA,MACf,YAAY,OAAO;AAAA,IACrB;AAEA,UAAM,SAAS,SAAS,UACpB,MAAM,KAAK,OAAO,mBAAmB,YAAY,IACjD,MAAM,KAAK,OAAO,oBAAoB,YAAY;AAEtD,UAAM,KAAK,OAAO,cAAc,OAAO,aAAa,KAAK,QAAQ,KAAK,UAAU;AAEhF,UAAM,MAAoB;AAAA,MACxB,IAAI,MAAM,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,MACjC,YAAY,OAAO;AAAA,MACnB;AAAA,MACA,QAAQ;AAAA,MACR,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO,YAAY;AAAA,MAC7B,QAAQ,OAAO;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,YAAY,OAAO,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,UAAU,EAAE;AAAA,MACpE,WAAW,KAAK,IAAI;AAAA,IACtB;AACA,SAAK,KAAK,IAAI,IAAI,IAAI,GAAG;AACzB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,QAAQ,OAAsC;AAClD,UAAM,MAAM,KAAK,cAAc,OAAO,CAAC,SAAS,CAAC;AACjD,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,OAAO,WAAW,IAAI,YAAY,IAAI,IAAI;AAC7E,UAAM,KAAK,OAAO,cAAc,aAAa,KAAK,QAAQ,KAAK,UAAU;AACzE,QAAI,SAAS;AACb,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,gBAAgB,OAAe,gBAA+C;AAClF,UAAM,MAAM,KAAK,cAAc,OAAO,CAAC,UAAU,aAAa,CAAC;AAC/D,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,OAAO,sBAAsB,IAAI,YAAY,gBAAgB,aAAa,IAAI,IAAI;AACrH,UAAM,KAAK,OAAO,cAAc,aAAa,KAAK,QAAQ,KAAK,UAAU;AACzE,QAAI,WAAW,cAAc,EAAE,SAAS;AACxC,QAAI,SAAS;AACb,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,kBAAkB,OAAe,gBAA+C;AACpF,UAAM,MAAM,KAAK,cAAc,OAAO,CAAC,aAAa,eAAe,QAAQ,CAAC;AAE5E,UAAM,EAAE,aAAa,WAAW,IAAI,MAAM,KAAK,OAAO,iBAAiB,IAAI,YAAY,gBAAgB,IAAI,IAAI;AAC/G,UAAM,KAAK,OAAO,cAAc,YAAY,KAAK,QAAQ,KAAK,UAAU;AACxE,QAAI,WAAW,cAAc,EAAE,SAAS;AAExC,QAAI,IAAI,SAAS,SAAS;AACxB,YAAM,EAAE,aAAa,WAAW,IAAI,MAAM,KAAK,OAAO,sBAAsB,IAAI,YAAY,cAAc;AAC1G,YAAM,KAAK,OAAO,cAAc,YAAY,KAAK,QAAQ,KAAK,UAAU;AAAA,IAC1E,OAAO;AACL,YAAM,cAAc,IAAI,WAAW,MAAM,OAAK,EAAE,WAAW,UAAU;AACrE,UAAI,aAAa;AACf,cAAM,EAAE,aAAa,WAAW,IAAI,MAAM,KAAK,OAAO,aAAa,IAAI,UAAU;AACjF,cAAM,KAAK,OAAO,cAAc,YAAY,KAAK,QAAQ,KAAK,UAAU;AAAA,MAC1E;AAAA,IACF;AAEA,QAAI,SAAS,IAAI,WAAW,MAAM,OAAK,EAAE,WAAW,UAAU,IAAI,aAAa;AAC/E,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,QAAQ,OAAsC;AAClD,UAAM,MAAM,KAAK,cAAc,OAAO,CAAC,UAAU,aAAa,aAAa,CAAC;AAC5E,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,OAAO,cAAc,IAAI,YAAY,IAAI,IAAI;AAChF,UAAM,KAAK,OAAO,cAAc,aAAa,KAAK,QAAQ,KAAK,UAAU;AACzE,QAAI,SAAS;AACb,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,QAAQ,OAAsC;AAClD,UAAM,MAAM,KAAK,cAAc,OAAO,CAAC,UAAU,CAAC;AAClD,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,OAAO,eAAe,IAAI,YAAY,IAAI,IAAI;AACjF,UAAM,KAAK,OAAO,cAAc,aAAa,KAAK,QAAQ,KAAK,UAAU;AACzE,QAAI,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,IAAsC;AAC3C,WAAO,KAAK,KAAK,IAAI,EAAE;AAAA,EACzB;AAAA,EAEQ,cAAc,IAAY,eAAmD;AACnF,UAAM,MAAM,KAAK,KAAK,IAAI,EAAE;AAC5B,QAAI,CAAC,IAAK,OAAM,IAAI,cAAc,kBAAkB,EAAE,IAAI,kBAAkB;AAC5E,QAAI,CAAC,cAAc,SAAS,IAAI,MAAM,GAAG;AACvC,YAAM,IAAI,cAAc,OAAO,EAAE,sBAAsB,IAAI,MAAM,IAAI,sBAAsB;AAAA,IAC7F;AACA,WAAO;AAAA,EACT;AACF;;;AC9HO,IAAM,sBAA8D;AAAA,EACzE,SAAS,CAAC,SAAS,MAAM;AAAA,EACzB,YAAY,CAAC,SAAS,MAAM;AAAA,EAC5B,SAAS,CAAC,SAAS,MAAM;AAAA,EACzB,eAAe,CAAC,QAAQ,OAAO;AAAA,EAC/B,eAAe,CAAC,QAAQ,MAAM;AAAA,EAC9B,SAAS,CAAC,QAAQ,MAAM;AAAA,EACxB,YAAY,CAAC,QAAQ,SAAS,MAAM;AAAA,EACpC,QAAQ,CAAC,MAAM;AAAA,EACf,kBAAkB,CAAC,QAAQ,SAAS,MAAM;AAC5C;AA4BA,IAAM,uBAAuB;AAStB,SAAS,YAAY,OAA4C;AAEtE,QAAM,YAAY,gBAAgB,MAAM,SAAS,EAAE;AAGnD,MAAI,MAAM,cAAc,SAAS,SAAS,GAAG;AAC3C,WAAO,EAAE,MAAM,UAAU,OAAO,UAAU;AAAA,EAC5C;AAGA,QAAM,WAAW,MAAM,YAAY;AACnC,QAAM,eAAe,oBAAoB,QAAQ,KAAK,oBAAoB,gBAAgB;AAC1F,QAAM,aAAa,OAAO,CAAC,GAAI,MAAM,oBAAoB,CAAC,GAAI,GAAG,YAAY,CAAC;AAG9E,MAAI,MAAM,kBAAkB;AAC1B,eAAW,aAAa,YAAY;AAClC,UAAI,MAAM,cAAc,SAAS,SAAS,GAAG;AAC3C,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,KAAK;AAAA,UACL,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAmB,OAAO,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC;AACxE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,gBAAgB,MAAM,cAAc,KAAK,IAAI,KAAK,MAAM,mBAAmB,SAAS;AAAA,IAC5F;AAAA,EACF;AACF;AAEA,SAAS,OAAU,IAAc;AAC/B,QAAM,OAAO,oBAAI,IAAO;AACxB,QAAM,MAAW,CAAC;AAClB,aAAW,KAAK,IAAI;AAClB,QAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAChB,WAAK,IAAI,CAAC;AACV,UAAI,KAAK,CAAC;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAoBA,eAAsB,mBACpB,MACA,IACA,mBACA,YACA,SACgC;AAChC,QAAM,YAAY,gBAAgB,IAAI;AACtC,QAAM,UAAU,gBAAgB,EAAE;AAClC,QAAM,SAAS,SAAS,kBAAkB;AAG1C,QAAM,UAAU,OAAO,OAAO,QAAQ,QAAQ;AAC9C,QAAM,QAAQ,oBAAoB;AAClC,QAAM,QAAQ,oBAAoB,SAAS,SAAS,EAAE,SAAS,QAAQ,UAAU,GAAG;AACpF,QAAM,uBAAuB,GAAG,KAAK,IAAI,IAAI;AAE7C,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,wBAAwB;AAAA,IACxB,wBAAwB,QAAQ;AAAA,IAChC,0BAA0B,QAAQ;AAAA,IAClC,oBAAoB;AAAA,IACpB,eAAe,GAAG,UAAU,IAAI,IAAI,UAAU,MAAM;AAAA,EACtD,CAAC;AACD,MAAI,SAAS,cAAe,QAAO,IAAI,kBAAkB,QAAQ,aAAa;AAE9E,QAAM,MAAM,MAAM,MAAM,GAAG,WAAW,QAAQ,OAAO,EAAE,CAAC,yBAAyB,OAAO,SAAS,CAAC,EAAE;AACpG,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI;AAAA,MACR,mCAAmC,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,MAC/D;AAAA,MACA,kDAAkD,IAAI,SAAI,EAAE;AAAA,IAC9D;AAAA,EACF;AACA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAM,SAAS,KAAK,WAAW,UAAU,CAAC;AAC1C,MAAI,CAAC,OAAQ,QAAO;AAIpB,QAAM,eAAe,WAAW,OAAO,aAAa;AACpD,QAAM,aAAa,WAAW,oBAAoB;AAClD,QAAM,QAAQ,KAAK,IAAI,eAAe,UAAU,IAAI,KAAK,IAAI,YAAY,IAAI;AAC7E,QAAM,UAAU,KAAK,IAAI,KAAK,KAAK,QAAQ,GAAM,GAAG,MAAM;AAG1D,QAAM,iBACJ,oBAAqB,oBAAoB,OAAO,MAAM,IAAK;AAE7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,KAAK,UAAU,OAAO,IAAI;AAAA;AAAA,EACrC;AACF;;;AC/MA,IAAM,gBAAgB;AAAA,EACpB,SAAS,EAAE,SAAS,sCAAsC,YAAY,EAAE;AAAA,EACxE,SAAS,EAAE,SAAS,sCAAsC,YAAY,GAAG;AAC3E;AAEA,IAAM,gBAAwC;AAAA,EAC5C,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAQO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EAER,YAAY,YAA4B,UAAiC,WAAW;AAClF,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,SAAS,OAAqC;AAClD,UAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAC/C,UAAM,SAAS,cAAc,KAAK,OAAO;AAEzC,UAAM,WAAW,MAAM,OAAO,QAAQ;AAAA,MACpC,SAAS;AAAA,MACT,QAAQ,EAAE,SAAS,OAAO,SAAS,oBAAoB,OAAO,WAAW;AAAA,MACzE,cAAc;AAAA,IAChB,CAAC;AAED,UAAM,YAAY,SAAS,OAAO,MAAM,mBAAmB,CAAC;AAC5D,UAAM,YAAY,cAAc,MAAM,YAAY,CAAC,KAAK;AAExD,UAAM,QAAQ,UAAU;AAAA,MACtB,CAAC,MAAW,EAAE,WAAW,cAAc,aAAa,EAAE,WAAW,cAAc;AAAA,IACjF;AAEA,QAAI,CAAC,MAAO,QAAO,EAAE,OAAO,OAAO,GAAG,WAAW,KAAK,IAAI,EAAE;AAE5D,UAAM,WAAW,SAAS,MAAM,UAAU,YAAY,EAAE;AACxD,UAAM,QAAQ,MAAM,UAAU,SAAS;AACvC,UAAM,QAAQ,WAAW,KAAK,IAAI,IAAI,KAAK;AAE3C,WAAO,EAAE,OAAO,OAAO,WAAW,KAAK,IAAI,EAAE;AAAA,EAC/C;AAAA,EAEA,MAAM,gBAAiC;AACrC,UAAM,SAAS,MAAM,KAAK,SAAS,OAAO;AAC1C,WAAO,OAAO,SAAS;AAAA,EACzB;AAAA,EAEA,MAAM,cACJ,mBACA,mBAC2D;AAC3D,QAAI,sBAAsB,EAAG,QAAO,EAAE,cAAc,GAAG,gBAAgB,EAAE;AACzE,UAAM,iBAAiB,oBAAoB;AAC3C,UAAM,eAAgB,iBAAiB,oBAAqB;AAC5D,WAAO,EAAE,cAAc,eAAe;AAAA,EACxC;AAAA,EAEA,MAAM,gBACJ,kBACA,kBACA,YACA,eAC+E;AAC/E,UAAM,cAAc,WAAW,gBAAgB;AAC/C,UAAM,cAAc,WAAW,gBAAgB;AAC/C,UAAM,SAAS,WAAW,UAAU;AACpC,UAAM,UAAU,WAAW,aAAa;AAExC,UAAM,eAAe,cAAc,IAAK,SAAS,cAAe,cAAc;AAC9E,UAAM,eAAe,UAAU,KAAM,eAAe,WAAW,UAAW,MAAM;AAEhF,WAAO,EAAE,cAAc,cAAc,SAAS,aAAa;AAAA,EAC7D;AACF;;;AC1DO,IAAM,aAAN,MAAiB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAA0B;AACpC,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,SAAS,eAAe,KAAK,OAAO;AACzC,UAAM,WAAqB,KAAK,YAAY,YAAY,iBAAiB;AAEzE,SAAK,SAAS,IAAI,WAAW,EAAE,MAAM,OAAO,MAAM,WAAW,OAAO,UAAU,CAAC;AAC/E,SAAK,aAAa,OAAO,cAAc,IAAI,eAAe,OAAO,UAAU,QAAQ;AACnF,SAAK,QAAQ,IAAI,gBAAgB,KAAK,YAAY,KAAK,QAAQ,KAAK,MAAM;AAC1E,SAAK,SAAS,IAAI,gBAAgB,KAAK,YAAY,KAAK,OAAO;AAC/D,SAAK,OAAO,IAAI,eAAe,KAAK,YAAY,KAAK,QAAQ,KAAK,SAAS,KAAK,MAAM;AAAA,EACxF;AAAA,EAEA,aAA8B;AAAE,WAAO,KAAK,OAAO,WAAW;AAAA,EAAG;AAAA,EAEjE,kBAA0C;AACxC,WAAO,gBAAgB,KAAK,YAAY,KAAK,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,EAC9E;AAAA,EAEA,UAAU,aAAqB,QAA+D;AAC5F,WAAO,UAAU,KAAK,YAAY,KAAK,QAAQ,aAAa,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,EAC7F;AAAA,EAEA,MAAM,WAAW,SAAmC;AAClD,UAAM,OAAO,WAAY,MAAM,KAAK,OAAO,WAAW;AACtD,WAAO,gBAAgB,KAAK,YAAY,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAoC;AACxC,UAAM,WAAqB,CAAC;AAC5B,QAAI,YAAY;AAChB,QAAI,iBAAiB;AACrB,QAAI;AACJ,QAAI;AACJ,QAAI,uBAAiE;AAErE,QAAI;AACF,YAAM,KAAK,KAAK,IAAI;AACpB,YAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAC/C,yBAAmB,KAAK,IAAI,IAAI;AAChC,kBAAY,CAAC,CAAC,OAAO,cAAc;AACnC,UAAI;AACF,wBAAgB,MAAM,KAAK,OAAO,WAAW;AAC7C,cAAM,QAAQ,MAAM,iBAAiB,KAAK,YAAY,eAAe,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC5F,yBAAiB,MAAM;AACvB,YAAI,CAAC,eAAgB,UAAS,KAAK,kEAA6D;AAAA,MAClG,SAAS,GAAG;AACV,iBAAS,KAAK,uBAAwB,EAAY,OAAO,EAAE;AAAA,MAC7D;AACA,UAAI;AACF,cAAM,UAAU,MAAM,OAAO,QAAQ;AAAA,UACnC,SAAS;AAAA,UACT,OAAO,EAAE,UAAU,MAAM;AAAA,UACzB,QAAQ,EAAE,UAAU,gBAAgB,QAAQ,KAAK,OAAO;AAAA,QAC1D,CAAC;AACD,cAAM,OAAO,QAAQ,QAAQ;AAC7B,YAAI,MAAM,UAAU,MAAM,SAAS;AACjC,gBAAM,UAAU,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,KAAK,QAAQ,SAAS;AACtF,gBAAM,YAAY,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK,SAAS,SAAS;AAC3F,iCAAuB,EAAE,UAAU,SAAS,OAAO,UAAU;AAAA,QAC/D,OAAO;AACL,mBAAS,KAAK,kEAA6D;AAAA,QAC7E;AAAA,MACF,SAAS,GAAG;AACV,iBAAS,KAAK,oBAAqB,EAAY,OAAO,EAAE;AAAA,MAC1D;AAAA,IACF,SAAS,GAAG;AACV,eAAS,KAAK,qBAAsB,EAAY,OAAO,EAAE;AAAA,IAC3D;AAEA,WAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,WAAqB;AAAE,WAAO,KAAK,YAAY,YAAY,iBAAiB;AAAA,EAAgB;AAAA;AAAA,EAGhG,OAAO,UAAU,UAAiC;AAAE,WAAO,oBAAoB,QAAQ;AAAA,EAAG;AAAA,EAE1F,MAAM,aAA4B;AAAE,UAAM,KAAK,WAAW,WAAW;AAAA,EAAG;AAC1E;AAEO,SAAS,iBAAiB,QAAsC;AACrE,SAAO,IAAI,WAAW,MAAM;AAC9B;;;AChIA,IAAM,UAAU;AAAA,EACd,WAAW;AAAA,EACX,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,WAAW;AACb;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,OAAO,oBAAI,IAAiB;AAAA,EAEpC,YAAY,QAAmB,QAAsB;AACnD,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,UAAU,UAAkB,QAA8B;AAC9D,UAAM,KAAK,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACnF,UAAM,WAAW,MAAM,OAAO,uBAAc,GAAG,OAAO,KAAK,OAAO,KAAK,EAAE;AAEzE,UAAM,OAAO,GAAG,QAAQ,SAAS,GAAG,SAAS,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC,GAAG,OAAO,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC;AACvH,UAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,KAAK,OAAO,iBAAiB,KAAK,GAAG,OAAO;AAEpF,UAAM,MAAW;AAAA,MACf;AAAA,MACA,QAAQ,MAAM,KAAK,OAAO,gBAAgB,OAAO;AAAA,MACjD;AAAA,MACA,WAAW,KAAK,OAAO;AAAA,MACvB;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB,QAAQ;AAAA,MACR,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,KAAK,IAAI,KAAK,KAAK,OAAO,aAAa;AAAA,IACpD;AACA,SAAK,KAAK,IAAI,IAAI,GAAG;AACrB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,kBAAkB,OAAe,MAAmB;AAClD,UAAM,MAAM,KAAK,KAAK,IAAI,KAAK;AAC/B,QAAI,CAAC,OAAO,IAAI,WAAW,SAAU,OAAM,IAAI,cAAc,2BAA2B,sBAAsB;AAC9G,QAAI,kBAAkB;AACtB,QAAI,SAAS;AACb,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,SAAS,OAA6B;AAC1C,UAAM,MAAM,KAAK,KAAK,IAAI,KAAK;AAC/B,QAAI,CAAC,OAAO,IAAI,WAAW,YAAa,OAAM,IAAI,cAAc,8BAA8B,sBAAsB;AAEpH,UAAM,WAAW,MAAM,OAAO,uBAAc,GAAG,OAAO,KAAK,OAAO,KAAK,EAAE;AACzE,UAAM,OAAO,GAAG,QAAQ,WAAW,GAAG,IAAI,GAAG,QAAQ,eAAe,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC;AACzF,UAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,KAAK,OAAO,iBAAiB,KAAK,GAAG,OAAO;AAEpF,QAAI,SAAS;AACb,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,OAAO,OAA6B;AACxC,UAAM,MAAM,KAAK,KAAK,IAAI,KAAK;AAC/B,QAAI,CAAC,OAAO,IAAI,WAAW,YAAa,OAAM,IAAI,cAAc,8BAA8B,sBAAsB;AAEpH,UAAM,WAAW,MAAM,OAAO,uBAAc,GAAG,OAAO,KAAK,OAAO,KAAK,EAAE;AACzE,UAAM,OAAO,GAAG,QAAQ,SAAS,GAAG,IAAI,GAAG,QAAQ,eAAe,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC;AACvF,UAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,KAAK,OAAO,iBAAiB,KAAK,GAAG,OAAO;AAEpF,QAAI,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,IAA6B;AAClC,WAAO,KAAK,KAAK,IAAI,EAAE;AAAA,EACzB;AACF;;;ACjFO,IAAM,mBAAN,MAAuB;AAAA,EACpB;AAAA,EACA,QAAQ,oBAAI,IAA2C;AAAA,EAE/D,YAAY,SAAuB,CAAC,GAAG;AACrC,SAAK,SAAS;AAAA,MACZ,UAAU,OAAO,YAAY;AAAA,MAC7B,YAAY,OAAO,cAAc;AAAA,MACjC,eAAe,OAAO,iBAAiB;AAAA,IACzC;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,YAAgE;AACrE,UAAM,WAAW,WAAW,OAAO,OAAK,EAAE,cAAc,KAAK,OAAO,aAAa;AACjF,QAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,YAAQ,KAAK,OAAO,UAAU;AAAA,MAC5B,KAAK;AAAY,eAAO,KAAK,WAAW,QAAQ;AAAA,MAChD,KAAK;AAAW,eAAO,KAAK,UAAU,QAAQ;AAAA,MAC9C,KAAK;AAAsB,eAAO,KAAK,aAAa,QAAQ;AAAA,MAC5D,KAAK;AAAY,eAAO,KAAK,WAAW,QAAQ;AAAA,IAClD;AAAA,EACF;AAAA;AAAA,EAGA,KAAK,YAAsD;AACzD,UAAM,WAAW,WAAW,OAAO,OAAK,EAAE,cAAc,KAAK,OAAO,aAAa;AACjF,WAAO,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAAA,EAC9D;AAAA,EAEQ,MAAM,GAA8B;AAE1C,UAAM,WAAW,EAAE,aAAa;AAChC,UAAM,aAAa,KAAK,IAAI,EAAE,QAAQ;AACtC,UAAM,eAAe,KAAK,KAAK,EAAE,aAAa,OAAO;AACrD,WAAO,WAAW,MAAM,aAAa,OAAO,eAAe;AAAA,EAC7D;AAAA,EAEQ,WAAW,GAA2C;AAC5D,WAAO,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrD;AAAA,EAEQ,UAAU,GAA2C;AAC3D,WAAO,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,aAAa,aAAa,EAAE,aAAa,YAAY,IAAI,CAAC;AAAA,EACzF;AAAA,EAEQ,aAAa,GAA2C;AAC9D,WAAO,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,aAAa,IAAI,CAAC;AAAA,EAC/D;AAAA,EAEQ,WAAW,GAA2C;AAC5D,WAAO,EAAE,OAAO,CAAC,GAAG,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;AAAA,EACjE;AACF;;;ACpDO,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACA,WAAW,oBAAI,IAA+B;AAAA,EAEtD,YAAY,SAA2B,CAAC,GAAG;AACzC,SAAK,SAAS;AAAA,MACZ,UAAU,OAAO,YAAY;AAAA,MAC7B,kBAAkB,OAAO,oBAAoB;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA,EAGA,WAAW,QAAgB,OAAoC;AAC7D,UAAM,MAAyB;AAAA,MAC7B,QAAQ,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAChF,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,UAAU,KAAK,OAAO;AAAA,MACtB;AAAA,IACF;AACA,SAAK,SAAS,IAAI,IAAI,QAAQ,GAAG;AACjC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,QAA2B,QAAmC;AACrE,QAAI,OAAO,SAAS,OAAO,UAAU;AACnC,YAAM,IAAI,cAAc,wBAAwB,OAAO,QAAQ,YAAY,sBAAsB;AAAA,IACnG;AACA,UAAM,aAAa,OAAO,mBAAmB,KAAK,OAAO,mBAAmB;AAC5E,QAAI,SAAS,YAAY;AACvB,YAAM,IAAI,cAAc,UAAU,MAAM,wBAAwB,UAAU,IAAI,wBAAwB;AAAA,IACxG;AACA,QAAI,SAAS,OAAO,iBAAiB;AACnC,YAAM,IAAI,cAAc,UAAU,MAAM,sBAAsB,OAAO,eAAe,IAAI,yBAAyB;AAAA,IACnH;AAEA,WAAO,mBAAmB;AAE1B,UAAM,QAA2B;AAAA,MAC/B,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO,QAAQ;AAAA,MACtB,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,KAAwB,QAAyB;AACrD,QAAI,SAAS,IAAI,gBAAiB,QAAO;AACzC,QAAI,mBAAmB;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,QAA+C;AACxD,WAAO,KAAK,SAAS,IAAI,MAAM;AAAA,EACjC;AACF;;;ACzDO,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAA2B;AACrC,SAAK,SAAS;AACd,SAAK,gBAAgB,IAAI,cAAc;AAAA,MACrC,QAAQ,CAAC,OAAO,KAAK;AAAA,MACrB,KAAK,EAAE,QAAQ,OAAO,QAAQ,YAAY,OAAO,WAAW;AAAA,IAC9D,CAAC;AACD,SAAK,SAAS,IAAI,aAAa,EAAE,aAAa,KAAK,CAAC;AACpD,SAAK,SAAS,IAAI,iBAAiB,OAAO,aAAa,EAAE,eAAe,OAAO,WAAW,SAAS,IAAI,CAAC,CAAC;AACzG,SAAK,WAAW,IAAI,eAAe,EAAE,eAAe,OAAO,aAAa,IAAU,CAAC;AACnF,SAAK,aAAa,IAAI,kBAAkB,OAAO,UAAU;AACzD,SAAK,aAAa,IAAI,kBAAkB;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,SAAS,OAA6C;AAC1D,UAAM,EAAE,UAAU,IAAI,MAAM,KAAK,OAAO,OAAO,KAAK;AACpD,WAAO,UAAU,IAAI,QAAM;AAAA,MACzB,KAAK,EAAE;AAAA,MACP,YAAY;AAAA;AAAA,MACZ,OAAO,OAAO,EAAE,QAAQ,CAAC,GAAG,qBAAqB,CAAC;AAAA,IACpD,EAAE;AAAA,EACJ;AAAA;AAAA,EAGA,eAAe,YAAgE;AAC7E,WAAO,KAAK,OAAO,OAAO,UAAU;AAAA,EACtC;AAAA;AAAA,EAGA,UAAU,OAAe,kBAA6C;AACpE,WAAO,KAAK,WAAW,UAAU,OAAO,gBAAgB;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,KAAK,KAAa,MAAyE;AAC/F,UAAM,UAAkC,CAAC;AACzC,QAAI,MAAM,eAAe;AACvB,cAAQ,mBAAmB,IAAI,KAAK,cAAc;AAClD,cAAQ,oBAAoB,IAAI,OAAO,KAAK,cAAc,KAAK;AAC/D,cAAQ,qBAAqB,IAAI,OAAO,KAAK,cAAc,eAAe;AAAA,IAC5E;AAEA,UAAM,WAAW,MAAM,KAAK,cAAc,iBAAiB,KAAK;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,QAAQ;AAAA,MAC1D,MAAM,MAAM,QAAQ,KAAK,UAAU,EAAE,OAAO,KAAK,MAAM,CAAC,IAAI;AAAA,IAC9D,CAAC;AACD,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA,EAGA,iBAAiB,QAAmC;AAClD,WAAO,KAAK,WAAW,WAAW,QAAQ,KAAK,OAAO,KAAK;AAAA,EAC7D;AAAA;AAAA,EAGA,SAAS,QAA2B,QAAmC;AACrE,WAAO,KAAK,WAAW,SAAS,QAAQ,MAAM;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,gBAAgB,OAAe,OAA2B;AAC9D,UAAM,aAAa,MAAM,KAAK,SAAS,KAAK;AAC5C,UAAM,WAAW,KAAK,eAAe,UAAU;AAC/C,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,0BAA0B,KAAK,EAAE;AAChE,WAAO,KAAK,KAAK,SAAS,KAAK,EAAE,MAAM,CAAC;AAAA,EAC1C;AACF;AAEO,SAAS,kBAAkB,QAAwC;AACxE,SAAO,IAAI,YAAY,MAAM;AAC/B;;;ACtFO,IAAM,YAAN,MAAM,WAAU;AAAA,EACb;AAAA,EAER,YAAY,MAAqB;AAC/B,SAAK,OAAO;AAAA,EACd;AAAA;AAAA,EAGA,OAAO,aAAa,QAA6B,KAAwB;AACvE,WAAO,IAAI,WAAU;AAAA,MACnB,MAAM,OAAO;AAAA,MACb,aAAa,OAAO;AAAA,MACpB;AAAA,MACA,QAAQ,OAAO,MAAM,IAAI,QAAM;AAAA,QAC7B,MAAM,EAAE;AAAA,QACR,aAAa,EAAE;AAAA,QACf,OAAO,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,EAAE,MAAM;AAAA,QACvD,aAAa;AAAA,QACb,aAAa,EAAE;AAAA,MACjB,EAAE;AAAA,MACF,QAAQ,CAAC,OAAO,KAAK;AAAA,MACrB,WAAW,CAAC,QAAQ,KAAK;AAAA,MACzB,OAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SAA8C;AAC5C,WAAO,EAAE,SAAS,OAAO,GAAG,KAAK,KAAK;AAAA,EACxC;AAAA;AAAA,EAGA,UAAU;AACR,WAAO,CAAC,MAAW,QAAa;AAC9B,UAAI,OAAO,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC;AAAA,IACpC;AAAA,EACF;AACF;;;ACmBO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,WAAW,oBAAI,IAA0B;AAAA,EAEjD,YAAY,QAA0C;AACpD,UAAM,UAAwB;AAAA,MAC5B,IAAI,SAAS,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAC9E,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AACA,SAAK,SAAS,IAAI,QAAQ,IAAI,OAAO;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,WAAmB,QAA8B;AAC3D,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,WAAW,QAAQ,WAAW,UAAU;AAC3C,YAAM,IAAI,cAAc,sBAAsB,uBAAuB;AAAA,IACvE;AACA,UAAM,gBAAgB,QAAQ,kBAAkB;AAChD,QAAI,gBAAgB,QAAQ,QAAQ;AAClC,YAAM,IAAI,cAAc,0BAA0B,mBAAmB;AAAA,IACvE;AACA,YAAQ,kBAAkB;AAC1B,YAAQ;AAER,UAAM,YAAY,KAAK,QAAQ,MAAM,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC;AACnE,WAAO;AAAA,MACL;AAAA,MACA,kBAAkB;AAAA,MAClB,OAAO,QAAQ;AAAA,MACf;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,cAAc,SAAgC;AAC5C,UAAM,UAAU,KAAK,SAAS,IAAI,QAAQ,SAAS;AACnD,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,QAAQ,oBAAoB,QAAQ,UAAU,QAAQ,QAAQ;AAAA,EACvE;AAAA,EAEA,OAAO,WAA6C;AAClD,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,QAAS,SAAQ,SAAS;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,WAAmB,YAAY,IAAa;AACvD,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,OAAQ,QAAQ,kBAAkB,OAAQ,QAAQ,MAAM,KAAK;AAAA,EACtE;AAAA,EAEA,WAAW,IAAsC;AAC/C,WAAO,KAAK,SAAS,IAAI,EAAE;AAAA,EAC7B;AACF;AAIO,IAAM,0BAAN,MAA8B;AAAA,EAC3B,UAAU,oBAAI,IAA2B;AAAA,EAEjD,aAAa,QAAqC;AAChD,UAAM,SAAwB;AAAA,MAC5B,IAAI,UAAU,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAC/E,QAAQ,EAAE,YAAY,KAAQ,GAAG,OAAO;AAAA,MACxC,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe,KAAK,IAAI;AAAA,MACxB,QAAQ;AAAA,IACV;AACA,SAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,UAAkB,QAAsB;AAClD,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,YAAM,IAAI,cAAc,qBAAqB,iBAAiB;AAAA,IAChE;AACA,QAAI,OAAO,aAAa,SAAS,OAAO,OAAO,QAAQ;AACrD,aAAO,SAAS;AAChB,YAAM,IAAI,cAAc,2BAA2B,kBAAkB;AAAA,IACvE;AACA,QAAI,OAAO,OAAO,kBAAkB,OAAO,gBAAgB,SAAS,OAAO,OAAO,gBAAgB;AAChG,YAAM,IAAI,cAAc,0BAA0B,qBAAqB;AAAA,IACzE;AACA,WAAO,cAAc;AACrB,WAAO,iBAAiB;AAAA,EAC1B;AAAA,EAEA,eAAe,UAAuC;AACpD,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,QAAI,CAAC,OAAQ,OAAM,IAAI,cAAc,oBAAoB,kBAAkB;AAC3E,UAAM,UAAU,OAAO;AACvB,WAAO,gBAAgB;AACvB,WAAO,gBAAgB,KAAK,IAAI;AAChC,WAAO,EAAE,QAAQ;AAAA,EACnB;AAAA,EAEA,aAAa,UAAsC;AACjD,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,QAAI,CAAC,OAAQ,OAAM,IAAI,cAAc,oBAAoB,kBAAkB;AAC3E,WAAO,SAAS;AAChB,WAAO,EAAE,QAAQ,OAAO,OAAO,SAAS,OAAO,WAAW;AAAA,EAC5D;AAAA,EAEA,UAAU,IAAuC;AAC/C,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC5B;AAAA,EAEA,mBAAoC;AAClC,WAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,QAAQ;AAAA,EACrE;AACF;AAIO,IAAM,gBAAN,MAAM,eAAc;AAAA,EACzB,OAAgB,kBAAkB;AAAA;AAAA,EAGlC,qBAAqB,QAAuB,SAAiB;AAC3D,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,mBAAmB,eAAc;AAAA,MACnC;AAAA,MACA,OAAO;AAAA,QACL,cAAc;AAAA,UACZ,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,UACjC,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,UAClC,EAAE,MAAM,cAAc,MAAM,SAAS;AAAA,UACrC,EAAE,MAAM,SAAS,MAAM,SAAS;AAAA,UAChC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,UACnC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,QACzC;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,YAAY,OAAO;AAAA,QACnB,OAAO,OAAO;AAAA,QACd,SAAS,OAAO;AAAA,QAChB,aAAa,OAAO,OAAO,QAAQ;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,0BAA0B,QAAyB,SAAiB;AAClE,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,mBAAmB,eAAc;AAAA,MACnC;AAAA,MACA,OAAO;AAAA,QACL,aAAa;AAAA,UACX,EAAE,MAAM,UAAU,MAAM,YAAY;AAAA,UACpC,EAAE,MAAM,WAAW,MAAM,YAAY;AAAA,UACrC,EAAE,MAAM,SAAS,MAAM,SAAS;AAAA,UAChC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,UACnC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,QACzC;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,QAAQ,OAAO,IAAI,OAAK,EAAE,KAAK;AAAA,QAC/B,SAAS,OAAO,IAAI,OAAK,EAAE,MAAM;AAAA,QACjC,OAAO,OAAO,CAAC,GAAG,SAAS;AAAA,QAC3B,SAAS,OAAO,CAAC,GAAG,WAAW;AAAA,QAC/B,aAAa,OAAO,OAAO,CAAC,GAAG,YAAY,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACF;;;ACzLO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA,WAAW,oBAAI,IAA6B;AAAA,EAEpD,YAAY,QAAmB;AAC7B,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA,EAGA,sBAAsB,aAAkD;AACtE,UAAM,UAA2B;AAAA,MAC/B,IAAI,MAAM,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAC3E,MAAM;AAAA,MACN,SAAS,KAAK,OAAO;AAAA,MACrB;AAAA,MACA,WAAW,KAAK,KAAK,iBAAiB,KAAK,UAAU,WAAW,CAAC,EAAE;AAAA,MACnE,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,YAAY,aAAa,KAAK,IAAI,IAAI;AAAA,IACnD;AACA,SAAK,SAAS,IAAI,QAAQ,IAAI,OAAO;AACrC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,qBAAqB,WAAmB,MAAoC;AAC1E,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,WAAW,QAAQ,SAAS,QAAQ;AACvC,YAAM,IAAI,cAAc,uCAAuC,qBAAqB;AAAA,IACtF;AAEA,QAAI,QAAQ,aAAa,aAAa,KAAK,QAAQ,QAAQ,YAAY,WAAW;AAChF,YAAM,IAAI,cAAc,+BAA+B,iBAAiB;AAAA,IAC1E;AACA,YAAQ,OAAO;AACf,YAAQ,OAAO;AACf,YAAQ,YAAY,KAAK,KAAK,mBAAmB,QAAQ,EAAE,IAAI,KAAK,KAAK,EAAE;AAC3E,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,qBAAqB,mBAA2B,QAAgB,YAA0D;AACxH,UAAM,WAAW,KAAK,SAAS,IAAI,iBAAiB;AACpD,QAAI,CAAC,YAAY,SAAS,SAAS,UAAU;AAC3C,YAAM,IAAI,cAAc,yCAAyC,wBAAwB;AAAA,IAC3F;AACA,WAAO;AAAA,MACL,IAAI,MAAM,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAC3E,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,KAAK,WAAW,iBAAiB,IAAI,MAAM,IAAI,UAAU,EAAE;AAAA,MAC3E,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAGA,mBAAmB,UAA2B,SAAkC;AAC9E,QAAI,QAAQ,sBAAsB,SAAS,GAAI,QAAO;AACtD,QAAI,SAAS,SAAS,SAAU,QAAO;AACvC,QAAI,SAAS,QAAQ,QAAQ,SAAS,SAAS,KAAK,MAAO,QAAO;AAClE,QAAI,KAAK,IAAI,IAAI,SAAS,UAAW,QAAO;AAC5C,WAAO;AAAA,EACT;AAAA,EAEQ,KAAK,MAAsB;AAEjC,UAAM,OAAO,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,GAAG,OAAQ,KAAK,KAAK,IAAI,EAAE,WAAW,CAAC,IAAK,GAAG,CAAC;AACtF,WAAO,KAAK,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC;AAAA,EAC3D;AACF;AAIO,IAAM,yBAAN,MAA6B;AAAA,EAC1B;AAAA,EAER,YAAY,SAAiB;AAC3B,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA,EAGA,OAAO,QAAgB,aAAsC,QAAQ,MAA4B;AAC/F,UAAM,SAA2B;AAAA,MAC/B,IAAI,MAAM,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAC3E,SAAS,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA,WAAW,KAAK,KAAK,GAAG,MAAM,IAAI,KAAK,UAAU,WAAW,CAAC,EAAE;AAAA,MAC/D,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,QAA0B,QAAgB,aAAwD;AACtG,UAAM,QAAQ,KAAK,OAAO,QAAQ,WAAW;AAC7C,UAAM,WAAW,OAAO;AACxB,UAAM,YAAY,KAAK,KAAK,GAAG,OAAO,EAAE,IAAI,MAAM,IAAI,KAAK,UAAU,WAAW,CAAC,EAAE;AACnF,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,QAAmC;AACxC,QAAI,KAAK,IAAI,IAAI,OAAO,UAAW,QAAO;AAC1C,QAAI,OAAO,YAAY,KAAK,QAAS,QAAO;AAC5C,WAAO;AAAA,EACT;AAAA,EAEQ,KAAK,MAAsB;AACjC,UAAM,OAAO,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,GAAG,OAAQ,KAAK,KAAK,IAAI,EAAE,WAAW,CAAC,IAAK,GAAG,CAAC;AACtF,WAAO,KAAK,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC;AAAA,EAC3D;AACF;;;AClFO,SAAS,4BAA4B,KAA2C;AACrF,QAAM,UAAU,IAAI,cAAc,SAAS,QAAQ,OAAO,EAAE;AAC5D,QAAM,cAAc,CAAC,EAAE,IAAI,aAAa,IAAI;AAC5C,QAAM,aAAa,oBAAI,IAAS;AAEhC,QAAM,YAAqB,CAAC,MAAM,QAChC,IAAI,OAAO,GAAG,EAAE,KAAK;AAAA,IACnB,OAAO,CAAC,EAAE,aAAa,GAAG,QAAQ,WAAW,SAAS,IAAI,WAAW,cAAc,CAAC;AAAA,IACpF,YAAY,CAAC;AAAA,IACb,SAAS,EAAE,CAAC,IAAI,WAAW,aAAa,GAAG,CAAC,IAAI,cAAc,EAAE;AAAA,EAClE,CAAC;AAEH,QAAM,SAAkB,OAAO,KAAK,QAAQ;AAC1C,UAAM,SAAS,MAAM;AAAA,MAAU;AAAA,MAAK;AAAA,MAAK;AAAA;AAAA,MAA+B;AAAA,IAAK;AAC7E,WAAO,IAAI,OAAO,OAAO,UAAU,EAAE,KAAK,OAAO,IAAI;AAAA,EACvD;AAEA,QAAM,SAAkB,OAAO,KAAK,QAAQ;AAC1C,UAAM,eAAe,MAAM;AAAA,MAAU;AAAA,MAAK;AAAA,MAAK;AAAA;AAAA,MAA+B;AAAA,IAAI;AAClF,QAAI,aAAa,eAAe,OAAO,CAAC,aAAa,QAAQ,CAAC,aAAa,WAAW;AACpF,aAAO,IAAI,OAAO,aAAa,UAAU,EAAE,KAAK,aAAa,IAAI;AAAA,IACnE;AACA,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,KAAK,aAAa,MAAM,aAAa,SAAS;AACjF,aAAO,IAAI,OAAO,GAAG,EAAE,KAAK;AAAA,QAC1B,SAAS;AAAA,QACT,OAAO,aAAa,KAAK;AAAA,QACzB,aAAa;AAAA,QACb,SAAS,IAAI,WAAW;AAAA,MAC1B,CAAC;AAAA,IACH,SAASC,MAAK;AACZ,iBAAW,OAAO,aAAa,KAAK,KAAK;AACzC,YAAM,UAAUA,gBAAe,QAAQA,KAAI,UAAU;AACrD,aAAO,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,OAAO,aAAa,kBAAkB,OAAO,GAAG,CAAC;AAAA,IAC1F;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,QAAQ;AACzB,QAAI,CAAC,UAAU,KAAK,MAAM,EAAG,QAAO,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,CAAC;AAC/E,QAAI,eAAe,CAAC,WAAW,KAAK,GAAG,GAAG;AACxC,aAAO,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,OAAO,aAAa,yBAAyB,CAAC;AAAA,IACvF;AACA,UAAM,UAAU,YAAY,QAAQ,GAAG,GAAG,MAAM;AAChD,QAAI,YAAY,mBAAmB,IAAI,WAAW,MAAO,QAAO,UAAU,KAAK,GAAG;AAClF,QAAI,YAAY,gBAAgB,IAAI,WAAW,OAAQ,QAAO,OAAO,KAAK,GAAG;AAC7E,QAAI,YAAY,gBAAgB,IAAI,WAAW,OAAQ,QAAO,OAAO,KAAK,GAAG;AAC7E,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,IAAI,MAAM,IAAI,OAAO,GAAG,CAAC;AAAA,EACjF;AACF;AAgBA,eAAe,UACb,KACA,KACA,YACA,cACuB;AACvB,QAAM,OAAQ,IAAI,QAAQ,CAAC;AAC3B,QAAM,eAAe,KAAK;AAC1B,QAAM,UAAU,KAAK;AACrB,MAAI,CAAC,gBAAgB,CAAC,SAAS;AAC7B,WAAO,KAAK,KAAK,iDAAiD,aAAa;AAAA,EACjF;AAGA,QAAM,gBAAgB,IAAI,YAAY,YAAY;AAClD,QAAM,WAAW,OAAO,aAAa,SAAS,EAAE,EAAE,YAAY;AAC9D,MAAI,YAAY,aAAa,eAAe;AAC1C,WAAO,KAAK,KAAK,SAAS,QAAQ,4BAA4B,aAAa,KAAK,gBAAgB;AAAA,EAClG;AACA,QAAM,kBAAkB,IAAI,WAAW;AACvC,MAAI,aAAa,WAAW,aAAa,YAAY,iBAAiB;AACpE,WAAO,KAAK,KAAK,WAAW,aAAa,OAAO,4BAA4B,eAAe,KAAK,kBAAkB;AAAA,EACpH;AAEA,MAAI;AACJ,MAAI;AACJ,MAAI;AAIF,UAAM,QAAS,QAAQ,WAAW,OAAO,QAAQ,YAAY,WACxD,QAAQ,UACT;AACJ,WAAO,2BAA2B,MAAM,aAAa;AACrD,gBAAY,MAAM;AAClB,QAAI,CAAC,aAAa,CAAC,UAAU,WAAW,IAAI,EAAG,OAAM,IAAI,MAAM,gCAAgC;AAAA,EACjG,SAASA,MAAK;AACZ,WAAO,KAAK,KAAK,kCAAmCA,KAAc,OAAO,IAAI,mBAAmB;AAAA,EAClG;AAGA,QAAM,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,CAAC;AAChD,MAAI,KAAK,aAAa,IAAK,QAAO,KAAK,KAAK,+BAA+B,oBAAoB;AAC/F,MAAI,KAAK,eAAe,IAAK,QAAO,KAAK,KAAK,yBAAyB,cAAc;AAGrF,QAAM,WAAW,OAAO,OAAO,aAAa,qBAAqB,GAAG,CAAC;AACrE,MAAI,KAAK,QAAQ,UAAU;AACzB,WAAO,KAAK,KAAK,uBAAuB,KAAK,KAAK,eAAe,QAAQ,IAAI,gBAAgB;AAAA,EAC/F;AAEA,QAAM,QAAQ,OAAO,aAAa,SAAS,EAAE,EAAE,YAAY;AAC3D,MAAI,SAAS,KAAK,GAAG,YAAY,MAAM,OAAO;AAC5C,WAAO,KAAK,KAAK,oBAAoB,KAAK,EAAE,aAAa,KAAK,IAAI,gBAAgB;AAAA,EACpF;AAGA,MAAI,WAAW,IAAI,KAAK,KAAK,GAAG;AAC9B,WAAO,KAAK,KAAK,SAAS,KAAK,KAAK,iBAAiB,sBAAsB;AAAA,EAC7E;AAGA,QAAM,KAAK,wCAAwC;AAAA,IACjD,mBAAmB,IAAI;AAAA,IACvB,SAAS,IAAI,aAAa,OAAO,MAAM,QAAQ,IAAI,WAAW,eAAe,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,IAC1F,WAAW,IAAI;AAAA,IACf,cAAc,IAAI;AAAA,IAClB,eAAe;AAAA,EACjB,CAAC;AACD,QAAM,EAAE,yBAAAC,yBAAwB,IAAI,MAAM,OAAO,MAAM;AACvD,MAAI;AACJ,MAAI;AACF,gBAAY,MAAMA,yBAAwB;AAAA,MACxC,QAAQ,GAAG;AAAA,MAAQ,OAAO,GAAG;AAAA,MAAO,aAAa,GAAG;AAAA,MACpD,SAAS,GAAG;AAAA,MAAS;AAAA,IACvB,CAAC;AAAA,EACH,SAASD,MAAK;AACZ,WAAO,KAAK,KAAK,8BAA+BA,KAAc,OAAO,IAAI,eAAe;AAAA,EAC1F;AACA,MAAI,UAAU,YAAY,MAAM,KAAK,KAAK,YAAY,GAAG;AACvD,WAAO,KAAK,KAAK,aAAa,SAAS,YAAY,KAAK,IAAI,IAAI,oBAAoB;AAAA,EACtF;AAGA,MAAI;AACF,UAAM,OAAQ,MAAM,IAAI,aAAa,aAAa;AAAA,MAChD,SAAS,IAAI;AAAA,MACb,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,KAAK,MAAM,KAAK,KAAK;AAAA,IAC9B,CAAC;AACD,QAAI,KAAM,QAAO,KAAK,KAAK,oCAAoC,oBAAoB;AAAA,EACrF,SAASA,MAAK;AAEZ,QAAI,cAAc;AAChB,aAAO,KAAK,KAAK,mCAAoCA,KAAc,OAAO,IAAI,iBAAiB;AAAA,IACjG;AAAA,EACF;AAEA,MAAI,aAAc,YAAW,IAAI,KAAK,KAAK;AAE3C,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,MAAM,EAAE,SAAS,MAAM,OAAO,KAAK,KAAK;AAAA,IACxC;AAAA,IAAM;AAAA,EACR;AACF;AAEA,SAAS,KAAK,YAAoB,KAAa,MAA4B;AACzE,SAAO,EAAE,YAAY,MAAM,EAAE,SAAS,OAAO,SAAS,OAAO,eAAe,KAAK,aAAa,KAAK,KAAK,EAAE;AAC5G;AAEA,eAAe,cACb,KACA,MACA,WACc;AACd,QAAM,EAAE,GAAG,GAAG,EAAE,IAAI,eAAe,SAAS;AAC5C,QAAM,SAAS,MAAM,IAAI,cAAc,cAAc;AAAA,IACnD,SAAS,IAAI;AAAA,IACb,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,KAAK,MAAM,KAAK,IAAI,KAAK,OAAO,KAAK,YAAY,KAAK,aAAa,KAAK,OAAO,GAAG,GAAG,CAAC;AAAA,IAC7F,SAAS,IAAI,cAAc,WAAW,IAAI;AAAA,IAC1C,OAAO,IAAI,cAAc,SAAS;AAAA,EACpC,CAAU;AAEV,QAAM,UAAU,MAAM,IAAI,aAAa,0BAA0B,EAAE,MAAM,QAAQ,SAAS,IAAO,CAAC;AAClG,MAAI,QAAQ,WAAW,WAAW;AAChC,UAAM,IAAI,cAAc,MAAM,MAAM,sBAAsB,aAAa;AAAA,EACzE;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAAiB,QAAyB;AAC3D,QAAM,OAAO,QAAQ,GAAG;AACxB,SAAO,KAAK,WAAW,GAAG,MAAM,GAAG;AACrC;AAEA,SAAS,QAAQ,KAAyB;AACxC,MAAI,IAAI,KAAM,QAAO,IAAI;AACzB,QAAM,MAAM,IAAI,eAAe,IAAI,OAAO;AAC1C,QAAM,IAAI,IAAI,QAAQ,GAAG;AACzB,SAAO,MAAM,KAAK,MAAM,IAAI,MAAM,GAAG,CAAC;AACxC;AAEA,SAAS,YAAY,MAAc,QAAwB;AACzD,SAAO,KAAK,WAAW,MAAM,IAAI,KAAK,MAAM,OAAO,MAAM,IAAI;AAC/D;AAEA,SAAS,WAAW,KAAiB,KAA2C;AAC9E,QAAM,YAAY,YAAY,KAAK,kBAAkB;AACrD,QAAM,YAAY,YAAY,KAAK,wBAAwB;AAC3D,QAAM,OAAO,YAAY,KAAK,mBAAmB;AACjD,MAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAM,QAAO;AAC9C,MAAI,cAAc,IAAI,UAAW,QAAO;AACxC,QAAM,OAAO,IAAI,cAAc;AAC/B,QAAM,KAAK,OAAO,SAAS;AAC3B,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,IAAI,KAAM,QAAO;AACrE,QAAM,OAAO,QAAQ,GAAG;AACxB,QAAM,UAAU,IAAI,OAAO,KAAK,UAAU,IAAI,IAAI,IAAI;AACtD,QAAM,WAAW,iBAAiB;AAAA,IAChC,QAAQ,IAAI;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,IACN,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,IACf;AAAA,EACF,CAAC;AACD,SAAO,SAAS,mBAAmB,MAAM;AAC3C;AAEA,SAAS,YAAY,KAAiB,KAAiC;AACrE,QAAM,IAAI,IAAI,QAAQ,GAAG,KAAK,IAAI,QAAQ,IAAI,YAAY,CAAC;AAC3D,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO,EAAE,CAAC;AAChC,SAAO;AACT;;;ACxUA,SAAS,sBAAAE,qBAAoB,eAAAC,cAAa,QAAAC,aAAY;;;ACQ/C,IAAM,2BAA2B;AAAA,EACtC;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,SAAS,CAAC;AAAA,IAC1C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AACF;AAEO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,SAAS,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,MAChC,EAAE,MAAM,mCAAmC,MAAM,SAAS;AAAA,MAC1D,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,IACtC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,MAAM,YAAY,MAAM,WAAW,SAAS,KAAK;AAAA,MACnD,EAAE,MAAM,aAAa,MAAM,WAAW,SAAS,KAAK;AAAA,MACpD,EAAE,MAAM,oBAAoB,MAAM,WAAW,SAAS,MAAM;AAAA,MAC5D,EAAE,MAAM,kBAAkB,MAAM,UAAU,SAAS,MAAM;AAAA,IAC3D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,MAAM,YAAY,MAAM,WAAW,SAAS,KAAK;AAAA,MACnD,EAAE,MAAM,aAAa,MAAM,WAAW,SAAS,KAAK;AAAA,MACpD,EAAE,MAAM,mBAAmB,MAAM,WAAW,SAAS,MAAM;AAAA,IAC7D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,MAAM,YAAY,MAAM,WAAW,SAAS,KAAK;AAAA,MACnD,EAAE,MAAM,aAAa,MAAM,WAAW,SAAS,KAAK;AAAA,MACpD,EAAE,MAAM,iBAAiB,MAAM,UAAU,SAAS,MAAM;AAAA,IAC1D;AAAA,EACF;AACF;AAEO,IAAM,6BAA6B;AAAA,EACxC;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,eAAe,MAAM,SAAS,CAAC;AAAA,IAChD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,WAAW,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,OAAO,MAAM,YAAY;AAAA,MACjC,EAAE,MAAM,aAAa,MAAM,YAAY;AAAA,MACvC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACnC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,OAAO,MAAM,YAAY;AAAA,MACjC,EAAE,MAAM,aAAa,MAAM,YAAY;AAAA,IACzC;AAAA,EACF;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,SAAS,CAAC;AAAA,EACxC;AACF;AAEO,IAAMC,YAAW;AAAA,EACtB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,UAAU,CAAC;AAAA,IAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,QAAQ,CAAC;AAAA,EACvC;AACF;;;ADtLO,IAAM,kCACX;AAGF,IAAM,WAAmD,OAAO,OAAO;AAAA,EACrE,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,iBAAiB;AACnB,CAAC;AAGD,IAAM,aAA6E,OAAO,OAAO;AAAA,EAC/F,mBAAmBC,aAAY;AAAA,IAC7B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,gBAAgB,EAAE,MAAM,iBAAiB,QAAQ,SAAS,UAAU,GAAG;AAAA,IACvE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,iBAAiB,CAAC,EAAE,EAAE;AAAA,IAC5D,SAAS;AAAA,EACX,CAAC;AAAA,EACD,oBAAoBA,aAAY;AAAA,IAC9B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,gBAAgB,EAAE,MAAM,YAAY,QAAQ,OAAO,UAAU,GAAG;AAAA,IAChE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,kBAAkB,CAAC,EAAE,EAAE;AAAA,EAC/D,CAAC;AAAA,EACD,iBAAiBA,aAAY;AAAA,IAC3B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,gBAAgB,EAAE,MAAM,SAAS,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC7D,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,eAAe,CAAC,EAAE,EAAE;AAAA,EAC5D,CAAC;AACH,CAAC;AAQD,IAAM,eAAe;AACrB,IAAM,kBAAkB,IAAI;AAUrB,IAAM,yBAAN,MAA6B;AAAA,EAGlC,YACmB,cACA,OAAgB,iCACjC;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAJF,QAAQ,oBAAI,IAAqD;AAAA,EAOlF,MAAM,QAAQ,MAA2C;AACvD,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,QAAI,OAAO,IAAI,YAAY,IAAK,QAAO,IAAI;AAE3C,UAAM,SAAU,MAAM,KAAK,aAAa,aAAa;AAAA,MACnD,SAAS,KAAK;AAAA,MACd,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,IAAI;AAAA,IACb,CAAC;AAED,QAAI,CAAC,UAAU,OAAO,YAAY,MAAM,cAAc;AACpD,YAAM,IAAI;AAAA,QACR,mBAAmB,IAAI;AAAA,QACvB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,MAAM,EAAE,SAAS,QAAQ,WAAW,MAAM,gBAAgB,CAAC;AAC1E,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,aAAmB;AACjB,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;AAcO,IAAM,cAAN,MAAkB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAA4B,CAAC,GAAG;AAC1C,SAAK,UAAU,OAAO,WAAW;AACjC,QAAI,CAAC,WAAW,KAAK,OAAO,GAAG;AAC7B,YAAM,IAAI;AAAA,QACR,8BAA8B,KAAK,OAAO;AAAA,QAC1C;AAAA,QACA,eAAe,OAAO,KAAK,UAAU,EAAE,KAAK,IAAI,CAAC;AAAA,MACnD;AAAA,IACF;AAEA,SAAK,eACH,OAAO,gBACPC,oBAAmB;AAAA,MACjB,OAAO,WAAW,KAAK,OAAO;AAAA,MAC9B,WAAWC,MAAK,OAAO,UAAU,SAAS,KAAK,OAAO,CAAC;AAAA,IACzD,CAAU;AAEZ,SAAK,WAAW,IAAI;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,oBAAoB;AAAA,IAC7B;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,SAA4B,CAAC,GAAgB;AAC7E,SAAO,IAAI,YAAY,MAAM;AAC/B;;;AEvHA,IAAMC,gBAAe;AASrB,eAAsB,0BACpB,QACA,aACkB;AAClB,QAAM,aAAa,MAAM,OAAO,SAAS,QAAQ,yBAAyB;AAC1E,QAAM,SAAU,MAAM,OAAO,aAAa,aAAa;AAAA,IACrD,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,WAAW;AAAA,EACpB,CAAC;AAED,MAAI,CAAC,UAAU,OAAO,YAAY,MAAMA,eAAc;AACpD,UAAM,IAAI;AAAA,MACR,sDAAsD,WAAW;AAAA,MACjE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAsB,eAAe,QAAqB,YAAuC;AAC/F,MAAI;AACF,UAAM,QAAS,MAAM,OAAO,aAAa,aAAa;AAAA,MACpD,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC;AAAA,IACT,CAAC;AACD,WAAO,OAAO,UAAU,YAAY,MAAM,SAAS;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAIA,eAAsB,yBAAyB,QAAwC;AACrF,QAAM,aAAa,MAAM,OAAO,SAAS,QAAQ,yBAAyB;AAC1E,SAAQ,MAAM,OAAO,aAAa,aAAa;AAAA,IAC7C,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC;AAAA,EACT,CAAC;AACH;AAIA,eAAsB,eAAe,QAAuC;AAC1E,QAAM,eAAe,MAAM,OAAO,SAAS,QAAQ,kBAAkB;AACrE,SAAQ,MAAM,OAAO,aAAa,aAAa;AAAA,IAC7C,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACH;AAEA,eAAsB,eAAe,QAAqB,SAAmC;AAC3F,QAAM,OAAO,MAAM,eAAe,MAAM;AACxC,SAAQ,MAAM,OAAO,aAAa,aAAa;AAAA,IAC7C,SAAS;AAAA,IACT,KAAKC;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,OAAO;AAAA,EAChB,CAAC;AACH;AAEA,eAAsB,gBAAgB,QAAsC;AAC1E,QAAM,OAAO,MAAM,eAAe,MAAM;AACxC,QAAM,IAAK,MAAM,OAAO,aAAa,aAAa;AAAA,IAChD,SAAS;AAAA,IACT,KAAKA;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACD,SAAO,OAAO,CAAC;AACjB;AAIA,eAAsB,UAAU,QAA4C;AAC1E,QAAM,aAAa,MAAM,OAAO,SAAS,QAAQ,yBAAyB;AAC1E,QAAM,SAAU,MAAM,OAAO,aAAa,aAAa;AAAA,IACrD,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC;AAAA,EACT,CAAC;AAED,QAAM,CAAC,KAAK,WAAW,KAAK,IAAI;AAChC,SAAO,IAAI,IAAI,CAAC,IAAI,OAAO,EAAE,IAAI,SAAS,UAAU,CAAC,GAAI,MAAM,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE;AACpF;AAEA,eAAsB,eAAe,QAAiD;AACpF,QAAM,aAAa,MAAM,OAAO,SAAS,QAAQ,yBAAyB;AAC1E,QAAM,SAAU,MAAM,OAAO,aAAa,aAAa;AAAA,IACrD,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC;AAAA,EACT,CAAC;AAED,QAAM,CAAC,KAAK,SAAS,IAAI;AACzB,SAAO,IAAI,IAAI,CAAC,IAAI,OAAO,EAAE,IAAI,SAAS,UAAU,CAAC,EAAG,EAAE;AAC5D;;;ACnIO,IAAM,YAAY;AACzB,IAAM,mBAAmB;AAGlB,IAAM,6BAA6B;AAWnC,SAAS,oBAAoB,OAAuB;AACzD,MAAI,OAAO,UAAU,YAAY,CAAC,0BAA0B,KAAK,KAAK,GAAG;AACvE,UAAM,IAAI;AAAA,MACR,uBAAuB,KAAK,UAAU,KAAK,CAAC;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,CAAC,KAAK,OAAO,EAAE,IAAI,MAAM,MAAM,GAAG;AACxC,QAAM,cAAc,OAAO,UAAU,MAAM,GAAG,CAAC;AAC/C,QAAM,QAAQ,OAAO,GAAG,IAAI,YAAY,OAAO,UAAU;AACzD,MAAI,UAAU,IAAI;AAChB,UAAM,IAAI,cAAc,0BAA0B,sBAAsB;AAAA,EAC1E;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB,OAAuB;AAC1D,MAAI,QAAQ,IAAI;AACd,UAAM,IAAI,cAAc,uBAAuB,sBAAsB;AAAA,EACvE;AACA,QAAM,MAAM,QAAQ;AACpB,QAAM,OAAO,QAAQ;AACrB,MAAI,SAAS,GAAI,QAAO,IAAI,SAAS;AACrC,SAAO,GAAG,GAAG,IAAI,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE,QAAQ,OAAO,EAAE,CAAC;AACtE;AA4BO,SAAS,0BACd,kBACA,MACoB;AACpB,QAAM,aAAa,oBAAoB,gBAAgB;AACvD,QAAM,qBAAsB,aAAa,KAAK,UAAW;AACzD,QAAM,gBAAgB,qBAAqB,KAAK,YAAY,qBAAqB,KAAK;AACtF,QAAM,WAAW,aAAa,gBAAgB,KAAK;AACnD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,KAAK;AAAA,IACrB;AAAA,IACA,YAAY,qBAAqB,QAAQ;AAAA,IACzC,SAAS,qBAAqB,UAAU;AAAA,EAC1C;AACF;AAKA,eAAsB,+BAA+B,QAAsC;AACzF,QAAM,eAAe,MAAM,OAAO,SAAS,QAAQ,kBAAkB;AACrE,MAAI;AACF,WAAQ,MAAM,OAAO,aAAa,aAAa;AAAA,MAC7C,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,SAASC,MAAK;AACZ,UAAM,IAAI;AAAA,MACR,8CAA+CA,KAAc,OAAO;AAAA,MACpE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAGA,eAAsB,qBAAqB,QAAiD;AAC1F,QAAM,eAAe,MAAM,OAAO,SAAS,QAAQ,kBAAkB;AACrE,MAAI;AACF,UAAM,CAAC,SAAS,WAAW,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7D,OAAO,aAAa,aAAa;AAAA,QAC/B,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO,aAAa,aAAa;AAAA,QAC/B,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO,aAAa,aAAa;AAAA,QAC/B,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAASA,MAAK;AACZ,UAAM,IAAI;AAAA,MACR,uCAAwCA,KAAc,OAAO;AAAA,MAC7D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAcA,eAAsB,6BACpB,QACA,UACiC;AACjC,MAAI;AACF,UAAM,eAAe,MAAM,OAAO,SAAS,QAAQ,kBAAkB;AACrE,UAAM,YAAa,MAAM,OAAO,aAAa,aAAa;AAAA,MACxD,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,IAChB,CAAC;AACD,WAAO,EAAE,OAAO,YAAY,WAAW,mBAAmB,UAAU;AAAA,EACtE,QAAQ;AACN,WAAO,EAAE,OAAO,OAAO,mBAAmB,KAAK;AAAA,EACjD;AACF;AAWO,SAAS,0BAA0B,WAAgC;AACxE,MAAI,OAAO,cAAc,YAAY,CAAC,sBAAsB,KAAK,SAAS,GAAG;AAC3E,UAAM,IAAI;AAAA,MACR,oCAAoC,KAAK,UAAU,SAAS,CAAC;AAAA,MAC7D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,IAAI,WAAW,EAAE;AAE/B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,CAAC,IAAI,SAAS,2BAA2B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;AAAA,EAC5E;AAGA,QAAM,MAAM,UAAU,MAAM,CAAC,EAAE,YAAY;AAC3C,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,KAAK,CAAC,IAAI,SAAS,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;AAAA,EAC1D;AACA,SAAO;AACT;AAGO,SAAS,cAAc,OAA2B;AACvD,MAAI,MAAM;AACV,aAAW,KAAK,MAAO,QAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC5D,SAAO,IAAI,YAAY;AACzB;AAmCO,SAAS,uBACd,YACA,MACiB;AACjB,QAAM,gBAAgB,oBAAoB,UAAU;AACpD,QAAM,qBAAsB,gBAAgB,KAAK,UAAW;AAC5D,QAAM,mBACJ,qBAAqB,KAAK,YAAY,qBAAqB,KAAK;AAClE,QAAM,cAAc,mBAAmB,KAAK;AAC5C,MAAI,eAAe,eAAe;AAChC,UAAM,IAAI;AAAA,MACR,oBAAoB,WAAW,mCAAmC,aAAa;AAAA,MAC/E;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,gBAAgB,gBAAgB;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,KAAK;AAAA,IACrB;AAAA,IACA,aAAa,qBAAqB,aAAa;AAAA,EACjD;AACF;AAGA,eAAsB,kBAAkB,QAA8C;AACpF,QAAM,eAAe,MAAM,OAAO,SAAS,QAAQ,kBAAkB;AACrE,MAAI;AACF,UAAM,CAAC,SAAS,WAAW,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7D,OAAO,aAAa,aAAa;AAAA,QAC/B,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO,aAAa,aAAa;AAAA,QAC/B,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO,aAAa,aAAa;AAAA,QAC/B,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAASA,MAAK;AACZ,UAAM,IAAI;AAAA,MACR,mCAAoCA,KAAc,OAAO;AAAA,MACzD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAGA,eAAsB,WAAW,QAAsC;AACrE,QAAM,eAAe,MAAM,OAAO,SAAS,QAAQ,kBAAkB;AACrE,SAAQ,MAAM,OAAO,aAAa,aAAa;AAAA,IAC7C,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACH;;;AChUA,SAAS,sBAAsB;AAoHxB,IAAM,oBAAN,MAAwB;AAAA,EAI7B,YAA6B,MAAyB;AAAzB;AAAA,EAA0B;AAAA,EAA1B;AAAA;AAAA,EAFZ,QAAQ,oBAAI,IAA8B;AAAA,EAI3D,MAAM,SAAS,QAAoD;AACjE,UAAM,cAAc,MAAM,KAAK,KAAK,WAAW,WAAW;AAC1D,UAAM,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,QAAQ,QAAQ;AAChE,UAAM,OAAO,SAAS;AAAA,MACpB,MAAM,KAAK,WAAW,aAAa,MAAM;AAAA,MACzC,MAAM,KAAK,WAAW,aAAa,MAAM;AAAA,IAC3C;AACA,SAAK,MAAM,IAAI,aAAa,IAAI;AAChC,QAAI;AACF,aAAQ,MAAM;AAAA,IAChB,UAAE;AACA,UAAI,KAAK,MAAM,IAAI,WAAW,MAAM,KAAM,MAAK,MAAM,OAAO,WAAW;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAc,WACZ,aACA,QAC2B;AAE3B,wBAAoB,OAAO,SAAS;AAGpC,UAAM,CAAC,iBAAiB,MAAM,oBAAoB,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtE,0BAA0B,KAAK,KAAK,OAAO,WAAW;AAAA,MACtD,qBAAqB,KAAK,KAAK,KAAK;AAAA,MACpC,+BAA+B,KAAK,KAAK,KAAK;AAAA,IAChD,CAAC;AAGD,UAAM,QAAQ,0BAA0B,OAAO,WAAW,IAAI;AAC9D,UAAM,YAAY,MAAM,6BAA6B,KAAK,KAAK,OAAO,MAAM,QAAQ;AACpF,QAAI,UAAU,OAAO;AACnB,cAAQ;AAAA,QACN,8BAA8B,MAAM,UAAU,sDAC9B,qBAAqB,UAAU,qBAAqB,EAAE,CAAC;AAAA,MAEzE;AAAA,IACF;AAGA,UAAM,UAAU,cAAc,0BAA0B,eAAe,CAAC;AAGxE,UAAM,SAAS,MAAM,KAAK,kBAAkB;AAAA,MAC1C,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,YAAY,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,YAAY,OAAO;AAAA,MACnB,eAAe,OAAO;AAAA,MACtB,YAAY,MAAM;AAAA,MAClB,SAAS,MAAM;AAAA,MACf,MAAM;AAAA,QACJ,iBAAiB,MAAM;AAAA,QACvB,WAAW,KAAK;AAAA,QAChB,eAAe,MAAM;AAAA,QACrB,gBAAgB,MAAM;AAAA,MACxB;AAAA,MACA,0BAA0B;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,UAAU,QAAwD;AACtE,QAAI,CAAC,KAAK,KAAK,cAAc;AAC3B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,iCAAiC,KAAK,OAAO,eAAe,GAAG;AAClE,YAAM,IAAI;AAAA,QACR,qCAAqC,OAAO,eAAe;AAAA,QAC3D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,KAAK,KAAK,gBACzB,KAAK,KAAK,aAAa,SAAS;AACtC,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,oBAAoB,OAAO,UAAU;AAC3D,UAAM,CAAC,SAAS,MAAM,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,MACjD,eAAe,KAAK,KAAK,OAAO,YAAY;AAAA,MAC5C,kBAAkB,KAAK,KAAK,KAAK;AAAA,MACjC,WAAW,KAAK,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,QAAI,UAAU,eAAe;AAC3B,YAAM,IAAI;AAAA,QACR,0CAA0C,OAAO,UAAU,aAAa;AAAA,QACxE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,MAAM,gBAAgB,YAAY,IAAI;AAClD,YAAM,IAAI;AAAA,QACR,qBAAqB,aAAa,+BAA+B,OAAO;AAAA,QACxE;AAAA,QACA,0BAA0B,qBAAqB,OAAO,CAAC;AAAA,MACzD;AAAA,IACF;AACA,UAAM,OAAO,UAAU,KAAK,gBAAgB,UAAU;AACtD,UAAM,QAAyB,uBAAuB,OAAO,YAAY,IAAI;AAG7E,UAAM,eAAe,MAAM,KAAK,KAAK,MAAM,SAAS,QAAQ,kBAAkB;AAC9E,UAAM,cAAe,MAAM,KAAK,KAAK,aAAa,cAAc;AAAA,MAC9D,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,MAAM,OAAO,iBAAiB,OAAO,YAAY,4CAA4C;AAAA,MACpG,SAAS,KAAK,KAAK,aAAa;AAAA,MAChC,OAAO;AAAA,IACT,CAAU;AAGV,UAAM,UAAU,MAAM,KAAK,KAAK,MAAM,aAAa,0BAA0B;AAAA,MAC3E,MAAM;AAAA,IACR,CAAC;AACD,UAAM,YAAY,KAAK,2BAA2B,QAAQ,IAAI;AAE9D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,qBAAqB,MAAM;AAAA,MAC3B,MAAM,EAAE,kBAAkB,MAAM,kBAAkB,gBAAgB,MAAM,eAAe;AAAA,MACvF,aAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBACJ,WACA,WACgC;AAChC,UAAM,eAAe,MAAM,KAAK,KAAK,MAAM,SAAS,QAAQ,kBAAkB;AAC9E,UAAM,MAAM,MAAM,KAAK,KAAK,MAAM,aAAa,eAAe;AAC9D,UAAM,aAAa,cAAc,MAAM,QAAS,MAAM,QAAS;AAE/D,UAAM,OAAQ,MAAM,KAAK,KAAK,MAAM,aAAa,QAAQ;AAAA,MACvD,SAAS;AAAA,MACT,QAAQ,gBAAgB;AAAA,QACtB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,yBAAyB,EAAE,SAAS;AAAA,MAC/E;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAED,eAAW,OAAO,MAAM;AACtB,UAAI;AACF,cAAM,UAAU,eAAe;AAAA,UAC7B,KAAK;AAAA,UACL,MAAM,IAAI;AAAA,UACV,QAAQ,IAAI;AAAA,QACd,CAAC;AAID,YAAI,QAAQ,KAAK,cAAc,UAAW;AAC1C,YAAI,QAAQ,cAAc,uBAAuB;AAC/C,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,QAAQ,KAAK;AAAA,YACzB,aAAa,KAAK,IAAI;AAAA,UACxB;AAAA,QACF;AACA,eAAO,EAAE,MAAM,UAAU,QAAQ,QAAQ,KAAK,iBAAiB,UAAU;AAAA,MAC3E,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eACJ,WACA,UAAiC,CAAC,GACM;AACxC,UAAM,YAAY,QAAQ,aAAa;AACvC,QAAI,WAAW,QAAQ,cAAc;AACrC,UAAM,QAAQ,KAAK,IAAI;AAEvB,WAAO,KAAK,IAAI,IAAI,QAAQ,WAAW;AACrC,UAAI,QAAQ,QAAQ,SAAS;AAC3B,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAS,MAAM,KAAK,oBAAoB,SAAS;AACvD,UAAI,OAAO,SAAS,YAAa,QAAO,EAAE,YAAY,OAAO,WAAW;AACxE,UAAI,OAAO,SAAS,UAAU;AAC5B,cAAM,IAAI;AAAA,UACR,4BAA4B,OAAO,MAAM;AAAA,UACzC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,QAAQ,CAAC;AAC5D,iBAAW,KAAK,IAAI,WAAW,GAAG,GAAM;AAAA,IAC1C;AACA,UAAM,IAAI;AAAA,MACR,wCAAwC,SAAS;AAAA,MACjD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,2BAA2B,MAAsE;AACvG,eAAW,OAAO,MAAM;AACtB,UAAI;AACF,cAAM,UAAU,eAAe;AAAA,UAC7B,KAAK;AAAA,UACL,MAAM,IAAI;AAAA,UACV,QAAQ,IAAI;AAAA,QACd,CAAC;AACD,YAAI,QAAQ,cAAc,sBAAuB,QAAO,QAAQ,KAAK;AAAA,MACvE,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,0BAA0B,QAKO;AACrC,QAAI,CAAC,KAAK,KAAK,kBAAkB;AAC/B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,KAAK,iBAAiB,IAAI,MAAM;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,kBAAkB,MAKkB;AAChD,UAAM,SAAS,MAAM,KAAK,KAAK,eAAe,UAAU;AACxD,UAAM,QAAQ,oBAAoB,KAAK,UAAU,EAAE,SAAS;AAE5D,UAAM,KAA8B;AAAA,MAClC,iBAAiB;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,QAAQ;AAAA,MACR,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,KAAK,QAAQ,EAAE,CAAC;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM,OAAO,SAAS,EAAE;AACzC,UAAM,SAAS,MAAM,KAAK,KAAK,WAAW,KAAK,QAAQ;AACvD,UAAM,SAAS,MAAM,OAAO,cAAc,OAAO,OAAO;AAExD,UAAM,SACJ,OAAO,QAAQ,MAAM,qBAAqB,OAAO,QAAQ;AAC3D,QAAI,UAAU,WAAW,cAAc;AACrC,YAAM,IAAI;AAAA,QACR,+BAA+B,MAAM;AAAA,QACrC;AAAA,QACA,mBAAmB,OAAO,QAAQ,IAAI;AAAA,MACxC;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,OAAO,QAAQ,QAAQ;AAAA,MAC7B,WAAW,OAAO,QAAQ,aAAa;AAAA,IACzC;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,QAA8C;AACpF,SAAO,IAAI,kBAAkB,MAAM;AACrC;;;ACzaA,SAAS,+BAA+B;AAyDxC,IAAM,2BAA2B;AACjC,IAAM,eAAe,MAAM,QAAQ;AAG5B,IAAM,wBAAwB;AAAA,EACnC,gBAAgB;AAAA,IACd,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,IAC9B,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IAClC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,EACtC;AACF;AAGA,IAAM,gBAAgB;AAAA,EACpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,UAAU,CAAC;AAAA,IAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,MAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,MAC9B,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,MAClC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,MACpC,EAAE,MAAM,aAAa,MAAM,QAAQ;AAAA,IACrC;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AACF;AAGA,IAAM,YAAY;AAAA,EAChB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,UAAU,CAAC;AAAA,IAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,MACjC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,IACrC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,QAAQ,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,MACnC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACnC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,EACtC;AACF;AAUO,IAAM,8BAAN,MAAkC;AAAA,EAGvC,YAA6B,QAAkC;AAAlC;AAAA,EAAmC;AAAA,EAAnC;AAAA,EAFrB;AAAA;AAAA,EAKR,MAAM,UAAU,aAAmD;AACjE,UAAM,EAAE,cAAc,iBAAiB,IAAI,KAAK;AAChD,UAAM,OAAO,MAAM,KAAK,YAAY;AACpC,UAAM,CAAC,SAAS,WAAW,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,MACpD,aAAa,aAAa;AAAA,QACxB,SAAS,KAAK;AAAA,QACd,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,WAAW;AAAA,MACpB,CAAC;AAAA,MACD,aAAa,aAAa;AAAA,QACxB,SAAS,KAAK;AAAA,QACd,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,aAAa,gBAAgB;AAAA,MACtC,CAAC;AAAA,MACD,aAAa,aAAa;AAAA,QACxB,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,WAAW;AAAA,MACpB,CAAC;AAAA,IACH,CAAC;AACD,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,cAAc;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,SAAiB,aAA2B;AACxD,UAAM,EAAE,cAAc,cAAc,iBAAiB,IAAI,KAAK;AAC9D,UAAM,OAAO,MAAM,KAAK,YAAY;AACpC,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,SAAU,MAAM,aAAa,cAAc;AAAA,MAC/C,SAAS,KAAK;AAAA,MACd,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,kBAAkB,MAAM;AAAA,MAC/B;AAAA,MACA,OAAO,aAAa,SAAS;AAAA,IAC/B,CAAU;AACV,UAAM,aAAa,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAC7D,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,cAAc,QAKa;AAC/B,UAAM,EAAE,cAAc,cAAc,iBAAiB,IAAI,KAAK;AAC9D,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,UAAU,MAAM,aAAa,WAAW;AAC9C,UAAM,QAAS,MAAM,aAAa,aAAa;AAAA,MAC7C,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,QAAQ,OAAO;AAAA,IACxB,CAAC;AACD,UAAM,QAAQ,MAAM,aAAa,SAAS;AAC1C,UAAM,YAAY,OAAO,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,CAAC;AACzE,UAAM,WAAW,aAAa,OAAO,mBAAmB,KAAK,OAAO,mBAAmB;AAEvF,UAAM,SAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,mBAAmB;AAAA,IACrB;AACA,UAAM,UAAU;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,IAAI,OAAO;AAAA,MACX,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,UAAU,OAAO,QAAQ;AAAA,IAC3B;AACA,UAAM,YAAa,MAAM,aAAa,cAAc;AAAA,MAClD;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,MACb;AAAA,IACF,CAAU;AACV,WAAO;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,IAAI,OAAO;AAAA,MACX,QAAQ,OAAO,OAAO,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAA8D;AAClF,UAAM,MAAM,GAAG,KAAK,OAAO,WAAW,QAAQ,OAAO,EAAE,CAAC;AACxD,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,GAAG;AAAA,IAC1B,CAAC;AACD,UAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAG/C,QAAI,CAAC,IAAI,MAAM,CAAC,KAAK,iBAAiB;AACpC,YAAM,IAAI;AAAA,QACR,2CAA2C,KAAK,SAAS,IAAI,UAAU;AAAA,QACvE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS,KAAK,WAAW;AAAA,MACzB,iBAAiB,KAAK;AAAA,MACtB,aAAa,KAAK,eAAe;AAAA,MACjC,SAAS,KAAK,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAI,QAAuG;AAC/G,UAAM,SAAS,MAAM,KAAK,cAAc,MAAM;AAC9C,WAAO,KAAK,gBAAgB,MAAM;AAAA,EACpC;AAAA;AAAA,EAIA,MAAc,cAA+D;AAC3E,QAAI,KAAK,UAAW,QAAO,KAAK;AAChC,UAAM,cAAe,MAAM,KAAK,OAAO,aAAa,aAAa;AAAA,MAC/D,SAAS,KAAK,OAAO;AAAA,MACrB,KAAK;AAAA,MACL,cAAc;AAAA,IAChB,CAAC;AACD,UAAM,WAAY,MAAM,KAAK,OAAO,aAAa,aAAa;AAAA,MAC5D,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,IAChB,CAAC;AACD,SAAK,YAAY,EAAE,SAAS,aAAa,UAAU,OAAO,QAAQ,EAAE;AACpE,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,iBAA0B;AAChC,UAAM,UAAU,KAAK,OAAO,aAAa;AACzC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAoBO,SAAS,sBAAsB,KAAkC;AACtE,QAAM,iBAAiB,IAAI,cAAc;AACzC,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,QAAiE;AAC7E,UAAM,EAAE,cAAc,eAAe,iBAAiB,IAAI;AAC1D,UAAM,UAAU,MAAM,aAAa,WAAW;AAC9C,UAAM,QAAS,MAAM,aAAa,aAAa;AAAA,MAC7C,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,IAAI,IAAI;AAAA,IACjB,CAAC;AAGD,UAAM,SAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,mBAAmB;AAAA,IACrB;AACA,UAAM,UAAU;AAAA,MACd,MAAM,IAAI;AAAA,MACV,IAAI,IAAI;AAAA,MACR,QAAQ,OAAO,IAAI,MAAM;AAAA,MACzB;AAAA,MACA,UAAU,OAAO,IAAI,QAAQ;AAAA,IAC/B;AACA,UAAM,YAAY,MAAM,wBAAwB;AAAA,MAC9C;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,MACb;AAAA,MACA,WAAW,IAAI;AAAA,IACjB,CAAC;AACD,QAAI,UAAU,YAAY,MAAM,IAAI,KAAK,YAAY,GAAG;AACtD,YAAM,IAAI;AAAA,QACR,yBAAyB,SAAS,cAAc,IAAI,IAAI;AAAA,QACxD;AAAA,QACA,2BAA2B,OAAO,6CAA6C,KAAK;AAAA,MACtF;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,aAAa,SAAS;AAC1C,UAAM,YAAY,OAAO,MAAM,SAAS;AACxC,QAAI,IAAI,YAAY,WAAW;AAC7B,YAAM,IAAI;AAAA,QACR,6BAA6B,IAAI,QAAQ,WAAW,SAAS;AAAA,QAC7D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAU,MAAM,cAAc,cAAc;AAAA,MAChD,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,IAAI,MAAM,IAAI,IAAI,OAAO,IAAI,MAAM,GAAG,OAAO,IAAI,QAAQ,GAAG,IAAI,SAAS;AAAA,MAChF,SAAS;AAAA,MACT,OAAO,cAAc,SAAS;AAAA,IAChC,CAAU;AACV,UAAM,UAAU,MAAM,aAAa,0BAA0B;AAAA,MAC3D,MAAM;AAAA,MACN,SAAS,IAAI,oBAAoB;AAAA,IACnC,CAAC;AACD,QAAI,QAAQ,WAAW,WAAW;AAChC,YAAM,IAAI;AAAA,QACR,kBAAkB,MAAM;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,aAAa,OAAO,QAAQ,WAAW;AAAA,MACvC,SAAS,QAAQ,QAAQ,SAAS;AAAA,IACpC;AAAA,EACF;AACF;AAWA,eAAsB,4BACpB,QACwC;AACxC,QAAM,EAAE,cAAc,cAAc,SAAS,IAAI;AACjD,QAAM,SAAS,MAAM,aAAa,eAAe;AAAA,IAC/C,KAAK,SAAS;AAAA,IACd,UAAU,SAAS;AAAA,IACnB,SAAS,aAAa,WAAW;AAAA,IACjC,OAAO,aAAa,SAAS;AAAA,EAC/B,CAAU;AACV,QAAM,UAAU,MAAM,aAAa,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAC7E,MAAI,CAAC,QAAQ,iBAAiB;AAC5B,UAAM,IAAI,cAAc,iEAAiE,6BAA6B;AAAA,EACxH;AACA,SAAO,EAAE,kBAAkB,QAAQ,gBAA2B;AAChE;;;ACldA,IAAM,sBAAkC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,mBAA0C,oBAAI,IAAc;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAeM,SAAS,oBAAoB,OAAkD;AACpF,QAAM,EAAE,gBAAgB,iBAAiB,eAAe,WAAW,IAAI;AACvE,MAAI,mBAAmB,IAAI;AACzB,WAAO,EAAE,MAAM,YAAY,QAAQ,kBAAkB,kBAAkB,CAAC,cAAc,EAAE;AAAA,EAC1F;AAGA,QAAM,SAAS,cAAc,cAAc,KAAK;AAChD,MAAI,UAAU,iBAAiB;AAC7B,WAAO,EAAE,MAAM,UAAU,OAAO,eAAe;AAAA,EACjD;AAGA,MAAI,iBAAiB,IAAI,cAAc,GAAG;AACxC,UAAM,QAAQ,eAAe,cAAc;AAC3C,QAAI,OAAO;AACT,iBAAW,gBAAgB,qBAAqB;AAC9C,YAAI,iBAAiB,eAAgB;AACrC,cAAM,UAAU,cAAc,YAAY,KAAK;AAC/C,YAAI,UAAU,gBAAiB;AAC/B,cAAM,QAAQ,eAAe,YAAY;AACzC,YAAI,CAAC,MAAO;AACZ,cAAM,WAAW,eAAe,OAAO,OAAO,iBAAiB,UAAU;AACzE,YAAI,SAAS,IAAI;AACf,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,YAAY;AACpB,UAAM,OAAO,MAAM,eAAe,QAAQ;AAC1C,UAAM,WAAW,MAAM,cAAc,YAAY;AAMjD,QAAI,mBAAmB,kBAAkB,QAAQ,iBAAiB;AAIhE,YAAM,kBAAmB,MAAM,cAAsD,eAChF;AACL,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY;AAAA,QACZ;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,IACF;AAIA,QACE,MAAM,sBACH,iBAAiB,IAAI,cAAc,KACnC,iBAAiB,IAAI,cAA0B,KAC/C,QAAQ,iBACX;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,eAAe;AAAA,QACf,cAAc;AAAA,MAChB;AAAA,IACF;AAIA,QAAI,iBAAiB,IAAI,cAAc,KAAK,YAAY,mBAAmB,SAAS,IAAI;AACtF,YAAM,gBAAgB,oBAAoB;AAAA,QACxC,CAAC,OAAO,cAAc,CAAC,KAAK,MAAM;AAAA,MACpC;AACA,UAAI,eAAe;AACjB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAA+B,CAAC,cAAc;AACpD,MAAI,iBAAiB,IAAI,cAAc,GAAG;AACxC,eAAW,KAAK,oBAAqB,KAAI,MAAM,eAAgB,kBAAiB,KAAK,CAAC;AAAA,EACxF;AACA,MAAI,MAAM,YAAY;AACpB,qBAAiB,KAAK,cAAc;AACpC,qBAAiB,KAAK,eAAe;AAAA,EACvC;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,uBAAuB,eAAe,4CAA4C,cAAc;AAAA,IACxG;AAAA,EACF;AACF;;;AC/GA,IAAM,uBAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,aAAa;AAAA,EACjB,eAA0B,EAAE,KAAK,GAAK,QAAQ,EAAI;AAAA,EAClD,YAA0B,EAAE,KAAK,KAAK,QAAQ,GAAI;AAAA;AAAA,EAClD,kBAA0B,EAAE,KAAK,IAAK,QAAQ,GAAI;AAAA;AAAA,EAClD,yBAA0B,EAAE,KAAK,IAAK,QAAQ,GAAI;AAAA;AACpD;AAaO,SAAS,mBAAmB,OAA8C;AAC/E,MAAI,MAAM,mBAAmB,IAAI;AAC/B,WAAO,EAAE,MAAM,YAAY,QAAQ,kBAAkB,kBAAkB,CAAC,MAAM,cAAc,EAAE;AAAA,EAChG;AAGA,QAAM,WAAW,MAAM,eAAe,MAAM,cAAc,KAAK;AAC/D,MAAI,YAAY,MAAM,iBAAiB;AACrC,WAAO,EAAE,MAAM,UAAU,OAAO,MAAM,eAAe;AAAA,EACvD;AAGA,MAAI,MAAM,oBAAoB;AAC5B,UAAM,UAAU,MAAM,eAAe,kBAAkB,KAAK;AAC5D,QAAI,WAAW,MAAM,iBAAiB;AACpC,aAAO,WAAW,kBAAkB,oBAAoB,MAAM,gBAAgB,QAAQ,MAAM,eAAe;AAAA,IAC7G;AAAA,EACF;AAGA,QAAM,cAAc,MAAM,kBAAkB;AAC5C,aAAW,OAAO,sBAAsB;AACtC,SAAK,MAAM,eAAe,GAAG,KAAK,MAAM,MAAM,gBAAiB;AAC/D,QAAI,aAAa;AACf,aAAO,WAAW,YAAY,KAAK,MAAM,gBAAgB,QAAQ,MAAM,eAAe;AAAA,IACxF;AAEA,WAAO,WAAW,yBAAyB,KAAK,MAAM,gBAAgB,QAAQ,MAAM,eAAe;AAAA,EACrG;AAGA,QAAM,YAAwB,CAAC,MAAM,gBAAgB,GAAG,oBAAoB;AAC5E,MAAI,MAAM,mBAAoB,WAAU,KAAK,kBAAkB;AAC/D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,iCAAiC,MAAM,cAAc,QAAQ,MAAM,eAAe;AAAA,IAC1F,kBAAkB;AAAA,EACpB;AACF;AAEA,SAAS,WACP,MACA,WACA,SACA,OACA,QACoB;AACpB,QAAM,QAAQ,WAAW,IAAI;AAC7B,QAAM,QAA4B;AAAA,IAChC,EAAE,MAAM,WAAW,SAAS,OAAO,QAAQ,cAAc,MAAM,IAAI;AAAA,EACrE;AACA,SAAO,EAAE,MAAM,UAAU,UAAU,MAAM,OAAO,cAAc,MAAM,KAAK,iBAAiB,MAAM,OAAO;AACzG;AA+BO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,oBAAI,IAAyB;AAAA,EAEtD,YAAY,SAA8B,CAAC,GAAG;AAC5C,SAAK,WAAW,OAAO,WAAW,0BAA0B,QAAQ,OAAO,EAAE;AAC7E,SAAK,aAAa,OAAO,cAAc;AACvC,SAAK,YAAY,OAAO,aAAa;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,KAAmD;AAClE,UAAM,MAAM,KAAK,SAAS,GAAG;AAC7B,UAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAC9B,QAAI,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,WAAY,QAAO,IAAI;AAE7D,UAAM,MAAM,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,sBAAsB;AAAA,MACpE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,uBAAuB,IAAI;AAAA,QAC3B,oBAAoB,IAAI;AAAA,QACxB,qBAAqB,IAAI;AAAA,QACzB,kBAAkB,IAAI;AAAA,QACtB,4BAA4B,IAAI,4BAA4B;AAAA,QAC5D,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,YAAM,IAAI;AAAA,QACR,sBAAsB,IAAI,MAAM;AAAA,QAChC;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAO7B,UAAM,QAA2B;AAAA,MAC/B,WAAW,KAAK,cAAc;AAAA,MAC9B,iBAAiB,eAAe,IAAI,UAAU,KAAK,cAAc,GAAG;AAAA,MACpE,cAAc,KAAK,oCAAoC;AAAA,MACvD,OAAO;AAAA,IACT;AACA,SAAK,MAAM,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI,GAAG,MAAM,CAAC;AAC7C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,MASiB;AAClC,QAAI;AACJ,QAAI;AACF,YAAO,MAAM,OAAO,iBAA2B;AAAA,IACjD,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,IAAI,YAAY;AACnB,YAAM,IAAI,cAAc,+BAA+B,uBAAuB;AAAA,IAChF;AACA,UAAM,SAAS,IAAI,IAAI,WAAW,EAAE,QAAQ,GAAG,KAAK,OAAO,MAAM,CAAC;AAIlE,UAAM,WAAqB,CAAC;AAC5B,UAAM,SAAS,MAAM,OAAO,aAAa;AAAA,MACvC,OAAO,KAAK,MAAM;AAAA,MAClB,eAAe,KAAK,cAAc,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,SAAS,EAAE,QAAQ,EAAE;AAAA,MACzF,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB,wBAAwB,CAAC,UAAkB,WAAmB;AAC5D,iBAAS,KAAK,MAAM;AAAA,MACtB;AAAA,IACF,CAAC;AACD,QAAI,QAAQ,OAAQ,UAAS,KAAK,OAAO,MAAM;AAC/C,WAAO,EAAE,SAAS;AAAA,EACpB;AAAA,EAEQ,SAAS,KAA+B;AAC9C,WAAO,GAAG,IAAI,UAAU,IAAI,IAAI,aAAa,IAAI,IAAI,UAAU,IAAI,IAAI,aAAa,IAAI,IAAI,QAAQ;AAAA,EACtG;AACF;AAEA,SAAS,eAAe,UAAkB,WAA2B;AACnE,MAAI;AACF,UAAM,MAAM,OAAO,QAAQ;AAC3B,UAAM,OAAO,OAAO,SAAS;AAC7B,QAAI,OAAO,MAAM,QAAQ,GAAI,QAAO;AACpC,QAAI,QAAQ,IAAK,QAAO;AACxB,UAAM,OAAO,MAAM;AACnB,WAAO,OAAQ,OAAO,SAAU,GAAG;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA8BO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA4B,SAAoC,CAAC,GAAG;AAAxC;AAAA,EAAyC;AAAA,EAAzC;AAAA;AAAA,EAG5B,MAAM,MAAM,QAAsF;AAChG,QAAI,CAAC,KAAK,OAAO,UAAU,CAAC,KAAK,OAAO,gBAAgB;AACtD,aAAO,EAAE,QAAQ,GAAG,WAAW,IAAI,cAAc,EAAE;AAAA,IACrD;AAGA,WAAO,EAAE,QAAQ,IAAI,WAAW,mBAAwB,cAAc,GAAG;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,KAI0C;AACrD,QAAI,IAAI,YAAY,WAAW;AAC7B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,KAAK,OAAO,UAAU,CAAC,KAAK,OAAO,kBAAkB,CAAC,KAAK,OAAO,QAAQ;AAC7E,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,OAAO,wBAAkC;AAAA,IACvD,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAIA,SAAK;AACL,SAAK;AACL,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAuCO,IAAM,yBAAN,MAA6B;AAAA,EAClC,YAA6B,KAAmC;AAAnC;AAAA,EAAoC;AAAA,EAApC;AAAA;AAAA,EAG7B,MAAM,WAAW,KAAqE;AACpF,UAAM,OAAO,MAAM,KAAK,IAAI,OAAO,eAAe;AAClD,QAAI,QAAQ,IAAI,eAAgB,QAAO;AAEvC,UAAM,WAAW,MAAM,KAAK,IAAI,YAAY;AAC5C,UAAM,WAAW,mBAAmB;AAAA,MAClC,gBAAgB,KAAK,IAAI,OAAO,OAAO;AAAA,MACvC,iBAAiB,IAAI;AAAA,MACrB,cAAc,SAAS;AAAA,MACvB,cAAc,SAAS;AAAA,MACvB,cAAc,SAAS;AAAA,MACvB,gBAAgB;AAAA,MAChB,oBAAoB,CAAC,CAAC,KAAK,IAAI;AAAA,IACjC,CAAC;AAED,QAAI,SAAS,SAAS,UAAU;AAC9B,YAAM,IAAI;AAAA,QACR,6BAA6B,IAAI,cAAc,YAAY,KAAK,IAAI,OAAO,OAAO,QAAQ;AAAA,QAC1F;AAAA,QACA,SAAS,SAAS,aAAa,SAAS,SAAS;AAAA,MACnD;AAAA,IACF;AAEA,QAAI,SAAS,aAAa,YAAY;AACpC,YAAM,OAAO,SAAS,MAAM,CAAC;AAC7B,YAAM,KAAK,YAAY,MAAM,IAAI,SAAS;AAC1C,aAAO,KAAK,oBAAoB,IAAI,cAAc;AAAA,IACpD;AAEA,QAAI,SAAS,aAAa,kBAAkB;AAC1C,UAAI,CAAC,KAAK,IAAI,WAAW;AACvB,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,OAAO,SAAS,MAAM,CAAC;AAC7B,YAAM,KAAK,IAAI,UAAU,OAAO;AAAA,QAC9B,QAAQ,KAAK;AAAA,QACb,WAAW,IAAI;AAAA,QACf,SAAS,KAAK,IAAI,OAAO,OAAO,aAAa,mBAAmB,YAAY;AAAA,MAC9E,CAAC;AACD,aAAO,KAAK,oBAAoB,IAAI,cAAc;AAAA,IACpD;AAEA,UAAM,IAAI;AAAA,MACR,YAAY,SAAS,QAAQ;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,MAAwB,WAAkC;AAClF,UAAM,WAAW,eAAe,KAAK,IAAI,OAAO,OAAO,UAAU,MAAM;AACvE,wBAAoB,QAAQ;AAC5B,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI,cAAc,+BAA+B,mBAAmB;AAAA,IAC5E;AACA,UAAM,aAAa,sBAAsB,KAAK,SAAS;AACvD,UAAM,aAAa,KAAK,IAAI,OAAO,OAAO,aAAa,mBAAmB,iBAAiB;AAE3F,UAAM,QAAQ,MAAM,KAAK,IAAI,KAAK,WAAW;AAAA,MAC3C;AAAA,MACA,eAAe,iBAAiB,KAAK,WAAW,KAAK,KAAK;AAAA,MAC1D;AAAA,MACA,eAAe,SAAS;AAAA,MACxB,UAAU,KAAK,OAAO,SAAS;AAAA,IACjC,CAAC;AAED,UAAM,KAAK,IAAI,KAAK,aAAa;AAAA,MAC/B;AAAA,MACA,eAAe;AAAA,QACb,GAAG,KAAK,IAAI,YAAY;AAAA,QACxB,EAAE,SAAS,YAAY,SAAS,UAAU;AAAA,MAC5C;AAAA,MACA,iBAAiB,KAAK,IAAI,YAAY;AAAA,MACtC,cAAc,KAAK,IAAI,YAAY;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,oBAAoB,UAAmC;AACnE,UAAM,SAAS,KAAK,IAAI,UAAU;AAClC,UAAM,YAAY,KAAK,IAAI,aAAa;AACxC,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,YAAM,OAAO,MAAM,KAAK,IAAI,OAAO,eAAe;AAClD,UAAI,QAAQ,SAAU,QAAO;AAC7B,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAAA,IAChD;AACA,UAAM,IAAI;AAAA,MACR,0BAA0B,SAAS,mCAAmC,QAAQ;AAAA,MAC9E;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAGA,SAAS,sBAAsB,KAAuB;AACpD,QAAM,MAAyC;AAAA,IAC7C,oBAAqB;AAAA,IACrB,gBAAqB;AAAA,IACrB,gBAAqB;AAAA,IACrB,oBAAqB;AAAA,IACrB,oBAAqB;AAAA,IACrB,kBAAqB;AAAA,IACrB,kBAAqB;AAAA,EACvB;AACA,QAAM,MAAM,IAAI,GAAG;AACnB,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR,gCAAgC,GAAG;AAAA,MACnC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,iBAAiB,OAAiB,OAAyC;AAClF,MAAI,UAAU,QAAQ;AACpB,UAAM,IAAI;AAAA,MACR,qDAAqD,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,KAAK,GAAG,QAAQ;AACpC,MAAI,CAAC,QAAQ,SAAS,8CAA8C;AAClE,UAAM,IAAI;AAAA,MACR,0BAA0B,KAAK;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AClgBO,IAAM,oBAAN,MAAkD;AAAA,EAIvD,YACmB,QACjB,UACA;AAFiB;AAGjB,SAAK,WAAW;AAAA,EAClB;AAAA,EAJmB;AAAA,EAJV,WAAW;AAAA,EACH;AAAA,EASjB,OAAO,UAA6B;AAClC,UAAM,YACJ,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB,KAAK;AAC5F,QAAI,CAAC,UAAW,QAAO;AACvB,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,CAAC;AACtE,YAAM,SAAS,QAAQ,UAAU,CAAC;AAClC,aACE,QAAQ,WAAW;AAAA,OAElB,QAAQ,UAAU,WACjB,QAAQ,OAAO,cAAc,MAAM,OAAO,KAAK,QAAQ,GAAG,QAAQ,OAAO,YAAY;AAAA,IAE3F,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IACJ,KACA,MACA,UACA,MACmB;AACnB,UAAM,QAAQ,OAAO,KAAK,QAAQ;AAClC,UAAM,QAAQ,MAAM,OAAO;AAC3B,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,2BAA2B,KAAK,QAAQ;AAAA,QACxC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YACJ,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB,KAAK;AAC5F,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,oBAAoB,mCAAmC,gBAAgB;AAAA,IACnF;AACA,QAAI;AACJ,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,CAAC;AACtE,eAAS,QAAQ,UAAU,CAAC,KAAK,CAAC;AAAA,IACpC,QAAQ;AACN,YAAM,IAAI,oBAAoB,qCAAqC,gBAAgB;AAAA,IACrF;AACA,UAAM,QAAQ,OAAO;AACrB,UAAM,YAAY,OAAO;AACzB,QAAI,CAAC,SAAS,CAAC,WAAW;AACxB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,OAAO,SAAS;AAG/B,UAAM,KAAK,MAAM,KAAK,OAAO,cAAc,OAAO,OAAO,QAAQ,MAAM,OAAO;AAC9E,UAAM,WAAW,MAAM,KAAK,OAAO,gBAAgB,MAAM,OAAO;AAEhE,UAAM,QAAQ,OAAO;AAAA,MACnB,KAAK,UAAU;AAAA,QACb,QAAQ;AAAA,QACR,SAAS,OAAO,WAAW,MAAM;AAAA,QACjC,QAAQ,GAAG;AAAA,QACX,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AAAA,IACH,EAAE,SAAS,QAAQ;AAEnB,UAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,YAAQ,IAAI,aAAa,KAAK;AAC9B,WAAO,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAA,EACxC;AACF;;;AC7EO,IAAM,eAAqD;AAAA,EAChE,MAAO,EAAE,QAAQ,QAAS,SAAS,8CAA8C,UAAU,GAAG;AAAA,EAC9F,MAAO,EAAE,QAAQ,QAAS,SAAS,8CAA8C,UAAU,GAAG;AAAA,EAC9F,OAAO,EAAE,QAAQ,SAAS,SAAS,8CAA8C,UAAU,GAAG;AAChG;AA0BA,IAAMC,wBAAuB;AAY7B,eAAsB,oBAAoB,OAA2D;AACnG,MAAI,MAAM,YAAY,IAAI;AACxB,WAAO,EAAE,MAAM,YAAY,QAAQ,4BAA4B;AAAA,EACjE;AACA,MAAI,EAAE,MAAM,WAAW,eAAe;AACpC,WAAO,EAAE,MAAM,YAAY,QAAQ,yBAAyB,MAAM,OAAO,GAAG;AAAA,EAC9E;AACA,QAAM,UAAU,MAAM,kBAAkBA;AACxC,QAAM,OAAO;AAGb,MAAI,MAAM,YAAY,UAAU,MAAM,aAAa,QAAQ;AACzD,UAAM,MAAM,MAAM,UAAU,MAAM,QAAQ,aAAa,KAAK,SAAS,MAAM,MAAM,QAAQ;AACzF,QAAI,QAAQ,KAAM,QAAO,EAAE,MAAM,YAAY,QAAQ,wBAAwB;AAC7E,QAAI,QAAQ,GAAM,QAAO,EAAE,MAAM,YAAY,QAAQ,mBAAmB;AACxE,QAAI,YAAY,MAAM,UAAU,GAAG,IAAI,SAAS;AAC9C,aAAO,EAAE,MAAM,YAAY,QAAQ,oBAAoB,OAAO,OAAO;AAAA,IACvE;AACA,QAAI,MAAM,UAAU,MAAM,MAAM,QAAQ;AACtC,aAAO,EAAE,MAAM,YAAY,QAAQ,YAAY,GAAG,iBAAiB,MAAM,MAAM,GAAG;AAAA,IACpF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,CAAC,EAAE,SAAS,QAAQ,UAAU,QAAQ,UAAU,MAAM,UAAU,aAAa,IAAI,CAAC;AAAA,MACxF,aAAa;AAAA,MACb,aAAa,YAAY,MAAM,UAAU,GAAG;AAAA,IAC9C;AAAA,EACF;AAGA,OAAK,MAAM,YAAY,UAAU,MAAM,YAAY,YAAY,MAAM,aAAa,QAAQ;AACxF,UAAM,UAAU,MAAM;AAAA,MACpB,MAAM;AAAA,MACN,aAAa,MAAM,OAAO,EAAE;AAAA,MAC5B,aAAa,KAAK;AAAA,MAClB,MAAM;AAAA,IACR;AACA,QAAI,YAAY,KAAM,QAAO,EAAE,MAAM,YAAY,QAAQ,wBAAwB;AACjF,QAAI,YAAY,GAAM,QAAO,EAAE,MAAM,YAAY,QAAQ,wBAAwB;AACjF,UAAM,UAAU,MAAM,UAAU,MAAM,QAAQ,aAAa,KAAK,SAAS,MAAM,OAAO;AACtF,QAAI,YAAY,KAAM,QAAO,EAAE,MAAM,YAAY,QAAQ,wBAAwB;AACjF,QAAI,YAAY,GAAM,QAAO,EAAE,MAAM,YAAY,QAAQ,wBAAwB;AAKjF,QAAI,YAAY,SAAS,OAAO,IAAI,SAAS;AAC3C,aAAO,EAAE,MAAM,YAAY,QAAQ,yBAAyB,OAAO,OAAO;AAAA,IAC5E;AACA,QAAI,MAAM,UAAU,UAAU,MAAM,QAAQ;AAC1C,aAAO,EAAE,MAAM,YAAY,QAAQ,YAAY,OAAO,iBAAiB,MAAM,MAAM,GAAG;AAAA,IACxF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,EAAE,SAAS,MAAM,SAAS,UAAU,QAAQ,UAAU,MAAM,UAAU,aAAa,QAAQ;AAAA,QAC3F,EAAE,SAAS,QAAgB,UAAU,QAAQ,UAAU,SAAgB,aAAa,QAAQ;AAAA,MAC9F;AAAA,MACA,aAAa;AAAA,MACb,aAAa,YAAY,SAAS,OAAO;AAAA,IAC3C;AAAA,EACF;AAGA,SAAO,EAAE,MAAM,YAAY,QAAQ,qBAAqB,MAAM,OAAO,WAAM,MAAM,QAAQ,GAAG;AAC9F;AAIA,eAAe,UACb,QACA,SACA,UACA,UACwB;AACxB,MAAI;AACF,WAAO,MAAM,OAAO,aAAa,SAAS,UAAU,QAAQ;AAAA,EAC9D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,YAAY,UAAkB,WAA2B;AAChE,MAAI,aAAa,GAAI,QAAO;AAC5B,MAAI,aAAa,SAAU,QAAO;AAClC,QAAM,cAAe,WAAW,aAAa,SAAW;AACxD,SAAO,OAAO,UAAU;AAC1B;;;ACpJA,SAAS,sBAAAC,qBAAoB,QAAAC,aAAY;AACzC,SAAS,QAAAC,OAAM,eAAAC,oBAAmB;AAQlC,IAAM,mBAAmB;AAAA,EACvB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,oBAAoB,MAAM,UAAU;AAAA,MAC5C,EAAE,MAAM,cAAoB,MAAM,UAAU;AAAA,MAC5C,EAAE,MAAM,WAAoB,MAAM,UAAU;AAAA,MAC5C,EAAE,MAAM,YAAoB,MAAM,UAAU;AAAA,MAC5C,EAAE,MAAM,YAAoB,MAAM,UAAU;AAAA,IAC9C;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,oBAAoB,MAAM,UAAU;AAAA,MAC5C,EAAE,MAAM,cAAoB,MAAM,UAAU;AAAA,MAC5C,EAAE,MAAM,WAAoB,MAAM,UAAU;AAAA,MAC5C,EAAE,MAAM,YAAoB,MAAM,UAAU;AAAA,MAC5C,EAAE,MAAM,YAAoB,MAAM,UAAU;AAAA,MAC5C,EAAE,MAAM,gBAAoB,MAAM,UAAU;AAAA,IAC9C;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AAAA,EAClD;AACF;AAgBO,IAAM,oBAAN,MAAwB;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAwB,MAAgC;AAClE,SAAK,WAAW;AAChB,UAAM,SAAS,KAAK,kBAAmB,OAAO,QAAQ,EAAE,OAAO;AAC/D,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR,0CAA0C,QAAQ;AAAA,QAClD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,SAAS;AACd,SAAK,kBAAkB,KAAK;AAC5B,UAAM,QAAQ,aAAa,iBAAiBC,QAAOC;AACnD,UAAM,SAAS,KAAK,UAAU,OAAO,QAAQ,EAAE;AAC/C,SAAK,eAAeC,oBAAmB,EAAE,OAAO,WAAWC,MAAK,MAAM,EAAE,CAAC;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,aAAa,SAAkB,UAAmB,UAAmC;AACzF,UAAM,EAAE,UAAU,WAAW,IAAI,KAAK,gBAAgB,SAAS,QAAQ;AACvE,UAAM,MAAM,MAAM,KAAK,aAAa,aAAa;AAAA,MAC/C,SAAS,KAAK;AAAA,MACd,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,UAAU,YAAY,SAAS,UAAU,QAAQ;AAAA,IAC1D,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OACJ,YACA,SACA,UACA,UACA,cAC+C;AAC/C,UAAM,EAAE,UAAU,WAAW,IAAI,KAAK,gBAAgB,SAAS,QAAQ;AACvE,WAAO,WAAW,cAAc;AAAA,MAC9B,SAAS,KAAK;AAAA,MACd,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,UAAU,YAAY,SAAS,UAAU,UAAU,YAAY;AAAA,IACxE,CAAC;AAAA,EACH;AAAA,EAEA,mBAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AACF;","names":["privateKeyToAccount","createPublicClient","createWalletClient","defineChain","http","privateKeyToAccount","defineChain","privateKeyToAccount","createPublicClient","http","createWalletClient","ows","createPublicClient","http","defineChain","err","privateKeyToAccount","err","err","parseCaip2","slippageBps","err","parseCaip2","state","err","parseCaip2","ows","slippageBps","err","err","err","createPublicClient","http","QUOTE_TTL_MS","createPublicClient","http","cached","QUOTE_TTL_MS","decision","createPublicClient","http","cached","err","createHmac","err","err","headerValue","VAULT_ABI","pf","err","err","createPublicClient","createWalletClient","http","privateKeyToAccount","privateKeyToAccount","createPublicClient","http","createWalletClient","err","err","err","parseCaip2","err","createPublicClient","http","_warned","err","err","recoverTypedDataAddress","createPublicClient","defineChain","http","erc20Abi","defineChain","createPublicClient","http","ZERO_ADDRESS","erc20Abi","err","DEFAULT_SLIPPAGE_BPS","createPublicClient","http","celo","celoSepolia","celo","celoSepolia","createPublicClient","http"]}