ETH Price: $3,269.13 (+3.12%)
Gas: 2 Gwei

Contract

0xc4f2030dEd976F45fBb23b702ba725d6f88eF142
 
Transaction Hash
Method
Block
From
To
Withdraw192604582024-02-19 8:00:23157 days ago1708329623IN
0xc4f2030d...6f88eF142
0 ETH0.0040907425.46578172
Liquidate192604402024-02-19 7:56:47157 days ago1708329407IN
0xc4f2030d...6f88eF142
0 ETH0.0032706425.99563118
Liquidate192604362024-02-19 7:55:59157 days ago1708329359IN
0xc4f2030d...6f88eF142
0 ETH0.0043886327.8662843
Withdraw185317142023-11-09 3:29:11260 days ago1699500551IN
0xc4f2030d...6f88eF142
0 ETH0.0042336836.77849489
Repay185317102023-11-09 3:28:23260 days ago1699500503IN
0xc4f2030d...6f88eF142
0 ETH0.0033264736.09538141
Withdraw150730822022-07-04 1:25:07753 days ago1656897907IN
0xc4f2030d...6f88eF142
0 ETH0.0016874211.55949761
Liquidate150730562022-07-04 1:20:56753 days ago1656897656IN
0xc4f2030d...6f88eF142
0 ETH0.003393721.54882295
Withdraw145723762022-04-12 18:31:36835 days ago1649788296IN
0xc4f2030d...6f88eF142
0 ETH0.0059221248.15636964
Liquidate145723502022-04-12 18:25:49835 days ago1649787949IN
0xc4f2030d...6f88eF142
0 ETH0.0081111665.00480156
Mint145723402022-04-12 18:23:13835 days ago1649787793IN
0xc4f2030d...6f88eF142
0 ETH0.0097121457.82966937
Deposit145723182022-04-12 18:17:59835 days ago1649787479IN
0xc4f2030d...6f88eF142
0 ETH0.0064345667.89235276
Withdraw137778692021-12-10 14:13:22958 days ago1639145602IN
0xc4f2030d...6f88eF142
0 ETH0.0073070767.73963531
Liquidate137778602021-12-10 14:10:51958 days ago1639145451IN
0xc4f2030d...6f88eF142
0 ETH0.0077759562.31234197
Repay137778522021-12-10 14:09:00958 days ago1639145340IN
0xc4f2030d...6f88eF142
0 ETH0.0061261566.48314776
Withdraw137440922021-12-05 5:00:42964 days ago1638680442IN
0xc4f2030d...6f88eF142
0 ETH0.008677660.9532156
Repay137440482021-12-05 4:51:58964 days ago1638679918IN
0xc4f2030d...6f88eF142
0 ETH0.0045350465.06711994
Withdraw137268152021-12-02 10:23:31966 days ago1638440611IN
0xc4f2030d...6f88eF142
0 ETH0.0087826669.73413991
Repay137267252021-12-02 10:06:10966 days ago1638439570IN
0xc4f2030d...6f88eF142
0 ETH0.0085792493.08069424
Mint135519942021-11-04 19:12:17994 days ago1636053137IN
0xc4f2030d...6f88eF142
0 ETH0.01909651140.71250286
Deposit135518672021-11-04 18:41:01994 days ago1636051261IN
0xc4f2030d...6f88eF142
0 ETH0.01682799131.97809163
Withdraw135420502021-11-03 5:23:37996 days ago1635917017IN
0xc4f2030d...6f88eF142
0 ETH0.01170749122.01157834
Repay135420422021-11-03 5:22:21996 days ago1635916941IN
0xc4f2030d...6f88eF142
0 ETH0.01229198133.36207072
Withdraw132654522021-09-20 22:50:201039 days ago1632178220IN
0xc4f2030d...6f88eF142
0 ETH0.0077654555.42280434
Liquidate132654342021-09-20 22:46:561039 days ago1632178016IN
0xc4f2030d...6f88eF142
0 ETH0.008992561.89521816
Withdraw132589392021-09-19 22:37:361040 days ago1632091056IN
0xc4f2030d...6f88eF142
0 ETH0.0057018252.85834061
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:
YumLinkVesperVault

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-18
*/

// Sources flattened with hardhat v2.6.0 https://hardhat.org

// File @openzeppelin/contracts/math/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.2 <0.8.0;

/**
 * @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 on 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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        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);
            }
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File @openzeppelin/contracts/math/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * 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);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity >=0.6.0 <0.8.0;



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


// File contracts/libraries/FixedPointMath.sol

pragma solidity ^0.6.12;

library FixedPointMath {
  uint256 public constant DECIMALS = 18;
  uint256 public constant SCALAR = 10**DECIMALS;

  struct uq192x64 {
    uint256 x;
  }

  function fromU256(uint256 value) internal pure returns (uq192x64 memory) {
    uint256 x;
    require(value == 0 || (x = value * SCALAR) / SCALAR == value);
    return uq192x64(x);
  }

  function maximumValue() internal pure returns (uq192x64 memory) {
    return uq192x64(uint256(-1));
  }

  function add(uq192x64 memory self, uq192x64 memory value) internal pure returns (uq192x64 memory) {
    uint256 x;
    require((x = self.x + value.x) >= self.x);
    return uq192x64(x);
  }

  function add(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) {
    return add(self, fromU256(value));
  }

  function sub(uq192x64 memory self, uq192x64 memory value) internal pure returns (uq192x64 memory) {
    uint256 x;
    require((x = self.x - value.x) <= self.x);
    return uq192x64(x);
  }

  function sub(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) {
    return sub(self, fromU256(value));
  }

  function mul(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) {
    uint256 x;
    require(value == 0 || (x = self.x * value) / value == self.x);
    return uq192x64(x);
  }

  function div(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) {
    require(value != 0);
    return uq192x64(self.x / value);
  }

  function cmp(uq192x64 memory self, uq192x64 memory value) internal pure returns (int256) {
    if (self.x < value.x) {
      return -1;
    }

    if (self.x > value.x) {
      return 1;
    }

    return 0;
  }

  function decode(uq192x64 memory self) internal pure returns (uint256) {
    return self.x / SCALAR;
  }
}


// File contracts/interfaces/IDetailedERC20.sol

pragma solidity ^0.6.12;

interface IDetailedERC20 is IERC20 {
  function name() external returns (string memory);
  function symbol() external returns (string memory);
  function decimals() external returns (uint8);
}


// File hardhat/[email protected]

pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}


// File contracts/libraries/alchemist/CDP.sol

pragma solidity ^0.6.12;





/// @title CDP
///
/// @dev A library which provides the CDP data struct and associated functions.
library CDP {
  using CDP for Data;
  using FixedPointMath for FixedPointMath.uq192x64;
  using SafeERC20 for IDetailedERC20;
  using SafeMath for uint256;

  struct Context {
    FixedPointMath.uq192x64 collateralizationLimit;
    FixedPointMath.uq192x64 accumulatedYieldWeight;
  }

  struct Data {
    uint256 totalDeposited;
    uint256 totalDebt;
    uint256 totalCredit;
    uint256 lastDeposit;
    FixedPointMath.uq192x64 lastAccumulatedYieldWeight;
  }

  function update(Data storage _self, Context storage _ctx) internal {
    uint256 _earnedYield = _self.getEarnedYield(_ctx);
    if (_earnedYield > _self.totalDebt) {
      uint256 _currentTotalDebt = _self.totalDebt;
      _self.totalDebt = 0;
      _self.totalCredit = _earnedYield.sub(_currentTotalDebt);
    } else {
      _self.totalDebt = _self.totalDebt.sub(_earnedYield);
    }
    _self.lastAccumulatedYieldWeight = _ctx.accumulatedYieldWeight;
  }

  /// @dev Assures that the CDP is healthy.
  ///
  /// This function will revert if the CDP is unhealthy.
  function checkHealth(Data storage _self, Context storage _ctx, string memory _msg) internal view {
    require(_self.isHealthy(_ctx), _msg);
  }

  /// @dev Gets if the CDP is considered healthy.
  ///
  /// A CDP is healthy if its collateralization ratio is greater than the global collateralization limit.
  ///
  /// @return if the CDP is healthy.
  function isHealthy(Data storage _self, Context storage _ctx) internal view returns (bool) {
    return _ctx.collateralizationLimit.cmp(_self.getCollateralizationRatio(_ctx)) <= 0;
  }

  function getUpdatedTotalDebt(Data storage _self, Context storage _ctx) internal view returns (uint256) {
    uint256 _unclaimedYield = _self.getEarnedYield(_ctx);
    if (_unclaimedYield == 0) {
      return _self.totalDebt;
    }

    uint256 _currentTotalDebt = _self.totalDebt;
    if (_unclaimedYield >= _currentTotalDebt) {
      return 0;
    }

    return _currentTotalDebt - _unclaimedYield;
  }

  function getUpdatedTotalCredit(Data storage _self, Context storage _ctx) internal view returns (uint256) {
    uint256 _unclaimedYield = _self.getEarnedYield(_ctx);
    if (_unclaimedYield == 0) {
      return _self.totalCredit;
    }

    uint256 _currentTotalDebt = _self.totalDebt;
    if (_unclaimedYield <= _currentTotalDebt) {
      return 0;
    }

    return _self.totalCredit + (_unclaimedYield - _currentTotalDebt);
  }

  /// @dev Gets the amount of yield that a CDP has earned since the last time it was updated.
  ///
  /// @param _self the CDP to query.
  /// @param _ctx  the CDP context.
  ///
  /// @return the amount of earned yield.
  function getEarnedYield(Data storage _self, Context storage _ctx) internal view returns (uint256) {
    FixedPointMath.uq192x64 memory _currentAccumulatedYieldWeight = _ctx.accumulatedYieldWeight;
    FixedPointMath.uq192x64 memory _lastAccumulatedYieldWeight = _self.lastAccumulatedYieldWeight;

    if (_currentAccumulatedYieldWeight.cmp(_lastAccumulatedYieldWeight) == 0) {
      return 0;
    }

    return _currentAccumulatedYieldWeight
      .sub(_lastAccumulatedYieldWeight)
      .mul(_self.totalDeposited)
      .decode();
  }

  /// @dev Gets a CDPs collateralization ratio.
  ///
  /// The collateralization ratio is defined as the ratio of collateral to debt. If the CDP has zero debt then this
  /// will return the maximum value of a fixed point integer.
  ///
  /// This function will use the updated total debt so an update before calling this function is not required.
  ///
  /// @param _self the CDP to query.
  ///
  /// @return a fixed point integer representing the collateralization ratio.
  function getCollateralizationRatio(Data storage _self, Context storage _ctx)
    internal view
    returns (FixedPointMath.uq192x64 memory)
  {
    uint256 _totalDebt = _self.getUpdatedTotalDebt(_ctx);
    if (_totalDebt == 0) {
      return FixedPointMath.maximumValue();
    }
    return FixedPointMath.fromU256(_self.totalDeposited).div(_totalDebt);
  }
}


// File contracts/interfaces/ITransmuter.sol

pragma solidity ^0.6.12;

interface ITransmuter  {
  function distribute (address origin, uint256 amount) external;
}


// File contracts/interfaces/IMintableERC20.sol

pragma solidity ^0.6.12;

interface IMintableERC20 is IDetailedERC20{
  function mint(address _recipient, uint256 _amount) external;
  function burnFrom(address account, uint256 amount) external;
  function lowerHasMinted(uint256 amount)external;
}


// File contracts/interfaces/IChainlink.sol

pragma solidity ^0.6.12;

interface IChainlink {
  function latestAnswer() external view returns (int256);
}


// File contracts/interfaces/IVaultAdapterV2.sol

pragma solidity ^0.6.12;

/// Interface for all Vault Adapter implementations.
interface IVaultAdapterV2 {

  /// @dev Gets the token that the adapter accepts.
  function token() external view returns (IDetailedERC20);

  /// @dev The total value of the assets deposited into the vault.
  function totalValue() external view returns (uint256);

  /// @dev Deposits funds into the vault.
  ///
  /// @param _amount  the amount of funds to deposit.
  function deposit(uint256 _amount) external;

  /// @dev Attempts to withdraw funds from the wrapped vault.
  ///
  /// The amount withdrawn to the recipient may be less than the amount requested.
  ///
  /// @param _recipient the recipient of the funds.
  /// @param _amount    the amount of funds to withdraw.
  function withdraw(address _recipient, uint256 _amount, bool _isHarvest) external;
}


// File contracts/libraries/alchemist/VaultV2.sol

pragma solidity ^0.6.12;

//import "hardhat/console.sol";






/// @title Pool
///
/// @dev A library which provides the Vault data struct and associated functions.
library VaultV2 {
  using VaultV2 for Data;
  using VaultV2 for List;
  using SafeERC20 for IDetailedERC20;
  using SafeMath for uint256;

  struct Data {
    IVaultAdapterV2 adapter;
    uint256 totalDeposited;
  }

  struct List {
    Data[] elements;
  }

  /// @dev Gets the total amount of assets deposited in the vault.
  ///
  /// @return the total assets.
  function totalValue(Data storage _self) internal view returns (uint256) {
    return _self.adapter.totalValue();
  }

  /// @dev Gets the token that the vault accepts.
  ///
  /// @return the accepted token.
  function token(Data storage _self) internal view returns (IDetailedERC20) {
    return IDetailedERC20(_self.adapter.token());
  }

  /// @dev Deposits funds from the caller into the vault.
  ///
  /// @param _amount the amount of funds to deposit.
  function deposit(Data storage _self, uint256 _amount) internal returns (uint256) {
    // Push the token that the vault accepts onto the stack to save gas.
    IDetailedERC20 _token = _self.token();

    _token.safeTransfer(address(_self.adapter), _amount);
    _self.adapter.deposit(_amount);
    _self.totalDeposited = _self.totalDeposited.add(_amount);

    return _amount;
  }

  /// @dev Deposits the entire token balance of the caller into the vault.
  function depositAll(Data storage _self) internal returns (uint256) {
    IDetailedERC20 _token = _self.token();
    return _self.deposit(_token.balanceOf(address(this)));
  }

  /// @dev Withdraw deposited funds from the vault.
  ///
  /// @param _recipient the account to withdraw the tokens to.
  /// @param _amount    the amount of tokens to withdraw.
  function withdraw(Data storage _self, address _recipient, uint256 _amount, bool _isHarvest) internal returns (uint256, uint256) {
    (uint256 _withdrawnAmount, uint256 _decreasedValue) = _self.directWithdraw(_recipient, _amount, _isHarvest);
    _self.totalDeposited = _self.totalDeposited.sub(_decreasedValue);
    return (_withdrawnAmount, _decreasedValue);
  }

  /// @dev Directly withdraw deposited funds from the vault.
  ///
  /// @param _recipient the account to withdraw the tokens to.
  /// @param _amount    the amount of tokens to withdraw.
  function directWithdraw(Data storage _self, address _recipient, uint256 _amount, bool _isHarvest) internal returns (uint256, uint256) {
    IDetailedERC20 _token = _self.token();

    uint256 _startingBalance = _token.balanceOf(_recipient);
    uint256 _startingTotalValue = _self.totalValue();

    _self.adapter.withdraw(_recipient, _amount, _isHarvest);

    uint256 _endingBalance = _token.balanceOf(_recipient);
    uint256 _withdrawnAmount = _endingBalance.sub(_startingBalance);

    uint256 _endingTotalValue = _self.totalValue();
    uint256 _decreasedValue = _startingTotalValue.sub(_endingTotalValue);

    return (_withdrawnAmount, _decreasedValue);
  }

  /// @dev Withdraw all the deposited funds from the vault.
  ///
  /// @param _recipient the account to withdraw the tokens to.
  function withdrawAll(Data storage _self, address _recipient) internal returns (uint256, uint256) {
    return _self.withdraw(_recipient, _self.totalDeposited, false);
  }

  /// @dev Harvests yield from the vault.
  ///
  /// @param _recipient the account to withdraw the harvested yield to.
  function harvest(Data storage _self, address _recipient) internal returns (uint256, uint256) {
    if (_self.totalValue() <= _self.totalDeposited) {
      return (0, 0);
    }
    uint256 _withdrawAmount = _self.totalValue().sub(_self.totalDeposited);
    return _self.directWithdraw(_recipient, _withdrawAmount, true);
  }

  /// @dev Adds a element to the list.
  ///
  /// @param _element the element to add.
  function push(List storage _self, Data memory _element) internal {
    _self.elements.push(_element);
  }

  /// @dev Gets a element from the list.
  ///
  /// @param _index the index in the list.
  ///
  /// @return the element at the specified index.
  function get(List storage _self, uint256 _index) internal view returns (Data storage) {
    return _self.elements[_index];
  }

  /// @dev Gets the last element in the list.
  ///
  /// This function will revert if there are no elements in the list.
  ///
  /// @return the last element in the list.
  function last(List storage _self) internal view returns (Data storage) {
    return _self.elements[_self.lastIndex()];
  }

  /// @dev Gets the index of the last element in the list.
  ///
  /// This function will revert if there are no elements in the list.
  ///
  /// @return the index of the last element.
  function lastIndex(List storage _self) internal view returns (uint256) {
    uint256 _length = _self.length();
    return _length.sub(1, "Vault.List: empty");
  }

  /// @dev Gets the number of elements in the list.
  ///
  /// @return the number of elements.
  function length(List storage _self) internal view returns (uint256) {
    return _self.elements.length;
  }
}


// File contracts/interfaces/IVotingEscrow.sol

pragma solidity ^0.6.12;

interface IVotingEscrow  {
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
}


// File contracts/YumLinkVesperVault.sol

pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;


contract YumLinkVesperVault is ReentrancyGuard {
  using CDP for CDP.Data;
  using FixedPointMath for FixedPointMath.uq192x64;
  using VaultV2 for VaultV2.Data;
  using VaultV2 for VaultV2.List;
  using SafeERC20 for IMintableERC20;
  using SafeMath for uint256;
  using Address for address;

  address public constant ZERO_ADDRESS = address(0);

  /// @dev Resolution for all fixed point numeric parameters which represent percents. The resolution allows for a
  /// granularity of 0.01% increments.
  uint256 public constant PERCENT_RESOLUTION = 10000;

  /// @dev The minimum value that the collateralization limit can be set to by the governance. This is a safety rail
  /// to prevent the collateralization from being set to a value which breaks the system.
  ///
  /// This value is equal to 100%.
  ///
  /// IMPORTANT: This constant is a raw FixedPointMath.uq192x64 value and assumes a resolution of 64 bits. If the
  ///            resolution for the FixedPointMath library changes this constant must change as well.
  uint256 public constant MINIMUM_COLLATERALIZATION_LIMIT = 1000000000000000000;

  /// @dev The maximum value that the collateralization limit can be set to by the governance. This is a safety rail
  /// to prevent the collateralization from being set to a value which breaks the system.
  ///
  /// This value is equal to 400%.
  ///
  /// IMPORTANT: This constant is a raw FixedPointMath.uq192x64 value and assumes a resolution of 64 bits. If the
  ///            resolution for the FixedPointMath library changes this constant must change as well.
  uint256 public constant MAXIMUM_COLLATERALIZATION_LIMIT = 4000000000000000000;

  event GovernanceUpdated(
    address governance
  );

  event PendingGovernanceUpdated(
    address pendingGovernance
  );

  event SentinelUpdated(
    address sentinel
  );

  event TransmuterUpdated(
    address transmuter
  );

  event RewardsUpdated(
    address treasury
  );

  event HarvestFeeUpdated(
    uint256 fee
  );

  event CollateralizationLimitUpdated(
    uint256 limit
  );

  event EmergencyExitUpdated(
    bool status
  );

  event ActiveVaultUpdated(
    IVaultAdapterV2 indexed adapter
  );

  event FundsHarvested(
    uint256 withdrawnAmount,
    uint256 decreasedValue
  );

  event FundsRecalled(
    uint256 indexed vaultId,
    uint256 withdrawnAmount,
    uint256 decreasedValue
  );

  event FundsFlushed(
    uint256 amount
  );

  event TokensDeposited(
    address indexed account,
    uint256 amount
  );

  event TokensWithdrawn(
    address indexed account,
    uint256 requestedAmount,
    uint256 withdrawnAmount,
    uint256 decreasedValue
  );

  event TokensRepaid(
    address indexed account,
    uint256 parentAmount,
    uint256 childAmount
  );

  event TokensLiquidated(
    address indexed account,
    uint256 requestedAmount,
    uint256 withdrawnAmount,
    uint256 decreasedValue
  );

  /// @dev The token that this contract is using as the parent asset.
  IMintableERC20 public token;

   /// @dev The token that this contract is using as the child asset.
  IMintableERC20 public xtoken;

  /// @dev The votingEscrow for discount calculation
  IVotingEscrow public votingEscrow;

  /// @dev The address of the account which currently has administrative capabilities over this contract.
  address public governance;

  /// @dev The address of the pending governance.
  address public pendingGovernance;

  /// @dev The address of the account which can initiate an emergency withdraw of funds in a vault.
  address public sentinel;

  /// @dev The address of the account which collect minting and withdraw fee from vault.
  address public feeCollector;

  /// @dev The address of the contract which will transmute synthetic tokens back into native tokens.
  address public transmuter;

  /// @dev The address of the contract which will receive fees.
  address public rewards;

  /// @dev The percent of each profitable harvest that will go to the rewards contract.
  uint256 public harvestFee;

  /// @dev The total amount the native token deposited into the system that is owned by external users.
  uint256 public totalDeposited;

  /// @dev when movemetns are bigger than this number flush is activated.
  uint256 public flushActivator;

  /// @dev A flag indicating if the contract has been initialized yet.
  bool public initialized;

  /// @dev A flag indicating if deposits and flushes should be halted and if all parties should be able to recall
  /// from the active vault.
  bool public emergencyExit;

  /// @dev The context shared between the CDPs.
  CDP.Context private _ctx;

  /// @dev A mapping of all of the user CDPs. If a user wishes to have multiple CDPs they will have to either
  /// create a new address or set up a proxy contract that interfaces with this contract.
  mapping(address => CDP.Data) private _cdps;

  /// @dev A list of all of the vaults. The last element of the list is the vault that is currently being used for
  /// deposits and withdraws. Vaults before the last element are considered inactive and are expected to be cleared.
  VaultV2.List private _vaults;

  /// @dev The address of the link oracle.
  address public _linkGasOracle;

  /// @dev The minimum returned amount needed to be on peg according to the oracle.
  uint256 public pegMinimum;

  // @dev fee related
  uint256[] public feeLevel; // fixed length = 9 (unit without 10^18); [50,200,500,1000,2000,3500,6000,9000,11000]
  uint256[] public discountTable; // fixed length = 9; [9,19,28,40,50,60,70,80,90]
  uint256 public vaultFee; // divided by 10000

  constructor(
    IMintableERC20 _token,
    IMintableERC20 _xtoken,
    IVotingEscrow _votingEscrow,
    address _governance,
    address _sentinel,
    address _feeCollector
  )
    public
  {
    require(_governance != ZERO_ADDRESS, "YumLinkVesperVault: governance address cannot be 0x0.");
    require(_sentinel != ZERO_ADDRESS, "YumLinkVesperVault: sentinel address cannot be 0x0.");
    require(_feeCollector != ZERO_ADDRESS, "YumLinkVesperVault: feeCollector address cannot be 0x0.");

    token = _token;
    xtoken = _xtoken;
    votingEscrow = _votingEscrow;
    governance = _governance;
    sentinel = _sentinel;
    feeCollector = _feeCollector;

    flushActivator = 5000 ether;// change for non 18 digit tokens

    uint256 COLL_LIMIT = MINIMUM_COLLATERALIZATION_LIMIT.mul(2);
    _ctx.collateralizationLimit = FixedPointMath.uq192x64(COLL_LIMIT);
    _ctx.accumulatedYieldWeight = FixedPointMath.uq192x64(0);

    feeLevel = [50,200,500,1000,2000,3500,6000,9000,11000];
    discountTable = [10,20,30,40,50,60,72,81,91];
    vaultFee = 20;
  }

  /// @dev Sets the pending governance.
  ///
  /// This function reverts if the new pending governance is the zero address or the caller is not the current
  /// governance. This is to prevent the contract governance being set to the zero address which would deadlock
  /// privileged contract functionality.
  ///
  /// @param _pendingGovernance the new pending governance.
  function setPendingGovernance(address _pendingGovernance) external onlyGov {
    require(_pendingGovernance != ZERO_ADDRESS, "YumLinkVesperVault: governance address cannot be 0x0.");

    pendingGovernance = _pendingGovernance;

    emit PendingGovernanceUpdated(_pendingGovernance);
  }

  /// @dev Accepts the role as governance.
  ///
  /// This function reverts if the caller is not the new pending governance.
  function acceptGovernance() external  {
    require(msg.sender == pendingGovernance,"sender is not pendingGovernance");
    address _pendingGovernance = pendingGovernance;
    governance = _pendingGovernance;

    emit GovernanceUpdated(_pendingGovernance);
  }

  function setSentinel(address _sentinel) external onlyGov {

    require(_sentinel != ZERO_ADDRESS, "YumLinkVesperVault: sentinel address cannot be 0x0.");

    sentinel = _sentinel;

    emit SentinelUpdated(_sentinel);
  }

  /// @dev Sets the transmuter.
  ///
  /// This function reverts if the new transmuter is the zero address or the caller is not the current governance.
  ///
  /// @param _transmuter the new transmuter.
  function setTransmuter(address _transmuter) external onlyGov {

    // Check that the transmuter address is not the zero address. Setting the transmuter to the zero address would break
    // transfers to the address because of `safeTransfer` checks.
    require(_transmuter != ZERO_ADDRESS, "YumLinkVesperVault: transmuter address cannot be 0x0.");

    transmuter = _transmuter;

    emit TransmuterUpdated(_transmuter);
  }
  /// @dev Sets the flushActivator.
  ///
  /// @param _flushActivator the new flushActivator.
  function setFlushActivator(uint256 _flushActivator) external onlyGov {
    flushActivator = _flushActivator;

  }

  /// @dev Sets the rewards contract.
  ///
  /// This function reverts if the new rewards contract is the zero address or the caller is not the current governance.
  ///
  /// @param _rewards the new rewards contract.
  function setRewards(address _rewards) external onlyGov {

    // Check that the rewards address is not the zero address. Setting the rewards to the zero address would break
    // transfers to the address because of `safeTransfer` checks.
    require(_rewards != ZERO_ADDRESS, "YumLinkVesperVault: rewards address cannot be 0x0.");

    rewards = _rewards;

    emit RewardsUpdated(_rewards);
  }

  /// @dev Sets the harvest fee.
  ///
  /// This function reverts if the caller is not the current governance.
  ///
  /// @param _harvestFee the new harvest fee.
  function setHarvestFee(uint256 _harvestFee) external onlyGov {

    // Check that the harvest fee is within the acceptable range. Setting the harvest fee greater than 100% could
    // potentially break internal logic when calculating the harvest fee.
    require(_harvestFee <= PERCENT_RESOLUTION, "YumLinkVesperVault: harvest fee above maximum.");

    harvestFee = _harvestFee;

    emit HarvestFeeUpdated(_harvestFee);
  }

  function setFeeLevel(uint256[] calldata _feeLevel) external onlyGov {
    require(_feeLevel.length == 9, "YumLinkVesperVault: feeLevel length mismatch");
    feeLevel = _feeLevel;
  }

  function setDiscountTable(uint256[] calldata _discountTable) external onlyGov {
    require(_discountTable.length == 9, "YumLinkVesperVault: discountTable length mismatch");
    discountTable = _discountTable;
  }

  function setVaultFee(uint256 _vaultFee) external onlyGov {
    vaultFee = _vaultFee;
  }

  /// @dev Sets the collateralization limit.
  ///
  /// This function reverts if the caller is not the current governance or if the collateralization limit is outside
  /// of the accepted bounds.
  ///
  /// @param _limit the new collateralization limit.
  function setCollateralizationLimit(uint256 _limit) external onlyGov {

    require(_limit >= MINIMUM_COLLATERALIZATION_LIMIT, "YumLinkVesperVault: collateralization limit below minimum.");
    require(_limit <= MAXIMUM_COLLATERALIZATION_LIMIT, "YumLinkVesperVault: collateralization limit above maximum.");

    _ctx.collateralizationLimit = FixedPointMath.uq192x64(_limit);

    emit CollateralizationLimitUpdated(_limit);
  }
  /// @dev Set oracle.
  function setOracleAddress(address Oracle, uint256 peg) external onlyGov {
    _linkGasOracle = Oracle;
    pegMinimum = peg;
  }
  /// @dev Sets if the contract should enter emergency exit mode.
  ///
  /// @param _emergencyExit if the contract should enter emergency exit mode.
  function setEmergencyExit(bool _emergencyExit) external {
    require(msg.sender == governance || msg.sender == sentinel, "");

    emergencyExit = _emergencyExit;

    emit EmergencyExitUpdated(_emergencyExit);
  }

  /// @dev Gets the collateralization limit.
  ///
  /// The collateralization limit is the minimum ratio of collateral to debt that is allowed by the system.
  ///
  /// @return the collateralization limit.
  function collateralizationLimit() external view returns (FixedPointMath.uq192x64 memory) {
    return _ctx.collateralizationLimit;
  }

  /// @dev Initializes the contract.
  ///
  /// This function checks that the transmuter and rewards have been set and sets up the active vault.
  ///
  /// @param _adapter the vault adapter of the active vault.
  function initialize(IVaultAdapterV2 _adapter) external onlyGov {

    require(!initialized, "YumLinkVesperVault: already initialized");

    require(transmuter != ZERO_ADDRESS, "YumLinkVesperVault: cannot initialize transmuter address to 0x0");
    require(rewards != ZERO_ADDRESS, "YumLinkVesperVault: cannot initialize rewards address to 0x0");

    _updateActiveVault(_adapter);

    initialized = true;
  }

  /// @dev Migrates the system to a new vault.
  ///
  /// This function reverts if the vault adapter is the zero address, if the token that the vault adapter accepts
  /// is not the token that this contract defines as the parent asset, or if the contract has not yet been initialized.
  ///
  /// @param _adapter the adapter for the vault the system will migrate to.
  function migrate(IVaultAdapterV2 _adapter) external expectInitialized onlyGov {

    _updateActiveVault(_adapter);
  }

  /// @dev Harvests yield from a vault.
  ///
  /// @param _vaultId the identifier of the vault to harvest from.
  ///
  /// @return the amount of funds that were harvested from the vault.
  function harvest(uint256 _vaultId) external expectInitialized returns (uint256, uint256) {

    VaultV2.Data storage _vault = _vaults.get(_vaultId);

    (uint256 _harvestedAmount, uint256 _decreasedValue) = _vault.harvest(address(this));

    if (_harvestedAmount > 0) {
      uint256 _feeAmount = _harvestedAmount.mul(harvestFee).div(PERCENT_RESOLUTION);
      uint256 _distributeAmount = _harvestedAmount.sub(_feeAmount);

      FixedPointMath.uq192x64 memory _weight = FixedPointMath.fromU256(_distributeAmount).div(totalDeposited);
      _ctx.accumulatedYieldWeight = _ctx.accumulatedYieldWeight.add(_weight);

      if (_feeAmount > 0) {
        token.safeTransfer(rewards, _feeAmount);
      }

      if (_distributeAmount > 0) {
        _distributeToTransmuter(_distributeAmount);
      }
    }

    emit FundsHarvested(_harvestedAmount, _decreasedValue);

    return (_harvestedAmount, _decreasedValue);
  }

  /// @dev Recalls an amount of deposited funds from a vault to this contract.
  ///
  /// @param _vaultId the identifier of the recall funds from.
  ///
  /// @return the amount of funds that were recalled from the vault to this contract and the decreased vault value.
  function recall(uint256 _vaultId, uint256 _amount) external nonReentrant expectInitialized returns (uint256, uint256) {

    return _recallFunds(_vaultId, _amount);
  }

  /// @dev Recalls all the deposited funds from a vault to this contract.
  ///
  /// @param _vaultId the identifier of the recall funds from.
  ///
  /// @return the amount of funds that were recalled from the vault to this contract and the decreased vault value.
  function recallAll(uint256 _vaultId) external nonReentrant expectInitialized returns (uint256, uint256) {
    VaultV2.Data storage _vault = _vaults.get(_vaultId);
    return _recallFunds(_vaultId, _vault.totalDeposited);
  }

  /// @dev Flushes buffered tokens to the active vault.
  ///
  /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of
  /// additional funds.
  ///
  /// @return the amount of tokens flushed to the active vault.
  function flush() external nonReentrant expectInitialized returns (uint256) {

    // Prevent flushing to the active vault when an emergency exit is enabled to prevent potential loss of funds if
    // the active vault is poisoned for any reason.
    require(!emergencyExit, "emergency pause enabled");

    return flushActiveVault();
  }

  /// @dev Internal function to flush buffered tokens to the active vault.
  ///
  /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of
  /// additional funds.
  ///
  /// @return the amount of tokens flushed to the active vault.
  function flushActiveVault() internal returns (uint256) {

    VaultV2.Data storage _activeVault = _vaults.last();
    uint256 _depositedAmount = _activeVault.depositAll();

    emit FundsFlushed(_depositedAmount);

    return _depositedAmount;
  }

  /// @dev Deposits collateral into a CDP.
  ///
  /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of
  /// additional funds.
  ///
  /// @param _amount the amount of collateral to deposit.

  function deposit(uint256 _amount) external nonReentrant noContractAllowed expectInitialized {

    require(!emergencyExit, "emergency pause enabled");

    CDP.Data storage _cdp = _cdps[msg.sender];
    _cdp.update(_ctx);

    token.safeTransferFrom(msg.sender, address(this), _amount);
    if(_amount >= flushActivator) {
      flushActiveVault();
    }
    totalDeposited = totalDeposited.add(_amount);

    _cdp.totalDeposited = _cdp.totalDeposited.add(_amount);
    _cdp.lastDeposit = block.number;

    emit TokensDeposited(msg.sender, _amount);
  }


  function getVaultFeeAmount(address _account, uint256 _amount) internal view returns (uint256) {
    uint256 outputFee = 0;
    uint256 hundred = 100;
    uint256 votingBalance = votingEscrow.balanceOf(_account);
    outputFee = _amount.mul(vaultFee).div(10000);

    if(votingBalance > 0){
      for (uint256 i = 0; i < 9; ++i) {
        if(votingBalance >= (feeLevel[i]).mul(1 ether)){
          outputFee = _amount.mul(vaultFee).div(10000);
          outputFee = outputFee.mul(hundred.sub(discountTable[i])).div(100);
        }
      }
    }

    return outputFee;

  }

  /// @dev Attempts to withdraw part of a CDP's collateral.
  ///
  /// This function reverts if a deposit into the CDP was made in the same block. This is to prevent flash loan attacks
  /// on other internal or external systems.
  ///
  /// @param _amount the amount of collateral to withdraw.
  function withdraw(uint256 _amount) external nonReentrant noContractAllowed expectInitialized returns (uint256, uint256) {

    CDP.Data storage _cdp = _cdps[msg.sender];
    require(block.number > _cdp.lastDeposit, "");

    _cdp.update(_ctx);

    uint256 calculateVaultFee = getVaultFeeAmount(msg.sender,_amount);
    uint256 finalizedAmount = _amount;
    uint256 _withdrawnAmount = 0;
    uint256 _decreasedValue = 0;

    if(calculateVaultFee > 0){
      (uint256 _withdrawnFeeAmount, uint256 _decreasedFeeValue) = _withdrawFundsTo(feeCollector, calculateVaultFee);
      finalizedAmount = finalizedAmount.sub(calculateVaultFee);


      (_withdrawnAmount, _decreasedValue) = _withdrawFundsTo(msg.sender, finalizedAmount);

      _decreasedValue = _decreasedValue.add(_decreasedFeeValue);
      _withdrawnAmount = _withdrawnAmount.add(_withdrawnFeeAmount);
    } else {
      (_withdrawnAmount, _decreasedValue) = _withdrawFundsTo(msg.sender, finalizedAmount);
    }

    _cdp.totalDeposited = _cdp.totalDeposited.sub(_decreasedValue, "Exceeds withdrawable amount");
    _cdp.checkHealth(_ctx, "Action blocked: unhealthy collateralization ratio");

    emit TokensWithdrawn(msg.sender, _amount, _withdrawnAmount, _decreasedValue);

    return (_withdrawnAmount, _decreasedValue);
  }

  /// @dev Repays debt with the native and or synthetic token.
  ///
  /// An approval is required to transfer native tokens to the transmuter.
  function repay(uint256 _parentAmount, uint256 _childAmount) external nonReentrant noContractAllowed onLinkCheck expectInitialized {

    CDP.Data storage _cdp = _cdps[msg.sender];
    _cdp.update(_ctx);

    if (_parentAmount > 0) {
      token.safeTransferFrom(msg.sender, address(this), _parentAmount);
      _distributeToTransmuter(_parentAmount);
    }

    if (_childAmount > 0) {
      xtoken.burnFrom(msg.sender, _childAmount);
      //lower debt cause burn
      xtoken.lowerHasMinted(_childAmount);
    }

    uint256 _totalAmount = _parentAmount.add(_childAmount);
    _cdp.totalDebt = _cdp.totalDebt.sub(_totalAmount, "");

    emit TokensRepaid(msg.sender, _parentAmount, _childAmount);
  }

  /// @dev Attempts to liquidate part of a CDP's collateral to pay back its debt.
  ///
  /// @param _amount the amount of collateral to attempt to liquidate.
  function liquidate(uint256 _amount) external nonReentrant noContractAllowed onLinkCheck expectInitialized returns (uint256, uint256) {
    CDP.Data storage _cdp = _cdps[msg.sender];
    _cdp.update(_ctx);

    // don't attempt to liquidate more than is possible
    if(_amount > _cdp.totalDebt){
      _amount = _cdp.totalDebt;
    }
    (uint256 _withdrawnAmount, uint256 _decreasedValue) = _withdrawFundsTo(address(this), _amount);
    //changed to new transmuter compatibillity
    _distributeToTransmuter(_withdrawnAmount);

    _cdp.totalDeposited = _cdp.totalDeposited.sub(_decreasedValue, "");
    _cdp.totalDebt = _cdp.totalDebt.sub(_withdrawnAmount, "");
    emit TokensLiquidated(msg.sender, _amount, _withdrawnAmount, _decreasedValue);

    return (_withdrawnAmount, _decreasedValue);
  }

  /// @dev Mints synthetic tokens by either claiming credit or increasing the debt.
  ///
  /// Claiming credit will take priority over increasing the debt.
  ///
  /// This function reverts if the debt is increased and the CDP health check fails.
  ///
  /// @param _amount the amount of alchemic tokens to borrow.
  function mint(uint256 _amount) external nonReentrant noContractAllowed onLinkCheck expectInitialized {

    CDP.Data storage _cdp = _cdps[msg.sender];
    _cdp.update(_ctx);

    uint256 _totalCredit = _cdp.totalCredit;

    if (_totalCredit < _amount) {
      uint256 _remainingAmount = _amount.sub(_totalCredit);
      _cdp.totalDebt = _cdp.totalDebt.add(_remainingAmount);
      _cdp.totalCredit = 0;

      _cdp.checkHealth(_ctx, "YumLinkVesperVault: Loan-to-value ratio breached");
    } else {
      _cdp.totalCredit = _totalCredit.sub(_amount);
    }

    uint256 calculateVaultFee = getVaultFeeAmount(msg.sender,_amount);
    uint256 finalizedAmount = _amount;

    if( calculateVaultFee > 0 ){
      xtoken.mint(feeCollector, calculateVaultFee);
      finalizedAmount = finalizedAmount.sub(calculateVaultFee);
    }

    xtoken.mint(msg.sender, finalizedAmount);
  }

  /// @dev Gets the number of vaults in the vault list.
  ///
  /// @return the vault count.
  function vaultCount() external view returns (uint256) {
    return _vaults.length();
  }

  /// @dev Get the adapter of a vault.
  ///
  /// @param _vaultId the identifier of the vault.
  ///
  /// @return the vault adapter.
  function getVaultAdapter(uint256 _vaultId) external view returns (IVaultAdapterV2) {
    VaultV2.Data storage _vault = _vaults.get(_vaultId);
    return _vault.adapter;
  }

  /// @dev Get the total amount of the parent asset that has been deposited into a vault.
  ///
  /// @param _vaultId the identifier of the vault.
  ///
  /// @return the total amount of deposited tokens.
  function getVaultTotalDeposited(uint256 _vaultId) external view returns (uint256) {
    VaultV2.Data storage _vault = _vaults.get(_vaultId);
    return _vault.totalDeposited;
  }

  /// @dev Get the total amount of collateral deposited into a CDP.
  ///
  /// @param _account the user account of the CDP to query.
  ///
  /// @return the deposited amount of tokens.
  function getCdpTotalDeposited(address _account) external view returns (uint256) {
    CDP.Data storage _cdp = _cdps[_account];
    return _cdp.totalDeposited;
  }

  /// @dev Get the total amount of alchemic tokens borrowed from a CDP.
  ///
  /// @param _account the user account of the CDP to query.
  ///
  /// @return the borrowed amount of tokens.
  function getCdpTotalDebt(address _account) external view returns (uint256) {
    CDP.Data storage _cdp = _cdps[_account];
    return _cdp.getUpdatedTotalDebt(_ctx);
  }

  /// @dev Get the total amount of credit that a CDP has.
  ///
  /// @param _account the user account of the CDP to query.
  ///
  /// @return the amount of credit.
  function getCdpTotalCredit(address _account) external view returns (uint256) {
    CDP.Data storage _cdp = _cdps[_account];
    return _cdp.getUpdatedTotalCredit(_ctx);
  }

  /// @dev Gets the last recorded block of when a user made a deposit into their CDP.
  ///
  /// @param _account the user account of the CDP to query.
  ///
  /// @return the block number of the last deposit.
  function getCdpLastDeposit(address _account) external view returns (uint256) {
    CDP.Data storage _cdp = _cdps[_account];
    return _cdp.lastDeposit;
  }
  /// @dev sends tokens to the transmuter
  ///
  /// benefit of great nation of transmuter
  function _distributeToTransmuter(uint256 amount) internal {
        token.approve(transmuter,amount);
        ITransmuter(transmuter).distribute(address(this),amount);
        // lower debt cause of 'burn'
        xtoken.lowerHasMinted(amount);
  }
  /// @dev Checks that parent token is on peg.
  ///
  /// This is used over a modifier limit of pegged interactions.
  modifier onLinkCheck() {
    if(pegMinimum > 0 ){
      uint256 oracleAnswer = uint256(IChainlink(_linkGasOracle).latestAnswer());
      require(oracleAnswer > pegMinimum, "off peg limitation");
    }
    _;
  }
  /// @dev Checks that caller is not a eoa.
  ///
  /// This is used to prevent contracts from interacting.
  modifier noContractAllowed() {
    require(!address(msg.sender).isContract() && msg.sender == tx.origin, "Sorry we do not accept contract!");
    _;
  }
  /// @dev Checks that the contract is in an initialized state.
  ///
  /// This is used over a modifier to reduce the size of the contract
  modifier expectInitialized() {
    require(initialized, "YumLinkVesperVault: not initialized.");
    _;
  }

  /// @dev Checks that the current message sender or caller is a specific address.
  ///
  /// @param _expectedCaller the expected caller.
  function _expectCaller(address _expectedCaller) internal {
    require(msg.sender == _expectedCaller, "");
  }

  /// @dev Checks that the current message sender or caller is the governance address.
  ///
  ///
  modifier onlyGov() {
    require(msg.sender == governance, "YumLinkVesperVault: only governance.");
    _;
  }
  /// @dev Updates the active vault.
  ///
  /// This function reverts if the vault adapter is the zero address, if the token that the vault adapter accepts
  /// is not the token that this contract defines as the parent asset, or if the contract has not yet been initialized.
  ///
  /// @param _adapter the adapter for the new active vault.
  function _updateActiveVault(IVaultAdapterV2 _adapter) internal {
    require(_adapter != IVaultAdapterV2(ZERO_ADDRESS), "YumLinkVesperVault: active vault address cannot be 0x0.");
    require(_adapter.token() == token, "YumLinkVesperVault: token mismatch.");

    _vaults.push(VaultV2.Data({
      adapter: _adapter,
      totalDeposited: 0
    }));

    emit ActiveVaultUpdated(_adapter);
  }

  /// @dev Recalls an amount of funds from a vault to this contract.
  ///
  /// @param _vaultId the identifier of the recall funds from.
  /// @param _amount  the amount of funds to recall from the vault.
  ///
  /// @return the amount of funds that were recalled from the vault to this contract and the decreased vault value.
  function _recallFunds(uint256 _vaultId, uint256 _amount) internal returns (uint256, uint256) {
    require(emergencyExit || msg.sender == governance || _vaultId != _vaults.lastIndex(), "YumLinkVesperVault: not an emergency, not governance, and user does not have permission to recall funds from active vault");

    VaultV2.Data storage _vault = _vaults.get(_vaultId);
    (uint256 _withdrawnAmount, uint256 _decreasedValue) = _vault.withdraw(address(this), _amount, false);

    emit FundsRecalled(_vaultId, _withdrawnAmount, _decreasedValue);

    return (_withdrawnAmount, _decreasedValue);
  }

  /// @dev Attempts to withdraw funds from the active vault to the recipient.
  ///
  /// Funds will be first withdrawn from this contracts balance and then from the active vault. This function
  /// is different from `recallFunds` in that it reduces the total amount of deposited tokens by the decreased
  /// value of the vault.
  ///
  /// @param _recipient the account to withdraw the funds to.
  /// @param _amount    the amount of funds to withdraw.
  function _withdrawFundsTo(address _recipient, uint256 _amount) internal returns (uint256, uint256) {
    // Pull the funds from the buffer.
    uint256 _bufferedAmount = Math.min(_amount, token.balanceOf(address(this)));

    if (_recipient != address(this)) {
      token.transfer(_recipient, _bufferedAmount);
    }

    uint256 _totalWithdrawn = _bufferedAmount;
    uint256 _totalDecreasedValue = _bufferedAmount;

    uint256 _remainingAmount = _amount.sub(_bufferedAmount);

    // Pull the remaining funds from the active vault.
    if (_remainingAmount > 0) {
      VaultV2.Data storage _activeVault = _vaults.last();
      (uint256 _withdrawAmount, uint256 _decreasedValue) = _activeVault.withdraw(
        _recipient,
        _remainingAmount,
        false
      );

      _totalWithdrawn = _totalWithdrawn.add(_withdrawAmount);
      _totalDecreasedValue = _totalDecreasedValue.add(_decreasedValue);
    }

    totalDeposited = totalDeposited.sub(_totalDecreasedValue);

    return (_totalWithdrawn, _totalDecreasedValue);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IMintableERC20","name":"_token","type":"address"},{"internalType":"contract IMintableERC20","name":"_xtoken","type":"address"},{"internalType":"contract IVotingEscrow","name":"_votingEscrow","type":"address"},{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_sentinel","type":"address"},{"internalType":"address","name":"_feeCollector","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IVaultAdapterV2","name":"adapter","type":"address"}],"name":"ActiveVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"CollateralizationLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"EmergencyExitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsFlushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"FundsHarvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"FundsRecalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"GovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"HarvestFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingGovernance","type":"address"}],"name":"PendingGovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"RewardsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sentinel","type":"address"}],"name":"SentinelUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"TokensLiquidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"parentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"childAmount","type":"uint256"}],"name":"TokensRepaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"transmuter","type":"address"}],"name":"TransmuterUpdated","type":"event"},{"inputs":[],"name":"MAXIMUM_COLLATERALIZATION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_COLLATERALIZATION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_RESOLUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_linkGasOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateralizationLimit","outputs":[{"components":[{"internalType":"uint256","name":"x","type":"uint256"}],"internalType":"struct FixedPointMath.uq192x64","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"discountTable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flush","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flushActivator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpLastDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpTotalCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpTotalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"getVaultAdapter","outputs":[{"internalType":"contract IVaultAdapterV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"getVaultTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVaultAdapterV2","name":"_adapter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultAdapterV2","name":"_adapter","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pegMinimum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recall","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"recallAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_parentAmount","type":"uint256"},{"internalType":"uint256","name":"_childAmount","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sentinel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setCollateralizationLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_discountTable","type":"uint256[]"}],"name":"setDiscountTable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_emergencyExit","type":"bool"}],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_feeLevel","type":"uint256[]"}],"name":"setFeeLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_flushActivator","type":"uint256"}],"name":"setFlushActivator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_harvestFee","type":"uint256"}],"name":"setHarvestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Oracle","type":"address"},{"internalType":"uint256","name":"peg","type":"uint256"}],"name":"setOracleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingGovernance","type":"address"}],"name":"setPendingGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sentinel","type":"address"}],"name":"setSentinel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transmuter","type":"address"}],"name":"setTransmuter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultFee","type":"uint256"}],"name":"setVaultFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IMintableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transmuter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingEscrow","outputs":[{"internalType":"contract IVotingEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xtoken","outputs":[{"internalType":"contract IMintableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200410b3803806200410b833981016040819052620000349162000341565b60016000556001600160a01b0383166200006b5760405162461bcd60e51b8152600401620000629062000431565b60405180910390fd5b6001600160a01b038216620000945760405162461bcd60e51b81526004016200006290620003d4565b6001600160a01b038116620000bd5760405162461bcd60e51b81526004016200006290620004cf565b600180546001600160a01b03199081166001600160a01b03898116919091179092556002805482168884161781556003805483168885161790556004805483168785161790556006805483168685161790556007805490921692841692909217905569010f0cf064dd59200000600c556000906200015190670de0b6b3a76400009062000248602090811b62001d2217901c565b604080516020808201835290839052600e83905581518082018352600090819052600f558151610120810183526032815260c8918101919091526101f4918101919091526103e860608201526107d06080820152610dac60a082015261177060c082015261232860e0820152612af8610100820152909150620001d990601490600962000291565b506040805161012081018252600a815260146020820152601e918101919091526028606082015260326080820152603c60a0820152604860c0820152605160e0820152605b61010082015262000234906015906009620002e7565b505060146016555062000545945050505050565b60008262000259575060006200028b565b828202828482816200026757fe5b0414620002885760405162461bcd60e51b815260040162000062906200048e565b90505b92915050565b828054828255906000526020600020908101928215620002d5579160200282015b82811115620002d5578251829061ffff16905591602001919060010190620002b2565b50620002e39291506200032a565b5090565b828054828255906000526020600020908101928215620002d5579160200282015b82811115620002d5578251829060ff1690559160200191906001019062000308565b5b80821115620002e357600081556001016200032b565b60008060008060008060c087890312156200035a578182fd5b865162000367816200052c565b60208801519096506200037a816200052c565b60408801519095506200038d816200052c565b6060880151909450620003a0816200052c565b6080880151909350620003b3816200052c565b60a0880151909250620003c6816200052c565b809150509295509295509295565b60208082526033908201527f59756d4c696e6b5665737065725661756c743a2073656e74696e656c2061646460408201527f726573732063616e6e6f74206265203078302e00000000000000000000000000606082015260800190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a20676f7665726e616e6365206160408201527f6464726573732063616e6e6f74206265203078302e0000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526037908201527f59756d4c696e6b5665737065725661756c743a20666565436f6c6c6563746f7260408201527f20616464726573732063616e6e6f74206265203078302e000000000000000000606082015260800190565b6001600160a01b03811681146200054257600080fd5b50565b613bb680620005556000396000f3fe608060405234801561001057600080fd5b506004361061035d5760003560e01c8063792b55b6116101d3578063c415b95c11610104578063f0d787a3116100a2578063fc00e8a01161007c578063fc00e8a01461067b578063fc0c546a1461068e578063fefdc5d114610696578063ff50abdc146106a95761035d565b8063f0d787a314610663578063f39c38a01461066b578063f58c251c146106735761035d565b8063d8aed145116100de578063d8aed14514610617578063ddc632621461062a578063e07fc7451461063d578063ec38a862146106505761035d565b8063c415b95c146105e9578063c4d66de8146105f1578063ce5494bb146106045761035d565b8063a2315e9411610171578063aaf166601161014b578063aaf16660146105a8578063adb4a9ad146105bb578063b5962917146105ce578063b6b55f25146105d65761035d565b8063a2315e941461057a578063a7c6a1001461058d578063aa6e0434146105955761035d565b80639ec5a894116101ad5780639ec5a89414610544578063a005fda31461054c578063a0712d6814610554578063a1e401a9146105675761035d565b8063792b55b61461050b5780638c3d78191461051e5780639a9af221146105315761035d565b806345ee0755116102ad578063538ba4f91161024b5780635a9b5e92116102255780635a9b5e92146104e05780635aa6e675146104f35780636b9f96ea146104fb5780637239d2b9146105035761035d565b8063538ba4f9146104bd57806353ffa18b146104c55780635641ec03146104d85761035d565b80634aaf7c65116102875780634aaf7c651461047a5780634bb493d61461048f5780634c3a8e02146104a25780634f2bfe5b146104b55761035d565b806345ee07551461044c57806345f867b31461045f57806348f7d8e0146104675761035d565b806322c37b751161031a5780632e1a7d4d116102f45780632e1a7d4d1461040857806330d4d190146104295780633847f03814610431578063415f1240146104395761035d565b806322c37b75146103da578063238efcbc146103ed5780632670fdd8146103f55761035d565b806301ac145b146103625780630510111e1461038057806309dac061146103885780630abb60351461039d578063158ef93e146103b05780631718a68f146103c5575b600080fd5b61036a6106b1565b6040516103779190613aa3565b60405180910390f35b61036a6106b7565b61039b610396366004612fe6565b6106c3565b005b61039b6103ab366004612fe6565b610772565b6103b861080d565b60405161037791906131d1565b6103cd610816565b604051610377919061315d565b61039b6103e8366004613108565b610825565b61039b610854565b6103cd610403366004613108565b6108cf565b61041b610416366004613108565b6108ee565b604051610377929190613aac565b61036a610aec565b61036a610af8565b61041b610447366004613108565b610afe565b61039b61045a36600461309c565b610cfe565b61036a610d80565b61036a610475366004613108565b610d86565b610482610da4565b6040516103779190613a99565b61039b61049d36600461302d565b610dc0565b61041b6104b0366004613108565b610e1b565b6103cd610e95565b6103cd610ea4565b61039b6104d3366004613108565b610ea9565b6103b8610f63565b61039b6104ee366004613002565b610f71565b6103cd610fc1565b61036a610fd0565b6103cd611056565b61039b610519366004613108565b611065565b61039b61052c366004613108565b6110e6565b61036a61053f366004612fe6565b611115565b6103cd611133565b6103cd611142565b61039b610562366004613108565b611151565b61036a610575366004612fe6565b611407565b61039b61058836600461302d565b611422565b61036a611478565b61036a6105a3366004612fe6565b611489565b61036a6105b6366004613108565b6114b3565b61039b6105c9366004612fe6565b6114cc565b61036a611567565b61039b6105e4366004613108565b61156d565b6103cd6116bc565b61039b6105ff366004612fe6565b6116cb565b61039b610612366004612fe6565b611781565b61039b610625366004613120565b6117d9565b61041b610638366004613108565b611a8e565b61036a61064b366004613108565b611bc7565b61039b61065e366004612fe6565b611bd4565b61036a611c6f565b6103cd611c75565b6103cd611c84565b61036a610689366004612fe6565b611c93565b6103cd611cb6565b61041b6106a4366004613120565b611cc5565b61036a611d1c565b60165481565b673782dace9d90000081565b6004546001600160a01b031633146106f65760405162461bcd60e51b81526004016106ed90613715565b60405180910390fd5b6001600160a01b03811661071c5760405162461bcd60e51b81526004016106ed906133c3565b600680546001600160a01b0319166001600160a01b0383161790556040517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb99061076790839061315d565b60405180910390a150565b6004546001600160a01b0316331461079c5760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b0381166107c25760405162461bcd60e51b81526004016106ed90613482565b600580546001600160a01b0319166001600160a01b0383161790556040517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e78399061076790839061315d565b600d5460ff1681565b6002546001600160a01b031681565b6004546001600160a01b0316331461084f5760405162461bcd60e51b81526004016106ed90613715565b600c55565b6005546001600160a01b0316331461087e5760405162461bcd60e51b81526004016106ed90613759565b600554600480546001600160a01b0319166001600160a01b0390921691821790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab9061076790839061315d565b6000806108dd601184611d65565b546001600160a01b03169392505050565b600080600260005414156109145760405162461bcd60e51b81526004016106ed90613a36565b600260005561092233611d8c565b15801561092e57503332145b61094a5760405162461bcd60e51b81526004016106ed9061344d565b600d5460ff1661096c5760405162461bcd60e51b81526004016106ed9061394b565b3360009081526010602052604090206003810154431161099e5760405162461bcd60e51b81526004016106ed90613825565b6109a981600e611d92565b60006109b53386611dee565b9050846000808315610a1b5760075460009081906109dc906001600160a01b031687611f4e565b90925090506109eb85876120e9565b94506109f73386611f4e565b9094509250610a068382612111565b9250610a128483612111565b93505050610a2b565b610a253384611f4e565b90925090505b60408051808201909152601b81527f4578636565647320776974686472617761626c6520616d6f756e74000000000060208201528554610a6c918390612136565b855560408051606081019091526031808252610a9591600e91613b206020830139879190612162565b336001600160a01b03167fb3ad69dc1d2c6b1f5f5b0927ffd8ee8f1437a156253c8f6dccc75e6f8e4fd38b898484604051610ad293929190613aba565b60405180910390a260016000559097909650945050505050565b670de0b6b3a764000081565b60135481565b60008060026000541415610b245760405162461bcd60e51b81526004016106ed90613a36565b6002600055610b3233611d8c565b158015610b3e57503332145b610b5a5760405162461bcd60e51b81526004016106ed9061344d565b60135415610c0457601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf91906130f0565b90506013548111610c025760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff16610c265760405162461bcd60e51b81526004016106ed9061394b565b336000908152601060205260409020610c4081600e611d92565b8060010154841115610c5457806001015493505b600080610c613087611f4e565b91509150610c6e82612191565b6040805160208101909152600081528354610c8a918390612136565b83556040805160208101909152600081526001840154610cab918490612136565b600184015560405133907f3ea051727656be6fd11c2260f244f29ff3c70d1fb077bfa73e89d554e9bb95c790610ce690899086908690613aba565b60405180910390a26001600055909590945092505050565b6004546001600160a01b0316331480610d2157506006546001600160a01b031633145b610d3d5760405162461bcd60e51b81526004016106ed90613825565b600d805461ff001916610100831515021790556040517ff0064f2efd0da4bc63eecf2e75590fe8a308eaa526a51c334e50eec09a711049906107679083906131d1565b61271081565b60158181548110610d9357fe5b600091825260209091200154905081565b610dac612f73565b506040805160208101909152600e54815290565b6004546001600160a01b03163314610dea5760405162461bcd60e51b81526004016106ed90613715565b60098114610e0a5760405162461bcd60e51b81526004016106ed90613645565b610e1660148383612f86565b505050565b60008060026000541415610e415760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff16610e685760405162461bcd60e51b81526004016106ed9061394b565b6000610e75601185611d65565b9050610e858482600101546122e3565b6001600055909590945092505050565b6003546001600160a01b031681565b600081565b6004546001600160a01b03163314610ed35760405162461bcd60e51b81526004016106ed90613715565b670de0b6b3a7640000811015610efb5760405162461bcd60e51b81526004016106ed9061320f565b673782dace9d900000811115610f235760405162461bcd60e51b81526004016106ed90613315565b60408051602081018252829052600e829055517ff78180bc708b1292177c888900951cd66a39faf48dc7b6d111e93285dbbe55a090610767908390613aa3565b600d54610100900460ff1681565b6004546001600160a01b03163314610f9b5760405162461bcd60e51b81526004016106ed90613715565b601280546001600160a01b0319166001600160a01b039390931692909217909155601355565b6004546001600160a01b031681565b600060026000541415610ff55760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff1661101c5760405162461bcd60e51b81526004016106ed9061394b565b600d54610100900460ff16156110445760405162461bcd60e51b81526004016106ed90613836565b61104c6123a0565b9050600160005590565b6008546001600160a01b031681565b6004546001600160a01b0316331461108f5760405162461bcd60e51b81526004016106ed90613715565b6127108111156110b15760405162461bcd60e51b81526004016106ed906137d7565b600a8190556040517fc36862a253ff42cc71f4f200d3c62e8e5eaaece01041fc6900aeace64ade72a890610767908390613aa3565b6004546001600160a01b031633146111105760405162461bcd60e51b81526004016106ed90613715565b601655565b6001600160a01b031660009081526010602052604090206003015490565b6009546001600160a01b031681565b6012546001600160a01b031681565b600260005414156111745760405162461bcd60e51b81526004016106ed90613a36565b600260005561118233611d8c565b15801561118e57503332145b6111aa5760405162461bcd60e51b81526004016106ed9061344d565b6013541561125457601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b1580156111f757600080fd5b505afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f91906130f0565b905060135481116112525760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff166112765760405162461bcd60e51b81526004016106ed9061394b565b33600090815260106020526040902061129081600e611d92565b6002810154828110156112f45760006112a984836120e9565b60018401549091506112bb9082612111565b600184015560006002840155604080516060810190915260308082526112ee91600e91613b516020830139859190612162565b50611304565b6112fe81846120e9565b60028301555b60006113103385611dee565b9050838115611397576002546007546040516340c10f1960e01b81526001600160a01b03928316926340c10f199261134f929116908690600401613171565b600060405180830381600087803b15801561136957600080fd5b505af115801561137d573d6000803e3d6000fd5b5050505061139482826120e990919063ffffffff16565b90505b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906113c99033908590600401613171565b600060405180830381600087803b1580156113e357600080fd5b505af11580156113f7573d6000803e3d6000fd5b5050600160005550505050505050565b6001600160a01b031660009081526010602052604090205490565b6004546001600160a01b0316331461144c5760405162461bcd60e51b81526004016106ed90613715565b6009811461146c5760405162461bcd60e51b81526004016106ed90613372565b610e1660158383612f86565b600061148460116123f9565b905090565b6001600160a01b03811660009081526010602052604081206114ac81600e6123fd565b9392505050565b6000806114c1601184611d65565b600101549392505050565b6004546001600160a01b031633146114f65760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b03811661151c5760405162461bcd60e51b81526004016106ed906138f6565b600880546001600160a01b0319166001600160a01b0383161790556040517fe42bb1780117f5788c6e0042e955291223819875891ddf465b8e4fbb85a933e99061076790839061315d565b600a5481565b600260005414156115905760405162461bcd60e51b81526004016106ed90613a36565b600260005561159e33611d8c565b1580156115aa57503332145b6115c65760405162461bcd60e51b81526004016106ed9061344d565b600d5460ff166115e85760405162461bcd60e51b81526004016106ed9061394b565b600d54610100900460ff16156116105760405162461bcd60e51b81526004016106ed90613836565b33600090815260106020526040902061162a81600e611d92565b600154611642906001600160a01b031633308561243c565b600c548210611655576116536123a0565b505b600b546116629083612111565b600b5580546116719083612111565b815543600382015560405133907f59062170a285eb80e8c6b8ced60428442a51910635005233fc4ce084a475845e906116ab908590613aa3565b60405180910390a250506001600055565b6007546001600160a01b031681565b6004546001600160a01b031633146116f55760405162461bcd60e51b81526004016106ed90613715565b600d5460ff16156117185760405162461bcd60e51b81526004016106ed90613790565b6008546001600160a01b03166117405760405162461bcd60e51b81526004016106ed906135e8565b6009546001600160a01b03166117685760405162461bcd60e51b81526004016106ed9061398f565b61177181612494565b50600d805460ff19166001179055565b600d5460ff166117a35760405162461bcd60e51b81526004016106ed9061394b565b6004546001600160a01b031633146117cd5760405162461bcd60e51b81526004016106ed90613715565b6117d681612494565b50565b600260005414156117fc5760405162461bcd60e51b81526004016106ed90613a36565b600260005561180a33611d8c565b15801561181657503332145b6118325760405162461bcd60e51b81526004016106ed9061344d565b601354156118dc57601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b15801561187f57600080fd5b505afa158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b791906130f0565b905060135481116118da5760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff166118fe5760405162461bcd60e51b81526004016106ed9061394b565b33600090815260106020526040902061191881600e611d92565b821561193f57600154611936906001600160a01b031633308661243c565b61193f83612191565b8115611a0c5760025460405163079cc67960e41b81526001600160a01b03909116906379cc6790906119779033908690600401613171565b600060405180830381600087803b15801561199157600080fd5b505af11580156119a5573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506119d9908590600401613aa3565b600060405180830381600087803b1580156119f357600080fd5b505af1158015611a07573d6000803e3d6000fd5b505050505b6000611a188484612111565b9050611a42816040518060200160405280600081525084600101546121369092919063ffffffff16565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90611a7b9087908790613aac565b60405180910390a2505060016000555050565b600d54600090819060ff16611ab55760405162461bcd60e51b81526004016106ed9061394b565b6000611ac2601185611d65565b9050600080611ad183306125bf565b90925090508115611b83576000611aff612710611af9600a5486611d2290919063ffffffff16565b90612614565b90506000611b0d84836120e9565b9050611b17612f73565b611b2c600b54611b2684612646565b90612688565b6040805160208101909152600f548152909150611b4990826126bc565b51600f558215611b7057600954600154611b70916001600160a01b039182169116856126ec565b8115611b7f57611b7f82612191565b5050505b7f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f098282604051611bb4929190613aac565b60405180910390a1909350915050915091565b60148181548110610d9357fe5b6004546001600160a01b03163314611bfe5760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b038116611c245760405162461bcd60e51b81526004016106ed9061386d565b600980546001600160a01b0319166001600160a01b0383161790556040517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf9061076790839061315d565b600c5481565b6005546001600160a01b031681565b6006546001600160a01b031681565b6001600160a01b03811660009081526010602052604081206114ac81600e61270b565b6001546001600160a01b031681565b60008060026000541415611ceb5760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff16611d125760405162461bcd60e51b81526004016106ed9061394b565b610e8584846122e3565b600b5481565b600082611d3157506000611d5f565b82820282848281611d3e57fe5b0414611d5c5760405162461bcd60e51b81526004016106ed906136d4565b90505b92915050565b6000826000018281548110611d7657fe5b9060005260206000209060020201905092915050565b3b151590565b6000611d9e8383612752565b90508260010154811115611dcc576001830180546000909155611dc182826120e9565b600285015550611de1565b6001830154611ddb90826120e9565b60018401555b5060010154600490910155565b6003546040516370a0823160e01b8152600091829160649183916001600160a01b03909116906370a0823190611e2890899060040161315d565b60206040518083038186803b158015611e4057600080fd5b505afa158015611e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7891906130f0565b9050611e95612710611af960165488611d2290919063ffffffff16565b92508015611f445760005b6009811015611f4257611edb670de0b6b3a764000060148381548110611ec257fe5b9060005260206000200154611d2290919063ffffffff16565b8210611f3a57611efc612710611af960165489611d2290919063ffffffff16565b9350611f376064611af9611f3060158581548110611f1657fe5b9060005260206000200154876120e990919063ffffffff16565b8790611d22565b93505b600101611ea0565b505b5090949350505050565b6001546040516370a0823160e01b815260009182918291611fde9186916001600160a01b0316906370a0823190611f8990309060040161315d565b60206040518083038186803b158015611fa157600080fd5b505afa158015611fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd991906130f0565b6127cb565b90506001600160a01b03851630146120765760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906120229088908590600401613171565b602060405180830381600087803b15801561203c57600080fd5b505af1158015612050573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207491906130b8565b505b8080600061208487836120e9565b905080156120ca57600061209860116127e1565b90506000806120a9838c868461280c565b90925090506120b88683612111565b95506120c48582612111565b94505050505b600b546120d790836120e9565b600b55509093509150505b9250929050565b60008282111561210b5760405162461bcd60e51b81526004016106ed906134d7565b50900390565b600082820183811015611d5c5760405162461bcd60e51b81526004016106ed90613416565b6000818484111561215a5760405162461bcd60e51b81526004016106ed91906131dc565b505050900390565b61216c8383612844565b819061218b5760405162461bcd60e51b81526004016106ed91906131dc565b50505050565b60015460085460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121c7929116908590600401613171565b602060405180830381600087803b1580156121e157600080fd5b505af11580156121f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221991906130b8565b50600854604051631f72642160e31b81526001600160a01b039091169063fb9321089061224c9030908590600401613171565b600060405180830381600087803b15801561226657600080fd5b505af115801561227a573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506122ae908490600401613aa3565b600060405180830381600087803b1580156122c857600080fd5b505af11580156122dc573d6000803e3d6000fd5b5050505050565b600d546000908190610100900460ff168061230857506004546001600160a01b031633145b8061231c57506123186011612872565b8414155b6123385760405162461bcd60e51b81526004016106ed9061326c565b6000612345601186611d65565b90506000806123568330888461280c565b91509150867fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a499647838360405161238c929190613aac565b60405180910390a290969095509350505050565b6000806123ad60116127e1565b905060006123ba826128bf565b90507f860f4701faa0ecdeecd9e9eaae11a8612bbd01c663081f7c0c4e4873df653d69816040516123eb9190613aa3565b60405180910390a191505090565b5490565b60008061240a8484612752565b90508061241d5750506001820154611d5f565b600184015480821061243457600092505050611d5f565b039392505050565b61218b846323b872dd60e01b85858560405160240161245d9392919061318a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612953565b6001600160a01b0381166124ba5760405162461bcd60e51b81526004016106ed90613554565b60015460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253991906130d4565b6001600160a01b03161461255f5760405162461bcd60e51b81526004016106ed90613691565b604080518082019091526001600160a01b038216815260006020820152612588906011906129e2565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b60008083600101546125d085612a25565b116125e0575060009050806120e2565b60006125f985600101546125f387612a25565b906120e9565b90506126088585836001612aa1565b92509250509250929050565b60008082116126355760405162461bcd60e51b81526004016106ed906135b1565b81838161263e57fe5b049392505050565b61264e612f73565b600082158061266b575050670de0b6b3a764000082810290810483145b61267457600080fd5b604080516020810190915290815292915050565b612690612f73565b8161269a57600080fd5b6040518060200160405280838560000151816126b257fe5b0490529392505050565b6126c4612f73565b825182518101908110156126d757600080fd5b60408051602081019091529081529392505050565b610e168363a9059cbb60e01b848460405160240161245d929190613171565b6000806127188484612752565b90508061272b5750506002820154611d5f565b600184015480821161274257600092505050611d5f565b6002850154910301905092915050565b600061275c612f73565b50604080516020810190915260018301548152612777612f73565b506040805160208101909152600485015481526127948282612c5e565b6127a357600092505050611d5f565b84546127c2906127bd906127b78585612c8f565b90612caa565b612cd8565b95945050505050565b60008183106127da5781611d5c565b5090919050565b6000816127ed81612872565b815481106127f757fe5b90600052602060002090600202019050919050565b600080808061281d88888888612aa1565b60018a0154919350915061283190826120e9565b6001890155909250905094509492505050565b6000806128696128548585612ce7565b60408051602081019091528554815290612c5e565b13159392505050565b60008061287e836123f9565b90506114ac6001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b815250836121369092919063ffffffff16565b6000806128cb83612d2b565b90506114ac816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016128fc919061315d565b60206040518083038186803b15801561291457600080fd5b505afa158015612928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294c91906130f0565b8490612da7565b60606129a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e4e9092919063ffffffff16565b805190915015610e1657808060200190518101906129c691906130b8565b610e165760405162461bcd60e51b81526004016106ed906139ec565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b158015612a6957600080fd5b505afa158015612a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f91906130f0565b6000806000612aaf87612d2b565b90506000816001600160a01b03166370a08231886040518263ffffffff1660e01b8152600401612adf919061315d565b60206040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f91906130f0565b90506000612b3c89612a25565b895460405163ead5d35960e01b81529192506001600160a01b03169063ead5d35990612b70908b908b908b906004016131ae565b600060405180830381600087803b158015612b8a57600080fd5b505af1158015612b9e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a0823190612bd1908c9060040161315d565b60206040518083038186803b158015612be957600080fd5b505afa158015612bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2191906130f0565b90506000612c2f82856120e9565b90506000612c3c8c612a25565b90506000612c4a85836120e9565b929d929c50919a5050505050505050505050565b805182516000911115612c745750600019611d5f565b815183511115612c8657506001611d5f565b50600092915050565b612c97612f73565b825182518103908111156126d757600080fd5b612cb2612f73565b6000821580612ccf575050825182810290838281612ccc57fe5b04145b6126d757600080fd5b51670de0b6b3a7640000900490565b612cef612f73565b6000612cfb84846123fd565b905080612d1257612d0a612e5d565b915050611d5f565b612d2381611b268660000154612646565b949350505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b158015612d6f57600080fd5b505afa158015612d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f91906130d4565b600080612db384612d2b565b8454909150612dcf906001600160a01b038084169116856126ec565b835460405163b6b55f2560e01b81526001600160a01b039091169063b6b55f2590612dfe908690600401613aa3565b600060405180830381600087803b158015612e1857600080fd5b505af1158015612e2c573d6000803e3d6000fd5b5050506001850154612e3f915084612111565b60018501555081905092915050565b6060612d238484600085612e79565b612e65612f73565b506040805160208101909152600019815290565b606082471015612e9b5760405162461bcd60e51b81526004016106ed9061350e565b612ea485611d8c565b612ec05760405162461bcd60e51b81526004016106ed906138bf565b60006060866001600160a01b03168587604051612edd9190613141565b60006040518083038185875af1925050503d8060008114612f1a576040519150601f19603f3d011682016040523d82523d6000602084013e612f1f565b606091505b5091509150612f2f828286612f3a565b979650505050505050565b60608315612f495750816114ac565b825115612f595782518084602001fd5b8160405162461bcd60e51b81526004016106ed91906131dc565b6040518060200160405280600081525090565b828054828255906000526020600020908101928215612fc1579160200282015b82811115612fc1578235825591602001919060010190612fa6565b50612fcd929150612fd1565b5090565b5b80821115612fcd5760008155600101612fd2565b600060208284031215612ff7578081fd5b8135611d5c81613afc565b60008060408385031215613014578081fd5b823561301f81613afc565b946020939093013593505050565b6000806020838503121561303f578182fd5b823567ffffffffffffffff80821115613056578384fd5b818501915085601f830112613069578384fd5b813581811115613077578485fd5b866020808302850101111561308a578485fd5b60209290920196919550909350505050565b6000602082840312156130ad578081fd5b8135611d5c81613b11565b6000602082840312156130c9578081fd5b8151611d5c81613b11565b6000602082840312156130e5578081fd5b8151611d5c81613afc565b600060208284031215613101578081fd5b5051919050565b600060208284031215613119578081fd5b5035919050565b60008060408385031215613132578182fd5b50508035926020909101359150565b60008251613153818460208701613ad0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b901515815260200190565b60006020825282518060208401526131fb816040850160208701613ad0565b601f01601f19169190910160400192915050565b6020808252603a908201527f59756d4c696e6b5665737065725661756c743a20636f6c6c61746572616c697a60408201527f6174696f6e206c696d69742062656c6f77206d696e696d756d2e000000000000606082015260800190565b60208082526079908201527f59756d4c696e6b5665737065725661756c743a206e6f7420616e20656d65726760408201527f656e63792c206e6f7420676f7665726e616e63652c20616e642075736572206460608201527f6f6573206e6f742068617665207065726d697373696f6e20746f20726563616c60808201527f6c2066756e64732066726f6d20616374697665207661756c740000000000000060a082015260c00190565b6020808252603a908201527f59756d4c696e6b5665737065725661756c743a20636f6c6c61746572616c697a60408201527f6174696f6e206c696d69742061626f7665206d6178696d756d2e000000000000606082015260800190565b60208082526031908201527f59756d4c696e6b5665737065725661756c743a20646973636f756e745461626c6040820152700ca40d8cadccee8d040dad2e6dac2e8c6d607b1b606082015260800190565b60208082526033908201527f59756d4c696e6b5665737065725661756c743a2073656e74696e656c206164646040820152723932b9b99031b0b73737ba10313290183c181760691b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f536f72727920776520646f206e6f742061636365707420636f6e747261637421604082015260600190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a20676f7665726e616e6365206160408201527432323932b9b99031b0b73737ba10313290183c181760591b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526037908201527f59756d4c696e6b5665737065725661756c743a20616374697665207661756c7460408201527f20616464726573732063616e6e6f74206265203078302e000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252603f908201527f59756d4c696e6b5665737065725661756c743a2063616e6e6f7420696e69746960408201527f616c697a65207472616e736d75746572206164647265737320746f2030783000606082015260800190565b6020808252602c908201527f59756d4c696e6b5665737065725661756c743a206665654c6576656c206c656e60408201526b0cee8d040dad2e6dac2e8c6d60a31b606082015260800190565b60208082526023908201527f59756d4c696e6b5665737065725661756c743a20746f6b656e206d69736d617460408201526231b41760e91b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526024908201527f59756d4c696e6b5665737065725661756c743a206f6e6c7920676f7665726e616040820152633731b29760e11b606082015260800190565b6020808252601f908201527f73656e646572206973206e6f742070656e64696e67476f7665726e616e636500604082015260600190565b60208082526027908201527f59756d4c696e6b5665737065725661756c743a20616c726561647920696e69746040820152661a585b1a5e995960ca1b606082015260800190565b6020808252602e908201527f59756d4c696e6b5665737065725661756c743a2068617276657374206665652060408201526d30b137bb329036b0bc34b6bab69760911b606082015260800190565b602080825260009082015260400190565b60208082526017908201527f656d657267656e637920706175736520656e61626c6564000000000000000000604082015260600190565b60208082526032908201527f59756d4c696e6b5665737065725661756c743a2072657761726473206164647260408201527132b9b99031b0b73737ba10313290183c181760711b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a207472616e736d75746572206160408201527432323932b9b99031b0b73737ba10313290183c181760591b606082015260800190565b60208082526024908201527f59756d4c696e6b5665737065725661756c743a206e6f7420696e697469616c696040820152633d32b21760e11b606082015260800190565b6020808252603c908201527f59756d4c696e6b5665737065725661756c743a2063616e6e6f7420696e69746960408201527f616c697a652072657761726473206164647265737320746f2030783000000000606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526012908201527137b333103832b3903634b6b4ba30ba34b7b760711b604082015260600190565b9051815260200190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60005b83811015613aeb578181015183820152602001613ad3565b8381111561218b5750506000910152565b6001600160a01b03811681146117d657600080fd5b80151581146117d657600080fdfe416374696f6e20626c6f636b65643a20756e6865616c74687920636f6c6c61746572616c697a6174696f6e20726174696f59756d4c696e6b5665737065725661756c743a204c6f616e2d746f2d76616c756520726174696f206272656163686564a26469706673582212202c696dca15596e3abd18da69a0f4eb148bf866bd99df8225d6f4e36b75e04f8164736f6c634300060c0033000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000029ddf2c4f1e80dc9e95cc57a9ca03a28e4ab6d6c000000000000000000000000b938d8cbf7fc6455d1f2ebede5ff9a8e887493b200000000000000000000000068284083acbabcb6da84f62ea341dd8c30500eee0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d379800000000000000000000000076e2fd0cc4daa40c76f90f3ddfa2e3abf7a75810

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061035d5760003560e01c8063792b55b6116101d3578063c415b95c11610104578063f0d787a3116100a2578063fc00e8a01161007c578063fc00e8a01461067b578063fc0c546a1461068e578063fefdc5d114610696578063ff50abdc146106a95761035d565b8063f0d787a314610663578063f39c38a01461066b578063f58c251c146106735761035d565b8063d8aed145116100de578063d8aed14514610617578063ddc632621461062a578063e07fc7451461063d578063ec38a862146106505761035d565b8063c415b95c146105e9578063c4d66de8146105f1578063ce5494bb146106045761035d565b8063a2315e9411610171578063aaf166601161014b578063aaf16660146105a8578063adb4a9ad146105bb578063b5962917146105ce578063b6b55f25146105d65761035d565b8063a2315e941461057a578063a7c6a1001461058d578063aa6e0434146105955761035d565b80639ec5a894116101ad5780639ec5a89414610544578063a005fda31461054c578063a0712d6814610554578063a1e401a9146105675761035d565b8063792b55b61461050b5780638c3d78191461051e5780639a9af221146105315761035d565b806345ee0755116102ad578063538ba4f91161024b5780635a9b5e92116102255780635a9b5e92146104e05780635aa6e675146104f35780636b9f96ea146104fb5780637239d2b9146105035761035d565b8063538ba4f9146104bd57806353ffa18b146104c55780635641ec03146104d85761035d565b80634aaf7c65116102875780634aaf7c651461047a5780634bb493d61461048f5780634c3a8e02146104a25780634f2bfe5b146104b55761035d565b806345ee07551461044c57806345f867b31461045f57806348f7d8e0146104675761035d565b806322c37b751161031a5780632e1a7d4d116102f45780632e1a7d4d1461040857806330d4d190146104295780633847f03814610431578063415f1240146104395761035d565b806322c37b75146103da578063238efcbc146103ed5780632670fdd8146103f55761035d565b806301ac145b146103625780630510111e1461038057806309dac061146103885780630abb60351461039d578063158ef93e146103b05780631718a68f146103c5575b600080fd5b61036a6106b1565b6040516103779190613aa3565b60405180910390f35b61036a6106b7565b61039b610396366004612fe6565b6106c3565b005b61039b6103ab366004612fe6565b610772565b6103b861080d565b60405161037791906131d1565b6103cd610816565b604051610377919061315d565b61039b6103e8366004613108565b610825565b61039b610854565b6103cd610403366004613108565b6108cf565b61041b610416366004613108565b6108ee565b604051610377929190613aac565b61036a610aec565b61036a610af8565b61041b610447366004613108565b610afe565b61039b61045a36600461309c565b610cfe565b61036a610d80565b61036a610475366004613108565b610d86565b610482610da4565b6040516103779190613a99565b61039b61049d36600461302d565b610dc0565b61041b6104b0366004613108565b610e1b565b6103cd610e95565b6103cd610ea4565b61039b6104d3366004613108565b610ea9565b6103b8610f63565b61039b6104ee366004613002565b610f71565b6103cd610fc1565b61036a610fd0565b6103cd611056565b61039b610519366004613108565b611065565b61039b61052c366004613108565b6110e6565b61036a61053f366004612fe6565b611115565b6103cd611133565b6103cd611142565b61039b610562366004613108565b611151565b61036a610575366004612fe6565b611407565b61039b61058836600461302d565b611422565b61036a611478565b61036a6105a3366004612fe6565b611489565b61036a6105b6366004613108565b6114b3565b61039b6105c9366004612fe6565b6114cc565b61036a611567565b61039b6105e4366004613108565b61156d565b6103cd6116bc565b61039b6105ff366004612fe6565b6116cb565b61039b610612366004612fe6565b611781565b61039b610625366004613120565b6117d9565b61041b610638366004613108565b611a8e565b61036a61064b366004613108565b611bc7565b61039b61065e366004612fe6565b611bd4565b61036a611c6f565b6103cd611c75565b6103cd611c84565b61036a610689366004612fe6565b611c93565b6103cd611cb6565b61041b6106a4366004613120565b611cc5565b61036a611d1c565b60165481565b673782dace9d90000081565b6004546001600160a01b031633146106f65760405162461bcd60e51b81526004016106ed90613715565b60405180910390fd5b6001600160a01b03811661071c5760405162461bcd60e51b81526004016106ed906133c3565b600680546001600160a01b0319166001600160a01b0383161790556040517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb99061076790839061315d565b60405180910390a150565b6004546001600160a01b0316331461079c5760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b0381166107c25760405162461bcd60e51b81526004016106ed90613482565b600580546001600160a01b0319166001600160a01b0383161790556040517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e78399061076790839061315d565b600d5460ff1681565b6002546001600160a01b031681565b6004546001600160a01b0316331461084f5760405162461bcd60e51b81526004016106ed90613715565b600c55565b6005546001600160a01b0316331461087e5760405162461bcd60e51b81526004016106ed90613759565b600554600480546001600160a01b0319166001600160a01b0390921691821790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab9061076790839061315d565b6000806108dd601184611d65565b546001600160a01b03169392505050565b600080600260005414156109145760405162461bcd60e51b81526004016106ed90613a36565b600260005561092233611d8c565b15801561092e57503332145b61094a5760405162461bcd60e51b81526004016106ed9061344d565b600d5460ff1661096c5760405162461bcd60e51b81526004016106ed9061394b565b3360009081526010602052604090206003810154431161099e5760405162461bcd60e51b81526004016106ed90613825565b6109a981600e611d92565b60006109b53386611dee565b9050846000808315610a1b5760075460009081906109dc906001600160a01b031687611f4e565b90925090506109eb85876120e9565b94506109f73386611f4e565b9094509250610a068382612111565b9250610a128483612111565b93505050610a2b565b610a253384611f4e565b90925090505b60408051808201909152601b81527f4578636565647320776974686472617761626c6520616d6f756e74000000000060208201528554610a6c918390612136565b855560408051606081019091526031808252610a9591600e91613b206020830139879190612162565b336001600160a01b03167fb3ad69dc1d2c6b1f5f5b0927ffd8ee8f1437a156253c8f6dccc75e6f8e4fd38b898484604051610ad293929190613aba565b60405180910390a260016000559097909650945050505050565b670de0b6b3a764000081565b60135481565b60008060026000541415610b245760405162461bcd60e51b81526004016106ed90613a36565b6002600055610b3233611d8c565b158015610b3e57503332145b610b5a5760405162461bcd60e51b81526004016106ed9061344d565b60135415610c0457601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf91906130f0565b90506013548111610c025760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff16610c265760405162461bcd60e51b81526004016106ed9061394b565b336000908152601060205260409020610c4081600e611d92565b8060010154841115610c5457806001015493505b600080610c613087611f4e565b91509150610c6e82612191565b6040805160208101909152600081528354610c8a918390612136565b83556040805160208101909152600081526001840154610cab918490612136565b600184015560405133907f3ea051727656be6fd11c2260f244f29ff3c70d1fb077bfa73e89d554e9bb95c790610ce690899086908690613aba565b60405180910390a26001600055909590945092505050565b6004546001600160a01b0316331480610d2157506006546001600160a01b031633145b610d3d5760405162461bcd60e51b81526004016106ed90613825565b600d805461ff001916610100831515021790556040517ff0064f2efd0da4bc63eecf2e75590fe8a308eaa526a51c334e50eec09a711049906107679083906131d1565b61271081565b60158181548110610d9357fe5b600091825260209091200154905081565b610dac612f73565b506040805160208101909152600e54815290565b6004546001600160a01b03163314610dea5760405162461bcd60e51b81526004016106ed90613715565b60098114610e0a5760405162461bcd60e51b81526004016106ed90613645565b610e1660148383612f86565b505050565b60008060026000541415610e415760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff16610e685760405162461bcd60e51b81526004016106ed9061394b565b6000610e75601185611d65565b9050610e858482600101546122e3565b6001600055909590945092505050565b6003546001600160a01b031681565b600081565b6004546001600160a01b03163314610ed35760405162461bcd60e51b81526004016106ed90613715565b670de0b6b3a7640000811015610efb5760405162461bcd60e51b81526004016106ed9061320f565b673782dace9d900000811115610f235760405162461bcd60e51b81526004016106ed90613315565b60408051602081018252829052600e829055517ff78180bc708b1292177c888900951cd66a39faf48dc7b6d111e93285dbbe55a090610767908390613aa3565b600d54610100900460ff1681565b6004546001600160a01b03163314610f9b5760405162461bcd60e51b81526004016106ed90613715565b601280546001600160a01b0319166001600160a01b039390931692909217909155601355565b6004546001600160a01b031681565b600060026000541415610ff55760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff1661101c5760405162461bcd60e51b81526004016106ed9061394b565b600d54610100900460ff16156110445760405162461bcd60e51b81526004016106ed90613836565b61104c6123a0565b9050600160005590565b6008546001600160a01b031681565b6004546001600160a01b0316331461108f5760405162461bcd60e51b81526004016106ed90613715565b6127108111156110b15760405162461bcd60e51b81526004016106ed906137d7565b600a8190556040517fc36862a253ff42cc71f4f200d3c62e8e5eaaece01041fc6900aeace64ade72a890610767908390613aa3565b6004546001600160a01b031633146111105760405162461bcd60e51b81526004016106ed90613715565b601655565b6001600160a01b031660009081526010602052604090206003015490565b6009546001600160a01b031681565b6012546001600160a01b031681565b600260005414156111745760405162461bcd60e51b81526004016106ed90613a36565b600260005561118233611d8c565b15801561118e57503332145b6111aa5760405162461bcd60e51b81526004016106ed9061344d565b6013541561125457601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b1580156111f757600080fd5b505afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f91906130f0565b905060135481116112525760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff166112765760405162461bcd60e51b81526004016106ed9061394b565b33600090815260106020526040902061129081600e611d92565b6002810154828110156112f45760006112a984836120e9565b60018401549091506112bb9082612111565b600184015560006002840155604080516060810190915260308082526112ee91600e91613b516020830139859190612162565b50611304565b6112fe81846120e9565b60028301555b60006113103385611dee565b9050838115611397576002546007546040516340c10f1960e01b81526001600160a01b03928316926340c10f199261134f929116908690600401613171565b600060405180830381600087803b15801561136957600080fd5b505af115801561137d573d6000803e3d6000fd5b5050505061139482826120e990919063ffffffff16565b90505b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906113c99033908590600401613171565b600060405180830381600087803b1580156113e357600080fd5b505af11580156113f7573d6000803e3d6000fd5b5050600160005550505050505050565b6001600160a01b031660009081526010602052604090205490565b6004546001600160a01b0316331461144c5760405162461bcd60e51b81526004016106ed90613715565b6009811461146c5760405162461bcd60e51b81526004016106ed90613372565b610e1660158383612f86565b600061148460116123f9565b905090565b6001600160a01b03811660009081526010602052604081206114ac81600e6123fd565b9392505050565b6000806114c1601184611d65565b600101549392505050565b6004546001600160a01b031633146114f65760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b03811661151c5760405162461bcd60e51b81526004016106ed906138f6565b600880546001600160a01b0319166001600160a01b0383161790556040517fe42bb1780117f5788c6e0042e955291223819875891ddf465b8e4fbb85a933e99061076790839061315d565b600a5481565b600260005414156115905760405162461bcd60e51b81526004016106ed90613a36565b600260005561159e33611d8c565b1580156115aa57503332145b6115c65760405162461bcd60e51b81526004016106ed9061344d565b600d5460ff166115e85760405162461bcd60e51b81526004016106ed9061394b565b600d54610100900460ff16156116105760405162461bcd60e51b81526004016106ed90613836565b33600090815260106020526040902061162a81600e611d92565b600154611642906001600160a01b031633308561243c565b600c548210611655576116536123a0565b505b600b546116629083612111565b600b5580546116719083612111565b815543600382015560405133907f59062170a285eb80e8c6b8ced60428442a51910635005233fc4ce084a475845e906116ab908590613aa3565b60405180910390a250506001600055565b6007546001600160a01b031681565b6004546001600160a01b031633146116f55760405162461bcd60e51b81526004016106ed90613715565b600d5460ff16156117185760405162461bcd60e51b81526004016106ed90613790565b6008546001600160a01b03166117405760405162461bcd60e51b81526004016106ed906135e8565b6009546001600160a01b03166117685760405162461bcd60e51b81526004016106ed9061398f565b61177181612494565b50600d805460ff19166001179055565b600d5460ff166117a35760405162461bcd60e51b81526004016106ed9061394b565b6004546001600160a01b031633146117cd5760405162461bcd60e51b81526004016106ed90613715565b6117d681612494565b50565b600260005414156117fc5760405162461bcd60e51b81526004016106ed90613a36565b600260005561180a33611d8c565b15801561181657503332145b6118325760405162461bcd60e51b81526004016106ed9061344d565b601354156118dc57601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b15801561187f57600080fd5b505afa158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b791906130f0565b905060135481116118da5760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff166118fe5760405162461bcd60e51b81526004016106ed9061394b565b33600090815260106020526040902061191881600e611d92565b821561193f57600154611936906001600160a01b031633308661243c565b61193f83612191565b8115611a0c5760025460405163079cc67960e41b81526001600160a01b03909116906379cc6790906119779033908690600401613171565b600060405180830381600087803b15801561199157600080fd5b505af11580156119a5573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506119d9908590600401613aa3565b600060405180830381600087803b1580156119f357600080fd5b505af1158015611a07573d6000803e3d6000fd5b505050505b6000611a188484612111565b9050611a42816040518060200160405280600081525084600101546121369092919063ffffffff16565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90611a7b9087908790613aac565b60405180910390a2505060016000555050565b600d54600090819060ff16611ab55760405162461bcd60e51b81526004016106ed9061394b565b6000611ac2601185611d65565b9050600080611ad183306125bf565b90925090508115611b83576000611aff612710611af9600a5486611d2290919063ffffffff16565b90612614565b90506000611b0d84836120e9565b9050611b17612f73565b611b2c600b54611b2684612646565b90612688565b6040805160208101909152600f548152909150611b4990826126bc565b51600f558215611b7057600954600154611b70916001600160a01b039182169116856126ec565b8115611b7f57611b7f82612191565b5050505b7f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f098282604051611bb4929190613aac565b60405180910390a1909350915050915091565b60148181548110610d9357fe5b6004546001600160a01b03163314611bfe5760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b038116611c245760405162461bcd60e51b81526004016106ed9061386d565b600980546001600160a01b0319166001600160a01b0383161790556040517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf9061076790839061315d565b600c5481565b6005546001600160a01b031681565b6006546001600160a01b031681565b6001600160a01b03811660009081526010602052604081206114ac81600e61270b565b6001546001600160a01b031681565b60008060026000541415611ceb5760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff16611d125760405162461bcd60e51b81526004016106ed9061394b565b610e8584846122e3565b600b5481565b600082611d3157506000611d5f565b82820282848281611d3e57fe5b0414611d5c5760405162461bcd60e51b81526004016106ed906136d4565b90505b92915050565b6000826000018281548110611d7657fe5b9060005260206000209060020201905092915050565b3b151590565b6000611d9e8383612752565b90508260010154811115611dcc576001830180546000909155611dc182826120e9565b600285015550611de1565b6001830154611ddb90826120e9565b60018401555b5060010154600490910155565b6003546040516370a0823160e01b8152600091829160649183916001600160a01b03909116906370a0823190611e2890899060040161315d565b60206040518083038186803b158015611e4057600080fd5b505afa158015611e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7891906130f0565b9050611e95612710611af960165488611d2290919063ffffffff16565b92508015611f445760005b6009811015611f4257611edb670de0b6b3a764000060148381548110611ec257fe5b9060005260206000200154611d2290919063ffffffff16565b8210611f3a57611efc612710611af960165489611d2290919063ffffffff16565b9350611f376064611af9611f3060158581548110611f1657fe5b9060005260206000200154876120e990919063ffffffff16565b8790611d22565b93505b600101611ea0565b505b5090949350505050565b6001546040516370a0823160e01b815260009182918291611fde9186916001600160a01b0316906370a0823190611f8990309060040161315d565b60206040518083038186803b158015611fa157600080fd5b505afa158015611fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd991906130f0565b6127cb565b90506001600160a01b03851630146120765760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906120229088908590600401613171565b602060405180830381600087803b15801561203c57600080fd5b505af1158015612050573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207491906130b8565b505b8080600061208487836120e9565b905080156120ca57600061209860116127e1565b90506000806120a9838c868461280c565b90925090506120b88683612111565b95506120c48582612111565b94505050505b600b546120d790836120e9565b600b55509093509150505b9250929050565b60008282111561210b5760405162461bcd60e51b81526004016106ed906134d7565b50900390565b600082820183811015611d5c5760405162461bcd60e51b81526004016106ed90613416565b6000818484111561215a5760405162461bcd60e51b81526004016106ed91906131dc565b505050900390565b61216c8383612844565b819061218b5760405162461bcd60e51b81526004016106ed91906131dc565b50505050565b60015460085460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121c7929116908590600401613171565b602060405180830381600087803b1580156121e157600080fd5b505af11580156121f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221991906130b8565b50600854604051631f72642160e31b81526001600160a01b039091169063fb9321089061224c9030908590600401613171565b600060405180830381600087803b15801561226657600080fd5b505af115801561227a573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506122ae908490600401613aa3565b600060405180830381600087803b1580156122c857600080fd5b505af11580156122dc573d6000803e3d6000fd5b5050505050565b600d546000908190610100900460ff168061230857506004546001600160a01b031633145b8061231c57506123186011612872565b8414155b6123385760405162461bcd60e51b81526004016106ed9061326c565b6000612345601186611d65565b90506000806123568330888461280c565b91509150867fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a499647838360405161238c929190613aac565b60405180910390a290969095509350505050565b6000806123ad60116127e1565b905060006123ba826128bf565b90507f860f4701faa0ecdeecd9e9eaae11a8612bbd01c663081f7c0c4e4873df653d69816040516123eb9190613aa3565b60405180910390a191505090565b5490565b60008061240a8484612752565b90508061241d5750506001820154611d5f565b600184015480821061243457600092505050611d5f565b039392505050565b61218b846323b872dd60e01b85858560405160240161245d9392919061318a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612953565b6001600160a01b0381166124ba5760405162461bcd60e51b81526004016106ed90613554565b60015460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253991906130d4565b6001600160a01b03161461255f5760405162461bcd60e51b81526004016106ed90613691565b604080518082019091526001600160a01b038216815260006020820152612588906011906129e2565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b60008083600101546125d085612a25565b116125e0575060009050806120e2565b60006125f985600101546125f387612a25565b906120e9565b90506126088585836001612aa1565b92509250509250929050565b60008082116126355760405162461bcd60e51b81526004016106ed906135b1565b81838161263e57fe5b049392505050565b61264e612f73565b600082158061266b575050670de0b6b3a764000082810290810483145b61267457600080fd5b604080516020810190915290815292915050565b612690612f73565b8161269a57600080fd5b6040518060200160405280838560000151816126b257fe5b0490529392505050565b6126c4612f73565b825182518101908110156126d757600080fd5b60408051602081019091529081529392505050565b610e168363a9059cbb60e01b848460405160240161245d929190613171565b6000806127188484612752565b90508061272b5750506002820154611d5f565b600184015480821161274257600092505050611d5f565b6002850154910301905092915050565b600061275c612f73565b50604080516020810190915260018301548152612777612f73565b506040805160208101909152600485015481526127948282612c5e565b6127a357600092505050611d5f565b84546127c2906127bd906127b78585612c8f565b90612caa565b612cd8565b95945050505050565b60008183106127da5781611d5c565b5090919050565b6000816127ed81612872565b815481106127f757fe5b90600052602060002090600202019050919050565b600080808061281d88888888612aa1565b60018a0154919350915061283190826120e9565b6001890155909250905094509492505050565b6000806128696128548585612ce7565b60408051602081019091528554815290612c5e565b13159392505050565b60008061287e836123f9565b90506114ac6001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b815250836121369092919063ffffffff16565b6000806128cb83612d2b565b90506114ac816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016128fc919061315d565b60206040518083038186803b15801561291457600080fd5b505afa158015612928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294c91906130f0565b8490612da7565b60606129a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e4e9092919063ffffffff16565b805190915015610e1657808060200190518101906129c691906130b8565b610e165760405162461bcd60e51b81526004016106ed906139ec565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b158015612a6957600080fd5b505afa158015612a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f91906130f0565b6000806000612aaf87612d2b565b90506000816001600160a01b03166370a08231886040518263ffffffff1660e01b8152600401612adf919061315d565b60206040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f91906130f0565b90506000612b3c89612a25565b895460405163ead5d35960e01b81529192506001600160a01b03169063ead5d35990612b70908b908b908b906004016131ae565b600060405180830381600087803b158015612b8a57600080fd5b505af1158015612b9e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a0823190612bd1908c9060040161315d565b60206040518083038186803b158015612be957600080fd5b505afa158015612bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2191906130f0565b90506000612c2f82856120e9565b90506000612c3c8c612a25565b90506000612c4a85836120e9565b929d929c50919a5050505050505050505050565b805182516000911115612c745750600019611d5f565b815183511115612c8657506001611d5f565b50600092915050565b612c97612f73565b825182518103908111156126d757600080fd5b612cb2612f73565b6000821580612ccf575050825182810290838281612ccc57fe5b04145b6126d757600080fd5b51670de0b6b3a7640000900490565b612cef612f73565b6000612cfb84846123fd565b905080612d1257612d0a612e5d565b915050611d5f565b612d2381611b268660000154612646565b949350505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b158015612d6f57600080fd5b505afa158015612d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f91906130d4565b600080612db384612d2b565b8454909150612dcf906001600160a01b038084169116856126ec565b835460405163b6b55f2560e01b81526001600160a01b039091169063b6b55f2590612dfe908690600401613aa3565b600060405180830381600087803b158015612e1857600080fd5b505af1158015612e2c573d6000803e3d6000fd5b5050506001850154612e3f915084612111565b60018501555081905092915050565b6060612d238484600085612e79565b612e65612f73565b506040805160208101909152600019815290565b606082471015612e9b5760405162461bcd60e51b81526004016106ed9061350e565b612ea485611d8c565b612ec05760405162461bcd60e51b81526004016106ed906138bf565b60006060866001600160a01b03168587604051612edd9190613141565b60006040518083038185875af1925050503d8060008114612f1a576040519150601f19603f3d011682016040523d82523d6000602084013e612f1f565b606091505b5091509150612f2f828286612f3a565b979650505050505050565b60608315612f495750816114ac565b825115612f595782518084602001fd5b8160405162461bcd60e51b81526004016106ed91906131dc565b6040518060200160405280600081525090565b828054828255906000526020600020908101928215612fc1579160200282015b82811115612fc1578235825591602001919060010190612fa6565b50612fcd929150612fd1565b5090565b5b80821115612fcd5760008155600101612fd2565b600060208284031215612ff7578081fd5b8135611d5c81613afc565b60008060408385031215613014578081fd5b823561301f81613afc565b946020939093013593505050565b6000806020838503121561303f578182fd5b823567ffffffffffffffff80821115613056578384fd5b818501915085601f830112613069578384fd5b813581811115613077578485fd5b866020808302850101111561308a578485fd5b60209290920196919550909350505050565b6000602082840312156130ad578081fd5b8135611d5c81613b11565b6000602082840312156130c9578081fd5b8151611d5c81613b11565b6000602082840312156130e5578081fd5b8151611d5c81613afc565b600060208284031215613101578081fd5b5051919050565b600060208284031215613119578081fd5b5035919050565b60008060408385031215613132578182fd5b50508035926020909101359150565b60008251613153818460208701613ad0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b901515815260200190565b60006020825282518060208401526131fb816040850160208701613ad0565b601f01601f19169190910160400192915050565b6020808252603a908201527f59756d4c696e6b5665737065725661756c743a20636f6c6c61746572616c697a60408201527f6174696f6e206c696d69742062656c6f77206d696e696d756d2e000000000000606082015260800190565b60208082526079908201527f59756d4c696e6b5665737065725661756c743a206e6f7420616e20656d65726760408201527f656e63792c206e6f7420676f7665726e616e63652c20616e642075736572206460608201527f6f6573206e6f742068617665207065726d697373696f6e20746f20726563616c60808201527f6c2066756e64732066726f6d20616374697665207661756c740000000000000060a082015260c00190565b6020808252603a908201527f59756d4c696e6b5665737065725661756c743a20636f6c6c61746572616c697a60408201527f6174696f6e206c696d69742061626f7665206d6178696d756d2e000000000000606082015260800190565b60208082526031908201527f59756d4c696e6b5665737065725661756c743a20646973636f756e745461626c6040820152700ca40d8cadccee8d040dad2e6dac2e8c6d607b1b606082015260800190565b60208082526033908201527f59756d4c696e6b5665737065725661756c743a2073656e74696e656c206164646040820152723932b9b99031b0b73737ba10313290183c181760691b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f536f72727920776520646f206e6f742061636365707420636f6e747261637421604082015260600190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a20676f7665726e616e6365206160408201527432323932b9b99031b0b73737ba10313290183c181760591b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526037908201527f59756d4c696e6b5665737065725661756c743a20616374697665207661756c7460408201527f20616464726573732063616e6e6f74206265203078302e000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252603f908201527f59756d4c696e6b5665737065725661756c743a2063616e6e6f7420696e69746960408201527f616c697a65207472616e736d75746572206164647265737320746f2030783000606082015260800190565b6020808252602c908201527f59756d4c696e6b5665737065725661756c743a206665654c6576656c206c656e60408201526b0cee8d040dad2e6dac2e8c6d60a31b606082015260800190565b60208082526023908201527f59756d4c696e6b5665737065725661756c743a20746f6b656e206d69736d617460408201526231b41760e91b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526024908201527f59756d4c696e6b5665737065725661756c743a206f6e6c7920676f7665726e616040820152633731b29760e11b606082015260800190565b6020808252601f908201527f73656e646572206973206e6f742070656e64696e67476f7665726e616e636500604082015260600190565b60208082526027908201527f59756d4c696e6b5665737065725661756c743a20616c726561647920696e69746040820152661a585b1a5e995960ca1b606082015260800190565b6020808252602e908201527f59756d4c696e6b5665737065725661756c743a2068617276657374206665652060408201526d30b137bb329036b0bc34b6bab69760911b606082015260800190565b602080825260009082015260400190565b60208082526017908201527f656d657267656e637920706175736520656e61626c6564000000000000000000604082015260600190565b60208082526032908201527f59756d4c696e6b5665737065725661756c743a2072657761726473206164647260408201527132b9b99031b0b73737ba10313290183c181760711b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a207472616e736d75746572206160408201527432323932b9b99031b0b73737ba10313290183c181760591b606082015260800190565b60208082526024908201527f59756d4c696e6b5665737065725661756c743a206e6f7420696e697469616c696040820152633d32b21760e11b606082015260800190565b6020808252603c908201527f59756d4c696e6b5665737065725661756c743a2063616e6e6f7420696e69746960408201527f616c697a652072657761726473206164647265737320746f2030783000000000606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526012908201527137b333103832b3903634b6b4ba30ba34b7b760711b604082015260600190565b9051815260200190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60005b83811015613aeb578181015183820152602001613ad3565b8381111561218b5750506000910152565b6001600160a01b03811681146117d657600080fd5b80151581146117d657600080fdfe416374696f6e20626c6f636b65643a20756e6865616c74687920636f6c6c61746572616c697a6174696f6e20726174696f59756d4c696e6b5665737065725661756c743a204c6f616e2d746f2d76616c756520726174696f206272656163686564a26469706673582212202c696dca15596e3abd18da69a0f4eb148bf866bd99df8225d6f4e36b75e04f8164736f6c634300060c0033

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

000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000029ddf2c4f1e80dc9e95cc57a9ca03a28e4ab6d6c000000000000000000000000b938d8cbf7fc6455d1f2ebede5ff9a8e887493b200000000000000000000000068284083acbabcb6da84f62ea341dd8c30500eee0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d379800000000000000000000000076e2fd0cc4daa40c76f90f3ddfa2e3abf7a75810

-----Decoded View---------------
Arg [0] : _token (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [1] : _xtoken (address): 0x29DDF2c4F1E80DC9E95CC57a9cA03a28E4aB6D6c
Arg [2] : _votingEscrow (address): 0xb938D8cBF7fc6455d1f2ebeDE5FF9A8e887493B2
Arg [3] : _governance (address): 0x68284083acbabCb6da84f62ea341dd8c30500EEE
Arg [4] : _sentinel (address): 0x9e145AF5b3B142a50d871cb4821992dd493d3798
Arg [5] : _feeCollector (address): 0x76E2FD0CC4DAa40C76f90f3DdfA2E3ABF7A75810

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [1] : 00000000000000000000000029ddf2c4f1e80dc9e95cc57a9ca03a28e4ab6d6c
Arg [2] : 000000000000000000000000b938d8cbf7fc6455d1f2ebede5ff9a8e887493b2
Arg [3] : 00000000000000000000000068284083acbabcb6da84f62ea341dd8c30500eee
Arg [4] : 0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d3798
Arg [5] : 00000000000000000000000076e2fd0cc4daa40c76f90f3ddfa2e3abf7a75810


Deployed Bytecode Sourcemap

103123:30259:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108827:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104734:77;;;:::i;111054:230::-;;;;;;:::i;:::-;;:::i;:::-;;110353:293;;;;;;:::i;:::-;;:::i;107600:23::-;;;:::i;:::-;;;;;;;:::i;106313:28::-;;;:::i;:::-;;;;;;;:::i;112036:116::-;;;;;;:::i;:::-;;:::i;110781:267::-;;;:::i;126401:175::-;;;;;;:::i;:::-;;:::i;121655:1319::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;104173:77::-;;;:::i;108572:25::-;;;:::i;124017:816::-;;;;;;:::i;:::-;;:::i;114927:221::-;;;;;;:::i;:::-;;:::i;103639:50::-;;;:::i;108743:30::-;;;;;;:::i;:::-;;:::i;115367:136::-;;;:::i;:::-;;;;;;;:::i;113403:186::-;;;;;;:::i;:::-;;:::i;118518:227::-;;;;;;:::i;:::-;;:::i;106402:33::-;;;:::i;103427:49::-;;;:::i;114176:435::-;;;;;;:::i;:::-;;:::i;107775:25::-;;;:::i;114639:131::-;;;;;;:::i;:::-;;:::i;106549:25::-;;;:::i;119023:344::-;;;:::i;107029:25::-;;;:::i;112962:435::-;;;;;;:::i;:::-;;:::i;113817:90::-;;;;;;:::i;:::-;;:::i;128279:159::-;;;;;;:::i;:::-;;:::i;107126:22::-;;;:::i;108451:29::-;;;:::i;125162:901::-;;;;;;:::i;:::-;;:::i;127170:165::-;;;;;;:::i;:::-;;:::i;113595:216::-;;;;;;:::i;:::-;;:::i;126165:90::-;;;:::i;127535:171::-;;;;;;:::i;:::-;;:::i;126792:181::-;;;;;;:::i;:::-;;:::i;111499:435::-;;;;;;:::i;:::-;;:::i;107244:25::-;;;:::i;120180:571::-;;;;;;:::i;:::-;;:::i;106892:27::-;;;:::i;115727:420::-;;;;;;:::i;:::-;;:::i;116528:121::-;;;;;;:::i;:::-;;:::i;123127:722::-;;;;;;:::i;:::-;;:::i;116849:941::-;;;;;;:::i;:::-;;:::i;108627:25::-;;;;;;:::i;:::-;;:::i;112382:405::-;;;;;;:::i;:::-;;:::i;107492:29::-;;;:::i;106632:32::-;;;:::i;106772:23::-;;;:::i;127883:175::-;;;;;;:::i;:::-;;:::i;106208:27::-;;;:::i;118071:171::-;;;;;;:::i;:::-;;:::i;107381:29::-;;;:::i;108827:23::-;;;;:::o;104734:77::-;104792:19;104734:77;:::o;111054:230::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;111128:25:0;::::1;111120:89;;;;-1:-1:-1::0;;;111120:89:0::1;;;;;;;:::i;:::-;111218:8;:20:::0;;-1:-1:-1;;;;;;111218:20:0::1;-1:-1:-1::0;;;;;111218:20:0;::::1;;::::0;;111252:26:::1;::::0;::::1;::::0;::::1;::::0;111218:20;;111252:26:::1;:::i;:::-;;;;;;;;111054:230:::0;:::o;110353:293::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;110443:34:0;::::1;110435:100;;;;-1:-1:-1::0;;;110435:100:0::1;;;;;;;:::i;:::-;110544:17;:38:::0;;-1:-1:-1;;;;;;110544:38:0::1;-1:-1:-1::0;;;;;110544:38:0;::::1;;::::0;;110596:44:::1;::::0;::::1;::::0;::::1;::::0;110544:38;;110596:44:::1;:::i;107600:23::-:0;;;;;;:::o;106313:28::-;;;-1:-1:-1;;;;;106313:28:0;;:::o;112036:116::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;112112:14:::1;:32:::0;112036:116::o;110781:267::-;110848:17;;-1:-1:-1;;;;;110848:17:0;110834:10;:31;110826:74;;;;-1:-1:-1;;;110826:74:0;;;;;;;:::i;:::-;110936:17;;110960:10;:31;;-1:-1:-1;;;;;;110960:31:0;-1:-1:-1;;;;;110936:17:0;;;110960:31;;;;;111005:37;;;;;;110936:17;;111005:37;:::i;126401:175::-;126467:15;;126521:21;:7;126533:8;126521:11;:21::i;:::-;126556:14;-1:-1:-1;;;;;126556:14:0;;126401:175;-1:-1:-1;;;126401:175:0:o;121655:1319::-;121757:7;121766;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;129593:11:::2;::::0;::::2;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::2;;;;;;;:::i;:::-;121814:10:::3;121784:21;121808:17:::0;;;:5:::3;:17;::::0;;;;121855:16:::3;::::0;::::3;::::0;121840:12:::3;:31;121832:44;;;;-1:-1:-1::0;;;121832:44:0::3;;;;;;;:::i;:::-;121885:17;:4:::0;121897::::3;121885:11;:17::i;:::-;121911:25;121939:37;121957:10;121968:7;121939:17;:37::i;:::-;121911:65:::0;-1:-1:-1;122009:7:0;121983:23:::3;::::0;122097:21;;122094:555:::3;;122205:12;::::0;122129:27:::3;::::0;;;122188:49:::3;::::0;-1:-1:-1;;;;;122205:12:0::3;122219:17:::0;122188:16:::3;:49::i;:::-;122128:109:::0;;-1:-1:-1;122128:109:0;-1:-1:-1;122264:38:0::3;:15:::0;122284:17;122264:19:::3;:38::i;:::-;122246:56;;122353:45;122370:10;122382:15;122353:16;:45::i;:::-;122315:83:::0;;-1:-1:-1;122315:83:0;-1:-1:-1;122427:39:0::3;122315:83:::0;122447:18;122427:19:::3;:39::i;:::-;122409:57:::0;-1:-1:-1;122494:41:0::3;:16:::0;122515:19;122494:20:::3;:41::i;:::-;122475:60;;122094:555;;;;;122596:45;122613:10;122625:15;122596:16;:45::i;:::-;122558:83:::0;;-1:-1:-1;122558:83:0;-1:-1:-1;122094:555:0::3;122679:71;::::0;;;;::::3;::::0;;;::::3;::::0;;::::3;;::::0;::::3;::::0;:19;;:71:::3;::::0;122703:15;;122679:23:::3;:71::i;:::-;122657:93:::0;;122757:75:::3;::::0;;::::3;::::0;::::3;::::0;;;::::3;::::0;;;::::3;::::0;122774:4:::3;::::0;122757:75:::3;;::::0;::::3;;:4:::0;;:75;:16:::3;:75::i;:::-;122862:10;-1:-1:-1::0;;;;;122846:71:0::3;;122874:7;122883:16;122901:15;122846:71;;;;;;;;:::i;:::-;;;;;;;;2674:1:::0;3636:7;:22;122934:16;;;;-1:-1:-1;121655:1319:0;-1:-1:-1;;;;;121655:1319:0:o;104173:77::-;104231:19;104173:77;:::o;108572:25::-;;;;:::o;124017:816::-;124132:7;124141;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;128948:10:::2;::::0;:14;128945:174:::2;;129015:14;::::0;129004:41:::2;::::0;;-1:-1:-1;;;129004:41:0;;;;128973:20:::2;::::0;-1:-1:-1;;;;;129015:14:0::2;::::0;129004:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;129015:14;129004:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;128973:73;;129078:10;;129063:12;:25;129055:56;;;;-1:-1:-1::0;;;129055:56:0::2;;;;;;;:::i;:::-;128945:174;;129593:11:::3;::::0;::::3;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::3;;;;;;;:::i;:::-;124187:10:::4;124157:21;124181:17:::0;;;:5:::4;:17;::::0;;;;124205::::4;124181::::0;124217:4:::4;124205:11;:17::i;:::-;124301:4;:14;;;124291:7;:24;124288:69;;;124335:4;:14;;;124325:24;;124288:69;124364:24;124390:23:::0;124417:40:::4;124442:4;124449:7;124417:16;:40::i;:::-;124363:94;;;;124512:41;124536:16;124512:23;:41::i;:::-;124584:44;::::0;;::::4;::::0;::::4;::::0;;;-1:-1:-1;124584:44:0;;:19;;:44:::4;::::0;124608:15;;124584:23:::4;:44::i;:::-;124562:66:::0;;124652:40:::4;::::0;;::::4;::::0;::::4;::::0;;;124562:19:::4;124652:40:::0;;:14:::4;::::0;::::4;::::0;:40:::4;::::0;124671:16;;124652:18:::4;:40::i;:::-;124635:14;::::0;::::4;:57:::0;124704:72:::4;::::0;124721:10:::4;::::0;124704:72:::4;::::0;::::4;::::0;124733:7;;124742:16;;124760:15;;124704:72:::4;:::i;:::-;;;;;;;;2674:1:::0;3636:7;:22;124793:16;;;;-1:-1:-1;124017:816:0;-1:-1:-1;;;124017:816:0:o;114927:221::-;115012:10;;-1:-1:-1;;;;;115012:10:0;114998;:24;;:50;;-1:-1:-1;115040:8:0;;-1:-1:-1;;;;;115040:8:0;115026:10;:22;114998:50;114990:63;;;;-1:-1:-1;;;114990:63:0;;;;;;;:::i;:::-;115062:13;:30;;-1:-1:-1;;115062:30:0;;;;;;;;;115106:36;;;;;;115062:30;;115106:36;:::i;103639:50::-;103684:5;103639:50;:::o;108743:30::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;108743:30:0;:::o;115367:136::-;115424:30;;:::i;:::-;-1:-1:-1;115463:34:0;;;;;;;;;115470:4;115463:34;;;115367:136;:::o;113403:186::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;113506:1:::1;113486:21:::0;::::1;113478:78;;;;-1:-1:-1::0;;;113478:78:0::1;;;;;;;:::i;:::-;113563:20;:8;113574:9:::0;;113563:20:::1;:::i;:::-;;113403:186:::0;;:::o;118518:227::-;118604:7;118613;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129593:11:::1;::::0;::::1;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::1;;;;;;;:::i;:::-;118629:27:::2;118659:21;:7;118671:8:::0;118659:11:::2;:21::i;:::-;118629:51;;118694:45;118707:8;118717:6;:21;;;118694:12;:45::i;:::-;2674:1:::0;3636:7;:22;118687:52;;;;-1:-1:-1;118518:227:0;-1:-1:-1;;;118518:227:0:o;106402:33::-;;;-1:-1:-1;;;;;106402:33:0;;:::o;103427:49::-;103474:1;103427:49;:::o;114176:435::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;104231:19:::1;114261:6;:41;;114253:112;;;;-1:-1:-1::0;;;114253:112:0::1;;;;;;;:::i;:::-;104792:19;114380:6;:41;;114372:112;;;;-1:-1:-1::0;;;114372:112:0::1;;;;;;;:::i;:::-;114523:31;::::0;;::::1;::::0;::::1;::::0;;;;;114493:4:::1;:61:::0;;;114568:37;::::1;::::0;::::1;::::0;114547:6;;114568:37:::1;:::i;107775:25::-:0;;;;;;;;;:::o;114639:131::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;114718:14:::1;:23:::0;;-1:-1:-1;;;;;;114718:23:0::1;-1:-1:-1::0;;;;;114718:23:0;;;::::1;::::0;;;::::1;::::0;;;114748:10:::1;:16:::0;114639:131::o;106549:25::-;;;-1:-1:-1;;;;;106549:25:0;;:::o;119023:344::-;119089:7;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129593:11:::1;::::0;::::1;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::1;;;;;;;:::i;:::-;119286:13:::2;::::0;::::2;::::0;::::2;;;119285:14;119277:50;;;;-1:-1:-1::0;;;119277:50:0::2;;;;;;;:::i;:::-;119343:18;:16;:18::i;:::-;119336:25;;2674:1:::0;3636:7;:22;119023:344;:::o;107029:25::-;;;-1:-1:-1;;;;;107029:25:0;;:::o;112962:435::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;103684:5:::1;113230:11;:33;;113222:92;;;;-1:-1:-1::0;;;113222:92:0::1;;;;;;;:::i;:::-;113323:10;:24:::0;;;113361:30:::1;::::0;::::1;::::0;::::1;::::0;113336:11;;113361:30:::1;:::i;113817:90::-:0;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;113881:8:::1;:20:::0;113817:90::o;128279:159::-;-1:-1:-1;;;;;128387:15:0;128347:7;128387:15;;;:5;:15;;;;;128416:16;;;;128279:159::o;107126:22::-;;;-1:-1:-1;;;;;107126:22:0;;:::o;108451:29::-;;;-1:-1:-1;;;;;108451:29:0;;:::o;125162:901::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;128948:10:::2;::::0;:14;128945:174:::2;;129015:14;::::0;129004:41:::2;::::0;;-1:-1:-1;;;129004:41:0;;;;128973:20:::2;::::0;-1:-1:-1;;;;;129015:14:0::2;::::0;129004:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;129015:14;129004:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;128973:73;;129078:10;;129063:12;:25;129055:56;;;;-1:-1:-1::0;;;129055:56:0::2;;;;;;;:::i;:::-;128945:174;;129593:11:::3;::::0;::::3;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::3;;;;;;;:::i;:::-;125302:10:::4;125272:21;125296:17:::0;;;:5:::4;:17;::::0;;;;125320::::4;125296::::0;125332:4:::4;125320:11;:17::i;:::-;125369:16;::::0;::::4;::::0;125398:22;;::::4;125394:340;;;125431:24;125458:25;:7:::0;125470:12;125458:11:::4;:25::i;:::-;125509:14;::::0;::::4;::::0;125431:52;;-1:-1:-1;125509:36:0::4;::::0;125431:52;125509:18:::4;:36::i;:::-;125492:14;::::0;::::4;:53:::0;125573:1:::4;125554:16;::::0;::::4;:20:::0;125585:74:::4;::::0;;::::4;::::0;::::4;::::0;;;::::4;::::0;;;::::4;::::0;125602:4:::4;::::0;125585:74:::4;;::::0;::::4;;:4:::0;;:74;:16:::4;:74::i;:::-;125394:340;;;;125701:25;:12:::0;125718:7;125701:16:::4;:25::i;:::-;125682:16;::::0;::::4;:44:::0;125394:340:::4;125742:25;125770:37;125788:10;125799:7;125770:17;:37::i;:::-;125742:65:::0;-1:-1:-1;125840:7:0;125860:21;;125856:153:::4;;125892:6;::::0;125904:12:::4;::::0;125892:44:::4;::::0;-1:-1:-1;;;125892:44:0;;-1:-1:-1;;;;;125892:6:0;;::::4;::::0;:11:::4;::::0;:44:::4;::::0;125904:12;::::4;::::0;125918:17;;125892:44:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;125963:38;125983:17;125963:15;:19;;:38;;;;:::i;:::-;125945:56;;125856:153;126017:6;::::0;:40:::4;::::0;-1:-1:-1;;;126017:40:0;;-1:-1:-1;;;;;126017:6:0;;::::4;::::0;:11:::4;::::0;:40:::4;::::0;126029:10:::4;::::0;126041:15;;126017:40:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;-1:-1:-1;;;;;;;125162:901:0:o;127170:165::-;-1:-1:-1;;;;;127281:15:0;127241:7;127281:15;;;:5;:15;;;;;127310:19;;127170:165::o;113595:216::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;113713:1:::1;113688:26:::0;::::1;113680:88;;;;-1:-1:-1::0;;;113680:88:0::1;;;;;;;:::i;:::-;113775:30;:13;113791:14:::0;;113775:30:::1;:::i;126165:90::-:0;126210:7;126233:16;:7;:14;:16::i;:::-;126226:23;;126165:90;:::o;127535:171::-;-1:-1:-1;;;;;127641:15:0;;127601:7;127641:15;;;:5;:15;;;;;127670:30;127641:15;127695:4;127670:24;:30::i;:::-;127663:37;127535:171;-1:-1:-1;;;127535:171:0:o;126792:181::-;126865:7;;126911:21;:7;126923:8;126911:11;:21::i;:::-;126946;;;;126792:181;-1:-1:-1;;;126792:181:0:o;111499:435::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;111766:27:0;::::1;111758:93;;;;-1:-1:-1::0;;;111758:93:0::1;;;;;;;:::i;:::-;111860:10;:24:::0;;-1:-1:-1;;;;;;111860:24:0::1;-1:-1:-1::0;;;;;111860:24:0;::::1;;::::0;;111898:30:::1;::::0;::::1;::::0;::::1;::::0;111860:24;;111898:30:::1;:::i;107244:25::-:0;;;;:::o;120180:571::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;129593:11:::2;::::0;::::2;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::2;;;;;;;:::i;:::-;120290:13:::3;::::0;::::3;::::0;::::3;;;120289:14;120281:50;;;;-1:-1:-1::0;;;120281:50:0::3;;;;;;;:::i;:::-;120370:10;120340:21;120364:17:::0;;;:5:::3;:17;::::0;;;;120388::::3;120364::::0;120400:4:::3;120388:11;:17::i;:::-;120414:5;::::0;:58:::3;::::0;-1:-1:-1;;;;;120414:5:0::3;120437:10;120457:4;120464:7:::0;120414:22:::3;:58::i;:::-;120493:14;;120482:7;:25;120479:65;;120518:18;:16;:18::i;:::-;;120479:65;120567:14;::::0;:27:::3;::::0;120586:7;120567:18:::3;:27::i;:::-;120550:14;:44:::0;120625:19;;:32:::3;::::0;120649:7;120625:23:::3;:32::i;:::-;120603:54:::0;;120683:12:::3;120664:16;::::0;::::3;:31:::0;120709:36:::3;::::0;120725:10:::3;::::0;120709:36:::3;::::0;::::3;::::0;120737:7;;120709:36:::3;:::i;:::-;;;;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;120180:571::o;106892:27::-;;;-1:-1:-1;;;;;106892:27:0;;:::o;115727:420::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;115808:11:::1;::::0;::::1;;115807:12;115799:64;;;;-1:-1:-1::0;;;115799:64:0::1;;;;;;;:::i;:::-;115880:10;::::0;-1:-1:-1;;;;;115880:10:0::1;115872:102;;;;-1:-1:-1::0;;;115872:102:0::1;;;;;;;:::i;:::-;115989:7;::::0;-1:-1:-1;;;;;115989:7:0::1;115981:96;;;;-1:-1:-1::0;;;115981:96:0::1;;;;;;;:::i;:::-;116086:28;116105:8;116086:18;:28::i;:::-;-1:-1:-1::0;116123:11:0::1;:18:::0;;-1:-1:-1;;116123:18:0::1;116137:4;116123:18;::::0;;115727:420::o;116528:121::-;129593:11;;;;129585:60;;;;-1:-1:-1;;;129585:60:0;;;;;;;:::i;:::-;130075:10:::1;::::0;-1:-1:-1;;;;;130075:10:0::1;130061;:24;130053:73;;;;-1:-1:-1::0;;;130053:73:0::1;;;;;;;:::i;:::-;116615:28:::2;116634:8;116615:18;:28::i;:::-;116528:121:::0;:::o;123127:722::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;128948:10:::2;::::0;:14;128945:174:::2;;129015:14;::::0;129004:41:::2;::::0;;-1:-1:-1;;;129004:41:0;;;;128973:20:::2;::::0;-1:-1:-1;;;;;129015:14:0::2;::::0;129004:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;129015:14;129004:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;128973:73;;129078:10;;129063:12;:25;129055:56;;;;-1:-1:-1::0;;;129055:56:0::2;;;;;;;:::i;:::-;128945:174;;129593:11:::3;::::0;::::3;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::3;;;;;;;:::i;:::-;123296:10:::4;123266:21;123290:17:::0;;;:5:::4;:17;::::0;;;;123314::::4;123290::::0;123326:4:::4;123314:11;:17::i;:::-;123344::::0;;123340:151:::4;;123372:5;::::0;:64:::4;::::0;-1:-1:-1;;;;;123372:5:0::4;123395:10;123415:4;123422:13:::0;123372:22:::4;:64::i;:::-;123445:38;123469:13;123445:23;:38::i;:::-;123503:16:::0;;123499:155:::4;;123530:6;::::0;:41:::4;::::0;-1:-1:-1;;;123530:41:0;;-1:-1:-1;;;;;123530:6:0;;::::4;::::0;:15:::4;::::0;:41:::4;::::0;123546:10:::4;::::0;123558:12;;123530:41:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;123611:6:0::4;::::0;:35:::4;::::0;-1:-1:-1;;;123611:35:0;;-1:-1:-1;;;;;123611:6:0;;::::4;::::0;-1:-1:-1;123611:21:0::4;::::0;-1:-1:-1;123611:35:0::4;::::0;123633:12;;123611:35:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;123499:155;123662:20;123685:31;:13:::0;123703:12;123685:17:::4;:31::i;:::-;123662:54;;123740:36;123759:12;123740:36;;;;;;;;;;;::::0;:4:::4;:14;;;:18;;:36;;;;;:::i;:::-;123723:14;::::0;::::4;:53:::0;123790::::4;::::0;123803:10:::4;::::0;123790:53:::4;::::0;::::4;::::0;123815:13;;123830:12;;123790:53:::4;:::i;:::-;;;;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;-1:-1:-1;;123127:722:0:o;116849:941::-;129593:11;;116920:7;;;;129593:11;;129585:60;;;;-1:-1:-1;;;129585:60:0;;;;;;;:::i;:::-;116947:27:::1;116977:21;:7;116989:8:::0;116977:11:::1;:21::i;:::-;116947:51:::0;-1:-1:-1;117008:24:0::1;::::0;117061:29:::1;116947:51:::0;117084:4:::1;117061:14;:29::i;:::-;117007:83:::0;;-1:-1:-1;117007:83:0;-1:-1:-1;117103:20:0;;117099:572:::1;;117134:18;117155:56;103684:5;117155:32;117176:10;;117155:16;:20;;:32;;;;:::i;:::-;:36:::0;::::1;:56::i;:::-;117134:77:::0;-1:-1:-1;117220:25:0::1;117248:32;:16:::0;117134:77;117248:20:::1;:32::i;:::-;117220:60;;117291:38;;:::i;:::-;117332:62;117379:14;;117332:42;117356:17;117332:23;:42::i;:::-;:46:::0;::::1;:62::i;:::-;117433:31;::::0;;::::1;::::0;::::1;::::0;;;:27;:31;;;117291:103;;-1:-1:-1;117433:40:0::1;::::0;117291:103;117433:31:::1;:40::i;:::-;117403:70:::0;:27;:70;117488:14;;117484:80:::1;;117534:7;::::0;;117515:5;:39:::1;::::0;-1:-1:-1;;;;;117515:5:0;;::::1;::::0;117534:7:::1;117543:10:::0;117515:18:::1;:39::i;:::-;117578:21:::0;;117574:90:::1;;117612:42;117636:17;117612:23;:42::i;:::-;117099:572;;;;117684:49;117699:16;117717:15;117684:49;;;;;;;:::i;:::-;;;;;;;;117750:16:::0;;-1:-1:-1;117768:15:0;-1:-1:-1;;116849:941:0;;;:::o;108627:25::-;;;;;;;;;;112382:405;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;112637:24:0;::::1;112629:87;;;;-1:-1:-1::0;;;112629:87:0::1;;;;;;;:::i;:::-;112725:7;:18:::0;;-1:-1:-1;;;;;;112725:18:0::1;-1:-1:-1::0;;;;;112725:18:0;::::1;;::::0;;112757:24:::1;::::0;::::1;::::0;::::1;::::0;112725:18;;112757:24:::1;:::i;107492:29::-:0;;;;:::o;106632:32::-;;;-1:-1:-1;;;;;106632:32:0;;:::o;106772:23::-;;;-1:-1:-1;;;;;106772:23:0;;:::o;127883:175::-;-1:-1:-1;;;;;127991:15:0;;127951:7;127991:15;;;:5;:15;;;;;128020:32;127991:15;128047:4;128020:26;:32::i;106208:27::-;;;-1:-1:-1;;;;;106208:27:0;;:::o;118071:171::-;118171:7;118180;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129593:11:::1;::::0;::::1;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::1;;;;;;;:::i;:::-;118205:31:::2;118218:8;118228:7;118205:12;:31::i;107381:29::-:0;;;;:::o;18205:220::-;18263:7;18287:6;18283:20;;-1:-1:-1;18302:1:0;18295:8;;18283:20;18326:5;;;18330:1;18326;:5;:1;18350:5;;;;;:10;18342:56;;;;-1:-1:-1;;;18342:56:0;;;;;;;:::i;:::-;18416:1;-1:-1:-1;18205:220:0;;;;;:::o;101746:128::-;101818:12;101846:5;:14;;101861:6;101846:22;;;;;;;;;;;;;;;;;;101839:29;;101746:128;;;;:::o;4451:422::-;4818:20;4857:8;;;4451:422::o;92226:466::-;92300:20;92323:26;:5;92344:4;92323:20;:26::i;:::-;92300:49;;92375:5;:15;;;92360:12;:30;92356:262;;;92429:15;;;;;92401:25;92453:19;;;92501:35;:12;92429:15;92501:16;:35::i;:::-;92481:17;;;:55;-1:-1:-1;92356:262:0;;;92577:15;;;;:33;;92597:12;92577:19;:33::i;:::-;92559:15;;;:51;92356:262;-1:-1:-1;92659:27:0;;92624:62;:32;;;;:62;92226:466::o;120759:588::-;120940:12;;:32;;-1:-1:-1;;;120940:32:0;;120844:7;;;;120906:3;;120844:7;;-1:-1:-1;;;;;120940:12:0;;;;:22;;:32;;120963:8;;120940:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;120916:56;;120991:32;121017:5;120991:21;121003:8;;120991:7;:11;;:21;;;;:::i;:32::-;120979:44;-1:-1:-1;121035:17:0;;121032:283;;121067:9;121062:246;121086:1;121082;:5;121062:246;;;121125:26;121143:7;121126:8;121135:1;121126:11;;;;;;;;;;;;;;;;121125:17;;:26;;;;:::i;:::-;121108:13;:43;121105:194;;121177:32;121203:5;121177:21;121189:8;;121177:7;:11;;:21;;;;:::i;:32::-;121165:44;;121234:53;121283:3;121234:44;121248:29;121260:13;121274:1;121260:16;;;;;;;;;;;;;;;;121248:7;:11;;:29;;;;:::i;:::-;121234:9;;:13;:44::i;:53::-;121222:65;;121105:194;121089:3;;121062:246;;;;121032:283;-1:-1:-1;121330:9:0;;120759:588;-1:-1:-1;;;;120759:588:0:o;132312:1067::-;132502:5;;:30;;-1:-1:-1;;;132502:30:0;;132393:7;;;;;;132484:49;;132493:7;;-1:-1:-1;;;;;132502:5:0;;:15;;:30;;132526:4;;132502:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;132484:8;:49::i;:::-;132458:75;-1:-1:-1;;;;;;132546:27:0;;132568:4;132546:27;132542:93;;132584:5;;:43;;-1:-1:-1;;;132584:43:0;;-1:-1:-1;;;;;132584:5:0;;;;:14;;:43;;132599:10;;132611:15;;132584:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;132542:93;132669:15;;132643:23;132773:28;:7;132669:15;132773:11;:28::i;:::-;132746:55;-1:-1:-1;132870:20:0;;132866:387;;132901:33;132937:14;:7;:12;:14::i;:::-;132901:50;-1:-1:-1;132961:23:0;;133013:94;132901:50;133045:10;133066:16;132961:23;133013:21;:94::i;:::-;132960:147;;-1:-1:-1;132960:147:0;-1:-1:-1;133136:36:0;:15;132960:147;133136:19;:36::i;:::-;133118:54;-1:-1:-1;133204:41:0;:20;133229:15;133204:24;:41::i;:::-;133181:64;;132866:387;;;;133278:14;;:40;;133297:20;133278:18;:40::i;:::-;133261:14;:57;-1:-1:-1;133335:15:0;;-1:-1:-1;133352:20:0;-1:-1:-1;;132312:1067:0;;;;;;:::o;17788:158::-;17846:7;17879:1;17874;:6;;17866:49;;;;-1:-1:-1;;;17866:49:0;;;;;;;:::i;:::-;-1:-1:-1;17933:5:0;;;17788:158::o;17326:179::-;17384:7;17416:5;;;17440:6;;;;17432:46;;;;-1:-1:-1;;;17432:46:0;;;;;;;:::i;20153:166::-;20239:7;20275:12;20267:6;;;;20259:29;;;;-1:-1:-1;;;20259:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;20306:5:0;;;20153:166::o;92808:146::-;92920:21;:5;92936:4;92920:15;:21::i;:::-;92943:4;92912:36;;;;;-1:-1:-1;;;92912:36:0;;;;;;;;:::i;:::-;;92808:146;;;:::o;128537:253::-;128606:5;;128620:10;;128606:32;;-1:-1:-1;;;128606:32:0;;-1:-1:-1;;;;;128606:5:0;;;;:13;;:32;;128620:10;;;128631:6;;128606:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;128661:10:0;;128649:56;;-1:-1:-1;;;128649:56:0;;-1:-1:-1;;;;;128661:10:0;;;;128649:34;;:56;;128692:4;;128698:6;;128649:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;128755:6:0;;:29;;-1:-1:-1;;;128755:29:0;;-1:-1:-1;;;;;128755:6:0;;;;-1:-1:-1;128755:21:0;;-1:-1:-1;128755:29:0;;128777:6;;128755:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;128537:253;:::o;131236:606::-;131344:13;;131311:7;;;;131344:13;;;;;;:41;;-1:-1:-1;131375:10:0;;-1:-1:-1;;;;;131375:10:0;131361;:24;131344:41;:76;;;;131401:19;:7;:17;:19::i;:::-;131389:8;:31;;131344:76;131336:210;;;;-1:-1:-1;;;131336:210:0;;;;;;;:::i;:::-;131555:27;131585:21;:7;131597:8;131585:11;:21::i;:::-;131555:51;-1:-1:-1;131614:24:0;;131667:46;131555:51;131691:4;131698:7;131614:24;131667:15;:46::i;:::-;131613:100;;;;131741:8;131727:58;131751:16;131769:15;131727:58;;;;;;;:::i;:::-;;;;;;;;131802:16;;;;-1:-1:-1;131236:606:0;-1:-1:-1;;;;131236:606:0:o;119664:255::-;119710:7;119728:33;119764:14;:7;:12;:14::i;:::-;119728:50;;119785:24;119812:25;:12;:23;:25::i;:::-;119785:52;;119851:30;119864:16;119851:30;;;;;;:::i;:::-;;;;;;;;119897:16;-1:-1:-1;;119664:255:0;:::o;102648:109::-;102730:21;;102648:109::o;93361:415::-;93455:7;;93497:26;:5;93518:4;93497:20;:26::i;:::-;93471:52;-1:-1:-1;93534:20:0;93530:65;;-1:-1:-1;;93572:15:0;;;;93565:22;;93530:65;93631:15;;;;93657:36;;;93653:67;;93711:1;93704:8;;;;;;93653:67;93735:35;;93361:415;-1:-1:-1;;;93361:415:0:o;22846:205::-;22947:96;22967:5;22997:27;;;23026:4;23032:2;23036:5;22974:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22974:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22974:68:0;-1:-1:-1;;;;;;22974:68:0;;;;;;;;;;22947:19;:96::i;130493:403::-;-1:-1:-1;;;;;130571:41:0;;130563:109;;;;-1:-1:-1;;;130563:109:0;;;;;;;:::i;:::-;130707:5;;130687:16;;;-1:-1:-1;;;130687:16:0;;;;-1:-1:-1;;;;;130707:5:0;;;;130687:14;;;;;:16;;;;;;;;;;;;;;:14;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;130687:25:0;;130679:73;;;;-1:-1:-1;;;130679:73:0;;;;;;;:::i;:::-;130774;;;;;;;;;-1:-1:-1;;;;;130774:73:0;;;;-1:-1:-1;130774:73:0;;;;130761:87;;:7;;:12;:87::i;:::-;130862:28;;-1:-1:-1;;;;;130862:28:0;;;;;;;;130493:403;:::o;101057:329::-;101132:7;101141;101183:5;:20;;;101161:18;:5;:16;:18::i;:::-;:42;101157:78;;-1:-1:-1;101222:1:0;;-1:-1:-1;101222:1:0;101214:13;;101157:78;101241:23;101267:44;101290:5;:20;;;101267:18;:5;:16;:18::i;:::-;:22;;:44::i;:::-;101241:70;-1:-1:-1;101325:55:0;:5;101346:10;101241:70;101375:4;101325:20;:55::i;:::-;101318:62;;;;;101057:329;;;;;:::o;18903:153::-;18961:7;18993:1;18989;:5;18981:44;;;;-1:-1:-1;;;18981:44:0;;;;;;;:::i;:::-;19047:1;19043;:5;;;;;;;18903:153;-1:-1:-1;;;18903:153:0:o;25980:188::-;26036:15;;:::i;:::-;26060:9;26084:10;;;:52;;-1:-1:-1;;25917:12:0;26103:14;;;;26098:29;;:38;;26084:52;26076:61;;;;;;26151:11;;;;;;;;;;;;;25980:188;-1:-1:-1;;25980:188:0:o;27178:160::-;27251:15;;:::i;:::-;27283:10;27275:19;;;;;;27308:24;;;;;;;;27326:5;27317:4;:6;;;:14;;;;;;27308:24;;27301:31;27178:160;-1:-1:-1;;;27178:160:0:o;26285:193::-;26366:15;;:::i;:::-;26440:6;;26428:7;;26419:16;;;26414:32;;;26406:41;;;;;;26461:11;;;;;;;;;;;;;26285:193;-1:-1:-1;;;26285:193:0:o;22661:177::-;22744:86;22764:5;22794:23;;;22819:2;22823:5;22771:58;;;;;;;;;:::i;93782:441::-;93878:7;;93920:26;:5;93941:4;93920:20;:26::i;:::-;93894:52;-1:-1:-1;93957:20:0;93953:67;;-1:-1:-1;;93995:17:0;;;;93988:24;;93953:67;94056:15;;;;94082:36;;;94078:67;;94136:1;94129:8;;;;;;94078:67;94160:17;;;;94181:35;;94160:57;;-1:-1:-1;93782:441:0;;;;:::o;94456:547::-;94545:7;94561:61;;:::i;:::-;-1:-1:-1;94561:91:0;;;;;;;;;94625:27;;;94561:91;;;94659:58;;:::i;:::-;-1:-1:-1;94659:93:0;;;;;;;;;94720:32;;;94659:93;;;94765:63;:30;94659:93;94765:34;:63::i;:::-;94761:99;;94851:1;94844:8;;;;;;94761:99;94959:20;;94875:122;;:105;;:71;:30;94918:27;94875:42;:71::i;:::-;:83;;:105::i;:::-;:120;:122::i;:::-;94868:129;94456:547;-1:-1:-1;;;;;94456:547:0:o;537:106::-;595:7;626:1;622;:5;:13;;634:1;622:13;;;-1:-1:-1;630:1:0;;615:20;-1:-1:-1;537:106:0:o;102057:124::-;102114:12;102142:5;102157:17;102142:5;102157:15;:17::i;:::-;102142:33;;;;;;;;;;;;;;;;;;102135:40;;102057:124;;;:::o;99372:368::-;99482:7;;;;99561:53;:5;99582:10;99594:7;99603:10;99561:20;:53::i;:::-;99644:20;;;;99507:107;;-1:-1:-1;99507:107:0;-1:-1:-1;99644:41:0;;99507:107;99644:24;:41::i;:::-;99621:20;;;:64;99700:16;;-1:-1:-1;99718:15:0;-1:-1:-1;99372:368:0;;;;;;;:::o;93170:185::-;93254:4;;93274:70;93306:37;:5;93338:4;93306:31;:37::i;:::-;93274:31;;;;;;;;;;;;;;;:70::i;:::-;:75;;;93170:185;-1:-1:-1;;;93170:185:0:o;102378:165::-;102440:7;102456:15;102474:14;:5;:12;:14::i;:::-;102456:32;;102502:35;102514:1;102502:35;;;;;;;;;;;;;-1:-1:-1;;;102502:35:0;;;:7;:11;;:35;;;;;:::i;99006:177::-;99064:7;99080:21;99104:13;:5;:11;:13::i;:::-;99080:37;;99131:46;99145:6;-1:-1:-1;;;;;99145:16:0;;99170:4;99145:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99131:5;;:13;:46::i;24966:761::-;25390:23;25416:69;25444:4;25416:69;;;;;;;;;;;;;;;;;25424:5;-1:-1:-1;;;;;25416:27:0;;;:69;;;;;:::i;:::-;25500:17;;25390:95;;-1:-1:-1;25500:21:0;25496:224;;25642:10;25631:30;;;;;;;;;;;;:::i;:::-;25623:85;;;;-1:-1:-1;;;25623:85:0;;;;;;;:::i;101482:107::-;101554:29;;;;;;;;-1:-1:-1;101554:29:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;101554:29:0;-1:-1:-1;;;;;101554:29:0;;;;;;;;;;;;;;;;;101482:107::o;98061:118::-;98147:13;;:26;;;-1:-1:-1;;;98147:26:0;;;;98124:7;;-1:-1:-1;;;;;98147:13:0;;:24;;:26;;;;;;;;;;;;;;:13;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;99938:680::-;100054:7;100063;100079:21;100103:13;:5;:11;:13::i;:::-;100079:37;;100125:24;100152:6;-1:-1:-1;;;;;100152:16:0;;100169:10;100152:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100125:55;;100187:27;100217:18;:5;:16;:18::i;:::-;100244:13;;:55;;-1:-1:-1;;;100244:55:0;;100187:48;;-1:-1:-1;;;;;;100244:13:0;;:22;;:55;;100267:10;;100279:7;;100288:10;;100244:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;100333:28:0;;-1:-1:-1;;;100333:28:0;;100308:22;;-1:-1:-1;;;;;;100333:16:0;;;-1:-1:-1;100333:16:0;;:28;;100350:10;;100333:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100308:53;-1:-1:-1;100368:24:0;100395:36;100308:53;100414:16;100395:18;:36::i;:::-;100368:63;;100440:25;100468:18;:5;:16;:18::i;:::-;100440:46;-1:-1:-1;100493:23:0;100519:42;:19;100440:46;100519:23;:42::i;:::-;100578:16;;;;-1:-1:-1;99938:680:0;;-1:-1:-1;;;;;;;;;;;99938:680:0:o;27344:221::-;27453:7;;27444:6;;27425;;-1:-1:-1;27440:48:0;;;-1:-1:-1;;;27471:9:0;;27440:48;27509:7;;27500:6;;:16;27496:47;;;-1:-1:-1;27534:1:0;27527:8;;27496:47;-1:-1:-1;27558:1:0;27344:221;;;;:::o;26626:193::-;26707:15;;:::i;:::-;26781:6;;26769:7;;26760:16;;;26755:32;;;26747:41;;;;;26967:205;27040:15;;:::i;:::-;27064:9;27088:10;;;:52;;-1:-1:-1;;27134:6:0;;27107:14;;;;27125:5;27107:14;27125:5;27102:28;;;;;:38;27088:52;27080:61;;;;;27571:105;27655:6;25917:12;27655:15;;;27571:105::o;95495:365::-;95605:30;;:::i;:::-;95647:18;95668:31;:5;95694:4;95668:25;:31::i;:::-;95647:52;-1:-1:-1;95710:15:0;95706:74;;95743:29;:27;:29::i;:::-;95736:36;;;;;95706:74;95793:61;95843:10;95793:45;95817:5;:20;;;95793:23;:45::i;:61::-;95786:68;95495:365;-1:-1:-1;;;;95495:365:0:o;98278:131::-;98381:13;;:21;;;-1:-1:-1;;;98381:21:0;;;;98336:14;;-1:-1:-1;;;;;98381:13:0;;:19;;:21;;;;;;;;;;;;;;:13;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;98535:389::-;98607:7;98697:21;98721:13;:5;:11;:13::i;:::-;98771;;98697:37;;-1:-1:-1;98743:52:0;;-1:-1:-1;;;;;98743:19:0;;;;98771:13;98787:7;98743:19;:52::i;:::-;98802:13;;:30;;-1:-1:-1;;;98802:30:0;;-1:-1:-1;;;;;98802:13:0;;;;:21;;:30;;98824:7;;98802:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;98862:20:0;;;;:33;;-1:-1:-1;98887:7:0;98862:24;:33::i;:::-;98839:20;;;:56;-1:-1:-1;98911:7:0;;-1:-1:-1;98535:389:0;;;;:::o;7369:195::-;7472:12;7504:52;7526:6;7534:4;7540:1;7543:12;7504:21;:52::i;26174:105::-;26221:15;;:::i;:::-;-1:-1:-1;26252:21:0;;;;;;;;;-1:-1:-1;;26252:21:0;;26174:105;:::o;8421:530::-;8548:12;8606:5;8581:21;:30;;8573:81;;;;-1:-1:-1;;;8573:81:0;;;;;;;:::i;:::-;8673:18;8684:6;8673:10;:18::i;:::-;8665:60;;;;-1:-1:-1;;;8665:60:0;;;;;;;:::i;:::-;8799:12;8813:23;8840:6;-1:-1:-1;;;;;8840:11:0;8860:5;8868:4;8840:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8798:75;;;;8891:52;8909:7;8918:10;8930:12;8891:17;:52::i;:::-;8884:59;8421:530;-1:-1:-1;;;;;;;8421:530:0:o;10961:742::-;11076:12;11105:7;11101:595;;;-1:-1:-1;11136:10:0;11129:17;;11101:595;11250:17;;:21;11246:439;;11513:10;11507:17;11574:15;11561:10;11557:2;11553:19;11546:44;11461:148;11656:12;11649:20;;-1:-1:-1;;;11649:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;1575:241;;1679:2;1667:9;1658:7;1654:23;1650:32;1647:2;;;-1:-1;;1685:12;1647:2;85:6;72:20;97:33;124:5;97:33;:::i;1823:366::-;;;1944:2;1932:9;1923:7;1919:23;1915:32;1912:2;;;-1:-1;;1950:12;1912:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2002:63;2102:2;2141:22;;;;1364:20;;-1:-1;;;1906:283::o;2196:397::-;;;2335:2;2323:9;2314:7;2310:23;2306:32;2303:2;;;-1:-1;;2341:12;2303:2;2399:17;2386:31;2437:18;;2429:6;2426:30;2423:2;;;-1:-1;;2459:12;2423:2;2560:6;2549:9;2545:22;;;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;341:6;328:20;2437:18;360:6;357:30;354:2;;;-1:-1;;390:12;354:2;485:3;2335:2;;469:6;465:17;426:6;451:32;;448:41;445:2;;;-1:-1;;492:12;445:2;2335;422:17;;;;;2479:98;;-1:-1;2297:296;;-1:-1;;;;2297:296::o;2600:235::-;;2701:2;2689:9;2680:7;2676:23;2672:32;2669:2;;;-1:-1;;2707:12;2669:2;597:6;584:20;609:30;633:5;609:30;:::i;2842:257::-;;2954:2;2942:9;2933:7;2929:23;2925:32;2922:2;;;-1:-1;;2960:12;2922:2;732:6;726:13;744:30;768:5;744:30;:::i;3106:309::-;;3244:2;3232:9;3223:7;3219:23;3215:32;3212:2;;;-1:-1;;3250:12;3212:2;893:6;887:13;905:56;955:5;905:56;:::i;3718:261::-;;3832:2;3820:9;3811:7;3807:23;3803:32;3800:2;;;-1:-1;;3838:12;3800:2;-1:-1;1235:13;;3794:185;-1:-1;3794:185::o;3986:241::-;;4090:2;4078:9;4069:7;4065:23;4061:32;4058:2;;;-1:-1;;4096:12;4058:2;-1:-1;1364:20;;4052:175;-1:-1;4052:175::o;4504:366::-;;;4625:2;4613:9;4604:7;4600:23;4596:32;4593:2;;;-1:-1;;4631:12;4593:2;-1:-1;;1364:20;;;4783:2;4822:22;;;1364:20;;-1:-1;4587:283::o;18457:271::-;;5417:5;36041:12;5528:52;5573:6;5568:3;5561:4;5554:5;5550:16;5528:52;:::i;:::-;5592:16;;;;;18591:137;-1:-1;;18591:137::o;18735:222::-;-1:-1;;;;;37109:54;;;;5097:37;;18862:2;18847:18;;18833:124::o;18964:349::-;-1:-1;;;;;37109:54;;;;4956:58;;19299:2;19284:18;;18288:37;19127:2;19112:18;;19098:215::o;19320:444::-;-1:-1;;;;;37109:54;;;5097:37;;37109:54;;;;19667:2;19652:18;;5097:37;19750:2;19735:18;;18288:37;;;;19503:2;19488:18;;19474:290::o;20111:432::-;-1:-1;;;;;37109:54;;;;5097:37;;20452:2;20437:18;;18288:37;;;;36700:13;36693:21;20529:2;20514:18;;5211:34;20288:2;20273:18;;20259:284::o;20550:210::-;36700:13;;36693:21;5211:34;;20671:2;20656:18;;20642:118::o;21594:310::-;;21741:2;21762:17;21755:47;6304:5;36041:12;36480:6;21741:2;21730:9;21726:18;36468:19;6398:52;6443:6;36508:14;21730:9;36508:14;21741:2;6424:5;6420:16;6398:52;:::i;:::-;38933:7;38917:14;-1:-1;;38913:28;6462:39;;;;36508:14;6462:39;;21712:192;-1:-1;;21712:192::o;21911:416::-;22111:2;22125:47;;;6738:2;22096:18;;;36468:19;6774:34;36508:14;;;6754:55;6843:28;6829:12;;;6822:50;6891:12;;;22082:245::o;22334:416::-;22534:2;22548:47;;;7142:3;22519:18;;;36468:19;7179:34;36508:14;;;7159:55;7248:34;7234:12;;;7227:56;7317:34;7303:12;;;7296:56;7386:27;7372:12;;;7365:49;7433:13;;;22505:245::o;22757:416::-;22957:2;22971:47;;;7685:2;22942:18;;;36468:19;7721:34;36508:14;;;7701:55;7790:28;7776:12;;;7769:50;7838:12;;;22928:245::o;23180:416::-;23380:2;23394:47;;;8089:2;23365:18;;;36468:19;8125:34;36508:14;;;8105:55;-1:-1;;;8180:12;;;8173:41;8233:12;;;23351:245::o;23603:416::-;23803:2;23817:47;;;8484:2;23788:18;;;36468:19;8520:34;36508:14;;;8500:55;-1:-1;;;8575:12;;;8568:43;8630:12;;;23774:245::o;24026:416::-;24226:2;24240:47;;;8881:2;24211:18;;;36468:19;8917:29;36508:14;;;8897:50;8966:12;;;24197:245::o;24449:416::-;24649:2;24663:47;;;24634:18;;;36468:19;9253:34;36508:14;;;9233:55;9307:12;;;24620:245::o;24872:416::-;25072:2;25086:47;;;9558:2;25057:18;;;36468:19;9594:34;36508:14;;;9574:55;-1:-1;;;9649:12;;;9642:45;9706:12;;;25043:245::o;25295:416::-;25495:2;25509:47;;;9957:2;25480:18;;;36468:19;9993:32;36508:14;;;9973:53;10045:12;;;25466:245::o;25718:416::-;25918:2;25932:47;;;10296:2;25903:18;;;36468:19;10332:34;36508:14;;;10312:55;-1:-1;;;10387:12;;;10380:30;10429:12;;;25889:245::o;26141:416::-;26341:2;26355:47;;;10680:2;26326:18;;;36468:19;10716:34;36508:14;;;10696:55;10785:25;10771:12;;;10764:47;10830:12;;;26312:245::o;26564:416::-;26764:2;26778:47;;;11081:2;26749:18;;;36468:19;11117:28;36508:14;;;11097:49;11165:12;;;26735:245::o;26987:416::-;27187:2;27201:47;;;11416:2;27172:18;;;36468:19;11452:34;36508:14;;;11432:55;11521:33;11507:12;;;11500:55;11574:12;;;27158:245::o;27410:416::-;27610:2;27624:47;;;11825:2;27595:18;;;36468:19;11861:34;36508:14;;;11841:55;-1:-1;;;11916:12;;;11909:36;11964:12;;;27581:245::o;27833:416::-;28033:2;28047:47;;;12215:2;28018:18;;;36468:19;12251:34;36508:14;;;12231:55;-1:-1;;;12306:12;;;12299:27;12345:12;;;28004:245::o;28256:416::-;28456:2;28470:47;;;12596:2;28441:18;;;36468:19;12632:34;36508:14;;;12612:55;-1:-1;;;12687:12;;;12680:25;12724:12;;;28427:245::o;28679:416::-;28879:2;28893:47;;;12975:2;28864:18;;;36468:19;13011:34;36508:14;;;12991:55;-1:-1;;;13066:12;;;13059:28;13106:12;;;28850:245::o;29102:416::-;29302:2;29316:47;;;13357:2;29287:18;;;36468:19;13393:33;36508:14;;;13373:54;13446:12;;;29273:245::o;29525:416::-;29725:2;29739:47;;;13697:2;29710:18;;;36468:19;13733:34;36508:14;;;13713:55;-1:-1;;;13788:12;;;13781:31;13831:12;;;29696:245::o;29948:416::-;30148:2;30162:47;;;14082:2;30133:18;;;36468:19;14118:34;36508:14;;;14098:55;-1:-1;;;14173:12;;;14166:38;14223:12;;;30119:245::o;30371:416::-;30571:2;30585:47;;;30371:416;30556:18;;;36468:19;36508:14;;;30542:245::o;30794:416::-;30994:2;31008:47;;;14745:2;30979:18;;;36468:19;14781:25;36508:14;;;14761:46;14826:12;;;30965:245::o;31217:416::-;31417:2;31431:47;;;15077:2;31402:18;;;36468:19;15113:34;36508:14;;;15093:55;-1:-1;;;15168:12;;;15161:42;15222:12;;;31388:245::o;31640:416::-;31840:2;31854:47;;;15473:2;31825:18;;;36468:19;15509:31;36508:14;;;15489:52;15560:12;;;31811:245::o;32063:416::-;32263:2;32277:47;;;15811:2;32248:18;;;36468:19;15847:34;36508:14;;;15827:55;-1:-1;;;15902:12;;;15895:45;15959:12;;;32234:245::o;32486:416::-;32686:2;32700:47;;;16210:2;32671:18;;;36468:19;16246:34;36508:14;;;16226:55;-1:-1;;;16301:12;;;16294:28;16341:12;;;32657:245::o;32909:416::-;33109:2;33123:47;;;16592:2;33094:18;;;36468:19;16628:34;36508:14;;;16608:55;16697:30;16683:12;;;16676:52;16747:12;;;33080:245::o;33332:416::-;33532:2;33546:47;;;16998:2;33517:18;;;36468:19;17034:34;36508:14;;;17014:55;-1:-1;;;17089:12;;;17082:34;17135:12;;;33503:245::o;33755:416::-;33955:2;33969:47;;;17386:2;33940:18;;;36468:19;17422:33;36508:14;;;17402:54;17475:12;;;33926:245::o;34178:416::-;34378:2;34392:47;;;17726:2;34363:18;;;36468:19;-1:-1;;;36508:14;;;17742:41;17802:12;;;34349:245::o;34601:326::-;18107:23;;18288:37;;34780:2;34765:18;;34751:176::o;34934:222::-;18288:37;;;35061:2;35046:18;;35032:124::o;35163:333::-;18288:37;;;35482:2;35467:18;;18288:37;35318:2;35303:18;;35289:207::o;35503:444::-;18288:37;;;35850:2;35835:18;;18288:37;;;;35933:2;35918:18;;18288:37;35686:2;35671:18;;35657:290::o;38573:268::-;38638:1;38645:101;38659:6;38656:1;38653:13;38645:101;;;38726:11;;;38720:18;38707:11;;;38700:39;38681:2;38674:10;38645:101;;;38761:6;38758:1;38755:13;38752:2;;;-1:-1;;38638:1;38808:16;;38801:27;38622:219::o;38954:117::-;-1:-1;;;;;37109:54;;39013:35;;39003:2;;39062:1;;39052:12;39078:111;39159:5;36700:13;36693:21;39137:5;39134:32;39124:2;;39180:1;;39170:12

Swarm Source

ipfs://2c696dca15596e3abd18da69a0f4eb148bf866bd99df8225d6f4e36b75e04f81

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.