Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 730 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 13076698 | 1072 days ago | IN | 0 ETH | 0.00586793 | ||||
Stake | 13068078 | 1073 days ago | IN | 0 ETH | 0.00499022 | ||||
Stake | 13049967 | 1076 days ago | IN | 0 ETH | 0.01592692 | ||||
Stake | 13047448 | 1076 days ago | IN | 0 ETH | 0.00643328 | ||||
Stake | 13042280 | 1077 days ago | IN | 0 ETH | 0.00091446 | ||||
Transfer Ownersh... | 13042091 | 1077 days ago | IN | 0 ETH | 0.00132093 | ||||
Set Daily Distri... | 13042085 | 1077 days ago | IN | 0 ETH | 0.00410577 | ||||
Set Daily Distri... | 13042081 | 1077 days ago | IN | 0 ETH | 0.00429239 | ||||
Set Daily Distri... | 13042080 | 1077 days ago | IN | 0 ETH | 0.00429239 | ||||
Set Daily Distri... | 13042063 | 1077 days ago | IN | 0 ETH | 0.00410577 | ||||
Set Daily Distri... | 13042056 | 1077 days ago | IN | 0 ETH | 0.00410577 | ||||
Set Daily Distri... | 13042043 | 1077 days ago | IN | 0 ETH | 0.00391864 | ||||
Stake | 13042004 | 1077 days ago | IN | 0 ETH | 0.00092244 | ||||
Stake | 13041970 | 1077 days ago | IN | 0 ETH | 0.00106052 | ||||
Stake | 13041970 | 1077 days ago | IN | 0 ETH | 0.00095179 | ||||
Lockable Token | 13041941 | 1077 days ago | IN | 0 ETH | 0.00229284 | ||||
Lockable Token | 13041941 | 1077 days ago | IN | 0 ETH | 0.00229284 | ||||
Lockable Token | 13041938 | 1077 days ago | IN | 0 ETH | 0.00229284 | ||||
Lockable Token | 13041938 | 1077 days ago | IN | 0 ETH | 0.00229284 | ||||
Lockable Token | 13041936 | 1077 days ago | IN | 0 ETH | 0.00229284 | ||||
Lockable Token | 13041929 | 1077 days ago | IN | 0 ETH | 0.00229284 | ||||
Stake | 13041880 | 1077 days ago | IN | 0 ETH | 0.01204254 | ||||
Stake | 13037872 | 1078 days ago | IN | 0 ETH | 0.00871683 | ||||
Un Stake | 13036875 | 1078 days ago | IN | 0 ETH | 0.02671597 | ||||
Stake | 13034506 | 1078 days ago | IN | 0 ETH | 0.01146935 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
UnifarmV11
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-02 */ // Sources flattened with hardhat v2.3.0 https://hardhat.org // File contracts/libraries/Context.sol pragma solidity >=0.6.0 <=0.8.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. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File contracts/abstract/Pausable.sol // SPDX-License-Identifier: MIT; pragma solidity >=0.6.0 <=0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File contracts/abstract/Ownable.sol pragma solidity >=0.6.0 <=0.8.0; abstract contract Ownable is Pausable { address public _owner; address public _admin; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor(address ownerAddress) { _owner = msg.sender; _admin = ownerAddress; emit OwnershipTransferred(address(0), _owner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyAdmin() { require(_admin == _msgSender(), "Ownable: caller is not the Admin"); _; } /** * @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 onlyAdmin { emit OwnershipTransferred(_owner, _admin); _owner = _admin; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File contracts/libraries/SafeMath.sol pragma solidity ^0.7.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. */ 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. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; 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. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/interfaces/IERC20.sol pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 contracts/abstract/Admin.sol pragma solidity ^0.7.0; abstract contract Admin is Ownable { struct tokenInfo { bool isExist; uint8 decimal; uint256 userMinStake; uint256 userMaxStake; uint256 totalMaxStake; uint256 lockableDays; bool optionableStatus; } using SafeMath for uint256; address[] public tokens; mapping(address => address[]) public tokensSequenceList; mapping(address => tokenInfo) public tokenDetails; mapping(address => mapping(address => uint256)) public tokenDailyDistribution; mapping(address => mapping(address => bool)) public tokenBlockedStatus; uint256[] public intervalDays = [1, 8, 15, 22, 29, 36]; uint256 public constant DAYS = 1 days; uint256 public constant HOURS = 1 hours; uint256 public stakeDuration; uint256 public refPercentage; uint256 public optionableBenefit; event TokenDetails( address indexed tokenAddress, uint256 userMinStake, uint256 userMaxStake, uint256 totalMaxStake, uint256 updatedTime ); event LockableTokenDetails( address indexed tokenAddress, uint256 lockableDys, bool optionalbleStatus, uint256 updatedTime ); event DailyDistributionDetails( address indexed stakedTokenAddress, address indexed rewardTokenAddress, uint256 rewards, uint256 time ); event SequenceDetails( address indexed stakedTokenAddress, address[] rewardTokenSequence, uint256 time ); event StakeDurationDetails(uint256 updatedDuration, uint256 time); event OptionableBenefitDetails(uint256 updatedBenefit, uint256 time); event ReferrerPercentageDetails(uint256 updatedRefPercentage, uint256 time); event IntervalDaysDetails(uint256[] updatedIntervals, uint256 time); event BlockedDetails( address indexed stakedTokenAddress, address indexed rewardTokenAddress, bool blockedStatus, uint256 time ); event WithdrawDetails( address indexed tokenAddress, uint256 withdrawalAmount, uint256 time ); constructor(address _owner) Ownable(_owner) { stakeDuration = 90 days; refPercentage = 2500000000000000000; optionableBenefit = 2; } function addToken( address tokenAddress, uint256 userMinStake, uint256 userMaxStake, uint256 totalStake, uint8 decimal ) public onlyOwner returns (bool) { if (!(tokenDetails[tokenAddress].isExist)) tokens.push(tokenAddress); tokenDetails[tokenAddress].isExist = true; tokenDetails[tokenAddress].decimal = decimal; tokenDetails[tokenAddress].userMinStake = userMinStake; tokenDetails[tokenAddress].userMaxStake = userMaxStake; tokenDetails[tokenAddress].totalMaxStake = totalStake; emit TokenDetails( tokenAddress, userMinStake, userMaxStake, totalStake, block.timestamp ); return true; } function setDailyDistribution( address[] memory stakedToken, address[] memory rewardToken, uint256[] memory dailyDistribution ) public onlyOwner { require( stakedToken.length == rewardToken.length && rewardToken.length == dailyDistribution.length, "Invalid Input" ); for (uint8 i = 0; i < stakedToken.length; i++) { require( tokenDetails[stakedToken[i]].isExist && tokenDetails[rewardToken[i]].isExist, "Token not exist" ); tokenDailyDistribution[stakedToken[i]][ rewardToken[i] ] = dailyDistribution[i]; emit DailyDistributionDetails( stakedToken[i], rewardToken[i], dailyDistribution[i], block.timestamp ); } } function updateSequence( address stakedToken, address[] memory rewardTokenSequence ) public onlyOwner { tokensSequenceList[stakedToken] = new address[](0); require(tokenDetails[stakedToken].isExist, "Staked Token Not Exist"); for (uint8 i = 0; i < rewardTokenSequence.length; i++) { require(rewardTokenSequence.length <= tokens.length, "Invalid Input"); require( tokenDetails[rewardTokenSequence[i]].isExist, "Reward Token Not Exist" ); tokensSequenceList[stakedToken].push(rewardTokenSequence[i]); } emit SequenceDetails( stakedToken, tokensSequenceList[stakedToken], block.timestamp ); } function updateToken( address tokenAddress, uint256 userMinStake, uint256 userMaxStake, uint256 totalStake ) public onlyOwner { require(tokenDetails[tokenAddress].isExist, "Token Not Exist"); tokenDetails[tokenAddress].userMinStake = userMinStake; tokenDetails[tokenAddress].userMaxStake = userMaxStake; tokenDetails[tokenAddress].totalMaxStake = totalStake; emit TokenDetails( tokenAddress, userMinStake, userMaxStake, totalStake, block.timestamp ); } function lockableToken( address tokenAddress, uint8 lockableStatus, uint256 lockedDays, bool optionableStatus ) public onlyOwner { require( lockableStatus == 1 || lockableStatus == 2 || lockableStatus == 3, "Invalid Lockable Status" ); require(tokenDetails[tokenAddress].isExist == true, "Token Not Exist"); if (lockableStatus == 1) { tokenDetails[tokenAddress].lockableDays = block.timestamp.add(lockedDays); } else if (lockableStatus == 2) tokenDetails[tokenAddress].lockableDays = 0; else if (lockableStatus == 3) tokenDetails[tokenAddress].optionableStatus = optionableStatus; emit LockableTokenDetails( tokenAddress, tokenDetails[tokenAddress].lockableDays, tokenDetails[tokenAddress].optionableStatus, block.timestamp ); } function updateStakeDuration(uint256 durationTime) public onlyOwner { stakeDuration = durationTime; emit StakeDurationDetails(stakeDuration, block.timestamp); } function updateOptionableBenefit(uint256 benefit) public onlyOwner { optionableBenefit = benefit; emit OptionableBenefitDetails(optionableBenefit, block.timestamp); } function updateRefPercentage(uint256 refPer) public onlyOwner { refPercentage = refPer; emit ReferrerPercentageDetails(refPercentage, block.timestamp); } function updateIntervalDays(uint256[] memory _interval) public onlyOwner { intervalDays = new uint256[](0); for (uint8 i = 0; i < _interval.length; i++) { uint256 noD = stakeDuration.div(DAYS); require(noD > _interval[i], "Invalid Interval Day"); intervalDays.push(_interval[i]); } emit IntervalDaysDetails(intervalDays, block.timestamp); } function changeTokenBlockedStatus( address stakedToken, address rewardToken, bool status ) public onlyOwner { require( tokenDetails[stakedToken].isExist && tokenDetails[rewardToken].isExist, "Token not exist" ); tokenBlockedStatus[stakedToken][rewardToken] = status; emit BlockedDetails( stakedToken, rewardToken, tokenBlockedStatus[stakedToken][rewardToken], block.timestamp ); } function safeWithdraw(address tokenAddress, uint256 amount) public onlyOwner { require( IERC20(tokenAddress).balanceOf(address(this)) >= amount, "Insufficient Balance" ); require(IERC20(tokenAddress).transfer(_owner, amount), "Transfer failed"); emit WithdrawDetails(tokenAddress, amount, block.timestamp); } function viewTokensCount() external view returns (uint256) { return tokens.length; } } // File contracts/UnifarmV11.sol pragma solidity ^0.7.6; /** * @title Unifarm Contract * @author OroPocket */ contract UnifarmV11 is Admin { // Wrappers over Solidity's arithmetic operations using SafeMath for uint256; // Stores Stake Details struct stakeInfo { address user; bool[] isActive; address[] referrer; address[] tokenAddress; uint256[] stakeId; uint256[] stakedAmount; uint256[] startTime; } // Mapping mapping(address => stakeInfo) public stakingDetails; mapping(address => mapping(address => uint256)) public userTotalStaking; mapping(address => uint256) public totalStaking; uint256 public poolStartTime; // Events event Stake( address indexed userAddress, uint256 stakeId, address indexed referrerAddress, address indexed tokenAddress, uint256 stakedAmount, uint256 time ); event Claim( address indexed userAddress, address indexed stakedTokenAddress, address indexed tokenAddress, uint256 claimRewards, uint256 time ); event UnStake( address indexed userAddress, address indexed unStakedtokenAddress, uint256 unStakedAmount, uint256 time, uint256 stakeId ); event ReferralEarn( address indexed userAddress, address indexed callerAddress, address indexed rewardTokenAddress, uint256 rewardAmount, uint256 time ); constructor() Admin(msg.sender) { poolStartTime = block.timestamp; } /** * @notice Stake tokens to earn rewards * @param tokenAddress Staking token address * @param amount Amount of tokens to be staked */ function stake( address referrerAddress, address tokenAddress, uint256 amount ) external whenNotPaused { // checks require(msg.sender != referrerAddress, "STAKE: invalid referrer address"); require(tokenDetails[tokenAddress].isExist, "STAKE : Token is not Exist"); require( userTotalStaking[msg.sender][tokenAddress].add(amount) >= tokenDetails[tokenAddress].userMinStake, "STAKE : Min Amount should be within permit" ); require( userTotalStaking[msg.sender][tokenAddress].add(amount) <= tokenDetails[tokenAddress].userMaxStake, "STAKE : Max Amount should be within permit" ); require( totalStaking[tokenAddress].add(amount) <= tokenDetails[tokenAddress].totalMaxStake, "STAKE : Maxlimit exceeds" ); require( poolStartTime.add(stakeDuration) > block.timestamp, "STAKE: Staking Time Completed" ); // Storing stake details stakingDetails[msg.sender].stakeId.push( stakingDetails[msg.sender].stakeId.length ); stakingDetails[msg.sender].isActive.push(true); stakingDetails[msg.sender].user = msg.sender; stakingDetails[msg.sender].referrer.push(referrerAddress); stakingDetails[msg.sender].tokenAddress.push(tokenAddress); stakingDetails[msg.sender].startTime.push(block.timestamp); // Update total staking amount stakingDetails[msg.sender].stakedAmount.push(amount); totalStaking[tokenAddress] = totalStaking[tokenAddress].add(amount); userTotalStaking[msg.sender][tokenAddress] = userTotalStaking[msg.sender][ tokenAddress ] .add(amount); // Transfer tokens from userf to contract require( IERC20(tokenAddress).transferFrom(msg.sender, address(this), amount), "Transfer Failed" ); // Emit state changes emit Stake( msg.sender, (stakingDetails[msg.sender].stakeId.length.sub(1)), referrerAddress, tokenAddress, amount, block.timestamp ); } /** * @notice Claim accumulated rewards * @param stakeId Stake ID of the user * @param stakedAmount Staked amount of the user */ function claimRewards( address userAddress, uint256 stakeId, uint256 stakedAmount, uint256 totalStake ) internal { // Local variables uint256 interval; uint256 endOfProfit; interval = poolStartTime.add(stakeDuration); // Interval calculation if (interval > block.timestamp) endOfProfit = block.timestamp; else endOfProfit = poolStartTime.add(stakeDuration); interval = endOfProfit.sub(stakingDetails[userAddress].startTime[stakeId]); uint256[2] memory stakeData; stakeData[0] = (stakedAmount); stakeData[1] = (totalStake); // Reward calculation if (interval >= HOURS) _rewardCalculation(userAddress, stakeId, stakeData, interval); } function _rewardCalculation( address userAddress, uint256 stakeId, uint256[2] memory stakingData, uint256 interval ) internal { uint256 rewardsEarned; uint256 refEarned; uint256[2] memory noOfDays; noOfDays[1] = interval.div(HOURS); noOfDays[0] = interval.div(DAYS); rewardsEarned = noOfDays[1].mul( getOneDayReward( stakingData[0], stakingDetails[userAddress].tokenAddress[stakeId], stakingDetails[userAddress].tokenAddress[stakeId], stakingData[1] ) ); // Referrer Earning if (stakingDetails[userAddress].referrer[stakeId] != address(0)) { refEarned = (rewardsEarned.mul(refPercentage)).div(100 ether); rewardsEarned = rewardsEarned.sub(refEarned); require( IERC20(stakingDetails[userAddress].tokenAddress[stakeId]).transfer( stakingDetails[userAddress].referrer[stakeId], refEarned ) == true, "Transfer Failed" ); emit ReferralEarn( stakingDetails[userAddress].referrer[stakeId], msg.sender, stakingDetails[userAddress].tokenAddress[stakeId], refEarned, block.timestamp ); } // Rewards Send sendToken( userAddress, stakingDetails[userAddress].tokenAddress[stakeId], stakingDetails[userAddress].tokenAddress[stakeId], rewardsEarned ); uint8 i = 1; while (i < intervalDays.length) { if (noOfDays[0] >= intervalDays[i]) { uint256 reductionHours = (intervalDays[i].sub(1)).mul(24); uint256 balHours = noOfDays[1].sub(reductionHours); address rewardToken = tokensSequenceList[stakingDetails[userAddress].tokenAddress[stakeId]][ i ]; if ( rewardToken != stakingDetails[userAddress].tokenAddress[stakeId] && tokenBlockedStatus[stakingDetails[userAddress].tokenAddress[stakeId]][ rewardToken ] == false ) { rewardsEarned = balHours.mul( getOneDayReward( stakingData[0], stakingDetails[userAddress].tokenAddress[stakeId], rewardToken, stakingData[1] ) ); // Referrer Earning if (stakingDetails[userAddress].referrer[stakeId] != address(0)) { refEarned = (rewardsEarned.mul(refPercentage)).div(100 ether); rewardsEarned = rewardsEarned.sub(refEarned); require( IERC20(rewardToken).transfer( stakingDetails[userAddress].referrer[stakeId], refEarned ) == true, "Transfer Failed" ); emit ReferralEarn( stakingDetails[userAddress].referrer[stakeId], msg.sender, stakingDetails[userAddress].tokenAddress[stakeId], refEarned, block.timestamp ); } // Rewards Send sendToken( userAddress, stakingDetails[userAddress].tokenAddress[stakeId], rewardToken, rewardsEarned ); } i = i + 1; } else { break; } } } /** * @notice Get rewards for one day * @param stakedAmount Stake amount of the user * @param stakedToken Staked token address of the user * @param rewardToken Reward token address * @return reward One dayh reward for the user */ function getOneDayReward( uint256 stakedAmount, address stakedToken, address rewardToken, uint256 totalStake ) public view returns (uint256 reward) { uint256 lockBenefit; if (tokenDetails[stakedToken].optionableStatus) { stakedAmount = stakedAmount.mul(optionableBenefit); lockBenefit = stakedAmount.mul(optionableBenefit.sub(1)); reward = ( stakedAmount.mul(tokenDailyDistribution[stakedToken][rewardToken]) ) .div(totalStake.add(lockBenefit)); } else reward = ( stakedAmount.mul(tokenDailyDistribution[stakedToken][rewardToken]) ) .div(totalStake); } /** * @notice Get rewards for one day * @param stakedToken Stake amount of the user * @param tokenAddress Reward token address * @param amount Amount to be transferred as reward */ function sendToken( address userAddress, address stakedToken, address tokenAddress, uint256 amount ) internal { // Checks if (tokenAddress != address(0)) { require( IERC20(tokenAddress).balanceOf(address(this)) >= amount, "SEND : Insufficient Balance" ); // Transfer of rewards require( IERC20(tokenAddress).transfer(userAddress, amount), "Transfer failed" ); // Emit state changes emit Claim( userAddress, stakedToken, tokenAddress, amount, block.timestamp ); } } /** * @notice Unstake and claim rewards * @param stakeId Stake ID of the user */ function unStake(address userAddress, uint256 stakeId) external whenNotPaused returns (bool) { require( msg.sender == userAddress || msg.sender == _owner, "UNSTAKE: Invalid User Entry" ); address stakedToken = stakingDetails[userAddress].tokenAddress[stakeId]; // lockableDays check require( tokenDetails[stakedToken].lockableDays <= block.timestamp, "UNSTAKE: Token Locked" ); // optional lock check if (tokenDetails[stakedToken].optionableStatus) require( stakingDetails[userAddress].startTime[stakeId].add(stakeDuration) <= block.timestamp, "UNSTAKE: Locked in optional lock" ); // Checks require( stakingDetails[userAddress].stakedAmount[stakeId] > 0 || stakingDetails[userAddress].isActive[stakeId] == true, "UNSTAKE : Already Claimed (or) Insufficient Staked" ); // State updation uint256 stakedAmount = stakingDetails[userAddress].stakedAmount[stakeId]; uint256 totalStaking1 = totalStaking[stakedToken]; totalStaking[stakedToken] = totalStaking[stakedToken].sub(stakedAmount); userTotalStaking[userAddress][stakedToken] = userTotalStaking[userAddress][ stakedToken ] .sub(stakedAmount); stakingDetails[userAddress].stakedAmount[stakeId] = 0; stakingDetails[userAddress].isActive[stakeId] = false; // Balance check require( IERC20(stakingDetails[userAddress].tokenAddress[stakeId]).balanceOf( address(this) ) >= stakedAmount, "UNSTAKE : Insufficient Balance" ); // Transfer staked token back to user IERC20(stakingDetails[userAddress].tokenAddress[stakeId]).transfer( userAddress, stakedAmount ); claimRewards(userAddress, stakeId, stakedAmount, totalStaking1); // Emit state changes emit UnStake( userAddress, stakingDetails[userAddress].tokenAddress[stakeId], stakedAmount, block.timestamp, stakeId ); return true; } function emergencyUnstake( uint256 stakeId, address userAddress, address[] memory rewardtokens, uint256[] memory amount ) external onlyOwner { // Checks require( stakingDetails[userAddress].stakedAmount[stakeId] > 0 && stakingDetails[userAddress].isActive[stakeId] == true, "EMERGENCY : Already Claimed (or) Insufficient Staked" ); // Balance check require( IERC20(stakingDetails[userAddress].tokenAddress[stakeId]).balanceOf( address(this) ) >= stakingDetails[userAddress].stakedAmount[stakeId], "EMERGENCY : Insufficient Balance" ); uint256 stakeAmount = stakingDetails[userAddress].stakedAmount[stakeId]; stakingDetails[userAddress].isActive[stakeId] = false; stakingDetails[userAddress].stakedAmount[stakeId] = 0; totalStaking[ stakingDetails[userAddress].tokenAddress[stakeId] ] = totalStaking[stakingDetails[userAddress].tokenAddress[stakeId]].sub( stakeAmount ); IERC20(stakingDetails[userAddress].tokenAddress[stakeId]).transfer( userAddress, stakeAmount ); for (uint256 i; i < rewardtokens.length; i++) { require( IERC20(rewardtokens[i]).balanceOf(address(this)) >= amount[i], "EMERGENCY : Insufficient Reward Balance" ); uint256 rewardsEarned = amount[i]; if (stakingDetails[userAddress].referrer[stakeId] != address(0)) { uint256 refEarned = (rewardsEarned.mul(refPercentage)).div(100 ether); rewardsEarned = rewardsEarned.sub(refEarned); require( IERC20(rewardtokens[i]).transfer( stakingDetails[userAddress].referrer[stakeId], refEarned ), "EMERGENCY : Transfer Failed" ); emit ReferralEarn( stakingDetails[userAddress].referrer[stakeId], userAddress, rewardtokens[i], refEarned, block.timestamp ); } IERC20(rewardtokens[i]).transfer(userAddress, rewardsEarned); } // Emit state changes emit UnStake( userAddress, stakingDetails[userAddress].tokenAddress[stakeId], stakeAmount, block.timestamp, stakeId ); } /** * @notice View staking details * @param _user User address */ function viewStakingDetails(address _user) public view returns ( address[] memory, address[] memory, bool[] memory, uint256[] memory, uint256[] memory, uint256[] memory ) { return ( stakingDetails[_user].referrer, stakingDetails[_user].tokenAddress, stakingDetails[_user].isActive, stakingDetails[_user].stakeId, stakingDetails[_user].stakedAmount, stakingDetails[_user].startTime ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakedTokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"rewardTokenAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"blockedStatus","type":"bool"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"BlockedDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":true,"internalType":"address","name":"stakedTokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimRewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakedTokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"rewardTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"DailyDistributionDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"updatedIntervals","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"IntervalDaysDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockableDys","type":"uint256"},{"indexed":false,"internalType":"bool","name":"optionalbleStatus","type":"bool"},{"indexed":false,"internalType":"uint256","name":"updatedTime","type":"uint256"}],"name":"LockableTokenDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"updatedBenefit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"OptionableBenefitDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":true,"internalType":"address","name":"callerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"rewardTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"ReferralEarn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"updatedRefPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"ReferrerPercentageDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakedTokenAddress","type":"address"},{"indexed":false,"internalType":"address[]","name":"rewardTokenSequence","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"SequenceDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"},{"indexed":true,"internalType":"address","name":"referrerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"updatedDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"StakeDurationDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"userMinStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userMaxStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMaxStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedTime","type":"uint256"}],"name":"TokenDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":true,"internalType":"address","name":"unStakedtokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"unStakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"UnStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"WithdrawDetails","type":"event"},{"inputs":[],"name":"DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOURS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"userMinStake","type":"uint256"},{"internalType":"uint256","name":"userMaxStake","type":"uint256"},{"internalType":"uint256","name":"totalStake","type":"uint256"},{"internalType":"uint8","name":"decimal","type":"uint8"}],"name":"addToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakedToken","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"changeTokenBlockedStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"address[]","name":"rewardtokens","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"address","name":"stakedToken","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"totalStake","type":"uint256"}],"name":"getOneDayReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"intervalDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"lockableStatus","type":"uint8"},{"internalType":"uint256","name":"lockedDays","type":"uint256"},{"internalType":"bool","name":"optionableStatus","type":"bool"}],"name":"lockableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"optionableBenefit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"stakedToken","type":"address[]"},{"internalType":"address[]","name":"rewardToken","type":"address[]"},{"internalType":"uint256[]","name":"dailyDistribution","type":"uint256[]"}],"name":"setDailyDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrerAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingDetails","outputs":[{"internalType":"address","name":"user","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"tokenBlockedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"tokenDailyDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenDetails","outputs":[{"internalType":"bool","name":"isExist","type":"bool"},{"internalType":"uint8","name":"decimal","type":"uint8"},{"internalType":"uint256","name":"userMinStake","type":"uint256"},{"internalType":"uint256","name":"userMaxStake","type":"uint256"},{"internalType":"uint256","name":"totalMaxStake","type":"uint256"},{"internalType":"uint256","name":"lockableDays","type":"uint256"},{"internalType":"bool","name":"optionableStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensSequenceList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"unStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_interval","type":"uint256[]"}],"name":"updateIntervalDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"benefit","type":"uint256"}],"name":"updateOptionableBenefit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refPer","type":"uint256"}],"name":"updateRefPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakedToken","type":"address"},{"internalType":"address[]","name":"rewardTokenSequence","type":"address[]"}],"name":"updateSequence","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"durationTime","type":"uint256"}],"name":"updateStakeDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"userMinStake","type":"uint256"},{"internalType":"uint256","name":"userMaxStake","type":"uint256"},{"internalType":"uint256","name":"totalStake","type":"uint256"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userTotalStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"viewStakingDetails","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"bool[]","name":"","type":"bool[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewTokensCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
61014060405260016080908152600860a052600f60c052601660e052601d6101005260246101205262000037906007906006620000d3565b503480156200004557600080fd5b50600080546001600160a81b0319163361010081810292909217808455600180546001600160a01b03191683179055604051919384936001600160a01b03920491909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350506276a7006008556722b1c8c1227a00006009556002600a5542600e556200013f565b82805482825590600052602060002090810192821562000116579160200282015b8281111562000116578251829060ff16905591602001919060010190620000f4565b506200012492915062000128565b5090565b5b8082111562000124576000815560010162000129565b6149e4806200014f6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806388125f7911610130578063cdd033c8116100b8578063dd4be6831161007c578063dd4be68314610bdf578063e0a79b1614610c43578063e5c4686914610c69578063f2fde38b14610c71578063fbfcd24114610c9757610227565b8063cdd033c814610961578063d431350614610999578063d43c9535146109d6578063d768779a14610b7b578063d939381414610bb357610227565b8063b104e006116100ff578063b104e006146107c6578063b2bdfa7b146107e3578063bf6eac2f146107eb578063c549e6b914610821578063c922e9371461082957610227565b806388125f79146106b557806396591e31146106d2578063a019cb4b146106ef578063a4f3f0e51461071557610227565b806340f02ab6116101b3578063539cd3b411610182578063539cd3b4146106695780635c975abb146106955780635f96dc111461069d578063715018a6146106a557806385d895ef146106ad57610227565b806340f02ab6146105dc5780634cd36531146105e45780634f64b2be146106205780635058c4601461063d57610227565b8063187739a4116101fa578063187739a41461033b5780631d2002e71461036957806326fa24e91461038657806328523eb61461055957806340a166881461059b57610227565b806301193ad71461022c57806301bc45c9146102cf57806304a624c6146102f35780631320da8b1461030d575b600080fd5b6102cd6004803603602081101561024257600080fd5b810190602081018135600160201b81111561025c57600080fd5b82018360208201111561026e57600080fd5b803590602001918460208302840111600160201b8311171561028f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610c9f945050505050565b005b6102d7610e62565b604080516001600160a01b039092168252519081900360200190f35b6102fb610e71565b60408051918252519081900360200190f35b6102fb6004803603604081101561032357600080fd5b506001600160a01b0381358116916020013516610e77565b6102fb6004803603604081101561035157600080fd5b506001600160a01b0381358116916020013516610e94565b6102cd6004803603602081101561037f57600080fd5b5035610eb1565b6103ac6004803603602081101561039c57600080fd5b50356001600160a01b0316610f50565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b838110156104005781810151838201526020016103e8565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b8381101561043f578181015183820152602001610427565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b8381101561047e578181015183820152602001610466565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b838110156104bd5781810151838201526020016104a5565b50505050905001878103835289818151815260200191508051906020019060200280838360005b838110156104fc5781810151838201526020016104e4565b50505050905001878103825288818151815260200191508051906020019060200280838360005b8381101561053b578181015183820152602001610523565b505050509050019c5050505050505050505050505060405180910390f35b6105876004803603604081101561056f57600080fd5b506001600160a01b03813581169160200135166111c6565b604080519115158252519081900360200190f35b610587600480360360a08110156105b157600080fd5b5080356001600160a01b0316906020810135906040810135906060810135906080013560ff166111e6565b6102fb61134b565b6102fb600480360360808110156105fa57600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135611351565b6102d76004803603602081101561063657600080fd5b5035611437565b6102cd6004803603604081101561065357600080fd5b506001600160a01b038135169060200135611461565b6102d76004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356116a3565b6105876116db565b6102fb6116e4565b6102cd6116ea565b6102fb6117c2565b6102cd600480360360208110156106cb57600080fd5b50356117c8565b6102cd600480360360208110156106e857600080fd5b5035611867565b6102d76004803603602081101561070557600080fd5b50356001600160a01b0316611906565b6102cd6004803603604081101561072b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561075557600080fd5b82018360208201111561076757600080fd5b803590602001918460208302840111600160201b8311171561078857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611921945050505050565b6102fb600480360360208110156107dc57600080fd5b5035611c06565b6102d7611c27565b6102cd6004803603606081101561080157600080fd5b506001600160a01b03813581169160208101359091169060400135611c3b565b6102fb6121ad565b6102cd6004803603608081101561083f57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561086e57600080fd5b82018360208201111561088057600080fd5b803590602001918460208302840111600160201b831117156108a157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108f057600080fd5b82018360208201111561090257600080fd5b803590602001918460208302840111600160201b8311171561092357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121b4945050505050565b6102cd6004803603606081101561097757600080fd5b506001600160a01b038135811691602081013590911690604001351515612ad6565b6102cd600480360360808110156109af57600080fd5b506001600160a01b038135169060ff60208201351690604081013590606001351515612c32565b6102cd600480360360608110156109ec57600080fd5b810190602081018135600160201b811115610a0657600080fd5b820183602082011115610a1857600080fd5b803590602001918460208302840111600160201b83111715610a3957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8857600080fd5b820183602082011115610a9a57600080fd5b803590602001918460208302840111600160201b83111715610abb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b0a57600080fd5b820183602082011115610b1c57600080fd5b803590602001918460208302840111600160201b83111715610b3d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e6b945050505050565b6102cd60048036036080811015610b9157600080fd5b506001600160a01b03813516906020810135906040810135906060013561311b565b61058760048036036040811015610bc957600080fd5b506001600160a01b038135169060200135613250565b610c0560048036036020811015610bf557600080fd5b50356001600160a01b03166138cd565b60408051971515885260ff9096166020880152868601949094526060860192909252608085015260a0840152151560c0830152519081900360e00190f35b6102fb60048036036020811015610c5957600080fd5b50356001600160a01b0316613911565b6102fb613923565b6102cd60048036036020811015610c8757600080fd5b50356001600160a01b0316613929565b6102fb613a31565b610ca7613a37565b60005461010090046001600160a01b03908116911614610cfc576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6040805160008152602081019182905251610d1991600791614793565b5060005b81518160ff161015610de057600854600090610d3c9062015180613a3b565b9050828260ff1681518110610d4d57fe5b60200260200101518111610d9f576040805162461bcd60e51b8152602060048201526014602482015273496e76616c696420496e74657276616c2044617960601b604482015290519081900360640190fd5b6007838360ff1681518110610db057fe5b60209081029190910181015182546001818101855560009485529290932090920191909155919091019050610d1d565b507f29635226d0b00834767b0cf38daca8dc0fe978152b0a8a5b39eb28112635236160074260405180806020018381526020018281038252848181548152602001915080548015610e5057602002820191906000526020600020905b815481526020019060010190808311610e3c575b5050935050505060405180910390a150565b6001546001600160a01b031681565b600a5481565b600c60209081526000928352604080842090915290825290205481565b600560209081526000928352604080842090915290825290205481565b610eb9613a37565b60005461010090046001600160a01b03908116911614610f0e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60098190556040805182815242602082015281517f886f1c6ee47e76ca7e1c7715d9662c5cbc03a9215b76899c702e3d1c38d1ee43929181900390910190a150565b6001600160a01b0381166000908152600b60209081526040918290206002810180548451818502810185019095528085526060948594859485948594859491936003840193600181019360048201936005830193600690930192889190830182828015610fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fc8575b505050505095508480548060200260200160405190810160405280929190818152602001828054801561104257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611024575b50505050509450838054806020026020016040519081016040528092919081815260200182805480156110b457602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116110835790505b505050505093508280548060200260200160405190810160405280929190818152602001828054801561110657602002820191906000526020600020905b8154815260200190600101908083116110f2575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561115857602002820191906000526020600020905b815481526020019060010190808311611144575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156111aa57602002820191906000526020600020905b815481526020019060010190808311611196575b5050505050905095509550955095509550955091939550919395565b600660209081526000928352604080842090915290825290205460ff1681565b60006111f0613a37565b60005461010090046001600160a01b03908116911614611245576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205460ff166112b157600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b0386166000818152600460209081526040918290208054600160ff19909116811761ff00191661010060ff891602178255810189905560028101889055600301869055815188815290810187905280820186905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac916080908290030190a250600195945050505050565b60085481565b6001600160a01b038316600090815260046020526040812060050154819060ff16156113f457600a54611385908790613a84565b95506113a76113a06001600a54613add90919063ffffffff16565b8790613a84565b90506113ed6113b68483613b1f565b6001600160a01b038088166000908152600560209081526040808320938a16835292905220546113e7908990613a84565b90613a3b565b915061142e565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205461142b9084906113e7908990613a84565b91505b50949350505050565b6002818154811061144757600080fd5b6000918252602090912001546001600160a01b0316905081565b611469613a37565b60005461010090046001600160a01b039081169116146114be576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b80826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50511015611582576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b816001600160a01b031663a9059cbb600060019054906101000a90046001600160a01b0316836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156115ee57600080fd5b505af1158015611602573d6000803e3d6000fd5b505050506040513d602081101561161857600080fd5b505161165d576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6040805182815242602082015281516001600160a01b038516927fcb92e2679de255302c9b8d0673cbdf8ef54667e943bf8f049bcaf6a85926ba1a928290030190a25050565b600360205281600052604060002081815481106116bf57600080fd5b6000918252602090912001546001600160a01b03169150829050565b60005460ff1690565b600e5481565b6116f2613a37565b6001546001600160a01b03908116911614611754576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652041646d696e604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60025490565b6117d0613a37565b60005461010090046001600160a01b03908116911614611825576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60088190556040805182815242602082015281517ff676bd50ed08b41fe017c9b4b7606b132ed9afafd39cbe090006c602170638bf929181900390910190a150565b61186f613a37565b60005461010090046001600160a01b039081169116146118c4576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b600a8190556040805182815242602082015281517fd9124f37a22fb221df30d124c79aae3c3be0e56338cc2ed4d68ade2a51319f49929181900390910190a150565b600b602052600090815260409020546001600160a01b031681565b611929613a37565b60005461010090046001600160a01b0390811691161461197e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60408051600080825260208083018085526001600160a01b0387168352600390915292902090516119af92906147de565b506001600160a01b03821660009081526004602052604090205460ff16611a16576040805162461bcd60e51b815260206004820152601660248201527514dd185ad95908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b60005b81518160ff161015611b5f5760025482511115611a6d576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60046000838360ff1681518110611a8057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611af1576040805162461bcd60e51b815260206004820152601660248201527514995dd85c9908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090208251839060ff8416908110611b1a57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501611a19565b506001600160a01b03821660008181526003602090815260409182902082514292810183905283815281549381018490527f533d99224d362fcbe71ce5ff0a8b2d61a9c08b8d1df27aab851edb881f3fb16b939192918190606082019085908015611bf357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611bd5575b5050935050505060405180910390a25050565b60078181548110611c1657600080fd5b600091825260209091200154905081565b60005461010090046001600160a01b031681565b611c436116db565b15611c88576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b0384161415611ce6576040805162461bcd60e51b815260206004820152601f60248201527f5354414b453a20696e76616c6964207265666572726572206164647265737300604482015290519081900360640190fd5b6001600160a01b03821660009081526004602052604090205460ff16611d53576040805162461bcd60e51b815260206004820152601a60248201527f5354414b45203a20546f6b656e206973206e6f74204578697374000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604080832060010154338452600c835281842094845293909152902054611d909083613b1f565b1015611dcd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061491f602a913960400191505060405180910390fd5b6001600160a01b038216600081815260046020908152604080832060020154338452600c835281842094845293909152902054611e0a9083613b1f565b1115611e475760405162461bcd60e51b815260040180806020018281038252602a8152602001806148f5602a913960400191505060405180910390fd5b6001600160a01b038216600090815260046020908152604080832060030154600d90925290912054611e799083613b1f565b1115611ecc576040805162461bcd60e51b815260206004820152601860248201527f5354414b45203a204d61786c696d697420657863656564730000000000000000604482015290519081900360640190fd5b42611ee4600854600e54613b1f90919063ffffffff16565b11611f36576040805162461bcd60e51b815260206004820152601d60248201527f5354414b453a205374616b696e672054696d6520436f6d706c65746564000000604482015290519081900360640190fd5b336000818152600b60209081526040808320600481018054600180820183559186528486208101558082018054808301825590865284862085820401805460ff601f9093166101000a9283021916909117905581546001600160a01b0319908116909617825560028201805480830182559086528486200180546001600160a01b038b8116918916919091179091556003830180548084018255908752858720018054918a16919097168117909655600682018054808301825590865284862042910155600590910180549182018155845282842001859055928252600d905220546120229082613b1f565b6001600160a01b0383166000818152600d6020908152604080832094909455338252600c815283822092825291909152205461205e9082613b1f565b336000818152600c602090815260408083206001600160a01b0388168085529083528184209590955580516323b872dd60e01b8152600481019490945230602485015260448401869052516323b872dd93606480820194918390030190829087803b1580156120cc57600080fd5b505af11580156120e0573d6000803e3d6000fd5b505050506040513d60208110156120f657600080fd5b505161213b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b336000818152600b60205260409020600401546001600160a01b0380851692908616917f8d0a98609f00f26e55cd12ea38ffb8a0dfad170f6f001d682185fdce4ff424449061218b906001613add565b60408051918252602082018790524282820152519081900360600190a4505050565b6201518081565b6121bc613a37565b60005461010090046001600160a01b03908116911614612211576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061223857fe5b906000526020600020015411801561229a57506001600160a01b0383166000908152600b6020526040902060010180548590811061227257fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6122d55760405162461bcd60e51b815260040180806020018281038252603481526020018061497b6034913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090206005018054859081106122fc57fe5b9060005260206000200154600b6000856001600160a01b03166001600160a01b03168152602001908152602001600020600301858154811061233a57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561238957600080fd5b505afa15801561239d573d6000803e3d6000fd5b505050506040513d60208110156123b357600080fd5b50511015612408576040805162461bcd60e51b815260206004820181905260248201527f454d455247454e4359203a20496e73756666696369656e742042616c616e6365604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061242f57fe5b906000526020600020015490506000600b6000866001600160a01b03166001600160a01b03168152602001908152602001600020600101868154811061247157fe5b90600052602060002090602091828204019190066101000a81548160ff0219169083151502179055506000600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002060050186815481106124cf57fe5b906000526020600020018190555061254381600d6000600b6000896001600160a01b03166001600160a01b03168152602001908152602001600020600301898154811061251857fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613add565b6001600160a01b0385166000908152600b602052604081206003018054600d9291908990811061256f57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220949094559187168252600b909252206003018054869081106125b657fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018790529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561261657600080fd5b505af115801561262a573d6000803e3d6000fd5b505050506040513d602081101561264057600080fd5b50600090505b8351811015612a495782818151811061265b57fe5b602002602001015184828151811061266f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156126c357600080fd5b505afa1580156126d7573d6000803e3d6000fd5b505050506040513d60208110156126ed57600080fd5b5051101561272c5760405162461bcd60e51b815260040180806020018281038252602781526020018061488d6027913960400191505060405180910390fd5b600083828151811061273a57fe5b6020026020010151905060006001600160a01b0316600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600201888154811061278257fe5b6000918252602090912001546001600160a01b0316146129aa5760006127c068056bc75e2d631000006113e760095485613a8490919063ffffffff16565b90506127cc8282613add565b91508583815181106127da57fe5b60200260200101516001600160a01b031663a9059cbb600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061282357fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b505050506040513d60208110156128a657600080fd5b50516128f9576040805162461bcd60e51b815260206004820152601b60248201527f454d455247454e4359203a205472616e73666572204661696c65640000000000604482015290519081900360640190fd5b85838151811061290557fe5b60200260200101516001600160a01b0316876001600160a01b0316600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061295357fe5b6000918252602091829020015460408051868152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a4505b8482815181106129b657fe5b60200260200101516001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a1457600080fd5b505af1158015612a28573d6000803e3d6000fd5b505050506040513d6020811015612a3e57600080fd5b505050600101612646565b506001600160a01b0384166000908152600b60205260409020600301805486908110612a7157fe5b60009182526020918290200154604080518481524293810193909352828101889052516001600160a01b0391821692918716917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a35050505050565b612ade613a37565b60005461010090046001600160a01b03908116911614612b33576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205460ff168015612b7357506001600160a01b03821660009081526004602052604090205460ff165b612bb6576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff19168615151790819055825160ff90911615158152429181019190915281517f38dc54047237de43b07dc5d3a0cd9a29485be07da55d5611ddc91102542938ad929181900390910190a3505050565b612c3a613a37565b60005461010090046001600160a01b03908116911614612c8f576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b8260ff1660011480612ca457508260ff166002145b80612cb257508260ff166003145b612d03576040805162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c6f636b61626c6520537461747573000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff161515600114612d67576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b8260ff1660011415612d9f57612d7d4283613b1f565b6001600160a01b03851660009081526004602081905260409091200155612e00565b8260ff1660021415612dcc576001600160a01b038416600090815260046020819052604082200155612e00565b8260ff1660031415612e00576001600160a01b0384166000908152600460205260409020600501805460ff19168215151790555b6001600160a01b03841660008181526004602081815260409283902091820154600590920154835192835260ff16151590820152428183015290517f4030f7d2425e172fe94d03a4cfd07dcdbc4909529bdf15d2732aa1559ff9be7c9181900360600190a250505050565b612e73613a37565b60005461010090046001600160a01b03908116911614612ec8576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b81518351148015612eda575080518251145b612f1b576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60005b83518160ff1610156131155760046000858360ff1681518110612f3d57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff168015612fa6575060046000848360ff1681518110612f7e57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b612fe9576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b818160ff1681518110612ff857fe5b602002602001015160056000868460ff168151811061301357fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858460ff168151811061304c57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828160ff168151811061308757fe5b60200260200101516001600160a01b0316848260ff16815181106130a757fe5b60200260200101516001600160a01b03167f2dc18c352fdd373a4dc83a7156d0dfe95082bd4d820bda50fa65ee3bcf8648f3848460ff16815181106130e857fe5b602002602001015142604051808381526020018281526020019250505060405180910390a3600101612f1e565b50505050565b613123613a37565b60005461010090046001600160a01b03908116911614613178576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff166131d7576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b0384166000818152600460209081526040918290206001810187905560028101869055600301849055815186815290810185905280820184905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac9181900360800190a250505050565b600061325a6116db565b1561329f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b03841614806132c5575060005461010090046001600160a01b031633145b613316576040805162461bcd60e51b815260206004820152601b60248201527f554e5354414b453a20496e76616c6964205573657220456e7472790000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060030180548490811061333d57fe5b60009182526020808320909101546001600160a01b0316808352600491829052604090922001549091504210156133b3576040805162461bcd60e51b8152602060048201526015602482015274155394d51052d14e88151bdad95b88131bd8dad959605a1b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090206005015460ff161561347d574261342a600854600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600601868154811061341157fe5b9060005260206000200154613b1f90919063ffffffff16565b111561347d576040805162461bcd60e51b815260206004820181905260248201527f554e5354414b453a204c6f636b656420696e206f7074696f6e616c206c6f636b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604081206005018054859081106134a457fe5b9060005260206000200154118061350557506001600160a01b0384166000908152600b602052604090206001018054849081106134dd57fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6135405760405162461bcd60e51b81526004018080602001828103825260328152602001806149496032913960400191505060405180910390fd5b6001600160a01b0384166000908152600b6020526040812060050180548590811061356757fe5b60009182526020808320909101546001600160a01b0385168352600d9091526040909120549091506135998183613add565b6001600160a01b038085166000818152600d6020908152604080832095909555928a168152600c8352838120918152915220546135d69083613add565b6001600160a01b038088166000818152600c60209081526040808320948916835293815283822094909455908152600b909252812060050180548790811061361a57fe5b60009182526020808320909101929092556001600160a01b0388168152600b9091526040812060010180548790811061364f57fe5b90600052602060002090602091828204019190066101000a81548160ff02191690831515021790555081600b6000886001600160a01b03166001600160a01b0316815260200190815260200160002060030186815481106136ac57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156136fb57600080fd5b505afa15801561370f573d6000803e3d6000fd5b505050506040513d602081101561372557600080fd5b5051101561377a576040805162461bcd60e51b815260206004820152601e60248201527f554e5354414b45203a20496e73756666696369656e742042616c616e63650000604482015290519081900360640190fd5b6001600160a01b0386166000908152600b602052604090206003018054869081106137a157fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038b81166004830152602482018890529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561380157600080fd5b505af1158015613815573d6000803e3d6000fd5b505050506040513d602081101561382b57600080fd5b5061383a905086868484613b79565b6001600160a01b0386166000908152600b6020526040902060030180548690811061386157fe5b60009182526020918290200154604080518581524293810193909352828101889052516001600160a01b0391821692918916917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a3600193505050505b92915050565b600460208190526000918252604090912080546001820154600283015460038401549484015460059094015460ff8085169661010090950481169593949293911687565b600d6020526000908152604090205481565b60095481565b613931613a37565b60005461010090046001600160a01b03908116911614613986576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0381166139cb5760405162461bcd60e51b81526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610e1081565b3390565b6000613a7d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c2e565b9392505050565b600082613a93575060006138c7565b82820282848281613aa057fe5b0414613a7d5760405162461bcd60e51b81526004018080602001828103825260218152602001806148b46021913960400191505060405180910390fd5b6000613a7d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613cd0565b600082820183811015613a7d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080613b93600854600e54613b1f90919063ffffffff16565b915042821115613ba4575042613bb6565b600854600e54613bb391613b1f565b90505b6001600160a01b0386166000908152600b602052604090206006018054613bfc919087908110613be257fe5b906000526020600020015482613add90919063ffffffff16565b9150613c06614833565b84815260208101849052610e108310613c2557613c2587878386613d2a565b50505050505050565b60008183613cba5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c7f578181015183820152602001613c67565b50505050905090810190601f168015613cac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613cc657fe5b0495945050505050565b60008184841115613d225760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c7f578181015183820152602001613c67565b505050900390565b600080613d35614833565b613d4184610e10613a3b565b6020820152613d538462015180613a3b565b815284516001600160a01b0388166000908152600b602052604090206003018054613df092613de59290918a908110613d8857fe5b60009182526020808320909101546001600160a01b038d81168452600b909252604090922060030180549190921691908b908110613dc257fe5b6000918252602090912001546001600160a01b03168960015b6020020151611351565b602083015190613a84565b6001600160a01b0388166000908152600b602052604081206002018054929550909188908110613e1c57fe5b6000918252602090912001546001600160a01b03161461405357613e5868056bc75e2d631000006113e760095486613a8490919063ffffffff16565b9150613e648383613add565b6001600160a01b0388166000908152600b6020526040902060030180549194509087908110613e8f57fe5b60009182526020808320909101546001600160a01b038a81168452600b90925260409092206002018054919092169163a9059cbb9189908110613ece57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018890525160448083019491928390030190829087803b158015613f2757600080fd5b505af1158015613f3b573d6000803e3d6000fd5b505050506040513d6020811015613f5157600080fd5b50511515600114613f9b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b0387166000908152600b60205260409020600301805487908110613fc257fe5b60009182526020808320909101546001600160a01b038a81168452600b909252604090922060020180549190921691339189908110613ffd57fe5b6000918252602091829020015460408051878152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b0387166000908152600b6020526040902060030180546140d59189918990811061408057fe5b60009182526020808320909101546001600160a01b038c81168452600b909252604090922060030180549190921691908a9081106140ba57fe5b6000918252602090912001546001600160a01b03168661458e565b60015b60075460ff821610156145845760078160ff16815481106140f557fe5b60009182526020909120015482511061457a576000614143601861413d600160078660ff168154811061412457fe5b9060005260206000200154613add90919063ffffffff16565b90613a84565b9050600061415982856001602002015190613add565b9050600060036000600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206003018c8154811061419457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff86169081106141c757fe5b60009182526020808320909101546001600160a01b038e81168452600b909252604090922060030180549190921692508b90811061420157fe5b6000918252602090912001546001600160a01b0382811691161480159061428957506001600160a01b038b166000908152600b60205260408120600301805460069291908d90811061424f57fe5b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093851682529290925290205460ff16155b1561456c5788516001600160a01b038c166000908152600b6020526040902060030180546142e6926142df9290918e9081106142c157fe5b6000918252602090912001546001600160a01b0316848d6001613ddb565b8390613a84565b6001600160a01b038c166000908152600b60205260408120600201805492995090918c90811061431257fe5b6000918252602090912001546001600160a01b0316146145235761434e68056bc75e2d631000006113e76009548a613a8490919063ffffffff16565b955061435a8787613add565b9650806001600160a01b031663a9059cbb600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206002018c8154811061439e57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018c90525160448083019491928390030190829087803b1580156143f757600080fd5b505af115801561440b573d6000803e3d6000fd5b505050506040513d602081101561442157600080fd5b5051151560011461446b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b038b166000908152600b6020526040902060030180548b90811061449257fe5b60009182526020808320909101546001600160a01b038e81168452600b90925260409092206002018054919092169133918d9081106144cd57fe5b60009182526020918290200154604080518b8152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b038b166000908152600b60205260409020600301805461456c918d918d90811061455057fe5b6000918252602090912001546001600160a01b0316838a61458e565b83600101935050505061457f565b614584565b6140d8565b5050505050505050565b6001600160a01b038216156131155780826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156145eb57600080fd5b505afa1580156145ff573d6000803e3d6000fd5b505050506040513d602081101561461557600080fd5b5051101561466a576040805162461bcd60e51b815260206004820152601b60248201527f53454e44203a20496e73756666696369656e742042616c616e63650000000000604482015290519081900360640190fd5b816001600160a01b031663a9059cbb85836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156146c157600080fd5b505af11580156146d5573d6000803e3d6000fd5b505050506040513d60208110156146eb57600080fd5b5051614730576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316856001600160a01b03167fcd5e4f020ddad29434c2200a9edf2f8d7ec30f0d787f03b528ab7279aab0acbe8442604051808381526020018281526020019250505060405180910390a450505050565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce5782518255916020019190600101906147b3565b506147da929150614851565b5090565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906147fe565b60405180604001604052806002906020820280368337509192915050565b5b808211156147da576000815560010161485256fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373454d455247454e4359203a20496e73756666696369656e74205265776172642042616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725354414b45203a204d617820416d6f756e742073686f756c642062652077697468696e207065726d69745354414b45203a204d696e20416d6f756e742073686f756c642062652077697468696e207065726d6974554e5354414b45203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564454d455247454e4359203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564a2646970667358221220fd3b7cd194722bb4f27822cb6370803ae25adbcbfe85d1d5e0a03fb8639dfee464736f6c63430007060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c806388125f7911610130578063cdd033c8116100b8578063dd4be6831161007c578063dd4be68314610bdf578063e0a79b1614610c43578063e5c4686914610c69578063f2fde38b14610c71578063fbfcd24114610c9757610227565b8063cdd033c814610961578063d431350614610999578063d43c9535146109d6578063d768779a14610b7b578063d939381414610bb357610227565b8063b104e006116100ff578063b104e006146107c6578063b2bdfa7b146107e3578063bf6eac2f146107eb578063c549e6b914610821578063c922e9371461082957610227565b806388125f79146106b557806396591e31146106d2578063a019cb4b146106ef578063a4f3f0e51461071557610227565b806340f02ab6116101b3578063539cd3b411610182578063539cd3b4146106695780635c975abb146106955780635f96dc111461069d578063715018a6146106a557806385d895ef146106ad57610227565b806340f02ab6146105dc5780634cd36531146105e45780634f64b2be146106205780635058c4601461063d57610227565b8063187739a4116101fa578063187739a41461033b5780631d2002e71461036957806326fa24e91461038657806328523eb61461055957806340a166881461059b57610227565b806301193ad71461022c57806301bc45c9146102cf57806304a624c6146102f35780631320da8b1461030d575b600080fd5b6102cd6004803603602081101561024257600080fd5b810190602081018135600160201b81111561025c57600080fd5b82018360208201111561026e57600080fd5b803590602001918460208302840111600160201b8311171561028f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610c9f945050505050565b005b6102d7610e62565b604080516001600160a01b039092168252519081900360200190f35b6102fb610e71565b60408051918252519081900360200190f35b6102fb6004803603604081101561032357600080fd5b506001600160a01b0381358116916020013516610e77565b6102fb6004803603604081101561035157600080fd5b506001600160a01b0381358116916020013516610e94565b6102cd6004803603602081101561037f57600080fd5b5035610eb1565b6103ac6004803603602081101561039c57600080fd5b50356001600160a01b0316610f50565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b838110156104005781810151838201526020016103e8565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b8381101561043f578181015183820152602001610427565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b8381101561047e578181015183820152602001610466565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b838110156104bd5781810151838201526020016104a5565b50505050905001878103835289818151815260200191508051906020019060200280838360005b838110156104fc5781810151838201526020016104e4565b50505050905001878103825288818151815260200191508051906020019060200280838360005b8381101561053b578181015183820152602001610523565b505050509050019c5050505050505050505050505060405180910390f35b6105876004803603604081101561056f57600080fd5b506001600160a01b03813581169160200135166111c6565b604080519115158252519081900360200190f35b610587600480360360a08110156105b157600080fd5b5080356001600160a01b0316906020810135906040810135906060810135906080013560ff166111e6565b6102fb61134b565b6102fb600480360360808110156105fa57600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135611351565b6102d76004803603602081101561063657600080fd5b5035611437565b6102cd6004803603604081101561065357600080fd5b506001600160a01b038135169060200135611461565b6102d76004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356116a3565b6105876116db565b6102fb6116e4565b6102cd6116ea565b6102fb6117c2565b6102cd600480360360208110156106cb57600080fd5b50356117c8565b6102cd600480360360208110156106e857600080fd5b5035611867565b6102d76004803603602081101561070557600080fd5b50356001600160a01b0316611906565b6102cd6004803603604081101561072b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561075557600080fd5b82018360208201111561076757600080fd5b803590602001918460208302840111600160201b8311171561078857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611921945050505050565b6102fb600480360360208110156107dc57600080fd5b5035611c06565b6102d7611c27565b6102cd6004803603606081101561080157600080fd5b506001600160a01b03813581169160208101359091169060400135611c3b565b6102fb6121ad565b6102cd6004803603608081101561083f57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561086e57600080fd5b82018360208201111561088057600080fd5b803590602001918460208302840111600160201b831117156108a157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108f057600080fd5b82018360208201111561090257600080fd5b803590602001918460208302840111600160201b8311171561092357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121b4945050505050565b6102cd6004803603606081101561097757600080fd5b506001600160a01b038135811691602081013590911690604001351515612ad6565b6102cd600480360360808110156109af57600080fd5b506001600160a01b038135169060ff60208201351690604081013590606001351515612c32565b6102cd600480360360608110156109ec57600080fd5b810190602081018135600160201b811115610a0657600080fd5b820183602082011115610a1857600080fd5b803590602001918460208302840111600160201b83111715610a3957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8857600080fd5b820183602082011115610a9a57600080fd5b803590602001918460208302840111600160201b83111715610abb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b0a57600080fd5b820183602082011115610b1c57600080fd5b803590602001918460208302840111600160201b83111715610b3d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e6b945050505050565b6102cd60048036036080811015610b9157600080fd5b506001600160a01b03813516906020810135906040810135906060013561311b565b61058760048036036040811015610bc957600080fd5b506001600160a01b038135169060200135613250565b610c0560048036036020811015610bf557600080fd5b50356001600160a01b03166138cd565b60408051971515885260ff9096166020880152868601949094526060860192909252608085015260a0840152151560c0830152519081900360e00190f35b6102fb60048036036020811015610c5957600080fd5b50356001600160a01b0316613911565b6102fb613923565b6102cd60048036036020811015610c8757600080fd5b50356001600160a01b0316613929565b6102fb613a31565b610ca7613a37565b60005461010090046001600160a01b03908116911614610cfc576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6040805160008152602081019182905251610d1991600791614793565b5060005b81518160ff161015610de057600854600090610d3c9062015180613a3b565b9050828260ff1681518110610d4d57fe5b60200260200101518111610d9f576040805162461bcd60e51b8152602060048201526014602482015273496e76616c696420496e74657276616c2044617960601b604482015290519081900360640190fd5b6007838360ff1681518110610db057fe5b60209081029190910181015182546001818101855560009485529290932090920191909155919091019050610d1d565b507f29635226d0b00834767b0cf38daca8dc0fe978152b0a8a5b39eb28112635236160074260405180806020018381526020018281038252848181548152602001915080548015610e5057602002820191906000526020600020905b815481526020019060010190808311610e3c575b5050935050505060405180910390a150565b6001546001600160a01b031681565b600a5481565b600c60209081526000928352604080842090915290825290205481565b600560209081526000928352604080842090915290825290205481565b610eb9613a37565b60005461010090046001600160a01b03908116911614610f0e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60098190556040805182815242602082015281517f886f1c6ee47e76ca7e1c7715d9662c5cbc03a9215b76899c702e3d1c38d1ee43929181900390910190a150565b6001600160a01b0381166000908152600b60209081526040918290206002810180548451818502810185019095528085526060948594859485948594859491936003840193600181019360048201936005830193600690930192889190830182828015610fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fc8575b505050505095508480548060200260200160405190810160405280929190818152602001828054801561104257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611024575b50505050509450838054806020026020016040519081016040528092919081815260200182805480156110b457602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116110835790505b505050505093508280548060200260200160405190810160405280929190818152602001828054801561110657602002820191906000526020600020905b8154815260200190600101908083116110f2575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561115857602002820191906000526020600020905b815481526020019060010190808311611144575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156111aa57602002820191906000526020600020905b815481526020019060010190808311611196575b5050505050905095509550955095509550955091939550919395565b600660209081526000928352604080842090915290825290205460ff1681565b60006111f0613a37565b60005461010090046001600160a01b03908116911614611245576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205460ff166112b157600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b0386166000818152600460209081526040918290208054600160ff19909116811761ff00191661010060ff891602178255810189905560028101889055600301869055815188815290810187905280820186905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac916080908290030190a250600195945050505050565b60085481565b6001600160a01b038316600090815260046020526040812060050154819060ff16156113f457600a54611385908790613a84565b95506113a76113a06001600a54613add90919063ffffffff16565b8790613a84565b90506113ed6113b68483613b1f565b6001600160a01b038088166000908152600560209081526040808320938a16835292905220546113e7908990613a84565b90613a3b565b915061142e565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205461142b9084906113e7908990613a84565b91505b50949350505050565b6002818154811061144757600080fd5b6000918252602090912001546001600160a01b0316905081565b611469613a37565b60005461010090046001600160a01b039081169116146114be576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b80826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50511015611582576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b816001600160a01b031663a9059cbb600060019054906101000a90046001600160a01b0316836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156115ee57600080fd5b505af1158015611602573d6000803e3d6000fd5b505050506040513d602081101561161857600080fd5b505161165d576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6040805182815242602082015281516001600160a01b038516927fcb92e2679de255302c9b8d0673cbdf8ef54667e943bf8f049bcaf6a85926ba1a928290030190a25050565b600360205281600052604060002081815481106116bf57600080fd5b6000918252602090912001546001600160a01b03169150829050565b60005460ff1690565b600e5481565b6116f2613a37565b6001546001600160a01b03908116911614611754576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652041646d696e604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60025490565b6117d0613a37565b60005461010090046001600160a01b03908116911614611825576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60088190556040805182815242602082015281517ff676bd50ed08b41fe017c9b4b7606b132ed9afafd39cbe090006c602170638bf929181900390910190a150565b61186f613a37565b60005461010090046001600160a01b039081169116146118c4576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b600a8190556040805182815242602082015281517fd9124f37a22fb221df30d124c79aae3c3be0e56338cc2ed4d68ade2a51319f49929181900390910190a150565b600b602052600090815260409020546001600160a01b031681565b611929613a37565b60005461010090046001600160a01b0390811691161461197e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60408051600080825260208083018085526001600160a01b0387168352600390915292902090516119af92906147de565b506001600160a01b03821660009081526004602052604090205460ff16611a16576040805162461bcd60e51b815260206004820152601660248201527514dd185ad95908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b60005b81518160ff161015611b5f5760025482511115611a6d576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60046000838360ff1681518110611a8057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611af1576040805162461bcd60e51b815260206004820152601660248201527514995dd85c9908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090208251839060ff8416908110611b1a57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501611a19565b506001600160a01b03821660008181526003602090815260409182902082514292810183905283815281549381018490527f533d99224d362fcbe71ce5ff0a8b2d61a9c08b8d1df27aab851edb881f3fb16b939192918190606082019085908015611bf357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611bd5575b5050935050505060405180910390a25050565b60078181548110611c1657600080fd5b600091825260209091200154905081565b60005461010090046001600160a01b031681565b611c436116db565b15611c88576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b0384161415611ce6576040805162461bcd60e51b815260206004820152601f60248201527f5354414b453a20696e76616c6964207265666572726572206164647265737300604482015290519081900360640190fd5b6001600160a01b03821660009081526004602052604090205460ff16611d53576040805162461bcd60e51b815260206004820152601a60248201527f5354414b45203a20546f6b656e206973206e6f74204578697374000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604080832060010154338452600c835281842094845293909152902054611d909083613b1f565b1015611dcd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061491f602a913960400191505060405180910390fd5b6001600160a01b038216600081815260046020908152604080832060020154338452600c835281842094845293909152902054611e0a9083613b1f565b1115611e475760405162461bcd60e51b815260040180806020018281038252602a8152602001806148f5602a913960400191505060405180910390fd5b6001600160a01b038216600090815260046020908152604080832060030154600d90925290912054611e799083613b1f565b1115611ecc576040805162461bcd60e51b815260206004820152601860248201527f5354414b45203a204d61786c696d697420657863656564730000000000000000604482015290519081900360640190fd5b42611ee4600854600e54613b1f90919063ffffffff16565b11611f36576040805162461bcd60e51b815260206004820152601d60248201527f5354414b453a205374616b696e672054696d6520436f6d706c65746564000000604482015290519081900360640190fd5b336000818152600b60209081526040808320600481018054600180820183559186528486208101558082018054808301825590865284862085820401805460ff601f9093166101000a9283021916909117905581546001600160a01b0319908116909617825560028201805480830182559086528486200180546001600160a01b038b8116918916919091179091556003830180548084018255908752858720018054918a16919097168117909655600682018054808301825590865284862042910155600590910180549182018155845282842001859055928252600d905220546120229082613b1f565b6001600160a01b0383166000818152600d6020908152604080832094909455338252600c815283822092825291909152205461205e9082613b1f565b336000818152600c602090815260408083206001600160a01b0388168085529083528184209590955580516323b872dd60e01b8152600481019490945230602485015260448401869052516323b872dd93606480820194918390030190829087803b1580156120cc57600080fd5b505af11580156120e0573d6000803e3d6000fd5b505050506040513d60208110156120f657600080fd5b505161213b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b336000818152600b60205260409020600401546001600160a01b0380851692908616917f8d0a98609f00f26e55cd12ea38ffb8a0dfad170f6f001d682185fdce4ff424449061218b906001613add565b60408051918252602082018790524282820152519081900360600190a4505050565b6201518081565b6121bc613a37565b60005461010090046001600160a01b03908116911614612211576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061223857fe5b906000526020600020015411801561229a57506001600160a01b0383166000908152600b6020526040902060010180548590811061227257fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6122d55760405162461bcd60e51b815260040180806020018281038252603481526020018061497b6034913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090206005018054859081106122fc57fe5b9060005260206000200154600b6000856001600160a01b03166001600160a01b03168152602001908152602001600020600301858154811061233a57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561238957600080fd5b505afa15801561239d573d6000803e3d6000fd5b505050506040513d60208110156123b357600080fd5b50511015612408576040805162461bcd60e51b815260206004820181905260248201527f454d455247454e4359203a20496e73756666696369656e742042616c616e6365604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061242f57fe5b906000526020600020015490506000600b6000866001600160a01b03166001600160a01b03168152602001908152602001600020600101868154811061247157fe5b90600052602060002090602091828204019190066101000a81548160ff0219169083151502179055506000600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002060050186815481106124cf57fe5b906000526020600020018190555061254381600d6000600b6000896001600160a01b03166001600160a01b03168152602001908152602001600020600301898154811061251857fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613add565b6001600160a01b0385166000908152600b602052604081206003018054600d9291908990811061256f57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220949094559187168252600b909252206003018054869081106125b657fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018790529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561261657600080fd5b505af115801561262a573d6000803e3d6000fd5b505050506040513d602081101561264057600080fd5b50600090505b8351811015612a495782818151811061265b57fe5b602002602001015184828151811061266f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156126c357600080fd5b505afa1580156126d7573d6000803e3d6000fd5b505050506040513d60208110156126ed57600080fd5b5051101561272c5760405162461bcd60e51b815260040180806020018281038252602781526020018061488d6027913960400191505060405180910390fd5b600083828151811061273a57fe5b6020026020010151905060006001600160a01b0316600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600201888154811061278257fe5b6000918252602090912001546001600160a01b0316146129aa5760006127c068056bc75e2d631000006113e760095485613a8490919063ffffffff16565b90506127cc8282613add565b91508583815181106127da57fe5b60200260200101516001600160a01b031663a9059cbb600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061282357fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b505050506040513d60208110156128a657600080fd5b50516128f9576040805162461bcd60e51b815260206004820152601b60248201527f454d455247454e4359203a205472616e73666572204661696c65640000000000604482015290519081900360640190fd5b85838151811061290557fe5b60200260200101516001600160a01b0316876001600160a01b0316600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061295357fe5b6000918252602091829020015460408051868152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a4505b8482815181106129b657fe5b60200260200101516001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a1457600080fd5b505af1158015612a28573d6000803e3d6000fd5b505050506040513d6020811015612a3e57600080fd5b505050600101612646565b506001600160a01b0384166000908152600b60205260409020600301805486908110612a7157fe5b60009182526020918290200154604080518481524293810193909352828101889052516001600160a01b0391821692918716917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a35050505050565b612ade613a37565b60005461010090046001600160a01b03908116911614612b33576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205460ff168015612b7357506001600160a01b03821660009081526004602052604090205460ff165b612bb6576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff19168615151790819055825160ff90911615158152429181019190915281517f38dc54047237de43b07dc5d3a0cd9a29485be07da55d5611ddc91102542938ad929181900390910190a3505050565b612c3a613a37565b60005461010090046001600160a01b03908116911614612c8f576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b8260ff1660011480612ca457508260ff166002145b80612cb257508260ff166003145b612d03576040805162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c6f636b61626c6520537461747573000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff161515600114612d67576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b8260ff1660011415612d9f57612d7d4283613b1f565b6001600160a01b03851660009081526004602081905260409091200155612e00565b8260ff1660021415612dcc576001600160a01b038416600090815260046020819052604082200155612e00565b8260ff1660031415612e00576001600160a01b0384166000908152600460205260409020600501805460ff19168215151790555b6001600160a01b03841660008181526004602081815260409283902091820154600590920154835192835260ff16151590820152428183015290517f4030f7d2425e172fe94d03a4cfd07dcdbc4909529bdf15d2732aa1559ff9be7c9181900360600190a250505050565b612e73613a37565b60005461010090046001600160a01b03908116911614612ec8576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b81518351148015612eda575080518251145b612f1b576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60005b83518160ff1610156131155760046000858360ff1681518110612f3d57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff168015612fa6575060046000848360ff1681518110612f7e57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b612fe9576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b818160ff1681518110612ff857fe5b602002602001015160056000868460ff168151811061301357fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858460ff168151811061304c57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828160ff168151811061308757fe5b60200260200101516001600160a01b0316848260ff16815181106130a757fe5b60200260200101516001600160a01b03167f2dc18c352fdd373a4dc83a7156d0dfe95082bd4d820bda50fa65ee3bcf8648f3848460ff16815181106130e857fe5b602002602001015142604051808381526020018281526020019250505060405180910390a3600101612f1e565b50505050565b613123613a37565b60005461010090046001600160a01b03908116911614613178576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff166131d7576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b0384166000818152600460209081526040918290206001810187905560028101869055600301849055815186815290810185905280820184905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac9181900360800190a250505050565b600061325a6116db565b1561329f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b03841614806132c5575060005461010090046001600160a01b031633145b613316576040805162461bcd60e51b815260206004820152601b60248201527f554e5354414b453a20496e76616c6964205573657220456e7472790000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060030180548490811061333d57fe5b60009182526020808320909101546001600160a01b0316808352600491829052604090922001549091504210156133b3576040805162461bcd60e51b8152602060048201526015602482015274155394d51052d14e88151bdad95b88131bd8dad959605a1b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090206005015460ff161561347d574261342a600854600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600601868154811061341157fe5b9060005260206000200154613b1f90919063ffffffff16565b111561347d576040805162461bcd60e51b815260206004820181905260248201527f554e5354414b453a204c6f636b656420696e206f7074696f6e616c206c6f636b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604081206005018054859081106134a457fe5b9060005260206000200154118061350557506001600160a01b0384166000908152600b602052604090206001018054849081106134dd57fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6135405760405162461bcd60e51b81526004018080602001828103825260328152602001806149496032913960400191505060405180910390fd5b6001600160a01b0384166000908152600b6020526040812060050180548590811061356757fe5b60009182526020808320909101546001600160a01b0385168352600d9091526040909120549091506135998183613add565b6001600160a01b038085166000818152600d6020908152604080832095909555928a168152600c8352838120918152915220546135d69083613add565b6001600160a01b038088166000818152600c60209081526040808320948916835293815283822094909455908152600b909252812060050180548790811061361a57fe5b60009182526020808320909101929092556001600160a01b0388168152600b9091526040812060010180548790811061364f57fe5b90600052602060002090602091828204019190066101000a81548160ff02191690831515021790555081600b6000886001600160a01b03166001600160a01b0316815260200190815260200160002060030186815481106136ac57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156136fb57600080fd5b505afa15801561370f573d6000803e3d6000fd5b505050506040513d602081101561372557600080fd5b5051101561377a576040805162461bcd60e51b815260206004820152601e60248201527f554e5354414b45203a20496e73756666696369656e742042616c616e63650000604482015290519081900360640190fd5b6001600160a01b0386166000908152600b602052604090206003018054869081106137a157fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038b81166004830152602482018890529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561380157600080fd5b505af1158015613815573d6000803e3d6000fd5b505050506040513d602081101561382b57600080fd5b5061383a905086868484613b79565b6001600160a01b0386166000908152600b6020526040902060030180548690811061386157fe5b60009182526020918290200154604080518581524293810193909352828101889052516001600160a01b0391821692918916917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a3600193505050505b92915050565b600460208190526000918252604090912080546001820154600283015460038401549484015460059094015460ff8085169661010090950481169593949293911687565b600d6020526000908152604090205481565b60095481565b613931613a37565b60005461010090046001600160a01b03908116911614613986576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0381166139cb5760405162461bcd60e51b81526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610e1081565b3390565b6000613a7d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c2e565b9392505050565b600082613a93575060006138c7565b82820282848281613aa057fe5b0414613a7d5760405162461bcd60e51b81526004018080602001828103825260218152602001806148b46021913960400191505060405180910390fd5b6000613a7d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613cd0565b600082820183811015613a7d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080613b93600854600e54613b1f90919063ffffffff16565b915042821115613ba4575042613bb6565b600854600e54613bb391613b1f565b90505b6001600160a01b0386166000908152600b602052604090206006018054613bfc919087908110613be257fe5b906000526020600020015482613add90919063ffffffff16565b9150613c06614833565b84815260208101849052610e108310613c2557613c2587878386613d2a565b50505050505050565b60008183613cba5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c7f578181015183820152602001613c67565b50505050905090810190601f168015613cac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613cc657fe5b0495945050505050565b60008184841115613d225760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c7f578181015183820152602001613c67565b505050900390565b600080613d35614833565b613d4184610e10613a3b565b6020820152613d538462015180613a3b565b815284516001600160a01b0388166000908152600b602052604090206003018054613df092613de59290918a908110613d8857fe5b60009182526020808320909101546001600160a01b038d81168452600b909252604090922060030180549190921691908b908110613dc257fe5b6000918252602090912001546001600160a01b03168960015b6020020151611351565b602083015190613a84565b6001600160a01b0388166000908152600b602052604081206002018054929550909188908110613e1c57fe5b6000918252602090912001546001600160a01b03161461405357613e5868056bc75e2d631000006113e760095486613a8490919063ffffffff16565b9150613e648383613add565b6001600160a01b0388166000908152600b6020526040902060030180549194509087908110613e8f57fe5b60009182526020808320909101546001600160a01b038a81168452600b90925260409092206002018054919092169163a9059cbb9189908110613ece57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018890525160448083019491928390030190829087803b158015613f2757600080fd5b505af1158015613f3b573d6000803e3d6000fd5b505050506040513d6020811015613f5157600080fd5b50511515600114613f9b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b0387166000908152600b60205260409020600301805487908110613fc257fe5b60009182526020808320909101546001600160a01b038a81168452600b909252604090922060020180549190921691339189908110613ffd57fe5b6000918252602091829020015460408051878152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b0387166000908152600b6020526040902060030180546140d59189918990811061408057fe5b60009182526020808320909101546001600160a01b038c81168452600b909252604090922060030180549190921691908a9081106140ba57fe5b6000918252602090912001546001600160a01b03168661458e565b60015b60075460ff821610156145845760078160ff16815481106140f557fe5b60009182526020909120015482511061457a576000614143601861413d600160078660ff168154811061412457fe5b9060005260206000200154613add90919063ffffffff16565b90613a84565b9050600061415982856001602002015190613add565b9050600060036000600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206003018c8154811061419457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff86169081106141c757fe5b60009182526020808320909101546001600160a01b038e81168452600b909252604090922060030180549190921692508b90811061420157fe5b6000918252602090912001546001600160a01b0382811691161480159061428957506001600160a01b038b166000908152600b60205260408120600301805460069291908d90811061424f57fe5b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093851682529290925290205460ff16155b1561456c5788516001600160a01b038c166000908152600b6020526040902060030180546142e6926142df9290918e9081106142c157fe5b6000918252602090912001546001600160a01b0316848d6001613ddb565b8390613a84565b6001600160a01b038c166000908152600b60205260408120600201805492995090918c90811061431257fe5b6000918252602090912001546001600160a01b0316146145235761434e68056bc75e2d631000006113e76009548a613a8490919063ffffffff16565b955061435a8787613add565b9650806001600160a01b031663a9059cbb600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206002018c8154811061439e57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018c90525160448083019491928390030190829087803b1580156143f757600080fd5b505af115801561440b573d6000803e3d6000fd5b505050506040513d602081101561442157600080fd5b5051151560011461446b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b038b166000908152600b6020526040902060030180548b90811061449257fe5b60009182526020808320909101546001600160a01b038e81168452600b90925260409092206002018054919092169133918d9081106144cd57fe5b60009182526020918290200154604080518b8152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b038b166000908152600b60205260409020600301805461456c918d918d90811061455057fe5b6000918252602090912001546001600160a01b0316838a61458e565b83600101935050505061457f565b614584565b6140d8565b5050505050505050565b6001600160a01b038216156131155780826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156145eb57600080fd5b505afa1580156145ff573d6000803e3d6000fd5b505050506040513d602081101561461557600080fd5b5051101561466a576040805162461bcd60e51b815260206004820152601b60248201527f53454e44203a20496e73756666696369656e742042616c616e63650000000000604482015290519081900360640190fd5b816001600160a01b031663a9059cbb85836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156146c157600080fd5b505af11580156146d5573d6000803e3d6000fd5b505050506040513d60208110156146eb57600080fd5b5051614730576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316856001600160a01b03167fcd5e4f020ddad29434c2200a9edf2f8d7ec30f0d787f03b528ab7279aab0acbe8442604051808381526020018281526020019250505060405180910390a450505050565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce5782518255916020019190600101906147b3565b506147da929150614851565b5090565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906147fe565b60405180604001604052806002906020820280368337509192915050565b5b808211156147da576000815560010161485256fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373454d455247454e4359203a20496e73756666696369656e74205265776172642042616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725354414b45203a204d617820416d6f756e742073686f756c642062652077697468696e207065726d69745354414b45203a204d696e20416d6f756e742073686f756c642062652077697468696e207065726d6974554e5354414b45203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564454d455247454e4359203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564a2646970667358221220fd3b7cd194722bb4f27822cb6370803ae25adbcbfe85d1d5e0a03fb8639dfee464736f6c63430007060033
Deployed Bytecode Sourcemap
21409:14834:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19960:388;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19960:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19960:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19960:388:0;;-1:-1:-1;19960:388:0;;-1:-1:-1;;;;;19960:388:0:i;:::-;;3483:21;;;:::i;:::-;;;;-1:-1:-1;;;;;3483:21:0;;;;;;;;;;;;;;14392:32;;;:::i;:::-;;;;;;;;;;;;;;;;21829:71;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21829:71:0;;;;;;;;;;:::i;14024:77::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14024:77:0;;;;;;;;;;:::i;19786:168::-;;;;;;;;;;;;;;;;-1:-1:-1;19786:168:0;;:::i;35735:505::-;;;;;;;;;;;;;;;;-1:-1:-1;35735:505:0;-1:-1:-1;;;;;35735:505:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14106:70;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14106:70:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;15787:702;;;;;;;;;;;;;;;;-1:-1:-1;15787:702:0;;-1:-1:-1;;;;;15787:702:0;;;;;;;;;;;;;;;;;;;;;;;:::i;14326:28::-;;;:::i;29607:673::-;;;;;;;;;;;;;;;;-1:-1:-1;29607:673:0;;;-1:-1:-1;;;;;29607:673:0;;;;;;;;;;;;;;;;;;;:::i;13882:23::-;;;;;;;;;;;;;;;;-1:-1:-1;13882:23:0;;:::i;20830:347::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20830:347:0;;;;;;;;:::i;13910:55::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13910:55:0;;;;;;;;:::i;2142:86::-;;;:::i;21957:28::-;;;:::i;4664:132::-;;;:::i;21183:92::-;;;:::i;19418:175::-;;;;;;;;;;;;;;;;-1:-1:-1;19418:175:0;;:::i;19599:181::-;;;;;;;;;;;;;;;;-1:-1:-1;19599:181:0;;:::i;21773:51::-;;;;;;;;;;;;;;;;-1:-1:-1;21773:51:0;-1:-1:-1;;;;;21773:51:0;;:::i;17297:704::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17297:704:0;;;;;;;;;;;;;;;-1:-1:-1;;;17297:704:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17297:704:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17297:704:0;;-1:-1:-1;17297:704:0;;-1:-1:-1;;;;;17297:704:0:i;14181:54::-;;;;;;;;;;;;;;;;-1:-1:-1;14181:54:0;;:::i;3455:21::-;;;:::i;22980:2078::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22980:2078:0;;;;;;;;;;;;;;;;;:::i;14240:37::-;;;:::i;33345:2303::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33345:2303:0;;;;;;;;;;;;;;;;-1:-1:-1;;;33345:2303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33345:2303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33345:2303:0;;;;;;;;-1:-1:-1;33345:2303:0;;-1:-1:-1;;;;;33345:2303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33345:2303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33345:2303:0;;-1:-1:-1;33345:2303:0;;-1:-1:-1;;;;;33345:2303:0:i;20354:470::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20354:470:0;;;;;;;;;;;;;;;;;;;:::i;18558:854::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18558:854:0;;;;;;;;;;;;;;;;;;;;;;:::i;16495:796::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16495:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16495:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16495:796:0;;;;;;;;-1:-1:-1;16495:796:0;;-1:-1:-1;;;;;16495:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16495:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16495:796:0;;;;;;;;-1:-1:-1;16495:796:0;;-1:-1:-1;;;;;16495:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16495:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16495:796:0;;-1:-1:-1;16495:796:0;;-1:-1:-1;;;;;16495:796:0:i;18007:545::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18007:545:0;;;;;;;;;;;;;;;;;;:::i;31236:2103::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31236:2103:0;;;;;;;;:::i;13970:49::-;;;;;;;;;;;;;;;;-1:-1:-1;13970:49:0;-1:-1:-1;;;;;13970:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21905:47;;;;;;;;;;;;;;;;-1:-1:-1;21905:47:0;-1:-1:-1;;;;;21905:47:0;;:::i;14359:28::-;;;:::i;4951:281::-;;;;;;;;;;;;;;;;-1:-1:-1;4951:281:0;-1:-1:-1;;;;;4951:281:0;;:::i;14282:39::-;;;:::i;19960:388::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;20055:16:::1;::::0;;20069:1:::1;20055:16:::0;;::::1;::::0;::::1;::::0;;;;20040:31;::::1;::::0;:12:::1;::::0;:31:::1;:::i;:::-;;20085:7;20080:199;20102:9;:16;20098:1;:20;;;20080:199;;;20148:13;::::0;20134:11:::1;::::0;20148:23:::1;::::0;14271:6:::1;20148:17;:23::i;:::-;20134:37;;20194:9;20204:1;20194:12;;;;;;;;;;;;;;;;20188:3;:18;20180:51;;;::::0;;-1:-1:-1;;;20180:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20180:51:0;;;;;;;;;;;;;::::1;;20240:12;20258:9;20268:1;20258:12;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;20240:31;;::::1;::::0;;::::1;::::0;;-1:-1:-1;20240:31:0;;;;;;;;;::::1;::::0;;;;20120:3;;;::::1;::::0;-1:-1:-1;20080:199:0::1;;;;20292:50;20312:12;20326:15;20292:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19960:388:::0;:::o;3483:21::-;;;-1:-1:-1;;;;;3483:21:0;;:::o;14392:32::-;;;;:::o;21829:71::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14024:77::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;19786:168::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;19855:13:::1;:22:::0;;;19891:57:::1;::::0;;;;;19932:15:::1;19891:57;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;19786:168:::0;:::o;35735:505::-;-1:-1:-1;;;;;35994:21:0;;;;;;:14;:21;;;;;;;;;:30;;;35978:256;;;;;;;;;;;;;;;;;35822:16;;;;;;;;;;;;35994:30;;36033:34;;;;36076:30;;;;36115:29;;;;36153:34;;;;36196:31;;;;;35994:30;;35978:256;;;35994:30;35978:256;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35978:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35978:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35735:505;;;;;;;:::o;14106:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15787:702::-;15962:4;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15981:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;15975:68;;16018:6;:25:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;16018:25:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;16018:25:0::1;-1:-1:-1::0;;;;;16018:25:0;::::1;;::::0;;15975:68:::1;-1:-1:-1::0;;;;;16052:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;;:41;;16089:4:::1;-1:-1:-1::0;;16052:41:0;;::::1;::::0;::::1;-1:-1:-1::0;;16100:44:0::1;16052:41;;16100:44:::0;::::1;;;::::0;;16151:39;::::1;:54:::0;;;16212:39:::1;::::0;::::1;:54:::0;;;16273:40:::1;;:53:::0;;;16340:125;;;;;;;::::1;::::0;;;;;;;;;16443:15:::1;16340:125:::0;;;;;;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;16479:4:0::1;15787:702:::0;;;;;;;:::o;14326:28::-;;;;:::o;29607:673::-;-1:-1:-1;;;;;29817:25:0;;29762:14;29817:25;;;:12;:25;;;;;:42;;;29762:14;;29817:42;;29813:461;;;29902:17;;29885:35;;:12;;:16;:35::i;:::-;29870:50;;29943:42;29960:24;29982:1;29960:17;;:21;;:24;;;;:::i;:::-;29943:12;;:16;:42::i;:::-;29929:56;-1:-1:-1;30003:129:0;30104:27;:10;29929:56;30104:14;:27::i;:::-;-1:-1:-1;;;;;30031:35:0;;;;;;;:22;:35;;;;;;;;:48;;;;;;;;;;30014:66;;:12;;:16;:66::i;:::-;30003:100;;:129::i;:::-;29994:138;;29813:461;;;-1:-1:-1;;;;;30190:35:0;;;;;;;:22;:35;;;;;;;;:48;;;;;;;;;;30162:112;;30263:10;;30173:66;;:12;;:16;:66::i;30162:112::-;30153:121;;29813:461;29607:673;;;;;;;:::o;13882:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13882:23:0;;-1:-1:-1;13882:23:0;:::o;20830:347::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;20979:6:::1;20937:12;-1:-1:-1::0;;;;;20930:30:0::1;;20969:4;20930:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;20930:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20930:45:0;:55:::1;;20914:109;;;::::0;;-1:-1:-1;;;20914:109:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20914:109:0;;;;;;;;;;;;;::::1;;21045:12;-1:-1:-1::0;;;;;21038:29:0::1;;21068:6;;;;;;;;;-1:-1:-1::0;;;;;21068:6:0::1;21076;21038:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;21038:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21038:45:0;21030:73:::1;;;::::0;;-1:-1:-1;;;21030:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21030:73:0;;;;;;;;;;;;;::::1;;21117:54;::::0;;;;;21155:15:::1;21117:54;::::0;::::1;::::0;;;-1:-1:-1;;;;;21117:54:0;::::1;::::0;::::1;::::0;;;;;;::::1;20830:347:::0;;:::o;13910:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13910:55:0;;-1:-1:-1;13910:55:0;;-1:-1:-1;13910:55:0:o;2142:86::-;2189:4;2213:7;;;2142:86;:::o;21957:28::-;;;;:::o;4664:132::-;4244:12;:10;:12::i;:::-;4234:6;;-1:-1:-1;;;;;4234:6:0;;;:22;;;4226:67;;;;;-1:-1:-1;;;4226:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4755:6:::1;::::0;::::1;4747::::0;;4726:36:::1;::::0;-1:-1:-1;;;;;4755:6:0;;::::1;::::0;::::1;4747::::0;;::::1;::::0;;::::1;::::0;4726:36:::1;::::0;::::1;4782:6;::::0;::::1;4773:15:::0;;-1:-1:-1;;;;;4782:6:0;;::::1;;4773:15;-1:-1:-1::0;;;;;;4773:15:0;;::::1;::::0;;;::::1;::::0;;4664:132::o;21183:92::-;21256:6;:13;21183:92;:::o;19418:175::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;19493:13:::1;:28:::0;;;19535:52:::1;::::0;;;;;19571:15:::1;19535:52;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;19418:175:::0;:::o;19599:181::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;19673:17:::1;:27:::0;;;19714:60:::1;::::0;;;;;19758:15:::1;19714:60;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;19599:181:::0;:::o;21773:51::-;;;;;;;;;;;;-1:-1:-1;;;;;21773:51:0;;:::o;17297:704::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;17453:16:::1;::::0;;17467:1:::1;17453:16:::0;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;17419:31:0;::::1;::::0;;:18:::1;:31:::0;;;;;;:50;;::::1;::::0;17453:16;17419:50:::1;:::i;:::-;-1:-1:-1::0;;;;;;17484:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:33;::::1;;17476:68;;;::::0;;-1:-1:-1;;;17476:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17476:68:0;;;;;;;;;;;;;::::1;;17556:7;17551:325;17573:19;:26;17569:1;:30;;;17551:325;;;17653:6;:13:::0;17623:26;;:43:::1;;17615:69;;;::::0;;-1:-1:-1;;;17615:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17615:69:0;;;;;;;;;;;;;::::1;;17711:12;:36;17724:19;17744:1;17724:22;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;17711:36:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;17711:36:0;:44;::::1;;17693:106;;;::::0;;-1:-1:-1;;;17693:106:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17693:106:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;17808:31:0;::::1;;::::0;;;:18:::1;:31;::::0;;;;17845:22;;:19;;:22:::1;::::0;::::1;::::0;;::::1;;;;;;::::0;;::::1;::::0;;;;;;;17808:60;;::::1;::::0;;::::1;::::0;;-1:-1:-1;17808:60:0;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;17808:60:0::1;-1:-1:-1::0;;;;;17808:60:0;;::::1;::::0;;;::::1;::::0;;;17601:3:::1;17551:325;;;-1:-1:-1::0;;;;;;17889:106:0;::::1;17933:31;::::0;;;:18:::1;:31;::::0;;;;;;;;17889:106;;17973:15:::1;17889:106:::0;;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;17933:31;;17973:15;17889:106;;;;;;17933:31;;17889:106;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;17889:106:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;;;;;;;;17297:704:::0;;:::o;14181:54::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14181:54:0;:::o;3455:21::-;;;;;;-1:-1:-1;;;;;3455:21:0;;:::o;22980:2078::-;2468:8;:6;:8::i;:::-;2467:9;2459:38;;;;;-1:-1:-1;;;2459:38:0;;;;;;;;;;;;-1:-1:-1;;;2459:38:0;;;;;;;;;;;;;;;23131:10:::1;-1:-1:-1::0;;;;;23131:29:0;::::1;;;23123:73;;;::::0;;-1:-1:-1;;;23123:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;23211:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;23203:73;;;::::0;;-1:-1:-1;;;23203:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;23366:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:39:::1;;::::0;23316:10:::1;23299:28:::0;;:16:::1;:28:::0;;;;;:42;;;;;;;;;;:54:::1;::::0;23346:6;23299:46:::1;:54::i;:::-;:106;;23283:182;;;;-1:-1:-1::0;;;23283:182:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23555:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:39:::1;;::::0;23505:10:::1;23488:28:::0;;:16:::1;:28:::0;;;;;:42;;;;;;;;;;:54:::1;::::0;23535:6;23488:46:::1;:54::i;:::-;:106;;23472:182;;;;-1:-1:-1::0;;;23472:182:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23728:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:40:::1;;::::0;23677:12:::1;:26:::0;;;;;;;:38:::1;::::0;23708:6;23677:30:::1;:38::i;:::-;:91;;23661:149;;;::::0;;-1:-1:-1;;;23661:149:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23870:15;23835:32;23853:13;;23835;;:17;;:32;;;;:::i;:::-;:50;23819:113;;;::::0;;-1:-1:-1;;;23819:113:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23986:10;23971:26;::::0;;;:14:::1;:26;::::0;;;;;;;:34:::1;::::0;::::1;24019:41:::0;;23971:96:::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;24074:35;;::::1;:46:::0;;;;::::1;::::0;;;;;;;;;;::::1;;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;;;::::0;;::::1;::::0;;24127:44;;-1:-1:-1;;;;;;24127:44:0;;::::1;::::0;;::::1;::::0;;24178:35:::1;::::0;::::1;:57:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;24178:57:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;24242:39:::1;::::0;::::1;:58:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;24307:36:::1;::::0;::::1;:58:::0;;;;::::1;::::0;;;;;;;;24349:15:::1;24307:58:::0;::::1;::::0;24410:39:::1;::::0;;::::1;:52:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;24498:26;;;:12:::1;:26:::0;;;;:38:::1;::::0;24455:6;24498:30:::1;:38::i;:::-;-1:-1:-1::0;;;;;24469:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:67;;;;24605:10:::1;24588:28:::0;;:16:::1;:28:::0;;;;;:56;;;;;;;;;:76:::1;::::0;24657:6;24588:68:::1;:76::i;:::-;24560:10;24543:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;24543:42:0;::::1;::::0;;;;;;;;;:121;;;;24736:68;;-1:-1:-1;;;24736:68:0;;::::1;::::0;::::1;::::0;;;;24790:4:::1;24736:68:::0;;;;;;;;;;;:33:::1;::::0;:68;;;;;;;;;;;;;24543:42;24736:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24736:68:0;24720:117:::1;;;::::0;;-1:-1:-1;;;24720:117:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24720:117:0;;;;;;;;;;;;;::::1;;24892:10;24912:26;::::0;;;:14:::1;:26;::::0;;;;:34:::1;;:41:::0;-1:-1:-1;;;;;24878:174:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;24912:48:::1;::::0;24958:1:::1;24912:45;:48::i;:::-;24878:174;::::0;;;;;::::1;::::0;::::1;::::0;;;25030:15:::1;24878:174:::0;;;;;;;;;;;;::::1;22980:2078:::0;;;:::o;14240:37::-;14271:6;14240:37;:::o;33345:2303::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33547:27:0;::::1;33599:1;33547:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;33588:7;;33547:49;::::1;;;;;;;;;;;;;:53;:119;;;;-1:-1:-1::0;;;;;;33613:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:36:::1;;:45:::0;;33650:7;;33613:45;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;33662:4;33613:53;;;33547:119;33531:205;;;;-1:-1:-1::0;;;33531:205:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;33887:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;33928:7;;33887:49;::::1;;;;;;;;;;;;;33790:14;:27;33805:11;-1:-1:-1::0;;;;;33790:27:0::1;-1:-1:-1::0;;;;;33790:27:0::1;;;;;;;;;;;;:40;;33831:7;33790:49;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;33783:100:::1;::::0;;-1:-1:-1;;;33783:100:0;;33869:4:::1;33783:100;::::0;::::1;::::0;;;-1:-1:-1;;;;;33790:49:0;;::::1;::::0;33783:67:::1;::::0;:100;;;;;;;;;;33790:49;33783:100;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33783:100:0;:153:::1;;33767:219;;;::::0;;-1:-1:-1;;;33767:219:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34017:27:0;::::1;33995:19;34017:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;34058:7;;34017:49;::::1;;;;;;;;;;;;;33995:71;;34121:5;34073:14;:27;34088:11;-1:-1:-1::0;;;;;34073:27:0::1;-1:-1:-1::0;;;;;34073:27:0::1;;;;;;;;;;;;:36;;34110:7;34073:45;;;;;;;;;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34185:1;34133:14;:27;34148:11;-1:-1:-1::0;;;;;34133:27:0::1;-1:-1:-1::0;;;;;34133:27:0::1;;;;;;;;;;;;:40;;34174:7;34133:49;;;;;;;;;;;;;;;:53;;;;34273:94;34349:11;34273:12;:63;34286:14;:27;34301:11;-1:-1:-1::0;;;;;34286:27:0::1;-1:-1:-1::0;;;;;34286:27:0::1;;;;;;;;;;;;:40;;34327:7;34286:49;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;34286:49:0::1;34273:63:::0;;;::::1;::::0;;;;;;;;;;:67:::1;:94::i;:::-;-1:-1:-1::0;;;;;34214:27:0;::::1;34193:77;34214:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;34193:12:::1;::::0;:77;34214:40;34255:7;;34214:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;34214:49:0;;::::1;34193:77:::0;;;;::::1;::::0;;;;;;;;;;:174;;;;34383:27;;::::1;::::0;;:14:::1;:27:::0;;;;:40:::1;;:49:::0;;34424:7;;34383:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;34376:113:::1;::::0;;-1:-1:-1;;;34376:113:0;;-1:-1:-1;;;;;34376:113:0;;::::1;;::::0;::::1;::::0;;;;;;;;;34383:49;;;::::1;::::0;34376:66:::1;::::0;:113;;;;;34383:49;;34376:113;;;;;;;;;34383:49;34376:113;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34503:9:0::1;::::0;-1:-1:-1;34498:952:0::1;34518:12;:19;34514:1;:23;34498:952;;;34623:6;34630:1;34623:9;;;;;;;;;;;;;;34578:12;34591:1;34578:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;34571:33:0::1;;34613:4;34571:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;34571:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34571:48:0;:61:::1;;34553:140;;;;-1:-1:-1::0;;;34553:140:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34702:21;34726:6;34733:1;34726:9;;;;;;;;;;;;;;34702:33;;34807:1;-1:-1:-1::0;;;;;34750:59:0::1;:14;:27;34765:11;-1:-1:-1::0;;;;;34750:27:0::1;-1:-1:-1::0;;;;;34750:27:0::1;;;;;;;;;;;;:36;;34787:7;34750:45;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;34750:45:0::1;:59;34746:626;;34822:17;34842:49;34881:9;34843:32;34861:13;;34843;:17;;:32;;;;:::i;34842:49::-;34822:69:::0;-1:-1:-1;34918:28:0::1;:13:::0;34822:69;34918:17:::1;:28::i;:::-;34902:44;;34986:12;34999:1;34986:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;34979:32:0::1;;35026:14;:27;35041:11;-1:-1:-1::0;;;;;35026:27:0::1;-1:-1:-1::0;;;;;35026:27:0::1;;;;;;;;;;;;:36;;35063:7;35026:45;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;34979:129:::1;::::0;;-1:-1:-1;;;;;;34979:129:0::1;::::0;;;;;;-1:-1:-1;;;;;35026:45:0;;::::1;34979:129;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34979:129:0;34959:202:::1;;;::::0;;-1:-1:-1;;;34959:202:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35286:12;35299:1;35286:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;35179:183:0::1;35262:11;-1:-1:-1::0;;;;;35179:183:0::1;35204:14;:27;35219:11;-1:-1:-1::0;;;;;35204:27:0::1;-1:-1:-1::0;;;;;35204:27:0::1;;;;;;;;;;;;:36;;35241:7;35204:45;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;35179:183:::1;::::0;;;;;35336:15:::1;35179:183:::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;35204:45:0;;::::1;::::0;35179:183:::1;::::0;;;;;;;;;::::1;34746:626;;35389:12;35402:1;35389:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;35382:32:0::1;;35415:11;35428:13;35382:60;;;;;;;;;;;;;-1:-1:-1::0;;;;;35382:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;34539:3:0::1;;34498:952;;;-1:-1:-1::0;;;;;;35526:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;35567:7;;35526:49;::::1;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;35490:152:::1;::::0;;;;;35604:15:::1;35490:152:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;35526:49:0;;::::1;::::0;35490:152;;::::1;::::0;::::1;::::0;;;;;;;;::::1;4092:1;33345:2303:::0;;;;:::o;20354:470::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20503:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:33;::::1;;:70:::0;::::1;;;-1:-1:-1::0;;;;;;20540:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:33;::::1;;20503:70;20487:119;;;::::0;;-1:-1:-1;;;20487:119:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20487:119:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;20613:31:0;;::::1;;::::0;;;:18:::1;:31;::::0;;;;;;;:44;;::::1;::::0;;;;;;;;;;:53;;-1:-1:-1;;20613:53:0::1;::::0;::::1;;;::::0;;;;20680:138;;20613:53:::1;20743:44:::0;;::::1;20680:138;;::::0;;20796:15:::1;20680:138:::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;20354:470:::0;;;:::o;18558:854::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;18733:14:::1;:19;;18751:1;18733:19;:42;;;;18756:14;:19;;18774:1;18756:19;18733:42;:65;;;;18779:14;:19;;18797:1;18779:19;18733:65;18717:122;;;::::0;;-1:-1:-1;;;18717:122:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;18854:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;:42;;:34:::0;:42:::1;18846:70;;;::::0;;-1:-1:-1;;;18846:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18846:70:0;;;;;;;;;;;;;::::1;;18929:14;:19;;18947:1;18929:19;18925:295;;;19001:31;:15;19021:10:::0;19001:19:::1;:31::i;:::-;-1:-1:-1::0;;;;;18959:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:39:::1;:73:::0;18925:295:::1;;;19050:14;:19;;19068:1;19050:19;19046:174;;;-1:-1:-1::0;;;;;19071:26:0;::::1;19113:1;19071:26:::0;;;:12:::1;:26;::::0;;;;;;:39:::1;:43:::0;19046:174:::1;;;19130:14;:19;;19148:1;19130:19;19126:94;;;-1:-1:-1::0;;;;;19158:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:43:::1;;:62:::0;;-1:-1:-1;;19158:62:0::1;::::0;::::1;;;::::0;;19126:94:::1;-1:-1:-1::0;;;;;19234:172:0;::::1;19284:26;::::0;;;:12:::1;:26;::::0;;;;;;;;:39;;::::1;::::0;19332:43:::1;::::0;;::::1;::::0;19234:172;;;;;19332:43:::1;;19234:172;;::::0;;::::1;::::0;19384:15:::1;19234:172:::0;;;;;;::::1;::::0;;;;;;;::::1;18558:854:::0;;;;:::o;16495:796::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;16703:11:::1;:18;16681:11;:18;:40;:99;;;;;16756:17;:24;16734:11;:18;:46;16681:99;16665:146;;;::::0;;-1:-1:-1;;;16665:146:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16665:146:0;;;;;;;;;;;;;::::1;;16825:7;16820:466;16842:11;:18;16838:1;:22;;;16820:466;;;16894:12;:28;16907:11;16919:1;16907:14;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;16894:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;16894:28:0;:36;::::1;;:87:::0;::::1;;;;16945:12;:28;16958:11;16970:1;16958:14;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;16945:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;16945:28:0;:36;::::1;;16894:87;16876:142;;;::::0;;-1:-1:-1;;;16876:142:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16876:142:0;;;;;;;;;;;;;::::1;;17102:17;17120:1;17102:20;;;;;;;;;;;;;;;;17027:22;:38;17050:11;17062:1;17050:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17027:38:0::1;-1:-1:-1::0;;;;;17027:38:0::1;;;;;;;;;;;;:72;17076:11;17088:1;17076:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17027:72:0::1;-1:-1:-1::0;;;;;17027:72:0::1;;;;;;;;;;;;:95;;;;17198:11;17210:1;17198:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17138:140:0::1;17173:11;17185:1;17173:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17138:140:0::1;;17223:17;17241:1;17223:20;;;;;;;;;;;;;;;;17254:15;17138:140;;;;;;;;;;;;;;;;;;;;;;;;16862:3;;16820:466;;;;16495:796:::0;;;:::o;18007:545::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18171:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;18163:62;;;::::0;;-1:-1:-1;;;18163:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18163:62:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;18232:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;;:39:::1;::::0;::::1;:54:::0;;;18293:39:::1;::::0;::::1;:54:::0;;;18354:40:::1;;:53:::0;;;18421:125;;;;;;;::::1;::::0;;;;;;;;;18524:15:::1;18421:125:::0;;;;;;::::1;::::0;;;;;;;::::1;18007:545:::0;;;;:::o;31236:2103::-;31338:4;2468:8;:6;:8::i;:::-;2467:9;2459:38;;;;;-1:-1:-1;;;2459:38:0;;;;;;;;;;;;-1:-1:-1;;;2459:38:0;;;;;;;;;;;;;;;31370:10:::1;-1:-1:-1::0;;;;;31370:25:0;::::1;;::::0;:49:::1;;-1:-1:-1::0;31413:6:0::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;31413:6:0::1;31399:10;:20;31370:49;31354:110;;;::::0;;-1:-1:-1;;;31354:110:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;31495:27:0;::::1;31473:19;31495:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;31536:7;;31495:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;31495:49:0::1;31596:25:::0;;;:12:::1;:25:::0;;;;;;;;:38:::1;::::0;31495:49;;-1:-1:-1;31638:15:0::1;-1:-1:-1::0;31596:57:0::1;31580:112;;;::::0;;-1:-1:-1;;;31580:112:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31580:112:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;31733:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:42:::1;;::::0;::::1;;31729:222;;;31882:15;31802:65;31853:13;;31802:14;:27;31817:11;-1:-1:-1::0;;;;;31802:27:0::1;-1:-1:-1::0;;;;;31802:27:0::1;;;;;;;;;;;;:37;;31840:7;31802:46;;;;;;;;;;;;;;;;:50;;:65;;;;:::i;:::-;:95;;31784:167;;;::::0;;-1:-1:-1;;;31784:167:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;31991:27:0;::::1;32043:1;31991:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;32032:7;;31991:49;::::1;;;;;;;;;;;;;:53;:119;;;-1:-1:-1::0;;;;;;32057:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:36:::1;;:45:::0;;32094:7;;32057:45;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;32106:4;32057:53;;;31991:119;31975:203;;;;-1:-1:-1::0;;;31975:203:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;32233:27:0;::::1;32210:20;32233:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;32274:7;;32233:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;32313:25:0;::::1;::::0;;:12:::1;:25:::0;;;;;;;;32233:49;;-1:-1:-1;32373:43:0::1;32313:25:::0;32233:49;32373:29:::1;:43::i;:::-;-1:-1:-1::0;;;;;32345:25:0;;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;:71;;;;32468:29;;::::1;::::0;;:16:::1;:29:::0;;;;;:56;;;;;;;:82:::1;::::0;32537:12;32468:68:::1;:82::i;:::-;-1:-1:-1::0;;;;;32423:29:0;;::::1;;::::0;;;:16:::1;:29;::::0;;;;;;;:42;;::::1;::::0;;;;;;;;:127;;;;32557:27;;;:14:::1;:27:::0;;;;;:40:::1;;:49:::0;;32598:7;;32557:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;:53:::0;;;;-1:-1:-1;;;;;32617:27:0;::::1;::::0;;:14:::1;:27:::0;;;;;;:36:::1;;:45:::0;;32654:7;;32617:45;::::1;;;;;;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32821:12;32724:14;:27;32739:11;-1:-1:-1::0;;;;;32724:27:0::1;-1:-1:-1::0;;;;;32724:27:0::1;;;;;;;;;;;;:40;;32765:7;32724:49;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;32717:100:::1;::::0;;-1:-1:-1;;;32717:100:0;;32803:4:::1;32717:100;::::0;::::1;::::0;;;-1:-1:-1;;;;;32724:49:0;;::::1;::::0;32717:67:::1;::::0;:100;;;;;;;;;;32724:49;32717:100;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32717:100:0;:116:::1;;32701:180;;;::::0;;-1:-1:-1;;;32701:180:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;32940:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;32981:7;;32940:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;32933:114:::1;::::0;;-1:-1:-1;;;32933:114:0;;-1:-1:-1;;;;;32933:114:0;;::::1;;::::0;::::1;::::0;;;;;;;;;32940:49;;;::::1;::::0;32933:66:::1;::::0;:114;;;;;32940:49;;32933:114;;;;;;;;;32940:49;32933:114;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33056:63:0::1;::::0;-1:-1:-1;33069:11:0;33082:7;33091:12;33105:13;33056:12:::1;:63::i;:::-;-1:-1:-1::0;;;;;33196:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;33237:7;;33196:49;::::1;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;33160:153:::1;::::0;;;;;33275:15:::1;33160:153:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;33196:49:0;;::::1;::::0;33160:153;;::::1;::::0;::::1;::::0;;;;;;;;::::1;33329:4;33322:11;;;;;2508:1;31236:2103:::0;;;;:::o;13970:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21905:47::-;;;;;;;;;;;;;:::o;14359:28::-;;;;:::o;4951:281::-;4032:12;:10;:12::i;:::-;4022:6;;;;;-1:-1:-1;;;;;4022:6:0;;;:22;;;4014:67;;;;;-1:-1:-1;;;4014:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4014:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;5054:22:0;::::1;5032:110;;;;-1:-1:-1::0;;;5032:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5179:6;::::0;;5158:38:::1;::::0;-1:-1:-1;;;;;5158:38:0;;::::1;::::0;5179:6:::1;::::0;;::::1;;::::0;5158:38:::1;::::0;::::1;5207:6;:17:::0;;-1:-1:-1;;;;;5207:17:0;;::::1;;;-1:-1:-1::0;;;;;;5207:17:0;;::::1;::::0;;;::::1;::::0;;4951:281::o;14282:39::-;14314:7;14282:39;:::o;686:106::-;774:10;686:106;:::o;8491:132::-;8549:7;8576:39;8580:1;8583;8576:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8569:46;8491:132;-1:-1:-1;;;8491:132:0:o;7544:471::-;7602:7;7847:6;7843:47;;-1:-1:-1;7877:1:0;7870:8;;7843:47;7914:5;;;7918:1;7914;:5;:1;7938:5;;;;;:10;7930:56;;;;-1:-1:-1;;;7930:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6620:136;6678:7;6705:43;6709:1;6712;6705:43;;;;;;;;;;;;;;;;;:3;:43::i;6156:181::-;6214:7;6246:5;;;6270:6;;;;6262:46;;;;;-1:-1:-1;;;6262:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25214:738;25381:16;25404:19;25443:32;25461:13;;25443;;:17;;:32;;;;:::i;:::-;25432:43;;25528:15;25517:8;:26;25513:119;;;-1:-1:-1;25559:15:0;25513:119;;;25618:13;;25600;;:32;;:17;:32::i;:::-;25586:46;;25513:119;-1:-1:-1;;;;;25668:27:0;;;;;;:14;:27;;;;;:37;;:46;;25652:63;;25668:37;25706:7;;25668:46;;;;;;;;;;;;;;25652:11;:15;;:63;;;;:::i;:::-;25641:74;;25722:27;;:::i;:::-;25756:29;;;:12;25792;;:27;;;14314:7;25859:17;;25855:91;;25885:61;25904:11;25917:7;25926:9;25937:8;25885:18;:61::i;:::-;25214:738;;;;;;;:::o;9119:225::-;9239:7;9274:12;9267:5;9259:28;;;;-1:-1:-1;;;9259:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9298:9;9314:1;9310;:5;;;;;;;9119:225;-1:-1:-1;;;;;9119:225:0:o;7059:226::-;7179:7;7215:12;7207:6;;;;7199:29;;;;-1:-1:-1;;;7199:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7251:5:0;;;7059:226::o;25958:3384::-;26114:21;26142:17;26166:26;;:::i;:::-;26215:19;:8;14314:7;26215:12;:19::i;:::-;26201:11;;;:33;26255:18;:8;14271:6;26255:12;:18::i;:::-;26241:32;;26348:14;;-1:-1:-1;;;;;26373:27:0;;26250:1;26373:27;;;:14;26241:11;26373:27;;;;:40;;:49;;26298:225;;26322:194;;26348:14;;26414:7;;26373:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26433:27:0;;;;;:14;:27;;;;;;;:40;;:49;;26373;;;;;26433:40;26474:7;;26433:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26433:49:0;26493:11;26433:49;26493:14;;;;;26322:15;:194::i;:::-;26298:11;;;;;:15;:225::i;:::-;-1:-1:-1;;;;;26561:27:0;;26618:1;26561:27;;;:14;:27;;;;;:36;;:45;;26282:241;;-1:-1:-1;26618:1:0;;26598:7;;26561:45;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26561:45:0;:59;26557:647;;26643:49;26682:9;26644:32;26662:13;;26644;:17;;:32;;;;:::i;26643:49::-;26631:61;-1:-1:-1;26717:28:0;:13;26631:61;26717:17;:28::i;:::-;-1:-1:-1;;;;;26781:27:0;;;;;;:14;:27;;;;;:40;;:49;;26701:44;;-1:-1:-1;26781:40:0;26822:7;;26781:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26853:27:0;;;;;:14;:27;;;;;;;:36;;:45;;26781:49;;;;;26774:66;;26890:7;;26853:45;;;;;;;;;;;;;;;;;;26774:157;;;-1:-1:-1;;;;;;26774:157:0;;;;;;;-1:-1:-1;;;;;26853:45:0;;;26774:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26774:157:0;:165;;26935:4;26774:165;26756:220;;;;;-1:-1:-1;;;26756:220:0;;;;;;;;;;;;-1:-1:-1;;;26756:220:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27092:27:0;;;;;;:14;:27;;;;;:40;;:49;;27133:7;;27092:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27015:27:0;;;;;:14;:27;;;;;;;:36;;:45;;27092:49;;;;;27071:10;;27052:7;;27015:45;;;;;;;;;;;;;;;;;26992:204;;;;;;27172:15;26992:204;;;;;;;;;-1:-1:-1;;;;;27015:45:0;;;;26992:204;;;;;;;;;;;26557:647;-1:-1:-1;;;;;27272:27:0;;;;;;:14;:27;;;;;:40;;:49;;27234:174;;27252:11;;27313:7;;27272:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27330:27:0;;;;;:14;:27;;;;;;;:40;;:49;;27272;;;;;27330:40;27371:7;;27330:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27330:49:0;27388:13;27234:9;:174::i;:::-;27427:1;27437:1900;27448:12;:19;27444:23;;;;27437:1900;;;27497:12;27510:1;27497:15;;;;;;;;;;;;;;;;;;;;27482:11;;:30;27478:1852;;27525:22;27550:32;27579:2;27551:22;27571:1;27551:12;27564:1;27551:15;;;;;;;;;;;;;;;;;;:19;;:22;;;;:::i;:::-;27550:28;;:32::i;:::-;27525:57;-1:-1:-1;27593:16:0;27612:31;27525:57;27612:8;27621:1;27612:11;;;;;:15;:31::i;:::-;27593:50;;27656:19;27689:18;:69;27708:14;:27;27723:11;-1:-1:-1;;;;;27708:27:0;-1:-1:-1;;;;;27708:27:0;;;;;;;;;;;;:40;;27749:7;27708:49;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27708:49:0;27689:69;;;;;;;;;;;;:98;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27831:27:0;;;;;:14;:27;;;;;;;:40;;:49;;27689:98;;;;;-1:-1:-1;27872:7:0;;27831:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27816:64:0;;;27831:49;;27816:64;;;;:207;;-1:-1:-1;;;;;;27914:27:0;;27895:69;27914:27;;;:14;:27;;;;;:40;;:49;;27895:18;;:69;27914:40;27955:7;;27914:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27914:49:0;;;27895:69;;;;;;;;;;;;;;;:108;;;;;;;;;;;;;;:128;27816:207;27800:1469;;;28123:14;;-1:-1:-1;;;;;28154:27:0;;28135:1;28154:27;;;:14;28123;28154:27;;;;:40;;:49;;28064:226;;28091:186;;28123:14;;28195:7;;28154:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28154:49:0;28220:11;28248;28154:49;28248:14;;28091:186;28064:8;;:12;:226::i;:::-;-1:-1:-1;;;;;28342:27:0;;28399:1;28342:27;;;:14;:27;;;;;:36;;:45;;28048:242;;-1:-1:-1;28399:1:0;;28379:7;;28342:45;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28342:45:0;:59;28338:711;;28430:49;28469:9;28431:32;28449:13;;28431;:17;;:32;;;;:::i;28430:49::-;28418:61;-1:-1:-1;28510:28:0;:13;28418:61;28510:17;:28::i;:::-;28494:44;;28586:11;-1:-1:-1;;;;;28579:28:0;;28626:14;:27;28641:11;-1:-1:-1;;;;;28626:27:0;-1:-1:-1;;;;;28626:27:0;;;;;;;;;;;;:36;;28663:7;28626:45;;;;;;;;;;;;;;;;;;;;28579:137;;;-1:-1:-1;;;;;;28579:137:0;;;;;;;-1:-1:-1;;;;;28626:45:0;;;28579:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28579:137:0;:145;;28720:4;28579:145;28555:218;;;;;-1:-1:-1;;;28555:218:0;;;;;;;;;;;;-1:-1:-1;;;28555:218:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28913:27:0;;;;;;:14;:27;;;;;:40;;:49;;28954:7;;28913:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28824:27:0;;;;;:14;:27;;;;;;;:36;;:45;;28913:49;;;;;28886:10;;28861:7;;28824:45;;;;;;;;;;;;;;;;;28795:240;;;;;;29005:15;28795:240;;;;;;;;;-1:-1:-1;;;;;28824:45:0;;;;28795:240;;;;;;;;;;;28338:711;-1:-1:-1;;;;;29141:27:0;;;;;;:14;:27;;;;;:40;;:49;;29091:166;;29115:11;;29182:7;;29141:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29141:49:0;29205:11;29231:13;29091:9;:166::i;:::-;29283:1;29287;29283:5;29279:9;;27478:1852;;;;;;29315:5;;27478:1852;27437:1900;;;25958:3384;;;;;;;;:::o;30490:644::-;-1:-1:-1;;;;;30649:26:0;;;30645:484;;30753:6;30711:12;-1:-1:-1;;;;;30704:30:0;;30743:4;30704:45;;;;;;;;;;;;;-1:-1:-1;;;;;30704:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30704:45:0;:55;;30686:122;;;;;-1:-1:-1;;;30686:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30872:12;-1:-1:-1;;;;;30865:29:0;;30895:11;30908:6;30865:50;;;;;;;;;;;;;-1:-1:-1;;;;;30865:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30865:50:0;30847:105;;;;;-1:-1:-1;;;30847:105:0;;;;;;;;;;;;-1:-1:-1;;;30847:105:0;;;;;;;;;;;;;;;31057:12;-1:-1:-1;;;;;30997:124:0;31035:11;-1:-1:-1;;;;;30997:124:0;31013:11;-1:-1:-1;;;;;30997:124:0;;31080:6;31097:15;30997:124;;;;;;;;;;;;;;;;;;;;;;;;30490:644;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://fd3b7cd194722bb4f27822cb6370803ae25adbcbfe85d1d5e0a03fb8639dfee4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.