ETH Price: $3,369.96 (-8.15%)
Gas: 9.2 Gwei

Contract

0xeB74c8B319515593a26DaB10a13F19872C2Ecb02
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

> 10 Internal Transactions and > 10 Token Transfers found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
121851152021-04-06 8:43:061353 days ago1617698586
0xeB74c8B3...72C2Ecb02
17.28887203 ETH
121851152021-04-06 8:43:061353 days ago1617698586
0xeB74c8B3...72C2Ecb02
17.28887203 ETH
121847322021-04-06 7:20:231353 days ago1617693623
0xeB74c8B3...72C2Ecb02
4.94892243 ETH
121847322021-04-06 7:20:231353 days ago1617693623
0xeB74c8B3...72C2Ecb02
4.94892243 ETH
121847202021-04-06 7:16:391353 days ago1617693399
0xeB74c8B3...72C2Ecb02
8.52421938 ETH
121847202021-04-06 7:16:391353 days ago1617693399
0xeB74c8B3...72C2Ecb02
8.52421938 ETH
121847202021-04-06 7:16:391353 days ago1617693399
0xeB74c8B3...72C2Ecb02
30.87871138 ETH
121847202021-04-06 7:16:391353 days ago1617693399
0xeB74c8B3...72C2Ecb02
30.87871138 ETH
121842802021-04-06 5:41:151354 days ago1617687675
0xeB74c8B3...72C2Ecb02
27.79873641 ETH
121842802021-04-06 5:41:151354 days ago1617687675
0xeB74c8B3...72C2Ecb02
27.79873641 ETH
121832652021-04-06 1:51:251354 days ago1617673885
0xeB74c8B3...72C2Ecb02
1.24218921 ETH
121832652021-04-06 1:51:251354 days ago1617673885
0xeB74c8B3...72C2Ecb02
1.24218921 ETH
121827462021-04-05 23:46:261354 days ago1617666386
0xeB74c8B3...72C2Ecb02
3.83191909 ETH
121827462021-04-05 23:46:261354 days ago1617666386
0xeB74c8B3...72C2Ecb02
3.83191909 ETH
121824222021-04-05 22:34:311354 days ago1617662071
0xeB74c8B3...72C2Ecb02
14.985 ETH
121824222021-04-05 22:34:311354 days ago1617662071
0xeB74c8B3...72C2Ecb02
14.985 ETH
121819232021-04-05 20:52:421354 days ago1617655962
0xeB74c8B3...72C2Ecb02
83.916 ETH
121819232021-04-05 20:52:421354 days ago1617655962
0xeB74c8B3...72C2Ecb02
83.916 ETH
121814702021-04-05 19:11:221354 days ago1617649882
0xeB74c8B3...72C2Ecb02
55.66223508 ETH
121814702021-04-05 19:11:221354 days ago1617649882
0xeB74c8B3...72C2Ecb02
55.66223508 ETH
121814642021-04-05 19:08:431354 days ago1617649723
0xeB74c8B3...72C2Ecb02
9.29464789 ETH
121814642021-04-05 19:08:431354 days ago1617649723
0xeB74c8B3...72C2Ecb02
9.29464789 ETH
121808882021-04-05 17:05:451354 days ago1617642345
0xeB74c8B3...72C2Ecb02
56.10384 ETH
121808882021-04-05 17:05:451354 days ago1617642345
0xeB74c8B3...72C2Ecb02
56.10384 ETH
121802642021-04-05 14:46:311354 days ago1617633991
0xeB74c8B3...72C2Ecb02
0.04756715 ETH
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xFD1f9381...4a2c77cbE
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
KyberFprReserveV2

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-11
*/

// File: contracts/sol6/IERC20.sol

pragma solidity 0.6.6;


interface IERC20 {
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function decimals() external view returns (uint8 digits);

    function totalSupply() external view returns (uint256 supply);
}


// to support backward compatible contract name -- so function signature remains same
abstract contract ERC20 is IERC20 {

}

// File: contracts/sol6/reserves/IConversionRates.sol

pragma solidity 0.6.6;



interface IConversionRates {

    function recordImbalance(
        IERC20 token,
        int buyAmount,
        uint256 rateUpdateBlock,
        uint256 currentBlock
    ) external;

    function getRate(
        IERC20 token,
        uint256 currentBlockNumber,
        bool buy,
        uint256 qty
    ) external view returns(uint256);
}

// File: contracts/sol6/reserves/IWeth.sol

pragma solidity 0.6.6;



interface IWeth is IERC20 {
    function deposit() external payable;
    function withdraw(uint256 wad) external;
}

// File: contracts/sol6/IKyberSanity.sol

pragma solidity 0.6.6;


interface IKyberSanity {
    function getSanityRate(IERC20 src, IERC20 dest) external view returns (uint256);
}

// File: contracts/sol6/IKyberReserve.sol

pragma solidity 0.6.6;



interface IKyberReserve {
    function trade(
        IERC20 srcToken,
        uint256 srcAmount,
        IERC20 destToken,
        address payable destAddress,
        uint256 conversionRate,
        bool validate
    ) external payable returns (bool);

    function getConversionRate(
        IERC20 src,
        IERC20 dest,
        uint256 srcQty,
        uint256 blockNumber
    ) external view returns (uint256);
}

// File: contracts/sol6/utils/Utils5.sol

pragma solidity 0.6.6;



/**
 * @title Kyber utility file
 * mostly shared constants and rate calculation helpers
 * inherited by most of kyber contracts.
 * previous utils implementations are for previous solidity versions.
 */
contract Utils5 {
    IERC20 internal constant ETH_TOKEN_ADDRESS = IERC20(
        0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
    );
    uint256 internal constant PRECISION = (10**18);
    uint256 internal constant MAX_QTY = (10**28); // 10B tokens
    uint256 internal constant MAX_RATE = (PRECISION * 10**7); // up to 10M tokens per eth
    uint256 internal constant MAX_DECIMALS = 18;
    uint256 internal constant ETH_DECIMALS = 18;
    uint256 constant BPS = 10000; // Basic Price Steps. 1 step = 0.01%
    uint256 internal constant MAX_ALLOWANCE = uint256(-1); // token.approve inifinite

    mapping(IERC20 => uint256) internal decimals;

    function getUpdateDecimals(IERC20 token) internal returns (uint256) {
        if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
        uint256 tokenDecimals = decimals[token];
        // moreover, very possible that old tokens have decimals 0
        // these tokens will just have higher gas fees.
        if (tokenDecimals == 0) {
            tokenDecimals = token.decimals();
            decimals[token] = tokenDecimals;
        }

        return tokenDecimals;
    }

    function setDecimals(IERC20 token) internal {
        if (decimals[token] != 0) return; //already set

        if (token == ETH_TOKEN_ADDRESS) {
            decimals[token] = ETH_DECIMALS;
        } else {
            decimals[token] = token.decimals();
        }
    }

    /// @dev get the balance of a user.
    /// @param token The token type
    /// @return The balance
    function getBalance(IERC20 token, address user) internal view returns (uint256) {
        if (token == ETH_TOKEN_ADDRESS) {
            return user.balance;
        } else {
            return token.balanceOf(user);
        }
    }

    function getDecimals(IERC20 token) internal view returns (uint256) {
        if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
        uint256 tokenDecimals = decimals[token];
        // moreover, very possible that old tokens have decimals 0
        // these tokens will just have higher gas fees.
        if (tokenDecimals == 0) return token.decimals();

        return tokenDecimals;
    }

    function calcDestAmount(
        IERC20 src,
        IERC20 dest,
        uint256 srcAmount,
        uint256 rate
    ) internal view returns (uint256) {
        return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcSrcAmount(
        IERC20 src,
        IERC20 dest,
        uint256 destAmount,
        uint256 rate
    ) internal view returns (uint256) {
        return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcDstQty(
        uint256 srcQty,
        uint256 srcDecimals,
        uint256 dstDecimals,
        uint256 rate
    ) internal pure returns (uint256) {
        require(srcQty <= MAX_QTY, "srcQty > MAX_QTY");
        require(rate <= MAX_RATE, "rate > MAX_RATE");

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS");
            return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS");
            return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
        }
    }

    function calcSrcQty(
        uint256 dstQty,
        uint256 srcDecimals,
        uint256 dstDecimals,
        uint256 rate
    ) internal pure returns (uint256) {
        require(dstQty <= MAX_QTY, "dstQty > MAX_QTY");
        require(rate <= MAX_RATE, "rate > MAX_RATE");

        //source quantity is rounded up. to avoid dest quantity being too low.
        uint256 numerator;
        uint256 denominator;
        if (srcDecimals >= dstDecimals) {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS");
            numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
            denominator = rate;
        } else {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS");
            numerator = (PRECISION * dstQty);
            denominator = (rate * (10**(dstDecimals - srcDecimals)));
        }
        return (numerator + denominator - 1) / denominator; //avoid rounding down errors
    }

    function calcRateFromQty(
        uint256 srcAmount,
        uint256 destAmount,
        uint256 srcDecimals,
        uint256 dstDecimals
    ) internal pure returns (uint256) {
        require(srcAmount <= MAX_QTY, "srcAmount > MAX_QTY");
        require(destAmount <= MAX_QTY, "destAmount > MAX_QTY");

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS");
            return ((destAmount * PRECISION) / ((10**(dstDecimals - srcDecimals)) * srcAmount));
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS");
            return ((destAmount * PRECISION * (10**(srcDecimals - dstDecimals))) / srcAmount);
        }
    }

    function minOf(uint256 x, uint256 y) internal pure returns (uint256) {
        return x > y ? y : x;
    }
}

// File: contracts/sol6/utils/PermissionGroups3.sol

pragma solidity 0.6.6;

contract PermissionGroups3 {
    uint256 internal constant MAX_GROUP_SIZE = 50;

    address public admin;
    address public pendingAdmin;
    mapping(address => bool) internal operators;
    mapping(address => bool) internal alerters;
    address[] internal operatorsGroup;
    address[] internal alertersGroup;

    event AdminClaimed(address newAdmin, address previousAdmin);

    event TransferAdminPending(address pendingAdmin);

    event OperatorAdded(address newOperator, bool isAdd);

    event AlerterAdded(address newAlerter, bool isAdd);

    constructor(address _admin) public {
        require(_admin != address(0), "admin 0");
        admin = _admin;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "only admin");
        _;
    }

    modifier onlyOperator() {
        require(operators[msg.sender], "only operator");
        _;
    }

    modifier onlyAlerter() {
        require(alerters[msg.sender], "only alerter");
        _;
    }

    function getOperators() external view returns (address[] memory) {
        return operatorsGroup;
    }

    function getAlerters() external view returns (address[] memory) {
        return alertersGroup;
    }

    /**
     * @dev Allows the current admin to set the pendingAdmin address.
     * @param newAdmin The address to transfer ownership to.
     */
    function transferAdmin(address newAdmin) public onlyAdmin {
        require(newAdmin != address(0), "new admin 0");
        emit TransferAdminPending(newAdmin);
        pendingAdmin = newAdmin;
    }

    /**
     * @dev Allows the current admin to set the admin in one tx. Useful initial deployment.
     * @param newAdmin The address to transfer ownership to.
     */
    function transferAdminQuickly(address newAdmin) public onlyAdmin {
        require(newAdmin != address(0), "admin 0");
        emit TransferAdminPending(newAdmin);
        emit AdminClaimed(newAdmin, admin);
        admin = newAdmin;
    }

    /**
     * @dev Allows the pendingAdmin address to finalize the change admin process.
     */
    function claimAdmin() public {
        require(pendingAdmin == msg.sender, "not pending");
        emit AdminClaimed(pendingAdmin, admin);
        admin = pendingAdmin;
        pendingAdmin = address(0);
    }

    function addAlerter(address newAlerter) public onlyAdmin {
        require(!alerters[newAlerter], "alerter exists"); // prevent duplicates.
        require(alertersGroup.length < MAX_GROUP_SIZE, "max alerters");

        emit AlerterAdded(newAlerter, true);
        alerters[newAlerter] = true;
        alertersGroup.push(newAlerter);
    }

    function removeAlerter(address alerter) public onlyAdmin {
        require(alerters[alerter], "not alerter");
        alerters[alerter] = false;

        for (uint256 i = 0; i < alertersGroup.length; ++i) {
            if (alertersGroup[i] == alerter) {
                alertersGroup[i] = alertersGroup[alertersGroup.length - 1];
                alertersGroup.pop();
                emit AlerterAdded(alerter, false);
                break;
            }
        }
    }

    function addOperator(address newOperator) public onlyAdmin {
        require(!operators[newOperator], "operator exists"); // prevent duplicates.
        require(operatorsGroup.length < MAX_GROUP_SIZE, "max operators");

        emit OperatorAdded(newOperator, true);
        operators[newOperator] = true;
        operatorsGroup.push(newOperator);
    }

    function removeOperator(address operator) public onlyAdmin {
        require(operators[operator], "not operator");
        operators[operator] = false;

        for (uint256 i = 0; i < operatorsGroup.length; ++i) {
            if (operatorsGroup[i] == operator) {
                operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1];
                operatorsGroup.pop();
                emit OperatorAdded(operator, false);
                break;
            }
        }
    }
}

// File: contracts/sol6/utils/Withdrawable3.sol

pragma solidity 0.6.6;



contract Withdrawable3 is PermissionGroups3 {
    constructor(address _admin) public PermissionGroups3(_admin) {}

    event TokenWithdraw(IERC20 token, uint256 amount, address sendTo);

    event EtherWithdraw(uint256 amount, address sendTo);

    /**
     * @dev Withdraw all IERC20 compatible tokens
     * @param token IERC20 The address of the token contract
     */
    function withdrawToken(
        IERC20 token,
        uint256 amount,
        address sendTo
    ) external onlyAdmin {
        token.transfer(sendTo, amount);
        emit TokenWithdraw(token, amount, sendTo);
    }

    /**
     * @dev Withdraw Ethers
     */
    function withdrawEther(uint256 amount, address payable sendTo) external onlyAdmin {
        (bool success, ) = sendTo.call{value: amount}("");
        require(success);
        emit EtherWithdraw(amount, sendTo);
    }
}

// File: contracts/sol6/utils/zeppelin/SafeMath.sol

pragma solidity 0.6.6;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

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

// File: contracts/sol6/utils/zeppelin/Address.sol

pragma solidity 0.6.6;

/**
 * @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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

// File: contracts/sol6/utils/zeppelin/SafeERC20.sol

pragma solidity 0.6.6;




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

    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.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "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/sol6/reserves/KyberFprReserveV2.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.6;









/// @title KyberFprReserve version 2
/// Allow Reserve to work work with either weth or eth.
/// for working with weth should specify external address to hold weth.
/// Allow Reserve to set maxGasPriceWei to trade with
contract KyberFprReserveV2 is IKyberReserve, Utils5, Withdrawable3 {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    mapping(bytes32 => bool) public approvedWithdrawAddresses; // sha3(token,address)=>bool
    mapping(address => address) public tokenWallet;

    struct ConfigData {
        bool tradeEnabled;
        bool doRateValidation; // whether to do rate validation in trade func
        uint128 maxGasPriceWei;
    }

    address public kyberNetwork;
    ConfigData internal configData;

    IConversionRates public conversionRatesContract;
    IKyberSanity public sanityRatesContract;
    IWeth public weth;

    event DepositToken(IERC20 indexed token, uint256 amount);
    event TradeExecute(
        address indexed origin,
        IERC20 indexed src,
        uint256 srcAmount,
        IERC20 indexed destToken,
        uint256 destAmount,
        address payable destAddress
    );
    event TradeEnabled(bool enable);
    event MaxGasPriceUpdated(uint128 newMaxGasPrice);
    event DoRateValidationUpdated(bool doRateValidation);
    event WithdrawAddressApproved(IERC20 indexed token, address indexed addr, bool approve);
    event NewTokenWallet(IERC20 indexed token, address indexed wallet);
    event WithdrawFunds(IERC20 indexed token, uint256 amount, address indexed destination);
    event SetKyberNetworkAddress(address indexed network);
    event SetConversionRateAddress(IConversionRates indexed rate);
    event SetWethAddress(IWeth indexed weth);
    event SetSanityRateAddress(IKyberSanity indexed sanity);

    constructor(
        address _kyberNetwork,
        IConversionRates _ratesContract,
        IWeth _weth,
        uint128 _maxGasPriceWei,
        bool _doRateValidation,
        address _admin
    ) public Withdrawable3(_admin) {
        require(_kyberNetwork != address(0), "kyberNetwork 0");
        require(_ratesContract != IConversionRates(0), "ratesContract 0");
        require(_weth != IWeth(0), "weth 0");
        kyberNetwork = _kyberNetwork;
        conversionRatesContract = _ratesContract;
        weth = _weth;
        configData = ConfigData({
            tradeEnabled: true,
            maxGasPriceWei: _maxGasPriceWei,
            doRateValidation: _doRateValidation
        });
    }

    receive() external payable {
        emit DepositToken(ETH_TOKEN_ADDRESS, msg.value);
    }

    function trade(
        IERC20 srcToken,
        uint256 srcAmount,
        IERC20 destToken,
        address payable destAddress,
        uint256 conversionRate,
        bool /* validate */
    ) external override payable returns (bool) {
        require(msg.sender == kyberNetwork, "wrong sender");
        ConfigData memory data = configData;
        require(data.tradeEnabled, "trade not enable");
        require(tx.gasprice <= uint256(data.maxGasPriceWei), "gas price too high");

        doTrade(
            srcToken,
            srcAmount,
            destToken,
            destAddress,
            conversionRate,
            data.doRateValidation
        );

        return true;
    }

    function enableTrade() external onlyAdmin {
        configData.tradeEnabled = true;
        emit TradeEnabled(true);
    }

    function disableTrade() external onlyAlerter {
        configData.tradeEnabled = false;
        emit TradeEnabled(false);
    }

    function setMaxGasPrice(uint128 newMaxGasPrice) external onlyOperator {
        configData.maxGasPriceWei = newMaxGasPrice;
        emit MaxGasPriceUpdated(newMaxGasPrice);
    }

    function setDoRateValidation(bool _doRateValidation) external onlyAdmin {
        configData.doRateValidation = _doRateValidation;
        emit DoRateValidationUpdated(_doRateValidation);
    }

    function approveWithdrawAddress(
        IERC20 token,
        address addr,
        bool approve
    ) external onlyAdmin {
        approvedWithdrawAddresses[keccak256(abi.encodePacked(address(token), addr))] = approve;
        setDecimals(token);
        emit WithdrawAddressApproved(token, addr, approve);
    }

    /// @dev allow set tokenWallet[token] back to 0x0 address
    /// @dev in case of using weth from external wallet, must call set token wallet for weth
    ///      tokenWallet for weth must be different from this reserve address
    function setTokenWallet(IERC20 token, address wallet) external onlyAdmin {
        tokenWallet[address(token)] = wallet;
        setDecimals(token);
        emit NewTokenWallet(token, wallet);
    }

    /// @dev withdraw amount of token to an approved destination
    ///      if reserve is using weth instead of eth, should call withdraw weth
    /// @param token token to withdraw
    /// @param amount amount to withdraw
    /// @param destination address to transfer fund to
    function withdraw(
        IERC20 token,
        uint256 amount,
        address destination
    ) external onlyOperator {
        require(
            approvedWithdrawAddresses[keccak256(abi.encodePacked(address(token), destination))],
            "destination is not approved"
        );

        if (token == ETH_TOKEN_ADDRESS) {
            (bool success, ) = destination.call{value: amount}("");
            require(success, "withdraw eth failed");
        } else {
            address wallet = getTokenWallet(token);
            if (wallet == address(this)) {
                token.safeTransfer(destination, amount);
            } else {
                token.safeTransferFrom(wallet, destination, amount);
            }
        }

        emit WithdrawFunds(token, amount, destination);
    }

    function setKyberNetwork(address _newNetwork) external onlyAdmin {
        require(_newNetwork != address(0), "kyberNetwork 0");
        kyberNetwork = _newNetwork;
        emit SetKyberNetworkAddress(_newNetwork);
    }

    function setConversionRate(IConversionRates _newConversionRate) external onlyAdmin {
        require(_newConversionRate != IConversionRates(0), "conversionRates 0");
        conversionRatesContract = _newConversionRate;
        emit SetConversionRateAddress(_newConversionRate);
    }

    /// @dev weth is unlikely to be changed, but added this function to keep the flexibilty
    function setWeth(IWeth _newWeth) external onlyAdmin {
        require(_newWeth != IWeth(0), "weth 0");
        weth = _newWeth;
        emit SetWethAddress(_newWeth);
    }

    /// @dev sanity rate can be set to 0x0 address to disable sanity rate check
    function setSanityRate(IKyberSanity _newSanity) external onlyAdmin {
        sanityRatesContract = _newSanity;
        emit SetSanityRateAddress(_newSanity);
    }

    function getConversionRate(
        IERC20 src,
        IERC20 dest,
        uint256 srcQty,
        uint256 blockNumber
    ) external override view returns (uint256) {
        ConfigData memory data = configData;
        if (!data.tradeEnabled) return 0;
        if (tx.gasprice > uint256(data.maxGasPriceWei)) return 0;
        if (srcQty == 0) return 0;

        IERC20 token;
        bool isBuy;

        if (ETH_TOKEN_ADDRESS == src) {
            isBuy = true;
            token = dest;
        } else if (ETH_TOKEN_ADDRESS == dest) {
            isBuy = false;
            token = src;
        } else {
            return 0; // pair is not listed
        }

        uint256 rate;
        try conversionRatesContract.getRate(token, blockNumber, isBuy, srcQty) returns(uint256 r) {
            rate = r;
        } catch {
            return 0;
        }
        uint256 destQty = calcDestAmount(src, dest, srcQty, rate);

        if (getBalance(dest) < destQty) return 0;

        if (sanityRatesContract != IKyberSanity(0)) {
            uint256 sanityRate = sanityRatesContract.getSanityRate(src, dest);
            if (rate > sanityRate) return 0;
        }

        return rate;
    }

    function isAddressApprovedForWithdrawal(IERC20 token, address addr)
        external
        view
        returns (bool)
    {
        return approvedWithdrawAddresses[keccak256(abi.encodePacked(address(token), addr))];
    }

    function tradeEnabled() external view returns (bool) {
        return configData.tradeEnabled;
    }

    function maxGasPriceWei() external view returns (uint128) {
        return configData.maxGasPriceWei;
    }

    function doRateValidation() external view returns (bool) {
        return configData.doRateValidation;
    }

    /// @dev return available balance of a token that reserve can use
    ///      if using weth, call getBalance(eth) will return weth balance
    ///      if using wallet for token, will return min of balance and allowance
    /// @param token token to get available balance that reserve can use
    function getBalance(IERC20 token) public view returns (uint256) {
        address wallet = getTokenWallet(token);
        IERC20 usingToken;

        if (token == ETH_TOKEN_ADDRESS) {
            if (wallet == address(this)) {
                // reserve should be using eth instead of weth
                return address(this).balance;
            }
            // reserve is using weth instead of eth
            usingToken = weth;
        } else {
            if (wallet == address(this)) {
                // not set token wallet or reserve is the token wallet, no need to check allowance
                return token.balanceOf(address(this));
            }
            usingToken = token;
        }

        uint256 balanceOfWallet = usingToken.balanceOf(wallet);
        uint256 allowanceOfWallet = usingToken.allowance(wallet, address(this));

        return minOf(balanceOfWallet, allowanceOfWallet);
    }

    /// @dev return wallet that holds the token
    ///      if token is ETH, check tokenWallet of WETH instead
    ///      if wallet is 0x0, consider as this reserve address
    function getTokenWallet(IERC20 token) public view returns (address wallet) {
        wallet = (token == ETH_TOKEN_ADDRESS)
            ? tokenWallet[address(weth)]
            : tokenWallet[address(token)];
        if (wallet == address(0)) {
            wallet = address(this);
        }
    }

    /// @dev do a trade, re-validate the conversion rate, remove trust assumption with network
    /// @param srcToken Src token
    /// @param srcAmount Amount of src token
    /// @param destToken Destination token
    /// @param destAddress Destination address to send tokens to
    /// @param validateRate re-validate rate or not
    function doTrade(
        IERC20 srcToken,
        uint256 srcAmount,
        IERC20 destToken,
        address payable destAddress,
        uint256 conversionRate,
        bool validateRate
    ) internal {
        require(conversionRate > 0, "rate is 0");

        bool isBuy = srcToken == ETH_TOKEN_ADDRESS;
        if (isBuy) {
            require(msg.value == srcAmount, "wrong msg value");
        } else {
            require(msg.value == 0, "bad msg value");
        }

        if (validateRate) {
            uint256 rate = conversionRatesContract.getRate(
                isBuy ? destToken : srcToken,
                block.number,
                isBuy,
                srcAmount
            );
            // re-validate conversion rate
            require(rate >= conversionRate, "reserve rate lower then network requested rate");
            if (sanityRatesContract != IKyberSanity(0)) {
                // sanity rate check
                uint256 sanityRate = sanityRatesContract.getSanityRate(srcToken, destToken);
                require(rate <= sanityRate, "rate should not be greater than sanity rate" );
            }
        }

        uint256 destAmount = calcDestAmount(srcToken, destToken, srcAmount, conversionRate);
        require(destAmount > 0, "dest amount is 0");

        address srcTokenWallet = getTokenWallet(srcToken);
        address destTokenWallet = getTokenWallet(destToken);

        if (isBuy) {
            // add to imbalance
            conversionRatesContract.recordImbalance(
                destToken,
                int256(destAmount),
                0,
                block.number
            );
            // if reserve is using weth, convert eth to weth and transfer weth to its' tokenWallet
            if (srcTokenWallet != address(this)) {
                weth.deposit{value: msg.value}();
                IERC20(weth).safeTransfer(srcTokenWallet, msg.value);
            }
            // transfer dest token from tokenWallet to destAddress
            if (destTokenWallet == address(this)) {
                destToken.safeTransfer(destAddress, destAmount);
            } else {
                destToken.safeTransferFrom(destTokenWallet, destAddress, destAmount);
            }
        } else {
            // add to imbalance
            conversionRatesContract.recordImbalance(
                srcToken,
                -1 * int256(srcAmount),
                0,
                block.number
            );
            // collect src token from sender
            srcToken.safeTransferFrom(msg.sender, srcTokenWallet, srcAmount);
            // if reserve is using weth, reserve needs to collect weth from tokenWallet,
            // then convert it to eth
            if (destTokenWallet != address(this)) {
                IERC20(weth).safeTransferFrom(destTokenWallet, address(this), destAmount);
                weth.withdraw(destAmount);
            }
            // transfer eth to destAddress
            (bool success, ) = destAddress.call{value: destAmount}("");
            require(success, "transfer eth from reserve to destAddress failed");
        }

        emit TradeExecute(msg.sender, srcToken, srcAmount, destToken, destAmount, destAddress);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_kyberNetwork","type":"address"},{"internalType":"contract IConversionRates","name":"_ratesContract","type":"address"},{"internalType":"contract IWeth","name":"_weth","type":"address"},{"internalType":"uint128","name":"_maxGasPriceWei","type":"uint128"},{"internalType":"bool","name":"_doRateValidation","type":"bool"},{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAlerter","type":"address"},{"indexed":false,"internalType":"bool","name":"isAdd","type":"bool"}],"name":"AlerterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"doRateValidation","type":"bool"}],"name":"DoRateValidationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"newMaxGasPrice","type":"uint128"}],"name":"MaxGasPriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"NewTokenWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"},{"indexed":false,"internalType":"bool","name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IConversionRates","name":"rate","type":"address"}],"name":"SetConversionRateAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"network","type":"address"}],"name":"SetKyberNetworkAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IKyberSanity","name":"sanity","type":"address"}],"name":"SetSanityRateAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWeth","name":"weth","type":"address"}],"name":"SetWethAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"TradeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"origin","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"src","type":"address"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"destToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"destAmount","type":"uint256"},{"indexed":false,"internalType":"address payable","name":"destAddress","type":"address"}],"name":"TradeExecute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"WithdrawAddressApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"destination","type":"address"}],"name":"WithdrawFunds","type":"event"},{"inputs":[{"internalType":"address","name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"approve","type":"bool"}],"name":"approveWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"approvedWithdrawAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"conversionRatesContract","outputs":[{"internalType":"contract IConversionRates","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"doRateValidation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAlerters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"srcQty","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"getTokenWallet","outputs":[{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressApprovedForWithdrawal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kyberNetwork","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasPriceWei","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sanityRatesContract","outputs":[{"internalType":"contract IKyberSanity","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IConversionRates","name":"_newConversionRate","type":"address"}],"name":"setConversionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_doRateValidation","type":"bool"}],"name":"setDoRateValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newNetwork","type":"address"}],"name":"setKyberNetwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newMaxGasPrice","type":"uint128"}],"name":"setMaxGasPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKyberSanity","name":"_newSanity","type":"address"}],"name":"setSanityRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setTokenWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWeth","name":"_newWeth","type":"address"}],"name":"setWeth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"destToken","type":"address"},{"internalType":"address payable","name":"destAddress","type":"address"},{"internalType":"uint256","name":"conversionRate","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"name":"trade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"tradeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWeth","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x6080604052600436106102885760003560e01c80637c423f5411610153578063b8d1452f116100cb578063d7b7024d1161007f578063f851a44011610064578063f851a44014610a7e578063f8b2cb4f14610a93578063fa30728114610ad3576102d9565b8063d7b7024d14610a1a578063ef3881c814610a44576102d9565b8063ce56c454116100b0578063ce56c454146109aa578063d5847d33146109f0578063d621e81314610a05576102d9565b8063b8d1452f1461092e578063cac1d6491461096e576102d9565b80639870d7fe11610122578063a80cbac611610107578063a80cbac614610899578063ac8a584a146108d9578063b78b842d14610919576102d9565b80639870d7fe14610811578063a56bb95b14610851576102d9565b80637c423f54146107145780637cd442721461072957806380f4da8b1461079157806385d75025146107d1576102d9565b806347e6924f116102015780636940030f116101b557806375829def1161019a57806375829def1461067f57806377f50f97146106bf5780637acc8678146106d4576102d9565b80636940030f146106115780636cf6981114610626576102d9565b806354869d20116101e657806354869d201461055557806354a325a61461058157806369328dec146105c1576102d9565b806347e6924f146104ee578063546dc71c14610503576102d9565b806326782247116102585780633ccdbb281161023d5780633ccdbb28146104495780633fc8cef314610499578063408ee7fe146104ae576102d9565b806326782247146103a657806327a099d8146103e4576102d9565b806299d386146102de57806301a12fd3146102f55780630299c694146103355780631bc7bfec1461035e576102d9565b366102d95760408051348152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee917f2d0c0a8842b9944ece1495eb61121621b5e36bd6af3bba0318c695f525aef79f919081900360200190a2005b600080fd5b3480156102ea57600080fd5b506102f3610b13565b005b34801561030157600080fd5b506102f36004803603602081101561031857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610bfb565b34801561034157600080fd5b5061034a610f2b565b604080519115158252519081900360200190f35b34801561036a57600080fd5b506102f36004803603604081101561038157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610f39565b3480156103b257600080fd5b506103bb611079565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156103f057600080fd5b506103f9611095565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561043557818101518382015260200161041d565b505050509050019250505060405180910390f35b34801561045557600080fd5b506102f36004803603606081101561046c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359160409091013516611104565b3480156104a557600080fd5b506103bb611299565b3480156104ba57600080fd5b506102f3600480360360208110156104d157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166112b5565b3480156104fa57600080fd5b506103bb61153b565b34801561050f57600080fd5b506102f36004803603606081101561052657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001351515611557565b34801561056157600080fd5b506102f36004803603602081101561057857600080fd5b503515156116cc565b34801561058d57600080fd5b506102f3600480360360208110156105a457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117be565b3480156105cd57600080fd5b506102f3600480360360608110156105e457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359160409091013516611935565b34801561061d57600080fd5b506102f3611c77565b61034a600480360360c081101561063c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013591604082013581169160608101359091169060808101359060a001351515611d53565b34801561068b57600080fd5b506102f3600480360360208110156106a257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f3c565b3480156106cb57600080fd5b506102f36120d4565b3480156106e057600080fd5b506102f3600480360360208110156106f757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166121ff565b34801561072057600080fd5b506103f96123ec565b34801561073557600080fd5b5061077f6004803603608081101561074c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060600135612459565b60408051918252519081900360200190f35b34801561079d57600080fd5b506102f3600480360360208110156107b457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661275f565b3480156107dd57600080fd5b506103bb600480360360208110156107f457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612854565b34801561081d57600080fd5b506102f36004803603602081101561083457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612905565b34801561085d57600080fd5b5061034a6004803603604081101561087457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612b8b565b3480156108a557600080fd5b506103bb600480360360208110156108bc57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612bf8565b3480156108e557600080fd5b506102f3600480360360208110156108fc57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612c20565b34801561092557600080fd5b506103bb612f4c565b34801561093a57600080fd5b506102f36004803603602081101561095157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612f68565b34801561097a57600080fd5b506102f36004803603602081101561099157600080fd5b50356fffffffffffffffffffffffffffffffff166130df565b3480156109b657600080fd5b506102f3600480360360408110156109cd57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166131da565b3480156109fc57600080fd5b506103bb613320565b348015610a1157600080fd5b5061034a61333c565b348015610a2657600080fd5b5061034a60048036036020811015610a3d57600080fd5b5035613345565b348015610a5057600080fd5b50610a5961335a565b604080516fffffffffffffffffffffffffffffffff9092168252519081900360200190f35b348015610a8a57600080fd5b506103bb613378565b348015610a9f57600080fd5b5061077f60048036036020811015610ab657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613394565b348015610adf57600080fd5b506102f360048036036020811015610af657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613649565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560408051918252517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7359181900360200190a1565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c8157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff16610d1557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6572746572000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260046020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600654811015610f27578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610d8f57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415610f1f57600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610de757fe5b6000918252602090912001546006805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610e1a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006805480610e6d57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092556040805173ffffffffffffffffffffffffffffffffffffffff861681529182019290925281517f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762929181900390910190a1610f27565b600101610d61565b5050565b600a54610100900460ff1690565b60015473ffffffffffffffffffffffffffffffffffffffff163314610fbf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff828116600090815260086020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691831691909117905561101b826137c0565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f81995c7b922889ac0a81e41866106d4046268ea3a9abaae9f9e080a6ce36ee7d60405160405180910390a35050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b606060058054806020026020016040519081016040528092919081815260200182805480156110fa57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116110cf575b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331461118a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561121157600080fd5b505af1158015611225573d6000803e3d6000fd5b505050506040513d602081101561123b57600080fd5b50506040805173ffffffffffffffffffffffffffffffffffffffff80861682526020820185905283168183015290517f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e69181900360600190a1505050565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16331461133b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff16156113d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f616c657274657220657869737473000000000000000000000000000000000000604482015290519081900360640190fd5b60065460321161144157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d617820616c6572746572730000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff831681526001602082015281517f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762929181900390910190a173ffffffffffffffffffffffffffffffffffffffff16600081815260046020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1633146115dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408051606085811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529186901b1660348301528251808303602801815260489092018352815191810191909120600090815260079091522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016821515179055611675836137c0565b604080518215158152905173ffffffffffffffffffffffffffffffffffffffff80851692908616917fd5fd5351efae1f4bb760079da9f0ff9589e2c3e216337ca9d39cdff573b245c49181900360200190a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461175257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600a805482151561010081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9092169190911790915560408051918252517f89db626a89e1048b2c196cafdaf6158cfd934276037ba2d562a154b661aaa2e79181900360200190a150565b60015473ffffffffffffffffffffffffffffffffffffffff16331461184457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166118c657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6b796265724e6574776f726b2030000000000000000000000000000000000000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f379acac7823b50b8ac0626f4b125da7f930be2a6abd7e43d9a75198a8ec00eb890600090a250565b3360009081526003602052604090205460ff166119b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c79206f70657261746f7200000000000000000000000000000000000000604482015290519081900360640190fd5b60408051606085811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529185901b166034830152825180830360280181526048909201835281519181019190912060009081526007909152205460ff16611a8757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f64657374696e6174696f6e206973206e6f7420617070726f7665640000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611b8c5760405160009073ffffffffffffffffffffffffffffffffffffffff83169084908381818185875af1925050503d8060008114611b11576040519150601f19603f3d011682016040523d82523d6000602084013e611b16565b606091505b5050905080611b8657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f776974686472617720657468206661696c656400000000000000000000000000604482015290519081900360640190fd5b50611c0d565b6000611b9784612854565b905073ffffffffffffffffffffffffffffffffffffffff8116301415611be357611bde73ffffffffffffffffffffffffffffffffffffffff8516838563ffffffff6138f216565b611c0b565b611c0b73ffffffffffffffffffffffffffffffffffffffff851682848663ffffffff61398416565b505b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb67719fc33c1f17d31bf3a698690d62066b1e0bae28fcd3c56cf2c015c2863d6846040518082815260200191505060405180910390a3505050565b3360009081526004602052604090205460ff16611cf557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920616c65727465720000000000000000000000000000000000000000604482015290519081900360640190fd5b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055604080516000815290517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7359181900360200190a1565b60095460009073ffffffffffffffffffffffffffffffffffffffff163314611ddc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f77726f6e672073656e6465720000000000000000000000000000000000000000604482015290519081900360640190fd5b611de46148f6565b5060408051606081018252600a5460ff8082161515808452610100830490911615156020840152620100009091046fffffffffffffffffffffffffffffffff169282019290925290611e9757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f7472616465206e6f7420656e61626c6500000000000000000000000000000000604482015290519081900360640190fd5b80604001516fffffffffffffffffffffffffffffffff163a1115611f1c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f67617320707269636520746f6f20686967680000000000000000000000000000604482015290519081900360640190fd5b611f2e88888888888660200151613a1f565b506001979650505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611fc257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661204457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e65772061646d696e2030000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60025473ffffffffffffffffffffffffffffffffffffffff16331461215a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f742070656e64696e67000000000000000000000000000000000000000000604482015290519081900360640190fd5b6002546001546040805173ffffffffffffffffffffffffffffffffffffffff938416815292909116602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a160028054600180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b60015473ffffffffffffffffffffffffffffffffffffffff16331461228557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661230757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f61646d696e203000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a16001546040805173ffffffffffffffffffffffffffffffffffffffff8085168252909216602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606060068054806020026020016040519081016040528092919081815260200182805480156110fa5760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116110cf575050505050905090565b60006124636148f6565b5060408051606081018252600a5460ff8082161515808452610100830490911615156020840152620100009091046fffffffffffffffffffffffffffffffff1692820192909252906124b9576000915050612757565b80604001516fffffffffffffffffffffffffffffffff163a11156124e1576000915050612757565b836124f0576000915050612757565b60008073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8916141561253057508590506001612579565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8816141561256d57508690506000612579565b60009350505050612757565b600b54604080517fb8e9c22e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990528415156044830152606482018a90529151600093929092169163b8e9c22e91608480820192602092909190829003018186803b15801561260657600080fd5b505afa92505050801561262b57506040513d602081101561262657600080fd5b505160015b61263c576000945050505050612757565b9050600061264c8a8a8a8561433d565b9050806126588a613394565b101561266c57600095505050505050612757565b600c5473ffffffffffffffffffffffffffffffffffffffff161561275057600c54604080517fa58092b700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301528c811660248301529151600093929092169163a58092b791604480820192602092909190829003018186803b15801561270957600080fd5b505afa15801561271d573d6000803e3d6000fd5b505050506040513d602081101561273357600080fd5b505190508083111561274e5760009650505050505050612757565b505b5093505050505b949350505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146127e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517faa5a0552d43d8d9e7d64c0286bcfceeccb1875e7320c1ac63f71e9894f17716690600090a250565b600073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146128b45773ffffffffffffffffffffffffffffffffffffffff808316600090815260086020526040902054166128e0565b600d5473ffffffffffffffffffffffffffffffffffffffff908116600090815260086020526040902054165b905073ffffffffffffffffffffffffffffffffffffffff81166129005750305b919050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461298b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff1615612a2057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6f70657261746f72206578697374730000000000000000000000000000000000604482015290519081900360640190fd5b600554603211612a9157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d6178206f70657261746f727300000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff831681526001602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a173ffffffffffffffffffffffffffffffffffffffff16600081815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b81166020808401919091529390941b9093166034840152805160288185030181526048909301815282519282019290922060009081526007909152205460ff1690565b60086020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314612ca657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff16612d3a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f74206f70657261746f720000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600554811015610f27578173ffffffffffffffffffffffffffffffffffffffff1660058281548110612db457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415612f4457600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612e0c57fe5b6000918252602090912001546005805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612e3f57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005805480612e9257fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092556040805173ffffffffffffffffffffffffffffffffffffffff861681529182019290925281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a1610f27565b600101612d86565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314612fee57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661307057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f7765746820300000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fff8ab24f675c1eee431de04d5ba93b5d6e1e947359771788c5db3968d10c2e3e90600090a250565b3360009081526003602052604090205460ff1661315d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c79206f70657261746f7200000000000000000000000000000000000000604482015290519081900360640190fd5b600a80546fffffffffffffffffffffffffffffffff83166201000081027fffffffffffffffffffffffffffff00000000000000000000000000000000ffff9092169190911790915560408051918252517f951ddb0e961044819fc0750a51148b147386ae97b72d9b6763f9b943de116e329181900360200190a150565b60015473ffffffffffffffffffffffffffffffffffffffff16331461326057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b60405160009073ffffffffffffffffffffffffffffffffffffffff83169084908381818185875af1925050503d80600081146132b8576040519150601f19603f3d011682016040523d82523d6000602084013e6132bd565b606091505b50509050806132cb57600080fd5b6040805184815273ffffffffffffffffffffffffffffffffffffffff8416602082015281517fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de929181900390910190a1505050565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b600a5460ff1690565b60076020526000908152604090205460ff1681565b600a546201000090046fffffffffffffffffffffffffffffffff1690565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6000806133a083612854565b9050600073ffffffffffffffffffffffffffffffffffffffff841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561341d5773ffffffffffffffffffffffffffffffffffffffff82163014156133fe574792505050612900565b50600d5473ffffffffffffffffffffffffffffffffffffffff166134e0565b73ffffffffffffffffffffffffffffffffffffffff82163014156134dd57604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8616916370a08231916024808301926020929190829003018186803b1580156134a757600080fd5b505afa1580156134bb573d6000803e3d6000fd5b505050506040513d60208110156134d157600080fd5b50519250612900915050565b50825b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561355f57600080fd5b505afa158015613573573d6000803e3d6000fd5b505050506040513d602081101561358957600080fd5b5051604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015230602483015291519293506000929185169163dd62ed3e91604480820192602092909190829003018186803b15801561360757600080fd5b505afa15801561361b573d6000803e3d6000fd5b505050506040513d602081101561363157600080fd5b5051905061363f8282614364565b9695505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146136cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661375157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f636f6e76657273696f6e52617465732030000000000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f333c220e52469bea5ce17b670353e10868f0c96768325592128e44d06e5b99cc90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902054156137f0576138ef565b73ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156138505773ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020601290556138ef565b8073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561389657600080fd5b505afa1580156138aa573d6000803e3d6000fd5b505050506040513d60208110156138c057600080fd5b505173ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902060ff90911690555b50565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261397f90849061437c565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052613a1990859061437c565b50505050565b60008211613a8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f7261746520697320300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015613b3457853414613b2f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f77726f6e67206d73672076616c75650000000000000000000000000000000000604482015290519081900360640190fd5b613ba1565b3415613ba157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f626164206d73672076616c756500000000000000000000000000000000000000604482015290519081900360640190fd5b8115613e0357600b5460009073ffffffffffffffffffffffffffffffffffffffff1663b8e9c22e83613bd35789613bd5565b875b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301524360248301528515156044830152606482018b9052516084808301926020929190829003018186803b158015613c5457600080fd5b505afa158015613c68573d6000803e3d6000fd5b505050506040513d6020811015613c7e57600080fd5b5051905083811015613cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614942602e913960400191505060405180910390fd5b600c5473ffffffffffffffffffffffffffffffffffffffff1615613e0157600c54604080517fa58092b700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015289811660248301529151600093929092169163a58092b791604480820192602092909190829003018186803b158015613d7857600080fd5b505afa158015613d8c573d6000803e3d6000fd5b505050506040513d6020811015613da257600080fd5b5051905080821115613dff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614917602b913960400191505060405180910390fd5b505b505b6000613e118887898761433d565b905060008111613e8257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465737420616d6f756e74206973203000000000000000000000000000000000604482015290519081900360640190fd5b6000613e8d89612854565b90506000613e9a88612854565b9050831561408357600b54604080517fc6fd210300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015260248201879052600060448301819052436064840152925193169263c6fd21039260848084019391929182900301818387803b158015613f2857600080fd5b505af1158015613f3c573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff8216301461400c57600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015613fc757600080fd5b505af1158015613fdb573d6000803e3d6000fd5b5050600d5461400c935073ffffffffffffffffffffffffffffffffffffffff1691508490503463ffffffff6138f216565b73ffffffffffffffffffffffffffffffffffffffff81163014156140565761405173ffffffffffffffffffffffffffffffffffffffff8916888563ffffffff6138f216565b61407e565b61407e73ffffffffffffffffffffffffffffffffffffffff891682898663ffffffff61398416565b6142d2565b600b54604080517fc6fd210300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d8116600483015260008d8103602484015260448301819052436064840152925193169263c6fd21039260848084019391929182900301818387803b15801561410a57600080fd5b505af115801561411e573d6000803e3d6000fd5b506141459250505073ffffffffffffffffffffffffffffffffffffffff8b1633848c613984565b73ffffffffffffffffffffffffffffffffffffffff8116301461421957600d5461418d9073ffffffffffffffffffffffffffffffffffffffff1682308663ffffffff61398416565b600d54604080517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101869052905173ffffffffffffffffffffffffffffffffffffffff90921691632e1a7d4d9160248082019260009290919082900301818387803b15801561420057600080fd5b505af1158015614214573d6000803e3d6000fd5b505050505b60405160009073ffffffffffffffffffffffffffffffffffffffff89169085908381818185875af1925050503d8060008114614271576040519150601f19603f3d011682016040523d82523d6000602084013e614276565b606091505b50509050806142d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614970602f913960400191505060405180910390fd5b505b604080518a81526020810185905273ffffffffffffffffffffffffffffffffffffffff898116828401529151828b16928d169133917fea9415385bae08fe9f6dc457b02577166790cde83bb18cc340aac6cb81b824de9181900360600190a450505050505050505050565b600061435b8361434c876145ba565b614355876145ba565b856146a5565b95945050505050565b60008183116143735782614375565b815b9392505050565b61439b8273ffffffffffffffffffffffffffffffffffffffff166148bd565b61440657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831061446f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614432565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146144d1576040519150601f19603f3d011682016040523d82523d6000602084013e6144d6565b606091505b50915091508161454757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115613a195780806020019051602081101561456357600080fd5b5051613a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061499f602a913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156145f657506012612900565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548061469f578273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561466757600080fd5b505afa15801561467b573d6000803e3d6000fd5b505050506040513d602081101561469157600080fd5b505160ff1691506129009050565b92915050565b60006b204fce5e3e2502611000000085111561472257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f737263517479203e204d41585f51545900000000000000000000000000000000604482015290519081900360640190fd5b6a084595161401484a00000082111561479c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f72617465203e204d41585f524154450000000000000000000000000000000000604482015290519081900360640190fd5b838310614831576012848403111561481557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f647374202d20737263203e204d41585f444543494d414c530000000000000000604482015290519081900360640190fd5b670de0b6b3a7640000858302858503600a0a025b049050612757565b601283850311156148a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f737263202d20647374203e204d41585f444543494d414c530000000000000000604482015290519081900360640190fd5b828403600a0a670de0b6b3a7640000028286028161482957fe5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612757575050151592915050565b60408051606081018252600080825260208201819052918101919091529056fe726174652073686f756c64206e6f742062652067726561746572207468616e2073616e6974792072617465726573657276652072617465206c6f776572207468656e206e6574776f726b2072657175657374656420726174657472616e73666572206574682066726f6d207265736572766520746f206465737441646472657373206661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122045867262765ef00f02158f70538a143929cabd574b0d85a378557aea63ef432b64736f6c63430006060033

Deployed Bytecode Sourcemap

25576:13985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27949:42;;;27981:9;27949:42;;;;2668;;27949;;;;;;;;;;25576:13985;;12:1:-1;9;2:12;28735:125:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28735:125:0;;;:::i;:::-;;10785:482;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10785:482:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10785:482:0;;;;:::i;34058:110::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34058:110:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;29965:202;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29965:202:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29965:202:0;;;;;;;;;;;:::i;8191:27::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8191:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9096:105;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9096:105:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9096:105:0;;;;;;;;;;;;;;;;;12616:223;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12616:223:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12616:223:0;;;;;;;;;;;;;;;;;;:::i;26213:17::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26213:17:0;;;:::i;10430:347::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10430:347:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10430:347:0;;;;:::i;26167:39::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26167:39:0;;;:::i;29399:322::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29399:322:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29399:322:0;;;;;;;;;;;;;;;;;;;;:::i;29195:196::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29195:196:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29195:196:0;;;;:::i;31290:224::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31290:224:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31290:224:0;;;;:::i;30460:822::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30460:822:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30460:822:0;;;;;;;;;;;;;;;;;;:::i;28868:130::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28868:130:0;;;:::i;28007:720::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;28007:720:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9471:203::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9471:203:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9471:203:0;;;;:::i;10208:214::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10208:214:0;;;:::i;9855:244::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9855:244:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9855:244:0;;;;:::i;9209:103::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9209:103:0;;;:::i;32350:1234::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32350:1234:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;32350:1234:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32176:166;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32176:166:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32176:166:0;;;;:::i;35601:301::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35601:301:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35601:301:0;;;;:::i;11275:360::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11275:360:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11275:360:0;;;;:::i;33592:231::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33592:231:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33592:231:0;;;;;;;;;;;:::i;25811:46::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25811:46:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25811:46:0;;;;:::i;11643:498::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11643:498:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11643:498:0;;;;:::i;26040:27::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26040:27:0;;;:::i;31911:176::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31911:176:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31911:176:0;;;;:::i;29006:181::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29006:181:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29006:181:0;;;;:::i;12894:222::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12894:222:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12894:222:0;;;;;;;;;:::i;26113:47::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26113:47:0;;;:::i;33831:102::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33831:102:0;;;:::i;25718:57::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25718:57:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25718:57:0;;:::i;33941:109::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33941:109:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8164:20;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8164:20:0;;;:::i;34478:936::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34478:936:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34478:936:0;;;;:::i;31522:288::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31522:288:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31522:288:0;;;;:::i;28735:125::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28788:10:::1;:30:::0;;;::::1;28814:4;28788:30:::0;;::::1;::::0;;;28834:18:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;28735:125::o:0;10785:482::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10861:17:::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;::::1;;10853:41;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;10905:17;::::0;::::1;10925:5;10905:17:::0;;;:8:::1;:17;::::0;;;;:25;;;::::1;::::0;;10943:317:::1;10967:13;:20:::0;10963:24;::::1;10943:317;;;11033:7;11013:27;;:13;11027:1;11013:16;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;:27;11009:240;;;11080:13;11094:20:::0;;:24;;;;11080:39;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;11061:13:::1;:16:::0;;11080:39:::1;::::0;;::::1;::::0;11075:1;;11061:16;::::1;;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;11138:13;:19;;;;;;;;::::0;;;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;;;;;11181:28:::1;::::0;;11138:19:::1;11181:28:::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;11228:5;;11009:240;10989:3;;10943:317;;;;10785:482:::0;:::o;34058:110::-;34133:10;:27;;;;;;;34058:110::o;29965:202::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30049:27:::1;::::0;;::::1;;::::0;;;:11:::1;:27;::::0;;;;:36;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;30096:18:::1;30049:27:::0;30096:11:::1;:18::i;:::-;30152:6;30130:29;;30145:5;30130:29;;;;;;;;;;;;29965:202:::0;;:::o;8191:27::-;;;;;;:::o;9096:105::-;9143:16;9179:14;9172:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9096:105;:::o;12616:223::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12749:5:::1;:14;;;12764:6;12772;12749:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;12749:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;12749:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;12795:36:0::1;::::0;;::::1;::::0;;::::1;::::0;;12749:30:::1;12795:36:::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;::::1;12616:223:::0;;;:::o;26213:17::-;;;;;;:::o;10430:347::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10507:20:::1;::::0;::::1;;::::0;;;:8:::1;:20;::::0;;;;;::::1;;10506:21;10498:48;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;10588:13;:20:::0;8153:2:::1;-1:-1:-1::0;10580:62:0::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;10660:30;::::0;;::::1;::::0;::::1;::::0;;10685:4:::1;10660:30;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;10701:20;;;::::0;;;:8:::1;:20;::::0;;;;:27;;;::::1;10724:4;10701:27:::0;;::::1;::::0;;;10739:13:::1;27:10:-1::0;;23:18;;::::1;45:23:::0;;10739:30:0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;10430:347::o;26167:39::-;;;;;;:::o;29399:322::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29573:38:::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;29573:38:0;;;;;;29563:49;;;;::::1;::::0;;;;-1:-1:-1;29537:76:0;;;:25:::1;:76:::0;;;;:86;;;::::1;::::0;::::1;;;::::0;;29634:18:::1;29573:38:::0;29634:11:::1;:18::i;:::-;29668:45;::::0;;;::::1;;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;29399:322:::0;;;:::o;29195:196::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29278:10:::1;:47:::0;;;::::1;;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;29341:42:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;29195:196:::0;:::o;31290:224::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31374:25:::1;::::0;::::1;31366:52;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31429:12;:26:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;31471:35:::1;::::0;::::1;::::0;-1:-1:-1;;31471:35:0::1;31290:224:::0;:::o;30460:822::-;8932:10;8922:21;;;;:9;:21;;;;;;;;8914:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30654:45:::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;30654:45:0;;;;;;30644:56;;;;::::1;::::0;;;;-1:-1:-1;30618:83:0;;;:25:::1;:83:::0;;;;;::::1;;30596:160;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30773:26;::::0;::::1;2668:42;30773:26;30769:447;;;30835:35;::::0;30817:12:::1;::::0;30835:16:::1;::::0;::::1;::::0;30859:6;;30817:12;30835:35;30817:12;30835:35;30859:6;30835:16;:35:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;30816:54:0;;;30893:7;30885:39;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30769:447;;;;30957:14;30974:21;30989:5;30974:14;:21::i;:::-;30957:38:::0;-1:-1:-1;31014:23:0::1;::::0;::::1;31032:4;31014:23;31010:195;;;31058:39;:18;::::0;::::1;31077:11:::0;31090:6;31058:39:::1;:18;:39;:::i;:::-;31010:195;;;31138:51;:22;::::0;::::1;31161:6:::0;31169:11;31182:6;31138:51:::1;:22;:51;:::i;:::-;30769:447;;31262:11;31233:41;;31247:5;31233:41;;;31254:6;31233:41;;;;;;;;;;;;;;;;;;30460:822:::0;;;:::o;28868:130::-;9040:10;9031:20;;;;:8;:20;;;;;;;;9023:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28924:10:::1;:31:::0;;;::::1;::::0;;28971:19:::1;::::0;;28950:5:::1;28971:19:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;28868:130::o:0;28007:720::-;28285:12;;28246:4;;28285:12;;28271:10;:26;28263:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28325:22;;:::i;:::-;-1:-1:-1;28325:35:0;;;;;;;;28350:10;28325:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28371:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28459:4;:19;;;28451:28;;28436:11;:43;;28428:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28515:180;28537:8;28560:9;28584;28608:11;28634:14;28663:4;:21;;;28515:7;:180::i;:::-;-1:-1:-1;28715:4:0;;28007:720;-1:-1:-1;;;;;;;28007:720:0:o;9471:203::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9548:22:::1;::::0;::::1;9540:46;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;9602:30;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;9643:12;:23:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;9471:203::o;10208:214::-;10256:12;;:26;:12;10272:10;10256:26;10248:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10327:12;;;10341:5;10314:33;;;10327:12;;;;10314:33;;10341:5;;;;10314:33;;;;;;;;;;;;;;;;10366:12;;;;10358:20;;;;;;10366:12;;;10358:20;;;;10389:25;;;10208:214::o;9855:244::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9939:22:::1;::::0;::::1;9931:42;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;9989:30;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;10058:5;::::0;10035:29:::1;::::0;;10058:5:::1;10035:29:::0;;::::1;::::0;;10058:5;;::::1;10035:29;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;10075:5;:16:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;9855:244::o;9209:103::-;9255:16;9291:13;9284:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9209:103;:::o;32350:1234::-;32514:7;32534:22;;:::i;:::-;-1:-1:-1;32534:35:0;;;;;;;;32559:10;32534:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32580:32;;32611:1;32604:8;;;;;32580:32;32649:4;:19;;;32641:28;;32627:11;:42;32623:56;;;32678:1;32671:8;;;;;32623:56;32694:11;32690:25;;32714:1;32707:8;;;;;32690:25;32728:12;;2668:42;32778:24;;;;32774:262;;;-1:-1:-1;32854:4:0;;-1:-1:-1;32827:4:0;32774:262;;;2668:42;32880:25;;;;32876:160;;;-1:-1:-1;32958:3:0;;-1:-1:-1;32930:5:0;32876:160;;;33001:1;32994:8;;;;;;;32876:160;33075:23;;:66;;;;;;:23;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;33048:12;;33075:23;;;;;:31;;:66;;;;;;;;;;;;;;;:23;:66;;;2:2:-1;;;;27:1;24;17:12;2:2;33075:66:0;;;;;;;;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33075:66:0;;;33071:167;;33225:1;33218:8;;;;;;;;33071:167;33183:1;-1:-1:-1;33248:15:0;33266:39;33281:3;33286:4;33292:6;33300:4;33266:14;:39::i;:::-;33248:57;;33341:7;33322:16;33333:4;33322:10;:16::i;:::-;:26;33318:40;;;33357:1;33350:8;;;;;;;;;33318:40;33375:19;;:38;:19;:38;33371:182;;33451:19;;:44;;;;;;:19;:44;;;;;;;;;;;;;;;;33430:18;;33451:19;;;;;:33;;:44;;;;;;;;;;;;;;;:19;:44;;;2:2:-1;;;;27:1;24;17:12;2:2;33451:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33451:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33451:44:0;;-1:-1:-1;33514:17:0;;;33510:31;;;33540:1;33533:8;;;;;;;;;;33510:31;33371:182;;-1:-1:-1;33572:4:0;-1:-1:-1;;;;32350:1234:0;;;;;;;:::o;32176:166::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32254:19:::1;:32:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;32302::::1;::::0;::::1;::::0;-1:-1:-1;;32302:32:0::1;32176:166:::0;:::o;35601:301::-;35660:14;35697:26;;;2668:42;35697:26;35696:113;;35782:27;;;;;;;;:11;:27;;;;;;;35696:113;;;35760:4;;;;;;35740:26;;;;:11;:26;;;;;;;35696:113;35687:122;-1:-1:-1;35824:20:0;;;35820:75;;-1:-1:-1;35878:4:0;35820:75;35601:301;;;:::o;11275:360::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11354:22:::1;::::0;::::1;;::::0;;;:9:::1;:22;::::0;;;;;::::1;;11353:23;11345:51;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;11438:14;:21:::0;8153:2:::1;-1:-1:-1::0;11430:64:0::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;11512:32;::::0;;::::1;::::0;::::1;::::0;;11539:4:::1;11512:32;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;11555:22;;;::::0;;;:9:::1;:22;::::0;;;;:29;;;::::1;11580:4;11555:29:::0;;::::1;::::0;;;11595:14:::1;27:10:-1::0;;23:18;;::::1;45:23:::0;;11595:32:0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;11275:360::o;33592:231::-;33775:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;33775:38:0;;;;;;33765:49;;;;;;;;;-1:-1:-1;33739:76:0;;;:25;:76;;;;;;;;33592:231::o;25811:46::-;;;;;;;;;;;;;;;:::o;11643:498::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11721:19:::1;::::0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;::::1;;11713:44;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;11768:19;::::0;::::1;11790:5;11768:19:::0;;;:9:::1;:19;::::0;;;;:27;;;::::1;::::0;;11808:326:::1;11832:14;:21:::0;11828:25;::::1;11808:326;;;11900:8;11879:29;;:14;11894:1;11879:17;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;:29;11875:248;;;11949:14;11964:21:::0;;:25;;;;11949:41;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;11929:14:::1;:17:::0;;11949:41:::1;::::0;;::::1;::::0;11944:1;;11929:17;::::1;;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;12009:14;:20;;;;;;;;::::0;;;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;;;;;12053:30:::1;::::0;;12009:20:::1;12053:30:::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;12102:5;;11875:248;11855:3;;11808:326;;26040:27:::0;;;;;;:::o;31911:176::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31982:20:::1;::::0;::::1;31974:39;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32024:4;:15:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;32055:24:::1;::::0;::::1;::::0;-1:-1:-1;;32055:24:0::1;31911:176:::0;:::o;29006:181::-;8932:10;8922:21;;;;:9;:21;;;;;;;;8914:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29087:10:::1;:42:::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;29145:34:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;29006:181:::0;:::o;12894:222::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13006:30:::1;::::0;12988:12:::1;::::0;13006:11:::1;::::0;::::1;::::0;13025:6;;12988:12;13006:30;12988:12;13006:30;13025:6;13006:11;:30:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;12987:49:0;;;13055:7;13047:16;;12:1:-1;9::::0;2:12:::1;13047:16:0;13079:29;::::0;;;;;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;8862:1;12894:222:::0;;:::o;26113:47::-;;;;;;:::o;33831:102::-;33902:10;:23;;;33831:102;:::o;25718:57::-;;;;;;;;;;;;;;;:::o;33941:109::-;34017:10;:25;;;;;;;33941:109::o;8164:20::-;;;;;;:::o;34478:936::-;34533:7;34553:14;34570:21;34585:5;34570:14;:21::i;:::-;34553:38;-1:-1:-1;34602:17:0;34636:26;;;2668:42;34636:26;34632:565;;;34683:23;;;34701:4;34683:23;34679:156;;;34798:21;34791:28;;;;;;34679:156;-1:-1:-1;34915:4:0;;;;34632:565;;;34956:23;;;34974:4;34956:23;34952:201;;;35107:30;;;;;;35131:4;35107:30;;;;;;:15;;;;;;:30;;;;;;;;;;;;;;:15;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;35107:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35107:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35107:30:0;;-1:-1:-1;35100:37:0;;-1:-1:-1;;35100:37:0;34952:201;-1:-1:-1;35180:5:0;34632:565;35209:23;35235:10;:20;;;35256:6;35235:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35235:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35235:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35235:28:0;35302:43;;;;;;:20;:43;;;;;;;35339:4;35302:43;;;;;;35235:28;;-1:-1:-1;35274:25:0;;35302:20;;;;;;:43;;;;;35235:28;;35302:43;;;;;;;;:20;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;35302:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35302:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35302:43:0;;-1:-1:-1;35365:41:0;35371:15;35302:43;35365:5;:41::i;:::-;35358:48;34478:936;-1:-1:-1;;;;;;34478:936:0:o;31522:288::-;8831:5;;;;8817:10;:19;8809:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31624:41:::1;::::0;::::1;31616:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31698:23;:44:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;31758::::1;::::0;::::1;::::0;-1:-1:-1;;31758:44:0::1;31522:288:::0;:::o;3763:277::-;3822:15;;;:8;:15;;;;;;;;;;;:20;3818:33;;3844:7;;3818:33;3881:26;;;2668:42;3881:26;3877:156;;;3924:15;;;:8;:15;;;;;;;;;;3024:2;3924:30;;3877:156;;;4005:5;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4005:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4005:16:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4005:16:0;3987:15;;;:8;:15;;;4005:16;3987:15;;;;;;:34;;;;;;3877:156;3763:277;:::o;22054:177::-;22164:58;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22164:58:0;;;;;;;;25:18:-1;;61:17;;22164:58:0;182:15:-1;22187:23:0;179:29:-1;160:49;;22137:86:0;;22157:5;;22137:19;:86::i;:::-;22054:177;;;:::o;22239:205::-;22367:68;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22367:68:0;;;;;;;;25:18:-1;;61:17;;22367:68:0;182:15:-1;22390:27:0;179:29:-1;160:49;;22340:96:0;;22360:5;;22340:19;:96::i;:::-;22239:205;;;;:::o;36250:3308::-;36499:1;36482:14;:18;36474:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36540:29;;;2668:42;36540:29;36580:161;;;;36627:9;36614;:22;36606:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36580:161;;;36697:9;:14;36689:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36757:12;36753:676;;;36801:23;;36786:12;;36801:23;;:31;36851:5;:28;;36871:8;36851:28;;;36859:9;36851:28;36801:176;;;;;;;;;;;;;;;;;;;36898:12;36801:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2:2:-1;;;;27:1;24;17:12;2:2;36801:176:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36801:176:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36801:176:0;;-1:-1:-1;37044:22:0;;;;37036:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37136:19;;:38;:19;:38;37132:286;;37254:19;;:54;;;;;;:19;:54;;;;;;;;;;;;;;;;37233:18;;37254:19;;;;;:33;;:54;;;;;;;;;;;;;;;:19;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;37254:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37254:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37254:54:0;;-1:-1:-1;37335:18:0;;;;37327:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37132:286;;36753:676;;37441:18;37462:62;37477:8;37487:9;37498;37509:14;37462;:62::i;:::-;37441:83;;37556:1;37543:10;:14;37535:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37591:22;37616:24;37631:8;37616:14;:24::i;:::-;37591:49;;37651:23;37677:25;37692:9;37677:14;:25::i;:::-;37651:51;;37719:5;37715:1737;;;37774:23;;:170;;;;;;:23;:170;;;;;;;;;;;;;:23;:170;;;;;;37917:12;37774:170;;;;;;:23;;;:39;;:170;;;;;:23;;:170;;;;;;:23;;:170;;;2:2:-1;;;;27:1;24;17:12;2:2;37774:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;38063:31:0;;;38089:4;38063:31;38059:175;;38115:4;;;;;;;;;;;:12;;;38135:9;38115:32;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38115:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38173:4:0;;38166:52;;-1:-1:-1;38173:4:0;;;-1:-1:-1;38192:14:0;;-1:-1:-1;38208:9:0;38166:52;:25;:52;:::i;:::-;38320:32;;;38347:4;38320:32;38316:229;;;38373:47;:22;;;38396:11;38409:10;38373:47;:22;:47;:::i;:::-;38316:229;;;38461:68;:26;;;38488:15;38505:11;38518:10;38461:68;:26;:68;:::i;:::-;37715:1737;;;38610:23;;:173;;;;;;:23;:173;;;;;;;:23;38695:22;;;38610:173;;;;;;;;;;38756:12;38610:173;;;;;;:23;;;:39;;:173;;;;;:23;;:173;;;;;;:23;;:173;;;2:2:-1;;;;27:1;24;17:12;2:2;38610:173:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;38844:64:0;;-1:-1:-1;;;38844:25:0;;;38870:10;38882:14;38898:9;38844:25;:64::i;:::-;39056:32;;;39083:4;39056:32;39052:190;;39116:4;;39109:73;;39116:4;;39139:15;39164:4;39171:10;39109:73;:29;:73;:::i;:::-;39201:4;;:25;;;;;;;;;;;;;;:4;;;;;:13;;:25;;;;;:4;;:25;;;;;;;;:4;;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;39201:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39201:25:0;;;;39052:190;39319:39;;39301:12;;39319:16;;;;39343:10;;39301:12;39319:39;39301:12;39319:39;39343:10;39319:16;:39;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;39300:58:0;;;39381:7;39373:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37715:1737;;39469:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39482:10;;39469:81;;;;;;;;;36250:3308;;;;;;;;;;:::o;4834:247::-;4982:7;5009:64;5020:9;5031:16;5043:3;5031:11;:16::i;:::-;5049:17;5061:4;5049:11;:17::i;:::-;5068:4;5009:10;:64::i;:::-;5002:71;4834:247;-1:-1:-1;;;;;4834:247:0:o;7880:108::-;7940:7;7971:1;7967;:5;:13;;7979:1;7967:13;;;7975:1;7967:13;7960:20;7880:108;-1:-1:-1;;;7880:108:0:o;24098:1115::-;24703:27;24711:5;24703:25;;;:27::i;:::-;24695:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24840:12;24854:23;24889:5;24881:19;;24901:4;24881:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;24881:25:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;24839:67:0;;;;24925:7;24917:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24986:17;;:21;24982:224;;25128:10;25117:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25117:30:0;25109:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4400:426;4458:7;4482:26;;;2668:42;4482:26;4478:51;;;-1:-1:-1;3024:2:0;4510:19;;4478:51;4587:15;;;4563:21;4587:15;;;;;;;;;;;4742:18;4738:47;;4769:5;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4769:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4769:16:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4769:16:0;4762:23;;;-1:-1:-1;4762:23:0;;-1:-1:-1;4762:23:0;4738:47;4805:13;4400:426;-1:-1:-1;;4400:426:0:o;5345:723::-;5503:7;2814:6;5531;:17;;5523:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2880:17;5588:16;;;5580:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5656:11;5641;:26;5637:424;;2974:2;5707:11;5693;:25;5692:43;;5684:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2763:6;5787:13;;;5809:25;;;5804:2;:31;5787:49;5786:63;;5779:70;;;;5637:424;2974:2;5905:11;5891;:25;5890:43;;5882:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6035:11;6021;:25;6016:2;:31;2763:6;6003:45;5994:4;5985:6;:13;5984:65;;;;19450:619;19510:4;19978:20;;19821:66;20018:23;;;;;;:42;;-1:-1:-1;;20045:15:0;;;20010:51;-1:-1:-1;;19450:619:0:o;25576:13985::-;;;;;;;;;-1:-1:-1;25576:13985:0;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://45867262765ef00f02158f70538a143929cabd574b0d85a378557aea63ef432b

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.