@airdao/swap-router-contracts
Version:
Smart contracts for swapping on Astra Classic and CL
1,068 lines • 123 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "SwapRouter02",
"sourceName": "contracts/SwapRouter02.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_factoryClassic",
"type": "address"
},
{
"internalType": "address",
"name": "factoryCL",
"type": "address"
},
{
"internalType": "address",
"name": "_positionManager",
"type": "address"
},
{
"internalType": "address",
"name": "_SAMB",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "SAMB",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "approveMax",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "approveMaxMinusOne",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "approveZeroThenMax",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "approveZeroThenMaxMinusOne",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "int256",
"name": "amount0Delta",
"type": "int256"
},
{
"internalType": "int256",
"name": "amount1Delta",
"type": "int256"
},
{
"internalType": "bytes",
"name": "_data",
"type": "bytes"
}
],
"name": "astraCLSwapCallback",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "callPositionManager",
"outputs": [
{
"internalType": "bytes",
"name": "result",
"type": "bytes"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "paths",
"type": "bytes[]"
},
{
"internalType": "uint128[]",
"name": "amounts",
"type": "uint128[]"
},
{
"internalType": "uint24",
"name": "maximumTickDivergence",
"type": "uint24"
},
{
"internalType": "uint32",
"name": "secondsAgo",
"type": "uint32"
}
],
"name": "checkOracleSlippage",
"outputs": [],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "path",
"type": "bytes"
},
{
"internalType": "uint24",
"name": "maximumTickDivergence",
"type": "uint24"
},
{
"internalType": "uint32",
"name": "secondsAgo",
"type": "uint32"
}
],
"name": "checkOracleSlippage",
"outputs": [],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "bytes",
"name": "path",
"type": "bytes"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMinimum",
"type": "uint256"
}
],
"internalType": "struct ICLSwapRouter.ExactInputParams",
"name": "params",
"type": "tuple"
}
],
"name": "exactInput",
"outputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "tokenIn",
"type": "address"
},
{
"internalType": "address",
"name": "tokenOut",
"type": "address"
},
{
"internalType": "uint24",
"name": "fee",
"type": "uint24"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMinimum",
"type": "uint256"
},
{
"internalType": "uint160",
"name": "sqrtPriceLimitX96",
"type": "uint160"
}
],
"internalType": "struct ICLSwapRouter.ExactInputSingleParams",
"name": "params",
"type": "tuple"
}
],
"name": "exactInputSingle",
"outputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "bytes",
"name": "path",
"type": "bytes"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountInMaximum",
"type": "uint256"
}
],
"internalType": "struct ICLSwapRouter.ExactOutputParams",
"name": "params",
"type": "tuple"
}
],
"name": "exactOutput",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "tokenIn",
"type": "address"
},
{
"internalType": "address",
"name": "tokenOut",
"type": "address"
},
{
"internalType": "uint24",
"name": "fee",
"type": "uint24"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountInMaximum",
"type": "uint256"
},
{
"internalType": "uint160",
"name": "sqrtPriceLimitX96",
"type": "uint160"
}
],
"internalType": "struct ICLSwapRouter.ExactOutputSingleParams",
"name": "params",
"type": "tuple"
}
],
"name": "exactOutputSingle",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "factory",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "factoryClassic",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "getApprovalType",
"outputs": [
{
"internalType": "enum IApproveAndCall.ApprovalType",
"name": "",
"type": "uint8"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount0Min",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount1Min",
"type": "uint256"
}
],
"internalType": "struct IApproveAndCall.IncreaseLiquidityParams",
"name": "params",
"type": "tuple"
}
],
"name": "increaseLiquidity",
"outputs": [
{
"internalType": "bytes",
"name": "result",
"type": "bytes"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint24",
"name": "fee",
"type": "uint24"
},
{
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
},
{
"internalType": "uint256",
"name": "amount0Min",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount1Min",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
}
],
"internalType": "struct IApproveAndCall.MintParams",
"name": "params",
"type": "tuple"
}
],
"name": "mint",
"outputs": [
{
"internalType": "bytes",
"name": "result",
"type": "bytes"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "previousBlockhash",
"type": "bytes32"
},
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "",
"type": "bytes[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "",
"type": "bytes[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "results",
"type": "bytes[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "positionManager",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "pull",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "refundAMB",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "selfPermit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expiry",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "selfPermitAllowed",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expiry",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "selfPermitAllowedIfNecessary",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "selfPermitIfNecessary",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMin",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "swapExactTokensForTokens",
"outputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountInMax",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "swapTokensForExactTokens",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
}
],
"name": "sweepToken",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
}
],
"name": "sweepToken",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "feeBips",
"type": "uint256"
},
{
"internalType": "address",
"name": "feeRecipient",
"type": "address"
}
],
"name": "sweepTokenWithFee",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "feeBips",
"type": "uint256"
},
{
"internalType": "address",
"name": "feeRecipient",
"type": "address"
}
],
"name": "sweepTokenWithFee",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
}
],
"name": "unwrapSAMB",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
}
],
"name": "unwrapSAMB",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "feeBips",
"type": "uint256"
},
{
"internalType": "address",
"name": "feeRecipient",
"type": "address"
}
],
"name": "unwrapSAMBWithFee",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "feeBips",
"type": "uint256"
},
{
"internalType": "address",
"name": "feeRecipient",
"type": "address"
}
],
"name": "unwrapSAMBWithFee",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "wrapAMB",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x6101006040526000196000553480156200001857600080fd5b506040516200612f3803806200612f8339810160408190526200003b9162000087565b6001600160601b0319606094851b811660805291841b821660a05291831b811660c052911b1660e052620000e3565b80516001600160a01b03811681146200008257600080fd5b919050565b600080600080608085870312156200009d578384fd5b620000a8856200006a565b9350620000b8602086016200006a565b9250620000c8604086016200006a565b9150620000d8606086016200006a565b905092959194509250565b60805160601c60a05160601c60c05160601c60e05160601c615fab62000184600039806102c1528061154d528061158d52806116b75280611860528061198a528061236852806129b95280612a195280612a9a5250806109615280611f085280613cd55250806115295280611bca5280611f5e52806131d6525080610d1c5280610df0528061109052806113595280612ef252806130b55250615fab6000f3fe6080604052600436106102a45760003560e01c8063ab3fdd501161016e578063dee00f35116100cb578063efdeed8e1161007f578063f25801a711610064578063f25801a71461066e578063f2d5d56b1461068e578063f3995c67146106a15761034f565b8063efdeed8e1461063b578063f100b2051461065b5761034f565b8063e0e189a0116100b0578063e0e189a014610602578063e4a4054514610615578063e90a182f146106285761034f565b8063dee00f35146105c2578063df2ab5bb146105ef5761034f565b8063bc122a5411610122578063c45a015511610107578063c45a015514610592578063c53af304146105a7578063cab372ce146105af5761034f565b8063bc122a541461056c578063c2e3140a1461057f5761034f565b8063acf8a4ed11610153578063acf8a4ed14610533578063b3a2af1314610546578063b858183f146105595761034f565b8063ab3fdd501461050d578063ac9650d8146105205761034f565b80634f04a0db1161021c578063791b98bc116101d057806397e87d9d116101b557806397e87d9d146104d4578063a4a78f0c146104e7578063a98ce37f146104fa5761034f565b8063791b98bc146104aa57806390793ea8146104bf5761034f565b8063571ac8b011610201578063571ac8b0146104715780635ae401dc14610484578063639d71a9146104975761034f565b80634f04a0db1461043c5780635023b4df1461045e5761034f565b80631f0464d11161027357806342712a671161025857806342712a67146104035780634659a49414610416578063472b43f3146104295761034f565b80631f0464d1146103d05780633068c554146103f05761034f565b806304e45aaf1461035457806309b813461461037d57806311c178481461039057806311ed56c9146103b05761034f565b3661034f573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461034d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4e6f742053414d42000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b61036761036236600461553d565b6106b4565b6040516103749190615df7565b60405180910390f35b61036761038b3660046155d8565b61083c565b34801561039c57600080fd5b5061034d6103ab3660046153b2565b61091c565b6103c36103be366004615632565b610a6c565b6040516103749190615b74565b6103e36103de3660046152a1565b610c78565b6040516103749190615af6565b61034d6103fe3660046150d2565b610d02565b61036761041136600461587f565b610d15565b61034d61042436600461511b565b610eef565b61036761043736600461587f565b610fa3565b34801561044857600080fd5b50610451611357565b6040516103749190615a36565b61036761046c366004615610565b61137b565b61034d61047f366004614fe5565b611464565b6103e36104923660046152a1565b61149a565b61034d6104a5366004614fe5565b611513565b3480156104b657600080fd5b50610451611527565b3480156104cb57600080fd5b5061045161154b565b61034d6104e2366004615814565b61156f565b61034d6104f536600461511b565b611787565b61034d6105083660046157e5565b61185c565b61034d61051b366004614fe5565b611a22565b6103e361052e366004615176565b611a60565b61034d6105413660046157b5565b611bba565b6103c36105543660046152eb565b611bc4565b610367610567366004615497565b611c82565b61034d61057a366004615852565b611e45565b61034d61058d36600461511b565b611e51565b34801561059e57600080fd5b50610451611f06565b61034d611f2a565b61034d6105bd366004614fe5565b611a36565b3480156105ce57600080fd5b506105e26105dd366004615008565b611f3c565b6040516103749190615b87565b61034d6105fd366004615033565b6120e9565b61034d610610366004615074565b612200565b61034d6106233660046157b5565b612366565b61034d610636366004615008565b6123e2565b34801561064757600080fd5b5061034d6106563660046151b6565b6123f1565b6103c3610669366004615621565b612443565b34801561067a57600080fd5b5061034d61068936600461531e565b6124e3565b61034d61069c366004615008565b612534565b61034d6106af36600461511b565b612540565b600080600083608001511415610771575081516040517f70a0823100000000000000000000000000000000000000000000000000000000815260019173ffffffffffffffffffffffffffffffffffffffff16906370a082319061071b903090600401615a36565b60206040518083038186803b15801561073357600080fd5b505afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b91906157cd565b60808401525b6107ed836080015184606001518560c001516040518060400160405280886000015189604001518a602001516040516020016107af939291906159a4565b6040516020818303038152906040528152602001866107ce57336107d0565b305b73ffffffffffffffffffffffffffffffffffffffff1690526125d8565b91508260a00151821015610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c77565b60405180910390fd5b50919050565b60006108b0604083018035906108559060208601614fe5565b604080518082019091526000908061086d8880615e3b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525033602090910152612789565b505060005460608201358111156108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c09565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600055919050565b600084138061092b5750600083135b61093457600080fd5b600061094282840184615644565b905060008060006109568460000151612970565b9250925092506109887f00000000000000000000000000000000000000000000000000000000000000008484846129a1565b5060008060008a136109c9578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610896109fa565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108a5b915091508115610a1957610a1485876020015133846129b7565b610a60565b8551610a2490612b95565b15610a49578551610a3490612b9d565b8652610a438133600089612789565b50610a60565b80600081905550610a6084876020015133846129b7565b50505050505050505050565b604080516101608101909152606090610c70907f88316456000000000000000000000000000000000000000000000000000000009080610aaf6020870187614fe5565b73ffffffffffffffffffffffffffffffffffffffff168152602001856020016020810190610add9190614fe5565b73ffffffffffffffffffffffffffffffffffffffff168152602001610b08606087016040880161579b565b62ffffff168152602001610b226080870160608801615373565b60020b8152602001610b3a60a0870160808801615373565b60020b8152602090810190610b5a90610b5590880188614fe5565b612bd2565b8152602001610b75866020016020810190610b559190614fe5565b815260a0860135602082015260c08601356040820152606001610b9f610100870160e08801614fe5565b73ffffffffffffffffffffffffffffffffffffffff1681526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250604051602401610bee9190615cf2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611bc4565b90505b919050565b60608380600143034014610ced57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f426c6f636b686173680000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610cf78484611a60565b91505b509392505050565b610d0f8484338585612200565b50505050565b6000610d757f000000000000000000000000000000000000000000000000000000000000000087868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c7792505050565b600081518110610d8157fe5b6020026020010151905084811115610dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c09565b610e5e84846000818110610dd557fe5b9050602002016020810190610dea9190614fe5565b33610e587f000000000000000000000000000000000000000000000000000000000000000088886000818110610e1c57fe5b9050602002016020810190610e319190614fe5565b89896001818110610e3e57fe5b9050602002016020810190610e539190614fe5565b612db0565b846129b7565b73ffffffffffffffffffffffffffffffffffffffff821660011415610e8557339150610ea8565b73ffffffffffffffffffffffffffffffffffffffff821660021415610ea8573091505b610ee6848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612e9b915050565b95945050505050565b604080517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e48101839052905173ffffffffffffffffffffffffffffffffffffffff881691638fcbaf0c9161010480830192600092919082900301818387803b158015610f8f57600080fd5b505af1158015610a60573d6000803e3d6000fd5b60008086611059575060018484600081610fb957fe5b9050602002016020810190610fce9190614fe5565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110069190615a36565b60206040518083038186803b15801561101e57600080fd5b505afa158015611032573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105691906157cd565b96505b6110e48585600081811061106957fe5b905060200201602081019061107e9190614fe5565b82611089573361108b565b305b6110de7f0000000000000000000000000000000000000000000000000000000000000000898960008181106110bc57fe5b90506020020160208101906110d19190614fe5565b8a8a6001818110610e3e57fe5b8a6129b7565b73ffffffffffffffffffffffffffffffffffffffff83166001141561110b5733925061112e565b73ffffffffffffffffffffffffffffffffffffffff83166002141561112e573092505b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061115e57fe5b90506020020160208101906111739190614fe5565b73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016111ab9190615a36565b60206040518083038186803b1580156111c357600080fd5b505afa1580156111d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fb91906157cd565b905061123b868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250612e9b915050565b6113108187877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061126d57fe5b90506020020160208101906112829190614fe5565b73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016112ba9190615a36565b60206040518083038186803b1580156112d257600080fd5b505afa1580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a91906157cd565b906131a0565b92508683101561134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c77565b505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611424608083018035906113949060608601614fe5565b6113a460e0860160c08701614fe5565b60405180604001604052808760200160208101906113c29190614fe5565b6113d260608a0160408b0161579b565b6113df60208b018b614fe5565b6040516020016113f1939291906159a4565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250612789565b90508160a001358111156108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c09565b61148e817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6131b0565b61149757600080fd5b50565b606083806114a66132fc565b1115610ced57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b61151e8160006131b0565b61146457600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600082118015611580575060648211155b61158957600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561161257600080fd5b505afa158015611626573d6000803e3d6000fd5b505050506040513d602081101561163c57600080fd5b50519050848110156116af57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e73756666696369656e742053414d42000000000000000000000000000000604482015290519081900360640190fd5b8015611780577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561172857600080fd5b505af115801561173c573d6000803e3d6000fd5b505050506000612710611758858461330090919063ffffffff16565b8161175f57fe5b0490508015611772576117728382613324565b61177e85828403613324565b505b5050505050565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b15801561181c57600080fd5b505afa158015611830573d6000803e3d6000fd5b505050506040513d602081101561184657600080fd5b5051101561177e5761177e868686868686610eef565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118e557600080fd5b505afa1580156118f9573d6000803e3d6000fd5b505050506040513d602081101561190f57600080fd5b505190508281101561198257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e73756666696369656e742053414d42000000000000000000000000000000604482015290519081900360640190fd5b8015611a1d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119fb57600080fd5b505af1158015611a0f573d6000803e3d6000fd5b50505050611a1d8282613324565b505050565b611a2d8160006131b0565b611a3657600080fd5b61148e817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6131b0565b60608167ffffffffffffffff81118015611a7957600080fd5b50604051908082528060200260200182016040528015611aad57816020015b6060815260200190600190039081611a985790505b50905060005b82811015611bb35760008030868685818110611acb57fe5b9050602002810190611add9190615e3b565b604051611aeb929190615a0a565b600060405180830381855af49150503d8060008114611b26576040519150601f19603f3d011682016040523d82523d6000602084013e611b2b565b606091505b509150915081611b9157604481511015611b4457600080fd5b60048101905080806020019051810190611b5e919061542d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d9190615b74565b80848481518110611b9e57fe5b60209081029190910101525050600101611ab3565b5092915050565b611497813361185c565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1683604051611c0d9190615a1a565b6000604051808303816000865af19150503d8060008114611c4a576040519150601f19603f3d011682016040523d82523d6000602084013e611c4f565b606091505b50925090508061083657604482511015611c6857600080fd5b60048201915081806020019051810190611b5e919061542d565b600080600083604001511415611d5357600190506000611ca58460000151612970565b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190611cfc903090600401615a36565b60206040518083038186803b158015611d1457600080fd5b505afa158015611d28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4c91906157cd565b6040850152505b600081611d605733611d62565b305b90505b6000611d748560000151612b95565b9050611dcd856040015182611d8d578660200151611d8f565b305b60006040518060400160405280611da98b60000151613472565b81526020018773ffffffffffffffffffffffffffffffffffffffff168152506125d8565b60408601528015611ded578451309250611de690612b9d565b8552611dfa565b8460400151935050611e00565b50611d65565b8360600151831015611e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c77565b5050919050565b611a1d8333848461156f565b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051869173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b158015611ec657600080fd5b505afa158015611eda573d6000803e3d6000fd5b505050506040513d6020811015611ef057600080fd5b5051101561177e5761177e868686868686612540565b7f000000000000000000000000000000000000000000000000000000000000000081565b4715611f3a57611f3a3347613324565b565b6000818373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e307f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611f9a929190615a57565b60206040518083038186803b158015611fb257600080fd5b505afa158015611fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fea91906157cd565b10611ff7575060006120e3565b612021837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6131b0565b1561202e575060016120e3565b612058837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6131b0565b15612065575060026120e3565b6120708360006131b0565b61207957600080fd5b6120a3837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6131b0565b156120b0575060036120e3565b6120da837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6131b0565b1561034f575060045b92915050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561215257600080fd5b505afa158015612166573d6000803e3d6000fd5b505050506040513d602081101561217c57600080fd5b50519050828110156121ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b8015610d0f57610d0f848383613481565b600082118015612211575060648211155b61221a57600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561228357600080fd5b505afa158015612297573d6000803e3d6000fd5b505050506040513d60208110156122ad57600080fd5b505190508481101561232057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b801561177e5760006127106123358386613300565b8161233c57fe5b049050801561235057612350878483613481565b61235d8786838503613481565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123ce57600080fd5b505af115801561177e573d6000803e3d6000fd5b6123ed8282336120e9565b5050565b6000806123ff868685613656565b915091508362ffffff168183031261177e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c40565b6060610c7063219f5d1760e01b6040518060c001604052808560400135815260200161247b866000016020810190610b559190614fe5565b8152602001612496866020016020810190610b559190614fe5565b815260200185606001358152602001856080013581526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250604051602401610bee9190615cae565b6000806124f08584613869565b915091508362ffffff1681830312611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c40565b6123ed82333084613af1565b604080517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c48101839052905173ffffffffffffffffffffffffffffffffffffffff88169163d505accf9160e480830192600092919082900301818387803b158015610f8f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff84166001141561260157339350612624565b73ffffffffffffffffffffffffffffffffffffffff841660021415612624573093505b60008060006126368560000151612970565b9194509250905073ffffffffffffffffffffffffffffffffffffffff80831690841610600080612667868686613cce565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b8561268d8f613d0c565b73ffffffffffffffffffffffffffffffffffffffff8e16156126af578d6126d5565b876126ce5773fffd8963efd1fc6a506488495d951d5263988d256126d5565b6401000276a45b8d6040516020016126e69190615da0565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401612715959493929190615a7e565b6040805180830381600087803b15801561272e57600080fd5b505af1158015612742573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612766919061538f565b91509150826127755781612777565b805b6000039b9a5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8416600114156127b2573393506127d5565b73ffffffffffffffffffffffffffffffffffffffff8416600214156127d5573093505b60008060006127e78560000151612970565b9194509250905073ffffffffffffffffffffffffffffffffffffffff80841690831610600080612818858786613cce565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b8561283e8f613d0c565b60000373ffffffffffffffffffffffffffffffffffffffff8e1615612863578d612889565b876128825773fffd8963efd1fc6a506488495d951d5263988d25612889565b6401000276a45b8d60405160200161289a9190615da0565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016128c9959493929190615a7e565b6040805180830381600087803b1580156128e257600080fd5b505af11580156128f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291a919061538f565b9150915060008361292f578183600003612935565b82826000035b909850905073ffffffffffffffffffffffffffffffffffffffff8a16612961578b811461296157600080fd5b50505050505050949350505050565b6000808061297e8482613d3e565b925061298b846014613e3e565b9050612998846017613d3e565b91509193909250565b6000610ee6856129b2868686613f2e565b613fab565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612a125750804710155b15612b5b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b2957600080fd5b505af1158015612b3d573d6000803e3d6000fd5b505050506040513d6020811015612b5357600080fd5b50610d0f9050565b73ffffffffffffffffffffffffffffffffffffffff8316301415612b8957612b84848383613481565b610d0f565b610d0f84848484613af1565b516042111590565b8051606090610c709083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe901613fdb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190612c27903090600401615a36565b60206040518083038186803b158015612c3f57600080fd5b505afa158015612c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7091906157cd565b6060600282511015612c8857600080fd5b815167ffffffffffffffff81118015612ca057600080fd5b50604051908082528060200260200182016040528015612cca578160200160208202803683370190505b5090508281600183510381518110612cde57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015610cfa57600080612d4b87866001860381518110612d2a57fe5b6020026020010151878681518110612d3e57fe5b60200260200101516141c2565b91509150612d6d848481518110612d5e57fe5b602002602001015183836142aa565b846001850381518110612d7c57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612d0e565b6000806000612dbf8585614380565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f400e13fc6c59224f20228f0c0561806856ac34b7318f337f8012707c880c351f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b60005b6001835103811015611a1d57600080848381518110612eb957fe5b6020026020010151858460010181518110612ed057fe5b6020026020010151915091506000612ee88383614380565b5090506000612f187f00000000000000000000000000000000000000000000000000000000000000008585612db0565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612f6657600080fd5b505afa158015612f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9e91906156d4565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614613000578284613003565b83835b91509150613044828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b81526004016112ba9190615a36565b9550613051868383614425565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461309557826000613099565b6000835b91509150600060028c51038a106130b0578a6130f1565b6130f17f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106130e457fe5b6020026020010151612db0565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906131599086908690869060248101615e00565b600060405180830381600087803b158015613173