ETH Price: $3,254.36 (+2.63%)
Gas: 2 Gwei

Contract

0x5CEFb9F7c53A1B0C78E239b2445Ddd2d362B7076
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw190406172024-01-19 11:30:11188 days ago1705663811IN
0x5CEFb9F7...d362B7076
0 ETH0.0092604122.4000679
Repay190406122024-01-19 11:29:11188 days ago1705663751IN
0x5CEFb9F7...d362B7076
0 ETH0.0019461521.75811689
Withdraw190405862024-01-19 11:23:59188 days ago1705663439IN
0x5CEFb9F7...d362B7076
0 ETH0.0092995420.35112178
Liquidate185636952023-11-13 14:52:47255 days ago1699887167IN
0x5CEFb9F7...d362B7076
0 ETH0.0919241793
Liquidate185636922023-11-13 14:52:11255 days ago1699887131IN
0x5CEFb9F7...d362B7076
0 ETH0.0761092677
Withdraw172222592023-05-09 10:20:23443 days ago1683627623IN
0x5CEFb9F7...d362B7076
0 ETH0.0395008255.82942272
Repay172222572023-05-09 10:19:47443 days ago1683627587IN
0x5CEFb9F7...d362B7076
0 ETH0.0085764856.70292371
Repay168591762023-03-19 3:44:59495 days ago1679197499IN
0x5CEFb9F7...d362B7076
0 ETH0.0011833111.75100618
Harvest165193562023-01-30 11:31:11542 days ago1675078271IN
0x5CEFb9F7...d362B7076
0 ETH0.0037307116.38916951
Withdraw160205332022-11-21 19:39:35612 days ago1669059575IN
0x5CEFb9F7...d362B7076
0 ETH0.0034751819.28655014
Repay160205202022-11-21 19:36:59612 days ago1669059419IN
0x5CEFb9F7...d362B7076
0 ETH0.0037328733.34887919
Harvest154375172022-08-30 1:23:09696 days ago1661822589IN
0x5CEFb9F7...d362B7076
0 ETH0.0056285425.57138189
Withdraw152962552022-08-07 16:21:43718 days ago1659889303IN
0x5CEFb9F7...d362B7076
0 ETH0.0076994243.92419978
Withdraw152962552022-08-07 16:21:43718 days ago1659889303IN
0x5CEFb9F7...d362B7076
0 ETH0.0057723532.03535247
Repay152925902022-08-07 2:52:14719 days ago1659840734IN
0x5CEFb9F7...d362B7076
0 ETH0.000890199.38690465
Harvest151386212022-07-14 4:38:58743 days ago1657773538IN
0x5CEFb9F7...d362B7076
0 ETH0.0031301514.22079411
Withdraw149476592022-06-12 2:19:32775 days ago1655000372IN
0x5CEFb9F7...d362B7076
0 ETH0.002047931.43999065
Repay149466652022-06-11 22:05:52775 days ago1654985152IN
0x5CEFb9F7...d362B7076
0 ETH0.0055227241.37306261
Mint149466072022-06-11 21:47:59775 days ago1654984079IN
0x5CEFb9F7...d362B7076
0 ETH0.0035353426.12217143
Deposit149466002022-06-11 21:46:15775 days ago1654983975IN
0x5CEFb9F7...d362B7076
0 ETH0.0040941328.21767684
Harvest148208362022-05-22 2:20:39796 days ago1653186039IN
0x5CEFb9F7...d362B7076
0 ETH0.0038798316.03627135
Harvest145966302022-04-16 13:33:04831 days ago1650115984IN
0x5CEFb9F7...d362B7076
0 ETH0.0068466630.07765794
Withdraw145461712022-04-08 16:16:10839 days ago1649434570IN
0x5CEFb9F7...d362B7076
0 ETH0.0082683648.73263095
Harvest145128112022-04-03 11:12:20844 days ago1648984340IN
0x5CEFb9F7...d362B7076
0 ETH0.0129651156.95619734
Liquidate143656592022-03-11 12:53:48867 days ago1647003228IN
0x5CEFb9F7...d362B7076
0 ETH0.0032568313.45
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:
Alchemist

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-03-22
*/

// Sources flattened with hardhat v2.1.1 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/IVaultAdapter.sol

pragma solidity ^0.6.12;

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

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


// File contracts/libraries/alchemist/Vault.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 Vault {
  using Vault for Data;
  using Vault for List;
  using SafeERC20 for IDetailedERC20;
  using SafeMath for uint256;

  struct Data {
    IVaultAdapter 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) internal returns (uint256, uint256) {
    (uint256 _withdrawnAmount, uint256 _decreasedValue) = _self.directWithdraw(_recipient, _amount);
    _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) internal returns (uint256, uint256) {
    IDetailedERC20 _token = _self.token();

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

    _self.adapter.withdraw(_recipient, _amount);

    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);
  }

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

  /// @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/Alchemist.sol

pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

//import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";











// ERC20,removing ERC20 from the alchemist
//    ___    __        __                _               ___                              __         _
//   / _ |  / / ____  / /  ___   __ _   (_) __ __       / _ \  ____ ___   ___ ___   ___  / /_  ___  (_)
//  / __ | / / / __/ / _ \/ -_) /  ' \ / /  \ \ /      / ___/ / __// -_) (_-</ -_) / _ \/ __/ (_-< _
// /_/ |_|/_/  \__/ /_//_/\__/ /_/_/_//_/  /_\_\      /_/    /_/   \__/ /___/\__/ /_//_/\__/ /___/(_)
//
//      ___       __        ______  __    __   _______ .___  ___.  __       _______..___________.
//     /   \     |  |      /      ||  |  |  | |   ____||   \/   | |  |     /       ||           |
//    /  ^  \    |  |     |  ,----'|  |__|  | |  |__   |  \  /  | |  |    |   (----``---|  |----`
//   /  /_\  \   |  |     |  |     |   __   | |   __|  |  |\/|  | |  |     \   \        |  |
//  /  _____  \  |  `----.|  `----.|  |  |  | |  |____ |  |  |  | |  | .----)   |       |  |
// /__/     \__\ |_______| \______||__|  |__| |_______||__|  |__| |__| |_______/        |__|

contract Alchemist is  ReentrancyGuard {
  using CDP for CDP.Data;
  using FixedPointMath for FixedPointMath.uq192x64;
  using Vault for Vault.Data;
  using Vault for Vault.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(
    IVaultAdapter 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 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 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.
  Vault.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;

  constructor(
    IMintableERC20 _token,
    IMintableERC20 _xtoken,
    address _governance,
    address _sentinel
  )
    public
    /*ERC20(
      string(abi.encodePacked("Alchemic ", _token.name())),
      string(abi.encodePacked("al", _token.symbol()))
    )*/
  {
    require(_governance != ZERO_ADDRESS, "Alchemist: governance address cannot be 0x0.");
    require(_sentinel != ZERO_ADDRESS, "Alchemist: sentinel address cannot be 0x0.");

    token = _token;
    xtoken = _xtoken;
    governance = _governance;
    sentinel = _sentinel;
    flushActivator = 100000 ether;// change for non 18 digit tokens

    //_setupDecimals(_token.decimals());
    uint256 COLL_LIMIT = MINIMUM_COLLATERALIZATION_LIMIT.mul(2);
    _ctx.collateralizationLimit = FixedPointMath.uq192x64(COLL_LIMIT);
    _ctx.accumulatedYieldWeight = FixedPointMath.uq192x64(0);
  }

  /// @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, "Alchemist: 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, "Alchemist: 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, "Alchemist: 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, "Alchemist: 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, "Alchemist: harvest fee above maximum.");

    harvestFee = _harvestFee;

    emit HarvestFeeUpdated(_harvestFee);
  }

  /// @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, "Alchemist: collateralization limit below minimum.");
    require(_limit <= MAXIMUM_COLLATERALIZATION_LIMIT, "Alchemist: 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(IVaultAdapter _adapter) external onlyGov {

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

    require(transmuter != ZERO_ADDRESS, "Alchemist: cannot initialize transmuter address to 0x0");
    require(rewards != ZERO_ADDRESS, "Alchemist: 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(IVaultAdapter _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) {

    Vault.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);

        // token.safeTransfer(transmuter, _distributeAmount); previous version call
      }
    }

    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) {
    Vault.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) {

    Vault.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);
  }

  /// @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 _withdrawnAmount, uint256 _decreasedValue) = _withdrawFundsTo(msg.sender, _amount);

    _cdp.totalDeposited = _cdp.totalDeposited.sub(_decreasedValue, "Exceeds withdrawable amount");
    _cdp.checkHealth(_ctx, "Action blocked: unhealthy collateralization ratio");
    if(_amount >= flushActivator) {
      flushActiveVault();
    }
    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, "Alchemist: Loan-to-value ratio breached");
    } else {
      _cdp.totalCredit = _totalCredit.sub(_amount);
    }

    xtoken.mint(msg.sender, _amount);
    if(_amount >= flushActivator) {
      flushActiveVault();
    }
  }

  /// @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 (IVaultAdapter) {
    Vault.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) {
    Vault.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, "Alchemist: 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, "Alchemist: 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(IVaultAdapter _adapter) internal {
    require(_adapter != IVaultAdapter(ZERO_ADDRESS), "Alchemist: active vault address cannot be 0x0.");
    require(_adapter.token() == token, "Alchemist: token mismatch.");

    _vaults.push(Vault.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(), "Alchemist: not an emergency, not governance, and user does not have permission to recall funds from active vault");

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

    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.safeTransfer(_recipient, _bufferedAmount);
    }

    uint256 _totalWithdrawn = _bufferedAmount;
    uint256 _totalDecreasedValue = _bufferedAmount;

    uint256 _remainingAmount = _amount.sub(_bufferedAmount);

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

      _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":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_sentinel","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IVaultAdapter","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":[],"name":"emergencyExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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 IVaultAdapter","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 IVaultAdapter","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 IVaultAdapter","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":"bool","name":"_emergencyExit","type":"bool"}],"name":"setEmergencyExit","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":[],"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":[{"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"}]

60806040523480156200001157600080fd5b506040516200372f3803806200372f83398101604081905262000034916200018a565b60016000556001600160a01b0382166200006b5760405162461bcd60e51b81526004016200006290620001f1565b60405180910390fd5b6001600160a01b038116620000945760405162461bcd60e51b815260040162000062906200027e565b600180546001600160a01b03199081166001600160a01b03878116919091179092556002805482168684161781556003805483168685161790556005805490921692841692909217905569152d02c7e14af6800000600a556000906200011090670de0b6b3a76400009062000141602090811b620019bd17901c565b604080516020808201835290839052600c9290925580519182019052600090819052600d5550620002e19350505050565b600082620001525750600062000184565b828202828482816200016057fe5b0414620001815760405162461bcd60e51b815260040162000062906200023d565b90505b92915050565b60008060008060808587031215620001a0578384fd5b8451620001ad81620002c8565b6020860151909450620001c081620002c8565b6040860151909350620001d381620002c8565b6060860151909250620001e681620002c8565b939692955090935050565b6020808252602c908201527f416c6368656d6973743a20676f7665726e616e6365206164647265737320636160408201526b373737ba10313290183c181760a11b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602a908201527f416c6368656d6973743a2073656e74696e656c20616464726573732063616e6e60408201526937ba10313290183c181760b11b606082015260800190565b6001600160a01b0381168114620002de57600080fd5b50565b61343e80620002f16000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c8063792b55b611610167578063c4d66de8116100ce578063f39c38a011610087578063f39c38a01461052c578063f58c251c14610534578063fc00e8a01461053c578063fc0c546a1461054f578063fefdc5d114610557578063ff50abdc1461056a57610295565b8063c4d66de8146104c5578063ce5494bb146104d8578063d8aed145146104eb578063ddc63262146104fe578063ec38a86214610511578063f0d787a31461052457610295565b8063a7c6a10011610120578063a7c6a10014610469578063aa6e043414610471578063aaf1666014610484578063adb4a9ad14610497578063b5962917146104aa578063b6b55f25146104b257610295565b8063792b55b61461040d5780639a9af221146104205780639ec5a89414610433578063a005fda31461043b578063a0712d6814610443578063a1e401a91461045657610295565b8063415f12401161020b57806353ffa18b116101c457806353ffa18b146103c75780635641ec03146103da5780635a9b5e92146103e25780635aa6e675146103f55780636b9f96ea146103fd5780637239d2b91461040557610295565b8063415f12401461036957806345ee07551461037c57806345f867b31461038f5780634aaf7c65146103975780634c3a8e02146103ac578063538ba4f9146103bf57610295565b806322c37b751161025d57806322c37b751461030a578063238efcbc1461031d5780632670fdd8146103255780632e1a7d4d1461033857806330d4d190146103595780633847f0381461036157610295565b80630510111e1461029a57806309dac061146102b85780630abb6035146102cd578063158ef93e146102e05780631718a68f146102f5575b600080fd5b6102a2610572565b6040516102af9190613334565b60405180910390f35b6102cb6102c6366004612a4e565b61057e565b005b6102cb6102db366004612a4e565b61062d565b6102e86106c8565b6040516102af9190612ba7565b6102fd6106d1565b6040516102af9190612b56565b6102cb610318366004612b01565b6106e0565b6102cb61070f565b6102fd610333366004612b01565b61078a565b61034b610346366004612b01565b6107a9565b6040516102af92919061333d565b6102a261094a565b6102a2610956565b61034b610377366004612b01565b61095c565b6102cb61038a366004612a95565b610b44565b6102a2610bc6565b61039f610bcc565b6040516102af919061332a565b61034b6103ba366004612b01565b610be8565b6102fd610c62565b6102cb6103d5366004612b01565b610c67565b6102e8610d21565b6102cb6103f0366004612a6a565b610d2f565b6102fd610d7f565b6102a2610d8e565b6102fd610e14565b6102cb61041b366004612b01565b610e23565b6102a261042e366004612a4e565b610ea4565b6102fd610ec2565b6102fd610ed1565b6102cb610451366004612b01565b610ee0565b6102a2610464366004612a4e565b611114565b6102a261112f565b6102a261047f366004612a4e565b611140565b6102a2610492366004612b01565b61116a565b6102cb6104a5366004612a4e565b611183565b6102a261121e565b6102cb6104c0366004612b01565b611224565b6102cb6104d3366004612a4e565b611373565b6102cb6104e6366004612a4e565b611429565b6102cb6104f9366004612b19565b611481565b61034b61050c366004612b01565b611736565b6102cb61051f366004612a4e565b61186f565b6102a261190a565b6102fd611910565b6102fd61191f565b6102a261054a366004612a4e565b61192e565b6102fd611951565b61034b610565366004612b19565b611960565b6102a26119b7565b673782dace9d90000081565b6003546001600160a01b031633146105b15760405162461bcd60e51b81526004016105a890612f1f565b60405180910390fd5b6001600160a01b0381166105d75760405162461bcd60e51b81526004016105a8906131af565b600580546001600160a01b0319166001600160a01b0383161790556040517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb990610622908390612b56565b60405180910390a150565b6003546001600160a01b031633146106575760405162461bcd60e51b81526004016105a890612f1f565b6001600160a01b03811661067d5760405162461bcd60e51b81526004016105a890612c31565b600480546001600160a01b0319166001600160a01b0383161790556040517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e783990610622908390612b56565b600b5460ff1681565b6002546001600160a01b031681565b6003546001600160a01b0316331461070a5760405162461bcd60e51b81526004016105a890612f1f565b600a55565b6004546001600160a01b031633146107395760405162461bcd60e51b81526004016105a890612fdc565b600454600380546001600160a01b0319166001600160a01b0390921691821790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab90610622908390612b56565b600080610798600f84611a00565b546001600160a01b03169392505050565b600080600260005414156107cf5760405162461bcd60e51b81526004016105a8906131f9565b60026000556107dd33611a27565b1580156107e957503332145b6108055760405162461bcd60e51b81526004016105a890612d5d565b600b5460ff166108275760405162461bcd60e51b81526004016105a89061312e565b336000908152600e60205260409020600381015443116108595760405162461bcd60e51b81526004016105a890613013565b61086481600c611a2d565b6000806108713387611a89565b60408051808201909152601b81527f4578636565647320776974686472617761626c6520616d6f756e740000000000602082015285549294509092506108b991908390611bb4565b8355604080516060810190915260318082526108e291600c916133b16020830139859190611be0565b600a5486106108f5576108f3611c0f565b505b336001600160a01b03167fb3ad69dc1d2c6b1f5f5b0927ffd8ee8f1437a156253c8f6dccc75e6f8e4fd38b8784846040516109329392919061334b565b60405180910390a26001600055909590945092505050565b670de0b6b3a764000081565b60115481565b600080600260005414156109825760405162461bcd60e51b81526004016105a8906131f9565b600260005561099033611a27565b15801561099c57503332145b6109b85760405162461bcd60e51b81526004016105a890612d5d565b60115415610a6257601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610a0557600080fd5b505afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190612ae9565b90506011548111610a605760405162461bcd60e51b81526004016105a8906132b5565b505b600b5460ff16610a845760405162461bcd60e51b81526004016105a89061312e565b336000908152600e60205260409020610a9e81600c611a2d565b8060010154841115610ab257806001015493505b600080610abf3087611a89565b91509150610acc82611c68565b6040805160208101909152600081528354610ae8918390611bb4565b83556040805160208101909152600081526001840154610b09918490611bb4565b600184015560405133907f3ea051727656be6fd11c2260f244f29ff3c70d1fb077bfa73e89d554e9bb95c7906109329089908690869061334b565b6003546001600160a01b0316331480610b6757506005546001600160a01b031633145b610b835760405162461bcd60e51b81526004016105a890613013565b600b805461ff001916610100831515021790556040517ff0064f2efd0da4bc63eecf2e75590fe8a308eaa526a51c334e50eec09a71104990610622908390612ba7565b61271081565b610bd4612a3b565b506040805160208101909152600c54815290565b60008060026000541415610c0e5760405162461bcd60e51b81526004016105a8906131f9565b6002600055600b5460ff16610c355760405162461bcd60e51b81526004016105a89061312e565b6000610c42600f85611a00565b9050610c52848260010154611dba565b6001600055909590945092505050565b600081565b6003546001600160a01b03163314610c915760405162461bcd60e51b81526004016105a890612f1f565b670de0b6b3a7640000811015610cb95760405162461bcd60e51b81526004016105a890612e7d565b673782dace9d900000811115610ce15760405162461bcd60e51b81526004016105a890612ece565b60408051602081018252829052600c829055517ff78180bc708b1292177c888900951cd66a39faf48dc7b6d111e93285dbbe55a090610622908390613334565b600b54610100900460ff1681565b6003546001600160a01b03163314610d595760405162461bcd60e51b81526004016105a890612f1f565b601080546001600160a01b0319166001600160a01b039390931692909217909155601155565b6003546001600160a01b031681565b600060026000541415610db35760405162461bcd60e51b81526004016105a8906131f9565b6002600055600b5460ff16610dda5760405162461bcd60e51b81526004016105a89061312e565b600b54610100900460ff1615610e025760405162461bcd60e51b81526004016105a890613024565b610e0a611c0f565b9050600160005590565b6006546001600160a01b031681565b6003546001600160a01b03163314610e4d5760405162461bcd60e51b81526004016105a890612f1f565b612710811115610e6f5760405162461bcd60e51b81526004016105a890612f97565b60088190556040517fc36862a253ff42cc71f4f200d3c62e8e5eaaece01041fc6900aeace64ade72a890610622908390613334565b6001600160a01b03166000908152600e602052604090206003015490565b6007546001600160a01b031681565b6010546001600160a01b031681565b60026000541415610f035760405162461bcd60e51b81526004016105a8906131f9565b6002600055610f1133611a27565b158015610f1d57503332145b610f395760405162461bcd60e51b81526004016105a890612d5d565b60115415610fe357601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610f8657600080fd5b505afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe9190612ae9565b90506011548111610fe15760405162461bcd60e51b81526004016105a8906132b5565b505b600b5460ff166110055760405162461bcd60e51b81526004016105a89061312e565b336000908152600e6020526040902061101f81600c611a2d565b6002810154828110156110835760006110388483611e76565b600184015490915061104a9082611e9e565b6001840155600060028401556040805160608101909152602780825261107d91600c916133e26020830139859190611be0565b50611093565b61108d8184611e76565b60028301555b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906110c59033908790600401612b6a565b600060405180830381600087803b1580156110df57600080fd5b505af11580156110f3573d6000803e3d6000fd5b50505050600a54831061110a57611108611c0f565b505b5050600160005550565b6001600160a01b03166000908152600e602052604090205490565b600061113b600f611ec3565b905090565b6001600160a01b0381166000908152600e6020526040812061116381600c611ec7565b9392505050565b600080611178600f84611a00565b600101549392505050565b6003546001600160a01b031633146111ad5760405162461bcd60e51b81526004016105a890612f1f565b6001600160a01b0381166111d35760405162461bcd60e51b81526004016105a890612be5565b600680546001600160a01b0319166001600160a01b0383161790556040517fe42bb1780117f5788c6e0042e955291223819875891ddf465b8e4fbb85a933e990610622908390612b56565b60085481565b600260005414156112475760405162461bcd60e51b81526004016105a8906131f9565b600260005561125533611a27565b15801561126157503332145b61127d5760405162461bcd60e51b81526004016105a890612d5d565b600b5460ff1661129f5760405162461bcd60e51b81526004016105a89061312e565b600b54610100900460ff16156112c75760405162461bcd60e51b81526004016105a890613024565b336000908152600e602052604090206112e181600c611a2d565b6001546112f9906001600160a01b0316333085611f06565b600a54821061130c5761130a611c0f565b505b6009546113199083611e9e565b60095580546113289083611e9e565b815543600382015560405133907f59062170a285eb80e8c6b8ced60428442a51910635005233fc4ce084a475845e90611362908590613334565b60405180910390a250506001600055565b6003546001600160a01b0316331461139d5760405162461bcd60e51b81526004016105a890612f1f565b600b5460ff16156113c05760405162461bcd60e51b81526004016105a890612d92565b6006546001600160a01b03166113e85760405162461bcd60e51b81526004016105a890612c7d565b6007546001600160a01b03166114105760405162461bcd60e51b81526004016105a890612d0a565b61141981611f5e565b50600b805460ff19166001179055565b600b5460ff1661144b5760405162461bcd60e51b81526004016105a89061312e565b6003546001600160a01b031633146114755760405162461bcd60e51b81526004016105a890612f1f565b61147e81611f5e565b50565b600260005414156114a45760405162461bcd60e51b81526004016105a8906131f9565b60026000556114b233611a27565b1580156114be57503332145b6114da5760405162461bcd60e51b81526004016105a890612d5d565b6011541561158457601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190612ae9565b905060115481116115825760405162461bcd60e51b81526004016105a8906132b5565b505b600b5460ff166115a65760405162461bcd60e51b81526004016105a89061312e565b336000908152600e602052604090206115c081600c611a2d565b82156115e7576001546115de906001600160a01b0316333086611f06565b6115e783611c68565b81156116b45760025460405163079cc67960e41b81526001600160a01b03909116906379cc67909061161f9033908690600401612b6a565b600060405180830381600087803b15801561163957600080fd5b505af115801561164d573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb9150611681908590600401613334565b600060405180830381600087803b15801561169b57600080fd5b505af11580156116af573d6000803e3d6000fd5b505050505b60006116c08484611e9e565b90506116ea81604051806020016040528060008152508460010154611bb49092919063ffffffff16565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90611723908790879061333d565b60405180910390a2505060016000555050565b600b54600090819060ff1661175d5760405162461bcd60e51b81526004016105a89061312e565b600061176a600f85611a00565b90506000806117798330612089565b9092509050811561182b5760006117a76127106117a1600854866119bd90919063ffffffff16565b906120dc565b905060006117b58483611e76565b90506117bf612a3b565b6117d46009546117ce8461210e565b90612150565b6040805160208101909152600d5481529091506117f19082612184565b51600d55821561181857600754600154611818916001600160a01b039182169116856121b4565b81156118275761182782611c68565b5050505b7f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f09828260405161185c92919061333d565b60405180910390a1909350915050915091565b6003546001600160a01b031633146118995760405162461bcd60e51b81526004016105a890612f1f565b6001600160a01b0381166118bf5760405162461bcd60e51b81526004016105a8906132e1565b600780546001600160a01b0319166001600160a01b0383161790556040517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf90610622908390612b56565b600a5481565b6004546001600160a01b031681565b6005546001600160a01b031681565b6001600160a01b0381166000908152600e6020526040812061116381600c6121d8565b6001546001600160a01b031681565b600080600260005414156119865760405162461bcd60e51b81526004016105a8906131f9565b6002600055600b5460ff166119ad5760405162461bcd60e51b81526004016105a89061312e565b610c528484611dba565b60095481565b6000826119cc575060006119fa565b828202828482816119d957fe5b04146119f75760405162461bcd60e51b81526004016105a890612f56565b90505b92915050565b6000826000018281548110611a1157fe5b9060005260206000209060020201905092915050565b3b151590565b6000611a39838361221f565b90508260010154811115611a67576001830180546000909155611a5c8282611e76565b600285015550611a7c565b6001830154611a769082611e76565b60018401555b5060010154600490910155565b6001546040516370a0823160e01b815260009182918291611b199186916001600160a01b0316906370a0823190611ac4903090600401612b56565b60206040518083038186803b158015611adc57600080fd5b505afa158015611af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b149190612ae9565b612298565b90506001600160a01b0385163014611b4257600154611b42906001600160a01b031686836121b4565b80806000611b508783611e76565b90508015611b95576000611b64600f6122ae565b9050600080611b74838c866122d9565b9092509050611b838683611e9e565b9550611b8f8582611e9e565b94505050505b600954611ba29083611e76565b600955509093509150505b9250929050565b60008184841115611bd85760405162461bcd60e51b81526004016105a89190612bb2565b505050900390565b611bea838361230f565b8190611c095760405162461bcd60e51b81526004016105a89190612bb2565b50505050565b600080611c1c600f6122ae565b90506000611c298261233d565b90507f860f4701faa0ecdeecd9e9eaae11a8612bbd01c663081f7c0c4e4873df653d6981604051611c5a9190613334565b60405180910390a191505090565b60015460065460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611c9e929116908590600401612b6a565b602060405180830381600087803b158015611cb857600080fd5b505af1158015611ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf09190612ab1565b50600654604051631f72642160e31b81526001600160a01b039091169063fb93210890611d239030908590600401612b6a565b600060405180830381600087803b158015611d3d57600080fd5b505af1158015611d51573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb9150611d85908490600401613334565b600060405180830381600087803b158015611d9f57600080fd5b505af1158015611db3573d6000803e3d6000fd5b5050505050565b600b546000908190610100900460ff1680611ddf57506003546001600160a01b031633145b80611df35750611def600f6123d1565b8414155b611e0f5760405162461bcd60e51b81526004016105a890613092565b6000611e1c600f86611a00565b9050600080611e2c8330886122d9565b91509150867fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a4996478383604051611e6292919061333d565b60405180910390a290969095509350505050565b600082821115611e985760405162461bcd60e51b81526004016105a890612dc9565b50900390565b6000828201838110156119f75760405162461bcd60e51b81526004016105a890612cd3565b5490565b600080611ed4848461221f565b905080611ee757505060018201546119fa565b6001840154808210611efe576000925050506119fa565b039392505050565b611c09846323b872dd60e01b858585604051602401611f2793929190612b83565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261241e565b6001600160a01b038116611f845760405162461bcd60e51b81526004016105a890613267565b60015460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b158015611fcb57600080fd5b505afa158015611fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120039190612acd565b6001600160a01b0316146120295760405162461bcd60e51b81526004016105a890613230565b604080518082019091526001600160a01b03821681526000602082015261205290600f906124ad565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b600080836001015461209a856124f0565b116120aa57506000905080611bad565b60006120c385600101546120bd876124f0565b90611e76565b90506120d085858361256c565b92509250509250929050565b60008082116120fd5760405162461bcd60e51b81526004016105a890612e46565b81838161210657fe5b049392505050565b612116612a3b565b6000821580612133575050670de0b6b3a764000082810290810483145b61213c57600080fd5b604080516020810190915290815292915050565b612158612a3b565b8161216257600080fd5b60405180602001604052808385600001518161217a57fe5b0490529392505050565b61218c612a3b565b8251825181019081101561219f57600080fd5b60408051602081019091529081529392505050565b6121d38363a9059cbb60e01b8484604051602401611f27929190612b6a565b505050565b6000806121e5848461221f565b9050806121f857505060028201546119fa565b600184015480821161220f576000925050506119fa565b6002850154910301905092915050565b6000612229612a3b565b50604080516020810190915260018301548152612244612a3b565b506040805160208101909152600485015481526122618282612726565b612270576000925050506119fa565b845461228f9061228a906122848585612757565b90612772565b6127a0565b95945050505050565b60008183106122a757816119f7565b5090919050565b6000816122ba816123d1565b815481106122c457fe5b90600052602060002090600202019050919050565b60008080806122e987878761256c565b600189015491935091506122fd9082611e76565b60018801559092509050935093915050565b60008061233461231f85856127af565b60408051602081019091528554815290612726565b13159392505050565b600080612349836127f3565b9050611163816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161237a9190612b56565b60206040518083038186803b15801561239257600080fd5b505afa1580156123a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ca9190612ae9565b849061286f565b6000806123dd83611ec3565b90506111636001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b81525083611bb49092919063ffffffff16565b6060612473826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129169092919063ffffffff16565b8051909150156121d357808060200190518101906124919190612ab1565b6121d35760405162461bcd60e51b81526004016105a890613165565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b15801561253457600080fd5b505afa158015612548573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612ae9565b600080600061257a866127f3565b90506000816001600160a01b03166370a08231876040518263ffffffff1660e01b81526004016125aa9190612b56565b60206040518083038186803b1580156125c257600080fd5b505afa1580156125d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fa9190612ae9565b90506000612607886124f0565b885460405163f3fef3a360e01b81529192506001600160a01b03169063f3fef3a390612639908a908a90600401612b6a565b600060405180830381600087803b15801561265357600080fd5b505af1158015612667573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a082319061269a908b90600401612b56565b60206040518083038186803b1580156126b257600080fd5b505afa1580156126c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ea9190612ae9565b905060006126f88285611e76565b905060006127058b6124f0565b905060006127138583611e76565b929c929b50919950505050505050505050565b80518251600091111561273c57506000196119fa565b81518351111561274e575060016119fa565b50600092915050565b61275f612a3b565b8251825181039081111561219f57600080fd5b61277a612a3b565b600082158061279757505082518281029083828161279457fe5b04145b61219f57600080fd5b51670de0b6b3a7640000900490565b6127b7612a3b565b60006127c38484611ec7565b9050806127da576127d2612925565b9150506119fa565b6127eb816117ce866000015461210e565b949350505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b15801561283757600080fd5b505afa15801561284b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612acd565b60008061287b846127f3565b8454909150612897906001600160a01b038084169116856121b4565b835460405163b6b55f2560e01b81526001600160a01b039091169063b6b55f25906128c6908690600401613334565b600060405180830381600087803b1580156128e057600080fd5b505af11580156128f4573d6000803e3d6000fd5b5050506001850154612907915084611e9e565b60018501555081905092915050565b60606127eb8484600085612941565b61292d612a3b565b506040805160208101909152600019815290565b6060824710156129635760405162461bcd60e51b81526004016105a890612e00565b61296c85611a27565b6129885760405162461bcd60e51b81526004016105a89061305b565b60006060866001600160a01b031685876040516129a59190612b3a565b60006040518083038185875af1925050503d80600081146129e2576040519150601f19603f3d011682016040523d82523d6000602084013e6129e7565b606091505b50915091506129f7828286612a02565b979650505050505050565b60608315612a11575081611163565b825115612a215782518084602001fd5b8160405162461bcd60e51b81526004016105a89190612bb2565b6040518060200160405280600081525090565b600060208284031215612a5f578081fd5b81356119f78161338d565b60008060408385031215612a7c578081fd5b8235612a878161338d565b946020939093013593505050565b600060208284031215612aa6578081fd5b81356119f7816133a2565b600060208284031215612ac2578081fd5b81516119f7816133a2565b600060208284031215612ade578081fd5b81516119f78161338d565b600060208284031215612afa578081fd5b5051919050565b600060208284031215612b12578081fd5b5035919050565b60008060408385031215612b2b578182fd5b50508035926020909101359150565b60008251612b4c818460208701613361565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b6000602082528251806020840152612bd1816040850160208701613361565b601f01601f19169190910160400192915050565b6020808252602c908201527f416c6368656d6973743a207472616e736d75746572206164647265737320636160408201526b373737ba10313290183c181760a11b606082015260800190565b6020808252602c908201527f416c6368656d6973743a20676f7665726e616e6365206164647265737320636160408201526b373737ba10313290183c181760a11b606082015260800190565b60208082526036908201527f416c6368656d6973743a2063616e6e6f7420696e697469616c697a652074726160408201527506e736d75746572206164647265737320746f203078360541b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526033908201527f416c6368656d6973743a2063616e6e6f7420696e697469616c697a6520726577604082015272061726473206164647265737320746f2030783606c1b606082015260800190565b6020808252818101527f536f72727920776520646f206e6f742061636365707420636f6e747261637421604082015260600190565b6020808252601e908201527f416c6368656d6973743a20616c726561647920696e697469616c697a65640000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526031908201527f416c6368656d6973743a20636f6c6c61746572616c697a6174696f6e206c696d60408201527034ba103132b637bb9036b4b734b6bab69760791b606082015260800190565b60208082526031908201527f416c6368656d6973743a20636f6c6c61746572616c697a6174696f6e206c696d60408201527034ba1030b137bb329036b0bc34b6bab69760791b606082015260800190565b6020808252601b908201527f416c6368656d6973743a206f6e6c7920676f7665726e616e63652e0000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526025908201527f416c6368656d6973743a2068617276657374206665652061626f7665206d617860408201526434b6bab69760d91b606082015260800190565b6020808252601f908201527f73656e646572206973206e6f742070656e64696e67476f7665726e616e636500604082015260600190565b602080825260009082015260400190565b60208082526017908201527f656d657267656e637920706175736520656e61626c6564000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526070908201527f416c6368656d6973743a206e6f7420616e20656d657267656e63792c206e6f7460408201527f20676f7665726e616e63652c20616e64207573657220646f6573206e6f74206860608201527f617665207065726d697373696f6e20746f20726563616c6c2066756e6473206660808201526f1c9bdb481858dd1a5d99481d985d5b1d60821b60a082015260c00190565b6020808252601b908201527f416c6368656d6973743a206e6f7420696e697469616c697a65642e0000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252602a908201527f416c6368656d6973743a2073656e74696e656c20616464726573732063616e6e60408201526937ba10313290183c181760b11b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601a908201527f416c6368656d6973743a20746f6b656e206d69736d617463682e000000000000604082015260600190565b6020808252602e908201527f416c6368656d6973743a20616374697665207661756c7420616464726573732060408201526d31b0b73737ba10313290183c181760911b606082015260800190565b60208082526012908201527137b333103832b3903634b6b4ba30ba34b7b760711b604082015260600190565b60208082526029908201527f416c6368656d6973743a207265776172647320616464726573732063616e6e6f6040820152683a10313290183c181760b91b606082015260800190565b9051815260200190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60005b8381101561337c578181015183820152602001613364565b83811115611c095750506000910152565b6001600160a01b038116811461147e57600080fd5b801515811461147e57600080fdfe416374696f6e20626c6f636b65643a20756e6865616c74687920636f6c6c61746572616c697a6174696f6e20726174696f416c6368656d6973743a204c6f616e2d746f2d76616c756520726174696f206272656163686564a2646970667358221220cd3b5d2604a21c12484c7b9c568c0e3e55c9a74979dabde0e98e5a6c4b7f61b164736f6c634300060c00330000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000c2db4c131adaf01c15a1db654c040c8578929d5500000000000000000000000023ae8682437004044c0eddc7cee3bf632349062e0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d3798

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102955760003560e01c8063792b55b611610167578063c4d66de8116100ce578063f39c38a011610087578063f39c38a01461052c578063f58c251c14610534578063fc00e8a01461053c578063fc0c546a1461054f578063fefdc5d114610557578063ff50abdc1461056a57610295565b8063c4d66de8146104c5578063ce5494bb146104d8578063d8aed145146104eb578063ddc63262146104fe578063ec38a86214610511578063f0d787a31461052457610295565b8063a7c6a10011610120578063a7c6a10014610469578063aa6e043414610471578063aaf1666014610484578063adb4a9ad14610497578063b5962917146104aa578063b6b55f25146104b257610295565b8063792b55b61461040d5780639a9af221146104205780639ec5a89414610433578063a005fda31461043b578063a0712d6814610443578063a1e401a91461045657610295565b8063415f12401161020b57806353ffa18b116101c457806353ffa18b146103c75780635641ec03146103da5780635a9b5e92146103e25780635aa6e675146103f55780636b9f96ea146103fd5780637239d2b91461040557610295565b8063415f12401461036957806345ee07551461037c57806345f867b31461038f5780634aaf7c65146103975780634c3a8e02146103ac578063538ba4f9146103bf57610295565b806322c37b751161025d57806322c37b751461030a578063238efcbc1461031d5780632670fdd8146103255780632e1a7d4d1461033857806330d4d190146103595780633847f0381461036157610295565b80630510111e1461029a57806309dac061146102b85780630abb6035146102cd578063158ef93e146102e05780631718a68f146102f5575b600080fd5b6102a2610572565b6040516102af9190613334565b60405180910390f35b6102cb6102c6366004612a4e565b61057e565b005b6102cb6102db366004612a4e565b61062d565b6102e86106c8565b6040516102af9190612ba7565b6102fd6106d1565b6040516102af9190612b56565b6102cb610318366004612b01565b6106e0565b6102cb61070f565b6102fd610333366004612b01565b61078a565b61034b610346366004612b01565b6107a9565b6040516102af92919061333d565b6102a261094a565b6102a2610956565b61034b610377366004612b01565b61095c565b6102cb61038a366004612a95565b610b44565b6102a2610bc6565b61039f610bcc565b6040516102af919061332a565b61034b6103ba366004612b01565b610be8565b6102fd610c62565b6102cb6103d5366004612b01565b610c67565b6102e8610d21565b6102cb6103f0366004612a6a565b610d2f565b6102fd610d7f565b6102a2610d8e565b6102fd610e14565b6102cb61041b366004612b01565b610e23565b6102a261042e366004612a4e565b610ea4565b6102fd610ec2565b6102fd610ed1565b6102cb610451366004612b01565b610ee0565b6102a2610464366004612a4e565b611114565b6102a261112f565b6102a261047f366004612a4e565b611140565b6102a2610492366004612b01565b61116a565b6102cb6104a5366004612a4e565b611183565b6102a261121e565b6102cb6104c0366004612b01565b611224565b6102cb6104d3366004612a4e565b611373565b6102cb6104e6366004612a4e565b611429565b6102cb6104f9366004612b19565b611481565b61034b61050c366004612b01565b611736565b6102cb61051f366004612a4e565b61186f565b6102a261190a565b6102fd611910565b6102fd61191f565b6102a261054a366004612a4e565b61192e565b6102fd611951565b61034b610565366004612b19565b611960565b6102a26119b7565b673782dace9d90000081565b6003546001600160a01b031633146105b15760405162461bcd60e51b81526004016105a890612f1f565b60405180910390fd5b6001600160a01b0381166105d75760405162461bcd60e51b81526004016105a8906131af565b600580546001600160a01b0319166001600160a01b0383161790556040517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb990610622908390612b56565b60405180910390a150565b6003546001600160a01b031633146106575760405162461bcd60e51b81526004016105a890612f1f565b6001600160a01b03811661067d5760405162461bcd60e51b81526004016105a890612c31565b600480546001600160a01b0319166001600160a01b0383161790556040517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e783990610622908390612b56565b600b5460ff1681565b6002546001600160a01b031681565b6003546001600160a01b0316331461070a5760405162461bcd60e51b81526004016105a890612f1f565b600a55565b6004546001600160a01b031633146107395760405162461bcd60e51b81526004016105a890612fdc565b600454600380546001600160a01b0319166001600160a01b0390921691821790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab90610622908390612b56565b600080610798600f84611a00565b546001600160a01b03169392505050565b600080600260005414156107cf5760405162461bcd60e51b81526004016105a8906131f9565b60026000556107dd33611a27565b1580156107e957503332145b6108055760405162461bcd60e51b81526004016105a890612d5d565b600b5460ff166108275760405162461bcd60e51b81526004016105a89061312e565b336000908152600e60205260409020600381015443116108595760405162461bcd60e51b81526004016105a890613013565b61086481600c611a2d565b6000806108713387611a89565b60408051808201909152601b81527f4578636565647320776974686472617761626c6520616d6f756e740000000000602082015285549294509092506108b991908390611bb4565b8355604080516060810190915260318082526108e291600c916133b16020830139859190611be0565b600a5486106108f5576108f3611c0f565b505b336001600160a01b03167fb3ad69dc1d2c6b1f5f5b0927ffd8ee8f1437a156253c8f6dccc75e6f8e4fd38b8784846040516109329392919061334b565b60405180910390a26001600055909590945092505050565b670de0b6b3a764000081565b60115481565b600080600260005414156109825760405162461bcd60e51b81526004016105a8906131f9565b600260005561099033611a27565b15801561099c57503332145b6109b85760405162461bcd60e51b81526004016105a890612d5d565b60115415610a6257601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610a0557600080fd5b505afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190612ae9565b90506011548111610a605760405162461bcd60e51b81526004016105a8906132b5565b505b600b5460ff16610a845760405162461bcd60e51b81526004016105a89061312e565b336000908152600e60205260409020610a9e81600c611a2d565b8060010154841115610ab257806001015493505b600080610abf3087611a89565b91509150610acc82611c68565b6040805160208101909152600081528354610ae8918390611bb4565b83556040805160208101909152600081526001840154610b09918490611bb4565b600184015560405133907f3ea051727656be6fd11c2260f244f29ff3c70d1fb077bfa73e89d554e9bb95c7906109329089908690869061334b565b6003546001600160a01b0316331480610b6757506005546001600160a01b031633145b610b835760405162461bcd60e51b81526004016105a890613013565b600b805461ff001916610100831515021790556040517ff0064f2efd0da4bc63eecf2e75590fe8a308eaa526a51c334e50eec09a71104990610622908390612ba7565b61271081565b610bd4612a3b565b506040805160208101909152600c54815290565b60008060026000541415610c0e5760405162461bcd60e51b81526004016105a8906131f9565b6002600055600b5460ff16610c355760405162461bcd60e51b81526004016105a89061312e565b6000610c42600f85611a00565b9050610c52848260010154611dba565b6001600055909590945092505050565b600081565b6003546001600160a01b03163314610c915760405162461bcd60e51b81526004016105a890612f1f565b670de0b6b3a7640000811015610cb95760405162461bcd60e51b81526004016105a890612e7d565b673782dace9d900000811115610ce15760405162461bcd60e51b81526004016105a890612ece565b60408051602081018252829052600c829055517ff78180bc708b1292177c888900951cd66a39faf48dc7b6d111e93285dbbe55a090610622908390613334565b600b54610100900460ff1681565b6003546001600160a01b03163314610d595760405162461bcd60e51b81526004016105a890612f1f565b601080546001600160a01b0319166001600160a01b039390931692909217909155601155565b6003546001600160a01b031681565b600060026000541415610db35760405162461bcd60e51b81526004016105a8906131f9565b6002600055600b5460ff16610dda5760405162461bcd60e51b81526004016105a89061312e565b600b54610100900460ff1615610e025760405162461bcd60e51b81526004016105a890613024565b610e0a611c0f565b9050600160005590565b6006546001600160a01b031681565b6003546001600160a01b03163314610e4d5760405162461bcd60e51b81526004016105a890612f1f565b612710811115610e6f5760405162461bcd60e51b81526004016105a890612f97565b60088190556040517fc36862a253ff42cc71f4f200d3c62e8e5eaaece01041fc6900aeace64ade72a890610622908390613334565b6001600160a01b03166000908152600e602052604090206003015490565b6007546001600160a01b031681565b6010546001600160a01b031681565b60026000541415610f035760405162461bcd60e51b81526004016105a8906131f9565b6002600055610f1133611a27565b158015610f1d57503332145b610f395760405162461bcd60e51b81526004016105a890612d5d565b60115415610fe357601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610f8657600080fd5b505afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe9190612ae9565b90506011548111610fe15760405162461bcd60e51b81526004016105a8906132b5565b505b600b5460ff166110055760405162461bcd60e51b81526004016105a89061312e565b336000908152600e6020526040902061101f81600c611a2d565b6002810154828110156110835760006110388483611e76565b600184015490915061104a9082611e9e565b6001840155600060028401556040805160608101909152602780825261107d91600c916133e26020830139859190611be0565b50611093565b61108d8184611e76565b60028301555b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906110c59033908790600401612b6a565b600060405180830381600087803b1580156110df57600080fd5b505af11580156110f3573d6000803e3d6000fd5b50505050600a54831061110a57611108611c0f565b505b5050600160005550565b6001600160a01b03166000908152600e602052604090205490565b600061113b600f611ec3565b905090565b6001600160a01b0381166000908152600e6020526040812061116381600c611ec7565b9392505050565b600080611178600f84611a00565b600101549392505050565b6003546001600160a01b031633146111ad5760405162461bcd60e51b81526004016105a890612f1f565b6001600160a01b0381166111d35760405162461bcd60e51b81526004016105a890612be5565b600680546001600160a01b0319166001600160a01b0383161790556040517fe42bb1780117f5788c6e0042e955291223819875891ddf465b8e4fbb85a933e990610622908390612b56565b60085481565b600260005414156112475760405162461bcd60e51b81526004016105a8906131f9565b600260005561125533611a27565b15801561126157503332145b61127d5760405162461bcd60e51b81526004016105a890612d5d565b600b5460ff1661129f5760405162461bcd60e51b81526004016105a89061312e565b600b54610100900460ff16156112c75760405162461bcd60e51b81526004016105a890613024565b336000908152600e602052604090206112e181600c611a2d565b6001546112f9906001600160a01b0316333085611f06565b600a54821061130c5761130a611c0f565b505b6009546113199083611e9e565b60095580546113289083611e9e565b815543600382015560405133907f59062170a285eb80e8c6b8ced60428442a51910635005233fc4ce084a475845e90611362908590613334565b60405180910390a250506001600055565b6003546001600160a01b0316331461139d5760405162461bcd60e51b81526004016105a890612f1f565b600b5460ff16156113c05760405162461bcd60e51b81526004016105a890612d92565b6006546001600160a01b03166113e85760405162461bcd60e51b81526004016105a890612c7d565b6007546001600160a01b03166114105760405162461bcd60e51b81526004016105a890612d0a565b61141981611f5e565b50600b805460ff19166001179055565b600b5460ff1661144b5760405162461bcd60e51b81526004016105a89061312e565b6003546001600160a01b031633146114755760405162461bcd60e51b81526004016105a890612f1f565b61147e81611f5e565b50565b600260005414156114a45760405162461bcd60e51b81526004016105a8906131f9565b60026000556114b233611a27565b1580156114be57503332145b6114da5760405162461bcd60e51b81526004016105a890612d5d565b6011541561158457601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190612ae9565b905060115481116115825760405162461bcd60e51b81526004016105a8906132b5565b505b600b5460ff166115a65760405162461bcd60e51b81526004016105a89061312e565b336000908152600e602052604090206115c081600c611a2d565b82156115e7576001546115de906001600160a01b0316333086611f06565b6115e783611c68565b81156116b45760025460405163079cc67960e41b81526001600160a01b03909116906379cc67909061161f9033908690600401612b6a565b600060405180830381600087803b15801561163957600080fd5b505af115801561164d573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb9150611681908590600401613334565b600060405180830381600087803b15801561169b57600080fd5b505af11580156116af573d6000803e3d6000fd5b505050505b60006116c08484611e9e565b90506116ea81604051806020016040528060008152508460010154611bb49092919063ffffffff16565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90611723908790879061333d565b60405180910390a2505060016000555050565b600b54600090819060ff1661175d5760405162461bcd60e51b81526004016105a89061312e565b600061176a600f85611a00565b90506000806117798330612089565b9092509050811561182b5760006117a76127106117a1600854866119bd90919063ffffffff16565b906120dc565b905060006117b58483611e76565b90506117bf612a3b565b6117d46009546117ce8461210e565b90612150565b6040805160208101909152600d5481529091506117f19082612184565b51600d55821561181857600754600154611818916001600160a01b039182169116856121b4565b81156118275761182782611c68565b5050505b7f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f09828260405161185c92919061333d565b60405180910390a1909350915050915091565b6003546001600160a01b031633146118995760405162461bcd60e51b81526004016105a890612f1f565b6001600160a01b0381166118bf5760405162461bcd60e51b81526004016105a8906132e1565b600780546001600160a01b0319166001600160a01b0383161790556040517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf90610622908390612b56565b600a5481565b6004546001600160a01b031681565b6005546001600160a01b031681565b6001600160a01b0381166000908152600e6020526040812061116381600c6121d8565b6001546001600160a01b031681565b600080600260005414156119865760405162461bcd60e51b81526004016105a8906131f9565b6002600055600b5460ff166119ad5760405162461bcd60e51b81526004016105a89061312e565b610c528484611dba565b60095481565b6000826119cc575060006119fa565b828202828482816119d957fe5b04146119f75760405162461bcd60e51b81526004016105a890612f56565b90505b92915050565b6000826000018281548110611a1157fe5b9060005260206000209060020201905092915050565b3b151590565b6000611a39838361221f565b90508260010154811115611a67576001830180546000909155611a5c8282611e76565b600285015550611a7c565b6001830154611a769082611e76565b60018401555b5060010154600490910155565b6001546040516370a0823160e01b815260009182918291611b199186916001600160a01b0316906370a0823190611ac4903090600401612b56565b60206040518083038186803b158015611adc57600080fd5b505afa158015611af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b149190612ae9565b612298565b90506001600160a01b0385163014611b4257600154611b42906001600160a01b031686836121b4565b80806000611b508783611e76565b90508015611b95576000611b64600f6122ae565b9050600080611b74838c866122d9565b9092509050611b838683611e9e565b9550611b8f8582611e9e565b94505050505b600954611ba29083611e76565b600955509093509150505b9250929050565b60008184841115611bd85760405162461bcd60e51b81526004016105a89190612bb2565b505050900390565b611bea838361230f565b8190611c095760405162461bcd60e51b81526004016105a89190612bb2565b50505050565b600080611c1c600f6122ae565b90506000611c298261233d565b90507f860f4701faa0ecdeecd9e9eaae11a8612bbd01c663081f7c0c4e4873df653d6981604051611c5a9190613334565b60405180910390a191505090565b60015460065460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611c9e929116908590600401612b6a565b602060405180830381600087803b158015611cb857600080fd5b505af1158015611ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf09190612ab1565b50600654604051631f72642160e31b81526001600160a01b039091169063fb93210890611d239030908590600401612b6a565b600060405180830381600087803b158015611d3d57600080fd5b505af1158015611d51573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb9150611d85908490600401613334565b600060405180830381600087803b158015611d9f57600080fd5b505af1158015611db3573d6000803e3d6000fd5b5050505050565b600b546000908190610100900460ff1680611ddf57506003546001600160a01b031633145b80611df35750611def600f6123d1565b8414155b611e0f5760405162461bcd60e51b81526004016105a890613092565b6000611e1c600f86611a00565b9050600080611e2c8330886122d9565b91509150867fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a4996478383604051611e6292919061333d565b60405180910390a290969095509350505050565b600082821115611e985760405162461bcd60e51b81526004016105a890612dc9565b50900390565b6000828201838110156119f75760405162461bcd60e51b81526004016105a890612cd3565b5490565b600080611ed4848461221f565b905080611ee757505060018201546119fa565b6001840154808210611efe576000925050506119fa565b039392505050565b611c09846323b872dd60e01b858585604051602401611f2793929190612b83565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261241e565b6001600160a01b038116611f845760405162461bcd60e51b81526004016105a890613267565b60015460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b158015611fcb57600080fd5b505afa158015611fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120039190612acd565b6001600160a01b0316146120295760405162461bcd60e51b81526004016105a890613230565b604080518082019091526001600160a01b03821681526000602082015261205290600f906124ad565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b600080836001015461209a856124f0565b116120aa57506000905080611bad565b60006120c385600101546120bd876124f0565b90611e76565b90506120d085858361256c565b92509250509250929050565b60008082116120fd5760405162461bcd60e51b81526004016105a890612e46565b81838161210657fe5b049392505050565b612116612a3b565b6000821580612133575050670de0b6b3a764000082810290810483145b61213c57600080fd5b604080516020810190915290815292915050565b612158612a3b565b8161216257600080fd5b60405180602001604052808385600001518161217a57fe5b0490529392505050565b61218c612a3b565b8251825181019081101561219f57600080fd5b60408051602081019091529081529392505050565b6121d38363a9059cbb60e01b8484604051602401611f27929190612b6a565b505050565b6000806121e5848461221f565b9050806121f857505060028201546119fa565b600184015480821161220f576000925050506119fa565b6002850154910301905092915050565b6000612229612a3b565b50604080516020810190915260018301548152612244612a3b565b506040805160208101909152600485015481526122618282612726565b612270576000925050506119fa565b845461228f9061228a906122848585612757565b90612772565b6127a0565b95945050505050565b60008183106122a757816119f7565b5090919050565b6000816122ba816123d1565b815481106122c457fe5b90600052602060002090600202019050919050565b60008080806122e987878761256c565b600189015491935091506122fd9082611e76565b60018801559092509050935093915050565b60008061233461231f85856127af565b60408051602081019091528554815290612726565b13159392505050565b600080612349836127f3565b9050611163816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161237a9190612b56565b60206040518083038186803b15801561239257600080fd5b505afa1580156123a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ca9190612ae9565b849061286f565b6000806123dd83611ec3565b90506111636001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b81525083611bb49092919063ffffffff16565b6060612473826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129169092919063ffffffff16565b8051909150156121d357808060200190518101906124919190612ab1565b6121d35760405162461bcd60e51b81526004016105a890613165565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b15801561253457600080fd5b505afa158015612548573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612ae9565b600080600061257a866127f3565b90506000816001600160a01b03166370a08231876040518263ffffffff1660e01b81526004016125aa9190612b56565b60206040518083038186803b1580156125c257600080fd5b505afa1580156125d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fa9190612ae9565b90506000612607886124f0565b885460405163f3fef3a360e01b81529192506001600160a01b03169063f3fef3a390612639908a908a90600401612b6a565b600060405180830381600087803b15801561265357600080fd5b505af1158015612667573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a082319061269a908b90600401612b56565b60206040518083038186803b1580156126b257600080fd5b505afa1580156126c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ea9190612ae9565b905060006126f88285611e76565b905060006127058b6124f0565b905060006127138583611e76565b929c929b50919950505050505050505050565b80518251600091111561273c57506000196119fa565b81518351111561274e575060016119fa565b50600092915050565b61275f612a3b565b8251825181039081111561219f57600080fd5b61277a612a3b565b600082158061279757505082518281029083828161279457fe5b04145b61219f57600080fd5b51670de0b6b3a7640000900490565b6127b7612a3b565b60006127c38484611ec7565b9050806127da576127d2612925565b9150506119fa565b6127eb816117ce866000015461210e565b949350505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b15801561283757600080fd5b505afa15801561284b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612acd565b60008061287b846127f3565b8454909150612897906001600160a01b038084169116856121b4565b835460405163b6b55f2560e01b81526001600160a01b039091169063b6b55f25906128c6908690600401613334565b600060405180830381600087803b1580156128e057600080fd5b505af11580156128f4573d6000803e3d6000fd5b5050506001850154612907915084611e9e565b60018501555081905092915050565b60606127eb8484600085612941565b61292d612a3b565b506040805160208101909152600019815290565b6060824710156129635760405162461bcd60e51b81526004016105a890612e00565b61296c85611a27565b6129885760405162461bcd60e51b81526004016105a89061305b565b60006060866001600160a01b031685876040516129a59190612b3a565b60006040518083038185875af1925050503d80600081146129e2576040519150601f19603f3d011682016040523d82523d6000602084013e6129e7565b606091505b50915091506129f7828286612a02565b979650505050505050565b60608315612a11575081611163565b825115612a215782518084602001fd5b8160405162461bcd60e51b81526004016105a89190612bb2565b6040518060200160405280600081525090565b600060208284031215612a5f578081fd5b81356119f78161338d565b60008060408385031215612a7c578081fd5b8235612a878161338d565b946020939093013593505050565b600060208284031215612aa6578081fd5b81356119f7816133a2565b600060208284031215612ac2578081fd5b81516119f7816133a2565b600060208284031215612ade578081fd5b81516119f78161338d565b600060208284031215612afa578081fd5b5051919050565b600060208284031215612b12578081fd5b5035919050565b60008060408385031215612b2b578182fd5b50508035926020909101359150565b60008251612b4c818460208701613361565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b6000602082528251806020840152612bd1816040850160208701613361565b601f01601f19169190910160400192915050565b6020808252602c908201527f416c6368656d6973743a207472616e736d75746572206164647265737320636160408201526b373737ba10313290183c181760a11b606082015260800190565b6020808252602c908201527f416c6368656d6973743a20676f7665726e616e6365206164647265737320636160408201526b373737ba10313290183c181760a11b606082015260800190565b60208082526036908201527f416c6368656d6973743a2063616e6e6f7420696e697469616c697a652074726160408201527506e736d75746572206164647265737320746f203078360541b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526033908201527f416c6368656d6973743a2063616e6e6f7420696e697469616c697a6520726577604082015272061726473206164647265737320746f2030783606c1b606082015260800190565b6020808252818101527f536f72727920776520646f206e6f742061636365707420636f6e747261637421604082015260600190565b6020808252601e908201527f416c6368656d6973743a20616c726561647920696e697469616c697a65640000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526031908201527f416c6368656d6973743a20636f6c6c61746572616c697a6174696f6e206c696d60408201527034ba103132b637bb9036b4b734b6bab69760791b606082015260800190565b60208082526031908201527f416c6368656d6973743a20636f6c6c61746572616c697a6174696f6e206c696d60408201527034ba1030b137bb329036b0bc34b6bab69760791b606082015260800190565b6020808252601b908201527f416c6368656d6973743a206f6e6c7920676f7665726e616e63652e0000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526025908201527f416c6368656d6973743a2068617276657374206665652061626f7665206d617860408201526434b6bab69760d91b606082015260800190565b6020808252601f908201527f73656e646572206973206e6f742070656e64696e67476f7665726e616e636500604082015260600190565b602080825260009082015260400190565b60208082526017908201527f656d657267656e637920706175736520656e61626c6564000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526070908201527f416c6368656d6973743a206e6f7420616e20656d657267656e63792c206e6f7460408201527f20676f7665726e616e63652c20616e64207573657220646f6573206e6f74206860608201527f617665207065726d697373696f6e20746f20726563616c6c2066756e6473206660808201526f1c9bdb481858dd1a5d99481d985d5b1d60821b60a082015260c00190565b6020808252601b908201527f416c6368656d6973743a206e6f7420696e697469616c697a65642e0000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252602a908201527f416c6368656d6973743a2073656e74696e656c20616464726573732063616e6e60408201526937ba10313290183c181760b11b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601a908201527f416c6368656d6973743a20746f6b656e206d69736d617463682e000000000000604082015260600190565b6020808252602e908201527f416c6368656d6973743a20616374697665207661756c7420616464726573732060408201526d31b0b73737ba10313290183c181760911b606082015260800190565b60208082526012908201527137b333103832b3903634b6b4ba30ba34b7b760711b604082015260600190565b60208082526029908201527f416c6368656d6973743a207265776172647320616464726573732063616e6e6f6040820152683a10313290183c181760b91b606082015260800190565b9051815260200190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60005b8381101561337c578181015183820152602001613364565b83811115611c095750506000910152565b6001600160a01b038116811461147e57600080fd5b801515811461147e57600080fdfe416374696f6e20626c6f636b65643a20756e6865616c74687920636f6c6c61746572616c697a6174696f6e20726174696f416c6368656d6973743a204c6f616e2d746f2d76616c756520726174696f206272656163686564a2646970667358221220cd3b5d2604a21c12484c7b9c568c0e3e55c9a74979dabde0e98e5a6c4b7f61b164736f6c634300060c0033

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

0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000c2db4c131adaf01c15a1db654c040c8578929d5500000000000000000000000023ae8682437004044c0eddc7cee3bf632349062e0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d3798

-----Decoded View---------------
Arg [0] : _token (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [1] : _xtoken (address): 0xc2db4c131ADaF01c15a1DB654c040c8578929D55
Arg [2] : _governance (address): 0x23Ae8682437004044C0eddC7cee3bF632349062e
Arg [3] : _sentinel (address): 0x9e145AF5b3B142a50d871cb4821992dd493d3798

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [1] : 000000000000000000000000c2db4c131adaf01c15a1db654c040c8578929d55
Arg [2] : 00000000000000000000000023ae8682437004044c0eddc7cee3bf632349062e
Arg [3] : 0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d3798


Deployed Bytecode Sourcemap

103899:27542:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105494:77;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;111103:221;;;;;;:::i;:::-;;:::i;:::-;;110411:284;;;;;;:::i;:::-;;:::i;108140:23::-;;;:::i;:::-;;;;;;;:::i;107071:28::-;;;:::i;:::-;;;;;;;:::i;112067:116::-;;;;;;:::i;:::-;;:::i;110830:267::-;;;:::i;124540:171::-;;;;;;:::i;:::-;;:::i;120592:742::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;104933:77::-;;;:::i;109110:25::-;;;:::i;122377:816::-;;;;;;:::i;:::-;;:::i;114412:221::-;;;;;;:::i;:::-;;:::i;104399:50::-;;;:::i;114852:136::-;;;:::i;:::-;;;;;;;:::i;118057:225::-;;;;;;:::i;:::-;;:::i;104187:49::-;;;:::i;113679:417::-;;;;;;:::i;:::-;;:::i;108315:25::-;;;:::i;114124:131::-;;;;;;:::i;:::-;;:::i;107213:25::-;;;:::i;118560:344::-;;;:::i;107569:25::-;;;:::i;112984:426::-;;;;;;:::i;:::-;;:::i;126412:159::-;;;;;;:::i;:::-;;:::i;107666:22::-;;;:::i;108989:29::-;;;:::i;123522:680::-;;;;;;:::i;:::-;;:::i;125303:165::-;;;;;;:::i;:::-;;:::i;124304:90::-;;;:::i;125668:171::-;;;;;;:::i;:::-;;:::i;124927:179::-;;;;;;:::i;:::-;;:::i;111539:426::-;;;;;;:::i;:::-;;:::i;107784:25::-;;;:::i;119713:571::-;;;;;;:::i;:::-;;:::i;115212:391::-;;;;;;:::i;:::-;;:::i;115984:119::-;;;;;;:::i;:::-;;:::i;121487:722::-;;;;;;:::i;:::-;;:::i;116303:1026::-;;;;;;:::i;:::-;;:::i;112413:396::-;;;;;;:::i;:::-;;:::i;108032:29::-;;;:::i;107296:32::-;;;:::i;107436:23::-;;;:::i;126016:175::-;;;;;;:::i;:::-;;:::i;106966:27::-;;;:::i;117610:171::-;;;;;;:::i;:::-;;:::i;107921:29::-;;;:::i;105494:77::-;105552:19;105494:77;:::o;111103:221::-;128199:10;;-1:-1:-1;;;;;128199:10:0;128185;:24;128177:64;;;;-1:-1:-1;;;128177:64:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;111177:25:0;::::1;111169:80;;;;-1:-1:-1::0;;;111169:80:0::1;;;;;;;:::i;:::-;111258:8;:20:::0;;-1:-1:-1;;;;;;111258:20:0::1;-1:-1:-1::0;;;;;111258:20:0;::::1;;::::0;;111292:26:::1;::::0;::::1;::::0;::::1;::::0;111258:20;;111292:26:::1;:::i;:::-;;;;;;;;111103:221:::0;:::o;110411:284::-;128199:10;;-1:-1:-1;;;;;128199:10:0;128185;:24;128177:64;;;;-1:-1:-1;;;128177:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;110501:34:0;::::1;110493:91;;;;-1:-1:-1::0;;;110493:91:0::1;;;;;;;:::i;:::-;110593:17;:38:::0;;-1:-1:-1;;;;;;110593:38:0::1;-1:-1:-1::0;;;;;110593:38:0;::::1;;::::0;;110645:44:::1;::::0;::::1;::::0;::::1;::::0;110593:38;;110645:44:::1;:::i;108140:23::-:0;;;;;;:::o;107071:28::-;;;-1:-1:-1;;;;;107071:28:0;;:::o;112067:116::-;128199:10;;-1:-1:-1;;;;;128199:10:0;128185;:24;128177:64;;;;-1:-1:-1;;;128177:64:0;;;;;;;:::i;:::-;112143:14:::1;:32:::0;112067:116::o;110830:267::-;110897:17;;-1:-1:-1;;;;;110897:17:0;110883:10;:31;110875:74;;;;-1:-1:-1;;;110875:74:0;;;;;;;:::i;:::-;110985:17;;111009:10;:31;;-1:-1:-1;;;;;;111009:31:0;-1:-1:-1;;;;;110985:17:0;;;111009:31;;;;;111054:37;;;;;;110985:17;;111054:37;:::i;124540:171::-;124606:13;;124656:21;:7;124668:8;124656:11;:21::i;:::-;124691:14;-1:-1:-1;;;;;124691:14:0;;124540:171;-1:-1:-1;;;124540:171:0:o;120592:742::-;120694:7;120703;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;127425:32:::1;127433:10;127425:30;:32::i;:::-;127424:33;:60;;;;-1:-1:-1::0;127461:10:0::1;127475:9;127461:23;127424:60;127416:105;;;;-1:-1:-1::0;;;127416:105:0::1;;;;;;;:::i;:::-;127726:11:::2;::::0;::::2;;127718:51;;;;-1:-1:-1::0;;;127718:51:0::2;;;;;;;:::i;:::-;120751:10:::3;120721:21;120745:17:::0;;;:5:::3;:17;::::0;;;;120792:16:::3;::::0;::::3;::::0;120777:12:::3;:31;120769:44;;;;-1:-1:-1::0;;;120769:44:0::3;;;;;;;:::i;:::-;120822:17;:4:::0;120834::::3;120822:11;:17::i;:::-;120849:24;120875:23:::0;120902:37:::3;120919:10;120931:7;120902:16;:37::i;:::-;120970:71;::::0;;;;::::3;::::0;;;::::3;::::0;;::::3;;::::0;::::3;::::0;:19;;120848:91;;-1:-1:-1;120848:91:0;;-1:-1:-1;120970:71:0::3;::::0;:19;120848:91;;120970:23:::3;:71::i;:::-;120948:93:::0;;121048:75:::3;::::0;;::::3;::::0;::::3;::::0;;;::::3;::::0;;;::::3;::::0;121065:4:::3;::::0;121048:75:::3;;::::0;::::3;;:4:::0;;:75;:16:::3;:75::i;:::-;121144:14;;121133:7;:25;121130:65;;121169:18;:16;:18::i;:::-;;121130:65;121222:10;-1:-1:-1::0;;;;;121206:71:0::3;;121234:7;121243:16;121261:15;121206:71;;;;;;;;:::i;:::-;;;;;;;;2674:1:::0;3636:7;:22;121294:16;;;;-1:-1:-1;120592:742:0;-1:-1:-1;;;120592:742:0:o;104933:77::-;104991:19;104933:77;:::o;109110:25::-;;;;:::o;122377:816::-;122492:7;122501;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;127425:32:::1;127433:10;127425:30;:32::i;:::-;127424:33;:60;;;;-1:-1:-1::0;127461:10:0::1;127475:9;127461:23;127424:60;127416:105;;;;-1:-1:-1::0;;;127416:105:0::1;;;;;;;:::i;:::-;127081:10:::2;::::0;:14;127078:174:::2;;127148:14;::::0;127137:41:::2;::::0;;-1:-1:-1;;;127137:41:0;;;;127106:20:::2;::::0;-1:-1:-1;;;;;127148:14:0::2;::::0;127137:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;127148:14;127137:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;127106:73;;127211:10;;127196:12;:25;127188:56;;;;-1:-1:-1::0;;;127188:56:0::2;;;;;;;:::i;:::-;127078:174;;127726:11:::3;::::0;::::3;;127718:51;;;;-1:-1:-1::0;;;127718:51:0::3;;;;;;;:::i;:::-;122547:10:::4;122517:21;122541:17:::0;;;:5:::4;:17;::::0;;;;122565::::4;122541::::0;122577:4:::4;122565:11;:17::i;:::-;122661:4;:14;;;122651:7;:24;122648:69;;;122695:4;:14;;;122685:24;;122648:69;122724:24;122750:23:::0;122777:40:::4;122802:4;122809:7;122777:16;:40::i;:::-;122723:94;;;;122872:41;122896:16;122872:23;:41::i;:::-;122944:44;::::0;;::::4;::::0;::::4;::::0;;;-1:-1:-1;122944:44:0;;:19;;:44:::4;::::0;122968:15;;122944:23:::4;:44::i;:::-;122922:66:::0;;123012:40:::4;::::0;;::::4;::::0;::::4;::::0;;;122922:19:::4;123012:40:::0;;:14:::4;::::0;::::4;::::0;:40:::4;::::0;123031:16;;123012:18:::4;:40::i;:::-;122995:14;::::0;::::4;:57:::0;123064:72:::4;::::0;123081:10:::4;::::0;123064:72:::4;::::0;::::4;::::0;123093:7;;123102:16;;123120:15;;123064:72:::4;:::i;114412:221::-:0;114497:10;;-1:-1:-1;;;;;114497:10:0;114483;:24;;:50;;-1:-1:-1;114525:8:0;;-1:-1:-1;;;;;114525:8:0;114511:10;:22;114483:50;114475:63;;;;-1:-1:-1;;;114475:63:0;;;;;;;:::i;:::-;114547:13;:30;;-1:-1:-1;;114547:30:0;;;;;;;;;114591:36;;;;;;114547:30;;114591:36;:::i;104399:50::-;104444:5;104399:50;:::o;114852:136::-;114909:30;;:::i;:::-;-1:-1:-1;114948:34:0;;;;;;;;;114955:4;114948:34;;;114852:136;:::o;118057:225::-;118143:7;118152;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;127726:11:::1;::::0;::::1;;127718:51;;;;-1:-1:-1::0;;;127718:51:0::1;;;;;;;:::i;:::-;118168:25:::2;118196:21;:7;118208:8:::0;118196:11:::2;:21::i;:::-;118168:49;;118231:45;118244:8;118254:6;:21;;;118231:12;:45::i;:::-;2674:1:::0;3636:7;:22;118224:52;;;;-1:-1:-1;118057:225:0;-1:-1:-1;;;118057:225:0:o;104187:49::-;104234:1;104187:49;:::o;113679:417::-;128199:10;;-1:-1:-1;;;;;128199:10:0;128185;:24;128177:64;;;;-1:-1:-1;;;128177:64:0;;;;;;;:::i;:::-;104991:19:::1;113764:6;:41;;113756:103;;;;-1:-1:-1::0;;;113756:103:0::1;;;;;;;:::i;:::-;105552:19;113874:6;:41;;113866:103;;;;-1:-1:-1::0;;;113866:103:0::1;;;;;;;:::i;:::-;114008:31;::::0;;::::1;::::0;::::1;::::0;;;;;113978:4:::1;:61:::0;;;114053:37;::::1;::::0;::::1;::::0;114032:6;;114053:37:::1;:::i;108315:25::-:0;;;;;;;;;:::o;114124:131::-;128199:10;;-1:-1:-1;;;;;128199:10:0;128185;:24;128177:64;;;;-1:-1:-1;;;128177:64:0;;;;;;;:::i;:::-;114203:14:::1;:23:::0;;-1:-1:-1;;;;;;114203:23:0::1;-1:-1:-1::0;;;;;114203:23:0;;;::::1;::::0;;;::::1;::::0;;;114233:10:::1;:16:::0;114124:131::o;107213:25::-;;;-1:-1:-1;;;;;107213:25:0;;:::o;118560:344::-;118626:7;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;127726:11:::1;::::0;::::1;;127718:51;;;;-1:-1:-1::0;;;127718:51:0::1;;;;;;;:::i;:::-;118823:13:::2;::::0;::::2;::::0;::::2;;;118822:14;118814:50;;;;-1:-1:-1::0;;;118814:50:0::2;;;;;;;:::i;:::-;118880:18;:16;:18::i;:::-;118873:25;;2674:1:::0;3636:7;:22;118560:344;:::o;107569:25::-;;;-1:-1:-1;;;;;107569:25:0;;:::o;112984:426::-;128199:10;;-1:-1:-1;;;;;128199:10:0;128185;:24;128177:64;;;;-1:-1:-1;;;128177:64:0;;;;;;;:::i;:::-;104444:5:::1;113252:11;:33;;113244:83;;;;-1:-1:-1::0;;;113244:83:0::1;;;;;;;:::i;:::-;113336:10;:24:::0;;;113374:30:::1;::::0;::::1;::::0;::::1;::::0;113349:11;;113374:30:::1;:::i;126412:159::-:0;-1:-1:-1;;;;;126520:15:0;126480:7;126520:15;;;:5;:15;;;;;126549:16;;;;126412:159::o;107666:22::-;;;-1:-1:-1;;;;;107666:22:0;;:::o;108989:29::-;;;-1:-1:-1;;;;;108989:29:0;;:::o;123522:680::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;127425:32:::1;127433:10;127425:30;:32::i;:::-;127424:33;:60;;;;-1:-1:-1::0;127461:10:0::1;127475:9;127461:23;127424:60;127416:105;;;;-1:-1:-1::0;;;127416:105:0::1;;;;;;;:::i;:::-;127081:10:::2;::::0;:14;127078:174:::2;;127148:14;::::0;127137:41:::2;::::0;;-1:-1:-1;;;127137:41:0;;;;127106:20:::2;::::0;-1:-1:-1;;;;;127148:14:0::2;::::0;127137:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;127148:14;127137:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;127106:73;;127211:10;;127196:12;:25;127188:56;;;;-1:-1:-1::0;;;127188:56:0::2;;;;;;;:::i;:::-;127078:174;;127726:11:::3;::::0;::::3;;127718:51;;;;-1:-1:-1::0;;;127718:51:0::3;;;;;;;:::i;:::-;123662:10:::4;123632:21;123656:17:::0;;;:5:::4;:17;::::0;;;;123680::::4;123656::::0;123692:4:::4;123680:11;:17::i;:::-;123729:16;::::0;::::4;::::0;123758:22;;::::4;123754:331;;;123791:24;123818:25;:7:::0;123830:12;123818:11:::4;:25::i;:::-;123869:14;::::0;::::4;::::0;123791:52;;-1:-1:-1;123869:36:0::4;::::0;123791:52;123869:18:::4;:36::i;:::-;123852:14;::::0;::::4;:53:::0;123933:1:::4;123914:16;::::0;::::4;:20:::0;123945:65:::4;::::0;;::::4;::::0;::::4;::::0;;;::::4;::::0;;;::::4;::::0;123962:4:::4;::::0;123945:65:::4;;::::0;::::4;;:4:::0;;:65;:16:::4;:65::i;:::-;123754:331;;;;124052:25;:12:::0;124069:7;124052:16:::4;:25::i;:::-;124033:16;::::0;::::4;:44:::0;123754:331:::4;124093:6;::::0;:32:::4;::::0;-1:-1:-1;;;124093:32:0;;-1:-1:-1;;;;;124093:6:0;;::::4;::::0;:11:::4;::::0;:32:::4;::::0;124105:10:::4;::::0;124117:7;;124093:32:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;124146:14;;124135:7;:25;124132:65;;124171:18;:16;:18::i;:::-;;124132:65;-1:-1:-1::0;;2674:1:0;3636:7;:22;-1:-1:-1;123522:680:0:o;125303:165::-;-1:-1:-1;;;;;125414:15:0;125374:7;125414:15;;;:5;:15;;;;;125443:19;;125303:165::o;124304:90::-;124349:7;124372:16;:7;:14;:16::i;:::-;124365:23;;124304:90;:::o;125668:171::-;-1:-1:-1;;;;;125774:15:0;;125734:7;125774:15;;;:5;:15;;;;;125803:30;125774:15;125828:4;125803:24;:30::i;:::-;125796:37;125668:171;-1:-1:-1;;;125668:171:0:o;124927:179::-;125000:7;;125044:21;:7;125056:8;125044:11;:21::i;:::-;125079;;;;124927:179;-1:-1:-1;;;124927:179:0:o;111539:426::-;128199:10;;-1:-1:-1;;;;;128199:10:0;128185;:24;128177:64;;;;-1:-1:-1;;;128177:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;111806:27:0;::::1;111798:84;;;;-1:-1:-1::0;;;111798:84:0::1;;;;;;;:::i;:::-;111891:10;:24:::0;;-1:-1:-1;;;;;;111891:24:0::1;-1:-1:-1::0;;;;;111891:24:0;::::1;;::::0;;111929:30:::1;::::0;::::1;::::0;::::1;::::0;111891:24;;111929:30:::1;:::i;107784:25::-:0;;;;:::o;119713:571::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;127425:32:::1;127433:10;127425:30;:32::i;:::-;127424:33;:60;;;;-1:-1:-1::0;127461:10:0::1;127475:9;127461:23;127424:60;127416:105;;;;-1:-1:-1::0;;;127416:105:0::1;;;;;;;:::i;:::-;127726:11:::2;::::0;::::2;;127718:51;;;;-1:-1:-1::0;;;127718:51:0::2;;;;;;;:::i;:::-;119823:13:::3;::::0;::::3;::::0;::::3;;;119822:14;119814:50;;;;-1:-1:-1::0;;;119814:50:0::3;;;;;;;:::i;:::-;119903:10;119873:21;119897:17:::0;;;:5:::3;:17;::::0;;;;119921::::3;119897::::0;119933:4:::3;119921:11;:17::i;:::-;119947:5;::::0;:58:::3;::::0;-1:-1:-1;;;;;119947:5:0::3;119970:10;119990:4;119997:7:::0;119947:22:::3;:58::i;:::-;120026:14;;120015:7;:25;120012:65;;120051:18;:16;:18::i;:::-;;120012:65;120100:14;::::0;:27:::3;::::0;120119:7;120100:18:::3;:27::i;:::-;120083:14;:44:::0;120158:19;;:32:::3;::::0;120182:7;120158:23:::3;:32::i;:::-;120136:54:::0;;120216:12:::3;120197:16;::::0;::::3;:31:::0;120242:36:::3;::::0;120258:10:::3;::::0;120242:36:::3;::::0;::::3;::::0;120270:7;;120242:36:::3;:::i;:::-;;;;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;119713:571::o;115212:391::-;128199:10;;-1:-1:-1;;;;;128199:10:0;128185;:24;128177:64;;;;-1:-1:-1;;;128177:64:0;;;;;;;:::i;:::-;115291:11:::1;::::0;::::1;;115290:12;115282:55;;;;-1:-1:-1::0;;;115282:55:0::1;;;;;;;:::i;:::-;115354:10;::::0;-1:-1:-1;;;;;115354:10:0::1;115346:93;;;;-1:-1:-1::0;;;115346:93:0::1;;;;;;;:::i;:::-;115454:7;::::0;-1:-1:-1;;;;;115454:7:0::1;115446:87;;;;-1:-1:-1::0;;;115446:87:0::1;;;;;;;:::i;:::-;115542:28;115561:8;115542:18;:28::i;:::-;-1:-1:-1::0;115579:11:0::1;:18:::0;;-1:-1:-1;;115579:18:0::1;115593:4;115579:18;::::0;;115212:391::o;115984:119::-;127726:11;;;;127718:51;;;;-1:-1:-1;;;127718:51:0;;;;;;;:::i;:::-;128199:10:::1;::::0;-1:-1:-1;;;;;128199:10:0::1;128185;:24;128177:64;;;;-1:-1:-1::0;;;128177:64:0::1;;;;;;;:::i;:::-;116069:28:::2;116088:8;116069:18;:28::i;:::-;115984:119:::0;:::o;121487:722::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;127425:32:::1;127433:10;127425:30;:32::i;:::-;127424:33;:60;;;;-1:-1:-1::0;127461:10:0::1;127475:9;127461:23;127424:60;127416:105;;;;-1:-1:-1::0;;;127416:105:0::1;;;;;;;:::i;:::-;127081:10:::2;::::0;:14;127078:174:::2;;127148:14;::::0;127137:41:::2;::::0;;-1:-1:-1;;;127137:41:0;;;;127106:20:::2;::::0;-1:-1:-1;;;;;127148:14:0::2;::::0;127137:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;127148:14;127137:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;127106:73;;127211:10;;127196:12;:25;127188:56;;;;-1:-1:-1::0;;;127188:56:0::2;;;;;;;:::i;:::-;127078:174;;127726:11:::3;::::0;::::3;;127718:51;;;;-1:-1:-1::0;;;127718:51:0::3;;;;;;;:::i;:::-;121656:10:::4;121626:21;121650:17:::0;;;:5:::4;:17;::::0;;;;121674::::4;121650::::0;121686:4:::4;121674:11;:17::i;:::-;121704::::0;;121700:151:::4;;121732:5;::::0;:64:::4;::::0;-1:-1:-1;;;;;121732:5:0::4;121755:10;121775:4;121782:13:::0;121732:22:::4;:64::i;:::-;121805:38;121829:13;121805:23;:38::i;:::-;121863:16:::0;;121859:155:::4;;121890:6;::::0;:41:::4;::::0;-1:-1:-1;;;121890:41:0;;-1:-1:-1;;;;;121890:6:0;;::::4;::::0;:15:::4;::::0;:41:::4;::::0;121906:10:::4;::::0;121918:12;;121890:41:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;121971:6:0::4;::::0;:35:::4;::::0;-1:-1:-1;;;121971:35:0;;-1:-1:-1;;;;;121971:6:0;;::::4;::::0;-1:-1:-1;121971:21:0::4;::::0;-1:-1:-1;121971:35:0::4;::::0;121993:12;;121971:35:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;121859:155;122022:20;122045:31;:13:::0;122063:12;122045:17:::4;:31::i;:::-;122022:54;;122100:36;122119:12;122100:36;;;;;;;;;;;::::0;:4:::4;:14;;;:18;;:36;;;;;:::i;:::-;122083:14;::::0;::::4;:53:::0;122150::::4;::::0;122163:10:::4;::::0;122150:53:::4;::::0;::::4;::::0;122175:13;;122190:12;;122150:53:::4;:::i;:::-;;;;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;-1:-1:-1;;121487:722:0:o;116303:1026::-;127726:11;;116374:7;;;;127726:11;;127718:51;;;;-1:-1:-1;;;127718:51:0;;;;;;;:::i;:::-;116401:25:::1;116429:21;:7;116441:8:::0;116429:11:::1;:21::i;:::-;116401:49:::0;-1:-1:-1;116460:24:0::1;::::0;116513:29:::1;116401:49:::0;116536:4:::1;116513:14;:29::i;:::-;116459:83:::0;;-1:-1:-1;116459:83:0;-1:-1:-1;116555:20:0;;116551:659:::1;;116586:18;116607:56;104444:5;116607:32;116628:10;;116607:16;:20;;:32;;;;:::i;:::-;:36:::0;::::1;:56::i;:::-;116586:77:::0;-1:-1:-1;116672:25:0::1;116700:32;:16:::0;116586:77;116700:20:::1;:32::i;:::-;116672:60;;116743:38;;:::i;:::-;116784:62;116831:14;;116784:42;116808:17;116784:23;:42::i;:::-;:46:::0;::::1;:62::i;:::-;116885:31;::::0;;::::1;::::0;::::1;::::0;;;:27;:31;;;116743:103;;-1:-1:-1;116885:40:0::1;::::0;116743:103;116885:31:::1;:40::i;:::-;116855:70:::0;:27;:70;116940:14;;116936:80:::1;;116986:7;::::0;;116967:5;:39:::1;::::0;-1:-1:-1;;;;;116967:5:0;;::::1;::::0;116986:7:::1;116995:10:::0;116967:18:::1;:39::i;:::-;117030:21:::0;;117026:177:::1;;117064:42;117088:17;117064:23;:42::i;:::-;116551:659;;;;117223:49;117238:16;117256:15;117223:49;;;;;;;:::i;:::-;;;;;;;;117289:16:::0;;-1:-1:-1;117307:15:0;-1:-1:-1;;116303:1026:0;;;:::o;112413:396::-;128199:10;;-1:-1:-1;;;;;128199:10:0;128185;:24;128177:64;;;;-1:-1:-1;;;128177:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;112668:24:0;::::1;112660:78;;;;-1:-1:-1::0;;;112660:78:0::1;;;;;;;:::i;:::-;112747:7;:18:::0;;-1:-1:-1;;;;;;112747:18:0::1;-1:-1:-1::0;;;;;112747:18:0;::::1;;::::0;;112779:24:::1;::::0;::::1;::::0;::::1;::::0;112747:18;;112779:24:::1;:::i;108032:29::-:0;;;;:::o;107296:32::-;;;-1:-1:-1;;;;;107296:32:0;;:::o;107436:23::-;;;-1:-1:-1;;;;;107436:23:0;;:::o;126016:175::-;-1:-1:-1;;;;;126124:15:0;;126084:7;126124:15;;;:5;:15;;;;;126153:32;126124:15;126180:4;126153:26;:32::i;106966:27::-;;;-1:-1:-1;;;;;106966:27:0;;:::o;117610:171::-;117710:7;117719;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;127726:11:::1;::::0;::::1;;127718:51;;;;-1:-1:-1::0;;;127718:51:0::1;;;;;;;:::i;:::-;117744:31:::2;117757:8;117767:7;117744:12;:31::i;107921: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;101644:128::-;101716:12;101744:5;:14;;101759:6;101744:22;;;;;;;;;;;;;;;;;;101737:29;;101644: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;130385:1053::-;130575:5;;:30;;-1:-1:-1;;;130575:30:0;;130466:7;;;;;;130557:49;;130566:7;;-1:-1:-1;;;;;130575:5:0;;:15;;:30;;130599:4;;130575:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;130557:8;:49::i;:::-;130531:75;-1:-1:-1;;;;;;130619:27:0;;130641:4;130619:27;130615:97;;130657:5;;:47;;-1:-1:-1;;;;;130657:5:0;130676:10;130688:15;130657:18;:47::i;:::-;130746:15;;130720:23;130850:28;:7;130746:15;130850:11;:28::i;:::-;130823:55;-1:-1:-1;130947:20:0;;130943:369;;130978:31;131012:14;:7;:12;:14::i;:::-;130978:48;-1:-1:-1;131036:23:0;;131088:78;130978:48;131120:10;131141:16;131088:21;:78::i;:::-;131035:131;;-1:-1:-1;131035:131:0;-1:-1:-1;131195:36:0;:15;131035:131;131195:19;:36::i;:::-;131177:54;-1:-1:-1;131263:41:0;:20;131288:15;131263:24;:41::i;:::-;131240:64;;130943:369;;;;131337:14;;:40;;131356:20;131337:18;:40::i;:::-;131320:14;:57;-1:-1:-1;131394:15:0;;-1:-1:-1;131411:20:0;-1:-1:-1;;130385:1053:0;;;;;;:::o;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;119201:253::-;119247:7;119265:31;119299:14;:7;:12;:14::i;:::-;119265:48;;119320:24;119347:25;:12;:23;:25::i;:::-;119320:52;;119386:30;119399:16;119386:30;;;;;;:::i;:::-;;;;;;;;119432:16;-1:-1:-1;;119201:253:0;:::o;126670:::-;126739:5;;126753:10;;126739:32;;-1:-1:-1;;;126739:32:0;;-1:-1:-1;;;;;126739:5:0;;;;:13;;:32;;126753:10;;;126764:6;;126739:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;126794:10:0;;126782:56;;-1:-1:-1;;;126782:56:0;;-1:-1:-1;;;;;126794:10:0;;;;126782:34;;:56;;126825:4;;126831:6;;126782:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;126888:6:0;;:29;;-1:-1:-1;;;126888:29:0;;-1:-1:-1;;;;;126888:6:0;;;;-1:-1:-1;126888:21:0;;-1:-1:-1;126888:29:0;;126910:6;;126888:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;126670:253;:::o;129327:588::-;129435:13;;129402:7;;;;129435:13;;;;;;:41;;-1:-1:-1;129466:10:0;;-1:-1:-1;;;;;129466:10:0;129452;:24;129435:41;:76;;;;129492:19;:7;:17;:19::i;:::-;129480:8;:31;;129435:76;129427:201;;;;-1:-1:-1;;;129427:201:0;;;;;;;:::i;:::-;129637:25;129665:21;:7;129677:8;129665:11;:21::i;:::-;129637:49;-1:-1:-1;129694:24:0;;129747:39;129637:49;129771:4;129778:7;129747:15;:39::i;:::-;129693:93;;;;129814:8;129800:58;129824:16;129842:15;129800:58;;;;;;;:::i;:::-;;;;;;;;129875:16;;;;-1:-1:-1;129327:588:0;-1:-1:-1;;;;129327:588: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;102546:109::-;102628:21;;102546: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;128608:379::-;-1:-1:-1;;;;;128684:39:0;;128676:98;;;;-1:-1:-1;;;128676:98:0;;;;;;;:::i;:::-;128809:5;;128789:16;;;-1:-1:-1;;;128789:16:0;;;;-1:-1:-1;;;;;128809:5:0;;;;128789:14;;;;;:16;;;;;;;;;;;;;;:14;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;128789:25:0;;128781:64;;;;-1:-1:-1;;;128781:64:0;;;;;;;:::i;:::-;128867:71;;;;;;;;;-1:-1:-1;;;;;128867:71:0;;;;-1:-1:-1;128867:71:0;;;;128854:85;;:7;;:12;:85::i;:::-;128953:28;;-1:-1:-1;;;;;128953:28:0;;;;;;;;128608:379;:::o;100961:323::-;101036:7;101045;101087:5;:20;;;101065:18;:5;:16;:18::i;:::-;:42;101061:78;;-1:-1:-1;101126:1:0;;-1:-1:-1;101126:1:0;101118:13;;101061:78;101145:23;101171:44;101194:5;:20;;;101171:18;:5;:16;:18::i;:::-;:22;;:44::i;:::-;101145:70;-1:-1:-1;101229:49:0;:5;101250:10;101145:70;101229:20;:49::i;:::-;101222:56;;;;;100961:323;;;;;:::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;22744:86::-;22661:177;;;:::o;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;101955:124::-;102012:12;102040:5;102055:17;102040:5;102055:15;:17::i;:::-;102040:33;;;;;;;;;;;;;;;;;;102033:40;;101955:124;;;:::o;99341:339::-;99434:7;;;;99513:41;:5;99534:10;99546:7;99513:20;:41::i;:::-;99584:20;;;;99459:95;;-1:-1:-1;99459:95:0;-1:-1:-1;99584:41:0;;99459:95;99584:24;:41::i;:::-;99561:20;;;:64;99640:16;;-1:-1:-1;99658:15:0;-1:-1:-1;99341:339: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;98975:177::-;99033:7;99049:21;99073:13;:5;:11;:13::i;:::-;99049:37;;99100:46;99114:6;-1:-1:-1;;;;;99114:16:0;;99139:4;99114:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99100:5;;:13;:46::i;102276:165::-;102338:7;102354:15;102372:14;:5;:12;:14::i;:::-;102354:32;;102400:35;102412:1;102400:35;;;;;;;;;;;;;-1:-1:-1;;;102400:35:0;;;:7;:11;;:35;;;;;:::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;101380:107::-;101452:29;;;;;;;;-1:-1:-1;101452:29:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;101452:29:0;-1:-1:-1;;;;;101452:29:0;;;;;;;;;;;;;;;;;101380:107::o;98030:118::-;98116:13;;:26;;;-1:-1:-1;;;98116:26:0;;;;98093:7;;-1:-1:-1;;;;;98116:13:0;;:24;;:26;;;;;;;;;;;;;;:13;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;99878:651::-;99977:7;99986;100002:21;100026:13;:5;:11;:13::i;:::-;100002:37;;100048:24;100075:6;-1:-1:-1;;;;;100075:16:0;;100092:10;100075:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100048:55;;100110:27;100140:18;:5;:16;:18::i;:::-;100167:13;;:43;;-1:-1:-1;;;100167:43:0;;100110:48;;-1:-1:-1;;;;;;100167:13:0;;:22;;:43;;100190:10;;100202:7;;100167:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;100244:28:0;;-1:-1:-1;;;100244:28:0;;100219:22;;-1:-1:-1;;;;;;100244:16:0;;;-1:-1:-1;100244:16:0;;:28;;100261:10;;100244:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100219:53;-1:-1:-1;100279:24:0;100306:36;100219:53;100325:16;100306:18;:36::i;:::-;100279:63;;100351:25;100379:18;:5;:16;:18::i;:::-;100351:46;-1:-1:-1;100404:23:0;100430:42;:19;100351:46;100430:23;:42::i;:::-;100489:16;;;;-1:-1:-1;99878:651:0;;-1:-1:-1;;;;;;;;;;99878:651: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;98247:131::-;98350:13;;:21;;;-1:-1:-1;;;98350:21:0;;;;98305:14;;-1:-1:-1;;;;;98350:13:0;;:19;;:21;;;;;;;;;;;;;;:13;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;98504:389::-;98576:7;98666:21;98690:13;:5;:11;:13::i;:::-;98740;;98666:37;;-1:-1:-1;98712:52:0;;-1:-1:-1;;;;;98712:19:0;;;;98740:13;98756:7;98712:19;:52::i;:::-;98771:13;;:30;;-1:-1:-1;;;98771:30:0;;-1:-1:-1;;;;;98771:13:0;;;;:21;;:30;;98793:7;;98771:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;98831:20:0;;;;:33;;-1:-1:-1;98856:7:0;98831:24;:33::i;:::-;98808:20;;;:56;-1:-1:-1;98880:7:0;;-1:-1:-1;98504: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;1193:241::-;;1297:2;1285:9;1276:7;1272:23;1268:32;1265:2;;;-1:-1;;1303:12;1265:2;85:6;72:20;97:33;124:5;97:33;:::i;1441:366::-;;;1562:2;1550:9;1541:7;1537:23;1533:32;1530:2;;;-1:-1;;1568:12;1530:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1620:63;1720:2;1759:22;;;;982:20;;-1:-1;;;1524:283::o;1814:235::-;;1915:2;1903:9;1894:7;1890:23;1886:32;1883:2;;;-1:-1;;1921:12;1883:2;219:6;206:20;231:30;255:5;231:30;:::i;2056:257::-;;2168:2;2156:9;2147:7;2143:23;2139:32;2136:2;;;-1:-1;;2174:12;2136:2;354:6;348:13;366:30;390:5;366:30;:::i;2320:309::-;;2458:2;2446:9;2437:7;2433:23;2429:32;2426:2;;;-1:-1;;2464:12;2426:2;515:6;509:13;527:56;577:5;527:56;:::i;2928:261::-;;3042:2;3030:9;3021:7;3017:23;3013:32;3010:2;;;-1:-1;;3048:12;3010:2;-1:-1;853:13;;3004:185;-1:-1;3004:185::o;3196:241::-;;3300:2;3288:9;3279:7;3275:23;3271:32;3268:2;;;-1:-1;;3306:12;3268:2;-1:-1;982:20;;3262:175;-1:-1;3262:175::o;3714:366::-;;;3835:2;3823:9;3814:7;3810:23;3806:32;3803:2;;;-1:-1;;3841:12;3803:2;-1:-1;;982:20;;;3993:2;4032:22;;;982:20;;-1:-1;3797:283::o;16416:271::-;;4627:5;32436:12;4738:52;4783:6;4778:3;4771:4;4764:5;4760:16;4738:52;:::i;:::-;4802:16;;;;;16550:137;-1:-1;;16550:137::o;16694:222::-;-1:-1;;;;;33502:54;;;;4307:37;;16821:2;16806:18;;16792:124::o;16923:349::-;-1:-1;;;;;33502:54;;;;4166:58;;17258:2;17243:18;;16247:37;17086:2;17071:18;;17057:215::o;17279:444::-;-1:-1;;;;;33502:54;;;4307:37;;33502:54;;;;17626:2;17611:18;;4307:37;17709:2;17694:18;;16247:37;;;;17462:2;17447:18;;17433:290::o;18070:210::-;33095:13;;33088:21;4421:34;;18191:2;18176:18;;18162:118::o;18835:310::-;;18982:2;19003:17;18996:47;5331:5;32436:12;32875:6;18982:2;18971:9;18967:18;32863:19;5425:52;5470:6;32903:14;18971:9;32903:14;18982:2;5451:5;5447:16;5425:52;:::i;:::-;35008:7;34992:14;-1:-1;;34988:28;5489:39;;;;32903:14;5489:39;;18953:192;-1:-1;;18953:192::o;19152:416::-;19352:2;19366:47;;;5765:2;19337:18;;;32863:19;5801:34;32903:14;;;5781:55;-1:-1;;;5856:12;;;5849:36;5904:12;;;19323:245::o;19575:416::-;19775:2;19789:47;;;6155:2;19760:18;;;32863:19;6191:34;32903:14;;;6171:55;-1:-1;;;6246:12;;;6239:36;6294:12;;;19746:245::o;19998:416::-;20198:2;20212:47;;;6545:2;20183:18;;;32863:19;6581:34;32903:14;;;6561:55;-1:-1;;;6636:12;;;6629:46;6694:12;;;20169:245::o;20421:416::-;20621:2;20635:47;;;6945:2;20606:18;;;32863:19;6981:29;32903:14;;;6961:50;7030:12;;;20592:245::o;20844:416::-;21044:2;21058:47;;;7281:2;21029:18;;;32863:19;7317:34;32903:14;;;7297:55;-1:-1;;;7372:12;;;7365:43;7427:12;;;21015:245::o;21267:416::-;21467:2;21481:47;;;21452:18;;;32863:19;7714:34;32903:14;;;7694:55;7768:12;;;21438:245::o;21690:416::-;21890:2;21904:47;;;8019:2;21875:18;;;32863:19;8055:32;32903:14;;;8035:53;8107:12;;;21861:245::o;22113:416::-;22313:2;22327:47;;;8358:2;22298:18;;;32863:19;8394:32;32903:14;;;8374:53;8446:12;;;22284:245::o;22536:416::-;22736:2;22750:47;;;8697:2;22721:18;;;32863:19;8733:34;32903:14;;;8713:55;-1:-1;;;8788:12;;;8781:30;8830:12;;;22707:245::o;22959:416::-;23159:2;23173:47;;;9081:2;23144:18;;;32863:19;9117:28;32903:14;;;9097:49;9165:12;;;23130:245::o;23382:416::-;23582:2;23596:47;;;9416:2;23567:18;;;32863:19;9452:34;32903:14;;;9432:55;-1:-1;;;9507:12;;;9500:41;9560:12;;;23553:245::o;23805:416::-;24005:2;24019:47;;;9811:2;23990:18;;;32863:19;9847:34;32903:14;;;9827:55;-1:-1;;;9902:12;;;9895:41;9955:12;;;23976:245::o;24228:416::-;24428:2;24442:47;;;10206:2;24413:18;;;32863:19;10242:29;32903:14;;;10222:50;10291:12;;;24399:245::o;24651:416::-;24851:2;24865:47;;;10542:2;24836:18;;;32863:19;10578:34;32903:14;;;10558:55;-1:-1;;;10633:12;;;10626:25;10670:12;;;24822:245::o;25074:416::-;25274:2;25288:47;;;10921:2;25259:18;;;32863:19;10957:34;32903:14;;;10937:55;-1:-1;;;11012:12;;;11005:29;11053:12;;;25245:245::o;25497:416::-;25697:2;25711:47;;;11304:2;25682:18;;;32863:19;11340:33;32903:14;;;11320:54;11393:12;;;25668:245::o;25920:416::-;26120:2;26134:47;;;25920:416;26105:18;;;32863:19;32903:14;;;26091:245::o;26343:416::-;26543:2;26557:47;;;11915:2;26528:18;;;32863:19;11951:25;32903:14;;;11931:46;11996:12;;;26514:245::o;26766:416::-;26966:2;26980:47;;;12247:2;26951:18;;;32863:19;12283:31;32903:14;;;12263:52;12334:12;;;26937:245::o;27189:416::-;27389:2;27403:47;;;12585:3;27374:18;;;32863:19;12622:34;32903:14;;;12602:55;12691:34;12677:12;;;12670:56;12760:34;12746:12;;;12739:56;-1:-1;;;12815:12;;;12808:40;12867:13;;;27360:245::o;27612:416::-;27812:2;27826:47;;;13119:2;27797:18;;;32863:19;13155:29;32903:14;;;13135:50;13204:12;;;27783:245::o;28035:416::-;28235:2;28249:47;;;13455:2;28220:18;;;32863:19;13491:34;32903:14;;;13471:55;-1:-1;;;13546:12;;;13539:34;13592:12;;;28206:245::o;28458:416::-;28658:2;28672:47;;;13843:2;28643:18;;;32863:19;13879:34;32903:14;;;13859:55;-1:-1;;;13934:12;;;13927:34;13980:12;;;28629:245::o;28881:416::-;29081:2;29095:47;;;14231:2;29066:18;;;32863:19;14267:33;32903:14;;;14247:54;14320:12;;;29052:245::o;29304:416::-;29504:2;29518:47;;;14571:2;29489:18;;;32863:19;14607:28;32903:14;;;14587:49;14655:12;;;29475:245::o;29727:416::-;29927:2;29941:47;;;14906:2;29912:18;;;32863:19;14942:34;32903:14;;;14922:55;-1:-1;;;14997:12;;;14990:38;15047:12;;;29898:245::o;30150:416::-;30350:2;30364:47;;;15298:2;30335:18;;;32863:19;-1:-1;;;32903:14;;;15314:41;15374:12;;;30321:245::o;30573:416::-;30773:2;30787:47;;;15625:2;30758:18;;;32863:19;15661:34;32903:14;;;15641:55;-1:-1;;;15716:12;;;15709:33;15761:12;;;30744:245::o;30996:326::-;16066:23;;16247:37;;31175:2;31160:18;;31146:176::o;31329:222::-;16247:37;;;31456:2;31441:18;;31427:124::o;31558:333::-;16247:37;;;31877:2;31862:18;;16247:37;31713:2;31698:18;;31684:207::o;31898:444::-;16247:37;;;32245:2;32230:18;;16247:37;;;;32328:2;32313:18;;16247:37;32081:2;32066:18;;32052:290::o;34648:268::-;34713:1;34720:101;34734:6;34731:1;34728:13;34720:101;;;34801:11;;;34795:18;34782:11;;;34775:39;34756:2;34749:10;34720:101;;;34836:6;34833:1;34830:13;34827:2;;;-1:-1;;34713:1;34883:16;;34876:27;34697:219::o;35029:117::-;-1:-1;;;;;33502:54;;35088:35;;35078:2;;35137:1;;35127:12;35153:111;35234:5;33095:13;33088:21;35212:5;35209:32;35199:2;;35255:1;;35245:12

Swarm Source

ipfs://cd3b5d2604a21c12484c7b9c568c0e3e55c9a74979dabde0e98e5a6c4b7f61b1

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.