ETH Price: $2,328.14 (-0.60%)

Contract

0x8764f2c305b79680CfCc3398a96aedeA9260f7ff
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw130745872021-08-22 10:36:261115 days ago1629628586IN
0x8764f2c3...A9260f7ff
0 ETH0.0170848324
Withdraw127207992021-06-28 5:57:171170 days ago1624859837IN
0x8764f2c3...A9260f7ff
0 ETH0.002735084.1
Withdraw126433652021-06-16 4:21:281182 days ago1623817288IN
0x8764f2c3...A9260f7ff
0 ETH0.004407037
Withdraw125393742021-05-31 2:08:121198 days ago1622426892IN
0x8764f2c3...A9260f7ff
0 ETH0.0111911218
Withdraw125148352021-05-27 6:34:041202 days ago1622097244IN
0x8764f2c3...A9260f7ff
0 ETH0.0108570725
Withdraw124826712021-05-22 7:03:151207 days ago1621666995IN
0x8764f2c3...A9260f7ff
0 ETH0.0314413352
Withdraw123131762021-04-26 2:12:451233 days ago1619403165IN
0x8764f2c3...A9260f7ff
0 ETH0.0310776550
Withdraw123075062021-04-25 5:22:191234 days ago1619328139IN
0x8764f2c3...A9260f7ff
0 ETH0.0248621240
Withdraw122929172021-04-22 23:12:281236 days ago1619133148IN
0x8764f2c3...A9260f7ff
0 ETH0.0554961690
Withdraw119500352021-03-01 3:59:221289 days ago1614571162IN
0x8764f2c3...A9260f7ff
0 ETH0.0250998285
Withdraw119499462021-03-01 3:36:251289 days ago1614569785IN
0x8764f2c3...A9260f7ff
0 ETH0.0228634792
Withdraw119499192021-03-01 3:31:121289 days ago1614569472IN
0x8764f2c3...A9260f7ff
0 ETH0.0171999982
Withdraw118529582021-02-14 5:33:441304 days ago1613280824IN
0x8764f2c3...A9260f7ff
0 ETH0.0135875106
Withdraw117541242021-01-30 0:41:301319 days ago1611967290IN
0x8764f2c3...A9260f7ff
0 ETH0.0326207255
Get All Rewards117463642021-01-28 20:03:541320 days ago1611864234IN
0x8764f2c3...A9260f7ff
0 ETH0.0043530550
Get All Rewards117435312021-01-28 9:36:201321 days ago1611826580IN
0x8764f2c3...A9260f7ff
0 ETH0.0061813371
Get All Rewards116504772021-01-14 2:06:331335 days ago1610589993IN
0x8764f2c3...A9260f7ff
0 ETH0.001795640
Withdraw116504632021-01-14 2:03:551335 days ago1610589835IN
0x8764f2c3...A9260f7ff
0 ETH0.024549138
Withdraw116470752021-01-13 14:10:571336 days ago1610547057IN
0x8764f2c3...A9260f7ff
0 ETH0.0243049640
Withdraw116223922021-01-09 19:09:501339 days ago1610219390IN
0x8764f2c3...A9260f7ff
0 ETH0.029546450
Withdraw116193932021-01-09 8:01:121340 days ago1610179272IN
0x8764f2c3...A9260f7ff
0 ETH0.0302591662
Withdraw116132962021-01-08 9:41:521341 days ago1610098912IN
0x8764f2c3...A9260f7ff
0 ETH0.0386311860
Withdraw116073822021-01-07 11:50:571342 days ago1610020257IN
0x8764f2c3...A9260f7ff
0 ETH0.003355
Withdraw115939922021-01-05 10:30:301344 days ago1609842630IN
0x8764f2c3...A9260f7ff
0 ETH0.0218714157
Withdraw115939842021-01-05 10:28:361344 days ago1609842516IN
0x8764f2c3...A9260f7ff
0 ETH0.0180593662
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ValueMultiVaultBank

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 2020-11-09
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/**
 * @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);
}

/**
 * @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 Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IValueVaultMaster {
    function bank(address) view external returns (address);
    function isVault(address) view external returns (bool);
    function isController(address) view external returns (bool);
    function isStrategy(address) view external returns (bool);

    function slippage(address) view external returns (uint);
    function convertSlippage(address _input, address _output) view external returns (uint);

    function valueToken() view external returns (address);
    function govVault() view external returns (address);
    function insuranceFund() view external returns (address);
    function performanceReward() view external returns (address);

    function govVaultProfitShareFee() view external returns (uint);
    function gasFee() view external returns (uint);
    function insuranceFee() view external returns (uint);
    function withdrawalProtectionFee() view external returns (uint);
}

interface IValueMultiVault {
    function cap() external view returns (uint);
    function getConverter(address _want) external view returns (address);
    function getVaultMaster() external view returns (address);
    function balance() external view returns (uint);
    function token() external view returns (address);
    function available(address _want) external view returns (uint);
    function accept(address _input) external view returns (bool);

    function claimInsurance() external;
    function earn(address _want) external;
    function harvest(address reserve, uint amount) external;

    function withdraw_fee(uint _shares) external view returns (uint);
    function calc_token_amount_deposit(uint[] calldata _amounts) external view returns (uint);
    function calc_token_amount_withdraw(uint _shares, address _output) external view returns (uint);
    function convert_rate(address _input, uint _amount) external view returns (uint);
    function getPricePerFullShare() external view returns (uint);
    function get_virtual_price() external view returns (uint); // average dollar value of vault share token

    function deposit(address _input, uint _amount, uint _min_mint_amount) external returns (uint _mint_amount);
    function depositFor(address _account, address _to, address _input, uint _amount, uint _min_mint_amount) external returns (uint _mint_amount);
    function depositAll(uint[] calldata _amounts, uint _min_mint_amount) external returns (uint _mint_amount);
    function depositAllFor(address _account, address _to, uint[] calldata _amounts, uint _min_mint_amount) external returns (uint _mint_amount);
    function withdraw(uint _shares, address _output, uint _min_output_amount) external returns (uint);
    function withdrawFor(address _account, uint _shares, address _output, uint _min_output_amount) external returns (uint _output_amount);

    function harvestStrategy(address _strategy) external;
    function harvestWant(address _want) external;
    function harvestAllStrategies() external;
}

interface IMultiVaultConverter {
    function token() external returns (address);
    function get_virtual_price() external view returns (uint);

    function convert_rate(address _input, address _output, uint _inputAmount) external view returns (uint _outputAmount);
    function calc_token_amount_deposit(uint[] calldata _amounts) external view returns (uint _shareAmount);
    function calc_token_amount_withdraw(uint _shares, address _output) external view returns (uint _outputAmount);

    function convert(address _input, address _output, uint _inputAmount) external returns (uint _outputAmount);
    function convertAll(uint[] calldata _amounts) external returns (uint _outputAmount);
}

interface IFreeFromUpTo {
    function freeFromUpTo(address from, uint value) external returns (uint freed);
}

contract ValueMultiVaultBank {
    using SafeMath for uint;
    using SafeERC20 for IERC20;

    IFreeFromUpTo public constant chi = IFreeFromUpTo(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c);

    modifier discountCHI(uint8 _flag) {
        if ((_flag & 0x1) == 0) {
            _;
        } else {
            uint gasStart = gasleft();
            _;
            uint gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length;
            chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41130);
        }
    }

    IERC20 public valueToken = IERC20(0x49E833337ECe7aFE375e44F4E3e8481029218E5c);

    address public governance;
    address public strategist; // who can call harvestXXX()

    IValueVaultMaster public vaultMaster;
    
    struct UserInfo {
        uint amount;
        mapping(uint8 => uint) rewardDebt;
        mapping(uint8 => uint) accumulatedEarned; // will accumulate every time user harvest
    }

    struct RewardPoolInfo {
        IERC20 rewardToken;     // Address of rewardPool token contract.
        uint lastRewardBlock;   // Last block number that rewardPool distribution occurs.
        uint endRewardBlock;    // Block number which rewardPool distribution ends.
        uint rewardPerBlock;    // Reward token amount to distribute per block.
        uint accRewardPerShare; // Accumulated rewardPool per share, times 1e18.
        uint totalPaidRewards;  // for stat only
    }

    mapping(address => RewardPoolInfo[]) public rewardPoolInfos; // vault address => pool info
    mapping(address => mapping(address => UserInfo)) public userInfo; // vault address => account => userInfo

    event Deposit(address indexed vault, address indexed user, uint amount);
    event Withdraw(address indexed vault, address indexed user, uint amount);
    event RewardPaid(address indexed vault, uint pid, address indexed user, uint reward);

    constructor(IERC20 _valueToken, IValueVaultMaster _vaultMaster) public {
        valueToken = _valueToken;
        vaultMaster = _vaultMaster;
        governance = msg.sender;
        strategist = msg.sender;
    }

    function setGovernance(address _governance) external {
        require(msg.sender == governance, "!governance");
        governance = _governance;
    }

    function setStrategist(address _strategist) external {
        require(msg.sender == governance, "!governance");
        strategist = _strategist;
    }

    function setVaultMaster(IValueVaultMaster _vaultMaster) external {
        require(msg.sender == governance, "!governance");
        vaultMaster = _vaultMaster;
    }

    function addVaultRewardPool(address _vault, IERC20 _rewardToken, uint _startBlock, uint _endRewardBlock, uint _rewardPerBlock) external {
        require(msg.sender == governance, "!governance");
        RewardPoolInfo[] storage rewardPools = rewardPoolInfos[_vault];
        require(rewardPools.length < 8, "exceed rwdPoolLim");
        _startBlock = (block.number > _startBlock) ? block.number : _startBlock;
        require(_startBlock <= _endRewardBlock, "sVB>eVB");
        updateReward(_vault);
        rewardPools.push(RewardPoolInfo({
            rewardToken : _rewardToken,
            lastRewardBlock : _startBlock,
            endRewardBlock : _endRewardBlock,
            rewardPerBlock : _rewardPerBlock,
            accRewardPerShare : 0,
            totalPaidRewards : 0
            }));
    }

    function updateRewardPool(address _vault, uint8 _pid, uint _endRewardBlock, uint _rewardPerBlock) external {
        require(msg.sender == governance, "!governance");
        updateRewardPool(_vault, _pid);
        RewardPoolInfo storage rewardPool = rewardPoolInfos[_vault][_pid];
        require(block.number <= rewardPool.endRewardBlock, "late");
        rewardPool.endRewardBlock = _endRewardBlock;
        rewardPool.rewardPerBlock = _rewardPerBlock;
    }

    function updateReward(address _vault) public {
        uint8 rewardPoolLength = uint8(rewardPoolInfos[_vault].length);
        for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) {
            updateRewardPool(_vault, _pid);
        }
    }

    function updateRewardPool(address _vault, uint8 _pid) public {
        RewardPoolInfo storage rewardPool = rewardPoolInfos[_vault][_pid];
        uint _endRewardBlockApplicable = block.number > rewardPool.endRewardBlock ? rewardPool.endRewardBlock : block.number;
        if (_endRewardBlockApplicable > rewardPool.lastRewardBlock) {
            uint lpSupply = IERC20(address(_vault)).balanceOf(address(this));
            if (lpSupply > 0) {
                uint _numBlocks = _endRewardBlockApplicable.sub(rewardPool.lastRewardBlock);
                uint _incRewardPerShare = _numBlocks.mul(rewardPool.rewardPerBlock).mul(1e18).div(lpSupply);
                rewardPool.accRewardPerShare = rewardPool.accRewardPerShare.add(_incRewardPerShare);
            }
            rewardPool.lastRewardBlock = _endRewardBlockApplicable;
        }
    }

    function cap(IValueMultiVault _vault) external view returns (uint) {
        return _vault.cap();
    }

    function approveForSpender(IERC20 _token, address _spender, uint _amount) external {
        require(msg.sender == governance, "!governance");
        require(!vaultMaster.isVault(address(_token)), "vaultToken");
        _token.safeApprove(_spender, _amount);
    }

    function deposit(IValueMultiVault _vault, address _input, uint _amount, uint _min_mint_amount, bool _isStake, uint8 _flag) public discountCHI(_flag) {
        require(_vault.accept(_input), "vault does not accept this asset");
        require(_amount > 0, "!_amount");

        if (!_isStake) {
            _vault.depositFor(msg.sender, msg.sender, _input, _amount, _min_mint_amount);
        } else {
            uint _mint_amount = _vault.depositFor(msg.sender, address(this), _input, _amount, _min_mint_amount);
            _stakeVaultShares(address(_vault), _mint_amount);
        }
    }

    function depositAll(IValueMultiVault _vault, uint[] calldata _amounts, uint _min_mint_amount, bool _isStake, uint8 _flag) public discountCHI(_flag) {
        if (!_isStake) {
            _vault.depositAllFor(msg.sender, msg.sender, _amounts, _min_mint_amount);
        } else {
            uint _mint_amount = _vault.depositAllFor(msg.sender, address(this), _amounts, _min_mint_amount);
            _stakeVaultShares(address(_vault), _mint_amount);
        }
    }

    function stakeVaultShares(address _vault, uint _shares) external {
        uint _before = IERC20(address(_vault)).balanceOf(address(this));
        IERC20(address(_vault)).safeTransferFrom(msg.sender, address(this), _shares);
        uint _after = IERC20(address(_vault)).balanceOf(address(this));
        _shares = _after.sub(_before); // Additional check for deflationary tokens
        _stakeVaultShares(_vault, _shares);
    }

    function _stakeVaultShares(address _vault, uint _shares) internal {
        UserInfo storage user = userInfo[_vault][msg.sender];
        updateReward(_vault);
        if (user.amount > 0) {
            getAllRewards(_vault, msg.sender, uint8(0));
        }
        user.amount = user.amount.add(_shares);
        RewardPoolInfo[] storage rewardPools = rewardPoolInfos[_vault];
        uint8 rewardPoolLength = uint8(rewardPools.length);
        for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) {
            user.rewardDebt[_pid] = user.amount.mul(rewardPools[_pid].accRewardPerShare).div(1e18);
        }
        emit Deposit(_vault, msg.sender, _shares);
    }

    // call unstake(_vault, 0) for getting reward
    function unstake(address _vault, uint _amount, uint8 _flag) public discountCHI(_flag) {
        UserInfo storage user = userInfo[_vault][msg.sender];
        updateReward(_vault);
        if (user.amount > 0) {
            getAllRewards(_vault, msg.sender, uint8(0));
        }
        if (_amount > 0) {
            user.amount = user.amount.sub(_amount);
            IERC20(address(_vault)).safeTransfer(msg.sender, _amount);
        }
        RewardPoolInfo[] storage rewardPools = rewardPoolInfos[_vault];
        uint8 rewardPoolLength = uint8(rewardPools.length);
        for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) {
            user.rewardDebt[_pid] = user.amount.mul(rewardPools[_pid].accRewardPerShare).div(1e18);
        }
        emit Withdraw(_vault, msg.sender, _amount);
    }

    // using PUSH pattern
    function getAllRewards(address _vault, address _account, uint8 _flag) public discountCHI(_flag) {
        uint8 rewardPoolLength = uint8(rewardPoolInfos[_vault].length);
        for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) {
            getReward(_vault, _pid, _account, uint8(0));
        }
    }

    function getReward(address _vault, uint8 _pid, address _account, uint8 _flag) public discountCHI(_flag) {
        updateRewardPool(_vault, _pid);
        UserInfo storage user = userInfo[_vault][_account];
        RewardPoolInfo storage rewardPool = rewardPoolInfos[_vault][_pid];
        uint _pendingReward = user.amount.mul(rewardPool.accRewardPerShare).div(1e18).sub(user.rewardDebt[_pid]);
        if (_pendingReward > 0) {
            user.accumulatedEarned[_pid] = user.accumulatedEarned[_pid].add(_pendingReward);
            rewardPool.totalPaidRewards = rewardPool.totalPaidRewards.add(_pendingReward);
            safeTokenTransfer(rewardPool.rewardToken, _account, _pendingReward);
            emit RewardPaid(_vault, _pid, _account, _pendingReward);
            user.rewardDebt[_pid] = user.amount.mul(rewardPool.accRewardPerShare).div(1e18);
        }
    }

    function pendingReward(address _vault, uint8 _pid, address _account) public view returns (uint _pending) {
        UserInfo storage user = userInfo[_vault][_account];
        RewardPoolInfo storage rewardPool = rewardPoolInfos[_vault][_pid];
        uint _accRewardPerShare = rewardPool.accRewardPerShare;
        uint lpSupply = IERC20(_vault).balanceOf(address(this));
        uint _endRewardBlockApplicable = block.number > rewardPool.endRewardBlock ? rewardPool.endRewardBlock : block.number;
        if (_endRewardBlockApplicable > rewardPool.lastRewardBlock && lpSupply != 0) {
            uint _numBlocks = _endRewardBlockApplicable.sub(rewardPool.lastRewardBlock);
            uint _incRewardPerShare = _numBlocks.mul(rewardPool.rewardPerBlock).mul(1e18).div(lpSupply);
            _accRewardPerShare = _accRewardPerShare.add(_incRewardPerShare);
        }
        _pending = user.amount.mul(_accRewardPerShare).div(1e18).sub(user.rewardDebt[_pid]);
    }

    function shares_owner(address _vault, address _account) public view returns (uint) {
        return IERC20(_vault).balanceOf(_account).add(userInfo[_vault][_account].amount);
    }

    // No rebalance implementation for lower fees and faster swaps
    function withdraw(address _vault, uint _shares, address _output, uint _min_output_amount, uint8 _flag) public discountCHI(_flag) {
        uint _userBal = IERC20(address(_vault)).balanceOf(msg.sender);
        if (_shares > _userBal) {
            uint _need = _shares.sub(_userBal);
            require(_need <= userInfo[_vault][msg.sender].amount, "_userBal+staked < _shares");
            unstake(_vault, _need, uint8(0));
        }
        IERC20(address(_vault)).safeTransferFrom(msg.sender, address(this), _shares);
        IValueMultiVault(_vault).withdrawFor(msg.sender, _shares, _output, _min_output_amount);
    }

    function exit(address _vault, address _output, uint _min_output_amount, uint8 _flag) external discountCHI(_flag) {
        unstake(_vault, userInfo[_vault][msg.sender].amount, uint8(0));
        withdraw(_vault, IERC20(address(_vault)).balanceOf(msg.sender), _output, _min_output_amount, uint8(0));
    }

    function withdraw_fee(IValueMultiVault _vault, uint _shares) external view returns (uint) {
        return _vault.withdraw_fee(_shares);
    }

    function calc_token_amount_deposit(IValueMultiVault _vault, uint[] calldata _amounts) external view returns (uint) {
        return _vault.calc_token_amount_deposit(_amounts);
    }

    function calc_token_amount_withdraw(IValueMultiVault _vault, uint _shares, address _output) external view returns (uint) {
        return _vault.calc_token_amount_withdraw(_shares, _output);
    }

    function convert_rate(IValueMultiVault _vault, address _input, uint _amount) external view returns (uint) {
        return _vault.convert_rate(_input, _amount);
    }

    function harvestStrategy(IValueMultiVault _vault, address _strategy, uint8 _flag) external discountCHI(_flag) {
        require(msg.sender == strategist || msg.sender == governance, "!strategist");
        _vault.harvestStrategy(_strategy);
    }

    function harvestWant(IValueMultiVault _vault, address _want, uint8 _flag) external discountCHI(_flag) {
        require(msg.sender == strategist || msg.sender == governance, "!strategist");
        _vault.harvestWant(_want);
    }

    function harvestAllStrategies(IValueMultiVault _vault, uint8 _flag) external discountCHI(_flag) {
        require(msg.sender == strategist || msg.sender == governance, "!strategist");
        _vault.harvestAllStrategies();
    }

    // Safe token transfer function, just in case if rounding error causes vinfo to not have enough token.
    function safeTokenTransfer(IERC20 _token, address _to, uint _amount) internal {
        uint bal = _token.balanceOf(address(this));
        if (_amount > bal) {
            _token.safeTransfer(_to, bal);
        } else {
            _token.safeTransfer(_to, _amount);
        }
    }

    /**
     * This function allows governance to take unsupported tokens out of the contract. This is in an effort to make someone whole, should they seriously mess up.
     * There is no guarantee governance will vote to return these. It also allows for removal of airdropped tokens.
     */
    function governanceRecoverUnsupported(IERC20 _token, uint amount, address to) external {
        require(msg.sender == governance, "!governance");
        require(!vaultMaster.isVault(address(_token)), "vaultToken");
        _token.safeTransfer(to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_valueToken","type":"address"},{"internalType":"contract IValueVaultMaster","name":"_vaultMaster","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"addVaultRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approveForSpender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"calc_token_amount_deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_output","type":"address"}],"name":"calc_token_amount_withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"}],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chi","outputs":[{"internalType":"contract IFreeFromUpTo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"address","name":"_input","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"convert_rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"address","name":"_input","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min_mint_amount","type":"uint256"},{"internalType":"bool","name":"_isStake","type":"bool"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256","name":"_min_mint_amount","type":"uint256"},{"internalType":"bool","name":"_isStake","type":"bool"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint256","name":"_min_output_amount","type":"uint256"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"getAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"harvestAllStrategies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"harvestStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"address","name":"_want","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"harvestWant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"_pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPoolInfos","outputs":[{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"totalPaidRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueVaultMaster","name":"_vaultMaster","type":"address"}],"name":"setVaultMaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_account","type":"address"}],"name":"shares_owner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"stakeVaultShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint8","name":"_pid","type":"uint8"}],"name":"updateRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valueToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultMaster","outputs":[{"internalType":"contract IValueVaultMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint256","name":"_min_output_amount","type":"uint256"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600080546001600160a01b0319167349e833337ece7afe375e44f4e3e8481029218e5c17905534801561003657600080fd5b50604051613bc1380380613bc18339818101604052604081101561005957600080fd5b508051602090910151600080546001600160a01b039384166001600160a01b03199182161790915560038054939092169281169290921790556001805482163390811790915560028054909216179055613b09806100b86000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806382b583701161011a578063ab033ea9116100ad578063c92aecc41161007c578063c92aecc41461082a578063dd78683414610832578063ef9e2379146108c3578063effff82f146108f9578063fbce0cc61461090157610206565b8063ab033ea914610774578063af0fa8a11461079a578063aff083d4146107c9578063c7b9d5301461080457610206565b806392fe92c3116100e957806392fe92c314610697578063974c5226146106c6578063989b9e1b146106ce578063a6bf32d11461074e57610206565b806382b58370146105ac57806384570634146105ee5780638cc8ce3414610628578063903832f91461066257610206565b806347f6512b1161019d5780635aa6e6751161016c5780635aa6e675146104cb578063632447c9146104d357806365ddde07146104f9578063739b78f4146105335780637f6159591461057357610206565b806347f6512b146103ca578063516479b2146103f657806354575af41461045f578063554236691461049557610206565b806323deedcf116101d957806323deedcf146102d6578063341cd53a1461031a57806336cf893c146103685780633995843a1461039e57610206565b806309fd9fc31461020b5780630f208beb1461024c5780631f7e5a691461028c5780631fe4a686146102b2575b600080fd5b61024a6004803603608081101561022157600080fd5b506001600160a01b03813581169160ff602082013581169260408301351691606001351661092f565b005b61027a6004803603604081101561026257600080fd5b506001600160a01b0381358116916020013516610d1b565b60408051918252519081900360200190f35b61024a600480360360208110156102a257600080fd5b50356001600160a01b0316610d38565b6102ba610da7565b604080516001600160a01b039092168252519081900360200190f35b61024a600480360360a08110156102ec57600080fd5b5080356001600160a01b0390811691602081013591604082013516906060810135906080013560ff16610db6565b61024a600480360360c081101561033057600080fd5b5080356001600160a01b0390811691602081013590911690604081013590606081013590608081013515159060a0013560ff166111f6565b61027a6004803603606081101561037e57600080fd5b506001600160a01b03813581169160208101359091169060400135611755565b61027a600480360360408110156103b457600080fd5b506001600160a01b0381351690602001356117e0565b61024a600480360360408110156103e057600080fd5b506001600160a01b03813516906020013561185b565b6104226004803603604081101561040c57600080fd5b506001600160a01b038135169060200135611986565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b61024a6004803603606081101561047557600080fd5b506001600160a01b038135811691602081013591604090910135166119e1565b61027a600480360360608110156104ab57600080fd5b506001600160a01b03813581169160208101359160409091013516611aff565b6102ba611b56565b61024a600480360360208110156104e957600080fd5b50356001600160a01b0316611b65565b61024a6004803603606081101561050f57600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff16611ba0565b61024a6004803603608081101561054957600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013560ff16611e00565b61027a6004803603606081101561058957600080fd5b506001600160a01b03813581169160ff6020820135169160409091013516611fbc565b61024a600480360360a08110156105c257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135612165565b61024a6004803603606081101561060457600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff16612300565b61024a6004803603606081101561063e57600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff166123d1565b61024a6004803603606081101561067857600080fd5b5080356001600160a01b0316906020810135906040013560ff16612542565b61024a600480360360408110156106ad57600080fd5b5080356001600160a01b0316906020013560ff166127d8565b6102ba612923565b61027a600480360360408110156106e457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184602083028401116401000000008311171561074357600080fd5b509092509050612932565b61027a6004803603602081101561076457600080fd5b50356001600160a01b03166129a6565b61024a6004803603602081101561078a57600080fd5b50356001600160a01b0316612a13565b61024a600480360360408110156107b057600080fd5b5080356001600160a01b0316906020013560ff16612a82565b61024a600480360360808110156107df57600080fd5b506001600160a01b038135169060ff6020820135169060408101359060600135612cb0565b61024a6004803603602081101561081a57600080fd5b50356001600160a01b0316612d92565b6102ba612e01565b61024a600480360360a081101561084857600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561087357600080fd5b82018360208201111561088557600080fd5b803590602001918460208302840111640100000000831117156108a757600080fd5b919350915080359060208101351515906040013560ff16612e13565b61024a600480360360608110156108d957600080fd5b506001600160a01b038135811691602081013590911690604001356130ab565b6102ba6131c4565b61027a6004803603604081101561091757600080fd5b506001600160a01b03813581169160200135166131d3565b8060018116610ad25761094285856127d8565b6001600160a01b038086166000818152600560209081526040808320948816835293815283822092825260049052918220805491929160ff881690811061098557fe5b6000918252602080832060ff8a16845260018601909152604083205460069290920201600481015485549194506109da92916109d491670de0b6b3a7640000916109ce91613275565b906132ce565b90613310565b90508015610aca5760ff87166000908152600284016020526040902054610a019082613352565b60ff881660009081526002850160205260409020556005820154610a259082613352565b60058301558154610a40906001600160a01b031687836133ac565b856001600160a01b0316886001600160a01b03167faf206e736916d38b56e2d559931a189bc3119b8fc6d6850bd34e382f090305878984604051808360ff1681526020018281526020019250505060405180910390a360048201548354610ab491670de0b6b3a7640000916109ce91613275565b60ff881660009081526001850160205260409020555b505050610d14565b60005a9050610ae186866127d8565b6001600160a01b038087166000818152600560209081526040808320948916835293815283822092825260049052918220805491929160ff8916908110610b2457fe5b6000918252602080832060ff8b1684526001860190915260408320546006929092020160048101548554919450610b6d92916109d491670de0b6b3a7640000916109ce91613275565b90508015610c5d5760ff88166000908152600284016020526040902054610b949082613352565b60ff891660009081526002850160205260409020556005820154610bb89082613352565b60058301558154610bd3906001600160a01b031688836133ac565b866001600160a01b0316896001600160a01b03167faf206e736916d38b56e2d559931a189bc3119b8fc6d6850bd34e382f090305878a84604051808360ff1681526020018281526020019250505060405180910390a360048201548354610c4791670de0b6b3a7640000916109ce91613275565b60ff891660009081526001850160205260409020555b506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c9e57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b505050506040513d6020811015610d0f57600080fd5b505050505b5050505050565b600560209081526000928352604080842090915290825290205481565b6001546001600160a01b03163314610d85576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b8060018116610f7d576000866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e0e57600080fd5b505afa158015610e22573d6000803e3d6000fd5b505050506040513d6020811015610e3857600080fd5b5051905080861115610ed5576000610e508783613310565b6001600160a01b0389166000908152600560209081526040808320338452909152902054909150811115610ec7576040805162461bcd60e51b81526020600482015260196024820152785f7573657242616c2b7374616b6564203c205f73686172657360381b604482015290519081900360640190fd5b610ed388826000612542565b505b610eea6001600160a01b03881633308961345e565b6040805163073772d560e31b8152336004820152602481018890526001600160a01b038781166044830152606482018790529151918916916339bb96a8916084808201926020929091908290030181600087803b158015610f4a57600080fd5b505af1158015610f5e573d6000803e3d6000fd5b505050506040513d6020811015610f7457600080fd5b506111ee915050565b60005a90506000876001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fd157600080fd5b505afa158015610fe5573d6000803e3d6000fd5b505050506040513d6020811015610ffb57600080fd5b50519050808711156110985760006110138883613310565b6001600160a01b038a16600090815260056020908152604080832033845290915290205490915081111561108a576040805162461bcd60e51b81526020600482015260196024820152785f7573657242616c2b7374616b6564203c205f73686172657360381b604482015290519081900360640190fd5b61109689826000612542565b505b6110ad6001600160a01b03891633308a61345e565b6040805163073772d560e31b8152336004820152602481018990526001600160a01b038881166044830152606482018890529151918a16916339bb96a8916084808201926020929091908290030181600087803b15801561110d57600080fd5b505af1158015611121573d6000803e3d6000fd5b505050506040513d602081101561113757600080fd5b506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161117857fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b505050505b505050505050565b806001811661144c57866001600160a01b0316639f005920876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b505050506040513d602081101561127657600080fd5b50516112c9576040805162461bcd60e51b815260206004820181905260248201527f7661756c7420646f6573206e6f74206163636570742074686973206173736574604482015290519081900360640190fd5b60008511611309576040805162461bcd60e51b81526020600482015260086024820152670857d85b5bdd5b9d60c21b604482015290519081900360640190fd5b826113a75760408051631281099d60e21b8152336004820181905260248201526001600160a01b0388811660448301526064820188905260848201879052915191891691634a0426749160a4808201926020929091908290030181600087803b15801561137557600080fd5b505af1158015611389573d6000803e3d6000fd5b505050506040513d602081101561139f57600080fd5b506114479050565b60408051631281099d60e21b81523360048201523060248201526001600160a01b038881166044830152606482018890526084820187905291516000928a1691634a0426749160a480830192602092919082900301818787803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b505050506040513d602081101561143757600080fd5b5051905061144588826134b8565b505b61174c565b60005a9050876001600160a01b0316639f005920886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561149e57600080fd5b505afa1580156114b2573d6000803e3d6000fd5b505050506040513d60208110156114c857600080fd5b505161151b576040805162461bcd60e51b815260206004820181905260248201527f7661756c7420646f6573206e6f74206163636570742074686973206173736574604482015290519081900360640190fd5b6000861161155b576040805162461bcd60e51b81526020600482015260086024820152670857d85b5bdd5b9d60c21b604482015290519081900360640190fd5b836115f95760408051631281099d60e21b8152336004820181905260248201526001600160a01b03898116604483015260648201899052608482018890529151918a1691634a0426749160a4808201926020929091908290030181600087803b1580156115c757600080fd5b505af11580156115db573d6000803e3d6000fd5b505050506040513d60208110156115f157600080fd5b506116999050565b60408051631281099d60e21b81523360048201523060248201526001600160a01b038981166044830152606482018990526084820188905291516000928b1691634a0426749160a480830192602092919082900301818787803b15801561165f57600080fd5b505af1158015611673573d6000803e3d6000fd5b505050506040513d602081101561168957600080fd5b5051905061169789826134b8565b505b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816116d657fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561171d57600080fd5b505af1158015611731573d6000803e3d6000fd5b505050506040513d602081101561174757600080fd5b505050505b50505050505050565b6000836001600160a01b03166338b7f2cb84846040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b1580156117ac57600080fd5b505afa1580156117c0573d6000803e3d6000fd5b505050506040513d60208110156117d657600080fd5b5051949350505050565b6000826001600160a01b0316632edeb8cf836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d602081101561185057600080fd5b505190505b92915050565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118aa57600080fd5b505afa1580156118be573d6000803e3d6000fd5b505050506040513d60208110156118d457600080fd5b505190506118ed6001600160a01b03841633308561345e565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d602081101561196657600080fd5b505190506119748183613310565b925061198084846134b8565b50505050565b6004602052816000526040600020818154811061199f57fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909186565b6001546001600160a01b03163314611a2e576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003546040805163652b9b4160e01b81526001600160a01b0386811660048301529151919092169163652b9b41916024808301926020929190829003018186803b158015611a7b57600080fd5b505afa158015611a8f573d6000803e3d6000fd5b505050506040513d6020811015611aa557600080fd5b505115611ae6576040805162461bcd60e51b815260206004820152600a6024820152693b30bab63a2a37b5b2b760b11b604482015290519081900360640190fd5b611afa6001600160a01b03841682846135b6565b505050565b6000836001600160a01b031663ae2841c784846040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156117ac57600080fd5b6001546001600160a01b031681565b6001600160a01b038116600090815260046020526040812054905b8160ff168160ff161015611afa57611b9883826127d8565b600101611b80565b8060018116611c77576002546001600160a01b0316331480611bcc57506001546001600160a01b031633145b611c0b576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b03166361f13e00846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c5a57600080fd5b505af1158015611c6e573d6000803e3d6000fd5b50505050611980565b60005a6002549091506001600160a01b0316331480611ca057506001546001600160a01b031633145b611cdf576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b846001600160a01b03166361f13e00856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611d2e57600080fd5b505af1158015611d42573d6000803e3d6000fd5b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505050506040513d6020811015611df657600080fd5b5050505050505050565b8060018116611ec4576001600160a01b0385166000908152600560209081526040808320338452909152812054611e3991879190612542565b611ebf85866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e8a57600080fd5b505afa158015611e9e573d6000803e3d6000fd5b505050506040513d6020811015611eb457600080fd5b505186866000610db6565b610d14565b60005a6001600160a01b0387166000908152600560209081526040808320338452909152812054919250611ef9918891612542565b611f7f86876001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d6020811015611f7457600080fd5b505187876000610db6565b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c9e57fe5b6001600160a01b038084166000818152600560209081526040808320948616835293815283822092825260049052918220805483919060ff8716908110611fff57fe5b906000526020600020906006020190506000816004015490506000876001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561206757600080fd5b505afa15801561207b573d6000803e3d6000fd5b505050506040513d602081101561209157600080fd5b5051600284015490915060009043116120aa57436120b0565b83600201545b90508360010154811180156120c457508115155b156121245760006120e285600101548361331090919063ffffffff16565b90506000612113846109ce670de0b6b3a764000061210d8a600301548761327590919063ffffffff16565b90613275565b905061211f8582613352565b945050505b60ff88166000908152600186016020526040902054855461215891906109d490670de0b6b3a7640000906109ce9088613275565b9998505050505050505050565b6001546001600160a01b031633146121b2576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03851660009081526004602052604090208054600811612214576040805162461bcd60e51b815260206004820152601160248201527065786365656420727764506f6f6c4c696d60781b604482015290519081900360640190fd5b8343116122215783612223565b435b935082841115612264576040805162461bcd60e51b815260206004820152600760248201526639ab211f32ab2160c91b604482015290519081900360640190fd5b61226d86611b65565b6040805160c0810182526001600160a01b03968716815260208082019687529181019485526060810193845260006080820181815260a08301828152855460018082018855968452949092209251600690940290920180546001600160a01b0319169390981692909217875594519186019190915591516002850155516003840155905160048301555160059091015550565b806001811661234e576001600160a01b038416600090815260046020526040812054905b8160ff168160ff1610156123475761233f868287600061092f565b600101612324565b5050611980565b60005a6001600160a01b0386166000908152600460205260408120549192505b8160ff168160ff16101561239157612389878288600061092f565b60010161236e565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b806001811661248b576002546001600160a01b03163314806123fd57506001546001600160a01b031633145b61243c576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b031663324636b3846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c5a57600080fd5b60005a6002549091506001600160a01b03163314806124b457506001546001600160a01b031633145b6124f3576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b846001600160a01b031663324636b3856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611d2e57600080fd5b8060018116612680576001600160a01b0384166000908152600560209081526040808320338452909152902061257785611b65565b80541561258a5761258a85336000612300565b83156125b257805461259c9085613310565b81556125b26001600160a01b03861633866135b6565b6001600160a01b0385166000908152600460205260408120805490915b8160ff168160ff16101561263757612617670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b6000918252602090912060046006909202010154875490613275565b60ff821660009081526001808701602052604090912091909155016125cf565b5060408051878152905133916001600160a01b038a16917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3505050611980565b60005a6001600160a01b038616600090815260056020908152604080832033845290915290209091506126b286611b65565b8054156126c5576126c586336000612300565b84156126ed5780546126d79086613310565b81556126ed6001600160a01b03871633876135b6565b6001600160a01b0386166000908152600460205260408120805490915b8160ff168160ff16101561275657612736670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b60ff8216600090815260018087016020526040909120919091550161270a565b5060408051888152905133916001600160a01b038b16917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b6001600160a01b0382166000908152600460205260408120805460ff84169081106127ff57fe5b906000526020600020906006020190506000816002015443116128225743612828565b81600201545b90508160010154811115611980576000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561288557600080fd5b505afa158015612899573d6000803e3d6000fd5b505050506040513d60208110156128af57600080fd5b5051905080156129175760006128d284600101548461331090919063ffffffff16565b905060006128fd836109ce670de0b6b3a764000061210d89600301548761327590919063ffffffff16565b600486015490915061290f9082613352565b600486015550505b50600191909101555050565b6003546001600160a01b031681565b6000836001600160a01b031663ec2f4f8084846040518363ffffffff1660e01b815260040180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f191690920195506020945090925050508083038186803b1580156117ac57600080fd5b6000816001600160a01b031663355274ea6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e157600080fd5b505afa1580156129f5573d6000803e3d6000fd5b505050506040513d6020811015612a0b57600080fd5b505192915050565b6001546001600160a01b03163314612a60576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b8060018116612b45576002546001600160a01b0316331480612aae57506001546001600160a01b031633145b612aed576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b826001600160a01b0316631997db766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b2857600080fd5b505af1158015612b3c573d6000803e3d6000fd5b50505050611afa565b60005a6002549091506001600160a01b0316331480612b6e57506001546001600160a01b031633145b612bad576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b0316631997db766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612be857600080fd5b505af1158015612bfc573d6000803e3d6000fd5b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181612c3f57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c8657600080fd5b505af1158015612c9a573d6000803e3d6000fd5b505050506040513d602081101561174c57600080fd5b6001546001600160a01b03163314612cfd576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b612d0784846127d8565b6001600160a01b0384166000908152600460205260408120805460ff8616908110612d2e57fe5b906000526020600020906006020190508060020154431115612d80576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b60028101929092556003909101555050565b6001546001600160a01b03163314612ddf576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6d4946c0e9f43f4dee607b0ef1fa1c81565b8060018116612f615782612ec057866001600160a01b0316633b3d121033338989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561137557600080fd5b6000876001600160a01b0316633b3d121033308a8a8a6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561140d57600080fd5b60005a90508361300a57876001600160a01b0316633b3d121033338a8a8a6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b1580156115c757600080fd5b6000886001600160a01b0316633b3d121033308b8b8b6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561165f57600080fd5b6001546001600160a01b031633146130f8576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003546040805163652b9b4160e01b81526001600160a01b0386811660048301529151919092169163652b9b41916024808301926020929190829003018186803b15801561314557600080fd5b505afa158015613159573d6000803e3d6000fd5b505050506040513d602081101561316f57600080fd5b5051156131b0576040805162461bcd60e51b815260206004820152600a6024820152693b30bab63a2a37b5b2b760b11b604482015290519081900360640190fd5b611afa6001600160a01b0384168383613608565b6000546001600160a01b031681565b6001600160a01b0380831660008181526005602090815260408083209486168084529482528083205481516370a0823160e01b815260048101969096529051929461326e94919391926370a0823192602480840193829003018186803b15801561323c57600080fd5b505afa158015613250573d6000803e3d6000fd5b505050506040513d602081101561326657600080fd5b505190613352565b9392505050565b60008261328457506000611855565b8282028284828161329157fe5b041461326e5760405162461bcd60e51b8152600401808060200182810382526021815260200180613a536021913960400191505060405180910390fd5b600061326e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061371b565b600061326e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137bd565b60008282018381101561326e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156133fb57600080fd5b505afa15801561340f573d6000803e3d6000fd5b505050506040513d602081101561342557600080fd5b505190508082111561344a576134456001600160a01b03851684836135b6565b611980565b6119806001600160a01b03851684846135b6565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611980908590613817565b6001600160a01b038216600090815260056020908152604080832033845290915290206134e483611b65565b8054156134f7576134f783336000612300565b80546135039083613352565b81556001600160a01b0383166000908152600460205260408120805490915b8160ff168160ff16101561356e5761354e670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b60ff82166000908152600180870160205260409091209190915501613522565b5060408051858152905133916001600160a01b038816917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629181900360200190a35050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611afa908490613817565b80158061368e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561366057600080fd5b505afa158015613674573d6000803e3d6000fd5b505050506040513d602081101561368a57600080fd5b5051155b6136c95760405162461bcd60e51b8152600401808060200182810382526036815260200180613a9e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611afa908490613817565b600081836137a75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561376c578181015183820152602001613754565b50505050905090810190601f1680156137995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137b357fe5b0495945050505050565b6000818484111561380f5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561376c578181015183820152602001613754565b505050900390565b606061386c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138c89092919063ffffffff16565b805190915015611afa5780806020019051602081101561388b57600080fd5b5051611afa5760405162461bcd60e51b815260040180806020018281038252602a815260200180613a74602a913960400191505060405180910390fd5b60606138d784846000856138df565b949350505050565b60606138ea85613a4c565b61393b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061397a5780518252601f19909201916020918201910161395b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146139dc576040519150601f19603f3d011682016040523d82523d6000602084013e6139e1565b606091505b509150915081156139f55791506138d79050565b805115613a055780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561376c578181015183820152602001613754565b3b15159056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220b3edf526a6139da816766cdf5223b2e0bdebd1cae768e38a40fadb929391c5ce64736f6c634300060c003300000000000000000000000049e833337ece7afe375e44f4e3e8481029218e5c000000000000000000000000ea48b3f50f3cf2216e34e2e868abc810b729f0e3

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c806382b583701161011a578063ab033ea9116100ad578063c92aecc41161007c578063c92aecc41461082a578063dd78683414610832578063ef9e2379146108c3578063effff82f146108f9578063fbce0cc61461090157610206565b8063ab033ea914610774578063af0fa8a11461079a578063aff083d4146107c9578063c7b9d5301461080457610206565b806392fe92c3116100e957806392fe92c314610697578063974c5226146106c6578063989b9e1b146106ce578063a6bf32d11461074e57610206565b806382b58370146105ac57806384570634146105ee5780638cc8ce3414610628578063903832f91461066257610206565b806347f6512b1161019d5780635aa6e6751161016c5780635aa6e675146104cb578063632447c9146104d357806365ddde07146104f9578063739b78f4146105335780637f6159591461057357610206565b806347f6512b146103ca578063516479b2146103f657806354575af41461045f578063554236691461049557610206565b806323deedcf116101d957806323deedcf146102d6578063341cd53a1461031a57806336cf893c146103685780633995843a1461039e57610206565b806309fd9fc31461020b5780630f208beb1461024c5780631f7e5a691461028c5780631fe4a686146102b2575b600080fd5b61024a6004803603608081101561022157600080fd5b506001600160a01b03813581169160ff602082013581169260408301351691606001351661092f565b005b61027a6004803603604081101561026257600080fd5b506001600160a01b0381358116916020013516610d1b565b60408051918252519081900360200190f35b61024a600480360360208110156102a257600080fd5b50356001600160a01b0316610d38565b6102ba610da7565b604080516001600160a01b039092168252519081900360200190f35b61024a600480360360a08110156102ec57600080fd5b5080356001600160a01b0390811691602081013591604082013516906060810135906080013560ff16610db6565b61024a600480360360c081101561033057600080fd5b5080356001600160a01b0390811691602081013590911690604081013590606081013590608081013515159060a0013560ff166111f6565b61027a6004803603606081101561037e57600080fd5b506001600160a01b03813581169160208101359091169060400135611755565b61027a600480360360408110156103b457600080fd5b506001600160a01b0381351690602001356117e0565b61024a600480360360408110156103e057600080fd5b506001600160a01b03813516906020013561185b565b6104226004803603604081101561040c57600080fd5b506001600160a01b038135169060200135611986565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b61024a6004803603606081101561047557600080fd5b506001600160a01b038135811691602081013591604090910135166119e1565b61027a600480360360608110156104ab57600080fd5b506001600160a01b03813581169160208101359160409091013516611aff565b6102ba611b56565b61024a600480360360208110156104e957600080fd5b50356001600160a01b0316611b65565b61024a6004803603606081101561050f57600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff16611ba0565b61024a6004803603608081101561054957600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013560ff16611e00565b61027a6004803603606081101561058957600080fd5b506001600160a01b03813581169160ff6020820135169160409091013516611fbc565b61024a600480360360a08110156105c257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135612165565b61024a6004803603606081101561060457600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff16612300565b61024a6004803603606081101561063e57600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff166123d1565b61024a6004803603606081101561067857600080fd5b5080356001600160a01b0316906020810135906040013560ff16612542565b61024a600480360360408110156106ad57600080fd5b5080356001600160a01b0316906020013560ff166127d8565b6102ba612923565b61027a600480360360408110156106e457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184602083028401116401000000008311171561074357600080fd5b509092509050612932565b61027a6004803603602081101561076457600080fd5b50356001600160a01b03166129a6565b61024a6004803603602081101561078a57600080fd5b50356001600160a01b0316612a13565b61024a600480360360408110156107b057600080fd5b5080356001600160a01b0316906020013560ff16612a82565b61024a600480360360808110156107df57600080fd5b506001600160a01b038135169060ff6020820135169060408101359060600135612cb0565b61024a6004803603602081101561081a57600080fd5b50356001600160a01b0316612d92565b6102ba612e01565b61024a600480360360a081101561084857600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561087357600080fd5b82018360208201111561088557600080fd5b803590602001918460208302840111640100000000831117156108a757600080fd5b919350915080359060208101351515906040013560ff16612e13565b61024a600480360360608110156108d957600080fd5b506001600160a01b038135811691602081013590911690604001356130ab565b6102ba6131c4565b61027a6004803603604081101561091757600080fd5b506001600160a01b03813581169160200135166131d3565b8060018116610ad25761094285856127d8565b6001600160a01b038086166000818152600560209081526040808320948816835293815283822092825260049052918220805491929160ff881690811061098557fe5b6000918252602080832060ff8a16845260018601909152604083205460069290920201600481015485549194506109da92916109d491670de0b6b3a7640000916109ce91613275565b906132ce565b90613310565b90508015610aca5760ff87166000908152600284016020526040902054610a019082613352565b60ff881660009081526002850160205260409020556005820154610a259082613352565b60058301558154610a40906001600160a01b031687836133ac565b856001600160a01b0316886001600160a01b03167faf206e736916d38b56e2d559931a189bc3119b8fc6d6850bd34e382f090305878984604051808360ff1681526020018281526020019250505060405180910390a360048201548354610ab491670de0b6b3a7640000916109ce91613275565b60ff881660009081526001850160205260409020555b505050610d14565b60005a9050610ae186866127d8565b6001600160a01b038087166000818152600560209081526040808320948916835293815283822092825260049052918220805491929160ff8916908110610b2457fe5b6000918252602080832060ff8b1684526001860190915260408320546006929092020160048101548554919450610b6d92916109d491670de0b6b3a7640000916109ce91613275565b90508015610c5d5760ff88166000908152600284016020526040902054610b949082613352565b60ff891660009081526002850160205260409020556005820154610bb89082613352565b60058301558154610bd3906001600160a01b031688836133ac565b866001600160a01b0316896001600160a01b03167faf206e736916d38b56e2d559931a189bc3119b8fc6d6850bd34e382f090305878a84604051808360ff1681526020018281526020019250505060405180910390a360048201548354610c4791670de0b6b3a7640000916109ce91613275565b60ff891660009081526001850160205260409020555b506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c9e57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b505050506040513d6020811015610d0f57600080fd5b505050505b5050505050565b600560209081526000928352604080842090915290825290205481565b6001546001600160a01b03163314610d85576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b8060018116610f7d576000866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e0e57600080fd5b505afa158015610e22573d6000803e3d6000fd5b505050506040513d6020811015610e3857600080fd5b5051905080861115610ed5576000610e508783613310565b6001600160a01b0389166000908152600560209081526040808320338452909152902054909150811115610ec7576040805162461bcd60e51b81526020600482015260196024820152785f7573657242616c2b7374616b6564203c205f73686172657360381b604482015290519081900360640190fd5b610ed388826000612542565b505b610eea6001600160a01b03881633308961345e565b6040805163073772d560e31b8152336004820152602481018890526001600160a01b038781166044830152606482018790529151918916916339bb96a8916084808201926020929091908290030181600087803b158015610f4a57600080fd5b505af1158015610f5e573d6000803e3d6000fd5b505050506040513d6020811015610f7457600080fd5b506111ee915050565b60005a90506000876001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fd157600080fd5b505afa158015610fe5573d6000803e3d6000fd5b505050506040513d6020811015610ffb57600080fd5b50519050808711156110985760006110138883613310565b6001600160a01b038a16600090815260056020908152604080832033845290915290205490915081111561108a576040805162461bcd60e51b81526020600482015260196024820152785f7573657242616c2b7374616b6564203c205f73686172657360381b604482015290519081900360640190fd5b61109689826000612542565b505b6110ad6001600160a01b03891633308a61345e565b6040805163073772d560e31b8152336004820152602481018990526001600160a01b038881166044830152606482018890529151918a16916339bb96a8916084808201926020929091908290030181600087803b15801561110d57600080fd5b505af1158015611121573d6000803e3d6000fd5b505050506040513d602081101561113757600080fd5b506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161117857fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b505050505b505050505050565b806001811661144c57866001600160a01b0316639f005920876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b505050506040513d602081101561127657600080fd5b50516112c9576040805162461bcd60e51b815260206004820181905260248201527f7661756c7420646f6573206e6f74206163636570742074686973206173736574604482015290519081900360640190fd5b60008511611309576040805162461bcd60e51b81526020600482015260086024820152670857d85b5bdd5b9d60c21b604482015290519081900360640190fd5b826113a75760408051631281099d60e21b8152336004820181905260248201526001600160a01b0388811660448301526064820188905260848201879052915191891691634a0426749160a4808201926020929091908290030181600087803b15801561137557600080fd5b505af1158015611389573d6000803e3d6000fd5b505050506040513d602081101561139f57600080fd5b506114479050565b60408051631281099d60e21b81523360048201523060248201526001600160a01b038881166044830152606482018890526084820187905291516000928a1691634a0426749160a480830192602092919082900301818787803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b505050506040513d602081101561143757600080fd5b5051905061144588826134b8565b505b61174c565b60005a9050876001600160a01b0316639f005920886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561149e57600080fd5b505afa1580156114b2573d6000803e3d6000fd5b505050506040513d60208110156114c857600080fd5b505161151b576040805162461bcd60e51b815260206004820181905260248201527f7661756c7420646f6573206e6f74206163636570742074686973206173736574604482015290519081900360640190fd5b6000861161155b576040805162461bcd60e51b81526020600482015260086024820152670857d85b5bdd5b9d60c21b604482015290519081900360640190fd5b836115f95760408051631281099d60e21b8152336004820181905260248201526001600160a01b03898116604483015260648201899052608482018890529151918a1691634a0426749160a4808201926020929091908290030181600087803b1580156115c757600080fd5b505af11580156115db573d6000803e3d6000fd5b505050506040513d60208110156115f157600080fd5b506116999050565b60408051631281099d60e21b81523360048201523060248201526001600160a01b038981166044830152606482018990526084820188905291516000928b1691634a0426749160a480830192602092919082900301818787803b15801561165f57600080fd5b505af1158015611673573d6000803e3d6000fd5b505050506040513d602081101561168957600080fd5b5051905061169789826134b8565b505b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816116d657fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561171d57600080fd5b505af1158015611731573d6000803e3d6000fd5b505050506040513d602081101561174757600080fd5b505050505b50505050505050565b6000836001600160a01b03166338b7f2cb84846040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b1580156117ac57600080fd5b505afa1580156117c0573d6000803e3d6000fd5b505050506040513d60208110156117d657600080fd5b5051949350505050565b6000826001600160a01b0316632edeb8cf836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d602081101561185057600080fd5b505190505b92915050565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118aa57600080fd5b505afa1580156118be573d6000803e3d6000fd5b505050506040513d60208110156118d457600080fd5b505190506118ed6001600160a01b03841633308561345e565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d602081101561196657600080fd5b505190506119748183613310565b925061198084846134b8565b50505050565b6004602052816000526040600020818154811061199f57fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909186565b6001546001600160a01b03163314611a2e576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003546040805163652b9b4160e01b81526001600160a01b0386811660048301529151919092169163652b9b41916024808301926020929190829003018186803b158015611a7b57600080fd5b505afa158015611a8f573d6000803e3d6000fd5b505050506040513d6020811015611aa557600080fd5b505115611ae6576040805162461bcd60e51b815260206004820152600a6024820152693b30bab63a2a37b5b2b760b11b604482015290519081900360640190fd5b611afa6001600160a01b03841682846135b6565b505050565b6000836001600160a01b031663ae2841c784846040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156117ac57600080fd5b6001546001600160a01b031681565b6001600160a01b038116600090815260046020526040812054905b8160ff168160ff161015611afa57611b9883826127d8565b600101611b80565b8060018116611c77576002546001600160a01b0316331480611bcc57506001546001600160a01b031633145b611c0b576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b03166361f13e00846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c5a57600080fd5b505af1158015611c6e573d6000803e3d6000fd5b50505050611980565b60005a6002549091506001600160a01b0316331480611ca057506001546001600160a01b031633145b611cdf576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b846001600160a01b03166361f13e00856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611d2e57600080fd5b505af1158015611d42573d6000803e3d6000fd5b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505050506040513d6020811015611df657600080fd5b5050505050505050565b8060018116611ec4576001600160a01b0385166000908152600560209081526040808320338452909152812054611e3991879190612542565b611ebf85866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e8a57600080fd5b505afa158015611e9e573d6000803e3d6000fd5b505050506040513d6020811015611eb457600080fd5b505186866000610db6565b610d14565b60005a6001600160a01b0387166000908152600560209081526040808320338452909152812054919250611ef9918891612542565b611f7f86876001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d6020811015611f7457600080fd5b505187876000610db6565b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c9e57fe5b6001600160a01b038084166000818152600560209081526040808320948616835293815283822092825260049052918220805483919060ff8716908110611fff57fe5b906000526020600020906006020190506000816004015490506000876001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561206757600080fd5b505afa15801561207b573d6000803e3d6000fd5b505050506040513d602081101561209157600080fd5b5051600284015490915060009043116120aa57436120b0565b83600201545b90508360010154811180156120c457508115155b156121245760006120e285600101548361331090919063ffffffff16565b90506000612113846109ce670de0b6b3a764000061210d8a600301548761327590919063ffffffff16565b90613275565b905061211f8582613352565b945050505b60ff88166000908152600186016020526040902054855461215891906109d490670de0b6b3a7640000906109ce9088613275565b9998505050505050505050565b6001546001600160a01b031633146121b2576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03851660009081526004602052604090208054600811612214576040805162461bcd60e51b815260206004820152601160248201527065786365656420727764506f6f6c4c696d60781b604482015290519081900360640190fd5b8343116122215783612223565b435b935082841115612264576040805162461bcd60e51b815260206004820152600760248201526639ab211f32ab2160c91b604482015290519081900360640190fd5b61226d86611b65565b6040805160c0810182526001600160a01b03968716815260208082019687529181019485526060810193845260006080820181815260a08301828152855460018082018855968452949092209251600690940290920180546001600160a01b0319169390981692909217875594519186019190915591516002850155516003840155905160048301555160059091015550565b806001811661234e576001600160a01b038416600090815260046020526040812054905b8160ff168160ff1610156123475761233f868287600061092f565b600101612324565b5050611980565b60005a6001600160a01b0386166000908152600460205260408120549192505b8160ff168160ff16101561239157612389878288600061092f565b60010161236e565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b806001811661248b576002546001600160a01b03163314806123fd57506001546001600160a01b031633145b61243c576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b031663324636b3846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c5a57600080fd5b60005a6002549091506001600160a01b03163314806124b457506001546001600160a01b031633145b6124f3576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b846001600160a01b031663324636b3856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611d2e57600080fd5b8060018116612680576001600160a01b0384166000908152600560209081526040808320338452909152902061257785611b65565b80541561258a5761258a85336000612300565b83156125b257805461259c9085613310565b81556125b26001600160a01b03861633866135b6565b6001600160a01b0385166000908152600460205260408120805490915b8160ff168160ff16101561263757612617670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b6000918252602090912060046006909202010154875490613275565b60ff821660009081526001808701602052604090912091909155016125cf565b5060408051878152905133916001600160a01b038a16917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3505050611980565b60005a6001600160a01b038616600090815260056020908152604080832033845290915290209091506126b286611b65565b8054156126c5576126c586336000612300565b84156126ed5780546126d79086613310565b81556126ed6001600160a01b03871633876135b6565b6001600160a01b0386166000908152600460205260408120805490915b8160ff168160ff16101561275657612736670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b60ff8216600090815260018087016020526040909120919091550161270a565b5060408051888152905133916001600160a01b038b16917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b6001600160a01b0382166000908152600460205260408120805460ff84169081106127ff57fe5b906000526020600020906006020190506000816002015443116128225743612828565b81600201545b90508160010154811115611980576000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561288557600080fd5b505afa158015612899573d6000803e3d6000fd5b505050506040513d60208110156128af57600080fd5b5051905080156129175760006128d284600101548461331090919063ffffffff16565b905060006128fd836109ce670de0b6b3a764000061210d89600301548761327590919063ffffffff16565b600486015490915061290f9082613352565b600486015550505b50600191909101555050565b6003546001600160a01b031681565b6000836001600160a01b031663ec2f4f8084846040518363ffffffff1660e01b815260040180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f191690920195506020945090925050508083038186803b1580156117ac57600080fd5b6000816001600160a01b031663355274ea6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e157600080fd5b505afa1580156129f5573d6000803e3d6000fd5b505050506040513d6020811015612a0b57600080fd5b505192915050565b6001546001600160a01b03163314612a60576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b8060018116612b45576002546001600160a01b0316331480612aae57506001546001600160a01b031633145b612aed576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b826001600160a01b0316631997db766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b2857600080fd5b505af1158015612b3c573d6000803e3d6000fd5b50505050611afa565b60005a6002549091506001600160a01b0316331480612b6e57506001546001600160a01b031633145b612bad576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b0316631997db766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612be857600080fd5b505af1158015612bfc573d6000803e3d6000fd5b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181612c3f57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c8657600080fd5b505af1158015612c9a573d6000803e3d6000fd5b505050506040513d602081101561174c57600080fd5b6001546001600160a01b03163314612cfd576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b612d0784846127d8565b6001600160a01b0384166000908152600460205260408120805460ff8616908110612d2e57fe5b906000526020600020906006020190508060020154431115612d80576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b60028101929092556003909101555050565b6001546001600160a01b03163314612ddf576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6d4946c0e9f43f4dee607b0ef1fa1c81565b8060018116612f615782612ec057866001600160a01b0316633b3d121033338989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561137557600080fd5b6000876001600160a01b0316633b3d121033308a8a8a6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561140d57600080fd5b60005a90508361300a57876001600160a01b0316633b3d121033338a8a8a6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b1580156115c757600080fd5b6000886001600160a01b0316633b3d121033308b8b8b6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561165f57600080fd5b6001546001600160a01b031633146130f8576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003546040805163652b9b4160e01b81526001600160a01b0386811660048301529151919092169163652b9b41916024808301926020929190829003018186803b15801561314557600080fd5b505afa158015613159573d6000803e3d6000fd5b505050506040513d602081101561316f57600080fd5b5051156131b0576040805162461bcd60e51b815260206004820152600a6024820152693b30bab63a2a37b5b2b760b11b604482015290519081900360640190fd5b611afa6001600160a01b0384168383613608565b6000546001600160a01b031681565b6001600160a01b0380831660008181526005602090815260408083209486168084529482528083205481516370a0823160e01b815260048101969096529051929461326e94919391926370a0823192602480840193829003018186803b15801561323c57600080fd5b505afa158015613250573d6000803e3d6000fd5b505050506040513d602081101561326657600080fd5b505190613352565b9392505050565b60008261328457506000611855565b8282028284828161329157fe5b041461326e5760405162461bcd60e51b8152600401808060200182810382526021815260200180613a536021913960400191505060405180910390fd5b600061326e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061371b565b600061326e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137bd565b60008282018381101561326e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156133fb57600080fd5b505afa15801561340f573d6000803e3d6000fd5b505050506040513d602081101561342557600080fd5b505190508082111561344a576134456001600160a01b03851684836135b6565b611980565b6119806001600160a01b03851684846135b6565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611980908590613817565b6001600160a01b038216600090815260056020908152604080832033845290915290206134e483611b65565b8054156134f7576134f783336000612300565b80546135039083613352565b81556001600160a01b0383166000908152600460205260408120805490915b8160ff168160ff16101561356e5761354e670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b60ff82166000908152600180870160205260409091209190915501613522565b5060408051858152905133916001600160a01b038816917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629181900360200190a35050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611afa908490613817565b80158061368e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561366057600080fd5b505afa158015613674573d6000803e3d6000fd5b505050506040513d602081101561368a57600080fd5b5051155b6136c95760405162461bcd60e51b8152600401808060200182810382526036815260200180613a9e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611afa908490613817565b600081836137a75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561376c578181015183820152602001613754565b50505050905090810190601f1680156137995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137b357fe5b0495945050505050565b6000818484111561380f5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561376c578181015183820152602001613754565b505050900390565b606061386c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138c89092919063ffffffff16565b805190915015611afa5780806020019051602081101561388b57600080fd5b5051611afa5760405162461bcd60e51b815260040180806020018281038252602a815260200180613a74602a913960400191505060405180910390fd5b60606138d784846000856138df565b949350505050565b60606138ea85613a4c565b61393b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061397a5780518252601f19909201916020918201910161395b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146139dc576040519150601f19603f3d011682016040523d82523d6000602084013e6139e1565b606091505b509150915081156139f55791506138d79050565b805115613a055780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561376c578181015183820152602001613754565b3b15159056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220b3edf526a6139da816766cdf5223b2e0bdebd1cae768e38a40fadb929391c5ce64736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000049e833337ece7afe375e44f4e3e8481029218e5c000000000000000000000000ea48b3f50f3cf2216e34e2e868abc810b729f0e3

-----Decoded View---------------
Arg [0] : _valueToken (address): 0x49E833337ECe7aFE375e44F4E3e8481029218E5c
Arg [1] : _vaultMaster (address): 0xEa48B3F50f3Cf2216e34e2E868Abc810B729F0E3

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000049e833337ece7afe375e44f4e3e8481029218e5c
Arg [1] : 000000000000000000000000ea48b3f50f3cf2216e34e2e868abc810b729f0e3


Deployed Bytecode Sourcemap

21516:14437:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30430:883;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30430:883:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23077:64;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23077:64:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23993:169;;;;;;;;;;;;;;;;-1:-1:-1;23993:169:0;-1:-1:-1;;;;;23993:169:0;;:::i;22176:25::-;;;:::i;:::-;;;;-1:-1:-1;;;;;22176:25:0;;;;;;;;;;;;;;32562:632;;;;;;;;;;;;;;;;-1:-1:-1;32562:632:0;;-1:-1:-1;;;;;32562:632:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26986:602::-;;;;;;;;;;;;;;;;-1:-1:-1;26986:602:0;;-1:-1:-1;;;;;26986:602:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34066:168::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34066:168:0;;;;;;;;;;;;;;;;;:::i;33517:144::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33517:144:0;;;;;;;;:::i;28075:436::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28075:436:0;;;;;;;;:::i;22981:59::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22981:59:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;22981:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35683:267;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35683:267:0;;;;;;;;;;;;;;;;;:::i;33860:198::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33860:198:0;;;;;;;;;;;;;;;;;:::i;22144:25::-;;;:::i;25477:247::-;;;;;;;;;;;;;;;;-1:-1:-1;25477:247:0;-1:-1:-1;;;;;25477:247:0;;:::i;34242:249::-;;;;;;;;;;;;;;;;-1:-1:-1;34242:249:0;;-1:-1:-1;;;;;34242:249:0;;;;;;;;;;;;;;;;;;:::i;33202:307::-;;;;;;;;;;;;;;;;-1:-1:-1;33202:307:0;;-1:-1:-1;;;;;33202:307:0;;;;;;;;;;;;;;;;;;;;;;;:::i;31321:975::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31321:975:0;;;;;;;;;;;;;;;;;;;:::i;24170:823::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24170:823:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30111:311::-;;;;;;;;;;;;;;;;-1:-1:-1;30111:311:0;;-1:-1:-1;;;;;30111:311:0;;;;;;;;;;;;;;;;;;:::i;34499:233::-;;;;;;;;;;;;;;;;-1:-1:-1;34499:233:0;;-1:-1:-1;;;;;34499:233:0;;;;;;;;;;;;;;;;;;:::i;29259:817::-;;;;;;;;;;;;;;;;-1:-1:-1;29259:817:0;;-1:-1:-1;;;;;29259:817:0;;;;;;;;;;;;;:::i;25732:856::-;;;;;;;;;;;;;;;;-1:-1:-1;25732:856:0;;-1:-1:-1;;;;;25732:856:0;;;;;;;;:::i;22239:36::-;;;:::i;33669:183::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33669:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33669:183:0;;-1:-1:-1;33669:183:0;-1:-1:-1;33669:183:0;:::i;26596:105::-;;;;;;;;;;;;;;;;-1:-1:-1;26596:105:0;-1:-1:-1;;;;;26596:105:0;;:::i;23667:155::-;;;;;;;;;;;;;;;;-1:-1:-1;23667:155:0;-1:-1:-1;;;;;23667:155:0;;:::i;34740:231::-;;;;;;;;;;;;;;;;-1:-1:-1;34740:231:0;;-1:-1:-1;;;;;34740:231:0;;;;;;;;:::i;25001:468::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25001:468:0;;;;;;;;;;;;;;;;;;;;:::i;23830:155::-;;;;;;;;;;;;;;;;-1:-1:-1;23830:155:0;-1:-1:-1;;;;;23830:155:0;;:::i;21617:93::-;;;:::i;27596:471::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27596:471:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27596:471:0;-1:-1:-1;27596:471:0;;;;;;;;;;;;;;;;:::i;26709:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26709:269:0;;;;;;;;;;;;;;;;;:::i;22058:77::-;;;:::i;32304:182::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32304:182:0;;;;;;;;;;:::i;30430:883::-;30527:5;21777:3;21769:11;;21764:279;;30545:30:::1;30562:6;30570:4;30545:16;:30::i;:::-;-1:-1:-1::0;;;;;30610:16:0;;::::1;30586:21;30610:16:::0;;;:8:::1;:16;::::0;;;;;;;:26;;::::1;::::0;;;;;;;;30683:23;;;:15:::1;:23:::0;;;;;:29;;30610:26;;30586:21;30683:29:::1;::::0;::::1;::::0;;::::1;;;;;;::::0;;;::::1;::::0;;;30805:21:::1;::::0;::::1;::::0;;:15:::1;::::0;::::1;:21:::0;;;;;;;30683:29:::1;::::0;;;::::1;;30761:28;::::0;::::1;::::0;30745:11;;30683:29;;-1:-1:-1;30745:82:0::1;::::0;30805:21;30745:55:::1;::::0;30795:4:::1;::::0;30745:45:::1;::::0;:15:::1;:45::i;:::-;:49:::0;::::1;:55::i;:::-;:59:::0;::::1;:82::i;:::-;30723:104:::0;-1:-1:-1;30842:18:0;;30838:468:::1;;30908:28;::::0;::::1;;::::0;;;:22:::1;::::0;::::1;:28;::::0;;;;;:48:::1;::::0;30941:14;30908:32:::1;:48::i;:::-;30877:28;::::0;::::1;;::::0;;;:22:::1;::::0;::::1;:28;::::0;;;;:79;31001:27:::1;::::0;::::1;::::0;:47:::1;::::0;31033:14;31001:31:::1;:47::i;:::-;30971:27;::::0;::::1;:77:::0;31081:22;;31063:67:::1;::::0;-1:-1:-1;;;;;31081:22:0::1;31105:8:::0;31115:14;31063:17:::1;:67::i;:::-;31175:8;-1:-1:-1::0;;;;;31150:50:0::1;31161:6;-1:-1:-1::0;;;;;31150:50:0::1;;31169:4;31185:14;31150:50;;;;;;;;;;;;;;;;;;;;;;;;;;31255:28;::::0;::::1;::::0;31239:11;;:55:::1;::::0;31289:4:::1;::::0;31239:45:::1;::::0;:15:::1;:45::i;:55::-;31215:21;::::0;::::1;;::::0;;;:15:::1;::::0;::::1;:21;::::0;;;;:79;30838:468:::1;21803:1;;;21764:279:::0;;;21837:13;21853:9;21837:25;;30545:30:::1;30562:6;30570:4;30545:16;:30::i;:::-;-1:-1:-1::0;;;;;30610:16:0;;::::1;30586:21;30610:16:::0;;;:8:::1;:16;::::0;;;;;;;:26;;::::1;::::0;;;;;;;;30683:23;;;:15:::1;:23:::0;;;;;:29;;30610:26;;30586:21;30683:29:::1;::::0;::::1;::::0;;::::1;;;;;;::::0;;;::::1;::::0;;;30805:21:::1;::::0;::::1;::::0;;:15:::1;::::0;::::1;:21:::0;;;;;;;30683:29:::1;::::0;;;::::1;;30761:28;::::0;::::1;::::0;30745:11;;30683:29;;-1:-1:-1;30745:82:0::1;::::0;30805:21;30745:55:::1;::::0;30795:4:::1;::::0;30745:45:::1;::::0;:15:::1;:45::i;:82::-;30723:104:::0;-1:-1:-1;30842:18:0;;30838:468:::1;;30908:28;::::0;::::1;;::::0;;;:22:::1;::::0;::::1;:28;::::0;;;;;:48:::1;::::0;30941:14;30908:32:::1;:48::i;:::-;30877:28;::::0;::::1;;::::0;;;:22:::1;::::0;::::1;:28;::::0;;;;:79;31001:27:::1;::::0;::::1;::::0;:47:::1;::::0;31033:14;31001:31:::1;:47::i;:::-;30971:27;::::0;::::1;:77:::0;31081:22;;31063:67:::1;::::0;-1:-1:-1;;;;;31081:22:0::1;31105:8:::0;31115:14;31063:17:::1;:67::i;:::-;31175:8;-1:-1:-1::0;;;;;31150:50:0::1;31161:6;-1:-1:-1::0;;;;;31150:50:0::1;;31169:4;31185:14;31150:50;;;;;;;;;;;;;;;;;;;;;;;;;;31255:28;::::0;::::1;::::0;31239:11;;:55:::1;::::0;31289:4:::1;::::0;31239:45:::1;::::0;:15:::1;:45::i;:55::-;31215:21;::::0;::::1;;::::0;;;:15:::1;::::0;::::1;:21;::::0;;;;:79;30838:468:::1;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21764:279:0;30430:883;;;;;:::o;23077:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;23993:169::-;24091:10;;-1:-1:-1;;;;;24091:10:0;24077;:24;24069:48;;;;;-1:-1:-1;;;24069:48:0;;;;;;;;;;;;-1:-1:-1;;;24069:48:0;;;;;;;;;;;;;;;24128:11;:26;;-1:-1:-1;;;;;;24128:26:0;-1:-1:-1;;;;;24128:26:0;;;;;;;;;;23993:169::o;22176:25::-;;;-1:-1:-1;;;;;22176:25:0;;:::o;32562:632::-;32684:5;21777:3;21769:11;;21764:279;;32702:13:::1;32733:6;-1:-1:-1::0;;;;;32718:33:0::1;;32752:10;32718:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;32718:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32718:45:0;;-1:-1:-1;32778:18:0;;::::1;32774:229;;;32813:10;32826:21;:7:::0;32838:8;32826:11:::1;:21::i;:::-;-1:-1:-1::0;;;;;32879:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;32896:10:::1;32879:28:::0;;;;;;;:35;32813:34;;-1:-1:-1;32870:44:0;::::1;;32862:82;;;::::0;;-1:-1:-1;;;32862:82:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32862:82:0;;;;;;;;;;;;;::::1;;32959:32;32967:6;32975:5;32988:1;32959:7;:32::i;:::-;32774:229;;33013:76;-1:-1:-1::0;;;;;33013:40:0;::::1;33054:10;33074:4;33081:7:::0;33013:40:::1;:76::i;:::-;33100:86;::::0;;-1:-1:-1;;;33100:86:0;;33137:10:::1;33100:86;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;33100:86:0;;::::1;::::0;;;;;;;;;;;;:36;;::::1;::::0;::::1;::::0;:86;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;33100:36:0;:86;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21764:279:0;;-1:-1:-1;;21764:279:0;;21837:13;21853:9;21837:25;;32702:13:::1;32733:6;-1:-1:-1::0;;;;;32718:33:0::1;;32752:10;32718:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;32718:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32718:45:0;;-1:-1:-1;32778:18:0;;::::1;32774:229;;;32813:10;32826:21;:7:::0;32838:8;32826:11:::1;:21::i;:::-;-1:-1:-1::0;;;;;32879:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;32896:10:::1;32879:28:::0;;;;;;;:35;32813:34;;-1:-1:-1;32870:44:0;::::1;;32862:82;;;::::0;;-1:-1:-1;;;32862:82:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32862:82:0;;;;;;;;;;;;;::::1;;32959:32;32967:6;32975:5;32988:1;32959:7;:32::i;:::-;32774:229;;33013:76;-1:-1:-1::0;;;;;33013:40:0;::::1;33054:10;33074:4;33081:7:::0;33013:40:::1;:76::i;:::-;33100:86;::::0;;-1:-1:-1;;;33100:86:0;;33137:10:::1;33100:86;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;33100:86:0;;::::1;::::0;;;;;;;;;;;;:36;;::::1;::::0;::::1;::::0;:86;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;33100:36:0;:86;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21764:279:0;32562:632;;;;;;:::o;26986:602::-;27128:5;21777:3;21769:11;;21764:279;;27154:6:::1;-1:-1:-1::0;;;;;27154:13:0::1;;27168:6;27154:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;27154:21:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27154:21:0;27146:66:::1;;;::::0;;-1:-1:-1;;;27146:66:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27241:1;27231:7;:11;27223:32;;;::::0;;-1:-1:-1;;;27223:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27223:32:0;;;;;;;;;;;;;::::1;;27273:8;27268:313;;27298:76;::::0;;-1:-1:-1;;;27298:76:0;;27316:10:::1;27298:76;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;27298:76:0;;::::1;::::0;;;;;;;;;;;;;;;;;;:17;;::::1;::::0;::::1;::::0;:76;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;27298:17:0;:76;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27268:313:0::1;::::0;-1:-1:-1;27268:313:0::1;;27427:79;::::0;;-1:-1:-1;;;27427:79:0;;27445:10:::1;27427:79;::::0;::::1;::::0;27465:4:::1;27427:79:::0;;;;-1:-1:-1;;;;;27427:79:0;;::::1;::::0;;;;;;;;;;;;;;;;;;27407:17:::1;::::0;27427;::::1;::::0;::::1;::::0;:79;;;;;::::1;::::0;;;;;;;;27407:17;27427;:79;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27427:79:0;;-1:-1:-1;27521:48:0::1;27547:6:::0;27427:79;27521:17:::1;:48::i;:::-;27268:313;;21764:279:::0;;;21837:13;21853:9;21837:25;;27154:6:::1;-1:-1:-1::0;;;;;27154:13:0::1;;27168:6;27154:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;27154:21:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27154:21:0;27146:66:::1;;;::::0;;-1:-1:-1;;;27146:66:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27241:1;27231:7;:11;27223:32;;;::::0;;-1:-1:-1;;;27223:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27223:32:0;;;;;;;;;;;;;::::1;;27273:8;27268:313;;27298:76;::::0;;-1:-1:-1;;;27298:76:0;;27316:10:::1;27298:76;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;27298:76:0;;::::1;::::0;;;;;;;;;;;;;;;;;;:17;;::::1;::::0;::::1;::::0;:76;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;27298:17:0;:76;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27268:313:0::1;::::0;-1:-1:-1;27268:313:0::1;;27427:79;::::0;;-1:-1:-1;;;27427:79:0;;27445:10:::1;27427:79;::::0;::::1;::::0;27465:4:::1;27427:79:::0;;;;-1:-1:-1;;;;;27427:79:0;;::::1;::::0;;;;;;;;;;;;;;;;;;27407:17:::1;::::0;27427;::::1;::::0;::::1;::::0;:79;;;;;::::1;::::0;;;;;;;;27407:17;27427;:79;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27427:79:0;;-1:-1:-1;27521:48:0::1;27547:6:::0;27427:79;27521:17:::1;:48::i;:::-;27268:313;;21893:13:::0;21940:2;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21764:279:0;26986:602;;;;;;;:::o;34066:168::-;34166:4;34190:6;-1:-1:-1;;;;;34190:19:0;;34210:6;34218:7;34190:36;;;;;;;;;;;;;-1:-1:-1;;;;;34190:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34190:36:0;;34066:168;-1:-1:-1;;;;34066:168:0:o;33517:144::-;33601:4;33625:6;-1:-1:-1;;;;;33625:19:0;;33645:7;33625:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33625:28:0;;-1:-1:-1;33517:144:0;;;;;:::o;28075:436::-;28151:12;28181:6;-1:-1:-1;;;;;28166:33:0;;28208:4;28166:48;;;;;;;;;;;;;-1:-1:-1;;;;;28166:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28166:48:0;;-1:-1:-1;28225:76:0;-1:-1:-1;;;;;28225:40:0;;28266:10;28286:4;28293:7;28225:40;:76::i;:::-;28312:11;28341:6;-1:-1:-1;;;;;28326:33:0;;28368:4;28326:48;;;;;;;;;;;;;-1:-1:-1;;;;;28326:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28326:48:0;;-1:-1:-1;28395:19:0;28326:48;28406:7;28395:10;:19::i;:::-;28385:29;;28469:34;28487:6;28495:7;28469:17;:34::i;:::-;28075:436;;;;:::o;22981:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22981:59:0;;;;-1:-1:-1;22981:59:0;;-1:-1:-1;22981:59:0;;;;:::o;35683:267::-;35803:10;;-1:-1:-1;;;;;35803:10:0;35789;:24;35781:48;;;;;-1:-1:-1;;;35781:48:0;;;;;;;;;;;;-1:-1:-1;;;35781:48:0;;;;;;;;;;;;;;;35849:11;;:36;;;-1:-1:-1;;;35849:36:0;;-1:-1:-1;;;;;35849:36:0;;;;;;;;;:11;;;;;:19;;:36;;;;;;;;;;;;;;:11;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35849:36:0;35848:37;35840:60;;;;;-1:-1:-1;;;35840:60:0;;;;;;;;;;;;-1:-1:-1;;;35840:60:0;;;;;;;;;;;;;;;35911:31;-1:-1:-1;;;;;35911:19:0;;35931:2;35935:6;35911:19;:31::i;:::-;35683:267;;;:::o;33860:198::-;33975:4;33999:6;-1:-1:-1;;;;;33999:33:0;;34033:7;34042;33999:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33999:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22144:25;;;-1:-1:-1;;;;;22144:25:0;;:::o;25477:247::-;-1:-1:-1;;;;;25564:23:0;;25533:22;25564:23;;;:15;:23;;;;;:30;;25606:111;25634:16;25627:23;;:4;:23;;;25606:111;;;25675:30;25692:6;25700:4;25675:16;:30::i;:::-;25652:6;;25606:111;;34242:249;34345:5;21777:3;21769:11;;21764:279;;34385:10:::1;::::0;-1:-1:-1;;;;;34385:10:0::1;34371;:24;::::0;:52:::1;;-1:-1:-1::0;34413:10:0::1;::::0;-1:-1:-1;;;;;34413:10:0::1;34399;:24;34371:52;34363:76;;;::::0;;-1:-1:-1;;;34363:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34363:76:0;;;;;;;;;;;;;::::1;;34450:6;-1:-1:-1::0;;;;;34450:22:0::1;;34473:9;34450:33;;;;;;;;;;;;;-1:-1:-1::0;;;;;34450:33:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21764:279:::0;;;21837:13;21853:9;34385:10:::1;::::0;21837:25;;-1:-1:-1;;;;;;34385:10:0::1;34371;:24;::::0;:52:::1;;-1:-1:-1::0;34413:10:0::1;::::0;-1:-1:-1;;;;;34413:10:0::1;34399;:24;34371:52;34363:76;;;::::0;;-1:-1:-1;;;34363:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34363:76:0;;;;;;;;;;;;;::::1;;34450:6;-1:-1:-1::0;;;;;34450:22:0::1;;34473:9;34450:33;;;;;;;;;;;;;-1:-1:-1::0;;;;;34450:33:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;;-1:-1:-1;21928:9:0;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;34242:249:0;;;;:::o;33202:307::-;33308:5;21777:3;21769:11;;21764:279;;-1:-1:-1;;;;;33342:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;33359:10:::1;33342:28:::0;;;;;;;:35;33326:62:::1;::::0;33334:6;;33342:35;33326:7:::1;:62::i;:::-;33399:102;33408:6;33431;-1:-1:-1::0;;;;;33416:33:0::1;;33450:10;33416:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;33416:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33416:45:0;33463:7;33472:18;33498:1:::1;33399:8;:102::i;:::-;21764:279:::0;;;21837:13;21853:9;-1:-1:-1;;;;;33342:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;33359:10:::1;33342:28:::0;;;;;;;:35;21837:25;;-1:-1:-1;33326:62:0::1;::::0;33334:6;;33326:7:::1;:62::i;:::-;33399:102;33408:6;33431;-1:-1:-1::0;;;;;33416:33:0::1;;33450:10;33416:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;33416:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33416:45:0;33463:7;33472:18;33498:1:::1;33399:8;:102::i;:::-;21893:13:::0;21940:2;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;31321:975;-1:-1:-1;;;;;31461:16:0;;;31411:13;31461:16;;;:8;:16;;;;;;;;:26;;;;;;;;;;;31534:23;;;:15;:23;;;;;:29;;31411:13;;31534:23;:29;;;;;;;;;;;;;;;;;;;;31498:65;;31574:23;31600:10;:28;;;31574:54;;31639:13;31662:6;-1:-1:-1;;;;;31655:24:0;;31688:4;31655:39;;;;;;;;;;;;;-1:-1:-1;;;;;31655:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31655:39:0;31753:25;;;;31655:39;;-1:-1:-1;31705:30:0;;31738:12;:40;:83;;31809:12;31738:83;;;31781:10;:25;;;31738:83;31705:116;;31864:10;:26;;;31836:25;:54;:71;;;;-1:-1:-1;31894:13:0;;;31836:71;31832:363;;;31924:15;31942:57;31972:10;:26;;;31942:25;:29;;:57;;;;:::i;:::-;31924:75;;32014:23;32040:65;32096:8;32040:51;32086:4;32040:41;32055:10;:25;;;32040:10;:14;;:41;;;;:::i;:::-;:45;;:51::i;:65::-;32014:91;-1:-1:-1;32141:42:0;:18;32014:91;32141:22;:42::i;:::-;32120:63;;31832:363;;;32266:21;;;;;;;:15;;;:21;;;;;;32216:11;;:72;;32266:21;32216:45;;32256:4;;32216:35;;32232:18;32216:15;:35::i;:72::-;32205:83;31321:975;-1:-1:-1;;;;;;;;;31321:975:0:o;24170:823::-;24339:10;;-1:-1:-1;;;;;24339:10:0;24325;:24;24317:48;;;;;-1:-1:-1;;;24317:48:0;;;;;;;;;;;;-1:-1:-1;;;24317:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24415:23:0;;24376:36;24415:23;;;:15;:23;;;;;24457:18;;24478:1;-1:-1:-1;24449:52:0;;;;;-1:-1:-1;;;24449:52:0;;;;;;;;;;;;-1:-1:-1;;;24449:52:0;;;;;;;;;;;;;;;24542:11;24527:12;:26;24526:57;;24572:11;24526:57;;;24557:12;24526:57;24512:71;;24617:15;24602:11;:30;;24594:50;;;;;-1:-1:-1;;;24594:50:0;;;;;;;;;;;;-1:-1:-1;;;24594:50:0;;;;;;;;;;;;;;;24655:20;24668:6;24655:12;:20::i;:::-;24703:281;;;;;;;;-1:-1:-1;;;;;24703:281:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24703:281:0;;;;;;;;;;;;24686:299;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24686:299:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24170:823:0:o;30111:311::-;30200:5;21777:3;21769:11;;21764:279;;-1:-1:-1;;;;;30249:23:0;::::1;30218:22;30249:23:::0;;;:15:::1;:23;::::0;;;;:30;;30291:124:::1;30319:16;30312:23;;:4;:23;;;30291:124;;;30360:43;30370:6;30378:4;30384:8;30400:1;30360:9;:43::i;:::-;30337:6;;30291:124;;;;21803:1;21764:279:::0;;;21837:13;21853:9;-1:-1:-1;;;;;30249:23:0;::::1;30218:22;30249:23:::0;;;:15:::1;:23;::::0;;;;:30;21837:25;;-1:-1:-1;30291:124:0::1;30319:16;30312:23;;:4;:23;;;30291:124;;;30360:43;30370:6;30378:4;30384:8;30400:1;30360:9;:43::i;:::-;30337:6;;30291:124;;;-1:-1:-1::0;21893:13:0;;-1:-1:-1;21940:2:0;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;34499:233;34594:5;21777:3;21769:11;;21764:279;;34634:10:::1;::::0;-1:-1:-1;;;;;34634:10:0::1;34620;:24;::::0;:52:::1;;-1:-1:-1::0;34662:10:0::1;::::0;-1:-1:-1;;;;;34662:10:0::1;34648;:24;34620:52;34612:76;;;::::0;;-1:-1:-1;;;34612:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34612:76:0;;;;;;;;;;;;;::::1;;34699:6;-1:-1:-1::0;;;;;34699:18:0::1;;34718:5;34699:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;34699:25:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;21764:279:::0;21837:13;21853:9;34634:10:::1;::::0;21837:25;;-1:-1:-1;;;;;;34634:10:0::1;34620;:24;::::0;:52:::1;;-1:-1:-1::0;34662:10:0::1;::::0;-1:-1:-1;;;;;34662:10:0::1;34648;:24;34620:52;34612:76;;;::::0;;-1:-1:-1;;;34612:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34612:76:0;;;;;;;;;;;;;::::1;;34699:6;-1:-1:-1::0;;;;;34699:18:0::1;;34718:5;34699:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;34699:25:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;29259:817:::0;29338:5;21777:3;21769:11;;21764:279;;-1:-1:-1;;;;;29380:16:0;::::1;29356:21;29380:16:::0;;;:8:::1;:16;::::0;;;;;;;29397:10:::1;29380:28:::0;;;;;;;29419:20:::1;29389:6:::0;29419:12:::1;:20::i;:::-;29454:11:::0;;:15;29450:91:::1;;29486:43;29500:6;29508:10;29526:1;29486:13;:43::i;:::-;29555:11:::0;;29551:154:::1;;29597:11:::0;;:24:::1;::::0;29613:7;29597:15:::1;:24::i;:::-;29583:38:::0;;29636:57:::1;-1:-1:-1::0;;;;;29636:36:0;::::1;29673:10;29685:7:::0;29636:36:::1;:57::i;:::-;-1:-1:-1::0;;;;;29754:23:0;::::1;29715:36;29754:23:::0;;;:15:::1;:23;::::0;;;;29819:18;;29754:23;;29849:167:::1;29877:16;29870:23;;:4;:23;;;29849:167;;;29942:62;29999:4;29942:52;29958:11;29970:4;29958:17;;;;;;;;;;;::::0;;;::::1;::::0;;;:35:::1;:17;::::0;;::::1;;:35;::::0;29942:11;;;:15:::1;:52::i;:62::-;29918:21;::::0;::::1;;::::0;;;:15:::1;::::0;;::::1;:21;::::0;;;;;:86;;;;29895:6:::1;29849:167;;;-1:-1:-1::0;30031:37:0::1;::::0;;;;;;;30048:10:::1;::::0;-1:-1:-1;;;;;30031:37:0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;21803:1;;;21764:279:::0;;;21837:13;21853:9;-1:-1:-1;;;;;29380:16:0;::::1;29356:21;29380:16:::0;;;:8:::1;:16;::::0;;;;;;;29397:10:::1;29380:28:::0;;;;;;;21837:25;;-1:-1:-1;29419:20:0::1;29389:6:::0;29419:12:::1;:20::i;:::-;29454:11:::0;;:15;29450:91:::1;;29486:43;29500:6;29508:10;29526:1;29486:13;:43::i;:::-;29555:11:::0;;29551:154:::1;;29597:11:::0;;:24:::1;::::0;29613:7;29597:15:::1;:24::i;:::-;29583:38:::0;;29636:57:::1;-1:-1:-1::0;;;;;29636:36:0;::::1;29673:10;29685:7:::0;29636:36:::1;:57::i;:::-;-1:-1:-1::0;;;;;29754:23:0;::::1;29715:36;29754:23:::0;;;:15:::1;:23;::::0;;;;29819:18;;29754:23;;29849:167:::1;29877:16;29870:23;;:4;:23;;;29849:167;;;29942:62;29999:4;29942:52;29958:11;29970:4;29958:17;;;;;;;;;29942:62;29918:21;::::0;::::1;;::::0;;;:15:::1;::::0;;::::1;:21;::::0;;;;;:86;;;;29895:6:::1;29849:167;;;-1:-1:-1::0;30031:37:0::1;::::0;;;;;;;30048:10:::1;::::0;-1:-1:-1;;;;;30031:37:0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;25732:856;-1:-1:-1;;;;;25840:23:0;;25804:33;25840:23;;;:15;:23;;;;;:29;;;;;;;;;;;;;;;;;;;;;;25804:65;;25880:30;25928:10;:25;;;25913:12;:40;:83;;25984:12;25913:83;;;25956:10;:25;;;25913:83;25880:116;;26039:10;:26;;;26011:25;:54;26007:574;;;26082:13;26113:6;-1:-1:-1;;;;;26098:33:0;;26140:4;26098:48;;;;;;;;;;;;;-1:-1:-1;;;;;26098:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26098:48:0;;-1:-1:-1;26165:12:0;;26161:340;;26198:15;26216:57;26246:10;:26;;;26216:25;:29;;:57;;;;:::i;:::-;26198:75;;26292:23;26318:65;26374:8;26318:51;26364:4;26318:41;26333:10;:25;;;26318:10;:14;;:41;;;;:::i;:65::-;26433:28;;;;26292:91;;-1:-1:-1;26433:52:0;;26292:91;26433:32;:52::i;:::-;26402:28;;;:83;-1:-1:-1;;26161:340:0;-1:-1:-1;26515:26:0;;;;;:54;-1:-1:-1;;25732:856:0:o;22239:36::-;;;-1:-1:-1;;;;;22239:36:0;;:::o;33669:183::-;33778:4;33802:6;-1:-1:-1;;;;;33802:32:0;;33835:8;;33802:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33802:42:0;;;;;-1:-1:-1;33802:42:0;;-1:-1:-1;33802:42:0;;-1:-1:-1;;;33802:42:0;;;;;;;;;;;;;;;26596:105;26657:4;26681:6;-1:-1:-1;;;;;26681:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26681:12:0;;26596:105;-1:-1:-1;;26596:105:0:o;23667:155::-;23753:10;;-1:-1:-1;;;;;23753:10:0;23739;:24;23731:48;;;;;-1:-1:-1;;;23731:48:0;;;;;;;;;;;;-1:-1:-1;;;23731:48:0;;;;;;;;;;;;;;;23790:10;:24;;-1:-1:-1;;;;;;23790:24:0;-1:-1:-1;;;;;23790:24:0;;;;;;;;;;23667:155::o;34740:231::-;34829:5;21777:3;21769:11;;21764:279;;34869:10:::1;::::0;-1:-1:-1;;;;;34869:10:0::1;34855;:24;::::0;:52:::1;;-1:-1:-1::0;34897:10:0::1;::::0;-1:-1:-1;;;;;34897:10:0::1;34883;:24;34855:52;34847:76;;;::::0;;-1:-1:-1;;;34847:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34847:76:0;;;;;;;;;;;;;::::1;;34934:6;-1:-1:-1::0;;;;;34934:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21764:279:::0;;;21837:13;21853:9;34869:10:::1;::::0;21837:25;;-1:-1:-1;;;;;;34869:10:0::1;34855;:24;::::0;:52:::1;;-1:-1:-1::0;34897:10:0::1;::::0;-1:-1:-1;;;;;34897:10:0::1;34883;:24;34855:52;34847:76;;;::::0;;-1:-1:-1;;;34847:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34847:76:0;;;;;;;;;;;;;::::1;;34934:6;-1:-1:-1::0;;;;;34934:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;;-1:-1:-1;21928:9:0;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25001:468;25141:10;;-1:-1:-1;;;;;25141:10:0;25127;:24;25119:48;;;;;-1:-1:-1;;;25119:48:0;;;;;;;;;;;;-1:-1:-1;;;25119:48:0;;;;;;;;;;;;;;;25178:30;25195:6;25203:4;25178:16;:30::i;:::-;-1:-1:-1;;;;;25255:23:0;;25219:33;25255:23;;;:15;:23;;;;;:29;;;;;;;;;;;;;;;;;;;;;;25219:65;;25319:10;:25;;;25303:12;:41;;25295:58;;;;;-1:-1:-1;;;25295:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;25295:58:0;;;;;;;;;;;;;;;25364:25;;;:43;;;;25418:25;;;;:43;-1:-1:-1;;25001:468:0:o;23830:155::-;23916:10;;-1:-1:-1;;;;;23916:10:0;23902;:24;23894:48;;;;;-1:-1:-1;;;23894:48:0;;;;;;;;;;;;-1:-1:-1;;;23894:48:0;;;;;;;;;;;;;;;23953:10;:24;;-1:-1:-1;;;;;;23953:24:0;-1:-1:-1;;;;;23953:24:0;;;;;;;;;;23830:155::o;21617:93::-;21667:42;21617:93;:::o;27596:471::-;27737:5;21777:3;21769:11;;21764:279;;27760:8:::1;27755:305;;27785:6;-1:-1:-1::0;;;;;27785:20:0::1;;27806:10;27818;27830:8;;27840:16;27785:72;;;;;;;;;;;;;-1:-1:-1::0;;;;;27785:72:0::1;;;;;;-1:-1:-1::0;;;;;27785:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;27755:305;27890:17;27910:6;-1:-1:-1::0;;;;;27910:20:0::1;;27931:10;27951:4;27958:8;;27968:16;27910:75;;;;;;;;;;;;;-1:-1:-1::0;;;;;27910:75:0::1;;;;;;-1:-1:-1::0;;;;;27910:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;21764:279:::0;21837:13;21853:9;21837:25;;27760:8:::1;27755:305;;27785:6;-1:-1:-1::0;;;;;27785:20:0::1;;27806:10;27818;27830:8;;27840:16;27785:72;;;;;;;;;;;;;-1:-1:-1::0;;;;;27785:72:0::1;;;;;;-1:-1:-1::0;;;;;27785:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;27755:305;27890:17;27910:6;-1:-1:-1::0;;;;;27910:20:0::1;;27931:10;27951:4;27958:8;;27968:16;27910:75;;;;;;;;;;;;;-1:-1:-1::0;;;;;27910:75:0::1;;;;;;-1:-1:-1::0;;;;;27910:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;26709:269:::0;26825:10;;-1:-1:-1;;;;;26825:10:0;26811;:24;26803:48;;;;;-1:-1:-1;;;26803:48:0;;;;;;;;;;;;-1:-1:-1;;;26803:48:0;;;;;;;;;;;;;;;26871:11;;:36;;;-1:-1:-1;;;26871:36:0;;-1:-1:-1;;;;;26871:36:0;;;;;;;;;:11;;;;;:19;;:36;;;;;;;;;;;;;;:11;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26871:36:0;26870:37;26862:60;;;;;-1:-1:-1;;;26862:60:0;;;;;;;;;;;;-1:-1:-1;;;26862:60:0;;;;;;;;;;;;;;;26933:37;-1:-1:-1;;;;;26933:18:0;;26952:8;26962:7;26933:18;:37::i;22058:77::-;;;-1:-1:-1;;;;;22058:77:0;;:::o;32304:182::-;-1:-1:-1;;;;;32444:16:0;;;32381:4;32444:16;;;:8;:16;;;;;;;;:26;;;;;;;;;;;;:33;32405:34;;-1:-1:-1;;;32405:34:0;;;;;;;;;;;32381:4;;32405:73;;32444:33;;:16;;32405:24;;:34;;;;;;;;;;32444:16;32405:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32405:34:0;;:38;:73::i;:::-;32398:80;32304:182;-1:-1:-1;;;32304:182:0:o;4969:471::-;5027:7;5272:6;5268:47;;-1:-1:-1;5302:1:0;5295:8;;5268:47;5339:5;;;5343:1;5339;:5;:1;5363:5;;;;;:10;5355:56;;;;-1:-1:-1;;;5355:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5916:132;5974:7;6001:39;6005:1;6008;6001:39;;;;;;;;;;;;;;;;;:3;:39::i;4079:136::-;4137:7;4164:43;4168:1;4171;4164:43;;;;;;;;;;;;;;;;;:3;:43::i;3615:181::-;3673:7;3705:5;;;3729:6;;;;3721:46;;;;;-1:-1:-1;;;3721:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;35087:290;35176:8;35187:6;-1:-1:-1;;;;;35187:16:0;;35212:4;35187:31;;;;;;;;;;;;;-1:-1:-1;;;;;35187:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35187:31:0;;-1:-1:-1;35233:13:0;;;35229:141;;;35263:29;-1:-1:-1;;;;;35263:19:0;;35283:3;35288;35263:19;:29::i;:::-;35229:141;;;35325:33;-1:-1:-1;;;;;35325:19:0;;35345:3;35350:7;35325:19;:33::i;14781:205::-;14909:68;;;-1:-1:-1;;;;;14909:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14909:68:0;-1:-1:-1;;;14909:68:0;;;14882:96;;14902:5;;14882:19;:96::i;28519:681::-;-1:-1:-1;;;;;28620:16:0;;28596:21;28620:16;;;:8;:16;;;;;;;;28637:10;28620:28;;;;;;;28659:20;28629:6;28659:12;:20::i;:::-;28694:11;;:15;28690:91;;28726:43;28740:6;28748:10;28766:1;28726:13;:43::i;:::-;28805:11;;:24;;28821:7;28805:15;:24::i;:::-;28791:38;;-1:-1:-1;;;;;28879:23:0;;28791:11;28879:23;;;:15;:23;;;;;28944:18;;28879:23;;28974:167;29002:16;28995:23;;:4;:23;;;28974:167;;;29067:62;29124:4;29067:52;29083:11;29095:4;29083:17;;;;;;;;;29067:62;29043:21;;;;;;;:15;;;;:21;;;;;;:86;;;;29020:6;28974:167;;;-1:-1:-1;29156:36:0;;;;;;;;29172:10;;-1:-1:-1;;;;;29156:36:0;;;;;;;;;;;;28519:681;;;;;:::o;14596:177::-;14706:58;;;-1:-1:-1;;;;;14706:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14706:58:0;-1:-1:-1;;;14706:58:0;;;14679:86;;14699:5;;14679:19;:86::i;15255:622::-;15625:10;;;15624:62;;-1:-1:-1;15641:39:0;;;-1:-1:-1;;;15641:39:0;;15665:4;15641:39;;;;-1:-1:-1;;;;;15641:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15641:39:0;:44;15624:62;15616:152;;;;-1:-1:-1;;;15616:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15806:62;;;-1:-1:-1;;;;;15806:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15806:62:0;-1:-1:-1;;;15806:62:0;;;15779:90;;15799:5;;15779:19;:90::i;6544:278::-;6630:7;6665:12;6658:5;6650:28;;;;-1:-1:-1;;;6650:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6689:9;6705:1;6701;:5;;;;;;;6544:278;-1:-1:-1;;;;;6544:278:0:o;4518:192::-;4604:7;4640:12;4632:6;;;;4624:29;;;;-1:-1:-1;;;4624:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4676:5:0;;;4518:192::o;16901:761::-;17325:23;17351:69;17379:4;17351:69;;;;;;;;;;;;;;;;;17359:5;-1:-1:-1;;;;;17351:27:0;;;:69;;;;;:::i;:::-;17435:17;;17325:95;;-1:-1:-1;17435:21:0;17431:224;;17577:10;17566:30;;;;;;;;;;;;;;;-1:-1:-1;17566:30:0;17558:85;;;;-1:-1:-1;;;17558:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11674:196;11777:12;11809:53;11832:6;11840:4;11846:1;11849:12;11809:22;:53::i;:::-;11802:60;11674:196;-1:-1:-1;;;;11674:196:0:o;13051:979::-;13181:12;13214:18;13225:6;13214:10;:18::i;:::-;13206:60;;;;;-1:-1:-1;;;13206:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13340:12;13354:23;13381:6;-1:-1:-1;;;;;13381:11:0;13401:8;13412:4;13381:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13381:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13339:78;;;;13432:7;13428:595;;;13463:10;-1:-1:-1;13456:17:0;;-1:-1:-1;13456:17:0;13428:595;13577:17;;:21;13573:439;;13840:10;13834:17;13901:15;13888:10;13884:2;13880:19;13873:44;13788:148;13976:20;;-1:-1:-1;;;13976:20:0;;;;;;;;;;;;;;;;;13983:12;;13976:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8756:422;9123:20;9162:8;;;8756:422::o

Swarm Source

ipfs://b3edf526a6139da816766cdf5223b2e0bdebd1cae768e38a40fadb929391c5ce

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  ]

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.