[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AlreadyLinked", "type": "error" }, { "inputs": [], "name": "CannotLink", "type": "error" }, { "inputs": [], "name": "NotLinked", "type": "error" }, { "inputs": [], "name": "SenderNotBase", "type": "error" }, { "inputs": [], "name": "SenderNotDeployer", "type": "error" }, { "inputs": [], "name": "TransferToNonERC721ReceiverImplementer", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "AddToPosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "approved", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "CreatePosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "EmergencyWithdraw", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "pending", "type": "uint256" } ], "name": "HarvestPosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "LockPosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" } ], "name": "MergePositions", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "lastRewardTime", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "accRewardsPerShare", "type": "uint256" } ], "name": "PoolUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "boostPoints", "type": "uint256" } ], "name": "SetBoost", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "maxGlobalMultiplier", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxBoostMultiplier", "type": "uint256" } ], "name": "SetBoostMultiplierSettings", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bool", "name": "emergencyUnlock", "type": "bool" } ], "name": "SetEmergencyUnlock", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "maxLockDuration", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxLockMultiplier", "type": "uint256" } ], "name": "SetLockMultiplierSettings", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "operator", "type": "address" } ], "name": "SetOperator", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "isAdded", "type": "bool" } ], "name": "SetUnlockOperator", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "xGrailRewardsShare", "type": "uint256" } ], "name": "SetXGrailRewardsShare", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "splitAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newTokenId", "type": "uint256" } ], "name": "SplitPosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "WithdrawFromPosition", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [], "name": "MAX_BOOST_MULTIPLIER_LIMIT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_GLOBAL_MULTIPLIER_LIMIT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_LOCK_MULTIPLIER_LIMIT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "amountToAdd", "type": "uint256" } ], "name": "addToPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "baseERC20", "outputs": [ { "internalType": "address", "name": "base", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "baseURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "boost", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "createPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "emergencyUnlock", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "emergencyWithdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "exists", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "boostPoints", "type": "uint256" } ], "name": "getMultiplierByBoostPoints", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "getMultiplierByLockDuration", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getMultiplierSettings", "outputs": [ { "internalType": "uint256", "name": "maxGlobalMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "maxLockDuration", "type": "uint256" }, { "internalType": "uint256", "name": "maxLockMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "maxBoostMultiplier", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getPoolInfo", "outputs": [ { "internalType": "address", "name": "lpToken", "type": "address" }, { "internalType": "address", "name": "grailToken", "type": "address" }, { "internalType": "address", "name": "xGrailToken", "type": "address" }, { "internalType": "uint256", "name": "lastRewardTime", "type": "uint256" }, { "internalType": "uint256", "name": "accRewardsPerShare", "type": "uint256" }, { "internalType": "uint256", "name": "lpSupply", "type": "uint256" }, { "internalType": "uint256", "name": "lpSupplyWithMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "allocPoint", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getStakingPosition", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "amountWithMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "startLockTime", "type": "uint256" }, { "internalType": "uint256", "name": "lockDuration", "type": "uint256" }, { "internalType": "uint256", "name": "lockMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "rewardDebt", "type": "uint256" }, { "internalType": "uint256", "name": "boostPoints", "type": "uint256" }, { "internalType": "uint256", "name": "totalMultiplier", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "harvestPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "address", "name": "to", "type": "address" } ], "name": "harvestPositionTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, { "internalType": "address", "name": "to", "type": "address" } ], "name": "harvestPositionsTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "hasDeposits", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract ICamelotMaster", "name": "master_", "type": "address" }, { "internalType": "contract IERC20", "name": "grailToken", "type": "address" }, { "internalType": "contract IXGrailToken", "name": "xGrailToken", "type": "address" }, { "internalType": "contract IERC20", "name": "lpToken", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "initialized", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_operator", "type": "address" } ], "name": "isUnlockOperator", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "isUnlocked", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lastTokenId", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "lockPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "master", "outputs": [ { "internalType": "contract ICamelotMaster", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "mergePositions", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "operator", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ownerOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "pendingRewards", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "renewLockPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "maxGlobalMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "maxBoostMultiplier", "type": "uint256" } ], "name": "setBoostMultiplierSettings", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "emergencyUnlock_", "type": "bool" } ], "name": "setEmergencyUnlock", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "maxLockDuration", "type": "uint256" }, { "internalType": "uint256", "name": "maxLockMultiplier", "type": "uint256" } ], "name": "setLockMultiplierSettings", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator_", "type": "address" } ], "name": "setOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_operator", "type": "address" }, { "internalType": "bool", "name": "add", "type": "bool" } ], "name": "setUnlockOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "xGrailRewardsShare_", "type": "uint256" } ], "name": "setXGrailRewardsShare", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "splitAmount", "type": "uint256" } ], "name": "splitPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "tokenByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "tokenOfOwnerByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "transferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "unboost", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "unlockOperator", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "unlockOperatorsLength", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "updatePool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "amountToWithdraw", "type": "uint256" } ], "name": "withdrawFromPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "xGrailRewardsShare", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "yieldBooster", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]
60a0604052614e2060165562f14280601755612710601855612710601955611f40601a553480156200003057600080fd5b50604080518082018252601c81527f43616d656c6f74207374616b696e6720706f736974696f6e204e465400000000602080830191909152825180840190935260058352641cdc13919560da1b90830152600160005532916200009a6301ffc9a760e01b62000136565b6007620000a8838262000262565b506008620000b7828262000262565b50620000ca6380ac58cd60e01b62000136565b620000dc635b5e139f60e01b62000136565b620000ee63780e9d6360e01b62000136565b50507348b7c6395b1a07af1acdda332ba9a040b008fad1608052683602298b8c10b0123180546001600160a01b0319166001600160a01b03929092169190911790556200032e565b6001600160e01b03198082169003620001955760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001e857607f821691505b6020821081036200020957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025d57600081815260208120601f850160051c81016020861015620002385750805b601f850160051c820191505b81811015620002595782815560010162000244565b5050505b505050565b81516001600160401b038111156200027e576200027e620001bd565b62000296816200028f8454620001d3565b846200020f565b602080601f831160018114620002ce5760008415620002b55750858301515b600019600386901b1c1916600185901b17855562000259565b600085815260208120601f198616915b82811015620002ff57888601518255948401946001909101908401620002de565b50858210156200031e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805161523a6200035160003960008181610bed0152612976015261523a6000f3fe6080604052600436106103bc5760003560e01c80636c0360eb116101f2578063b88d4fde1161010d578063e61f927d116100a0578063f2e16b3c1161006f578063f2e16b3c14610d33578063f84ddf0b14610d53578063f8c8765e14610d68578063fdc5f93014610d88576103c3565b8063e61f927d14610c99578063e985e9c514610cb0578063ee97f7f314610cf9578063f2c3999214610d19576103c3565b8063d4e32de6116100dc578063d4e32de614610569578063d5232dee14610c4f578063dc6e15bd14610c6f578063e3161ddd14610c84576103c3565b8063b88d4fde14610bbb578063c45a015514610bdb578063c87b56dd14610c0f578063d1aaef0514610c2f576103c3565b8063842072af1161018557806397e5311c1161015457806397e5311c14610b46578063a22cb46514610b5b578063a6b0b2a814610b7b578063b3ab15fb14610b9b576103c3565b8063842072af14610adc5780638da5cb5b14610afc5780639016f82214610b1157806395d89b4114610b31576103c3565b80637a004bac116101c15780637a004bac14610a4e5780637dcb2abf14610a6e578063832c51f614610a8e5780638380edb714610ac7576103c3565b80636c0360eb146109d95780636e00e2da146109ee5780636f8297af14610a0e57806370a0823114610a2e576103c3565b80632f745c59116102e25780634f558e7911610275578063570ca73511610244578063570ca7351461092357806360246c88146109435780636352211e146109a457806368e5dab5146109c4576103c3565b80634f558e79146108a35780634f6ccce7146108c35780635312ea8e146108e357806356dd590b14610903576103c3565b80634a256786116102b15780634a2567861461082d5780634a81add41461084d5780634cd5520b146108635780634d05c31814610883576103c3565b80632f745c59146107ad5780633e9b453e146107cd57806340be7bec146107ed57806342842e0e1461080d576103c3565b806313e46e841161035a57806320f8e94e1161032957806320f8e94e1461072d57806323b872dd1461074d5780632c542ede1461076d5780632f38e0421461078d576103c3565b806313e46e84146106c1578063158ef93e146106d757806318160ddd146106f85780631dc602071461070d576103c3565b806306fdde031161039657806306fdde03146105ad578063081812fc146105cf57806308521f7914610607578063095ea7b3146106a1576103c3565b806301ffc9a71461051a5780630332f1141461056957806304d5b62d1461058d576103c3565b366103c357005b683602298b8c10b0123060003560e01c63263c69d681900361047d5781546001600160a01b0316331461040957604051631b1e598960e11b815260040160405180910390fd5b602036103d60003e6004356024018036103d60003e602081033560051b81018036103d60003e5b8082146104705781358060601c816001168260a01b60a81c811583028284026000805160206151e5833981519152600038a4505050816020019150610430565b5050600160005260206000f35b80630f4599e5036105185760018201546001600160a01b0316156104d35760018201546001600160a01b03166004356001600160a01b0316146104d3576040516362cf623d60e11b815260040160405180910390fd5b81546001600160a01b0316156104fc57604051635fb2b52360e11b815260040160405180910390fd5b81546001600160a01b0319163317825560016000908152602090f35b005b34801561052657600080fd5b50610554610535366004614911565b6001600160e01b03191660009081526001602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561057557600080fd5b5061057f613a9881565b604051908152602001610560565b34801561059957600080fd5b506105186105a836600461492e565b610da8565b3480156105b957600080fd5b506105c2610fd7565b60405161056091906149a0565b3480156105db57600080fd5b506105ef6105ea3660046149b3565b611069565b6040516001600160a01b039091168152602001610560565b34801561061357600080fd5b506106666106223660046149b3565b6000908152601c6020526040902080546001820154600283015460038401546004850154600586015460068701546007909701549597949693959294919390929091565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610560565b3480156106ad57600080fd5b506105186106bc3660046149e1565b6110f1565b3480156106cd57600080fd5b5061057f6161a881565b3480156106e357600080fd5b50600f5461055490600160a01b900460ff1681565b34801561070457600080fd5b5061057f611206565b34801561071957600080fd5b506105ef6107283660046149b3565b611217565b34801561073957600080fd5b506105186107483660046149b3565b611242565b34801561075957600080fd5b50610518610768366004614a0d565b6112a6565b34801561077957600080fd5b5061051861078836600461492e565b6112e2565b34801561079957600080fd5b506105186107a8366004614a5c565b611431565b3480156107b957600080fd5b5061057f6107c83660046149e1565b611487565b3480156107d957600080fd5b506105186107e8366004614a79565b6114b0565b3480156107f957600080fd5b5061051861080836600461492e565b611549565b34801561081957600080fd5b50610518610828366004614a0d565b611636565b34801561083957600080fd5b5061051861084836600461492e565b611651565b34801561085957600080fd5b5061057f601a5481565b34801561086f57600080fd5b5061051861087e366004614aee565b611705565b34801561088f57600080fd5b5061051861089e366004614b45565b611803565b3480156108af57600080fd5b506105546108be3660046149b3565b61186f565b3480156108cf57600080fd5b5061057f6108de3660046149b3565b61187a565b3480156108ef57600080fd5b506105186108fe3660046149b3565b611890565b34801561090f57600080fd5b5061051861091e366004614b73565b6119bb565b34801561092f57600080fd5b50600e546105ef906001600160a01b031681565b34801561094f57600080fd5b50610958611c29565b604080516001600160a01b03998a168152978916602089015295909716948601949094526060850192909252608084015260a083015260c082015260e081019190915261010001610560565b3480156109b057600080fd5b506105ef6109bf3660046149b3565b611d19565b3480156109d057600080fd5b506105ef611d41565b3480156109e557600080fd5b506105c2611daf565b3480156109fa57600080fd5b5061057f610a0936600461492e565b611dbe565b348015610a1a57600080fd5b50610554610a29366004614bbf565b611e8a565b348015610a3a57600080fd5b5061057f610a49366004614bbf565b611e97565b348015610a5a57600080fd5b50610518610a693660046149b3565b611f23565b348015610a7a57600080fd5b5061057f610a893660046149b3565b611f82565b348015610a9a57600080fd5b50601654601754601854601954604080519485526020850193909352918301526060820152608001610560565b348015610ad357600080fd5b506105546120cd565b348015610ae857600080fd5b5061057f610af73660046149b3565b612153565b348015610b0857600080fd5b506105ef6121b0565b348015610b1d57600080fd5b50610518610b2c36600461492e565b6121fa565b348015610b3d57600080fd5b506105c261225c565b348015610b5257600080fd5b506105ef61226b565b348015610b6757600080fd5b50610518610b76366004614b45565b6122a0565b348015610b8757600080fd5b50610518610b9636600461492e565b612364565b348015610ba757600080fd5b50610518610bb6366004614bbf565b61242e565b348015610bc757600080fd5b50610518610bd6366004614bf2565b612484565b348015610be757600080fd5b506105ef7f000000000000000000000000000000000000000000000000000000000000000081565b348015610c1b57600080fd5b506105c2610c2a3660046149b3565b6124c2565b348015610c3b57600080fd5b50610518610c4a36600461492e565b612633565b348015610c5b57600080fd5b50610518610c6a36600461492e565b612881565b348015610c7b57600080fd5b5061057f6128c3565b348015610c9057600080fd5b506105186128cf565b348015610ca557600080fd5b506014541515610554565b348015610cbc57600080fd5b50610554610ccb366004614cd2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610d0557600080fd5b50600f546105ef906001600160a01b031681565b348015610d2557600080fd5b50601b546105549060ff1681565b348015610d3f57600080fd5b50610518610d4e36600461492e565b612905565b348015610d5f57600080fd5b5061057f612960565b348015610d7457600080fd5b50610518610d83366004614d00565b61296b565b348015610d9457600080fd5b50610518610da33660046149b3565b612aa4565b600260005403610dd35760405162461bcd60e51b8152600401610dca90614d5c565b60405180910390fd5b6002600055610de182612af9565b610de9612b63565b610dfb82610df684611d19565b612c3e565b6000828152601c6020526040902080548210610e4f5760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081cdc1b1a5d105b5bdd5b9d606a1b6044820152606401610dca565b8054610e5b9083612ddc565b8155610e6681612e38565b6000610e7133612edb565b60038301546004840154919250906000610ea1612710610e9b610e948583612efa565b8990612f59565b90612fdb565b905060405180610140016040528087815260200182815260200186600201548152602001848152602001838152602001610ef2670de0b6b3a7640000610e9b60155486612f5990919063ffffffff16565b815260006020808301829052604080840187905260608085018490526080948501849052898452601c83529281902085518155918501516001830155840151600282015590830151600382015590820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155601454610f8b9082612efa565b601455604080518781526020810186905288917f83ad7662a93cf58f10a379c6370e942debc7c8cb1cffb157f519b12973264a4c910160405180910390a2505060016000555050505050565b606060078054610fe690614d93565b80601f016020809104026020016040519081016040528092919081815260200182805461101290614d93565b801561105f5780601f106110345761010080835404028352916020019161105f565b820191906000526020600020905b81548152906001019060200180831161104257829003601f168201915b5050505050905090565b600061107482613036565b6110d55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610dca565b506000908152600560205260409020546001600160a01b031690565b60006110fc82611d19565b9050806001600160a01b0316836001600160a01b0316036111695760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610dca565b336001600160a01b038216148061118557506111858133610ccb565b6111f75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610dca565b6112018383613043565b505050565b600061121260036130b1565b905090565b600081611224600c6130b1565b1161123157506000919050565b61123c600c836130bb565b92915050565b6002600054036112645760405162461bcd60e51b8152600401610dca90614d5c565b6002600055611272816130c7565b61127a612b63565b61128781610df683611d19565b6000818152601c6020526040902061129e90612e38565b506001600055565b6002600054036112c85760405162461bcd60e51b8152600401610dca90614d5c565b60026000556112d883838361312d565b5050600160005550565b6002600054036113045760405162461bcd60e51b8152600401610dca90614d5c565b60026000556113128261315e565b6000811161134d5760405162461bcd60e51b81526020600482015260086024820152670c08185b5bdd5b9d60c21b6044820152606401610dca565b611355612b63565b600061136083611d19565b905061136c8382612c3e565b6000838152601c6020526040902060038101541561139e57426002820155600381015461139890612153565b60048201555b6010546113b5906001600160a01b03163385613168565b81549093506113c49084612efa565b81556013546113d39084612efa565b6013556113df81612e38565b6113ea828585613263565b604080513381526020810185905285917f2bc3f231118d71058e11ae6ae9f199b789d86a7012a9d45f4c2ed7d7016478c291015b60405180910390a2505060016000555050565b61143961333f565b601b805460ff191682151590811790915560405160ff909116151581527f1545be19b3ba6f2e76454d1b8b59529cbbbdf7af9046fd49bd86c17314a5509d906020015b60405180910390a150565b6001600160a01b03821660009081526002602052604081206114a990836130bb565b9392505050565b6002600054036114d25760405162461bcd60e51b8152600401610dca90614d5c565b60026000556114e0826130c7565b6114fb6114ec83611d19565b6001600160a01b03163b151590565b6115175760405162461bcd60e51b8152600401610dca90614dcd565b61151f612b63565b6115298282612c3e565b6000828152601c6020526040902061154090612e38565b50506001600055565b60026000540361156b5760405162461bcd60e51b8152600401610dca90614d5c565b6002600055611578613379565b61158182613036565b6115bf5760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081d1bdad95b9259608a1b6044820152606401610dca565b6115c7612b63565b6115d2826000612c3e565b6000828152601c6020526040812060068101549091906115f29084612efa565b60068301819055905061160482612e38565b837fe96d35ce795c2d6a754b1bf60d2ea30785c5a460b6d4bf0e5b48190e5084860d8260405161141e91815260200190565b61120183838360405180602001604052806000815250612484565b61165961333f565b6161a882111561167b5760405162461bcd60e51b8152600401610dca90614df0565b613a9881111580156116a157508161169e60185483612efa90919063ffffffff16565b11155b6116bd5760405162461bcd60e51b8152600401610dca90614df0565b6016829055601981905560408051838152602081018390527fde0bddf440a694ffa55b73c57fcb0c32fc9794b258c4e71ca2c867f6d7137f0591015b60405180910390a15050565b6002600054036117275760405162461bcd60e51b8152600401610dca90614d5c565b6002600055611734612b63565b8160005b818110156117f757600085858381811061175457611754614e12565b905060200201359050611766816130c7565b600061177182611d19565b9050336001600160a01b0382161480156117935750336001600160a01b038616145b806117a757506001600160a01b0381163b15155b6117c35760405162461bcd60e51b8152600401610dca90614dcd565b6117cd8286612c3e565b6000828152601c602052604090206117e490612e38565b5050806117f090614e3e565b9050611738565b50506001600055505050565b61180b61333f565b80156118225761181c600c83613381565b5061182f565b61182d600c83613396565b505b604080516001600160a01b038416815282151560208201527f28d57a4483d2172573741520aa0af0c5ac1e83cb2523c0d1a37c07b90a2e939591016116f9565b600061123c82613036565b6000806118886003846133ab565b509392505050565b6002600054036118b25760405162461bcd60e51b8152600401610dca90614d5c565b60026000556118c081612af9565b6000818152601c602052604090206118d9600c336133c9565b806118f6575042600382015460028301546118f391612efa565b11155b8061190457506119046120cd565b6119395760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610dca565b80546013546119489082612ddc565b601355600182015460145461195c91612ddc565b60145561196a8360006133eb565b827fb073e6fbd06d7557d2c82f414fee57de28e7fb517ecc0afdd6b1fc57034a9cb88260405161199c91815260200190565b60405180910390a26010546112d8906001600160a01b031633836134b6565b6002600054036119dd5760405162461bcd60e51b8152600401610dca90614d5c565b60026000556119ea612b63565b8160018111611a0b5760405162461bcd60e51b8152600401610dca90614e57565b600084846000818110611a2057611a20614e12565b905060200201359050611a3281612af9565b6000818152601c602052604090206003810154841015611a825760405162461bcd60e51b815260206004820152600b60248201526a63616e2774206d6572676560a81b6044820152606401610dca565b611a8c8233612c3e565b60038101849055611a9c84612153565b600482015560015b83811015611bcf576000878783818110611ac057611ac0614e12565b905060200201359050611ad281612af9565b838103611b145760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081d1bdad95b881a5960821b6044820152606401610dca565b611b1e8133612c3e565b6000818152601c602052604090206003810154871015611b6e5760405162461bcd60e51b815260206004820152600b60248201526a63616e2774206d6572676560a81b6044820152606401610dca565b806002015484600201541015611b8957600280820154908501555b80548454611b9691612efa565b84556001810154601454611ba991612ddc565b6014556006810154611bbc9083906133eb565b505080611bc890614e3e565b9050611aa4565b50611bd981612e38565b336001600160a01b03167f1b6a7445053b0df83054e159a97edc3f3aad4284adaece07bef2fca11928a9308787604051611c14929190614e78565b60405180910390a25050600160005550505050565b600f5460405162d7f52760e31b815230600482015260009182918291829182918291829182916001600160a01b03909116906306bfa9389060240160a060405180830381865afa158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca59190614eb1565b90919293509050508096508192505050601060009054906101000a90046001600160a01b0316601160009054906101000a90046001600160a01b0316601260009054906101000a90046001600160a01b03168760155460135460145497509750975097509750975097509091929394959697565b600061123c826040518060600160405280602981526020016151bc6029913960039190613519565b600f54604080516368e5dab560e01b815290516000926001600160a01b0316916368e5dab59160048083019260209291908290030181865afa158015611d8b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112129190614efa565b6060600a8054610fe690614d93565b6000811580611dcb575082155b15611dd85750600061123c565b6000611de2611d41565b90506001600160a01b038116611df9576000611e82565b60195460135460405163d2eec6ff60e01b81523060048201526024810192909252604482018690526064820152608481018490526001600160a01b0382169063d2eec6ff9060a401602060405180830381865afa158015611e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e829190614f17565b949350505050565b600061123c600c836133c9565b60006001600160a01b038216611f025760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610dca565b6001600160a01b038216600090815260026020526040902061123c906130b1565b611f2b61333f565b612710811115611f4d5760405162461bcd60e51b8152600401610dca90614df0565b601a8190556040518181527f3b2d8bc8f2837b38877b1e141263e80865f61ed9a257c4be608abe237d5f158e9060200161147c565b6000818152601c6020526040808220601554600f54925162d7f52760e31b8152306004820152919290918491829182916001600160a01b0316906306bfa9389060240160a060405180830381865afa158015611fe2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120069190614eb1565b9450945094505050600082118061201c57508242115b801561202a57506000601454115b1561208757600061203d84425b90612ddc565b905060006120558461204f8486612f59565b90612efa565b905061208261207b601454610e9b670de0b6b3a764000085612f5990919063ffffffff16565b8790612efa565b955050505b6120c2856009015461204f876008015461204f8960050154612037670de0b6b3a7640000610e9b8c8e60010154612f5990919063ffffffff16565b979650505050505050565b601b5460009060ff16806112125750600f60009054906101000a90046001600160a01b03166001600160a01b031663f2c399926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112129190614f30565b600061215d6120cd565b1561216a57506000919050565b6017541580612177575081155b1561218457506000919050565b601754821061219557505060185490565b61123c601754610e9b84601854612f5990919063ffffffff16565b600f5460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015611d8b573d6000803e3d6000fd5b60026000540361221c5760405162461bcd60e51b8152600401610dca90614d5c565b6002600055612229613379565b612231612b63565b61223c826000612c3e565b6000828152601c6020526040812060068101549091906115f29084612ddc565b606060088054610fe690614d93565b683602298b8c10b01230546001600160a01b03168061229d57604051632d9523d760e11b815260040160405180910390fd5b90565b336001600160a01b038316036122f85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610dca565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61236c6121b0565b6001600160a01b0316336001600160a01b031614806123955750600e546001600160a01b031633145b6123b15760405162461bcd60e51b8152600401610dca90614dcd565b613a9881111580156123d257506016546019546123cf908390612efa565b11155b6123ee5760405162461bcd60e51b8152600401610dca90614df0565b6017829055601881905560408051838152602081018390527f46cf6b9b4ec75e8786b2e93d4beb426d70d56d9b0eb9bfd40e975f9dc59d770391016116f9565b61243661333f565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee9060200161147c565b6002600054036124a65760405162461bcd60e51b8152600401610dca90614d5c565b60026000556124b784848484613526565b505060016000555050565b60606124cd82613036565b6125315760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610dca565b6000828152600960205260408120805461254a90614d93565b80601f016020809104026020016040519081016040528092919081815260200182805461257690614d93565b80156125c35780601f10612598576101008083540402835291602001916125c3565b820191906000526020600020905b8154815290600101906020018083116125a657829003601f168201915b5050505050905060006125d4611daf565b905080516000036125e6575092915050565b815115612618578082604051602001612600929190614f4d565b60405160208183030381529060405292505050919050565b8061262285613558565b604051602001612600929190614f4d565b6002600054036126555760405162461bcd60e51b8152600401610dca90614d5c565b60026000556126626120cd565b156126a65780156126a65760405162461bcd60e51b815260206004820152600e60248201526d1b1bd8dadcc8191a5cd8589b195960921b6044820152606401610dca565b6126ae612b63565b6010546126c5906001600160a01b03163384613168565b9150816000036127055760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc8185b5bdd5b9d60aa1b6044820152606401610dca565b600061271033612edb565b9050600061271d83612153565b9050600061273b612710610e9b6127348583612efa565b8890612f59565b905060405180610140016040528086815260200182815260200161275c4290565b815260200185815260200183815260200161278e670de0b6b3a7640000610e9b60155486612f5990919063ffffffff16565b815260006020808301829052604080840187905260608085018490526080948501849052888452601c83529281902085518155918501516001830155840151600282015590830151600382015590820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201516008820155610120909101516009909101556013546128279086612efa565b6013556014546128379082612efa565b601455604080518681526020810186905284917fc75220a9dbab7c65d9cc87d8534accb348d3f151ee2afccfb42e6ccf75556f23910160405180910390a250506001600055505050565b6002600054036128a35760405162461bcd60e51b8152600401610dca90614d5c565b60026000556128b1826130c7565b6128b9612b63565b6115408282613672565b6000611212600c6130b1565b6002600054036128f15760405162461bcd60e51b8152600401610dca90614d5c565b60026000556128fe612b63565b6001600055565b6002600054036129275760405162461bcd60e51b8152600401610dca90614d5c565b6002600055612935826130c7565b61293d612b63565b600061294883611d19565b905061295581848461378c565b6112d8818484613913565b6000611212600b5490565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156129ad5750600f54600160a01b900460ff16155b6129c95760405162461bcd60e51b8152600401610dca90614dcd565b601080546001600160a01b038084166001600160a01b031992831617909255600f8054601180548886169085168117909155601280548887169516851790556001600160a81b031990911693881693909317600160a01b17905560405163095ea7b360e01b815263095ea7b391612a5a91600019906004016001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9d9190614f30565b5050505050565b600260005403612ac65760405162461bcd60e51b8152600401610dca90614d5c565b6002600055612ad4816130c7565b612adc612b63565b6000818152601c602052604090206003015461129e908290613672565b612b0281613036565b612b1e5760405162461bcd60e51b8152600401610dca90614f7c565b612b283382613952565b612b605760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610dca565b50565b600f546040805163372500ab60e01b815290516000926001600160a01b03169163372500ab916004808301926020929190829003018187875af1158015612bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd29190614f17565b90508015612c0457601454612c0090612bf790610e9b84670de0b6b3a7640000612f59565b60155490612efa565b6015555b7f7fa9647ec1cc14e3822b46d05a2b9d4e019bde8875c0088c46b6503d71bf1722426015546040805192835260208301919091520161147c565b6000828152601c6020526040812060058101546015546001830154929392612c79929161203791670de0b6b3a764000091610e9b9190612f59565b9050612c836120cd565b80612ca057504260038301546002840154612c9d91612efa565b11155b15612cb45760006003830181905560048301555b6000811180612cc7575060008260080154115b80612cd6575060008260090154115b15612d92576000612cf8612710610e9b601a5485612f5990919063ffffffff16565b90506000612d1782612037866009015486612efa90919063ffffffff16565b9050612d30846008015483612efa90919063ffffffff16565b91506001600160a01b038516600003612d56576008840182905560098401819055612d8f565b60006008850181905560098501558115612d7757612d748583613979565b91505b612d818582613a6d565b9050612d8f85878385613b03565b50505b604080516001600160a01b03851681526020810183905285917fcc70d7e29d5f6e6a993743a891f22f70aee482bafb25b00b8909ee1bf9028ae2910160405180910390a250505050565b600082821115612e2e5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610dca565b6114a98284614fc8565b6000612e54826004015461204f84600001548560060154611dbe565b9050601654811115612e6557506016545b600782018190556000612e89612710610e9b612e818583612efa565b865490612f59565b9050612ea88161204f8560010154601454612ddc90919063ffffffff16565b60145560018301819055601554612ece90670de0b6b3a764000090610e9b908490612f59565b8360050181905550505050565b6000612ee7600b613bea565b50600b54612ef58282613c07565b919050565b600080612f078385614fdb565b9050838110156114a95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610dca565b600082600003612f6b5750600061123c565b6000612f778385614fee565b905082612f84858361501b565b146114a95760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610dca565b600080821161302c5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610dca565b6114a9828461501b565b600061123c600383613c21565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061307882611d19565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061123c825490565b60006114a98383613c39565b6130d081613036565b6130ec5760405162461bcd60e51b8152600401610dca90614f7c565b6130f63382613952565b8061311157503361310682611069565b6001600160a01b0316145b612b605760405162461bcd60e51b8152600401610dca90614dcd565b6131373382613cbf565b6131535760405162461bcd60e51b8152600401610dca9061502f565b611201838383613d60565b6131113382613cbf565b6040516370a0823160e01b815230600482015260009081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156131b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d59190614f17565b90506131ec6001600160a01b038616853086613eda565b6040516370a0823160e01b815230600482015261325a9082906001600160a01b038816906370a0823190602401602060405180830381865afa158015613236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120379190614f17565b95945050505050565b6001600160a01b0383163b156112015760405133602482015260448101839052606481018290526000906133079063e2b36dc360e01b906084015b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b0319909516949094179093528051808201909152600f81526e1b9bdb881a5b5c1b195b595b9d1959608a1b928101929092526001600160a01b03871691613f12565b90508080602001905181019061331d9190614f30565b6133395760405162461bcd60e51b8152600401610dca90614dcd565b50505050565b6133476121b0565b6001600160a01b0316336001600160a01b0316146133775760405162461bcd60e51b8152600401610dca90614dcd565b565b613347611d41565b60006114a9836001600160a01b038416613f21565b60006114a9836001600160a01b038416613f70565b60008080806133ba8686614063565b909450925050505b9250929050565b6001600160a01b038116600090815260018301602052604081205415156114a9565b801561345c576133f9611d41565b60405163152150d560e21b8152336004820152602481018490526001600160a01b039190911690635485435490604401600060405180830381600087803b15801561344357600080fd5b505af1158015613457573d6000803e3d6000fd5b505050505b6000828152601c602052604081208181556001810182905560028101829055600381018290556004810182905560058101829055600681018290556007810182905560088101829055600901556134b282614100565b5050565b6040516001600160a01b03831660248201526044810182905261120190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526141b4565b6000611e82848484614286565b6135303383613cbf565b61354c5760405162461bcd60e51b8152600401610dca9061502f565b613339848484846142ef565b60608160000361357f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135a9578061359381614e3e565b91506135a29050600a8361501b565b9150613583565b60008167ffffffffffffffff8111156135c4576135c4614bdc565b6040519080825280601f01601f1916602001820160405280156135ee576020820181803683370190505b50905060006135fe600184614fc8565b90508593505b831561366957613615600a85615080565b613620906030614fdb565b60f81b828261362e81615094565b93508151811061364057613640614e12565b60200101906001600160f81b031916908160001a905350613662600a8561501b565b9350613604565b50949350505050565b61367a6120cd565b156136b85760405162461bcd60e51b815260206004820152600e60248201526d1b1bd8dadcc8191a5cd8589b195960921b6044820152606401610dca565b6000828152601c60205260408120600381015460028201549192916136dc91612efa565b9050428082111561371c576136f18282612ddc565b84101580156137005750600084115b61371c5760405162461bcd60e51b8152600401610dca90614e57565b6137268533612c3e565b6003830184905561373684612153565b60048401556002830181905561374b83612e38565b847f817ea9dab606b88f1d3b71d35f23e301a95c27058f35c39acf502f471feb03b88560405161377d91815260200190565b60405180910390a25050505050565b600081116137c55760405162461bcd60e51b8152600401610dca906020808252600490820152631b9d5b1b60e21b604082015260600190565b6000828152601c602052604090206137de600c856133c9565b806137fb575042600382015460028301546137f891612efa565b11155b8061380957506138096120cd565b61383e5760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610dca565b805482111561385f5760405162461bcd60e51b8152600401610dca90614e57565b6138698385612c3e565b80546138759083612ddc565b81556013546138849083612ddc565b60135580546000036138b95760018101546014546138a191612ddc565b60145560068101546138b49084906133eb565b6138c2565b6138c281612e38565b827f10b3873e32aa5edce774b02db517f3bde3429d0e97b57b74cb569ba85ce69a58836040516138f491815260200190565b60405180910390a2601054613339906001600160a01b031685846134b6565b6001600160a01b0383163b1561120157604051336024820152604481018390526064810182905260009061330790631a33be3d60e11b9060840161329e565b600061395d82611d19565b6001600160a01b0316836001600160a01b031614905092915050565b6011546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156139c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ea9190614f17565b9050808311156139f8578092505b8215613a65576012546040516316874d3760e21b8152600481018590526001600160a01b03868116602483015290911690635a1d34dc90604401600060405180830381600087803b158015613a4c57600080fd5b505af1158015613a60573d6000803e3d6000fd5b505050505b509092915050565b6011546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015613aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ade9190614f17565b905080831115613aec578092505b601154613a65906001600160a01b031685856134b6565b6000613b0e84611d19565b90506001600160a01b0381163b15612a9d57604080513360248201526001600160a01b038781166044830152606482018790526084820186905260a48083018690528351808403909101815260c49092018352602080830180516001600160e01b031663fe4ee96760e01b1790528351808501909452600f84526e1b9bdb881a5b5c1b195b595b9d1959608a1b90840152600092613bb0929185169190613f12565b905080806020019051810190613bc69190614f30565b613be25760405162461bcd60e51b8152600401610dca90614dcd565b505050505050565b6001816000016000828254613bff9190614fdb565b909155505050565b6134b2828260405180602001604052806000815250614322565b600081815260018301602052604081205415156114a9565b81546000908210613c975760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610dca565b826000018281548110613cac57613cac614e12565b9060005260206000200154905092915050565b6000613cca82613036565b613ce65760405162461bcd60e51b8152600401610dca90614f7c565b6000613cf183611d19565b9050806001600160a01b0316846001600160a01b03161480613d2c5750836001600160a01b0316613d2184611069565b6001600160a01b0316145b80611e8257506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16611e82565b826001600160a01b0316613d7382611d19565b6001600160a01b031614613ddb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610dca565b6001600160a01b038216613e3d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610dca565b613e48838383614355565b613e53600082613043565b6001600160a01b0383166000908152600260205260409020613e759082614390565b506001600160a01b0382166000908152600260205260409020613e98908261439c565b50613ea5600382846143a8565b5080826001600160a01b0316846001600160a01b03166000805160206151e583398151915260405160405180910390a4505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133399085906323b872dd60e01b906084016134e2565b6060611e8284846000856143be565b6000818152600183016020526040812054613f685750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561123c565b50600061123c565b60008181526001830160205260408120548015614059576000613f94600183614fc8565b8554909150600090613fa890600190614fc8565b90506000866000018281548110613fc157613fc1614e12565b9060005260206000200154905080876000018481548110613fe457613fe4614e12565b600091825260209091200155613ffb836001614fdb565b6000828152600189016020526040902055865487908061401d5761401d6150ab565b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061123c565b600091505061123c565b8154600090819083106140c35760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610dca565b60008460000184815481106140da576140da614e12565b906000526020600020906002020190508060000154816001015492509250509250929050565b600061410b82611d19565b905061411981600084614355565b614124600083613043565b6000828152600960205260409020805461413d90614d93565b15905061415b57600082815260096020526040812061415b916148ad565b6001600160a01b038116600090815260026020526040902061417d9083614390565b506141896003836144db565b5060405182906000906001600160a01b038416906000805160206151e5833981519152908390a45050565b6000614209826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613f129092919063ffffffff16565b80519091501561120157808060200190518101906142279190614f30565b6112015760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610dca565b600082815260018401602052604081205482816142b65760405162461bcd60e51b8152600401610dca91906149a0565b50846142c3600183614fc8565b815481106142d3576142d3614e12565b9060005260206000209060020201600101549150509392505050565b6142fa848484613d60565b614306848484846144e7565b6133395760405162461bcd60e51b8152600401610dca906150c1565b61432c83836145b8565b61433960008484846144e7565b6112015760405162461bcd60e51b8152600401610dca906150c1565b6001600160a01b0383163b15806143745750336001600160a01b038416145b6112015760405162461bcd60e51b8152600401610dca90614dcd565b60006114a98383613f70565b60006114a98383613f21565b6000611e8284846001600160a01b0385166146ca565b60608247101561441f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610dca565b843b61446d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dca565b600080866001600160a01b031685876040516144899190615113565b60006040518083038185875af1925050503d80600081146144c6576040519150601f19603f3d011682016040523d82523d6000602084013e6144cb565b606091505b50915091506120c282828661476d565b60006114a983836147a6565b60006001600160a01b0384163b61450057506001611e82565b6000614581630a85bd0160e11b33888787604051602401614524949392919061512f565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505060405180606001604052806032815260200161518a603291396001600160a01b0388169190613f12565b9050600081806020019051810190614599919061516c565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b6001600160a01b03821661460e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610dca565b61461781613036565b156146645760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610dca565b61467060008383614355565b6001600160a01b0382166000908152600260205260409020614692908261439c565b5061469f600382846143a8565b5060405181906001600160a01b038416906000906000805160206151e5833981519152908290a45050565b60008281526001840160205260408120548082036147315750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556114a9565b828561473e600184614fc8565b8154811061474e5761474e614e12565b90600052602060002090600202016001018190555060009150506114a9565b6060831561477c5750816114a9565b82511561478c5782518084602001fd5b8160405162461bcd60e51b8152600401610dca91906149a0565b600081815260018301602052604081205480156140595760006147ca600183614fc8565b85549091506000906147de90600190614fc8565b905060008660000182815481106147f7576147f7614e12565b906000526020600020906002020190508087600001848154811061481d5761481d614e12565b60009182526020909120825460029092020190815560019182015490820155614847908490614fdb565b81546000908152600189016020526040902055865487908061486b5761486b6150ab565b600082815260208082206002600019909401938402018281556001908101839055929093558881528982019092526040822091909155945061123c9350505050565b5080546148b990614d93565b6000825580601f106148c9575050565b601f016020900490600052602060002090810190612b6091905b808211156148f757600081556001016148e3565b5090565b6001600160e01b031981168114612b6057600080fd5b60006020828403121561492357600080fd5b81356114a9816148fb565b6000806040838503121561494157600080fd5b50508035926020909101359150565b60005b8381101561496b578181015183820152602001614953565b50506000910152565b6000815180845261498c816020860160208601614950565b601f01601f19169290920160200192915050565b6020815260006114a96020830184614974565b6000602082840312156149c557600080fd5b5035919050565b6001600160a01b0381168114612b6057600080fd5b600080604083850312156149f457600080fd5b82356149ff816149cc565b946020939093013593505050565b600080600060608486031215614a2257600080fd5b8335614a2d816149cc565b92506020840135614a3d816149cc565b929592945050506040919091013590565b8015158114612b6057600080fd5b600060208284031215614a6e57600080fd5b81356114a981614a4e565b60008060408385031215614a8c57600080fd5b823591506020830135614a9e816149cc565b809150509250929050565b60008083601f840112614abb57600080fd5b50813567ffffffffffffffff811115614ad357600080fd5b6020830191508360208260051b85010111156133c257600080fd5b600080600060408486031215614b0357600080fd5b833567ffffffffffffffff811115614b1a57600080fd5b614b2686828701614aa9565b9094509250506020840135614b3a816149cc565b809150509250925092565b60008060408385031215614b5857600080fd5b8235614b63816149cc565b91506020830135614a9e81614a4e565b600080600060408486031215614b8857600080fd5b833567ffffffffffffffff811115614b9f57600080fd5b614bab86828701614aa9565b909790965060209590950135949350505050565b600060208284031215614bd157600080fd5b81356114a9816149cc565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215614c0857600080fd5b8435614c13816149cc565b93506020850135614c23816149cc565b925060408501359150606085013567ffffffffffffffff80821115614c4757600080fd5b818701915087601f830112614c5b57600080fd5b813581811115614c6d57614c6d614bdc565b604051601f8201601f19908116603f01168101908382118183101715614c9557614c95614bdc565b816040528281528a6020848701011115614cae57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215614ce557600080fd5b8235614cf0816149cc565b91506020830135614a9e816149cc565b60008060008060808587031215614d1657600080fd5b8435614d21816149cc565b93506020850135614d31816149cc565b92506040850135614d41816149cc565b91506060850135614d51816149cc565b939692955090935050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600181811c90821680614da757607f821691505b602082108103614dc757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152682327a92124a22222a760b91b604082015260600190565b6020808252600890820152670e8dede40d0d2ced60c31b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614e5057614e50614e28565b5060010190565b6020808252600790820152661a5b9d985b1a5960ca1b604082015260600190565b6020808252810182905260006001600160fb1b03831115614e9857600080fd5b8260051b80856040850137919091016040019392505050565b600080600080600060a08688031215614ec957600080fd5b8551614ed4816149cc565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600060208284031215614f0c57600080fd5b81516114a9816149cc565b600060208284031215614f2957600080fd5b5051919050565b600060208284031215614f4257600080fd5b81516114a981614a4e565b60008351614f5f818460208801614950565b835190830190614f73818360208801614950565b01949350505050565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b8181038181111561123c5761123c614e28565b8082018082111561123c5761123c614e28565b808202811582820484141761123c5761123c614e28565b634e487b7160e01b600052601260045260246000fd5b60008261502a5761502a615005565b500490565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008261508f5761508f615005565b500690565b6000816150a3576150a3614e28565b506000190190565b634e487b7160e01b600052603160045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008251615125818460208701614950565b9190910192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061516290830184614974565b9695505050505050565b60006020828403121561517e57600080fd5b81516114a9816148fb56fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220441e56e4930af724c021053eac8d3207e2fc537d0e0429e79a25de185a85ce3e64736f6c63430008140033