@w3lib/evm-batch-call 0.7.0 → 0.8.0
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/CHANGELOG.md +30 -0
- package/README.md +206 -1
- package/dist/dividends.d.ts +135 -0
- package/dist/dividends.d.ts.map +1 -0
- package/dist/dividends.js +253 -0
- package/dist/dividends.js.map +1 -0
- package/dist/history.d.ts +154 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +247 -0
- package/dist/history.js.map +1 -0
- package/dist/historySources.d.ts +32 -0
- package/dist/historySources.d.ts.map +1 -0
- package/dist/historySources.js +319 -0
- package/dist/historySources.js.map +1 -0
- package/dist/liquidity/v3.d.ts +2 -0
- package/dist/liquidity/v3.d.ts.map +1 -1
- package/dist/liquidity/v3.js +1 -1
- package/dist/liquidity/v3.js.map +1 -1
- package/dist/liquidity/v4.d.ts +21 -0
- package/dist/liquidity/v4.d.ts.map +1 -1
- package/dist/liquidity/v4.js +4 -3
- package/dist/liquidity/v4.js.map +1 -1
- package/dist/lp.d.ts +8 -0
- package/dist/lp.d.ts.map +1 -1
- package/dist/lp.js +17 -1
- package/dist/lp.js.map +1 -1
- package/dist/lpV4.d.ts +4 -0
- package/dist/lpV4.d.ts.map +1 -1
- package/dist/lpV4.js +27 -3
- package/dist/lpV4.js.map +1 -1
- package/dist/permit.d.ts +137 -0
- package/dist/permit.d.ts.map +1 -0
- package/dist/permit.js +355 -0
- package/dist/permit.js.map +1 -0
- package/dist/portfolio.d.ts +2 -0
- package/dist/portfolio.d.ts.map +1 -1
- package/dist/portfolio.js +9 -4
- package/dist/portfolio.js.map +1 -1
- package/dist/rewards/farms.d.ts +26 -0
- package/dist/rewards/farms.d.ts.map +1 -0
- package/dist/rewards/farms.js +210 -0
- package/dist/rewards/farms.js.map +1 -0
- package/dist/rewards/index.d.ts +42 -0
- package/dist/rewards/index.d.ts.map +1 -0
- package/dist/rewards/index.js +382 -0
- package/dist/rewards/index.js.map +1 -0
- package/dist/rewards/types.d.ts +170 -0
- package/dist/rewards/types.d.ts.map +1 -0
- package/dist/rewards/types.js +2 -0
- package/dist/rewards/types.js.map +1 -0
- package/dist/simulate.d.ts +186 -0
- package/dist/simulate.d.ts.map +1 -0
- package/dist/simulate.js +559 -0
- package/dist/simulate.js.map +1 -0
- package/dist/simulateDecode.d.ts +33 -0
- package/dist/simulateDecode.d.ts.map +1 -0
- package/dist/simulateDecode.js +321 -0
- package/dist/simulateDecode.js.map +1 -0
- package/dist/smartAccount/account.d.ts +31 -0
- package/dist/smartAccount/account.d.ts.map +1 -0
- package/dist/smartAccount/account.js +33 -0
- package/dist/smartAccount/account.js.map +1 -0
- package/dist/smartAccount/clients.d.ts +77 -0
- package/dist/smartAccount/clients.d.ts.map +1 -0
- package/dist/smartAccount/clients.js +122 -0
- package/dist/smartAccount/clients.js.map +1 -0
- package/dist/smartAccount/eip5792.d.ts +77 -0
- package/dist/smartAccount/eip5792.d.ts.map +1 -0
- package/dist/smartAccount/eip5792.js +152 -0
- package/dist/smartAccount/eip5792.js.map +1 -0
- package/dist/smartAccount/send.d.ts +40 -0
- package/dist/smartAccount/send.d.ts.map +1 -0
- package/dist/smartAccount/send.js +271 -0
- package/dist/smartAccount/send.js.map +1 -0
- package/dist/smartAccount/userOp.d.ts +91 -0
- package/dist/smartAccount/userOp.d.ts.map +1 -0
- package/dist/smartAccount/userOp.js +124 -0
- package/dist/smartAccount/userOp.js.map +1 -0
- package/dist/subpaths/dividends.d.ts +28 -0
- package/dist/subpaths/dividends.d.ts.map +1 -0
- package/dist/subpaths/dividends.js +29 -0
- package/dist/subpaths/dividends.js.map +1 -0
- package/dist/subpaths/history.d.ts +22 -0
- package/dist/subpaths/history.d.ts.map +1 -0
- package/dist/subpaths/history.js +23 -0
- package/dist/subpaths/history.js.map +1 -0
- package/dist/subpaths/permit.d.ts +14 -0
- package/dist/subpaths/permit.d.ts.map +1 -0
- package/dist/subpaths/permit.js +14 -0
- package/dist/subpaths/permit.js.map +1 -0
- package/dist/subpaths/price.js +2 -2
- package/dist/subpaths/price.js.map +1 -1
- package/dist/subpaths/rewards.d.ts +27 -0
- package/dist/subpaths/rewards.d.ts.map +1 -0
- package/dist/subpaths/rewards.js +25 -0
- package/dist/subpaths/rewards.js.map +1 -0
- package/dist/subpaths/simulate.d.ts +25 -0
- package/dist/subpaths/simulate.d.ts.map +1 -0
- package/dist/subpaths/simulate.js +28 -0
- package/dist/subpaths/simulate.js.map +1 -0
- package/dist/subpaths/smart-account.d.ts +24 -0
- package/dist/subpaths/smart-account.d.ts.map +1 -0
- package/dist/subpaths/smart-account.js +24 -0
- package/dist/subpaths/smart-account.js.map +1 -0
- package/dist/swap.d.ts +45 -5
- package/dist/swap.d.ts.map +1 -1
- package/dist/swap.js +108 -12
- package/dist/swap.js.map +1 -1
- package/dist/write/batch.d.ts +34 -2
- package/dist/write/batch.d.ts.map +1 -1
- package/dist/write/batch.js +22 -3
- package/dist/write/batch.js.map +1 -1
- package/dist/write/collect.d.ts +9 -0
- package/dist/write/collect.d.ts.map +1 -1
- package/dist/write/collect.js +41 -1
- package/dist/write/collect.js.map +1 -1
- package/dist/write/send.d.ts +4 -0
- package/dist/write/send.d.ts.map +1 -1
- package/dist/write/send.js.map +1 -1
- package/dist/write/signer.d.ts +5 -1
- package/dist/write/signer.d.ts.map +1 -1
- package/dist/write/signer.js.map +1 -1
- package/dist/write/transfer.d.ts +5 -3
- package/dist/write/transfer.d.ts.map +1 -1
- package/dist/write/transfer.js +12 -6
- package/dist/write/transfer.js.map +1 -1
- package/package.json +35 -1
- package/src/dividends.ts +360 -0
- package/src/history.ts +367 -0
- package/src/historySources.ts +360 -0
- package/src/liquidity/v3.ts +1 -1
- package/src/liquidity/v4.ts +4 -3
- package/src/lp.ts +18 -1
- package/src/lpV4.ts +32 -2
- package/src/permit.ts +457 -0
- package/src/portfolio.ts +11 -4
- package/src/rewards/farms.ts +229 -0
- package/src/rewards/index.ts +431 -0
- package/src/rewards/types.ts +179 -0
- package/src/simulate.ts +727 -0
- package/src/simulateDecode.ts +352 -0
- package/src/smartAccount/account.ts +63 -0
- package/src/smartAccount/clients.ts +180 -0
- package/src/smartAccount/eip5792.ts +187 -0
- package/src/smartAccount/send.ts +341 -0
- package/src/smartAccount/userOp.ts +180 -0
- package/src/subpaths/dividends.ts +47 -0
- package/src/subpaths/history.ts +41 -0
- package/src/subpaths/permit.ts +39 -0
- package/src/subpaths/price.ts +2 -2
- package/src/subpaths/rewards.ts +46 -0
- package/src/subpaths/simulate.ts +51 -0
- package/src/subpaths/smart-account.ts +40 -0
- package/src/swap.ts +139 -18
- package/src/write/batch.ts +44 -5
- package/src/write/collect.ts +60 -1
- package/src/write/send.ts +4 -0
- package/src/write/signer.ts +5 -1
- package/src/write/transfer.ts +17 -10
package/dist/simulate.js
ADDED
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 交易模拟(子路径 `@w3lib/evm-batch-call/simulate`):发送前先看会发生什么——成不成功、花多少 gas、哪些资产进出、给了什么授权、风险提示。
|
|
3
|
+
*
|
|
4
|
+
* - EVM:`eth_simulateV1`(公共节点 publicnode / drpc / mainnet.base.org / bsc-dataseed 等都支持):一次请求执行一串交易、状态逐笔延续,
|
|
5
|
+
* `traceTransfers` 把主币转账也变成日志;资产变化和授权变化都从日志里算(ERC20 / 721 / 1155 Transfer、WETH Deposit / Withdrawal、Approval、
|
|
6
|
+
* ApprovalForAll、Permit2 Approval)。不支持时退回 `eth_call` + `eth_estimateGas`:只能知道成不成功和 gas,资产变化只能按 calldata 估
|
|
7
|
+
* - Tron:`triggerconstantcontract`(能量、日志里的 TRC20 Transfer / Approval);TRX 的变化只有 call_value
|
|
8
|
+
*/
|
|
9
|
+
import { getBigInt, id, toBeHex } from 'ethers';
|
|
10
|
+
import { knownSpenders } from './approvals.js';
|
|
11
|
+
import { getNativeCurrency } from './chains.js';
|
|
12
|
+
import { NATIVE_TOKEN, UNLIMITED_ALLOWANCE_THRESHOLD, formatUnits } from './erc20.js';
|
|
13
|
+
import { isExecutionError } from './errors.js';
|
|
14
|
+
import { errorText } from './fallback.js';
|
|
15
|
+
import { decodeCalldata, decodeRevert } from './simulateDecode.js';
|
|
16
|
+
import { TronProvider, isTronChain, toEvmAddress, toTronAddress } from './tron.js';
|
|
17
|
+
export { decodeCalldata, decodeRevert } from './simulateDecode.js';
|
|
18
|
+
const NATIVE_LOG_ADDRESS = NATIVE_TOKEN.toLowerCase();
|
|
19
|
+
const ZERO = '0x0000000000000000000000000000000000000000';
|
|
20
|
+
const T = {
|
|
21
|
+
transfer: id('Transfer(address,address,uint256)'),
|
|
22
|
+
single: id('TransferSingle(address,address,address,uint256,uint256)'),
|
|
23
|
+
batch: id('TransferBatch(address,address,address,uint256[],uint256[])'),
|
|
24
|
+
deposit: id('Deposit(address,uint256)'),
|
|
25
|
+
withdrawal: id('Withdrawal(address,uint256)'),
|
|
26
|
+
approval: id('Approval(address,address,uint256)'),
|
|
27
|
+
approvalAll: id('ApprovalForAll(address,address,bool)'),
|
|
28
|
+
permit2Approval: id('Approval(address,address,address,uint160,uint48)'),
|
|
29
|
+
permit2Permit: id('Permit(address,address,address,uint160,uint48,uint48)'),
|
|
30
|
+
lockdown: id('Lockdown(address,address,address)'),
|
|
31
|
+
};
|
|
32
|
+
const PERMIT2 = '0x000000000022d473030f116ddee9f6b43ac78ba3';
|
|
33
|
+
const addr = (topic) => `0x${(topic ?? '').slice(-40)}`.toLowerCase();
|
|
34
|
+
const num = (hex) => (hex && hex !== '0x' ? BigInt(hex) : 0n);
|
|
35
|
+
const word = (data, i) => `0x${data.slice(2 + i * 64, 2 + (i + 1) * 64)}`;
|
|
36
|
+
function parseTransfers(logs) {
|
|
37
|
+
const moves = [];
|
|
38
|
+
const push = (asset, from, to, value, standard, tokenId) => moves.push({ asset, from, to, amount: value.toString(), standard, ...(tokenId === undefined ? {} : { tokenId }), fromL: from.toLowerCase(), toL: to.toLowerCase(), value });
|
|
39
|
+
const has = (log, from, to, value) => logs.some((l) => l.address.toLowerCase() === log.address && l.topics[0] === T.transfer && l.topics.length === 3 && addr(l.topics[1]) === from && addr(l.topics[2]) === to && num(l.data) === value);
|
|
40
|
+
for (const log of logs) {
|
|
41
|
+
const [topic0] = log.topics;
|
|
42
|
+
const address = log.address.toLowerCase();
|
|
43
|
+
if (topic0 === T.transfer && log.topics.length === 3) {
|
|
44
|
+
push(address === NATIVE_LOG_ADDRESS ? 'native' : address, addr(log.topics[1]), addr(log.topics[2]), num(log.data), address === NATIVE_LOG_ADDRESS ? 'native' : 'erc20');
|
|
45
|
+
}
|
|
46
|
+
else if (topic0 === T.transfer && log.topics.length === 4) {
|
|
47
|
+
push(address, addr(log.topics[1]), addr(log.topics[2]), 1n, 'erc721', BigInt(log.topics[3]).toString());
|
|
48
|
+
}
|
|
49
|
+
else if (topic0 === T.single && log.topics.length === 4) {
|
|
50
|
+
push(address, addr(log.topics[2]), addr(log.topics[3]), num(word(log.data, 1)), 'erc1155', num(word(log.data, 0)).toString());
|
|
51
|
+
}
|
|
52
|
+
else if (topic0 === T.batch && log.topics.length === 4) {
|
|
53
|
+
// data: ids 偏移、values 偏移、ids 长度 + 元素、values 长度 + 元素
|
|
54
|
+
const n = Number(num(word(log.data, 2)));
|
|
55
|
+
if (n > 0 && n < 1000)
|
|
56
|
+
for (let i = 0; i < n; i++)
|
|
57
|
+
push(address, addr(log.topics[2]), addr(log.topics[3]), num(word(log.data, 4 + n + i)), 'erc1155', num(word(log.data, 3 + i)).toString());
|
|
58
|
+
}
|
|
59
|
+
else if ((topic0 === T.deposit || topic0 === T.withdrawal) && log.topics.length === 2) {
|
|
60
|
+
// WETH9 的存入 / 取出只有 Deposit / Withdrawal 事件,没有 Transfer;同时发了 Transfer 的合约不重复算
|
|
61
|
+
const who = addr(log.topics[1]);
|
|
62
|
+
const value = num(log.data);
|
|
63
|
+
const [from, to] = topic0 === T.deposit ? [ZERO, who] : [who, ZERO];
|
|
64
|
+
if (!has({ ...log, address }, from, to, value))
|
|
65
|
+
push(address, from, to, value, 'erc20');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return moves;
|
|
69
|
+
}
|
|
70
|
+
function parseApprovals(logs) {
|
|
71
|
+
const out = [];
|
|
72
|
+
for (const log of logs) {
|
|
73
|
+
const [topic0] = log.topics;
|
|
74
|
+
const token = log.address.toLowerCase();
|
|
75
|
+
if (topic0 === T.approval && log.topics.length === 3) {
|
|
76
|
+
const amount = num(log.data);
|
|
77
|
+
out.push({ type: 'erc20', owner: addr(log.topics[1]), token, spender: addr(log.topics[2]), amount: amount.toString(), unlimited: amount >= UNLIMITED_ALLOWANCE_THRESHOLD, revoked: amount === 0n });
|
|
78
|
+
}
|
|
79
|
+
else if (topic0 === T.approval && log.topics.length === 4) {
|
|
80
|
+
const spender = addr(log.topics[2]);
|
|
81
|
+
out.push({ type: 'nft-token', owner: addr(log.topics[1]), token, spender, amount: BigInt(log.topics[3]).toString(), unlimited: false, revoked: spender === ZERO });
|
|
82
|
+
}
|
|
83
|
+
else if (topic0 === T.approvalAll && log.topics.length === 3) {
|
|
84
|
+
const on = num(log.data) !== 0n;
|
|
85
|
+
out.push({ type: 'nft', owner: addr(log.topics[1]), token, spender: addr(log.topics[2]), amount: on ? '1' : '0', unlimited: on, revoked: !on });
|
|
86
|
+
}
|
|
87
|
+
else if (token === PERMIT2 && (topic0 === T.permit2Approval || topic0 === T.permit2Permit) && log.topics.length === 4) {
|
|
88
|
+
const amount = num(word(log.data, 0));
|
|
89
|
+
out.push({
|
|
90
|
+
type: 'permit2',
|
|
91
|
+
owner: addr(log.topics[1]),
|
|
92
|
+
token: addr(log.topics[2]),
|
|
93
|
+
spender: addr(log.topics[3]),
|
|
94
|
+
amount: amount.toString(),
|
|
95
|
+
unlimited: amount >= UNLIMITED_ALLOWANCE_THRESHOLD,
|
|
96
|
+
revoked: amount === 0n,
|
|
97
|
+
expiration: Number(num(word(log.data, 1))),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
else if (token === PERMIT2 && topic0 === T.lockdown && log.topics.length === 2) {
|
|
101
|
+
// Lockdown(address indexed owner, address token, address spender):只有 owner 是 indexed,token / spender 在 data 里
|
|
102
|
+
out.push({ type: 'permit2', owner: addr(log.topics[1]), token: addr(word(log.data, 0)), spender: addr(word(log.data, 1)), amount: '0', unlimited: false, revoked: true });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
async function nodes() {
|
|
108
|
+
const { runOnNodes } = await import('./write/rpc.js');
|
|
109
|
+
return runOnNodes;
|
|
110
|
+
}
|
|
111
|
+
const hex = (value) => toBeHex(getBigInt(value));
|
|
112
|
+
function normalize(tx, from, tron) {
|
|
113
|
+
const f = tx.from ?? from;
|
|
114
|
+
if (!f)
|
|
115
|
+
throw new Error('simulate requires a sender: pass tx.from or options.from');
|
|
116
|
+
const conv = (a) => (tron ? toEvmAddress(a) : a);
|
|
117
|
+
return { from: conv(f), ...(tx.to ? { to: conv(tx.to) } : {}), data: tx.data && tx.data !== '0x' ? tx.data : '0x', value: tx.value === undefined ? 0n : getBigInt(tx.value), ...(tx.gas === undefined ? {} : { gas: getBigInt(tx.gas) }) };
|
|
118
|
+
}
|
|
119
|
+
const UNSUPPORTED_RE = /not (supported|available|whitelisted|allowed|found)|does not exist|unknown method|method not|-32601|disabled|discontinued|adjustable limit|invalid (params|argument)|unrecognized|too many|rate.?limit/i;
|
|
120
|
+
/** ethers 把节点的错误包成 “…; could not coalesce error”,去掉这段噪音 */
|
|
121
|
+
const cleanError = (err) => errorText(err).replace(/;\s*could not coalesce error.*$/s, '');
|
|
122
|
+
// 交易本身的问题(换节点结果一样):直接作为模拟失败的原因
|
|
123
|
+
const TX_ERROR_RE = /insufficient funds|intrinsic gas|max fee per gas|nonce too|execution reverted|invalid sender/i;
|
|
124
|
+
async function simulateV1(provider, txs, options) {
|
|
125
|
+
const run = await nodes();
|
|
126
|
+
const perCall = options.gas ?? BigInt(Math.min(10_000_000, Math.floor(25_000_000 / txs.length)));
|
|
127
|
+
const calls = txs.map((t) => ({ from: t.from, ...(t.to ? { to: t.to } : {}), data: t.data, value: hex(t.value), gas: hex(t.gas ?? perCall) }));
|
|
128
|
+
const block = { calls, ...(options.stateOverrides ? { stateOverrides: options.stateOverrides } : {}) };
|
|
129
|
+
const tag = options.blockTag === undefined ? 'latest' : typeof options.blockTag === 'number' ? hex(options.blockTag) : options.blockTag;
|
|
130
|
+
const result = (await run(provider.rpc, 'simulate', async (node) => {
|
|
131
|
+
if (typeof node.send !== 'function')
|
|
132
|
+
throw new Error('eth_simulateV1 is not supported by this node');
|
|
133
|
+
return node.send('eth_simulateV1', [{ blockStateCalls: [block], traceTransfers: true, validation: false }, tag]);
|
|
134
|
+
}, (err) => TX_ERROR_RE.test(errorText(err)) && !UNSUPPORTED_RE.test(errorText(err))));
|
|
135
|
+
const done = result?.[0]?.calls;
|
|
136
|
+
if (!Array.isArray(done) || done.length !== txs.length)
|
|
137
|
+
throw new Error('eth_simulateV1 returned an unexpected result');
|
|
138
|
+
return done.map((c) => {
|
|
139
|
+
const ok = c.status === '0x1';
|
|
140
|
+
const returnData = c.returnData && c.returnData !== '0x' ? c.returnData : (c.error?.data ?? '0x');
|
|
141
|
+
return {
|
|
142
|
+
success: ok,
|
|
143
|
+
gasUsed: num(c.gasUsed),
|
|
144
|
+
returnData,
|
|
145
|
+
...(ok ? {} : { error: decodeRevert(returnData) ?? c.error?.message ?? 'execution reverted' }),
|
|
146
|
+
logs: (c.logs ?? []).map((l) => ({ address: l.address, topics: l.topics, data: l.data })),
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/** 退回方式:每笔单独 eth_call + estimateGas(状态不延续) */
|
|
151
|
+
async function callEach(provider, txs, options) {
|
|
152
|
+
const run = await nodes();
|
|
153
|
+
const tag = options.blockTag === undefined ? 'latest' : typeof options.blockTag === 'number' ? hex(options.blockTag) : options.blockTag;
|
|
154
|
+
return Promise.all(txs.map(async (t) => {
|
|
155
|
+
const req = { from: t.from, ...(t.to ? { to: t.to } : {}), data: t.data, value: hex(t.value), ...(t.gas === undefined ? {} : { gas: hex(t.gas) }) };
|
|
156
|
+
const send = (method, params) => run(provider.rpc, method, async (node) => {
|
|
157
|
+
if (typeof node.send !== 'function')
|
|
158
|
+
throw new Error(`${method} is not supported by this node; pass an RPC URL or an ethers Provider`);
|
|
159
|
+
return node.send(method, params);
|
|
160
|
+
}, isExecutionError);
|
|
161
|
+
try {
|
|
162
|
+
const returnData = (await send('eth_call', options.stateOverrides ? [req, tag, options.stateOverrides] : [req, tag]));
|
|
163
|
+
const gas = await send('eth_estimateGas', options.stateOverrides ? [req, tag, options.stateOverrides] : [req, tag]).then((g) => BigInt(g), () => 0n);
|
|
164
|
+
return { success: true, gasUsed: gas, returnData, logs: [] };
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
const data = err?.data;
|
|
168
|
+
const returnData = typeof data === 'string' ? data : '0x';
|
|
169
|
+
const msg = cleanError(err);
|
|
170
|
+
return { success: false, gasUsed: 0n, returnData, error: decodeRevert(returnData) ?? (isExecutionError(err) ? msg.replace(/^.*?execution reverted:?\s*/i, '') || 'execution reverted' : msg), logs: [] };
|
|
171
|
+
}
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
174
|
+
async function simulateTronCalls(provider, txs) {
|
|
175
|
+
const run = await nodes();
|
|
176
|
+
const hexAddr = (a) => `41${toEvmAddress(a).slice(2).toLowerCase()}`;
|
|
177
|
+
const out = [];
|
|
178
|
+
for (const t of txs) {
|
|
179
|
+
const body = { owner_address: hexAddr(t.from), data: t.data.replace(/^0x/, '') };
|
|
180
|
+
if (t.to)
|
|
181
|
+
body.contract_address = hexAddr(t.to);
|
|
182
|
+
if (t.value)
|
|
183
|
+
body.call_value = Number(t.value);
|
|
184
|
+
const res = (await run(provider.rpc, 'simulate', async (node) => {
|
|
185
|
+
if (!(node instanceof TronProvider))
|
|
186
|
+
throw new Error('This node is not a Tron node');
|
|
187
|
+
return node.request('wallet/triggerconstantcontract', body);
|
|
188
|
+
}));
|
|
189
|
+
const result = res?.result ?? {};
|
|
190
|
+
const output = `0x${res?.constant_result?.[0] ?? ''}`;
|
|
191
|
+
const message = typeof result.message === 'string' ? safeUtf8(result.message) : '';
|
|
192
|
+
const failed = Boolean(result.code) || result.result === false || res?.transaction?.ret?.[0]?.ret === 'FAILED';
|
|
193
|
+
out.push({
|
|
194
|
+
success: !failed,
|
|
195
|
+
gasUsed: BigInt(res?.energy_used ?? 0),
|
|
196
|
+
returnData: output,
|
|
197
|
+
...(failed ? { error: decodeRevert(output) ?? (message || String(result.code ?? 'REVERT')) } : {}),
|
|
198
|
+
logs: (res?.logs ?? []).map((l) => ({ address: `0x${l.address}`, topics: (l.topics ?? []).map((x) => `0x${x}`), data: `0x${l.data ?? ''}` })),
|
|
199
|
+
});
|
|
200
|
+
// Tron 的模拟不延续状态:每笔都按当前链上状态算
|
|
201
|
+
}
|
|
202
|
+
return out;
|
|
203
|
+
}
|
|
204
|
+
function safeUtf8(hexText) {
|
|
205
|
+
try {
|
|
206
|
+
return new TextDecoder().decode(Uint8Array.from(hexText.match(/../g)?.map((b) => Number.parseInt(b, 16)) ?? []));
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return hexText;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const outAddr = (ctx, a) => (ctx.tron && a !== 'native' ? toTronAddress(a) : a);
|
|
213
|
+
async function loadMeta(ctx, assets) {
|
|
214
|
+
const want = [...new Set(assets)].filter((a) => !ctx.meta.has(a));
|
|
215
|
+
if (!want.length)
|
|
216
|
+
return;
|
|
217
|
+
const native = getNativeCurrency(ctx.chainId);
|
|
218
|
+
const tokens = want.filter((a) => a !== 'native');
|
|
219
|
+
if (want.includes('native'))
|
|
220
|
+
ctx.meta.set('native', { symbol: native?.symbol ?? null, decimals: native?.decimals ?? 18 });
|
|
221
|
+
if (!tokens.length)
|
|
222
|
+
return;
|
|
223
|
+
const details = await ctx.provider.tokens(tokens.map((a) => outAddr(ctx, a)), { fields: ['symbol', 'decimals'] }).catch(() => []);
|
|
224
|
+
tokens.forEach((a, i) => {
|
|
225
|
+
const d = details[i];
|
|
226
|
+
ctx.meta.set(a, { symbol: d?.symbol ?? null, decimals: typeof d?.decimals === 'number' ? d.decimals : 0 });
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
function changesOf(ctx, moves) {
|
|
230
|
+
const net = new Map();
|
|
231
|
+
for (const m of moves) {
|
|
232
|
+
for (const [who, sign] of [[m.fromL, -1n], [m.toL, 1n]]) {
|
|
233
|
+
if (!ctx.subjects.has(who) || who === ZERO)
|
|
234
|
+
continue;
|
|
235
|
+
const key = `${who}|${m.asset}|${m.tokenId ?? ''}`;
|
|
236
|
+
const meta = ctx.meta.get(m.asset);
|
|
237
|
+
const entry = net.get(key) ?? {
|
|
238
|
+
address: outAddr(ctx, who),
|
|
239
|
+
asset: outAddr(ctx, m.asset),
|
|
240
|
+
symbol: meta?.symbol ?? null,
|
|
241
|
+
decimals: m.standard === 'erc721' || m.standard === 'erc1155' ? 0 : (meta?.decimals ?? 18),
|
|
242
|
+
delta: '0',
|
|
243
|
+
formatted: '0',
|
|
244
|
+
standard: m.standard,
|
|
245
|
+
...(m.tokenId === undefined ? {} : { tokenId: m.tokenId }),
|
|
246
|
+
raw: 0n,
|
|
247
|
+
};
|
|
248
|
+
entry.raw += sign * m.value;
|
|
249
|
+
net.set(key, entry);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return [...net.values()]
|
|
253
|
+
.filter((e) => e.raw !== 0n)
|
|
254
|
+
.map(({ raw, ...e }) => ({ ...e, delta: raw.toString(), formatted: formatUnits(raw, e.decimals) }));
|
|
255
|
+
}
|
|
256
|
+
const label = (c) => `${c.formatted} ${c.symbol ?? (c.tokenId === undefined ? c.asset.slice(0, 8) : `NFT #${c.tokenId}`)}`;
|
|
257
|
+
function summarize(decoded, changes, from, approvals) {
|
|
258
|
+
const mine = changes.filter((c) => c.address.toLowerCase() === from.toLowerCase());
|
|
259
|
+
const outs = mine.filter((c) => c.delta.startsWith('-')).map((c) => label({ ...c, formatted: c.formatted.slice(1) }));
|
|
260
|
+
const ins = mine.filter((c) => !c.delta.startsWith('-')).map(label);
|
|
261
|
+
if (decoded.type === 'swap' && outs.length && ins.length)
|
|
262
|
+
return `Swap ${outs.join(' + ')} for ${ins.join(' + ')}${decoded.protocol ? ` on ${decoded.protocol}` : ''}`;
|
|
263
|
+
if (decoded.type === 'transfer' && outs.length && !ins.length)
|
|
264
|
+
return `Send ${outs.join(' + ')}`;
|
|
265
|
+
if (decoded.type === 'approve' && approvals.length) {
|
|
266
|
+
const a = approvals[0];
|
|
267
|
+
const what = a.revoked ? 'Revoke' : 'Approve';
|
|
268
|
+
return `${what} ${a.symbol ?? a.token.slice(0, 8)}${a.unlimited ? ' (unlimited)' : ''} ${a.revoked ? 'from' : 'to'} ${a.spenderName ?? a.spender}`;
|
|
269
|
+
}
|
|
270
|
+
if (outs.length || ins.length)
|
|
271
|
+
return `${decoded.summary}: ${[...outs.map((o) => `-${o}`), ...ins.map((i) => `+${i}`)].join(', ')}`;
|
|
272
|
+
return decoded.summary;
|
|
273
|
+
}
|
|
274
|
+
async function codeOf(ctx, address, cache) {
|
|
275
|
+
const key = address.toLowerCase();
|
|
276
|
+
let hit = cache.get(key);
|
|
277
|
+
if (!hit) {
|
|
278
|
+
const run = nodes();
|
|
279
|
+
hit = run
|
|
280
|
+
.then((r) => r(ctx.provider.rpc, 'getCode', async (node) => {
|
|
281
|
+
if (ctx.tron) {
|
|
282
|
+
if (!(node instanceof TronProvider))
|
|
283
|
+
throw new Error('not a Tron node');
|
|
284
|
+
const c = await node.request('wallet/getcontract', { value: `41${key.slice(2)}` });
|
|
285
|
+
return Boolean(c && (c.bytecode || c.contract_address));
|
|
286
|
+
}
|
|
287
|
+
return (await node.getCode(address)) !== '0x';
|
|
288
|
+
}))
|
|
289
|
+
.catch(() => null);
|
|
290
|
+
cache.set(key, hit);
|
|
291
|
+
}
|
|
292
|
+
return hit;
|
|
293
|
+
}
|
|
294
|
+
async function buildResult(ctx, tx, raw, mode, codes, fallbackMoves = []) {
|
|
295
|
+
const moves = [...parseTransfers(raw.logs), ...fallbackMoves];
|
|
296
|
+
const approvals = parseApprovals(raw.logs).filter((a) => ctx.subjects.has(a.owner));
|
|
297
|
+
// 失败的交易没有效果
|
|
298
|
+
const effective = raw.success ? moves : [];
|
|
299
|
+
const decoded = decodeCalldata(tx.data, { to: tx.to, chainId: ctx.chainId, value: tx.value });
|
|
300
|
+
await loadMeta(ctx, [...effective.filter((m) => ctx.subjects.has(m.fromL) || ctx.subjects.has(m.toL)).map((m) => m.asset), ...(raw.success ? approvals.map((a) => a.token) : [])]);
|
|
301
|
+
const balanceChanges = changesOf(ctx, effective);
|
|
302
|
+
const known = knownSpenders(ctx.chainId);
|
|
303
|
+
const approvalChanges = (raw.success ? approvals : []).map((a) => ({
|
|
304
|
+
...a,
|
|
305
|
+
owner: outAddr(ctx, a.owner),
|
|
306
|
+
token: outAddr(ctx, a.token),
|
|
307
|
+
spender: outAddr(ctx, a.spender),
|
|
308
|
+
symbol: ctx.meta.get(a.token)?.symbol ?? null,
|
|
309
|
+
...(known.find((s) => toEvmAddress(s.address).toLowerCase() === a.spender)?.name ? { spenderName: known.find((s) => toEvmAddress(s.address).toLowerCase() === a.spender)?.name } : {}),
|
|
310
|
+
}));
|
|
311
|
+
const warnings = [];
|
|
312
|
+
if (!raw.success)
|
|
313
|
+
warnings.push({ severity: 'danger', code: 'reverted', message: raw.error ?? 'execution reverted' });
|
|
314
|
+
if (mode === 'eth_call')
|
|
315
|
+
warnings.push({ severity: 'info', code: 'no-logs', message: 'The node does not support eth_simulateV1: balance changes are estimated from calldata only' });
|
|
316
|
+
if (decoded.type === 'unknown' && tx.data !== '0x')
|
|
317
|
+
warnings.push({ severity: 'info', code: 'unknown-method', message: decoded.summary });
|
|
318
|
+
for (const a of approvalChanges) {
|
|
319
|
+
if (a.revoked)
|
|
320
|
+
continue;
|
|
321
|
+
const common = { address: a.spender };
|
|
322
|
+
if (a.unlimited)
|
|
323
|
+
warnings.push({ severity: 'warn', code: a.type === 'nft' ? 'unlimited-nft-approval' : 'unlimited-approval', message: a.type === 'nft' ? `Approves ${a.spenderName ?? a.spender} to move all of your NFTs in ${a.symbol ?? a.token}` : `Unlimited ${a.symbol ?? a.token} approval to ${a.spenderName ?? a.spender}`, ...common });
|
|
324
|
+
if (!a.spenderName) {
|
|
325
|
+
const hasCode = await codeOf(ctx, a.spender, codes);
|
|
326
|
+
if (hasCode === false)
|
|
327
|
+
warnings.push({ severity: 'danger', code: 'approve-to-eoa', message: `Approval to ${a.spender}, which has no contract code (an ordinary wallet)`, ...common });
|
|
328
|
+
else
|
|
329
|
+
warnings.push({ severity: 'warn', code: 'unknown-spender', message: `${a.spender} is not a known router / spender on this chain`, ...common });
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (tx.to && tx.data !== '0x') {
|
|
333
|
+
if ((await codeOf(ctx, tx.to, codes)) === false)
|
|
334
|
+
warnings.push({ severity: 'danger', code: 'no-code', message: `${outAddr(ctx, tx.to)} has no contract code: the call does nothing${tx.value > 0n ? ' and the value is just sent to it' : ''}` });
|
|
335
|
+
}
|
|
336
|
+
const decodedOut = { type: decoded.type, ...(decoded.protocol ? { protocol: decoded.protocol } : {}), ...(decoded.method ? { method: decoded.method } : {}), summary: summarize(decoded, balanceChanges, outAddr(ctx, tx.from), approvalChanges), ...(decoded.args ? { args: decoded.args } : {}), ...(decoded.calls ? { calls: decoded.calls } : {}) };
|
|
337
|
+
return {
|
|
338
|
+
success: raw.success,
|
|
339
|
+
...(raw.error ? { error: raw.error } : {}),
|
|
340
|
+
...(!raw.success && raw.returnData !== '0x' ? { revertData: raw.returnData } : {}),
|
|
341
|
+
gasUsed: raw.gasUsed.toString(),
|
|
342
|
+
balanceChanges,
|
|
343
|
+
approvalChanges,
|
|
344
|
+
decoded: decodedOut,
|
|
345
|
+
warnings,
|
|
346
|
+
transfers: effective.map(({ fromL, toL, value, ...t }) => ({ ...t, asset: outAddr(ctx, t.asset), from: outAddr(ctx, fromL), to: outAddr(ctx, toL) })),
|
|
347
|
+
logs: raw.logs,
|
|
348
|
+
mode,
|
|
349
|
+
...(raw.success && raw.returnData !== '0x' ? { returnData: raw.returnData } : {}),
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
/** eth_call 模式:按 calldata 估一下主币和 ERC20 转出(没有日志,只是估计) */
|
|
353
|
+
function estimateMoves(tx, decoded) {
|
|
354
|
+
const moves = [];
|
|
355
|
+
const from = tx.from.toLowerCase();
|
|
356
|
+
const push = (asset, to, value, standard) => moves.push({ asset, from, to, amount: value.toString(), standard, fromL: from, toL: to.toLowerCase(), value });
|
|
357
|
+
if (tx.value > 0n && tx.to)
|
|
358
|
+
push('native', tx.to, tx.value, 'native');
|
|
359
|
+
if (decoded.method === 'transfer' && tx.to && decoded.args)
|
|
360
|
+
push(tx.to.toLowerCase(), String(decoded.args.to), BigInt(String(decoded.args.amount)), 'erc20');
|
|
361
|
+
return moves;
|
|
362
|
+
}
|
|
363
|
+
async function gasPrice(provider) {
|
|
364
|
+
try {
|
|
365
|
+
const run = await nodes();
|
|
366
|
+
return BigInt((await run(provider.rpc, 'gasPrice', async (node) => node.send('eth_gasPrice', []))));
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
return undefined;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
async function enrich(ctx, results, from, options) {
|
|
373
|
+
const all = results.flatMap((r) => r.balanceChanges);
|
|
374
|
+
if (options.usd && all.length) {
|
|
375
|
+
try {
|
|
376
|
+
const { tokenPrices } = await import('./price.js');
|
|
377
|
+
const assets = [...new Set(all.filter((c) => c.standard === 'native' || c.standard === 'erc20').map((c) => (c.standard === 'native' ? NATIVE_TOKEN : c.asset)))];
|
|
378
|
+
const prices = await tokenPrices(ctx.provider, assets, options.usd === true ? {} : { sources: options.usd });
|
|
379
|
+
for (const c of all) {
|
|
380
|
+
const p = prices.find((x) => x.token.toLowerCase() === (c.standard === 'native' ? NATIVE_TOKEN : c.asset).toLowerCase());
|
|
381
|
+
c.usd = c.standard === 'erc721' || c.standard === 'erc1155' ? null : p?.price == null ? null : Number(c.formatted) * p.price;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
for (const c of all)
|
|
386
|
+
c.usd = null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (options.risk && !ctx.tron) {
|
|
390
|
+
const incoming = [...new Set(all.filter((c) => c.standard === 'erc20' && !c.delta.startsWith('-') && c.address.toLowerCase() === from.toLowerCase()).map((c) => c.asset))];
|
|
391
|
+
if (incoming.length) {
|
|
392
|
+
try {
|
|
393
|
+
const { tokenRisks } = await import('./risk.js');
|
|
394
|
+
const risks = await tokenRisks(ctx.provider, incoming);
|
|
395
|
+
for (const r of risks) {
|
|
396
|
+
const bad = r.flags.filter((f) => f === 'honeypot' || f === 'cannot-buy' || f.startsWith('high-'));
|
|
397
|
+
if (bad.length)
|
|
398
|
+
results[0]?.warnings.push({ severity: 'danger', code: 'token-risk', address: r.token, message: `${r.token}: ${bad.join(', ')}` });
|
|
399
|
+
else if (r.flags.includes('has-tax'))
|
|
400
|
+
results[0]?.warnings.push({ severity: 'warn', code: 'token-risk', address: r.token, message: `${r.token}: has transfer tax (buy ${r.buyTax}, sell ${r.sellTax})` });
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
// 风险检查失败不影响模拟结果
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
async function large(ctx, from, results) {
|
|
410
|
+
const native = results.flatMap((r) => r.balanceChanges).filter((c) => c.standard === 'native' && c.address.toLowerCase() === from.toLowerCase() && c.delta.startsWith('-'));
|
|
411
|
+
if (!native.length)
|
|
412
|
+
return;
|
|
413
|
+
try {
|
|
414
|
+
const out = native.reduce((s, c) => s - BigInt(c.delta), 0n);
|
|
415
|
+
const [balance] = await ctx.provider.balances(from, [NATIVE_TOKEN], { decimals: false });
|
|
416
|
+
const have = BigInt(balance?.balance ?? '0');
|
|
417
|
+
if (have > 0n && out * 10n >= have * 9n)
|
|
418
|
+
results[0]?.warnings.push({ severity: 'warn', code: 'large-value', message: `Sends ${Math.round(Number((out * 1000n) / have) / 10)}% of the native balance` });
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
// 余额查不到就不提示
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
async function run(provider, txs, options) {
|
|
425
|
+
if (!txs.length)
|
|
426
|
+
throw new Error('No transactions to simulate');
|
|
427
|
+
if (txs.length > 50)
|
|
428
|
+
throw new RangeError('Too many transactions to simulate at once (max 50)');
|
|
429
|
+
const chainId = await provider.getChainId();
|
|
430
|
+
const tron = isTronChain(chainId);
|
|
431
|
+
const normalized = txs.map((t) => normalize(t, options.from, tron));
|
|
432
|
+
const from = normalized[0]?.from;
|
|
433
|
+
const subjects = new Set([from, ...(options.watch ?? []).map((a) => (tron ? toEvmAddress(a) : a)), ...normalized.map((t) => t.from)].map((a) => a.toLowerCase()));
|
|
434
|
+
const ctx = { provider, chainId, tron, subjects, meta: new Map() };
|
|
435
|
+
const codes = new Map();
|
|
436
|
+
let raws = null;
|
|
437
|
+
let mode = 'simulateV1';
|
|
438
|
+
if (tron) {
|
|
439
|
+
raws = await simulateTronCalls(provider, normalized);
|
|
440
|
+
mode = 'tron';
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
if (!options.forceCall) {
|
|
444
|
+
try {
|
|
445
|
+
raws = await simulateV1(provider, normalized, options);
|
|
446
|
+
}
|
|
447
|
+
catch (err) {
|
|
448
|
+
const text = cleanError(err);
|
|
449
|
+
// 交易本身有问题(余额不足等):换节点结果一样,直接作为失败结果;其他(不支持、节点故障)退回 eth_call
|
|
450
|
+
if (TX_ERROR_RE.test(text) && !UNSUPPORTED_RE.test(text))
|
|
451
|
+
raws = normalized.map(() => ({ success: false, gasUsed: 0n, returnData: '0x', error: text, logs: [] }));
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
if (!raws) {
|
|
455
|
+
raws = await callEach(provider, normalized, options);
|
|
456
|
+
mode = 'eth_call';
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
const results = [];
|
|
460
|
+
for (const [i, raw] of raws.entries()) {
|
|
461
|
+
const t = normalized[i];
|
|
462
|
+
// eth_call 没有日志:按 calldata 估;Tron 日志里没有 TRX 的变化,只有 call_value
|
|
463
|
+
const moves = mode === 'eth_call' ? estimateMoves(t, decodeCalldata(t.data, { to: t.to, chainId, value: t.value })) : mode === 'tron' ? estimateMoves({ ...t, data: '0x' }, { type: 'unknown', summary: '' }) : [];
|
|
464
|
+
const result = await buildResult(ctx, t, raw, mode, codes, moves);
|
|
465
|
+
if (mode === 'eth_call' && i > 0)
|
|
466
|
+
result.warnings.push({ severity: 'info', code: 'no-state', message: 'Without eth_simulateV1 each transaction is simulated against the current state, not after the previous ones' });
|
|
467
|
+
if (mode === 'tron' && i > 0)
|
|
468
|
+
result.warnings.push({ severity: 'info', code: 'no-state', message: 'Tron simulates each call against the current state, not after the previous ones' });
|
|
469
|
+
results.push(result);
|
|
470
|
+
}
|
|
471
|
+
await enrich(ctx, results, from, options);
|
|
472
|
+
await large(ctx, from, results);
|
|
473
|
+
if (options.fee !== false && !tron && results.some((r) => r.gasUsed !== '0')) {
|
|
474
|
+
const price = await gasPrice(provider);
|
|
475
|
+
if (price !== undefined)
|
|
476
|
+
for (const r of results)
|
|
477
|
+
r.fee = (price * BigInt(r.gasUsed)).toString();
|
|
478
|
+
}
|
|
479
|
+
return { results, ctx, from };
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* 模拟一笔交易(不签名、不发送)。可以直接传 `buildSwap` / `buildRevokes` / 流动性构建里的交易。
|
|
483
|
+
*
|
|
484
|
+
* ```ts
|
|
485
|
+
* const plan = await buildSwap(provider, user, { tokenIn, tokenOut, amountInFormatted: '1' })
|
|
486
|
+
* const sim = await simulate(provider, plan.transactions[1], { from: user }) // 兑换这一笔(授权在前,没发出去时用 simulateBatch)
|
|
487
|
+
* if (!sim.success) throw new Error(sim.error)
|
|
488
|
+
* sim.balanceChanges // [{ asset: 'native', delta: '-1000…', formatted: '-1', … }, { asset: USDC, formatted: '2300.5', … }]
|
|
489
|
+
* sim.warnings // [{ severity: 'warn', code: 'unknown-spender', … }]
|
|
490
|
+
* ```
|
|
491
|
+
*/
|
|
492
|
+
export async function simulate(provider, tx, options = {}) {
|
|
493
|
+
const { results } = await run(provider, [tx], options);
|
|
494
|
+
return results[0];
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* 按顺序模拟一串依赖前一笔的交易(如先 approve 再兑换:`plan.transactions`)。eth_simulateV1 在同一个区块里依次执行,状态延续;
|
|
498
|
+
* 不支持的节点退回单笔 eth_call,后面的交易看不到前面的结果(结果里有 `no-state` 提示;Tron 同理)。
|
|
499
|
+
*
|
|
500
|
+
* ```ts
|
|
501
|
+
* const sim = await simulateBatch(provider, plan.transactions, { from: user, usd: true })
|
|
502
|
+
* sim.success; sim.balanceChanges // 汇总:整个流程你付出 / 收到什么
|
|
503
|
+
* ```
|
|
504
|
+
*/
|
|
505
|
+
export async function simulateBatch(provider, txs, options = {}) {
|
|
506
|
+
const list = 'transactions' in txs ? txs.transactions : txs;
|
|
507
|
+
const { results, ctx } = await run(provider, [...list], options);
|
|
508
|
+
const failedIndex = results.findIndex((r) => !r.success);
|
|
509
|
+
const sum = new Map();
|
|
510
|
+
for (const r of results) {
|
|
511
|
+
for (const c of r.balanceChanges) {
|
|
512
|
+
const key = `${c.address}|${c.asset}|${c.tokenId ?? ''}`;
|
|
513
|
+
const entry = sum.get(key) ?? { ...c, usd: undefined, raw: 0n };
|
|
514
|
+
entry.raw += BigInt(c.delta);
|
|
515
|
+
if (c.usd != null)
|
|
516
|
+
entry.usd = (entry.usd ?? 0) + c.usd;
|
|
517
|
+
sum.set(key, entry);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
const latest = new Map();
|
|
521
|
+
for (const r of results)
|
|
522
|
+
for (const a of r.approvalChanges)
|
|
523
|
+
latest.set(`${a.type}|${a.owner}|${a.token}|${a.spender}`, a);
|
|
524
|
+
const seen = new Set();
|
|
525
|
+
const warnings = results.flatMap((r) => r.warnings).filter((w) => !seen.has(`${w.code}|${w.message}`) && seen.add(`${w.code}|${w.message}`));
|
|
526
|
+
const gas = results.reduce((s, r) => s + BigInt(r.gasUsed), 0n);
|
|
527
|
+
const fees = results.map((r) => r.fee);
|
|
528
|
+
return {
|
|
529
|
+
success: failedIndex < 0,
|
|
530
|
+
results,
|
|
531
|
+
...(failedIndex < 0 ? {} : { failedIndex }),
|
|
532
|
+
gasUsed: gas.toString(),
|
|
533
|
+
...(fees.every((f) => f !== undefined) ? { fee: fees.reduce((s, f) => s + BigInt(f), 0n).toString() } : {}),
|
|
534
|
+
balanceChanges: [...sum.values()].filter((e) => e.raw !== 0n).map(({ raw, ...e }) => ({ ...e, delta: raw.toString(), formatted: formatUnits(raw, e.decimals) })),
|
|
535
|
+
approvalChanges: [...latest.values()],
|
|
536
|
+
warnings,
|
|
537
|
+
mode: ctx.tron ? 'tron' : results[0].mode,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* 模拟通过才发送的一行守卫:`simulate` 失败或有 danger 级别的提示时抛错,否则返回模拟结果,由调用方继续发送。
|
|
542
|
+
*
|
|
543
|
+
* ```ts
|
|
544
|
+
* await assertSimulation(simulate(provider, tx, { from }))
|
|
545
|
+
* await batchCall(provider, key, [{ to: tx.to, data: tx.data, value: tx.value }])
|
|
546
|
+
* ```
|
|
547
|
+
*/
|
|
548
|
+
export async function assertSimulation(simulation, options = {}) {
|
|
549
|
+
const sim = await simulation;
|
|
550
|
+
if (!sim.success) {
|
|
551
|
+
const error = 'error' in sim ? sim.error : sim.results.find((r) => r.error)?.error;
|
|
552
|
+
throw new Error(`Simulation failed: ${error ?? 'execution reverted'}`);
|
|
553
|
+
}
|
|
554
|
+
const danger = sim.warnings.filter((w) => w.severity === 'danger');
|
|
555
|
+
if (danger.length && !options.allowDanger)
|
|
556
|
+
throw new Error(`Simulation warning: ${danger.map((w) => w.message).join('; ')}`);
|
|
557
|
+
return sim;
|
|
558
|
+
}
|
|
559
|
+
//# sourceMappingURL=simulate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulate.js","sourceRoot":"","sources":["../src/simulate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAqB,MAAM,QAAQ,CAAA;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,6BAA6B,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAoB,MAAM,qBAAqB,CAAA;AACpF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAElF,OAAO,EAAE,cAAc,EAAE,YAAY,EAAsC,MAAM,qBAAqB,CAAA;AAmJtG,MAAM,kBAAkB,GAAG,YAAY,CAAC,WAAW,EAAE,CAAA;AACrD,MAAM,IAAI,GAAG,4CAA4C,CAAA;AACzD,MAAM,CAAC,GAAG;IACR,QAAQ,EAAE,EAAE,CAAC,mCAAmC,CAAC;IACjD,MAAM,EAAE,EAAE,CAAC,yDAAyD,CAAC;IACrE,KAAK,EAAE,EAAE,CAAC,4DAA4D,CAAC;IACvE,OAAO,EAAE,EAAE,CAAC,0BAA0B,CAAC;IACvC,UAAU,EAAE,EAAE,CAAC,6BAA6B,CAAC;IAC7C,QAAQ,EAAE,EAAE,CAAC,mCAAmC,CAAC;IACjD,WAAW,EAAE,EAAE,CAAC,sCAAsC,CAAC;IACvD,eAAe,EAAE,EAAE,CAAC,kDAAkD,CAAC;IACvE,aAAa,EAAE,EAAE,CAAC,uDAAuD,CAAC;IAC1E,QAAQ,EAAE,EAAE,CAAC,mCAAmC,CAAC;CAClD,CAAA;AACD,MAAM,OAAO,GAAG,4CAA4C,CAAA;AAE5D,MAAM,IAAI,GAAG,CAAC,KAAyB,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAA;AACzF,MAAM,GAAG,GAAG,CAAC,GAAuB,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACjF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,CAAS,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAA;AAQzF,SAAS,cAAc,CAAC,IAAuB;IAC7C,MAAM,KAAK,GAAW,EAAE,CAAA;IACxB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAU,EAAE,KAAa,EAAE,QAA0B,EAAE,OAAgB,EAAE,EAAE,CACpH,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAC7K,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,IAAY,EAAE,EAAU,EAAE,KAAa,EAAE,EAAE,CACnE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAA;IACrM,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAA;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QACzC,IAAI,MAAM,KAAK,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,KAAK,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QACzK,CAAC;aAAM,IAAI,MAAM,KAAK,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QACnH,CAAC;aAAM,IAAI,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC/H,CAAC;aAAM,IAAI,MAAM,KAAK,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzD,oDAAoD;YACpD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI;gBAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC9L,CAAC;aAAM,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,IAAI,MAAM,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxF,6EAA6E;YAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC3B,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACnE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC;gBAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;QACzF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAID,SAAS,cAAc,CAAC,IAAuB;IAC7C,MAAM,GAAG,GAAc,EAAE,CAAA;IACzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAA;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QACvC,IAAI,MAAM,KAAK,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC5B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,IAAI,6BAA6B,EAAE,OAAO,EAAE,MAAM,KAAK,EAAE,EAAE,CAAC,CAAA;QACrM,CAAC;aAAM,IAAI,MAAM,KAAK,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YACnC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC,CAAA;QAC9K,CAAC;aAAM,IAAI,MAAM,KAAK,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/D,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;YAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACjJ,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,eAAe,IAAI,MAAM,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxH,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACrC,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC1B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACzB,SAAS,EAAE,MAAM,IAAI,6BAA6B;gBAClD,OAAO,EAAE,MAAM,KAAK,EAAE;gBACtB,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;aAC3C,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,IAAI,MAAM,KAAK,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjF,8GAA8G;YAC9G,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3K,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAQD,KAAK,UAAU,KAAK;IAClB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACrD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,KAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;AAU9D,SAAS,SAAS,CAAC,EAAc,EAAE,IAAwB,EAAE,IAAa;IACxE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,CAAA;IACzB,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IACnF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAA;AAC5O,CAAC;AAED,MAAM,cAAc,GAAG,yMAAyM,CAAA;AAChO,2DAA2D;AAC3D,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAA;AAEnG,+BAA+B;AAC/B,MAAM,WAAW,GAAG,+FAA+F,CAAA;AAEnH,KAAK,UAAU,UAAU,CAAC,QAAkB,EAAE,GAAmB,EAAE,OAAwB;IACzF,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,CAAA;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAChG,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9I,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACtG,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAA;IACvI,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CACvB,QAAQ,CAAC,GAAG,EACZ,UAAU,EACV,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,OAAQ,IAAwB,CAAC,IAAI,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QACzH,OAAQ,IAA0B,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,KAAK,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;IACzI,CAAC,EACD,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAClF,CAAuJ,CAAA;IACxJ,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAA;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACvH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,KAAK,KAAK,CAAA;QAC7B,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,CAAA;QACjG,OAAO;YACL,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YACvB,UAAU;YACV,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,oBAAoB,EAAE,CAAC;YAC9F,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SAC1F,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,8CAA8C;AAC9C,KAAK,UAAU,QAAQ,CAAC,QAAkB,EAAE,GAAmB,EAAE,OAAwB;IACvF,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,CAAA;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAA;IACvI,OAAO,OAAO,CAAC,GAAG,CAChB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAoB,EAAE;QACpC,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAA;QACnJ,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,MAAiB,EAAE,EAAE,CACjD,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACvC,IAAI,OAAQ,IAAwB,CAAC,IAAI,KAAK,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,uEAAuE,CAAC,CAAA;YAC3J,OAAQ,IAA0B,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACzD,CAAC,EAAE,gBAAgB,CAAC,CAAA;QACtB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAW,CAAA;YAC/H,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAW,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;YAC9J,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAI,GAAiC,EAAE,IAAI,CAAA;YACrD,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;YACzD,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;YAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,8BAA8B,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;QAC1M,CAAC;IACH,CAAC,CAAC,CACH,CAAA;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAkB,EAAE,GAAmB;IACtE,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,CAAA;IACzB,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAA;IAC5E,MAAM,GAAG,GAAc,EAAE,CAAA;IACzB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAA4B,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAA;QACzG,IAAI,CAAC,CAAC,EAAE;YAAE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,CAAC,KAAK;YAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QAC9C,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9D,IAAI,CAAC,CAAC,IAAI,YAAY,YAAY,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;YACpF,OAAO,IAAI,CAAC,OAAO,CAAC,gCAAgC,EAAE,IAAI,CAAC,CAAA;QAC7D,CAAC,CAAC,CAA2P,CAAA;QAC7P,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,IAAI,EAAE,CAAA;QAChC,MAAM,MAAM,GAAG,KAAK,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAA;QACrD,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAClF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAA;QAC9G,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,CAAC,MAAM;YAChB,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,WAAW,IAAI,CAAC,CAAC;YACtC,UAAU,EAAE,MAAM;YAClB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClG,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;SAC9I,CAAC,CAAA;QACF,4BAA4B;IAC9B,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,IAAI,CAAC;QACH,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAClH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAA;IAChB,CAAC;AACH,CAAC;AAcD,MAAM,OAAO,GAAG,CAAC,GAAQ,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE5F,KAAK,UAAU,QAAQ,CAAC,GAAQ,EAAE,MAAyB;IACzD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACjE,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAM;IACxB,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAA;IACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAA;IACzH,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAM;IAC1B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IACjI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACpB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC5G,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAQ,EAAE,KAAsB;IACjD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2C,CAAA;IAC9D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAU,EAAE,CAAC;YACjE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI;gBAAE,SAAQ;YACpD,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAA;YAClD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YAClC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;gBAC5B,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;gBAC1B,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC;gBAC5B,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI;gBAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;gBAC1F,KAAK,EAAE,GAAG;gBACV,SAAS,EAAE,GAAG;gBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1D,GAAG,EAAE,EAAE;aACR,CAAA;YACD,KAAK,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK,CAAA;YAC3B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;SAC3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;AACvG,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,CAAgB,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAA;AAEzI,SAAS,SAAS,CAAC,OAAoB,EAAE,OAAiC,EAAE,IAAY,EAAE,SAAoC;IAC5H,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IAClF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrH,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACnE,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACtK,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAChG,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAmB,CAAA;QACxC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QAC7C,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;IACpJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;IACnI,OAAO,OAAO,CAAC,OAAO,CAAA;AACxB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,GAAQ,EAAE,OAAe,EAAE,KAA2C;IAC1F,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IACjC,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACxB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,GAAG,GAAG,KAAK,EAAE,CAAA;QACnB,GAAG,GAAG,GAAG;aACN,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACV,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5C,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,IAAI,CAAC,CAAC,IAAI,YAAY,YAAY,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;gBACvE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;gBAClF,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAA;YACzD,CAAC;YACD,OAAO,CAAC,MAAO,IAA2D,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAA;QACvG,CAAC,CAAC,CACH;aACA,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACpB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACrB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAQ,EAAE,EAAgB,EAAE,GAAY,EAAE,IAA8B,EAAE,KAA2C,EAAE,gBAAwB,EAAE;IAC1K,MAAM,KAAK,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,aAAa,CAAC,CAAA;IAC7D,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;IACnF,YAAY;IACZ,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;IAC7F,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAClL,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IAChD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACxC,MAAM,eAAe,GAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,GAAG,CAAC;QACJ,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC;QAC5B,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC;QAC5B,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC;QAChC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,IAAI;QAC7C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvL,CAAC,CAAC,CAAA;IAEH,MAAM,QAAQ,GAAwB,EAAE,CAAA;IACxC,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,oBAAoB,EAAE,CAAC,CAAA;IACrH,IAAI,IAAI,KAAK,UAAU;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,4FAA4F,EAAE,CAAC,CAAA;IACpL,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACzI,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,OAAO;YAAE,SAAQ;QACvB,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;QACrC,IAAI,CAAC,CAAC,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,gCAAgC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;QACjV,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YACnD,IAAI,OAAO,KAAK,KAAK;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,OAAO,mDAAmD,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;;gBAChL,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,gDAAgD,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;QACrJ,CAAC;IACH,CAAC;IACD,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,+CAA+C,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACnP,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACvV,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;QAC/B,cAAc;QACd,eAAe;QACf,OAAO,EAAE,UAAU;QACnB,QAAQ;QACR,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACrJ,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI;QACJ,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClF,CAAA;AACH,CAAC;AAED,wDAAwD;AACxD,SAAS,aAAa,CAAC,EAAgB,EAAE,OAAoB;IAC3D,MAAM,KAAK,GAAW,EAAE,CAAA;IACxB,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAU,EAAE,KAAa,EAAE,QAA0B,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACrM,IAAI,EAAE,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACrE,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI;QAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IAC5J,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAkB;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,CAAA;QACzB,OAAO,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAE,IAA0B,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAW,CAAC,CAAA;IACtI,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,GAAQ,EAAE,OAA2B,EAAE,IAAY,EAAE,OAAwB;IACjG,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;IACpD,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;YAClD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAChK,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YAC5G,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;gBACxH,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;YAC9H,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,MAAM,CAAC,IAAI,GAAG;gBAAE,CAAC,CAAC,GAAG,GAAG,IAAI,CAAA;QACnC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC1K,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAA;gBAChD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;gBACtD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;oBAClG,IAAI,GAAG,CAAC,MAAM;wBAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;yBAC5I,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;wBAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;gBAC3M,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,GAAQ,EAAE,IAAY,EAAE,OAA2B;IACtE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3K,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAM;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;QAC5D,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;QACxF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,GAAG,CAAC,CAAA;QAC5C,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,yBAAyB,EAAE,CAAC,CAAA;IACzM,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,QAAkB,EAAE,GAAiB,EAAE,OAAwB;IAChF,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAC/D,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAA;IAC/F,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;IAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACjC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACnE,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,IAAc,CAAA;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IACjK,MAAM,GAAG,GAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAA;IACvE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmC,CAAA;IAExD,IAAI,IAAI,GAAqB,IAAI,CAAA;IACjC,IAAI,IAAI,GAA6B,YAAY,CAAA;IACjD,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;QACpD,IAAI,GAAG,MAAM,CAAA;IACf,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;gBAC5B,0DAA0D;gBAC1D,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YACnK,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;YACpD,IAAI,GAAG,UAAU,CAAA;QACnB,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAiB,CAAA;QACvC,8DAA8D;QAC9D,MAAM,KAAK,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAClN,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QACjE,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,6GAA6G,EAAE,CAAC,CAAA;QACtN,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iFAAiF,EAAE,CAAC,CAAA;QACtL,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtB,CAAC;IACD,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACzC,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAC/B,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACtC,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AAC/B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAkB,EAAE,EAAc,EAAE,UAA2B,EAAE;IAC9F,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;IACtD,OAAO,OAAO,CAAC,CAAC,CAAqB,CAAA;AACvC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAkB,EAAE,GAAoE,EAAE,UAA2B,EAAE;IACzJ,MAAM,IAAI,GAAG,cAAc,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAA;IAC3D,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2C,CAAA;IAC9D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAA;YACxD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;YAC/D,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YAC5B,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI;gBAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAA;YACvD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAA;IAChD,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;IACzH,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC5I,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACtC,OAAO;QACL,OAAO,EAAE,WAAW,GAAG,CAAC;QACxB,OAAO;QACP,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC3C,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE;QACvB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAW,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrH,cAAc,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChK,eAAe,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,QAAQ;QACR,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,OAAO,CAAC,CAAC,CAAsB,CAAC,IAAI;KAChE,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAA0B,EAC1B,UAAqC,EAAE;IAEvC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAA;IAC5B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAA8C,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;QAC9H,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,IAAI,oBAAoB,EAAE,CAAC,CAAA;IACxE,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;IAClE,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5H,OAAO,GAAG,CAAA;AACZ,CAAC"}
|