[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "AddressInsufficientBalance", "type": "error" }, { "inputs": [], "name": "ClaimableAmountOfImportIsGreaterThanExpected", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [], "name": "EqualPercentagesOnlyAllowedBeforeLinear", "type": "error" }, { "inputs": [], "name": "FailedInnerCall", "type": "error" }, { "inputs": [], "name": "IncorrectClaimFee", "type": "error" }, { "inputs": [], "name": "InputArraysMustHaveSameLength", "type": "error" }, { "inputs": [], "name": "InvalidInitialization", "type": "error" }, { "inputs": [], "name": "InvalidTotalAmount", "type": "error" }, { "inputs": [], "name": "LastPercentageMustBe100", "type": "error" }, { "inputs": [], "name": "MaxAllowedMilestonesHit", "type": "error" }, { "inputs": [], "name": "MilestonePercentagesNotSorted", "type": "error" }, { "inputs": [], "name": "MilestoneTimestampsNotSorted", "type": "error" }, { "inputs": [], "name": "MinMilestonesNotReached", "type": "error" }, { "inputs": [], "name": "MoreThanTwoEqualPercentages", "type": "error" }, { "inputs": [], "name": "NoClaimableAmount", "type": "error" }, { "inputs": [], "name": "NotInitializing", "type": "error" }, { "inputs": [], "name": "OnlyLastPercentageCanBe100", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "SafeERC20FailedOperation", "type": "error" }, { "inputs": [], "name": "UnlockedIsGreaterThanExpected", "type": "error" }, { "inputs": [], "name": "UnsuccessfulFetchOfTokenBalance", "type": "error" }, { "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": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Burn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Claim", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint64", "name": "version", "type": "uint64" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "milestoneIndex", "type": "uint256" } ], "name": "MilestoneReached", "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": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "addRecipient", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "recipients", "type": "address[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, { "internalType": "uint256", "name": "totalAmount", "type": "uint256" } ], "name": "addRecipients", "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": "value", "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": "uint256", "name": "amount", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "claim", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "claimFeeData", "outputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint64", "name": "", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "claimableBalanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "claimableSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "claimedBalanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "claimedSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" } ], "name": "exportRecipient", "outputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "recipients", "type": "address[]" } ], "name": "exportRecipients", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "claimableAmountOfImport", "type": "uint256" }, { "internalType": "uint256", "name": "unlocked", "type": "uint256" } ], "name": "importRecipient", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "recipients", "type": "address[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "claimableAmountsOfImport", "type": "uint256[]" }, { "internalType": "uint256", "name": "totalAmount", "type": "uint256" }, { "internalType": "uint256", "name": "unlocked", "type": "uint256" } ], "name": "importRecipients", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "address", "name": "underlyingTokenAddress", "type": "address" }, { "components": [ { "internalType": "uint64", "name": "timestamp", "type": "uint64" }, { "internalType": "enum IVestingToken.Ramp", "name": "ramp", "type": "uint8" }, { "internalType": "uint64", "name": "percentage", "type": "uint64" } ], "internalType": "struct IVestingToken.Milestone[]", "name": "milestonesArray", "type": "tuple[]" }, { "components": [ { "internalType": "bool", "name": "isEnabled", "type": "bool" }, { "internalType": "address", "name": "feeCollector", "type": "address" }, { "internalType": "uint64", "name": "transferFeePercentage", "type": "uint64" }, { "internalType": "uint64", "name": "claimFee", "type": "uint64" } ], "internalType": "struct IFeeManager.PermanentFeeData", "name": "customPermanentFee", "type": "tuple" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "lockedBalanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lockedSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "manager", "outputs": [ { "internalType": "contract IFeeManager", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "metadataOf", "outputs": [ { "components": [ { "internalType": "uint256", "name": "claimedAmountAfterTransfer", "type": "uint256" }, { "internalType": "uint256", "name": "claimedBalance", "type": "uint256" } ], "internalType": "struct VestingToken.Metadata", "name": "metadata", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "milestones", "outputs": [ { "components": [ { "internalType": "uint64", "name": "timestamp", "type": "uint64" }, { "internalType": "enum IVestingToken.Ramp", "name": "ramp", "type": "uint8" }, { "internalType": "uint64", "name": "percentage", "type": "uint64" } ], "internalType": "struct IVestingToken.Milestone[]", "name": "", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "permFeeData", "outputs": [ { "internalType": "bool", "name": "isEnabled", "type": "bool" }, { "internalType": "address", "name": "feeCollector", "type": "address" }, { "internalType": "uint64", "name": "transferFeePercentage", "type": "uint64" }, { "internalType": "uint64", "name": "claimFee", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "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": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "transferFeeData", "outputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint64", "name": "", "type": "uint64" } ], "stateMutability": "view", "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": [], "name": "underlyingToken", "outputs": [ { "internalType": "contract ERC20Upgradeable", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "unlockedPercentage", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "startIndex", "type": "uint256" } ], "name": "updateLastReachedMilestone", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
60806040523480156200001157600080fd5b506200001c62000022565b620000d6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000735760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d35780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613cdd80620000e66000396000f3fe6080604052600436106101fe5760003560e01c806370a082311161011d578063c8de1d56116100b0578063d67d13ce1161007f578063ddd38a0d11610064578063ddd38a0d146106b9578063e194aa2514610748578063f7982243146107c557600080fd5b8063d67d13ce14610634578063dd62ed3e1461065457600080fd5b8063c8de1d56146105b1578063ca5c7b91146105ea578063d38d3ee5146105ff578063d5ab20b41461061f57600080fd5b8063a1c7bd77116100ec578063a1c7bd7714610545578063a9059cbb1461055a578063ad4126b61461057a578063bfc2aa2a1461059c57600080fd5b806370a082311461048a57806389392c7c146104df57806395d89b41146105105780639c3ee2441461052557600080fd5b8063358f0a15116101955780634e71d92d116101645780634e71d92d1461040357806357c2f2e81461040b57806359355736146104555780636fa966931461047557600080fd5b8063358f0a151461039057806340bf0506146103b057806342966c68146103d0578063481c6a75146103e357600080fd5b806323b872dd116101d157806323b872dd146102be5780632495a599146102de5780632ae7888b14610316578063313ce5671461035357600080fd5b806306fdde0314610203578063095ea7b31461022e5780630f0e60a21461025e57806318160ddd14610280575b600080fd5b34801561020f57600080fd5b506102186107e5565b60405161022591906130e0565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004613146565b6108ba565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e6102793660046131be565b6108d4565b005b34801561028c57600080fd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02545b604051908152602001610225565b3480156102ca57600080fd5b5061024e6102d9366004613267565b610b81565b3480156102ea57600080fd5b506000546102fe906001600160a01b031681565b6040516001600160a01b039091168152602001610225565b34801561032257600080fd5b5061032b610b9b565b604080516001600160a01b03909316835267ffffffffffffffff909116602083015201610225565b34801561035f57600080fd5b5060015474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610225565b34801561039c57600080fd5b5061027e6103ab3660046132a8565b610ca8565b3480156103bc57600080fd5b5061027e6103cb36600461331c565b610ebd565b61027e6103de366004613357565b610ff9565b3480156103ef57600080fd5b506001546102fe906001600160a01b031681565b61027e61116c565b34801561041757600080fd5b5061042b610426366004613370565b6112d2565b604080516001600160a01b0390951685526020850193909352918301526060820152608001610225565b34801561046157600080fd5b506102b0610470366004613370565b611337565b34801561048157600080fd5b5061032b611384565b34801561049657600080fd5b506102b06104a5366004613370565b6001600160a01b031660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b3480156104eb57600080fd5b506104ff6104fa36600461338d565b61144c565b60405161022595949392919061340b565b34801561051c57600080fd5b506102186115de565b34801561053157600080fd5b506102b0610540366004613370565b61162f565b34801561055157600080fd5b506102b0611686565b34801561056657600080fd5b5061024e610575366004613146565b6116cd565b34801561058657600080fd5b5061058f6116e5565b60405161022591906134b8565b3480156105a857600080fd5b506102b06117ac565b3480156105bd57600080fd5b506102b06105cc366004613370565b6001600160a01b031660009081526006602052604090206001015490565b3480156105f657600080fd5b506102b06117f0565b34801561060b57600080fd5b5061027e61061a3660046135af565b611821565b34801561062b57600080fd5b506102b0611af4565b34801561064057600080fd5b5061027e61064f366004613357565b611c86565b34801561066057600080fd5b506102b061066f3660046136a0565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b3480156106c557600080fd5b5060075460085461070e9160ff8116916001600160a01b036101008304169167ffffffffffffffff75010000000000000000000000000000000000000000009091048116911684565b6040805194151585526001600160a01b03909316602085015267ffffffffffffffff91821692840192909252166060820152608001610225565b34801561075457600080fd5b506107aa610763366004613370565b6040805180820190915260008082526020820152506001600160a01b0316600090815260066020908152604091829020825180840190935280548352600101549082015290565b60408051825181526020928301519281019290925201610225565b3480156107d157600080fd5b5061027e6107e0366004613146565b611e0c565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610836906136d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610862906136d9565b80156108af5780601f10610884576101008083540402835291602001916108af565b820191906000526020600020905b81548152906001019060200180831161089257829003601f168201915b505050505091505090565b6000336108c8818585611e9a565b60019150505b92915050565b6108dc611eac565b6108e4611af4565b81111561091d576040517fd52b679700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86858114158061092d5750838614155b15610964576040517f028a6c5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061096e611f2d565b600054909150610989906001600160a01b0316333087612049565b600081610994611f2d565b61099e9190613755565b9050600080845b8015610b00578060019003905060006109f28d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508692506120c5915050565b90506109fe8184613768565b925060008f8f84818110610a1457610a1461377b565b9050602002016020810190610a299190613370565b905060008a8714610a4e578a610a3f88856137aa565b610a4991906137c1565b610a50565b825b90506000610a928e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506120c5915050565b90506000610aa183838e6120d3565b9050610aad848461217a565b6001600160a01b038416600090815260066020526040902054610ad1908290613768565b6001600160a01b038516600090815260066020526040902055610af48189613768565b975050505050506109a5565b50868114610b3a576040517f908128d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600354610b489190613768565b6003556002548290610b5b908590613768565b610b659190613768565b60025550610b7793506121ce92505050565b5050505050505050565b6000610b9084848460006121f4565b5060015b9392505050565b6040805160808101825260075460ff811615801583526001600160a01b03610100830416602084015267ffffffffffffffff7501000000000000000000000000000000000000000000909204821693830193909352600854166060820152600091829190610c16578060200151816060015192509250509091565b6001546000546040517f0f3db9da0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690630f3db9da906024015b6040805180830381865afa158015610c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9f9190613812565b92509250509091565b610cb0611eac565b838214610ce9576040517f028a6c5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610cf3611f2d565b600054909150610d0e906001600160a01b0316333085612049565b600081610d19611f2d565b610d239190613755565b905080600254610d339190613768565b600255600086805b8015610e4f57806001900390506000610d888b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508692506120c5915050565b90506000610dca8a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792506120c5915050565b9050610e0a8a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792506120c5915050565b610e149086613768565b94506000888714610e395788610e2a88846137aa565b610e3491906137c1565b610e3b565b815b9050610e47838261217a565b505050610d3b565b50848214610e89576040517f908128d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050610eb660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b610ec5611eac565b610ecd611af4565b811115610f06576040517fd52b679700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f10611f2d565b600054909150610f2b906001600160a01b0316333087612049565b600081610f36611f2d565b610f409190613755565b90506000610f4f8286866120d3565b6001600160a01b038816600090815260066020526040902054909150610f76908290613768565b6001600160a01b038816600090815260066020526040902055600354610f9d908290613768565b6003556002548190610fb0908490613768565b610fba9190613768565b600255610fc7878361217a565b505050610ff360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050565b6000611003611f2d565b60005460405184815291925033916001600160a01b039091169082907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a260408051602480820187905282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c680000000000000000000000000000000000000000000000000000000090811790915291516000916001600160a01b038516916110ce9190613841565b6000604051808303816000865af19150503d806000811461110b576040519150601f19603f3d011682016040523d82523d6000602084013e611110565b606091505b505090508061113257600054611132906001600160a01b031661dead886123b9565b600061113c611f2d565b6111469087613755565b9050806002546111569190613755565b60025561116385886123ea565b50505050505050565b611174611eac565b33600081815260066020526040902060055461118f90611c86565b6001600160a01b03821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604081205482546111dd916111d691613768565b8354612439565b905080600003611219576040517f493c1ab700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61122383826123ea565b8154611230908290613768565b82556001820154611242908290613768565b60018301556040518181526001600160a01b038416907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d49060200160405180910390a260005461129c906001600160a01b031684836123b9565b6112a461247d565b5050506112d060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b565b60008060008084611317866001600160a01b031660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b6113208761162f565b611328611af4565b93509350935093509193509193565b60006113428261162f565b6001600160a01b03831660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0060205260409020546108ce9190613755565b6040805160808101825260075460ff811615801583526001600160a01b03610100830416602084015267ffffffffffffffff75010000000000000000000000000000000000000000009092048216938301939093526008541660608201526000918291906113ff578060200151816040015192509250509091565b6001546000546040517f4b2675ef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690634b2675ef90602401610c5f565b3660006060808285818167ffffffffffffffff81111561146e5761146e61385d565b604051908082528060200260200182016040528015611497578160200160208202803683370190505b50905060008267ffffffffffffffff8111156114b5576114b561385d565b6040519080825280602002602001820160405280156114de578160200160208202803683370190505b509050825b80156115bb578060019003905060006115308c8c808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508692506120c5915050565b9050611570816001600160a01b031660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b8483815181106115825761158261377b565b6020026020010181815250506115978161162f565b8383815181106115a9576115a961377b565b602002602001018181525050506114e3565b50898983836115c8611af4565b939e929d50909b50995090975095505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610836906136d9565b6001600160a01b0381166000908152600660209081526040808320547f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00909252822054610b94906116809083613768565b82612439565b60006116c86002546116b67f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b6002546116c39190613755565b612439565b905090565b60006116dc33848460016121f4565b50600192915050565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156117a35760008481526020908190206040805160608101909152908401805467ffffffffffffffff81168352919290919083019068010000000000000000900460ff16600181111561176157611761613489565b600181111561177257611772613489565b8152905467ffffffffffffffff69010000000000000000009091041660209182015290825260019092019101611709565b50505050905090565b60006003546117d97f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b6002546117e69190613755565b6116c89190613755565b60006117fa611686565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546117e6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff1660008115801561186c5750825b905060008267ffffffffffffffff1660011480156118895750303b155b905081158015611897575080155b156118ce576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561192f5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6119b38d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061251c92505050565b6119bb61252e565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556119ef888861253e565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b16179055611a2a6128ec565b6001805460ff9290921674010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055856007611a82828261389a565b50508315611ae55784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b600080600460055481548110611b0c57611b0c61377b565b600091825260209091200180549091504267ffffffffffffffff9091161115611b3757600091505090565b8054600454600554690100000000000000000090920467ffffffffffffffff1691600090611b66906001613768565b90505b81811015611c7d57600060048281548110611b8657611b8661377b565b600091825260209091200180549091504267ffffffffffffffff90911611611bce5780549094506901000000000000000000900467ffffffffffffffff169250600101611b69565b6001815468010000000000000000900460ff166001811115611bf257611bf2613489565b03611c7b5784548154611c129167ffffffffffffffff90811691166139d1565b8554825467ffffffffffffffff92831692611c409269010000000000000000009081900482169204166139d1565b865467ffffffffffffffff91821691611c5a911642613755565b611c6491906137aa565b611c6e91906137c1565b611c789085613768565b93505b505b50909392505050565b4260048281548110611c9a57611c9a61377b565b60009182526020909120015467ffffffffffffffff161115611cb95750565b600554600480549060009084838110611cd457611cd461377b565b60009182526020909120019050835b82811015611d9757600060048281548110611d0057611d0061377b565b600091825260209091200180549091504267ffffffffffffffff90911611611d2c579150600101611ce3565b611d37856001613768565b821115611d8f576040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301955085907f25fcf68a4a87624d7edc6ca2f4f2cd6975c31a3133784e8e8e7942fa65974f6c90600090a25b505050505050565b50611da3600183613755565b831015611dfb576040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301935083907f25fcf68a4a87624d7edc6ca2f4f2cd6975c31a3133784e8e8e7942fa65974f6c90600090a25b6005548314610ff357505060055550565b611e14611eac565b6000611e1e611f2d565b600054909150611e39906001600160a01b0316333085612049565b600081611e44611f2d565b611e4e9190613755565b905080600254611e5e9190613768565b600255611e6b848261217a565b5050611e9660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050565b611ea783838360016129da565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611f27576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b60008054604080513060248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f70a08231000000000000000000000000000000000000000000000000000000001790529051839283926001600160a01b0390911691611fb49190613841565b600060405180830381855afa9150503d8060008114611fef576040519150601f19603f3d011682016040523d82523d6000602084013e611ff4565b606091505b509150915081801561200857506020815110155b15612017576020015192915050565b6040517f7677db4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610ff39186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b05565b602090810291909101015190565b6000670de0b6b3a764000082036120ec57506000610b94565b60006120f885846137aa565b9050600061210e85670de0b6b3a76400006137aa565b90508181111561214a576040517f4484113f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61215c84670de0b6b3a7640000613755565b6121668284613755565b61217091906137c1565b9695505050505050565b6001600160a01b0382166121c2576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b611e9660008383612b81565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6001600160a01b03841660009081526006602090815260408083207f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0090925282205490919082546122469086906137aa565b61225091906137c1565b8254909150612260908290613755565b82556001600160a01b038581169087161461235b57600080612280611384565b915091508067ffffffffffffffff166000146123585760006122ac67ffffffffffffffff8316886137aa565b670de0b6b3a76400009004905060006122cf67ffffffffffffffff8416866137aa565b670de0b6b3a7640000900490506122e68289613755565b97506122f28186613755565b6001600160a01b038516600090815260066020526040902054909550612319908290613768565b6001600160a01b0385166000908152600660205260409020558615612348576123428483612cea565b50612355565b6123538a8584612cf8565b505b50505b50505b6001600160a01b03851660009081526006602052604090205461237f908290613768565b6001600160a01b03861660009081526006602052604090205582156123ae576123a88585612cea565b50611d8f565b611163868686612cf8565b6040516001600160a01b03838116602483015260448201839052611ea791859182169063a9059cbb9060640161207e565b6001600160a01b03821661242d576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016121b9565b611e9682600083612b81565b60008083612445611af4565b61244f91906137aa565b670de0b6b3a7640000900490508281106124725761246d8382613755565b612475565b60005b949350505050565b600080612488610b9b565b915091508067ffffffffffffffff16600014611e96578067ffffffffffffffff1634146124e1576040517f9ed72d2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fc155047b0000000000000000000000000000000000000000000000000000000090600080808034885af180610eb657828252600482fd5b612524612d1c565b611e968282612d83565b612536612d1c565b6112d0612de6565b6000819003612579576040517f4fc0948300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61033a8111156125b5576040517f8375f01500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b36828260008181106125c9576125c961377b565b6060029190910191506000905082815b81811015611d8f5780156127da57838686838181106125fa576125fa61377b565b606002919091019550612612905060208601866139f9565b67ffffffffffffffff1661262960208301836139f9565b67ffffffffffffffff161061266a576040517f2ecb688400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61267a60608601604087016139f9565b67ffffffffffffffff1661269460608301604084016139f9565b67ffffffffffffffff1611156126d6576040517f218d22d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83156127a1576126ec60608601604087016139f9565b67ffffffffffffffff1661270660608301604084016139f9565b67ffffffffffffffff1603612747576040517f04855a8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016127596040870160208801613a23565b600181111561276a5761276a613489565b146127a1576040517f71e2986a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b160608601604087016139f9565b67ffffffffffffffff166127cb60608301604084016139f9565b67ffffffffffffffff16149350505b6127e5600183613755565b810361284a57670de0b6b3a764000061280460608601604087016139f9565b67ffffffffffffffff1614612845576040517f5be691b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128a4565b670de0b6b3a764000061286360608601604087016139f9565b67ffffffffffffffff16036128a4576040517fe575499300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805460018101825560009190915284907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b016128e28282613a40565b50506001016125d9565b6000805460408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529051839283926001600160a01b03909116916129629190613841565b600060405180830381855afa9150503d806000811461299d576040519150601f19603f3d011682016040523d82523d6000602084013e6129a2565b606091505b50915091508180156129b657506020815110155b156129d157602081015160ff81116129cf579392505050565b505b60129250505090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038516612a3e576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016121b9565b6001600160a01b038416612a81576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016121b9565b6001600160a01b03808616600090815260018301602090815260408083209388168352929052208390558115610eb657836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051612af691815260200190565b60405180910390a35050505050565b6000612b1a6001600160a01b03841683612dee565b90508051600014158015612b3f575080806020019051810190612b3d9190613b51565b155b15611ea7576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016121b9565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416612bcf5781816002016000828254612bc49190613768565b90915550612c5a9050565b6001600160a01b03841660009081526020829052604090205482811015612c3b576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101829052604481018490526064016121b9565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b038316612c78576002810180548390039055612c97565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612cdc91815260200190565b60405180910390a350505050565b6000336108c8818585612dfc565b600033612d06858285612e8d565b612d11858585612dfc565b506001949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166112d0576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d8b612d1c565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03612dd78482613bb6565b5060048101610ff38382613bb6565b6121ce612d1c565b6060610b9483836000612f5b565b6001600160a01b038316612e3f576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016121b9565b6001600160a01b038216612e82576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016121b9565b611ea7838383612b81565b6001600160a01b0383811660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ff35781811015612f4c576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101829052604481018390526064016121b9565b610ff3848484840360006129da565b606081471015612f99576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016121b9565b600080856001600160a01b03168486604051612fb59190613841565b60006040518083038185875af1925050503d8060008114612ff2576040519150601f19603f3d011682016040523d82523d6000602084013e612ff7565b606091505b50915091506121708683836060826130175761301282613077565b610b94565b815115801561302e57506001600160a01b0384163b155b15613070576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016121b9565b5080610b94565b8051156130875780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60005b838110156130d75781810151838201526020016130bf565b50506000910152565b60208152600082518060208401526130ff8160408501602087016130bc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b03811681146130b957600080fd5b6000806040838503121561315957600080fd5b823561316481613131565b946020939093013593505050565b60008083601f84011261318457600080fd5b50813567ffffffffffffffff81111561319c57600080fd5b6020830191508360208260051b85010111156131b757600080fd5b9250929050565b60008060008060008060008060a0898b0312156131da57600080fd5b883567ffffffffffffffff808211156131f257600080fd5b6131fe8c838d01613172565b909a50985060208b013591508082111561321757600080fd5b6132238c838d01613172565b909850965060408b013591508082111561323c57600080fd5b506132498b828c01613172565b999c989b509699959896976060870135966080013595509350505050565b60008060006060848603121561327c57600080fd5b833561328781613131565b9250602084013561329781613131565b929592945050506040919091013590565b6000806000806000606086880312156132c057600080fd5b853567ffffffffffffffff808211156132d857600080fd5b6132e489838a01613172565b909750955060208801359150808211156132fd57600080fd5b5061330a88828901613172565b96999598509660400135949350505050565b6000806000806080858703121561333257600080fd5b843561333d81613131565b966020860135965060408601359560600135945092505050565b60006020828403121561336957600080fd5b5035919050565b60006020828403121561338257600080fd5b8135610b9481613131565b600080602083850312156133a057600080fd5b823567ffffffffffffffff8111156133b757600080fd5b6133c385828601613172565b90969095509350505050565b60008151808452602080850194506020840160005b83811015613400578151875295820195908201906001016133e4565b509495945050505050565b6080808252810185905260008660a08301825b8881101561344e57823561343181613131565b6001600160a01b031682526020928301929091019060010161341e565b50838103602085015261346181886133cf565b915050828103604084015261347681866133cf565b9150508260608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208082528251828201819052600091906040908185019086840185805b8381101561354757825167ffffffffffffffff8082511687528882015160028110613528577f4e487b710000000000000000000000000000000000000000000000000000000085526021600452602485fd5b878a0152908701511686860152606090940193918601916001016134d6565b509298975050505050505050565b60008083601f84011261356757600080fd5b50813567ffffffffffffffff81111561357f57600080fd5b6020830191508360208285010111156131b757600080fd5b6000608082840312156135a957600080fd5b50919050565b600080600080600080600080610100898b0312156135cc57600080fd5b883567ffffffffffffffff808211156135e457600080fd5b6135f08c838d01613555565b909a50985060208b013591508082111561360957600080fd5b6136158c838d01613555565b909850965060408b0135915061362a82613131565b90945060608a0135908082111561364057600080fd5b818b0191508b601f83011261365457600080fd5b81358181111561366357600080fd5b8c602060608302850101111561367857600080fd5b6020830195508094505050506136918a60808b01613597565b90509295985092959890939650565b600080604083850312156136b357600080fd5b82356136be81613131565b915060208301356136ce81613131565b809150509250929050565b600181811c908216806136ed57607f821691505b6020821081036135a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108ce576108ce613726565b808201808211156108ce576108ce613726565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820281158282048414176108ce576108ce613726565b6000826137f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff811681146130b957600080fd5b6000806040838503121561382557600080fd5b825161383081613131565b60208401519092506136ce816137fc565b600082516138538184602087016130bc565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80151581146130b957600080fd5b81356138a58161388c565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811691151560ff16918217835560208401356138e381613131565b74ffffffffffffffffffffffffffffffffffffffff008160081b16905080837fffffffffffffffffffffff0000000000000000000000000000000000000000008416171784556040850135613937816137fc565b7cffffffffffffffff0000000000000000000000000000000000000000008160a81b16847fffffff00000000000000000000000000000000000000000000000000000000008516178317178555505050506060820135613996816137fc565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8316179055505050565b67ffffffffffffffff8281168282160390808211156139f2576139f2613726565b5092915050565b600060208284031215613a0b57600080fd5b8135610b94816137fc565b600281106130b957600080fd5b600060208284031215613a3557600080fd5b8135610b9481613a16565b8135613a4b816137fc565b81547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8216178255506020820135613a8c81613a16565b60028110613ac3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815468ff00000000000000008260401b169150817fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff82161783556040840135613b0b816137fc565b70ffffffffffffffff0000000000000000008160481b16837fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff8416171784555050505050565b600060208284031215613b6357600080fd5b8151610b948161388c565b601f821115611ea7576000816000526020600020601f850160051c81016020861015613b975750805b601f850160051c820191505b81811015611d8f57828155600101613ba3565b815167ffffffffffffffff811115613bd057613bd061385d565b613be481613bde84546136d9565b84613b6e565b602080601f831160018114613c375760008415613c015750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d8f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613c8457888601518255948401946001909101908401613c65565b5085821015613cc057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000818000a