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 99 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Liquidity An... | 12148021 | 1378 days ago | IN | 0 ETH | 0.03054907 | ||||
Active | 12148002 | 1378 days ago | IN | 0 ETH | 0.01256294 | ||||
Deposit | 12147919 | 1378 days ago | IN | 0 ETH | 0.0224476 | ||||
Active | 12147909 | 1378 days ago | IN | 0 ETH | 0.01108387 | ||||
Deposit | 12147885 | 1378 days ago | IN | 0 ETH | 0.02209719 | ||||
Active | 12147835 | 1378 days ago | IN | 0 ETH | 0.01207515 | ||||
Set Reward | 12147738 | 1378 days ago | IN | 0 ETH | 0.01456561 | ||||
Active | 12147646 | 1378 days ago | IN | 0 ETH | 0.01251834 | ||||
Finish | 12145308 | 1378 days ago | IN | 0 ETH | 0.0372057 | ||||
Redeem | 11973034 | 1405 days ago | IN | 0 ETH | 0.01005104 | ||||
Redeem | 11973032 | 1405 days ago | IN | 0 ETH | 0.00997961 | ||||
Redeem | 11973028 | 1405 days ago | IN | 0 ETH | 0.00864431 | ||||
Redeem | 11973024 | 1405 days ago | IN | 0 ETH | 0.00948766 | ||||
Redeem | 11973022 | 1405 days ago | IN | 0 ETH | 0.00990933 | ||||
Redeem | 11973014 | 1405 days ago | IN | 0 ETH | 0.00962822 | ||||
Redeem | 11973007 | 1405 days ago | IN | 0 ETH | 0.00885515 | ||||
Redeem | 11973004 | 1405 days ago | IN | 0 ETH | 0.00892543 | ||||
Redeem | 11972996 | 1405 days ago | IN | 0 ETH | 0.01026073 | ||||
Redeem | 11972995 | 1405 days ago | IN | 0 ETH | 0.01019045 | ||||
Redeem | 11972992 | 1405 days ago | IN | 0 ETH | 0.01024149 | ||||
Redeem | 11972987 | 1405 days ago | IN | 0 ETH | 0.00897013 | ||||
Redeem | 11972983 | 1405 days ago | IN | 0 ETH | 0.00847572 | ||||
Redeem | 11972974 | 1405 days ago | IN | 0 ETH | 0.00995897 | ||||
Redeem | 11972952 | 1405 days ago | IN | 0 ETH | 0.0088995 | ||||
Redeem | 11972768 | 1405 days ago | IN | 0 ETH | 0.00919821 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11939746 | 1410 days ago | 2 ETH | ||||
11939015 | 1410 days ago | 3.5 ETH | ||||
11938436 | 1410 days ago | 30 ETH | ||||
11938199 | 1410 days ago | 0.4 ETH | ||||
11938192 | 1410 days ago | 1.5 ETH | ||||
11938063 | 1410 days ago | 0.4 ETH | ||||
11937846 | 1410 days ago | 17.5 ETH | ||||
11937028 | 1410 days ago | 3 ETH | ||||
11936900 | 1410 days ago | 1.6 ETH | ||||
11936800 | 1410 days ago | 0.4925 ETH | ||||
11936777 | 1410 days ago | 1.65 ETH | ||||
11936777 | 1410 days ago | 1.65 ETH | ||||
11936725 | 1410 days ago | 0.4 ETH | ||||
11936633 | 1410 days ago | 0.2 ETH | ||||
11936630 | 1410 days ago | 0.2 ETH | ||||
11936508 | 1410 days ago | 0.9 ETH | ||||
11935986 | 1410 days ago | 1.5 ETH | ||||
11935747 | 1410 days ago | 3 ETH | ||||
11935689 | 1410 days ago | 0.7 ETH | ||||
11935308 | 1410 days ago | 50 ETH | ||||
11935236 | 1410 days ago | 6.5 ETH | ||||
11934794 | 1410 days ago | 1 ETH | ||||
11934794 | 1410 days ago | 1 ETH | ||||
11934729 | 1410 days ago | 1 ETH | ||||
11934663 | 1410 days ago | 4.5 ETH |
Loading...
Loading
Contract Name:
PairPairX
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-26 */ // SPDX-License-Identifier: MIT pragma solidity ^0.6.6; pragma experimental ABIEncoderV2; interface IPairXCore { // 向池子中存入资产 function deposit( address token , address to , uint amount ) external ; // 取回指定的Token资产及奖励 function claim( address token ) external returns (uint amount) ; // 提取PairX的挖矿奖励,可以提取当前已解锁的份额 function redeem(address token ) external returns (uint amount ) ; /** * 结束流动性挖矿 */ function finish() external ; } interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } interface IStakingRewards { // Views function lastTimeRewardApplicable() external view returns (uint256); function rewardPerToken() external view returns (uint256); function earned(address account) external view returns (uint256); function getRewardForDuration() external view returns (uint256); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); // Mutative function stake(uint256 amount) external; function withdraw(uint256 amount) external; function getReward() external; function exit() external; event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); event RewardAdded(uint256 reward); } /** * @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; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @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); } // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } contract PairPairX is IPairXCore { using SafeMath for uint256; address public Owner; uint8 public Fee = 10; address public FeeTo; uint256 private MinToken0Deposit; uint256 private MinToken1Deposit; // for pairx address public RewardToken; // Reward Token uint256 public RewardAmount; uint8 public Status = 0; // 0 = not init , 1 = open , 2 = locked , 9 = finished // uint public MaxLockDays = 365 ; uint256 public RewardBeginTime = 0; // 开始PairX计算日期,在addLiquidityAndStake时设置 uint256 public DepositEndTime = 0; // 存入结束时间 uint256 public StakeEndTime = 0; address public UniPairAddress; // 配对奖励Token address address public MainToken; // stake and reward token address public Token0; // Already sorted . address public Token1; TokenRecord Token0Record; TokenRecord Token1Record; address public StakeAddress; // // uint StakeAmount ; uint RewardGottedTotal ; //已提现总数 mapping(address => mapping(address => uint256)) UserBalance; // 用户充值余额 UserBalance[sender][token] mapping(address => mapping(address => uint256)) RewardGotted; // RewardGotted[sender][token] event Deposit(address from, address to, address token, uint256 amount); event Claim( address from, address to, address token, uint256 principal, uint256 interest, uint256 reward ); struct TokenRecord { uint256 total; // 存入总代币计数 uint256 reward; // 分配的总奖励pairx,默认先分配40%,最后20%根据规则分配 uint256 compensation; // PairX补贴额度,默认为0 uint256 stake; // lon staking token uint256 withdraw; // 可提现总量,可提现代币需要包含挖矿奖励部分 uint256 mint; // 挖矿奖励 } modifier onlyOwner() { require(msg.sender == Owner, "no role."); _; } modifier isActive() { require(block.timestamp < StakeEndTime, "Mining was expired."); require(Status == 1, "Not open."); _; } constructor(address owner) public { Owner = owner; } function active( address feeTo, address pair, address main, address stake, uint256 stakeEndTime ) external onlyOwner { FeeTo = feeTo; UniPairAddress = pair; MainToken = main; // 通过接口读取token0和token1的值 IUniswapV2Pair uni = IUniswapV2Pair(UniPairAddress); Token0 = uni.token0(); Token1 = uni.token1(); StakeEndTime = stakeEndTime; //按秒计算,不再按天计算了 StakeAddress = stake; } /** * deposit reward-tokens (PairX token). */ function setReward( address reward, uint256 amount, uint256 token0min, uint256 token1min, uint256 depositEndTime ) external onlyOwner { RewardToken = reward; TransferHelper.safeTransferFrom( reward, msg.sender, address(this), amount ); RewardAmount = RewardAmount.add(amount); MinToken0Deposit = token0min; MinToken1Deposit = token1min; Status = 1; //update TokenRecord uint256 defaultReward = RewardAmount.mul(4).div(10); Token0Record.reward = defaultReward; Token1Record.reward = defaultReward; DepositEndTime = depositEndTime; } function tokenRecordInfo(address token) external view returns ( uint256 free, uint256 total, uint256 reward, uint256 stake, uint256 withdraw ) { if (token == Token0) { // free = _tokenBalance(Token0); free = Token0Record.withdraw ; total = Token0Record.total; reward = Token0Record.reward; stake = Token0Record.stake; withdraw = Token0Record.withdraw; } else { // free = _tokenBalance(Token1); free = Token1Record.withdraw ; total = Token1Record.total; reward = Token1Record.reward; stake = Token1Record.stake; withdraw = Token1Record.withdraw; } } function info() external view returns ( // address owner , uint8 fee , address feeTo , uint minToken0Deposit , uint minToken1Deposit , address rewardToken , uint rewardAmount , uint8 status , uint stakeEndTime , address token0 , address token1 , address pair , address mainToken , uint rewardBeginTime , uint depositEndTime ) { minToken0Deposit = MinToken0Deposit ; minToken1Deposit = MinToken1Deposit ; rewardToken = RewardToken ; rewardAmount = RewardAmount ; status = Status ; stakeEndTime = StakeEndTime ; token0 = Token0 ; token1 = Token1 ; mainToken = MainToken ; pair = UniPairAddress ; rewardBeginTime = RewardBeginTime ; depositEndTime = DepositEndTime ; } function depositInfo( address sender , address token ) external view returns ( uint depositBalance ,uint depositTotal , uint leftDays , uint lockedReward , uint freeReward , uint gottedReward ) { depositBalance = UserBalance[sender][token] ; if( token == Token0 ) { depositTotal = Token0Record.total ; } else { depositTotal = Token1Record.total ; } // rewardTotal = RewardTotal[sender] ; if( sender != address(0) ){ ( leftDays , lockedReward , freeReward , gottedReward ) = getRewardRecord( token , sender ) ; } else { leftDays = 0 ; lockedReward = 0 ; freeReward = 0 ; gottedReward = 0 ; } } function getRewardRecord(address token , address sender ) public view returns ( uint leftDays , uint locked , uint free , uint gotted ) { uint nowDate = getDateTime( block.timestamp ) ; //计算一共可提取的奖励 uint depositAmount = UserBalance[sender][token] ; TokenRecord memory record = token == Token0 ? Token0Record : Token1Record ; leftDays = _leftDays( StakeEndTime , nowDate ) ; locked = 0 ; free = 0 ; gotted = 0 ; if( depositAmount == 0 ) { return ( leftDays , 0 , 0 , 0 ); } if( record.reward == 0 ) { return ( leftDays , 0 , 0 , 0 ); } gotted = RewardGotted[sender][token] ; //换个计算方法,计算每秒可获得的收益 uint lockedTimes = _leftDays( StakeEndTime , RewardBeginTime ) ; uint oneTimeReward = record.reward.div( lockedTimes ) ; uint freeTime ; if( nowDate > StakeEndTime ) { leftDays = 0 ; locked = 0 ; freeTime = lockedTimes ; } else { leftDays = _leftDays( StakeEndTime , nowDate ) ; freeTime = lockedTimes.sub( leftDays ) ; } // 防止溢出,保留3位精度 uint maxReward = depositAmount.mul( oneTimeReward ).div(1e15) .mul( lockedTimes ).div( record.total.div(1e15) ); if( Status == 2 ) { free = depositAmount.mul( oneTimeReward ).div(1e15) .mul( freeTime ).div( record.total.div(1e15) ); if( free.add(gotted) > maxReward ){ locked = 0 ; } else { locked = maxReward.sub( free ).sub( gotted ) ; } } else if ( Status == 9 ) { free = maxReward.sub( gotted ) ; locked = 0 ; } else if ( Status == 1 ) { free = 0 ; locked = maxReward ; } else { free = 0 ; locked = 0 ; } } function getDateTime( uint timestamp ) public pure returns ( uint ) { // timeValue = timestamp ; return timestamp ; } function _sendReward( address to , uint amount ) internal { //Give reward tokens . uint balance = RewardAmount.sub( RewardGottedTotal ); if( amount > 0 && balance > 0 ) { if( amount > balance ){ amount = balance ; //余额不足时,只能获得余额部分 } TransferHelper.safeTransfer( RewardToken , to , amount ) ; // RewardAmount = RewardAmount.sub( amount ) ; 使用balanceOf 确定余额 } } function _deposit(address sender , address token , uint amount ) internal { if( token == Token0 ) { require( amount > MinToken0Deposit , "Deposit tokens is too less." ) ; } if( token == Token1 ) { require( amount > MinToken1Deposit , "Deposit tokens is too less." ) ; } if( token == Token0 ) { Token0Record.total = Token0Record.total.add( amount ) ; Token0Record.withdraw = Token0Record.total ; } if( token == Token1 ) { Token1Record.total = Token1Record.total.add( amount ) ; Token1Record.withdraw = Token1Record.total ; } UserBalance[sender][token] = UserBalance[sender][token].add(amount ); } function _fee( uint amount ) internal returns ( uint fee ) { fee = amount.mul( Fee ).div( 100 ) ; if( fee > 0 ) { _safeTransfer( MainToken , FeeTo , fee ) ; } } function _leftDays(uint afterDate , uint beforeDate ) internal pure returns( uint ) { if( afterDate <= beforeDate ) { return 0 ; } else { return afterDate.sub(beforeDate ) ; // 将由天计算改为由秒计算 //return afterDate.sub(beforeDate).div( OneDay ) ; } } /* * 向池子中存入资产, 目前该接口只支持erc20代币. * 如果需要使用eth,会在前置合约进行处理,将eth兑换成WETH */ function deposit( address token , address to , uint amount ) public override isActive { require( Status == 1 , "Not allow deposit ." ) ; require( (token == Token0) || ( token == Token1) , "Match token faild." ) ; // More gas , But logic will more easy. if( token == MainToken ){ TransferHelper.safeTransferFrom( token , msg.sender , address(this) , amount ) ; } else { // 兑换 weth IWETH( token ).deposit{ value : amount }() ; } _deposit( to , token , amount ) ; emit Deposit( to, address(this) , token , amount ) ; } /** * 提取可提现的奖励Token */ function redeem(address token ) public override returns ( uint amount ) { require( Status == 2 || Status == 9 , "Not finished." ) ; address sender = msg.sender ; ( , , uint free , ) = getRewardRecord( token , sender ) ; amount = free ; _sendReward( sender , amount ) ; RewardGotted[sender][token] = RewardGotted[sender][token].add( amount ) ; RewardGottedTotal = RewardGottedTotal.add( amount ) ; } // redeem all , claim from tokenlon , and removeLiquidity from uniswap // 流程结束 function finish() external override onlyOwner { // require(block.timestamp >= StakeEndTime , "It's not time for redemption." ) ; // redeem liquidity from staking contracts IStakingRewards staking = IStakingRewards(StakeAddress) ; // uint stakeBalance = staking.balanceOf( address(this) ) ; //计算MainToken余额变化,即挖矿Token的余额变化,获取收益 uint beforeExit = _tokenBalance( MainToken ); staking.exit() ; uint afterExit = _tokenBalance( MainToken ); uint interest = afterExit.sub( beforeExit ) ; // remove liquidity IUniswapV2Pair pair = IUniswapV2Pair( UniPairAddress ) ; uint liquidityBalance = pair.balanceOf( address(this) ) ; TransferHelper.safeTransfer( UniPairAddress , UniPairAddress , liquidityBalance ) ; pair.burn( address(this) ) ; //计算剩余本金 uint mainTokenBalance = _tokenBalance( MainToken ) ; uint principal = mainTokenBalance.sub( interest ).sub( RewardAmount ).add( RewardGottedTotal ) ; // 收取 interest 的 10% 作为管理费 uint fee = _fee( interest ) ; uint interestWithoutFee = interest - fee ; //判断无偿损失 // 判断Token0是否受到了无偿损失影响 TokenRecord memory mainRecord = MainToken == Token0 ? Token0Record : Token1Record ; uint mainTokenRate = 5 ; uint pairTokenRate = 5 ; //各50%的收益,不需要补偿无偿损失的一方 if( mainRecord.total > principal ) { // 有无偿损失 uint diff = mainRecord.total - principal ; uint minDiff = mainRecord.total.div( 10 ) ; // 10%的损失 if( diff > minDiff ) { //满足补贴条件 mainTokenRate = 6 ; pairTokenRate = 4 ; } } else { // 计算另一个token的是否满足补偿条件 TokenRecord memory pairRecord = MainToken == Token0 ? Token1Record : Token0Record ; //获取配对Token的余额 address pairToken = Token0 == MainToken ? Token1 : Token0 ; //TODO 二池因为奖励token和挖矿token属于同一token,所以这里通过余额计算会存在问题,需要调整 uint pairTokenBalance = _tokenBalance( pairToken ) ; uint diff = pairRecord.total - pairTokenBalance ; uint minDiff = pairRecord.total.div(10) ; if( diff > minDiff ) { pairTokenRate = 6 ; mainTokenRate = 4 ; } } ( uint token0Rate , uint token1Rate ) = Token0 == MainToken ? ( mainTokenRate , pairTokenRate) : ( pairTokenRate , mainTokenRate ) ; Token0Record.reward = RewardAmount.mul( token0Rate ).div( 10 ) ; Token1Record.reward = RewardAmount.mul( token1Rate ).div( 10 ) ; Token0Record.mint = interestWithoutFee.mul( token0Rate ).div( 10 ) ; Token1Record.mint = interestWithoutFee.mul( token1Rate ).div( 10 ) ; // 设置为挖矿结束 Status = 9 ; } /** * 添加流动性并开始挖矿时 * 1、不接收继续存入资产。 * 2、开始计算PairX的挖矿奖励,并线性释放。 */ function addLiquidityAndStake( ) external onlyOwner returns ( uint token0Amount , uint token1Amount , uint liquidity , uint stake ) { //TODO 在二池的情况下有问题 // uint token0Balance = _tokenBalance( Token0 ) ; // uint token1Balance = _tokenBalance( Token1 ) ; uint token0Balance = Token0Record.total ; uint token1Balance = Token1Record.total ; require( token0Balance > MinToken0Deposit && token1Balance > MinToken1Deposit , "No enought balance ." ) ; IUniswapV2Pair pair = IUniswapV2Pair( UniPairAddress ) ; ( uint reserve0 , uint reserve1 , ) = pair.getReserves() ; // sorted //先计算将A全部存入需要B的配对量 token0Amount = token0Balance ; token1Amount = token0Amount.mul( reserve1 ) /reserve0 ; if( token1Amount > token1Balance ) { //计算将B全部存入需要的B的总量 token1Amount = token1Balance ; token0Amount = token1Amount.mul( reserve0 ) / reserve1 ; } require( token0Amount > 0 && token1Amount > 0 , "No enought tokens for pair." ) ; TransferHelper.safeTransfer( Token0 , UniPairAddress , token0Amount ) ; TransferHelper.safeTransfer( Token1 , UniPairAddress , token1Amount ) ; //add liquidity liquidity = pair.mint( address(this) ) ; require( liquidity > 0 , "Stake faild. No liquidity." ) ; //stake stake = _stake( ) ; // 开始计算PairX挖矿 RewardBeginTime = getDateTime( block.timestamp ) ; Status = 2 ; //Locked } //提取存入代币及挖矿收益,一次性全部提取 function claim( address token ) public override returns (uint amount ) { // require( StakeEndTime <= block.timestamp , "Unexpired for locked.") ; // 余额做了处理,不用担心重入 amount = UserBalance[msg.sender][token] ; require( amount > 0 , "Invaild request, balance is not enough." ) ; require( Status != 2 , "Not finish. " ) ; //locked require( token == Token0 || token == Token1 , "No matched token.") ; uint reward = 0 ; uint principal = amount ; uint interest = 0 ; if( Status == 1 ) { // 直接提取本金,但没有任何收益 _safeTransfer( token , msg.sender , amount ) ; if( token == Token0 ) { Token0Record.total = Token0Record.total.sub( amount ) ; Token0Record.withdraw = Token0Record.total ; } if( token == Token1 ) { Token1Record.total = Token1Record.total.sub( amount ) ; Token1Record.withdraw = Token1Record.total ; } // UserBalance[msg.sender][token] = UserBalance[msg.sender][token].sub( amount ) ; } if( Status == 9 ) { TokenRecord storage tokenRecord = token == Token0 ? Token0Record : Token1Record ; // 计算可提取的本金 amount / total * withdraw principal = amount.div(1e15).mul( tokenRecord.withdraw ).div( tokenRecord.total.div(1e15) ); if( tokenRecord.mint > 0 ) { interest = amount.div(1e15).mul( tokenRecord.mint ).div( tokenRecord.total.div(1e15) ) ; } // if( token == Token0 ) { // tokenBalance = Token0Record.total ; // } if( token == MainToken ) { // 一次性转入 uint tranAmount = principal + interest ; _safeTransfer( token , msg.sender , tranAmount ) ; } else { _safeTransfer( token , msg.sender , principal ) ; if( interest > 0 ) { // 分别转出 _safeTransfer( MainToken , msg.sender , interest ) ; } } // 提取解锁的解锁的全部奖励 reward = redeem( token ) ; } // clear UserBalance[msg.sender][token] = uint(0); emit Claim( address(this) , msg.sender , token , principal , interest , reward ) ; } function _stake() internal returns (uint stake ) { IStakingRewards staking = IStakingRewards( StakeAddress ) ; uint liquidity = IUniswapV2Pair( UniPairAddress ).balanceOf( address(this) ) ; stake = liquidity ; TransferHelper.safeApprove( UniPairAddress , StakeAddress , liquidity) ; staking.stake( liquidity ) ; // emit Staking( address(this) , StakeAddress , liquidity , stake ) ; } function depositETH() external payable { uint ethValue = msg.value ; require( ethValue > 0 , "Payment is zero." ) ; address weth = Token0 == MainToken ? Token1 : Token0 ; deposit( weth , msg.sender , ethValue ) ; } function _safeTransfer( address token , address to , uint amount ) internal { uint balance = _tokenBalance( token ) ; if( amount > balance ){ amount = balance ; } if( token == MainToken ) { TransferHelper.safeTransfer( token , to , amount ) ; } else { // weth IWETH( token ).withdraw( amount ) ; TransferHelper.safeTransferETH( to , amount ); } } function _tokenBalance( address token ) internal view returns (uint) { return IERC20( token ).balanceOf( address(this) ) ; } receive() external payable { assert(msg.sender == Token0 || msg.sender == Token1 ); // only accept ETH via fallback from the WETH contract } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"principal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interest","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"inputs":[],"name":"DepositEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Fee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FeeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MainToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RewardBeginTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StakeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StakeEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Status","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UniPairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feeTo","type":"address"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"main","type":"address"},{"internalType":"address","name":"stake","type":"address"},{"internalType":"uint256","name":"stakeEndTime","type":"uint256"}],"name":"active","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addLiquidityAndStake","outputs":[{"internalType":"uint256","name":"token0Amount","type":"uint256"},{"internalType":"uint256","name":"token1Amount","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"stake","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claim","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"depositInfo","outputs":[{"internalType":"uint256","name":"depositBalance","type":"uint256"},{"internalType":"uint256","name":"depositTotal","type":"uint256"},{"internalType":"uint256","name":"leftDays","type":"uint256"},{"internalType":"uint256","name":"lockedReward","type":"uint256"},{"internalType":"uint256","name":"freeReward","type":"uint256"},{"internalType":"uint256","name":"gottedReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getDateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"sender","type":"address"}],"name":"getRewardRecord","outputs":[{"internalType":"uint256","name":"leftDays","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"},{"internalType":"uint256","name":"free","type":"uint256"},{"internalType":"uint256","name":"gotted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"info","outputs":[{"internalType":"uint256","name":"minToken0Deposit","type":"uint256"},{"internalType":"uint256","name":"minToken1Deposit","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint256","name":"stakeEndTime","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"mainToken","type":"address"},{"internalType":"uint256","name":"rewardBeginTime","type":"uint256"},{"internalType":"uint256","name":"depositEndTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"token0min","type":"uint256"},{"internalType":"uint256","name":"token1min","type":"uint256"},{"internalType":"uint256","name":"depositEndTime","type":"uint256"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"tokenRecordInfo","outputs":[{"internalType":"uint256","name":"free","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000805460ff60a01b1916600560a11b1781556006805460ff19169055600781905560088190556009553480156200003b57600080fd5b5060405162002a1238038062002a128339810160408190526200005e9162000084565b600080546001600160a01b0319166001600160a01b0392909216919091179055620000b4565b60006020828403121562000096578081fd5b81516001600160a01b0381168114620000ad578182fd5b9392505050565b61294e80620000c46000396000f3fe6080604052600436106101a05760003560e01c806396a8797e116100ec578063c41f94821161008a578063f1e9f1e511610064578063f1e9f1e51461048b578063f4bef555146104a0578063f5194ae2146104c0578063f6326fb3146104d5576101d0565b8063c41f948214610441578063d56b288914610461578063f0fe082a14610476576101d0565b8063a79f6ac3116100c6578063a79f6ac3146103e2578063b4a99a4e14610402578063b79ed4e014610417578063bef7a2f01461042c576101d0565b806396a8797e146103875780639b74fe6d1461039c578063a14fe71a146103b1576101d0565b8063370158ea11610159578063493b017011610133578063493b0170146103005780637d175d71146103325780638340f5491461034757806395a2251f14610367576101d0565b8063370158ea1461029c57806345ce7db9146102c957806345f09ce9146102de576101d0565b806305863e06146101d55780630e2caa6f146101f557806312842bb0146102205780631af85097146102455780631e83409a1461025a57806322b2a47e1461027a576101d0565b366101d057600c546001600160a01b03163314806101c85750600d546001600160a01b031633145b6101ce57fe5b005b600080fd5b3480156101e157600080fd5b506101ce6101f03660046121d8565b6104dd565b34801561020157600080fd5b5061020a61058d565b60405161021791906127d9565b60405180910390f35b34801561022c57600080fd5b50610235610593565b604051610217949392919061284b565b34801561025157600080fd5b5061020a61080e565b34801561026657600080fd5b5061020a6102753660046120c5565b610814565b34801561028657600080fd5b5061028f610ab1565b60405161021791906122fe565b3480156102a857600080fd5b506102b1610ac0565b6040516102179c9b9a999897969594939291906127e2565b3480156102d557600080fd5b5061028f610b13565b3480156102ea57600080fd5b506102f3610b22565b60405161021791906128b1565b34801561030c57600080fd5b5061032061031b3660046120fd565b610b2b565b60405161021796959493929190612889565b34801561033e57600080fd5b5061028f610bb6565b34801561035357600080fd5b506101ce610362366004612198565b610bc5565b34801561037357600080fd5b5061020a6103823660046120c5565b610d3e565b34801561039357600080fd5b5061028f610e03565b3480156103a857600080fd5b5061020a610e12565b3480156103bd57600080fd5b506103d16103cc3660046120c5565b610e18565b604051610217959493929190612866565b3480156103ee57600080fd5b506101ce6103fd366004612135565b610e76565b34801561040e57600080fd5b5061028f611024565b34801561042357600080fd5b5061020a611033565b34801561043857600080fd5b506102f3611039565b34801561044d57600080fd5b5061020a61045c36600461228f565b611049565b34801561046d57600080fd5b506101ce611050565b34801561048257600080fd5b5061028f6114ba565b34801561049757600080fd5b5061028f6114c9565b3480156104ac57600080fd5b506102356104bb3660046120fd565b6114d8565b3480156104cc57600080fd5b5061028f611753565b6101ce611762565b6000546001600160a01b031633146105105760405162461bcd60e51b8152600401610507906125d7565b60405180910390fd5b600480546001600160a01b0319166001600160a01b038716179055610537853330876117ca565b60055461054490856118bb565b6005819055600284905560038390556006805460ff1916600117905560009061057b90600a906105759060046118e9565b90611923565b600f8190556015555060085550505050565b60075481565b600080548190819081906001600160a01b031633146105c45760405162461bcd60e51b8152600401610507906125d7565b600e54601454600254821180156105dc575060035481115b6105f85760405162461bcd60e51b8152600401610507906126d4565b600a5460408051630240bc6b60e21b815290516001600160a01b039092169160009182918491630902f1ac916004808301926060929190829003018186803b15801561064357600080fd5b505afa158015610657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067b919061223b565b506001600160701b031691506001600160701b03169150849850816106a9828b6118e990919063ffffffff16565b816106b057fe5b049750838811156106d6579296508692806106cb85846118e9565b816106d257fe5b0498505b6000891180156106e65750600088115b6107025760405162461bcd60e51b8152600401610507906125f9565b600c54600a5461071f916001600160a01b0390811691168b611965565b600d54600a5461073c916001600160a01b0390811691168a611965565b6040516335313c2160e11b81526001600160a01b03841690636a627842906107689030906004016122fe565b602060405180830381600087803b15801561078257600080fd5b505af1158015610796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ba91906122a7565b9650600087116107dc5760405162461bcd60e51b815260040161050790612630565b6107e4611a53565b95506107ef42611049565b60075550506006805460ff191660021790555094959394509192909150565b60095481565b336000908152601c602090815260408083206001600160a01b0385168452909152902054806108555760405162461bcd60e51b81526004016105079061241c565b60065460ff166002141561087b5760405162461bcd60e51b8152600401610507906125b1565b600c546001600160a01b03838116911614806108a45750600d546001600160a01b038381169116145b6108c05760405162461bcd60e51b81526004016105079061255f565b6006546000908290829060ff1660011415610938576108e0853386611b64565b600c546001600160a01b038681169116141561090c57600e546109039085611c11565b600e8190556012555b600d546001600160a01b03868116911614156109385760145461092f9085611c11565b60148190556018555b60065460ff1660091415610a4257600c546000906001600160a01b03878116911614610965576014610968565b600e5b80549091506109a2906109829066038d7ea4c68000611923565b60048301546105759061099c8966038d7ea4c68000611923565b906118e9565b6005820154909350156109e35780546109e0906109c69066038d7ea4c68000611923565b60058301546105759061099c8966038d7ea4c68000611923565b91505b600b546001600160a01b0387811691161415610a0d57828201610a07873383611b64565b50610a35565b610a18863385611b64565b8115610a3557600b54610a35906001600160a01b03163384611b64565b610a3e86610d3e565b9350505b336000818152601c602090815260408083206001600160a01b038a16845290915280822091909155517fe13b9fd454ff56d3db734a68636b9b52734a6006abb5a3c2600faab1e3d5579d91610aa1913091908990879087908a90612312565b60405180910390a1505050919050565b600a546001600160a01b031681565b600254600354600454600554600654600954600c54600d54600b54600a546007546008549a9b999a6001600160a01b03998a169a989960ff90981698969795861696948616959283169492909316929091565b601a546001600160a01b031681565b60065460ff1681565b6001600160a01b038083166000908152601c602090815260408083208585168085529252822054600c549093839283928392839291161415610b7157600e549450610b77565b60145494505b6001600160a01b03881615610b9f57610b9087896114d8565b92965090945092509050610bac565b5060009250829150819050805b9295509295509295565b6001546001600160a01b031681565b6009544210610be65760405162461bcd60e51b815260040161050790612745565b60065460ff16600114610c0b5760405162461bcd60e51b8152600401610507906127b6565b60065460ff16600114610c305760405162461bcd60e51b815260040161050790612463565b600c546001600160a01b0384811691161480610c595750600d546001600160a01b038481169116145b610c755760405162461bcd60e51b8152600401610507906126a8565b600b546001600160a01b0384811691161415610c9c57610c97833330846117ca565b610cf1565b826001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610cd757600080fd5b505af1158015610ceb573d6000803e3d6000fd5b50505050505b610cfc828483611c53565b7f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a9682308584604051610d31949392919061234b565b60405180910390a1505050565b60065460009060ff1660021480610d5a575060065460ff166009145b610d765760405162461bcd60e51b81526004016105079061258a565b336000610d8384836114d8565b5092505050809250610d958284611d7a565b6001600160a01b038083166000908152601d6020908152604080832093881683529290522054610dc590846118bb565b6001600160a01b038084166000908152601d6020908152604080832093891683529290522055601b54610df890846118bb565b601b55509092915050565b600d546001600160a01b031681565b60085481565b600c5460009081908190819081906001600160a01b0387811691161415610e55575050601254600e54600f54601154929550909350915083610e6d565b50506018546014546015546017549295509093509150835b91939590929450565b6000546001600160a01b03163314610ea05760405162461bcd60e51b8152600401610507906125d7565b600180546001600160a01b038088166001600160a01b031992831617909255600a80548784169083161790819055600b805487851693169290921790915560408051630dfe168160e01b8152905191909216918291630dfe168191600480820192602092909190829003018186803b158015610f1b57600080fd5b505afa158015610f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5391906120e1565b600c60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb257600080fd5b505afa158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea91906120e1565b600d80546001600160a01b03199081166001600160a01b0393841617909155600993909355601a8054909316931692909217905550505050565b6000546001600160a01b031681565b60055481565b600054600160a01b900460ff1681565b805b919050565b6000546001600160a01b0316331461107a5760405162461bcd60e51b8152600401610507906125d7565b601a54600b546001600160a01b03918216916000916110999116611dd2565b9050816001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156110d657600080fd5b505af11580156110ea573d6000803e3d6000fd5b5050600b546000925061110691506001600160a01b0316611dd2565b905060006111148284611c11565b600a546040516370a0823160e01b81529192506001600160a01b03169060009082906370a082319061114a9030906004016122fe565b60206040518083038186803b15801561116257600080fd5b505afa158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a91906122a7565b600a549091506111b4906001600160a01b03168083611965565b60405163226bf2d160e21b81526001600160a01b038316906389afcb44906111e09030906004016122fe565b6040805180830381600087803b1580156111f957600080fd5b505af115801561120d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123191906122bf565b5050600b5460009061124b906001600160a01b0316611dd2565b9050600061127a601b5461127460055461126e8987611c1190919063ffffffff16565b90611c11565b906118bb565b9050600061128786611e51565b905080860361129461208f565b600c54600b546001600160a01b039081169116146112b35760146112b6565b600e5b6040805160c081018252825480825260018401546020830152600284015492820192909252600383015460608201526004830154608082015260059283015460a0820152925081908610156113335782518681039060009061131990600a611923565b90508082111561132c5760069350600492505b5050611419565b61133b61208f565b600c54600b546001600160a01b0390811691161461135a57600e61135d565b60145b6040805160c0810182528254815260018301546020820152600283015491810191909152600382015460608201526004820154608082015260059091015460a0820152600b54600c549192506000916001600160a01b039081169116146113cf57600c546001600160a01b03166113dc565b600d546001600160a01b03165b905060006113e982611dd2565b83519091508181039060009061140090600a611923565b9050808211156114135760069550600496505b50505050505b600b54600c5460009182916001600160a01b0390811691161461143d578284611440565b83835b9150915061145e600a610575846005546118e990919063ffffffff16565b600f5560055461147590600a9061057590846118e9565b601555611487600a61057588856118e9565b601355611499600a61057588846118e9565b60195550506006805460ff1916600917905550505050505050505050505050565b600c546001600160a01b031681565b6004546001600160a01b031681565b60008060008060006114e942611049565b6001600160a01b038088166000908152601c60209081526040808320938c168352929052205490915061151a61208f565b600c546001600160a01b038a8116911614611536576014611539565b600e5b6040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905061158e60095484611e96565b965060009550859450849350816115b257506000945084935083925061174a915050565b60208101516115ce57506000945084935083925061174a915050565b6001600160a01b038089166000908152601d60209081526040808320938d1683529290529081205460095460075491965061160891611e96565b9050600061162382846020015161192390919063ffffffff16565b9050600060095486111561163f5750600098508897508161165a565b61164b60095487611e96565b9950611657838b611c11565b90505b835160009061168b906116749066038d7ea4c68000611923565b6105758661099c66038d7ea4c68000838c8a6118e9565b60065490915060ff16600214156116fc5784516116ca906116b39066038d7ea4c68000611923565b6105758461099c66038d7ea4c68000838c8a6118e9565b9850806116d78a8a6118bb565b11156116e657600099506116f7565b6116f48861126e838c611c11565b99505b611742565b60065460ff166009141561171f576117148189611c11565b985060009950611742565b60065460ff16600114156117395760009850809950611742565b60009850600099505b505050505050505b92959194509250565b600b546001600160a01b031681565b34806117805760405162461bcd60e51b815260040161050790612490565b600b54600c546000916001600160a01b039182169116146117ac57600c546001600160a01b03166117b9565b600d546001600160a01b03165b90506117c6813384610bc5565b5050565b60006060856001600160a01b03166323b872dd8686866040516024016117f293929190612375565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161182b91906122e2565b6000604051808303816000865af19150503d8060008114611868576040519150601f19603f3d011682016040523d82523d6000602084013e61186d565b606091505b5091509150818015611897575080511580611897575080806020019051810190611897919061221b565b6118b35760405162461bcd60e51b815260040161050790612772565b505050505050565b6000828201838110156118e05760405162461bcd60e51b8152600401610507906124ba565b90505b92915050565b6000826118f8575060006118e3565b8282028284828161190557fe5b04146118e05760405162461bcd60e51b815260040161050790612667565b60006118e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611eb8565b60006060846001600160a01b031663a9059cbb858560405160240161198b929190612399565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516119c491906122e2565b6000604051808303816000865af19150503d8060008114611a01576040519150601f19603f3d011682016040523d82523d6000602084013e611a06565b606091505b5091509150818015611a30575080511580611a30575080806020019051810190611a30919061221b565b611a4c5760405162461bcd60e51b8152600401610507906123e5565b5050505050565b601a54600a546040516370a0823160e01b81526000926001600160a01b039081169284929116906370a0823190611a8e9030906004016122fe565b60206040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ade91906122a7565b600a54601a54919450849250611b01916001600160a01b03918216911683611eef565b60405163534a7e1d60e11b81526001600160a01b0383169063a694fc3a90611b2d9084906004016127d9565b600060405180830381600087803b158015611b4757600080fd5b505af1158015611b5b573d6000803e3d6000fd5b50505050505090565b6000611b6f84611dd2565b905080821115611b7d578091505b600b546001600160a01b0385811691161415611ba357611b9e848484611965565b611c0b565b604051632e1a7d4d60e01b81526001600160a01b03851690632e1a7d4d90611bcf9085906004016127d9565b600060405180830381600087803b158015611be957600080fd5b505af1158015611bfd573d6000803e3d6000fd5b50505050611c0b8383611fd6565b50505050565b60006118e083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612063565b600c546001600160a01b0383811691161415611c8a576002548111611c8a5760405162461bcd60e51b8152600401610507906124f1565b600d546001600160a01b0383811691161415611cc1576003548111611cc15760405162461bcd60e51b8152600401610507906124f1565b600c546001600160a01b0383811691161415611ced57600e54611ce490826118bb565b600e8190556012555b600d546001600160a01b0383811691161415611d1957601454611d1090826118bb565b60148190556018555b6001600160a01b038084166000908152601c6020908152604080832093861683529290522054611d4990826118bb565b6001600160a01b039384166000908152601c6020908152604080832095909616825293909352929091209190915550565b6000611d93601b54600554611c1190919063ffffffff16565b9050600082118015611da55750600081115b15611dcd5780821115611db6578091505b600454611dcd906001600160a01b03168484611965565b505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190611e019030906004016122fe565b60206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e391906122a7565b60008054611e7190606490610575908590600160a01b900460ff166118e9565b9050801561104b57600b5460015461104b916001600160a01b03908116911683611b64565b6000818311611ea7575060006118e3565b611eb18383611c11565b90506118e3565b60008183611ed95760405162461bcd60e51b815260040161050791906123b2565b506000838581611ee557fe5b0495945050505050565b60006060846001600160a01b031663095ea7b38585604051602401611f15929190612399565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611f4e91906122e2565b6000604051808303816000865af19150503d8060008114611f8b576040519150601f19603f3d011682016040523d82523d6000602084013e611f90565b606091505b5091509150818015611fba575080511580611fba575080806020019051810190611fba919061221b565b611a4c5760405162461bcd60e51b815260040161050790612528565b604080516000808252602082019092526001600160a01b03841690839060405161200091906122e2565b60006040518083038185875af1925050503d806000811461203d576040519150601f19603f3d011682016040523d82523d6000602084013e612042565b606091505b5050905080611dcd5760405162461bcd60e51b815260040161050790612702565b600081848411156120875760405162461bcd60e51b815260040161050791906123b2565b505050900390565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000602082840312156120d6578081fd5b81356118e0816128eb565b6000602082840312156120f2578081fd5b81516118e0816128eb565b6000806040838503121561210f578081fd5b823561211a816128eb565b9150602083013561212a816128eb565b809150509250929050565b600080600080600060a0868803121561214c578081fd5b8535612157816128eb565b94506020860135612167816128eb565b93506040860135612177816128eb565b92506060860135612187816128eb565b949793965091946080013592915050565b6000806000606084860312156121ac578283fd5b83356121b7816128eb565b925060208401356121c7816128eb565b929592945050506040919091013590565b600080600080600060a086880312156121ef578081fd5b85356121fa816128eb565b97602087013597506040870135966060810135965060800135945092505050565b60006020828403121561222c578081fd5b815180151581146118e0578182fd5b60008060006060848603121561224f578283fd5b835161225a81612903565b602085015190935061226b81612903565b604085015190925063ffffffff81168114612284578182fd5b809150509250925092565b6000602082840312156122a0578081fd5b5035919050565b6000602082840312156122b8578081fd5b5051919050565b600080604083850312156122d1578182fd5b505080516020909101519092909150565b600082516122f48184602087016128bf565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b60006020825282518060208401526123d18160408501602087016128bf565b601f01601f19169190910160400192915050565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526027908201527f496e7661696c6420726571756573742c2062616c616e6365206973206e6f742060408201526632b737bab3b41760c91b606082015260800190565b6020808252601390820152722737ba1030b63637bb903232b837b9b4ba101760691b604082015260600190565b60208082526010908201526f2830bcb6b2b73a1034b9903d32b9379760811b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601b908201527f4465706f73697420746f6b656e7320697320746f6f206c6573732e0000000000604082015260600190565b6020808252601e908201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604082015260600190565b60208082526011908201527027379036b0ba31b432b2103a37b5b2b71760791b604082015260600190565b6020808252600d908201526c2737ba103334b734b9b432b21760991b604082015260600190565b6020808252600c908201526b02737ba103334b734b9b417160a51b604082015260600190565b6020808252600890820152673737903937b6329760c11b604082015260600190565b6020808252601b908201527f4e6f20656e6f7567687420746f6b656e7320666f7220706169722e0000000000604082015260600190565b6020808252601a908201527f5374616b65206661696c642e204e6f206c69717569646974792e000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526012908201527126b0ba31b4103a37b5b2b7103330b4b6321760711b604082015260600190565b60208082526014908201527327379032b737bab3b43a103130b630b731b2901760611b604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b60208082526013908201527226b4b734b733903bb0b99032bc3834b932b21760691b604082015260600190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416040820152631253115160e21b606082015260800190565b6020808252600990820152682737ba1037b832b71760b91b604082015260600190565b90815260200190565b9b8c5260208c019a909a526001600160a01b0398891660408c015260608b019790975260ff9590951660808a015260a089019390935290851660c0880152841660e087015283166101008601529091166101208401526101408301526101608201526101800190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60ff91909116815260200190565b60005b838110156128da5781810151838201526020016128c2565b83811115611c0b5750506000910152565b6001600160a01b038116811461290057600080fd5b50565b6001600160701b038116811461290057600080fdfea26469706673582212204c97c85cc8e2bea6d9060485b8f55c334ba28b9e1cf7e63e87fdc138bee0590c64736f6c634300060c003300000000000000000000000083d0126fbd8d221175c9c7f442b35b0a915c4dec
Deployed Bytecode
0x6080604052600436106101a05760003560e01c806396a8797e116100ec578063c41f94821161008a578063f1e9f1e511610064578063f1e9f1e51461048b578063f4bef555146104a0578063f5194ae2146104c0578063f6326fb3146104d5576101d0565b8063c41f948214610441578063d56b288914610461578063f0fe082a14610476576101d0565b8063a79f6ac3116100c6578063a79f6ac3146103e2578063b4a99a4e14610402578063b79ed4e014610417578063bef7a2f01461042c576101d0565b806396a8797e146103875780639b74fe6d1461039c578063a14fe71a146103b1576101d0565b8063370158ea11610159578063493b017011610133578063493b0170146103005780637d175d71146103325780638340f5491461034757806395a2251f14610367576101d0565b8063370158ea1461029c57806345ce7db9146102c957806345f09ce9146102de576101d0565b806305863e06146101d55780630e2caa6f146101f557806312842bb0146102205780631af85097146102455780631e83409a1461025a57806322b2a47e1461027a576101d0565b366101d057600c546001600160a01b03163314806101c85750600d546001600160a01b031633145b6101ce57fe5b005b600080fd5b3480156101e157600080fd5b506101ce6101f03660046121d8565b6104dd565b34801561020157600080fd5b5061020a61058d565b60405161021791906127d9565b60405180910390f35b34801561022c57600080fd5b50610235610593565b604051610217949392919061284b565b34801561025157600080fd5b5061020a61080e565b34801561026657600080fd5b5061020a6102753660046120c5565b610814565b34801561028657600080fd5b5061028f610ab1565b60405161021791906122fe565b3480156102a857600080fd5b506102b1610ac0565b6040516102179c9b9a999897969594939291906127e2565b3480156102d557600080fd5b5061028f610b13565b3480156102ea57600080fd5b506102f3610b22565b60405161021791906128b1565b34801561030c57600080fd5b5061032061031b3660046120fd565b610b2b565b60405161021796959493929190612889565b34801561033e57600080fd5b5061028f610bb6565b34801561035357600080fd5b506101ce610362366004612198565b610bc5565b34801561037357600080fd5b5061020a6103823660046120c5565b610d3e565b34801561039357600080fd5b5061028f610e03565b3480156103a857600080fd5b5061020a610e12565b3480156103bd57600080fd5b506103d16103cc3660046120c5565b610e18565b604051610217959493929190612866565b3480156103ee57600080fd5b506101ce6103fd366004612135565b610e76565b34801561040e57600080fd5b5061028f611024565b34801561042357600080fd5b5061020a611033565b34801561043857600080fd5b506102f3611039565b34801561044d57600080fd5b5061020a61045c36600461228f565b611049565b34801561046d57600080fd5b506101ce611050565b34801561048257600080fd5b5061028f6114ba565b34801561049757600080fd5b5061028f6114c9565b3480156104ac57600080fd5b506102356104bb3660046120fd565b6114d8565b3480156104cc57600080fd5b5061028f611753565b6101ce611762565b6000546001600160a01b031633146105105760405162461bcd60e51b8152600401610507906125d7565b60405180910390fd5b600480546001600160a01b0319166001600160a01b038716179055610537853330876117ca565b60055461054490856118bb565b6005819055600284905560038390556006805460ff1916600117905560009061057b90600a906105759060046118e9565b90611923565b600f8190556015555060085550505050565b60075481565b600080548190819081906001600160a01b031633146105c45760405162461bcd60e51b8152600401610507906125d7565b600e54601454600254821180156105dc575060035481115b6105f85760405162461bcd60e51b8152600401610507906126d4565b600a5460408051630240bc6b60e21b815290516001600160a01b039092169160009182918491630902f1ac916004808301926060929190829003018186803b15801561064357600080fd5b505afa158015610657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067b919061223b565b506001600160701b031691506001600160701b03169150849850816106a9828b6118e990919063ffffffff16565b816106b057fe5b049750838811156106d6579296508692806106cb85846118e9565b816106d257fe5b0498505b6000891180156106e65750600088115b6107025760405162461bcd60e51b8152600401610507906125f9565b600c54600a5461071f916001600160a01b0390811691168b611965565b600d54600a5461073c916001600160a01b0390811691168a611965565b6040516335313c2160e11b81526001600160a01b03841690636a627842906107689030906004016122fe565b602060405180830381600087803b15801561078257600080fd5b505af1158015610796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ba91906122a7565b9650600087116107dc5760405162461bcd60e51b815260040161050790612630565b6107e4611a53565b95506107ef42611049565b60075550506006805460ff191660021790555094959394509192909150565b60095481565b336000908152601c602090815260408083206001600160a01b0385168452909152902054806108555760405162461bcd60e51b81526004016105079061241c565b60065460ff166002141561087b5760405162461bcd60e51b8152600401610507906125b1565b600c546001600160a01b03838116911614806108a45750600d546001600160a01b038381169116145b6108c05760405162461bcd60e51b81526004016105079061255f565b6006546000908290829060ff1660011415610938576108e0853386611b64565b600c546001600160a01b038681169116141561090c57600e546109039085611c11565b600e8190556012555b600d546001600160a01b03868116911614156109385760145461092f9085611c11565b60148190556018555b60065460ff1660091415610a4257600c546000906001600160a01b03878116911614610965576014610968565b600e5b80549091506109a2906109829066038d7ea4c68000611923565b60048301546105759061099c8966038d7ea4c68000611923565b906118e9565b6005820154909350156109e35780546109e0906109c69066038d7ea4c68000611923565b60058301546105759061099c8966038d7ea4c68000611923565b91505b600b546001600160a01b0387811691161415610a0d57828201610a07873383611b64565b50610a35565b610a18863385611b64565b8115610a3557600b54610a35906001600160a01b03163384611b64565b610a3e86610d3e565b9350505b336000818152601c602090815260408083206001600160a01b038a16845290915280822091909155517fe13b9fd454ff56d3db734a68636b9b52734a6006abb5a3c2600faab1e3d5579d91610aa1913091908990879087908a90612312565b60405180910390a1505050919050565b600a546001600160a01b031681565b600254600354600454600554600654600954600c54600d54600b54600a546007546008549a9b999a6001600160a01b03998a169a989960ff90981698969795861696948616959283169492909316929091565b601a546001600160a01b031681565b60065460ff1681565b6001600160a01b038083166000908152601c602090815260408083208585168085529252822054600c549093839283928392839291161415610b7157600e549450610b77565b60145494505b6001600160a01b03881615610b9f57610b9087896114d8565b92965090945092509050610bac565b5060009250829150819050805b9295509295509295565b6001546001600160a01b031681565b6009544210610be65760405162461bcd60e51b815260040161050790612745565b60065460ff16600114610c0b5760405162461bcd60e51b8152600401610507906127b6565b60065460ff16600114610c305760405162461bcd60e51b815260040161050790612463565b600c546001600160a01b0384811691161480610c595750600d546001600160a01b038481169116145b610c755760405162461bcd60e51b8152600401610507906126a8565b600b546001600160a01b0384811691161415610c9c57610c97833330846117ca565b610cf1565b826001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610cd757600080fd5b505af1158015610ceb573d6000803e3d6000fd5b50505050505b610cfc828483611c53565b7f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a9682308584604051610d31949392919061234b565b60405180910390a1505050565b60065460009060ff1660021480610d5a575060065460ff166009145b610d765760405162461bcd60e51b81526004016105079061258a565b336000610d8384836114d8565b5092505050809250610d958284611d7a565b6001600160a01b038083166000908152601d6020908152604080832093881683529290522054610dc590846118bb565b6001600160a01b038084166000908152601d6020908152604080832093891683529290522055601b54610df890846118bb565b601b55509092915050565b600d546001600160a01b031681565b60085481565b600c5460009081908190819081906001600160a01b0387811691161415610e55575050601254600e54600f54601154929550909350915083610e6d565b50506018546014546015546017549295509093509150835b91939590929450565b6000546001600160a01b03163314610ea05760405162461bcd60e51b8152600401610507906125d7565b600180546001600160a01b038088166001600160a01b031992831617909255600a80548784169083161790819055600b805487851693169290921790915560408051630dfe168160e01b8152905191909216918291630dfe168191600480820192602092909190829003018186803b158015610f1b57600080fd5b505afa158015610f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5391906120e1565b600c60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb257600080fd5b505afa158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea91906120e1565b600d80546001600160a01b03199081166001600160a01b0393841617909155600993909355601a8054909316931692909217905550505050565b6000546001600160a01b031681565b60055481565b600054600160a01b900460ff1681565b805b919050565b6000546001600160a01b0316331461107a5760405162461bcd60e51b8152600401610507906125d7565b601a54600b546001600160a01b03918216916000916110999116611dd2565b9050816001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156110d657600080fd5b505af11580156110ea573d6000803e3d6000fd5b5050600b546000925061110691506001600160a01b0316611dd2565b905060006111148284611c11565b600a546040516370a0823160e01b81529192506001600160a01b03169060009082906370a082319061114a9030906004016122fe565b60206040518083038186803b15801561116257600080fd5b505afa158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a91906122a7565b600a549091506111b4906001600160a01b03168083611965565b60405163226bf2d160e21b81526001600160a01b038316906389afcb44906111e09030906004016122fe565b6040805180830381600087803b1580156111f957600080fd5b505af115801561120d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123191906122bf565b5050600b5460009061124b906001600160a01b0316611dd2565b9050600061127a601b5461127460055461126e8987611c1190919063ffffffff16565b90611c11565b906118bb565b9050600061128786611e51565b905080860361129461208f565b600c54600b546001600160a01b039081169116146112b35760146112b6565b600e5b6040805160c081018252825480825260018401546020830152600284015492820192909252600383015460608201526004830154608082015260059283015460a0820152925081908610156113335782518681039060009061131990600a611923565b90508082111561132c5760069350600492505b5050611419565b61133b61208f565b600c54600b546001600160a01b0390811691161461135a57600e61135d565b60145b6040805160c0810182528254815260018301546020820152600283015491810191909152600382015460608201526004820154608082015260059091015460a0820152600b54600c549192506000916001600160a01b039081169116146113cf57600c546001600160a01b03166113dc565b600d546001600160a01b03165b905060006113e982611dd2565b83519091508181039060009061140090600a611923565b9050808211156114135760069550600496505b50505050505b600b54600c5460009182916001600160a01b0390811691161461143d578284611440565b83835b9150915061145e600a610575846005546118e990919063ffffffff16565b600f5560055461147590600a9061057590846118e9565b601555611487600a61057588856118e9565b601355611499600a61057588846118e9565b60195550506006805460ff1916600917905550505050505050505050505050565b600c546001600160a01b031681565b6004546001600160a01b031681565b60008060008060006114e942611049565b6001600160a01b038088166000908152601c60209081526040808320938c168352929052205490915061151a61208f565b600c546001600160a01b038a8116911614611536576014611539565b600e5b6040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905061158e60095484611e96565b965060009550859450849350816115b257506000945084935083925061174a915050565b60208101516115ce57506000945084935083925061174a915050565b6001600160a01b038089166000908152601d60209081526040808320938d1683529290529081205460095460075491965061160891611e96565b9050600061162382846020015161192390919063ffffffff16565b9050600060095486111561163f5750600098508897508161165a565b61164b60095487611e96565b9950611657838b611c11565b90505b835160009061168b906116749066038d7ea4c68000611923565b6105758661099c66038d7ea4c68000838c8a6118e9565b60065490915060ff16600214156116fc5784516116ca906116b39066038d7ea4c68000611923565b6105758461099c66038d7ea4c68000838c8a6118e9565b9850806116d78a8a6118bb565b11156116e657600099506116f7565b6116f48861126e838c611c11565b99505b611742565b60065460ff166009141561171f576117148189611c11565b985060009950611742565b60065460ff16600114156117395760009850809950611742565b60009850600099505b505050505050505b92959194509250565b600b546001600160a01b031681565b34806117805760405162461bcd60e51b815260040161050790612490565b600b54600c546000916001600160a01b039182169116146117ac57600c546001600160a01b03166117b9565b600d546001600160a01b03165b90506117c6813384610bc5565b5050565b60006060856001600160a01b03166323b872dd8686866040516024016117f293929190612375565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161182b91906122e2565b6000604051808303816000865af19150503d8060008114611868576040519150601f19603f3d011682016040523d82523d6000602084013e61186d565b606091505b5091509150818015611897575080511580611897575080806020019051810190611897919061221b565b6118b35760405162461bcd60e51b815260040161050790612772565b505050505050565b6000828201838110156118e05760405162461bcd60e51b8152600401610507906124ba565b90505b92915050565b6000826118f8575060006118e3565b8282028284828161190557fe5b04146118e05760405162461bcd60e51b815260040161050790612667565b60006118e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611eb8565b60006060846001600160a01b031663a9059cbb858560405160240161198b929190612399565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516119c491906122e2565b6000604051808303816000865af19150503d8060008114611a01576040519150601f19603f3d011682016040523d82523d6000602084013e611a06565b606091505b5091509150818015611a30575080511580611a30575080806020019051810190611a30919061221b565b611a4c5760405162461bcd60e51b8152600401610507906123e5565b5050505050565b601a54600a546040516370a0823160e01b81526000926001600160a01b039081169284929116906370a0823190611a8e9030906004016122fe565b60206040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ade91906122a7565b600a54601a54919450849250611b01916001600160a01b03918216911683611eef565b60405163534a7e1d60e11b81526001600160a01b0383169063a694fc3a90611b2d9084906004016127d9565b600060405180830381600087803b158015611b4757600080fd5b505af1158015611b5b573d6000803e3d6000fd5b50505050505090565b6000611b6f84611dd2565b905080821115611b7d578091505b600b546001600160a01b0385811691161415611ba357611b9e848484611965565b611c0b565b604051632e1a7d4d60e01b81526001600160a01b03851690632e1a7d4d90611bcf9085906004016127d9565b600060405180830381600087803b158015611be957600080fd5b505af1158015611bfd573d6000803e3d6000fd5b50505050611c0b8383611fd6565b50505050565b60006118e083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612063565b600c546001600160a01b0383811691161415611c8a576002548111611c8a5760405162461bcd60e51b8152600401610507906124f1565b600d546001600160a01b0383811691161415611cc1576003548111611cc15760405162461bcd60e51b8152600401610507906124f1565b600c546001600160a01b0383811691161415611ced57600e54611ce490826118bb565b600e8190556012555b600d546001600160a01b0383811691161415611d1957601454611d1090826118bb565b60148190556018555b6001600160a01b038084166000908152601c6020908152604080832093861683529290522054611d4990826118bb565b6001600160a01b039384166000908152601c6020908152604080832095909616825293909352929091209190915550565b6000611d93601b54600554611c1190919063ffffffff16565b9050600082118015611da55750600081115b15611dcd5780821115611db6578091505b600454611dcd906001600160a01b03168484611965565b505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190611e019030906004016122fe565b60206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e391906122a7565b60008054611e7190606490610575908590600160a01b900460ff166118e9565b9050801561104b57600b5460015461104b916001600160a01b03908116911683611b64565b6000818311611ea7575060006118e3565b611eb18383611c11565b90506118e3565b60008183611ed95760405162461bcd60e51b815260040161050791906123b2565b506000838581611ee557fe5b0495945050505050565b60006060846001600160a01b031663095ea7b38585604051602401611f15929190612399565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611f4e91906122e2565b6000604051808303816000865af19150503d8060008114611f8b576040519150601f19603f3d011682016040523d82523d6000602084013e611f90565b606091505b5091509150818015611fba575080511580611fba575080806020019051810190611fba919061221b565b611a4c5760405162461bcd60e51b815260040161050790612528565b604080516000808252602082019092526001600160a01b03841690839060405161200091906122e2565b60006040518083038185875af1925050503d806000811461203d576040519150601f19603f3d011682016040523d82523d6000602084013e612042565b606091505b5050905080611dcd5760405162461bcd60e51b815260040161050790612702565b600081848411156120875760405162461bcd60e51b815260040161050791906123b2565b505050900390565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000602082840312156120d6578081fd5b81356118e0816128eb565b6000602082840312156120f2578081fd5b81516118e0816128eb565b6000806040838503121561210f578081fd5b823561211a816128eb565b9150602083013561212a816128eb565b809150509250929050565b600080600080600060a0868803121561214c578081fd5b8535612157816128eb565b94506020860135612167816128eb565b93506040860135612177816128eb565b92506060860135612187816128eb565b949793965091946080013592915050565b6000806000606084860312156121ac578283fd5b83356121b7816128eb565b925060208401356121c7816128eb565b929592945050506040919091013590565b600080600080600060a086880312156121ef578081fd5b85356121fa816128eb565b97602087013597506040870135966060810135965060800135945092505050565b60006020828403121561222c578081fd5b815180151581146118e0578182fd5b60008060006060848603121561224f578283fd5b835161225a81612903565b602085015190935061226b81612903565b604085015190925063ffffffff81168114612284578182fd5b809150509250925092565b6000602082840312156122a0578081fd5b5035919050565b6000602082840312156122b8578081fd5b5051919050565b600080604083850312156122d1578182fd5b505080516020909101519092909150565b600082516122f48184602087016128bf565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b60006020825282518060208401526123d18160408501602087016128bf565b601f01601f19169190910160400192915050565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526027908201527f496e7661696c6420726571756573742c2062616c616e6365206973206e6f742060408201526632b737bab3b41760c91b606082015260800190565b6020808252601390820152722737ba1030b63637bb903232b837b9b4ba101760691b604082015260600190565b60208082526010908201526f2830bcb6b2b73a1034b9903d32b9379760811b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601b908201527f4465706f73697420746f6b656e7320697320746f6f206c6573732e0000000000604082015260600190565b6020808252601e908201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604082015260600190565b60208082526011908201527027379036b0ba31b432b2103a37b5b2b71760791b604082015260600190565b6020808252600d908201526c2737ba103334b734b9b432b21760991b604082015260600190565b6020808252600c908201526b02737ba103334b734b9b417160a51b604082015260600190565b6020808252600890820152673737903937b6329760c11b604082015260600190565b6020808252601b908201527f4e6f20656e6f7567687420746f6b656e7320666f7220706169722e0000000000604082015260600190565b6020808252601a908201527f5374616b65206661696c642e204e6f206c69717569646974792e000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526012908201527126b0ba31b4103a37b5b2b7103330b4b6321760711b604082015260600190565b60208082526014908201527327379032b737bab3b43a103130b630b731b2901760611b604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b60208082526013908201527226b4b734b733903bb0b99032bc3834b932b21760691b604082015260600190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416040820152631253115160e21b606082015260800190565b6020808252600990820152682737ba1037b832b71760b91b604082015260600190565b90815260200190565b9b8c5260208c019a909a526001600160a01b0398891660408c015260608b019790975260ff9590951660808a015260a089019390935290851660c0880152841660e087015283166101008601529091166101208401526101408301526101608201526101800190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60ff91909116815260200190565b60005b838110156128da5781810151838201526020016128c2565b83811115611c0b5750506000910152565b6001600160a01b038116811461290057600080fd5b50565b6001600160701b038116811461290057600080fdfea26469706673582212204c97c85cc8e2bea6d9060485b8f55c334ba28b9e1cf7e63e87fdc138bee0590c64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000083d0126fbd8d221175c9c7f442b35b0a915c4dec
-----Decoded View---------------
Arg [0] : owner (address): 0x83d0126fBd8D221175C9c7F442B35B0A915c4deC
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000083d0126fbd8d221175c9c7f442b35b0a915c4dec
Deployed Bytecode Sourcemap
13595:20928:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34423:6;;-1:-1:-1;;;;;34423:6:0;34409:10;:20;;:44;;-1:-1:-1;34447:6:0;;-1:-1:-1;;;;;34447:6:0;34433:10;:20;34409:44;34402:53;;;;13595:20928;;;;;16492:748;;;;;;;;;;-1:-1:-1;16492:748:0;;;;;:::i;:::-;;:::i;14062:34::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28760:1642;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;14225:31::-;;;;;;;;;;;;;:::i;30473:2546::-;;;;;;;;;;-1:-1:-1;30473:2546:0;;;;;:::i;:::-;;:::i;14265:29::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18100:840::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;14527:27::-;;;;;;;;;;;;;:::i;13937:23::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18949:792::-;;;;;;;;;;-1:-1:-1;18949:792:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;13725:20::-;;;;;;;;;;;;;:::i;24036:681::-;;;;;;;;;;-1:-1:-1;24036:681:0;;;;;:::i;:::-;;:::i;24783:468::-;;;;;;;;;;-1:-1:-1;24783:468:0;;;;;:::i;:::-;;:::i;14435:21::-;;;;;;;;;;;;;:::i;14163:33::-;;;;;;;;;;;;;:::i;17248:844::-;;;;;;;;;;-1:-1:-1;17248:844:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;15874:546::-;;;;;;;;;;-1:-1:-1;15874:546:0;;;;;:::i;:::-;;:::i;13670:20::-;;;;;;;;;;;;;:::i;13901:27::-;;;;;;;;;;;;;:::i;13697:21::-;;;;;;;;;;;;;:::i;21849:140::-;;;;;;;;;;-1:-1:-1;21849:140:0;;;;;:::i;:::-;;:::i;25356:3216::-;;;;;;;;;;;;;:::i;14387:21::-;;;;;;;;;;;;;:::i;13852:26::-;;;;;;;;;;;;;:::i;19749:2084::-;;;;;;;;;;-1:-1:-1;19749:2084:0;;;;;:::i;:::-;;:::i;14330:24::-;;;;;;;;;;;;;:::i;33477:255::-;;;:::i;16492:748::-;15589:5;;-1:-1:-1;;;;;15589:5:0;15575:10;:19;15567:40;;;;-1:-1:-1;;;15567:40:0;;;;;;;:::i;:::-;;;;;;;;;16687:11:::1;:20:::0;;-1:-1:-1;;;;;;16687:20:0::1;-1:-1:-1::0;;;;;16687:20:0;::::1;;::::0;;16718:137:::1;16687:20:::0;16785:10:::1;16818:4;16838:6:::0;16718:31:::1;:137::i;:::-;16881:12;::::0;:24:::1;::::0;16898:6;16881:16:::1;:24::i;:::-;16866:12;:39:::0;;;16916:16:::1;:28:::0;;;-1:-1:-1;16955:28:0;;;16994:6:::1;:10:::0;;-1:-1:-1;;16994:10:0::1;17003:1;16994:10;::::0;;-1:-1:-1;;17071:27:0::1;::::0;17095:2:::1;::::0;17071:19:::1;::::0;17088:1:::1;17071:16;:19::i;:::-;:23:::0;::::1;:27::i;:::-;17109:19:::0;:35;;;17155:19;:35;-1:-1:-1;17201:14:0::1;:31:::0;-1:-1:-1;;;;16492:748:0:o;14062:34::-;;;;:::o;28760:1642::-;28822:17;15589:5;;28822:17;;;;;;-1:-1:-1;;;;;15589:5:0;15575:10;:19;15567:40;;;;-1:-1:-1;;;15567:40:0;;;;;;;:::i;:::-;29089:12:::1;:18:::0;29141:12:::1;:18:::0;29198:16:::1;::::0;29182:32;::::1;:68:::0;::::1;;;;29234:16;;29218:13;:32;29182:68;29173:104;;;;-1:-1:-1::0;;;29173:104:0::1;;;;;;;:::i;:::-;29327:14;::::0;29393:18:::1;::::0;;-1:-1:-1;;;29393:18:0;;;;-1:-1:-1;;;;;29327:14:0;;::::1;::::0;29289:19:::1;::::0;;;29327:14;;29393:16:::1;::::0;:18:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;29327:14;29393:18;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29355:56;-1:-1:-1::0;;;;;29355:56:0::1;;;-1:-1:-1::0;;;;;29355:56:0::1;;;29507:13;29492:28;;29577:8;29547:28;29565:8;29547:12;:16;;:28;;;;:::i;:::-;:38;;;;;;29532:53;;29616:13;29601:12;:28;29597:218;;;29719:13:::0;;-1:-1:-1;29719:13:0;;29794:8;29763:28:::1;29719:13:::0;29781:8;29763:16:::1;:28::i;:::-;:39;;;;;;29748:54;;29597:218;29852:1;29837:12;:16;:36;;;;;29872:1;29857:12;:16;29837:36;29828:79;;;;-1:-1:-1::0;;;29828:79:0::1;;;;;;;:::i;:::-;29948:6;::::0;29957:14:::1;::::0;29919:69:::1;::::0;-1:-1:-1;;;;;29948:6:0;;::::1;::::0;29957:14:::1;29974:12:::0;29919:27:::1;:69::i;:::-;30029:6;::::0;30038:14:::1;::::0;30000:69:::1;::::0;-1:-1:-1;;;;;30029:6:0;;::::1;::::0;30038:14:::1;30055:12:::0;30000:27:::1;:69::i;:::-;30120:26;::::0;-1:-1:-1;;;30120:26:0;;-1:-1:-1;;;;;30120:9:0;::::1;::::0;::::1;::::0;:26:::1;::::0;30139:4:::1;::::0;30120:26:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30108:38;;30181:1;30169:9;:13;30160:55;;;;-1:-1:-1::0;;;30160:55:0::1;;;;;;;:::i;:::-;30253:9;:6;:9::i;:::-;30245:17;;30328:30;30341:15;30328:11;:30::i;:::-;30310:15;:48:::0;-1:-1:-1;;30370:6:0::1;:10:::0;;-1:-1:-1;;30370:10:0::1;30379:1;30370:10;::::0;;-1:-1:-1;28760:1642:0;;;;-1:-1:-1;28760:1642:0;;;;-1:-1:-1;28760:1642:0:o;14225:31::-;;;;:::o;30473:2546::-;30708:10;30530:11;30696:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;30696:30:0;;;;;;;;;;30749:10;30740:65;;;;-1:-1:-1;;;30740:65:0;;;;;;;:::i;:::-;30826:6;;;;30836:1;30826:11;;30817:39;;;;-1:-1:-1;;;30817:39:0;;;;;;;:::i;:::-;30897:6;;-1:-1:-1;;;;;30888:15:0;;;30897:6;;30888:15;;:34;;-1:-1:-1;30916:6:0;;-1:-1:-1;;;;;30907:15:0;;;30916:6;;30907:15;30888:34;30879:66;;;;-1:-1:-1;;;30879:66:0;;;;;;;:::i;:::-;31053:6;;30958:11;;31002:6;;30958:11;;31053:6;;;:11;31049:618;;;31139:44;31154:5;31162:10;31175:6;31139:13;:44::i;:::-;31212:6;;-1:-1:-1;;;;;31203:15:0;;;31212:6;;31203:15;31199:173;;;31261:12;:18;:32;;31285:6;31261:22;:32::i;:::-;31240:12;:53;;;31313:21;:42;31199:173;31399:6;;-1:-1:-1;;;;;31390:15:0;;;31399:6;;31390:15;31386:173;;;31448:12;:18;:32;;31472:6;31448:22;:32::i;:::-;31427:12;:53;;;31500:21;:42;31386:173;31684:6;;;;31694:1;31684:11;31680:1158;;;31756:6;;31713:31;;-1:-1:-1;;;;;31747:15:0;;;31756:6;;31747:15;:45;;31780:12;31747:45;;;31765:12;31747:45;31937:17;;31713:79;;-1:-1:-1;31887:79:0;;31937:27;;31959:4;31937:21;:27::i;:::-;31909:20;;;;31887:44;;:16;:6;31898:4;31887:10;:16::i;:::-;:20;;:44::i;:79::-;31985:16;;;;31875:91;;-1:-1:-1;31985:20:0;31981:149;;32084:17;;32038:75;;32084:27;;32106:4;32084:21;:27::i;:::-;32060:16;;;;32038:40;;:16;:6;32049:4;32038:10;:16::i;:75::-;32027:86;;31981:149;32285:9;;-1:-1:-1;;;;;32276:18:0;;;32285:9;;32276:18;32272:460;;;32370:20;;;32410:48;32425:5;32433:10;32370:20;32410:13;:48::i;:::-;32272:460;;;;32500:47;32515:5;32523:10;32536:9;32500:13;:47::i;:::-;32571:12;;32567:150;;32661:9;;32646:50;;-1:-1:-1;;;;;32661:9:0;32673:10;32686:8;32646:13;:50::i;:::-;32810:15;32818:5;32810:6;:15::i;:::-;32801:24;;31680:1158;;32889:10;32915:1;32877:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;32877:30:0;;;;;;;;;;:40;;;;32935:75;;;;;32950:4;;32889:10;32901:5;;32979:9;;32991:8;;33002:6;;32935:75;:::i;:::-;;;;;;;;30473:2546;;;;;;:::o;14265:29::-;;;-1:-1:-1;;;;;14265:29:0;;:::o;18100:840::-;18518:16;;18565;;18607:11;;18645:12;;18678:6;;18711:12;;18744:6;;18771;;18801:9;;18829:14;;18873:15;;18917:14;;18518:16;;18565;;-1:-1:-1;;;;;18607:11:0;;;;18645:12;;18678:6;;;;;18711:12;;18744:6;;;;18771;;;;18829:14;;;;18801:9;;;;;18873:15;;18100:840::o;14527:27::-;;;-1:-1:-1;;;;;14527:27:0;;:::o;13937:23::-;;;;;;:::o;18949:792::-;-1:-1:-1;;;;;19186:19:0;;;19035;19186;;;:11;:19;;;;;;;;:26;;;;;;;;;;;19237:6;;19186:26;;19035:19;;;;;;;;19237:6;;19228:15;19224:150;;;19276:12;:18;;-1:-1:-1;19224:150:0;;;19343:12;:18;;-1:-1:-1;19224:150:0;-1:-1:-1;;;;;19436:20:0;;;19432:302;;19548:33;19565:5;19573:6;19548:15;:33::i;:::-;19473:108;;-1:-1:-1;19473:108:0;;-1:-1:-1;19473:108:0;-1:-1:-1;19473:108:0;-1:-1:-1;19432:302:0;;;-1:-1:-1;19626:1:0;;-1:-1:-1;19626:1:0;;-1:-1:-1;19626:1:0;;-1:-1:-1;19626:1:0;19432:302;18949:792;;;;;;;;:::o;13725:20::-;;;-1:-1:-1;;;;;13725:20:0;;:::o;24036:681::-;15692:12;;15674:15;:30;15666:62;;;;-1:-1:-1;;;15666:62:0;;;;;;;:::i;:::-;15747:6;;;;;:11;15739:33;;;;-1:-1:-1;;;15739:33:0;;;;;;;:::i;:::-;24153:6:::1;::::0;::::1;;::::0;:11:::1;24144:46;;;;-1:-1:-1::0;;;24144:46:0::1;;;;;;;:::i;:::-;24221:6;::::0;-1:-1:-1;;;;;24212:15:0;;::::1;24221:6:::0;::::1;24212:15;::::0;24211:39:::1;;-1:-1:-1::0;24243:6:0::1;::::0;-1:-1:-1;;;;;24234:15:0;;::::1;24243:6:::0;::::1;24234:15;24211:39;24202:73;;;;-1:-1:-1::0;;;24202:73:0::1;;;;;;;:::i;:::-;24351:9;::::0;-1:-1:-1;;;;;24342:18:0;;::::1;24351:9:::0;::::1;24342:18;24338:265;;;24377:78;24410:5;24418:10;24439:4;24447:6;24377:31;:78::i;:::-;24338:265;;;24524:5;-1:-1:-1::0;;;;;24517:22:0::1;;24566:6;24517:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;24338:265;24613:31;24623:2;24628:5;24636:6;24613:8;:31::i;:::-;24663:45;24672:2;24684:4;24692:5;24700:6;24663:45;;;;;;;;;:::i;:::-;;;;;;;;24036:681:::0;;;:::o;24783:468::-;24875:6;;24841:11;;24875:6;;24885:1;24875:11;;:26;;-1:-1:-1;24890:6:0;;;;24900:1;24890:11;24875:26;24866:55;;;;-1:-1:-1;;;24866:55:0;;;;;;;:::i;:::-;24950:10;24933:14;24994:33;25011:5;24950:10;24994:15;:33::i;:::-;24972:55;;;;;25048:4;25039:13;;25064:30;25077:6;25086;25064:11;:30::i;:::-;-1:-1:-1;;;;;25136:20:0;;;;;;;:12;:20;;;;;;;;:27;;;;;;;;;;:41;;25169:6;25136:31;:41::i;:::-;-1:-1:-1;;;;;25106:20:0;;;;;;;:12;:20;;;;;;;;:27;;;;;;;;;:71;25211:17;;:31;;25234:6;25211:21;:31::i;:::-;25191:17;:51;-1:-1:-1;24783:468:0;;;-1:-1:-1;;24783:468:0:o;14435:21::-;;;-1:-1:-1;;;;;14435:21:0;;:::o;14163:33::-;;;;:::o;17248:844::-;17521:6;;17352:12;;;;;;;;;;-1:-1:-1;;;;;17512:15:0;;;17521:6;;17512:15;17508:575;;;-1:-1:-1;;17597:21:0;;:12;17642:18;17684:19;;17726:18;;17597:21;;-1:-1:-1;17642:18:0;;-1:-1:-1;17684:19:0;-1:-1:-1;17597:21:0;17508:575;;;-1:-1:-1;;17877:21:0;;:12;17922:18;17964:19;;18006:18;;17877:21;;-1:-1:-1;17922:18:0;;-1:-1:-1;17964:19:0;-1:-1:-1;17877:21:0;17508:575;17248:844;;;;;;;:::o;15874:546::-;15589:5;;-1:-1:-1;;;;;15589:5:0;15575:10;:19;15567:40;;;;-1:-1:-1;;;15567:40:0;;;;;;;:::i;:::-;16052:5:::1;:13:::0;;-1:-1:-1;;;;;16052:13:0;;::::1;-1:-1:-1::0;;;;;;16052:13:0;;::::1;;::::0;;;16076:14:::1;:21:::0;;;;::::1;::::0;;::::1;;::::0;;;;16108:9:::1;:16:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;16258:12:::1;::::0;;-1:-1:-1;;;16258:12:0;;;;16223:14;;;::::1;::::0;;;16258:10:::1;::::0;:12:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;16223:14;16258:12;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16249:6;;:21;;;;;-1:-1:-1::0;;;;;16249:21:0::1;;;;;-1:-1:-1::0;;;;;16249:21:0::1;;;;;;16290:3;-1:-1:-1::0;;;;;16290:10:0::1;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16281:6;:21:::0;;-1:-1:-1;;;;;;16281:21:0;;::::1;-1:-1:-1::0;;;;;16281:21:0;;::::1;;::::0;;;16315:12:::1;:27:::0;;;;16392:12:::1;:20:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;15874:546:0:o;13670:20::-;;;-1:-1:-1;;;;;13670:20:0;;:::o;13901:27::-;;;;:::o;13697:21::-;;;-1:-1:-1;;;13697:21:0;;;;;:::o;21849:140::-;21971:9;21849:140;;;;:::o;25356:3216::-;15589:5;;-1:-1:-1;;;;;15589:5:0;15575:10;:19;15567:40;;;;-1:-1:-1;;;15567:40:0;;;;;;;:::i;:::-;25598:12:::1;::::0;25811:9:::1;::::0;-1:-1:-1;;;;;25598:12:0;;::::1;::::0;25556:23:::1;::::0;25796:26:::1;::::0;25811:9:::1;25796:13;:26::i;:::-;25778:44;;25834:7;-1:-1:-1::0;;;;;25834:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25892:9:0::1;::::0;25860:14:::1;::::0;-1:-1:-1;25877:26:0::1;::::0;-1:-1:-1;;;;;;25892:9:0::1;25877:13;:26::i;:::-;25860:43:::0;-1:-1:-1;25917:13:0::1;25933:27;25860:43:::0;25948:10;25933:13:::1;:27::i;:::-;26041:14;::::0;26093:31:::1;::::0;-1:-1:-1;;;26093:31:0;;25917:43;;-1:-1:-1;;;;;;26041:14:0::1;::::0;26003:19:::1;::::0;26041:14;;26093::::1;::::0;:31:::1;::::0;26117:4:::1;::::0;26093:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26165:14;::::0;26069:55;;-1:-1:-1;26136:81:0::1;::::0;-1:-1:-1;;;;;26165:14:0::1;::::0;26069:55;26136:27:::1;:81::i;:::-;26229:26;::::0;-1:-1:-1;;;26229:26:0;;-1:-1:-1;;;;;26229:9:0;::::1;::::0;::::1;::::0;:26:::1;::::0;26248:4:::1;::::0;26229:26:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;26338:9:0::1;::::0;26299:21:::1;::::0;26323:26:::1;::::0;-1:-1:-1;;;;;26338:9:0::1;26323:13;:26::i;:::-;26299:50;;26361:14;26378:77;26436:17;;26378:52;26416:12;;26378:32;26400:8;26378:16;:20;;:32;;;;:::i;:::-;:36:::0;::::1;:52::i;:::-;:56:::0;::::1;:77::i;:::-;26361:94;;26523:8;26534:16;26540:8;26534:4;:16::i;:::-;26523:27:::0;-1:-1:-1;26588:14:0;;::::1;26702:29;;:::i;:::-;26747:6;::::0;26734:9:::1;::::0;-1:-1:-1;;;;;26734:9:0;;::::1;26747:6:::0;::::1;26734:19;:49;;26771:12;26734:49;;;26756:12;26734:49;26702:81;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;26702:81:0;;26933:28;-1:-1:-1;26929:1112:0::1;;;27023:16:::0;;:28;;::::1;::::0;27011:9:::1;::::0;27082:26:::1;::::0;27104:2:::1;27082:20;:26::i;:::-;27067:41;;27151:7;27144:4;:14;27140:149;;;27234:1;27218:17;;27271:1;27255:17;;27140:149;26929:1112;;;;;27385:29;;:::i;:::-;27430:6;::::0;27417:9:::1;::::0;-1:-1:-1;;;;;27417:9:0;;::::1;27430:6:::0;::::1;27417:19;:49;;27454:12;27417:49;;;27439:12;27417:49;27385:81;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;27554:9:::1;::::0;27544:6:::1;::::0;27385:81;;-1:-1:-1;;;;;;;;27544:6:0;;::::1;27554:9:::0;::::1;27544:19;:37;;27575:6;::::0;-1:-1:-1;;;;;27575:6:0::1;27544:37;;;27566:6;::::0;-1:-1:-1;;;;;27566:6:0::1;27544:37;27524:57;;27735:21;27759:26;27774:9;27759:13;:26::i;:::-;27813:16:::0;;27735:50;;-1:-1:-1;27813:35:0;;::::1;::::0;27801:9:::1;::::0;27879:24:::1;::::0;27900:2:::1;27879:20;:24::i;:::-;27864:39;;27930:7;27923:4;:14;27919:111;;;27975:1;27959:17;;28012:1;27996:17;;27919:111;26929:1112;;;;;;28103:9;::::0;28093:6:::1;::::0;28055:15:::1;::::0;;;-1:-1:-1;;;;;28093:6:0;;::::1;28103:9:::0;::::1;28093:19;:104;;28166:13;28182;28093:104;;;28131:13;28147;28093:104;28053:144;;;;28233:40;28269:2;28233:30;28251:10;28233:12;;:16;;:30;;;;:::i;:40::-;28211:19:::0;:62;28307:12:::1;::::0;:40:::1;::::0;28343:2:::1;::::0;28307:30:::1;::::0;28325:10;28307:16:::1;:30::i;:40::-;28285:19:::0;:62;28381:46:::1;28423:2;28381:36;:18:::0;28405:10;28381:22:::1;:36::i;:46::-;28361:17:::0;:66;28459:46:::1;28501:2;28459:36;:18:::0;28483:10;28459:22:::1;:36::i;:46::-;28439:17:::0;:66;-1:-1:-1;;28553:6:0::1;:10:::0;;-1:-1:-1;;28553:10:0::1;28562:1;28553:10;::::0;;-1:-1:-1;;;;;;;;;;;;;25356:3216:0:o;14387:21::-;;;-1:-1:-1;;;;;14387:21:0;;:::o;13852:26::-;;;-1:-1:-1;;;;;13852:26:0;;:::o;19749:2084::-;19837:13;19853:11;19867:9;19879:11;19906:12;19921:30;19934:15;19921:11;:30::i;:::-;-1:-1:-1;;;;;20026:19:0;;;20005:18;20026:19;;;:11;:19;;;;;;;;:26;;;;;;;;;;19906:45;;-1:-1:-1;20064:25:0;;:::i;:::-;20101:6;;-1:-1:-1;;;;;20092:15:0;;;20101:6;;20092:15;:45;;20125:12;20092:45;;;20110:12;20092:45;20064:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20162:35;20173:12;;20188:7;20162:9;:35::i;:::-;20151:46;-1:-1:-1;20218:1:0;;-1:-1:-1;20218:1:0;;-1:-1:-1;20218:1:0;;-1:-1:-1;20277:18:0;20273:83;;-1:-1:-1;20333:1:0;;-1:-1:-1;20333:1:0;;-1:-1:-1;20333:1:0;;-1:-1:-1;20313:31:0;;-1:-1:-1;;20313:31:0;20273:83;20372:13;;;;20368:83;;-1:-1:-1;20428:1:0;;-1:-1:-1;20428:1:0;;-1:-1:-1;20428:1:0;;-1:-1:-1;20408:31:0;;-1:-1:-1;;20408:31:0;20368:83;-1:-1:-1;;;;;20472:20:0;;;;;;;:12;:20;;;;;;;;:27;;;;;;;;;;;;20604:12;;20619:15;;20472:27;;-1:-1:-1;20593:43:0;;:9;:43::i;:::-;20574:62;;20648:18;20669:32;20688:11;20669:6;:13;;;:17;;:32;;;;:::i;:::-;20648:53;;20713:13;20754:12;;20744:7;:22;20740:268;;;-1:-1:-1;20795:1:0;;-1:-1:-1;20795:1:0;;-1:-1:-1;20849:11:0;20740:268;;;20906:35;20917:12;;20932:7;20906:9;:35::i;:::-;20895:46;-1:-1:-1;20968:27:0;:11;20895:46;20968:15;:27::i;:::-;20957:38;;20740:268;21162:12;;21062:14;;21079:107;;21162:22;;21179:4;21162:16;:22::i;:::-;21079:77;21143:11;21079:44;21118:4;21079:77;:13;21098;21079:17;:34::i;:107::-;21215:6;;21062:124;;-1:-1:-1;21215:6:0;;21225:1;21215:11;21211:613;;;21335:12;;21251:108;;21335:22;;21352:4;21335:16;:22::i;:::-;21251:78;21319:8;21251:44;21290:4;21251:78;:13;21270;21251:17;:34::i;:108::-;21244:115;-1:-1:-1;21398:9:0;21379:16;21244:115;21388:6;21379:8;:16::i;:::-;:28;21375:166;;;21437:1;21428:10;;21375:166;;;21489:35;21516:6;21489:21;:9;21504:4;21489:13;:21::i;:35::-;21480:44;;21375:166;21211:613;;;21563:6;;;;21573:1;21563:11;21558:266;;;21599:23;:9;21614:6;21599:13;:23::i;:::-;21592:30;;21647:1;21638:10;;21558:266;;;21672:6;;;;;:11;21667:157;;;21708:1;21701:8;;21734:9;21725:18;;21667:157;;;21784:1;21777:8;;21810:1;21801:10;;21667:157;19749:2084;;;;;;;;;;;;;;;:::o;14330:24::-;;;-1:-1:-1;;;;;14330:24:0;;:::o;33477:255::-;33543:9;33573:12;33564:44;;;;-1:-1:-1;;;33564:44:0;;;;;;;:::i;:::-;33645:9;;33635:6;;33620:12;;-1:-1:-1;;;;;33635:6:0;;;33645:9;;33635:19;:37;;33666:6;;-1:-1:-1;;;;;33666:6:0;33635:37;;;33657:6;;-1:-1:-1;;;;;33657:6:0;33635:37;33620:52;;33684:39;33693:4;33700:10;33713:8;33684:7;:39::i;:::-;33477:255;;:::o;10529:402::-;10708:12;10722:17;10743:5;-1:-1:-1;;;;;10743:10:0;10777;10789:4;10795:2;10799:5;10754:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10754:51:0;;;;;;;;;;;10743:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10707:99;;;;10825:7;:57;;;;-1:-1:-1;10837:11:0;;:16;;:44;;;10868:4;10857:24;;;;;;;;;;;;:::i;:::-;10817:106;;;;-1:-1:-1;;;10817:106:0;;;;;;;:::i;:::-;10529:402;;;;;;:::o;2479:181::-;2537:7;2569:5;;;2593:6;;;;2585:46;;;;-1:-1:-1;;;2585:46:0;;;;;;;:::i;:::-;2651:1;-1:-1:-1;2479:181:0;;;;;:::o;3833:471::-;3891:7;4136:6;4132:47;;-1:-1:-1;4166:1:0;4159:8;;4132:47;4203:5;;;4207:1;4203;:5;:1;4227:5;;;;;:10;4219:56;;;;-1:-1:-1;;;4219:56:0;;;;;;;:::i;4780:132::-;4838:7;4865:39;4869:1;4872;4865:39;;;;;;;;;;;;;;;;;:3;:39::i;10160:361::-;10309:12;10323:17;10344:5;-1:-1:-1;;;;;10344:10:0;10378;10390:2;10394:5;10355:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10355:45:0;;;;;;;;;;;10344:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10308:93;;;;10420:7;:57;;;;-1:-1:-1;10432:11:0;;:16;;:44;;;10463:4;10452:24;;;;;;;;;;;;:::i;:::-;10412:101;;;;-1:-1:-1;;;10412:101:0;;;;;;;:::i;:::-;10160:361;;;;;:::o;33027:442::-;33130:12;;33189:14;;33173:59;;-1:-1:-1;;;33173:59:0;;33063:10;;-1:-1:-1;;;;;33130:12:0;;;;33063:10;;33189:14;;;33173:42;;:59;;33225:4;;33173:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33301:14;;33318:12;;33156:76;;-1:-1:-1;33156:76:0;;-1:-1:-1;33273:70:0;;-1:-1:-1;;;;;33301:14:0;;;;33318:12;33156:76;33273:26;:70::i;:::-;33355:26;;-1:-1:-1;;;33355:26:0;;-1:-1:-1;;;;;33355:13:0;;;;;:26;;33370:9;;33355:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33027:442;;;:::o;33740:470::-;33827:12;33842:22;33857:5;33842:13;:22::i;:::-;33827:37;;33889:7;33880:6;:16;33876:66;;;33922:7;33913:16;;33876:66;33965:9;;-1:-1:-1;;;;;33956:18:0;;;33965:9;;33956:18;33952:251;;;33992:50;34021:5;34029:2;34034:6;33992:27;:50::i;:::-;33952:251;;;34097:33;;-1:-1:-1;;;34097:33:0;;-1:-1:-1;;;;;34097:23:0;;;;;:33;;34122:6;;34097:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34146:45;34178:2;34183:6;34146:30;:45::i;:::-;33740:470;;;;:::o;2943:136::-;3001:7;3028:43;3032:1;3035;3028:43;;;;;;;;;;;;;;;;;:3;:43::i;22517:768::-;22616:6;;-1:-1:-1;;;;;22607:15:0;;;22616:6;;22607:15;22603:118;;;22658:16;;22649:6;:25;22640:68;;;;-1:-1:-1;;;22640:68:0;;;;;;;:::i;:::-;22746:6;;-1:-1:-1;;;;;22737:15:0;;;22746:6;;22737:15;22733:118;;;22788:16;;22779:6;:25;22770:68;;;;-1:-1:-1;;;22770:68:0;;;;;;;:::i;:::-;22876:6;;-1:-1:-1;;;;;22867:15:0;;;22876:6;;22867:15;22863:161;;;22921:12;:18;:32;;22945:6;22921:22;:32::i;:::-;22900:12;:53;;;22969:21;:42;22863:161;23049:6;;-1:-1:-1;;;;;23040:15:0;;;23049:6;;23040:15;23036:161;;;23094:12;:18;:32;;23118:6;23094:22;:32::i;:::-;23073:12;:53;;;23142:21;:42;23036:161;-1:-1:-1;;;;;23238:19:0;;;;;;;:11;:19;;;;;;;;:26;;;;;;;;;;:39;;23269:6;23238:30;:39::i;:::-;-1:-1:-1;;;;;23209:19:0;;;;;;;:11;:19;;;;;;;;:26;;;;;;;;;;;;;;:68;;;;-1:-1:-1;22517:768:0:o;21997:512::-;22098:12;22113:37;22131:17;;22113:12;;:16;;:37;;;;:::i;:::-;22098:52;;22175:1;22166:6;:10;:25;;;;;22190:1;22180:7;:11;22166:25;22162:340;;;22222:7;22213:6;:16;22209:120;;;22259:7;22250:16;;22209:120;22372:11;;22343:56;;-1:-1:-1;;;;;22372:11:0;22386:2;22391:6;22343:27;:56::i;:::-;21997:512;;;:::o;34218:138::-;34305:42;;-1:-1:-1;;;34305:42:0;;34281:4;;-1:-1:-1;;;;;34305:25:0;;;;;:42;;34340:4;;34305:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23293:205::-;23341:8;23381:3;;23369:28;;23392:3;;23369:17;;:6;;-1:-1:-1;;;23381:3:0;;;;23369:10;:17::i;:28::-;23363:34;-1:-1:-1;23413:7:0;;23409:82;;23453:9;;;23465:5;23438:40;;-1:-1:-1;;;;;23453:9:0;;;;23465:5;23473:3;23438:13;:40::i;23506:350::-;23583:4;23618:10;23605:9;:23;23601:248;;-1:-1:-1;23653:1:0;23646:8;;23601:248;23695:26;:9;23709:10;23695:13;:26::i;:::-;23688:33;;;;5408:278;5494:7;5529:12;5522:5;5514:28;;;;-1:-1:-1;;;5514:28:0;;;;;;;;:::i;:::-;;5553:9;5569:1;5565;:5;;;;;;;5408:278;-1:-1:-1;;;;;5408:278:0:o;9794:358::-;9941:12;9955:17;9976:5;-1:-1:-1;;;;;9976:10:0;10010;10022:2;10026:5;9987:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9987:45:0;;;;;;;;;;;9976:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9940:93;;;;10052:7;:57;;;;-1:-1:-1;10064:11:0;;:16;;:44;;;10095:4;10084:24;;;;;;;;;;;;:::i;:::-;10044:100;;;;-1:-1:-1;;;10044:100:0;;;;;;;:::i;10939:195::-;11047:12;;;11009;11047;;;;;;;;;-1:-1:-1;;;;;11026:7:0;;;11040:5;;11026:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11008:52;;;11079:7;11071:55;;;;-1:-1:-1;;;11071:55:0;;;;;;;:::i;3382:192::-;3468:7;3504:12;3496:6;;;;3488:29;;;;-1:-1:-1;;;3488:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;3540:5:0;;;3382:192::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;976:241::-;;1080:2;1068:9;1059:7;1055:23;1051:32;1048:2;;;-1:-1;;1086:12;1048:2;85:6;72:20;97:33;124:5;97:33;:::i;1224:263::-;;1339:2;1327:9;1318:7;1314:23;1310:32;1307:2;;;-1:-1;;1345:12;1307:2;226:6;220:13;238:33;265:5;238:33;:::i;1494:366::-;;;1615:2;1603:9;1594:7;1590:23;1586:32;1583:2;;;-1:-1;;1621:12;1583:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1673:63;-1:-1;1773:2;1812:22;;72:20;97:33;72:20;97:33;:::i;:::-;1781:63;;;;1577:283;;;;;:::o;1867:743::-;;;;;;2039:3;2027:9;2018:7;2014:23;2010:33;2007:2;;;-1:-1;;2046:12;2007:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2098:63;-1:-1;2198:2;2237:22;;72:20;97:33;72:20;97:33;:::i;:::-;2206:63;-1:-1;2306:2;2345:22;;72:20;97:33;72:20;97:33;:::i;:::-;2314:63;-1:-1;2414:2;2453:22;;72:20;97:33;72:20;97:33;:::i;:::-;2001:609;;;;-1:-1;2001:609;;2522:3;2562:22;626:20;;2001:609;-1:-1;;2001:609::o;2617:491::-;;;;2755:2;2743:9;2734:7;2730:23;2726:32;2723:2;;;-1:-1;;2761:12;2723:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2813:63;-1:-1;2913:2;2952:22;;72:20;97:33;72:20;97:33;:::i;:::-;2717:391;;2921:63;;-1:-1;;;3021:2;3060:22;;;;626:20;;2717:391::o;3115:743::-;;;;;;3287:3;3275:9;3266:7;3262:23;3258:33;3255:2;;;-1:-1;;3294:12;3255:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3346:63;3446:2;3485:22;;626:20;;-1:-1;3554:2;3593:22;;626:20;;3662:2;3701:22;;626:20;;-1:-1;3770:3;3810:22;626:20;;-1:-1;3249:609;-1:-1;;;3249:609::o;3865:257::-;;3977:2;3965:9;3956:7;3952:23;3948:32;3945:2;;;-1:-1;;3983:12;3945:2;364:6;358:13;31493:5;29995:13;29988:21;31471:5;31468:32;31458:2;;-1:-1;;31504:12;4129:533;;;;4277:2;4265:9;4256:7;4252:23;4248:32;4245:2;;;-1:-1;;4283:12;4245:2;502:6;496:13;514:33;541:5;514:33;:::i;:::-;4446:2;4496:22;;496:13;4335:74;;-1:-1;514:33;496:13;514:33;:::i;:::-;4565:2;4614:22;;914:13;4454:74;;-1:-1;30416:10;30405:22;;31836:34;;31826:2;;-1:-1;;31874:12;31826:2;4573:73;;;;4239:423;;;;;:::o;4669:241::-;;4773:2;4761:9;4752:7;4748:23;4744:32;4741:2;;;-1:-1;;4779:12;4741:2;-1:-1;626:20;;4735:175;-1:-1;4735:175::o;4917:263::-;;5032:2;5020:9;5011:7;5007:23;5003:32;5000:2;;;-1:-1;;5038:12;5000:2;-1:-1;774:13;;4994:186;-1:-1;4994:186::o;5187:399::-;;;5319:2;5307:9;5298:7;5294:23;5290:32;5287:2;;;-1:-1;;5325:12;5287:2;-1:-1;;774:13;;5488:2;5538:22;;;774:13;;;;;-1:-1;5281:305::o;13601:271::-;;6022:5;29336:12;6133:52;6178:6;6173:3;6166:4;6159:5;6155:16;6133:52;:::i;:::-;6197:16;;;;;13735:137;-1:-1;;13735:137::o;13879:222::-;-1:-1;;;;;30199:54;;;;5813:37;;14006:2;13991:18;;13977:124::o;14353:812::-;-1:-1;;;;;30199:54;;;5672:58;;30199:54;;;14817:2;14802:18;;5672:58;30199:54;;;;14900:2;14885:18;;5813:37;14983:2;14968:18;;13438:37;15066:3;15051:19;;13438:37;;;;30210:42;15135:19;;13438:37;;;;14636:3;14621:19;;14607:558::o;15172:572::-;-1:-1;;;;;30199:54;;;5813:37;;30199:54;;;15564:2;15549:18;;5672:58;30199:54;;15647:2;15632:18;;5813:37;15730:2;15715:18;;13438:37;;;;15391:3;15376:19;;15362:382::o;15751:444::-;-1:-1;;;;;30199:54;;;5813:37;;30199:54;;;;16098:2;16083:18;;5813:37;16181:2;16166:18;;13438:37;;;;15934:2;15919:18;;15905:290::o;16202:333::-;-1:-1;;;;;30199:54;;;;5813:37;;16521:2;16506:18;;13438:37;16357:2;16342:18;;16328:207::o;16542:310::-;;16689:2;16710:17;16703:47;6370:5;29336:12;29775:6;16689:2;16678:9;16674:18;29763:19;6464:52;6509:6;29803:14;16678:9;29803:14;16689:2;6490:5;6486:16;6464:52;:::i;:::-;31267:7;31251:14;-1:-1;;31247:28;6528:39;;;;29803:14;6528:39;;16660:192;-1:-1;;16660:192::o;16859:416::-;17059:2;17073:47;;;6804:2;17044:18;;;29763:19;6840:33;29803:14;;;6820:54;6893:12;;;17030:245::o;17282:416::-;17482:2;17496:47;;;7144:2;17467:18;;;29763:19;7180:34;29803:14;;;7160:55;-1:-1;;;7235:12;;;7228:31;7278:12;;;17453:245::o;17705:416::-;17905:2;17919:47;;;7529:2;17890:18;;;29763:19;-1:-1;;;29803:14;;;7545:42;7606:12;;;17876:245::o;18128:416::-;18328:2;18342:47;;;7857:2;18313:18;;;29763:19;-1:-1;;;29803:14;;;7873:39;7931:12;;;18299:245::o;18551:416::-;18751:2;18765:47;;;8182:2;18736:18;;;29763:19;8218:29;29803:14;;;8198:50;8267:12;;;18722:245::o;18974:416::-;19174:2;19188:47;;;8518:2;19159:18;;;29763:19;8554:29;29803:14;;;8534:50;8603:12;;;19145:245::o;19397:416::-;19597:2;19611:47;;;8854:2;19582:18;;;29763:19;8890:32;29803:14;;;8870:53;8942:12;;;19568:245::o;19820:416::-;20020:2;20034:47;;;9193:2;20005:18;;;29763:19;-1:-1;;;29803:14;;;9209:40;9268:12;;;19991:245::o;20243:416::-;20443:2;20457:47;;;9519:2;20428:18;;;29763:19;-1:-1;;;29803:14;;;9535:36;9590:12;;;20414:245::o;20666:416::-;20866:2;20880:47;;;9841:2;20851:18;;;29763:19;-1:-1;;;29803:14;;;9857:35;9911:12;;;20837:245::o;21089:416::-;21289:2;21303:47;;;10162:1;21274:18;;;29763:19;-1:-1;;;29803:14;;;10177:31;10227:12;;;21260:245::o;21512:416::-;21712:2;21726:47;;;10478:2;21697:18;;;29763:19;10514:29;29803:14;;;10494:50;10563:12;;;21683:245::o;21935:416::-;22135:2;22149:47;;;10814:2;22120:18;;;29763:19;10850:28;29803:14;;;10830:49;10898:12;;;22106:245::o;22358:416::-;22558:2;22572:47;;;11149:2;22543:18;;;29763:19;11185:34;29803:14;;;11165:55;-1:-1;;;11240:12;;;11233:25;11277:12;;;22529:245::o;22781:416::-;22981:2;22995:47;;;11528:2;22966:18;;;29763:19;-1:-1;;;29803:14;;;11544:41;11604:12;;;22952:245::o;23204:416::-;23404:2;23418:47;;;11855:2;23389:18;;;29763:19;-1:-1;;;29803:14;;;11871:43;11933:12;;;23375:245::o;23627:416::-;23827:2;23841:47;;;12184:2;23812:18;;;29763:19;12220:34;29803:14;;;12200:55;-1:-1;;;12275:12;;;12268:27;12314:12;;;23798:245::o;24050:416::-;24250:2;24264:47;;;12565:2;24235:18;;;29763:19;-1:-1;;;29803:14;;;12581:42;12642:12;;;24221:245::o;24473:416::-;24673:2;24687:47;;;12893:2;24658:18;;;29763:19;12929:34;29803:14;;;12909:55;-1:-1;;;12984:12;;;12977:28;13024:12;;;24644:245::o;24896:416::-;25096:2;25110:47;;;13275:1;25081:18;;;29763:19;-1:-1;;;29803:14;;;13290:32;13341:12;;;25067:245::o;25319:222::-;13438:37;;;25446:2;25431:18;;25417:124::o;25548:1448::-;13438:37;;;26146:2;26131:18;;13438:37;;;;-1:-1;;;;;30199:54;;;26229:2;26214:18;;5813:37;26312:2;26297:18;;13438:37;;;;30510:4;30499:16;;;;26391:3;26376:19;;13554:35;30210:42;26460:19;;13438:37;;;;30199:54;;;26559:3;26544:19;;5813:37;30199:54;;26643:3;26628:19;;5813:37;30199:54;;26727:3;26712:19;;5813:37;30199:54;;;26811:3;26796:19;;5813:37;26896:3;26881:19;;13438:37;26981:3;26966:19;;13438:37;25981:3;25966:19;;25952:1044::o;27003:556::-;13438:37;;;27379:2;27364:18;;13438:37;;;;27462:2;27447:18;;13438:37;27545:2;27530:18;;13438:37;27214:3;27199:19;;27185:374::o;27566:668::-;13438:37;;;27970:2;27955:18;;13438:37;;;;28053:2;28038:18;;13438:37;;;;28136:2;28121:18;;13438:37;28219:3;28204:19;;13438:37;27805:3;27790:19;;27776:458::o;28241:780::-;13438:37;;;28673:2;28658:18;;13438:37;;;;28756:2;28741:18;;13438:37;;;;28839:2;28824:18;;13438:37;28922:3;28907:19;;13438:37;29006:3;28991:19;;13438:37;28508:3;28493:19;;28479:542::o;29028:214::-;30510:4;30499:16;;;;13554:35;;29151:2;29136:18;;29122:120::o;30907:268::-;30972:1;30979:101;30993:6;30990:1;30987:13;30979:101;;;31060:11;;;31054:18;31041:11;;;31034:39;31015:2;31008:10;30979:101;;;31095:6;31092:1;31089:13;31086:2;;;-1:-1;;30972:1;31142:16;;31135:27;30956:219::o;31288:117::-;-1:-1;;;;;30199:54;;31347:35;;31337:2;;31396:1;;31386:12;31337:2;31331:74;:::o;31530:117::-;-1:-1;;;;;31617:5;30083:42;31592:5;31589:35;31579:2;;31638:1;;31628:12
Swarm Source
ipfs://4c97c85cc8e2bea6d9060485b8f55c334ba28b9e1cf7e63e87fdc138bee0590c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $3,447.96 | 0.00009839 | $0.3392 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.