Loading
[ { "inputs": [ { "internalType": "contract IUniswapV3Factory", "name": "factory_", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "burnAmount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "burnAmount1", "type": "uint256" } ], "name": "LPBurned", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint24[]", "name": "feeTiers", "type": "uint24[]" } ], "name": "LogAddPools", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address[]", "name": "routers", "type": "address[]" } ], "name": "LogBlacklistRouters", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "burnAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount0Out", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1Out", "type": "uint256" } ], "name": "LogBurn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "fee0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "fee1", "type": "uint256" } ], "name": "LogCollectedFees", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "mintAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount0In", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1In", "type": "uint256" } ], "name": "LogMint", "type": "event" }, { "anonymous": false, "inputs": [ { "components": [ { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "components": [ { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" }, { "internalType": "uint24", "name": "feeTier", "type": "uint24" } ], "internalType": "struct Range", "name": "range", "type": "tuple" } ], "internalType": "struct PositionLiquidity[]", "name": "burns", "type": "tuple[]" }, { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "components": [ { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" }, { "internalType": "uint24", "name": "feeTier", "type": "uint24" } ], "internalType": "struct Range", "name": "range", "type": "tuple" } ], "internalType": "struct PositionLiquidity[]", "name": "mints", "type": "tuple[]" }, { "components": [ { "internalType": "bytes", "name": "payload", "type": "bytes" }, { "internalType": "address", "name": "router", "type": "address" }, { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "expectedMinReturn", "type": "uint256" }, { "internalType": "bool", "name": "zeroForOne", "type": "bool" } ], "internalType": "struct SwapPayload", "name": "swap", "type": "tuple" }, { "internalType": "uint256", "name": "minBurn0", "type": "uint256" }, { "internalType": "uint256", "name": "minBurn1", "type": "uint256" }, { "internalType": "uint256", "name": "minDeposit0", "type": "uint256" }, { "internalType": "uint256", "name": "minDeposit1", "type": "uint256" } ], "indexed": false, "internalType": "struct Rebalance", "name": "rebalanceParams", "type": "tuple" }, { "indexed": false, "internalType": "uint256", "name": "swapDelta0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "swapDelta1", "type": "uint256" } ], "name": "LogRebalance", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address[]", "name": "pools", "type": "address[]" } ], "name": "LogRemovePools", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "minter", "type": "address" } ], "name": "LogRestrictedMint", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "init0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "init1", "type": "uint256" } ], "name": "LogSetInits", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "newManager", "type": "address" } ], "name": "LogSetManager", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint16", "name": "managerFeeBPS", "type": "uint16" } ], "name": "LogSetManagerFeeBPS", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address[]", "name": "routers", "type": "address[]" } ], "name": "LogWhitelistRouters", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "name": "LogWithdrawManagerBalance", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [ { "internalType": "uint24[]", "name": "feeTiers_", "type": "uint24[]" } ], "name": "addPools", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "routers_", "type": "address[]" } ], "name": "blacklistRouters", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "burnAmount_", "type": "uint256" }, { "internalType": "address", "name": "receiver_", "type": "address" } ], "name": "burn", "outputs": [ { "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "collectFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } ], "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "contract IUniswapV3Factory", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "feeManager", "outputs": [ { "internalType": "contract IFeeManager", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getPools", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getRanges", "outputs": [ { "components": [ { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" }, { "internalType": "uint24", "name": "feeTier", "type": "uint24" } ], "internalType": "struct Range[]", "name": "", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getRouters", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "addedValue", "type": "uint256" } ], "name": "increaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "init0", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "init1", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name_", "type": "string" }, { "internalType": "string", "name": "symbol_", "type": "string" }, { "components": [ { "internalType": "uint24[]", "name": "feeTiers", "type": "uint24[]" }, { "internalType": "address", "name": "token0", "type": "address" }, { "internalType": "address", "name": "token1", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "init0", "type": "uint256" }, { "internalType": "uint256", "name": "init1", "type": "uint256" }, { "internalType": "address", "name": "manager", "type": "address" }, { "internalType": "address[]", "name": "routers", "type": "address[]" } ], "internalType": "struct InitializePayload", "name": "params_", "type": "tuple" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "manager", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "managerBalance0", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "managerBalance1", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "managerFeeBPS", "outputs": [ { "internalType": "uint16", "name": "", "type": "uint16" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "mintAmount_", "type": "uint256" }, { "internalType": "address", "name": "receiver_", "type": "address" } ], "name": "mint", "outputs": [ { "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "components": [ { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "components": [ { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" }, { "internalType": "uint24", "name": "feeTier", "type": "uint24" } ], "internalType": "struct Range", "name": "range", "type": "tuple" } ], "internalType": "struct PositionLiquidity[]", "name": "burns", "type": "tuple[]" }, { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "components": [ { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" }, { "internalType": "uint24", "name": "feeTier", "type": "uint24" } ], "internalType": "struct Range", "name": "range", "type": "tuple" } ], "internalType": "struct PositionLiquidity[]", "name": "mints", "type": "tuple[]" }, { "components": [ { "internalType": "bytes", "name": "payload", "type": "bytes" }, { "internalType": "address", "name": "router", "type": "address" }, { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "expectedMinReturn", "type": "uint256" }, { "internalType": "bool", "name": "zeroForOne", "type": "bool" } ], "internalType": "struct SwapPayload", "name": "swap", "type": "tuple" }, { "internalType": "uint256", "name": "minBurn0", "type": "uint256" }, { "internalType": "uint256", "name": "minBurn1", "type": "uint256" }, { "internalType": "uint256", "name": "minDeposit0", "type": "uint256" }, { "internalType": "uint256", "name": "minDeposit1", "type": "uint256" } ], "internalType": "struct Rebalance", "name": "rebalanceParams_", "type": "tuple" } ], "name": "rebalance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "pools_", "type": "address[]" } ], "name": "removePools", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "restrictedMint", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "feeManager_", "type": "address" } ], "name": "setFeeManager", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "init0_", "type": "uint256" }, { "internalType": "uint256", "name": "init1_", "type": "uint256" } ], "name": "setInits", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "manager_", "type": "address" } ], "name": "setManager", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint16", "name": "managerFeeBPS_", "type": "uint16" } ], "name": "setManagerFeeBPS", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "minter_", "type": "address" } ], "name": "setRestrictedMint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token0", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token1", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount0Owed_", "type": "uint256" }, { "internalType": "uint256", "name": "amount1Owed_", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "uniswapV3MintCallback", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "routers_", "type": "address[]" } ], "name": "whitelistRouters", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "withdrawManagerBalance", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
60a06040523480156200001157600080fd5b5060405162005ee538038062005ee5833981016040819052620000349162000088565b806001600160a01b038116620000755760405162461bcd60e51b81526020600482015260026024820152612d2360f11b604482015260640160405180910390fd5b6001600160a01b031660805250620000ba565b6000602082840312156200009b57600080fd5b81516001600160a01b0381168114620000b357600080fd5b9392505050565b608051615dde620001076000396000818161046c01528181610c9d015281816118d40152818161211f015281816124e3015281816131a7015281816139d40152613d580152615dde6000f3fe608060405234801561001057600080fd5b50600436106102345760003560e01c80638712e49711610131578063ccdf7a02116100b3578063ccdf7a02146104a9578063d0ebdbe7146104ca578063d0fb0203146104dd578063d21220a7146104f0578063d348799714610503578063dd62ed3e14610516578063e4fadbce14610529578063f2eb3e341461053c578063f2fde38b14610545578063f88c31ce14610558578063fcd3533c1461056057600080fd5b80638712e497146103d05780638da5cb5b146103e357806392e49dfd146103eb57806394bf804d146103fe57806395d89b4114610426578063a457c2d71461042e578063a5ff1dc714610441578063a9059cbb14610454578063c45a015514610467578063c7a4ae171461048e578063c8796572146104a157600080fd5b806342fb9d44116101ba57806342fb9d441461031b578063472d35b9146103245780634794c84a14610337578063481c6a751461034a5780634b1641401461035d578063617a341914610370578063673a2a1f1461038557806370a082311461039a578063715018a6146103ad5780637ecd6717146103b557806386ac1cb9146103bd57600080fd5b8063065756db1461023957806306fdde0314610255578063095ea7b31461026a5780630d6e66311461028d5780630dfe1681146102a257806314b80630146102c257806318160ddd146102cb57806323b872dd146102d3578063313ce567146102e657806339509351146102f55780633f7b613514610308575b600080fd5b61024260ce5481565b6040519081526020015b60405180910390f35b61025d610573565b60405161024c9190614dc7565b61027d610278366004614e1a565b610605565b604051901515815260200161024c565b6102a061029b366004614e46565b61061f565b005b60c9546102b5906001600160a01b031681565b60405161024c9190614e70565b61024260cb5481565b606754610242565b61027d6102e1366004614e84565b6106ad565b6040516012815260200161024c565b61027d610303366004614e1a565b6106d3565b6102a0610316366004614ec5565b6106f5565b61024260cf5481565b6102a0610332366004614e46565b6107df565b6102a0610345366004614ee7565b610857565b60d0546102b5906001600160a01b031681565b6102a061036b366004614f56565b610918565b610378610a38565b60405161024c9190614fbe565b61038d610ab8565b60405161024c919061500c565b6102426103a8366004614e46565b610b67565b6102a0610b82565b6102a0610881565b6102a06103cb366004614f56565b610bc4565b6102a06103de36600461504d565b610c44565b6102b5611e3e565b6102a06103f9366004614f56565b611e4d565b61041161040c366004615087565b611f59565b6040805192835260208301919091520161024c565b61025d61271b565b61027d61043c366004614e1a565b61272a565b6102a061044f366004614f56565b6127b0565b61027d610462366004614e1a565b6127ed565b6102b57f000000000000000000000000000000000000000000000000000000000000000081565b60d1546102b5906001600160a01b031681565b6102a06127fb565b60cd546104b79061ffff1681565b60405161ffff909116815260200161024c565b6102a06104d8366004614e46565b612919565b60d2546102b5906001600160a01b031681565b60ca546102b5906001600160a01b031681565b6102a06105113660046150f8565b6129c2565b61024261052436600461514a565b6129d2565b6102a0610537366004615178565b6129fd565b61024260cc5481565b6102a0610553366004614e46565b612e71565b61038d612f11565b61041161056e366004615087565b612fb9565b60606068805461058290615213565b80601f01602080910402602001604051908101604052809291908181526020018280546105ae90615213565b80156105fb5780601f106105d0576101008083540402835291602001916105fb565b820191906000526020600020905b8154815290600101906020018083116105de57829003601f168201915b5050505050905090565b600033610613818585613601565b60019150505b92915050565b33610628611e3e565b6001600160a01b0316146106575760405162461bcd60e51b815260040161064e9061524d565b60405180910390fd5b60d180546001600160a01b0319166001600160a01b0383161790556040517f6b7f177e85ebe3aabaf1339b9a445ac908b2bef730372180fa280958e2414ee3906106a2908390614e70565b60405180910390a150565b6000336106bb858285613725565b6106c6858585613799565b60019150505b9392505050565b6000336106138185856106e683836129d2565b6106f09190615298565b613601565b60008211806107045750600081115b6107205760405162461bcd60e51b815260040161064e906152b0565b606754156107405760405162461bcd60e51b815260040161064e906152cb565b60d1546000906001600160a01b0316156107655760d1546001600160a01b031661076d565b61076d611e3e565b9050336001600160a01b038216146107975760405162461bcd60e51b815260040161064e906152e7565b60cb83905560cc82905560408051848152602081018490527ff8966e026442bb0adb17149a6d44e394d2b6eb3c5cc1dc71b3c0698000548ae6910160405180910390a1505050565b336107e8611e3e565b6001600160a01b03161461080e5760405162461bcd60e51b815260040161064e9061524d565b6002609754036108305760405162461bcd60e51b815260040161064e90615302565b60d280546001600160a01b0319166001600160a01b03929092169190911790556001609755565b60d0546001600160a01b031633146108815760405162461bcd60e51b815260040161064e90615339565b6002609754036108a35760405162461bcd60e51b815260040161064e90615302565b600260975560405162461bcd60e51b815260206004820152602f60248201527f5468697320666561747572652069732064697361626c656420696e207468652060448201526e31bab93932b73a103b32b939b4b7b760891b606482015260840161064e565b60405180910390a1506001609755565b33610921611e3e565b6001600160a01b0316146109475760405162461bcd60e51b815260040161064e9061524d565b60005b818110156109fa5761098483838381811061096757610967615355565b905060200201602081019061097c9190614e46565b60d490613b57565b6109b55760405162461bcd60e51b815260206004820152600260248201526104e560f41b604482015260640161064e565b6109e78383838181106109ca576109ca615355565b90506020020160208101906109df9190614e46565b60d490613b79565b50806109f28161536b565b91505061094a565b507f024551cce253d1a442bfe99dae530a00a492fb8c67c4456cce3c9d23eecd39618282604051610a2c929190615384565b60405180910390a15050565b606060d3805480602002602001604051908101604052809291908181526020016000905b82821015610aaf5760008481526020908190206040805160608101825291850154600281810b845263010000008204900b83850152600160301b900462ffffff1690820152825260019092019101610a5c565b50505050905090565b60606000610ac660d4613b8e565b90506000816001600160401b03811115610ae257610ae26153d2565b604051908082528060200260200182016040528015610b0b578160200160208202803683370190505b50905060005b82811015610b6057610b2460d482613b98565b828281518110610b3657610b36615355565b6001600160a01b039092166020928302919091019091015280610b588161536b565b915050610b11565b5092915050565b6001600160a01b031660009081526065602052604090205490565b33610b8b611e3e565b6001600160a01b031614610bb15760405162461bcd60e51b815260040161064e9061524d565b610bbb6000613ba4565b565b6001609755565b33610bcd611e3e565b6001600160a01b031614610bf35760405162461bcd60e51b815260040161064e9061524d565b60c95460ca54610c1391849184916001600160a01b039081169116613d49565b7f1b402611d70c7735d942445aaa3ebbf878149bece6b797870b44a581c5f7f4c98282604051610a2c9291906153f9565b60d0546001600160a01b03163314610c6e5760405162461bcd60e51b815260040161064e90615339565b600260975403610c905760405162461bcd60e51b815260040161064e90615302565b600260975560c95460ca547f0000000000000000000000000000000000000000000000000000000000000000916001600160a01b039081169116610cd26127fb565b610cda614ca1565b60005b610ce78680615438565b90508110156111c65760006001600160a01b038616631698ee828686610d0d8b80615438565b87818110610d1d57610d1d615355565b610d34926080918202019081019150606001615481565b6040518463ffffffff1660e01b8152600401610d529392919061549e565b602060405180830381865afa158015610d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9391906154c6565b905060007397c4cce15b14321cfb63ed038440e6379ce70e90635f49415b8330610dbd8c80615438565b88818110610dcd57610dcd615355565b610de692604060809092020190810191506020016154f2565b610df08d80615438565b89818110610e0057610e00615355565b610e1992606060809092020190810191506040016154f2565b6040518563ffffffff1660e01b8152600401610e38949392919061550f565b602060405180830381865af4158015610e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e799190615553565b9050806001600160801b0316600003610e935750506111b4565b60006001600160801b03610ea78a80615438565b86818110610eb757610eb7615355565b610ecd9260206080909202019081019150615570565b6001600160801b031603610ee2575080610f15565b610eec8980615438565b85818110610efc57610efc615355565b610f129260206080909202019081019150615570565b90505b6000610f8784610f258c80615438565b88818110610f3557610f35615355565b610f4e92604060809092020190810191506020016154f2565b610f588d80615438565b89818110610f6857610f68615355565b610f8192606060809092020190810191506040016154f2565b85613e99565b9050826001600160801b0316826001600160801b031603611150576000807397c4cce15b14321cfb63ed038440e6379ce70e90630c3c0bfc60d3610fcb8f80615438565b8b818110610fdb57610fdb615355565b9050608002016020016040518363ffffffff1660e01b81526004016110019291906155d1565b6040805180830381865af415801561101d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611041919061565a565b915091508161107b5760405162461bcd60e51b815260040161064e9060208082526004908201526352524e4560e01b604082015260600190565b60d3805461108b90600190615688565b8154811061109b5761109b615355565b9060005260206000200160d382815481106110b8576110b8615355565b6000918252602090912082549101805462ffffff92831662ffffff19821681178355845463010000009081900485160265ffffffffffff1990921617178082559254600160301b9081900490921690910262ffffff60301b1990921691909117905560d380548061112b5761112b61569f565b600082815260209020810160001990810180546001600160481b031916905501905550505b805186518790611161908390615298565b905250602080820151908701805161117a908390615298565b9052506040808201519087018051611193908390615298565b90525060608082015190870180516111ac908390615298565b905250505050505b806111be8161536b565b915050610cdd565b508051606086013511156112015760405162461bcd60e51b8152602060048201526002602482015261042360f41b604482015260640161064e565b84608001358160200151101561123e5760405162461bcd60e51b8152602060048201526002602482015261423160f01b604482015260640161064e565b600081604001511180611255575060008160600151115b1561129b5761126c81604001518260600151613f5d565b604080820151606083015182519182526020820152600080516020615d69833981519152910160405180910390a15b5060006112ab60408601866156b5565b6040013511156117c3576112de6112c560408601866156b5565b6112d6906040810190602001614e46565b60d690613b57565b61130f5760405162461bcd60e51b8152602060048201526002602482015261272960f11b604482015260640161064e565b6040516370a0823160e01b81526000906001600160a01b038416906370a082319061133e903090600401614e70565b602060405180830381865afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f91906156d5565b90506000826001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016113af9190614e70565b602060405180830381865afa1580156113cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f091906156d5565b905061142561140260408801886156b5565b611413906040810190602001614e46565b6001600160a01b038616906000613fc8565b61145861143560408801886156b5565b611446906040810190602001614e46565b6001600160a01b038516906000613fc8565b61148a61146860408801886156b5565b611479906040810190602001614e46565b6001600160a01b0386169084613fc8565b6114bc61149a60408801886156b5565b6114ab906040810190602001614e46565b6001600160a01b0385169083613fc8565b60006114cb60408801886156b5565b6114dc906040810190602001614e46565b6001600160a01b03166114f260408901896156b5565b6114fc90806156ee565b60405161150a929190615734565b6000604051808303816000865af19150503d8060008114611547576040519150601f19603f3d011682016040523d82523d6000602084013e61154c565b606091505b50509050806115825760405162461bcd60e51b8152602060048201526002602482015261534360f01b604482015260640161064e565b6040516370a0823160e01b81526000906001600160a01b038716906370a08231906115b1903090600401614e70565b602060405180830381865afa1580156115ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f291906156d5565b90506000856001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016116229190614e70565b602060405180830381865afa15801561163f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166391906156d5565b905061167260408a018a6156b5565b6116839060a081019060800161574f565b156117055761169560408a018a6156b5565b6116a3906060013585615298565b81101580156116cc57506116ba60408a018a6156b5565b6116c8906040013586615688565b8210155b6116e85760405162461bcd60e51b815260040161064e9061576c565b6116f28286615688565b91506116fe8482615688565b905061177e565b61171260408a018a6156b5565b611720906060013586615298565b8210158015611749575061173760408a018a6156b5565b611745906040013585615688565b8110155b6117655760405162461bcd60e51b815260040161064e9061576c565b61176f8583615688565b915061177b8185615688565b90505b7fab3abe7e2ad787892344ed4ada44aad53c7d53e9d6b5ee91f20bd30ed39540b78983836040516117b193929190615994565b60405180910390a15050505050611800565b7fab3abe7e2ad787892344ed4ada44aad53c7d53e9d6b5ee91f20bd30ed39540b7846000806040516117f793929190615994565b60405180910390a15b60008060005b6118136020880188615438565b9050811015611c6e5760007397c4cce15b14321cfb63ed038440e6379ce70e90630c3c0bfc60d361184760208c018c615438565b8681811061185757611857615355565b9050608002016020016040518363ffffffff1660e01b815260040161187d9291906155d1565b6040805180830381865af4158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd919061565a565b5060c95460ca549192506000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692631698ee8292908216911661190e60208e018e615438565b8881811061191e5761191e615355565b611935926080918202019081019150606001615481565b6040518463ffffffff1660e01b81526004016119539392919061549e565b602060405180830381865afa158015611970573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199491906154c6565b905081611b21576001600160a01b0381166119d75760405162461bcd60e51b815260206004820152600360248201526204e55560ec1b604482015260640161064e565b6119e260d482613b57565b6119fe5760405162461bcd60e51b815260040161064e906159b9565b737d6a22ab283b981ef507fdfceb6fc7d8189391f2636b01882082611a2660208d018d615438565b87818110611a3657611a36615355565b9050608002016020016040518363ffffffff1660e01b8152600401611a5c9291906159d4565b602060405180830381865af4158015611a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9d91906159f1565b611acf5760405162461bcd60e51b815260206004820152600360248201526252545360e81b604482015260640161064e565b60d3611ade60208b018b615438565b85818110611aee57611aee615355565b8354600181018555600094855260209485902060809092029390930193909301929091019050611b1e8282615a0e565b50505b6000806001600160a01b038316633c8a7d8d30611b4160208f018f615438565b89818110611b5157611b51615355565b611b6a92604060809092020190810191506020016154f2565b8e8060200190611b7a9190615438565b8a818110611b8a57611b8a615355565b611ba392606060809092020190810191506040016154f2565b8f8060200190611bb39190615438565b8b818110611bc357611bc3615355565b611bd99260206080909202019081019150615570565b6040518563ffffffff1660e01b8152600401611bf89493929190615a95565b60408051808303816000875af1158015611c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3a9190615ad7565b9092509050611c498288615298565b9650611c558187615298565b9550505050508080611c669061536b565b915050611806565b508560a00135821015611ca85760405162461bcd60e51b8152602060048201526002602482015261044360f41b604482015260640161064e565b8560c00135811015611ce15760405162461bcd60e51b8152602060048201526002602482015261443160f01b604482015260640161064e565b60ce5460c9546040516370a0823160e01b81526001600160a01b03909116906370a0823190611d14903090600401614e70565b602060405180830381865afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5591906156d5565b1015611d895760405162461bcd60e51b815260206004820152600360248201526204d42360ec1b604482015260640161064e565b60cf5460ca546040516370a0823160e01b81526001600160a01b03909116906370a0823190611dbc903090600401614e70565b602060405180830381865afa158015611dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfd91906156d5565b1015611e315760405162461bcd60e51b81526020600482015260036024820152624d423160e81b604482015260640161064e565b5050600160975550505050565b6033546001600160a01b031690565b33611e56611e3e565b6001600160a01b031614611e7c5760405162461bcd60e51b815260040161064e9061524d565b60005b81811015611f2757611eb1838383818110611e9c57611e9c615355565b90506020020160208101906112d69190614e46565b611ee25760405162461bcd60e51b8152602060048201526002602482015261525760f01b604482015260640161064e565b611f14838383818110611ef757611ef7615355565b9050602002016020810190611f0c9190614e46565b60d690613b79565b5080611f1f8161536b565b915050611e7f565b507fbe6c83115c5bf7fd07e41c6002394841bd7dc0348f3b7c58645e8950f604f5c48282604051610a2c929190615384565b600080600260975403611f7e5760405162461bcd60e51b815260040161064e90615302565b600260975583611fb55760405162461bcd60e51b81526020600482015260026024820152614d4160f01b604482015260640161064e565b60d1546001600160a01b03161580611fd7575060d1546001600160a01b031633145b611ff35760405162461bcd60e51b815260040161064e906152e7565b306000611fff60675490565b905080151561200c6127fb565b60d254604051630ad0753560e11b81526001600160a01b03909116906315a0ea6a9061203c908990600401614e70565b600060405180830381600087803b15801561205657600080fd5b505af115801561206a573d6000803e3d6000fd5b5050505080156121d65773930df353d540846ed2a3ecf164880812f3bc43ea6383d7ba9f6040518060a0016040528060d3805480602002602001604051908101604052809291908181526020016000905b8282101561210e5760008481526020908190206040805160608101825291850154600281810b845263010000008204900b83850152600160301b900462ffffff16908201528252600190920191016120bb565b505050908252506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116602083015260c954811660408084019190915260ca5482166060840152908816608090920191909152516001600160e01b031960e084901b16815261218c91908b908790600401615afb565b6040805180830381865af41580156121a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cc9190615ad7565b90955093506122b8565b60cb5460cc54670de0b6b3a764000091906121f28a8385614108565b97506121ff8a8285614108565b965061220c8a8385614151565b60000361221857600097505b6122238a8285614151565b60000361222f57600096505b6000826000036122415760001961224c565b61224c898585614151565b90506000826000036122605760001961226b565b61226b898685614151565b90508b81831061227b578161227d565b825b146122b25760405162461bcd60e51b8152602060048201526005602482015264413026413160d81b604482015260640161064e565b50505050505b6122c286886141ff565b60d2546001600160a01b0316634158e3e3876123d36122e082610b67565b60d260009054906101000a90046001600160a01b03166001600160a01b031663061960aa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612333573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235791906156d5565b60d260009054906101000a90046001600160a01b03166001600160a01b03166386b3cd266040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ce91906156d5565b614151565b6040518363ffffffff1660e01b81526004016123f0929190615baf565b600060405180830381600087803b15801561240a57600080fd5b505af115801561241e573d6000803e3d6000fd5b5050505060008511156124435760c954612443906001600160a01b03163385886142cc565b83156124615760ca54612461906001600160a01b03163385876142cc565b80156126be5760005b60d3548110156126bc57600060d3828154811061248957612489615355565b60009182526020808320604080516060810182529390910154600281810b855263010000008204900b92840192909252600160301b90910462ffffff1682820181905260c95460ca549251630b4c774160e11b81529395507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811694631698ee829461252894938316939216919060040161549e565b602060405180830381865afa158015612545573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256991906154c6565b82516020840151604051635f49415b60e01b81529293506000927397c4cce15b14321cfb63ed038440e6379ce70e9092635f49415b926125b19287928d92909160040161550f565b602060405180830381865af41580156125ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f29190615553565b905061261061260b826001600160801b03168d89614151565b614304565b9050806001600160801b031660000361262b575050506126aa565b82516020840151604051633c8a7d8d60e01b81526001600160a01b03851692633c8a7d8d92612662928c9291908790600401615a95565b60408051808303816000875af1158015612680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a49190615ad7565b50505050505b806126b48161536b565b91505061246a565b505b60408051888152602081018790529081018590526001600160a01b038716907f5f11830295067c4bcc7d02d4e3b048cd7427be50a3aeb6afc9d3d559ee64bcfa9060600160405180910390a2505060016097555090939092509050565b60606069805461058290615213565b6000338161273882866129d2565b9050838110156127985760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161064e565b6127a58286868403613601565b506001949350505050565b336127b9611e3e565b6001600160a01b0316146127df5760405162461bcd60e51b815260040161064e9061524d565b6127e98282614371565b5050565b600033610613818585613799565b60d2546001600160a01b03166128395760405162461bcd60e51b81526020600482015260036024820152624e464d60e81b604482015260640161064e565b60675460000361284557565b600080612850613955565b909250905081156128785760d25460c954612878916001600160a01b03918216911684613fc8565b801561289b5760d25460ca5461289b916001600160a01b03918216911683613fc8565b60d25460c95460ca546040516375a9f56d60e01b81526001600160a01b039283166004820152602481018690529082166044820152606481018490529116906375a9f56d90608401600060405180830381600087803b1580156128fd57600080fd5b505af1158015612911573d6000803e3d6000fd5b505050505050565b33612922611e3e565b6001600160a01b0316146129485760405162461bcd60e51b815260040161064e9061524d565b60026097540361296a5760405162461bcd60e51b815260040161064e90615302565b6002609755612977613bf6565b60d080546001600160a01b0319166001600160a01b0383161790556040517f9b6ffaf4cbfd923495440b7f17ced9394289f001b3ead53ab67e2c3f3e39b0f590610908908390614e70565b6129cc84846144ef565b50505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b6000612a096001614565565b90508015612a21576000805461ff0019166101001790555b6000612a2d8380615bc8565b905011612a625760405162461bcd60e51b815260206004820152600360248201526213919560ea1b604482015260640161064e565b6000612a746040840160208501614e46565b6001600160a01b031603612aaf5760405162461bcd60e51b8152602060048201526002602482015261054360f41b604482015260640161064e565b612abf6060830160408401614e46565b6001600160a01b0316612ad86040840160208501614e46565b6001600160a01b031610612b145760405162461bcd60e51b815260206004820152600360248201526257544f60e81b604482015260640161064e565b6000612b266080840160608501614e46565b6001600160a01b031603612b625760405162461bcd60e51b815260206004820152600360248201526227a0ad60e91b604482015260640161064e565b6000612b7460e0840160c08501614e46565b6001600160a01b031603612bb05760405162461bcd60e51b815260206004820152600360248201526226a0ad60e91b604482015260640161064e565b600082608001351180612bc7575060008260a00135115b612be35760405162461bcd60e51b815260040161064e906152b0565b612c5686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506145f292505050565b612c5e614623565b612c90612c6b8380615bc8565b612c7b6040860160208701614e46565b612c8b6060870160408801614e46565b613d49565b612ca06040830160208401614e46565b60c980546001600160a01b0319166001600160a01b0392909216919091179055612cd06060830160408401614e46565b60ca80546001600160a01b0319166001600160a01b0392909216919091179055612d05612d0060e0840184615bc8565b614371565b612d1d612d186080840160608501614e46565b613ba4565b612d2d60e0830160c08401614e46565b60d080546001600160a01b0319166001600160a01b0392909216919091179055608082013560cb5560a082013560cc557f1b402611d70c7735d942445aaa3ebbf878149bece6b797870b44a581c5f7f4c9612d888380615bc8565b604051612d969291906153f9565b60405180910390a1604080516080840135815260a084013560208201527ff8966e026442bb0adb17149a6d44e394d2b6eb3c5cc1dc71b3c0698000548ae6910160405180910390a17f9b6ffaf4cbfd923495440b7f17ced9394289f001b3ead53ab67e2c3f3e39b0f5612e0f60e0840160c08501614e46565b604051612e1c9190614e70565b60405180910390a18015612911576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b33612e7a611e3e565b6001600160a01b031614612ea05760405162461bcd60e51b815260040161064e9061524d565b6001600160a01b038116612f055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161064e565b612f0e81613ba4565b50565b60606000612f1f60d6613b8e565b90506000816001600160401b03811115612f3b57612f3b6153d2565b604051908082528060200260200182016040528015612f64578160200160208202803683370190505b50905060005b82811015610b6057612f7d60d682613b98565b828281518110612f8f57612f8f615355565b6001600160a01b039092166020928302919091019091015280612fb18161536b565b915050612f6a565b600080600260975403612fde5760405162461bcd60e51b815260040161064e90615302565b6002609755836130155760405162461bcd60e51b8152602060048201526002602482015261424160f01b604482015260640161064e565b600061302060675490565b9050600081116130425760405162461bcd60e51b815260040161064e906152cb565b61304a6127fb565b60d254604051630ad0753560e11b81526001600160a01b03909116906315a0ea6a9061307a903390600401614e70565b600060405180830381600087803b15801561309457600080fd5b505af11580156130a8573d6000803e3d6000fd5b505050506130b63386614652565b60d2546001600160a01b0316634158e3e3336130d46122e082610b67565b6040518363ffffffff1660e01b81526004016130f1929190615baf565b600060405180830381600087803b15801561310b57600080fd5b505af115801561311f573d6000803e3d6000fd5b5050505061312b614ca1565b60005b60d35481101561337857600060d3828154811061314d5761314d615355565b60009182526020808320604080516060810182529390910154600281810b855263010000008204900b92840192909252600160301b90910462ffffff1682820181905260c95460ca549251630b4c774160e11b81529395507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811694631698ee82946131ec94938316939216919060040161549e565b602060405180830381865afa158015613209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322d91906154c6565b82516020840151604051635f49415b60e01b81529293506000927397c4cce15b14321cfb63ed038440e6379ce70e9092635f49415b926132759287923092909160040161550f565b602060405180830381865af4158015613292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b69190615553565b90506132cf61260b826001600160801b03168c89614151565b9050806001600160801b03166000036132ea57505050613366565b6000613300838560000151866020015185613e99565b90508060400151866040018181516133189190615298565b9052506060808201519087018051613331908390615298565b905250805186518790613345908390615298565b905250602080820151908701805161335e908390615298565b905250505050505b806133708161536b565b91505061312e565b5081860361338c5761338c60d36000614cc9565b61339e81604001518260600151613f5d565b805160ce5460c9546040516370a0823160e01b815260009392916001600160a01b0316906370a08231906133d6903090600401614e70565b602060405180830381865afa1580156133f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341791906156d5565b6134219190615688565b61342b9190615688565b602083015160cf5460ca546040516370a0823160e01b81529394506000936001600160a01b03909116906370a0823190613469903090600401614e70565b602060405180830381865afa158015613486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134aa91906156d5565b6134b49190615688565b6134be9190615688565b90506134cb828986614151565b95506134d8818986614151565b83519095506134e79087615298565b95508260200151856134f99190615298565b945085156135185760c954613518906001600160a01b0316888861478e565b84156135355760ca54613535906001600160a01b0316888761478e565b8251602080850151604080519384529183015233917fbcc5876d59ecdf66ef7ccae24657b11650939218782f8d741e78fd3c35d285a3910160405180910390a2604080840151606085015182519182526020820152600080516020615d69833981519152910160405180910390a160408051898152602081018890529081018690526001600160a01b038816907f86dacd5ce62967ebd3d915a82b22ad7e159538e50c7ba451e073fec048d9f1279060600160405180910390a250506001609755509194909350915050565b6001600160a01b0383166136635760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161064e565b6001600160a01b0382166136c45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161064e565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061373184846129d2565b905060001981146129cc578181101561378c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064e565b6129cc8484848403613601565b6001600160a01b0383166137fd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161064e565b6001600160a01b03821661385f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161064e565b6001600160a01b038316600090815260656020526040902054818110156138d75760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161064e565b6001600160a01b0380851660009081526065602052604080822085850390559185168152908120805484929061390e908490615298565b92505081905550826001600160a01b0316846001600160a01b0316600080516020615d898339815191528460405161394891815260200190565b60405180910390a36129cc565b60008060005b60d354811015613b2157600060d3828154811061397a5761397a615355565b60009182526020808320604080516060810182529390910154600281810b855263010000008204900b92840192909252600160301b90910462ffffff1682820181905260c95460ca549251630b4c774160e11b81529395507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811694631698ee8294613a1994938316939216919060040161549e565b602060405180830381865afa158015613a36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5a91906154c6565b8251602084015160405163a34123a760e01b81529293506001600160a01b0384169263a34123a792613a93929091600090600401615c11565b60408051808303816000875af1158015613ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad59190615ad7565b5050600080613aed83856000015186602001516147ad565b9092509050613afc8288615298565b9650613b088187615298565b9550505050508080613b199061536b565b91505061395b565b50613b2c8282613f5d565b6040805183815260208101839052600080516020615d69833981519152910160405180910390a19091565b6001600160a01b038116600090815260018301602052604081205415156106cc565b60006106cc836001600160a01b038416614858565b6000610619825490565b60006106cc838361494b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60ce805460cf8054600093849055929055908115613c8e5760c95460d05460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92613c44929116908690600401615baf565b6020604051808303816000875af1925050508015613c7f575060408051601f3d908101601f19168201909252613c7c918101906159f1565b60015b613c8c5760009150613c8e565b505b8015613d135760ca5460d05460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92613cca929116908590600401615baf565b6020604051808303816000875af1925050508015613d05575060408051601f3d908101601f19168201909252613d02918101906159f1565b60015b613d1157506000613d13565b505b60408051838152602081018390527fa292e28c648da34e20b372054caab5f0359198b3b4d5f0ef9945d4616e15dc979101610a2c565b60005b83811015613e925760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828585898987818110613d9957613d99615355565b9050602002016020810190613dae9190615481565b6040518463ffffffff1660e01b8152600401613dcc9392919061549e565b602060405180830381865afa158015613de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e0d91906154c6565b90506001600160a01b038116613e4a5760405162461bcd60e51b81526020600482015260026024820152615a4160f01b604482015260640161064e565b613e5560d482613b57565b15613e725760405162461bcd60e51b815260040161064e906159b9565b613e7d60d482614975565b50508080613e8a9061536b565b915050613d4c565b5050505050565b613ea1614ca1565b60405163a34123a760e01b81526001600160a01b0386169063a34123a790613ed190879087908790600401615c11565b60408051808303816000875af1158015613eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f139190615ad7565b60208301528152600080613f288787876147ad565b84519193509150613f399083615688565b60408401526020830151613f4d9082615688565b6060840152509095945050505050565b60cd5461ffff16612710613f718285615c37565b613f7b9190615c6c565b60ce6000828254613f8c9190615298565b909155506127109050613fa361ffff831684615c37565b613fad9190615c6c565b60cf6000828254613fbe9190615298565b9091555050505050565b8015806140425750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561401c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061404091906156d5565b155b6140ad5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161064e565b6141038363095ea7b360e01b84846040516024016140cc929190615baf565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261498a565b505050565b6000614115848484614151565b90506000828061412757614127615c56565b84860911156106cc57600019811061413e57600080fd5b806141488161536b565b95945050505050565b600080806000198587098587029250828110838203039150508060000361418a576000841161417f57600080fd5b5082900490506106cc565b80841161419657600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6001600160a01b0382166142555760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064e565b80606760008282546142679190615298565b90915550506001600160a01b03821660009081526065602052604081208054839290614294908490615298565b90915550506040518181526001600160a01b03831690600090600080516020615d898339815191529060200160405180910390a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526129cc9085906323b872dd60e01b906084016140cc565b60006001600160801b0382111561436d5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b606482015260840161064e565b5090565b60005b818110156144bd5760c9546001600160a01b031683838381811061439a5761439a615355565b90506020020160208101906143af9190614e46565b6001600160a01b031614158015614400575060ca546001600160a01b03168383838181106143df576143df615355565b90506020020160208101906143f49190614e46565b6001600160a01b031614155b6144315760405162461bcd60e51b8152602060048201526002602482015261149560f21b604482015260640161064e565b614446838383818110611e9c57611e9c615355565b156144785760405162461bcd60e51b815260206004820152600260248201526121a960f11b604482015260640161064e565b6144aa83838381811061448d5761448d615355565b90506020020160208101906144a29190614e46565b60d690614975565b50806144b58161536b565b915050614374565b507f102656122b5bfb41d864259a385db02d34584f3a71b6c6c35c14cbdaf9038fe68282604051610a2c929190615384565b6144fa60d433613b57565b61452b5760405162461bcd60e51b8152602060048201526002602482015261434360f01b604482015260640161064e565b81156145485760c954614548906001600160a01b0316338461478e565b80156127e95760ca546127e9906001600160a01b0316338361478e565b60008054610100900460ff16156145ac578160ff1660011480156145885750303b155b6145a45760405162461bcd60e51b815260040161064e90615c8e565b506000919050565b60005460ff8084169116106145d35760405162461bcd60e51b815260040161064e90615c8e565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff166146195760405162461bcd60e51b815260040161064e90615cdc565b6127e98282614a5c565b600054610100900460ff1661464a5760405162461bcd60e51b815260040161064e90615cdc565b610bbb614aaa565b6001600160a01b0382166146b25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161064e565b6001600160a01b038216600090815260656020526040902054818110156147265760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161064e565b6001600160a01b0383166000908152606560205260408120838303905560678054849290614755908490615688565b90915550506040518281526000906001600160a01b03851690600080516020615d898339815191529060200160405180910390a3505050565b6141038363a9059cbb60e01b84846040516024016140cc929190615baf565b6040516309e3d67b60e31b8152306004820152600283810b602483015282900b60448201526001600160801b0360648201819052608482015260009081906001600160a01b03861690634f1eb3d89060a40160408051808303816000875af115801561481d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148419190615d27565b6001600160801b0391821697911695509350505050565b6000818152600183016020526040812054801561494157600061487c600183615688565b855490915060009061489090600190615688565b90508181146148f55760008660000182815481106148b0576148b0615355565b90600052602060002001549050808760000184815481106148d3576148d3615355565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806149065761490661569f565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610619565b6000915050610619565b600082600001828154811061496257614962615355565b9060005260206000200154905092915050565b60006106cc836001600160a01b038416614ad1565b60006149df826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b209092919063ffffffff16565b80519091501561410357808060200190518101906149fd91906159f1565b6141035760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161064e565b600054610100900460ff16614a835760405162461bcd60e51b815260040161064e90615cdc565b8151614a96906068906020850190614ce7565b508051614103906069906020840190614ce7565b600054610100900460ff16610bbd5760405162461bcd60e51b815260040161064e90615cdc565b6000818152600183016020526040812054614b1857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610619565b506000610619565b6060614b2f8484600085614b37565b949350505050565b606082471015614b985760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161064e565b6001600160a01b0385163b614bef5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161064e565b600080866001600160a01b03168587604051614c0b9190615d56565b60006040518083038185875af1925050503d8060008114614c48576040519150601f19603f3d011682016040523d82523d6000602084013e614c4d565b606091505b5091509150614c5d828286614c68565b979650505050505050565b60608315614c775750816106cc565b825115614c875782518084602001fd5b8160405162461bcd60e51b815260040161064e9190614dc7565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b5080546000825590600052602060002090810190612f0e9190614d67565b828054614cf390615213565b90600052602060002090601f016020900481019282614d155760008555614d5b565b82601f10614d2e57805160ff1916838001178555614d5b565b82800160010185558215614d5b579182015b82811115614d5b578251825591602001919060010190614d40565b5061436d929150614d86565b5b8082111561436d5780546001600160481b0319168155600101614d68565b5b8082111561436d5760008155600101614d87565b60005b83811015614db6578181015183820152602001614d9e565b838111156129cc5750506000910152565b6020815260008251806020840152614de6816040850160208701614d9b565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612f0e57600080fd5b80356145ed81614dfa565b60008060408385031215614e2d57600080fd5b8235614e3881614dfa565b946020939093013593505050565b600060208284031215614e5857600080fd5b81356106cc81614dfa565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b600080600060608486031215614e9957600080fd5b8335614ea481614dfa565b92506020840135614eb481614dfa565b929592945050506040919091013590565b60008060408385031215614ed857600080fd5b50508035926020909101359150565b600060208284031215614ef957600080fd5b813561ffff811681146106cc57600080fd5b60008083601f840112614f1d57600080fd5b5081356001600160401b03811115614f3457600080fd5b6020830191508360208260051b8501011115614f4f57600080fd5b9250929050565b60008060208385031215614f6957600080fd5b82356001600160401b03811115614f7f57600080fd5b614f8b85828601614f0b565b90969095509350505050565b805160020b8252602081015160020b602083015262ffffff60408201511660408301525050565b6020808252825182820181905260009190848201906040850190845b8181101561500057614fed838551614f97565b9284019260609290920191600101614fda565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156150005783516001600160a01b031683529284019291840191600101615028565b60006020828403121561505f57600080fd5b81356001600160401b0381111561507557600080fd5b820160e081850312156106cc57600080fd5b6000806040838503121561509a57600080fd5b8235915060208301356150ac81614dfa565b809150509250929050565b60008083601f8401126150c957600080fd5b5081356001600160401b038111156150e057600080fd5b602083019150836020828501011115614f4f57600080fd5b6000806000806060858703121561510e57600080fd5b843593506020850135925060408501356001600160401b0381111561513257600080fd5b61513e878288016150b7565b95989497509550505050565b6000806040838503121561515d57600080fd5b823561516881614dfa565b915060208301356150ac81614dfa565b60008060008060006060868803121561519057600080fd5b85356001600160401b03808211156151a757600080fd5b6151b389838a016150b7565b909750955060208801359150808211156151cc57600080fd5b6151d889838a016150b7565b909550935060408801359150808211156151f157600080fd5b508601610100818903121561520557600080fd5b809150509295509295909350565b600181811c9082168061522757607f821691505b60208210810361524757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156152ab576152ab615282565b500190565b6020808252600190820152604960f81b604082015260600190565b602080825260029082015261545360f01b604082015260600190565b6020808252600190820152602960f91b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600290820152614e4d60f01b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161537d5761537d615282565b5060010190565b60208082528181018390526000908460408401835b868110156153c75782356153ac81614dfa565b6001600160a01b031682529183019190830190600101615399565b509695505050505050565b634e487b7160e01b600052604160045260246000fd5b62ffffff81168114612f0e57600080fd5b60208082528181018390526000908460408401835b868110156153c7578235615421816153e8565b62ffffff168252918301919083019060010161540e565b6000808335601e1984360301811261544f57600080fd5b8301803591506001600160401b0382111561546957600080fd5b6020019150600781901b3603821315614f4f57600080fd5b60006020828403121561549357600080fd5b81356106cc816153e8565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6000602082840312156154d857600080fd5b81516106cc81614dfa565b8060020b8114612f0e57600080fd5b60006020828403121561550457600080fd5b81356106cc816154e3565b6001600160a01b039485168152929093166020830152600290810b60408301529190910b606082015260800190565b6001600160801b0381168114612f0e57600080fd5b60006020828403121561556557600080fd5b81516106cc8161553e565b60006020828403121561558257600080fd5b81356106cc8161553e565b8035615598816154e3565b60020b825260208101356155ab816154e3565b60020b602083015260408101356155c1816153e8565b62ffffff81166040840152505050565b6000608082016080835280855480835260a08501915086600052602092508260002060005b82811015615631578154600281810b8652601882901c900b8686015260301c62ffffff166040850152606090930192600191820191016155f6565b505050809250506156448184018561558d565b509392505050565b8015158114612f0e57600080fd5b6000806040838503121561566d57600080fd5b82516156788161564c565b6020939093015192949293505050565b60008282101561569a5761569a615282565b500390565b634e487b7160e01b600052603160045260246000fd5b60008235609e198336030181126156cb57600080fd5b9190910192915050565b6000602082840312156156e757600080fd5b5051919050565b6000808335601e1984360301811261570557600080fd5b8301803591506001600160401b0382111561571f57600080fd5b602001915036819003821315614f4f57600080fd5b8183823760009101908152919050565b80356145ed8161564c565b60006020828403121561576157600080fd5b81356106cc8161564c565b60208082526002908201526129a360f11b604082015260600190565b6000808335601e1984360301811261579f57600080fd5b83016020810192503590506001600160401b038111156157be57600080fd5b8060071b3603831315614f4f57600080fd5b8183526000602080850194508260005b8581101561581f5781356157f38161553e565b6001600160801b0316875261580c83880183850161558d565b60809687019691909101906001016157e0565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008135601e1983360301811261586957600080fd5b820180356001600160401b0381111561588157600080fd5b80360384131561589057600080fd5b60a085526158a560a08601826020850161582a565b9150506158b460208401614e0f565b6158c16020860182614e63565b5060408301356040850152606083013560608501526158e260808401615744565b8015156080860152615644565b60006158fb8283615788565b60e0855261590d60e0860182846157d0565b91505061591d6020840184615788565b85830360208701526159308382846157d0565b925050506040830135609e1984360301811261594b57600080fd5b848203604086015261595f82858301615853565b915050606083013560608501526080830135608085015260a083013560a085015260c083013560c08501528091505092915050565b6060815260006159a760608301866158ef565b60208301949094525060400152919050565b6020808252600190820152600560fc1b604082015260600190565b6001600160a01b0383168152608081016106cc602083018461558d565b600060208284031215615a0357600080fd5b81516106cc8161564c565b8135615a19816154e3565b815462ffffff82811662ffffff1983161784556020850135615a3a816154e3565b8060181b9050818416935065ffffff00000091508082168465ffffffffffff198516171785556040860135615a6e816153e8565b91166001600160481b0319929092169092171760309190911b62ffffff60301b1617905550565b6001600160a01b03949094168452600292830b6020850152910b60408301526001600160801b0316606082015260a06080820181905260009082015260c00190565b60008060408385031215615aea57600080fd5b505080516020909101519092909150565b6060808252845160a083830152805161010084018190526000929160209190820190610120860190855b81811015615b4857615b38838551614f97565b9284019291850191600101615b25565b5050828901519150615b5d6080870183614e63565b60408901519150615b7160a0870183614e63565b9288015192615b8360c0870185614e63565b60808901519350615b9760e0870185614e63565b91850196909652604090930193909352509392505050565b6001600160a01b03929092168252602082015260400190565b6000808335601e19843603018112615bdf57600080fd5b8301803591506001600160401b03821115615bf957600080fd5b6020019150600581901b3603821315614f4f57600080fd5b600293840b81529190920b60208201526001600160801b03909116604082015260600190565b6000816000190483118215151615615c5157615c51615282565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615c8957634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008060408385031215615d3a57600080fd5b8251615d458161553e565b60208401519092506150ac8161553e565b600082516156cb818460208701614d9b56fedbbb3a796242c9562af701570b096cb2478cd507fcd2d4080025883b10a623a5ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207974f05b192dce9a95eff0ed231c61305047a99057a3ba7df8416f4c96264ab464736f6c634300080d003300000000000000000000000033128a8fc17869897dce68ed026d694621f6fdfd