@morpho-dev/router 0.1.15 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +623 -371
- package/dist/cli.js.map +1 -1
- package/dist/index.browser.d.cts +160 -79
- package/dist/index.browser.d.ts +160 -79
- package/dist/index.browser.js +353 -214
- package/dist/index.browser.js.map +1 -1
- package/dist/index.browser.mjs +354 -216
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.node.d.cts +216 -440
- package/dist/index.node.d.ts +216 -440
- package/dist/index.node.js +5421 -5892
- package/dist/index.node.js.map +1 -1
- package/dist/index.node.mjs +5420 -5889
- package/dist/index.node.mjs.map +1 -1
- package/package.json +11 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/Api/Schema/index.ts","../src/api/Api/Schema/health.ts","../src/api/Api/Schema/ObligationResponse.ts","../src/core/Abi.ts","../src/core/Callback.ts","../src/core/Chain.ts","../src/utils/BigMath.ts","../src/utils/batch.ts","../src/utils/Errors.ts","../src/core/Collateral.ts","../src/utils/zod.ts","../src/core/LLTV.ts","../src/core/Cursor.ts","../src/core/Liquidity.ts","../src/core/Maturity.ts","../src/core/Obligation.ts","../src/utils/Format.ts","../src/core/Offer.ts","../src/utils/index.ts","../src/utils/retry.ts","../src/utils/batchMulticall.ts","../src/utils/lazy.ts","../src/utils/wait.ts","../src/utils/poll.ts","../src/utils/time.ts","../src/core/types.ts","../src/api/Api/Schema/OfferResponse.ts","../src/api/Api/Schema/requests.ts","../src/api/Api/Schema/openapi.ts","../src/api/Client.ts","../src/collectors/validations/Validation.ts","../src/collectors/validations/ValidationRule.ts","../src/mempool/MempoolClient.ts","../src/mempool/MempoolEVMClient.ts"],"names":["z","from","CallbackType","decodeAbiParameters","encodeAbiParameters","array","viemEthereum","viemBase","viemAnvil","getBlock","getLogs","isHex","z2","isAddress","z3","z4","Base64","obligationId","InvalidOptionError","z5","now","fromSnakeCase","getAddress","z6","maxUint256","keccak256","privateKeyToAccount","generatePrivateKey","decode","encode","random","toSnakeCase","wait","watch","poll","max","z7","zeroAddress","hashTypedData","z8","createDocument","batch","run","_","connect","DEFAULT_BATCH_SIZE","DEFAULT_BLOCK_WINDOW","parameters","publicActions"],"mappings":"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","file":"index.browser.js","sourcesContent":["export * from \"./health.ts\";\nexport * as ObligationResponse from \"./ObligationResponse.ts\";\nexport * as OfferResponse from \"./OfferResponse.ts\";\nexport * from \"./openapi.ts\";\nexport { parse, safeParse } from \"./requests.ts\";\n","import { z } from \"zod/v4\";\n\nexport const CollectorHealth = z.object({\n name: z.string(),\n chain_id: z.number(),\n block_number: z.number().nullable(),\n updated_at: z.string().nullable(),\n lag: z.number().nullable(),\n status: z.enum([\"live\", \"lagging\", \"unknown\"]),\n});\n\nexport const CollectorsHealthResponse = z.object({\n collectors: z.array(CollectorHealth),\n});\n\nexport const ChainHealth = z.object({\n chain_id: z.number(),\n block_number: z.number(),\n updated_at: z.string(),\n});\n\nexport const ChainsHealthResponse = z.object({\n chains: z.array(ChainHealth),\n});\n\nexport const RouterStatusResponse = z.object({\n status: z.enum([\"live\", \"syncing\"]),\n});\n\nexport type CollectorsHealthResponse = z.infer<typeof CollectorsHealthResponse>;\nexport type ChainsHealthResponse = z.infer<typeof ChainsHealthResponse>;\nexport type RouterStatusResponse = z.infer<typeof RouterStatusResponse>;\n","import type { Hex } from \"viem\";\nimport type { Compute } from \"#core\";\nimport { Obligation } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\n\nexport type ObligationResponse = Format.Snake<\n Compute<\n {\n /** The obligation id. */\n id: Hex;\n } & Obligation.Obligation\n >\n>;\n\n/**\n * Creates an `ObligationResponse` from a `Obligation`.\n * @constructor\n * @param obligation - {@link Obligation}\n * @returns The created `ObligationResponse`. {@link ObligationResponse}\n */\nexport function from(obligation: Obligation.Obligation): ObligationResponse {\n return Format.toSnakeCase({ id: Obligation.id(obligation), ...obligation });\n}\n","export const Oracle = [\n {\n type: \"function\",\n name: \"price\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const ERC4626 = [\n {\n type: \"function\",\n name: \"asset\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const MetaMorphoFactory = [\n {\n type: \"function\",\n name: \"isMetaMorpho\",\n inputs: [{ name: \"target\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const MetaMorpho = [\n {\n type: \"function\",\n name: \"withdrawQueue\",\n inputs: [{ name: \"index\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"withdrawQueueLength\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"maxWithdraw\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const Morpho = [\n {\n type: \"function\",\n name: \"collateralOf\",\n inputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"debtOf\",\n inputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"market\",\n inputs: [\n {\n name: \"id\",\n type: \"bytes32\",\n internalType: \"Id\",\n },\n ],\n outputs: [\n {\n name: \"totalSupplyAssets\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalSupplyShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalBorrowAssets\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalBorrowShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"lastUpdate\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"fee\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"position\",\n inputs: [\n {\n name: \"id\",\n type: \"bytes32\",\n internalType: \"Id\",\n },\n {\n name: \"user\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"supplyShares\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"borrowShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"collateral\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","import type { Address, Hex } from \"viem\";\nimport { decodeAbiParameters, encodeAbiParameters } from \"viem\";\n\nexport enum CallbackType {\n BuyWithEmptyCallback = \"buy_with_empty_callback\",\n BuyVaultV1Callback = \"buy_vault_v1_callback\",\n SellERC20Callback = \"sell_erc20_callback\",\n}\n\nexport const WhitelistedCallbackAddresses: Record<CallbackType, readonly string[]> = {\n [CallbackType.BuyWithEmptyCallback]: [],\n [CallbackType.BuyVaultV1Callback]: [\n \"0x3333333333333333333333333333333333333333\",\n \"0x4444444444444444444444444444444444444444\", // @TODO: update once deployed and add mapping per chain if needed\n ].map((address) => address.toLowerCase()),\n [CallbackType.SellERC20Callback]: [\n \"0x1111111111111111111111111111111111111111\",\n \"0x2222222222222222222222222222222222222222\", // @TODO: update once deployed and add mapping per chain if needed\n ].map((address) => address.toLowerCase()),\n} as const;\n\nexport function decodeBuyVaultV1Callback(data: Hex): Array<{\n vault: Address;\n amount: bigint;\n}> {\n if (!data || data === \"0x\") throw new Error(\"Empty callback data\");\n try {\n const [vaults, amounts] = decodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n data,\n ) as [Address[], bigint[]];\n if (vaults.length !== amounts.length) {\n throw new Error(\"Mismatched array lengths\");\n }\n return vaults.map((v, i) => ({ vault: v, amount: amounts[i]! }));\n } catch (_) {\n throw new Error(\"Invalid BuyVaultV1Callback callback data\");\n }\n}\n\nexport function decodeSellERC20Callback(data: Hex): Array<{\n collateral: Address;\n amount: bigint;\n}> {\n if (!data || data === \"0x\") throw new Error(\"Empty callback data\");\n try {\n const [collaterals, amounts] = decodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n data,\n ) as [Address[], bigint[]];\n if (collaterals.length !== amounts.length) {\n throw new Error(\"Mismatched array lengths\");\n }\n return collaterals.map((c, i) => ({ collateral: c, amount: amounts[i]! }));\n } catch (_) {\n throw new Error(\"Invalid SellERC20Callback callback data\");\n }\n}\n\nexport function encodeBuyVaultV1Callback(parameters: {\n vaults: Address[];\n amounts: bigint[];\n}): Hex {\n return encodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n [parameters.vaults, parameters.amounts],\n );\n}\n\nexport function encodeSellERC20Callback(parameters: {\n collaterals: Address[];\n amounts: bigint[];\n}): Hex {\n return encodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n [parameters.collaterals, parameters.amounts],\n );\n}\n","import type { AbiEvent, Address, GetLogsReturnType, PublicClient } from \"viem\";\nimport { getBlock, getLogs } from \"viem/actions\";\nimport {\n type Chain as ViemChain,\n anvil as viemAnvil,\n base as viemBase,\n mainnet as viemEthereum,\n} from \"viem/chains\";\nimport * as BigMath from \"#utils/BigMath.ts\";\nimport { batch } from \"#utils/batch.ts\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Compute } from \"./types.ts\";\n\nexport const chainNames = [\"ethereum\", \"base\", \"ethereum-virtual-testnet\", \"anvil\"] as const;\nexport type ChainName = (typeof chainNames)[number];\n\nexport const ChainId = {\n ETHEREUM: BigInt(viemEthereum.id),\n BASE: BigInt(viemBase.id),\n \"ETHEREUM-VIRTUAL-TESTNET\": 109111114n,\n ANVIL: 505050505n, // random id to not clash with other chains\n};\nexport type Id = (typeof ChainId)[keyof typeof ChainId];\nexport const chainIds = new Set(Object.values(ChainId));\n\nexport type Chain = Compute<\n Omit<ViemChain, \"id\" | \"name\"> & {\n id: Id;\n name: ChainName;\n whitelistedAssets: Set<Address>;\n morpho: Address;\n morphoBlue: Address;\n mempool: {\n address: Address;\n deploymentBlock: number;\n reindexBuffer: number;\n };\n vaultV1Factory: Record<string, Address>;\n }\n>;\n\nconst chainNameLookup = new Map(Object.entries(ChainId).map(([key, value]) => [value, key]));\n\nexport function getChain(chainId: Id): Chain | undefined {\n const chainName = chainNameLookup.get(chainId)?.toLowerCase() as ChainName;\n if (!chainName) {\n return undefined;\n }\n return chains[chainName];\n}\n\nexport const getWhitelistedChains = (): Chain[] => {\n return [chains.ethereum, chains.base, chains[\"ethereum-virtual-testnet\"], chains.anvil];\n};\n\nexport const chains: Record<ChainName, Chain> = {\n ethereum: {\n ...viemEthereum,\n id: ChainId.ETHEREUM,\n name: \"ethereum\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x0000000000000000000000000000000000000000\",\n deploymentBlock: 23347674,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\",\n \"v1.1\": \"0x1897A8997241C1cD4bD0698647e4EB7213535c24\",\n },\n },\n base: {\n ...viemBase,\n id: ChainId.BASE,\n name: \"base\",\n whitelistedAssets: new Set(\n [\n \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", // USDC\n \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x0000000000000000000000000000000000000000\",\n deploymentBlock: 35449942,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\",\n \"v1.1\": \"0xFf62A7c278C62eD665133147129245053Bbf5918\",\n },\n },\n \"ethereum-virtual-testnet\": {\n ...viemEthereum,\n id: ChainId[\"ETHEREUM-VIRTUAL-TESTNET\"],\n name: \"ethereum-virtual-testnet\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x11a002d45db720ed47a80d2f3489cba5b833eaf5\", // @TODO: This is mock Consumed contract, update with Terms once stable\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x5b06224f736a57635b5bcb50b8ef178b189107cb\",\n deploymentBlock: 23224302,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\",\n \"v1.1\": \"0x1897A8997241C1cD4bD0698647e4EB7213535c24\",\n },\n },\n anvil: {\n ...viemAnvil,\n id: ChainId.ANVIL,\n name: \"anvil\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x23DFBc4B8B80C14CC5e25011B8491f268395BAd6\",\n morphoBlue: \"0x0000000000000000000000000000000000000000\", // Set dynamically in tests\n mempool: {\n address: \"0xD946246695A9259F3B33a78629026F61B3Ab40aF\",\n deploymentBlock: 23223727,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0x0000000000000000000000000000000000000000\",\n \"v1.1\": \"0x0000000000000000000000000000000000000000\",\n },\n },\n};\n\n// thresholds are set to align with Alchemy's thresholds\n//https://www.alchemy.com/docs/deep-dive-into-eth_getlogs#making-a-request-to-eth_getlogs\nconst MAX_BATCH_SIZE = 10_000;\nconst DEFAULT_BATCH_SIZE = 2_500;\nconst MAX_BLOCK_WINDOW = 2_000;\nconst DEFAULT_BLOCK_WINDOW = 500;\n\nexport async function* streamLogs<abiEvent extends AbiEvent | undefined = undefined>(parameters: {\n client: PublicClient;\n contractAddress: Address;\n event?: abiEvent;\n blockNumberGte?: number;\n blockNumberLte?: number;\n order: \"asc\" | \"desc\";\n options: {\n maxBatchSize?: number;\n blockWindow?: number;\n };\n}): AsyncGenerator<\n { logs: GetLogsReturnType<abiEvent | undefined>; blockNumber: number },\n void,\n void\n> {\n const {\n client,\n contractAddress,\n event,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE, blockWindow = DEFAULT_BLOCK_WINDOW } = {},\n } = parameters;\n if (maxBatchSize > MAX_BATCH_SIZE) throw new InvalidBatchSizeError(maxBatchSize);\n if (blockWindow > MAX_BLOCK_WINDOW) throw new InvalidBlockWindowError(blockWindow);\n if (order === \"asc\" && blockNumberGte === undefined) throw new MissingBlockNumberError();\n\n const latestBlock = (await getBlock(client, { blockTag: \"latest\", includeTransactions: false }))\n .number;\n\n let toBlock = 0n;\n if (order === \"asc\")\n toBlock = BigMath.min(BigInt(blockNumberGte!) + BigInt(blockWindow), latestBlock);\n if (order === \"desc\")\n toBlock =\n blockNumberLte === undefined\n ? latestBlock\n : BigMath.min(BigInt(blockNumberLte!), latestBlock);\n\n let fromBlock = 0n;\n if (order === \"asc\") fromBlock = BigMath.min(BigInt(blockNumberGte!), latestBlock);\n if (order === \"desc\")\n fromBlock = BigMath.max(BigInt(blockNumberGte || toBlock - BigInt(blockWindow)), 0n);\n\n if (order === \"asc\") toBlock = BigMath.min(toBlock, fromBlock + BigInt(blockWindow));\n if (order === \"desc\") fromBlock = BigMath.max(fromBlock, toBlock - BigInt(blockWindow));\n if (fromBlock > toBlock) throw new InvalidBlockRangeError(fromBlock, toBlock);\n\n let streaming = true;\n while (streaming) {\n const logs = await getLogs(client, {\n address: contractAddress,\n event,\n fromBlock,\n toBlock,\n });\n\n logs.sort((a, b) => {\n if (a.blockNumber !== b.blockNumber)\n return order === \"asc\"\n ? Number(a.blockNumber - b.blockNumber)\n : Number(b.blockNumber - a.blockNumber);\n if (a.transactionIndex !== b.transactionIndex)\n return order === \"asc\"\n ? a.transactionIndex - b.transactionIndex\n : b.transactionIndex - a.transactionIndex;\n return order === \"asc\" ? a.logIndex - b.logIndex : b.logIndex - a.logIndex;\n });\n\n for (const logBatch of batch(logs, maxBatchSize)) {\n if (logBatch.length === 0) break;\n yield {\n logs: logBatch,\n blockNumber:\n logBatch.length === maxBatchSize\n ? // if the batch is full, return the last block number, block numbers are always sorted\n Number(logBatch[logBatch.length - 1]?.blockNumber)\n : // if the batch is not full, return `toBlock` or `fromBlock` to indicate until which block the logs were fetched\n order === \"asc\"\n ? Number(toBlock)\n : Number(fromBlock),\n };\n }\n\n streaming =\n order === \"asc\"\n ? toBlock < (blockNumberLte || latestBlock)\n : fromBlock > (blockNumberGte || 0n);\n\n if (order === \"asc\") {\n fromBlock = BigMath.min(BigInt(toBlock) + 1n, latestBlock);\n toBlock = BigMath.min(fromBlock + BigInt(blockWindow), latestBlock);\n }\n\n if (order === \"desc\") {\n const lowerBound = BigInt(blockNumberGte || 0);\n const windowSize = BigInt(blockWindow);\n const nextToBlock = BigMath.max(fromBlock - 1n, lowerBound);\n const nextFromBlock = BigMath.max(nextToBlock - windowSize, lowerBound);\n toBlock = nextToBlock;\n fromBlock = nextFromBlock;\n }\n }\n\n yield { logs: [], blockNumber: order === \"asc\" ? Number(toBlock) : Number(fromBlock) };\n return;\n}\n\nexport class InvalidBlockRangeError extends Errors.BaseError {\n override name = \"Chain.InvalidBlockRangeError\";\n constructor(fromBlock: bigint, toBlock: bigint) {\n super(\n `Invalid block range while streaming data from chain. From block ${fromBlock} to block ${toBlock}.`,\n );\n }\n}\n\nexport class InvalidBlockWindowError extends Errors.BaseError {\n override name = \"Chain.InvalidBlockWindowError\";\n constructor(blockWindow: number) {\n super(\n `Invalid block window while streaming data from chain. Maximum is ${MAX_BLOCK_WINDOW}. Got ${blockWindow}.`,\n );\n }\n}\n\nexport class InvalidBatchSizeError extends Errors.BaseError {\n override name = \"Chain.InvalidBatchSizeError\";\n constructor(maxBatchSize: number) {\n super(\n `Invalid batch size while streaming data from chain. Maximum is ${MAX_BATCH_SIZE}. Got ${maxBatchSize}.`,\n );\n }\n}\n\nexport class MissingBlockNumberError extends Errors.BaseError {\n override name = \"Chain.MissingBlockNumberError\";\n constructor() {\n super(\"Missing block number when streaming data from chain in ascending order.\");\n }\n}\n","export function max(a: bigint, b: bigint): bigint {\n return a > b ? a : b;\n}\n\nexport function min(a: bigint, b: bigint): bigint {\n return a < b ? a : b;\n}\n","/**\n * Splits an array into batches of a specified size.\n * @param array The array to split.\n * @param batchSize The size of each batch.\n * @returns An iterator that yields each batch.\n * @example\n * ```typescript\n * const array = [1, 2, 3, 4, 5];\n * for (const batch of batch(array, 2)) {\n * console.log(batch);\n * }\n * // Output:\n * // [1, 2]\n * // [3, 4]\n * // [5]\n * ```\n */\nexport function* batch<T>(array: Array<T>, batchSize: number) {\n for (let i = 0; i < array.length; i += batchSize) {\n yield array.slice(i, i + batchSize);\n }\n}\n","export type GlobalErrorType<name extends string = \"Error\"> = Error & {\n name: name;\n};\n\n/**\n * Base error class inherited by all errors thrown by mempool.\n *\n * @example\n * ```ts\n * import { Errors } from 'mempool'\n * throw new Errors.BaseError('An error occurred')\n * ```\n */\nexport class BaseError<cause extends Error | undefined = undefined> extends Error {\n details: string;\n shortMessage: string;\n\n override cause: cause;\n override name = \"BaseError\";\n\n constructor(\n shortMessage: string,\n options: {\n cause?: cause | undefined;\n details?: string | undefined;\n metaMessages?: (string | undefined)[] | undefined;\n } = {},\n ) {\n const details = (() => {\n if (options.cause instanceof BaseError) {\n if (options.cause.details) return options.cause.details;\n if (options.cause.shortMessage) return options.cause.shortMessage;\n }\n if (options.cause && \"details\" in options.cause && typeof options.cause.details === \"string\")\n return options.cause.details;\n if (options.cause?.message) return options.cause.message;\n return options.details!;\n })();\n\n const message = [\n shortMessage || \"An error occurred.\",\n ...(options.metaMessages ? [\"\", ...options.metaMessages] : []),\n ...(details ? [\"\", details ? `Details: ${details}` : undefined] : []),\n ]\n .filter((x) => typeof x === \"string\")\n .join(\"\\n\");\n\n super(message, options.cause ? { cause: options.cause } : undefined);\n\n this.cause = options.cause as cause;\n this.details = details;\n this.shortMessage = shortMessage;\n }\n\n walk(): Error;\n walk(fn: (err: unknown) => boolean): Error | null;\n walk(fn?: ((err: unknown) => boolean) | undefined): unknown {\n return walk(this, fn);\n }\n}\n\n/** @internal */\nfunction walk(err: unknown, fn?: ((err: unknown) => boolean) | undefined): unknown {\n if (fn?.(err)) return err;\n if (err && typeof err === \"object\" && \"cause\" in err && err.cause) return walk(err.cause, fn);\n return fn ? null : err;\n}\n","import type { Address } from \"viem\";\nimport * as z from \"zod\";\nimport { transformAddress } from \"#utils/zod.ts\";\nimport * as LLTV from \"./LLTV.ts\";\n\nexport type Collateral = {\n /** Asset being used as collateral. */\n asset: Address;\n /** Liquidation Loan-to-Value of the collateral. */\n lltv: LLTV.LLTV;\n /** Oracle contract used to price the collateral. */\n oracle: Address;\n};\n\nexport const CollateralSchema = z.object({\n asset: z.string().transform(transformAddress),\n oracle: z.string().transform(transformAddress),\n lltv: LLTV.LLTVSchema,\n});\n\nexport const CollateralsSchema = z\n .array(CollateralSchema)\n .min(1, { message: \"At least one collateral is required\" })\n .refine(\n (collaterals) => {\n for (let i = 1; i < collaterals.length; i++) {\n if (collaterals[i - 1]!.asset.toLowerCase() > collaterals[i]!.asset.toLowerCase()) {\n return false;\n }\n }\n return true;\n },\n {\n message: \"Collaterals must be sorted alphabetically by address\",\n },\n )\n .refine(\n (collaterals) => {\n const uniqueAssets = new Set<string>();\n for (const collateral of collaterals) {\n const assetAddress = collateral.asset.toLowerCase();\n if (uniqueAssets.has(assetAddress)) {\n return false;\n }\n uniqueAssets.add(assetAddress);\n }\n return true;\n },\n {\n message: \"Collaterals must not contain duplicate assets\",\n },\n );\n\nexport const from = (parameters: from.Parameters): from.ReturnType => {\n return {\n asset: parameters.asset.toLowerCase() as Address,\n lltv: LLTV.from(parameters.lltv),\n oracle: parameters.oracle.toLowerCase() as Address,\n };\n};\n\nexport declare namespace from {\n type Parameters = {\n asset: Address;\n lltv: LLTV.Options | bigint;\n oracle: Address;\n };\n type ReturnType = Collateral;\n}\n","import { type Address, isAddress, isHex } from \"viem\";\nimport * as z from \"zod\";\n\nexport const transformHex = (val: string, ctx: z.RefinementCtx) => {\n if (isHex(val)) return val;\n\n ctx.addIssue({\n code: \"invalid_format\",\n input: val,\n format: \"hex\",\n error: \"not a hex\",\n });\n\n return z.NEVER;\n};\n\nexport const transformAddress = (val: string, ctx: z.RefinementCtx) => {\n if (isAddress(val.toLowerCase())) return val.toLowerCase() as Address;\n\n ctx.addIssue({\n code: \"invalid_format\",\n input: val,\n format: \"address\",\n error: \"not a valid address\",\n });\n\n return z.NEVER;\n};\n","import * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Brand } from \"./types.ts\";\n\nexport type LLTV = bigint & Brand<\"LLTV\">;\n\nexport const Options = [0.385, 0.5, 0.625, 0.77, 0.86, 0.915, 0.945, 0.965, 0.98] as const;\nexport type Options = (typeof Options)[number];\nconst LLTV_SCALED = Options.map((lltv) => BigInt(lltv * 10 ** 18));\n\n/**\n * Convert a LLTV option or a scaled LLTV to a LLTV.\n * @param lltv - The LLTV option or the scaled LLTV.\n * @returns The LLTV.\n */\nexport function from(lltv: Options | bigint): LLTV {\n if (typeof lltv === \"bigint\" && !LLTV_SCALED.includes(lltv)) throw new InvalidLLTVError(lltv);\n if (typeof lltv === \"bigint\") return lltv as LLTV;\n if (typeof lltv === \"number\" && !Options.includes(lltv)) throw new InvalidOptionError(lltv);\n return BigInt(lltv * 10 ** 18) as LLTV;\n}\n\nexport declare namespace from {\n type ErrorType = InvalidOptionError | InvalidLLTVError;\n}\n\nexport class InvalidOptionError extends Errors.BaseError {\n override readonly name = \"LLTV.InvalidOptionError\";\n constructor(input: number) {\n super(\n `Invalid LLTV option. Input: \"${input}\". Accepted values are: ${Options.map(\n (option) => `\"${option}\"`,\n ).join(\", \")}.`,\n );\n }\n}\n\nexport class InvalidLLTVError extends Errors.BaseError {\n override readonly name = \"LLTV.InvalidLLTVError\";\n constructor(input: bigint) {\n super(\n `Invalid LLTV. Input: \"${input}\". Accepted values are: ${LLTV_SCALED.map(\n (option) => `\"${option}\"`,\n ).join(\", \")}.`,\n );\n }\n}\n\nexport const LLTVSchema = z\n .bigint({ coerce: true })\n .refine(\n (lltv) => {\n try {\n from(lltv);\n return true;\n } catch (_) {\n return false;\n }\n },\n {\n error: () => {\n return \"Invalid LLTV: must be one of 0.385, 0.625, 0.77, 0.86, 0.915, 0.945, 0.965 or 0.98 (scaled by 1e18)\";\n },\n },\n )\n .transform((lltv) => from(lltv));\n","import { Base64 } from \"js-base64\";\n// ---------- Cursor‑pagination helpers ----------\nexport type Cursor = {\n sort: \"rate\" | \"maturity\" | \"expiry\" | \"amount\";\n dir: \"asc\" | \"desc\";\n rate?: string; // bigint rendered to string\n maturity?: number;\n expiry?: number;\n assets?: string; // bigint rendered to string\n hash: string;\n // Optional page number to support client-side hard caps on depth\n page?: number;\n};\n\nexport function validate(cursor: unknown): cursor is Cursor {\n if (!cursor || typeof cursor !== \"object\") {\n throw new Error(\"Cursor must be an object\");\n }\n\n const c = cursor as any;\n\n // Validate sort field\n if (![\"rate\", \"maturity\", \"expiry\", \"amount\"].includes(c.sort)) {\n throw new Error(\n `Invalid sort field: ${c.sort}. Must be one of: rate, maturity, expiry, amount`,\n );\n }\n\n // Validate direction\n if (![\"asc\", \"desc\"].includes(c.dir)) {\n throw new Error(`Invalid direction: ${c.dir}. Must be one of: asc, desc`);\n }\n\n // Validate hash format (basic hex validation)\n if (!/^0x[a-fA-F0-9]{64}$/.test(c.hash)) {\n throw new Error(\n `Invalid hash format: ${c.hash}. Must be a 64-character hex string starting with 0x`,\n );\n }\n\n // Validate sort-specific fields\n const validations: Record<\n string,\n {\n field: string;\n type: \"string\" | \"number\";\n pattern?: RegExp;\n validator?: (val: any) => boolean;\n error: string;\n }\n > = {\n rate: {\n field: \"rate\",\n type: \"string\",\n pattern: /^\\d+$/,\n error: \"numeric string\",\n },\n amount: {\n field: \"assets\",\n type: \"string\",\n pattern: /^\\d+$/,\n error: \"numeric string\",\n },\n maturity: {\n field: \"maturity\",\n type: \"number\",\n validator: (val: number) => val > 0,\n error: \"positive number\",\n },\n expiry: {\n field: \"expiry\",\n type: \"number\",\n validator: (val: number) => val > 0,\n error: \"positive number\",\n },\n };\n\n const validation = validations[c.sort];\n if (!validation) {\n throw new Error(`Invalid sort field: ${c.sort}`);\n }\n\n const fieldValue = c[validation.field];\n\n if (!fieldValue) {\n throw new Error(`${c.sort} sort requires '${validation.field}' field to be present`);\n }\n\n if (typeof fieldValue !== validation.type) {\n throw new Error(\n `${c.sort} sort requires '${validation.field}' field of type ${validation.type}`,\n );\n }\n\n if (validation.pattern && !validation.pattern.test(fieldValue)) {\n throw new Error(\n `Invalid ${validation.field} format: ${fieldValue}. Must be a ${validation.error}`,\n );\n }\n\n if (validation.validator && !validation.validator(fieldValue)) {\n throw new Error(\n `Invalid ${validation.field} value: ${fieldValue}. Must be a ${validation.error}`,\n );\n }\n\n if (c.page !== undefined) {\n if (typeof c.page !== \"number\" || !Number.isInteger(c.page) || c.page < 1) {\n throw new Error(\"Invalid page: must be a positive integer\");\n }\n }\n\n return true;\n}\n\nexport function encode(c: Cursor): string {\n // Use browser-compatible Base64\n return Base64.encodeURL(JSON.stringify(c));\n}\n\nexport function decode(token?: string): Cursor | null {\n if (!token) return null;\n const decoded = JSON.parse(Base64.decode(token));\n validate(decoded);\n return decoded;\n}\n","import type { Address, Hex } from \"viem\";\nimport { CallbackType } from \"./Callback.ts\";\nimport type * as Offer from \"./Offer.ts\";\n\n/**\n * Represents a liquidity pool with a unique ID and amount.\n */\nexport type LiquidityPool = {\n id: string;\n amount: bigint;\n};\n\n/**\n * Represents a hierarchical relationship between two liquidity pools.\n */\nexport type LiquidityLink = {\n parentPoolId: string;\n childPoolId: string;\n priority: number;\n};\n\n/**\n * Represents the connection between an offer and its liquidity pools.\n */\nexport type OfferLiquidityPool = {\n offerHash: Offer.Offer[\"hash\"];\n poolId: string;\n /**\n * The available capacity/liquidity from this pool for this offer.\n * Meaning varies by pool type:\n * - BuyWithEmptyCallback: Matches allowance amount from pool bellow\n * - SellERC20Callback: Sell Callback/Predeposited -> Maximum debt capacity calculated from collateral (collateralAmount * oraclePrice * lltv)\n * - SellERC20Callback: Existing debt as negative value (reduces available capacity)\n */\n amount: bigint;\n};\n\n/**\n * Calculate maximum debt capacity from collateral amount.\n * @param amount - Collateral amount\n * @param oraclePrice - Oracle price (scaled to 36 decimals)\n * @param lltv - Loan-to-value ratio (scaled to 18 decimals)\n * @returns Maximum debt capacity\n */\nexport function calculateMaxDebt(amount: bigint, oraclePrice: bigint, lltv: bigint): bigint {\n const ORACLE_PRICE_SCALE = 10n ** 36n; // Oracle prices are scaled to 36 decimals\n const PRECISION = 10n ** 18n; // LLTV ratios are scaled to 18 decimals (1e18 = 100%)\n\n const collateralQuoted = (amount * oraclePrice) / ORACLE_PRICE_SCALE;\n const maxDebt = (collateralQuoted * lltv) / PRECISION;\n\n return maxDebt;\n}\n\n/**\n * Generate pool ID for balance pools.\n */\nexport function generateBalancePoolId(parameters: {\n user: Address;\n chainId: bigint;\n token: Address;\n}): string {\n const { user, chainId, token } = parameters;\n return `${user}-${chainId.toString()}-${token}-balance`.toLowerCase();\n}\n\n/**\n * Generate pool ID for allowance pools.\n */\nexport function generateAllowancePoolId(parameters: {\n user: Address;\n chainId: bigint;\n token: Address;\n}): string {\n const { user, chainId, token } = parameters;\n return `${user}-${chainId.toString()}-${token}-allowance`.toLowerCase();\n}\n\n/**\n * Generate pool ID for sell ERC20 callback pools.\n * Each offer has its own callback pool to prevent liquidity conflicts.\n */\nexport function generateSellERC20CallbackPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n token: Address;\n offerHash: Hex;\n}): string {\n const { user, chainId, obligationId, token, offerHash } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-${token}-${offerHash}-sell_erc20_callback`.toLowerCase();\n}\n\n/**\n * Generate pool ID for obligation collateral pools.\n * Obligation collateral pools represent collateral already deposited in the obligation.\n * These pools are shared across all offers with the same obligation.\n */\nexport function generateObligationCollateralPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n token: Address;\n}): string {\n const { user, chainId, obligationId, token } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-${token}-obligation-collateral`.toLowerCase();\n}\n\n/**\n * Generate pool ID for buy vault callback pools.\n */\nexport function generateBuyVaultCallbackPoolId(parameters: {\n user: Address;\n chainId: bigint;\n vault: Address;\n offerHash: Hex;\n}): string {\n const { user, chainId, vault, offerHash } = parameters;\n return `${user}-${chainId.toString()}-${vault}-${offerHash}-${CallbackType.BuyVaultV1Callback}`.toLowerCase();\n}\n\n/**\n * Generate pool ID for debt pools.\n */\nexport function generateDebtPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n}): string {\n const { user, chainId, obligationId } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-debt`.toLowerCase();\n}\n\n/**\n * Generate pool ID for user position in a vault.\n */\nexport function generateUserVaultPositionPoolId(parameters: {\n user: Address;\n chainId: bigint;\n vault: Address;\n}): string {\n const { user, chainId, vault } = parameters;\n return `${user}-${chainId.toString()}-${vault}-user-vault-position`.toLowerCase();\n}\n\n/**\n * Generate pool ID for vault position in a market.\n */\nexport function generateVaultPositionPoolId(parameters: {\n vault: Address;\n chainId: bigint;\n marketId: string;\n}): string {\n const { vault, chainId, marketId } = parameters;\n return `${vault}-${chainId.toString()}-${marketId}-vault-position`.toLowerCase();\n}\n\n/**\n * Generate pool ID for market total liquidity.\n */\nexport function generateMarketLiquidityPoolId(parameters: {\n chainId: bigint;\n marketId: string;\n}): string {\n const { chainId, marketId } = parameters;\n return `${chainId.toString()}-${marketId}-market-liquidity`.toLowerCase();\n}\n","import * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Brand } from \"./types.ts\";\n\n/**\n * Maturity is a number that represents a date in seconds.\n */\nexport type Maturity = number & Brand<\"Maturity\">;\n\nexport const MaturitySchema = z\n .number()\n .int()\n .refine(\n (maturity) => {\n try {\n from(maturity);\n return true;\n } catch (_e) {\n return false;\n }\n },\n {\n error: (issue) => {\n try {\n const maturityDate = new Date((issue.input as number) * 1000);\n return `The maturity is set to ${maturityDate}. It must fall on the allowed settlement cycles (Friday 15:00 UTC at the end of week/month/quarter).`;\n } catch (_) {\n return `The maturity is set to ${issue.input}. It must fall on the allowed settlement cycles (Friday 15:00 UTC at the end of week/month/quarter).`;\n }\n },\n },\n )\n .transform((maturity) => maturity as Maturity);\n\nconst MaturityOptions = {\n end_of_week: () => endOfWeek(),\n end_of_next_week: () => endOfNextWeek(),\n end_of_month: () => endOfMonth(),\n end_of_next_month: () => endOfNextMonth(),\n end_of_quarter: () => endOfQuarter(),\n end_of_next_quarter: () => endOfNextQuarter(),\n} as const;\n\nexport type MaturityOptions = keyof typeof MaturityOptions;\n\n/**\n * Creates a maturity from a timestamp in seconds or a maturity option.\n * @throws {InvalidFormatError} If the maturity is in milliseconds.\n * @throws {InvalidDateError} If the maturity is in seconds but not a valid date.\n * @throws {InvalidOptionError} If the maturity is not a valid option.\n */\nexport function from(ts: from.Parameters): Maturity {\n if (typeof ts === \"string\") {\n if (ts in MaturityOptions) return MaturityOptions[ts]();\n throw new InvalidOptionError(ts);\n }\n\n if (typeof ts === \"number\" && ts > 1e12) throw new InvalidFormatError();\n\n if (!Object.values(MaturityOptions).some((option) => option() === ts))\n throw new InvalidDateError(ts);\n\n return ts as Maturity;\n}\n\nexport declare namespace from {\n type Parameters = number | MaturityOptions;\n type ErrorType = InvalidFormatError | InvalidDateError | InvalidOptionError;\n}\n\n/** Returns the end of the current week (friday at 15:00:00 UTC) */\nconst endOfWeek = (): Maturity => fridayOfWeek(0);\n\n/** Returns the end of the next week (friday at 15:00:00 UTC) */\nconst endOfNextWeek = (): Maturity => fridayOfWeek(1);\n\n/** Returns the end of the current month (last friday of the month at 15:00:00 UTC) */\nconst endOfMonth = (): Maturity =>\n lastFridayOfMonth(new Date().getUTCFullYear(), new Date().getUTCMonth());\n\n/** Returns the end of the next month (last friday of the next month at 15:00:00 UTC) */\nconst endOfNextMonth = (): Maturity =>\n lastFridayOfMonth(new Date().getUTCFullYear(), new Date().getUTCMonth() + 1);\n\n/** Returns the end of the current quarter (last friday of the quarter at 15:00:00 UTC) */\nconst endOfQuarter = (): Maturity => lastFridayOfQuarter(0);\n\n/** Returns the end of the next quarter (last friday of the next quarter at 15:00:00 UTC) */\nconst endOfNextQuarter = (): Maturity => lastFridayOfQuarter(1);\n\nconst fridayOfWeek = (weeksAhead = 0): Maturity => {\n const now = new Date();\n const today15H = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 15),\n );\n\n // Days until next Friday (5). Always non-negative in [0,6]\n let daysUntilFriday = (5 - today15H.getUTCDay() + 7) % 7;\n\n // If it's Friday and we're already past 15:00 UTC, roll to next Friday\n if (daysUntilFriday === 0 && now.getTime() >= today15H.getTime()) {\n daysUntilFriday = 7;\n }\n\n const friday = new Date(today15H);\n friday.setUTCDate(friday.getUTCDate() + daysUntilFriday + weeksAhead * 7);\n return (friday.getTime() / 1000) as Maturity;\n};\n\nconst lastFridayOfMonth = (year: number, month: number): Maturity => {\n const lastDayOfMonth15H = new Date(Date.UTC(year, month + 1, 0, 15));\n\n while (lastDayOfMonth15H.getUTCDay() !== 5) {\n lastDayOfMonth15H.setUTCDate(lastDayOfMonth15H.getUTCDate() - 1);\n }\n\n const maturity = lastDayOfMonth15H.setUTCDate(lastDayOfMonth15H.getUTCDate()) / 1000;\n\n return maturity as Maturity;\n};\n\nconst lastFridayOfQuarter = (quartersAhead = 0): Maturity => {\n const now = new Date();\n const quarterIndex = Math.floor(now.getUTCMonth() / 3) + quartersAhead;\n const year = now.getUTCFullYear() + Math.floor(quarterIndex / 4);\n const quarter = quarterIndex % 4;\n const lastMonth = quarter * 3 + 2; // 0-based\n return lastFridayOfMonth(year, lastMonth);\n};\n\nexport class InvalidFormatError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidFormatError\";\n constructor() {\n super(\"Invalid maturity format. Maturity should be expressed in seconds.\");\n }\n}\n\nexport class InvalidDateError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidDateError\";\n constructor(input: number) {\n super(\n `Invalid maturity date. Input: \"${input}\". Accepted values are: ${Object.values(\n MaturityOptions,\n )\n .map((option) => `\"${option()}\"`)\n .join(\", \")}.`,\n );\n }\n}\n\nexport class InvalidOptionError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidOptionError\";\n constructor(input: string) {\n super(\n `Invalid maturity option. Input: \"${input}\". Accepted values are: ${Object.keys(\n MaturityOptions,\n )\n .map((option) => `\"${option}\"`)\n .join(\", \")}.`,\n );\n }\n}\n","import { type Address, encodeAbiParameters, type Hex, keccak256, maxUint256 } from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { transformAddress } from \"#utils/zod.ts\";\nimport type * as Chain from \"./Chain.ts\";\nimport * as Collateral from \"./Collateral.ts\";\nimport * as Maturity from \"./Maturity.ts\";\n\nexport type Obligation = {\n /** The chain id where the liquidity for this obligation is located. */\n chainId: Chain.Id;\n /** The token that is being borrowed for this obligation. */\n loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. */\n collaterals: Collateral.Collateral[];\n /** The maturity of the obligation. */\n maturity: Maturity.Maturity;\n};\n\nexport const ObligationSchema = z.object({\n chainId: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n loanToken: z.string().transform(transformAddress),\n collaterals: Collateral.CollateralsSchema,\n maturity: Maturity.MaturitySchema,\n});\n\n/**\n * Creates an obligation from the given parameters.\n * @constructor\n * @param parameters - {@link from.Parameters}\n * @returns The created obligation. {@link Obligation}\n * @throws If the collaterals are not sorted alphabetically by address. {@link CollateralsAreNotSortedError}\n *\n * @example\n * ```ts\n * const obligation = Obligation.from({\n * chainId: 1n,\n * loanToken: privateKeyToAccount(generatePrivateKey()).address,\n * collaterals: [\n * Collateral.from({\n * asset: privateKeyToAccount(generatePrivateKey()).address,\n * oracle: privateKeyToAccount(generatePrivateKey()).address,\n * lltv: 0.965\n * }),\n * ],\n * maturity: Maturity.from(\"end_of_next_quarter\"),\n * });\n * ```\n */\nexport function from(parameters: from.Parameters): from.ReturnType {\n try {\n const parsedObligation = ObligationSchema.parse({\n ...parameters,\n maturity: Maturity.from(parameters.maturity),\n });\n\n return {\n chainId: parsedObligation.chainId,\n loanToken: parsedObligation.loanToken.toLowerCase() as Address,\n collaterals: parsedObligation.collaterals.sort((a, b) => a.asset.localeCompare(b.asset)),\n maturity: parsedObligation.maturity,\n };\n } catch (error: unknown) {\n throw new InvalidObligationError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n type Parameters = {\n /** The chain id where the liquidity for this obligation is located. */\n chainId: Chain.Id;\n /** The token that is being borrowed for this obligation. */\n loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. Must be sorted alphabetically by address. */\n collaterals: Collateral.from.Parameters[] | readonly Collateral.from.Parameters[];\n /** The maturity of the obligation. */\n maturity: Maturity.from.Parameters;\n };\n\n type ReturnType = Obligation;\n\n export type ErrorType = InvalidObligationError;\n}\n\n/**\n * Creates an obligation from a snake case object.\n * @throws If the obligation is invalid. {@link fromSnakeCase.ErrorType}\n * @param input - {@link fromSnakeCase.Parameters}\n * @returns The created obligation. {@link fromSnakeCase.ReturnType}\n */\nexport function fromSnakeCase(input: fromSnakeCase.Parameters): fromSnakeCase.ReturnType {\n return from(Format.fromSnakeCase<Obligation>(input));\n}\n\nexport declare namespace fromSnakeCase {\n type Parameters = Format.Snake<Obligation>;\n type ReturnType = Obligation;\n type ErrorType = InvalidObligationError;\n}\n\n/**\n * Calculates the obligation id based on the smart contract's Obligation struct.\n * The id is computed as keccak256(abi.encode(chainId, loanToken, collaterals, maturity)).\n * @throws If the collaterals are not sorted alphabetically by address. {@link CollateralsAreNotSortedError}\n * @param obligation - {@link id.Parameters}\n * @returns The obligation id as a 32-byte hex string. {@link id.ReturnType}\n *\n * @example\n * ```ts\n * const obligation = Obligation.random();\n * const id = Obligation.id(obligation);\n * console.log(id); // 0x1234567890123456789012345678901234567890123456789012345678901234\n * ```\n */\nexport function id(obligation: id.Parameters): id.ReturnType {\n let lastAsset = \"\";\n for (const collateral of obligation.collaterals) {\n const newAsset = collateral.asset.toLowerCase();\n if (newAsset.localeCompare(lastAsset) < 0) throw new CollateralsAreNotSortedError();\n lastAsset = newAsset;\n }\n\n return keccak256(\n encodeAbiParameters(\n [\n { type: \"uint256\" },\n { type: \"address\" },\n {\n type: \"tuple[]\",\n components: [\n { type: \"address\", name: \"token\" },\n { type: \"uint256\", name: \"lltv\" },\n { type: \"address\", name: \"oracle\" },\n ],\n },\n { type: \"uint256\" },\n ],\n [\n obligation.chainId,\n obligation.loanToken.toLowerCase() as Address,\n obligation.collaterals.map((c) => ({\n token: c.asset.toLowerCase() as Address,\n lltv: c.lltv,\n oracle: c.oracle.toLowerCase() as Address,\n })),\n BigInt(obligation.maturity),\n ],\n ),\n );\n}\n\nexport declare namespace id {\n type Parameters = Obligation;\n type ReturnType = Hex;\n type ErrorType = CollateralsAreNotSortedError;\n}\n\n/**\n * Generates a random obligation.\n * @returns A randomly generated obligation. {@link random.ReturnType}\n *\n * @example\n * ```ts\n * const obligation = Obligation.random();\n * ```\n */\nexport function random(): random.ReturnType {\n return from({\n chainId: 1n,\n loanToken: privateKeyToAccount(generatePrivateKey()).address,\n collaterals: [\n Collateral.from({\n asset: privateKeyToAccount(generatePrivateKey()).address,\n oracle: privateKeyToAccount(generatePrivateKey()).address,\n lltv: 0.965,\n }),\n ],\n maturity: Maturity.from(\"end_of_next_quarter\"),\n });\n}\n\nexport declare namespace random {\n type ReturnType = Obligation;\n}\n\nexport class InvalidObligationError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Obligation.InvalidObligationError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid obligation.\", { cause: error });\n }\n}\n\nexport class CollateralsAreNotSortedError extends Errors.BaseError {\n override readonly name = \"Obligation.CollateralsAreNotSortedError\";\n constructor() {\n super(\"Collaterals are not sorted alphabetically by address.\");\n }\n}\n","import { getAddress, isAddress } from \"viem\";\n\n/** The snake case representation of a type with bigint values stringified. */\nexport type Snake<T> = SnakeKeys<StringifiedBigint<T>>;\n\n/** Stringifies bigint values to strings and preserves branded primitives. */\ntype StringifiedBigint<T> =\n // non-distributive check so that `bigint & Brand<...>` is still caught here\n [T] extends [bigint]\n ? string\n : // Preserve branded primitives by matching the primitive first.\n T extends number\n ? T\n : T extends string\n ? T\n : T extends boolean\n ? T\n : T extends symbol\n ? T\n : T extends null | undefined\n ? T\n : T extends readonly (infer U)[]\n ? readonly StringifiedBigint<U>[]\n : T extends object\n ? { [K in keyof T]: StringifiedBigint<T[K]> }\n : T;\n\n/** Key remapping that also preserves branded primitives. */\ntype SnakeKeys<T> = T extends readonly (infer U)[]\n ? readonly SnakeKeys<U>[]\n : T extends number | string | boolean | symbol | null | undefined\n ? T\n : T extends object\n ? { [K in keyof T as ToSnakeCase<Extract<K, string>>]: SnakeKeys<T[K]> }\n : T;\n\ntype ToSnakeCase<S extends string> = S extends `${infer Head}${infer Tail}`\n ? Tail extends Uncapitalize<Tail>\n ? `${Lowercase<Head>}${ToSnakeCase<Tail>}`\n : `${Lowercase<Head>}_${ToSnakeCase<Uncapitalize<Tail>>}`\n : S;\n\n/**\n * Formats object keys to snake case.\n * Preserves ethereum addresses as is.\n * Converts ethereum addresses to checksummed if used as values.\n * Stringifies bigint values to strings.\n */\nexport function toSnakeCase<T>(obj: T): Snake<T> {\n return stringifyBigint(\n processObject(\n obj,\n (s: string) => s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`),\n (value: unknown) =>\n typeof value === \"string\" && isAddress(value.toLowerCase())\n ? getAddress(value.toLowerCase())\n : value,\n ),\n ) as Snake<T>;\n}\n\n/**\n * Formats a snake case object to its camel case type.\n * Preserves ethereum addresses as is.\n * Converts checksummed ethereum addresses to lowercase if used as values.\n * @warning Does not unstringify bigint values.\n */\nexport function fromSnakeCase<T>(obj: Snake<T>): T {\n return processObject(\n obj,\n (s: string) =>\n isAddress(s.toLowerCase()) ? s : s.replace(/_([a-z])/g, (_, c) => c.toUpperCase()),\n (value: unknown) =>\n typeof value === \"string\" && isAddress(value.toLowerCase()) ? value.toLowerCase() : value,\n ) as T;\n}\n\nfunction processObject<T>(\n obj: T,\n fnKey: (str: string) => string,\n fnValue: (value: unknown) => unknown,\n): unknown {\n if (typeof obj !== \"object\" || obj === null) return obj;\n\n if (Array.isArray(obj)) return obj.map((item) => processObject(item, fnKey, fnValue));\n\n return Object.entries(obj as Record<string, unknown>).reduce(\n (acc, [key, value]) => {\n const newKey = fnKey(key);\n acc[newKey] =\n typeof value === \"object\" && value !== null\n ? processObject(value, fnKey, fnValue)\n : fnValue(value);\n\n return acc;\n },\n {} as Record<string, unknown>,\n );\n}\n\nfunction stringifyBigint<T>(value: T): StringifiedBigint<T> {\n if (typeof value === \"bigint\") return value.toString() as StringifiedBigint<T>;\n if (Array.isArray(value)) return value.map(stringifyBigint) as StringifiedBigint<T>;\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[k] = stringifyBigint(v);\n }\n return out as StringifiedBigint<T>;\n }\n\n return value as StringifiedBigint<T>;\n}\n","import {\n type Address,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n encodeAbiParameters,\n type Hex,\n hashTypedData,\n maxUint256,\n type WalletClient,\n zeroAddress,\n} from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { Time } from \"#utils/index.ts\";\nimport { transformAddress, transformHex } from \"#utils/zod.ts\";\nimport * as Collateral from \"./Collateral.ts\";\nimport * as LLTV from \"./LLTV.ts\";\nimport * as Maturity from \"./Maturity.ts\";\nimport * as Obligation from \"./Obligation.ts\";\n\nexport type Offer = {\n /** The address that made the offer. */\n readonly offering: Address;\n /** The amount of assets offered. */\n readonly assets: bigint;\n /** The interest rate (with 18 decimals). */\n readonly rate: bigint;\n /** The date at which all interests will be paid. */\n readonly maturity: Maturity.Maturity;\n /** The date at which the offer will expire. */\n readonly expiry: number;\n /** The date at which the offer will start. */\n readonly start: number;\n /** The nonce. Used for OCO (One-Cancelled-Other) mechanism. */\n readonly nonce: bigint;\n /** The side of the offer. `true` for buy, `false` for sell. */\n readonly buy: boolean;\n /** The chain id where the liquidity for this offer is located. */\n readonly chainId: bigint;\n /** The token that is being borrowed. */\n readonly loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. */\n readonly collaterals: readonly Collateral.Collateral[];\n /** The optional callback data to retrieve the maker funds. */\n readonly callback: {\n readonly address: Address;\n readonly data: Hex;\n readonly gasLimit: bigint;\n };\n /** The amount of assets consumed from the offer. */\n consumed: bigint;\n /** The hash of the offer. */\n readonly hash: Hex;\n /** The block number at which the offer was created. */\n readonly blockNumber: number;\n /** The signature of the offer. */\n signature?: Hex;\n};\n\nexport const OfferHashSchema = z\n .string()\n .regex(/^0x[0-9a-fA-F]{64}$/, {\n message: \"Hash must be a valid 32-byte hex string\",\n })\n .transform(transformHex);\n\nexport const OfferSchema = (parameters?: { omitHash?: boolean }) => {\n const { omitHash = false } = parameters || {};\n const now = Time.now();\n\n let base = z.object({\n offering: z.string().transform(transformAddress),\n assets: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n maturity: Maturity.MaturitySchema,\n expiry: z\n .number()\n .int()\n .min(now, { message: \"Expiry must be set to a future date\" })\n .max(Number.MAX_SAFE_INTEGER),\n start: z.number().int().max(Number.MAX_SAFE_INTEGER),\n nonce: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n buy: z.boolean(),\n chainId: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n loanToken: z.string().transform(transformAddress),\n collaterals: Collateral.CollateralsSchema,\n callback: z.object({\n address: z.string().transform(transformAddress),\n data: z.string().transform(transformHex),\n gasLimit: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n consumed: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n blockNumber: z.number().int().max(Number.MAX_SAFE_INTEGER),\n signature: z\n .string()\n .regex(/^0x[0-9a-fA-F]{130}$/, {\n message: \"Signature must be a valid 65-byte hex string\",\n })\n .transform(transformHex)\n .optional(),\n });\n\n if (!omitHash) base = base.extend({ hash: OfferHashSchema });\n\n return base\n .refine((data) => data.start < data.expiry, {\n message: \"Start must be before expiry\",\n path: [\"start\"],\n })\n .refine((data) => data.expiry <= data.maturity, {\n message: \"Expiry cannot be after maturity\",\n path: [\"expiry\"],\n });\n};\n\n/**\n * Creates an offer from a plain object.\n * @throws {InvalidOfferError} If the offer is invalid.\n * @param input - The offer to create.\n * @returns The created offer with its hash.\n */\nexport function from(input: Omit<Offer, \"hash\">): Offer {\n try {\n const parsedOffer = OfferSchema({ omitHash: true }).parse(input);\n const parsedHash = OfferHashSchema.parse(hash(parsedOffer));\n\n return {\n ...parsedOffer,\n hash: parsedHash,\n };\n } catch (error: unknown) {\n throw new InvalidOfferError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n export type ErrorType = InvalidOfferError;\n}\n\n/**\n * Creates an offer from a snake case object.\n * @throws {InvalidOfferError} If the offer is invalid.\n * @param input - The offer to create.\n * @returns The created offer with its hash.\n */\nexport function fromSnakeCase(input: Format.Snake<Omit<Offer, \"hash\">>): Offer {\n return from(Format.fromSnakeCase<Omit<Offer, \"hash\">>(input));\n}\n\n/**\n * Converts an offer to a snake case object.\n * @param offer - The offer to convert.\n * @returns The converted offer.\n */\nexport function toSnakeCase(offer: Offer): Format.Snake<Offer> {\n return Format.toSnakeCase(offer);\n}\n\n/**\n * Generates a random Offer.\n * The returned Offer contains randomly generated values for most fields, such as assets, rate, nonce, and buy flag.\n * Some fields use fixed or deterministic values (e.g., chainId, collaterals, callback).\n * @warning The generated Offer should not be used for production usage.\n * @returns {Offer} A randomly generated Offer object.\n */\nexport function random(): Offer {\n const loanToken = privateKeyToAccount(generatePrivateKey()).address;\n\n const maturity = Maturity.from(\"end_of_month\");\n const expiry = Maturity.from(\"end_of_week\") - 1;\n const lltv = LLTV.from(0.965);\n const offer = from({\n offering: privateKeyToAccount(generatePrivateKey()).address,\n assets: BigInt(Math.floor(Math.random() * 1000000)),\n rate: BigInt(Math.floor(Math.random() * 1000000)),\n maturity,\n expiry: expiry,\n start: expiry - 10,\n nonce: BigInt(Math.floor(Math.random() * 1000000)),\n buy: Math.random() > 0.5,\n chainId: 1n,\n loanToken,\n collaterals: [\n Collateral.from({\n asset: zeroAddress,\n oracle: zeroAddress,\n lltv,\n }),\n ],\n callback: {\n address: zeroAddress,\n data: \"0x\",\n gasLimit: 0n,\n },\n consumed: 0n,\n blockNumber: Math.floor(Math.random() * Number.MAX_SAFE_INTEGER),\n });\n\n return offer;\n}\n\n/**\n * Creates an EIP-712 domain object.\n * @param chainId - The chain ID.\n * @returns The EIP-712 domain object.\n */\nexport const domain = (chainId: bigint) => ({\n chainId,\n verifyingContract: zeroAddress,\n});\n\n/**\n * The EIP-712 types for the offer.\n * @warning The ordering of the types should NEVER be changed. The offer hash is computed based on the order of the types.\n * @returns The EIP-712 types.\n */\nexport const types = {\n EIP712Domain: [\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Offer: [\n { name: \"offering\", type: \"address\" },\n { name: \"assets\", type: \"uint256\" },\n { name: \"rate\", type: \"uint256\" },\n { name: \"maturity\", type: \"uint256\" },\n { name: \"expiry\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"buy\", type: \"bool\" },\n { name: \"loanToken\", type: \"address\" },\n { name: \"collaterals\", type: \"Collateral[]\" },\n { name: \"callback\", type: \"Callback\" },\n ],\n Collateral: [\n { name: \"asset\", type: \"address\" },\n { name: \"oracle\", type: \"address\" },\n { name: \"lltv\", type: \"uint256\" },\n ],\n Callback: [\n { name: \"address\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"gasLimit\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * Signs an offer.\n * @throws {Error} If the wallet account is not set.\n * @param offer - The offer to sign.\n * @param wallet - The wallet to sign the offer with.\n * @returns The signed offer.\n */\nexport function sign(offer: Offer, wallet: WalletClient): Promise<Hex> {\n if (!wallet.account) throw new AccountNotSetError();\n return wallet.signTypedData({\n account: wallet.account,\n domain: domain(offer.chainId),\n types,\n primaryType: \"Offer\",\n message: {\n offering: offer.offering.toLowerCase() as Address,\n assets: offer.assets,\n rate: offer.rate,\n maturity: BigInt(offer.maturity),\n expiry: BigInt(offer.expiry),\n nonce: offer.nonce,\n buy: offer.buy,\n loanToken: offer.loanToken.toLowerCase() as Address,\n collaterals: offer.collaterals,\n callback: {\n address: offer.callback.address.toLowerCase() as Address,\n data: offer.callback.data,\n gasLimit: offer.callback.gasLimit,\n },\n },\n });\n}\n\nexport function hash(offer: Omit<Offer, \"hash\">): Hex {\n return hashTypedData({\n domain: domain(offer.chainId),\n message: {\n offering: offer.offering.toLowerCase() as Address,\n assets: offer.assets,\n rate: offer.rate,\n maturity: BigInt(offer.maturity),\n expiry: BigInt(offer.expiry),\n nonce: offer.nonce,\n buy: offer.buy,\n loanToken: offer.loanToken.toLowerCase() as Address,\n collaterals: offer.collaterals,\n callback: {\n address: offer.callback.address.toLowerCase() as Address,\n data: offer.callback.data,\n gasLimit: offer.callback.gasLimit,\n },\n },\n primaryType: \"Offer\",\n types,\n });\n}\n\n/**\n * Calculates the obligation id for an offer based on the smart contract's Obligation struct.\n * The id is computed as keccak256(abi.encode(chainId, loanToken, collaterals (sorted by token address), maturity)).\n * @param offer - The offer to calculate the obligation id for.\n * @returns The obligation id as a 32-byte hex string.\n */\nexport function obligationId(offer: Offer): Hex {\n return Obligation.id(\n Obligation.from({\n chainId: offer.chainId,\n loanToken: offer.loanToken,\n collaterals: offer.collaterals as Collateral.Collateral[],\n maturity: offer.maturity,\n }),\n );\n}\n\nconst OfferAbi = [\n { name: \"offering\", type: \"address\" },\n { name: \"assets\", type: \"uint256\" },\n { name: \"rate\", type: \"uint256\" },\n { name: \"maturity\", type: \"uint256\" },\n { name: \"expiry\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"buy\", type: \"bool\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"loanToken\", type: \"address\" },\n { name: \"start\", type: \"uint256\" },\n {\n name: \"collaterals\",\n type: \"tuple[]\",\n components: [\n { name: \"asset\", type: \"address\" },\n { name: \"oracle\", type: \"address\" },\n { name: \"lltv\", type: \"uint256\" },\n ],\n },\n {\n name: \"callback\",\n type: \"tuple\",\n components: [\n { name: \"address\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"gasLimit\", type: \"uint256\" },\n ],\n },\n { name: \"signature\", type: \"bytes\" },\n] as const;\n\nexport function encode(offer: Offer) {\n return encodeAbiParameters(OfferAbi, [\n offer.offering,\n offer.assets,\n offer.rate,\n BigInt(offer.maturity),\n BigInt(offer.expiry),\n offer.nonce,\n offer.buy,\n offer.chainId,\n offer.loanToken,\n BigInt(offer.start),\n offer.collaterals,\n offer.callback,\n offer.signature ?? \"0x\",\n ]);\n}\n\nexport function decode(data: Hex, blockNumber: number | bigint): Offer {\n let decoded: DecodeAbiParametersReturnType<typeof OfferAbi>;\n try {\n decoded = decodeAbiParameters(OfferAbi, data);\n } catch (error) {\n throw new InvalidOfferError(error as Error);\n }\n\n const offer = from({\n offering: decoded[0],\n assets: decoded[1],\n rate: decoded[2],\n maturity: Maturity.from(Number(decoded[3])),\n expiry: Number(decoded[4]),\n nonce: decoded[5],\n buy: decoded[6],\n chainId: decoded[7],\n loanToken: decoded[8],\n start: Number(decoded[9]),\n collaterals: decoded[10].map((c) => {\n return Collateral.from({\n asset: c.asset,\n oracle: c.oracle,\n lltv: c.lltv,\n });\n }),\n callback: {\n address: decoded[11].address,\n data: decoded[11].data,\n gasLimit: decoded[11].gasLimit,\n },\n consumed: 0n,\n blockNumber: Number(blockNumber),\n ...(decoded[12] === \"0x\" ? {} : { signature: decoded[12] }),\n });\n\n return offer;\n}\n\nexport type OfferConsumed = {\n id: string;\n chainId: bigint;\n offering: Address;\n nonce: bigint;\n amount: bigint;\n blockNumber: number;\n};\n\n/**\n * ABI for the Consumed event emitted by the Obligation contract.\n */\nexport const consumedEvent = {\n type: \"event\",\n name: \"Consumed\",\n inputs: [\n { name: \"user\", type: \"address\", indexed: true, internalType: \"address\" },\n { name: \"nonce\", type: \"uint256\", indexed: true, internalType: \"uint256\" },\n { name: \"amount\", type: \"uint256\", indexed: false, internalType: \"uint256\" },\n ],\n anonymous: false,\n} as const;\n\nexport function fromConsumedLog(parameters: {\n blockNumber: bigint;\n logIndex: number;\n chainId: number;\n transactionHash: Hex;\n user: Address;\n nonce: bigint;\n amount: bigint;\n}): OfferConsumed {\n const { blockNumber, logIndex, chainId, transactionHash, user, nonce, amount } = parameters;\n return {\n id: `${blockNumber.toString()}-${logIndex.toString()}-${chainId}-${transactionHash}`,\n chainId: BigInt(chainId),\n offering: user,\n nonce,\n amount,\n blockNumber: Number(blockNumber),\n };\n}\n\nexport class InvalidOfferError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Offer.InvalidOfferError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid offer.\", { cause: error });\n }\n}\n\nexport class AccountNotSetError extends Errors.BaseError {\n override readonly name = \"Offer.AccountNotSetError\";\n constructor() {\n super(\"Account not set.\");\n }\n}\n","export * from \"./BigMath.ts\";\nexport * from \"./batch.ts\";\nexport * from \"./batchMulticall.ts\";\nexport * from \"./Errors.ts\";\nexport * from \"./Format.ts\";\nexport * from \"./lazy.ts\";\nexport * from \"./poll.ts\";\nexport * from \"./retry.ts\";\nexport * as Time from \"./time.ts\";\nexport * from \"./wait.ts\";\n","export const retry = async <T>(fn: () => Promise<T>, attempts = 3, delayMs = 50): Promise<T> => {\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (i < attempts - 1) await new Promise((r) => setTimeout(r, delayMs));\n }\n }\n throw lastErr;\n};\n","import type { PublicActions } from \"viem\";\nimport { batch } from \"#utils/batch.ts\";\nimport { retry } from \"#utils/retry.ts\";\n\n/**\n * Helper function to execute multicall in batches with retry logic.\n * Abstracts the common pattern of batching calls, retrying, and collecting results.\n *\n * @param parameters - Configuration for batched multicall\n * @returns Promise resolving to flattened array of results\n */\nexport async function batchMulticall<TResult>(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n calls: unknown[];\n batchSize: number;\n retryAttempts: number;\n retryDelayMs: number;\n blockNumber?: bigint;\n}): Promise<TResult[]> {\n const { client, calls, batchSize, retryAttempts, retryDelayMs, blockNumber } = parameters;\n const results: TResult[] = [];\n\n for (const callsBatch of batch(calls, batchSize)) {\n const batchResults = await retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: callsBatch as any,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n );\n results.push(...(batchResults as TResult[]));\n }\n\n return results;\n}\n","/**\n * Transform a polling function into an async generator.\n * @param fn - The polling function to transform.\n * @returns An async generator.\n */\nexport function lazy<T>(\n pollFn: (emit: (value: T) => void, { stop }: { stop: () => void }) => () => boolean,\n) {\n return () =>\n (async function* () {\n let active = true;\n let resolveNext: (() => void) | null = null;\n const queue: T[] = [];\n\n const wait = () =>\n new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n\n const emit = (item: T) => {\n queue.push(item);\n resolveNext?.();\n resolveNext = null;\n };\n\n let unpoll: (() => boolean) | null = null;\n const stop = () => {\n active = false;\n // stop the poller immediately if we already have it\n unpoll?.();\n resolveNext?.();\n resolveNext = null;\n };\n\n unpoll = pollFn(emit, { stop });\n\n try {\n while (active) {\n if (queue.length === 0) await wait();\n while (queue.length > 0 && active) yield queue.shift()!;\n }\n } finally {\n stop();\n }\n })();\n}\n","export async function wait(time: number) {\n return new Promise((res) => setTimeout(res, time));\n}\n","import { wait } from \"./wait.ts\";\n/**\n * Polls a function at a specified interval.\n * Inspired by https://github.com/wevm/viem/blob/845994d20275d08ff892018e237a4b599eeefb6a/src/utils/poll.ts\n */\nexport function poll<data>(\n fn: ({ unpoll }: { unpoll: () => void }) => Promise<data | undefined>,\n { interval }: { interval: number },\n) {\n let active = true;\n const unwatch = () => (active = false);\n\n const watch = async () => {\n await wait(interval);\n\n const poll = async () => {\n if (!active) return;\n await fn({ unpoll: unwatch });\n await wait(interval);\n poll();\n };\n\n poll();\n };\n\n watch();\n\n return unwatch;\n}\n","export function now(): number {\n return Math.floor(Date.now() / 1000);\n}\n\nexport function max(): number {\n return 8640000000000000000;\n}\n","/** Combines members of an intersection into a readable type. */\n// https://twitter.com/mattpocockuk/status/1622730173446557697?s=20&t=NdpAcmEFXY01xkqU3KO0Mg\nexport type Compute<type> = { [key in keyof type]: type[key] } & unknown;\n\n// https://effect.website/docs/code-style/branded-types/#generalizing-branded-types\nexport const BrandTypeId = Symbol.for(\"mempool/Brand\");\nexport type Brand<in out ID extends string | symbol> = {\n readonly [BrandTypeId]: {\n readonly [id in ID]: ID;\n };\n};\n","import type { Offer } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\n\nexport type OfferResponse = Format.Snake<Offer.Offer>;\n\n/**\n * Creates an `OfferResponse` from an `Offer`.\n * @constructor\n * @param offer - {@link Offer}\n * @returns The created `OfferResponse`. {@link OfferResponse}\n */\nexport function from(offer: Offer.Offer): OfferResponse {\n return Format.toSnakeCase(offer);\n}\n","import type { Hex } from \"viem\";\nimport * as z from \"zod\";\nimport { Cursor } from \"#core\";\n\nconst MAX_LIMIT = 100;\nconst DEFAULT_LIMIT = 20;\nconst PaginationQueryParams = z.object({\n cursor: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (!val) return true; // Optional field\n try {\n const decoded = Cursor.decode(val);\n return decoded !== null;\n } catch (_error) {\n return false; // Invalid cursor\n }\n },\n {\n message: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n },\n )\n .meta({\n description: \"Pagination cursor in base64url-encoded format\",\n example:\n \"eyJzb3J0IjoicHJpY2UiLCJkaXIiOiJkZXNjIiwicHJpY2UiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIiwiaGFzaCI6IjB4ZGRmZDY4NTllM2UwODJkMTkzODlhMWFlYzFiZGFkN2U4ZDkyZDk2YjFhYTc5NDBkYTkxYTMxMjVkMzFlM2JlNWIifQ\",\n }),\n limit: z\n .string()\n .regex(/^[1-9]\\d*$/, {\n message: \"Limit must be a positive integer\",\n })\n .transform((val) => Number.parseInt(val, 10))\n .pipe(\n z.number().max(MAX_LIMIT, {\n message: `Limit cannot exceed ${MAX_LIMIT}`,\n }),\n )\n .optional()\n .default(DEFAULT_LIMIT)\n .meta({\n description: `Limit maximum: ${MAX_LIMIT}. Default: ${DEFAULT_LIMIT}`,\n example: 10,\n }),\n});\n\nexport const GetOffersQueryParams = z.object({\n ...PaginationQueryParams.shape,\n side: z.enum([\"buy\", \"sell\"]).meta({\n description: \"Side of the offer.\",\n example: \"buy\",\n }),\n obligation_id: z\n .string({ error: \"Obligation id is required and must be a valid 32-byte hex string\" })\n .regex(/^0x[a-fA-F0-9]{64}$/, { error: \"Obligation id must be a valid 32-byte hex string\" })\n .transform<Hex>((val) => val.toLowerCase() as Hex)\n .meta({\n description: \"Offers obligation id\",\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n }),\n});\n\nexport const GetObligationsQueryParams = z.object({\n ...PaginationQueryParams.shape,\n cursor: z.string().optional().meta({\n description: \"Obligation id cursor\",\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n }),\n});\n\nconst schemas = {\n get_offers: GetOffersQueryParams,\n get_obligations: GetObligationsQueryParams,\n} as const;\n\ntype Action = keyof typeof schemas;\n\nexport function parse<A extends Action>(action: A, query: unknown): z.infer<(typeof schemas)[A]> {\n return schemas[action].parse(query) as z.infer<(typeof schemas)[A]>;\n}\n\nexport function safeParse<A extends Action>(\n action: A,\n query: unknown,\n error?: z.core.$ZodErrorMap<z.core.$ZodIssue>,\n): z.ZodSafeParseResult<z.infer<(typeof schemas)[A]>> {\n return schemas[action].safeParse(query, {\n error,\n }) as z.ZodSafeParseResult<z.infer<(typeof schemas)[A]>>;\n}\n","import { z } from \"zod/v4\";\nimport { createDocument, type ZodOpenApiPathsObject } from \"zod-openapi\";\nimport { ChainsHealthResponse, CollectorsHealthResponse, RouterStatusResponse } from \"./health.ts\";\nimport { GetObligationsQueryParams, GetOffersQueryParams } from \"./requests.ts\";\n\nconst successResponseSchema = z.object({\n status: z.literal(\"success\"),\n cursor: z.string().nullable(),\n data: z.array(z.any()),\n meta: z.object({\n timestamp: z.string(),\n }),\n});\n\nconst errorResponseSchema = z.object({\n status: z.literal(\"error\"),\n error: z.object({\n code: z.string(),\n message: z.string(),\n details: z.any().optional(),\n }),\n meta: z.object({\n timestamp: z.string(),\n }),\n});\n\nconst paths: ZodOpenApiPathsObject = {\n \"/v1/offers\": {\n get: {\n summary: \"Offers\",\n description: \"Find offers that match specific criteria\",\n tags: [\"Offers\"],\n requestParams: {\n query: GetOffersQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: successResponseSchema,\n },\n },\n },\n 400: {\n description: \"Bad Request\",\n content: {\n \"application/json\": {\n schema: errorResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/obligations\": {\n get: {\n summary: \"Obligations\",\n description: \"List obligations with pagination support\",\n tags: [\"Obligations\"],\n requestParams: {\n query: GetObligationsQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: successResponseSchema,\n },\n },\n },\n 400: {\n description: \"Bad Request\",\n content: {\n \"application/json\": {\n schema: errorResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/health\": {\n get: {\n summary: \"Router status\",\n description: \"Retrieve the aggregated status of the router.\",\n tags: [\"Health\"],\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: RouterStatusResponse,\n },\n },\n },\n },\n },\n },\n \"/v1/health/collectors\": {\n get: {\n summary: \"Collectors health\",\n description: \"Retrieve the block numbers processed by collectors and their sync status.\",\n tags: [\"Health\"],\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: CollectorsHealthResponse,\n },\n },\n },\n },\n },\n },\n \"/v1/health/chains\": {\n get: {\n summary: \"Chains health\",\n description: \"Retrieve the latest block processed for each chain.\",\n tags: [\"Health\"],\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: ChainsHealthResponse,\n },\n },\n },\n },\n },\n },\n};\n\nexport const OpenApi = createDocument({\n openapi: \"3.1.0\",\n info: {\n title: \"Router API\",\n version: \"1.0.0\",\n description: \"API for the Morpho Router\",\n },\n tags: [\n {\n name: \"Offers\",\n },\n {\n name: \"Obligations\",\n },\n {\n name: \"Health\",\n },\n ],\n servers: [\n {\n url: \"https://router.morpho.dev\",\n description: \"Production server\",\n },\n {\n url: \"http://localhost:8081\",\n description: \"Local development server\",\n },\n ],\n paths,\n});\n","import type { Hex } from \"viem\";\nimport { type Compute, Obligation, Offer } from \"#core\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type * as Format from \"#utils/Format.ts\";\nimport * as ApiSchema from \"./Api/Schema/index.ts\";\n\ntype RouterClientConfig = {\n /** The URL of the router. */\n readonly url: URL;\n /** The default headers to use for each request. */\n readonly headers: Headers;\n};\n\nexport type Client = Compute<\n RouterClientConfig & {\n /**\n * Get offers from the router.\n * @param parameters - {@link getOffers.Parameters}\n * @returns The offers with pagination cursor. {@link getOffers.ReturnType}\n *\n * @example\n * ```ts\n * const router = RouterClient.connect({ url: \"https://router.morpho.dev\" });\n * const { offers, cursor } = await router.getOffers({ side: \"buy\", obligationId: \"0xa1c...d2f\" });\n * console.log(offers);\n * ```\n */\n getOffers: (parameters: getOffers.Parameters) => Promise<getOffers.ReturnType>;\n\n /**\n * Get obligations from the router.\n * @param parameters - {@link getObligations.Parameters}\n * @returns The obligations with pagination cursor. {@link getObligations.ReturnType}\n *\n * @example\n * ```ts\n * const router = RouterClient.connect({ url: \"https://router.morpho.dev\" });\n * const { obligations, cursor } = await router.getObligations();\n * console.log(obligations);\n * ```\n */\n getObligations: (parameters?: getObligations.Parameters) => Promise<getObligations.ReturnType>;\n }\n>;\n\nexport type ConnectOptions = {\n /** The URL of the router to interact with.\n * @default \"https://router.morpho.dev\"\n */\n url?: string;\n /** The API key to use for the router API. */\n apiKey?: string;\n /** The default headers to use for each request. */\n headers?: Headers;\n};\n\n/**\n * Creates an instance of a router client.\n * @constructor\n * @param options - {@link ConnectOptions}\n * @returns A Router Client. {@link Client}\n *\n * @example\n * ```typescript\n * const router = RouterClient.connect({ url: \"https://router.morpho.dev\" });\n * ```\n */\nexport function connect(options?: ConnectOptions): connect.ReturnType {\n const u = new URL(options?.url || \"https://router.morpho.dev\");\n\n if (u.protocol !== \"http:\" && u.protocol !== \"https:\") {\n throw new InvalidUrlError(u.toString());\n }\n\n const headers = options?.headers ?? new Headers();\n headers.set(\"Content-Type\", \"application/json\");\n options?.apiKey !== undefined ? headers.set(\"X-API-Key\", options.apiKey) : null;\n\n const config: RouterClientConfig = {\n url: u,\n headers,\n };\n\n return {\n ...config,\n getOffers: (parameters) => getOffers(config, parameters),\n getObligations: (parameters) => getObligations(config, parameters),\n };\n}\n\nexport declare namespace connect {\n export type ReturnType = Client;\n export type ErrorType = InvalidUrlError;\n}\n\nexport async function getOffers(\n config: RouterClientConfig,\n parameters: getOffers.Parameters,\n): Promise<getOffers.ReturnType> {\n const url = new URL(`${config.url.toString()}v1/offers`);\n\n url.searchParams.set(\"side\", parameters.side);\n url.searchParams.set(\"obligation_id\", parameters.obligationId.toString());\n\n if (parameters.cursor) {\n url.searchParams.set(\"cursor\", parameters.cursor);\n }\n if (parameters.limit !== undefined) {\n url.searchParams.set(\"limit\", parameters.limit.toString());\n }\n\n const { cursor: returnedCursor, data: offers } = await getApi<{\n cursor: string | null;\n data: ApiSchema.OfferResponse.OfferResponse[];\n }>(config, url);\n\n const routerOffers = offers.map(Offer.fromSnakeCase);\n\n return {\n cursor: returnedCursor,\n offers: routerOffers,\n };\n}\n\nexport declare namespace getOffers {\n export type Parameters = {\n /** The desired side of the match: 'buy' if you want to buy, 'sell' if you want to sell */\n side: \"buy\" | \"sell\";\n /** The offers obligation id */\n obligationId: Hex;\n /** Pagination cursor in base64url-encoded format */\n cursor?: string;\n /** Maximum number of offers to return. @default 20 */\n limit?: number;\n };\n\n export type ReturnType = {\n offers: Offer.Offer[];\n /** The pagination cursor. */\n cursor: string | null;\n };\n\n export type ErrorType = GetApiErrorType;\n}\n\nexport async function getObligations(\n config: RouterClientConfig,\n parameters?: getObligations.Parameters,\n): Promise<getObligations.ReturnType> {\n const url = new URL(`${config.url.toString()}v1/obligations`);\n\n if (parameters?.cursor !== undefined) {\n url.searchParams.set(\"cursor\", parameters.cursor);\n }\n if (parameters?.limit !== undefined) {\n url.searchParams.set(\"limit\", parameters.limit.toString());\n }\n\n const { cursor: returnedCursor, data: obligationsSnake } = await getApi<{\n cursor: string | null;\n data: Obligation.Obligation[];\n }>(config, url);\n\n const obligations = obligationsSnake.map(Obligation.fromSnakeCase);\n\n return {\n cursor: returnedCursor,\n obligations,\n };\n}\n\nexport declare namespace getObligations {\n export type Parameters = {\n /** Pagination cursor is a 32-byte hex string. */\n cursor?: Hex;\n /** Maximum number of obligations to return. @default 20 */\n limit?: number;\n };\n\n export type ReturnType = {\n obligations: Obligation.Obligation[];\n /** The pagination cursor. */\n cursor: string | null;\n };\n\n export type ErrorType = GetApiErrorType;\n}\n\ntype GetApiErrorType =\n | HttpGetApiFailedError\n | HttpUnauthorizedError\n | HttpForbiddenError\n | HttpRateLimitError;\n\nasync function getApi<T>(config: RouterClientConfig, url: URL): Promise<Format.Snake<T>> {\n const pathname = url.pathname;\n let action: \"get_offers\" | \"get_obligations\";\n\n switch (true) {\n case pathname.includes(\"/v1/offers\"):\n action = \"get_offers\";\n break;\n case pathname.includes(\"/v1/obligations\"):\n action = \"get_obligations\";\n break;\n default:\n throw new HttpGetApiFailedError(\"Unknown endpoint\", {\n details: `Unsupported path: ${pathname}`,\n });\n }\n\n const schemaParseResult = ApiSchema.safeParse(action, Object.fromEntries(url.searchParams));\n if (!schemaParseResult.success) {\n throw new HttpGetApiFailedError(`Invalid URL parameters`, {\n details: schemaParseResult.error.issues[0]?.message,\n });\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: config.headers,\n });\n\n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new HttpUnauthorizedError();\n case 403:\n throw new HttpForbiddenError();\n case 429:\n throw new HttpRateLimitError();\n }\n throw new HttpGetApiFailedError(`GET request returned ${response.status}`, {\n details: await response.text(),\n });\n }\n\n return response.json() as Promise<Format.Snake<T>>;\n}\n\nexport class InvalidUrlError extends Errors.BaseError {\n override name = \"Router.InvalidUrlError\";\n constructor(url: string) {\n super(`URL \"${url}\" is not http/https.`);\n }\n}\n\nexport class HttpUnauthorizedError extends Errors.BaseError {\n override name = \"Router.HttpUnauthorizedError\";\n constructor() {\n super(\"Unauthorized.\", {\n metaMessages: [\"Ensure that an API key is provided.\"],\n });\n }\n}\n\nexport class HttpForbiddenError extends Errors.BaseError {\n override name = \"Router.HttpForbiddenError\";\n constructor() {\n super(\"Forbidden.\", {\n metaMessages: [\"Ensure that the API key is valid.\"],\n });\n }\n}\n\nexport class HttpRateLimitError extends Errors.BaseError {\n override name = \"Router.HttpRateLimitError\";\n constructor() {\n super(\"Rate limit exceeded.\", {\n metaMessages: [\n \"The number of allowed requests has been exceeded. You must wait for the rate limit to reset.\",\n ],\n });\n }\n}\n\nexport class HttpGetApiFailedError extends Errors.BaseError {\n override name = \"Router.HttpGetApiFailedError\";\n constructor(message: string, { details }: { details?: string } = {}) {\n super(message, {\n metaMessages: [details],\n });\n }\n}\n","import type * as ValidationRule from \"./ValidationRule.ts\";\n\n/**\n * A validation issue.\n */\nexport type Issue<T, RuleName extends string = string> = {\n /** The name of the rule that caused the issue. */\n ruleName: RuleName;\n /** The message of the issue. */\n message: string;\n /** The item that was not valid. */\n item: T;\n};\n\n/**\n * The result of a validation.\n */\nexport type Result<T, RuleName extends string = string> = {\n /** The items that were valid. */\n valid: T[];\n /** The reports of the failed validations. */\n issues: Issue<T, RuleName>[];\n};\n\nexport function run<\n T,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, void>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>>;\n\nexport function run<\n T,\n Ctx,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, Ctx>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n ctx: Ctx;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>>;\n\nexport async function run<\n T,\n Ctx,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, Ctx>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n ctx?: Ctx;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>> {\n const { items, rules, ctx = {} as Ctx, chunkSize } = parameters;\n\n const issues: Issue<T, ValidationRule.RuleNames<Rules>>[] = [];\n let validItems: T[] = items.slice();\n\n for (const rule of rules) {\n if (validItems.length === 0) return { valid: [], issues };\n\n const indicesToRemove: Set<number> = new Set();\n if (rule.kind === \"single\") {\n for (let i = 0; i < validItems.length; i++) {\n const item = validItems[i]!;\n const issue = await rule.run(item, ctx);\n if (issue) {\n issues.push({ ...issue, ruleName: rule.name, item });\n indicesToRemove.add(i);\n }\n }\n } else if (rule.kind === \"batch\") {\n const exec = async (slice: T[], offset: number) => {\n const map = await rule.run(slice, ctx);\n for (let i = 0; i < slice.length; i++) {\n const issue = map.get(i);\n if (issue !== undefined) {\n issues.push({ ...issue, ruleName: rule.name, item: slice[i]! });\n indicesToRemove.add(offset + i);\n }\n }\n };\n\n if (!chunkSize) await exec(validItems, 0);\n else {\n for (let i = 0; i < validItems.length; i += chunkSize) {\n await exec(validItems.slice(i, i + chunkSize), i);\n }\n }\n }\n\n validItems = validItems.filter((_, i) => !indicesToRemove.has(i));\n }\n\n return {\n valid: validItems,\n issues,\n };\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { Abi, Callback, type Chain, Maturity, type Offer } from \"#core\";\nimport type * as Validation from \"./Validation.ts\";\n\n/**\n * A validation rule.\n */\nexport type Rule<T, Name extends string = string, Ctx = void> =\n | { kind: \"single\"; name: Name; run: Single<T, Name, Ctx> }\n | { kind: \"batch\"; name: Name; run: Batch<T, Name, Ctx> };\n\nexport type RuleNames<Rules extends readonly { name: string }[]> = Rules[number][\"name\"];\n\n/**\n * A single item validation rule.\n * @param item - The item to validate.\n * @param ctx - The context of the validation.\n * @returns The issue that was found. If the item is valid, this will be undefined.\n */\nexport type Single<T, RuleName extends string, Ctx = void> = (\n item: T,\n ctx: Ctx,\n) =>\n | Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\">\n | undefined\n | Promise<Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>;\n\n/**\n * A batch item validation rule.\n * @param items - The items to validate.\n * @param ctx - The context of the validation.\n * @returns A map of the items to the issue that was found.\n */\nexport type Batch<T, RuleName extends string, Ctx = void> = (\n items: T[],\n ctx: Ctx,\n) =>\n | Map<number, Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>\n | Promise<Map<number, Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>>;\n\n/**\n * Create a validation rule iterating over a single item at a time.\n * @param name - The name of the rule.\n * @param run - The function that validates the rule.\n * @returns The created rule.\n */\nexport function single<Name extends string, T, Ctx = void>(\n name: Name,\n run: Single<T, Name, Ctx>,\n): Rule<T, Name, Ctx> {\n return { kind: \"single\", name, run } as const satisfies Rule<T, Name, Ctx>;\n}\n\n/**\n * Create a validation rule iterating over a batch of items at a time.\n * @param name - The name of the rule.\n * @param run - The function that validates the rule.\n * @returns The created rule.\n */\nexport function batch<Name extends string, T, Ctx = void>(\n name: Name,\n run: Batch<T, Name, Ctx>,\n): Rule<T, Name, Ctx> {\n return { kind: \"batch\", name, run } as const satisfies Rule<T, Name, Ctx>;\n}\n\nexport type MorphoContext = {\n chain: Chain.Chain;\n client: PublicClient;\n};\n\nexport function morpho() {\n const chainId = single(\"chain_id\", (offer: Offer.Offer, { chain }: MorphoContext) => {\n if (chain.id !== offer.chainId) {\n return {\n message: `Chain ID ${offer.chainId} is not the same as the chain ID in the context (${chain.id})`,\n };\n }\n });\n\n const loanToken = single(\"loan_token\", (offer: Offer.Offer, { chain }: MorphoContext) => {\n const tokens = new Set(\n Array.from(chain.whitelistedAssets.values()).map((a) => a.toLowerCase() as Address),\n );\n\n if (!tokens.has(offer.loanToken.toLowerCase() as Address)) {\n return {\n message: `Loan token ${offer.loanToken} is not whitelisted on chain ${offer.chainId}`,\n };\n }\n });\n\n const expiry = single(\"expiry\", (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.expiry < Math.floor(Date.now() / 1000)) {\n return { message: \"Expiry mismatch\" };\n }\n });\n\n const sellEmptyCallback = single(\n \"sell_offers_empty_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data === \"0x\") {\n return { message: \"Sell offers require a non-empty callback.\" };\n }\n },\n );\n\n const buyNonEmptyCallback = single(\n \"buy_offers_non_empty_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.buy && offer.callback.data !== \"0x\") {\n const allowed = new Set(\n Callback.WhitelistedCallbackAddresses[Callback.CallbackType.BuyVaultV1Callback].map((a) =>\n a.toLowerCase(),\n ),\n );\n\n const callbackAddress = offer.callback.address?.toLowerCase();\n if (!callbackAddress || !allowed.has(callbackAddress)) {\n return {\n message:\n \"Buy offers with non-empty callback must use a whitelisted BuyVaultV1Callback.\",\n };\n }\n }\n },\n );\n\n const sellNonWhitelistedCallback = single(\n \"sell_offers_non_whitelisted_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data !== \"0x\") {\n const allowed = new Set(\n Callback.WhitelistedCallbackAddresses[Callback.CallbackType.SellERC20Callback].map((a) =>\n a.toLowerCase(),\n ),\n );\n const callbackAddress = offer.callback.address?.toLowerCase() as Address | undefined;\n if (!callbackAddress || !allowed.has(callbackAddress)) {\n return { message: \"Sell offer callback address is not whitelisted.\" };\n }\n }\n },\n );\n\n const sellCallbackDataInvalid = single(\n \"sell_offers_callback_data_invalid\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data !== \"0x\") {\n try {\n const decoded = Callback.decodeSellERC20Callback(offer.callback.data);\n if (decoded.length === 0) {\n return { message: \"Sell offer callback data must include at least one collateral.\" };\n }\n } catch (_) {\n return { message: \"Sell offer callback data cannot be decoded.\" };\n }\n }\n },\n );\n\n const sellCallbackCollateralInvalid = single(\n \"sell_offers_callback_collateral_invalid\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data !== \"0x\") {\n try {\n const decoded = Callback.decodeSellERC20Callback(offer.callback.data);\n const offerCollaterals = new Set(\n offer.collaterals.map((c) => c.asset.toLowerCase() as Address),\n );\n for (const { collateral } of decoded) {\n if (!offerCollaterals.has(collateral.toLowerCase() as Address)) {\n return { message: \"Sell callback collateral is not part of offer collaterals.\" };\n }\n }\n } catch (_) {}\n }\n },\n );\n\n const buyCallbackDataInvalid = single(\n \"buy_offers_callback_data_invalid\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.buy && offer.callback.data !== \"0x\") {\n try {\n const decoded = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n if (decoded.length === 0) {\n return { message: \"Buy offer callback data must include at least one vault.\" };\n }\n } catch (_) {\n return { message: \"Buy offer callback data cannot be decoded.\" };\n }\n }\n },\n );\n\n const buyCallbackVaultInvalid = batch(\n \"buy_offers_callback_vault_invalid\",\n async (offers: Offer.Offer[], { client, chain }: MorphoContext) => {\n const validationIssues = new Map<\n number,\n | Omit<\n Validation.Issue<Offer.Offer, \"buy_offers_callback_vault_invalid\">,\n \"ruleName\" | \"item\"\n >\n | undefined\n >();\n\n const offersByVaultAddress = new Map<string, Array<{ index: number; offer: Offer.Offer }>>();\n for (let i = 0; i < offers.length; i++) {\n const offer = offers[i]!;\n if (offer.buy && offer.callback.data !== \"0x\") {\n try {\n const callbackVaults = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n for (const { vault } of callbackVaults) {\n const normalizedVaultAddress = vault.toLowerCase();\n if (!offersByVaultAddress.has(normalizedVaultAddress)) {\n offersByVaultAddress.set(normalizedVaultAddress, []);\n }\n offersByVaultAddress.get(normalizedVaultAddress)!.push({ index: i, offer });\n }\n } catch (_) {\n // Skip - invalid callback data is already caught by buyCallbackDataInvalid rule\n }\n }\n }\n\n const uniqueVaultAddresses = Array.from(offersByVaultAddress.keys());\n if (uniqueVaultAddresses.length === 0) return validationIssues;\n\n const whitelistedFactories = Object.values(chain.vaultV1Factory);\n\n const multicallContracts = [];\n for (const vaultAddress of uniqueVaultAddresses) {\n multicallContracts.push({\n address: vaultAddress as Address,\n abi: Abi.ERC4626,\n functionName: \"asset\",\n } as const);\n\n for (const factoryAddress of whitelistedFactories) {\n multicallContracts.push({\n address: factoryAddress as Address,\n abi: Abi.MetaMorphoFactory,\n functionName: \"isMetaMorpho\",\n args: [vaultAddress as Address],\n } as const);\n }\n }\n\n const multicallResults = await client.multicall({\n contracts: multicallContracts,\n allowFailure: true,\n });\n\n const vaultAssetByAddress = new Map<string, Address | null>();\n const registeredVaults = new Set<string>();\n\n const numberOfFactories = whitelistedFactories.length;\n\n let resultIndex = 0;\n for (const vaultAddress of uniqueVaultAddresses) {\n const assetCallResult = multicallResults[resultIndex++]!;\n const assetAddress =\n assetCallResult.status === \"success\" ? (assetCallResult.result as Address) : null;\n\n vaultAssetByAddress.set(vaultAddress, assetAddress);\n\n let isRegisteredInFactory = false;\n for (let factoryIndex = 0; factoryIndex < numberOfFactories; factoryIndex++) {\n const factoryCallResult = multicallResults[resultIndex++]!;\n\n if (factoryCallResult.status === \"success\" && factoryCallResult.result === true) {\n isRegisteredInFactory = true;\n }\n }\n\n if (isRegisteredInFactory) {\n registeredVaults.add(vaultAddress);\n }\n }\n\n const uniqueOffers = new Map<number, Offer.Offer>();\n for (const offersArray of offersByVaultAddress.values()) {\n for (const { index, offer } of offersArray) {\n uniqueOffers.set(index, offer);\n }\n }\n\n for (const [index, offer] of uniqueOffers) {\n try {\n const callbackVaults = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n const vaultsWithIssues: Array<{ vaultAddress: Address; failureReasons: string }> = [];\n\n for (const { vault } of callbackVaults) {\n const normalizedVaultAddress = vault.toLowerCase();\n const assetAddress = vaultAssetByAddress.get(normalizedVaultAddress);\n const isRegistered = registeredVaults.has(normalizedVaultAddress);\n\n const failureReasons: string[] = [];\n\n if (assetAddress === null) {\n failureReasons.push(\"asset call failed\");\n } else if (\n assetAddress &&\n assetAddress.toLowerCase() !== offer.loanToken.toLowerCase()\n ) {\n failureReasons.push(\"asset mismatch\");\n }\n\n if (!isRegistered) {\n failureReasons.push(\"not registered in factory\");\n }\n\n if (failureReasons.length > 0) {\n vaultsWithIssues.push({\n vaultAddress: vault,\n failureReasons: failureReasons.join(\", \"),\n });\n }\n }\n\n if (vaultsWithIssues.length > 0) {\n const failureDetails = vaultsWithIssues\n .map((v) => `${v.vaultAddress} (${v.failureReasons})`)\n .join(\"; \");\n validationIssues.set(index, {\n message: `Buy offer callback vaults are invalid: ${failureDetails}`,\n });\n }\n } catch (_) {\n // Skip - invalid callback data is already caught by buyCallbackDataInvalid rule\n }\n }\n\n return validationIssues;\n },\n );\n\n const maturity = single(\"maturity\", (offer: Offer.Offer, _: MorphoContext) => {\n const allowedMaturities = [Maturity.from(\"end_of_month\"), Maturity.from(\"end_of_next_month\")];\n\n if (!allowedMaturities.includes(offer.maturity)) {\n return {\n message: `Maturity must be end of current month (${allowedMaturities[0]}) or end of next month (${allowedMaturities[1]}). Got: ${offer.maturity}`,\n };\n }\n });\n\n return [\n chainId,\n loanToken,\n expiry,\n maturity,\n // note: callback rules should be the last ones, since they do not mean that the offer is forever invalid\n // integrators should be able to choose if they want to keep the offer or not\n sellEmptyCallback,\n buyNonEmptyCallback,\n sellNonWhitelistedCallback,\n sellCallbackDataInvalid,\n sellCallbackCollateralInvalid,\n buyCallbackDataInvalid,\n buyCallbackVaultInvalid,\n ];\n}\n","import type { Hex } from \"viem\";\nimport type { Compute, Offer } from \"#core\";\nimport * as EVMClient from \"./MempoolEVMClient.ts\";\n\nexport type AddParameters = {\n offer: Compute<Omit<Offer.Offer, \"hash\" | \"createdAt\">>;\n};\n\nexport type GetParameters = {\n /** The block number to get offers from. */\n blockNumberGte?: number;\n /** The block number to get offers to. */\n blockNumberLte?: number;\n /** The loan asset to get offers from. */\n loanToken?: string;\n /** The order to get offers. Defaults to \"desc\". */\n order?: \"asc\" | \"desc\";\n /** The options to get offers from. */\n options?: {\n /** The maximum number of offers to return. Defaults to 100. Maximum is 1000. */\n maxBatchSize?: number;\n };\n};\n\nexport type WatchParameters = {\n /** The async function to get the last synced block number from which to start watching.\n * This function will be called periodically on each poll. It should be updated by the caller (e.g. using `onOffers` callback) to track the last synced block number.\n */\n lastSyncedBlock: () => Promise<number>;\n /** The loan asset to watch. */\n loanToken?: string;\n /** The callback to call when a new batch of offers is found in the mempool.\n * @param offers The offers found in the mempool.\n * @param blockNumber The block number of the last processed offer. Block numbers will always ascend.\n */\n onOffers: (offers: Offer.Offer[], blockNumber: number) => Promise<void>;\n /** The polling configuration. */\n polling?: {\n /** The interval in milliseconds to poll for new offers. Defaults to 30000. */\n interval?: number;\n /** The maximum number of offers that can be returned in a single batch.\n * Defaults to 100. Maximum is 1000. */\n maxBatchSize?: number;\n };\n};\n\n/**\n * Mempool client interface.\n */\nexport type Client = {\n /**\n * Add an offer to the mempool.\n * @returns The created offer with its hash.\n */\n add: (parameters: AddParameters) => Promise<{ offer: Offer.Offer; txHash: Hex }>;\n /** Get offers from the mempool. */\n get: (parameters?: GetParameters) => AsyncGenerator<{\n offers: Offer.Offer[];\n /** The block number of the last processed offer. Depends on the `order` parameter, block numbers will ascend or descend. */\n blockNumber: number;\n }>;\n /**\n * Watch for new offers on a specific chain.\n * @returns A function to stop watching for new offers.\n */\n watch: (parameters: WatchParameters) => () => boolean;\n\n /**\n * Stream offers from the mempool.\n * @returns A generator of offers alongside the last block number processed.\n */\n stream: (\n parameters: Compute<\n Omit<GetParameters, \"options\"> & {\n options: GetParameters[\"options\"] & { blockWindow?: number };\n }\n >,\n ) => AsyncGenerator<{\n offers: Offer.Offer[];\n blockNumber: number;\n }>;\n};\n\n/**\n * Client to interact with the Mempool contract on a specific chain.\n */\nexport function connect(parameters: EVMClient.from.Parameters): Client {\n return EVMClient.from(parameters);\n}\n\nexport declare namespace connect {\n export type ErrorType = EVMClient.from.ErrorType;\n}\n","import {\n type Address,\n decodeAbiParameters,\n type Hex,\n type PublicClient,\n publicActions,\n type WalletClient as ViemClient,\n} from \"viem\";\nimport type { Compute } from \"#core\";\nimport { Chain, Offer } from \"#core\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport { poll } from \"#utils/index.ts\";\nimport type * as Client from \"./MempoolClient.ts\";\n\nconst DEFAULT_BATCH_SIZE = 100;\nconst DEFAULT_BLOCK_WINDOW = 100;\n\ntype MempoolEVMClientConfig = {\n readonly client: ViemClient;\n readonly mempoolAddress: Address;\n readonly blockWindow: number;\n};\n\nexport function from(parameters: from.Parameters): from.ReturnType {\n const config: MempoolEVMClientConfig = {\n client: parameters.client,\n mempoolAddress: parameters.mempoolAddress,\n blockWindow: parameters.blockWindow || DEFAULT_BLOCK_WINDOW,\n };\n\n return {\n add: (parameters) => add(config, parameters),\n get: (parameters) => get(config, parameters),\n watch: (parameters) => watch(config, parameters),\n stream: (parameters) => streamOffers(config, parameters),\n };\n}\n\nexport declare namespace from {\n type Parameters = {\n /** The viem client to use. */\n client: ViemClient;\n /** The mempool address. */\n mempoolAddress: Address;\n /** The block window to use for the mempool. Defaults to 100. */\n blockWindow?: number;\n };\n\n type ReturnType = Client.Client;\n\n type ErrorType = null;\n}\n\n/**\n * Add an offer to the mempool.\n * @returns The created offer with its hash.\n * @throws WalletAccountNotSetError if the wallet account is not set.\n * @throws ViemClientError if the viem client throws an error.\n * @throws Offer.InvalidOfferError if the offer is invalid.\n */\nexport async function add(\n config: MempoolEVMClientConfig,\n parameters: Client.AddParameters,\n): Promise<{ offer: Offer.Offer; txHash: Hex }> {\n const offer = Offer.from(parameters.offer);\n if (!config.client.account) throw new WalletAccountNotSetError();\n\n const chainId = await getChainId(config.client);\n if (BigInt(chainId) !== offer.chainId)\n throw new ChainIdMismatchError(offer.chainId, BigInt(chainId));\n\n try {\n const tx = await config.client.sendTransaction({\n chain: config.client.chain,\n account: config.client.account!,\n to: config.mempoolAddress,\n data: Offer.encode(offer),\n });\n\n return { offer, txHash: tx };\n } catch (error) {\n throw new ViemClientError(error instanceof Error ? error.message : \"Unknown error\");\n }\n}\n\nexport declare namespace add {\n export type ErrorType =\n | WalletAccountNotSetError\n | ViemClientError\n | Offer.InvalidOfferError\n | ChainIdMismatchError;\n}\n\nexport async function* get(\n config: MempoolEVMClientConfig,\n parameters?: Client.GetParameters,\n): AsyncGenerator<{ offers: Offer.Offer[]; blockNumber: number }, void, void> {\n const {\n loanToken,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE } = {},\n } = parameters || {};\n\n yield* streamOffers(config, {\n loanToken,\n order,\n blockNumberGte,\n blockNumberLte,\n options: { maxBatchSize, blockWindow: config.blockWindow },\n });\n}\n\nexport declare namespace get {\n export type ErrorType = streamOffersReturnType;\n}\n\n/**\n * Watch for new offers on a specific chain.\n * @returns A function to stop watching for new offers.\n */\nexport function watch(config: MempoolEVMClientConfig, parameters: Client.WatchParameters) {\n const {\n loanToken,\n lastSyncedBlock,\n polling: { interval = 30_000, maxBatchSize = DEFAULT_BATCH_SIZE } = {},\n onOffers,\n } = parameters;\n\n return poll(\n async () => {\n const blockNumberGte = await lastSyncedBlock();\n\n const stream = streamOffers(config, {\n loanToken,\n order: \"asc\",\n blockNumberGte,\n options: { maxBatchSize, blockWindow: config.blockWindow },\n });\n\n for await (const { offers, blockNumber } of stream) {\n await onOffers(offers, blockNumber);\n }\n },\n { interval },\n );\n}\n\nexport declare namespace watch {\n export type ErrorType = streamOffersReturnType;\n}\n\nconst chainIdCache = new Map<string, number>();\n/**\n * Caches the chain id of a viem client.\n * @param client - The viem client.\n * @returns The chain id.\n */\nconst getChainId = async (client: ViemClient): Promise<number> => {\n if (chainIdCache.has(client.uid)) return chainIdCache.get(client.uid)!;\n const chainId = await client.getChainId();\n chainIdCache.set(client.uid, chainId);\n return chainId;\n};\n\ntype streamOffersReturnType = WalletAccountNotSetError | ChainIdMismatchError;\n\nasync function* streamOffers(\n config: MempoolEVMClientConfig,\n parameters: Compute<\n Omit<Client.GetParameters, \"options\"> & {\n options: Client.GetParameters[\"options\"] & { blockWindow?: number };\n }\n >,\n): AsyncGenerator<{ offers: Offer.Offer[]; blockNumber: number }, void, void> {\n const {\n loanToken,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE, blockWindow = config.blockWindow } = {},\n } = parameters;\n\n const stream = Chain.streamLogs({\n client: config.client.extend(publicActions) as PublicClient,\n contractAddress: config.mempoolAddress,\n event: {\n type: \"event\",\n name: \"Event\",\n inputs: [{ name: \"data\", type: \"bytes\", indexed: false, internalType: \"bytes\" }],\n anonymous: false,\n } as const,\n blockNumberGte,\n blockNumberLte,\n order,\n options: { maxBatchSize, blockWindow },\n });\n\n let blockNumber = order === \"asc\" ? blockNumberGte : blockNumberLte;\n for await (const { logs, blockNumber: newBlockNumber } of stream) {\n blockNumber = newBlockNumber;\n if (logs.length === 0) break;\n let offersAndBlockNumbers = logs\n .map((log) => {\n const [payload] = decodeAbiParameters([{ type: \"bytes\" }], log.data);\n try {\n return { offer: Offer.decode(payload, log.blockNumber), blockNumber: log.blockNumber };\n } catch (_) {\n return null;\n }\n })\n .filter((item) => item !== null);\n\n if (loanToken)\n offersAndBlockNumbers = offersAndBlockNumbers.filter(\n (o) => o.offer.loanToken.toLowerCase() === loanToken.toLowerCase(),\n );\n\n if (offersAndBlockNumbers.length === 0) continue;\n\n yield {\n offers: offersAndBlockNumbers.map((item) => item.offer),\n blockNumber,\n };\n }\n\n yield { offers: [], blockNumber: blockNumber! };\n return;\n}\n\nexport class WalletAccountNotSetError extends Errors.BaseError {\n override name = \"Mempool.WalletAccountNotSetError\";\n constructor() {\n super(\"Wallet account is not set.\");\n }\n}\n\nexport class ViemClientError extends Errors.BaseError {\n override name = \"Mempool.ViemClientError\";\n}\n\nexport class ChainIdMismatchError extends Errors.BaseError {\n override name = \"Mempool.ChainIdMismatchError\";\n constructor(expected: bigint, actual: bigint) {\n super(`Chain ID mismatch. Offer chain ID is ${expected}, network chain ID is ${actual}.`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/Schema/index.ts","../src/api/Schema/health.ts","../src/api/Schema/ObligationResponse.ts","../src/utils/Format.ts","../src/api/Schema/OfferResponse.ts","../src/core/Abi.ts","../src/core/Callback.ts","../src/core/Chain.ts","../src/utils/BigMath.ts","../src/utils/batch.ts","../src/utils/Errors.ts","../src/core/Collateral.ts","../src/utils/zod.ts","../src/core/LLTV.ts","../src/core/Liquidity.ts","../src/core/Maturity.ts","../src/core/Obligation.ts","../src/core/Offer.ts","../src/utils/index.ts","../src/utils/retry.ts","../src/utils/batchMulticall.ts","../src/utils/lazy.ts","../src/utils/wait.ts","../src/utils/poll.ts","../src/utils/time.ts","../src/core/Quote.ts","../src/core/types.ts","../src/stores/utils/Cursor.ts","../src/api/Schema/requests.ts","../src/api/Schema/openapi.ts","../src/client/Client.ts","../src/collectors/validations/Validation.ts","../src/collectors/validations/ValidationRule.ts","../src/mempool/MempoolClient.ts","../src/mempool/MempoolEVMClient.ts"],"names":["z","isAddress","getAddress","from","CallbackType","decodeAbiParameters","encodeAbiParameters","array","viemEthereum","viemBase","viemAnvil","getBlock","getLogs","isHex","z2","z3","z4","obligationId","InvalidOptionError","z5","now","fromSnakeCase","z6","maxUint256","keccak256","privateKeyToAccount","generatePrivateKey","random","toSnakeCase","wait","watch","poll","max","z7","zeroAddress","hashTypedData","z8","decode","encode","Base64","z9","createDocument","batch","run","_","connect","DEFAULT_BATCH_SIZE","DEFAULT_BLOCK_WINDOW","parameters","publicActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,0BAAA;AAAA,EAAA,aAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,SAAA,EAAA,MAAA;AAAA,CAAA,CAAA;ACEO,IAAM,eAAA,GAAkBA,KAAE,MAAO,CAAA;AAAA,EACtC,IAAA,EAAMA,KAAE,MAAO,EAAA;AAAA,EACf,QAAA,EAAUA,KAAE,MAAO,EAAA;AAAA,EACnB,YAAc,EAAAA,IAAA,CAAE,MAAO,EAAA,CAAE,QAAS,EAAA;AAAA,EAClC,UAAY,EAAAA,IAAA,CAAE,MAAO,EAAA,CAAE,QAAS,EAAA;AAAA,EAChC,GAAK,EAAAA,IAAA,CAAE,MAAO,EAAA,CAAE,QAAS,EAAA;AAAA,EACzB,QAAQA,IAAE,CAAA,IAAA,CAAK,CAAC,MAAQ,EAAA,SAAA,EAAW,SAAS,CAAC;AAC/C,CAAC,CAAA;AAEM,IAAM,wBAAA,GAA2BA,IAAE,CAAA,KAAA,CAAM,eAAe,CAAA;AAExD,IAAM,WAAA,GAAcA,KAAE,MAAO,CAAA;AAAA,EAClC,QAAA,EAAUA,KAAE,MAAO,EAAA;AAAA,EACnB,YAAA,EAAcA,KAAE,MAAO,EAAA;AAAA,EACvB,UAAA,EAAYA,KAAE,MAAO;AACvB,CAAC,CAAA;AAEM,IAAM,oBAAA,GAAuBA,IAAE,CAAA,KAAA,CAAM,WAAW,CAAA;AAEhD,IAAM,oBAAA,GAAuBA,KAAE,MAAO,CAAA;AAAA,EAC3C,QAAQA,IAAE,CAAA,IAAA,CAAK,CAAC,MAAA,EAAQ,SAAS,CAAC;AACpC,CAAC,CAAA;;;ACvBD,IAAA,0BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,0BAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,WAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAgDO,SAAS,YAAe,GAAkB,EAAA;AAC/C,EAAO,OAAA,eAAA;AAAA,IACL,aAAA;AAAA,MACE,GAAA;AAAA,MACA,CAAC,CAAc,KAAA,CAAA,CAAE,OAAQ,CAAA,QAAA,EAAU,CAAC,CAAA,KAAM,CAAI,CAAA,EAAA,CAAA,CAAE,WAAY,EAAC,CAAE,CAAA,CAAA;AAAA,MAC/D,CAAC,KAAA,KACC,OAAO,KAAA,KAAU,YAAYC,cAAU,CAAA,KAAA,CAAM,WAAY,EAAC,CACtD,GAAAC,eAAA,CAAW,KAAM,CAAA,WAAA,EAAa,CAC9B,GAAA;AAAA;AACR,GACF;AACF;AAQO,SAAS,cAAiB,GAAkB,EAAA;AACjD,EAAO,OAAA,aAAA;AAAA,IACL,GAAA;AAAA,IACA,CAAC,CACC,KAAAD,cAAA,CAAU,CAAE,CAAA,WAAA,EAAa,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,OAAA,CAAQ,aAAa,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,aAAa,CAAA;AAAA,IACnF,CAAC,KAAA,KACC,OAAO,KAAA,KAAU,QAAY,IAAAA,cAAA,CAAU,KAAM,CAAA,WAAA,EAAa,CAAA,GAAI,KAAM,CAAA,WAAA,EAAgB,GAAA;AAAA,GACxF;AACF;AAEA,SAAS,aAAA,CACP,GACA,EAAA,KAAA,EACA,OACS,EAAA;AACT,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAY,IAAA,GAAA,KAAQ,MAAa,OAAA,GAAA;AAEpD,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA,EAAU,OAAA,GAAA,CAAI,GAAI,CAAA,CAAC,IAAS,KAAA,aAAA,CAAc,IAAM,EAAA,KAAA,EAAO,OAAO,CAAC,CAAA;AAEpF,EAAO,OAAA,MAAA,CAAO,OAAQ,CAAA,GAA8B,CAAE,CAAA,MAAA;AAAA,IACpD,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AACrB,MAAM,MAAA,MAAA,GAAS,MAAM,GAAG,CAAA;AACxB,MAAA,GAAA,CAAI,MAAM,CAAA,GACR,OAAO,KAAA,KAAU,QAAY,IAAA,KAAA,KAAU,IACnC,GAAA,aAAA,CAAc,KAAO,EAAA,KAAA,EAAO,OAAO,CAAA,GACnC,QAAQ,KAAK,CAAA;AAEnB,MAAO,OAAA,GAAA;AAAA,KACT;AAAA,IACA;AAAC,GACH;AACF;AAEA,SAAS,gBAAmB,KAAgC,EAAA;AAC1D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAU,EAAA,OAAO,MAAM,QAAS,EAAA;AACrD,EAAA,IAAI,MAAM,OAAQ,CAAA,KAAK,GAAU,OAAA,KAAA,CAAM,IAAI,eAAe,CAAA;AAC1D,EAAI,IAAA,KAAA,IAAS,OAAO,KAAA,KAAU,QAAU,EAAA;AACtC,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,CAAG,EAAA,CAAC,KAAK,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAG,EAAA;AAC1C,MAAI,GAAA,CAAA,CAAC,CAAI,GAAA,eAAA,CAAgB,CAAC,CAAA;AAAA;AAE5B,IAAO,OAAA,GAAA;AAAA;AAGT,EAAO,OAAA,KAAA;AACT;;;AD1FO,SAAS,IAAA,CAAK,YAAmC,KAAwC,EAAA;AAC9F,EAAA,OAAc,WAAY,CAAA;AAAA,IACxB,IAAI,KAAM,CAAA,YAAA;AAAA,IACV,GAAG,UAAA;AAAA,IACH,KAAK,KAAM,CAAA,GAAA;AAAA,IACX,KAAK,KAAM,CAAA;AAAA,GACZ,CAAA;AACH;;;AE7BA,IAAA,qBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAAE,IAAAA,EAAAA,MAAAA;AAAA,CAAA,CAAA;AAWO,SAASA,MAAK,KAAmC,EAAA;AACtD,EAAA,OAAc,YAAY,KAAK,CAAA;AACjC;;;ACbA,IAAA,WAAA,GAAA;AAAA,QAAA,CAAA,WAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,MAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAO,IAAM,MAAS,GAAA;AAAA,EACpB;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,OAAA;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,EAAI,EAAA,IAAA,EAAM,WAAW,CAAA;AAAA,IACvC,eAAiB,EAAA;AAAA;AAErB,CAAA;AAEO,IAAM,OAAU,GAAA;AAAA,EACrB;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,OAAA;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,EAAI,EAAA,IAAA,EAAM,WAAW,CAAA;AAAA,IACvC,eAAiB,EAAA;AAAA;AAErB,CAAA;AAEO,IAAM,iBAAoB,GAAA;AAAA,EAC/B;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,cAAA;AAAA,IACN,QAAQ,CAAC,EAAE,MAAM,QAAU,EAAA,IAAA,EAAM,WAAW,CAAA;AAAA,IAC5C,SAAS,CAAC,EAAE,MAAM,EAAI,EAAA,IAAA,EAAM,QAAQ,CAAA;AAAA,IACpC,eAAiB,EAAA;AAAA;AAErB,CAAA;AAEO,IAAM,UAAa,GAAA;AAAA,EACxB;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,eAAA;AAAA,IACN,QAAQ,CAAC,EAAE,MAAM,OAAS,EAAA,IAAA,EAAM,WAAW,CAAA;AAAA,IAC3C,SAAS,CAAC,EAAE,MAAM,EAAI,EAAA,IAAA,EAAM,WAAW,CAAA;AAAA,IACvC,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,qBAAA;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,EAAI,EAAA,IAAA,EAAM,WAAW,CAAA;AAAA,IACvC,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,aAAA;AAAA,IACN,QAAQ,CAAC,EAAE,MAAM,OAAS,EAAA,IAAA,EAAM,WAAW,CAAA;AAAA,IAC3C,SAAS,CAAC,EAAE,MAAM,EAAI,EAAA,IAAA,EAAM,WAAW,CAAA;AAAA,IACvC,eAAiB,EAAA;AAAA;AAErB,CAAA;AAEO,IAAM,MAAS,GAAA;AAAA,EACpB;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,cAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN;AAAA,QACE,IAAM,EAAA,EAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,EAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,EAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA;AAChB,KACF;AAAA,IACA,OAAS,EAAA;AAAA,MACP;AAAA,QACE,IAAM,EAAA,EAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA;AAChB,KACF;AAAA,IACA,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,QAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN;AAAA,QACE,IAAM,EAAA,EAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,EAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA;AAChB,KACF;AAAA,IACA,OAAS,EAAA;AAAA,MACP;AAAA,QACE,IAAM,EAAA,EAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA;AAChB,KACF;AAAA,IACA,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,QAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN;AAAA,QACE,IAAM,EAAA,IAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA;AAChB,KACF;AAAA,IACA,OAAS,EAAA;AAAA,MACP;AAAA,QACE,IAAM,EAAA,mBAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,mBAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,mBAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,mBAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,YAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,KAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA;AAChB,KACF;AAAA,IACA,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,UAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN;AAAA,QACE,IAAM,EAAA,IAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,MAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA;AAChB,KACF;AAAA,IACA,OAAS,EAAA;AAAA,MACP;AAAA,QACE,IAAM,EAAA,cAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,cAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAM,EAAA,YAAA;AAAA,QACN,IAAM,EAAA,SAAA;AAAA,QACN,YAAc,EAAA;AAAA;AAChB,KACF;AAAA,IACA,eAAiB,EAAA;AAAA;AAErB,CAAA;;;AC1LA,IAAA,gBAAA,GAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,4BAAA,EAAA,MAAA,4BAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAGO,IAAK,YAAA,qBAAAC,aAAL,KAAA;AACL,EAAAA,cAAA,sBAAuB,CAAA,GAAA,yBAAA;AACvB,EAAAA,cAAA,oBAAqB,CAAA,GAAA,uBAAA;AACrB,EAAAA,cAAA,mBAAoB,CAAA,GAAA,qBAAA;AAHV,EAAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA,CAAA;AAML,IAAM,4BAAwE,GAAA;AAAA,EACnF,CAAC,yBAAiC,8BAAG,EAAC;AAAA,EACtC,CAAC,mDAAkC;AAAA,IACjC,4CAAA;AAAA,IACA;AAAA;AAAA,IACA,GAAI,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,CAAA;AAAA,EACxC,CAAC,gDAAiC;AAAA,IAChC,4CAAA;AAAA,IACA;AAAA;AAAA,IACA,GAAI,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa;AAC1C,CAAA;AAEO,SAAS,yBAAyB,IAGtC,EAAA;AACD,EAAA,IAAI,CAAC,IAAQ,IAAA,IAAA,KAAS,MAAY,MAAA,IAAI,MAAM,qBAAqB,CAAA;AACjE,EAAI,IAAA;AACF,IAAM,MAAA,CAAC,MAAQ,EAAA,OAAO,CAAI,GAAAC,wBAAA;AAAA,MACxB,CAAC,EAAE,IAAM,EAAA,WAAA,IAAe,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,MAC7C;AAAA,KACF;AACA,IAAI,IAAA,MAAA,CAAO,MAAW,KAAA,OAAA,CAAQ,MAAQ,EAAA;AACpC,MAAM,MAAA,IAAI,MAAM,0BAA0B,CAAA;AAAA;AAE5C,IAAA,OAAO,MAAO,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,CAAO,MAAA,EAAE,KAAO,EAAA,CAAA,EAAG,MAAQ,EAAA,OAAA,CAAQ,CAAC,CAAA,EAAK,CAAA,CAAA;AAAA,WACxD,CAAG,EAAA;AACV,IAAM,MAAA,IAAI,MAAM,0CAA0C,CAAA;AAAA;AAE9D;AAEO,SAAS,wBAAwB,IAGrC,EAAA;AACD,EAAA,IAAI,CAAC,IAAQ,IAAA,IAAA,KAAS,MAAY,MAAA,IAAI,MAAM,qBAAqB,CAAA;AACjE,EAAI,IAAA;AACF,IAAM,MAAA,CAAC,WAAa,EAAA,OAAO,CAAI,GAAAA,wBAAA;AAAA,MAC7B,CAAC,EAAE,IAAM,EAAA,WAAA,IAAe,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,MAC7C;AAAA,KACF;AACA,IAAI,IAAA,WAAA,CAAY,MAAW,KAAA,OAAA,CAAQ,MAAQ,EAAA;AACzC,MAAM,MAAA,IAAI,MAAM,0BAA0B,CAAA;AAAA;AAE5C,IAAA,OAAO,WAAY,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,CAAO,MAAA,EAAE,UAAY,EAAA,CAAA,EAAG,MAAQ,EAAA,OAAA,CAAQ,CAAC,CAAA,EAAK,CAAA,CAAA;AAAA,WAClE,CAAG,EAAA;AACV,IAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA;AAAA;AAE7D;AAEO,SAAS,yBAAyB,UAGjC,EAAA;AACN,EAAO,OAAAC,wBAAA;AAAA,IACL,CAAC,EAAE,IAAM,EAAA,WAAA,IAAe,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,IAC7C,CAAC,UAAA,CAAW,MAAQ,EAAA,UAAA,CAAW,OAAO;AAAA,GACxC;AACF;AAEO,SAAS,wBAAwB,UAGhC,EAAA;AACN,EAAO,OAAAA,wBAAA;AAAA,IACL,CAAC,EAAE,IAAM,EAAA,WAAA,IAAe,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,IAC7C,CAAC,UAAA,CAAW,WAAa,EAAA,UAAA,CAAW,OAAO;AAAA,GAC7C;AACF;;;AC7EA,IAAA,aAAA,GAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,UAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACAO,SAAS,GAAA,CAAI,GAAW,CAAmB,EAAA;AAChD,EAAO,OAAA,CAAA,GAAI,IAAI,CAAI,GAAA,CAAA;AACrB;AAEO,SAAS,GAAA,CAAI,GAAW,CAAmB,EAAA;AAChD,EAAO,OAAA,CAAA,GAAI,IAAI,CAAI,GAAA,CAAA;AACrB;;;ACWO,UAAU,KAAA,CAASC,QAAiB,SAAmB,EAAA;AAC5D,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAIA,MAAM,CAAA,MAAA,EAAQ,KAAK,SAAW,EAAA;AAChD,IAAA,MAAMA,MAAM,CAAA,KAAA,CAAM,CAAG,EAAA,CAAA,GAAI,SAAS,CAAA;AAAA;AAEtC;;;ACrBA,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,SAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAaO,IAAM,SAAA,GAAN,MAAM,UAAA,SAA+D,KAAM,CAAA;AAAA,EAOhF,WACE,CAAA,YAAA,EACA,OAII,GAAA,EACJ,EAAA;AACA,IAAA,MAAM,WAAW,MAAM;AACrB,MAAI,IAAA,OAAA,CAAQ,iBAAiB,UAAW,EAAA;AACtC,QAAA,IAAI,OAAQ,CAAA,KAAA,CAAM,OAAS,EAAA,OAAO,QAAQ,KAAM,CAAA,OAAA;AAChD,QAAA,IAAI,OAAQ,CAAA,KAAA,CAAM,YAAc,EAAA,OAAO,QAAQ,KAAM,CAAA,YAAA;AAAA;AAEvD,MAAI,IAAA,OAAA,CAAQ,SAAS,SAAa,IAAA,OAAA,CAAQ,SAAS,OAAO,OAAA,CAAQ,MAAM,OAAY,KAAA,QAAA;AAClF,QAAA,OAAO,QAAQ,KAAM,CAAA,OAAA;AACvB,MAAA,IAAI,OAAQ,CAAA,KAAA,EAAO,OAAS,EAAA,OAAO,QAAQ,KAAM,CAAA,OAAA;AACjD,MAAA,OAAO,OAAQ,CAAA,OAAA;AAAA,KACd,GAAA;AAEH,IAAA,MAAM,OAAU,GAAA;AAAA,MACd,YAAgB,IAAA,oBAAA;AAAA,MAChB,GAAI,QAAQ,YAAe,GAAA,CAAC,IAAI,GAAG,OAAA,CAAQ,YAAY,CAAA,GAAI,EAAC;AAAA,MAC5D,GAAI,OAAU,GAAA,CAAC,EAAI,EAAA,OAAA,GAAU,YAAY,OAAO,CAAA,CAAA,GAAK,MAAS,CAAA,GAAI;AAAC,KACrE,CACG,OAAO,CAAC,CAAA,KAAM,OAAO,CAAM,KAAA,QAAQ,CACnC,CAAA,IAAA,CAAK,IAAI,CAAA;AAEZ,IAAM,KAAA,CAAA,OAAA,EAAS,QAAQ,KAAQ,GAAA,EAAE,OAAO,OAAQ,CAAA,KAAA,KAAU,MAAS,CAAA;AAjCrE,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAEA,IAAS,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,WAAA,CAAA;AA+Bd,IAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,KAAA;AACrB,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA;AAAA;AACtB,EAIA,KAAK,EAAuD,EAAA;AAC1D,IAAO,OAAA,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA;AAExB,CAAA;AAGA,SAAS,IAAA,CAAK,KAAc,EAAuD,EAAA;AACjF,EAAI,IAAA,EAAA,GAAK,GAAG,CAAA,EAAU,OAAA,GAAA;AACtB,EAAA,IAAI,GAAO,IAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,OAAW,IAAA,GAAA,IAAO,GAAI,CAAA,KAAA,EAAc,OAAA,IAAA,CAAK,GAAI,CAAA,KAAA,EAAO,EAAE,CAAA;AAC5F,EAAA,OAAO,KAAK,IAAO,GAAA,GAAA;AACrB;;;AHrDO,IAAM,UAAa,GAAA,CAAC,UAAY,EAAA,MAAA,EAAQ,4BAA4B,OAAO,CAAA;AAG3E,IAAM,OAAU,GAAA;AAAA,EACrB,QAAA,EAAU,MAAO,CAAAC,gBAAA,CAAa,EAAE,CAAA;AAAA,EAChC,IAAA,EAAM,MAAO,CAAAC,aAAA,CAAS,EAAE,CAAA;AAAA,EACxB,0BAA4B,EAAA,UAAA;AAAA,EAC5B,KAAO,EAAA;AAAA;AACT,CAAA;AAEO,IAAM,WAAW,IAAI,GAAA,CAAI,MAAO,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAkBtD,IAAM,kBAAkB,IAAI,GAAA,CAAI,MAAO,CAAA,OAAA,CAAQ,OAAO,CAAE,CAAA,GAAA,CAAI,CAAC,CAAC,KAAK,KAAK,CAAA,KAAM,CAAC,KAAO,EAAA,GAAG,CAAC,CAAC,CAAA;AAEpF,SAAS,SAAS,OAAgC,EAAA;AACvD,EAAA,MAAM,SAAY,GAAA,eAAA,CAAgB,GAAI,CAAA,OAAO,GAAG,WAAY,EAAA;AAC5D,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAO,OAAA,MAAA;AAAA;AAET,EAAA,OAAO,OAAO,SAAS,CAAA;AACzB;AAEO,IAAM,uBAAuB,MAAe;AACjD,EAAO,OAAA,CAAC,OAAO,QAAU,EAAA,MAAA,CAAO,MAAM,MAAO,CAAA,0BAA0B,CAAG,EAAA,MAAA,CAAO,KAAK,CAAA;AACxF,CAAA;AAEO,IAAM,MAAmC,GAAA;AAAA,EAC9C,QAAU,EAAA;AAAA,IACR,GAAGD,gBAAA;AAAA,IACH,IAAI,OAAQ,CAAA,QAAA;AAAA,IACZ,IAAM,EAAA,UAAA;AAAA,IACN,mBAAmB,IAAI,GAAA;AAAA,MACrB;AAAA,QACE,4CAAA;AAAA;AAAA,QACA;AAAA;AAAA,QACA,GAAI,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAwB;AAAA,KACrD;AAAA,IACA,MAAQ,EAAA,4CAAA;AAAA,IACR,UAAY,EAAA,4CAAA;AAAA,IACZ,OAAS,EAAA;AAAA,MACP,OAAS,EAAA,4CAAA;AAAA,MACT,eAAiB,EAAA,QAAA;AAAA,MACjB,aAAe,EAAA;AAAA,KACjB;AAAA,IACA,cAAgB,EAAA;AAAA,MACd,MAAQ,EAAA,4CAAA;AAAA,MACR,MAAQ,EAAA;AAAA;AACV,GACF;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,GAAGC,aAAA;AAAA,IACH,IAAI,OAAQ,CAAA,IAAA;AAAA,IACZ,IAAM,EAAA,MAAA;AAAA,IACN,mBAAmB,IAAI,GAAA;AAAA,MACrB;AAAA,QACE,4CAAA;AAAA;AAAA,QACA;AAAA;AAAA,QACA,GAAI,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAwB;AAAA,KACrD;AAAA,IACA,MAAQ,EAAA,4CAAA;AAAA,IACR,UAAY,EAAA,4CAAA;AAAA,IACZ,OAAS,EAAA;AAAA,MACP,OAAS,EAAA,4CAAA;AAAA,MACT,eAAiB,EAAA,QAAA;AAAA,MACjB,aAAe,EAAA;AAAA,KACjB;AAAA,IACA,cAAgB,EAAA;AAAA,MACd,MAAQ,EAAA,4CAAA;AAAA,MACR,MAAQ,EAAA;AAAA;AACV,GACF;AAAA,EACA,0BAA4B,EAAA;AAAA,IAC1B,GAAGD,gBAAA;AAAA,IACH,EAAA,EAAI,QAAQ,0BAA0B,CAAA;AAAA,IACtC,IAAM,EAAA,0BAAA;AAAA,IACN,mBAAmB,IAAI,GAAA;AAAA,MACrB;AAAA,QACE,4CAAA;AAAA;AAAA,QACA;AAAA;AAAA,QACA,GAAI,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAwB;AAAA,KACrD;AAAA,IACA,MAAQ,EAAA,4CAAA;AAAA;AAAA,IACR,UAAY,EAAA,4CAAA;AAAA,IACZ,OAAS,EAAA;AAAA,MACP,OAAS,EAAA,4CAAA;AAAA,MACT,eAAiB,EAAA,QAAA;AAAA,MACjB,aAAe,EAAA;AAAA,KACjB;AAAA,IACA,cAAgB,EAAA;AAAA,MACd,MAAQ,EAAA,4CAAA;AAAA,MACR,MAAQ,EAAA;AAAA;AACV,GACF;AAAA,EACA,KAAO,EAAA;AAAA,IACL,GAAGE,cAAA;AAAA,IACH,IAAI,OAAQ,CAAA,KAAA;AAAA,IACZ,IAAM,EAAA,OAAA;AAAA,IACN,mBAAmB,IAAI,GAAA;AAAA,MACrB;AAAA,QACE,4CAAA;AAAA;AAAA,QACA;AAAA;AAAA,QACA,GAAI,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAwB;AAAA,KACrD;AAAA,IACA,MAAQ,EAAA,4CAAA;AAAA,IACR,UAAY,EAAA,4CAAA;AAAA;AAAA,IACZ,OAAS,EAAA;AAAA,MACP,OAAS,EAAA,4CAAA;AAAA,MACT,eAAiB,EAAA,QAAA;AAAA,MACjB,aAAe,EAAA;AAAA,KACjB;AAAA,IACA,cAAgB,EAAA;AAAA,MACd,MAAQ,EAAA,4CAAA;AAAA,MACR,MAAQ,EAAA;AAAA;AACV;AAEJ,CAAA;AAIA,IAAM,cAAiB,GAAA,GAAA;AACvB,IAAM,kBAAqB,GAAA,IAAA;AAC3B,IAAM,gBAAmB,GAAA,GAAA;AACzB,IAAM,oBAAuB,GAAA,GAAA;AAE7B,gBAAuB,WAA8D,UAenF,EAAA;AACA,EAAM,MAAA;AAAA,IACJ,MAAA;AAAA,IACA,eAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAQ,GAAA,MAAA;AAAA,IACR,SAAS,EAAE,YAAA,GAAe,oBAAoB,WAAc,GAAA,oBAAA,KAAyB;AAAC,GACpF,GAAA,UAAA;AACJ,EAAA,IAAI,YAAe,GAAA,cAAA,EAAsB,MAAA,IAAI,sBAAsB,YAAY,CAAA;AAC/E,EAAA,IAAI,WAAc,GAAA,gBAAA,EAAwB,MAAA,IAAI,wBAAwB,WAAW,CAAA;AACjF,EAAA,IAAI,UAAU,KAAS,IAAA,cAAA,KAAmB,MAAW,EAAA,MAAM,IAAI,uBAAwB,EAAA;AAEvF,EAAM,MAAA,WAAA,GAAA,CAAe,MAAMC,gBAAA,CAAS,MAAQ,EAAA,EAAE,UAAU,QAAU,EAAA,mBAAA,EAAqB,KAAM,EAAC,CAC3F,EAAA,MAAA;AAEH,EAAA,IAAI,OAAU,GAAA,EAAA;AACd,EAAA,IAAI,KAAU,KAAA,KAAA;AACZ,IAAA,OAAA,GAAkB,IAAI,MAAO,CAAA,cAAe,IAAI,MAAO,CAAA,WAAW,GAAG,WAAW,CAAA;AAClF,EAAA,IAAI,KAAU,KAAA,MAAA;AACZ,IAAA,OAAA,GACE,mBAAmB,MACf,GAAA,WAAA,GACQ,IAAI,MAAO,CAAA,cAAe,GAAG,WAAW,CAAA;AAExD,EAAA,IAAI,SAAY,GAAA,EAAA;AAChB,EAAA,IAAI,UAAU,KAAO,EAAA,SAAA,GAAoB,IAAI,MAAO,CAAA,cAAe,GAAG,WAAW,CAAA;AACjF,EAAA,IAAI,KAAU,KAAA,MAAA;AACZ,IAAoB,SAAA,GAAA,GAAA,CAAI,OAAO,cAAkB,IAAA,OAAA,GAAU,OAAO,WAAW,CAAC,GAAG,EAAE,CAAA;AAErF,EAAI,IAAA,KAAA,KAAU,OAAyB,OAAA,GAAA,GAAA,CAAI,SAAS,SAAY,GAAA,MAAA,CAAO,WAAW,CAAC,CAAA;AACnF,EAAI,IAAA,KAAA,KAAU,QAA4B,SAAA,GAAA,GAAA,CAAI,WAAW,OAAU,GAAA,MAAA,CAAO,WAAW,CAAC,CAAA;AACtF,EAAA,IAAI,YAAY,OAAS,EAAA,MAAM,IAAI,sBAAA,CAAuB,WAAW,OAAO,CAAA;AAE5E,EAAA,IAAI,SAAY,GAAA,IAAA;AAChB,EAAA,OAAO,SAAW,EAAA;AAChB,IAAM,MAAA,IAAA,GAAO,MAAMC,eAAA,CAAQ,MAAQ,EAAA;AAAA,MACjC,OAAS,EAAA,eAAA;AAAA,MACT,KAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAK,IAAA,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA;AAClB,MAAI,IAAA,CAAA,CAAE,gBAAgB,CAAE,CAAA,WAAA;AACtB,QAAA,OAAO,KAAU,KAAA,KAAA,GACb,MAAO,CAAA,CAAA,CAAE,WAAc,GAAA,CAAA,CAAE,WAAW,CAAA,GACpC,MAAO,CAAA,CAAA,CAAE,WAAc,GAAA,CAAA,CAAE,WAAW,CAAA;AAC1C,MAAI,IAAA,CAAA,CAAE,qBAAqB,CAAE,CAAA,gBAAA;AAC3B,QAAO,OAAA,KAAA,KAAU,QACb,CAAE,CAAA,gBAAA,GAAmB,EAAE,gBACvB,GAAA,CAAA,CAAE,mBAAmB,CAAE,CAAA,gBAAA;AAC7B,MAAO,OAAA,KAAA,KAAU,QAAQ,CAAE,CAAA,QAAA,GAAW,EAAE,QAAW,GAAA,CAAA,CAAE,WAAW,CAAE,CAAA,QAAA;AAAA,KACnE,CAAA;AAED,IAAA,KAAA,MAAW,QAAY,IAAA,KAAA,CAAM,IAAM,EAAA,YAAY,CAAG,EAAA;AAChD,MAAI,IAAA,QAAA,CAAS,WAAW,CAAG,EAAA;AAC3B,MAAM,MAAA;AAAA,QACJ,IAAM,EAAA,QAAA;AAAA,QACN,WAAA,EACE,SAAS,MAAW,KAAA,YAAA;AAAA;AAAA,UAEhB,OAAO,QAAS,CAAA,QAAA,CAAS,MAAS,GAAA,CAAC,GAAG,WAAW;AAAA;AAAA;AAAA,UAEjD,UAAU,KACR,GAAA,MAAA,CAAO,OAAO,CAAA,GACd,OAAO,SAAS;AAAA;AAAA,OAC1B;AAAA;AAGF,IAAA,SAAA,GACE,UAAU,KACN,GAAA,OAAA,IAAW,cAAkB,IAAA,WAAA,CAAA,GAC7B,aAAa,cAAkB,IAAA,EAAA,CAAA;AAErC,IAAA,IAAI,UAAU,KAAO,EAAA;AACnB,MAAA,SAAA,GAAoB,GAAI,CAAA,MAAA,CAAO,OAAO,CAAA,GAAI,IAAI,WAAW,CAAA;AACzD,MAAA,OAAA,GAAkB,GAAI,CAAA,SAAA,GAAY,MAAO,CAAA,WAAW,GAAG,WAAW,CAAA;AAAA;AAGpE,IAAA,IAAI,UAAU,MAAQ,EAAA;AACpB,MAAM,MAAA,UAAA,GAAa,MAAO,CAAA,cAAA,IAAkB,CAAC,CAAA;AAC7C,MAAM,MAAA,UAAA,GAAa,OAAO,WAAW,CAAA;AACrC,MAAA,MAAM,WAAsB,GAAA,GAAA,CAAI,SAAY,GAAA,EAAA,EAAI,UAAU,CAAA;AAC1D,MAAA,MAAM,aAAwB,GAAA,GAAA,CAAI,WAAc,GAAA,UAAA,EAAY,UAAU,CAAA;AACtE,MAAU,OAAA,GAAA,WAAA;AACV,MAAY,SAAA,GAAA,aAAA;AAAA;AACd;AAGF,EAAA,MAAM,EAAE,IAAA,EAAM,EAAC,EAAG,WAAa,EAAA,KAAA,KAAU,KAAQ,GAAA,MAAA,CAAO,OAAO,CAAA,GAAI,MAAO,CAAA,SAAS,CAAE,EAAA;AACrF,EAAA;AACF;AAEO,IAAM,sBAAA,GAAN,cAA4C,SAAU,CAAA;AAAA,EAE3D,WAAA,CAAY,WAAmB,OAAiB,EAAA;AAC9C,IAAA,KAAA;AAAA,MACE,CAAA,gEAAA,EAAmE,SAAS,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA;AAAA,KAClG;AAJF,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,8BAAA,CAAA;AAAA;AAMlB,CAAA;AAEO,IAAM,uBAAA,GAAN,cAA6C,SAAU,CAAA;AAAA,EAE5D,YAAY,WAAqB,EAAA;AAC/B,IAAA,KAAA;AAAA,MACE,CAAA,iEAAA,EAAoE,gBAAgB,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAAA,KAC1G;AAJF,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,+BAAA,CAAA;AAAA;AAMlB,CAAA;AAEO,IAAM,qBAAA,GAAN,cAA2C,SAAU,CAAA;AAAA,EAE1D,YAAY,YAAsB,EAAA;AAChC,IAAA,KAAA;AAAA,MACE,CAAA,+DAAA,EAAkE,cAAc,CAAA,MAAA,EAAS,YAAY,CAAA,CAAA;AAAA,KACvG;AAJF,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,6BAAA,CAAA;AAAA;AAMlB,CAAA;AAEO,IAAM,uBAAA,GAAN,cAA6C,SAAU,CAAA;AAAA,EAE5D,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,yEAAyE,CAAA;AAFjF,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,+BAAA,CAAA;AAAA;AAIlB,CAAA;;;AIvSA,IAAA,kBAAA,GAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAAT,IAAAA,EAAAA,MAAAA;AAAA,CAAA,CAAA;ACGO,IAAM,YAAA,GAAe,CAAC,GAAA,EAAa,GAAyB,KAAA;AACjE,EAAI,IAAAU,UAAA,CAAM,GAAG,CAAA,EAAU,OAAA,GAAA;AAEvB,EAAA,GAAA,CAAI,QAAS,CAAA;AAAA,IACX,IAAM,EAAA,gBAAA;AAAA,IACN,KAAO,EAAA,GAAA;AAAA,IACP,MAAQ,EAAA,KAAA;AAAA,IACR,KAAO,EAAA;AAAA,GACR,CAAA;AAED,EAAS,OAAAC,aAAA,CAAA,KAAA;AACX,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,GAAA,EAAa,GAAyB,KAAA;AACrE,EAAA,IAAIb,eAAU,GAAI,CAAA,WAAA,EAAa,CAAG,EAAA,OAAO,IAAI,WAAY,EAAA;AAEzD,EAAA,GAAA,CAAI,QAAS,CAAA;AAAA,IACX,IAAM,EAAA,gBAAA;AAAA,IACN,KAAO,EAAA,GAAA;AAAA,IACP,MAAQ,EAAA,SAAA;AAAA,IACR,KAAO,EAAA;AAAA,GACR,CAAA;AAED,EAAS,OAAAa,aAAA,CAAA,KAAA;AACX,CAAA;;;AC3BA,IAAA,YAAA,GAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAAX,IAAAA,EAAAA,MAAAA;AAAA,CAAA,CAAA;AAMO,IAAM,OAAA,GAAU,CAAC,KAAA,EAAO,GAAK,EAAA,KAAA,EAAO,MAAM,IAAM,EAAA,KAAA,EAAO,KAAO,EAAA,KAAA,EAAO,IAAI,CAAA;AAEhF,IAAM,WAAA,GAAc,QAAQ,GAAI,CAAA,CAAC,SAAS,MAAO,CAAA,IAAA,GAAO,EAAM,IAAA,EAAE,CAAC,CAAA;AAO1D,SAASA,MAAK,IAA8B,EAAA;AACjD,EAAI,IAAA,OAAO,IAAS,KAAA,QAAA,IAAY,CAAC,WAAA,CAAY,QAAS,CAAA,IAAI,CAAG,EAAA,MAAM,IAAI,gBAAA,CAAiB,IAAI,CAAA;AAC5F,EAAI,IAAA,OAAO,IAAS,KAAA,QAAA,EAAiB,OAAA,IAAA;AACrC,EAAI,IAAA,OAAO,IAAS,KAAA,QAAA,IAAY,CAAC,OAAA,CAAQ,QAAS,CAAA,IAAI,CAAG,EAAA,MAAM,IAAI,kBAAA,CAAmB,IAAI,CAAA;AAC1F,EAAO,OAAA,MAAA,CAAO,IAAO,GAAA,EAAA,IAAM,EAAE,CAAA;AAC/B;AAMO,IAAM,kBAAA,GAAN,cAAwC,SAAU,CAAA;AAAA,EAEvD,YAAY,KAAe,EAAA;AACzB,IAAA,KAAA;AAAA,MACE,CAAA,6BAAA,EAAgC,KAAK,CAAA,wBAAA,EAA2B,OAAQ,CAAA,GAAA;AAAA,QACtE,CAAC,MAAW,KAAA,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,OACxB,CAAE,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA,KACd;AANF,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,yBAAA,CAAA;AAAA;AAQ3B,CAAA;AAEO,IAAM,gBAAA,GAAN,cAAsC,SAAU,CAAA;AAAA,EAErD,YAAY,KAAe,EAAA;AACzB,IAAA,KAAA;AAAA,MACE,CAAA,sBAAA,EAAyB,KAAK,CAAA,wBAAA,EAA2B,WAAY,CAAA,GAAA;AAAA,QACnE,CAAC,MAAW,KAAA,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,OACxB,CAAE,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA,KACd;AANF,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,uBAAA,CAAA;AAAA;AAQ3B,CAAA;AAEO,IAAM,aACVY,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CACvB,CAAA,MAAA;AAAA,EACC,CAAC,IAAS,KAAA;AACR,IAAI,IAAA;AACF,MAAAZ,MAAK,IAAI,CAAA;AACT,MAAO,OAAA,IAAA;AAAA,aACA,CAAG,EAAA;AACV,MAAO,OAAA,KAAA;AAAA;AACT,GACF;AAAA,EACA;AAAA,IACE,OAAO,MAAM;AACX,MAAO,OAAA,qGAAA;AAAA;AACT;AAEJ,CAAA,CACC,SAAU,CAAA,CAAC,IAASA,KAAAA,KAAAA,CAAK,IAAI,CAAC,CAAA;;;AFnD1B,IAAM,mBAAqBa,aAAO,CAAA,MAAA,CAAA;AAAA,EACvC,KAAS,EAAAA,aAAA,CAAA,MAAA,EAAS,CAAA,SAAA,CAAU,gBAAgB,CAAA;AAAA,EAC5C,MAAU,EAAAA,aAAA,CAAA,MAAA,EAAS,CAAA,SAAA,CAAU,gBAAgB,CAAA;AAAA,EAC7C,IAAW,EAAA;AACb,CAAC,CAAA;AAEM,IAAM,iBAAA,GACVA,aAAM,CAAA,KAAA,CAAA,gBAAgB,CACtB,CAAA,GAAA,CAAI,GAAG,EAAE,OAAA,EAAS,qCAAsC,EAAC,CACzD,CAAA,MAAA;AAAA,EACC,CAAC,WAAgB,KAAA;AACf,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,WAAA,CAAY,QAAQ,CAAK,EAAA,EAAA;AAC3C,MAAA,IAAI,WAAY,CAAA,CAAA,GAAI,CAAC,CAAA,CAAG,KAAM,CAAA,WAAA,EAAgB,GAAA,WAAA,CAAY,CAAC,CAAA,CAAG,KAAM,CAAA,WAAA,EAAe,EAAA;AACjF,QAAO,OAAA,KAAA;AAAA;AACT;AAEF,IAAO,OAAA,IAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,OAAS,EAAA;AAAA;AAEb,CACC,CAAA,MAAA;AAAA,EACC,CAAC,WAAgB,KAAA;AACf,IAAM,MAAA,YAAA,uBAAmB,GAAY,EAAA;AACrC,IAAA,KAAA,MAAW,cAAc,WAAa,EAAA;AACpC,MAAM,MAAA,YAAA,GAAe,UAAW,CAAA,KAAA,CAAM,WAAY,EAAA;AAClD,MAAI,IAAA,YAAA,CAAa,GAAI,CAAA,YAAY,CAAG,EAAA;AAClC,QAAO,OAAA,KAAA;AAAA;AAET,MAAA,YAAA,CAAa,IAAI,YAAY,CAAA;AAAA;AAE/B,IAAO,OAAA,IAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,OAAS,EAAA;AAAA;AAEb,CAAA;AAEK,IAAMb,KAAAA,GAAO,CAAC,UAAiD,KAAA;AACpE,EAAO,OAAA;AAAA,IACL,KAAA,EAAO,UAAW,CAAA,KAAA,CAAM,WAAY,EAAA;AAAA,IACpC,IAAA,EAAWA,KAAK,CAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IAC/B,MAAA,EAAQ,UAAW,CAAA,MAAA,CAAO,WAAY;AAAA,GACxC;AACF,CAAA;;;AG3DA,IAAA,iBAAA,GAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,8BAAA,EAAA,MAAA,8BAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,kCAAA,EAAA,MAAA,kCAAA;AAAA,EAAA,+BAAA,EAAA,MAAA,+BAAA;AAAA,EAAA,+BAAA,EAAA,MAAA,+BAAA;AAAA,EAAA,2BAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA4CO,SAAS,gBAAA,CAAiB,MAAgB,EAAA,WAAA,EAAqB,IAAsB,EAAA;AAC1F,EAAA,MAAM,qBAAqB,GAAO,IAAA,GAAA;AAClC,EAAA,MAAM,YAAY,GAAO,IAAA,GAAA;AAEzB,EAAM,MAAA,gBAAA,GAAoB,SAAS,WAAe,GAAA,kBAAA;AAClD,EAAM,MAAA,OAAA,GAAW,mBAAmB,IAAQ,GAAA,SAAA;AAE5C,EAAO,OAAA,OAAA;AACT;AAKO,SAAS,sBAAsB,UAI3B,EAAA;AACT,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,KAAA,EAAU,GAAA,UAAA;AACjC,EAAO,OAAA,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,OAAA,CAAQ,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA,QAAA,CAAA,CAAW,WAAY,EAAA;AACtE;AAKO,SAAS,wBAAwB,UAI7B,EAAA;AACT,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,KAAA,EAAU,GAAA,UAAA;AACjC,EAAO,OAAA,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,OAAA,CAAQ,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA,UAAA,CAAA,CAAa,WAAY,EAAA;AACxE;AAMO,SAAS,gCAAgC,UAMrC,EAAA;AACT,EAAA,MAAM,EAAE,IAAM,EAAA,OAAA,EAAS,cAAAc,aAAc,EAAA,KAAA,EAAO,WAAc,GAAA,UAAA;AAC1D,EAAA,OAAO,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,OAAA,CAAQ,QAAS,EAAC,CAAIA,CAAAA,EAAAA,aAAY,CAAI,CAAA,EAAA,KAAK,CAAI,CAAA,EAAA,SAAS,uBAAuB,WAAY,EAAA;AAC/G;AAOO,SAAS,mCAAmC,UAKxC,EAAA;AACT,EAAA,MAAM,EAAE,IAAM,EAAA,OAAA,EAAS,YAAAA,EAAAA,aAAAA,EAAc,OAAU,GAAA,UAAA;AAC/C,EAAO,OAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAQ,CAAA,QAAA,EAAU,CAAA,CAAA,EAAIA,aAAY,CAAA,CAAA,EAAI,KAAK,CAAA,sBAAA,CAAA,CAAyB,WAAY,EAAA;AACpG;AAKO,SAAS,+BAA+B,UAKpC,EAAA;AACT,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,KAAA,EAAO,WAAc,GAAA,UAAA;AAC5C,EAAA,OAAO,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,OAAA,CAAQ,QAAS,EAAC,CAAI,CAAA,EAAA,KAAK,CAAI,CAAA,EAAA,SAAS,CAAmC,CAAA,EAAA,uBAAA,0BAAA,CAAA,CAAG,WAAY,EAAA;AAC9G;AAKO,SAAS,mBAAmB,UAIxB,EAAA;AACT,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,YAAA,EAAAA,eAAiB,GAAA,UAAA;AACxC,EAAO,OAAA,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,OAAA,CAAQ,UAAU,CAAA,CAAA,EAAIA,aAAY,CAAA,KAAA,CAAA,CAAQ,WAAY,EAAA;AAC1E;AAKO,SAAS,gCAAgC,UAIrC,EAAA;AACT,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,KAAA,EAAU,GAAA,UAAA;AACjC,EAAO,OAAA,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,OAAA,CAAQ,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA,oBAAA,CAAA,CAAuB,WAAY,EAAA;AAClF;AAKO,SAAS,4BAA4B,UAIjC,EAAA;AACT,EAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,QAAA,EAAa,GAAA,UAAA;AACrC,EAAO,OAAA,CAAA,EAAG,KAAK,CAAI,CAAA,EAAA,OAAA,CAAQ,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,eAAA,CAAA,CAAkB,WAAY,EAAA;AACjF;AAKO,SAAS,8BAA8B,UAGnC,EAAA;AACT,EAAM,MAAA,EAAE,OAAS,EAAA,QAAA,EAAa,GAAA,UAAA;AAC9B,EAAA,OAAO,GAAG,OAAQ,CAAA,QAAA,EAAU,CAAI,CAAA,EAAA,QAAQ,oBAAoB,WAAY,EAAA;AAC1E;;;ACtKA,IAAA,gBAAA,GAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAAC,kBAAAA,EAAAA,MAAAA,mBAAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAAf,IAAAA,EAAAA,MAAAA;AAAA,CAAA,CAAA;AASO,IAAM,cACV,GAAAgB,aAAA,CAAA,MAAA,EACA,CAAA,GAAA,EACA,CAAA,MAAA;AAAA,EACC,CAAC,QAAa,KAAA;AACZ,IAAI,IAAA;AACF,MAAAhB,MAAK,QAAQ,CAAA;AACb,MAAO,OAAA,IAAA;AAAA,aACA,EAAI,EAAA;AACX,MAAO,OAAA,KAAA;AAAA;AACT,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,CAAC,KAAU,KAAA;AAChB,MAAI,IAAA;AACF,QAAA,MAAM,YAAe,GAAA,IAAI,IAAM,CAAA,KAAA,CAAM,QAAmB,GAAI,CAAA;AAC5D,QAAA,OAAO,0BAA0B,YAAY,CAAA,oGAAA,CAAA;AAAA,eACtC,CAAG,EAAA;AACV,QAAO,OAAA,CAAA,uBAAA,EAA0B,MAAM,KAAK,CAAA,oGAAA,CAAA;AAAA;AAC9C;AACF;AAEJ,CACC,CAAA,SAAA,CAAU,CAAC,QAAA,KAAa,QAAoB,CAAA;AAE/C,IAAM,eAAkB,GAAA;AAAA,EACtB,WAAA,EAAa,MAAM,SAAU,EAAA;AAAA,EAC7B,gBAAA,EAAkB,MAAM,aAAc,EAAA;AAAA,EACtC,YAAA,EAAc,MAAM,UAAW,EAAA;AAAA,EAC/B,iBAAA,EAAmB,MAAM,cAAe,EAAA;AAAA,EACxC,cAAA,EAAgB,MAAM,YAAa,EAAA;AAAA,EACnC,mBAAA,EAAqB,MAAM,gBAAiB;AAC9C,CAAA;AAUO,SAASA,MAAK,EAA+B,EAAA;AAClD,EAAI,IAAA,OAAO,OAAO,QAAU,EAAA;AAC1B,IAAA,IAAI,EAAM,IAAA,eAAA,EAAwB,OAAA,eAAA,CAAgB,EAAE,CAAE,EAAA;AACtD,IAAM,MAAA,IAAIe,oBAAmB,EAAE,CAAA;AAAA;AAGjC,EAAA,IAAI,OAAO,EAAO,KAAA,QAAA,IAAY,KAAK,IAAM,EAAA,MAAM,IAAI,kBAAmB,EAAA;AAEtE,EAAI,IAAA,CAAC,MAAO,CAAA,MAAA,CAAO,eAAe,CAAA,CAAE,KAAK,CAAC,MAAA,KAAW,MAAO,EAAA,KAAM,EAAE,CAAA;AAClE,IAAM,MAAA,IAAI,iBAAiB,EAAE,CAAA;AAE/B,EAAO,OAAA,EAAA;AACT;AAQA,IAAM,SAAA,GAAY,MAAgB,YAAA,CAAa,CAAC,CAAA;AAGhD,IAAM,aAAA,GAAgB,MAAgB,YAAA,CAAa,CAAC,CAAA;AAGpD,IAAM,UAAa,GAAA,MACjB,iBAAkB,CAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,cAAe,EAAA,EAAA,iBAAO,IAAA,IAAA,EAAO,EAAA,WAAA,EAAa,CAAA;AAGzE,IAAM,cAAiB,GAAA,MACrB,iBAAkB,CAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,cAAe,EAAA,EAAA,iBAAO,IAAA,IAAA,EAAO,EAAA,WAAA,KAAgB,CAAC,CAAA;AAG7E,IAAM,YAAA,GAAe,MAAgB,mBAAA,CAAoB,CAAC,CAAA;AAG1D,IAAM,gBAAA,GAAmB,MAAgB,mBAAA,CAAoB,CAAC,CAAA;AAE9D,IAAM,YAAA,GAAe,CAAC,UAAA,GAAa,CAAgB,KAAA;AACjD,EAAME,MAAAA,IAAAA,uBAAU,IAAK,EAAA;AACrB,EAAA,MAAM,WAAW,IAAI,IAAA;AAAA,IACnB,IAAA,CAAK,GAAIA,CAAAA,IAAAA,CAAI,cAAe,EAAA,EAAGA,IAAI,CAAA,WAAA,EAAeA,EAAAA,IAAAA,CAAI,UAAW,EAAA,EAAG,EAAE;AAAA,GACxE;AAGA,EAAA,IAAI,eAAmB,GAAA,CAAA,CAAA,GAAI,QAAS,CAAA,SAAA,KAAc,CAAK,IAAA,CAAA;AAGvD,EAAA,IAAI,oBAAoB,CAAKA,IAAAA,IAAAA,CAAI,SAAa,IAAA,QAAA,CAAS,SAAW,EAAA;AAChE,IAAkB,eAAA,GAAA,CAAA;AAAA;AAGpB,EAAM,MAAA,MAAA,GAAS,IAAI,IAAA,CAAK,QAAQ,CAAA;AAChC,EAAA,MAAA,CAAO,WAAW,MAAO,CAAA,UAAA,EAAe,GAAA,eAAA,GAAkB,aAAa,CAAC,CAAA;AACxE,EAAQ,OAAA,MAAA,CAAO,SAAY,GAAA,GAAA;AAC7B,CAAA;AAEA,IAAM,iBAAA,GAAoB,CAAC,IAAA,EAAc,KAA4B,KAAA;AACnE,EAAM,MAAA,iBAAA,GAAoB,IAAI,IAAA,CAAK,IAAK,CAAA,GAAA,CAAI,MAAM,KAAQ,GAAA,CAAA,EAAG,CAAG,EAAA,EAAE,CAAC,CAAA;AAEnE,EAAO,OAAA,iBAAA,CAAkB,SAAU,EAAA,KAAM,CAAG,EAAA;AAC1C,IAAA,iBAAA,CAAkB,UAAW,CAAA,iBAAA,CAAkB,UAAW,EAAA,GAAI,CAAC,CAAA;AAAA;AAGjE,EAAA,MAAM,WAAW,iBAAkB,CAAA,UAAA,CAAW,iBAAkB,CAAA,UAAA,EAAY,CAAI,GAAA,GAAA;AAEhF,EAAO,OAAA,QAAA;AACT,CAAA;AAEA,IAAM,mBAAA,GAAsB,CAAC,aAAA,GAAgB,CAAgB,KAAA;AAC3D,EAAMA,MAAAA,IAAAA,uBAAU,IAAK,EAAA;AACrB,EAAA,MAAM,eAAe,IAAK,CAAA,KAAA,CAAMA,KAAI,WAAY,EAAA,GAAI,CAAC,CAAI,GAAA,aAAA;AACzD,EAAA,MAAM,OAAOA,IAAI,CAAA,cAAA,KAAmB,IAAK,CAAA,KAAA,CAAM,eAAe,CAAC,CAAA;AAC/D,EAAA,MAAM,UAAU,YAAe,GAAA,CAAA;AAC/B,EAAM,MAAA,SAAA,GAAY,UAAU,CAAI,GAAA,CAAA;AAChC,EAAO,OAAA,iBAAA,CAAkB,MAAM,SAAS,CAAA;AAC1C,CAAA;AAEO,IAAM,kBAAA,GAAN,cAAwC,SAAU,CAAA;AAAA,EAEvD,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,mEAAmE,CAAA;AAF3E,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,6BAAA,CAAA;AAAA;AAI3B,CAAA;AAEO,IAAM,gBAAA,GAAN,cAAsC,SAAU,CAAA;AAAA,EAErD,YAAY,KAAe,EAAA;AACzB,IAAA,KAAA;AAAA,MACE,CAAA,+BAAA,EAAkC,KAAK,CAAA,wBAAA,EAA2B,MAAO,CAAA,MAAA;AAAA,QACvE;AAAA,OACF,CACG,GAAI,CAAA,CAAC,MAAW,KAAA,CAAA,CAAA,EAAI,MAAO,EAAC,CAAG,CAAA,CAAA,CAAA,CAC/B,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA,KACf;AARF,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,2BAAA,CAAA;AAAA;AAU3B,CAAA;AAEO,IAAMF,mBAAAA,GAAN,cAAwC,SAAU,CAAA;AAAA,EAEvD,YAAY,KAAe,EAAA;AACzB,IAAA,KAAA;AAAA,MACE,CAAA,iCAAA,EAAoC,KAAK,CAAA,wBAAA,EAA2B,MAAO,CAAA,IAAA;AAAA,QACzE;AAAA,OACF,CACG,GAAI,CAAA,CAAC,MAAW,KAAA,CAAA,CAAA,EAAI,MAAM,CAAG,CAAA,CAAA,CAAA,CAC7B,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA,KACf;AARF,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,6BAAA,CAAA;AAAA;AAU3B,CAAA;;;ACjKA,IAAA,kBAAA,GAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,4BAAA,EAAA,MAAA,4BAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAAf,IAAAA,EAAAA,MAAAA,KAAAA;AAAA,EAAA,aAAAkB,EAAAA,MAAAA,cAAAA;AAAA,EAAA,EAAA,EAAA,MAAA,EAAA;AAAA,EAAA,MAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAqBO,IAAM,mBAAqBC,aAAO,CAAA,MAAA,CAAA;AAAA,EACvC,OAAA,EAAWA,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAIC,eAAU,CAAA;AAAA,EAC1D,SAAa,EAAAD,aAAA,CAAA,MAAA,EAAS,CAAA,SAAA,CAAU,gBAAgB,CAAA;AAAA,EAChD,WAAwB,EAAA,iBAAA;AAAA,EACxB,QAAmB,EAAA;AACrB,CAAC,CAAA;AAyBM,SAASnB,MAAK,UAA8C,EAAA;AACjE,EAAI,IAAA;AACF,IAAM,MAAA,gBAAA,GAAmB,iBAAiB,KAAM,CAAA;AAAA,MAC9C,GAAG,UAAA;AAAA,MACH,QAAA,EAAmBA,KAAK,CAAA,UAAA,CAAW,QAAQ;AAAA,KAC5C,CAAA;AAED,IAAO,OAAA;AAAA,MACL,SAAS,gBAAiB,CAAA,OAAA;AAAA,MAC1B,SAAA,EAAW,gBAAiB,CAAA,SAAA,CAAU,WAAY,EAAA;AAAA,MAClD,WAAa,EAAA,gBAAA,CAAiB,WAAY,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,KAAM,CAAA,aAAA,CAAc,CAAE,CAAA,KAAK,CAAC,CAAA;AAAA,MACvF,UAAU,gBAAiB,CAAA;AAAA,KAC7B;AAAA,WACO,KAAgB,EAAA;AACvB,IAAM,MAAA,IAAI,uBAAuB,KAA2B,CAAA;AAAA;AAEhE;AAyBO,SAASkB,eAAc,KAA2D,EAAA;AACvF,EAAOlB,OAAAA,KAAAA,CAAY,aAA0B,CAAA,KAAK,CAAC,CAAA;AACrD;AAsBO,SAAS,GAAG,UAA0C,EAAA;AAC3D,EAAA,IAAI,SAAY,GAAA,EAAA;AAChB,EAAW,KAAA,MAAA,UAAA,IAAc,WAAW,WAAa,EAAA;AAC/C,IAAM,MAAA,QAAA,GAAW,UAAW,CAAA,KAAA,CAAM,WAAY,EAAA;AAC9C,IAAA,IAAI,SAAS,aAAc,CAAA,SAAS,IAAI,CAAG,EAAA,MAAM,IAAI,4BAA6B,EAAA;AAClF,IAAY,SAAA,GAAA,QAAA;AAAA;AAGd,EAAO,OAAAqB,cAAA;AAAA,IACLlB,wBAAAA;AAAA,MACE;AAAA,QACE,EAAE,MAAM,SAAU,EAAA;AAAA,QAClB,EAAE,MAAM,SAAU,EAAA;AAAA,QAClB;AAAA,UACE,IAAM,EAAA,SAAA;AAAA,UACN,UAAY,EAAA;AAAA,YACV,EAAE,IAAA,EAAM,SAAW,EAAA,IAAA,EAAM,OAAQ,EAAA;AAAA,YACjC,EAAE,IAAA,EAAM,SAAW,EAAA,IAAA,EAAM,MAAO,EAAA;AAAA,YAChC,EAAE,IAAA,EAAM,SAAW,EAAA,IAAA,EAAM,QAAS;AAAA;AACpC,SACF;AAAA,QACA,EAAE,MAAM,SAAU;AAAA,OACpB;AAAA,MACA;AAAA,QACE,UAAW,CAAA,OAAA;AAAA,QACX,UAAA,CAAW,UAAU,WAAY,EAAA;AAAA,QACjC,UAAW,CAAA,WAAA,CAAY,GAAI,CAAA,CAAC,CAAO,MAAA;AAAA,UACjC,KAAA,EAAO,CAAE,CAAA,KAAA,CAAM,WAAY,EAAA;AAAA,UAC3B,MAAM,CAAE,CAAA,IAAA;AAAA,UACR,MAAA,EAAQ,CAAE,CAAA,MAAA,CAAO,WAAY;AAAA,SAC7B,CAAA,CAAA;AAAA,QACF,MAAA,CAAO,WAAW,QAAQ;AAAA;AAC5B;AACF,GACF;AACF;AAiBO,SAAS,MAA4B,GAAA;AAC1C,EAAA,OAAOH,KAAK,CAAA;AAAA,IACV,OAAS,EAAA,EAAA;AAAA,IACT,SAAW,EAAAsB,4BAAA,CAAoBC,2BAAmB,EAAC,CAAE,CAAA,OAAA;AAAA,IACrD,WAAa,EAAA;AAAA,MACAvB,KAAK,CAAA;AAAA,QACd,KAAO,EAAAsB,4BAAA,CAAoBC,2BAAmB,EAAC,CAAE,CAAA,OAAA;AAAA,QACjD,MAAQ,EAAAD,4BAAA,CAAoBC,2BAAmB,EAAC,CAAE,CAAA,OAAA;AAAA,QAClD,IAAM,EAAA;AAAA,OACP;AAAA,KACH;AAAA,IACA,QAAA,EAAmBvB,MAAK,qBAAqB;AAAA,GAC9C,CAAA;AACH;AAMO,IAAM,sBAAA,GAAN,cAA4C,SAA8B,CAAA;AAAA,EAE/E,YAAY,KAA2B,EAAA;AACrC,IAAA,KAAA,CAAM,qBAAuB,EAAA,EAAE,KAAO,EAAA,KAAA,EAAO,CAAA;AAF/C,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,mCAAA,CAAA;AAAA;AAI3B,CAAA;AAEO,IAAM,4BAAA,GAAN,cAAkD,SAAU,CAAA;AAAA,EAEjE,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,uDAAuD,CAAA;AAF/D,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,yCAAA,CAAA;AAAA;AAI3B,CAAA;;;ACvMA,IAAA,aAAA,GAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAAA,IAAAA,EAAAA,MAAAA,KAAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAAkB,aAAAA,EAAAA,MAAAA,cAAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAAM,MAAAA,EAAAA,MAAAA,OAAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAAC,WAAAA,EAAAA,MAAAA,YAAAA;AAAA,EAAA,KAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,aAAA,GAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,IAAA,EAAA,MAAA,YAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,IAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACAO,IAAM,QAAQ,OAAU,EAAA,EAAsB,QAAW,GAAA,CAAA,EAAG,UAAU,EAAmB,KAAA;AAC9F,EAAI,IAAA,OAAA;AACJ,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,QAAA,EAAU,CAAK,EAAA,EAAA;AACjC,IAAI,IAAA;AACF,MAAA,OAAO,MAAM,EAAG,EAAA;AAAA,aACT,GAAK,EAAA;AACZ,MAAU,OAAA,GAAA,GAAA;AACV,MAAI,IAAA,CAAA,GAAI,QAAW,GAAA,CAAA,EAAS,MAAA,IAAI,OAAQ,CAAA,CAAC,CAAM,KAAA,UAAA,CAAW,CAAG,EAAA,OAAO,CAAC,CAAA;AAAA;AACvE;AAEF,EAAM,MAAA,OAAA;AACR,CAAA;;;ACAA,eAAsB,eAAwB,UAOvB,EAAA;AACrB,EAAA,MAAM,EAAE,MAAQ,EAAA,KAAA,EAAO,WAAW,aAAe,EAAA,YAAA,EAAc,aAAgB,GAAA,UAAA;AAC/E,EAAA,MAAM,UAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,UAAc,IAAA,KAAA,CAAM,KAAO,EAAA,SAAS,CAAG,EAAA;AAChD,IAAA,MAAM,eAAe,MAAM,KAAA;AAAA,MACzB,MACE,OAAO,SAAU,CAAA;AAAA,QACf,YAAc,EAAA,KAAA;AAAA,QACd,SAAW,EAAA,UAAA;AAAA,QACX,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB;AAAC,OACtC,CAAA;AAAA,MACH,aAAA;AAAA,MACA;AAAA,KACF;AACA,IAAQ,OAAA,CAAA,IAAA,CAAK,GAAI,YAA0B,CAAA;AAAA;AAG7C,EAAO,OAAA,OAAA;AACT;;;AChCO,SAAS,KACd,MACA,EAAA;AACA,EAAA,OAAO,MACJ,mBAAmB;AAClB,IAAA,IAAI,MAAS,GAAA,IAAA;AACb,IAAA,IAAI,WAAmC,GAAA,IAAA;AACvC,IAAA,MAAM,QAAa,EAAC;AAEpB,IAAA,MAAMC,KAAO,GAAA,MACX,IAAI,OAAA,CAAc,CAAC,OAAY,KAAA;AAC7B,MAAc,WAAA,GAAA,OAAA;AAAA,KACf,CAAA;AAEH,IAAM,MAAA,IAAA,GAAO,CAAC,IAAY,KAAA;AACxB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAc,WAAA,IAAA;AACd,MAAc,WAAA,GAAA,IAAA;AAAA,KAChB;AAEA,IAAA,IAAI,MAAiC,GAAA,IAAA;AACrC,IAAA,MAAM,OAAO,MAAM;AACjB,MAAS,MAAA,GAAA,KAAA;AAET,MAAS,MAAA,IAAA;AACT,MAAc,WAAA,IAAA;AACd,MAAc,WAAA,GAAA,IAAA;AAAA,KAChB;AAEA,IAAA,MAAA,GAAS,MAAO,CAAA,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA;AAE9B,IAAI,IAAA;AACF,MAAA,OAAO,MAAQ,EAAA;AACb,QAAA,IAAI,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA,MAAMA,KAAK,EAAA;AACnC,QAAA,OAAO,MAAM,MAAS,GAAA,CAAA,IAAK,MAAQ,EAAA,MAAM,MAAM,KAAM,EAAA;AAAA;AACvD,KACA,SAAA;AACA,MAAK,IAAA,EAAA;AAAA;AACP,GACC,EAAA;AACP;;;AC7CA,eAAsB,KAAK,IAAc,EAAA;AACvC,EAAA,OAAO,IAAI,OAAQ,CAAA,CAAC,QAAQ,UAAW,CAAA,GAAA,EAAK,IAAI,CAAC,CAAA;AACnD;;;ACGO,SAAS,IACd,CAAA,EAAA,EACA,EAAE,QAAA,EACF,EAAA;AACA,EAAA,IAAI,MAAS,GAAA,IAAA;AACb,EAAM,MAAA,OAAA,GAAU,MAAO,MAAS,GAAA,KAAA;AAEhC,EAAA,MAAMC,SAAQ,YAAY;AACxB,IAAA,MAAM,KAAK,QAAQ,CAAA;AAEnB,IAAA,MAAMC,QAAO,YAAY;AACvB,MAAA,IAAI,CAAC,MAAQ,EAAA;AACb,MAAA,MAAM,EAAG,CAAA,EAAE,MAAQ,EAAA,OAAA,EAAS,CAAA;AAC5B,MAAA,MAAM,KAAK,QAAQ,CAAA;AACnB,MAAAA,KAAK,EAAA;AAAA,KACP;AAEA,IAAAA,KAAK,EAAA;AAAA,GACP;AAEA,EAAAD,MAAM,EAAA;AAEN,EAAO,OAAA,OAAA;AACT;;;AC5BA,IAAA,YAAA,GAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAAE,GAAAA,EAAAA,MAAAA,IAAAA;AAAA,EAAA,GAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAO,SAAS,GAAc,GAAA;AAC5B,EAAA,OAAO,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,KAAQ,GAAI,CAAA;AACrC;AAEO,SAASA,IAAc,GAAA;AAC5B,EAAO,OAAA,MAAA;AACT;;;APuDO,IAAM,eACV,GAAAC,aAAA,CAAA,MAAA,EACA,CAAA,KAAA,CAAM,qBAAuB,EAAA;AAAA,EAC5B,OAAS,EAAA;AACX,CAAC,CAAA,CACA,UAAU,YAAY,CAAA;AAElB,IAAM,WAAA,GAAc,CAAC,UAAwC,KAAA;AAClE,EAAA,MAAM,EAAE,QAAA,GAAW,KAAM,EAAA,GAAI,cAAc,EAAC;AAC5C,EAAMb,MAAAA,IAAAA,GAAM,aAAK,GAAI,EAAA;AAErB,EAAA,IAAI,OAASa,aAAO,CAAA,MAAA,CAAA;AAAA,IAClB,QAAY,EAAAA,aAAA,CAAA,MAAA,EAAS,CAAA,SAAA,CAAU,gBAAgB,CAAA;AAAA,IAC/C,MAAA,EAAUA,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAIV,eAAU,CAAA;AAAA,IACzD,IAAA,EAAQU,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAIV,eAAU,CAAA;AAAA,IACvD,QAAmB,EAAA,cAAA;AAAA,IACnB,MACG,EAAAU,aAAA,CAAA,MAAA,EACA,CAAA,GAAA,GACA,GAAIb,CAAAA,IAAAA,EAAK,EAAE,OAAA,EAAS,qCAAsC,EAAC,CAC3D,CAAA,GAAA,CAAI,OAAO,gBAAgB,CAAA;AAAA,IAC9B,OAASa,aAAO,CAAA,MAAA,EAAA,CAAE,KAAM,CAAA,GAAA,CAAI,OAAO,gBAAgB,CAAA;AAAA,IACnD,KAAA,EAASA,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAIV,eAAU,CAAA;AAAA,IACxD,KAAOU,aAAQ,CAAA,OAAA,EAAA;AAAA,IACf,OAAA,EAAWA,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAIV,eAAU,CAAA;AAAA,IAC1D,SAAa,EAAAU,aAAA,CAAA,MAAA,EAAS,CAAA,SAAA,CAAU,gBAAgB,CAAA;AAAA,IAChD,WAAwB,EAAA,iBAAA;AAAA,IACxB,UAAYA,aAAO,CAAA,MAAA,CAAA;AAAA,MACjB,OAAW,EAAAA,aAAA,CAAA,MAAA,EAAS,CAAA,SAAA,CAAU,gBAAgB,CAAA;AAAA,MAC9C,IAAQ,EAAAA,aAAA,CAAA,MAAA,EAAS,CAAA,SAAA,CAAU,YAAY,CAAA;AAAA,MACvC,QAAA,EAAYA,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAIV,eAAU;AAAA,KAC5D,CAAA;AAAA,IACD,QAAA,EAAYU,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAIV,eAAU,CAAA;AAAA,IAC3D,aAAeU,aAAO,CAAA,MAAA,EAAA,CAAE,KAAM,CAAA,GAAA,CAAI,OAAO,gBAAgB,CAAA;AAAA,IACzD,SACG,EAAAA,aAAA,CAAA,MAAA,EACA,CAAA,KAAA,CAAM,sBAAwB,EAAA;AAAA,MAC7B,OAAS,EAAA;AAAA,KACV,CAAA,CACA,SAAU,CAAA,YAAY,EACtB,QAAS;AAAA,GACb,CAAA;AAED,EAAI,IAAA,CAAC,UAAiB,IAAA,GAAA,IAAA,CAAK,OAAO,EAAE,IAAA,EAAM,iBAAiB,CAAA;AAE3D,EAAA,OAAO,KACJ,MAAO,CAAA,CAAC,SAAS,IAAK,CAAA,KAAA,GAAQ,KAAK,MAAQ,EAAA;AAAA,IAC1C,OAAS,EAAA,6BAAA;AAAA,IACT,IAAA,EAAM,CAAC,OAAO;AAAA,GACf,EACA,MAAO,CAAA,CAAC,SAAS,IAAK,CAAA,MAAA,IAAU,KAAK,QAAU,EAAA;AAAA,IAC9C,OAAS,EAAA,iCAAA;AAAA,IACT,IAAA,EAAM,CAAC,QAAQ;AAAA,GAChB,CAAA;AACL,CAAA;AAQO,SAAS9B,MAAK,KAAmC,EAAA;AACtD,EAAI,IAAA;AACF,IAAM,MAAA,WAAA,GAAc,YAAY,EAAE,QAAA,EAAU,MAAM,CAAA,CAAE,MAAM,KAAK,CAAA;AAC/D,IAAA,MAAM,UAAa,GAAA,eAAA,CAAgB,KAAM,CAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAE1D,IAAO,OAAA;AAAA,MACL,GAAG,WAAA;AAAA,MACH,IAAM,EAAA;AAAA,KACR;AAAA,WACO,KAAgB,EAAA;AACvB,IAAM,MAAA,IAAI,kBAAkB,KAA2B,CAAA;AAAA;AAE3D;AAYO,SAASkB,eAAc,KAAiD,EAAA;AAC7E,EAAOlB,OAAAA,KAAAA,CAAY,aAAmC,CAAA,KAAK,CAAC,CAAA;AAC9D;AAOO,SAASyB,aAAY,KAAmC,EAAA;AAC7D,EAAA,OAAc,YAAY,KAAK,CAAA;AACjC;AASO,SAASD,OAAgB,GAAA;AAC9B,EAAA,MAAM,SAAYF,GAAAA,4BAAAA,CAAoBC,2BAAmB,EAAC,CAAE,CAAA,OAAA;AAE5D,EAAM,MAAA,QAAA,GAAoBvB,MAAK,cAAc,CAAA;AAC7C,EAAM,MAAA,MAAA,GAAkBA,KAAK,CAAA,aAAa,CAAI,GAAA,CAAA;AAC9C,EAAM,MAAA,IAAA,GAAYA,MAAK,KAAK,CAAA;AAC5B,EAAA,MAAM,QAAQA,KAAK,CAAA;AAAA,IACjB,QAAUsB,EAAAA,4BAAAA,CAAoBC,2BAAmB,EAAC,CAAE,CAAA,OAAA;AAAA,IACpD,MAAA,EAAQ,OAAO,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,GAAO,CAAC,CAAA;AAAA,IAClD,IAAA,EAAM,OAAO,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,GAAO,CAAC,CAAA;AAAA,IAChD,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAO,MAAS,GAAA,EAAA;AAAA,IAChB,KAAA,EAAO,OAAO,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,GAAO,CAAC,CAAA;AAAA,IACjD,GAAA,EAAK,IAAK,CAAA,MAAA,EAAW,GAAA,GAAA;AAAA,IACrB,OAAS,EAAA,EAAA;AAAA,IACT,SAAA;AAAA,IACA,WAAa,EAAA;AAAA,MACAvB,KAAK,CAAA;AAAA,QACd,KAAO,EAAA+B,gBAAA;AAAA,QACP,MAAQ,EAAAA,gBAAA;AAAA,QACR;AAAA,OACD;AAAA,KACH;AAAA,IACA,QAAU,EAAA;AAAA,MACR,OAAS,EAAAA,gBAAA;AAAA,MACT,IAAM,EAAA,IAAA;AAAA,MACN,QAAU,EAAA;AAAA,KACZ;AAAA,IACA,QAAU,EAAA,EAAA;AAAA,IACV,aAAa,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,OAAO,gBAAgB;AAAA,GAChE,CAAA;AAED,EAAO,OAAA,KAAA;AACT;AAOO,IAAM,MAAA,GAAS,CAAC,OAAqB,MAAA;AAAA,EAC1C,OAAA;AAAA,EACA,iBAAmB,EAAAA;AACrB,CAAA,CAAA;AAOO,IAAM,KAAQ,GAAA;AAAA,EACnB,YAAc,EAAA;AAAA,IACZ,EAAE,IAAA,EAAM,SAAW,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IACnC,EAAE,IAAA,EAAM,mBAAqB,EAAA,IAAA,EAAM,SAAU;AAAA,GAC/C;AAAA,EACA,KAAO,EAAA;AAAA,IACL,EAAE,IAAA,EAAM,UAAY,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IACpC,EAAE,IAAA,EAAM,QAAU,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IAClC,EAAE,IAAA,EAAM,MAAQ,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IAChC,EAAE,IAAA,EAAM,UAAY,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IACpC,EAAE,IAAA,EAAM,QAAU,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IAClC,EAAE,IAAA,EAAM,OAAS,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IACjC,EAAE,IAAA,EAAM,KAAO,EAAA,IAAA,EAAM,MAAO,EAAA;AAAA,IAC5B,EAAE,IAAA,EAAM,WAAa,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IACrC,EAAE,IAAA,EAAM,aAAe,EAAA,IAAA,EAAM,cAAe,EAAA;AAAA,IAC5C,EAAE,IAAA,EAAM,UAAY,EAAA,IAAA,EAAM,UAAW;AAAA,GACvC;AAAA,EACA,UAAY,EAAA;AAAA,IACV,EAAE,IAAA,EAAM,OAAS,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IACjC,EAAE,IAAA,EAAM,QAAU,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IAClC,EAAE,IAAA,EAAM,MAAQ,EAAA,IAAA,EAAM,SAAU;AAAA,GAClC;AAAA,EACA,QAAU,EAAA;AAAA,IACR,EAAE,IAAA,EAAM,SAAW,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,IACnC,EAAE,IAAA,EAAM,MAAQ,EAAA,IAAA,EAAM,OAAQ,EAAA;AAAA,IAC9B,EAAE,IAAA,EAAM,UAAY,EAAA,IAAA,EAAM,SAAU;AAAA;AAExC,CAAA;AASO,SAAS,IAAA,CAAK,OAAc,MAAoC,EAAA;AACrE,EAAA,IAAI,CAAC,MAAA,CAAO,OAAS,EAAA,MAAM,IAAI,kBAAmB,EAAA;AAClD,EAAA,OAAO,OAAO,aAAc,CAAA;AAAA,IAC1B,SAAS,MAAO,CAAA,OAAA;AAAA,IAChB,MAAA,EAAQ,MAAO,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,IAC5B,KAAA;AAAA,IACA,WAAa,EAAA,OAAA;AAAA,IACb,OAAS,EAAA;AAAA,MACP,QAAA,EAAU,KAAM,CAAA,QAAA,CAAS,WAAY,EAAA;AAAA,MACrC,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,MAAM,KAAM,CAAA,IAAA;AAAA,MACZ,QAAA,EAAU,MAAO,CAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,MAC/B,MAAA,EAAQ,MAAO,CAAA,KAAA,CAAM,MAAM,CAAA;AAAA,MAC3B,OAAO,KAAM,CAAA,KAAA;AAAA,MACb,KAAK,KAAM,CAAA,GAAA;AAAA,MACX,SAAA,EAAW,KAAM,CAAA,SAAA,CAAU,WAAY,EAAA;AAAA,MACvC,aAAa,KAAM,CAAA,WAAA;AAAA,MACnB,QAAU,EAAA;AAAA,QACR,OAAS,EAAA,KAAA,CAAM,QAAS,CAAA,OAAA,CAAQ,WAAY,EAAA;AAAA,QAC5C,IAAA,EAAM,MAAM,QAAS,CAAA,IAAA;AAAA,QACrB,QAAA,EAAU,MAAM,QAAS,CAAA;AAAA;AAC3B;AACF,GACD,CAAA;AACH;AAEO,SAAS,KAAK,KAAiC,EAAA;AACpD,EAAA,OAAOC,kBAAc,CAAA;AAAA,IACnB,MAAA,EAAQ,MAAO,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,IAC5B,OAAS,EAAA;AAAA,MACP,QAAA,EAAU,KAAM,CAAA,QAAA,CAAS,WAAY,EAAA;AAAA,MACrC,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,MAAM,KAAM,CAAA,IAAA;AAAA,MACZ,QAAA,EAAU,MAAO,CAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,MAC/B,MAAA,EAAQ,MAAO,CAAA,KAAA,CAAM,MAAM,CAAA;AAAA,MAC3B,OAAO,KAAM,CAAA,KAAA;AAAA,MACb,KAAK,KAAM,CAAA,GAAA;AAAA,MACX,SAAA,EAAW,KAAM,CAAA,SAAA,CAAU,WAAY,EAAA;AAAA,MACvC,aAAa,KAAM,CAAA,WAAA;AAAA,MACnB,QAAU,EAAA;AAAA,QACR,OAAS,EAAA,KAAA,CAAM,QAAS,CAAA,OAAA,CAAQ,WAAY,EAAA;AAAA,QAC5C,IAAA,EAAM,MAAM,QAAS,CAAA,IAAA;AAAA,QACrB,QAAA,EAAU,MAAM,QAAS,CAAA;AAAA;AAC3B,KACF;AAAA,IACA,WAAa,EAAA,OAAA;AAAA,IACb;AAAA,GACD,CAAA;AACH;AAQO,SAAS,aAAa,KAAmB,EAAA;AAC9C,EAAkB,OAAA,EAAA;AAAA,IACLhC,KAAK,CAAA;AAAA,MACd,SAAS,KAAM,CAAA,OAAA;AAAA,MACf,WAAW,KAAM,CAAA,SAAA;AAAA,MACjB,aAAa,KAAM,CAAA,WAAA;AAAA,MACnB,UAAU,KAAM,CAAA;AAAA,KACjB;AAAA,GACH;AACF;AAEA,IAAM,QAAW,GAAA;AAAA,EACf,EAAE,IAAA,EAAM,UAAY,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,EACpC,EAAE,IAAA,EAAM,QAAU,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,EAClC,EAAE,IAAA,EAAM,MAAQ,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,EAChC,EAAE,IAAA,EAAM,UAAY,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,EACpC,EAAE,IAAA,EAAM,QAAU,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,EAClC,EAAE,IAAA,EAAM,OAAS,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,EACjC,EAAE,IAAA,EAAM,KAAO,EAAA,IAAA,EAAM,MAAO,EAAA;AAAA,EAC5B,EAAE,IAAA,EAAM,SAAW,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,EACnC,EAAE,IAAA,EAAM,WAAa,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,EACrC,EAAE,IAAA,EAAM,OAAS,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,EACjC;AAAA,IACE,IAAM,EAAA,aAAA;AAAA,IACN,IAAM,EAAA,SAAA;AAAA,IACN,UAAY,EAAA;AAAA,MACV,EAAE,IAAA,EAAM,OAAS,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,MACjC,EAAE,IAAA,EAAM,QAAU,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,MAClC,EAAE,IAAA,EAAM,MAAQ,EAAA,IAAA,EAAM,SAAU;AAAA;AAClC,GACF;AAAA,EACA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,IAAM,EAAA,OAAA;AAAA,IACN,UAAY,EAAA;AAAA,MACV,EAAE,IAAA,EAAM,SAAW,EAAA,IAAA,EAAM,SAAU,EAAA;AAAA,MACnC,EAAE,IAAA,EAAM,MAAQ,EAAA,IAAA,EAAM,OAAQ,EAAA;AAAA,MAC9B,EAAE,IAAA,EAAM,UAAY,EAAA,IAAA,EAAM,SAAU;AAAA;AACtC,GACF;AAAA,EACA,EAAE,IAAA,EAAM,WAAa,EAAA,IAAA,EAAM,OAAQ;AACrC,CAAA;AAEO,SAAS,OAAO,KAAc,EAAA;AACnC,EAAA,OAAOG,yBAAoB,QAAU,EAAA;AAAA,IACnC,KAAM,CAAA,QAAA;AAAA,IACN,KAAM,CAAA,MAAA;AAAA,IACN,KAAM,CAAA,IAAA;AAAA,IACN,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,IACrB,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IACnB,KAAM,CAAA,KAAA;AAAA,IACN,KAAM,CAAA,GAAA;AAAA,IACN,KAAM,CAAA,OAAA;AAAA,IACN,KAAM,CAAA,SAAA;AAAA,IACN,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IAClB,KAAM,CAAA,WAAA;AAAA,IACN,KAAM,CAAA,QAAA;AAAA,IACN,MAAM,SAAa,IAAA;AAAA,GACpB,CAAA;AACH;AAEO,SAAS,MAAA,CAAO,MAAW,WAAqC,EAAA;AACrE,EAAI,IAAA,OAAA;AACJ,EAAI,IAAA;AACF,IAAUD,OAAAA,GAAAA,wBAAAA,CAAoB,UAAU,IAAI,CAAA;AAAA,WACrC,KAAO,EAAA;AACd,IAAM,MAAA,IAAI,kBAAkB,KAAc,CAAA;AAAA;AAG5C,EAAA,MAAM,QAAQF,KAAK,CAAA;AAAA,IACjB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IACnB,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAAA,IACjB,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,IACf,UAAmBA,KAAK,CAAA,MAAA,CAAO,OAAQ,CAAA,CAAC,CAAC,CAAC,CAAA;AAAA,IAC1C,MAAQ,EAAA,MAAA,CAAO,OAAQ,CAAA,CAAC,CAAC,CAAA;AAAA,IACzB,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,IAChB,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,IACd,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,IAClB,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,IACpB,KAAO,EAAA,MAAA,CAAO,OAAQ,CAAA,CAAC,CAAC,CAAA;AAAA,IACxB,aAAa,OAAQ,CAAA,EAAE,CAAE,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AAClC,MAAA,OAAkBA,KAAK,CAAA;AAAA,QACrB,OAAO,CAAE,CAAA,KAAA;AAAA,QACT,QAAQ,CAAE,CAAA,MAAA;AAAA,QACV,MAAM,CAAE,CAAA;AAAA,OACT,CAAA;AAAA,KACF,CAAA;AAAA,IACD,QAAU,EAAA;AAAA,MACR,OAAA,EAAS,OAAQ,CAAA,EAAE,CAAE,CAAA,OAAA;AAAA,MACrB,IAAA,EAAM,OAAQ,CAAA,EAAE,CAAE,CAAA,IAAA;AAAA,MAClB,QAAA,EAAU,OAAQ,CAAA,EAAE,CAAE,CAAA;AAAA,KACxB;AAAA,IACA,QAAU,EAAA,EAAA;AAAA,IACV,WAAA,EAAa,OAAO,WAAW,CAAA;AAAA,IAC/B,GAAI,OAAQ,CAAA,EAAE,CAAM,KAAA,IAAA,GAAO,EAAC,GAAI,EAAE,SAAA,EAAW,OAAQ,CAAA,EAAE,CAAE;AAAA,GAC1D,CAAA;AAED,EAAO,OAAA,KAAA;AACT;AAcO,IAAM,aAAgB,GAAA;AAAA,EAC3B,IAAM,EAAA,OAAA;AAAA,EACN,IAAM,EAAA,UAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,EAAE,MAAM,MAAQ,EAAA,IAAA,EAAM,WAAW,OAAS,EAAA,IAAA,EAAM,cAAc,SAAU,EAAA;AAAA,IACxE,EAAE,MAAM,OAAS,EAAA,IAAA,EAAM,WAAW,OAAS,EAAA,IAAA,EAAM,cAAc,SAAU,EAAA;AAAA,IACzE,EAAE,MAAM,QAAU,EAAA,IAAA,EAAM,WAAW,OAAS,EAAA,KAAA,EAAO,cAAc,SAAU;AAAA,GAC7E;AAAA,EACA,SAAW,EAAA;AACb,CAAA;AAEO,SAAS,gBAAgB,UAQd,EAAA;AAChB,EAAM,MAAA,EAAE,aAAa,QAAU,EAAA,OAAA,EAAS,iBAAiB,IAAM,EAAA,KAAA,EAAO,QAAW,GAAA,UAAA;AACjF,EAAO,OAAA;AAAA,IACL,EAAI,EAAA,CAAA,EAAG,WAAY,CAAA,QAAA,EAAU,CAAA,CAAA,EAAI,QAAS,CAAA,QAAA,EAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA;AAAA,IAClF,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,IACvB,QAAU,EAAA,IAAA;AAAA,IACV,KAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA,EAAa,OAAO,WAAW;AAAA,GACjC;AACF;AAEO,IAAM,iBAAA,GAAN,cAAuC,SAA8B,CAAA;AAAA,EAE1E,YAAY,KAA2B,EAAA;AACrC,IAAA,KAAA,CAAM,gBAAkB,EAAA,EAAE,KAAO,EAAA,KAAA,EAAO,CAAA;AAF1C,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,yBAAA,CAAA;AAAA;AAI3B,CAAA;AAEO,IAAM,kBAAA,GAAN,cAAwC,SAAU,CAAA;AAAA,EAEvD,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,kBAAkB,CAAA;AAF1B,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,0BAAA,CAAA;AAAA;AAI3B,CAAA;;;AQjdA,IAAA,aAAA,GAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAAA,IAAAA,EAAAA,MAAAA,KAAAA;AAAA,EAAA,aAAAkB,EAAAA,MAAAA,cAAAA;AAAA,EAAA,MAAAM,EAAAA,MAAAA;AAAA,CAAA,CAAA;AAoBO,IAAM,cAAgBS,aAAO,CAAA,MAAA,CAAA;AAAA,EAClC,YAAgB,EAAAA,aAAA,CAAA,MAAA,EAAS,CAAA,SAAA,CAAU,YAAY,CAAA;AAAA,EAC/C,KAAOA,aAAO,CAAA,MAAA,CAAA;AAAA,IACZ,IAAA,EAAQA,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAIb,eAAU;AAAA,GACxD,CAAA;AAAA,EACD,KAAOa,aAAO,CAAA,MAAA,CAAA;AAAA,IACZ,IAAA,EAAQA,aAAO,CAAA,MAAA,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAIb,eAAU;AAAA,GACxD;AACH,CAAC,CAAA;AAcM,SAASpB,MAAK,UAA8C,EAAA;AACjE,EAAI,IAAA;AACF,IAAM,MAAA,WAAA,GAAc,WAAY,CAAA,KAAA,CAAM,UAAU,CAAA;AAChD,IAAO,OAAA;AAAA,MACL,cAAc,WAAY,CAAA,YAAA;AAAA,MAC1B,KAAK,WAAY,CAAA,GAAA;AAAA,MACjB,KAAK,WAAY,CAAA;AAAA,KACnB;AAAA,WACO,KAAgB,EAAA;AACvB,IAAM,MAAA,IAAI,kBAAkB,KAA2B,CAAA;AAAA;AAE3D;AAcO,SAASkB,eAAc,KAA2D,EAAA;AACvF,EAAOlB,OAAAA,KAAAA,CAAY,aAAqB,CAAA,KAAK,CAAC,CAAA;AAChD;AAiBO,SAASwB,OAA4B,GAAA;AAC1C,EAAA,OAAOxB,KAAK,CAAA;AAAA,IACV,YAAc,EAAA,kBAAA,CAAW,EAAG,CAAA,kBAAA,CAAW,QAAQ,CAAA;AAAA,IAC/C,GAAK,EAAA;AAAA,MACH,IAAA,EAAM,OAAO,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,GAAO,CAAC;AAAA,KAClD;AAAA,IACA,GAAK,EAAA;AAAA,MACH,IAAA,EAAM,OAAO,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,GAAO,CAAC;AAAA;AAClD,GACD,CAAA;AACH;AAQO,IAAM,iBAAA,GAAN,cAAuC,SAA8B,CAAA;AAAA,EAE1E,YAAY,KAA2B,EAAA;AACrC,IAAA,KAAA,CAAM,gBAAkB,EAAA,EAAE,KAAO,EAAA,KAAA,EAAO,CAAA;AAF1C,IAAA,aAAA,CAAA,IAAA,EAAkB,MAAO,EAAA,yBAAA,CAAA;AAAA;AAI3B,CAAA;;;ACxGa,IAAA,WAAA,GAAc,MAAO,CAAA,GAAA,CAAI,eAAe;;;ACLrD,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAAkC,MAAAA,EAAAA,MAAAA,OAAAA;AAAA,EAAA,MAAAC,EAAAA,MAAAA,OAAAA;AAAA,EAAA,QAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAcO,SAAS,SAAS,MAAmC,EAAA;AAC1D,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAU,EAAA;AACzC,IAAM,MAAA,IAAI,MAAM,0BAA0B,CAAA;AAAA;AAG5C,EAAA,MAAM,CAAI,GAAA,MAAA;AAGV,EAAI,IAAA,CAAC,CAAC,MAAA,EAAQ,UAAY,EAAA,QAAA,EAAU,QAAQ,CAAE,CAAA,QAAA,CAAS,CAAE,CAAA,IAAI,CAAG,EAAA;AAC9D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oBAAA,EAAuB,EAAE,IAAI,CAAA,gDAAA;AAAA,KAC/B;AAAA;AAIF,EAAI,IAAA,CAAC,CAAC,KAAO,EAAA,MAAM,EAAE,QAAS,CAAA,CAAA,CAAE,GAAG,CAAG,EAAA;AACpC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAsB,mBAAA,EAAA,CAAA,CAAE,GAAG,CAA6B,2BAAA,CAAA,CAAA;AAAA;AAI1E,EAAA,IAAI,CAAC,qBAAA,CAAsB,IAAK,CAAA,CAAA,CAAE,IAAI,CAAG,EAAA;AACvC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,EAAE,IAAI,CAAA,oDAAA;AAAA,KAChC;AAAA;AAIF,EAAA,MAAM,WASF,GAAA;AAAA,IACF,IAAM,EAAA;AAAA,MACJ,KAAO,EAAA,MAAA;AAAA,MACP,IAAM,EAAA,QAAA;AAAA,MACN,OAAS,EAAA,OAAA;AAAA,MACT,KAAO,EAAA;AAAA,KACT;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,KAAO,EAAA,QAAA;AAAA,MACP,IAAM,EAAA,QAAA;AAAA,MACN,OAAS,EAAA,OAAA;AAAA,MACT,KAAO,EAAA;AAAA,KACT;AAAA,IACA,QAAU,EAAA;AAAA,MACR,KAAO,EAAA,UAAA;AAAA,MACP,IAAM,EAAA,QAAA;AAAA,MACN,SAAA,EAAW,CAAC,GAAA,KAAgB,GAAM,GAAA,CAAA;AAAA,MAClC,KAAO,EAAA;AAAA,KACT;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,KAAO,EAAA,QAAA;AAAA,MACP,IAAM,EAAA,QAAA;AAAA,MACN,SAAA,EAAW,CAAC,GAAA,KAAgB,GAAM,GAAA,CAAA;AAAA,MAClC,KAAO,EAAA;AAAA;AACT,GACF;AAEA,EAAM,MAAA,UAAA,GAAa,WAAY,CAAA,CAAA,CAAE,IAAI,CAAA;AACrC,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAuB,oBAAA,EAAA,CAAA,CAAE,IAAI,CAAE,CAAA,CAAA;AAAA;AAGjD,EAAM,MAAA,UAAA,GAAa,CAAE,CAAA,UAAA,CAAW,KAAK,CAAA;AAErC,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAM,MAAA,IAAI,MAAM,CAAG,EAAA,CAAA,CAAE,IAAI,CAAmB,gBAAA,EAAA,UAAA,CAAW,KAAK,CAAuB,qBAAA,CAAA,CAAA;AAAA;AAGrF,EAAI,IAAA,OAAO,UAAe,KAAA,UAAA,CAAW,IAAM,EAAA;AACzC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,EAAG,EAAE,IAAI,CAAA,gBAAA,EAAmB,WAAW,KAAK,CAAA,gBAAA,EAAmB,WAAW,IAAI,CAAA;AAAA,KAChF;AAAA;AAGF,EAAA,IAAI,WAAW,OAAW,IAAA,CAAC,WAAW,OAAQ,CAAA,IAAA,CAAK,UAAU,CAAG,EAAA;AAC9D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,WAAW,UAAW,CAAA,KAAK,YAAY,UAAU,CAAA,YAAA,EAAe,WAAW,KAAK,CAAA;AAAA,KAClF;AAAA;AAGF,EAAA,IAAI,WAAW,SAAa,IAAA,CAAC,UAAW,CAAA,SAAA,CAAU,UAAU,CAAG,EAAA;AAC7D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,WAAW,UAAW,CAAA,KAAK,WAAW,UAAU,CAAA,YAAA,EAAe,WAAW,KAAK,CAAA;AAAA,KACjF;AAAA;AAGF,EAAI,IAAA,CAAA,CAAE,SAAS,MAAW,EAAA;AACxB,IAAA,IAAI,OAAO,CAAA,CAAE,IAAS,KAAA,QAAA,IAAY,CAAC,MAAA,CAAO,SAAU,CAAA,CAAA,CAAE,IAAI,CAAA,IAAK,CAAE,CAAA,IAAA,GAAO,CAAG,EAAA;AACzE,MAAM,MAAA,IAAI,MAAM,0CAA0C,CAAA;AAAA;AAC5D;AAGF,EAAO,OAAA,IAAA;AACT;AAEO,SAASA,QAAO,CAAmB,EAAA;AAExC,EAAA,OAAOC,eAAO,CAAA,SAAA,CAAU,IAAK,CAAA,SAAA,CAAU,CAAC,CAAC,CAAA;AAC3C;AAEO,SAASF,QAAO,KAA+B,EAAA;AACpD,EAAI,IAAA,CAAC,OAAc,OAAA,IAAA;AACnB,EAAA,MAAM,UAAU,IAAK,CAAA,KAAA,CAAME,eAAO,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAC/C,EAAA,QAAA,CAAS,OAAO,CAAA;AAChB,EAAO,OAAA,OAAA;AACT;;;ACzHA,IAAM,SAAY,GAAA,GAAA;AAClB,IAAM,aAAgB,GAAA,EAAA;AACtB,IAAM,wBAA0BC,aAAO,CAAA,MAAA,CAAA;AAAA,EACrC,MACG,EAAAA,aAAA,CAAA,MAAA,EACA,CAAA,QAAA,EACA,CAAA,MAAA;AAAA,IACC,CAAC,GAAQ,KAAA;AACP,MAAI,IAAA,CAAC,KAAY,OAAA,IAAA;AACjB,MAAI,IAAA;AACF,QAAM,MAAA,OAAA,GAAU,cAAO,CAAA,MAAA,CAAO,GAAG,CAAA;AACjC,QAAA,OAAO,OAAY,KAAA,IAAA;AAAA,eACZ,MAAQ,EAAA;AACf,QAAO,OAAA,KAAA;AAAA;AACT,KACF;AAAA,IACA;AAAA,MACE,OAAS,EAAA;AAAA;AACX,IAED,IAAK,CAAA;AAAA,IACJ,WAAa,EAAA,+CAAA;AAAA,IACb,OACE,EAAA;AAAA,GACH,CAAA;AAAA,EACH,KACG,EAAAA,aAAA,CAAA,MAAA,EACA,CAAA,KAAA,CAAM,YAAc,EAAA;AAAA,IACnB,OAAS,EAAA;AAAA,GACV,CACA,CAAA,SAAA,CAAU,CAAC,GAAA,KAAQ,OAAO,QAAS,CAAA,GAAA,EAAK,EAAE,CAAC,CAC3C,CAAA,IAAA;AAAA,IACGA,aAAA,CAAA,MAAA,EAAS,CAAA,GAAA,CAAI,SAAW,EAAA;AAAA,MACxB,OAAA,EAAS,uBAAuB,SAAS,CAAA;AAAA,KAC1C;AAAA,IAEF,QAAS,EAAA,CACT,OAAQ,CAAA,aAAa,EACrB,IAAK,CAAA;AAAA,IACJ,WAAa,EAAA,CAAA,eAAA,EAAkB,SAAS,CAAA,WAAA,EAAc,aAAa,CAAA,CAAA;AAAA,IACnE,OAAS,EAAA;AAAA,GACV;AACL,CAAC,CAAA;AAEM,IAAM,uBAAyBA,aAAO,CAAA,MAAA,CAAA;AAAA,EAC3C,GAAG,qBAAsB,CAAA,KAAA;AAAA,EACzB,MAAQA,aAAK,CAAA,IAAA,CAAA,CAAC,OAAO,MAAM,CAAC,EAAE,IAAK,CAAA;AAAA,IACjC,WAAa,EAAA,oBAAA;AAAA,IACb,OAAS,EAAA;AAAA,GACV,CAAA;AAAA,EACD,aAAA,EACGA,qBAAO,EAAE,KAAA,EAAO,oEAAoE,CAAA,CACpF,MAAM,qBAAuB,EAAA,EAAE,OAAO,kDAAmD,EAAC,EAC1F,SAAe,CAAA,CAAC,QAAQ,GAAI,CAAA,WAAA,EAAoB,CAAA,CAChD,IAAK,CAAA;AAAA,IACJ,WAAa,EAAA,sBAAA;AAAA,IACb,OAAS,EAAA;AAAA,GACV;AACL,CAAC,CAAA;AAEM,IAAM,4BAA8BA,aAAO,CAAA,MAAA,CAAA;AAAA,EAChD,GAAG,qBAAsB,CAAA,KAAA;AAAA,EACzB,MAAU,EAAAA,aAAA,CAAA,MAAA,EAAS,CAAA,QAAA,GAAW,IAAK,CAAA;AAAA,IACjC,WAAa,EAAA,sBAAA;AAAA,IACb,OAAS,EAAA;AAAA,GACV;AACH,CAAC,CAAA;AAED,IAAM,OAAU,GAAA;AAAA,EACd,UAAY,EAAA,oBAAA;AAAA,EACZ,eAAiB,EAAA;AACnB,CAAA;AAIO,SAAS,KAAA,CAAwB,QAAW,KAA8C,EAAA;AAC/F,EAAA,OAAO,OAAQ,CAAA,MAAM,CAAE,CAAA,KAAA,CAAM,KAAK,CAAA;AACpC;AAEO,SAAS,SAAA,CACd,MACA,EAAA,KAAA,EACA,KACoD,EAAA;AACpD,EAAA,OAAO,OAAQ,CAAA,MAAM,CAAE,CAAA,SAAA,CAAU,KAAO,EAAA;AAAA,IACtC;AAAA,GACD,CAAA;AACH;;;ACpFA,IAAM,gBAAmB,GAAA,0BAAA;AACzB,IAAM,aAAgB,GAAA,qBAAA;AAEtB,SAAS,oBAA4C,UAKlD,EAAA;AACD,EAAA,MAAM,EAAE,UAAA,EAAY,eAAiB,EAAA,WAAA,EAAa,QAAW,GAAA,UAAA;AAC7D,EAAM,MAAA,YAAA,GAAe,kBACjB,UAAW,CAAA,IAAA,CAAK,EAAE,WAAa,EAAA,eAAA,EAAiB,CAChD,GAAA,UAAA;AACJ,EAAA,OAAOxC,KACJ,MAAO,CAAA;AAAA,IACN,MAAA,EAAQA,IAAE,CAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,IAC3B,MAAQA,EAAAA,IAAAA,CAAE,MAAO,EAAA,CAAE,QAAS,EAAA;AAAA,IAC5B,IAAA,EAAMA,KAAE,GAAI,EAAA;AAAA,IACZ,IAAA,EAAMA,KAAE,MAAO,CAAA;AAAA,MACb,SAAA,EAAWA,KAAE,MAAO;AAAA,KACrB;AAAA,GACF,EACA,MAAO,CAAA;AAAA,IACN,IAAM,EAAA;AAAA,GACP,EACA,IAAK,CAAA;AAAA,IACJ,OAAS,EAAA;AAAA,MACP,MAAQ,EAAA,SAAA;AAAA,MACR,MAAA;AAAA,MACA,IAAM,EAAA,WAAA;AAAA,MACN,IAAA,EAAM,EAAE,SAAA,EAAW,gBAAiB;AAAA;AACtC,GACD,CAAA;AACL;AAEA,IAAM,8BAA8B,mBAAoB,CAAA;AAAA,EACtD,UAAYA,EAAAA,IAAAA,CAAE,KAAMA,CAAAA,IAAAA,CAAE,KAAK,CAAA;AAAA,EAC3B,eAAiB,EAAA,uCAAA;AAAA,EACjB,aAAa,CAAQ,WAAA,CAAY,aAAM,CAAA,MAAA,EAAQ,CAAC,CAAA;AAAA,EAChD,MAAQ,EAAA;AACV,CAAC,CAAA;AAED,IAAM,mCAAmC,mBAAoB,CAAA;AAAA,EAC3D,UAAYA,EAAAA,IAAAA,CAAE,KAAMA,CAAAA,IAAAA,CAAE,KAAK,CAAA;AAAA,EAC3B,eAAiB,EAAA,kCAAA;AAAA,EACjB,aAAa,CAAQ,WAAA,CAAY,kBAAW,CAAA,MAAA,EAAQ,CAAC,CAAA;AAAA,EACrD,MAAQ,EAAA;AACV,CAAC,CAAA;AAED,IAAM,oCAAoC,mBAAoB,CAAA;AAAA,EAC5D,UAAY,EAAA,oBAAA;AAAA,EACZ,eAAiB,EAAA,2BAAA;AAAA,EACjB,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAO,EAAA;AAAA,EAC9B,MAAQ,EAAA;AACV,CAAC,CAAA;AAED,IAAM,wCAAwC,mBAAoB,CAAA;AAAA,EAChE,UAAY,EAAA,wBAAA;AAAA,EACZ,eAAiB,EAAA,4CAAA;AAAA,EACjB,WAAa,EAAA;AAAA,IACX;AAAA,MACE,IAAM,EAAA,gBAAA;AAAA,MACN,QAAU,EAAA,GAAA;AAAA,MACV,YAAc,EAAA,QAAA;AAAA,MACd,UAAY,EAAA,0BAAA;AAAA,MACZ,GAAK,EAAA,CAAA;AAAA,MACL,MAAQ,EAAA;AAAA;AACV,GACF;AAAA,EACA,MAAQ,EAAA;AACV,CAAC,CAAA;AAED,IAAM,oCAAoC,mBAAoB,CAAA;AAAA,EAC5D,UAAY,EAAA,oBAAA;AAAA,EACZ,eAAiB,EAAA,mCAAA;AAAA,EACjB,WAAa,EAAA;AAAA,IACX;AAAA,MACE,QAAU,EAAA,GAAA;AAAA,MACV,YAAc,EAAA,QAAA;AAAA,MACd,UAAY,EAAA;AAAA;AACd,GACF;AAAA,EACA,MAAQ,EAAA;AACV,CAAC,CAAA;AAED,IAAM,mBAAA,GAAsBA,KACzB,MAAO,CAAA;AAAA,EACN,MAAA,EAAQA,IAAE,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,EACzB,KAAA,EAAOA,KAAE,MAAO,CAAA;AAAA,IACd,IAAA,EAAMA,KAAE,MAAO,EAAA;AAAA,IACf,OAAA,EAASA,KAAE,MAAO,EAAA;AAAA,IAClB,OAASA,EAAAA,IAAAA,CAAE,GAAI,EAAA,CAAE,QAAS;AAAA,GAC3B,CAAA;AAAA,EACD,IAAA,EAAMA,KAAE,MAAO,CAAA;AAAA,IACb,SAAA,EAAWA,KAAE,MAAO;AAAA,GACrB;AACH,CAAC,EACA,IAAK,CAAA;AAAA,EACJ,WAAa,EAAA,yBAAA;AAAA,EACb,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,OAAA;AAAA,IACR,KAAO,EAAA;AAAA,MACL,IAAM,EAAA,kBAAA;AAAA,MACN,OAAS,EAAA,wEAAA;AAAA,MACT,OAAS,EAAA;AAAA,QACP;AAAA,UACE,KAAO,EAAA,QAAA;AAAA,UACP,KAAO,EAAA;AAAA;AACT;AACF,KACF;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,SAAW,EAAA;AAAA;AACb;AAEJ,CAAC,CAAA;AAEH,IAAM,KAA+B,GAAA;AAAA,EACnC,YAAc,EAAA;AAAA,IACZ,GAAK,EAAA;AAAA,MACH,OAAS,EAAA,QAAA;AAAA,MACT,WAAa,EAAA,0CAAA;AAAA,MACb,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,MACf,aAAe,EAAA;AAAA,QACb,KAAO,EAAA;AAAA,OACT;AAAA,MACA,SAAW,EAAA;AAAA,QACT,GAAK,EAAA;AAAA,UACH,WAAa,EAAA,SAAA;AAAA,UACb,OAAS,EAAA;AAAA,YACP,kBAAoB,EAAA;AAAA,cAClB,MAAQ,EAAA;AAAA;AACV;AACF,SACF;AAAA,QACA,GAAK,EAAA;AAAA,UACH,WAAa,EAAA,aAAA;AAAA,UACb,OAAS,EAAA;AAAA,YACP,kBAAoB,EAAA;AAAA,cAClB,MAAQ,EAAA;AAAA;AACV;AACF;AACF;AACF;AACF,GACF;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,GAAK,EAAA;AAAA,MACH,OAAS,EAAA,aAAA;AAAA,MACT,WAAa,EAAA,0CAAA;AAAA,MACb,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,aAAe,EAAA;AAAA,QACb,KAAO,EAAA;AAAA,OACT;AAAA,MACA,SAAW,EAAA;AAAA,QACT,GAAK,EAAA;AAAA,UACH,WAAa,EAAA,SAAA;AAAA,UACb,OAAS,EAAA;AAAA,YACP,kBAAoB,EAAA;AAAA,cAClB,MAAQ,EAAA;AAAA;AACV;AACF,SACF;AAAA,QACA,GAAK,EAAA;AAAA,UACH,WAAa,EAAA,aAAA;AAAA,UACb,OAAS,EAAA;AAAA,YACP,kBAAoB,EAAA;AAAA,cAClB,MAAQ,EAAA;AAAA;AACV;AACF;AACF;AACF;AACF,GACF;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,GAAK,EAAA;AAAA,MACH,OAAS,EAAA,eAAA;AAAA,MACT,WAAa,EAAA,+CAAA;AAAA,MACb,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,MACf,SAAW,EAAA;AAAA,QACT,GAAK,EAAA;AAAA,UACH,WAAa,EAAA,SAAA;AAAA,UACb,OAAS,EAAA;AAAA,YACP,kBAAoB,EAAA;AAAA,cAClB,MAAQ,EAAA;AAAA;AACV;AACF;AACF;AACF;AACF,GACF;AAAA,EACA,uBAAyB,EAAA;AAAA,IACvB,GAAK,EAAA;AAAA,MACH,OAAS,EAAA,mBAAA;AAAA,MACT,WAAa,EAAA,2EAAA;AAAA,MACb,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,MACf,SAAW,EAAA;AAAA,QACT,GAAK,EAAA;AAAA,UACH,WAAa,EAAA,SAAA;AAAA,UACb,OAAS,EAAA;AAAA,YACP,kBAAoB,EAAA;AAAA,cAClB,MAAQ,EAAA;AAAA;AACV;AACF;AACF;AACF;AACF,GACF;AAAA,EACA,mBAAqB,EAAA;AAAA,IACnB,GAAK,EAAA;AAAA,MACH,OAAS,EAAA,eAAA;AAAA,MACT,WAAa,EAAA,qDAAA;AAAA,MACb,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,MACf,SAAW,EAAA;AAAA,QACT,GAAK,EAAA;AAAA,UACH,WAAa,EAAA,SAAA;AAAA,UACb,OAAS,EAAA;AAAA,YACP,kBAAoB,EAAA;AAAA,cAClB,MAAQ,EAAA;AAAA;AACV;AACF;AACF;AACF;AACF;AAEJ,CAAA;AAEO,IAAM,UAAUyC,yBAAe,CAAA;AAAA,EACpC,OAAS,EAAA,OAAA;AAAA,EACT,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,YAAA;AAAA,IACP,OAAS,EAAA,OAAA;AAAA,IACT,WAAa,EAAA;AAAA,GACf;AAAA,EACA,IAAM,EAAA;AAAA,IACJ;AAAA,MACE,IAAM,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,IAAM,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,IAAM,EAAA;AAAA;AACR,GACF;AAAA,EACA,OAAS,EAAA;AAAA,IACP;AAAA,MACE,GAAK,EAAA,2BAAA;AAAA,MACL,WAAa,EAAA;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAK,EAAA,uBAAA;AAAA,MACL,WAAa,EAAA;AAAA;AACf,GACF;AAAA,EACA;AACF,CAAC,CAAA;;;ACvQD,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,SAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAmEO,SAAS,QAAQ,OAA8C,EAAA;AACpE,EAAA,MAAM,CAAI,GAAA,IAAI,GAAI,CAAA,OAAA,EAAS,OAAO,2BAA2B,CAAA;AAE7D,EAAA,IAAI,CAAE,CAAA,QAAA,KAAa,OAAW,IAAA,CAAA,CAAE,aAAa,QAAU,EAAA;AACrD,IAAA,MAAM,IAAI,eAAA,CAAgB,CAAE,CAAA,QAAA,EAAU,CAAA;AAAA;AAGxC,EAAA,MAAM,OAAU,GAAA,OAAA,EAAS,OAAW,IAAA,IAAI,OAAQ,EAAA;AAChD,EAAQ,OAAA,CAAA,GAAA,CAAI,gBAAgB,kBAAkB,CAAA;AAC9C,EAAA,OAAA,EAAS,WAAW,MAAY,GAAA,OAAA,CAAQ,IAAI,WAAa,EAAA,OAAA,CAAQ,MAAM,CAAI,GAAA,IAAA;AAE3E,EAAA,MAAM,MAA6B,GAAA;AAAA,IACjC,GAAK,EAAA,CAAA;AAAA,IACL;AAAA,GACF;AAEA,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAW,EAAA,CAAC,UAAe,KAAA,SAAA,CAAU,QAAQ,UAAU,CAAA;AAAA,IACvD,cAAgB,EAAA,CAAC,UAAe,KAAA,cAAA,CAAe,QAAQ,UAAU;AAAA,GACnE;AACF;AAOA,eAAsB,SAAA,CACpB,QACA,UAC+B,EAAA;AAC/B,EAAM,MAAA,GAAA,GAAM,IAAI,GAAI,CAAA,CAAA,EAAG,OAAO,GAAI,CAAA,QAAA,EAAU,CAAW,SAAA,CAAA,CAAA;AAEvD,EAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,MAAQ,EAAA,UAAA,CAAW,IAAI,CAAA;AAC5C,EAAA,GAAA,CAAI,aAAa,GAAI,CAAA,eAAA,EAAiB,UAAW,CAAA,YAAA,CAAa,UAAU,CAAA;AAExE,EAAA,IAAI,WAAW,MAAQ,EAAA;AACrB,IAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,QAAU,EAAA,UAAA,CAAW,MAAM,CAAA;AAAA;AAElD,EAAI,IAAA,UAAA,CAAW,UAAU,MAAW,EAAA;AAClC,IAAA,GAAA,CAAI,aAAa,GAAI,CAAA,OAAA,EAAS,UAAW,CAAA,KAAA,CAAM,UAAU,CAAA;AAAA;AAG3D,EAAM,MAAA,EAAE,QAAQ,cAAgB,EAAA,IAAA,EAAM,QAAW,GAAA,MAAM,MAGpD,CAAA,MAAA,EAAQ,GAAG,CAAA;AAEd,EAAA,MAAM,YAAe,GAAA,MAAA,CAAO,GAAI,CAAA,aAAA,CAAM,aAAa,CAAA;AAEnD,EAAO,OAAA;AAAA,IACL,MAAQ,EAAA,cAAA;AAAA,IACR,MAAQ,EAAA;AAAA,GACV;AACF;AAuBA,eAAsB,cAAA,CACpB,QACA,UACoC,EAAA;AACpC,EAAM,MAAA,GAAA,GAAM,IAAI,GAAI,CAAA,CAAA,EAAG,OAAO,GAAI,CAAA,QAAA,EAAU,CAAgB,cAAA,CAAA,CAAA;AAE5D,EAAI,IAAA,UAAA,EAAY,WAAW,MAAW,EAAA;AACpC,IAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,QAAU,EAAA,UAAA,CAAW,MAAM,CAAA;AAAA;AAElD,EAAI,IAAA,UAAA,EAAY,UAAU,MAAW,EAAA;AACnC,IAAA,GAAA,CAAI,aAAa,GAAI,CAAA,OAAA,EAAS,UAAW,CAAA,KAAA,CAAM,UAAU,CAAA;AAAA;AAG3D,EAAM,MAAA,EAAE,QAAQ,cAAgB,EAAA,IAAA,EAAM,OAAU,GAAA,MAAM,MAGnD,CAAA,MAAA,EAAQ,GAAG,CAAA;AAEd,EAAA,MAAM,WAAc,GAAA,KAAA,CAAM,GAAI,CAAA,CAAC,IAAS,KAAA;AACtC,IAAM,MAAA,UAAA,GAAa,kBAAW,CAAA,aAAA,CAAc,IAAI,CAAA;AAChD,IAAA,MAAM,EAAE,YAAA,EAAc,CAAG,EAAA,GAAG,UAAa,GAAA;AAAA,MACvC,EAAI,EAAA,MAAM,kBAAW,CAAA,EAAA,CAAG,UAAU,CAAA;AAAA,MAClC,GAAG,UAAA;AAAA,MACH,GAAG,aAAA,CAAM,aAAc,CAAA,EAAE,aAAe,EAAA,IAAA,CAAK,EAAI,EAAA,GAAA,EAAK,IAAK,CAAA,GAAA,EAAK,GAAK,EAAA,IAAA,CAAK,KAAK;AAAA,KACjF;AACA,IAAO,OAAA,QAAA;AAAA,GACR,CAAA;AAED,EAAO,OAAA;AAAA,IACL,MAAQ,EAAA,cAAA;AAAA,IACR;AAAA,GACF;AACF;AA+BA,eAAe,MAAA,CAAU,QAA4B,GAAoC,EAAA;AACvF,EAAA,MAAM,WAAW,GAAI,CAAA,QAAA;AACrB,EAAI,IAAA,MAAA;AAEJ,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,QAAS,CAAA,QAAA,CAAS,YAAY,CAAA;AACjC,MAAS,MAAA,GAAA,YAAA;AACT,MAAA;AAAA,IACF,KAAK,QAAS,CAAA,QAAA,CAAS,iBAAiB,CAAA;AACtC,MAAS,MAAA,GAAA,iBAAA;AACT,MAAA;AAAA,IACF;AACE,MAAM,MAAA,IAAI,sBAAsB,kBAAoB,EAAA;AAAA,QAClD,OAAA,EAAS,qBAAqB,QAAQ,CAAA;AAAA,OACvC,CAAA;AAAA;AAGL,EAAA,MAAM,oBAA8B,SAAU,CAAA,MAAA,EAAQ,OAAO,WAAY,CAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAC1F,EAAI,IAAA,CAAC,kBAAkB,OAAS,EAAA;AAC9B,IAAM,MAAA,IAAI,sBAAsB,CAA0B,sBAAA,CAAA,EAAA;AAAA,MACxD,OAAS,EAAA,iBAAA,CAAkB,KAAM,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA;AAAA,KAC7C,CAAA;AAAA;AAGH,EAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,GAAA,CAAI,UAAY,EAAA;AAAA,IAC3C,MAAQ,EAAA,KAAA;AAAA,IACR,SAAS,MAAO,CAAA;AAAA,GACjB,CAAA;AAED,EAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,IAAA,QAAQ,SAAS,MAAQ;AAAA,MACvB,KAAK,GAAA;AACH,QAAA,MAAM,IAAI,qBAAsB,EAAA;AAAA,MAClC,KAAK,GAAA;AACH,QAAA,MAAM,IAAI,kBAAmB,EAAA;AAAA,MAC/B,KAAK,GAAA;AACH,QAAA,MAAM,IAAI,kBAAmB,EAAA;AAAA;AAEjC,IAAA,MAAM,IAAI,qBAAA,CAAsB,CAAwB,qBAAA,EAAA,QAAA,CAAS,MAAM,CAAI,CAAA,EAAA;AAAA,MACzE,OAAA,EAAS,MAAM,QAAA,CAAS,IAAK;AAAA,KAC9B,CAAA;AAAA;AAGH,EAAA,OAAO,SAAS,IAAK,EAAA;AACvB;AAEO,IAAM,eAAA,GAAN,cAAqC,SAAU,CAAA;AAAA,EAEpD,YAAY,GAAa,EAAA;AACvB,IAAM,KAAA,CAAA,CAAA,KAAA,EAAQ,GAAG,CAAsB,oBAAA,CAAA,CAAA;AAFzC,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,wBAAA,CAAA;AAAA;AAIlB,CAAA;AAEO,IAAM,qBAAA,GAAN,cAA2C,SAAU,CAAA;AAAA,EAE1D,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,eAAiB,EAAA;AAAA,MACrB,YAAA,EAAc,CAAC,qCAAqC;AAAA,KACrD,CAAA;AAJH,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,8BAAA,CAAA;AAAA;AAMlB,CAAA;AAEO,IAAM,kBAAA,GAAN,cAAwC,SAAU,CAAA;AAAA,EAEvD,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,YAAc,EAAA;AAAA,MAClB,YAAA,EAAc,CAAC,mCAAmC;AAAA,KACnD,CAAA;AAJH,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,2BAAA,CAAA;AAAA;AAMlB,CAAA;AAEO,IAAM,kBAAA,GAAN,cAAwC,SAAU,CAAA;AAAA,EAEvD,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,sBAAwB,EAAA;AAAA,MAC5B,YAAc,EAAA;AAAA,QACZ;AAAA;AACF,KACD,CAAA;AANH,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,2BAAA,CAAA;AAAA;AAQlB,CAAA;AAEO,IAAM,qBAAA,GAAN,cAA2C,SAAU,CAAA;AAAA,EAE1D,YAAY,OAAiB,EAAA,EAAE,OAAQ,EAAA,GAA0B,EAAI,EAAA;AACnE,IAAA,KAAA,CAAM,OAAS,EAAA;AAAA,MACb,YAAA,EAAc,CAAC,OAAO;AAAA,KACvB,CAAA;AAJH,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,8BAAA,CAAA;AAAA;AAMlB,CAAA;;;ACzSA,IAAA,kBAAA,GAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,GAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA8CA,eAAsB,IAKpB,UAKsD,EAAA;AACtD,EAAA,MAAM,EAAE,KAAO,EAAA,KAAA,EAAO,MAAM,EAAC,EAAU,WAAc,GAAA,UAAA;AAErD,EAAA,MAAM,SAAsD,EAAC;AAC7D,EAAI,IAAA,UAAA,GAAkB,MAAM,KAAM,EAAA;AAElC,EAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,IAAI,IAAA,UAAA,CAAW,WAAW,CAAG,EAAA,OAAO,EAAE,KAAO,EAAA,IAAI,MAAO,EAAA;AAExD,IAAM,MAAA,eAAA,uBAAmC,GAAI,EAAA;AAC7C,IAAI,IAAA,IAAA,CAAK,SAAS,QAAU,EAAA;AAC1B,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,UAAA,CAAW,QAAQ,CAAK,EAAA,EAAA;AAC1C,QAAM,MAAA,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,QAAA,MAAM,KAAQ,GAAA,MAAM,IAAK,CAAA,GAAA,CAAI,MAAM,GAAG,CAAA;AACtC,QAAA,IAAI,KAAO,EAAA;AACT,UAAO,MAAA,CAAA,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,UAAU,IAAK,CAAA,IAAA,EAAM,MAAM,CAAA;AACnD,UAAA,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA;AACvB;AACF,KACF,MAAA,IAAW,IAAK,CAAA,IAAA,KAAS,OAAS,EAAA;AAChC,MAAM,MAAA,IAAA,GAAO,OAAO,KAAA,EAAY,MAAmB,KAAA;AACjD,QAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,GAAA,CAAI,OAAO,GAAG,CAAA;AACrC,QAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AACrC,UAAM,MAAA,KAAA,GAAQ,GAAI,CAAA,GAAA,CAAI,CAAC,CAAA;AACvB,UAAA,IAAI,UAAU,MAAW,EAAA;AACvB,YAAO,MAAA,CAAA,IAAA,CAAK,EAAE,GAAG,KAAO,EAAA,QAAA,EAAU,IAAK,CAAA,IAAA,EAAM,IAAM,EAAA,KAAA,CAAM,CAAC,CAAA,EAAI,CAAA;AAC9D,YAAgB,eAAA,CAAA,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA;AAChC;AACF,OACF;AAEA,MAAA,IAAI,CAAC,SAAA,EAAiB,MAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,WACnC;AACH,QAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,UAAW,CAAA,MAAA,EAAQ,KAAK,SAAW,EAAA;AACrD,UAAA,MAAM,KAAK,UAAW,CAAA,KAAA,CAAM,GAAG,CAAI,GAAA,SAAS,GAAG,CAAC,CAAA;AAAA;AAClD;AACF;AAGF,IAAa,UAAA,GAAA,UAAA,CAAW,OAAO,CAAC,CAAA,EAAG,MAAM,CAAC,eAAA,CAAgB,GAAI,CAAA,CAAC,CAAC,CAAA;AAAA;AAGlE,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,UAAA;AAAA,IACP;AAAA,GACF;AACF;;;ACtGA,IAAA,sBAAA,GAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAAC,KAAAA,EAAAA,MAAAA,MAAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,MAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA8CO,SAAS,MAAA,CACd,MACAC,IACoB,EAAA;AACpB,EAAA,OAAO,EAAE,IAAA,EAAM,QAAU,EAAA,IAAA,EAAM,KAAAA,IAAI,EAAA;AACrC;AAQO,SAASD,MAAAA,CACd,MACAC,IACoB,EAAA;AACpB,EAAA,OAAO,EAAE,IAAA,EAAM,OAAS,EAAA,IAAA,EAAM,KAAAA,IAAI,EAAA;AACpC;AAOO,SAAS,MAAS,GAAA;AACvB,EAAA,MAAM,UAAU,MAAO,CAAA,UAAA,EAAY,CAAC,KAAoB,EAAA,EAAE,OAA2B,KAAA;AACnF,IAAI,IAAA,KAAA,CAAM,EAAO,KAAA,KAAA,CAAM,OAAS,EAAA;AAC9B,MAAO,OAAA;AAAA,QACL,SAAS,CAAY,SAAA,EAAA,KAAA,CAAM,OAAO,CAAA,iDAAA,EAAoD,MAAM,EAAE,CAAA,CAAA;AAAA,OAChG;AAAA;AACF,GACD,CAAA;AAED,EAAA,MAAM,YAAY,MAAO,CAAA,YAAA,EAAc,CAAC,KAAoB,EAAA,EAAE,OAA2B,KAAA;AACvF,IAAA,MAAM,SAAS,IAAI,GAAA;AAAA,MACjB,KAAM,CAAA,IAAA,CAAK,KAAM,CAAA,iBAAA,CAAkB,MAAO,EAAC,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,CAAE,CAAA,WAAA,EAAwB;AAAA,KACpF;AAEA,IAAA,IAAI,CAAC,MAAO,CAAA,GAAA,CAAI,MAAM,SAAU,CAAA,WAAA,EAAwB,CAAG,EAAA;AACzD,MAAO,OAAA;AAAA,QACL,SAAS,CAAc,WAAA,EAAA,KAAA,CAAM,SAAS,CAAA,6BAAA,EAAgC,MAAM,OAAO,CAAA;AAAA,OACrF;AAAA;AACF,GACD,CAAA;AAED,EAAA,MAAM,MAAS,GAAA,MAAA,CAAO,QAAU,EAAA,CAAC,OAAoB,CAAqB,KAAA;AACxE,IAAI,IAAA,KAAA,CAAM,SAAS,IAAK,CAAA,KAAA,CAAM,KAAK,GAAI,EAAA,GAAI,GAAI,CAAG,EAAA;AAChD,MAAO,OAAA,EAAE,SAAS,iBAAkB,EAAA;AAAA;AACtC,GACD,CAAA;AAED,EAAA,MAAM,iBAAoB,GAAA,MAAA;AAAA,IACxB,4BAAA;AAAA,IACA,CAAC,OAAoB,CAAqB,KAAA;AACxC,MAAA,IAAI,CAAC,KAAM,CAAA,GAAA,IAAO,KAAM,CAAA,QAAA,CAAS,SAAS,IAAM,EAAA;AAC9C,QAAO,OAAA,EAAE,SAAS,2CAA4C,EAAA;AAAA;AAChE;AACF,GACF;AAEA,EAAA,MAAM,mBAAsB,GAAA,MAAA;AAAA,IAC1B,+BAAA;AAAA,IACA,CAAC,OAAoB,CAAqB,KAAA;AACxC,MAAA,IAAI,KAAM,CAAA,GAAA,IAAO,KAAM,CAAA,QAAA,CAAS,SAAS,IAAM,EAAA;AAC7C,QAAA,MAAM,UAAU,IAAI,GAAA;AAAA,UAClB,gBAAS,CAAA,4BAAA,CAA6B,gBAAS,CAAA,YAAA,CAAa,kBAAkB,CAAE,CAAA,GAAA;AAAA,YAAI,CAAC,CACnF,KAAA,CAAA,CAAE,WAAY;AAAA;AAChB,SACF;AAEA,QAAA,MAAM,eAAkB,GAAA,KAAA,CAAM,QAAS,CAAA,OAAA,EAAS,WAAY,EAAA;AAC5D,QAAA,IAAI,CAAC,eAAmB,IAAA,CAAC,OAAQ,CAAA,GAAA,CAAI,eAAe,CAAG,EAAA;AACrD,UAAO,OAAA;AAAA,YACL,OACE,EAAA;AAAA,WACJ;AAAA;AACF;AACF;AACF,GACF;AAEA,EAAA,MAAM,0BAA6B,GAAA,MAAA;AAAA,IACjC,sCAAA;AAAA,IACA,CAAC,OAAoB,CAAqB,KAAA;AACxC,MAAA,IAAI,CAAC,KAAM,CAAA,GAAA,IAAO,KAAM,CAAA,QAAA,CAAS,SAAS,IAAM,EAAA;AAC9C,QAAA,MAAM,UAAU,IAAI,GAAA;AAAA,UAClB,gBAAS,CAAA,4BAAA,CAA6B,gBAAS,CAAA,YAAA,CAAa,iBAAiB,CAAE,CAAA,GAAA;AAAA,YAAI,CAAC,CAClF,KAAA,CAAA,CAAE,WAAY;AAAA;AAChB,SACF;AACA,QAAA,MAAM,eAAkB,GAAA,KAAA,CAAM,QAAS,CAAA,OAAA,EAAS,WAAY,EAAA;AAC5D,QAAA,IAAI,CAAC,eAAmB,IAAA,CAAC,OAAQ,CAAA,GAAA,CAAI,eAAe,CAAG,EAAA;AACrD,UAAO,OAAA,EAAE,SAAS,iDAAkD,EAAA;AAAA;AACtE;AACF;AACF,GACF;AAEA,EAAA,MAAM,uBAA0B,GAAA,MAAA;AAAA,IAC9B,mCAAA;AAAA,IACA,CAAC,OAAoB,CAAqB,KAAA;AACxC,MAAA,IAAI,CAAC,KAAM,CAAA,GAAA,IAAO,KAAM,CAAA,QAAA,CAAS,SAAS,IAAM,EAAA;AAC9C,QAAI,IAAA;AACF,UAAA,MAAM,OAAU,GAAA,gBAAA,CAAS,uBAAwB,CAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACpE,UAAI,IAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AACxB,YAAO,OAAA,EAAE,SAAS,gEAAiE,EAAA;AAAA;AACrF,iBACOC,EAAG,EAAA;AACV,UAAO,OAAA,EAAE,SAAS,6CAA8C,EAAA;AAAA;AAClE;AACF;AACF,GACF;AAEA,EAAA,MAAM,6BAAgC,GAAA,MAAA;AAAA,IACpC,yCAAA;AAAA,IACA,CAAC,OAAoB,CAAqB,KAAA;AACxC,MAAA,IAAI,CAAC,KAAM,CAAA,GAAA,IAAO,KAAM,CAAA,QAAA,CAAS,SAAS,IAAM,EAAA;AAC9C,QAAI,IAAA;AACF,UAAA,MAAM,OAAU,GAAA,gBAAA,CAAS,uBAAwB,CAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACpE,UAAA,MAAM,mBAAmB,IAAI,GAAA;AAAA,YAC3B,KAAA,CAAM,YAAY,GAAI,CAAA,CAAC,MAAM,CAAE,CAAA,KAAA,CAAM,aAAwB;AAAA,WAC/D;AACA,UAAW,KAAA,MAAA,EAAE,UAAW,EAAA,IAAK,OAAS,EAAA;AACpC,YAAA,IAAI,CAAC,gBAAiB,CAAA,GAAA,CAAI,UAAW,CAAA,WAAA,EAAwB,CAAG,EAAA;AAC9D,cAAO,OAAA,EAAE,SAAS,4DAA6D,EAAA;AAAA;AACjF;AACF,iBACOA,EAAG,EAAA;AAAA;AAAC;AACf;AACF,GACF;AAEA,EAAA,MAAM,sBAAyB,GAAA,MAAA;AAAA,IAC7B,kCAAA;AAAA,IACA,CAAC,OAAoB,CAAqB,KAAA;AACxC,MAAA,IAAI,KAAM,CAAA,GAAA,IAAO,KAAM,CAAA,QAAA,CAAS,SAAS,IAAM,EAAA;AAC7C,QAAI,IAAA;AACF,UAAA,MAAM,OAAU,GAAA,gBAAA,CAAS,wBAAyB,CAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACrE,UAAI,IAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AACxB,YAAO,OAAA,EAAE,SAAS,0DAA2D,EAAA;AAAA;AAC/E,iBACOA,EAAG,EAAA;AACV,UAAO,OAAA,EAAE,SAAS,4CAA6C,EAAA;AAAA;AACjE;AACF;AACF,GACF;AAEA,EAAA,MAAM,uBAA0BF,GAAAA,MAAAA;AAAA,IAC9B,mCAAA;AAAA,IACA,OAAO,MAAA,EAAuB,EAAE,MAAA,EAAQ,OAA2B,KAAA;AACjE,MAAM,MAAA,gBAAA,uBAAuB,GAO3B,EAAA;AAEF,MAAM,MAAA,oBAAA,uBAA2B,GAA0D,EAAA;AAC3F,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CAAK,EAAA,EAAA;AACtC,QAAM,MAAA,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,QAAA,IAAI,KAAM,CAAA,GAAA,IAAO,KAAM,CAAA,QAAA,CAAS,SAAS,IAAM,EAAA;AAC7C,UAAI,IAAA;AACF,YAAA,MAAM,cAAiB,GAAA,gBAAA,CAAS,wBAAyB,CAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AAC5E,YAAW,KAAA,MAAA,EAAE,KAAM,EAAA,IAAK,cAAgB,EAAA;AACtC,cAAM,MAAA,sBAAA,GAAyB,MAAM,WAAY,EAAA;AACjD,cAAA,IAAI,CAAC,oBAAA,CAAqB,GAAI,CAAA,sBAAsB,CAAG,EAAA;AACrD,gBAAqB,oBAAA,CAAA,GAAA,CAAI,sBAAwB,EAAA,EAAE,CAAA;AAAA;AAErD,cAAqB,oBAAA,CAAA,GAAA,CAAI,sBAAsB,CAAG,CAAA,IAAA,CAAK,EAAE,KAAO,EAAA,CAAA,EAAG,OAAO,CAAA;AAAA;AAC5E,mBACO,CAAG,EAAA;AAAA;AAEZ;AACF;AAGF,MAAA,MAAM,oBAAuB,GAAA,KAAA,CAAM,IAAK,CAAA,oBAAA,CAAqB,MAAM,CAAA;AACnE,MAAI,IAAA,oBAAA,CAAqB,MAAW,KAAA,CAAA,EAAU,OAAA,gBAAA;AAE9C,MAAA,MAAM,oBAAuB,GAAA,MAAA,CAAO,MAAO,CAAA,KAAA,CAAM,cAAc,CAAA;AAE/D,MAAA,MAAM,qBAAqB,EAAC;AAC5B,MAAA,KAAA,MAAW,gBAAgB,oBAAsB,EAAA;AAC/C,QAAA,kBAAA,CAAmB,IAAK,CAAA;AAAA,UACtB,OAAS,EAAA,YAAA;AAAA,UACT,KAAK,WAAI,CAAA,OAAA;AAAA,UACT,YAAc,EAAA;AAAA,SACN,CAAA;AAEV,QAAA,KAAA,MAAW,kBAAkB,oBAAsB,EAAA;AACjD,UAAA,kBAAA,CAAmB,IAAK,CAAA;AAAA,YACtB,OAAS,EAAA,cAAA;AAAA,YACT,KAAK,WAAI,CAAA,iBAAA;AAAA,YACT,YAAc,EAAA,cAAA;AAAA,YACd,IAAA,EAAM,CAAC,YAAuB;AAAA,WACtB,CAAA;AAAA;AACZ;AAGF,MAAM,MAAA,gBAAA,GAAmB,MAAM,MAAA,CAAO,SAAU,CAAA;AAAA,QAC9C,SAAW,EAAA,kBAAA;AAAA,QACX,YAAc,EAAA;AAAA,OACf,CAAA;AAED,MAAM,MAAA,mBAAA,uBAA0B,GAA4B,EAAA;AAC5D,MAAM,MAAA,gBAAA,uBAAuB,GAAY,EAAA;AAEzC,MAAA,MAAM,oBAAoB,oBAAqB,CAAA,MAAA;AAE/C,MAAA,IAAI,WAAc,GAAA,CAAA;AAClB,MAAA,KAAA,MAAW,gBAAgB,oBAAsB,EAAA;AAC/C,QAAM,MAAA,eAAA,GAAkB,iBAAiB,WAAa,EAAA,CAAA;AACtD,QAAA,MAAM,YACJ,GAAA,eAAA,CAAgB,MAAW,KAAA,SAAA,GAAa,gBAAgB,MAAqB,GAAA,IAAA;AAE/E,QAAoB,mBAAA,CAAA,GAAA,CAAI,cAAc,YAAY,CAAA;AAElD,QAAA,IAAI,qBAAwB,GAAA,KAAA;AAC5B,QAAA,KAAA,IAAS,YAAe,GAAA,CAAA,EAAG,YAAe,GAAA,iBAAA,EAAmB,YAAgB,EAAA,EAAA;AAC3E,UAAM,MAAA,iBAAA,GAAoB,iBAAiB,WAAa,EAAA,CAAA;AAExD,UAAA,IAAI,iBAAkB,CAAA,MAAA,KAAW,SAAa,IAAA,iBAAA,CAAkB,WAAW,IAAM,EAAA;AAC/E,YAAwB,qBAAA,GAAA,IAAA;AAAA;AAC1B;AAGF,QAAA,IAAI,qBAAuB,EAAA;AACzB,UAAA,gBAAA,CAAiB,IAAI,YAAY,CAAA;AAAA;AACnC;AAGF,MAAM,MAAA,YAAA,uBAAmB,GAAyB,EAAA;AAClD,MAAW,KAAA,MAAA,WAAA,IAAe,oBAAqB,CAAA,MAAA,EAAU,EAAA;AACvD,QAAA,KAAA,MAAW,EAAE,KAAA,EAAO,KAAM,EAAA,IAAK,WAAa,EAAA;AAC1C,UAAa,YAAA,CAAA,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA;AAC/B;AAGF,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,YAAc,EAAA;AACzC,QAAI,IAAA;AACF,UAAA,MAAM,cAAiB,GAAA,gBAAA,CAAS,wBAAyB,CAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AAC5E,UAAA,MAAM,mBAA6E,EAAC;AAEpF,UAAW,KAAA,MAAA,EAAE,KAAM,EAAA,IAAK,cAAgB,EAAA;AACtC,YAAM,MAAA,sBAAA,GAAyB,MAAM,WAAY,EAAA;AACjD,YAAM,MAAA,YAAA,GAAe,mBAAoB,CAAA,GAAA,CAAI,sBAAsB,CAAA;AACnE,YAAM,MAAA,YAAA,GAAe,gBAAiB,CAAA,GAAA,CAAI,sBAAsB,CAAA;AAEhE,YAAA,MAAM,iBAA2B,EAAC;AAElC,YAAA,IAAI,iBAAiB,IAAM,EAAA;AACzB,cAAA,cAAA,CAAe,KAAK,mBAAmB,CAAA;AAAA,aACzC,MAAA,IACE,gBACA,YAAa,CAAA,WAAA,OAAkB,KAAM,CAAA,SAAA,CAAU,aAC/C,EAAA;AACA,cAAA,cAAA,CAAe,KAAK,gBAAgB,CAAA;AAAA;AAGtC,YAAA,IAAI,CAAC,YAAc,EAAA;AACjB,cAAA,cAAA,CAAe,KAAK,2BAA2B,CAAA;AAAA;AAGjD,YAAI,IAAA,cAAA,CAAe,SAAS,CAAG,EAAA;AAC7B,cAAA,gBAAA,CAAiB,IAAK,CAAA;AAAA,gBACpB,YAAc,EAAA,KAAA;AAAA,gBACd,cAAA,EAAgB,cAAe,CAAA,IAAA,CAAK,IAAI;AAAA,eACzC,CAAA;AAAA;AACH;AAGF,UAAI,IAAA,gBAAA,CAAiB,SAAS,CAAG,EAAA;AAC/B,YAAA,MAAM,cAAiB,GAAA,gBAAA,CACpB,GAAI,CAAA,CAAC,MAAM,CAAG,EAAA,CAAA,CAAE,YAAY,CAAA,EAAA,EAAK,CAAE,CAAA,cAAc,CAAG,CAAA,CAAA,CAAA,CACpD,KAAK,IAAI,CAAA;AACZ,YAAA,gBAAA,CAAiB,IAAI,KAAO,EAAA;AAAA,cAC1B,OAAA,EAAS,0CAA0C,cAAc,CAAA;AAAA,aAClE,CAAA;AAAA;AACH,iBACO,CAAG,EAAA;AAAA;AAEZ;AAGF,MAAO,OAAA,gBAAA;AAAA;AACT,GACF;AAEA,EAAA,MAAM,QAAW,GAAA,MAAA,CAAO,UAAY,EAAA,CAAC,OAAoB,CAAqB,KAAA;AAC5E,IAAM,MAAA,iBAAA,GAAoB,CAAC,gBAAS,CAAA,IAAA,CAAK,cAAc,CAAG,EAAA,gBAAA,CAAS,IAAK,CAAA,mBAAmB,CAAC,CAAA;AAE5F,IAAA,IAAI,CAAC,iBAAA,CAAkB,QAAS,CAAA,KAAA,CAAM,QAAQ,CAAG,EAAA;AAC/C,MAAO,OAAA;AAAA,QACL,OAAA,EAAS,CAA0C,uCAAA,EAAA,iBAAA,CAAkB,CAAC,CAAC,CAA2B,wBAAA,EAAA,iBAAA,CAAkB,CAAC,CAAC,CAAW,QAAA,EAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,OACjJ;AAAA;AACF,GACD,CAAA;AAED,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA;AAAA;AAAA,IAGA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,0BAAA;AAAA,IACA,uBAAA;AAAA,IACA,6BAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC5WA,IAAA,qBAAA,GAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAAG,OAAAA,EAAAA,MAAAA;AAAA,CAAA,CAAA;ACcA,IAAMC,mBAAqB,GAAA,GAAA;AAC3B,IAAMC,qBAAuB,GAAA,GAAA;AAQtB,SAAS5C,MAAK,UAA8C,EAAA;AACjE,EAAA,MAAM,MAAiC,GAAA;AAAA,IACrC,QAAQ,UAAW,CAAA,MAAA;AAAA,IACnB,gBAAgB,UAAW,CAAA,cAAA;AAAA,IAC3B,WAAA,EAAa,WAAW,WAAe4C,IAAAA;AAAA,GACzC;AAEA,EAAO,OAAA;AAAA,IACL,GAAK,EAAA,CAACC,WAAe,KAAA,GAAA,CAAI,QAAQA,WAAU,CAAA;AAAA,IAC3C,GAAK,EAAA,CAACA,WAAe,KAAA,GAAA,CAAI,QAAQA,WAAU,CAAA;AAAA,IAC3C,KAAO,EAAA,CAACA,WAAe,KAAA,KAAA,CAAM,QAAQA,WAAU,CAAA;AAAA,IAC/C,MAAQ,EAAA,CAACA,WAAe,KAAA,YAAA,CAAa,QAAQA,WAAU;AAAA,GACzD;AACF;AAwBA,eAAsB,GAAA,CACpB,QACA,UAC8C,EAAA;AAC9C,EAAA,MAAM,KAAQ,GAAA,aAAA,CAAM,IAAK,CAAA,UAAA,CAAW,KAAK,CAAA;AACzC,EAAA,IAAI,CAAC,MAAO,CAAA,MAAA,CAAO,OAAS,EAAA,MAAM,IAAI,wBAAyB,EAAA;AAE/D,EAAA,MAAM,OAAU,GAAA,MAAM,UAAW,CAAA,MAAA,CAAO,MAAM,CAAA;AAC9C,EAAI,IAAA,MAAA,CAAO,OAAO,CAAA,KAAM,KAAM,CAAA,OAAA;AAC5B,IAAA,MAAM,IAAI,oBAAqB,CAAA,KAAA,CAAM,OAAS,EAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAE/D,EAAI,IAAA;AACF,IAAA,MAAM,EAAK,GAAA,MAAM,MAAO,CAAA,MAAA,CAAO,eAAgB,CAAA;AAAA,MAC7C,KAAA,EAAO,OAAO,MAAO,CAAA,KAAA;AAAA,MACrB,OAAA,EAAS,OAAO,MAAO,CAAA,OAAA;AAAA,MACvB,IAAI,MAAO,CAAA,cAAA;AAAA,MACX,IAAA,EAAM,aAAM,CAAA,MAAA,CAAO,KAAK;AAAA,KACzB,CAAA;AAED,IAAO,OAAA,EAAE,KAAO,EAAA,MAAA,EAAQ,EAAG,EAAA;AAAA,WACpB,KAAO,EAAA;AACd,IAAA,MAAM,IAAI,eAAgB,CAAA,KAAA,YAAiB,KAAQ,GAAA,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA;AAEtF;AAUA,gBAAuB,GAAA,CACrB,QACA,UAC4E,EAAA;AAC5E,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAQ,GAAA,MAAA;AAAA,IACR,OAAS,EAAA,EAAE,YAAeF,GAAAA,mBAAAA,KAAuB;AAAC,GACpD,GAAI,cAAc,EAAC;AAEnB,EAAA,OAAO,aAAa,MAAQ,EAAA;AAAA,IAC1B,SAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAS,EAAA,EAAE,YAAc,EAAA,WAAA,EAAa,OAAO,WAAY;AAAA,GAC1D,CAAA;AACH;AAUO,SAAS,KAAA,CAAM,QAAgC,UAAoC,EAAA;AACxF,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAS,EAAE,QAAA,GAAW,KAAQ,YAAeA,GAAAA,mBAAAA,KAAuB,EAAC;AAAA,IACrE;AAAA,GACE,GAAA,UAAA;AAEJ,EAAO,OAAA,IAAA;AAAA,IACL,YAAY;AACV,MAAM,MAAA,cAAA,GAAiB,MAAM,eAAgB,EAAA;AAE7C,MAAM,MAAA,MAAA,GAAS,aAAa,MAAQ,EAAA;AAAA,QAClC,SAAA;AAAA,QACA,KAAO,EAAA,KAAA;AAAA,QACP,cAAA;AAAA,QACA,OAAS,EAAA,EAAE,YAAc,EAAA,WAAA,EAAa,OAAO,WAAY;AAAA,OAC1D,CAAA;AAED,MAAA,WAAA,MAAiB,EAAE,MAAA,EAAQ,WAAY,EAAA,IAAK,MAAQ,EAAA;AAClD,QAAM,MAAA,QAAA,CAAS,QAAQ,WAAW,CAAA;AAAA;AACpC,KACF;AAAA,IACA,EAAE,QAAS;AAAA,GACb;AACF;AAMA,IAAM,YAAA,uBAAmB,GAAoB,EAAA;AAM7C,IAAM,UAAA,GAAa,OAAO,MAAwC,KAAA;AAChE,EAAI,IAAA,YAAA,CAAa,IAAI,MAAO,CAAA,GAAG,GAAU,OAAA,YAAA,CAAa,GAAI,CAAA,MAAA,CAAO,GAAG,CAAA;AACpE,EAAM,MAAA,OAAA,GAAU,MAAM,MAAA,CAAO,UAAW,EAAA;AACxC,EAAa,YAAA,CAAA,GAAA,CAAI,MAAO,CAAA,GAAA,EAAK,OAAO,CAAA;AACpC,EAAO,OAAA,OAAA;AACT,CAAA;AAIA,gBAAgB,YAAA,CACd,QACA,UAK4E,EAAA;AAC5E,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAQ,GAAA,MAAA;AAAA,IACR,OAAA,EAAS,EAAE,YAAeA,GAAAA,mBAAAA,EAAoB,cAAc,MAAO,CAAA,WAAA,KAAgB;AAAC,GAClF,GAAA,UAAA;AAEJ,EAAM,MAAA,MAAA,GAAS,cAAM,UAAW,CAAA;AAAA,IAC9B,MAAQ,EAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAOG,kBAAa,CAAA;AAAA,IAC1C,iBAAiB,MAAO,CAAA,cAAA;AAAA,IACxB,KAAO,EAAA;AAAA,MACL,IAAM,EAAA,OAAA;AAAA,MACN,IAAM,EAAA,OAAA;AAAA,MACN,MAAA,EAAQ,CAAC,EAAE,IAAM,EAAA,MAAA,EAAQ,IAAM,EAAA,OAAA,EAAS,OAAS,EAAA,KAAA,EAAO,YAAc,EAAA,OAAA,EAAS,CAAA;AAAA,MAC/E,SAAW,EAAA;AAAA,KACb;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,EAAE,YAAA,EAAc,WAAY;AAAA,GACtC,CAAA;AAED,EAAI,IAAA,WAAA,GAAc,KAAU,KAAA,KAAA,GAAQ,cAAiB,GAAA,cAAA;AACrD,EAAA,WAAA,MAAiB,EAAE,IAAA,EAAM,WAAa,EAAA,cAAA,MAAoB,MAAQ,EAAA;AAChE,IAAc,WAAA,GAAA,cAAA;AACd,IAAI,IAAA,IAAA,CAAK,WAAW,CAAG,EAAA;AACvB,IAAA,IAAI,qBAAwB,GAAA,IAAA,CACzB,GAAI,CAAA,CAAC,GAAQ,KAAA;AACZ,MAAM,MAAA,CAAC,OAAO,CAAA,GAAI5C,wBAAoB,CAAA,CAAC,EAAE,IAAA,EAAM,OAAQ,EAAC,CAAG,EAAA,GAAA,CAAI,IAAI,CAAA;AACnE,MAAI,IAAA;AACF,QAAO,OAAA,EAAE,KAAO,EAAA,aAAA,CAAM,MAAO,CAAA,OAAA,EAAS,IAAI,WAAW,CAAA,EAAG,WAAa,EAAA,GAAA,CAAI,WAAY,EAAA;AAAA,eAC9E,CAAG,EAAA;AACV,QAAO,OAAA,IAAA;AAAA;AACT,KACD,CACA,CAAA,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,IAAI,CAAA;AAEjC,IAAI,IAAA,SAAA;AACF,MAAA,qBAAA,GAAwB,qBAAsB,CAAA,MAAA;AAAA,QAC5C,CAAC,MAAM,CAAE,CAAA,KAAA,CAAM,UAAU,WAAY,EAAA,KAAM,UAAU,WAAY;AAAA,OACnE;AAEF,IAAI,IAAA,qBAAA,CAAsB,WAAW,CAAG,EAAA;AAExC,IAAM,MAAA;AAAA,MACJ,QAAQ,qBAAsB,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,KAAK,CAAA;AAAA,MACtD;AAAA,KACF;AAAA;AAGF,EAAA,MAAM,EAAE,MAAA,EAAQ,EAAC,EAAG,WAA0B,EAAA;AAC9C,EAAA;AACF;AAEO,IAAM,wBAAA,GAAN,cAA8C,SAAU,CAAA;AAAA,EAE7D,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,4BAA4B,CAAA;AAFpC,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,kCAAA,CAAA;AAAA;AAIlB,CAAA;AAEO,IAAM,eAAA,GAAN,cAAqC,SAAU,CAAA;AAAA,EAA/C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,yBAAA,CAAA;AAAA;AAClB,CAAA;AAEO,IAAM,oBAAA,GAAN,cAA0C,SAAU,CAAA;AAAA,EAEzD,WAAA,CAAY,UAAkB,MAAgB,EAAA;AAC5C,IAAA,KAAA,CAAM,CAAwC,qCAAA,EAAA,QAAQ,CAAyB,sBAAA,EAAA,MAAM,CAAG,CAAA,CAAA,CAAA;AAF1F,IAAA,aAAA,CAAA,IAAA,EAAS,MAAO,EAAA,8BAAA,CAAA;AAAA;AAIlB,CAAA;;;ADjKO,SAASwC,SAAQ,UAA+C,EAAA;AACrE,EAAA,OAAiB1C,MAAK,UAAU,CAAA;AAClC","file":"index.browser.js","sourcesContent":["export * from \"./health.ts\";\nexport * as ObligationResponse from \"./ObligationResponse.ts\";\nexport * as OfferResponse from \"./OfferResponse.ts\";\nexport * from \"./openapi.ts\";\nexport { parse, safeParse } from \"./requests.ts\";\n","import { z } from \"zod/v4\";\n\nexport const CollectorHealth = z.object({\n name: z.string(),\n chain_id: z.number(),\n block_number: z.number().nullable(),\n updated_at: z.string().nullable(),\n lag: z.number().nullable(),\n status: z.enum([\"live\", \"lagging\", \"unknown\"]),\n});\n\nexport const CollectorsHealthResponse = z.array(CollectorHealth);\n\nexport const ChainHealth = z.object({\n chain_id: z.number(),\n block_number: z.number(),\n updated_at: z.string(),\n});\n\nexport const ChainsHealthResponse = z.array(ChainHealth);\n\nexport const RouterStatusResponse = z.object({\n status: z.enum([\"live\", \"syncing\"]),\n});\n\nexport type CollectorsHealthResponse = z.infer<typeof CollectorsHealthResponse>;\nexport type ChainsHealthResponse = z.infer<typeof ChainsHealthResponse>;\nexport type RouterStatusResponse = z.infer<typeof RouterStatusResponse>;\n","import type { Hex } from \"viem\";\nimport type { Compute, Obligation, Quote } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\n\nexport type ObligationResponse = Format.Snake<\n Compute<\n {\n /** The obligation id. */\n id: Hex;\n } & Obligation.Obligation & {\n ask: Quote.Quote[\"ask\"];\n bid: Quote.Quote[\"bid\"];\n }\n >\n>;\n\n/**\n * Creates an `ObligationResponse` from a `Obligation`.\n * @constructor\n * @param obligation - {@link Obligation}\n * @returns The created `ObligationResponse`. {@link ObligationResponse}\n */\nexport function from(obligation: Obligation.Obligation, quote: Quote.Quote): ObligationResponse {\n return Format.toSnakeCase({\n id: quote.obligationId,\n ...obligation,\n ask: quote.ask,\n bid: quote.bid,\n });\n}\n","import { getAddress, isAddress } from \"viem\";\n\n/** The snake case representation of a type with bigint values stringified. */\nexport type Snake<T> = SnakeKeys<StringifiedBigint<T>>;\n\n/** Stringifies bigint values to strings and preserves branded primitives. */\ntype StringifiedBigint<T> =\n // non-distributive check so that `bigint & Brand<...>` is still caught here\n [T] extends [bigint]\n ? string\n : // Preserve branded primitives by matching the primitive first.\n T extends number\n ? T\n : T extends string\n ? T\n : T extends boolean\n ? T\n : T extends symbol\n ? T\n : T extends null | undefined\n ? T\n : T extends readonly (infer U)[]\n ? readonly StringifiedBigint<U>[]\n : T extends object\n ? { [K in keyof T]: StringifiedBigint<T[K]> }\n : T;\n\n/** Key remapping that also preserves branded primitives. */\ntype SnakeKeys<T> = T extends readonly (infer U)[]\n ? readonly SnakeKeys<U>[]\n : T extends number | string | boolean | symbol | null | undefined\n ? T\n : T extends object\n ? { [K in keyof T as ToSnakeCase<Extract<K, string>>]: SnakeKeys<T[K]> }\n : T;\n\ntype ToSnakeCase<S extends string> = S extends `${infer Head}${infer Tail}`\n ? Tail extends Uncapitalize<Tail>\n ? `${Lowercase<Head>}${ToSnakeCase<Tail>}`\n : `${Lowercase<Head>}_${ToSnakeCase<Uncapitalize<Tail>>}`\n : S;\n\n/**\n * Formats object keys to snake case.\n * Preserves ethereum addresses as is.\n * Converts ethereum addresses to checksummed if used as values.\n * Stringifies bigint values to strings.\n */\nexport function toSnakeCase<T>(obj: T): Snake<T> {\n return stringifyBigint(\n processObject(\n obj,\n (s: string) => s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`),\n (value: unknown) =>\n typeof value === \"string\" && isAddress(value.toLowerCase())\n ? getAddress(value.toLowerCase())\n : value,\n ),\n ) as Snake<T>;\n}\n\n/**\n * Formats a snake case object to its camel case type.\n * Preserves ethereum addresses as is.\n * Converts checksummed ethereum addresses to lowercase if used as values.\n * @warning Does not unstringify bigint values.\n */\nexport function fromSnakeCase<T>(obj: Snake<T>): T {\n return processObject(\n obj,\n (s: string) =>\n isAddress(s.toLowerCase()) ? s : s.replace(/_([a-z])/g, (_, c) => c.toUpperCase()),\n (value: unknown) =>\n typeof value === \"string\" && isAddress(value.toLowerCase()) ? value.toLowerCase() : value,\n ) as T;\n}\n\nfunction processObject<T>(\n obj: T,\n fnKey: (str: string) => string,\n fnValue: (value: unknown) => unknown,\n): unknown {\n if (typeof obj !== \"object\" || obj === null) return obj;\n\n if (Array.isArray(obj)) return obj.map((item) => processObject(item, fnKey, fnValue));\n\n return Object.entries(obj as Record<string, unknown>).reduce(\n (acc, [key, value]) => {\n const newKey = fnKey(key);\n acc[newKey] =\n typeof value === \"object\" && value !== null\n ? processObject(value, fnKey, fnValue)\n : fnValue(value);\n\n return acc;\n },\n {} as Record<string, unknown>,\n );\n}\n\nfunction stringifyBigint<T>(value: T): StringifiedBigint<T> {\n if (typeof value === \"bigint\") return value.toString() as StringifiedBigint<T>;\n if (Array.isArray(value)) return value.map(stringifyBigint) as StringifiedBigint<T>;\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[k] = stringifyBigint(v);\n }\n return out as StringifiedBigint<T>;\n }\n\n return value as StringifiedBigint<T>;\n}\n","import type { Offer } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\n\nexport type OfferResponse = Format.Snake<Offer.Offer>;\n\n/**\n * Creates an `OfferResponse` from an `Offer`.\n * @constructor\n * @param offer - {@link Offer}\n * @returns The created `OfferResponse`. {@link OfferResponse}\n */\nexport function from(offer: Offer.Offer): OfferResponse {\n return Format.toSnakeCase(offer);\n}\n","export const Oracle = [\n {\n type: \"function\",\n name: \"price\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const ERC4626 = [\n {\n type: \"function\",\n name: \"asset\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const MetaMorphoFactory = [\n {\n type: \"function\",\n name: \"isMetaMorpho\",\n inputs: [{ name: \"target\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const MetaMorpho = [\n {\n type: \"function\",\n name: \"withdrawQueue\",\n inputs: [{ name: \"index\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"withdrawQueueLength\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"maxWithdraw\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const Morpho = [\n {\n type: \"function\",\n name: \"collateralOf\",\n inputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"debtOf\",\n inputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"market\",\n inputs: [\n {\n name: \"id\",\n type: \"bytes32\",\n internalType: \"Id\",\n },\n ],\n outputs: [\n {\n name: \"totalSupplyAssets\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalSupplyShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalBorrowAssets\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalBorrowShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"lastUpdate\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"fee\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"position\",\n inputs: [\n {\n name: \"id\",\n type: \"bytes32\",\n internalType: \"Id\",\n },\n {\n name: \"user\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"supplyShares\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"borrowShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"collateral\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","import type { Address, Hex } from \"viem\";\nimport { decodeAbiParameters, encodeAbiParameters } from \"viem\";\n\nexport enum CallbackType {\n BuyWithEmptyCallback = \"buy_with_empty_callback\",\n BuyVaultV1Callback = \"buy_vault_v1_callback\",\n SellERC20Callback = \"sell_erc20_callback\",\n}\n\nexport const WhitelistedCallbackAddresses: Record<CallbackType, readonly string[]> = {\n [CallbackType.BuyWithEmptyCallback]: [],\n [CallbackType.BuyVaultV1Callback]: [\n \"0x3333333333333333333333333333333333333333\",\n \"0x4444444444444444444444444444444444444444\", // @TODO: update once deployed and add mapping per chain if needed\n ].map((address) => address.toLowerCase()),\n [CallbackType.SellERC20Callback]: [\n \"0x1111111111111111111111111111111111111111\",\n \"0x2222222222222222222222222222222222222222\", // @TODO: update once deployed and add mapping per chain if needed\n ].map((address) => address.toLowerCase()),\n} as const;\n\nexport function decodeBuyVaultV1Callback(data: Hex): Array<{\n vault: Address;\n amount: bigint;\n}> {\n if (!data || data === \"0x\") throw new Error(\"Empty callback data\");\n try {\n const [vaults, amounts] = decodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n data,\n ) as [Address[], bigint[]];\n if (vaults.length !== amounts.length) {\n throw new Error(\"Mismatched array lengths\");\n }\n return vaults.map((v, i) => ({ vault: v, amount: amounts[i]! }));\n } catch (_) {\n throw new Error(\"Invalid BuyVaultV1Callback callback data\");\n }\n}\n\nexport function decodeSellERC20Callback(data: Hex): Array<{\n collateral: Address;\n amount: bigint;\n}> {\n if (!data || data === \"0x\") throw new Error(\"Empty callback data\");\n try {\n const [collaterals, amounts] = decodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n data,\n ) as [Address[], bigint[]];\n if (collaterals.length !== amounts.length) {\n throw new Error(\"Mismatched array lengths\");\n }\n return collaterals.map((c, i) => ({ collateral: c, amount: amounts[i]! }));\n } catch (_) {\n throw new Error(\"Invalid SellERC20Callback callback data\");\n }\n}\n\nexport function encodeBuyVaultV1Callback(parameters: {\n vaults: Address[];\n amounts: bigint[];\n}): Hex {\n return encodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n [parameters.vaults, parameters.amounts],\n );\n}\n\nexport function encodeSellERC20Callback(parameters: {\n collaterals: Address[];\n amounts: bigint[];\n}): Hex {\n return encodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n [parameters.collaterals, parameters.amounts],\n );\n}\n","import type { AbiEvent, Address, GetLogsReturnType, PublicClient } from \"viem\";\nimport { getBlock, getLogs } from \"viem/actions\";\nimport {\n type Chain as ViemChain,\n anvil as viemAnvil,\n base as viemBase,\n mainnet as viemEthereum,\n} from \"viem/chains\";\nimport * as BigMath from \"#utils/BigMath.ts\";\nimport { batch } from \"#utils/batch.ts\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Compute } from \"./types.ts\";\n\nexport const chainNames = [\"ethereum\", \"base\", \"ethereum-virtual-testnet\", \"anvil\"] as const;\nexport type ChainName = (typeof chainNames)[number];\n\nexport const ChainId = {\n ETHEREUM: BigInt(viemEthereum.id),\n BASE: BigInt(viemBase.id),\n \"ETHEREUM-VIRTUAL-TESTNET\": 109111114n,\n ANVIL: 505050505n, // random id to not clash with other chains\n};\nexport type Id = (typeof ChainId)[keyof typeof ChainId];\nexport const chainIds = new Set(Object.values(ChainId));\n\nexport type Chain = Compute<\n Omit<ViemChain, \"id\" | \"name\"> & {\n id: Id;\n name: ChainName;\n whitelistedAssets: Set<Address>;\n morpho: Address;\n morphoBlue: Address;\n mempool: {\n address: Address;\n deploymentBlock: number;\n reindexBuffer: number;\n };\n vaultV1Factory: Record<string, Address>;\n }\n>;\n\nconst chainNameLookup = new Map(Object.entries(ChainId).map(([key, value]) => [value, key]));\n\nexport function getChain(chainId: Id): Chain | undefined {\n const chainName = chainNameLookup.get(chainId)?.toLowerCase() as ChainName;\n if (!chainName) {\n return undefined;\n }\n return chains[chainName];\n}\n\nexport const getWhitelistedChains = (): Chain[] => {\n return [chains.ethereum, chains.base, chains[\"ethereum-virtual-testnet\"], chains.anvil];\n};\n\nexport const chains: Record<ChainName, Chain> = {\n ethereum: {\n ...viemEthereum,\n id: ChainId.ETHEREUM,\n name: \"ethereum\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x0000000000000000000000000000000000000000\",\n deploymentBlock: 23347674,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\",\n \"v1.1\": \"0x1897A8997241C1cD4bD0698647e4EB7213535c24\",\n },\n },\n base: {\n ...viemBase,\n id: ChainId.BASE,\n name: \"base\",\n whitelistedAssets: new Set(\n [\n \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", // USDC\n \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x0000000000000000000000000000000000000000\",\n deploymentBlock: 35449942,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\",\n \"v1.1\": \"0xFf62A7c278C62eD665133147129245053Bbf5918\",\n },\n },\n \"ethereum-virtual-testnet\": {\n ...viemEthereum,\n id: ChainId[\"ETHEREUM-VIRTUAL-TESTNET\"],\n name: \"ethereum-virtual-testnet\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x11a002d45db720ed47a80d2f3489cba5b833eaf5\", // @TODO: This is mock Consumed contract, update with Terms once stable\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x5b06224f736a57635b5bcb50b8ef178b189107cb\",\n deploymentBlock: 23224302,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\",\n \"v1.1\": \"0x1897A8997241C1cD4bD0698647e4EB7213535c24\",\n },\n },\n anvil: {\n ...viemAnvil,\n id: ChainId.ANVIL,\n name: \"anvil\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x23DFBc4B8B80C14CC5e25011B8491f268395BAd6\",\n morphoBlue: \"0x0000000000000000000000000000000000000000\", // Set dynamically in tests\n mempool: {\n address: \"0xD946246695A9259F3B33a78629026F61B3Ab40aF\",\n deploymentBlock: 23223727,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0x0000000000000000000000000000000000000000\",\n \"v1.1\": \"0x0000000000000000000000000000000000000000\",\n },\n },\n};\n\n// thresholds are set to align with Alchemy's thresholds\n//https://www.alchemy.com/docs/deep-dive-into-eth_getlogs#making-a-request-to-eth_getlogs\nconst MAX_BATCH_SIZE = 10_000;\nconst DEFAULT_BATCH_SIZE = 2_500;\nconst MAX_BLOCK_WINDOW = 2_000;\nconst DEFAULT_BLOCK_WINDOW = 500;\n\nexport async function* streamLogs<abiEvent extends AbiEvent | undefined = undefined>(parameters: {\n client: PublicClient;\n contractAddress: Address;\n event?: abiEvent;\n blockNumberGte?: number;\n blockNumberLte?: number;\n order: \"asc\" | \"desc\";\n options: {\n maxBatchSize?: number;\n blockWindow?: number;\n };\n}): AsyncGenerator<\n { logs: GetLogsReturnType<abiEvent | undefined>; blockNumber: number },\n void,\n void\n> {\n const {\n client,\n contractAddress,\n event,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE, blockWindow = DEFAULT_BLOCK_WINDOW } = {},\n } = parameters;\n if (maxBatchSize > MAX_BATCH_SIZE) throw new InvalidBatchSizeError(maxBatchSize);\n if (blockWindow > MAX_BLOCK_WINDOW) throw new InvalidBlockWindowError(blockWindow);\n if (order === \"asc\" && blockNumberGte === undefined) throw new MissingBlockNumberError();\n\n const latestBlock = (await getBlock(client, { blockTag: \"latest\", includeTransactions: false }))\n .number;\n\n let toBlock = 0n;\n if (order === \"asc\")\n toBlock = BigMath.min(BigInt(blockNumberGte!) + BigInt(blockWindow), latestBlock);\n if (order === \"desc\")\n toBlock =\n blockNumberLte === undefined\n ? latestBlock\n : BigMath.min(BigInt(blockNumberLte!), latestBlock);\n\n let fromBlock = 0n;\n if (order === \"asc\") fromBlock = BigMath.min(BigInt(blockNumberGte!), latestBlock);\n if (order === \"desc\")\n fromBlock = BigMath.max(BigInt(blockNumberGte || toBlock - BigInt(blockWindow)), 0n);\n\n if (order === \"asc\") toBlock = BigMath.min(toBlock, fromBlock + BigInt(blockWindow));\n if (order === \"desc\") fromBlock = BigMath.max(fromBlock, toBlock - BigInt(blockWindow));\n if (fromBlock > toBlock) throw new InvalidBlockRangeError(fromBlock, toBlock);\n\n let streaming = true;\n while (streaming) {\n const logs = await getLogs(client, {\n address: contractAddress,\n event,\n fromBlock,\n toBlock,\n });\n\n logs.sort((a, b) => {\n if (a.blockNumber !== b.blockNumber)\n return order === \"asc\"\n ? Number(a.blockNumber - b.blockNumber)\n : Number(b.blockNumber - a.blockNumber);\n if (a.transactionIndex !== b.transactionIndex)\n return order === \"asc\"\n ? a.transactionIndex - b.transactionIndex\n : b.transactionIndex - a.transactionIndex;\n return order === \"asc\" ? a.logIndex - b.logIndex : b.logIndex - a.logIndex;\n });\n\n for (const logBatch of batch(logs, maxBatchSize)) {\n if (logBatch.length === 0) break;\n yield {\n logs: logBatch,\n blockNumber:\n logBatch.length === maxBatchSize\n ? // if the batch is full, return the last block number, block numbers are always sorted\n Number(logBatch[logBatch.length - 1]?.blockNumber)\n : // if the batch is not full, return `toBlock` or `fromBlock` to indicate until which block the logs were fetched\n order === \"asc\"\n ? Number(toBlock)\n : Number(fromBlock),\n };\n }\n\n streaming =\n order === \"asc\"\n ? toBlock < (blockNumberLte || latestBlock)\n : fromBlock > (blockNumberGte || 0n);\n\n if (order === \"asc\") {\n fromBlock = BigMath.min(BigInt(toBlock) + 1n, latestBlock);\n toBlock = BigMath.min(fromBlock + BigInt(blockWindow), latestBlock);\n }\n\n if (order === \"desc\") {\n const lowerBound = BigInt(blockNumberGte || 0);\n const windowSize = BigInt(blockWindow);\n const nextToBlock = BigMath.max(fromBlock - 1n, lowerBound);\n const nextFromBlock = BigMath.max(nextToBlock - windowSize, lowerBound);\n toBlock = nextToBlock;\n fromBlock = nextFromBlock;\n }\n }\n\n yield { logs: [], blockNumber: order === \"asc\" ? Number(toBlock) : Number(fromBlock) };\n return;\n}\n\nexport class InvalidBlockRangeError extends Errors.BaseError {\n override name = \"Chain.InvalidBlockRangeError\";\n constructor(fromBlock: bigint, toBlock: bigint) {\n super(\n `Invalid block range while streaming data from chain. From block ${fromBlock} to block ${toBlock}.`,\n );\n }\n}\n\nexport class InvalidBlockWindowError extends Errors.BaseError {\n override name = \"Chain.InvalidBlockWindowError\";\n constructor(blockWindow: number) {\n super(\n `Invalid block window while streaming data from chain. Maximum is ${MAX_BLOCK_WINDOW}. Got ${blockWindow}.`,\n );\n }\n}\n\nexport class InvalidBatchSizeError extends Errors.BaseError {\n override name = \"Chain.InvalidBatchSizeError\";\n constructor(maxBatchSize: number) {\n super(\n `Invalid batch size while streaming data from chain. Maximum is ${MAX_BATCH_SIZE}. Got ${maxBatchSize}.`,\n );\n }\n}\n\nexport class MissingBlockNumberError extends Errors.BaseError {\n override name = \"Chain.MissingBlockNumberError\";\n constructor() {\n super(\"Missing block number when streaming data from chain in ascending order.\");\n }\n}\n","export function max(a: bigint, b: bigint): bigint {\n return a > b ? a : b;\n}\n\nexport function min(a: bigint, b: bigint): bigint {\n return a < b ? a : b;\n}\n","/**\n * Splits an array into batches of a specified size.\n * @param array The array to split.\n * @param batchSize The size of each batch.\n * @returns An iterator that yields each batch.\n * @example\n * ```typescript\n * const array = [1, 2, 3, 4, 5];\n * for (const batch of batch(array, 2)) {\n * console.log(batch);\n * }\n * // Output:\n * // [1, 2]\n * // [3, 4]\n * // [5]\n * ```\n */\nexport function* batch<T>(array: Array<T>, batchSize: number) {\n for (let i = 0; i < array.length; i += batchSize) {\n yield array.slice(i, i + batchSize);\n }\n}\n","export type GlobalErrorType<name extends string = \"Error\"> = Error & {\n name: name;\n};\n\n/**\n * Base error class inherited by all errors thrown by mempool.\n *\n * @example\n * ```ts\n * import { Errors } from 'mempool'\n * throw new Errors.BaseError('An error occurred')\n * ```\n */\nexport class BaseError<cause extends Error | undefined = undefined> extends Error {\n details: string;\n shortMessage: string;\n\n override cause: cause;\n override name = \"BaseError\";\n\n constructor(\n shortMessage: string,\n options: {\n cause?: cause | undefined;\n details?: string | undefined;\n metaMessages?: (string | undefined)[] | undefined;\n } = {},\n ) {\n const details = (() => {\n if (options.cause instanceof BaseError) {\n if (options.cause.details) return options.cause.details;\n if (options.cause.shortMessage) return options.cause.shortMessage;\n }\n if (options.cause && \"details\" in options.cause && typeof options.cause.details === \"string\")\n return options.cause.details;\n if (options.cause?.message) return options.cause.message;\n return options.details!;\n })();\n\n const message = [\n shortMessage || \"An error occurred.\",\n ...(options.metaMessages ? [\"\", ...options.metaMessages] : []),\n ...(details ? [\"\", details ? `Details: ${details}` : undefined] : []),\n ]\n .filter((x) => typeof x === \"string\")\n .join(\"\\n\");\n\n super(message, options.cause ? { cause: options.cause } : undefined);\n\n this.cause = options.cause as cause;\n this.details = details;\n this.shortMessage = shortMessage;\n }\n\n walk(): Error;\n walk(fn: (err: unknown) => boolean): Error | null;\n walk(fn?: ((err: unknown) => boolean) | undefined): unknown {\n return walk(this, fn);\n }\n}\n\n/** @internal */\nfunction walk(err: unknown, fn?: ((err: unknown) => boolean) | undefined): unknown {\n if (fn?.(err)) return err;\n if (err && typeof err === \"object\" && \"cause\" in err && err.cause) return walk(err.cause, fn);\n return fn ? null : err;\n}\n","import type { Address } from \"viem\";\nimport * as z from \"zod\";\nimport { transformAddress } from \"#utils/zod.ts\";\nimport * as LLTV from \"./LLTV.ts\";\n\nexport type Collateral = {\n /** Asset being used as collateral. */\n asset: Address;\n /** Liquidation Loan-to-Value of the collateral. */\n lltv: LLTV.LLTV;\n /** Oracle contract used to price the collateral. */\n oracle: Address;\n};\n\nexport const CollateralSchema = z.object({\n asset: z.string().transform(transformAddress),\n oracle: z.string().transform(transformAddress),\n lltv: LLTV.LLTVSchema,\n});\n\nexport const CollateralsSchema = z\n .array(CollateralSchema)\n .min(1, { message: \"At least one collateral is required\" })\n .refine(\n (collaterals) => {\n for (let i = 1; i < collaterals.length; i++) {\n if (collaterals[i - 1]!.asset.toLowerCase() > collaterals[i]!.asset.toLowerCase()) {\n return false;\n }\n }\n return true;\n },\n {\n message: \"Collaterals must be sorted alphabetically by address\",\n },\n )\n .refine(\n (collaterals) => {\n const uniqueAssets = new Set<string>();\n for (const collateral of collaterals) {\n const assetAddress = collateral.asset.toLowerCase();\n if (uniqueAssets.has(assetAddress)) {\n return false;\n }\n uniqueAssets.add(assetAddress);\n }\n return true;\n },\n {\n message: \"Collaterals must not contain duplicate assets\",\n },\n );\n\nexport const from = (parameters: from.Parameters): from.ReturnType => {\n return {\n asset: parameters.asset.toLowerCase() as Address,\n lltv: LLTV.from(parameters.lltv),\n oracle: parameters.oracle.toLowerCase() as Address,\n };\n};\n\nexport declare namespace from {\n type Parameters = {\n asset: Address;\n lltv: LLTV.Options | bigint;\n oracle: Address;\n };\n type ReturnType = Collateral;\n}\n","import { type Address, isAddress, isHex } from \"viem\";\nimport * as z from \"zod\";\n\nexport const transformHex = (val: string, ctx: z.RefinementCtx) => {\n if (isHex(val)) return val;\n\n ctx.addIssue({\n code: \"invalid_format\",\n input: val,\n format: \"hex\",\n error: \"not a hex\",\n });\n\n return z.NEVER;\n};\n\nexport const transformAddress = (val: string, ctx: z.RefinementCtx) => {\n if (isAddress(val.toLowerCase())) return val.toLowerCase() as Address;\n\n ctx.addIssue({\n code: \"invalid_format\",\n input: val,\n format: \"address\",\n error: \"not a valid address\",\n });\n\n return z.NEVER;\n};\n","import * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Brand } from \"./types.ts\";\n\nexport type LLTV = bigint & Brand<\"LLTV\">;\n\nexport const Options = [0.385, 0.5, 0.625, 0.77, 0.86, 0.915, 0.945, 0.965, 0.98] as const;\nexport type Options = (typeof Options)[number];\nconst LLTV_SCALED = Options.map((lltv) => BigInt(lltv * 10 ** 18));\n\n/**\n * Convert a LLTV option or a scaled LLTV to a LLTV.\n * @param lltv - The LLTV option or the scaled LLTV.\n * @returns The LLTV.\n */\nexport function from(lltv: Options | bigint): LLTV {\n if (typeof lltv === \"bigint\" && !LLTV_SCALED.includes(lltv)) throw new InvalidLLTVError(lltv);\n if (typeof lltv === \"bigint\") return lltv as LLTV;\n if (typeof lltv === \"number\" && !Options.includes(lltv)) throw new InvalidOptionError(lltv);\n return BigInt(lltv * 10 ** 18) as LLTV;\n}\n\nexport declare namespace from {\n type ErrorType = InvalidOptionError | InvalidLLTVError;\n}\n\nexport class InvalidOptionError extends Errors.BaseError {\n override readonly name = \"LLTV.InvalidOptionError\";\n constructor(input: number) {\n super(\n `Invalid LLTV option. Input: \"${input}\". Accepted values are: ${Options.map(\n (option) => `\"${option}\"`,\n ).join(\", \")}.`,\n );\n }\n}\n\nexport class InvalidLLTVError extends Errors.BaseError {\n override readonly name = \"LLTV.InvalidLLTVError\";\n constructor(input: bigint) {\n super(\n `Invalid LLTV. Input: \"${input}\". Accepted values are: ${LLTV_SCALED.map(\n (option) => `\"${option}\"`,\n ).join(\", \")}.`,\n );\n }\n}\n\nexport const LLTVSchema = z\n .bigint({ coerce: true })\n .refine(\n (lltv) => {\n try {\n from(lltv);\n return true;\n } catch (_) {\n return false;\n }\n },\n {\n error: () => {\n return \"Invalid LLTV: must be one of 0.385, 0.625, 0.77, 0.86, 0.915, 0.945, 0.965 or 0.98 (scaled by 1e18)\";\n },\n },\n )\n .transform((lltv) => from(lltv));\n","import type { Address, Hex } from \"viem\";\nimport { CallbackType } from \"./Callback.ts\";\nimport type * as Offer from \"./Offer.ts\";\n\n/**\n * Represents a liquidity pool with a unique ID and amount.\n */\nexport type LiquidityPool = {\n id: string;\n amount: bigint;\n};\n\n/**\n * Represents a hierarchical relationship between two liquidity pools.\n */\nexport type LiquidityLink = {\n parentPoolId: string;\n childPoolId: string;\n priority: number;\n};\n\n/**\n * Represents the connection between an offer and its liquidity pools.\n */\nexport type OfferLiquidityPool = {\n offerHash: Offer.Offer[\"hash\"];\n poolId: string;\n /**\n * The available capacity/liquidity from this pool for this offer.\n * Meaning varies by pool type:\n * - BuyWithEmptyCallback: Matches allowance amount from pool bellow\n * - SellERC20Callback: Sell Callback/Predeposited -> Maximum debt capacity calculated from collateral (collateralAmount * oraclePrice * lltv)\n * - SellERC20Callback: Existing debt as negative value (reduces available capacity)\n */\n amount: bigint;\n};\n\n/**\n * Calculate maximum debt capacity from collateral amount.\n * @param amount - Collateral amount\n * @param oraclePrice - Oracle price (scaled to 36 decimals)\n * @param lltv - Loan-to-value ratio (scaled to 18 decimals)\n * @returns Maximum debt capacity\n */\nexport function calculateMaxDebt(amount: bigint, oraclePrice: bigint, lltv: bigint): bigint {\n const ORACLE_PRICE_SCALE = 10n ** 36n; // Oracle prices are scaled to 36 decimals\n const PRECISION = 10n ** 18n; // LLTV ratios are scaled to 18 decimals (1e18 = 100%)\n\n const collateralQuoted = (amount * oraclePrice) / ORACLE_PRICE_SCALE;\n const maxDebt = (collateralQuoted * lltv) / PRECISION;\n\n return maxDebt;\n}\n\n/**\n * Generate pool ID for balance pools.\n */\nexport function generateBalancePoolId(parameters: {\n user: Address;\n chainId: bigint;\n token: Address;\n}): string {\n const { user, chainId, token } = parameters;\n return `${user}-${chainId.toString()}-${token}-balance`.toLowerCase();\n}\n\n/**\n * Generate pool ID for allowance pools.\n */\nexport function generateAllowancePoolId(parameters: {\n user: Address;\n chainId: bigint;\n token: Address;\n}): string {\n const { user, chainId, token } = parameters;\n return `${user}-${chainId.toString()}-${token}-allowance`.toLowerCase();\n}\n\n/**\n * Generate pool ID for sell ERC20 callback pools.\n * Each offer has its own callback pool to prevent liquidity conflicts.\n */\nexport function generateSellERC20CallbackPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n token: Address;\n offerHash: Hex;\n}): string {\n const { user, chainId, obligationId, token, offerHash } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-${token}-${offerHash}-sell_erc20_callback`.toLowerCase();\n}\n\n/**\n * Generate pool ID for obligation collateral pools.\n * Obligation collateral pools represent collateral already deposited in the obligation.\n * These pools are shared across all offers with the same obligation.\n */\nexport function generateObligationCollateralPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n token: Address;\n}): string {\n const { user, chainId, obligationId, token } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-${token}-obligation-collateral`.toLowerCase();\n}\n\n/**\n * Generate pool ID for buy vault callback pools.\n */\nexport function generateBuyVaultCallbackPoolId(parameters: {\n user: Address;\n chainId: bigint;\n vault: Address;\n offerHash: Hex;\n}): string {\n const { user, chainId, vault, offerHash } = parameters;\n return `${user}-${chainId.toString()}-${vault}-${offerHash}-${CallbackType.BuyVaultV1Callback}`.toLowerCase();\n}\n\n/**\n * Generate pool ID for debt pools.\n */\nexport function generateDebtPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n}): string {\n const { user, chainId, obligationId } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-debt`.toLowerCase();\n}\n\n/**\n * Generate pool ID for user position in a vault.\n */\nexport function generateUserVaultPositionPoolId(parameters: {\n user: Address;\n chainId: bigint;\n vault: Address;\n}): string {\n const { user, chainId, vault } = parameters;\n return `${user}-${chainId.toString()}-${vault}-user-vault-position`.toLowerCase();\n}\n\n/**\n * Generate pool ID for vault position in a market.\n */\nexport function generateVaultPositionPoolId(parameters: {\n vault: Address;\n chainId: bigint;\n marketId: string;\n}): string {\n const { vault, chainId, marketId } = parameters;\n return `${vault}-${chainId.toString()}-${marketId}-vault-position`.toLowerCase();\n}\n\n/**\n * Generate pool ID for market total liquidity.\n */\nexport function generateMarketLiquidityPoolId(parameters: {\n chainId: bigint;\n marketId: string;\n}): string {\n const { chainId, marketId } = parameters;\n return `${chainId.toString()}-${marketId}-market-liquidity`.toLowerCase();\n}\n","import * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Brand } from \"./types.ts\";\n\n/**\n * Maturity is a number that represents a date in seconds.\n */\nexport type Maturity = number & Brand<\"Maturity\">;\n\nexport const MaturitySchema = z\n .number()\n .int()\n .refine(\n (maturity) => {\n try {\n from(maturity);\n return true;\n } catch (_e) {\n return false;\n }\n },\n {\n error: (issue) => {\n try {\n const maturityDate = new Date((issue.input as number) * 1000);\n return `The maturity is set to ${maturityDate}. It must fall on the allowed settlement cycles (Friday 15:00 UTC at the end of week/month/quarter).`;\n } catch (_) {\n return `The maturity is set to ${issue.input}. It must fall on the allowed settlement cycles (Friday 15:00 UTC at the end of week/month/quarter).`;\n }\n },\n },\n )\n .transform((maturity) => maturity as Maturity);\n\nconst MaturityOptions = {\n end_of_week: () => endOfWeek(),\n end_of_next_week: () => endOfNextWeek(),\n end_of_month: () => endOfMonth(),\n end_of_next_month: () => endOfNextMonth(),\n end_of_quarter: () => endOfQuarter(),\n end_of_next_quarter: () => endOfNextQuarter(),\n} as const;\n\nexport type MaturityOptions = keyof typeof MaturityOptions;\n\n/**\n * Creates a maturity from a timestamp in seconds or a maturity option.\n * @throws {InvalidFormatError} If the maturity is in milliseconds.\n * @throws {InvalidDateError} If the maturity is in seconds but not a valid date.\n * @throws {InvalidOptionError} If the maturity is not a valid option.\n */\nexport function from(ts: from.Parameters): Maturity {\n if (typeof ts === \"string\") {\n if (ts in MaturityOptions) return MaturityOptions[ts]();\n throw new InvalidOptionError(ts);\n }\n\n if (typeof ts === \"number\" && ts > 1e12) throw new InvalidFormatError();\n\n if (!Object.values(MaturityOptions).some((option) => option() === ts))\n throw new InvalidDateError(ts);\n\n return ts as Maturity;\n}\n\nexport declare namespace from {\n type Parameters = number | MaturityOptions;\n type ErrorType = InvalidFormatError | InvalidDateError | InvalidOptionError;\n}\n\n/** Returns the end of the current week (friday at 15:00:00 UTC) */\nconst endOfWeek = (): Maturity => fridayOfWeek(0);\n\n/** Returns the end of the next week (friday at 15:00:00 UTC) */\nconst endOfNextWeek = (): Maturity => fridayOfWeek(1);\n\n/** Returns the end of the current month (last friday of the month at 15:00:00 UTC) */\nconst endOfMonth = (): Maturity =>\n lastFridayOfMonth(new Date().getUTCFullYear(), new Date().getUTCMonth());\n\n/** Returns the end of the next month (last friday of the next month at 15:00:00 UTC) */\nconst endOfNextMonth = (): Maturity =>\n lastFridayOfMonth(new Date().getUTCFullYear(), new Date().getUTCMonth() + 1);\n\n/** Returns the end of the current quarter (last friday of the quarter at 15:00:00 UTC) */\nconst endOfQuarter = (): Maturity => lastFridayOfQuarter(0);\n\n/** Returns the end of the next quarter (last friday of the next quarter at 15:00:00 UTC) */\nconst endOfNextQuarter = (): Maturity => lastFridayOfQuarter(1);\n\nconst fridayOfWeek = (weeksAhead = 0): Maturity => {\n const now = new Date();\n const today15H = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 15),\n );\n\n // Days until next Friday (5). Always non-negative in [0,6]\n let daysUntilFriday = (5 - today15H.getUTCDay() + 7) % 7;\n\n // If it's Friday and we're already past 15:00 UTC, roll to next Friday\n if (daysUntilFriday === 0 && now.getTime() >= today15H.getTime()) {\n daysUntilFriday = 7;\n }\n\n const friday = new Date(today15H);\n friday.setUTCDate(friday.getUTCDate() + daysUntilFriday + weeksAhead * 7);\n return (friday.getTime() / 1000) as Maturity;\n};\n\nconst lastFridayOfMonth = (year: number, month: number): Maturity => {\n const lastDayOfMonth15H = new Date(Date.UTC(year, month + 1, 0, 15));\n\n while (lastDayOfMonth15H.getUTCDay() !== 5) {\n lastDayOfMonth15H.setUTCDate(lastDayOfMonth15H.getUTCDate() - 1);\n }\n\n const maturity = lastDayOfMonth15H.setUTCDate(lastDayOfMonth15H.getUTCDate()) / 1000;\n\n return maturity as Maturity;\n};\n\nconst lastFridayOfQuarter = (quartersAhead = 0): Maturity => {\n const now = new Date();\n const quarterIndex = Math.floor(now.getUTCMonth() / 3) + quartersAhead;\n const year = now.getUTCFullYear() + Math.floor(quarterIndex / 4);\n const quarter = quarterIndex % 4;\n const lastMonth = quarter * 3 + 2; // 0-based\n return lastFridayOfMonth(year, lastMonth);\n};\n\nexport class InvalidFormatError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidFormatError\";\n constructor() {\n super(\"Invalid maturity format. Maturity should be expressed in seconds.\");\n }\n}\n\nexport class InvalidDateError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidDateError\";\n constructor(input: number) {\n super(\n `Invalid maturity date. Input: \"${input}\". Accepted values are: ${Object.values(\n MaturityOptions,\n )\n .map((option) => `\"${option()}\"`)\n .join(\", \")}.`,\n );\n }\n}\n\nexport class InvalidOptionError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidOptionError\";\n constructor(input: string) {\n super(\n `Invalid maturity option. Input: \"${input}\". Accepted values are: ${Object.keys(\n MaturityOptions,\n )\n .map((option) => `\"${option}\"`)\n .join(\", \")}.`,\n );\n }\n}\n","import { type Address, encodeAbiParameters, type Hex, keccak256, maxUint256 } from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { transformAddress } from \"#utils/zod.ts\";\nimport type * as Chain from \"./Chain.ts\";\nimport * as Collateral from \"./Collateral.ts\";\nimport * as Maturity from \"./Maturity.ts\";\n\nexport type Obligation = {\n /** The chain id where the liquidity for this obligation is located. */\n chainId: Chain.Id;\n /** The token that is being borrowed for this obligation. */\n loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. */\n collaterals: Collateral.Collateral[];\n /** The maturity of the obligation. */\n maturity: Maturity.Maturity;\n};\n\nexport const ObligationSchema = z.object({\n chainId: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n loanToken: z.string().transform(transformAddress),\n collaterals: Collateral.CollateralsSchema,\n maturity: Maturity.MaturitySchema,\n});\n\n/**\n * Creates an obligation from the given parameters.\n * @constructor\n * @param parameters - {@link from.Parameters}\n * @returns The created obligation. {@link Obligation}\n * @throws If the collaterals are not sorted alphabetically by address. {@link CollateralsAreNotSortedError}\n *\n * @example\n * ```ts\n * const obligation = Obligation.from({\n * chainId: 1n,\n * loanToken: privateKeyToAccount(generatePrivateKey()).address,\n * collaterals: [\n * Collateral.from({\n * asset: privateKeyToAccount(generatePrivateKey()).address,\n * oracle: privateKeyToAccount(generatePrivateKey()).address,\n * lltv: 0.965\n * }),\n * ],\n * maturity: Maturity.from(\"end_of_next_quarter\"),\n * });\n * ```\n */\nexport function from(parameters: from.Parameters): from.ReturnType {\n try {\n const parsedObligation = ObligationSchema.parse({\n ...parameters,\n maturity: Maturity.from(parameters.maturity),\n });\n\n return {\n chainId: parsedObligation.chainId,\n loanToken: parsedObligation.loanToken.toLowerCase() as Address,\n collaterals: parsedObligation.collaterals.sort((a, b) => a.asset.localeCompare(b.asset)),\n maturity: parsedObligation.maturity,\n };\n } catch (error: unknown) {\n throw new InvalidObligationError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n type Parameters = {\n /** The chain id where the liquidity for this obligation is located. */\n chainId: Chain.Id;\n /** The token that is being borrowed for this obligation. */\n loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. Must be sorted alphabetically by address. */\n collaterals: Collateral.from.Parameters[] | readonly Collateral.from.Parameters[];\n /** The maturity of the obligation. */\n maturity: Maturity.from.Parameters;\n };\n\n type ReturnType = Obligation;\n\n export type ErrorType = InvalidObligationError;\n}\n\n/**\n * Creates an obligation from a snake case object.\n * @throws If the obligation is invalid. {@link fromSnakeCase.ErrorType}\n * @param input - {@link fromSnakeCase.Parameters}\n * @returns The created obligation. {@link fromSnakeCase.ReturnType}\n */\nexport function fromSnakeCase(input: fromSnakeCase.Parameters): fromSnakeCase.ReturnType {\n return from(Format.fromSnakeCase<Obligation>(input));\n}\n\nexport declare namespace fromSnakeCase {\n type Parameters = Format.Snake<Obligation>;\n type ReturnType = Obligation;\n type ErrorType = InvalidObligationError;\n}\n\n/**\n * Calculates the obligation id based on the smart contract's Obligation struct.\n * The id is computed as keccak256(abi.encode(chainId, loanToken, collaterals, maturity)).\n * @throws If the collaterals are not sorted alphabetically by address. {@link CollateralsAreNotSortedError}\n * @param obligation - {@link id.Parameters}\n * @returns The obligation id as a 32-byte hex string. {@link id.ReturnType}\n *\n * @example\n * ```ts\n * const obligation = Obligation.random();\n * const id = Obligation.id(obligation);\n * console.log(id); // 0x1234567890123456789012345678901234567890123456789012345678901234\n * ```\n */\nexport function id(obligation: id.Parameters): id.ReturnType {\n let lastAsset = \"\";\n for (const collateral of obligation.collaterals) {\n const newAsset = collateral.asset.toLowerCase();\n if (newAsset.localeCompare(lastAsset) < 0) throw new CollateralsAreNotSortedError();\n lastAsset = newAsset;\n }\n\n return keccak256(\n encodeAbiParameters(\n [\n { type: \"uint256\" },\n { type: \"address\" },\n {\n type: \"tuple[]\",\n components: [\n { type: \"address\", name: \"token\" },\n { type: \"uint256\", name: \"lltv\" },\n { type: \"address\", name: \"oracle\" },\n ],\n },\n { type: \"uint256\" },\n ],\n [\n obligation.chainId,\n obligation.loanToken.toLowerCase() as Address,\n obligation.collaterals.map((c) => ({\n token: c.asset.toLowerCase() as Address,\n lltv: c.lltv,\n oracle: c.oracle.toLowerCase() as Address,\n })),\n BigInt(obligation.maturity),\n ],\n ),\n );\n}\n\nexport declare namespace id {\n type Parameters = Obligation;\n type ReturnType = Hex;\n type ErrorType = CollateralsAreNotSortedError;\n}\n\n/**\n * Generates a random obligation.\n * @returns A randomly generated obligation. {@link random.ReturnType}\n *\n * @example\n * ```ts\n * const obligation = Obligation.random();\n * ```\n */\nexport function random(): random.ReturnType {\n return from({\n chainId: 1n,\n loanToken: privateKeyToAccount(generatePrivateKey()).address,\n collaterals: [\n Collateral.from({\n asset: privateKeyToAccount(generatePrivateKey()).address,\n oracle: privateKeyToAccount(generatePrivateKey()).address,\n lltv: 0.965,\n }),\n ],\n maturity: Maturity.from(\"end_of_next_quarter\"),\n });\n}\n\nexport declare namespace random {\n type ReturnType = Obligation;\n}\n\nexport class InvalidObligationError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Obligation.InvalidObligationError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid obligation.\", { cause: error });\n }\n}\n\nexport class CollateralsAreNotSortedError extends Errors.BaseError {\n override readonly name = \"Obligation.CollateralsAreNotSortedError\";\n constructor() {\n super(\"Collaterals are not sorted alphabetically by address.\");\n }\n}\n","import {\n type Address,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n encodeAbiParameters,\n type Hex,\n hashTypedData,\n maxUint256,\n type WalletClient,\n zeroAddress,\n} from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { Time } from \"#utils/index.ts\";\nimport { transformAddress, transformHex } from \"#utils/zod.ts\";\nimport * as Collateral from \"./Collateral.ts\";\nimport * as LLTV from \"./LLTV.ts\";\nimport * as Maturity from \"./Maturity.ts\";\nimport * as Obligation from \"./Obligation.ts\";\n\nexport type Offer = {\n /** The address that made the offer. */\n readonly offering: Address;\n /** The amount of assets offered. */\n readonly assets: bigint;\n /** The interest rate (with 18 decimals). */\n readonly rate: bigint;\n /** The date at which all interests will be paid. */\n readonly maturity: Maturity.Maturity;\n /** The date at which the offer will expire. */\n readonly expiry: number;\n /** The date at which the offer will start. */\n readonly start: number;\n /** The nonce. Used for OCO (One-Cancelled-Other) mechanism. */\n readonly nonce: bigint;\n /** The side of the offer. `true` for buy, `false` for sell. */\n readonly buy: boolean;\n /** The chain id where the liquidity for this offer is located. */\n readonly chainId: bigint;\n /** The token that is being borrowed. */\n readonly loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. */\n readonly collaterals: readonly Collateral.Collateral[];\n /** The optional callback data to retrieve the maker funds. */\n readonly callback: {\n readonly address: Address;\n readonly data: Hex;\n readonly gasLimit: bigint;\n };\n /** The amount of assets consumed from the offer. */\n consumed: bigint;\n /** The hash of the offer. */\n readonly hash: Hex;\n /** The block number at which the offer was created. */\n readonly blockNumber: number;\n /** The signature of the offer. */\n signature?: Hex;\n};\n\nexport const OfferHashSchema = z\n .string()\n .regex(/^0x[0-9a-fA-F]{64}$/, {\n message: \"Hash must be a valid 32-byte hex string\",\n })\n .transform(transformHex);\n\nexport const OfferSchema = (parameters?: { omitHash?: boolean }) => {\n const { omitHash = false } = parameters || {};\n const now = Time.now();\n\n let base = z.object({\n offering: z.string().transform(transformAddress),\n assets: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n maturity: Maturity.MaturitySchema,\n expiry: z\n .number()\n .int()\n .min(now, { message: \"Expiry must be set to a future date\" })\n .max(Number.MAX_SAFE_INTEGER),\n start: z.number().int().max(Number.MAX_SAFE_INTEGER),\n nonce: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n buy: z.boolean(),\n chainId: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n loanToken: z.string().transform(transformAddress),\n collaterals: Collateral.CollateralsSchema,\n callback: z.object({\n address: z.string().transform(transformAddress),\n data: z.string().transform(transformHex),\n gasLimit: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n consumed: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n blockNumber: z.number().int().max(Number.MAX_SAFE_INTEGER),\n signature: z\n .string()\n .regex(/^0x[0-9a-fA-F]{130}$/, {\n message: \"Signature must be a valid 65-byte hex string\",\n })\n .transform(transformHex)\n .optional(),\n });\n\n if (!omitHash) base = base.extend({ hash: OfferHashSchema });\n\n return base\n .refine((data) => data.start < data.expiry, {\n message: \"Start must be before expiry\",\n path: [\"start\"],\n })\n .refine((data) => data.expiry <= data.maturity, {\n message: \"Expiry cannot be after maturity\",\n path: [\"expiry\"],\n });\n};\n\n/**\n * Creates an offer from a plain object.\n * @throws {InvalidOfferError} If the offer is invalid.\n * @param input - The offer to create.\n * @returns The created offer with its hash.\n */\nexport function from(input: Omit<Offer, \"hash\">): Offer {\n try {\n const parsedOffer = OfferSchema({ omitHash: true }).parse(input);\n const parsedHash = OfferHashSchema.parse(hash(parsedOffer));\n\n return {\n ...parsedOffer,\n hash: parsedHash,\n };\n } catch (error: unknown) {\n throw new InvalidOfferError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n export type ErrorType = InvalidOfferError;\n}\n\n/**\n * Creates an offer from a snake case object.\n * @throws {InvalidOfferError} If the offer is invalid.\n * @param input - The offer to create.\n * @returns The created offer with its hash.\n */\nexport function fromSnakeCase(input: Format.Snake<Omit<Offer, \"hash\">>): Offer {\n return from(Format.fromSnakeCase<Omit<Offer, \"hash\">>(input));\n}\n\n/**\n * Converts an offer to a snake case object.\n * @param offer - The offer to convert.\n * @returns The converted offer.\n */\nexport function toSnakeCase(offer: Offer): Format.Snake<Offer> {\n return Format.toSnakeCase(offer);\n}\n\n/**\n * Generates a random Offer.\n * The returned Offer contains randomly generated values for most fields, such as assets, rate, nonce, and buy flag.\n * Some fields use fixed or deterministic values (e.g., chainId, collaterals, callback).\n * @warning The generated Offer should not be used for production usage.\n * @returns {Offer} A randomly generated Offer object.\n */\nexport function random(): Offer {\n const loanToken = privateKeyToAccount(generatePrivateKey()).address;\n\n const maturity = Maturity.from(\"end_of_month\");\n const expiry = Maturity.from(\"end_of_week\") - 1;\n const lltv = LLTV.from(0.965);\n const offer = from({\n offering: privateKeyToAccount(generatePrivateKey()).address,\n assets: BigInt(Math.floor(Math.random() * 1000000)),\n rate: BigInt(Math.floor(Math.random() * 1000000)),\n maturity,\n expiry: expiry,\n start: expiry - 10,\n nonce: BigInt(Math.floor(Math.random() * 1000000)),\n buy: Math.random() > 0.5,\n chainId: 1n,\n loanToken,\n collaterals: [\n Collateral.from({\n asset: zeroAddress,\n oracle: zeroAddress,\n lltv,\n }),\n ],\n callback: {\n address: zeroAddress,\n data: \"0x\",\n gasLimit: 0n,\n },\n consumed: 0n,\n blockNumber: Math.floor(Math.random() * Number.MAX_SAFE_INTEGER),\n });\n\n return offer;\n}\n\n/**\n * Creates an EIP-712 domain object.\n * @param chainId - The chain ID.\n * @returns The EIP-712 domain object.\n */\nexport const domain = (chainId: bigint) => ({\n chainId,\n verifyingContract: zeroAddress,\n});\n\n/**\n * The EIP-712 types for the offer.\n * @warning The ordering of the types should NEVER be changed. The offer hash is computed based on the order of the types.\n * @returns The EIP-712 types.\n */\nexport const types = {\n EIP712Domain: [\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Offer: [\n { name: \"offering\", type: \"address\" },\n { name: \"assets\", type: \"uint256\" },\n { name: \"rate\", type: \"uint256\" },\n { name: \"maturity\", type: \"uint256\" },\n { name: \"expiry\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"buy\", type: \"bool\" },\n { name: \"loanToken\", type: \"address\" },\n { name: \"collaterals\", type: \"Collateral[]\" },\n { name: \"callback\", type: \"Callback\" },\n ],\n Collateral: [\n { name: \"asset\", type: \"address\" },\n { name: \"oracle\", type: \"address\" },\n { name: \"lltv\", type: \"uint256\" },\n ],\n Callback: [\n { name: \"address\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"gasLimit\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * Signs an offer.\n * @throws {Error} If the wallet account is not set.\n * @param offer - The offer to sign.\n * @param wallet - The wallet to sign the offer with.\n * @returns The signed offer.\n */\nexport function sign(offer: Offer, wallet: WalletClient): Promise<Hex> {\n if (!wallet.account) throw new AccountNotSetError();\n return wallet.signTypedData({\n account: wallet.account,\n domain: domain(offer.chainId),\n types,\n primaryType: \"Offer\",\n message: {\n offering: offer.offering.toLowerCase() as Address,\n assets: offer.assets,\n rate: offer.rate,\n maturity: BigInt(offer.maturity),\n expiry: BigInt(offer.expiry),\n nonce: offer.nonce,\n buy: offer.buy,\n loanToken: offer.loanToken.toLowerCase() as Address,\n collaterals: offer.collaterals,\n callback: {\n address: offer.callback.address.toLowerCase() as Address,\n data: offer.callback.data,\n gasLimit: offer.callback.gasLimit,\n },\n },\n });\n}\n\nexport function hash(offer: Omit<Offer, \"hash\">): Hex {\n return hashTypedData({\n domain: domain(offer.chainId),\n message: {\n offering: offer.offering.toLowerCase() as Address,\n assets: offer.assets,\n rate: offer.rate,\n maturity: BigInt(offer.maturity),\n expiry: BigInt(offer.expiry),\n nonce: offer.nonce,\n buy: offer.buy,\n loanToken: offer.loanToken.toLowerCase() as Address,\n collaterals: offer.collaterals,\n callback: {\n address: offer.callback.address.toLowerCase() as Address,\n data: offer.callback.data,\n gasLimit: offer.callback.gasLimit,\n },\n },\n primaryType: \"Offer\",\n types,\n });\n}\n\n/**\n * Calculates the obligation id for an offer based on the smart contract's Obligation struct.\n * The id is computed as keccak256(abi.encode(chainId, loanToken, collaterals (sorted by token address), maturity)).\n * @param offer - The offer to calculate the obligation id for.\n * @returns The obligation id as a 32-byte hex string.\n */\nexport function obligationId(offer: Offer): Hex {\n return Obligation.id(\n Obligation.from({\n chainId: offer.chainId,\n loanToken: offer.loanToken,\n collaterals: offer.collaterals as Collateral.Collateral[],\n maturity: offer.maturity,\n }),\n );\n}\n\nconst OfferAbi = [\n { name: \"offering\", type: \"address\" },\n { name: \"assets\", type: \"uint256\" },\n { name: \"rate\", type: \"uint256\" },\n { name: \"maturity\", type: \"uint256\" },\n { name: \"expiry\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"buy\", type: \"bool\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"loanToken\", type: \"address\" },\n { name: \"start\", type: \"uint256\" },\n {\n name: \"collaterals\",\n type: \"tuple[]\",\n components: [\n { name: \"asset\", type: \"address\" },\n { name: \"oracle\", type: \"address\" },\n { name: \"lltv\", type: \"uint256\" },\n ],\n },\n {\n name: \"callback\",\n type: \"tuple\",\n components: [\n { name: \"address\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"gasLimit\", type: \"uint256\" },\n ],\n },\n { name: \"signature\", type: \"bytes\" },\n] as const;\n\nexport function encode(offer: Offer) {\n return encodeAbiParameters(OfferAbi, [\n offer.offering,\n offer.assets,\n offer.rate,\n BigInt(offer.maturity),\n BigInt(offer.expiry),\n offer.nonce,\n offer.buy,\n offer.chainId,\n offer.loanToken,\n BigInt(offer.start),\n offer.collaterals,\n offer.callback,\n offer.signature ?? \"0x\",\n ]);\n}\n\nexport function decode(data: Hex, blockNumber: number | bigint): Offer {\n let decoded: DecodeAbiParametersReturnType<typeof OfferAbi>;\n try {\n decoded = decodeAbiParameters(OfferAbi, data);\n } catch (error) {\n throw new InvalidOfferError(error as Error);\n }\n\n const offer = from({\n offering: decoded[0],\n assets: decoded[1],\n rate: decoded[2],\n maturity: Maturity.from(Number(decoded[3])),\n expiry: Number(decoded[4]),\n nonce: decoded[5],\n buy: decoded[6],\n chainId: decoded[7],\n loanToken: decoded[8],\n start: Number(decoded[9]),\n collaterals: decoded[10].map((c) => {\n return Collateral.from({\n asset: c.asset,\n oracle: c.oracle,\n lltv: c.lltv,\n });\n }),\n callback: {\n address: decoded[11].address,\n data: decoded[11].data,\n gasLimit: decoded[11].gasLimit,\n },\n consumed: 0n,\n blockNumber: Number(blockNumber),\n ...(decoded[12] === \"0x\" ? {} : { signature: decoded[12] }),\n });\n\n return offer;\n}\n\nexport type OfferConsumed = {\n id: string;\n chainId: bigint;\n offering: Address;\n nonce: bigint;\n amount: bigint;\n blockNumber: number;\n};\n\n/**\n * ABI for the Consumed event emitted by the Obligation contract.\n */\nexport const consumedEvent = {\n type: \"event\",\n name: \"Consumed\",\n inputs: [\n { name: \"user\", type: \"address\", indexed: true, internalType: \"address\" },\n { name: \"nonce\", type: \"uint256\", indexed: true, internalType: \"uint256\" },\n { name: \"amount\", type: \"uint256\", indexed: false, internalType: \"uint256\" },\n ],\n anonymous: false,\n} as const;\n\nexport function fromConsumedLog(parameters: {\n blockNumber: bigint;\n logIndex: number;\n chainId: number;\n transactionHash: Hex;\n user: Address;\n nonce: bigint;\n amount: bigint;\n}): OfferConsumed {\n const { blockNumber, logIndex, chainId, transactionHash, user, nonce, amount } = parameters;\n return {\n id: `${blockNumber.toString()}-${logIndex.toString()}-${chainId}-${transactionHash}`,\n chainId: BigInt(chainId),\n offering: user,\n nonce,\n amount,\n blockNumber: Number(blockNumber),\n };\n}\n\nexport class InvalidOfferError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Offer.InvalidOfferError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid offer.\", { cause: error });\n }\n}\n\nexport class AccountNotSetError extends Errors.BaseError {\n override readonly name = \"Offer.AccountNotSetError\";\n constructor() {\n super(\"Account not set.\");\n }\n}\n","export * from \"./BigMath.ts\";\nexport * from \"./batch.ts\";\nexport * from \"./batchMulticall.ts\";\nexport * from \"./Errors.ts\";\nexport * from \"./Format.ts\";\nexport * from \"./lazy.ts\";\nexport * from \"./poll.ts\";\nexport * from \"./retry.ts\";\nexport * as Time from \"./time.ts\";\nexport * from \"./wait.ts\";\n","export const retry = async <T>(fn: () => Promise<T>, attempts = 3, delayMs = 50): Promise<T> => {\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (i < attempts - 1) await new Promise((r) => setTimeout(r, delayMs));\n }\n }\n throw lastErr;\n};\n","import type { PublicActions } from \"viem\";\nimport { batch } from \"#utils/batch.ts\";\nimport { retry } from \"#utils/retry.ts\";\n\n/**\n * Helper function to execute multicall in batches with retry logic.\n * Abstracts the common pattern of batching calls, retrying, and collecting results.\n *\n * @param parameters - Configuration for batched multicall\n * @returns Promise resolving to flattened array of results\n */\nexport async function batchMulticall<TResult>(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n calls: unknown[];\n batchSize: number;\n retryAttempts: number;\n retryDelayMs: number;\n blockNumber?: bigint;\n}): Promise<TResult[]> {\n const { client, calls, batchSize, retryAttempts, retryDelayMs, blockNumber } = parameters;\n const results: TResult[] = [];\n\n for (const callsBatch of batch(calls, batchSize)) {\n const batchResults = await retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: callsBatch as any,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n );\n results.push(...(batchResults as TResult[]));\n }\n\n return results;\n}\n","/**\n * Transform a polling function into an async generator.\n * @param fn - The polling function to transform.\n * @returns An async generator.\n */\nexport function lazy<T>(\n pollFn: (emit: (value: T) => void, { stop }: { stop: () => void }) => () => boolean,\n) {\n return () =>\n (async function* () {\n let active = true;\n let resolveNext: (() => void) | null = null;\n const queue: T[] = [];\n\n const wait = () =>\n new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n\n const emit = (item: T) => {\n queue.push(item);\n resolveNext?.();\n resolveNext = null;\n };\n\n let unpoll: (() => boolean) | null = null;\n const stop = () => {\n active = false;\n // stop the poller immediately if we already have it\n unpoll?.();\n resolveNext?.();\n resolveNext = null;\n };\n\n unpoll = pollFn(emit, { stop });\n\n try {\n while (active) {\n if (queue.length === 0) await wait();\n while (queue.length > 0 && active) yield queue.shift()!;\n }\n } finally {\n stop();\n }\n })();\n}\n","export async function wait(time: number) {\n return new Promise((res) => setTimeout(res, time));\n}\n","import { wait } from \"./wait.ts\";\n/**\n * Polls a function at a specified interval.\n * Inspired by https://github.com/wevm/viem/blob/845994d20275d08ff892018e237a4b599eeefb6a/src/utils/poll.ts\n */\nexport function poll<data>(\n fn: ({ unpoll }: { unpoll: () => void }) => Promise<data | undefined>,\n { interval }: { interval: number },\n) {\n let active = true;\n const unwatch = () => (active = false);\n\n const watch = async () => {\n await wait(interval);\n\n const poll = async () => {\n if (!active) return;\n await fn({ unpoll: unwatch });\n await wait(interval);\n poll();\n };\n\n poll();\n };\n\n watch();\n\n return unwatch;\n}\n","export function now(): number {\n return Math.floor(Date.now() / 1000);\n}\n\nexport function max(): number {\n return 8640000000000000000;\n}\n","import { type Hex, maxUint256 } from \"viem\";\nimport * as z from \"zod\";\nimport { Obligation } from \"#core\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { transformHex } from \"#utils/zod.ts\";\n\nexport type Quote = {\n /** The obligation id. */\n obligationId: Hex;\n ask: {\n /** The highest interest rate the seller will accept to pay for the obligation. (18 decimals). */\n rate: bigint;\n };\n bid: {\n /** The lowest interest rate a buyer is willing to be paid for the obligation. (18 decimals). */\n rate: bigint;\n };\n};\n\nexport const QuoteSchema = z.object({\n obligationId: z.string().transform(transformHex),\n ask: z.object({\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n bid: z.object({\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n});\n\n/**\n * Creates a quote for a given obligation.\n * @constructor\n * @param parameters - {@link from.Parameters}\n * @returns The created quote. {@link Quote}\n * @throws If the quote is invalid. {@link InvalidQuoteError}\n *\n * @example\n * ```ts\n * const quote = Quote.from({ obligationId: \"0x123\", ask: { assets: 100n, rate: 100n }, bid: { assets: 100n, rate: 100n } });\n * ```\n */\nexport function from(parameters: from.Parameters): from.ReturnType {\n try {\n const parsedQuote = QuoteSchema.parse(parameters);\n return {\n obligationId: parsedQuote.obligationId,\n ask: parsedQuote.ask,\n bid: parsedQuote.bid,\n };\n } catch (error: unknown) {\n throw new InvalidQuoteError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n type Parameters = Quote;\n type ReturnType = Quote;\n type ErrorType = InvalidQuoteError;\n}\n\n/**\n * Creates a quote from a snake case object.\n * @throws If the quote is invalid. {@link InvalidQuoteError}\n * @param snake - {@link fromSnakeCase.Parameters}\n * @returns The created quote. {@link fromSnakeCase.ReturnType}\n */\nexport function fromSnakeCase(snake: fromSnakeCase.Parameters): fromSnakeCase.ReturnType {\n return from(Format.fromSnakeCase<Quote>(snake));\n}\n\nexport declare namespace fromSnakeCase {\n type Parameters = Format.Snake<Quote>;\n type ReturnType = Quote;\n type ErrorType = from.ErrorType;\n}\n\n/**\n * Generates a random quote.\n * @returns A randomly generated quote. {@link random.ReturnType}\n *\n * @example\n * ```ts\n * const quote = Quote.random();\n * ```\n */\nexport function random(): random.ReturnType {\n return from({\n obligationId: Obligation.id(Obligation.random()),\n ask: {\n rate: BigInt(Math.floor(Math.random() * 1000000)),\n },\n bid: {\n rate: BigInt(Math.floor(Math.random() * 1000000)),\n },\n });\n}\n\nexport declare namespace random {\n type Parameters = never;\n type ReturnType = Quote;\n type ErrorType = from.ErrorType;\n}\n\nexport class InvalidQuoteError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Quote.InvalidQuoteError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid quote.\", { cause: error });\n }\n}\n","/** Combines members of an intersection into a readable type. */\n// https://twitter.com/mattpocockuk/status/1622730173446557697?s=20&t=NdpAcmEFXY01xkqU3KO0Mg\nexport type Compute<type> = { [key in keyof type]: type[key] } & unknown;\n\n// https://effect.website/docs/code-style/branded-types/#generalizing-branded-types\nexport const BrandTypeId = Symbol.for(\"mempool/Brand\");\nexport type Brand<in out ID extends string | symbol> = {\n readonly [BrandTypeId]: {\n readonly [id in ID]: ID;\n };\n};\n","import { Base64 } from \"js-base64\";\n// ---------- Cursor‑pagination helpers ----------\nexport type Cursor = {\n sort: \"rate\" | \"maturity\" | \"expiry\" | \"amount\";\n dir: \"asc\" | \"desc\";\n rate?: string; // bigint rendered to string\n maturity?: number;\n expiry?: number;\n assets?: string; // bigint rendered to string\n hash: string;\n // Optional page number to support client-side hard caps on depth\n page?: number;\n};\n\nexport function validate(cursor: unknown): cursor is Cursor {\n if (!cursor || typeof cursor !== \"object\") {\n throw new Error(\"Cursor must be an object\");\n }\n\n const c = cursor as any;\n\n // Validate sort field\n if (![\"rate\", \"maturity\", \"expiry\", \"amount\"].includes(c.sort)) {\n throw new Error(\n `Invalid sort field: ${c.sort}. Must be one of: rate, maturity, expiry, amount`,\n );\n }\n\n // Validate direction\n if (![\"asc\", \"desc\"].includes(c.dir)) {\n throw new Error(`Invalid direction: ${c.dir}. Must be one of: asc, desc`);\n }\n\n // Validate hash format (basic hex validation)\n if (!/^0x[a-fA-F0-9]{64}$/.test(c.hash)) {\n throw new Error(\n `Invalid hash format: ${c.hash}. Must be a 64-character hex string starting with 0x`,\n );\n }\n\n // Validate sort-specific fields\n const validations: Record<\n string,\n {\n field: string;\n type: \"string\" | \"number\";\n pattern?: RegExp;\n validator?: (val: any) => boolean;\n error: string;\n }\n > = {\n rate: {\n field: \"rate\",\n type: \"string\",\n pattern: /^\\d+$/,\n error: \"numeric string\",\n },\n amount: {\n field: \"assets\",\n type: \"string\",\n pattern: /^\\d+$/,\n error: \"numeric string\",\n },\n maturity: {\n field: \"maturity\",\n type: \"number\",\n validator: (val: number) => val > 0,\n error: \"positive number\",\n },\n expiry: {\n field: \"expiry\",\n type: \"number\",\n validator: (val: number) => val > 0,\n error: \"positive number\",\n },\n };\n\n const validation = validations[c.sort];\n if (!validation) {\n throw new Error(`Invalid sort field: ${c.sort}`);\n }\n\n const fieldValue = c[validation.field];\n\n if (!fieldValue) {\n throw new Error(`${c.sort} sort requires '${validation.field}' field to be present`);\n }\n\n if (typeof fieldValue !== validation.type) {\n throw new Error(\n `${c.sort} sort requires '${validation.field}' field of type ${validation.type}`,\n );\n }\n\n if (validation.pattern && !validation.pattern.test(fieldValue)) {\n throw new Error(\n `Invalid ${validation.field} format: ${fieldValue}. Must be a ${validation.error}`,\n );\n }\n\n if (validation.validator && !validation.validator(fieldValue)) {\n throw new Error(\n `Invalid ${validation.field} value: ${fieldValue}. Must be a ${validation.error}`,\n );\n }\n\n if (c.page !== undefined) {\n if (typeof c.page !== \"number\" || !Number.isInteger(c.page) || c.page < 1) {\n throw new Error(\"Invalid page: must be a positive integer\");\n }\n }\n\n return true;\n}\n\nexport function encode(c: Cursor): string {\n // Use browser-compatible Base64\n return Base64.encodeURL(JSON.stringify(c));\n}\n\nexport function decode(token?: string): Cursor | null {\n if (!token) return null;\n const decoded = JSON.parse(Base64.decode(token));\n validate(decoded);\n return decoded;\n}\n","import type { Hex } from \"viem\";\nimport * as z from \"zod\";\nimport { Cursor } from \"#stores/utils/index.ts\";\n\nconst MAX_LIMIT = 100;\nconst DEFAULT_LIMIT = 20;\nconst PaginationQueryParams = z.object({\n cursor: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (!val) return true; // Optional field\n try {\n const decoded = Cursor.decode(val);\n return decoded !== null;\n } catch (_error) {\n return false; // Invalid cursor\n }\n },\n {\n message: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n },\n )\n .meta({\n description: \"Pagination cursor in base64url-encoded format\",\n example:\n \"eyJzb3J0IjoicHJpY2UiLCJkaXIiOiJkZXNjIiwicHJpY2UiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIiwiaGFzaCI6IjB4ZGRmZDY4NTllM2UwODJkMTkzODlhMWFlYzFiZGFkN2U4ZDkyZDk2YjFhYTc5NDBkYTkxYTMxMjVkMzFlM2JlNWIifQ\",\n }),\n limit: z\n .string()\n .regex(/^[1-9]\\d*$/, {\n message: \"Limit must be a positive integer\",\n })\n .transform((val) => Number.parseInt(val, 10))\n .pipe(\n z.number().max(MAX_LIMIT, {\n message: `Limit cannot exceed ${MAX_LIMIT}`,\n }),\n )\n .optional()\n .default(DEFAULT_LIMIT)\n .meta({\n description: `Limit maximum: ${MAX_LIMIT}. Default: ${DEFAULT_LIMIT}`,\n example: 10,\n }),\n});\n\nexport const GetOffersQueryParams = z.object({\n ...PaginationQueryParams.shape,\n side: z.enum([\"buy\", \"sell\"]).meta({\n description: \"Side of the offer.\",\n example: \"buy\",\n }),\n obligation_id: z\n .string({ error: \"Obligation id is required and must be a valid 32-byte hex string\" })\n .regex(/^0x[a-fA-F0-9]{64}$/, { error: \"Obligation id must be a valid 32-byte hex string\" })\n .transform<Hex>((val) => val.toLowerCase() as Hex)\n .meta({\n description: \"Offers obligation id\",\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n }),\n});\n\nexport const GetObligationsQueryParams = z.object({\n ...PaginationQueryParams.shape,\n cursor: z.string().optional().meta({\n description: \"Obligation id cursor\",\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n }),\n});\n\nconst schemas = {\n get_offers: GetOffersQueryParams,\n get_obligations: GetObligationsQueryParams,\n} as const;\n\ntype Action = keyof typeof schemas;\n\nexport function parse<A extends Action>(action: A, query: unknown): z.infer<(typeof schemas)[A]> {\n return schemas[action].parse(query) as z.infer<(typeof schemas)[A]>;\n}\n\nexport function safeParse<A extends Action>(\n action: A,\n query: unknown,\n error?: z.core.$ZodErrorMap<z.core.$ZodIssue>,\n): z.ZodSafeParseResult<z.infer<(typeof schemas)[A]>> {\n return schemas[action].safeParse(query, {\n error,\n }) as z.ZodSafeParseResult<z.infer<(typeof schemas)[A]>>;\n}\n","import { z } from \"zod/v4\";\nimport { createDocument, type ZodOpenApiPathsObject } from \"zod-openapi\";\nimport { Obligation, Offer } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\nimport { ChainsHealthResponse, CollectorsHealthResponse, RouterStatusResponse } from \"./health.ts\";\nimport { GetObligationsQueryParams, GetOffersQueryParams } from \"./requests.ts\";\n\nconst timestampExample = \"2024-01-01T12:00:00.000Z\";\nconst cursorExample = \"eyJvZmZzZXQiOjEwMH0\";\n\nfunction makeSuccessResponse<T extends z.ZodTypeAny>(parameters: {\n dataSchema: T;\n dataDescription?: string;\n dataExample: unknown;\n cursor: string | null;\n}) {\n const { dataSchema, dataDescription, dataExample, cursor } = parameters;\n const withDataMeta = dataDescription\n ? dataSchema.meta({ description: dataDescription })\n : dataSchema;\n return z\n .object({\n status: z.literal(\"success\"),\n cursor: z.string().nullable(),\n data: z.any(),\n meta: z.object({\n timestamp: z.string(),\n }),\n })\n .extend({\n data: withDataMeta,\n })\n .meta({\n example: {\n status: \"success\",\n cursor,\n data: dataExample,\n meta: { timestamp: timestampExample },\n },\n });\n}\n\nconst OffersSuccessResponseSchema = makeSuccessResponse({\n dataSchema: z.array(z.any()),\n dataDescription: \"Offers matching the provided filters.\",\n dataExample: [Format.toSnakeCase(Offer.random())],\n cursor: cursorExample,\n});\n\nconst ObligationsSuccessResponseSchema = makeSuccessResponse({\n dataSchema: z.array(z.any()),\n dataDescription: \"Obligations known to the router.\",\n dataExample: [Format.toSnakeCase(Obligation.random())],\n cursor: cursorExample,\n});\n\nconst RouterStatusSuccessResponseSchema = makeSuccessResponse({\n dataSchema: RouterStatusResponse,\n dataDescription: \"Aggregated router status.\",\n dataExample: { status: \"live\" },\n cursor: null,\n});\n\nconst CollectorsHealthSuccessResponseSchema = makeSuccessResponse({\n dataSchema: CollectorsHealthResponse,\n dataDescription: \"Collectors health details and sync status.\",\n dataExample: [\n {\n name: \"mempool_offers\",\n chain_id: \"1\",\n block_number: 21345678,\n updated_at: \"2024-01-01T12:00:00.000Z\",\n lag: 0,\n status: \"live\",\n },\n ],\n cursor: null,\n});\n\nconst ChainsHealthSuccessResponseSchema = makeSuccessResponse({\n dataSchema: ChainsHealthResponse,\n dataDescription: \"Latest processed block per chain.\",\n dataExample: [\n {\n chain_id: \"1\",\n block_number: 21345678,\n updated_at: \"2024-01-01T12:00:00.000Z\",\n },\n ],\n cursor: null,\n});\n\nconst errorResponseSchema = z\n .object({\n status: z.literal(\"error\"),\n error: z.object({\n code: z.string(),\n message: z.string(),\n details: z.any().optional(),\n }),\n meta: z.object({\n timestamp: z.string(),\n }),\n })\n .meta({\n description: \"Error response wrapper.\",\n example: {\n status: \"error\",\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n details: [\n {\n field: \"cursor\",\n issue: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n },\n ],\n },\n meta: {\n timestamp: timestampExample,\n },\n },\n });\n\nconst paths: ZodOpenApiPathsObject = {\n \"/v1/offers\": {\n get: {\n summary: \"Offers\",\n description: \"Find offers that match specific criteria\",\n tags: [\"Offers\"],\n requestParams: {\n query: GetOffersQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: OffersSuccessResponseSchema,\n },\n },\n },\n 400: {\n description: \"Bad Request\",\n content: {\n \"application/json\": {\n schema: errorResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/obligations\": {\n get: {\n summary: \"Obligations\",\n description: \"List obligations with pagination support\",\n tags: [\"Obligations\"],\n requestParams: {\n query: GetObligationsQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: ObligationsSuccessResponseSchema,\n },\n },\n },\n 400: {\n description: \"Bad Request\",\n content: {\n \"application/json\": {\n schema: errorResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/health\": {\n get: {\n summary: \"Router status\",\n description: \"Retrieve the aggregated status of the router.\",\n tags: [\"Health\"],\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: RouterStatusSuccessResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/health/collectors\": {\n get: {\n summary: \"Collectors health\",\n description: \"Retrieve the block numbers processed by collectors and their sync status.\",\n tags: [\"Health\"],\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: CollectorsHealthSuccessResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/health/chains\": {\n get: {\n summary: \"Chains health\",\n description: \"Retrieve the latest block processed for each chain.\",\n tags: [\"Health\"],\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: ChainsHealthSuccessResponseSchema,\n },\n },\n },\n },\n },\n },\n};\n\nexport const OpenApi = createDocument({\n openapi: \"3.1.0\",\n info: {\n title: \"Router API\",\n version: \"1.0.0\",\n description: \"API for the Morpho Router\",\n },\n tags: [\n {\n name: \"Offers\",\n },\n {\n name: \"Obligations\",\n },\n {\n name: \"Health\",\n },\n ],\n servers: [\n {\n url: \"https://router.morpho.dev\",\n description: \"Production server\",\n },\n {\n url: \"http://localhost:7891\",\n description: \"Local development server\",\n },\n ],\n paths,\n});\n","import type { Hex } from \"viem\";\nimport { type Compute, Obligation, Offer, Quote } from \"#core\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type * as Format from \"#utils/Format.ts\";\nimport * as ApiSchema from \"../api/Schema/index.ts\";\n\ntype RouterClientConfig = {\n /** The URL of the router. */\n readonly url: URL;\n /** The default headers to use for each request. */\n readonly headers: Headers;\n};\n\nexport type Client = Compute<\n RouterClientConfig & {\n /**\n * Get offers from the router.\n * @param parameters - {@link getOffers.Parameters}\n * @returns The offers with pagination cursor. {@link getOffers.ReturnType}\n *\n * @example\n * ```ts\n * const router = RouterClient.connect({ url: \"https://router.morpho.dev\" });\n * const { offers, cursor } = await router.getOffers({ side: \"buy\", obligationId: \"0xa1c...d2f\" });\n * console.log(offers);\n * ```\n */\n getOffers: (parameters: getOffers.Parameters) => Promise<getOffers.ReturnType>;\n\n /**\n * Get obligations from the router.\n * @param parameters - {@link getObligations.Parameters}\n * @returns The obligations with pagination cursor. {@link getObligations.ReturnType}\n *\n * @example\n * ```ts\n * const router = RouterClient.connect({ url: \"https://router.morpho.dev\" });\n * const { obligations, cursor } = await router.getObligations();\n * console.log(obligations);\n * ```\n */\n getObligations: (parameters?: getObligations.Parameters) => Promise<getObligations.ReturnType>;\n }\n>;\n\nexport type ConnectOptions = {\n /** The URL of the router to interact with.\n * @default \"https://router.morpho.dev\"\n */\n url?: string;\n /** The API key to use for the router API. */\n apiKey?: string;\n /** The default headers to use for each request. */\n headers?: Headers;\n};\n\n/**\n * Creates an instance of a router client.\n * @constructor\n * @param options - {@link ConnectOptions}\n * @returns A Router Client. {@link Client}\n *\n * @example\n * ```typescript\n * const router = RouterClient.connect({ url: \"https://router.morpho.dev\" });\n * ```\n */\nexport function connect(options?: ConnectOptions): connect.ReturnType {\n const u = new URL(options?.url || \"https://router.morpho.dev\");\n\n if (u.protocol !== \"http:\" && u.protocol !== \"https:\") {\n throw new InvalidUrlError(u.toString());\n }\n\n const headers = options?.headers ?? new Headers();\n headers.set(\"Content-Type\", \"application/json\");\n options?.apiKey !== undefined ? headers.set(\"X-API-Key\", options.apiKey) : null;\n\n const config: RouterClientConfig = {\n url: u,\n headers,\n };\n\n return {\n ...config,\n getOffers: (parameters) => getOffers(config, parameters),\n getObligations: (parameters) => getObligations(config, parameters),\n };\n}\n\nexport declare namespace connect {\n export type ReturnType = Client;\n export type ErrorType = InvalidUrlError;\n}\n\nexport async function getOffers(\n config: RouterClientConfig,\n parameters: getOffers.Parameters,\n): Promise<getOffers.ReturnType> {\n const url = new URL(`${config.url.toString()}v1/offers`);\n\n url.searchParams.set(\"side\", parameters.side);\n url.searchParams.set(\"obligation_id\", parameters.obligationId.toString());\n\n if (parameters.cursor) {\n url.searchParams.set(\"cursor\", parameters.cursor);\n }\n if (parameters.limit !== undefined) {\n url.searchParams.set(\"limit\", parameters.limit.toString());\n }\n\n const { cursor: returnedCursor, data: offers } = await getApi<{\n cursor: string | null;\n data: ApiSchema.OfferResponse.OfferResponse[];\n }>(config, url);\n\n const routerOffers = offers.map(Offer.fromSnakeCase);\n\n return {\n cursor: returnedCursor,\n offers: routerOffers,\n };\n}\n\nexport declare namespace getOffers {\n export type Parameters = {\n /** The desired side of the match: 'buy' if you want to buy, 'sell' if you want to sell */\n side: \"buy\" | \"sell\";\n /** The offers obligation id */\n obligationId: Hex;\n /** Pagination cursor in base64url-encoded format */\n cursor?: string;\n /** Maximum number of offers to return. @default 20 */\n limit?: number;\n };\n\n export type ReturnType = {\n offers: Offer.Offer[];\n /** The pagination cursor. */\n cursor: string | null;\n };\n\n export type ErrorType = GetApiErrorType;\n}\n\nexport async function getObligations(\n config: RouterClientConfig,\n parameters?: getObligations.Parameters,\n): Promise<getObligations.ReturnType> {\n const url = new URL(`${config.url.toString()}v1/obligations`);\n\n if (parameters?.cursor !== undefined) {\n url.searchParams.set(\"cursor\", parameters.cursor);\n }\n if (parameters?.limit !== undefined) {\n url.searchParams.set(\"limit\", parameters.limit.toString());\n }\n\n const { cursor: returnedCursor, data: items } = await getApi<{\n cursor: string | null;\n data: ApiSchema.ObligationResponse.ObligationResponse[];\n }>(config, url);\n\n const obligations = items.map((item) => {\n const obligation = Obligation.fromSnakeCase(item);\n const { obligationId: _, ...returned } = {\n id: () => Obligation.id(obligation),\n ...obligation,\n ...Quote.fromSnakeCase({ obligation_id: item.id, ask: item.ask, bid: item.bid }),\n };\n return returned;\n });\n\n return {\n cursor: returnedCursor,\n obligations,\n };\n}\n\nexport declare namespace getObligations {\n export type Parameters = {\n /** Pagination cursor is a 32-byte hex string. */\n cursor?: Hex;\n /** Maximum number of obligations to return. @default 20 */\n limit?: number;\n };\n\n export type ReturnType = {\n obligations: Compute<\n {\n /** The obligation id. Uses {@link Obligation.id} to calculate the id.*/\n id: () => Hex;\n } & Obligation.Obligation &\n Omit<Quote.Quote, \"obligationId\">\n >[];\n /** The pagination cursor. */\n cursor: string | null;\n };\n\n export type ErrorType = GetApiErrorType;\n}\n\ntype GetApiErrorType =\n | HttpGetApiFailedError\n | HttpUnauthorizedError\n | HttpForbiddenError\n | HttpRateLimitError;\n\nasync function getApi<T>(config: RouterClientConfig, url: URL): Promise<Format.Snake<T>> {\n const pathname = url.pathname;\n let action: \"get_offers\" | \"get_obligations\";\n\n switch (true) {\n case pathname.includes(\"/v1/offers\"):\n action = \"get_offers\";\n break;\n case pathname.includes(\"/v1/obligations\"):\n action = \"get_obligations\";\n break;\n default:\n throw new HttpGetApiFailedError(\"Unknown endpoint\", {\n details: `Unsupported path: ${pathname}`,\n });\n }\n\n const schemaParseResult = ApiSchema.safeParse(action, Object.fromEntries(url.searchParams));\n if (!schemaParseResult.success) {\n throw new HttpGetApiFailedError(`Invalid URL parameters`, {\n details: schemaParseResult.error.issues[0]?.message,\n });\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: config.headers,\n });\n\n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new HttpUnauthorizedError();\n case 403:\n throw new HttpForbiddenError();\n case 429:\n throw new HttpRateLimitError();\n }\n throw new HttpGetApiFailedError(`GET request returned ${response.status}`, {\n details: await response.text(),\n });\n }\n\n return response.json() as Promise<Format.Snake<T>>;\n}\n\nexport class InvalidUrlError extends Errors.BaseError {\n override name = \"Router.InvalidUrlError\";\n constructor(url: string) {\n super(`URL \"${url}\" is not http/https.`);\n }\n}\n\nexport class HttpUnauthorizedError extends Errors.BaseError {\n override name = \"Router.HttpUnauthorizedError\";\n constructor() {\n super(\"Unauthorized.\", {\n metaMessages: [\"Ensure that an API key is provided.\"],\n });\n }\n}\n\nexport class HttpForbiddenError extends Errors.BaseError {\n override name = \"Router.HttpForbiddenError\";\n constructor() {\n super(\"Forbidden.\", {\n metaMessages: [\"Ensure that the API key is valid.\"],\n });\n }\n}\n\nexport class HttpRateLimitError extends Errors.BaseError {\n override name = \"Router.HttpRateLimitError\";\n constructor() {\n super(\"Rate limit exceeded.\", {\n metaMessages: [\n \"The number of allowed requests has been exceeded. You must wait for the rate limit to reset.\",\n ],\n });\n }\n}\n\nexport class HttpGetApiFailedError extends Errors.BaseError {\n override name = \"Router.HttpGetApiFailedError\";\n constructor(message: string, { details }: { details?: string } = {}) {\n super(message, {\n metaMessages: [details],\n });\n }\n}\n","import type * as ValidationRule from \"./ValidationRule.ts\";\n\n/**\n * A validation issue.\n */\nexport type Issue<T, RuleName extends string = string> = {\n /** The name of the rule that caused the issue. */\n ruleName: RuleName;\n /** The message of the issue. */\n message: string;\n /** The item that was not valid. */\n item: T;\n};\n\n/**\n * The result of a validation.\n */\nexport type Result<T, RuleName extends string = string> = {\n /** The items that were valid. */\n valid: T[];\n /** The reports of the failed validations. */\n issues: Issue<T, RuleName>[];\n};\n\nexport function run<\n T,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, void>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>>;\n\nexport function run<\n T,\n Ctx,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, Ctx>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n ctx: Ctx;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>>;\n\nexport async function run<\n T,\n Ctx,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, Ctx>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n ctx?: Ctx;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>> {\n const { items, rules, ctx = {} as Ctx, chunkSize } = parameters;\n\n const issues: Issue<T, ValidationRule.RuleNames<Rules>>[] = [];\n let validItems: T[] = items.slice();\n\n for (const rule of rules) {\n if (validItems.length === 0) return { valid: [], issues };\n\n const indicesToRemove: Set<number> = new Set();\n if (rule.kind === \"single\") {\n for (let i = 0; i < validItems.length; i++) {\n const item = validItems[i]!;\n const issue = await rule.run(item, ctx);\n if (issue) {\n issues.push({ ...issue, ruleName: rule.name, item });\n indicesToRemove.add(i);\n }\n }\n } else if (rule.kind === \"batch\") {\n const exec = async (slice: T[], offset: number) => {\n const map = await rule.run(slice, ctx);\n for (let i = 0; i < slice.length; i++) {\n const issue = map.get(i);\n if (issue !== undefined) {\n issues.push({ ...issue, ruleName: rule.name, item: slice[i]! });\n indicesToRemove.add(offset + i);\n }\n }\n };\n\n if (!chunkSize) await exec(validItems, 0);\n else {\n for (let i = 0; i < validItems.length; i += chunkSize) {\n await exec(validItems.slice(i, i + chunkSize), i);\n }\n }\n }\n\n validItems = validItems.filter((_, i) => !indicesToRemove.has(i));\n }\n\n return {\n valid: validItems,\n issues,\n };\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { Abi, Callback, type Chain, Maturity, type Offer } from \"#core\";\nimport type * as Validation from \"./Validation.ts\";\n\n/**\n * A validation rule.\n */\nexport type Rule<T, Name extends string = string, Ctx = void> =\n | { kind: \"single\"; name: Name; run: Single<T, Name, Ctx> }\n | { kind: \"batch\"; name: Name; run: Batch<T, Name, Ctx> };\n\nexport type RuleNames<Rules extends readonly { name: string }[]> = Rules[number][\"name\"];\n\n/**\n * A single item validation rule.\n * @param item - The item to validate.\n * @param ctx - The context of the validation.\n * @returns The issue that was found. If the item is valid, this will be undefined.\n */\nexport type Single<T, RuleName extends string, Ctx = void> = (\n item: T,\n ctx: Ctx,\n) =>\n | Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\">\n | undefined\n | Promise<Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>;\n\n/**\n * A batch item validation rule.\n * @param items - The items to validate.\n * @param ctx - The context of the validation.\n * @returns A map of the items to the issue that was found.\n */\nexport type Batch<T, RuleName extends string, Ctx = void> = (\n items: T[],\n ctx: Ctx,\n) =>\n | Map<number, Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>\n | Promise<Map<number, Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>>;\n\n/**\n * Create a validation rule iterating over a single item at a time.\n * @param name - The name of the rule.\n * @param run - The function that validates the rule.\n * @returns The created rule.\n */\nexport function single<Name extends string, T, Ctx = void>(\n name: Name,\n run: Single<T, Name, Ctx>,\n): Rule<T, Name, Ctx> {\n return { kind: \"single\", name, run } as const satisfies Rule<T, Name, Ctx>;\n}\n\n/**\n * Create a validation rule iterating over a batch of items at a time.\n * @param name - The name of the rule.\n * @param run - The function that validates the rule.\n * @returns The created rule.\n */\nexport function batch<Name extends string, T, Ctx = void>(\n name: Name,\n run: Batch<T, Name, Ctx>,\n): Rule<T, Name, Ctx> {\n return { kind: \"batch\", name, run } as const satisfies Rule<T, Name, Ctx>;\n}\n\nexport type MorphoContext = {\n chain: Chain.Chain;\n client: PublicClient;\n};\n\nexport function morpho() {\n const chainId = single(\"chain_id\", (offer: Offer.Offer, { chain }: MorphoContext) => {\n if (chain.id !== offer.chainId) {\n return {\n message: `Chain ID ${offer.chainId} is not the same as the chain ID in the context (${chain.id})`,\n };\n }\n });\n\n const loanToken = single(\"loan_token\", (offer: Offer.Offer, { chain }: MorphoContext) => {\n const tokens = new Set(\n Array.from(chain.whitelistedAssets.values()).map((a) => a.toLowerCase() as Address),\n );\n\n if (!tokens.has(offer.loanToken.toLowerCase() as Address)) {\n return {\n message: `Loan token ${offer.loanToken} is not whitelisted on chain ${offer.chainId}`,\n };\n }\n });\n\n const expiry = single(\"expiry\", (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.expiry < Math.floor(Date.now() / 1000)) {\n return { message: \"Expiry mismatch\" };\n }\n });\n\n const sellEmptyCallback = single(\n \"sell_offers_empty_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data === \"0x\") {\n return { message: \"Sell offers require a non-empty callback.\" };\n }\n },\n );\n\n const buyNonEmptyCallback = single(\n \"buy_offers_non_empty_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.buy && offer.callback.data !== \"0x\") {\n const allowed = new Set(\n Callback.WhitelistedCallbackAddresses[Callback.CallbackType.BuyVaultV1Callback].map((a) =>\n a.toLowerCase(),\n ),\n );\n\n const callbackAddress = offer.callback.address?.toLowerCase();\n if (!callbackAddress || !allowed.has(callbackAddress)) {\n return {\n message:\n \"Buy offers with non-empty callback must use a whitelisted BuyVaultV1Callback.\",\n };\n }\n }\n },\n );\n\n const sellNonWhitelistedCallback = single(\n \"sell_offers_non_whitelisted_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data !== \"0x\") {\n const allowed = new Set(\n Callback.WhitelistedCallbackAddresses[Callback.CallbackType.SellERC20Callback].map((a) =>\n a.toLowerCase(),\n ),\n );\n const callbackAddress = offer.callback.address?.toLowerCase() as Address | undefined;\n if (!callbackAddress || !allowed.has(callbackAddress)) {\n return { message: \"Sell offer callback address is not whitelisted.\" };\n }\n }\n },\n );\n\n const sellCallbackDataInvalid = single(\n \"sell_offers_callback_data_invalid\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data !== \"0x\") {\n try {\n const decoded = Callback.decodeSellERC20Callback(offer.callback.data);\n if (decoded.length === 0) {\n return { message: \"Sell offer callback data must include at least one collateral.\" };\n }\n } catch (_) {\n return { message: \"Sell offer callback data cannot be decoded.\" };\n }\n }\n },\n );\n\n const sellCallbackCollateralInvalid = single(\n \"sell_offers_callback_collateral_invalid\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data !== \"0x\") {\n try {\n const decoded = Callback.decodeSellERC20Callback(offer.callback.data);\n const offerCollaterals = new Set(\n offer.collaterals.map((c) => c.asset.toLowerCase() as Address),\n );\n for (const { collateral } of decoded) {\n if (!offerCollaterals.has(collateral.toLowerCase() as Address)) {\n return { message: \"Sell callback collateral is not part of offer collaterals.\" };\n }\n }\n } catch (_) {}\n }\n },\n );\n\n const buyCallbackDataInvalid = single(\n \"buy_offers_callback_data_invalid\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.buy && offer.callback.data !== \"0x\") {\n try {\n const decoded = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n if (decoded.length === 0) {\n return { message: \"Buy offer callback data must include at least one vault.\" };\n }\n } catch (_) {\n return { message: \"Buy offer callback data cannot be decoded.\" };\n }\n }\n },\n );\n\n const buyCallbackVaultInvalid = batch(\n \"buy_offers_callback_vault_invalid\",\n async (offers: Offer.Offer[], { client, chain }: MorphoContext) => {\n const validationIssues = new Map<\n number,\n | Omit<\n Validation.Issue<Offer.Offer, \"buy_offers_callback_vault_invalid\">,\n \"ruleName\" | \"item\"\n >\n | undefined\n >();\n\n const offersByVaultAddress = new Map<string, Array<{ index: number; offer: Offer.Offer }>>();\n for (let i = 0; i < offers.length; i++) {\n const offer = offers[i]!;\n if (offer.buy && offer.callback.data !== \"0x\") {\n try {\n const callbackVaults = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n for (const { vault } of callbackVaults) {\n const normalizedVaultAddress = vault.toLowerCase();\n if (!offersByVaultAddress.has(normalizedVaultAddress)) {\n offersByVaultAddress.set(normalizedVaultAddress, []);\n }\n offersByVaultAddress.get(normalizedVaultAddress)!.push({ index: i, offer });\n }\n } catch (_) {\n // Skip - invalid callback data is already caught by buyCallbackDataInvalid rule\n }\n }\n }\n\n const uniqueVaultAddresses = Array.from(offersByVaultAddress.keys());\n if (uniqueVaultAddresses.length === 0) return validationIssues;\n\n const whitelistedFactories = Object.values(chain.vaultV1Factory);\n\n const multicallContracts = [];\n for (const vaultAddress of uniqueVaultAddresses) {\n multicallContracts.push({\n address: vaultAddress as Address,\n abi: Abi.ERC4626,\n functionName: \"asset\",\n } as const);\n\n for (const factoryAddress of whitelistedFactories) {\n multicallContracts.push({\n address: factoryAddress as Address,\n abi: Abi.MetaMorphoFactory,\n functionName: \"isMetaMorpho\",\n args: [vaultAddress as Address],\n } as const);\n }\n }\n\n const multicallResults = await client.multicall({\n contracts: multicallContracts,\n allowFailure: true,\n });\n\n const vaultAssetByAddress = new Map<string, Address | null>();\n const registeredVaults = new Set<string>();\n\n const numberOfFactories = whitelistedFactories.length;\n\n let resultIndex = 0;\n for (const vaultAddress of uniqueVaultAddresses) {\n const assetCallResult = multicallResults[resultIndex++]!;\n const assetAddress =\n assetCallResult.status === \"success\" ? (assetCallResult.result as Address) : null;\n\n vaultAssetByAddress.set(vaultAddress, assetAddress);\n\n let isRegisteredInFactory = false;\n for (let factoryIndex = 0; factoryIndex < numberOfFactories; factoryIndex++) {\n const factoryCallResult = multicallResults[resultIndex++]!;\n\n if (factoryCallResult.status === \"success\" && factoryCallResult.result === true) {\n isRegisteredInFactory = true;\n }\n }\n\n if (isRegisteredInFactory) {\n registeredVaults.add(vaultAddress);\n }\n }\n\n const uniqueOffers = new Map<number, Offer.Offer>();\n for (const offersArray of offersByVaultAddress.values()) {\n for (const { index, offer } of offersArray) {\n uniqueOffers.set(index, offer);\n }\n }\n\n for (const [index, offer] of uniqueOffers) {\n try {\n const callbackVaults = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n const vaultsWithIssues: Array<{ vaultAddress: Address; failureReasons: string }> = [];\n\n for (const { vault } of callbackVaults) {\n const normalizedVaultAddress = vault.toLowerCase();\n const assetAddress = vaultAssetByAddress.get(normalizedVaultAddress);\n const isRegistered = registeredVaults.has(normalizedVaultAddress);\n\n const failureReasons: string[] = [];\n\n if (assetAddress === null) {\n failureReasons.push(\"asset call failed\");\n } else if (\n assetAddress &&\n assetAddress.toLowerCase() !== offer.loanToken.toLowerCase()\n ) {\n failureReasons.push(\"asset mismatch\");\n }\n\n if (!isRegistered) {\n failureReasons.push(\"not registered in factory\");\n }\n\n if (failureReasons.length > 0) {\n vaultsWithIssues.push({\n vaultAddress: vault,\n failureReasons: failureReasons.join(\", \"),\n });\n }\n }\n\n if (vaultsWithIssues.length > 0) {\n const failureDetails = vaultsWithIssues\n .map((v) => `${v.vaultAddress} (${v.failureReasons})`)\n .join(\"; \");\n validationIssues.set(index, {\n message: `Buy offer callback vaults are invalid: ${failureDetails}`,\n });\n }\n } catch (_) {\n // Skip - invalid callback data is already caught by buyCallbackDataInvalid rule\n }\n }\n\n return validationIssues;\n },\n );\n\n const maturity = single(\"maturity\", (offer: Offer.Offer, _: MorphoContext) => {\n const allowedMaturities = [Maturity.from(\"end_of_month\"), Maturity.from(\"end_of_next_month\")];\n\n if (!allowedMaturities.includes(offer.maturity)) {\n return {\n message: `Maturity must be end of current month (${allowedMaturities[0]}) or end of next month (${allowedMaturities[1]}). Got: ${offer.maturity}`,\n };\n }\n });\n\n return [\n chainId,\n loanToken,\n expiry,\n maturity,\n // note: callback rules should be the last ones, since they do not mean that the offer is forever invalid\n // integrators should be able to choose if they want to keep the offer or not\n sellEmptyCallback,\n buyNonEmptyCallback,\n sellNonWhitelistedCallback,\n sellCallbackDataInvalid,\n sellCallbackCollateralInvalid,\n buyCallbackDataInvalid,\n buyCallbackVaultInvalid,\n ];\n}\n","import type { Hex } from \"viem\";\nimport type { Compute, Offer } from \"#core\";\nimport * as EVMClient from \"./MempoolEVMClient.ts\";\n\nexport type AddParameters = {\n offer: Compute<Omit<Offer.Offer, \"hash\" | \"createdAt\">>;\n};\n\nexport type GetParameters = {\n /** The block number to get offers from. */\n blockNumberGte?: number;\n /** The block number to get offers to. */\n blockNumberLte?: number;\n /** The loan asset to get offers from. */\n loanToken?: string;\n /** The order to get offers. Defaults to \"desc\". */\n order?: \"asc\" | \"desc\";\n /** The options to get offers from. */\n options?: {\n /** The maximum number of offers to return. Defaults to 100. Maximum is 1000. */\n maxBatchSize?: number;\n };\n};\n\nexport type WatchParameters = {\n /** The async function to get the last synced block number from which to start watching.\n * This function will be called periodically on each poll. It should be updated by the caller (e.g. using `onOffers` callback) to track the last synced block number.\n */\n lastSyncedBlock: () => Promise<number>;\n /** The loan asset to watch. */\n loanToken?: string;\n /** The callback to call when a new batch of offers is found in the mempool.\n * @param offers The offers found in the mempool.\n * @param blockNumber The block number of the last processed offer. Block numbers will always ascend.\n */\n onOffers: (offers: Offer.Offer[], blockNumber: number) => Promise<void>;\n /** The polling configuration. */\n polling?: {\n /** The interval in milliseconds to poll for new offers. Defaults to 30000. */\n interval?: number;\n /** The maximum number of offers that can be returned in a single batch.\n * Defaults to 100. Maximum is 1000. */\n maxBatchSize?: number;\n };\n};\n\n/**\n * Mempool client interface.\n */\nexport type Client = {\n /**\n * Add an offer to the mempool.\n * @returns The created offer with its hash.\n */\n add: (parameters: AddParameters) => Promise<{ offer: Offer.Offer; txHash: Hex }>;\n /** Get offers from the mempool. */\n get: (parameters?: GetParameters) => AsyncGenerator<{\n offers: Offer.Offer[];\n /** The block number of the last processed offer. Depends on the `order` parameter, block numbers will ascend or descend. */\n blockNumber: number;\n }>;\n /**\n * Watch for new offers on a specific chain.\n * @returns A function to stop watching for new offers.\n */\n watch: (parameters: WatchParameters) => () => boolean;\n\n /**\n * Stream offers from the mempool.\n * @returns A generator of offers alongside the last block number processed.\n */\n stream: (\n parameters: Compute<\n Omit<GetParameters, \"options\"> & {\n options: GetParameters[\"options\"] & { blockWindow?: number };\n }\n >,\n ) => AsyncGenerator<{\n offers: Offer.Offer[];\n blockNumber: number;\n }>;\n};\n\n/**\n * Client to interact with the Mempool contract on a specific chain.\n */\nexport function connect(parameters: EVMClient.from.Parameters): Client {\n return EVMClient.from(parameters);\n}\n\nexport declare namespace connect {\n export type ErrorType = EVMClient.from.ErrorType;\n}\n","import {\n type Address,\n decodeAbiParameters,\n type Hex,\n type PublicClient,\n publicActions,\n type WalletClient as ViemClient,\n} from \"viem\";\nimport type { Compute } from \"#core\";\nimport { Chain, Offer } from \"#core\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport { poll } from \"#utils/index.ts\";\nimport type * as Client from \"./MempoolClient.ts\";\n\nconst DEFAULT_BATCH_SIZE = 100;\nconst DEFAULT_BLOCK_WINDOW = 100;\n\ntype MempoolEVMClientConfig = {\n readonly client: ViemClient;\n readonly mempoolAddress: Address;\n readonly blockWindow: number;\n};\n\nexport function from(parameters: from.Parameters): from.ReturnType {\n const config: MempoolEVMClientConfig = {\n client: parameters.client,\n mempoolAddress: parameters.mempoolAddress,\n blockWindow: parameters.blockWindow || DEFAULT_BLOCK_WINDOW,\n };\n\n return {\n add: (parameters) => add(config, parameters),\n get: (parameters) => get(config, parameters),\n watch: (parameters) => watch(config, parameters),\n stream: (parameters) => streamOffers(config, parameters),\n };\n}\n\nexport declare namespace from {\n type Parameters = {\n /** The viem client to use. */\n client: ViemClient;\n /** The mempool address. */\n mempoolAddress: Address;\n /** The block window to use for the mempool. Defaults to 100. */\n blockWindow?: number;\n };\n\n type ReturnType = Client.Client;\n\n type ErrorType = null;\n}\n\n/**\n * Add an offer to the mempool.\n * @returns The created offer with its hash.\n * @throws WalletAccountNotSetError if the wallet account is not set.\n * @throws ViemClientError if the viem client throws an error.\n * @throws Offer.InvalidOfferError if the offer is invalid.\n */\nexport async function add(\n config: MempoolEVMClientConfig,\n parameters: Client.AddParameters,\n): Promise<{ offer: Offer.Offer; txHash: Hex }> {\n const offer = Offer.from(parameters.offer);\n if (!config.client.account) throw new WalletAccountNotSetError();\n\n const chainId = await getChainId(config.client);\n if (BigInt(chainId) !== offer.chainId)\n throw new ChainIdMismatchError(offer.chainId, BigInt(chainId));\n\n try {\n const tx = await config.client.sendTransaction({\n chain: config.client.chain,\n account: config.client.account!,\n to: config.mempoolAddress,\n data: Offer.encode(offer),\n });\n\n return { offer, txHash: tx };\n } catch (error) {\n throw new ViemClientError(error instanceof Error ? error.message : \"Unknown error\");\n }\n}\n\nexport declare namespace add {\n export type ErrorType =\n | WalletAccountNotSetError\n | ViemClientError\n | Offer.InvalidOfferError\n | ChainIdMismatchError;\n}\n\nexport async function* get(\n config: MempoolEVMClientConfig,\n parameters?: Client.GetParameters,\n): AsyncGenerator<{ offers: Offer.Offer[]; blockNumber: number }, void, void> {\n const {\n loanToken,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE } = {},\n } = parameters || {};\n\n yield* streamOffers(config, {\n loanToken,\n order,\n blockNumberGte,\n blockNumberLte,\n options: { maxBatchSize, blockWindow: config.blockWindow },\n });\n}\n\nexport declare namespace get {\n export type ErrorType = streamOffersReturnType;\n}\n\n/**\n * Watch for new offers on a specific chain.\n * @returns A function to stop watching for new offers.\n */\nexport function watch(config: MempoolEVMClientConfig, parameters: Client.WatchParameters) {\n const {\n loanToken,\n lastSyncedBlock,\n polling: { interval = 30_000, maxBatchSize = DEFAULT_BATCH_SIZE } = {},\n onOffers,\n } = parameters;\n\n return poll(\n async () => {\n const blockNumberGte = await lastSyncedBlock();\n\n const stream = streamOffers(config, {\n loanToken,\n order: \"asc\",\n blockNumberGte,\n options: { maxBatchSize, blockWindow: config.blockWindow },\n });\n\n for await (const { offers, blockNumber } of stream) {\n await onOffers(offers, blockNumber);\n }\n },\n { interval },\n );\n}\n\nexport declare namespace watch {\n export type ErrorType = streamOffersReturnType;\n}\n\nconst chainIdCache = new Map<string, number>();\n/**\n * Caches the chain id of a viem client.\n * @param client - The viem client.\n * @returns The chain id.\n */\nconst getChainId = async (client: ViemClient): Promise<number> => {\n if (chainIdCache.has(client.uid)) return chainIdCache.get(client.uid)!;\n const chainId = await client.getChainId();\n chainIdCache.set(client.uid, chainId);\n return chainId;\n};\n\ntype streamOffersReturnType = WalletAccountNotSetError | ChainIdMismatchError;\n\nasync function* streamOffers(\n config: MempoolEVMClientConfig,\n parameters: Compute<\n Omit<Client.GetParameters, \"options\"> & {\n options: Client.GetParameters[\"options\"] & { blockWindow?: number };\n }\n >,\n): AsyncGenerator<{ offers: Offer.Offer[]; blockNumber: number }, void, void> {\n const {\n loanToken,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE, blockWindow = config.blockWindow } = {},\n } = parameters;\n\n const stream = Chain.streamLogs({\n client: config.client.extend(publicActions) as PublicClient,\n contractAddress: config.mempoolAddress,\n event: {\n type: \"event\",\n name: \"Event\",\n inputs: [{ name: \"data\", type: \"bytes\", indexed: false, internalType: \"bytes\" }],\n anonymous: false,\n } as const,\n blockNumberGte,\n blockNumberLte,\n order,\n options: { maxBatchSize, blockWindow },\n });\n\n let blockNumber = order === \"asc\" ? blockNumberGte : blockNumberLte;\n for await (const { logs, blockNumber: newBlockNumber } of stream) {\n blockNumber = newBlockNumber;\n if (logs.length === 0) break;\n let offersAndBlockNumbers = logs\n .map((log) => {\n const [payload] = decodeAbiParameters([{ type: \"bytes\" }], log.data);\n try {\n return { offer: Offer.decode(payload, log.blockNumber), blockNumber: log.blockNumber };\n } catch (_) {\n return null;\n }\n })\n .filter((item) => item !== null);\n\n if (loanToken)\n offersAndBlockNumbers = offersAndBlockNumbers.filter(\n (o) => o.offer.loanToken.toLowerCase() === loanToken.toLowerCase(),\n );\n\n if (offersAndBlockNumbers.length === 0) continue;\n\n yield {\n offers: offersAndBlockNumbers.map((item) => item.offer),\n blockNumber,\n };\n }\n\n yield { offers: [], blockNumber: blockNumber! };\n return;\n}\n\nexport class WalletAccountNotSetError extends Errors.BaseError {\n override name = \"Mempool.WalletAccountNotSetError\";\n constructor() {\n super(\"Wallet account is not set.\");\n }\n}\n\nexport class ViemClientError extends Errors.BaseError {\n override name = \"Mempool.ViemClientError\";\n}\n\nexport class ChainIdMismatchError extends Errors.BaseError {\n override name = \"Mempool.ChainIdMismatchError\";\n constructor(expected: bigint, actual: bigint) {\n super(`Chain ID mismatch. Offer chain ID is ${expected}, network chain ID is ${actual}.`);\n }\n}\n"]}
|