@muffinfi/muffin-contracts
Version:
Smart contracts of Muffin Protocol
1,333 lines • 129 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "MuffinHub",
"sourceName": "contracts/MuffinHub.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_positionController",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "FailedBalanceOf",
"type": "error"
},
{
"inputs": [],
"name": "FailedTransfer",
"type": "error"
},
{
"inputs": [],
"name": "InvalidAmount",
"type": "error"
},
{
"inputs": [],
"name": "InvalidSwapPath",
"type": "error"
},
{
"inputs": [],
"name": "InvalidTierChoices",
"type": "error"
},
{
"inputs": [],
"name": "InvalidTokenOrder",
"type": "error"
},
{
"inputs": [],
"name": "NotAllowedSqrtGamma",
"type": "error"
},
{
"inputs": [],
"name": "NotEnoughFundToWithdraw",
"type": "error"
},
{
"inputs": [],
"name": "NotEnoughIntermediateOutput",
"type": "error"
},
{
"inputs": [],
"name": "NotEnoughTokenInput",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "positionRefId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"indexed": false,
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"indexed": false,
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
},
{
"indexed": false,
"internalType": "uint256",
"name": "ownerAccRefId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount0",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount1",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "feeAmount0",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "feeAmount1",
"type": "uint256"
}
],
"name": "Burn",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "token",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "CollectProtocol",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "positionRefId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"indexed": false,
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"indexed": false,
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
},
{
"indexed": false,
"internalType": "uint256",
"name": "ownerAccRefId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount0",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount1",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "feeAmount0",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "feeAmount1",
"type": "uint256"
}
],
"name": "CollectSettled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "recipientAccRefId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "token",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "Deposit",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "governance",
"type": "address"
}
],
"name": "GovernanceUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "positionRefId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"indexed": false,
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"indexed": false,
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
},
{
"indexed": false,
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "senderAccRefId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount0",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount1",
"type": "uint256"
}
],
"name": "Mint",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
}
],
"name": "PoolCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "positionRefId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"indexed": false,
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"indexed": false,
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
},
{
"indexed": false,
"internalType": "uint8",
"name": "limitOrderType",
"type": "uint8"
}
],
"name": "SetLimitOrderType",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"indexed": true,
"internalType": "int24",
"name": "tickEnd",
"type": "int24"
},
{
"indexed": false,
"internalType": "int24",
"name": "tickStart",
"type": "int24"
},
{
"indexed": false,
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
}
],
"name": "Settle",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "senderAccRefId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "recipientAccRefId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "int256",
"name": "amount0",
"type": "int256"
},
{
"indexed": false,
"internalType": "int256",
"name": "amount1",
"type": "int256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountInDistribution",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountOutDistribution",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256[]",
"name": "tierData",
"type": "uint256[]"
}
],
"name": "Swap",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "tickSpacing",
"type": "uint8"
},
{
"indexed": false,
"internalType": "uint8",
"name": "protocolFee",
"type": "uint8"
}
],
"name": "UpdateDefaultParameters",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint8",
"name": "tickSpacing",
"type": "uint8"
},
{
"indexed": false,
"internalType": "uint8",
"name": "protocolFee",
"type": "uint8"
}
],
"name": "UpdatePool",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"indexed": true,
"internalType": "uint24",
"name": "sqrtGamma",
"type": "uint24"
},
{
"indexed": false,
"internalType": "uint128",
"name": "sqrtPrice",
"type": "uint128"
},
{
"indexed": false,
"internalType": "uint8",
"name": "limitOrderTickSpacingMultiplier",
"type": "uint8"
}
],
"name": "UpdateTier",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "senderAccRefId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "token",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address",
"name": "recipient",
"type": "address"
}
],
"name": "Withdraw",
"type": "event"
},
{
"stateMutability": "nonpayable",
"type": "fallback"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "accounts",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint24",
"name": "sqrtGamma",
"type": "uint24"
},
{
"internalType": "uint256",
"name": "senderAccRefId",
"type": "uint256"
}
],
"name": "addTier",
"outputs": [
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint24",
"name": "sqrtGamma",
"type": "uint24"
},
{
"internalType": "uint128",
"name": "sqrtPrice",
"type": "uint128"
},
{
"internalType": "uint256",
"name": "senderAccRefId",
"type": "uint256"
}
],
"name": "createPool",
"outputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "recipientAccRefId",
"type": "uint256"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getDefaultParameters",
"outputs": [
{
"internalType": "uint8",
"name": "tickSpacing",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "protocolFee",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
}
],
"name": "getPoolParameters",
"outputs": [
{
"internalType": "uint8",
"name": "tickSpacing",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "protocolFee",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "positionRefId",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
}
],
"name": "getPosition",
"outputs": [
{
"components": [
{
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
},
{
"internalType": "uint80",
"name": "feeGrowthInside0Last",
"type": "uint80"
},
{
"internalType": "uint80",
"name": "feeGrowthInside1Last",
"type": "uint80"
},
{
"internalType": "uint8",
"name": "limitOrderType",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "settlementSnapshotId",
"type": "uint32"
}
],
"internalType": "struct Positions.Position",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "slot",
"type": "bytes32"
}
],
"name": "getStorageAt",
"outputs": [
{
"internalType": "bytes32",
"name": "word",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"internalType": "int24",
"name": "tick",
"type": "int24"
}
],
"name": "getTick",
"outputs": [
{
"components": [
{
"internalType": "uint96",
"name": "liquidityLowerD8",
"type": "uint96"
},
{
"internalType": "uint96",
"name": "liquidityUpperD8",
"type": "uint96"
},
{
"internalType": "int24",
"name": "nextBelow",
"type": "int24"
},
{
"internalType": "int24",
"name": "nextAbove",
"type": "int24"
},
{
"internalType": "bool",
"name": "needSettle0",
"type": "bool"
},
{
"internalType": "bool",
"name": "needSettle1",
"type": "bool"
},
{
"internalType": "uint80",
"name": "feeGrowthOutside0",
"type": "uint80"
},
{
"internalType": "uint80",
"name": "feeGrowthOutside1",
"type": "uint80"
}
],
"internalType": "struct Ticks.Tick",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
}
],
"name": "getTier",
"outputs": [
{
"components": [
{
"internalType": "uint128",
"name": "liquidity",
"type": "uint128"
},
{
"internalType": "uint128",
"name": "sqrtPrice",
"type": "uint128"
},
{
"internalType": "uint24",
"name": "sqrtGamma",
"type": "uint24"
},
{
"internalType": "int24",
"name": "tick",
"type": "int24"
},
{
"internalType": "int24",
"name": "nextTickBelow",
"type": "int24"
},
{
"internalType": "int24",
"name": "nextTickAbove",
"type": "int24"
},
{
"internalType": "uint80",
"name": "feeGrowthGlobal0",
"type": "uint80"
},
{
"internalType": "uint80",
"name": "feeGrowthGlobal1",
"type": "uint80"
}
],
"internalType": "struct Tiers.Tier",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
}
],
"name": "getTiersCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "governance",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"internalType": "uint24",
"name": "sqrtGamma",
"type": "uint24"
}
],
"name": "isSqrtGammaAllowed",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "maxNumOfTiers",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenIn",
"type": "address"
},
{
"internalType": "address",
"name": "tokenOut",
"type": "address"
},
{
"internalType": "uint256",
"name": "tierChoices",
"type": "uint256"
},
{
"internalType": "int256",
"name": "amountDesired",
"type": "int256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "recipientAccRefId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "senderAccRefId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "swap",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "bytes",
"name": "path",
"type": "bytes"
},
{
"internalType": "int256",
"name": "amountDesired",
"type": "int256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "recipientAccRefId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "senderAccRefId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"internalType": "struct IMuffinHubActions.SwapMultiHopParams",
"name": "p",
"type": "tuple"
}
],
"name": "swapMultiHop",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "tokens",
"outputs": [
{
"internalType": "uint8",
"name": "locked",
"type": "uint8"
},
{
"internalType": "uint248",
"name": "protocolFeeAmt",
"type": "uint248"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "underlyings",
"outputs": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "senderAccRefId",
"type": "uint256"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x6000805461ffff60a01b1916601960a21b1790556101406040526201863c60a0908152620185d860c0526201857460e0526201851061010052620184ab6101205262000050906001906005620000a5565b503480156200005e57600080fd5b50604051620061203803806200612083398101604081905262000081916200016f565b6001600160a01b0316608052600080546001600160a01b03191633179055620001a1565b82805482825590600052602060002090600901600a90048101928215620001465791602002820160005b838211156200011357835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302620000cf565b8015620001445782816101000a81549062ffffff021916905560030160208160020104928301926001030262000113565b505b506200015492915062000158565b5090565b5b8082111562000154576000815560010162000159565b6000602082840312156200018257600080fd5b81516001600160a01b03811681146200019a57600080fd5b9392505050565b608051615f63620001bd60003960006101530152615f636000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806384ec1e15116100cd578063c625e3c311610081578063dc65746511610066578063dc657465146105d7578063e3642509146105f7578063e48603391461061757610151565b8063c625e3c3146103f1578063c6883ec5146105c457610151565b8063aa5976c1116100b2578063aa5976c114610387578063aaa9acd2146103b9578063c349e769146103cc57610151565b806384ec1e15146102f65780639aca112e1461036457610151565b80634b2084e3116101245780637266a0e4116101095780637266a0e414610295578063775dfc82146102c05780637951532d146102d357610151565b80634b2084e31461023b5780635aa6e6751461025057610151565b806313fd4c80146101965780631ca0027a146101ac5780632ec31fbc146101be578063476cfd25146101e6575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e808015610191573d6000f35b3d6000fd5b60065b6040519081526020015b60405180910390f35b6101996101ba36600461550b565b5490565b6101d16101cc36600461558f565b61069b565b604080519283526020830191909152016101a3565b60005460ff74010000000000000000000000000000000000000000820481169175010000000000000000000000000000000000000000009004165b6040805160ff9384168152929091166020830152016101a3565b61024e61024936600461562e565b610736565b005b6000546102709073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a3565b6101996102a3366004615672565b600560209081526000928352604080842090915290825290205481565b6101996102ce3660046156af565b61084e565b6101996102e136600461550b565b60009081526004602052604090206001015490565b61033761030436600461550b565b6007602052600090815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff918216911682565b6040805173ffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101a3565b610377610372366004615722565b610b98565b60405190151581526020016101a3565b61022161039536600461550b565b60009081526004602052604090205460ff6101008204811692620100009092041690565b61024e6103c736600461574e565b610ca3565b6103df6103da3660046157c6565b610ded565b60405160ff90911681526020016101a3565b6105596103ff366004615824565b6040805160a081018252600080825260208083018290528284018290526060808401839052608084018390528a8352600482528483208551918b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168284015260f889901b7fff0000000000000000000000000000000000000000000000000000000000000016603483015260e888811b603584015287901b6038830152603b8083018b905286518084039091018152605b909201865281519183019190912083526005019052919091206040805160a08101825282546bffffffffffffffffffffffff811682526c01000000000000000000000000810469ffffffffffffffffffff9081166020840152760100000000000000000000000000000000000000000000909104169181019190915260019091015460ff81166060830152610100900463ffffffff166080820152979650505050505050565b6040516101a39190600060a0820190506bffffffffffffffffffffffff8351168252602083015169ffffffffffffffffffff8082166020850152806040860151166040850152505060ff606084015116606083015263ffffffff608084015116608083015292915050565b6101d16105d236600461588a565b610fcf565b6105ea6105e53660046158c5565b61135a565b6040516101a391906158e8565b61060a61060536600461599d565b6114a8565b6040516101a391906159d9565b610662610625366004615a3b565b60066020526000908152604090205460ff81169061010090047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1682565b6040805160ff90931683527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091166020830152016101a3565b60008060006106dd8c8c8c8c60405180606001604052808c81526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020018d81525061162a565b90955093509091506106f890508c8c85858c8c8c8c8c6117bf565b6107278180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b50995099975050505050505050565b6000610742338561199b565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600560209081526040808320848452909152902054909150828110156107b0576040517f99f874cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600560209081526040808320858452909152902083820390556107f08487856119ee565b6040805184815273ffffffffffffffffffffffffffffffffffffffff8881166020830152861691879133917fc5de321f20136e2f86609c5eab638083a3300f55766433c1243a6ea1610f7792910160405180910390a4505050505050565b60008473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610158061089f575073ffffffffffffffffffffffffffffffffffffffff8616155b156108d6576040517f3f06bf8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108e460048888611a8b565b925090506108f28286610b98565b610928576040517f423d4ff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526002602052604090205460ff168061095f575060005474010000000000000000000000000000000000000000900460ff165b6000805481906109929085908a908a9087907501000000000000000000000000000000000000000000900460ff16611b0d565b73ffffffffffffffffffffffffffffffffffffffff8c1660009081526005602052604081209294509092508391906109ca338a61199b565b815260200190815260200160002060008282546109e79190615a85565b909155505073ffffffffffffffffffffffffffffffffffffffff891660009081526005602052604081208291610a1d338a61199b565b81526020019081526020016000206000828254610a3a9190615a85565b9091555050604051859073ffffffffffffffffffffffffffffffffffffffff808c1691908d16907fec5dc6309c83a50f60f4a1fae9422b2c406da78c579b9b12b92d033db37c719490600090a4604080516fffffffffffffffffffffffffffffffff891681526001602082015262ffffff8a169160009188917f8ba9b3074e943a040d7cc32a0a69db4cada877568ff71021a69579a1f004e440910160405180910390a4610b0d8480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b505060408051808201825273ffffffffffffffffffffffffffffffffffffffff998a1681529789166020808a01918252600086815260079091529190912097518854908a167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161789559051600190980180549890991697169690961790965595945050505050565b6000828152600360205260408120548190610bb4576001610bc3565b60008481526003602052604090205b905060005b8154811015610c96578362ffffff16828281548110610be957610be9615a9c565b90600052602060002090600a91828204019190066003029054906101000a900462ffffff1662ffffff161415610c8e576000858152600460205260408120600101905b8154811015610c81578562ffffff16828281548110610c4d57610c4d615a9c565b600091825260209091206001600290920201015462ffffff161415610c79576000945050505050610c9d565b600101610c2c565b5060019350505050610c9d565b600101610bc8565b5060009150505b92915050565b6000610cae85611c2d565b6040517f641229d9000000000000000000000000000000000000000000000000000000008152909150339063641229d990610cf3908890889088908890600401615b14565b600060405180830381600087803b158015610d0d57600080fd5b505af1158015610d21573d6000803e3d6000fd5b50505050610d3a858583610d359190615b54565b611ccf565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604081208591610d6b8a8a61199b565b81526020019081526020016000206000828254610d889190615b54565b90915550506040805185815233602082015273ffffffffffffffffffffffffffffffffffffffff808816928992918b16917f0b6c6cb502d2da9ef6887b17afbeb0034852ce0a2394ac48028d6b0f7810b63c910160405180910390a450505050505050565b60008080610dfd60048888611a8b565b91509150610e0b8186610b98565b610e41576040517f423d4ff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e4e8488611d61565b73ffffffffffffffffffffffffffffffffffffffff8c1660009081526005602052604081209198509294509092508391610e88338a61199b565b81526020019081526020016000206000828254610ea59190615a85565b909155505073ffffffffffffffffffffffffffffffffffffffff881660009081526005602052604081208291610edb338a61199b565b81526020019081526020016000206000828254610ef89190615a85565b925050819055508662ffffff168560ff16847f8ba9b3074e943a040d7cc32a0a69db4cada877568ff71021a69579a1f004e440876001018960ff1681548110610f4357610f43615a9c565b6000918252602080832060029290920290910154604080517001000000000000000000000000000000009092046fffffffffffffffffffffffffffffffff168252918101929092520160405180910390a4610fc38480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b50505050949350505050565b60008080610fdd8480615b6c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293506110209250839150611de69050565b15611057576040517f3378279300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602085013581129061106d83516016900490565b67ffffffffffffffff81111561108557611085615bd1565b6040519080825280602002602001820160405280156110ae578160200160208202803683370190505b509050602086013560008361110d576040518060600160405280896080013581526020018960400160208101906110e59190615a3b565b73ffffffffffffffffffffffffffffffffffffffff168152602001896060013581525061112d565b6040805160608101825260808a0135808252336020830152918101919091525b905060005b83518110156112805784156111885760018451038114156111835761115d60608a0160408b01615a3b565b73ffffffffffffffffffffffffffffffffffffffff166020830152606089013560408301525b6111a2565b80600114156111a257336020830152608089013560408301525b600080806111b189858a611e30565b9250925092506000806111df8585858d806111ca575089155b6111d75760648c036111d9565b8b5b8b61162a565b909192508b89815181106111f5576111f5615a9c565b602090810291909101019290925292509050891561121e578561121657819c505b80975061126f565b8561122b57809b50611268565b87600003811015611268576040517f4b5f1a1e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160000397505b505060019093019250611132915050565b50831561128f57819550611296565b8160000396505b5060009050806112a68585611e71565b90925090506112e1828289896112c260608e0160408f01615a3b565b8d606001358e608001358f8060a001906112dc9190615b6c565b6117bf565b60005b835181101561134f576113476004600086848151811061130657611306615a9c565b6020026020010151815260200190815260200160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001016112e4565b505050505050915091565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091526000838152600460205260409020600101805460ff84169081106113c1576113c1615a9c565b60009182526020918290206040805161010081018252600293840290920180546fffffffffffffffffffffffffffffffff8082168552700100000000000000000000000000000000909104169483019490945260019093015462ffffff81169382019390935263010000008304820b606082015266010000000000008304820b60808201526901000000000000000000830490910b60a082015269ffffffffffffffffffff6c010000000000000000000000008304811660c083015276010000000000000000000000000000000000000000000090920490911660e0820152905092915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915250600083815260046020908152604080832060ff808716855260039091018352818420600286810b86529084529382902082516101008101845281546bffffffffffffffffffffffff80821683526c010000000000000000000000008204169582019590955278010000000000000000000000000000000000000000000000008504860b938101939093527b01000000000000000000000000000000000000000000000000000000840490940b60608301527e0100000000000000000000000000000000000000000000000000000000000083048116151560808301527f0100000000000000000000000000000000000000000000000000000000000000909204909116151560a082015260019091015469ffffffffffffffffffff80821660c08401526a01000000000000000000009091041660e08201525b9392505050565b600080808073ffffffffffffffffffffffffffffffffffffffff808916908a16108187138114816116665761166160048b8d611a8b565b611672565b61167260048c8c611a8b565b9096509450600061168687838b8d8a611e89565b9050876020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16877f6d264ed3495dadcbb82f8e1bf8c4a8498812b3f0543f86b6513630e455dcfe178b600001518c6040015186600001518760200151886040015189606001518a608001516040516117129796959493929190615c00565b60405180910390a460a08101511561178b5760a081015173ffffffffffffffffffffffffffffffffffffffff8d16600090815260066020526040902080547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010080830482169094011690920260ff9092169190911790555b8261179f57602081015181516000036117aa565b805160208201516000035b979d969c509a50959850939650505050505050565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415611803576117fd8787612494565b90975095505b83611818576118138886886119ee565b61186c565b73ffffffffffffffffffffffffffffffffffffffff881660009081526005602052604081208791611849888861199b565b815260200190815260200160002060008282546118669190615b54565b90915550505b82156118f257600061187e338561199b565b73ffffffffffffffffffffffffffffffffffffffff8b1660009081526005602090815260408083208484529091529020549091506118bc9089612494565b73ffffffffffffffffffffffffffffffffffffffff8c166000908152600560209081526040808320958352949052929092205596505b86156119905760006119038a611c2d565b6040517ff1371dd5000000000000000000000000000000000000000000000000000000008152909150339063f1371dd59061194c908d908d908d908d908a908a90600401615c72565b600060405180830381600087803b15801561196657600080fd5b505af115801561197a573d6000803e3d6000fd5b5050505061198e8a8983610d359190615b54565b505b505050505050505050565b6000816119a757600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8516602082015290810183905260600160405160208183030381529060405280519060200120905092915050565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201528260248201526000806044836000895af1915050611a4f816124b0565b611a85576040517fbfa871c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808383604051602001611ac392919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815297909252909520959350505050565b84546000908190610100900460ff1615611b2657600080fd5b6fffffffffffffffffffffffffffffffff85166201000311801590611b6d57506ffffdd8371ce3ef742f98c78a4732240d6fffffffffffffffffffffffffffffffff861611155b611b7657600080fd5b60008460ff1611611b8657600080fd5b865460ff84811662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff91871661010002919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff90921691909117178755611bf48787876124f5565b60069890980180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559795505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8216738dd5fbce2f6a956c3022ba3663759011dd51e73e1415611c6657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600660205260409020805460ff1660011415611c9d57600080fd5b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001178155611623836128ed565b80611cd9836128ed565b1015611d11576040517fde2cd50d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff16600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055565b6000806000611d6f85612a26565b50600184015460ff8116611d8257600080fd5b611dd9858587600101600081548110611d9d57611d9d615a9c565b600091825260209091206002909102015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166124f5565b9096909550909350915050565b80516000906116141080611dfc57506014825111155b80610c9d5750505160167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec90910106151590565b6000808060168502611e458782016014015190565b878201602a810151601690910151919550935061ffff16915084611e67579192915b5093509350939050565b6014820151825183015182611e8257905b9250929050565b611ec26040518060c001604052806000815260200160008152602001600081526020016000815260200160608152602001600081525090565b611ecb86612a26565b6060611ed5615489565b60018881015490811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0195861695871580611f3057507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88145b15611f67576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86611f9e576040517fd2a0a82900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808714156120c55789600101805480602002602001604051908101604052809291908181526020016000905b828210156120ba5760008481526020908190206040805161010081018252600280870290930180546fffffffffffffffffffffffffffffffff8082168452700100000000000000000000000000000000909104168286015260019081015462ffffff81169383019390935263010000008304840b606083015266010000000000008304840b60808301526901000000000000000000830490930b60a082015269ffffffffffffffffffff6c010000000000000000000000008304811660c083015276010000000000000000000000000000000000000000000090920490911660e082015283529092019101611fca565b5050505093506122a3565b8167ffffffffffffffff8111156120de576120de615bd1565b60405190808252806020026020018201604052801561216b57816020015b604080516101008101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816120fc5790505b50935060005b84518110156122a1576001811b881615612299578a600101818154811061219a5761219a615a9c565b60009182526020918290206040805161010081018252600293840290920180546fffffffffffffffffffffffffffffffff8082168552700100000000000000000000000000000000909104169483019490945260019093015462ffffff81169382019390935263010000008304820b606082015266010000000000008304820b60808201526901000000000000000000830490910b60a082015269ffffffffffffffffffff6c010000000000000000000000008304811660c083015276010000000000000000000000000000000000000000000090920490911660e0820152855186908390811061228d5761228d615a9c565b60200260200101819052505b600101612171565b505b5050604080516101008101825260008089138a1515811483526020808401919091528b5462010000900460ff168385015260608301829052608083018990528351808501909452627fffff8452830181905260a082019290925260c08101612309612a5c565b81526020018690529050866000805b836020015161233657612331868c8c8760800151612a67565b612346565b612346868c8c8760800151612d17565b60c085015260005b86518110156123be576000806123978f8f898b876006811061237257612372615a9c565b60200201518d888151811061238957612389615a9c565b602002602001015188613080565b90925090506123a68286615cf3565b94506123b28185615cf3565b9350505060010161234e565b506123c98284615d67565b995083602001516123fd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c8a1215612403565b60648a13155b8061241057506080840151155b1561241a5761241f565b612318565b83606001518760a001818152505061245f8c868887602001516124425784612444565b855b88602001516124565786600003613602565b85600003613602565b60808a0152606089015260408801528a61247a57808261247d565b81815b6020890152875250949a9950505050505050505050565b6000808284106124a8578284039150611e82565b509291900390565b6000816124c1573d6000803e3d6000fd5b3d602081146124d95780156124ea57600091506124ef565b3d6000803e600051151591506124ef565b600191505b50919050565b600183015460009081906006811061250c57600080fd5b620186a062ffffff8616111561252157600080fd5b604080516101008101825261640081526fffffffffffffffffffffffffffffffff8616602082015262ffffff87169181019190915260009060608101612566876139c3565b60020b81527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff427556020820152620bd8ab6040820152600060