ETH Price: $3,442.94 (-6.31%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Liquidity An...121480212021-03-31 15:53:321378 days ago1617206012IN
0x8146824b...915AE6C77
0 ETH0.03054907257
Active121480022021-03-31 15:49:231378 days ago1617205763IN
0x8146824b...915AE6C77
0 ETH0.01256294256
Deposit121479192021-03-31 15:31:201378 days ago1617204680IN
0x8146824b...915AE6C77
0 ETH0.0224476247
Active121479092021-03-31 15:30:281378 days ago1617204628IN
0x8146824b...915AE6C77
0 ETH0.01108387247
Deposit121478852021-03-31 15:25:241378 days ago1617204324IN
0x8146824b...915AE6C77
0 ETH0.02209719246.00000145
Active121478352021-03-31 15:14:191378 days ago1617203659IN
0x8146824b...915AE6C77
0 ETH0.01207515246
Set Reward121477382021-03-31 14:50:421378 days ago1617202242IN
0x8146824b...915AE6C77
0 ETH0.01456561202
Active121476462021-03-31 14:27:421378 days ago1617200862IN
0x8146824b...915AE6C77
0 ETH0.01251834190
Finish121453082021-03-31 5:39:081378 days ago1617169148IN
0x8146824b...915AE6C77
0 ETH0.0372057113.00000145
Redeem119730342021-03-04 17:02:151405 days ago1614877335IN
0x8146824b...915AE6C77
0 ETH0.01005104143.00000156
Redeem119730322021-03-04 17:01:301405 days ago1614877290IN
0x8146824b...915AE6C77
0 ETH0.00997961142.00000156
Redeem119730282021-03-04 16:59:471405 days ago1614877187IN
0x8146824b...915AE6C77
0 ETH0.00864431123.00000156
Redeem119730242021-03-04 16:58:571405 days ago1614877137IN
0x8146824b...915AE6C77
0 ETH0.00948766135.00000156
Redeem119730222021-03-04 16:58:271405 days ago1614877107IN
0x8146824b...915AE6C77
0 ETH0.00990933141.00000156
Redeem119730142021-03-04 16:56:461405 days ago1614877006IN
0x8146824b...915AE6C77
0 ETH0.00962822137.00000156
Redeem119730072021-03-04 16:54:471405 days ago1614876887IN
0x8146824b...915AE6C77
0 ETH0.00885515126.00000156
Redeem119730042021-03-04 16:54:021405 days ago1614876842IN
0x8146824b...915AE6C77
0 ETH0.00892543127.00000156
Redeem119729962021-03-04 16:52:561405 days ago1614876776IN
0x8146824b...915AE6C77
0 ETH0.01026073146.00000156
Redeem119729952021-03-04 16:52:181405 days ago1614876738IN
0x8146824b...915AE6C77
0 ETH0.01019045145.00000156
Redeem119729922021-03-04 16:51:351405 days ago1614876695IN
0x8146824b...915AE6C77
0 ETH0.01024149145.00000156
Redeem119729872021-03-04 16:50:501405 days ago1614876650IN
0x8146824b...915AE6C77
0 ETH0.00897013127.00000156
Redeem119729832021-03-04 16:50:211405 days ago1614876621IN
0x8146824b...915AE6C77
0 ETH0.00847572120.00000156
Redeem119729742021-03-04 16:48:161405 days ago1614876496IN
0x8146824b...915AE6C77
0 ETH0.00995897141.00000156
Redeem119729522021-03-04 16:43:371405 days ago1614876217IN
0x8146824b...915AE6C77
0 ETH0.0088995126.00000145
Redeem119727682021-03-04 16:02:501405 days ago1614873770IN
0x8146824b...915AE6C77
0 ETH0.00919821130.90000023
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
119397462021-02-27 13:57:231410 days ago1614434243
0x8146824b...915AE6C77
2 ETH
119390152021-02-27 11:14:201410 days ago1614424460
0x8146824b...915AE6C77
3.5 ETH
119384362021-02-27 9:04:281410 days ago1614416668
0x8146824b...915AE6C77
30 ETH
119381992021-02-27 8:10:111410 days ago1614413411
0x8146824b...915AE6C77
0.4 ETH
119381922021-02-27 8:08:131410 days ago1614413293
0x8146824b...915AE6C77
1.5 ETH
119380632021-02-27 7:40:111410 days ago1614411611
0x8146824b...915AE6C77
0.4 ETH
119378462021-02-27 6:51:281410 days ago1614408688
0x8146824b...915AE6C77
17.5 ETH
119370282021-02-27 3:49:081410 days ago1614397748
0x8146824b...915AE6C77
3 ETH
119369002021-02-27 3:20:451410 days ago1614396045
0x8146824b...915AE6C77
1.6 ETH
119368002021-02-27 2:58:301410 days ago1614394710
0x8146824b...915AE6C77
0.4925 ETH
119367772021-02-27 2:53:081410 days ago1614394388
0x8146824b...915AE6C77
1.65 ETH
119367772021-02-27 2:53:081410 days ago1614394388
0x8146824b...915AE6C77
1.65 ETH
119367252021-02-27 2:42:361410 days ago1614393756
0x8146824b...915AE6C77
0.4 ETH
119366332021-02-27 2:19:581410 days ago1614392398
0x8146824b...915AE6C77
0.2 ETH
119366302021-02-27 2:19:171410 days ago1614392357
0x8146824b...915AE6C77
0.2 ETH
119365082021-02-27 1:52:041410 days ago1614390724
0x8146824b...915AE6C77
0.9 ETH
119359862021-02-26 23:56:241410 days ago1614383784
0x8146824b...915AE6C77
1.5 ETH
119357472021-02-26 23:06:521410 days ago1614380812
0x8146824b...915AE6C77
3 ETH
119356892021-02-26 22:55:171410 days ago1614380117
0x8146824b...915AE6C77
0.7 ETH
119353082021-02-26 21:35:231410 days ago1614375323
0x8146824b...915AE6C77
50 ETH
119352362021-02-26 21:15:331410 days ago1614374133
0x8146824b...915AE6C77
6.5 ETH
119347942021-02-26 19:40:571410 days ago1614368457
0x8146824b...915AE6C77
1 ETH
119347942021-02-26 19:40:571410 days ago1614368457
0x8146824b...915AE6C77
1 ETH
119347292021-02-26 19:25:291410 days ago1614367529
0x8146824b...915AE6C77
1 ETH
119346632021-02-26 19:08:341410 days ago1614366514
0x8146824b...915AE6C77
4.5 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PairPairX

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

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

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.