Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 564 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Daily Distri... | 12992288 | 1124 days ago | IN | 0 ETH | 0.00373355 | ||||
Set Daily Distri... | 12992285 | 1124 days ago | IN | 0 ETH | 0.00395673 | ||||
Set Daily Distri... | 12992276 | 1124 days ago | IN | 0 ETH | 0.00409735 | ||||
Set Daily Distri... | 12992275 | 1124 days ago | IN | 0 ETH | 0.00409804 | ||||
Renounce Ownersh... | 12992239 | 1124 days ago | IN | 0 ETH | 0.00146761 | ||||
Transfer Ownersh... | 12970432 | 1127 days ago | IN | 0 ETH | 0.00117735 | ||||
Un Stake | 12930278 | 1134 days ago | IN | 0 ETH | 0.00662385 | ||||
Un Stake | 12929784 | 1134 days ago | IN | 0 ETH | 0.00758967 | ||||
Un Stake | 12928234 | 1134 days ago | IN | 0 ETH | 0.00547838 | ||||
Un Stake | 12927588 | 1134 days ago | IN | 0 ETH | 0.00965597 | ||||
Un Stake | 12926920 | 1134 days ago | IN | 0 ETH | 0.00574048 | ||||
Un Stake | 12925437 | 1134 days ago | IN | 0 ETH | 0.00337092 | ||||
Un Stake | 12925255 | 1134 days ago | IN | 0 ETH | 0.00507888 | ||||
Un Stake | 12924954 | 1134 days ago | IN | 0 ETH | 0.00655761 | ||||
Un Stake | 12924716 | 1135 days ago | IN | 0 ETH | 0.00684464 | ||||
Un Stake | 12922387 | 1135 days ago | IN | 0 ETH | 0.006949 | ||||
Un Stake | 12922371 | 1135 days ago | IN | 0 ETH | 0.0095323 | ||||
Un Stake | 12922134 | 1135 days ago | IN | 0 ETH | 0.0064025 | ||||
Un Stake | 12921990 | 1135 days ago | IN | 0 ETH | 0.0083293 | ||||
Un Stake | 12921864 | 1135 days ago | IN | 0 ETH | 0.00817037 | ||||
Un Stake | 12921204 | 1135 days ago | IN | 0 ETH | 0.00706816 | ||||
Un Stake | 12921070 | 1135 days ago | IN | 0 ETH | 0.0064038 | ||||
Un Stake | 12920563 | 1135 days ago | IN | 0 ETH | 0.00551987 | ||||
Un Stake | 12920505 | 1135 days ago | IN | 0 ETH | 0.00443851 | ||||
Un Stake | 12917538 | 1136 days ago | IN | 0 ETH | 0.00442201 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
UnifarmV6
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-27 */ // Sources flattened with hardhat v2.1.2 https://hardhat.org // File contracts/libraries/Context.sol // SPDX-License-Identifier: MIT; /** _____ ______ ______________________________________ ___ ___ _________ __ / / /__ | / /___ _/__ ____/__ |__ __ \__ |/ / __ | / /_ ___/ _ / / /__ |/ / __ / __ /_ __ /| |_ /_/ /_ /|_/ / __ | / /_ __ \ / /_/ / _ /| / __/ / _ __/ _ ___ | _, _/_ / / / __ |/ / / /_/ / \____/ /_/ |_/ /___/ /_/ /_/ |_/_/ |_| /_/ /_/ _____/ \____/ */ 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 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]; 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 = 5 ether; 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/UnifarmV6.sol pragma solidity ^0.7.0; /** * @title Unifarm Contract * @author OroPocket */ contract UnifarmV6 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
61010060405260016080908152600860a052600f60c052601660e0526200002b906007906004620000c7565b503480156200003957600080fd5b50600080546001600160a81b0319163361010081810292909217808455600180546001600160a01b03191683179055604051919384936001600160a01b03920491909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350506276a700600855674563918244f400006009556002600a5542600e5562000133565b8280548282559060005260206000209081019282156200010a579160200282015b828111156200010a578251829060ff16905591602001919060010190620000e8565b50620001189291506200011c565b5090565b5b808211156200011857600081556001016200011d565b6149e480620001436000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806388125f7911610130578063cdd033c8116100b8578063dd4be6831161007c578063dd4be68314610bdf578063e0a79b1614610c43578063e5c4686914610c69578063f2fde38b14610c71578063fbfcd24114610c9757610227565b8063cdd033c814610961578063d431350614610999578063d43c9535146109d6578063d768779a14610b7b578063d939381414610bb357610227565b8063b104e006116100ff578063b104e006146107c6578063b2bdfa7b146107e3578063bf6eac2f146107eb578063c549e6b914610821578063c922e9371461082957610227565b806388125f79146106b557806396591e31146106d2578063a019cb4b146106ef578063a4f3f0e51461071557610227565b806340f02ab6116101b3578063539cd3b411610182578063539cd3b4146106695780635c975abb146106955780635f96dc111461069d578063715018a6146106a557806385d895ef146106ad57610227565b806340f02ab6146105dc5780634cd36531146105e45780634f64b2be146106205780635058c4601461063d57610227565b8063187739a4116101fa578063187739a41461033b5780631d2002e71461036957806326fa24e91461038657806328523eb61461055957806340a166881461059b57610227565b806301193ad71461022c57806301bc45c9146102cf57806304a624c6146102f35780631320da8b1461030d575b600080fd5b6102cd6004803603602081101561024257600080fd5b810190602081018135600160201b81111561025c57600080fd5b82018360208201111561026e57600080fd5b803590602001918460208302840111600160201b8311171561028f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610c9f945050505050565b005b6102d7610e62565b604080516001600160a01b039092168252519081900360200190f35b6102fb610e71565b60408051918252519081900360200190f35b6102fb6004803603604081101561032357600080fd5b506001600160a01b0381358116916020013516610e77565b6102fb6004803603604081101561035157600080fd5b506001600160a01b0381358116916020013516610e94565b6102cd6004803603602081101561037f57600080fd5b5035610eb1565b6103ac6004803603602081101561039c57600080fd5b50356001600160a01b0316610f50565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b838110156104005781810151838201526020016103e8565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b8381101561043f578181015183820152602001610427565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b8381101561047e578181015183820152602001610466565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b838110156104bd5781810151838201526020016104a5565b50505050905001878103835289818151815260200191508051906020019060200280838360005b838110156104fc5781810151838201526020016104e4565b50505050905001878103825288818151815260200191508051906020019060200280838360005b8381101561053b578181015183820152602001610523565b505050509050019c5050505050505050505050505060405180910390f35b6105876004803603604081101561056f57600080fd5b506001600160a01b03813581169160200135166111c6565b604080519115158252519081900360200190f35b610587600480360360a08110156105b157600080fd5b5080356001600160a01b0316906020810135906040810135906060810135906080013560ff166111e6565b6102fb61134b565b6102fb600480360360808110156105fa57600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135611351565b6102d76004803603602081101561063657600080fd5b5035611437565b6102cd6004803603604081101561065357600080fd5b506001600160a01b038135169060200135611461565b6102d76004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356116a3565b6105876116db565b6102fb6116e4565b6102cd6116ea565b6102fb6117c2565b6102cd600480360360208110156106cb57600080fd5b50356117c8565b6102cd600480360360208110156106e857600080fd5b5035611867565b6102d76004803603602081101561070557600080fd5b50356001600160a01b0316611906565b6102cd6004803603604081101561072b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561075557600080fd5b82018360208201111561076757600080fd5b803590602001918460208302840111600160201b8311171561078857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611921945050505050565b6102fb600480360360208110156107dc57600080fd5b5035611c06565b6102d7611c27565b6102cd6004803603606081101561080157600080fd5b506001600160a01b03813581169160208101359091169060400135611c3b565b6102fb6121ad565b6102cd6004803603608081101561083f57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561086e57600080fd5b82018360208201111561088057600080fd5b803590602001918460208302840111600160201b831117156108a157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108f057600080fd5b82018360208201111561090257600080fd5b803590602001918460208302840111600160201b8311171561092357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121b4945050505050565b6102cd6004803603606081101561097757600080fd5b506001600160a01b038135811691602081013590911690604001351515612ad6565b6102cd600480360360808110156109af57600080fd5b506001600160a01b038135169060ff60208201351690604081013590606001351515612c32565b6102cd600480360360608110156109ec57600080fd5b810190602081018135600160201b811115610a0657600080fd5b820183602082011115610a1857600080fd5b803590602001918460208302840111600160201b83111715610a3957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8857600080fd5b820183602082011115610a9a57600080fd5b803590602001918460208302840111600160201b83111715610abb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b0a57600080fd5b820183602082011115610b1c57600080fd5b803590602001918460208302840111600160201b83111715610b3d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e6b945050505050565b6102cd60048036036080811015610b9157600080fd5b506001600160a01b03813516906020810135906040810135906060013561311b565b61058760048036036040811015610bc957600080fd5b506001600160a01b038135169060200135613250565b610c0560048036036020811015610bf557600080fd5b50356001600160a01b03166138cd565b60408051971515885260ff9096166020880152868601949094526060860192909252608085015260a0840152151560c0830152519081900360e00190f35b6102fb60048036036020811015610c5957600080fd5b50356001600160a01b0316613911565b6102fb613923565b6102cd60048036036020811015610c8757600080fd5b50356001600160a01b0316613929565b6102fb613a31565b610ca7613a37565b60005461010090046001600160a01b03908116911614610cfc576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6040805160008152602081019182905251610d1991600791614793565b5060005b81518160ff161015610de057600854600090610d3c9062015180613a3b565b9050828260ff1681518110610d4d57fe5b60200260200101518111610d9f576040805162461bcd60e51b8152602060048201526014602482015273496e76616c696420496e74657276616c2044617960601b604482015290519081900360640190fd5b6007838360ff1681518110610db057fe5b60209081029190910181015182546001818101855560009485529290932090920191909155919091019050610d1d565b507f29635226d0b00834767b0cf38daca8dc0fe978152b0a8a5b39eb28112635236160074260405180806020018381526020018281038252848181548152602001915080548015610e5057602002820191906000526020600020905b815481526020019060010190808311610e3c575b5050935050505060405180910390a150565b6001546001600160a01b031681565b600a5481565b600c60209081526000928352604080842090915290825290205481565b600560209081526000928352604080842090915290825290205481565b610eb9613a37565b60005461010090046001600160a01b03908116911614610f0e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60098190556040805182815242602082015281517f886f1c6ee47e76ca7e1c7715d9662c5cbc03a9215b76899c702e3d1c38d1ee43929181900390910190a150565b6001600160a01b0381166000908152600b60209081526040918290206002810180548451818502810185019095528085526060948594859485948594859491936003840193600181019360048201936005830193600690930192889190830182828015610fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fc8575b505050505095508480548060200260200160405190810160405280929190818152602001828054801561104257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611024575b50505050509450838054806020026020016040519081016040528092919081815260200182805480156110b457602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116110835790505b505050505093508280548060200260200160405190810160405280929190818152602001828054801561110657602002820191906000526020600020905b8154815260200190600101908083116110f2575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561115857602002820191906000526020600020905b815481526020019060010190808311611144575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156111aa57602002820191906000526020600020905b815481526020019060010190808311611196575b5050505050905095509550955095509550955091939550919395565b600660209081526000928352604080842090915290825290205460ff1681565b60006111f0613a37565b60005461010090046001600160a01b03908116911614611245576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205460ff166112b157600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b0386166000818152600460209081526040918290208054600160ff19909116811761ff00191661010060ff891602178255810189905560028101889055600301869055815188815290810187905280820186905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac916080908290030190a250600195945050505050565b60085481565b6001600160a01b038316600090815260046020526040812060050154819060ff16156113f457600a54611385908790613a84565b95506113a76113a06001600a54613add90919063ffffffff16565b8790613a84565b90506113ed6113b68483613b1f565b6001600160a01b038088166000908152600560209081526040808320938a16835292905220546113e7908990613a84565b90613a3b565b915061142e565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205461142b9084906113e7908990613a84565b91505b50949350505050565b6002818154811061144757600080fd5b6000918252602090912001546001600160a01b0316905081565b611469613a37565b60005461010090046001600160a01b039081169116146114be576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b80826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50511015611582576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b816001600160a01b031663a9059cbb600060019054906101000a90046001600160a01b0316836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156115ee57600080fd5b505af1158015611602573d6000803e3d6000fd5b505050506040513d602081101561161857600080fd5b505161165d576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6040805182815242602082015281516001600160a01b038516927fcb92e2679de255302c9b8d0673cbdf8ef54667e943bf8f049bcaf6a85926ba1a928290030190a25050565b600360205281600052604060002081815481106116bf57600080fd5b6000918252602090912001546001600160a01b03169150829050565b60005460ff1690565b600e5481565b6116f2613a37565b6001546001600160a01b03908116911614611754576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652041646d696e604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60025490565b6117d0613a37565b60005461010090046001600160a01b03908116911614611825576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60088190556040805182815242602082015281517ff676bd50ed08b41fe017c9b4b7606b132ed9afafd39cbe090006c602170638bf929181900390910190a150565b61186f613a37565b60005461010090046001600160a01b039081169116146118c4576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b600a8190556040805182815242602082015281517fd9124f37a22fb221df30d124c79aae3c3be0e56338cc2ed4d68ade2a51319f49929181900390910190a150565b600b602052600090815260409020546001600160a01b031681565b611929613a37565b60005461010090046001600160a01b0390811691161461197e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60408051600080825260208083018085526001600160a01b0387168352600390915292902090516119af92906147de565b506001600160a01b03821660009081526004602052604090205460ff16611a16576040805162461bcd60e51b815260206004820152601660248201527514dd185ad95908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b60005b81518160ff161015611b5f5760025482511115611a6d576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60046000838360ff1681518110611a8057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611af1576040805162461bcd60e51b815260206004820152601660248201527514995dd85c9908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090208251839060ff8416908110611b1a57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501611a19565b506001600160a01b03821660008181526003602090815260409182902082514292810183905283815281549381018490527f533d99224d362fcbe71ce5ff0a8b2d61a9c08b8d1df27aab851edb881f3fb16b939192918190606082019085908015611bf357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611bd5575b5050935050505060405180910390a25050565b60078181548110611c1657600080fd5b600091825260209091200154905081565b60005461010090046001600160a01b031681565b611c436116db565b15611c88576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b0384161415611ce6576040805162461bcd60e51b815260206004820152601f60248201527f5354414b453a20696e76616c6964207265666572726572206164647265737300604482015290519081900360640190fd5b6001600160a01b03821660009081526004602052604090205460ff16611d53576040805162461bcd60e51b815260206004820152601a60248201527f5354414b45203a20546f6b656e206973206e6f74204578697374000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604080832060010154338452600c835281842094845293909152902054611d909083613b1f565b1015611dcd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061491f602a913960400191505060405180910390fd5b6001600160a01b038216600081815260046020908152604080832060020154338452600c835281842094845293909152902054611e0a9083613b1f565b1115611e475760405162461bcd60e51b815260040180806020018281038252602a8152602001806148f5602a913960400191505060405180910390fd5b6001600160a01b038216600090815260046020908152604080832060030154600d90925290912054611e799083613b1f565b1115611ecc576040805162461bcd60e51b815260206004820152601860248201527f5354414b45203a204d61786c696d697420657863656564730000000000000000604482015290519081900360640190fd5b42611ee4600854600e54613b1f90919063ffffffff16565b11611f36576040805162461bcd60e51b815260206004820152601d60248201527f5354414b453a205374616b696e672054696d6520436f6d706c65746564000000604482015290519081900360640190fd5b336000818152600b60209081526040808320600481018054600180820183559186528486208101558082018054808301825590865284862085820401805460ff601f9093166101000a9283021916909117905581546001600160a01b0319908116909617825560028201805480830182559086528486200180546001600160a01b038b8116918916919091179091556003830180548084018255908752858720018054918a16919097168117909655600682018054808301825590865284862042910155600590910180549182018155845282842001859055928252600d905220546120229082613b1f565b6001600160a01b0383166000818152600d6020908152604080832094909455338252600c815283822092825291909152205461205e9082613b1f565b336000818152600c602090815260408083206001600160a01b0388168085529083528184209590955580516323b872dd60e01b8152600481019490945230602485015260448401869052516323b872dd93606480820194918390030190829087803b1580156120cc57600080fd5b505af11580156120e0573d6000803e3d6000fd5b505050506040513d60208110156120f657600080fd5b505161213b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b336000818152600b60205260409020600401546001600160a01b0380851692908616917f8d0a98609f00f26e55cd12ea38ffb8a0dfad170f6f001d682185fdce4ff424449061218b906001613add565b60408051918252602082018790524282820152519081900360600190a4505050565b6201518081565b6121bc613a37565b60005461010090046001600160a01b03908116911614612211576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061223857fe5b906000526020600020015411801561229a57506001600160a01b0383166000908152600b6020526040902060010180548590811061227257fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6122d55760405162461bcd60e51b815260040180806020018281038252603481526020018061497b6034913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090206005018054859081106122fc57fe5b9060005260206000200154600b6000856001600160a01b03166001600160a01b03168152602001908152602001600020600301858154811061233a57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561238957600080fd5b505afa15801561239d573d6000803e3d6000fd5b505050506040513d60208110156123b357600080fd5b50511015612408576040805162461bcd60e51b815260206004820181905260248201527f454d455247454e4359203a20496e73756666696369656e742042616c616e6365604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061242f57fe5b906000526020600020015490506000600b6000866001600160a01b03166001600160a01b03168152602001908152602001600020600101868154811061247157fe5b90600052602060002090602091828204019190066101000a81548160ff0219169083151502179055506000600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002060050186815481106124cf57fe5b906000526020600020018190555061254381600d6000600b6000896001600160a01b03166001600160a01b03168152602001908152602001600020600301898154811061251857fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613add565b6001600160a01b0385166000908152600b602052604081206003018054600d9291908990811061256f57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220949094559187168252600b909252206003018054869081106125b657fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018790529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561261657600080fd5b505af115801561262a573d6000803e3d6000fd5b505050506040513d602081101561264057600080fd5b50600090505b8351811015612a495782818151811061265b57fe5b602002602001015184828151811061266f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156126c357600080fd5b505afa1580156126d7573d6000803e3d6000fd5b505050506040513d60208110156126ed57600080fd5b5051101561272c5760405162461bcd60e51b815260040180806020018281038252602781526020018061488d6027913960400191505060405180910390fd5b600083828151811061273a57fe5b6020026020010151905060006001600160a01b0316600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600201888154811061278257fe5b6000918252602090912001546001600160a01b0316146129aa5760006127c068056bc75e2d631000006113e760095485613a8490919063ffffffff16565b90506127cc8282613add565b91508583815181106127da57fe5b60200260200101516001600160a01b031663a9059cbb600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061282357fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b505050506040513d60208110156128a657600080fd5b50516128f9576040805162461bcd60e51b815260206004820152601b60248201527f454d455247454e4359203a205472616e73666572204661696c65640000000000604482015290519081900360640190fd5b85838151811061290557fe5b60200260200101516001600160a01b0316876001600160a01b0316600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061295357fe5b6000918252602091829020015460408051868152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a4505b8482815181106129b657fe5b60200260200101516001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a1457600080fd5b505af1158015612a28573d6000803e3d6000fd5b505050506040513d6020811015612a3e57600080fd5b505050600101612646565b506001600160a01b0384166000908152600b60205260409020600301805486908110612a7157fe5b60009182526020918290200154604080518481524293810193909352828101889052516001600160a01b0391821692918716917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a35050505050565b612ade613a37565b60005461010090046001600160a01b03908116911614612b33576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205460ff168015612b7357506001600160a01b03821660009081526004602052604090205460ff165b612bb6576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff19168615151790819055825160ff90911615158152429181019190915281517f38dc54047237de43b07dc5d3a0cd9a29485be07da55d5611ddc91102542938ad929181900390910190a3505050565b612c3a613a37565b60005461010090046001600160a01b03908116911614612c8f576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b8260ff1660011480612ca457508260ff166002145b80612cb257508260ff166003145b612d03576040805162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c6f636b61626c6520537461747573000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff161515600114612d67576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b8260ff1660011415612d9f57612d7d4283613b1f565b6001600160a01b03851660009081526004602081905260409091200155612e00565b8260ff1660021415612dcc576001600160a01b038416600090815260046020819052604082200155612e00565b8260ff1660031415612e00576001600160a01b0384166000908152600460205260409020600501805460ff19168215151790555b6001600160a01b03841660008181526004602081815260409283902091820154600590920154835192835260ff16151590820152428183015290517f4030f7d2425e172fe94d03a4cfd07dcdbc4909529bdf15d2732aa1559ff9be7c9181900360600190a250505050565b612e73613a37565b60005461010090046001600160a01b03908116911614612ec8576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b81518351148015612eda575080518251145b612f1b576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60005b83518160ff1610156131155760046000858360ff1681518110612f3d57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff168015612fa6575060046000848360ff1681518110612f7e57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b612fe9576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b818160ff1681518110612ff857fe5b602002602001015160056000868460ff168151811061301357fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858460ff168151811061304c57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828160ff168151811061308757fe5b60200260200101516001600160a01b0316848260ff16815181106130a757fe5b60200260200101516001600160a01b03167f2dc18c352fdd373a4dc83a7156d0dfe95082bd4d820bda50fa65ee3bcf8648f3848460ff16815181106130e857fe5b602002602001015142604051808381526020018281526020019250505060405180910390a3600101612f1e565b50505050565b613123613a37565b60005461010090046001600160a01b03908116911614613178576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff166131d7576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b0384166000818152600460209081526040918290206001810187905560028101869055600301849055815186815290810185905280820184905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac9181900360800190a250505050565b600061325a6116db565b1561329f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b03841614806132c5575060005461010090046001600160a01b031633145b613316576040805162461bcd60e51b815260206004820152601b60248201527f554e5354414b453a20496e76616c6964205573657220456e7472790000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060030180548490811061333d57fe5b60009182526020808320909101546001600160a01b0316808352600491829052604090922001549091504210156133b3576040805162461bcd60e51b8152602060048201526015602482015274155394d51052d14e88151bdad95b88131bd8dad959605a1b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090206005015460ff161561347d574261342a600854600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600601868154811061341157fe5b9060005260206000200154613b1f90919063ffffffff16565b111561347d576040805162461bcd60e51b815260206004820181905260248201527f554e5354414b453a204c6f636b656420696e206f7074696f6e616c206c6f636b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604081206005018054859081106134a457fe5b9060005260206000200154118061350557506001600160a01b0384166000908152600b602052604090206001018054849081106134dd57fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6135405760405162461bcd60e51b81526004018080602001828103825260328152602001806149496032913960400191505060405180910390fd5b6001600160a01b0384166000908152600b6020526040812060050180548590811061356757fe5b60009182526020808320909101546001600160a01b0385168352600d9091526040909120549091506135998183613add565b6001600160a01b038085166000818152600d6020908152604080832095909555928a168152600c8352838120918152915220546135d69083613add565b6001600160a01b038088166000818152600c60209081526040808320948916835293815283822094909455908152600b909252812060050180548790811061361a57fe5b60009182526020808320909101929092556001600160a01b0388168152600b9091526040812060010180548790811061364f57fe5b90600052602060002090602091828204019190066101000a81548160ff02191690831515021790555081600b6000886001600160a01b03166001600160a01b0316815260200190815260200160002060030186815481106136ac57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156136fb57600080fd5b505afa15801561370f573d6000803e3d6000fd5b505050506040513d602081101561372557600080fd5b5051101561377a576040805162461bcd60e51b815260206004820152601e60248201527f554e5354414b45203a20496e73756666696369656e742042616c616e63650000604482015290519081900360640190fd5b6001600160a01b0386166000908152600b602052604090206003018054869081106137a157fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038b81166004830152602482018890529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561380157600080fd5b505af1158015613815573d6000803e3d6000fd5b505050506040513d602081101561382b57600080fd5b5061383a905086868484613b79565b6001600160a01b0386166000908152600b6020526040902060030180548690811061386157fe5b60009182526020918290200154604080518581524293810193909352828101889052516001600160a01b0391821692918916917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a3600193505050505b92915050565b600460208190526000918252604090912080546001820154600283015460038401549484015460059094015460ff8085169661010090950481169593949293911687565b600d6020526000908152604090205481565b60095481565b613931613a37565b60005461010090046001600160a01b03908116911614613986576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0381166139cb5760405162461bcd60e51b81526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610e1081565b3390565b6000613a7d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c2e565b9392505050565b600082613a93575060006138c7565b82820282848281613aa057fe5b0414613a7d5760405162461bcd60e51b81526004018080602001828103825260218152602001806148b46021913960400191505060405180910390fd5b6000613a7d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613cd0565b600082820183811015613a7d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080613b93600854600e54613b1f90919063ffffffff16565b915042821115613ba4575042613bb6565b600854600e54613bb391613b1f565b90505b6001600160a01b0386166000908152600b602052604090206006018054613bfc919087908110613be257fe5b906000526020600020015482613add90919063ffffffff16565b9150613c06614833565b84815260208101849052610e108310613c2557613c2587878386613d2a565b50505050505050565b60008183613cba5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c7f578181015183820152602001613c67565b50505050905090810190601f168015613cac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613cc657fe5b0495945050505050565b60008184841115613d225760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c7f578181015183820152602001613c67565b505050900390565b600080613d35614833565b613d4184610e10613a3b565b6020820152613d538462015180613a3b565b815284516001600160a01b0388166000908152600b602052604090206003018054613df092613de59290918a908110613d8857fe5b60009182526020808320909101546001600160a01b038d81168452600b909252604090922060030180549190921691908b908110613dc257fe5b6000918252602090912001546001600160a01b03168960015b6020020151611351565b602083015190613a84565b6001600160a01b0388166000908152600b602052604081206002018054929550909188908110613e1c57fe5b6000918252602090912001546001600160a01b03161461405357613e5868056bc75e2d631000006113e760095486613a8490919063ffffffff16565b9150613e648383613add565b6001600160a01b0388166000908152600b6020526040902060030180549194509087908110613e8f57fe5b60009182526020808320909101546001600160a01b038a81168452600b90925260409092206002018054919092169163a9059cbb9189908110613ece57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018890525160448083019491928390030190829087803b158015613f2757600080fd5b505af1158015613f3b573d6000803e3d6000fd5b505050506040513d6020811015613f5157600080fd5b50511515600114613f9b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b0387166000908152600b60205260409020600301805487908110613fc257fe5b60009182526020808320909101546001600160a01b038a81168452600b909252604090922060020180549190921691339189908110613ffd57fe5b6000918252602091829020015460408051878152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b0387166000908152600b6020526040902060030180546140d59189918990811061408057fe5b60009182526020808320909101546001600160a01b038c81168452600b909252604090922060030180549190921691908a9081106140ba57fe5b6000918252602090912001546001600160a01b03168661458e565b60015b60075460ff821610156145845760078160ff16815481106140f557fe5b60009182526020909120015482511061457a576000614143601861413d600160078660ff168154811061412457fe5b9060005260206000200154613add90919063ffffffff16565b90613a84565b9050600061415982856001602002015190613add565b9050600060036000600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206003018c8154811061419457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff86169081106141c757fe5b60009182526020808320909101546001600160a01b038e81168452600b909252604090922060030180549190921692508b90811061420157fe5b6000918252602090912001546001600160a01b0382811691161480159061428957506001600160a01b038b166000908152600b60205260408120600301805460069291908d90811061424f57fe5b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093851682529290925290205460ff16155b1561456c5788516001600160a01b038c166000908152600b6020526040902060030180546142e6926142df9290918e9081106142c157fe5b6000918252602090912001546001600160a01b0316848d6001613ddb565b8390613a84565b6001600160a01b038c166000908152600b60205260408120600201805492995090918c90811061431257fe5b6000918252602090912001546001600160a01b0316146145235761434e68056bc75e2d631000006113e76009548a613a8490919063ffffffff16565b955061435a8787613add565b9650806001600160a01b031663a9059cbb600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206002018c8154811061439e57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018c90525160448083019491928390030190829087803b1580156143f757600080fd5b505af115801561440b573d6000803e3d6000fd5b505050506040513d602081101561442157600080fd5b5051151560011461446b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b038b166000908152600b6020526040902060030180548b90811061449257fe5b60009182526020808320909101546001600160a01b038e81168452600b90925260409092206002018054919092169133918d9081106144cd57fe5b60009182526020918290200154604080518b8152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b038b166000908152600b60205260409020600301805461456c918d918d90811061455057fe5b6000918252602090912001546001600160a01b0316838a61458e565b83600101935050505061457f565b614584565b6140d8565b5050505050505050565b6001600160a01b038216156131155780826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156145eb57600080fd5b505afa1580156145ff573d6000803e3d6000fd5b505050506040513d602081101561461557600080fd5b5051101561466a576040805162461bcd60e51b815260206004820152601b60248201527f53454e44203a20496e73756666696369656e742042616c616e63650000000000604482015290519081900360640190fd5b816001600160a01b031663a9059cbb85836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156146c157600080fd5b505af11580156146d5573d6000803e3d6000fd5b505050506040513d60208110156146eb57600080fd5b5051614730576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316856001600160a01b03167fcd5e4f020ddad29434c2200a9edf2f8d7ec30f0d787f03b528ab7279aab0acbe8442604051808381526020018281526020019250505060405180910390a450505050565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce5782518255916020019190600101906147b3565b506147da929150614851565b5090565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906147fe565b60405180604001604052806002906020820280368337509192915050565b5b808211156147da576000815560010161485256fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373454d455247454e4359203a20496e73756666696369656e74205265776172642042616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725354414b45203a204d617820416d6f756e742073686f756c642062652077697468696e207065726d69745354414b45203a204d696e20416d6f756e742073686f756c642062652077697468696e207065726d6974554e5354414b45203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564454d455247454e4359203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564a26469706673582212209766f25595198a5e103f2bf86589b26aed0a3a46ab7bdbeafe1e01f0a5e28a3f64736f6c63430007060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c806388125f7911610130578063cdd033c8116100b8578063dd4be6831161007c578063dd4be68314610bdf578063e0a79b1614610c43578063e5c4686914610c69578063f2fde38b14610c71578063fbfcd24114610c9757610227565b8063cdd033c814610961578063d431350614610999578063d43c9535146109d6578063d768779a14610b7b578063d939381414610bb357610227565b8063b104e006116100ff578063b104e006146107c6578063b2bdfa7b146107e3578063bf6eac2f146107eb578063c549e6b914610821578063c922e9371461082957610227565b806388125f79146106b557806396591e31146106d2578063a019cb4b146106ef578063a4f3f0e51461071557610227565b806340f02ab6116101b3578063539cd3b411610182578063539cd3b4146106695780635c975abb146106955780635f96dc111461069d578063715018a6146106a557806385d895ef146106ad57610227565b806340f02ab6146105dc5780634cd36531146105e45780634f64b2be146106205780635058c4601461063d57610227565b8063187739a4116101fa578063187739a41461033b5780631d2002e71461036957806326fa24e91461038657806328523eb61461055957806340a166881461059b57610227565b806301193ad71461022c57806301bc45c9146102cf57806304a624c6146102f35780631320da8b1461030d575b600080fd5b6102cd6004803603602081101561024257600080fd5b810190602081018135600160201b81111561025c57600080fd5b82018360208201111561026e57600080fd5b803590602001918460208302840111600160201b8311171561028f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610c9f945050505050565b005b6102d7610e62565b604080516001600160a01b039092168252519081900360200190f35b6102fb610e71565b60408051918252519081900360200190f35b6102fb6004803603604081101561032357600080fd5b506001600160a01b0381358116916020013516610e77565b6102fb6004803603604081101561035157600080fd5b506001600160a01b0381358116916020013516610e94565b6102cd6004803603602081101561037f57600080fd5b5035610eb1565b6103ac6004803603602081101561039c57600080fd5b50356001600160a01b0316610f50565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b838110156104005781810151838201526020016103e8565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b8381101561043f578181015183820152602001610427565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b8381101561047e578181015183820152602001610466565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b838110156104bd5781810151838201526020016104a5565b50505050905001878103835289818151815260200191508051906020019060200280838360005b838110156104fc5781810151838201526020016104e4565b50505050905001878103825288818151815260200191508051906020019060200280838360005b8381101561053b578181015183820152602001610523565b505050509050019c5050505050505050505050505060405180910390f35b6105876004803603604081101561056f57600080fd5b506001600160a01b03813581169160200135166111c6565b604080519115158252519081900360200190f35b610587600480360360a08110156105b157600080fd5b5080356001600160a01b0316906020810135906040810135906060810135906080013560ff166111e6565b6102fb61134b565b6102fb600480360360808110156105fa57600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135611351565b6102d76004803603602081101561063657600080fd5b5035611437565b6102cd6004803603604081101561065357600080fd5b506001600160a01b038135169060200135611461565b6102d76004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356116a3565b6105876116db565b6102fb6116e4565b6102cd6116ea565b6102fb6117c2565b6102cd600480360360208110156106cb57600080fd5b50356117c8565b6102cd600480360360208110156106e857600080fd5b5035611867565b6102d76004803603602081101561070557600080fd5b50356001600160a01b0316611906565b6102cd6004803603604081101561072b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561075557600080fd5b82018360208201111561076757600080fd5b803590602001918460208302840111600160201b8311171561078857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611921945050505050565b6102fb600480360360208110156107dc57600080fd5b5035611c06565b6102d7611c27565b6102cd6004803603606081101561080157600080fd5b506001600160a01b03813581169160208101359091169060400135611c3b565b6102fb6121ad565b6102cd6004803603608081101561083f57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561086e57600080fd5b82018360208201111561088057600080fd5b803590602001918460208302840111600160201b831117156108a157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108f057600080fd5b82018360208201111561090257600080fd5b803590602001918460208302840111600160201b8311171561092357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121b4945050505050565b6102cd6004803603606081101561097757600080fd5b506001600160a01b038135811691602081013590911690604001351515612ad6565b6102cd600480360360808110156109af57600080fd5b506001600160a01b038135169060ff60208201351690604081013590606001351515612c32565b6102cd600480360360608110156109ec57600080fd5b810190602081018135600160201b811115610a0657600080fd5b820183602082011115610a1857600080fd5b803590602001918460208302840111600160201b83111715610a3957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8857600080fd5b820183602082011115610a9a57600080fd5b803590602001918460208302840111600160201b83111715610abb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b0a57600080fd5b820183602082011115610b1c57600080fd5b803590602001918460208302840111600160201b83111715610b3d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e6b945050505050565b6102cd60048036036080811015610b9157600080fd5b506001600160a01b03813516906020810135906040810135906060013561311b565b61058760048036036040811015610bc957600080fd5b506001600160a01b038135169060200135613250565b610c0560048036036020811015610bf557600080fd5b50356001600160a01b03166138cd565b60408051971515885260ff9096166020880152868601949094526060860192909252608085015260a0840152151560c0830152519081900360e00190f35b6102fb60048036036020811015610c5957600080fd5b50356001600160a01b0316613911565b6102fb613923565b6102cd60048036036020811015610c8757600080fd5b50356001600160a01b0316613929565b6102fb613a31565b610ca7613a37565b60005461010090046001600160a01b03908116911614610cfc576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6040805160008152602081019182905251610d1991600791614793565b5060005b81518160ff161015610de057600854600090610d3c9062015180613a3b565b9050828260ff1681518110610d4d57fe5b60200260200101518111610d9f576040805162461bcd60e51b8152602060048201526014602482015273496e76616c696420496e74657276616c2044617960601b604482015290519081900360640190fd5b6007838360ff1681518110610db057fe5b60209081029190910181015182546001818101855560009485529290932090920191909155919091019050610d1d565b507f29635226d0b00834767b0cf38daca8dc0fe978152b0a8a5b39eb28112635236160074260405180806020018381526020018281038252848181548152602001915080548015610e5057602002820191906000526020600020905b815481526020019060010190808311610e3c575b5050935050505060405180910390a150565b6001546001600160a01b031681565b600a5481565b600c60209081526000928352604080842090915290825290205481565b600560209081526000928352604080842090915290825290205481565b610eb9613a37565b60005461010090046001600160a01b03908116911614610f0e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60098190556040805182815242602082015281517f886f1c6ee47e76ca7e1c7715d9662c5cbc03a9215b76899c702e3d1c38d1ee43929181900390910190a150565b6001600160a01b0381166000908152600b60209081526040918290206002810180548451818502810185019095528085526060948594859485948594859491936003840193600181019360048201936005830193600690930192889190830182828015610fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fc8575b505050505095508480548060200260200160405190810160405280929190818152602001828054801561104257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611024575b50505050509450838054806020026020016040519081016040528092919081815260200182805480156110b457602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116110835790505b505050505093508280548060200260200160405190810160405280929190818152602001828054801561110657602002820191906000526020600020905b8154815260200190600101908083116110f2575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561115857602002820191906000526020600020905b815481526020019060010190808311611144575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156111aa57602002820191906000526020600020905b815481526020019060010190808311611196575b5050505050905095509550955095509550955091939550919395565b600660209081526000928352604080842090915290825290205460ff1681565b60006111f0613a37565b60005461010090046001600160a01b03908116911614611245576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205460ff166112b157600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b0386166000818152600460209081526040918290208054600160ff19909116811761ff00191661010060ff891602178255810189905560028101889055600301869055815188815290810187905280820186905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac916080908290030190a250600195945050505050565b60085481565b6001600160a01b038316600090815260046020526040812060050154819060ff16156113f457600a54611385908790613a84565b95506113a76113a06001600a54613add90919063ffffffff16565b8790613a84565b90506113ed6113b68483613b1f565b6001600160a01b038088166000908152600560209081526040808320938a16835292905220546113e7908990613a84565b90613a3b565b915061142e565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205461142b9084906113e7908990613a84565b91505b50949350505050565b6002818154811061144757600080fd5b6000918252602090912001546001600160a01b0316905081565b611469613a37565b60005461010090046001600160a01b039081169116146114be576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b80826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50511015611582576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b816001600160a01b031663a9059cbb600060019054906101000a90046001600160a01b0316836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156115ee57600080fd5b505af1158015611602573d6000803e3d6000fd5b505050506040513d602081101561161857600080fd5b505161165d576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6040805182815242602082015281516001600160a01b038516927fcb92e2679de255302c9b8d0673cbdf8ef54667e943bf8f049bcaf6a85926ba1a928290030190a25050565b600360205281600052604060002081815481106116bf57600080fd5b6000918252602090912001546001600160a01b03169150829050565b60005460ff1690565b600e5481565b6116f2613a37565b6001546001600160a01b03908116911614611754576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652041646d696e604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60025490565b6117d0613a37565b60005461010090046001600160a01b03908116911614611825576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60088190556040805182815242602082015281517ff676bd50ed08b41fe017c9b4b7606b132ed9afafd39cbe090006c602170638bf929181900390910190a150565b61186f613a37565b60005461010090046001600160a01b039081169116146118c4576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b600a8190556040805182815242602082015281517fd9124f37a22fb221df30d124c79aae3c3be0e56338cc2ed4d68ade2a51319f49929181900390910190a150565b600b602052600090815260409020546001600160a01b031681565b611929613a37565b60005461010090046001600160a01b0390811691161461197e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60408051600080825260208083018085526001600160a01b0387168352600390915292902090516119af92906147de565b506001600160a01b03821660009081526004602052604090205460ff16611a16576040805162461bcd60e51b815260206004820152601660248201527514dd185ad95908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b60005b81518160ff161015611b5f5760025482511115611a6d576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60046000838360ff1681518110611a8057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611af1576040805162461bcd60e51b815260206004820152601660248201527514995dd85c9908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090208251839060ff8416908110611b1a57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501611a19565b506001600160a01b03821660008181526003602090815260409182902082514292810183905283815281549381018490527f533d99224d362fcbe71ce5ff0a8b2d61a9c08b8d1df27aab851edb881f3fb16b939192918190606082019085908015611bf357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611bd5575b5050935050505060405180910390a25050565b60078181548110611c1657600080fd5b600091825260209091200154905081565b60005461010090046001600160a01b031681565b611c436116db565b15611c88576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b0384161415611ce6576040805162461bcd60e51b815260206004820152601f60248201527f5354414b453a20696e76616c6964207265666572726572206164647265737300604482015290519081900360640190fd5b6001600160a01b03821660009081526004602052604090205460ff16611d53576040805162461bcd60e51b815260206004820152601a60248201527f5354414b45203a20546f6b656e206973206e6f74204578697374000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604080832060010154338452600c835281842094845293909152902054611d909083613b1f565b1015611dcd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061491f602a913960400191505060405180910390fd5b6001600160a01b038216600081815260046020908152604080832060020154338452600c835281842094845293909152902054611e0a9083613b1f565b1115611e475760405162461bcd60e51b815260040180806020018281038252602a8152602001806148f5602a913960400191505060405180910390fd5b6001600160a01b038216600090815260046020908152604080832060030154600d90925290912054611e799083613b1f565b1115611ecc576040805162461bcd60e51b815260206004820152601860248201527f5354414b45203a204d61786c696d697420657863656564730000000000000000604482015290519081900360640190fd5b42611ee4600854600e54613b1f90919063ffffffff16565b11611f36576040805162461bcd60e51b815260206004820152601d60248201527f5354414b453a205374616b696e672054696d6520436f6d706c65746564000000604482015290519081900360640190fd5b336000818152600b60209081526040808320600481018054600180820183559186528486208101558082018054808301825590865284862085820401805460ff601f9093166101000a9283021916909117905581546001600160a01b0319908116909617825560028201805480830182559086528486200180546001600160a01b038b8116918916919091179091556003830180548084018255908752858720018054918a16919097168117909655600682018054808301825590865284862042910155600590910180549182018155845282842001859055928252600d905220546120229082613b1f565b6001600160a01b0383166000818152600d6020908152604080832094909455338252600c815283822092825291909152205461205e9082613b1f565b336000818152600c602090815260408083206001600160a01b0388168085529083528184209590955580516323b872dd60e01b8152600481019490945230602485015260448401869052516323b872dd93606480820194918390030190829087803b1580156120cc57600080fd5b505af11580156120e0573d6000803e3d6000fd5b505050506040513d60208110156120f657600080fd5b505161213b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b336000818152600b60205260409020600401546001600160a01b0380851692908616917f8d0a98609f00f26e55cd12ea38ffb8a0dfad170f6f001d682185fdce4ff424449061218b906001613add565b60408051918252602082018790524282820152519081900360600190a4505050565b6201518081565b6121bc613a37565b60005461010090046001600160a01b03908116911614612211576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061223857fe5b906000526020600020015411801561229a57506001600160a01b0383166000908152600b6020526040902060010180548590811061227257fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6122d55760405162461bcd60e51b815260040180806020018281038252603481526020018061497b6034913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090206005018054859081106122fc57fe5b9060005260206000200154600b6000856001600160a01b03166001600160a01b03168152602001908152602001600020600301858154811061233a57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561238957600080fd5b505afa15801561239d573d6000803e3d6000fd5b505050506040513d60208110156123b357600080fd5b50511015612408576040805162461bcd60e51b815260206004820181905260248201527f454d455247454e4359203a20496e73756666696369656e742042616c616e6365604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061242f57fe5b906000526020600020015490506000600b6000866001600160a01b03166001600160a01b03168152602001908152602001600020600101868154811061247157fe5b90600052602060002090602091828204019190066101000a81548160ff0219169083151502179055506000600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002060050186815481106124cf57fe5b906000526020600020018190555061254381600d6000600b6000896001600160a01b03166001600160a01b03168152602001908152602001600020600301898154811061251857fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613add565b6001600160a01b0385166000908152600b602052604081206003018054600d9291908990811061256f57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220949094559187168252600b909252206003018054869081106125b657fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018790529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561261657600080fd5b505af115801561262a573d6000803e3d6000fd5b505050506040513d602081101561264057600080fd5b50600090505b8351811015612a495782818151811061265b57fe5b602002602001015184828151811061266f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156126c357600080fd5b505afa1580156126d7573d6000803e3d6000fd5b505050506040513d60208110156126ed57600080fd5b5051101561272c5760405162461bcd60e51b815260040180806020018281038252602781526020018061488d6027913960400191505060405180910390fd5b600083828151811061273a57fe5b6020026020010151905060006001600160a01b0316600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600201888154811061278257fe5b6000918252602090912001546001600160a01b0316146129aa5760006127c068056bc75e2d631000006113e760095485613a8490919063ffffffff16565b90506127cc8282613add565b91508583815181106127da57fe5b60200260200101516001600160a01b031663a9059cbb600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061282357fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b505050506040513d60208110156128a657600080fd5b50516128f9576040805162461bcd60e51b815260206004820152601b60248201527f454d455247454e4359203a205472616e73666572204661696c65640000000000604482015290519081900360640190fd5b85838151811061290557fe5b60200260200101516001600160a01b0316876001600160a01b0316600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061295357fe5b6000918252602091829020015460408051868152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a4505b8482815181106129b657fe5b60200260200101516001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a1457600080fd5b505af1158015612a28573d6000803e3d6000fd5b505050506040513d6020811015612a3e57600080fd5b505050600101612646565b506001600160a01b0384166000908152600b60205260409020600301805486908110612a7157fe5b60009182526020918290200154604080518481524293810193909352828101889052516001600160a01b0391821692918716917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a35050505050565b612ade613a37565b60005461010090046001600160a01b03908116911614612b33576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205460ff168015612b7357506001600160a01b03821660009081526004602052604090205460ff165b612bb6576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff19168615151790819055825160ff90911615158152429181019190915281517f38dc54047237de43b07dc5d3a0cd9a29485be07da55d5611ddc91102542938ad929181900390910190a3505050565b612c3a613a37565b60005461010090046001600160a01b03908116911614612c8f576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b8260ff1660011480612ca457508260ff166002145b80612cb257508260ff166003145b612d03576040805162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c6f636b61626c6520537461747573000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff161515600114612d67576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b8260ff1660011415612d9f57612d7d4283613b1f565b6001600160a01b03851660009081526004602081905260409091200155612e00565b8260ff1660021415612dcc576001600160a01b038416600090815260046020819052604082200155612e00565b8260ff1660031415612e00576001600160a01b0384166000908152600460205260409020600501805460ff19168215151790555b6001600160a01b03841660008181526004602081815260409283902091820154600590920154835192835260ff16151590820152428183015290517f4030f7d2425e172fe94d03a4cfd07dcdbc4909529bdf15d2732aa1559ff9be7c9181900360600190a250505050565b612e73613a37565b60005461010090046001600160a01b03908116911614612ec8576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b81518351148015612eda575080518251145b612f1b576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60005b83518160ff1610156131155760046000858360ff1681518110612f3d57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff168015612fa6575060046000848360ff1681518110612f7e57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b612fe9576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b818160ff1681518110612ff857fe5b602002602001015160056000868460ff168151811061301357fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858460ff168151811061304c57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828160ff168151811061308757fe5b60200260200101516001600160a01b0316848260ff16815181106130a757fe5b60200260200101516001600160a01b03167f2dc18c352fdd373a4dc83a7156d0dfe95082bd4d820bda50fa65ee3bcf8648f3848460ff16815181106130e857fe5b602002602001015142604051808381526020018281526020019250505060405180910390a3600101612f1e565b50505050565b613123613a37565b60005461010090046001600160a01b03908116911614613178576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff166131d7576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b0384166000818152600460209081526040918290206001810187905560028101869055600301849055815186815290810185905280820184905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac9181900360800190a250505050565b600061325a6116db565b1561329f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b03841614806132c5575060005461010090046001600160a01b031633145b613316576040805162461bcd60e51b815260206004820152601b60248201527f554e5354414b453a20496e76616c6964205573657220456e7472790000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060030180548490811061333d57fe5b60009182526020808320909101546001600160a01b0316808352600491829052604090922001549091504210156133b3576040805162461bcd60e51b8152602060048201526015602482015274155394d51052d14e88151bdad95b88131bd8dad959605a1b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090206005015460ff161561347d574261342a600854600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600601868154811061341157fe5b9060005260206000200154613b1f90919063ffffffff16565b111561347d576040805162461bcd60e51b815260206004820181905260248201527f554e5354414b453a204c6f636b656420696e206f7074696f6e616c206c6f636b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604081206005018054859081106134a457fe5b9060005260206000200154118061350557506001600160a01b0384166000908152600b602052604090206001018054849081106134dd57fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6135405760405162461bcd60e51b81526004018080602001828103825260328152602001806149496032913960400191505060405180910390fd5b6001600160a01b0384166000908152600b6020526040812060050180548590811061356757fe5b60009182526020808320909101546001600160a01b0385168352600d9091526040909120549091506135998183613add565b6001600160a01b038085166000818152600d6020908152604080832095909555928a168152600c8352838120918152915220546135d69083613add565b6001600160a01b038088166000818152600c60209081526040808320948916835293815283822094909455908152600b909252812060050180548790811061361a57fe5b60009182526020808320909101929092556001600160a01b0388168152600b9091526040812060010180548790811061364f57fe5b90600052602060002090602091828204019190066101000a81548160ff02191690831515021790555081600b6000886001600160a01b03166001600160a01b0316815260200190815260200160002060030186815481106136ac57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156136fb57600080fd5b505afa15801561370f573d6000803e3d6000fd5b505050506040513d602081101561372557600080fd5b5051101561377a576040805162461bcd60e51b815260206004820152601e60248201527f554e5354414b45203a20496e73756666696369656e742042616c616e63650000604482015290519081900360640190fd5b6001600160a01b0386166000908152600b602052604090206003018054869081106137a157fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038b81166004830152602482018890529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561380157600080fd5b505af1158015613815573d6000803e3d6000fd5b505050506040513d602081101561382b57600080fd5b5061383a905086868484613b79565b6001600160a01b0386166000908152600b6020526040902060030180548690811061386157fe5b60009182526020918290200154604080518581524293810193909352828101889052516001600160a01b0391821692918916917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a3600193505050505b92915050565b600460208190526000918252604090912080546001820154600283015460038401549484015460059094015460ff8085169661010090950481169593949293911687565b600d6020526000908152604090205481565b60095481565b613931613a37565b60005461010090046001600160a01b03908116911614613986576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0381166139cb5760405162461bcd60e51b81526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610e1081565b3390565b6000613a7d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c2e565b9392505050565b600082613a93575060006138c7565b82820282848281613aa057fe5b0414613a7d5760405162461bcd60e51b81526004018080602001828103825260218152602001806148b46021913960400191505060405180910390fd5b6000613a7d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613cd0565b600082820183811015613a7d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080613b93600854600e54613b1f90919063ffffffff16565b915042821115613ba4575042613bb6565b600854600e54613bb391613b1f565b90505b6001600160a01b0386166000908152600b602052604090206006018054613bfc919087908110613be257fe5b906000526020600020015482613add90919063ffffffff16565b9150613c06614833565b84815260208101849052610e108310613c2557613c2587878386613d2a565b50505050505050565b60008183613cba5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c7f578181015183820152602001613c67565b50505050905090810190601f168015613cac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613cc657fe5b0495945050505050565b60008184841115613d225760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c7f578181015183820152602001613c67565b505050900390565b600080613d35614833565b613d4184610e10613a3b565b6020820152613d538462015180613a3b565b815284516001600160a01b0388166000908152600b602052604090206003018054613df092613de59290918a908110613d8857fe5b60009182526020808320909101546001600160a01b038d81168452600b909252604090922060030180549190921691908b908110613dc257fe5b6000918252602090912001546001600160a01b03168960015b6020020151611351565b602083015190613a84565b6001600160a01b0388166000908152600b602052604081206002018054929550909188908110613e1c57fe5b6000918252602090912001546001600160a01b03161461405357613e5868056bc75e2d631000006113e760095486613a8490919063ffffffff16565b9150613e648383613add565b6001600160a01b0388166000908152600b6020526040902060030180549194509087908110613e8f57fe5b60009182526020808320909101546001600160a01b038a81168452600b90925260409092206002018054919092169163a9059cbb9189908110613ece57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018890525160448083019491928390030190829087803b158015613f2757600080fd5b505af1158015613f3b573d6000803e3d6000fd5b505050506040513d6020811015613f5157600080fd5b50511515600114613f9b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b0387166000908152600b60205260409020600301805487908110613fc257fe5b60009182526020808320909101546001600160a01b038a81168452600b909252604090922060020180549190921691339189908110613ffd57fe5b6000918252602091829020015460408051878152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b0387166000908152600b6020526040902060030180546140d59189918990811061408057fe5b60009182526020808320909101546001600160a01b038c81168452600b909252604090922060030180549190921691908a9081106140ba57fe5b6000918252602090912001546001600160a01b03168661458e565b60015b60075460ff821610156145845760078160ff16815481106140f557fe5b60009182526020909120015482511061457a576000614143601861413d600160078660ff168154811061412457fe5b9060005260206000200154613add90919063ffffffff16565b90613a84565b9050600061415982856001602002015190613add565b9050600060036000600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206003018c8154811061419457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff86169081106141c757fe5b60009182526020808320909101546001600160a01b038e81168452600b909252604090922060030180549190921692508b90811061420157fe5b6000918252602090912001546001600160a01b0382811691161480159061428957506001600160a01b038b166000908152600b60205260408120600301805460069291908d90811061424f57fe5b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093851682529290925290205460ff16155b1561456c5788516001600160a01b038c166000908152600b6020526040902060030180546142e6926142df9290918e9081106142c157fe5b6000918252602090912001546001600160a01b0316848d6001613ddb565b8390613a84565b6001600160a01b038c166000908152600b60205260408120600201805492995090918c90811061431257fe5b6000918252602090912001546001600160a01b0316146145235761434e68056bc75e2d631000006113e76009548a613a8490919063ffffffff16565b955061435a8787613add565b9650806001600160a01b031663a9059cbb600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206002018c8154811061439e57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018c90525160448083019491928390030190829087803b1580156143f757600080fd5b505af115801561440b573d6000803e3d6000fd5b505050506040513d602081101561442157600080fd5b5051151560011461446b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b038b166000908152600b6020526040902060030180548b90811061449257fe5b60009182526020808320909101546001600160a01b038e81168452600b90925260409092206002018054919092169133918d9081106144cd57fe5b60009182526020918290200154604080518b8152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b038b166000908152600b60205260409020600301805461456c918d918d90811061455057fe5b6000918252602090912001546001600160a01b0316838a61458e565b83600101935050505061457f565b614584565b6140d8565b5050505050505050565b6001600160a01b038216156131155780826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156145eb57600080fd5b505afa1580156145ff573d6000803e3d6000fd5b505050506040513d602081101561461557600080fd5b5051101561466a576040805162461bcd60e51b815260206004820152601b60248201527f53454e44203a20496e73756666696369656e742042616c616e63650000000000604482015290519081900360640190fd5b816001600160a01b031663a9059cbb85836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156146c157600080fd5b505af11580156146d5573d6000803e3d6000fd5b505050506040513d60208110156146eb57600080fd5b5051614730576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316856001600160a01b03167fcd5e4f020ddad29434c2200a9edf2f8d7ec30f0d787f03b528ab7279aab0acbe8442604051808381526020018281526020019250505060405180910390a450505050565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce5782518255916020019190600101906147b3565b506147da929150614851565b5090565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906147fe565b60405180604001604052806002906020820280368337509192915050565b5b808211156147da576000815560010161485256fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373454d455247454e4359203a20496e73756666696369656e74205265776172642042616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725354414b45203a204d617820416d6f756e742073686f756c642062652077697468696e207065726d69745354414b45203a204d696e20416d6f756e742073686f756c642062652077697468696e207065726d6974554e5354414b45203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564454d455247454e4359203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564a26469706673582212209766f25595198a5e103f2bf86589b26aed0a3a46ab7bdbeafe1e01f0a5e28a3f64736f6c63430007060033
Deployed Bytecode Sourcemap
20981:14833:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19535:388;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19535:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19535:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19535:388:0;;-1:-1:-1;19535:388:0;;-1:-1:-1;;;;;19535:388:0:i;:::-;;3795:21;;;:::i;:::-;;;;-1:-1:-1;;;;;3795:21:0;;;;;;;;;;;;;;13979:32;;;:::i;:::-;;;;;;;;;;;;;;;;21400:71;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21400:71:0;;;;;;;;;;:::i;13619:77::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13619:77:0;;;;;;;;;;:::i;19361:168::-;;;;;;;;;;;;;;;;-1:-1:-1;19361:168:0;;:::i;35306:505::-;;;;;;;;;;;;;;;;-1:-1:-1;35306:505:0;-1:-1:-1;;;;;35306:505:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13701:70;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13701:70:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;15362:702;;;;;;;;;;;;;;;;-1:-1:-1;15362:702:0;;-1:-1:-1;;;;;15362:702:0;;;;;;;;;;;;;;;;;;;;;;;:::i;13913:28::-;;;:::i;29178:673::-;;;;;;;;;;;;;;;;-1:-1:-1;29178:673:0;;;-1:-1:-1;;;;;29178:673:0;;;;;;;;;;;;;;;;;;;:::i;13477:23::-;;;;;;;;;;;;;;;;-1:-1:-1;13477:23:0;;:::i;20405:347::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20405:347:0;;;;;;;;:::i;13505:55::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13505:55:0;;;;;;;;:::i;2572:80::-;;;:::i;21528:28::-;;;:::i;4890:122::-;;;:::i;20758:92::-;;;:::i;18993:175::-;;;;;;;;;;;;;;;;-1:-1:-1;18993:175:0;;:::i;19174:181::-;;;;;;;;;;;;;;;;-1:-1:-1;19174:181:0;;:::i;21344:51::-;;;;;;;;;;;;;;;;-1:-1:-1;21344:51:0;-1:-1:-1;;;;;21344:51:0;;:::i;16872:704::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16872:704:0;;;;;;;;;;;;;;;-1:-1:-1;;;16872:704:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16872:704:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16872:704:0;;-1:-1:-1;16872:704:0;;-1:-1:-1;;;;;16872:704:0:i;13776:46::-;;;;;;;;;;;;;;;;-1:-1:-1;13776:46:0;;:::i;3769:21::-;;;:::i;22551:2078::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22551:2078:0;;;;;;;;;;;;;;;;;:::i;13827:37::-;;;:::i;32916:2303::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32916:2303:0;;;;;;;;;;;;;;;;-1:-1:-1;;;32916:2303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32916:2303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32916:2303:0;;;;;;;;-1:-1:-1;32916:2303:0;;-1:-1:-1;;;;;32916:2303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32916:2303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32916:2303:0;;-1:-1:-1;32916:2303:0;;-1:-1:-1;;;;;32916:2303:0:i;19929:470::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19929:470:0;;;;;;;;;;;;;;;;;;;:::i;18133:854::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18133:854:0;;;;;;;;;;;;;;;;;;;;;;:::i;16070:796::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16070:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16070:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16070:796:0;;;;;;;;-1:-1:-1;16070:796:0;;-1:-1:-1;;;;;16070:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16070:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16070:796:0;;;;;;;;-1:-1:-1;16070:796:0;;-1:-1:-1;;;;;16070:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16070:796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16070:796:0;;-1:-1:-1;16070:796:0;;-1:-1:-1;;;;;16070:796:0:i;17582:545::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17582:545:0;;;;;;;;;;;;;;;;;;:::i;30807:2103::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30807:2103:0;;;;;;;;:::i;13565:49::-;;;;;;;;;;;;;;;;-1:-1:-1;13565:49:0;-1:-1:-1;;;;;13565:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21476:47;;;;;;;;;;;;;;;;-1:-1:-1;21476:47:0;-1:-1:-1;;;;;21476:47:0;;:::i;13946:28::-;;;:::i;5157:230::-;;;;;;;;;;;;;;;;-1:-1:-1;5157:230:0;-1:-1:-1;;;;;5157:230:0;;:::i;13869:39::-;;;:::i;19535:388::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;19630:16:::1;::::0;;19644:1:::1;19630:16:::0;;::::1;::::0;::::1;::::0;;;;19615:31;::::1;::::0;:12:::1;::::0;:31:::1;:::i;:::-;;19660:7;19655:199;19677:9;:16;19673:1;:20;;;19655:199;;;19723:13;::::0;19709:11:::1;::::0;19723:23:::1;::::0;13858:6:::1;19723:17;:23::i;:::-;19709:37;;19769:9;19779:1;19769:12;;;;;;;;;;;;;;;;19763:3;:18;19755:51;;;::::0;;-1:-1:-1;;;19755:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;19755:51:0;;;;;;;;;;;;;::::1;;19815:12;19833:9;19843:1;19833:12;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;19815:31;;::::1;::::0;;::::1;::::0;;-1:-1:-1;19815:31:0;;;;;;;;;::::1;::::0;;;;19695:3;;;::::1;::::0;-1:-1:-1;19655:199:0::1;;;;19867:50;19887:12;19901:15;19867:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19535:388:::0;:::o;3795:21::-;;;-1:-1:-1;;;;;3795:21:0;;:::o;13979:32::-;;;;:::o;21400:71::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;13619:77::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;19361:168::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;19430:13:::1;:22:::0;;;19466:57:::1;::::0;;;;;19507:15:::1;19466:57;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;19361:168:::0;:::o;35306:505::-;-1:-1:-1;;;;;35565:21:0;;;;;;:14;:21;;;;;;;;;:30;;;35549:256;;;;;;;;;;;;;;;;;35393:16;;;;;;;;;;;;35565:30;;35604:34;;;;35647:30;;;;35686:29;;;;35724:34;;;;35767:31;;;;;35565:30;;35549:256;;;35565:30;35549:256;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35549:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35549:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35306:505;;;;;;;:::o;13701:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15362:702::-;15537:4;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15556:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;15550:68;;15593:6;:25:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;15593:25:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;15593:25:0::1;-1:-1:-1::0;;;;;15593:25:0;::::1;;::::0;;15550:68:::1;-1:-1:-1::0;;;;;15627:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;;:41;;15664:4:::1;-1:-1:-1::0;;15627:41:0;;::::1;::::0;::::1;-1:-1:-1::0;;15675:44:0::1;15627:41;;15675:44:::0;::::1;;;::::0;;15726:39;::::1;:54:::0;;;15787:39:::1;::::0;::::1;:54:::0;;;15848:40:::1;;:53:::0;;;15915:125;;;;;;;::::1;::::0;;;;;;;;;16018:15:::1;15915:125:::0;;;;;;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;16054:4:0::1;15362:702:::0;;;;;;;:::o;13913:28::-;;;;:::o;29178:673::-;-1:-1:-1;;;;;29388:25:0;;29333:14;29388:25;;;:12;:25;;;;;:42;;;29333:14;;29388:42;;29384:461;;;29473:17;;29456:35;;:12;;:16;:35::i;:::-;29441:50;;29514:42;29531:24;29553:1;29531:17;;:21;;:24;;;;:::i;:::-;29514:12;;:16;:42::i;:::-;29500:56;-1:-1:-1;29574:129:0;29675:27;:10;29500:56;29675:14;:27::i;:::-;-1:-1:-1;;;;;29602:35:0;;;;;;;:22;:35;;;;;;;;:48;;;;;;;;;;29585:66;;:12;;:16;:66::i;:::-;29574:100;;:129::i;:::-;29565:138;;29384:461;;;-1:-1:-1;;;;;29761:35:0;;;;;;;:22;:35;;;;;;;;:48;;;;;;;;;;29733:112;;29834:10;;29744:66;;:12;;:16;:66::i;29733:112::-;29724:121;;29384:461;29178:673;;;;;;;:::o;13477:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13477:23:0;;-1:-1:-1;13477:23:0;:::o;20405:347::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;20554:6:::1;20512:12;-1:-1:-1::0;;;;;20505:30:0::1;;20544:4;20505:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;20505:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20505:45:0;:55:::1;;20489:109;;;::::0;;-1:-1:-1;;;20489:109:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20489:109:0;;;;;;;;;;;;;::::1;;20620:12;-1:-1:-1::0;;;;;20613:29:0::1;;20643:6;;;;;;;;;-1:-1:-1::0;;;;;20643:6:0::1;20651;20613:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;20613:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20613:45:0;20605:73:::1;;;::::0;;-1:-1:-1;;;20605:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20605:73:0;;;;;;;;;;;;;::::1;;20692:54;::::0;;;;;20730:15:::1;20692:54;::::0;::::1;::::0;;;-1:-1:-1;;;;;20692:54:0;::::1;::::0;::::1;::::0;;;;;;::::1;20405:347:::0;;:::o;13505:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13505:55:0;;-1:-1:-1;13505:55:0;;-1:-1:-1;13505:55:0:o;2572:80::-;2619:4;2639:7;;;2572:80;:::o;21528:28::-;;;;:::o;4890:122::-;4492:12;:10;:12::i;:::-;4482:6;;-1:-1:-1;;;;;4482:6:0;;;:22;;;4474:67;;;;;-1:-1:-1;;;4474:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4977:6:::1;::::0;::::1;4969::::0;;4948:36:::1;::::0;-1:-1:-1;;;;;4977:6:0;;::::1;::::0;::::1;4969::::0;;::::1;::::0;;::::1;::::0;4948:36:::1;::::0;::::1;5000:6;::::0;::::1;4991:15:::0;;-1:-1:-1;;;;;5000:6:0;;::::1;;4991:15;-1:-1:-1::0;;;;;;4991:15:0;;::::1;::::0;;;::::1;::::0;;4890:122::o;20758:92::-;20831:6;:13;20758:92;:::o;18993:175::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;19068:13:::1;:28:::0;;;19110:52:::1;::::0;;;;;19146:15:::1;19110:52;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;18993:175:::0;:::o;19174:181::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;19248:17:::1;:27:::0;;;19289:60:::1;::::0;;;;;19333:15:::1;19289:60;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;19174:181:::0;:::o;21344:51::-;;;;;;;;;;;;-1:-1:-1;;;;;21344:51:0;;:::o;16872:704::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;17028:16:::1;::::0;;17042:1:::1;17028:16:::0;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;16994:31:0;::::1;::::0;;:18:::1;:31:::0;;;;;;:50;;::::1;::::0;17028:16;16994:50:::1;:::i;:::-;-1:-1:-1::0;;;;;;17059:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:33;::::1;;17051:68;;;::::0;;-1:-1:-1;;;17051:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17051:68:0;;;;;;;;;;;;;::::1;;17131:7;17126:325;17148:19;:26;17144:1;:30;;;17126:325;;;17228:6;:13:::0;17198:26;;:43:::1;;17190:69;;;::::0;;-1:-1:-1;;;17190:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17190:69:0;;;;;;;;;;;;;::::1;;17286:12;:36;17299:19;17319:1;17299:22;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;17286:36:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;17286:36:0;:44;::::1;;17268:106;;;::::0;;-1:-1:-1;;;17268:106:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17268:106:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;17383:31:0;::::1;;::::0;;;:18:::1;:31;::::0;;;;17420:22;;:19;;:22:::1;::::0;::::1;::::0;;::::1;;;;;;::::0;;::::1;::::0;;;;;;;17383:60;;::::1;::::0;;::::1;::::0;;-1:-1:-1;17383:60:0;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;17383:60:0::1;-1:-1:-1::0;;;;;17383:60:0;;::::1;::::0;;;::::1;::::0;;;17176:3:::1;17126:325;;;-1:-1:-1::0;;;;;;17464:106:0;::::1;17508:31;::::0;;;:18:::1;:31;::::0;;;;;;;;17464:106;;17548:15:::1;17464:106:::0;;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;17508:31;;17548:15;17464:106;;;;;;17508:31;;17464:106;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;17464:106:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;;;;;;;;16872:704:::0;;:::o;13776:46::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13776:46:0;:::o;3769:21::-;;;;;;-1:-1:-1;;;;;3769:21:0;;:::o;22551:2078::-;2872:8;:6;:8::i;:::-;2871:9;2863:38;;;;;-1:-1:-1;;;2863:38:0;;;;;;;;;;;;-1:-1:-1;;;2863:38:0;;;;;;;;;;;;;;;22702:10:::1;-1:-1:-1::0;;;;;22702:29:0;::::1;;;22694:73;;;::::0;;-1:-1:-1;;;22694:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;22782:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;22774:73;;;::::0;;-1:-1:-1;;;22774:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;22937:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:39:::1;;::::0;22887:10:::1;22870:28:::0;;:16:::1;:28:::0;;;;;:42;;;;;;;;;;:54:::1;::::0;22917:6;22870:46:::1;:54::i;:::-;:106;;22854:182;;;;-1:-1:-1::0;;;22854:182:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23126:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:39:::1;;::::0;23076:10:::1;23059:28:::0;;:16:::1;:28:::0;;;;;:42;;;;;;;;;;:54:::1;::::0;23106:6;23059:46:::1;:54::i;:::-;:106;;23043:182;;;;-1:-1:-1::0;;;23043:182:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23299:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:40:::1;;::::0;23248:12:::1;:26:::0;;;;;;;:38:::1;::::0;23279:6;23248:30:::1;:38::i;:::-;:91;;23232:149;;;::::0;;-1:-1:-1;;;23232:149:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23441:15;23406:32;23424:13;;23406;;:17;;:32;;;;:::i;:::-;:50;23390:113;;;::::0;;-1:-1:-1;;;23390:113:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23557:10;23542:26;::::0;;;:14:::1;:26;::::0;;;;;;;:34:::1;::::0;::::1;23590:41:::0;;23542:96:::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;23645:35;;::::1;:46:::0;;;;::::1;::::0;;;;;;;;;;::::1;;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;;;::::0;;::::1;::::0;;23698:44;;-1:-1:-1;;;;;;23698:44:0;;::::1;::::0;;::::1;::::0;;23749:35:::1;::::0;::::1;:57:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;23749:57:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;23813:39:::1;::::0;::::1;:58:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;23878:36:::1;::::0;::::1;:58:::0;;;;::::1;::::0;;;;;;;;23920:15:::1;23878:58:::0;::::1;::::0;23981:39:::1;::::0;;::::1;:52:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;24069:26;;;:12:::1;:26:::0;;;;:38:::1;::::0;24026:6;24069:30:::1;:38::i;:::-;-1:-1:-1::0;;;;;24040:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:67;;;;24176:10:::1;24159:28:::0;;:16:::1;:28:::0;;;;;:56;;;;;;;;;:76:::1;::::0;24228:6;24159:68:::1;:76::i;:::-;24131:10;24114:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;24114:42:0;::::1;::::0;;;;;;;;;:121;;;;24307:68;;-1:-1:-1;;;24307:68:0;;::::1;::::0;::::1;::::0;;;;24361:4:::1;24307:68:::0;;;;;;;;;;;:33:::1;::::0;:68;;;;;;;;;;;;;24114:42;24307:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24307:68:0;24291:117:::1;;;::::0;;-1:-1:-1;;;24291:117:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24291:117:0;;;;;;;;;;;;;::::1;;24463:10;24483:26;::::0;;;:14:::1;:26;::::0;;;;:34:::1;;:41:::0;-1:-1:-1;;;;;24449:174:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;24483:48:::1;::::0;24529:1:::1;24483:45;:48::i;:::-;24449:174;::::0;;;;;::::1;::::0;::::1;::::0;;;24601:15:::1;24449:174:::0;;;;;;;;;;;;::::1;22551:2078:::0;;;:::o;13827:37::-;13858:6;13827:37;:::o;32916:2303::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33118:27:0;::::1;33170:1;33118:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;33159:7;;33118:49;::::1;;;;;;;;;;;;;:53;:119;;;;-1:-1:-1::0;;;;;;33184:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:36:::1;;:45:::0;;33221:7;;33184:45;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;33233:4;33184:53;;;33118:119;33102:205;;;;-1:-1:-1::0;;;33102:205:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;33458:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;33499:7;;33458:49;::::1;;;;;;;;;;;;;33361:14;:27;33376:11;-1:-1:-1::0;;;;;33361:27:0::1;-1:-1:-1::0;;;;;33361:27:0::1;;;;;;;;;;;;:40;;33402:7;33361:49;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;33354:100:::1;::::0;;-1:-1:-1;;;33354:100:0;;33440:4:::1;33354:100;::::0;::::1;::::0;;;-1:-1:-1;;;;;33361:49:0;;::::1;::::0;33354:67:::1;::::0;:100;;;;;;;;;;33361:49;33354:100;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33354:100:0;:153:::1;;33338:219;;;::::0;;-1:-1:-1;;;33338:219:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33588:27:0;::::1;33566:19;33588:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;33629:7;;33588:49;::::1;;;;;;;;;;;;;33566:71;;33692:5;33644:14;:27;33659:11;-1:-1:-1::0;;;;;33644:27:0::1;-1:-1:-1::0;;;;;33644:27:0::1;;;;;;;;;;;;:36;;33681:7;33644:45;;;;;;;;;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33756:1;33704:14;:27;33719:11;-1:-1:-1::0;;;;;33704:27:0::1;-1:-1:-1::0;;;;;33704:27:0::1;;;;;;;;;;;;:40;;33745:7;33704:49;;;;;;;;;;;;;;;:53;;;;33844:94;33920:11;33844:12;:63;33857:14;:27;33872:11;-1:-1:-1::0;;;;;33857:27:0::1;-1:-1:-1::0;;;;;33857:27:0::1;;;;;;;;;;;;:40;;33898:7;33857:49;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;33857:49:0::1;33844:63:::0;;;::::1;::::0;;;;;;;;;;:67:::1;:94::i;:::-;-1:-1:-1::0;;;;;33785:27:0;::::1;33764:77;33785:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;33764:12:::1;::::0;:77;33785:40;33826:7;;33785:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;33785:49:0;;::::1;33764:77:::0;;;;::::1;::::0;;;;;;;;;;:174;;;;33954:27;;::::1;::::0;;:14:::1;:27:::0;;;;:40:::1;;:49:::0;;33995:7;;33954:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;33947:113:::1;::::0;;-1:-1:-1;;;33947:113:0;;-1:-1:-1;;;;;33947:113:0;;::::1;;::::0;::::1;::::0;;;;;;;;;33954:49;;;::::1;::::0;33947:66:::1;::::0;:113;;;;;33954:49;;33947:113;;;;;;;;;33954:49;33947:113;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34074:9:0::1;::::0;-1:-1:-1;34069:952:0::1;34089:12;:19;34085:1;:23;34069:952;;;34194:6;34201:1;34194:9;;;;;;;;;;;;;;34149:12;34162:1;34149:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;34142:33:0::1;;34184:4;34142:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;34142:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34142:48:0;:61:::1;;34124:140;;;;-1:-1:-1::0;;;34124:140:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34273:21;34297:6;34304:1;34297:9;;;;;;;;;;;;;;34273:33;;34378:1;-1:-1:-1::0;;;;;34321:59:0::1;:14;:27;34336:11;-1:-1:-1::0;;;;;34321:27:0::1;-1:-1:-1::0;;;;;34321:27:0::1;;;;;;;;;;;;:36;;34358:7;34321:45;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;34321:45:0::1;:59;34317:626;;34393:17;34413:49;34452:9;34414:32;34432:13;;34414;:17;;:32;;;;:::i;34413:49::-;34393:69:::0;-1:-1:-1;34489:28:0::1;:13:::0;34393:69;34489:17:::1;:28::i;:::-;34473:44;;34557:12;34570:1;34557:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;34550:32:0::1;;34597:14;:27;34612:11;-1:-1:-1::0;;;;;34597:27:0::1;-1:-1:-1::0;;;;;34597:27:0::1;;;;;;;;;;;;:36;;34634:7;34597:45;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;34550:129:::1;::::0;;-1:-1:-1;;;;;;34550:129:0::1;::::0;;;;;;-1:-1:-1;;;;;34597:45:0;;::::1;34550:129;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34550:129:0;34530:202:::1;;;::::0;;-1:-1:-1;;;34530:202:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;34857:12;34870:1;34857:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;34750:183:0::1;34833:11;-1:-1:-1::0;;;;;34750:183:0::1;34775:14;:27;34790:11;-1:-1:-1::0;;;;;34775:27:0::1;-1:-1:-1::0;;;;;34775:27:0::1;;;;;;;;;;;;:36;;34812:7;34775:45;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;34750:183:::1;::::0;;;;;34907:15:::1;34750:183:::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;34775:45:0;;::::1;::::0;34750:183:::1;::::0;;;;;;;;;::::1;34317:626;;34960:12;34973:1;34960:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;34953:32:0::1;;34986:11;34999:13;34953:60;;;;;;;;;;;;;-1:-1:-1::0;;;;;34953:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;34110:3:0::1;;34069:952;;;-1:-1:-1::0;;;;;;35097:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;35138:7;;35097:49;::::1;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;35061:152:::1;::::0;;;;;35175:15:::1;35061:152:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;35097:49:0;;::::1;::::0;35061:152;;::::1;::::0;::::1;::::0;;;;;;;;::::1;4354:1;32916:2303:::0;;;;:::o;19929:470::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20078:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:33;::::1;;:70:::0;::::1;;;-1:-1:-1::0;;;;;;20115:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:33;::::1;;20078:70;20062:119;;;::::0;;-1:-1:-1;;;20062:119:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20062:119:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;20188:31:0;;::::1;;::::0;;;:18:::1;:31;::::0;;;;;;;:44;;::::1;::::0;;;;;;;;;;:53;;-1:-1:-1;;20188:53:0::1;::::0;::::1;;;::::0;;;;20255:138;;20188:53:::1;20318:44:::0;;::::1;20255:138;;::::0;;20371:15:::1;20255:138:::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;19929:470:::0;;;:::o;18133:854::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;18308:14:::1;:19;;18326:1;18308:19;:42;;;;18331:14;:19;;18349:1;18331:19;18308:42;:65;;;;18354:14;:19;;18372:1;18354:19;18308:65;18292:122;;;::::0;;-1:-1:-1;;;18292:122:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;18429:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;:42;;:34:::0;:42:::1;18421:70;;;::::0;;-1:-1:-1;;;18421:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18421:70:0;;;;;;;;;;;;;::::1;;18504:14;:19;;18522:1;18504:19;18500:295;;;18576:31;:15;18596:10:::0;18576:19:::1;:31::i;:::-;-1:-1:-1::0;;;;;18534:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:39:::1;:73:::0;18500:295:::1;;;18625:14;:19;;18643:1;18625:19;18621:174;;;-1:-1:-1::0;;;;;18646:26:0;::::1;18688:1;18646:26:::0;;;:12:::1;:26;::::0;;;;;;:39:::1;:43:::0;18621:174:::1;;;18705:14;:19;;18723:1;18705:19;18701:94;;;-1:-1:-1::0;;;;;18733:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:43:::1;;:62:::0;;-1:-1:-1;;18733:62:0::1;::::0;::::1;;;::::0;;18701:94:::1;-1:-1:-1::0;;;;;18809:172:0;::::1;18859:26;::::0;;;:12:::1;:26;::::0;;;;;;;;:39;;::::1;::::0;18907:43:::1;::::0;;::::1;::::0;18809:172;;;;;18907:43:::1;;18809:172;;::::0;;::::1;::::0;18959:15:::1;18809:172:::0;;;;;;::::1;::::0;;;;;;;::::1;18133:854:::0;;;;:::o;16070:796::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;16278:11:::1;:18;16256:11;:18;:40;:99;;;;;16331:17;:24;16309:11;:18;:46;16256:99;16240:146;;;::::0;;-1:-1:-1;;;16240:146:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16240:146:0;;;;;;;;;;;;;::::1;;16400:7;16395:466;16417:11;:18;16413:1;:22;;;16395:466;;;16469:12;:28;16482:11;16494:1;16482:14;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;16469:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;16469:28:0;:36;::::1;;:87:::0;::::1;;;;16520:12;:28;16533:11;16545:1;16533:14;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;16520:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;16520:28:0;:36;::::1;;16469:87;16451:142;;;::::0;;-1:-1:-1;;;16451:142:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16451:142:0;;;;;;;;;;;;;::::1;;16677:17;16695:1;16677:20;;;;;;;;;;;;;;;;16602:22;:38;16625:11;16637:1;16625:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;16602:38:0::1;-1:-1:-1::0;;;;;16602:38:0::1;;;;;;;;;;;;:72;16651:11;16663:1;16651:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;16602:72:0::1;-1:-1:-1::0;;;;;16602:72:0::1;;;;;;;;;;;;:95;;;;16773:11;16785:1;16773:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;16713:140:0::1;16748:11;16760:1;16748:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;16713:140:0::1;;16798:17;16816:1;16798:20;;;;;;;;;;;;;;;;16829:15;16713:140;;;;;;;;;;;;;;;;;;;;;;;;16437:3;;16395:466;;;;16070:796:::0;;;:::o;17582:545::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17746:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;17738:62;;;::::0;;-1:-1:-1;;;17738:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17738:62:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;17807:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;;:39:::1;::::0;::::1;:54:::0;;;17868:39:::1;::::0;::::1;:54:::0;;;17929:40:::1;;:53:::0;;;17996:125;;;;;;;::::1;::::0;;;;;;;;;18099:15:::1;17996:125:::0;;;;;;::::1;::::0;;;;;;;::::1;17582:545:::0;;;;:::o;30807:2103::-;30909:4;2872:8;:6;:8::i;:::-;2871:9;2863:38;;;;;-1:-1:-1;;;2863:38:0;;;;;;;;;;;;-1:-1:-1;;;2863:38:0;;;;;;;;;;;;;;;30941:10:::1;-1:-1:-1::0;;;;;30941:25:0;::::1;;::::0;:49:::1;;-1:-1:-1::0;30984:6:0::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;30984:6:0::1;30970:10;:20;30941:49;30925:110;;;::::0;;-1:-1:-1;;;30925:110:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;31066:27:0;::::1;31044:19;31066:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;31107:7;;31066:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;31066:49:0::1;31167:25:::0;;;:12:::1;:25:::0;;;;;;;;:38:::1;::::0;31066:49;;-1:-1:-1;31209:15:0::1;-1:-1:-1::0;31167:57:0::1;31151:112;;;::::0;;-1:-1:-1;;;31151:112:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31151:112:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;31304:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:42:::1;;::::0;::::1;;31300:222;;;31453:15;31373:65;31424:13;;31373:14;:27;31388:11;-1:-1:-1::0;;;;;31373:27:0::1;-1:-1:-1::0;;;;;31373:27:0::1;;;;;;;;;;;;:37;;31411:7;31373:46;;;;;;;;;;;;;;;;:50;;:65;;;;:::i;:::-;:95;;31355:167;;;::::0;;-1:-1:-1;;;31355:167:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;31562:27:0;::::1;31614:1;31562:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;31603:7;;31562:49;::::1;;;;;;;;;;;;;:53;:119;;;-1:-1:-1::0;;;;;;31628:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:36:::1;;:45:::0;;31665:7;;31628:45;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;31677:4;31628:53;;;31562:119;31546:203;;;;-1:-1:-1::0;;;31546:203:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;31804:27:0;::::1;31781:20;31804:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;31845:7;;31804:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;31884:25:0;::::1;::::0;;:12:::1;:25:::0;;;;;;;;31804:49;;-1:-1:-1;31944:43:0::1;31884:25:::0;31804:49;31944:29:::1;:43::i;:::-;-1:-1:-1::0;;;;;31916:25:0;;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;:71;;;;32039:29;;::::1;::::0;;:16:::1;:29:::0;;;;;:56;;;;;;;:82:::1;::::0;32108:12;32039:68:::1;:82::i;:::-;-1:-1:-1::0;;;;;31994:29:0;;::::1;;::::0;;;:16:::1;:29;::::0;;;;;;;:42;;::::1;::::0;;;;;;;;:127;;;;32128:27;;;:14:::1;:27:::0;;;;;:40:::1;;:49:::0;;32169:7;;32128:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;:53:::0;;;;-1:-1:-1;;;;;32188:27:0;::::1;::::0;;:14:::1;:27:::0;;;;;;:36:::1;;:45:::0;;32225:7;;32188:45;::::1;;;;;;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32392:12;32295:14;:27;32310:11;-1:-1:-1::0;;;;;32295:27:0::1;-1:-1:-1::0;;;;;32295:27:0::1;;;;;;;;;;;;:40;;32336:7;32295:49;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;32288:100:::1;::::0;;-1:-1:-1;;;32288:100:0;;32374:4:::1;32288:100;::::0;::::1;::::0;;;-1:-1:-1;;;;;32295:49:0;;::::1;::::0;32288:67:::1;::::0;:100;;;;;;;;;;32295:49;32288:100;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32288:100:0;:116:::1;;32272:180;;;::::0;;-1:-1:-1;;;32272:180:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;32511:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;32552:7;;32511:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;32504:114:::1;::::0;;-1:-1:-1;;;32504:114:0;;-1:-1:-1;;;;;32504:114:0;;::::1;;::::0;::::1;::::0;;;;;;;;;32511:49;;;::::1;::::0;32504:66:::1;::::0;:114;;;;;32511:49;;32504:114;;;;;;;;;32511:49;32504:114;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32627:63:0::1;::::0;-1:-1:-1;32640:11:0;32653:7;32662:12;32676:13;32627:12:::1;:63::i;:::-;-1:-1:-1::0;;;;;32767:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;32808:7;;32767:49;::::1;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;32731:153:::1;::::0;;;;;32846:15:::1;32731:153:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;32767:49:0;;::::1;::::0;32731:153;;::::1;::::0;::::1;::::0;;;;;;;;::::1;32900:4;32893:11;;;;;2908:1;30807:2103:::0;;;;:::o;13565:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21476:47::-;;;;;;;;;;;;;:::o;13946:28::-;;;;:::o;5157:230::-;4298:12;:10;:12::i;:::-;4288:6;;;;;-1:-1:-1;;;;;4288:6:0;;;:22;;;4280:67;;;;;-1:-1:-1;;;4280:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4280:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;5242:22:0;::::1;5234:73;;;;-1:-1:-1::0;;;5234:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5340:6;::::0;;5319:38:::1;::::0;-1:-1:-1;;;;;5319:38:0;;::::1;::::0;5340:6:::1;::::0;;::::1;;::::0;5319:38:::1;::::0;::::1;5364:6;:17:::0;;-1:-1:-1;;;;;5364:17:0;;::::1;;;-1:-1:-1::0;;;;;;5364:17:0;;::::1;::::0;;;::::1;::::0;;5157:230::o;13869:39::-;13901:7;13869:39;:::o;1212:100::-;1296:10;1212:100;:::o;8440:126::-;8498:7;8521:39;8525:1;8528;8521:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8514:46;8440:126;-1:-1:-1;;;8440:126:0:o;7559:431::-;7617:7;7846:6;7842:37;;-1:-1:-1;7870:1:0;7863:8;;7842:37;7899:5;;;7903:1;7899;:5;:1;7919:5;;;;;:10;7911:56;;;;-1:-1:-1;;;7911:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6713:130;6771:7;6794:43;6798:1;6801;6794:43;;;;;;;;;;;;;;;;;:3;:43::i;6285:167::-;6343:7;6371:5;;;6391:6;;;;6383:46;;;;;-1:-1:-1;;;6383:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24785:738;24952:16;24975:19;25014:32;25032:13;;25014;;:17;;:32;;;;:::i;:::-;25003:43;;25099:15;25088:8;:26;25084:119;;;-1:-1:-1;25130:15:0;25084:119;;;25189:13;;25171;;:32;;:17;:32::i;:::-;25157:46;;25084:119;-1:-1:-1;;;;;25239:27:0;;;;;;:14;:27;;;;;:37;;:46;;25223:63;;25239:37;25277:7;;25239:46;;;;;;;;;;;;;;25223:11;:15;;:63;;;;:::i;:::-;25212:74;;25293:27;;:::i;:::-;25327:29;;;:12;25363;;:27;;;13901:7;25430:17;;25426:91;;25456:61;25475:11;25488:7;25497:9;25508:8;25456:18;:61::i;:::-;24785:738;;;;;;;:::o;9036:197::-;9142:7;9173:12;9166:5;9158:28;;;;-1:-1:-1;;;9158:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9193:9;9209:1;9205;:5;;;;;;;9036:197;-1:-1:-1;;;;;9036:197:0:o;7124:198::-;7230:7;7262:12;7254:6;;;;7246:29;;;;-1:-1:-1;;;7246:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7294:5:0;;;7124:198::o;25529:3384::-;25685:21;25713:17;25737:26;;:::i;:::-;25786:19;:8;13901:7;25786:12;:19::i;:::-;25772:11;;;:33;25826:18;:8;13858:6;25826:12;:18::i;:::-;25812:32;;25919:14;;-1:-1:-1;;;;;25944:27:0;;25821:1;25944:27;;;:14;25812:11;25944:27;;;;:40;;:49;;25869:225;;25893:194;;25919:14;;25985:7;;25944:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26004:27:0;;;;;:14;:27;;;;;;;:40;;:49;;25944;;;;;26004:40;26045:7;;26004:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26004:49:0;26064:11;26004:49;26064:14;;;;;25893:15;:194::i;:::-;25869:11;;;;;:15;:225::i;:::-;-1:-1:-1;;;;;26132:27:0;;26189:1;26132:27;;;:14;:27;;;;;:36;;:45;;25853:241;;-1:-1:-1;26189:1:0;;26169:7;;26132:45;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26132:45:0;:59;26128:647;;26214:49;26253:9;26215:32;26233:13;;26215;:17;;:32;;;;:::i;26214:49::-;26202:61;-1:-1:-1;26288:28:0;:13;26202:61;26288:17;:28::i;:::-;-1:-1:-1;;;;;26352:27:0;;;;;;:14;:27;;;;;:40;;:49;;26272:44;;-1:-1:-1;26352:40:0;26393:7;;26352:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26424:27:0;;;;;:14;:27;;;;;;;:36;;:45;;26352:49;;;;;26345:66;;26461:7;;26424:45;;;;;;;;;;;;;;;;;;26345:157;;;-1:-1:-1;;;;;;26345:157:0;;;;;;;-1:-1:-1;;;;;26424:45:0;;;26345:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26345:157:0;:165;;26506:4;26345:165;26327:220;;;;;-1:-1:-1;;;26327:220:0;;;;;;;;;;;;-1:-1:-1;;;26327:220:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26663:27:0;;;;;;:14;:27;;;;;:40;;:49;;26704:7;;26663:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26586:27:0;;;;;:14;:27;;;;;;;:36;;:45;;26663:49;;;;;26642:10;;26623:7;;26586:45;;;;;;;;;;;;;;;;;26563:204;;;;;;26743:15;26563:204;;;;;;;;;-1:-1:-1;;;;;26586:45:0;;;;26563:204;;;;;;;;;;;26128:647;-1:-1:-1;;;;;26843:27:0;;;;;;:14;:27;;;;;:40;;:49;;26805:174;;26823:11;;26884:7;;26843:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26901:27:0;;;;;:14;:27;;;;;;;:40;;:49;;26843;;;;;26901:40;26942:7;;26901:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26901:49:0;26959:13;26805:9;:174::i;:::-;26998:1;27008:1900;27019:12;:19;27015:23;;;;27008:1900;;;27068:12;27081:1;27068:15;;;;;;;;;;;;;;;;;;;;27053:11;;:30;27049:1852;;27096:22;27121:32;27150:2;27122:22;27142:1;27122:12;27135:1;27122:15;;;;;;;;;;;;;;;;;;:19;;:22;;;;:::i;:::-;27121:28;;:32::i;:::-;27096:57;-1:-1:-1;27164:16:0;27183:31;27096:57;27183:8;27192:1;27183:11;;;;;:15;:31::i;:::-;27164:50;;27227:19;27260:18;:69;27279:14;:27;27294:11;-1:-1:-1;;;;;27279:27:0;-1:-1:-1;;;;;27279:27:0;;;;;;;;;;;;:40;;27320:7;27279:49;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27279:49:0;27260:69;;;;;;;;;;;;:98;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27402:27:0;;;;;:14;:27;;;;;;;:40;;:49;;27260:98;;;;;-1:-1:-1;27443:7:0;;27402:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27387:64:0;;;27402:49;;27387:64;;;;:207;;-1:-1:-1;;;;;;27485:27:0;;27466:69;27485:27;;;:14;:27;;;;;:40;;:49;;27466:18;;:69;27485:40;27526:7;;27485:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27485:49:0;;;27466:69;;;;;;;;;;;;;;;:108;;;;;;;;;;;;;;:128;27387:207;27371:1469;;;27694:14;;-1:-1:-1;;;;;27725:27:0;;27706:1;27725:27;;;:14;27694;27725:27;;;;:40;;:49;;27635:226;;27662:186;;27694:14;;27766:7;;27725:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27725:49:0;27791:11;27819;27725:49;27819:14;;27662:186;27635:8;;:12;:226::i;:::-;-1:-1:-1;;;;;27913:27:0;;27970:1;27913:27;;;:14;:27;;;;;:36;;:45;;27619:242;;-1:-1:-1;27970:1:0;;27950:7;;27913:45;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27913:45:0;:59;27909:711;;28001:49;28040:9;28002:32;28020:13;;28002;:17;;:32;;;;:::i;28001:49::-;27989:61;-1:-1:-1;28081:28:0;:13;27989:61;28081:17;:28::i;:::-;28065:44;;28157:11;-1:-1:-1;;;;;28150:28:0;;28197:14;:27;28212:11;-1:-1:-1;;;;;28197:27:0;-1:-1:-1;;;;;28197:27:0;;;;;;;;;;;;:36;;28234:7;28197:45;;;;;;;;;;;;;;;;;;;;28150:137;;;-1:-1:-1;;;;;;28150:137:0;;;;;;;-1:-1:-1;;;;;28197:45:0;;;28150:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28150:137:0;:145;;28291:4;28150:145;28126:218;;;;;-1:-1:-1;;;28126:218:0;;;;;;;;;;;;-1:-1:-1;;;28126:218:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28484:27:0;;;;;;:14;:27;;;;;:40;;:49;;28525:7;;28484:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28395:27:0;;;;;:14;:27;;;;;;;:36;;:45;;28484:49;;;;;28457:10;;28432:7;;28395:45;;;;;;;;;;;;;;;;;28366:240;;;;;;28576:15;28366:240;;;;;;;;;-1:-1:-1;;;;;28395:45:0;;;;28366:240;;;;;;;;;;;27909:711;-1:-1:-1;;;;;28712:27:0;;;;;;:14;:27;;;;;:40;;:49;;28662:166;;28686:11;;28753:7;;28712:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28712:49:0;28776:11;28802:13;28662:9;:166::i;:::-;28854:1;28858;28854:5;28850:9;;27049:1852;;;;;;28886:5;;27049:1852;27008:1900;;;25529:3384;;;;;;;;:::o;30061:644::-;-1:-1:-1;;;;;30220:26:0;;;30216:484;;30324:6;30282:12;-1:-1:-1;;;;;30275:30:0;;30314:4;30275:45;;;;;;;;;;;;;-1:-1:-1;;;;;30275:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30275:45:0;:55;;30257:122;;;;;-1:-1:-1;;;30257:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30443:12;-1:-1:-1;;;;;30436:29:0;;30466:11;30479:6;30436:50;;;;;;;;;;;;;-1:-1:-1;;;;;30436:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30436:50:0;30418:105;;;;;-1:-1:-1;;;30418:105:0;;;;;;;;;;;;-1:-1:-1;;;30418:105:0;;;;;;;;;;;;;;;30628:12;-1:-1:-1;;;;;30568:124:0;30606:11;-1:-1:-1;;;;;30568:124:0;30584:11;-1:-1:-1;;;;;30568:124:0;;30651:6;30668:15;30568:124;;;;;;;;;;;;;;;;;;;;;;;;30061:644;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://9766f25595198a5e103f2bf86589b26aed0a3a46ab7bdbeafe1e01f0a5e28a3f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.001402 | 100 | $0.1401 |
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.