Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.91965 ETH
Eth Value
$2,377.24 (@ $2,584.94/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 816 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 20427015 | 11 days ago | IN | 0 ETH | 0.00081649 | ||||
Lock | 20419656 | 12 days ago | IN | 0.1 ETH | 0.00312553 | ||||
Claim | 20211083 | 41 days ago | IN | 0 ETH | 0.00018449 | ||||
Claim | 20211083 | 41 days ago | IN | 0 ETH | 0.00018449 | ||||
Claim | 20211083 | 41 days ago | IN | 0 ETH | 0.0002343 | ||||
Claim | 19208967 | 182 days ago | IN | 0 ETH | 0.00141103 | ||||
Claim | 19208963 | 182 days ago | IN | 0 ETH | 0.00144646 | ||||
Claim | 19208961 | 182 days ago | IN | 0 ETH | 0.00185261 | ||||
Claim | 17892696 | 366 days ago | IN | 0 ETH | 0.00233895 | ||||
Lock | 17566389 | 412 days ago | IN | 0.002 ETH | 0.00340634 | ||||
Claim | 16813214 | 518 days ago | IN | 0 ETH | 0.001556 | ||||
Claim | 16648152 | 541 days ago | IN | 0 ETH | 0.00289285 | ||||
Claim | 16648152 | 541 days ago | IN | 0 ETH | 0.00405645 | ||||
Claim | 16647061 | 542 days ago | IN | 0 ETH | 0.00343508 | ||||
Claim | 16647058 | 542 days ago | IN | 0 ETH | 0.00355502 | ||||
Claim | 16511790 | 560 days ago | IN | 0 ETH | 0.00374093 | ||||
Claim | 15572896 | 692 days ago | IN | 0 ETH | 0.00046894 | ||||
Claim | 15517120 | 700 days ago | IN | 0 ETH | 0.00056543 | ||||
Claim | 15382607 | 722 days ago | IN | 0 ETH | 0.00063972 | ||||
Claim | 15013879 | 780 days ago | IN | 0 ETH | 0.00260035 | ||||
Claim | 14824888 | 812 days ago | IN | 0 ETH | 0.00253515 | ||||
Claim | 14824813 | 812 days ago | IN | 0 ETH | 0.00260112 | ||||
Claim | 14603035 | 847 days ago | IN | 0 ETH | 0.00152423 | ||||
Claim | 14461817 | 869 days ago | IN | 0 ETH | 0.00484377 | ||||
Lock | 14282983 | 897 days ago | IN | 0.002 ETH | 0.00878764 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20427015 | 11 days ago | 0.0997 ETH | ||||
20419656 | 12 days ago | 0.0003 ETH | ||||
17566389 | 412 days ago | 0.000006 ETH | ||||
15572896 | 692 days ago | 0.003988 ETH | ||||
14603035 | 847 days ago | 1.485 ETH | ||||
14282983 | 897 days ago | 0.000006 ETH | ||||
14282908 | 897 days ago | 0.00006 ETH | ||||
14187881 | 912 days ago | 0.000003 ETH | ||||
13428730 | 1030 days ago | 0.000012 ETH | ||||
13334597 | 1045 days ago | 0.00997 ETH | ||||
13331916 | 1046 days ago | 0.00003 ETH | ||||
12144388 | 1230 days ago | 0.025 ETH | ||||
11703843 | 1298 days ago | 1.01475 ETH | ||||
11450498 | 1336 days ago | 0.0003 ETH | ||||
11446107 | 1337 days ago | 0.4985 ETH | ||||
11406276 | 1343 days ago | 0.000075 ETH | ||||
11310358 | 1358 days ago | 0.0015 ETH | ||||
11234412 | 1370 days ago | 0.000075 ETH | ||||
11183977 | 1377 days ago | 0.4851 ETH | ||||
11127209 | 1386 days ago | 0.000075 ETH | ||||
11096576 | 1391 days ago | 0.02475 ETH | ||||
11073199 | 1394 days ago | 0.00025 ETH | ||||
11009291 | 1404 days ago | 0.001 ETH | ||||
10882071 | 1424 days ago | 4.95 ETH | ||||
10823071 | 1433 days ago | 0.00025 ETH |
Loading...
Loading
Contract Name:
Lock
Compiler Version
v0.5.15+commit.6a57276f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-03-04 */ // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: openzeppelin-solidity/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: openzeppelin-solidity/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * IMPORTANT: It is unsafe to assume that an address for which this * function returns false is an externally-owned account (EOA) and not a * contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/Lock.sol pragma solidity 0.5.15; /** * @dev This contract will hold user locked funds which will be unlocked after * lock-up period ends */ contract Lock is Ownable { using SafeERC20 for IERC20; using SafeMath for uint256; enum Status { _, OPEN, CLOSED } enum TokenStatus {_, ACTIVE, INACTIVE } struct Token { address tokenAddress; uint256 minAmount; bool emergencyUnlock; TokenStatus status; uint256[] tierAmounts; uint256[] tierFees; } Token[] private _tokens; IERC20 private _lockToken; //Fee per lock in lock token uint256 private _lockTokenFee; //Keeps track of token index in above array mapping(address => uint256) private _tokenVsIndex; //Wallet where fees will go address payable private _wallet; address constant private ETH_ADDRESS = address( 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ); struct LockedAsset { address token;// Token address uint256 amount;// Amount locked uint256 startDate;// Start date. We can remove this later uint256 endDate; uint256 lastLocked; //Amount threshold after a locked asset can be unlocked uint256 amountThreshold; address payable beneficiary;// Beneficary who will receive funds Status status; } struct Airdrop { address destToken; //numerator and denominator will be used to calculate ratio //Example 1DAI will get you 4 SAI //which means numerator = 4 and denominator = 1 uint256 numerator; uint256 denominator; uint256 date;// Date at which time this entry was made //Only those locked asset which were locked before this date will be //given airdropped tokens } //Mapping of base token versus airdropped token mapping(address => Airdrop[]) private _baseTokenVsAirdrops; //Global lockedasset id. Also give total number of lock-ups made so far uint256 private _lockId; //list of all asset ids for a user/beneficiary mapping(address => uint256[]) private _userVsLockIds; mapping(uint256 => LockedAsset) private _idVsLockedAsset; bool private _paused; event TokenAdded(address indexed token); event TokenInactivated(address indexed token); event TokenActivated(address indexed token); event WalletChanged(address indexed wallet); event AssetLocked( address indexed token, address indexed sender, address indexed beneficiary, uint256 id, uint256 amount, uint256 startDate, uint256 endDate, bool lockTokenFee, uint256 fee ); event TokenUpdated( uint256 indexed id, address indexed token, uint256 minAmount, bool emergencyUnlock, uint256[] tierAmounts, uint256[] tierFees ); event Paused(); event Unpaused(); event AssetClaimed( uint256 indexed id, address indexed beneficiary, address indexed token ); event AirdropAdded( address indexed baseToken, address indexed destToken, uint256 index, uint256 airdropDate, uint256 numerator, uint256 denominator ); event AirdropUpdated( address indexed baseToken, address indexed destToken, uint256 index, uint256 airdropDate, uint256 numerator, uint256 denominator ); event TokensAirdropped( address indexed destToken, uint256 amount ); event LockTokenUpdated(address indexed lockTokenAddress); event LockTokenFeeUpdated(uint256 fee); event AmountAdded(address indexed beneficiary, uint256 id, uint256 amount); modifier tokenExist(address token) { require(_tokenVsIndex[token] > 0, "Lock: Token does not exist!!"); _; } modifier tokenDoesNotExist(address token) { require(_tokenVsIndex[token] == 0, "Lock: Token already exist!!"); _; } modifier canLockAsset(address token) { uint256 index = _tokenVsIndex[token]; require(index > 0, "Lock: Token does not exist!!"); require( _tokens[index.sub(1)].status == TokenStatus.ACTIVE, "Lock: Token not active!!" ); require( !_tokens[index.sub(1)].emergencyUnlock, "Lock: Token is in emergency unlock state!!" ); _; } modifier canClaim(uint256 id) { require(claimable(id), "Lock: Can't claim asset"); require( _idVsLockedAsset[id].beneficiary == msg.sender, "Lock: Unauthorized access!!" ); _; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Lock: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Lock: not paused"); _; } /** * @dev Constructor * @param wallet Wallet address where fees will go * @param lockTokenAddress Address of the lock token * @param lockTokenFee Fee for each lock in lock token */ constructor( address payable wallet, address lockTokenAddress, uint256 lockTokenFee ) public { require( wallet != address(0), "Lock: Please provide valid wallet address!!" ); require( lockTokenAddress != address(0), "Lock: Invalid lock token address" ); _lockToken = IERC20(lockTokenAddress); _wallet = wallet; _lockTokenFee = lockTokenFee; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() external view returns (bool) { return _paused; } /** * @dev returns the fee receiver wallet address */ function getWallet() external view returns(address) { return _wallet; } /** * @dev Returns total token count */ function getTokenCount() external view returns(uint256) { return _tokens.length; } /** * @dev Returns lock token address */ function getLockToken() external view returns(address) { return address(_lockToken); } /** * @dev Returns fee per lock in lock token */ function getLockTokenFee() external view returns(uint256) { return _lockTokenFee; } /** * @dev Returns list of supported tokens * This will be a paginated method which will only send 15 tokens in one request * This is done to prevent infinite loops and overflow of gas limits * @param start start index for pagination * @param length Amount of tokens to fetch */ function getTokens(uint256 start, uint256 length) external view returns( address[] memory tokenAddresses, uint256[] memory minAmounts, bool[] memory emergencyUnlocks, TokenStatus[] memory statuses ) { tokenAddresses = new address[](length); minAmounts = new uint256[](length); emergencyUnlocks = new bool[](length); statuses = new TokenStatus[](length); require(start.add(length) <= _tokens.length, "Lock: Invalid input"); require(length > 0 && length <= 15, "Lock: Invalid length"); uint256 count = 0; for(uint256 i = start; i < start.add(length); i++) { tokenAddresses[count] = _tokens[i].tokenAddress; minAmounts[count] = _tokens[i].minAmount; emergencyUnlocks[count] = _tokens[i].emergencyUnlock; statuses[count] = _tokens[i].status; count = count.add(1); } return( tokenAddresses, minAmounts, emergencyUnlocks, statuses ); } /** * @dev Returns information about specific token * @dev tokenAddress Address of the token */ function getTokenInfo(address tokenAddress) external view returns( uint256 minAmount, bool emergencyUnlock, TokenStatus status, uint256[] memory tierAmounts, uint256[] memory tierFees ) { uint256 index = _tokenVsIndex[tokenAddress]; if(index > 0){ index = index.sub(1); Token memory token = _tokens[index]; return ( token.minAmount, token.emergencyUnlock, token.status, token.tierAmounts, token.tierFees ); } } /** * @dev Returns information about a locked asset * @param id Asset id */ function getLockedAsset(uint256 id) external view returns( address token, uint256 amount, uint256 startDate, uint256 endDate, uint256 lastLocked, address beneficiary, Status status, uint256 amountThreshold ) { LockedAsset memory asset = _idVsLockedAsset[id]; token = asset.token; amount = asset.amount; startDate = asset.startDate; endDate = asset.endDate; beneficiary = asset.beneficiary; status = asset.status; amountThreshold = asset.amountThreshold; lastLocked = asset.lastLocked; return( token, amount, startDate, endDate, lastLocked, beneficiary, status, amountThreshold ); } /** * @dev Returns all asset ids for a user * @param user Address of the user */ function getAssetIds( address user ) external view returns (uint256[] memory ids) { return _userVsLockIds[user]; } /** * @dev Returns airdrop info for a given token * @param token Token address */ function getAirdrops(address token) external view returns( address[] memory destTokens, uint256[] memory numerators, uint256[] memory denominators, uint256[] memory dates ) { uint256 length = _baseTokenVsAirdrops[token].length; destTokens = new address[](length); numerators = new uint256[](length); denominators = new uint256[](length); dates = new uint256[](length); //This loop can be very costly if there are very large number of airdrops for a token. //Which we presume will not be the case for(uint256 i = 0; i < length; i++){ Airdrop memory airdrop = _baseTokenVsAirdrops[token][i]; destTokens[i] = airdrop.destToken; numerators[i] = airdrop.numerator; denominators[i] = airdrop.denominator; dates[i] = airdrop.date; } return ( destTokens, numerators, denominators, dates ); } /** * @dev Returns specific airdrop for a base token * @param token Base token address * @param index Index at which this airdrop is in array */ function getAirdrop(address token, uint256 index) external view returns( address destToken, uint256 numerator, uint256 denominator, uint256 date ) { return ( _baseTokenVsAirdrops[token][index].destToken, _baseTokenVsAirdrops[token][index].numerator, _baseTokenVsAirdrops[token][index].denominator, _baseTokenVsAirdrops[token][index].date ); } /** * @dev Called by an admin to pause, triggers stopped state. */ function pause() external onlyOwner whenNotPaused { _paused = true; emit Paused(); } /** * @dev Called by an admin to unpause, returns to normal state. */ function unpause() external onlyOwner whenPaused { _paused = false; emit Unpaused(); } /** * @dev Allows admin to set airdrop token for a given base token * @param baseToken Address of the base token * @param destToken Address of the airdropped token * @param numerator Numerator to calculate ratio * @param denominator Denominator to calculate ratio * @param date Date at which airdrop happened or will happen */ function setAirdrop( address baseToken, address destToken, uint256 numerator, uint256 denominator, uint256 date ) external onlyOwner tokenExist(baseToken) { require(destToken != address(0), "Lock: Invalid destination token!!"); require(numerator > 0, "Lock: Invalid numerator!!"); require(denominator > 0, "Lock: Invalid denominator!!"); require(isActive(baseToken), "Lock: Base token is not active!!"); _baseTokenVsAirdrops[baseToken].push(Airdrop({ destToken: destToken, numerator: numerator, denominator: denominator, date: date })); emit AirdropAdded( baseToken, destToken, _baseTokenVsAirdrops[baseToken].length.sub(1), date, numerator, denominator ); } /** * @dev Update lock token address * @param lockTokenAddress New lock token address */ function updateLockToken(address lockTokenAddress) external onlyOwner { require( lockTokenAddress != address(0), "Lock: Invalid lock token address" ); _lockToken = IERC20(lockTokenAddress); emit LockTokenUpdated(lockTokenAddress); } /** * @dev Update fee in lock token * @param lockTokenFee Fee per lock in lock token */ function updateLockTokenFee(uint256 lockTokenFee) external onlyOwner { _lockTokenFee = lockTokenFee; emit LockTokenFeeUpdated(lockTokenFee); } /** * @dev Allows admin to update airdrop at given index * @param baseToken Base token address for which airdrop has to be updated * @param numerator New numerator * @param denominator New denominator * @param date New airdrop date * @param index Index at which this airdrop resides for the basetoken */ function updateAirdrop( address baseToken, uint256 numerator, uint256 denominator, uint256 date, uint256 index ) external onlyOwner { require( _baseTokenVsAirdrops[baseToken].length > index, "Lock: Invalid index value!!" ); require(numerator > 0, "Lock: Invalid numerator!!"); require(denominator > 0, "Lock: Invalid denominator!!"); Airdrop storage airdrop = _baseTokenVsAirdrops[baseToken][index]; airdrop.numerator = numerator; airdrop.denominator = denominator; airdrop.date = date; emit AirdropUpdated( baseToken, airdrop.destToken, index, date, numerator, denominator ); } /** * @dev Allows admin to set fee receiver wallet * @param wallet New wallet address */ function setWallet(address payable wallet) external onlyOwner { require( wallet != address(0), "Lock: Please provider valid wallet address!!" ); _wallet = wallet; emit WalletChanged(wallet); } /** * @dev Allows admin to update token info * @param tokenAddress Address of the token to be updated * @param minAmount Min amount of tokens required to lock * @param emergencyUnlock If token is in emergency unlock state * @param tierAmounts Threshold amount for chargin fee * @param tierFees Fees for each tier */ function updateToken( address tokenAddress, uint256 minAmount, bool emergencyUnlock, uint256[] calldata tierAmounts, uint256[] calldata tierFees ) external onlyOwner tokenExist(tokenAddress) { require( tierAmounts.length == tierFees.length, "Lock: Tiers does not match" ); uint256 index = _tokenVsIndex[tokenAddress].sub(1); Token storage token = _tokens[index]; token.minAmount = minAmount; token.emergencyUnlock = emergencyUnlock; token.tierAmounts = tierAmounts; token.tierFees = tierFees; emit TokenUpdated( index, tokenAddress, minAmount, emergencyUnlock, tierAmounts, tierFees ); } /** * @dev Allows admin to add new token to the list * @param token Address of the token * @param minAmount Minimum amount of tokens to lock for this token * @param tierAmounts Threshold amount for chargin fee * @param tierFees Fees for each tier */ function addToken( address token, uint256 minAmount, uint256[] calldata tierAmounts, uint256[] calldata tierFees ) external onlyOwner tokenDoesNotExist(token) { require( tierAmounts.length == tierFees.length, "Lock: Tiers does not match" ); _tokens.push(Token({ tokenAddress: token, minAmount: minAmount, emergencyUnlock: false, status: TokenStatus.ACTIVE, tierAmounts: tierAmounts, tierFees: tierFees })); _tokenVsIndex[token] = _tokens.length; emit TokenAdded(token); } /** * @dev Allows admin to inactivate token * @param token Address of the token to be inactivated */ function inactivateToken( address token ) external onlyOwner tokenExist(token) { uint256 index = _tokenVsIndex[token].sub(1); require( _tokens[index].status == TokenStatus.ACTIVE, "Lock: Token already inactive!!" ); _tokens[index].status = TokenStatus.INACTIVE; emit TokenInactivated(token); } /** * @dev Allows admin to activate any existing token * @param token Address of the token to be activated */ function activateToken( address token ) external onlyOwner tokenExist(token) { uint256 index = _tokenVsIndex[token].sub(1); require( _tokens[index].status == TokenStatus.INACTIVE, "Lock: Token already active!!" ); _tokens[index].status = TokenStatus.ACTIVE; emit TokenActivated(token); } /** * @dev Allows user to lock asset. In case of ERC-20 token the user will * first have to approve the contract to spend on his/her behalf * @param tokenAddress Address of the token to be locked * @param amount Amount of tokens to lock * @param duration Duration for which tokens to be locked. In seconds * @param beneficiary Address of the beneficiary * @param amountThreshold Threshold amount which is when locked in a single lock will make that lock claimable * @param lockFee Bool to check if fee to be paid in lock token or not */ function lock( address tokenAddress, uint256 amount, uint256 duration, address payable beneficiary, uint256 amountThreshold, bool lockFee ) external payable whenNotPaused canLockAsset(tokenAddress) { uint256 remValue = _lock( tokenAddress, amount, duration, beneficiary, amountThreshold, msg.value, lockFee ); require( remValue < 10000000000, "Lock: Sent more ethers then required" ); } /** * @dev Allows user to lock asset. In case of ERC-20 token the user will * first have to approve the contract to spend on his/her behalf * @param tokenAddress Address of the token to be locked * @param amounts List of amount of tokens to lock * @param durations List of duration for which tokens to be locked. In seconds * @param beneficiaries List of addresses of the beneficiaries * @param amountThresholds List of threshold amounts which is when locked in a single lock will make that lock claimable * @param lockFee Bool to check if fee to be paid in lock token or not */ function bulkLock( address tokenAddress, uint256[] calldata amounts, uint256[] calldata durations, address payable[] calldata beneficiaries, uint256[] calldata amountThresholds, bool lockFee ) external payable whenNotPaused canLockAsset(tokenAddress) { uint256 remValue = msg.value; require(amounts.length == durations.length, "Lock: Invalid input"); require(amounts.length == beneficiaries.length, "Lock: Invalid input"); require( amounts.length == amountThresholds.length, "Lock: Invalid input" ); for(uint256 i = 0; i < amounts.length; i++){ remValue = _lock( tokenAddress, amounts[i], durations[i], beneficiaries[i], amountThresholds[i], remValue, lockFee ); } require( remValue < 10000000000, "Lock: Sent more ethers then required" ); } /** * @dev Allows beneficiary of locked asset to claim asset after lock-up period ends * @param id Id of the locked asset */ function claim(uint256 id) external canClaim(id) { LockedAsset memory lockedAsset = _idVsLockedAsset[id]; if(ETH_ADDRESS == lockedAsset.token) { _claimETH( id ); } else { _claimERC20( id ); } emit AssetClaimed( id, lockedAsset.beneficiary, lockedAsset.token ); } /** * @dev Allows anyone to add more tokens in the existing lock * @param id id of the locked asset * @param amount Amount to be added * @param lockFee Bool to check if fee to be paid in lock token or not */ function addAmount( uint256 id, uint256 amount, bool lockFee ) external payable whenNotPaused { LockedAsset storage lockedAsset = _idVsLockedAsset[id]; require(lockedAsset.status == Status.OPEN, "Lock: Lock is not open"); Token memory token = _tokens[_tokenVsIndex[lockedAsset.token].sub(1)]; //At the time of addition of tokens previous aridrops will be claimed _claimAirdroppedTokens( lockedAsset.token, lockedAsset.lastLocked, lockedAsset.amount ); uint256 fee = 0; uint256 newAmount = 0; (fee, newAmount) = _calculateFee(amount, lockFee, token); if(lockFee) { _lockToken.safeTransferFrom(msg.sender, _wallet, _lockTokenFee); } if(ETH_ADDRESS == lockedAsset.token) { require(amount == msg.value, "Lock: Insufficient value sent"); if(!lockFee) { (bool success,) = _wallet.call.value(fee)(""); require(success, "Lock: Transfer of fee failed"); } } else { if(!lockFee){ IERC20(lockedAsset.token).safeTransferFrom(msg.sender, _wallet, fee); } IERC20(lockedAsset.token).safeTransferFrom(msg.sender, address(this), newAmount); } lockedAsset.amount = lockedAsset.amount.add(newAmount); lockedAsset.lastLocked = block.timestamp; emit AmountAdded(lockedAsset.beneficiary, id, newAmount); } /** * @dev Returns whether given asset can be claimed or not * @param id id of an asset */ function claimable(uint256 id) public view returns(bool){ LockedAsset memory asset = _idVsLockedAsset[id]; if( asset.status == Status.OPEN && ( asset.endDate <= block.timestamp || _tokens[_tokenVsIndex[asset.token].sub(1)].emergencyUnlock || (asset.amountThreshold > 0 && asset.amount >= asset.amountThreshold) ) ) { return true; } return false; } /** * @dev Returns whether provided token is active or not * @param token Address of the token to be checked */ function isActive(address token) public view returns(bool) { uint256 index = _tokenVsIndex[token]; if(index > 0){ return (_tokens[index.sub(1)].status == TokenStatus.ACTIVE); } return false; } /** * @dev Helper method to lock asset */ function _lock( address tokenAddress, uint256 amount, uint256 duration, address payable beneficiary, uint256 amountThreshold, uint256 value, bool lockFee ) private returns(uint256) { require( beneficiary != address(0), "Lock: Provide valid beneficiary address!!" ); Token memory token = _tokens[_tokenVsIndex[tokenAddress].sub(1)]; require( amount >= token.minAmount, "Lock: Please provide minimum amount of tokens!!" ); uint256 endDate = block.timestamp.add(duration); uint256 fee = 0; uint256 newAmount = 0; (fee, newAmount) = _calculateFee(amount, lockFee, token); uint256 remValue = value; if(ETH_ADDRESS == tokenAddress) { _lockETH( newAmount, fee, endDate, beneficiary, amountThreshold, value, lockFee ); remValue = remValue.sub(amount); } else { _lockERC20( tokenAddress, newAmount, fee, endDate, beneficiary, amountThreshold, lockFee ); } emit AssetLocked( tokenAddress, msg.sender, beneficiary, _lockId, newAmount, block.timestamp, endDate, lockFee, fee ); return remValue; } /** * @dev Helper method to lock ETH */ function _lockETH( uint256 amount, uint256 fee, uint256 endDate, address payable beneficiary, uint256 amountThreshold, uint256 value, bool lockFee ) private { //Transferring fee to the wallet if(lockFee){ require(value >= amount, "Lock: Enough ETH not sent!!"); _lockToken.safeTransferFrom(msg.sender, _wallet, fee); } else { require(value >= amount.add(fee), "Lock: Enough ETH not sent!!"); (bool success,) = _wallet.call.value(fee)(""); require(success, "Lock: Transfer of fee failed"); } _lockId = _lockId.add(1); _idVsLockedAsset[_lockId] = LockedAsset({ token: ETH_ADDRESS, amount: amount, startDate: block.timestamp, endDate: endDate, lastLocked: block.timestamp, beneficiary: beneficiary, status: Status.OPEN, amountThreshold: amountThreshold }); _userVsLockIds[beneficiary].push(_lockId); } /** * @dev Helper method to lock ERC-20 tokens */ function _lockERC20( address token, uint256 amount, uint256 fee, uint256 endDate, address payable beneficiary, uint256 amountThreshold, bool lockFee ) private { //Transfer fee to the wallet if(lockFee){ _lockToken.safeTransferFrom(msg.sender, _wallet, fee); } else { IERC20(token).safeTransferFrom(msg.sender, _wallet, fee); } //Transfer required amount of tokens to the contract from user balance IERC20(token).safeTransferFrom(msg.sender, address(this), amount); _lockId = _lockId.add(1); _idVsLockedAsset[_lockId] = LockedAsset({ token: token, amount: amount, startDate: block.timestamp, endDate: endDate, lastLocked: block.timestamp, beneficiary: beneficiary, status: Status.OPEN, amountThreshold: amountThreshold }); _userVsLockIds[beneficiary].push(_lockId); } /** * @dev Helper method to claim ETH */ function _claimETH(uint256 id) private { LockedAsset storage asset = _idVsLockedAsset[id]; asset.status = Status.CLOSED; (bool success,) = msg.sender.call.value(asset.amount)(""); require(success, "Lock: Failed to transfer eth!!"); _claimAirdroppedTokens( asset.token, asset.lastLocked, asset.amount ); } /** * @dev Helper method to claim ERC-20 */ function _claimERC20(uint256 id) private { LockedAsset storage asset = _idVsLockedAsset[id]; asset.status = Status.CLOSED; IERC20(asset.token).safeTransfer(msg.sender, asset.amount); _claimAirdroppedTokens( asset.token, asset.lastLocked, asset.amount ); } /** * @dev Helper method to claim airdropped tokens * @param baseToken Base Token address * @param lastLocked Date when base tokens were last locked * @param amount Amount of base tokens locked */ function _claimAirdroppedTokens( address baseToken, uint256 lastLocked, uint256 amount ) private { //This loop can be very costly if number of airdropped tokens //for base token is very large. But we assume that it is not going to be the case for(uint256 i = 0; i < _baseTokenVsAirdrops[baseToken].length; i++) { Airdrop memory airdrop = _baseTokenVsAirdrops[baseToken][i]; if(airdrop.date > lastLocked && airdrop.date < block.timestamp) { uint256 airdropAmount = amount.mul(airdrop.numerator).div(airdrop.denominator); IERC20(airdrop.destToken).safeTransfer(msg.sender, airdropAmount); emit TokensAirdropped(airdrop.destToken, airdropAmount); } } } //Helper method to calculate fee function _calculateFee( uint256 amount, bool lockFee, Token memory token ) private view returns(uint256 fee, uint256 newAmount) { newAmount = amount; if(lockFee){ fee = _lockTokenFee; } else{ uint256 tempAmount = amount; for( uint256 i = 0; (i < token.tierAmounts.length - 1 && tempAmount > 0); i++ ) { if(tempAmount >= token.tierAmounts[i]){ tempAmount = tempAmount.sub(token.tierAmounts[i]); fee = fee.add(token.tierAmounts[i].mul(token.tierFees[i]).div(10000)); } else{ fee = fee.add(tempAmount.mul(token.tierFees[i]).div(10000)); tempAmount = 0; } } //All remaining tokens will be calculated in last tier fee = fee.add( tempAmount.mul(token.tierFees[token.tierAmounts.length - 1]) .div(10000) ); newAmount = amount.sub(fee); } return(fee, newAmount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"},{"internalType":"address","name":"lockTokenAddress","type":"address"},{"internalType":"uint256","name":"lockTokenFee","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":true,"internalType":"address","name":"destToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"airdropDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numerator","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"AirdropAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":true,"internalType":"address","name":"destToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"airdropDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numerator","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"AirdropUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AmountAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"AssetClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDate","type":"uint256"},{"indexed":false,"internalType":"bool","name":"lockTokenFee","type":"bool"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"AssetLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LockTokenFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lockTokenAddress","type":"address"}],"name":"LockTokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"TokenActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"TokenInactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"minAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"emergencyUnlock","type":"bool"},{"indexed":false,"internalType":"uint256[]","name":"tierAmounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"tierFees","type":"uint256[]"}],"name":"TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"destToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensAirdropped","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"WalletChanged","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"activateToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"lockFee","type":"bool"}],"name":"addAmount","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256[]","name":"tierAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"tierFees","type":"uint256[]"}],"name":"addToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"durations","type":"uint256[]"},{"internalType":"address payable[]","name":"beneficiaries","type":"address[]"},{"internalType":"uint256[]","name":"amountThresholds","type":"uint256[]"},{"internalType":"bool","name":"lockFee","type":"bool"}],"name":"bulkLock","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAirdrop","outputs":[{"internalType":"address","name":"destToken","type":"address"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"},{"internalType":"uint256","name":"date","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAirdrops","outputs":[{"internalType":"address[]","name":"destTokens","type":"address[]"},{"internalType":"uint256[]","name":"numerators","type":"uint256[]"},{"internalType":"uint256[]","name":"denominators","type":"uint256[]"},{"internalType":"uint256[]","name":"dates","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getAssetIds","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLockToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLockTokenFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getLockedAsset","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"lastLocked","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"enum Lock.Status","name":"status","type":"uint8"},{"internalType":"uint256","name":"amountThreshold","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTokenInfo","outputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"bool","name":"emergencyUnlock","type":"bool"},{"internalType":"enum Lock.TokenStatus","name":"status","type":"uint8"},{"internalType":"uint256[]","name":"tierAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"tierFees","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"getTokens","outputs":[{"internalType":"address[]","name":"tokenAddresses","type":"address[]"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"bool[]","name":"emergencyUnlocks","type":"bool[]"},{"internalType":"enum Lock.TokenStatus[]","name":"statuses","type":"uint8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"inactivateToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"amountThreshold","type":"uint256"},{"internalType":"bool","name":"lockFee","type":"bool"}],"name":"lock","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"destToken","type":"address"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"},{"internalType":"uint256","name":"date","type":"uint256"}],"name":"setAirdrop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"},{"internalType":"uint256","name":"date","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"updateAirdrop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"lockTokenAddress","type":"address"}],"name":"updateLockToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"lockTokenFee","type":"uint256"}],"name":"updateLockTokenFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"bool","name":"emergencyUnlock","type":"bool"},{"internalType":"uint256[]","name":"tierAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"tierFees","type":"uint256[]"}],"name":"updateToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004c1938038062004c19833981810160405260608110156200003757600080fd5b50805160208201516040909201519091906200005b6001600160e01b036200017e16565b600080546001600160a01b0319166001600160a01b03928316178082556040519216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160a01b038316620000ea5760405162461bcd60e51b815260040180806020018281038252602b81526020018062004bee602b913960400191505060405180910390fd5b6001600160a01b03821662000146576040805162461bcd60e51b815260206004820181905260248201527f4c6f636b3a20496e76616c6964206c6f636b20746f6b656e2061646472657373604482015290519081900360640190fd5b600280546001600160a01b039384166001600160a01b0319918216179091556005805494909316931692909217905560035562000182565b3390565b614a5c80620001926000396000f3fe6080604052600436106101e35760003560e01c8063659bcf0e116101025780639f8a13d711610095578063dfafd14611610064578063dfafd14614610c39578063e6fcdf9914610c63578063e92f093514610c96578063f2fde38b14610cc9576101e3565b80639f8a13d714610ac0578063a9a9eab914610af3578063d1d58b2514610bdc578063deaa59df14610c06576101e3565b806378a89567116100d157806378a8956714610a6c5780638456cb5914610a815780638da5cb5b14610a965780638f32d59b14610aab576101e3565b8063659bcf0e146108e357806366200e13146109c35780636c3a43ff14610a2c578063715018a614610a57576101e3565b806345099a471161017a5780635048adf1116101495780635048adf11461069257806355c4d48f146106a75780635c975abb1461074a57806363d0467f14610773576101e3565b806345099a471461045b578063494cfc6c146104a55780634c7fafc0146105f85780634f44385014610647576101e3565b80632e131cf9116101b65780632e131cf9146103c2578063379607f5146103f55780633ce574321461041f5780633f4ba83a14610446576101e3565b80630d1ce2d2146101e8578063132996041461021d5780631f69565f1461024e5780632b2557621461033f575b600080fd5b3480156101f457600080fd5b5061021b6004803603602081101561020b57600080fd5b50356001600160a01b0316610cfc565b005b34801561022957600080fd5b50610232610ecc565b604080516001600160a01b039092168252519081900360200190f35b34801561025a57600080fd5b506102816004803603602081101561027157600080fd5b50356001600160a01b0316610edc565b60408051868152851515602082015290810184600281111561029f57fe5b60ff1681526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102e75781810151838201526020016102cf565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561032657818101518382015260200161030e565b5050505090500197505050505050505060405180910390f35b34801561034b57600080fd5b506103726004803603602081101561036257600080fd5b50356001600160a01b0316611089565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103ae578181015183820152602001610396565b505050509050019250505060405180910390f35b3480156103ce57600080fd5b5061021b600480360360208110156103e557600080fd5b50356001600160a01b03166110f6565b34801561040157600080fd5b5061021b6004803603602081101561041857600080fd5b50356112c6565b34801561042b57600080fd5b506104346114be565b60408051918252519081900360200190f35b34801561045257600080fd5b5061021b6114c4565b61021b600480360360c081101561047157600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a00135151561158a565b3480156104b157600080fd5b506104d5600480360360408110156104c857600080fd5b5080359060200135611790565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610521578181015183820152602001610509565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610560578181015183820152602001610548565b50505050905001858103835287818151815260200191508051906020019060200280838360005b8381101561059f578181015183820152602001610587565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156105de5781810151838201526020016105c6565b505050509050019850505050505050505060405180910390f35b34801561060457600080fd5b5061021b600480360360a081101561061b57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135611a75565b34801561065357600080fd5b5061021b600480360360a081101561066a57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135611d3e565b34801561069e57600080fd5b50610232611f44565b3480156106b357600080fd5b506106d1600480360360208110156106ca57600080fd5b5035611f53565b60405180896001600160a01b03166001600160a01b03168152602001888152602001878152602001868152602001858152602001846001600160a01b03166001600160a01b0316815260200183600281111561072957fe5b60ff1681526020018281526020019850505050505050505060405180910390f35b34801561075657600080fd5b5061075f612047565b604080519115158252519081900360200190f35b61021b600480360360c081101561078957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111600160201b831117156107e657600080fd5b919390929091602081019035600160201b81111561080357600080fd5b82018360208201111561081557600080fd5b803590602001918460208302840111600160201b8311171561083657600080fd5b919390929091602081019035600160201b81111561085357600080fd5b82018360208201111561086557600080fd5b803590602001918460208302840111600160201b8311171561088657600080fd5b919390929091602081019035600160201b8111156108a357600080fd5b8201836020820111156108b557600080fd5b803590602001918460208302840111600160201b831117156108d657600080fd5b9193509150351515612050565b3480156108ef57600080fd5b5061021b6004803603608081101561090657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561093557600080fd5b82018360208201111561094757600080fd5b803590602001918460208302840111600160201b8311171561096857600080fd5b919390929091602081019035600160201b81111561098557600080fd5b82018360208201111561099757600080fd5b803590602001918460208302840111600160201b831117156109b857600080fd5b50909250905061239c565b3480156109cf57600080fd5b506109fc600480360360408110156109e657600080fd5b506001600160a01b038135169060200135612658565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b61021b60048036036060811015610a4257600080fd5b50803590602081013590604001351515612766565b348015610a6357600080fd5b5061021b612bd5565b348015610a7857600080fd5b50610434612c66565b348015610a8d57600080fd5b5061021b612c6c565b348015610aa257600080fd5b50610232612d32565b348015610ab757600080fd5b5061075f612d41565b348015610acc57600080fd5b5061075f60048036036020811015610ae357600080fd5b50356001600160a01b0316612d65565b348015610aff57600080fd5b5061021b600480360360a0811015610b1657600080fd5b6001600160a01b0382351691602081013591604082013515159190810190608081016060820135600160201b811115610b4e57600080fd5b820183602082011115610b6057600080fd5b803590602001918460208302840111600160201b83111715610b8157600080fd5b919390929091602081019035600160201b811115610b9e57600080fd5b820183602082011115610bb057600080fd5b803590602001918460208302840111600160201b83111715610bd157600080fd5b509092509050612ddd565b348015610be857600080fd5b5061075f60048036036020811015610bff57600080fd5b5035613012565b348015610c1257600080fd5b5061021b60048036036020811015610c2957600080fd5b50356001600160a01b031661315f565b348015610c4557600080fd5b5061021b60048036036020811015610c5c57600080fd5b5035613235565b348015610c6f57600080fd5b5061021b60048036036020811015610c8657600080fd5b50356001600160a01b03166132b7565b348015610ca257600080fd5b506104d560048036036020811015610cb957600080fd5b50356001600160a01b03166133a3565b348015610cd557600080fd5b5061021b60048036036020811015610cec57600080fd5b50356001600160a01b0316613596565b610d04612d41565b610d43576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020548190610d9d576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b6001600160a01b038216600090815260046020526040812054610dc790600163ffffffff6135e916565b9050600260018281548110610dd857fe5b906000526020600020906005020160020160019054906101000a900460ff166002811115610e0257fe5b14610e54576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b3a20546f6b656e20616c726561647920616374697665212100000000604482015290519081900360640190fd5b6001808281548110610e6257fe5b906000526020600020906005020160020160016101000a81548160ff02191690836002811115610e8e57fe5b02179055506040516001600160a01b038416907f8745618cc29c4ac0cb23d9a7a8d5663f9739c8171e613d3c755e23307f74c10690600090a2505050565b6005546001600160a01b03165b90565b6001600160a01b038116600090815260046020526040812054819081906060908190801561107e57610f1581600163ffffffff6135e916565b9050610f1f61471b565b60018281548110610f2c57fe5b60009182526020918290206040805160c081018252600590930290910180546001600160a01b0316835260018101549383019390935260028084015460ff80821615159385019390935292939260608501926101009091041690811115610f8f57fe5b6002811115610f9a57fe5b815260200160038201805480602002602001604051908101604052809291908181526020018280548015610fed57602002820191906000526020600020905b815481526020019060010190808311610fd9575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561104557602002820191906000526020600020905b815481526020019060010190808311611031575b50505091909252505050602081015160408201516060830151608084015160a090940151929a5090985096509094509250611080915050565b505b91939590929450565b6001600160a01b0381166000908152600860209081526040918290208054835181840281018401909452808452606093928301828280156110e957602002820191906000526020600020905b8154815260200190600101908083116110d5575b505050505090505b919050565b6110fe612d41565b61113d576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020548190611197576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600460205260408120546111c190600163ffffffff6135e916565b905060018082815481106111d157fe5b906000526020600020906005020160020160019054906101000a900460ff1660028111156111fb57fe5b1461124d576040805162461bcd60e51b815260206004820152601e60248201527f4c6f636b3a20546f6b656e20616c726561647920696e61637469766521210000604482015290519081900360640190fd5b60026001828154811061125c57fe5b906000526020600020906005020160020160016101000a81548160ff0219169083600281111561128857fe5b02179055506040516001600160a01b038416907f65aac865e0d58610ea97c315e01d54aefcc67970686385e918d4b536bf95b83090600090a2505050565b806112d081613012565b611321576040805162461bcd60e51b815260206004820152601760248201527f4c6f636b3a2043616e277420636c61696d206173736574000000000000000000604482015290519081900360640190fd5b6000818152600960205260409020600601546001600160a01b0316331461138f576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20556e617574686f72697a65642061636365737321210000000000604482015290519081900360640190fd5b611397614751565b60008381526009602090815260409182902082516101008101845281546001600160a01b039081168252600183015493820193909352600280830154948201949094526003820154606082015260048201546080820152600582015460a0820152600682015492831660c082015292909160e0840191600160a01b90910460ff169081111561142257fe5b600281111561142d57fe5b90525080519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156114675761146283613634565b611470565b6114708361371c565b80600001516001600160a01b03168160c001516001600160a01b0316847f0d6c42a482d45488f8ddf865e738e739a1666783d6477c6874658f138923622260405160405180910390a4505050565b60035490565b6114cc612d41565b61150b576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b600a5460ff16611555576040805162461bcd60e51b815260206004820152601060248201526f131bd8dace881b9bdd081c185d5cd95960821b604482015290519081900360640190fd5b600a805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600a5460ff16156115d1576040805162461bcd60e51b815260206004820152600c60248201526b131bd8dace881c185d5cd95960a21b604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205486908061162c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b60018061163f838263ffffffff6135e916565b8154811061164957fe5b906000526020600020906005020160020160019054906101000a900460ff16600281111561167357fe5b146116c0576040805162461bcd60e51b81526020600482015260186024820152774c6f636b3a20546f6b656e206e6f7420616374697665212160401b604482015290519081900360640190fd5b60016116d2828263ffffffff6135e916565b815481106116dc57fe5b600091825260209091206002600590920201015460ff161561172f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806148d6602a913960400191505060405180910390fd5b60006117408989898989348a613781565b90506402540be40081106117855760405162461bcd60e51b81526004018080602001828103825260248152602001806149216024913960400191505060405180910390fd5b505050505050505050565b606080606080846040519080825280602002602001820160405280156117c0578160200160208202803883390190505b509350846040519080825280602002602001820160405280156117ed578160200160208202803883390190505b5092508460405190808252806020026020018201604052801561181a578160200160208202803883390190505b50915084604051908082528060200260200182016040528015611847578160200160208202803883390190505b5060015490915061185e878763ffffffff613a8216565b11156118a7576040805162461bcd60e51b8152602060048201526013602482015272131bd8dace88125b9d985b1a59081a5b9c1d5d606a1b604482015290519081900360640190fd5b6000851180156118b85750600f8511155b611900576040805162461bcd60e51b8152602060048201526014602482015273098dec6d6744092dcecc2d8d2c840d8cadccee8d60631b604482015290519081900360640190fd5b6000865b611914888863ffffffff613a8216565b811015611a6a576001818154811061192857fe5b600091825260209091206005909102015486516001600160a01b039091169087908490811061195357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061198057fe5b90600052602060002090600502016001015485838151811061199e57fe5b602002602001018181525050600181815481106119b757fe5b906000526020600020906005020160020160009054906101000a900460ff168483815181106119e257fe5b60200260200101901515908115158152505060018181548110611a0157fe5b906000526020600020906005020160020160019054906101000a900460ff16838381518110611a2c57fe5b60200260200101906002811115611a3f57fe5b90816002811115611a4c57fe5b905250611a6082600163ffffffff613a8216565b9150600101611904565b505092959194509250565b611a7d612d41565b611abc576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600460205260409020548590611b16576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b6001600160a01b038516611b5b5760405162461bcd60e51b81526004018080602001828103825260218152602001806149006021913960400191505060405180910390fd5b60008411611bac576040805162461bcd60e51b81526020600482015260196024820152784c6f636b3a20496e76616c6964206e756d657261746f72212160381b604482015290519081900360640190fd5b60008311611c01576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20496e76616c69642064656e6f6d696e61746f7221210000000000604482015290519081900360640190fd5b611c0a86612d65565b611c5b576040805162461bcd60e51b815260206004820181905260248201527f4c6f636b3a204261736520746f6b656e206973206e6f74206163746976652121604482015290519081900360640190fd5b6001600160a01b03868116600081815260066020818152604080842081516080810183528c88168082528185018d81529382018c8152606083018c8152845460018082018755868b52888b209551600490920290950180546001600160a01b03191691909c16178b5594518a8401555160028a0155925160039098019790975593859052919052905490927f8f5ca80f21a651cd1810a6722b071027cb1e9bbc77405283aa065983c94bf9f891611d11916135e9565b604080519182526020820187905281810189905260608201889052519081900360800190a3505050505050565b611d46612d41565b611d85576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600660205260409020548110611df1576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20496e76616c696420696e6465782076616c756521210000000000604482015290519081900360640190fd5b60008411611e42576040805162461bcd60e51b81526020600482015260196024820152784c6f636b3a20496e76616c6964206e756d657261746f72212160381b604482015290519081900360640190fd5b60008311611e97576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20496e76616c69642064656e6f6d696e61746f7221210000000000604482015290519081900360640190fd5b6001600160a01b0385166000908152600660205260408120805483908110611ebb57fe5b60009182526020918290206001600490920201908101879055600281018690556003810185905580546040805186815293840187905283810189905260608401889052519193506001600160a01b0390811692908916917f1175b5eab161adb874c37a9a4f7393b23fe44cba6edb7ce2c9065035125f95a19181900360800190a3505050505050565b6002546001600160a01b031690565b600080600080600080600080611f67614751565b60008a81526009602090815260409182902082516101008101845281546001600160a01b039081168252600183015493820193909352600280830154948201949094526003820154606082015260048201546080820152600582015460a0820152600682015492831660c082015292909160e0840191600160a01b90910460ff1690811115611ff257fe5b6002811115611ffd57fe5b905250805160208201516040830151606084015160c085015160e086015160a0870151608090970151959f50939d50919b5099509197509095509350915050919395975091939597565b600a5460ff1690565b600a5460ff1615612097576040805162461bcd60e51b815260206004820152600c60248201526b131bd8dace881c185d5cd95960a21b604482015290519081900360640190fd5b6001600160a01b038a166000908152600460205260409020548a90806120f2576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b600180612105838263ffffffff6135e916565b8154811061210f57fe5b906000526020600020906005020160020160019054906101000a900460ff16600281111561213957fe5b14612186576040805162461bcd60e51b81526020600482015260186024820152774c6f636b3a20546f6b656e206e6f7420616374697665212160401b604482015290519081900360640190fd5b6001612198828263ffffffff6135e916565b815481106121a257fe5b600091825260209091206002600590920201015460ff16156121f55760405162461bcd60e51b815260040180806020018281038252602a8152602001806148d6602a913960400191505060405180910390fd5b348a8914612240576040805162461bcd60e51b8152602060048201526013602482015272131bd8dace88125b9d985b1a59081a5b9c1d5d606a1b604482015290519081900360640190fd5b8a871461228a576040805162461bcd60e51b8152602060048201526013602482015272131bd8dace88125b9d985b1a59081a5b9c1d5d606a1b604482015290519081900360640190fd5b8a85146122d4576040805162461bcd60e51b8152602060048201526013602482015272131bd8dace88125b9d985b1a59081a5b9c1d5d606a1b604482015290519081900360640190fd5b60005b8b8110156123495761233f8e8e8e848181106122ef57fe5b905060200201358d8d8581811061230257fe5b905060200201358c8c8681811061231557fe5b905060200201356001600160a01b03168b8b8781811061233157fe5b90506020020135878b613781565b91506001016122d7565b506402540be400811061238d5760405162461bcd60e51b81526004018080602001828103825260248152602001806149216024913960400191505060405180910390fd5b50505050505050505050505050565b6123a4612d41565b6123e3576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b038616600090815260046020526040902054869015612450576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20546f6b656e20616c726561647920657869737421210000000000604482015290519081900360640190fd5b8382146124a4576040805162461bcd60e51b815260206004820152601a60248201527f4c6f636b3a20546965727320646f6573206e6f74206d61746368000000000000604482015290519081900360640190fd5b60016040518060c00160405280896001600160a01b03168152602001888152602001600015158152602001600160028111156124dc57fe5b81526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208781028281018201909352878252928301929091889188918291850190849080828437600092018290525093909452505083546001808201808755958352602092839020855160059093020180546001600160a01b0319166001600160a01b03909316929092178255918401519181019190915560408301516002808301805460ff191692151592909217808355606086015193945061ff001916906101009084908111156125c857fe5b0217905550608082015180516125e89160038401916020909101906147b2565b5060a082015180516126049160048401916020909101906147b2565b50506001546001600160a01b038a166000818152600460205260408082209390935591519093507f784c8f4dbf0ffedd6e72c76501c545a70f8b203b30a26ce542bf92ba87c248a49250a250505050505050565b6001600160a01b03821660009081526006602052604081208054829182918291908690811061268357fe5b600091825260208083206004909202909101546001600160a01b038981168452600690925260409092208054919092169190879081106126bf57fe5b90600052602060002090600402016001015460066000896001600160a01b03166001600160a01b03168152602001908152602001600020878154811061270157fe5b906000526020600020906004020160020154600660008a6001600160a01b03166001600160a01b03168152602001908152602001600020888154811061274357fe5b906000526020600020906004020160030154935093509350935092959194509250565b600a5460ff16156127ad576040805162461bcd60e51b815260206004820152600c60248201526b131bd8dace881c185d5cd95960a21b604482015290519081900360640190fd5b600083815260096020526040902060016006820154600160a01b900460ff1660028111156127d757fe5b14612822576040805162461bcd60e51b81526020600482015260166024820152752637b1b59d102637b1b59034b9903737ba1037b832b760511b604482015290519081900360640190fd5b61282a61471b565b81546001600160a01b0316600090815260046020526040902054600190612857908263ffffffff6135e916565b8154811061286157fe5b60009182526020918290206040805160c081018252600590930290910180546001600160a01b0316835260018101549383019390935260028084015460ff808216151593850193909352929392606085019261010090910416908111156128c457fe5b60028111156128cf57fe5b81526020016003820180548060200260200160405190810160405280929190818152602001828054801561292257602002820191906000526020600020905b81548152602001906001019080831161290e575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561297a57602002820191906000526020600020905b815481526020019060010190808311612966575b5050509190925250508354600485015460018601549394506129a9936001600160a01b03909216925090613adc565b6000806129b7868685613c2e565b909250905084156129ec576005546003546002546129ec926001600160a01b039182169233929091169063ffffffff613db216565b83546001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612b1a57348614612a66576040805162461bcd60e51b815260206004820152601d60248201527f4c6f636b3a20496e73756666696369656e742076616c75652073656e74000000604482015290519081900360640190fd5b84612b15576005546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612ab8576040519150601f19603f3d011682016040523d82523d6000602084013e612abd565b606091505b5050905080612b13576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b3a205472616e73666572206f6620666565206661696c656400000000604482015290519081900360640190fd5b505b612b60565b84612b43576005548454612b43916001600160a01b03918216913391168563ffffffff613db216565b8354612b60906001600160a01b031633308463ffffffff613db216565b6001840154612b75908263ffffffff613a8216565b60018501554260048501556006840154604080518981526020810184905281516001600160a01b03909316927fab5b2b1b2954cf9271f13f0ea01ed62b7e1046493ca1cd34c5993f08004df035929181900390910190a250505050505050565b612bdd612d41565b612c1c576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60015490565b612c74612d41565b612cb3576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b600a5460ff1615612cfa576040805162461bcd60e51b815260206004820152600c60248201526b131bd8dace881c185d5cd95960a21b604482015290519081900360640190fd5b600a805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b6000546001600160a01b031690565b600080546001600160a01b0316612d56613e0c565b6001600160a01b031614905090565b6001600160a01b0381166000908152600460205260408120548015612dd457600180612d97838263ffffffff6135e916565b81548110612da157fe5b906000526020600020906005020160020160019054906101000a900460ff166002811115612dcb57fe5b149150506110f1565b50600092915050565b612de5612d41565b612e24576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0387166000908152600460205260409020548790612e7e576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b838214612ed2576040805162461bcd60e51b815260206004820152601a60248201527f4c6f636b3a20546965727320646f6573206e6f74206d61746368000000000000604482015290519081900360640190fd5b6001600160a01b038816600090815260046020526040812054612efc90600163ffffffff6135e916565b9050600060018281548110612f0d57fe5b60009182526020909120600590910201600181018a905560028101805460ff19168a15151790559050612f446003820188886147fd565b50612f536004820186866147fd565b50896001600160a01b0316827f2b161189aa253f00c5bf7c3a5801e32725ae51dc9167bd23219bda37d26e42f38b8b8b8b8b8b604051808781526020018615151515815260200180602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f19169092018290039a509098505050505050505050a350505050505050505050565b600061301c614751565b60008381526009602090815260409182902082516101008101845281546001600160a01b039081168252600183015493820193909352600280830154948201949094526003820154606082015260048201546080820152600582015460a0820152600682015492831660c082015292909160e0840191600160a01b90910460ff16908111156130a757fe5b60028111156130b257fe5b905250905060018160e0015160028111156130c957fe5b148015613150575042816060015111158061312e575080516001600160a01b031660009081526004602052604090205460019061310c908263ffffffff6135e916565b8154811061311657fe5b600091825260209091206002600590920201015460ff165b80613150575060008160a0015111801561315057508060a00151816020015110155b15612dd45760019150506110f1565b613167612d41565b6131a6576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0381166131eb5760405162461bcd60e51b815260040180806020018281038252602c815260200180614884602c913960400191505060405180910390fd5b600580546001600160a01b0319166001600160a01b0383169081179091556040517f3ce716f94fe275e52428cbf6b7f388e5a65976d4edabc34355a77f5e89655bdc90600090a250565b61323d612d41565b61327c576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b60038190556040805182815290517f47ba71ee0e24fe729cf2b6226673ef750fe0ea2ba09bd1865531265edb669e989181900360200190a150565b6132bf612d41565b6132fe576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b038116613359576040805162461bcd60e51b815260206004820181905260248201527f4c6f636b3a20496e76616c6964206c6f636b20746f6b656e2061646472657373604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517fdf1be95c61e48d6999b3c7d4e42ba72fe3ccf08dcb2b4e028ee4521e1609b6e990600090a250565b6001600160a01b03811660009081526006602090815260409182902054825181815281830281019092019092526060918291829182918180156133f0578160200160208202803883390190505b5094508060405190808252806020026020018201604052801561341d578160200160208202803883390190505b5093508060405190808252806020026020018201604052801561344a578160200160208202803883390190505b50925080604051908082528060200260200182016040528015613477578160200160208202803883390190505b50915060005b8181101561358d5761348d614838565b6001600160a01b03881660009081526006602052604090208054839081106134b157fe5b600091825260209182902060408051608081018252600490930290910180546001600160a01b0316808452600182015494840194909452600281015491830191909152600301546060820152885190925088908490811061350e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050806020015186838151811061353f57fe5b602002602001018181525050806040015185838151811061355c57fe5b602002602001018181525050806060015184838151811061357957fe5b60209081029190910101525060010161347d565b50509193509193565b61359e612d41565b6135dd576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6135e681613e10565b50565b600061362b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613eb0565b90505b92915050565b60008181526009602052604080822060068101805460ff60a01b1916600160a11b1790556001810154915190929133918381818185875af1925050503d806000811461369c576040519150601f19603f3d011682016040523d82523d6000602084013e6136a1565b606091505b50509050806136f7576040805162461bcd60e51b815260206004820152601e60248201527f4c6f636b3a204661696c656420746f207472616e736665722065746821210000604482015290519081900360640190fd5b815460048301546001840154613717926001600160a01b03169190613adc565b505050565b600081815260096020526040902060068101805460ff60a01b1916600160a11b1790556001810154815461375d916001600160a01b03909116903390613f47565b80546004820154600183015461377d926001600160a01b03169190613adc565b5050565b60006001600160a01b0385166137c85760405162461bcd60e51b81526004018080602001828103825260298152602001806149d56029913960400191505060405180910390fd5b6137d061471b565b6001600160a01b0389166000908152600460205260409020546001906137fc908263ffffffff6135e916565b8154811061380657fe5b60009182526020918290206040805160c081018252600590930290910180546001600160a01b0316835260018101549383019390935260028084015460ff8082161515938501939093529293926060850192610100909104169081111561386957fe5b600281111561387457fe5b8152602001600382018054806020026020016040519081016040528092919081815260200182805480156138c757602002820191906000526020600020905b8154815260200190600101908083116138b3575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561391f57602002820191906000526020600020905b81548152602001906001019080831161390b575b5050505050815250509050806020015188101561396d5760405162461bcd60e51b815260040180806020018281038252602f815260200180614965602f913960400191505060405180910390fd5b600061397f428963ffffffff613a8216565b905060008061398f8b8786613c2e565b90925090508673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038e1614156139e0576139c98284868d8d8d8d613f99565b6139d9818d63ffffffff6135e916565b90506139ef565b6139ef8d8385878e8e8d614266565b896001600160a01b0316336001600160a01b03168e6001600160a01b03167f794ab9b33e2c384cf9197aa82831ace4429b76dfe37fdf9da684aa02e337063f60075486428a8e8b6040518087815260200186815260200185815260200184815260200183151515158152602001828152602001965050505050505060405180910390a49c9b505050505050505050505050565b60008282018381101561362b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60005b6001600160a01b038416600090815260066020526040902054811015613c2857613b07614838565b6001600160a01b0385166000908152600660205260409020805483908110613b2b57fe5b600091825260209182902060408051608081018252600490930290910180546001600160a01b031683526001810154938301939093526002830154908201526003909101546060820181905290915084108015613b8b5750428160600151105b15613c1f576000613bbd8260400151613bb184602001518761442790919063ffffffff16565b9063ffffffff61448016565b8251909150613bdc906001600160a01b0316338363ffffffff613f4716565b81516040805183815290516001600160a01b03909216917fb82d2a7de6e3c04c554cd659f5f2b8d49c0131c0363c91a4ccef6756d16029909181900360200190a2505b50600101613adf565b50505050565b6000838315613c41576003549150613daa565b8460005b60018560800151510381108015613c5c5750600082115b15613d4b5784608001518181518110613c7157fe5b60200260200101518210613d0957613ca985608001518281518110613c9257fe5b6020026020010151836135e990919063ffffffff16565b9150613d02613cf5612710613bb18860a001518581518110613cc757fe5b602002602001015189608001518681518110613cdf57fe5b602002602001015161442790919063ffffffff16565b859063ffffffff613a8216565b9350613d43565b613d3c613cf5612710613bb18860a001518581518110613d2557fe5b60200260200101518661442790919063ffffffff16565b9350600091505b600101613c45565b50613d94613d87612710613bb18760a0015160018960800151510381518110613d7057fe5b60200260200101518561442790919063ffffffff16565b849063ffffffff613a8216565b9250613da6868463ffffffff6135e916565b9150505b935093915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613c289085906144c2565b3390565b6001600160a01b038116613e555760405162461bcd60e51b81526004018080602001828103825260268152602001806148b06026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008184841115613f3f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f04578181015183820152602001613eec565b50505050905090810190601f168015613f315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526137179084906144c2565b801561401e5786821015613ff4576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20456e6f75676820455448206e6f742073656e7421210000000000604482015290519081900360640190fd5b600554600254614019916001600160a01b03918216913391168963ffffffff613db216565b61412c565b61402e878763ffffffff613a8216565b821015614082576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20456e6f75676820455448206e6f742073656e7421210000000000604482015290519081900360640190fd5b6005546040516000916001600160a01b03169088908381818185875af1925050503d80600081146140cf576040519150601f19603f3d011682016040523d82523d6000602084013e6140d4565b606091505b505090508061412a576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b3a205472616e73666572206f6620666565206661696c656400000000604482015290519081900360640190fd5b505b60075461414090600163ffffffff613a8216565b6007819055604080516101008101825273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee815260208082018b815242838501818152606085018c81526080860192835260a086018b81526001600160a01b038d811660c08901908152600160e08a0181815260009c8d52600990995299909a20885181549083166001600160a01b031991821617825596519981019990995592516002808a0191909155915160038901559251600488015591516005870155955160068601805491909716921691909117808655915192949160ff60a01b191690600160a01b90849081111561422657fe5b021790555050506001600160a01b039093166000908152600860209081526040822060075481546001810183559184529190922090910155505050505050565b801561429657600554600254614291916001600160a01b03918216913391168863ffffffff613db216565b6142b8565b6005546142b8906001600160a01b03898116913391168863ffffffff613db216565b6142d36001600160a01b03881633308963ffffffff613db216565b6007546142e790600163ffffffff613a8216565b600781905550604051806101000160405280886001600160a01b03168152602001878152602001428152602001858152602001428152602001838152602001846001600160a01b031681526020016001600281111561434257fe5b9052600754600090815260096020908152604091829020835181546001600160a01b039182166001600160a01b031991821617835592850151600183015592840151600280830191909155606085015160038301556080850151600483015560a0850151600583015560c08501516006830180549190951693169290921780845560e08501519193919260ff60a01b1990911690600160a01b9084908111156143e757fe5b021790555050506001600160a01b039092166000908152600860209081526040822060075481546001810183559184529190922090910155505050505050565b6000826144365750600061362e565b8282028284828161444357fe5b041461362b5760405162461bcd60e51b81526004018080602001828103825260218152602001806149946021913960400191505060405180910390fd5b600061362b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061467a565b6144d4826001600160a01b03166146df565b614525576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106145635780518252601f199092019160209182019101614544565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146145c5576040519150601f19603f3d011682016040523d82523d6000602084013e6145ca565b606091505b509150915081614621576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115613c285780806020019051602081101561463d57600080fd5b5051613c285760405162461bcd60e51b815260040180806020018281038252602a8152602001806149fe602a913960400191505060405180910390fd5b600081836146c95760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613f04578181015183820152602001613eec565b5060008385816146d557fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906147135750808214155b949350505050565b6040805160c081018252600080825260208201819052918101829052906060820190815260200160608152602001606081525090565b60405180610100016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600060028111156147ad57fe5b905290565b8280548282559060005260206000209081019282156147ed579160200282015b828111156147ed5782518255916020019190600101906147d2565b506147f9929150614869565b5090565b8280548282559060005260206000209081019282156147ed579160200282015b828111156147ed57823582559160200191906001019061481d565b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b610ed991905b808211156147f9576000815560010161486f56fe4c6f636b3a20506c656173652070726f76696465722076616c69642077616c6c6574206164647265737321214f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734c6f636b3a20546f6b656e20697320696e20656d657267656e637920756e6c6f636b20737461746521214c6f636b3a20496e76616c69642064657374696e6174696f6e20746f6b656e21214c6f636b3a2053656e74206d6f726520657468657273207468656e2072657175697265644c6f636b3a20546f6b656e20646f6573206e6f742065786973742121000000004c6f636b3a20506c656173652070726f76696465206d696e696d756d20616d6f756e74206f6620746f6b656e732121536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724c6f636b3a2050726f766964652076616c69642062656e6566696369617279206164647265737321215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158209b3173ffb040c17e25eba883c10636db670ca98e15f0b4e560a830503d5b261a64736f6c634300050f00324c6f636b3a20506c656173652070726f766964652076616c69642077616c6c657420616464726573732121000000000000000000000000284f214df3f85526a910979f52c96e54fb228136000000000000000000000000605cc9088882c549f40ce093cb90eb0319b6676d0000000000000000000000000000000000000000000000000de0b6b3a7640000
Deployed Bytecode
0x6080604052600436106101e35760003560e01c8063659bcf0e116101025780639f8a13d711610095578063dfafd14611610064578063dfafd14614610c39578063e6fcdf9914610c63578063e92f093514610c96578063f2fde38b14610cc9576101e3565b80639f8a13d714610ac0578063a9a9eab914610af3578063d1d58b2514610bdc578063deaa59df14610c06576101e3565b806378a89567116100d157806378a8956714610a6c5780638456cb5914610a815780638da5cb5b14610a965780638f32d59b14610aab576101e3565b8063659bcf0e146108e357806366200e13146109c35780636c3a43ff14610a2c578063715018a614610a57576101e3565b806345099a471161017a5780635048adf1116101495780635048adf11461069257806355c4d48f146106a75780635c975abb1461074a57806363d0467f14610773576101e3565b806345099a471461045b578063494cfc6c146104a55780634c7fafc0146105f85780634f44385014610647576101e3565b80632e131cf9116101b65780632e131cf9146103c2578063379607f5146103f55780633ce574321461041f5780633f4ba83a14610446576101e3565b80630d1ce2d2146101e8578063132996041461021d5780631f69565f1461024e5780632b2557621461033f575b600080fd5b3480156101f457600080fd5b5061021b6004803603602081101561020b57600080fd5b50356001600160a01b0316610cfc565b005b34801561022957600080fd5b50610232610ecc565b604080516001600160a01b039092168252519081900360200190f35b34801561025a57600080fd5b506102816004803603602081101561027157600080fd5b50356001600160a01b0316610edc565b60408051868152851515602082015290810184600281111561029f57fe5b60ff1681526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102e75781810151838201526020016102cf565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561032657818101518382015260200161030e565b5050505090500197505050505050505060405180910390f35b34801561034b57600080fd5b506103726004803603602081101561036257600080fd5b50356001600160a01b0316611089565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103ae578181015183820152602001610396565b505050509050019250505060405180910390f35b3480156103ce57600080fd5b5061021b600480360360208110156103e557600080fd5b50356001600160a01b03166110f6565b34801561040157600080fd5b5061021b6004803603602081101561041857600080fd5b50356112c6565b34801561042b57600080fd5b506104346114be565b60408051918252519081900360200190f35b34801561045257600080fd5b5061021b6114c4565b61021b600480360360c081101561047157600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a00135151561158a565b3480156104b157600080fd5b506104d5600480360360408110156104c857600080fd5b5080359060200135611790565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610521578181015183820152602001610509565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610560578181015183820152602001610548565b50505050905001858103835287818151815260200191508051906020019060200280838360005b8381101561059f578181015183820152602001610587565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156105de5781810151838201526020016105c6565b505050509050019850505050505050505060405180910390f35b34801561060457600080fd5b5061021b600480360360a081101561061b57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135611a75565b34801561065357600080fd5b5061021b600480360360a081101561066a57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135611d3e565b34801561069e57600080fd5b50610232611f44565b3480156106b357600080fd5b506106d1600480360360208110156106ca57600080fd5b5035611f53565b60405180896001600160a01b03166001600160a01b03168152602001888152602001878152602001868152602001858152602001846001600160a01b03166001600160a01b0316815260200183600281111561072957fe5b60ff1681526020018281526020019850505050505050505060405180910390f35b34801561075657600080fd5b5061075f612047565b604080519115158252519081900360200190f35b61021b600480360360c081101561078957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111600160201b831117156107e657600080fd5b919390929091602081019035600160201b81111561080357600080fd5b82018360208201111561081557600080fd5b803590602001918460208302840111600160201b8311171561083657600080fd5b919390929091602081019035600160201b81111561085357600080fd5b82018360208201111561086557600080fd5b803590602001918460208302840111600160201b8311171561088657600080fd5b919390929091602081019035600160201b8111156108a357600080fd5b8201836020820111156108b557600080fd5b803590602001918460208302840111600160201b831117156108d657600080fd5b9193509150351515612050565b3480156108ef57600080fd5b5061021b6004803603608081101561090657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561093557600080fd5b82018360208201111561094757600080fd5b803590602001918460208302840111600160201b8311171561096857600080fd5b919390929091602081019035600160201b81111561098557600080fd5b82018360208201111561099757600080fd5b803590602001918460208302840111600160201b831117156109b857600080fd5b50909250905061239c565b3480156109cf57600080fd5b506109fc600480360360408110156109e657600080fd5b506001600160a01b038135169060200135612658565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b61021b60048036036060811015610a4257600080fd5b50803590602081013590604001351515612766565b348015610a6357600080fd5b5061021b612bd5565b348015610a7857600080fd5b50610434612c66565b348015610a8d57600080fd5b5061021b612c6c565b348015610aa257600080fd5b50610232612d32565b348015610ab757600080fd5b5061075f612d41565b348015610acc57600080fd5b5061075f60048036036020811015610ae357600080fd5b50356001600160a01b0316612d65565b348015610aff57600080fd5b5061021b600480360360a0811015610b1657600080fd5b6001600160a01b0382351691602081013591604082013515159190810190608081016060820135600160201b811115610b4e57600080fd5b820183602082011115610b6057600080fd5b803590602001918460208302840111600160201b83111715610b8157600080fd5b919390929091602081019035600160201b811115610b9e57600080fd5b820183602082011115610bb057600080fd5b803590602001918460208302840111600160201b83111715610bd157600080fd5b509092509050612ddd565b348015610be857600080fd5b5061075f60048036036020811015610bff57600080fd5b5035613012565b348015610c1257600080fd5b5061021b60048036036020811015610c2957600080fd5b50356001600160a01b031661315f565b348015610c4557600080fd5b5061021b60048036036020811015610c5c57600080fd5b5035613235565b348015610c6f57600080fd5b5061021b60048036036020811015610c8657600080fd5b50356001600160a01b03166132b7565b348015610ca257600080fd5b506104d560048036036020811015610cb957600080fd5b50356001600160a01b03166133a3565b348015610cd557600080fd5b5061021b60048036036020811015610cec57600080fd5b50356001600160a01b0316613596565b610d04612d41565b610d43576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020548190610d9d576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b6001600160a01b038216600090815260046020526040812054610dc790600163ffffffff6135e916565b9050600260018281548110610dd857fe5b906000526020600020906005020160020160019054906101000a900460ff166002811115610e0257fe5b14610e54576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b3a20546f6b656e20616c726561647920616374697665212100000000604482015290519081900360640190fd5b6001808281548110610e6257fe5b906000526020600020906005020160020160016101000a81548160ff02191690836002811115610e8e57fe5b02179055506040516001600160a01b038416907f8745618cc29c4ac0cb23d9a7a8d5663f9739c8171e613d3c755e23307f74c10690600090a2505050565b6005546001600160a01b03165b90565b6001600160a01b038116600090815260046020526040812054819081906060908190801561107e57610f1581600163ffffffff6135e916565b9050610f1f61471b565b60018281548110610f2c57fe5b60009182526020918290206040805160c081018252600590930290910180546001600160a01b0316835260018101549383019390935260028084015460ff80821615159385019390935292939260608501926101009091041690811115610f8f57fe5b6002811115610f9a57fe5b815260200160038201805480602002602001604051908101604052809291908181526020018280548015610fed57602002820191906000526020600020905b815481526020019060010190808311610fd9575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561104557602002820191906000526020600020905b815481526020019060010190808311611031575b50505091909252505050602081015160408201516060830151608084015160a090940151929a5090985096509094509250611080915050565b505b91939590929450565b6001600160a01b0381166000908152600860209081526040918290208054835181840281018401909452808452606093928301828280156110e957602002820191906000526020600020905b8154815260200190600101908083116110d5575b505050505090505b919050565b6110fe612d41565b61113d576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020548190611197576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600460205260408120546111c190600163ffffffff6135e916565b905060018082815481106111d157fe5b906000526020600020906005020160020160019054906101000a900460ff1660028111156111fb57fe5b1461124d576040805162461bcd60e51b815260206004820152601e60248201527f4c6f636b3a20546f6b656e20616c726561647920696e61637469766521210000604482015290519081900360640190fd5b60026001828154811061125c57fe5b906000526020600020906005020160020160016101000a81548160ff0219169083600281111561128857fe5b02179055506040516001600160a01b038416907f65aac865e0d58610ea97c315e01d54aefcc67970686385e918d4b536bf95b83090600090a2505050565b806112d081613012565b611321576040805162461bcd60e51b815260206004820152601760248201527f4c6f636b3a2043616e277420636c61696d206173736574000000000000000000604482015290519081900360640190fd5b6000818152600960205260409020600601546001600160a01b0316331461138f576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20556e617574686f72697a65642061636365737321210000000000604482015290519081900360640190fd5b611397614751565b60008381526009602090815260409182902082516101008101845281546001600160a01b039081168252600183015493820193909352600280830154948201949094526003820154606082015260048201546080820152600582015460a0820152600682015492831660c082015292909160e0840191600160a01b90910460ff169081111561142257fe5b600281111561142d57fe5b90525080519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156114675761146283613634565b611470565b6114708361371c565b80600001516001600160a01b03168160c001516001600160a01b0316847f0d6c42a482d45488f8ddf865e738e739a1666783d6477c6874658f138923622260405160405180910390a4505050565b60035490565b6114cc612d41565b61150b576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b600a5460ff16611555576040805162461bcd60e51b815260206004820152601060248201526f131bd8dace881b9bdd081c185d5cd95960821b604482015290519081900360640190fd5b600a805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600a5460ff16156115d1576040805162461bcd60e51b815260206004820152600c60248201526b131bd8dace881c185d5cd95960a21b604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205486908061162c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b60018061163f838263ffffffff6135e916565b8154811061164957fe5b906000526020600020906005020160020160019054906101000a900460ff16600281111561167357fe5b146116c0576040805162461bcd60e51b81526020600482015260186024820152774c6f636b3a20546f6b656e206e6f7420616374697665212160401b604482015290519081900360640190fd5b60016116d2828263ffffffff6135e916565b815481106116dc57fe5b600091825260209091206002600590920201015460ff161561172f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806148d6602a913960400191505060405180910390fd5b60006117408989898989348a613781565b90506402540be40081106117855760405162461bcd60e51b81526004018080602001828103825260248152602001806149216024913960400191505060405180910390fd5b505050505050505050565b606080606080846040519080825280602002602001820160405280156117c0578160200160208202803883390190505b509350846040519080825280602002602001820160405280156117ed578160200160208202803883390190505b5092508460405190808252806020026020018201604052801561181a578160200160208202803883390190505b50915084604051908082528060200260200182016040528015611847578160200160208202803883390190505b5060015490915061185e878763ffffffff613a8216565b11156118a7576040805162461bcd60e51b8152602060048201526013602482015272131bd8dace88125b9d985b1a59081a5b9c1d5d606a1b604482015290519081900360640190fd5b6000851180156118b85750600f8511155b611900576040805162461bcd60e51b8152602060048201526014602482015273098dec6d6744092dcecc2d8d2c840d8cadccee8d60631b604482015290519081900360640190fd5b6000865b611914888863ffffffff613a8216565b811015611a6a576001818154811061192857fe5b600091825260209091206005909102015486516001600160a01b039091169087908490811061195357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061198057fe5b90600052602060002090600502016001015485838151811061199e57fe5b602002602001018181525050600181815481106119b757fe5b906000526020600020906005020160020160009054906101000a900460ff168483815181106119e257fe5b60200260200101901515908115158152505060018181548110611a0157fe5b906000526020600020906005020160020160019054906101000a900460ff16838381518110611a2c57fe5b60200260200101906002811115611a3f57fe5b90816002811115611a4c57fe5b905250611a6082600163ffffffff613a8216565b9150600101611904565b505092959194509250565b611a7d612d41565b611abc576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600460205260409020548590611b16576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b6001600160a01b038516611b5b5760405162461bcd60e51b81526004018080602001828103825260218152602001806149006021913960400191505060405180910390fd5b60008411611bac576040805162461bcd60e51b81526020600482015260196024820152784c6f636b3a20496e76616c6964206e756d657261746f72212160381b604482015290519081900360640190fd5b60008311611c01576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20496e76616c69642064656e6f6d696e61746f7221210000000000604482015290519081900360640190fd5b611c0a86612d65565b611c5b576040805162461bcd60e51b815260206004820181905260248201527f4c6f636b3a204261736520746f6b656e206973206e6f74206163746976652121604482015290519081900360640190fd5b6001600160a01b03868116600081815260066020818152604080842081516080810183528c88168082528185018d81529382018c8152606083018c8152845460018082018755868b52888b209551600490920290950180546001600160a01b03191691909c16178b5594518a8401555160028a0155925160039098019790975593859052919052905490927f8f5ca80f21a651cd1810a6722b071027cb1e9bbc77405283aa065983c94bf9f891611d11916135e9565b604080519182526020820187905281810189905260608201889052519081900360800190a3505050505050565b611d46612d41565b611d85576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600660205260409020548110611df1576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20496e76616c696420696e6465782076616c756521210000000000604482015290519081900360640190fd5b60008411611e42576040805162461bcd60e51b81526020600482015260196024820152784c6f636b3a20496e76616c6964206e756d657261746f72212160381b604482015290519081900360640190fd5b60008311611e97576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20496e76616c69642064656e6f6d696e61746f7221210000000000604482015290519081900360640190fd5b6001600160a01b0385166000908152600660205260408120805483908110611ebb57fe5b60009182526020918290206001600490920201908101879055600281018690556003810185905580546040805186815293840187905283810189905260608401889052519193506001600160a01b0390811692908916917f1175b5eab161adb874c37a9a4f7393b23fe44cba6edb7ce2c9065035125f95a19181900360800190a3505050505050565b6002546001600160a01b031690565b600080600080600080600080611f67614751565b60008a81526009602090815260409182902082516101008101845281546001600160a01b039081168252600183015493820193909352600280830154948201949094526003820154606082015260048201546080820152600582015460a0820152600682015492831660c082015292909160e0840191600160a01b90910460ff1690811115611ff257fe5b6002811115611ffd57fe5b905250805160208201516040830151606084015160c085015160e086015160a0870151608090970151959f50939d50919b5099509197509095509350915050919395975091939597565b600a5460ff1690565b600a5460ff1615612097576040805162461bcd60e51b815260206004820152600c60248201526b131bd8dace881c185d5cd95960a21b604482015290519081900360640190fd5b6001600160a01b038a166000908152600460205260409020548a90806120f2576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b600180612105838263ffffffff6135e916565b8154811061210f57fe5b906000526020600020906005020160020160019054906101000a900460ff16600281111561213957fe5b14612186576040805162461bcd60e51b81526020600482015260186024820152774c6f636b3a20546f6b656e206e6f7420616374697665212160401b604482015290519081900360640190fd5b6001612198828263ffffffff6135e916565b815481106121a257fe5b600091825260209091206002600590920201015460ff16156121f55760405162461bcd60e51b815260040180806020018281038252602a8152602001806148d6602a913960400191505060405180910390fd5b348a8914612240576040805162461bcd60e51b8152602060048201526013602482015272131bd8dace88125b9d985b1a59081a5b9c1d5d606a1b604482015290519081900360640190fd5b8a871461228a576040805162461bcd60e51b8152602060048201526013602482015272131bd8dace88125b9d985b1a59081a5b9c1d5d606a1b604482015290519081900360640190fd5b8a85146122d4576040805162461bcd60e51b8152602060048201526013602482015272131bd8dace88125b9d985b1a59081a5b9c1d5d606a1b604482015290519081900360640190fd5b60005b8b8110156123495761233f8e8e8e848181106122ef57fe5b905060200201358d8d8581811061230257fe5b905060200201358c8c8681811061231557fe5b905060200201356001600160a01b03168b8b8781811061233157fe5b90506020020135878b613781565b91506001016122d7565b506402540be400811061238d5760405162461bcd60e51b81526004018080602001828103825260248152602001806149216024913960400191505060405180910390fd5b50505050505050505050505050565b6123a4612d41565b6123e3576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b038616600090815260046020526040902054869015612450576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20546f6b656e20616c726561647920657869737421210000000000604482015290519081900360640190fd5b8382146124a4576040805162461bcd60e51b815260206004820152601a60248201527f4c6f636b3a20546965727320646f6573206e6f74206d61746368000000000000604482015290519081900360640190fd5b60016040518060c00160405280896001600160a01b03168152602001888152602001600015158152602001600160028111156124dc57fe5b81526020018787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208781028281018201909352878252928301929091889188918291850190849080828437600092018290525093909452505083546001808201808755958352602092839020855160059093020180546001600160a01b0319166001600160a01b03909316929092178255918401519181019190915560408301516002808301805460ff191692151592909217808355606086015193945061ff001916906101009084908111156125c857fe5b0217905550608082015180516125e89160038401916020909101906147b2565b5060a082015180516126049160048401916020909101906147b2565b50506001546001600160a01b038a166000818152600460205260408082209390935591519093507f784c8f4dbf0ffedd6e72c76501c545a70f8b203b30a26ce542bf92ba87c248a49250a250505050505050565b6001600160a01b03821660009081526006602052604081208054829182918291908690811061268357fe5b600091825260208083206004909202909101546001600160a01b038981168452600690925260409092208054919092169190879081106126bf57fe5b90600052602060002090600402016001015460066000896001600160a01b03166001600160a01b03168152602001908152602001600020878154811061270157fe5b906000526020600020906004020160020154600660008a6001600160a01b03166001600160a01b03168152602001908152602001600020888154811061274357fe5b906000526020600020906004020160030154935093509350935092959194509250565b600a5460ff16156127ad576040805162461bcd60e51b815260206004820152600c60248201526b131bd8dace881c185d5cd95960a21b604482015290519081900360640190fd5b600083815260096020526040902060016006820154600160a01b900460ff1660028111156127d757fe5b14612822576040805162461bcd60e51b81526020600482015260166024820152752637b1b59d102637b1b59034b9903737ba1037b832b760511b604482015290519081900360640190fd5b61282a61471b565b81546001600160a01b0316600090815260046020526040902054600190612857908263ffffffff6135e916565b8154811061286157fe5b60009182526020918290206040805160c081018252600590930290910180546001600160a01b0316835260018101549383019390935260028084015460ff808216151593850193909352929392606085019261010090910416908111156128c457fe5b60028111156128cf57fe5b81526020016003820180548060200260200160405190810160405280929190818152602001828054801561292257602002820191906000526020600020905b81548152602001906001019080831161290e575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561297a57602002820191906000526020600020905b815481526020019060010190808311612966575b5050509190925250508354600485015460018601549394506129a9936001600160a01b03909216925090613adc565b6000806129b7868685613c2e565b909250905084156129ec576005546003546002546129ec926001600160a01b039182169233929091169063ffffffff613db216565b83546001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612b1a57348614612a66576040805162461bcd60e51b815260206004820152601d60248201527f4c6f636b3a20496e73756666696369656e742076616c75652073656e74000000604482015290519081900360640190fd5b84612b15576005546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612ab8576040519150601f19603f3d011682016040523d82523d6000602084013e612abd565b606091505b5050905080612b13576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b3a205472616e73666572206f6620666565206661696c656400000000604482015290519081900360640190fd5b505b612b60565b84612b43576005548454612b43916001600160a01b03918216913391168563ffffffff613db216565b8354612b60906001600160a01b031633308463ffffffff613db216565b6001840154612b75908263ffffffff613a8216565b60018501554260048501556006840154604080518981526020810184905281516001600160a01b03909316927fab5b2b1b2954cf9271f13f0ea01ed62b7e1046493ca1cd34c5993f08004df035929181900390910190a250505050505050565b612bdd612d41565b612c1c576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60015490565b612c74612d41565b612cb3576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b600a5460ff1615612cfa576040805162461bcd60e51b815260206004820152600c60248201526b131bd8dace881c185d5cd95960a21b604482015290519081900360640190fd5b600a805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b6000546001600160a01b031690565b600080546001600160a01b0316612d56613e0c565b6001600160a01b031614905090565b6001600160a01b0381166000908152600460205260408120548015612dd457600180612d97838263ffffffff6135e916565b81548110612da157fe5b906000526020600020906005020160020160019054906101000a900460ff166002811115612dcb57fe5b149150506110f1565b50600092915050565b612de5612d41565b612e24576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0387166000908152600460205260409020548790612e7e576040805162461bcd60e51b815260206004820152601c6024820152600080516020614945833981519152604482015290519081900360640190fd5b838214612ed2576040805162461bcd60e51b815260206004820152601a60248201527f4c6f636b3a20546965727320646f6573206e6f74206d61746368000000000000604482015290519081900360640190fd5b6001600160a01b038816600090815260046020526040812054612efc90600163ffffffff6135e916565b9050600060018281548110612f0d57fe5b60009182526020909120600590910201600181018a905560028101805460ff19168a15151790559050612f446003820188886147fd565b50612f536004820186866147fd565b50896001600160a01b0316827f2b161189aa253f00c5bf7c3a5801e32725ae51dc9167bd23219bda37d26e42f38b8b8b8b8b8b604051808781526020018615151515815260200180602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f19169092018290039a509098505050505050505050a350505050505050505050565b600061301c614751565b60008381526009602090815260409182902082516101008101845281546001600160a01b039081168252600183015493820193909352600280830154948201949094526003820154606082015260048201546080820152600582015460a0820152600682015492831660c082015292909160e0840191600160a01b90910460ff16908111156130a757fe5b60028111156130b257fe5b905250905060018160e0015160028111156130c957fe5b148015613150575042816060015111158061312e575080516001600160a01b031660009081526004602052604090205460019061310c908263ffffffff6135e916565b8154811061311657fe5b600091825260209091206002600590920201015460ff165b80613150575060008160a0015111801561315057508060a00151816020015110155b15612dd45760019150506110f1565b613167612d41565b6131a6576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b0381166131eb5760405162461bcd60e51b815260040180806020018281038252602c815260200180614884602c913960400191505060405180910390fd5b600580546001600160a01b0319166001600160a01b0383169081179091556040517f3ce716f94fe275e52428cbf6b7f388e5a65976d4edabc34355a77f5e89655bdc90600090a250565b61323d612d41565b61327c576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b60038190556040805182815290517f47ba71ee0e24fe729cf2b6226673ef750fe0ea2ba09bd1865531265edb669e989181900360200190a150565b6132bf612d41565b6132fe576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6001600160a01b038116613359576040805162461bcd60e51b815260206004820181905260248201527f4c6f636b3a20496e76616c6964206c6f636b20746f6b656e2061646472657373604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517fdf1be95c61e48d6999b3c7d4e42ba72fe3ccf08dcb2b4e028ee4521e1609b6e990600090a250565b6001600160a01b03811660009081526006602090815260409182902054825181815281830281019092019092526060918291829182918180156133f0578160200160208202803883390190505b5094508060405190808252806020026020018201604052801561341d578160200160208202803883390190505b5093508060405190808252806020026020018201604052801561344a578160200160208202803883390190505b50925080604051908082528060200260200182016040528015613477578160200160208202803883390190505b50915060005b8181101561358d5761348d614838565b6001600160a01b03881660009081526006602052604090208054839081106134b157fe5b600091825260209182902060408051608081018252600490930290910180546001600160a01b0316808452600182015494840194909452600281015491830191909152600301546060820152885190925088908490811061350e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050806020015186838151811061353f57fe5b602002602001018181525050806040015185838151811061355c57fe5b602002602001018181525050806060015184838151811061357957fe5b60209081029190910101525060010161347d565b50509193509193565b61359e612d41565b6135dd576040805162461bcd60e51b815260206004820181905260248201526000805160206149b5833981519152604482015290519081900360640190fd5b6135e681613e10565b50565b600061362b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613eb0565b90505b92915050565b60008181526009602052604080822060068101805460ff60a01b1916600160a11b1790556001810154915190929133918381818185875af1925050503d806000811461369c576040519150601f19603f3d011682016040523d82523d6000602084013e6136a1565b606091505b50509050806136f7576040805162461bcd60e51b815260206004820152601e60248201527f4c6f636b3a204661696c656420746f207472616e736665722065746821210000604482015290519081900360640190fd5b815460048301546001840154613717926001600160a01b03169190613adc565b505050565b600081815260096020526040902060068101805460ff60a01b1916600160a11b1790556001810154815461375d916001600160a01b03909116903390613f47565b80546004820154600183015461377d926001600160a01b03169190613adc565b5050565b60006001600160a01b0385166137c85760405162461bcd60e51b81526004018080602001828103825260298152602001806149d56029913960400191505060405180910390fd5b6137d061471b565b6001600160a01b0389166000908152600460205260409020546001906137fc908263ffffffff6135e916565b8154811061380657fe5b60009182526020918290206040805160c081018252600590930290910180546001600160a01b0316835260018101549383019390935260028084015460ff8082161515938501939093529293926060850192610100909104169081111561386957fe5b600281111561387457fe5b8152602001600382018054806020026020016040519081016040528092919081815260200182805480156138c757602002820191906000526020600020905b8154815260200190600101908083116138b3575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561391f57602002820191906000526020600020905b81548152602001906001019080831161390b575b5050505050815250509050806020015188101561396d5760405162461bcd60e51b815260040180806020018281038252602f815260200180614965602f913960400191505060405180910390fd5b600061397f428963ffffffff613a8216565b905060008061398f8b8786613c2e565b90925090508673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038e1614156139e0576139c98284868d8d8d8d613f99565b6139d9818d63ffffffff6135e916565b90506139ef565b6139ef8d8385878e8e8d614266565b896001600160a01b0316336001600160a01b03168e6001600160a01b03167f794ab9b33e2c384cf9197aa82831ace4429b76dfe37fdf9da684aa02e337063f60075486428a8e8b6040518087815260200186815260200185815260200184815260200183151515158152602001828152602001965050505050505060405180910390a49c9b505050505050505050505050565b60008282018381101561362b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60005b6001600160a01b038416600090815260066020526040902054811015613c2857613b07614838565b6001600160a01b0385166000908152600660205260409020805483908110613b2b57fe5b600091825260209182902060408051608081018252600490930290910180546001600160a01b031683526001810154938301939093526002830154908201526003909101546060820181905290915084108015613b8b5750428160600151105b15613c1f576000613bbd8260400151613bb184602001518761442790919063ffffffff16565b9063ffffffff61448016565b8251909150613bdc906001600160a01b0316338363ffffffff613f4716565b81516040805183815290516001600160a01b03909216917fb82d2a7de6e3c04c554cd659f5f2b8d49c0131c0363c91a4ccef6756d16029909181900360200190a2505b50600101613adf565b50505050565b6000838315613c41576003549150613daa565b8460005b60018560800151510381108015613c5c5750600082115b15613d4b5784608001518181518110613c7157fe5b60200260200101518210613d0957613ca985608001518281518110613c9257fe5b6020026020010151836135e990919063ffffffff16565b9150613d02613cf5612710613bb18860a001518581518110613cc757fe5b602002602001015189608001518681518110613cdf57fe5b602002602001015161442790919063ffffffff16565b859063ffffffff613a8216565b9350613d43565b613d3c613cf5612710613bb18860a001518581518110613d2557fe5b60200260200101518661442790919063ffffffff16565b9350600091505b600101613c45565b50613d94613d87612710613bb18760a0015160018960800151510381518110613d7057fe5b60200260200101518561442790919063ffffffff16565b849063ffffffff613a8216565b9250613da6868463ffffffff6135e916565b9150505b935093915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613c289085906144c2565b3390565b6001600160a01b038116613e555760405162461bcd60e51b81526004018080602001828103825260268152602001806148b06026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008184841115613f3f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f04578181015183820152602001613eec565b50505050905090810190601f168015613f315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526137179084906144c2565b801561401e5786821015613ff4576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20456e6f75676820455448206e6f742073656e7421210000000000604482015290519081900360640190fd5b600554600254614019916001600160a01b03918216913391168963ffffffff613db216565b61412c565b61402e878763ffffffff613a8216565b821015614082576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b3a20456e6f75676820455448206e6f742073656e7421210000000000604482015290519081900360640190fd5b6005546040516000916001600160a01b03169088908381818185875af1925050503d80600081146140cf576040519150601f19603f3d011682016040523d82523d6000602084013e6140d4565b606091505b505090508061412a576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b3a205472616e73666572206f6620666565206661696c656400000000604482015290519081900360640190fd5b505b60075461414090600163ffffffff613a8216565b6007819055604080516101008101825273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee815260208082018b815242838501818152606085018c81526080860192835260a086018b81526001600160a01b038d811660c08901908152600160e08a0181815260009c8d52600990995299909a20885181549083166001600160a01b031991821617825596519981019990995592516002808a0191909155915160038901559251600488015591516005870155955160068601805491909716921691909117808655915192949160ff60a01b191690600160a01b90849081111561422657fe5b021790555050506001600160a01b039093166000908152600860209081526040822060075481546001810183559184529190922090910155505050505050565b801561429657600554600254614291916001600160a01b03918216913391168863ffffffff613db216565b6142b8565b6005546142b8906001600160a01b03898116913391168863ffffffff613db216565b6142d36001600160a01b03881633308963ffffffff613db216565b6007546142e790600163ffffffff613a8216565b600781905550604051806101000160405280886001600160a01b03168152602001878152602001428152602001858152602001428152602001838152602001846001600160a01b031681526020016001600281111561434257fe5b9052600754600090815260096020908152604091829020835181546001600160a01b039182166001600160a01b031991821617835592850151600183015592840151600280830191909155606085015160038301556080850151600483015560a0850151600583015560c08501516006830180549190951693169290921780845560e08501519193919260ff60a01b1990911690600160a01b9084908111156143e757fe5b021790555050506001600160a01b039092166000908152600860209081526040822060075481546001810183559184529190922090910155505050505050565b6000826144365750600061362e565b8282028284828161444357fe5b041461362b5760405162461bcd60e51b81526004018080602001828103825260218152602001806149946021913960400191505060405180910390fd5b600061362b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061467a565b6144d4826001600160a01b03166146df565b614525576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106145635780518252601f199092019160209182019101614544565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146145c5576040519150601f19603f3d011682016040523d82523d6000602084013e6145ca565b606091505b509150915081614621576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115613c285780806020019051602081101561463d57600080fd5b5051613c285760405162461bcd60e51b815260040180806020018281038252602a8152602001806149fe602a913960400191505060405180910390fd5b600081836146c95760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613f04578181015183820152602001613eec565b5060008385816146d557fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906147135750808214155b949350505050565b6040805160c081018252600080825260208201819052918101829052906060820190815260200160608152602001606081525090565b60405180610100016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600060028111156147ad57fe5b905290565b8280548282559060005260206000209081019282156147ed579160200282015b828111156147ed5782518255916020019190600101906147d2565b506147f9929150614869565b5090565b8280548282559060005260206000209081019282156147ed579160200282015b828111156147ed57823582559160200191906001019061481d565b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b610ed991905b808211156147f9576000815560010161486f56fe4c6f636b3a20506c656173652070726f76696465722076616c69642077616c6c6574206164647265737321214f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734c6f636b3a20546f6b656e20697320696e20656d657267656e637920756e6c6f636b20737461746521214c6f636b3a20496e76616c69642064657374696e6174696f6e20746f6b656e21214c6f636b3a2053656e74206d6f726520657468657273207468656e2072657175697265644c6f636b3a20546f6b656e20646f6573206e6f742065786973742121000000004c6f636b3a20506c656173652070726f76696465206d696e696d756d20616d6f756e74206f6620746f6b656e732121536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724c6f636b3a2050726f766964652076616c69642062656e6566696369617279206164647265737321215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158209b3173ffb040c17e25eba883c10636db670ca98e15f0b4e560a830503d5b261a64736f6c634300050f0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000284f214df3f85526a910979f52c96e54fb228136000000000000000000000000605cc9088882c549f40ce093cb90eb0319b6676d0000000000000000000000000000000000000000000000000de0b6b3a7640000
-----Decoded View---------------
Arg [0] : wallet (address): 0x284F214Df3F85526A910979F52C96e54fB228136
Arg [1] : lockTokenAddress (address): 0x605cc9088882C549f40CE093cb90eB0319b6676d
Arg [2] : lockTokenFee (uint256): 1000000000000000000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000284f214df3f85526a910979f52c96e54fb228136
Arg [1] : 000000000000000000000000605cc9088882c549f40ce093cb90eb0319b6676d
Arg [2] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Deployed Bytecode Sourcemap
19233:33198:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38128:415;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38128:415:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38128:415:0;-1:-1:-1;;;;;38128:415:0;;:::i;:::-;;25366:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25366:85:0;;;:::i;:::-;;;;-1:-1:-1;;;;;25366:85:0;;;;;;;;;;;;;;27489:636;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27489:636:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27489:636:0;-1:-1:-1;;;;;27489:636:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27489:636:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27489:636:0;;;;;;;;;;;;;;;;;;;;;;29211:174;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29211:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29211:174:0;-1:-1:-1;;;;;29211:174:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29211:174:0;;;;;;;;;;;;;;;;;37569:421;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37569:421:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37569:421:0;-1:-1:-1;;;;;37569:421:0;;:::i;41706:459::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41706:459:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41706:459:0;;:::i;25846:97::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25846:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;31484:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31484:109:0;;;:::i;39138:648::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39138:648:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26265:1100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26265:1100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26265:1100:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26265:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26265:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26265:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26265:1100:0;;;;;;;;;;;;;;;;;;;;;;;31968:951;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31968:951:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;31968:951:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33968:854::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33968:854:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;33968:854:0;;;;;;;;;;;;;;;;;;;;;;;:::i;25674:100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25674:100:0;;;:::i;28229:873::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28229:873:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28229:873:0;;:::i;:::-;;;;;-1:-1:-1;;;;;28229:873:0;-1:-1:-1;;;;;28229:873:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28229:873:0;-1:-1:-1;;;;;28229:873:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25209:80;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25209:80:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;40423:1130;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;40423:1130:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;40423:1130:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40423:1130:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40423:1130:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;40423:1130:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40423:1130:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40423:1130:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;40423:1130:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40423:1130:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40423:1130:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;40423:1130:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40423:1130:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40423:1130:0;;-1:-1:-1;40423:1130:0;-1:-1:-1;40423:1130:0;;;;:::i;36727:711::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36727:711:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;36727:711:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;36727:711:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36727:711:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36727:711:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;36727:711:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36727:711:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;36727:711:0;;-1:-1:-1;36727:711:0;-1:-1:-1;36727:711:0;:::i;30731:463::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30731:463:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30731:463:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;30731:463:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42411:1625;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42411:1625:0;;;;;;;;;;;;;;:::i;8454:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8454:140:0;;;:::i;25514:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25514:96:0;;;:::i;31284:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31284:107:0;;;:::i;7643:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7643:79:0;;;:::i;8009:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8009:94:0;;;:::i;44808:248::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44808:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44808:248:0;-1:-1:-1;;;;;44808:248:0;;:::i;35564:870::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35564:870:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;35564:870:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;35564:870:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;35564:870:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35564:870:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;35564:870:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;35564:870:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;35564:870:0;;-1:-1:-1;35564:870:0;-1:-1:-1;35564:870:0;:::i;44157:511::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44157:511:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44157:511:0;;:::i;34939:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34939:261:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34939:261:0;-1:-1:-1;;;;;34939:261:0;;:::i;33451:165::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33451:165:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33451:165:0;;:::i;33036:299::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33036:299:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33036:299:0;-1:-1:-1;;;;;33036:299:0;;:::i;29495:1058::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29495:1058:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29495:1058:0;-1:-1:-1;;;;;29495:1058:0;;:::i;8749:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8749:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8749:109:0;-1:-1:-1;;;;;8749:109:0;;:::i;38128:415::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23051:20:0;;23074:1;23051:20;;;:13;:20;;;;;;38239:5;;23043:65;;;;;-1:-1:-1;;;23043:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23043:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38278:20:0;;38262:13;38278:20;;;:13;:20;;;;;;:27;;38303:1;38278:27;:24;:27;:::i;:::-;38262:43;-1:-1:-1;38365:20:0;38340:7;38348:5;38340:14;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:45;;;;;;;;;38318:123;;;;;-1:-1:-1;;;38318:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38478:18;38454:7;38462:5;38454:14;;;;;;;;;;;;;;;;;;:21;;;:42;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38514:21:0;;-1:-1:-1;;;;;38514:21:0;;;;;;;;23119:1;7912;38128:415;:::o;25366:85::-;25436:7;;-1:-1:-1;;;;;25436:7:0;25366:85;;:::o;27489:636::-;-1:-1:-1;;;;;27757:27:0;;27565:17;27757:27;;;:13;:27;;;;;;27565:17;;;;27653:28;;;;27800:9;;27797:321;;27833:12;:5;27843:1;27833:12;:9;:12;:::i;:::-;27825:20;;27860:18;;:::i;:::-;27881:7;27889:5;27881:14;;;;;;;;;;;;;;;;;27860:35;;;;;;;;27881:14;;;;;;;27860:35;;-1:-1:-1;;;;;27860:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27881:14;27860:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27860:35:0;;;;-1:-1:-1;;;27936:15:0;;;;27970:21;;;;28010:12;;;;28041:17;;;;28077:14;;;;;27936:15;;-1:-1:-1;27970:21:0;;-1:-1:-1;28010:12:0;-1:-1:-1;28041:17:0;;-1:-1:-1;28077:14:0;-1:-1:-1;27910:196:0;;-1:-1:-1;;27910:196:0;27797:321;27489:636;;;;;;;;;:::o;29211:174::-;-1:-1:-1;;;;;29357:20:0;;;;;;:14;:20;;;;;;;;;29350:27;;;;;;;;;;;;;;;;;29312:20;;29350:27;;;29357:20;29350:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29211:174;;;;:::o;37569:421::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23051:20:0;;23074:1;23051:20;;;:13;:20;;;;;;37682:5;;23043:65;;;;;-1:-1:-1;;;23043:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23043:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37721:20:0;;37705:13;37721:20;;;:13;:20;;;;;;:27;;37746:1;37721:27;:24;:27;:::i;:::-;37705:43;-1:-1:-1;37808:18:0;37783:7;37791:5;37783:14;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:43;;;;;;;;;37761:123;;;;;-1:-1:-1;;;37761:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37921:20;37897:7;37905:5;37897:14;;;;;;;;;;;;;;;;;;:21;;;:44;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37959:23:0;;-1:-1:-1;;;;;37959:23:0;;;;;;;;23119:1;7912;37569:421;:::o;41706:459::-;41751:2;23788:13;23798:2;23788:9;:13::i;:::-;23780:49;;;;;-1:-1:-1;;;23780:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23864:20;;;;:16;:20;;;;;:32;;;-1:-1:-1;;;;;23864:32:0;23900:10;23864:46;23842:123;;;;;-1:-1:-1;;;23842:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41766:30;;:::i;:::-;41799:20;;;;:16;:20;;;;;;;;;41766:53;;;;;;;;;-1:-1:-1;;;;;41766:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41799:20;;41766:53;;;;-1:-1:-1;;;41766:53:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41848:17:0;;;;-1:-1:-1;;;;;;41833:32:0;20001:42;41833:32;41830:200;;;41882:45;41910:2;41882:9;:45::i;:::-;41830:200;;;41971:47;42001:2;41971:11;:47::i;:::-;42129:11;:17;;;-1:-1:-1;;;;;42047:110:0;42091:11;:23;;;-1:-1:-1;;;;;42047:110:0;42074:2;42047:110;;;;;;;;;;23976:1;41706:459;;:::o;25846:97::-;25922:13;;25846:97;:::o;31484:109::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;24335:7;;;;24327:36;;;;;-1:-1:-1;;;24327:36:0;;;;;;;;;;;;-1:-1:-1;;;24327:36:0;;;;;;;;;;;;;;;31544:7;:15;;-1:-1:-1;;31544:15:0;;;31575:10;;;;31554:5;;31575:10;31484:109::o;39138:648::-;24142:7;;;;24141:8;24133:33;;;;;-1:-1:-1;;;24133:33:0;;;;;;;;;;;;-1:-1:-1;;;24133:33:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23346:20:0;;23330:13;23346:20;;;:13;:20;;;;;;39417:12;;23387:9;23379:50;;;;;-1:-1:-1;;;23379:50:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23379:50:0;;;;;;;;;;;;;;;23496:18;23464:7;23472:12;:5;23464:7;23472:12;:9;:12;:::i;:::-;23464:21;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;:50;;;;;;;;;23442:124;;;;;-1:-1:-1;;;23442:124:0;;;;;;;;;;;;-1:-1:-1;;;23442:124:0;;;;;;;;;;;;;;;23602:7;23610:12;:5;23602:7;23610:12;:9;:12;:::i;:::-;23602:21;;;;;;;;;;;;;;;;:37;:21;;;;;:37;;;;23601:38;23579:130;;;;-1:-1:-1;;;23579:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39447:16;39466:189;39486:12;39513:6;39534:8;39557:11;39583:15;39613:9;39637:7;39466:5;:189::i;:::-;39447:208;;39701:11;39690:8;:22;39668:108;;;;-1:-1:-1;;;39668:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23720:1;24177;;39138:648;;;;;;:::o;26265:1100::-;26347:31;26389:27;26427:30;26468:29;26552:6;26538:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;26538:21:0;;26521:38;;26597:6;26583:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;26583:21:0;;26570:34;;26645:6;26634:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;26634:18:0;;26615:37;;26692:6;26674:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;26674:25:0;-1:-1:-1;26741:7:0;:14;26663:36;;-1:-1:-1;26720:17:0;:5;26730:6;26720:17;:9;:17;:::i;:::-;:35;;26712:67;;;;;-1:-1:-1;;;26712:67:0;;;;;;;;;;;;-1:-1:-1;;;26712:67:0;;;;;;;;;;;;;;;26807:1;26798:6;:10;:26;;;;;26822:2;26812:6;:12;;26798:26;26790:59;;;;;-1:-1:-1;;;26790:59:0;;;;;;;;;;;;-1:-1:-1;;;26790:59:0;;;;;;;;;;;;;;;26860:13;26904:5;26888:332;26915:17;:5;26925:6;26915:17;:9;:17;:::i;:::-;26911:1;:21;26888:332;;;26978:7;26986:1;26978:10;;;;;;;;;;;;;;;;;;;;;:23;26954:21;;-1:-1:-1;;;;;26978:23:0;;;;26954:14;;26969:5;;26954:21;;;;;;;;;;;:47;-1:-1:-1;;;;;26954:47:0;;;-1:-1:-1;;;;;26954:47:0;;;;;27036:7;27044:1;27036:10;;;;;;;;;;;;;;;;;;:20;;;27016:10;27027:5;27016:17;;;;;;;;;;;;;:40;;;;;27097:7;27105:1;27097:10;;;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;27071:16;27088:5;27071:23;;;;;;;;;;;;;:52;;;;;;;;;;;27156:7;27164:1;27156:10;;;;;;;;;;;;;;;;;;:17;;;;;;;;;;;;27138:8;27147:5;27138:15;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27196:12:0;:5;27206:1;27196:12;:9;:12;:::i;:::-;27188:20;-1:-1:-1;26934:3:0;;26888:332;;;-1:-1:-1;;26265:1100:0;;;;;;;:::o;31968:951::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23051:20:0;;23074:1;23051:20;;;:13;:20;;;;;;32189:9;;23043:65;;;;;-1:-1:-1;;;23043:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23043:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32224:23:0;;32216:69;;;;-1:-1:-1;;;32216:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32316:1;32304:9;:13;32296:51;;;;;-1:-1:-1;;;32296:51:0;;;;;;;;;;;;-1:-1:-1;;;32296:51:0;;;;;;;;;;;;;;;32380:1;32366:11;:15;32358:55;;;;;-1:-1:-1;;;32358:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32432:19;32441:9;32432:8;:19::i;:::-;32424:64;;;;;-1:-1:-1;;;32424:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32501:31:0;;;;;;;:20;:31;;;;;;;;32538:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;32501:192:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32501:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32786:31;;;;;;;:38;;32538:154;;32711:200;;32786:45;;:42;:45::i;:::-;32711:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7912:1;31968:951;;;;;:::o;33968:854::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34206:31:0;;;;;;:20;:31;;;;;:38;:46;-1:-1:-1;34184:123:0;;;;;-1:-1:-1;;;34184:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34338:1;34326:9;:13;34318:51;;;;;-1:-1:-1;;;34318:51:0;;;;;;;;;;;;-1:-1:-1;;;34318:51:0;;;;;;;;;;;;;;;34402:1;34388:11;:15;34380:55;;;;;-1:-1:-1;;;34380:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34474:31:0;;34448:23;34474:31;;;:20;:31;;;;;:38;;34506:5;;34474:38;;;;;;;;;;;;;;;34523:17;34474:38;;;;;34523:17;;;:29;;;34563:19;;;:33;;;34607:12;;;:19;;;34697:17;;34644:170;;;;;;;;;;;;;;;;;;;;;;;;;34474:38;;-1:-1:-1;;;;;;34697:17:0;;;;34644:170;;;;;;;;;;;;;7912:1;33968:854;;;;;:::o;25674:100::-;25755:10;;-1:-1:-1;;;;;25755:10:0;25674:100;:::o;28229:873::-;28297:13;28321:14;28346:17;28374:15;28400:18;28429:19;28459:13;28483:23;28530:24;;:::i;:::-;28557:20;;;;:16;:20;;;;;;;;;28530:47;;;;;;;;;-1:-1:-1;;;;;28530:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28557:20;;28530:47;;;;-1:-1:-1;;;28530:47:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28596:11:0;;28627:12;;;;28662:15;;;;28698:13;;;;28736:17;;;;28773:12;;;;28814:21;;;;28859:16;;;;;28596:11;;-1:-1:-1;28627:12:0;;-1:-1:-1;28662:15:0;;-1:-1:-1;28698:13:0;-1:-1:-1;28859:16:0;;-1:-1:-1;28736:17:0;;-1:-1:-1;28773:12:0;-1:-1:-1;28814:21:0;-1:-1:-1;;28229:873:0;;;;;;;;;:::o;25209:80::-;25274:7;;;;25209:80;:::o;40423:1130::-;24142:7;;;;24141:8;24133:33;;;;;-1:-1:-1;;;24133:33:0;;;;;;;;;;;;-1:-1:-1;;;24133:33:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23346:20:0;;23330:13;23346:20;;;:13;:20;;;;;;40755:12;;23387:9;23379:50;;;;;-1:-1:-1;;;23379:50:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23379:50:0;;;;;;;;;;;;;;;23496:18;23464:7;23472:12;:5;23464:7;23472:12;:9;:12;:::i;:::-;23464:21;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;:50;;;;;;;;;23442:124;;;;;-1:-1:-1;;;23442:124:0;;;;;;;;;;;;-1:-1:-1;;;23442:124:0;;;;;;;;;;;;;;;23602:7;23610:12;:5;23602:7;23610:12;:9;:12;:::i;:::-;23602:21;;;;;;;;;;;;;;;;:37;:21;;;;;:37;;;;23601:38;23579:130;;;;-1:-1:-1;;;23579:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40804:9;40832:34;;;40824:66;;;;;-1:-1:-1;;;40824:66:0;;;;;;;;;;;;-1:-1:-1;;;40824:66:0;;;;;;;;;;;;;;;40909:38;;;40901:70;;;;;-1:-1:-1;;;40901:70:0;;;;;;;;;;;;-1:-1:-1;;;40901:70:0;;;;;;;;;;;;;;;41004:41;;;40982:110;;;;;-1:-1:-1;;;40982:110:0;;;;;;;;;;;;-1:-1:-1;;;40982:110:0;;;;;;;;;;;;;;;41109:9;41105:318;41124:18;;;41105:318;;;41174:237;41198:12;41229:7;;41237:1;41229:10;;;;;;;;;;;;;41258:9;;41268:1;41258:12;;;;;;;;;;;;;41289:13;;41303:1;41289:16;;;;;;;;;;;;;-1:-1:-1;;;;;41289:16:0;41324;;41341:1;41324:19;;;;;;;;;;;;;41362:8;41389:7;41174:5;:237::i;:::-;41163:248;-1:-1:-1;41144:3:0;;41105:318;;;;41468:11;41457:8;:22;41435:108;;;;-1:-1:-1;;;41435:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23720:1;24177;;40423:1130;;;;;;;;;;:::o;36727:711::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23197:20:0;;;;;;:13;:20;;;;;;36947:5;;23197:25;23189:65;;;;;-1:-1:-1;;;23189:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36992:37;;;36970:113;;;;;-1:-1:-1;;;36970:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37096:7;37109:237;;;;;;;;37144:5;-1:-1:-1;;;;;37109:237:0;;;;;37175:9;37109:237;;;;37216:5;37109:237;;;;;;37244:18;37109:237;;;;;;;;;;;;37290:11;;37109:237;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;;37109:237:0;;;-1:-1:-1;37109:237:0;;;;;;;;;;;;;;;;;;;;;;;;37326:8;;;;;;37109:237;;;37326:8;;37109:237;37326:8;37109:237;1:33:-1;99:1;81:16;;74:27;;;-1:-1;37109:237:0;;;;-1:-1:-1;;27:10;;39:1;23:18;;;45:23;;;37096:251:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37096:251:0;-1:-1:-1;;;;;37096:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37096:251:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;37096:251:0;;;;;;;;;;;;;;;;;-1:-1:-1;37096:251:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;37096:251:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;37381:7:0;:14;-1:-1:-1;;;;;37358:20:0;;;;;;:13;:20;;;;;;:37;;;;37413:17;;37358:20;;-1:-1:-1;37413:17:0;;-1:-1:-1;37413:17:0;7912:1;36727:711;;;;;;:::o;30731:463::-;-1:-1:-1;;;;;30957:27:0;;30813:17;30957:27;;;:20;:27;;;;;:34;;30813:17;;;;;;30957:27;30985:5;;30957:34;;;;;;;;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;31016:27:0;;;;;:20;:27;;;;;;;:34;;30957:44;;;;;31016:27;31044:5;;31016:34;;;;;;;;;;;;;;;;:44;;;31075:20;:27;31096:5;-1:-1:-1;;;;;31075:27:0;-1:-1:-1;;;;;31075:27:0;;;;;;;;;;;;31103:5;31075:34;;;;;;;;;;;;;;;;;;:46;;;31136:20;:27;31157:5;-1:-1:-1;;;;;31136:27:0;-1:-1:-1;;;;;31136:27:0;;;;;;;;;;;;31164:5;31136:34;;;;;;;;;;;;;;;;;;:39;;;30935:251;;;;;;;;30731:463;;;;;;;:::o;42411:1625::-;24142:7;;;;24141:8;24133:33;;;;;-1:-1:-1;;;24133:33:0;;;;;;;;;;;;-1:-1:-1;;;24133:33:0;;;;;;;;;;;;;;;42580:31;42614:20;;;:16;:20;;;;;42677:11;42655:18;;;;-1:-1:-1;;;42655:18:0;;;;:33;;;;;;;;;42647:68;;;;;-1:-1:-1;;;42647:68:0;;;;;;;;;;;;-1:-1:-1;;;42647:68:0;;;;;;;;;;;;;;;42736:18;;:::i;:::-;42779:17;;-1:-1:-1;;;;;42779:17:0;42765:32;;;;:13;:32;;;;;;42757:7;;42765:39;;42757:7;42765:39;:36;:39;:::i;:::-;42757:48;;;;;;;;;;;;;;;;;42736:69;;;;;;;;42757:48;;;;;;;42736:69;;-1:-1:-1;;;;;42736:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42757:48;42736:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42736:69:0;;;;-1:-1:-1;;42934:17:0;;42966:22;;;;42934:17;43003:18;;;42736:69;;-1:-1:-1;42897:135:0;;-1:-1:-1;;;;;42934:17:0;;;;-1:-1:-1;42966:22:0;42897;:135::i;:::-;43047:11;;43124:37;43138:6;43146:7;43155:5;43124:13;:37::i;:::-;43105:56;;-1:-1:-1;43105:56:0;-1:-1:-1;43174:102:0;;;;43241:7;;43250:13;;43201:10;;:63;;-1:-1:-1;;;;;43201:10:0;;;;43229;;43241:7;;;;43201:63;:27;:63;:::i;:::-;43304:17;;-1:-1:-1;;;;;43304:17:0;20001:42;43289:32;43286:554;;;43356:9;43346:6;:19;43338:61;;;;;-1:-1:-1;;;43338:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43420:7;43416:160;;43466:7;;:27;;43449:12;;-1:-1:-1;;;;;43466:7:0;;43485:3;;43449:12;43466:27;43449:12;43466:27;43485:3;43466:7;:27;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;43448:45:0;;;43520:7;43512:48;;;;;-1:-1:-1;;;43512:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43416:160;;43286:554;;;43621:7;43617:115;;43703:7;;43655:17;;43648:68;;-1:-1:-1;;;;;43655:17:0;;;;43691:10;;43703:7;43712:3;43648:68;:42;:68;:::i;:::-;43755:17;;43748:80;;-1:-1:-1;;;;;43755:17:0;43791:10;43811:4;43818:9;43748:80;:42;:80;:::i;:::-;43873:18;;;;:33;;43896:9;43873:33;:22;:33;:::i;:::-;43852:18;;;:54;43942:15;43917:22;;;:40;43987:23;;;;43975:51;;;;;;;;;;;;;;-1:-1:-1;;;;;43987:23:0;;;;43975:51;;;;;;;;;;;24177:1;;;;42411:1625;;;:::o;8454:140::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;8553:1;8537:6;;8516:40;;-1:-1:-1;;;;;8537:6:0;;;;8516:40;;8553:1;;8516:40;8584:1;8567:19;;-1:-1:-1;;;;;;8567:19:0;;;8454:140::o;25514:96::-;25588:7;:14;25514:96;:::o;31284:107::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;24142:7;;;;24141:8;24133:33;;;;;-1:-1:-1;;;24133:33:0;;;;;;;;;;;;-1:-1:-1;;;24133:33:0;;;;;;;;;;;;;;;31345:7;:14;;-1:-1:-1;;31345:14:0;31355:4;31345:14;;;31375:8;;;;31345:7;;31375:8;31284:107::o;7643:79::-;7681:7;7708:6;-1:-1:-1;;;;;7708:6:0;7643:79;:::o;8009:94::-;8049:4;8089:6;;-1:-1:-1;;;;;8089:6:0;8073:12;:10;:12::i;:::-;-1:-1:-1;;;;;8073:22:0;;8066:29;;8009:94;:::o;44808:248::-;-1:-1:-1;;;;;44894:20:0;;44861:4;44894:20;;;:13;:20;;;;;;44930:9;;44927:99;;44995:18;44963:7;44971:12;:5;44963:7;44971:12;:9;:12;:::i;:::-;44963:21;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;:50;;;;;;;;;44955:59;;;;;44927:99;-1:-1:-1;45043:5:0;;44808:248;-1:-1:-1;;44808:248:0:o;35564:870::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23051:20:0;;23074:1;23051:20;;;:13;:20;;;;;;35818:12;;23043:65;;;;;-1:-1:-1;;;23043:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23043:65:0;;;;;;;;;;;;;;;35870:37;;;35848:113;;;;;-1:-1:-1;;;35848:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35990:27:0;;35974:13;35990:27;;;:13;:27;;;;;;:34;;36022:1;35990:34;:31;:34;:::i;:::-;35974:50;;36035:19;36057:7;36065:5;36057:14;;;;;;;;;;;;;;;;;;;;;36082:15;;;:27;;;36120:21;;;:39;;-1:-1:-1;;36120:39:0;;;;;;;36057:14;-1:-1:-1;36170:31:0;:17;;;36190:11;;36170:31;:::i;:::-;-1:-1:-1;36212:25:0;:14;;;36229:8;;36212:25;:::i;:::-;;36300:12;-1:-1:-1;;;;;36253:173:0;36280:5;36253:173;36327:9;36351:15;36381:11;;36407:8;;36253:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;137:4;117:14;-1:-1;;113:30;157:16;;;36253:173:0;;;;;;;;;;;;;-1:-1:-1;36253:173:0;;;;;;;1:33:-1;99:1;81:16;;;74:27;36253:173:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;36253:173:0;;;;-1:-1:-1;36253:173:0;;-1:-1:-1;;;;;;;;;36253:173:0;23119:1;;7912;35564:870;;;;;;;:::o;44157:511::-;44208:4;44226:24;;:::i;:::-;44253:20;;;;:16;:20;;;;;;;;;44226:47;;;;;;;;;-1:-1:-1;;;;;44226:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44253:20;;44226:47;;;;-1:-1:-1;;;44226:47:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44226:47:0;-1:-1:-1;44317:11:0;44301:5;:12;;;:27;;;;;;;;;:278;;;;;44381:15;44364:5;:13;;;:32;;:111;;;-1:-1:-1;44439:11:0;;-1:-1:-1;;;;;44425:26:0;;;;;:13;:26;;;;;;44417:7;;44425:33;;44417:7;44425:33;:30;:33;:::i;:::-;44417:42;;;;;;;;;;;;;;;;:58;:42;;;;;:58;;;;44364:111;:200;;;;44521:1;44497:5;:21;;;:25;:66;;;;;44542:5;:21;;;44526:5;:12;;;:37;;44497:66;44284:354;;;44622:4;44615:11;;;;;34939:261;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35034:20:0;;35012:114;;;;-1:-1:-1;;;35012:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35137:7;:16;;-1:-1:-1;;;;;;35137:16:0;-1:-1:-1;;;;;35137:16:0;;;;;;;;35171:21;;;;-1:-1:-1;;35171:21:0;34939:261;:::o;33451:165::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;33531:13;:28;;;33575:33;;;;;;;;;;;;;;;;;33451:165;:::o;33036:299::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33139:30:0;;33117:112;;;;;-1:-1:-1;;;33117:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33240:10;:37;;-1:-1:-1;;;;;;33240:37:0;-1:-1:-1;;;;;33240:37:0;;;;;;;;33293:34;;;;-1:-1:-1;;33293:34:0;33036:299;:::o;29495:1058::-;-1:-1:-1;;;;;29742:27:0;;29725:14;29742:27;;;:20;:27;;;;;;;;;:34;29802:21;;;;;;;;;;;;;;;;29563:27;;;;;;;;29742:34;29802:21;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;29802:21:0;;29789:34;;29861:6;29847:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;29847:21:0;;29834:34;;29908:6;29894:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;29894:21:0;;29879:36;;29948:6;29934:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;29934:21:0;-1:-1:-1;29926:29:0;-1:-1:-1;30117:9:0;30113:305;30136:6;30132:1;:10;30113:305;;;30165:22;;:::i;:::-;-1:-1:-1;;;;;30190:27:0;;;;;;:20;:27;;;;;:30;;30218:1;;30190:30;;;;;;;;;;;;;;;30165:55;;;;;;;;30190:30;;;;;;;30165:55;;-1:-1:-1;;;;;30165:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30235:13;;30165:55;;-1:-1:-1;30235:10:0;;30246:1;;30235:13;;;;;;;;;;;:33;-1:-1:-1;;;;;30235:33:0;;;-1:-1:-1;;;;;30235:33:0;;;;;30299:7;:17;;;30283:10;30294:1;30283:13;;;;;;;;;;;;;:33;;;;;30349:7;:19;;;30331:12;30344:1;30331:15;;;;;;;;;;;;;:37;;;;;30394:7;:12;;;30383:5;30389:1;30383:8;;;;;;;;;;;;;;;;;:23;-1:-1:-1;30144:3:0;;30113:305;;;-1:-1:-1;;29495:1058:0;;;;;:::o;8749:109::-;7855:9;:7;:9::i;:::-;7847:54;;;;;-1:-1:-1;;;7847:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7847:54:0;;;;;;;;;;;;;;;8822:28;8841:8;8822:18;:28::i;:::-;8749:109;:::o;1377:136::-;1435:7;1462:43;1466:1;1469;1462:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1455:50;;1377:136;;;;;:::o;49290:404::-;49340:25;49368:20;;;:16;:20;;;;;;49399:12;;;:28;;-1:-1:-1;;;;49399:28:0;-1:-1:-1;;;49399:28:0;;;-1:-1:-1;49478:12:0;;;49456:39;;49368:20;;49340:25;49456:10;;49340:25;49456:39;49340:25;49456:39;49478:12;49456:10;:39;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;49438:57:0;;;49514:7;49506:50;;;;;-1:-1:-1;;;49506:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49606:11;;49632:16;;;;49606:11;49663:12;;;49569:117;;-1:-1:-1;;;;;49606:11:0;;49632:16;49569:22;:117::i;:::-;49290:404;;;:::o;49761:344::-;49813:25;49841:20;;;:16;:20;;;;;49872:12;;;:28;;-1:-1:-1;;;;49872:28:0;-1:-1:-1;;;49872:28:0;;;-1:-1:-1;49956:12:0;;;49918:11;;49911:58;;-1:-1:-1;;;;;49918:11:0;;;;49944:10;;49911:32;:58::i;:::-;50017:11;;50043:16;;;;50017:11;50074:12;;;49980:117;;-1:-1:-1;;;;;50017:11:0;;50043:16;49980:22;:117::i;:::-;49761:344;;:::o;45121:1725::-;45379:7;-1:-1:-1;;;;;45426:25:0;;45404:116;;;;-1:-1:-1;;;45404:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45533:18;;:::i;:::-;-1:-1:-1;;;;;45562:27:0;;;;;;:13;:27;;;;;;45554:7;;45562:34;;45554:7;45562:34;:31;:34;:::i;:::-;45554:43;;;;;;;;;;;;;;;;;45533:64;;;;;;;;45554:43;;;;;;;45533:64;;-1:-1:-1;;;;;45533:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45554:43;45533:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45642:5;:15;;;45632:6;:25;;45610:122;;;;-1:-1:-1;;;45610:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45745:15;45763:29;:15;45783:8;45763:29;:19;:29;:::i;:::-;45745:47;-1:-1:-1;45803:11:0;;45882:37;45896:6;45904:7;45913:5;45882:13;:37::i;:::-;45863:56;;-1:-1:-1;45863:56:0;-1:-1:-1;45951:5:0;20001:42;-1:-1:-1;;;;;45972:27:0;;;45969:586;;;46016:213;46043:9;46071:3;46093:7;46119:11;46149:15;46183:5;46207:7;46016:8;:213::i;:::-;46257:20;:8;46270:6;46257:20;:12;:20;:::i;:::-;46246:31;;45969:586;;;46321:222;46350:12;46381:9;46409:3;46431:7;46457:11;46487:15;46521:7;46321:10;:222::i;:::-;46650:11;-1:-1:-1;;;;;46572:238:0;46625:10;-1:-1:-1;;;;;46572:238:0;46598:12;-1:-1:-1;;;;;46572:238:0;;46676:7;;46698:9;46722:15;46752:7;46774;46796:3;46572:238;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46830:8;45121:1725;-1:-1:-1;;;;;;;;;;;;45121:1725:0:o;921:181::-;979:7;1011:5;;;1035:6;;;;1027:46;;;;;-1:-1:-1;;;1027:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;50340:832;50660:9;50656:507;-1:-1:-1;;;;;50679:31:0;;;;;;:20;:31;;;;;:38;50675:42;;50656:507;;;50741:22;;:::i;:::-;-1:-1:-1;;;;;50766:31:0;;;;;;:20;:31;;;;;:34;;50798:1;;50766:34;;;;;;;;;;;;;;;50741:59;;;;;;;;50766:34;;;;;;;50741:59;;-1:-1:-1;;;;;50741:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50820:25:0;-1:-1:-1;50820:59:0;;;;;50864:15;50849:7;:12;;;:30;50820:59;50817:335;;;50900:21;50924:54;50958:7;:19;;;50924:29;50935:7;:17;;;50924:6;:10;;:29;;;;:::i;:::-;:33;:54;:33;:54;:::i;:::-;51004:17;;50900:78;;-1:-1:-1;50997:65:0;;-1:-1:-1;;;;;50997:38:0;51036:10;50900:78;50997:65;:38;:65;:::i;:::-;51103:17;;51086:50;;;;;;;;-1:-1:-1;;;;;51086:50:0;;;;;;;;;;;;;50817:335;;-1:-1:-1;50719:3:0;;50656:507;;;;50340:832;;;:::o;51218:1210::-;51373:11;51433:6;51452:936;;;;51484:13;;51478:19;;51452:936;;;51559:6;51538:18;51580:536;51645:1;51618:5;:17;;;:24;:28;51614:1;:32;:50;;;;;51663:1;51650:10;:14;51614:50;51580:536;;;51735:5;:17;;;51753:1;51735:20;;;;;;;;;;;;;;51721:10;:34;51718:383;;51792:36;51807:5;:17;;;51825:1;51807:20;;;;;;;;;;;;;;51792:10;:14;;:36;;;;:::i;:::-;51779:49;;51857:63;51865:54;51913:5;51865:43;51890:5;:14;;;51905:1;51890:17;;;;;;;;;;;;;;51865:5;:17;;;51883:1;51865:20;;;;;;;;;;;;;;:24;;:43;;;;:::i;:54::-;51857:3;;:63;:7;:63;:::i;:::-;51851:69;;51718:383;;;51991:53;51999:44;52037:5;51999:33;52014:5;:14;;;52029:1;52014:17;;;;;;;;;;;;;;51999:10;:14;;:33;;;;:::i;51991:53::-;51985:59;;52080:1;52067:14;;51718:383;51667:3;;51580:536;;;;52204:130;52230:89;52313:5;52230:60;52245:5;:14;;;52287:1;52260:5;:17;;;:24;:28;52245:44;;;;;;;;;;;;;;52230:10;:14;;:60;;;;:::i;:89::-;52204:3;;:130;:7;:130;:::i;:::-;52198:136;-1:-1:-1;52361:15:0;:6;52198:136;52361:15;:10;:15;:::i;:::-;52349:27;;51452:936;;51218:1210;;;;;;:::o;16078:204::-;16205:68;;;-1:-1:-1;;;;;16205:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16205:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;16179:95:0;;16198:5;;16179:18;:95::i;6384:98::-;6464:10;6384:98;:::o;8964:229::-;-1:-1:-1;;;;;9038:22:0;;9030:73;;;;-1:-1:-1;;;9030:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9140:6;;;9119:38;;-1:-1:-1;;;;;9119:38:0;;;;9140:6;;;9119:38;;;9168:6;:17;;-1:-1:-1;;;;;;9168:17:0;-1:-1:-1;;;;;9168:17:0;;;;;;;;;;8964:229::o;1850:192::-;1936:7;1972:12;1964:6;;;;1956:29;;;;-1:-1:-1;;;1956:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1956:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2008:5:0;;;1850:192::o;15894:176::-;16003:58;;;-1:-1:-1;;;;;16003:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16003:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;15977:85:0;;15996:5;;15977:18;:85::i;46909:1146::-;47208:7;47205:383;;;47241:6;47232:5;:15;;47224:55;;;;;-1:-1:-1;;;47224:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47334:7;;47294:10;;:53;;-1:-1:-1;;;;;47294:10:0;;;;47322;;47334:7;47343:3;47294:53;:27;:53;:::i;:::-;47205:383;;;47406:15;:6;47417:3;47406:15;:10;:15;:::i;:::-;47397:5;:24;;47389:64;;;;;-1:-1:-1;;;47389:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47486:7;;:27;;47469:12;;-1:-1:-1;;;;;47486:7:0;;47505:3;;47469:12;47486:27;47469:12;47486:27;47505:3;47486:7;:27;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;47468:45:0;;;47536:7;47528:48;;;;;-1:-1:-1;;;47528:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47205:383;;47620:7;;:14;;47632:1;47620:14;:11;:14;:::i;:::-;47610:7;:24;;;47675:320;;;;;;;;20001:42;47675:320;;;;;;;;;47775:15;47675:320;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47675:320:0;;;;;;;;;47925:11;47675:320;;;;;;-1:-1:-1;47647:25:0;;;:16;:25;;;;;;;:348;;;;;;;-1:-1:-1;;;;;;47647:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47675:320;;47647:348;-1:-1:-1;;;;47647:348:0;;-1:-1:-1;;;47647:348:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;48006:27:0;;;;;;;:14;:27;;;;;;;48039:7;;27:10:-1;;39:1;23:18;;45:23;;48006:41:0;;;;;;;;;;;-1:-1:-1;;;;;;46909:1146:0:o;48128:1098::-;48423:7;48420:189;;;48486:7;;48446:10;;:53;;-1:-1:-1;;;;;48446:10:0;;;;48474;;48486:7;48495:3;48446:53;:27;:53;:::i;:::-;48420:189;;;48584:7;;48541:56;;-1:-1:-1;;;;;48541:30:0;;;;48572:10;;48584:7;48593:3;48541:56;:30;:56;:::i;:::-;48709:65;-1:-1:-1;;;;;48709:30:0;;48740:10;48760:4;48767:6;48709:65;:30;:65;:::i;:::-;48797:7;;:14;;48809:1;48797:14;:11;:14;:::i;:::-;48787:7;:24;;;;48852:314;;;;;;;;48886:5;-1:-1:-1;;;;;48852:314:0;;;;;48914:6;48852:314;;;;48946:15;48852:314;;;;48985:7;48852:314;;;;49019:15;48852:314;;;;49139:15;48852:314;;;;49062:11;-1:-1:-1;;;;;48852:314:0;;;;;49096:11;48852:314;;;;;;;;;;48841:7;;48824:25;;;;:16;:25;;;;;;;;;:342;;;;-1:-1:-1;;;;;48824:342:0;;;-1:-1:-1;;;;;;48824:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:342;;-1:-1:-1;;;;48824:342:0;;;;-1:-1:-1;;;48824:342:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;49177:27:0;;;;;;;:14;:27;;;;;;;49210:7;;27:10:-1;;39:1;23:18;;45:23;;49177:41:0;;;;;;;;;;;-1:-1:-1;;;;;;48128:1098:0:o;2293:471::-;2351:7;2596:6;2592:47;;-1:-1:-1;2626:1:0;2619:8;;2592:47;2663:5;;;2667:1;2663;:5;:1;2687:5;;;;;:10;2679:56;;;;-1:-1:-1;;;2679:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3232:132;3290:7;3317:39;3321:1;3324;3317:39;;;;;;;;;;;;;;;;;:3;:39::i;17933:1114::-;18537:27;18545:5;-1:-1:-1;;;;;18537:25:0;;:27::i;:::-;18529:71;;;;;-1:-1:-1;;;18529:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18674:12;18688:23;18723:5;-1:-1:-1;;;;;18715:19:0;18735:4;18715:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;18715:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;18673:67:0;;;;18759:7;18751:52;;;;;-1:-1:-1;;;18751:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18820:17;;:21;18816:224;;18962:10;18951:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18951:30:0;18943:85;;;;-1:-1:-1;;;18943:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3894:345;3980:7;4082:12;4075:5;4067:28;;;;-1:-1:-1;;;4067:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4067:28:0;;4106:9;4122:1;4118;:5;;;;;;;3894:345;-1:-1:-1;;;;;3894:345:0:o;12724:810::-;12784:4;13443:20;;13286:66;13483:15;;;;;:42;;;13514:11;13502:8;:23;;13483:42;13475:51;12724:810;-1:-1:-1;;;;12724:810:0:o;19233:33198::-;;;;;;;;;-1:-1:-1;19233:33198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;19233:33198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19233:33198:0;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19233:33198:0;;;-1:-1:-1;19233:33198:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19233:33198:0;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://9b3173ffb040c17e25eba883c10636db670ca98e15f0b4e560a830503d5b261a
Loading...
Loading
Loading...
Loading
OVERVIEW
Timelock ETH and ERC20 tokens.Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 64.18% | $0.017507 | 3,000,000 | $52,521.96 | |
ETH | 32.20% | $0.007707 | 3,419,350 | $26,352.55 | |
ETH | 2.90% | $2,584.94 | 0.9197 | $2,377.24 | |
ETH | 0.39% | $0.474659 | 676.2347 | $320.98 | |
ETH | 0.24% | $2.32 | 86.3731 | $200.23 | |
ETH | 0.04% | $59,001 | 0.0004985 | $29.41 | |
ETH | 0.04% | $58,614 | 0.0004985 | $29.22 | |
ETH | 0.01% | $0.043529 | 215.0011 | $9.36 | |
ETH | <0.01% | $42.37 | 0.0124 | $0.5246 | |
ETH | <0.01% | $0.998697 | 0.198 | $0.1977 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.