ETH Price: $2,523.33 (-0.55%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

> 10 Token Transfers found.

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PoolAssetManager

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2023-11-15
*/

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

// File src/base/Multicall.sol

uint256 constant NUM_STABLE_COINS = 2;

pragma solidity 0.8.13;

/// @title  Multicall
/// @author Uniswap Labs
///
/// @notice Enables calling multiple methods in a single call to the contract
abstract contract Multicall {
    error MulticallFailed(bytes data, bytes result);

    function multicall(
        bytes[] calldata data
    ) external payable returns (bytes[] memory results) {
        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; ++i) {
            (bool success, bytes memory result) = address(this).delegatecall(data[i]);

            if (!success) {
                revert MulticallFailed(data[i], result);
            }

            results[i] = result;
        }
    }
}


// File src/base/ErrorMessages.sol

pragma solidity >=0.8.4;

/// @notice An error used to indicate that an argument passed to a function is illegal or
///         inappropriate.
///
/// @param message The error message.
error IllegalArgument(string message);

/// @notice An error used to indicate that a function has encountered an unrecoverable state.
///
/// @param message The error message.
error IllegalState(string message);

/// @notice An error used to indicate that an operation is unsupported.
///
/// @param message The error message.
error UnsupportedOperation(string message);

/// @notice An error used to indicate that a message sender tried to execute a privileged function.
///
/// @param message The error message.
error Unauthorized(string message);


// File src/base/MutexLock.sol

pragma solidity 0.8.13;

/// @title  Mutex
/// @author Alchemix Finance
///
/// @notice Provides a mutual exclusion lock for implementing contracts.
abstract contract MutexLock {
    enum State {
        RESERVED,
        UNLOCKED,
        LOCKED
    }

    /// @notice The lock state.
    State private _lockState = State.UNLOCKED;

    /// @dev A modifier which acquires the mutex.
    modifier lock() {
        _claimLock();

        _;

        _freeLock();
    }

    /// @dev Gets if the mutex is locked.
    ///
    /// @return if the mutex is locked.
    function _isLocked() internal view returns (bool) {
        return _lockState == State.LOCKED;
    }

    /// @dev Claims the lock. If the lock is already claimed, then this will revert.
    function _claimLock() internal {
        // Check that the lock has not been claimed yet.
        if (_lockState != State.UNLOCKED) {
            revert IllegalState("Lock already claimed");
        }

        // Claim the lock.
        _lockState = State.LOCKED;
    }

    /// @dev Frees the lock.
    function _freeLock() internal {
        _lockState = State.UNLOCKED;
    }
}


// File src/interfaces/IERC20Metadata.sol

pragma solidity >=0.5.0;

/// @title  IERC20Metadata
/// @author Alchemix Finance
interface IERC20Metadata {
    /// @notice Gets the name of the token.
    ///
    /// @return The name.
    function name() external view returns (string memory);

    /// @notice Gets the symbol of the token.
    ///
    /// @return The symbol.
    function symbol() external view returns (string memory);

    /// @notice Gets the number of decimals that the token has.
    ///
    /// @return The number of decimals.
    function decimals() external view returns (uint8);
}


// File lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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


// File src/libraries/SafeERC20.sol

pragma solidity >=0.8.4;

/// @title  SafeERC20
/// @author Alchemix Finance
library SafeERC20 {
    /// @notice An error used to indicate that a call to an ERC20 contract failed.
    ///
    /// @param target  The target address.
    /// @param success If the call to the token was a success.
    /// @param data    The resulting data from the call. This is error data when the call was not a
    ///                success. Otherwise, this is malformed data when the call was a success.
    error ERC20CallFailed(address target, bool success, bytes data);

    /// @dev A safe function to get the decimals of an ERC20 token.
    ///
    /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an
    ///      unexpected value.
    ///
    /// @param token The target token.
    ///
    /// @return The amount of decimals of the token.
    function expectDecimals(address token) internal view returns (uint8) {
        (bool success, bytes memory data) = token.staticcall(
            abi.encodeWithSelector(IERC20Metadata.decimals.selector)
        );

        if (!success || data.length < 32) {
            revert ERC20CallFailed(token, success, data);
        }

        return abi.decode(data, (uint8));
    }

    /// @dev Transfers tokens to another address.
    ///
    /// @dev Reverts with a {CallFailed} error if execution of the transfer failed or returns an
    ///      unexpected value.
    ///
    /// @param token     The token to transfer.
    /// @param recipient The address of the recipient.
    /// @param amount    The amount of tokens to transfer.
    function safeTransfer(address token, address recipient, uint256 amount) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(IERC20.transfer.selector, recipient, amount)
        );

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert ERC20CallFailed(token, success, data);
        }
    }

    /// @dev Approves tokens for the smart contract.
    ///
    /// @dev Reverts with a {CallFailed} error if execution of the approval fails or returns an
    ///      unexpected value.
    ///
    /// @param token   The token to approve.
    /// @param spender The contract to spend the tokens.
    /// @param value   The amount of tokens to approve.
    function safeApprove(address token, address spender, uint256 value) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(IERC20.approve.selector, spender, value)
        );

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert ERC20CallFailed(token, success, data);
        }
    }

    /// @dev Transfer tokens from one address to another address.
    ///
    /// @dev Reverts with a {CallFailed} error if execution of the transfer fails or returns an
    ///      unexpected value.
    ///
    /// @param token     The token to transfer.
    /// @param owner     The address of the owner.
    /// @param recipient The address of the recipient.
    /// @param amount    The amount of tokens to transfer.
    function safeTransferFrom(address token, address owner, address recipient, uint256 amount) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(IERC20.transferFrom.selector, owner, recipient, amount)
        );

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert ERC20CallFailed(token, success, data);
        }
    }
}


// File src/interfaces/IERC20TokenReceiver.sol

pragma solidity >=0.5.0;

/// @title  IERC20TokenReceiver
/// @author Alchemix Finance
interface IERC20TokenReceiver {
    /// @notice Informs implementors of this interface that an ERC20 token has been transferred.
    ///
    /// @param token The token that was transferred.
    /// @param value The amount of the token that was transferred.
    function onERC20Received(address token, uint256 value) external;
}


// File src/interfaces/external/convex/IConvexStakingWrapper.sol

pragma solidity >=0.5.0;

interface IConvexStakingWrapper {
    function deposit(uint256 amount, address to) external;
    function withdraw(uint256 amount) external;
    function withdrawAndUnwrap(uint256 _amount) external;
}


// File src/interfaces/external/curve/IStableSwap2Pool.sol

pragma solidity >=0.5.0;

uint256 constant N_COINS = 2;

interface IStableSwap2Pool {
    function coins(uint256 index) external view returns (address);

    function A() external view returns (uint256);

    function get_virtual_price() external view returns (uint256);

    function calc_token_amount(
        uint256[N_COINS] calldata amounts,
        bool deposit
    ) external view returns (uint256 amount);

    function add_liquidity(uint256[N_COINS] calldata amounts, uint256 minimumMintAmount) external;

    function get_dy(int128 i, int128 j, uint256 dx) external view returns (uint256 dy);

    function get_dy_underlying(int128 i, int128 j, uint256 dx) external view returns (uint256 dy);

    function exchange(
        int128 i,
        int128 j,
        uint256 dx,
        uint256 minimumDy
    ) external payable returns (uint256);

    function remove_liquidity(uint256 amount, uint256[N_COINS] calldata minimumAmounts, address receiver) external returns (uint256[] memory);

    function remove_liquidity_imbalance(
        uint256[N_COINS] calldata amounts,
        uint256 maximumBurnAmount
    ) external;

    function calc_withdraw_one_coin(uint256 tokenAmount, int128 i) external view returns (uint256);

    function remove_liquidity_one_coin(
        uint256 tokenAmount,
        int128 i,
        uint256 minimumAmount
    ) external;
}


// File src/interfaces/external/convex/IConvexFraxFarm.sol

pragma solidity >=0.5.0;

interface IConvexFraxFarm {
    function withdrawLocked(bytes32 kek_id, address destination_address)  external returns (uint256);
    function stakeLocked(uint256 liquidity, uint256 secs) external returns (bytes32);
    function earned(address account) external view returns (uint256[] memory);
    function getReward(address destination_address) external returns (uint256[] memory);
    function combinedWeightOf(address account) external view returns (uint256);
    function lockedLiquidityOf(address account) external view returns (uint256);
}


// File src/interfaces/external/convex/IConvexFraxVault.sol

pragma solidity >=0.5.0;

interface IConvexFraxVault {
    function stakeLockedCurveLp(uint256 liquidity, uint256 secs) external returns (bytes32 kekId);
    function stakeLocked(uint256 liquidity, uint256 secs) external returns (bytes32 kekId);
    function withdrawLockedAndUnwrap(bytes32 kekId) external;
    function getReward() external;
    function earned() external view returns (address[] memory tokenAddresses, uint256[] memory totalEarned);
}


// File src/interfaces/external/convex/IConvexRewards.sol

pragma solidity >=0.5.0;

interface IConvexRewards {
    function rewardToken() external view returns (IERC20);
    function earned(address account) external view returns (uint256);
    function extraRewards(uint256 index) external view returns (address);
    function balanceOf(address account) external returns(uint256);
    function withdraw(uint256 amount, bool claim) external returns (bool);
    function withdrawAndUnwrap(uint256 amount, bool claim) external returns (bool);
    function getReward() external returns (bool);
    function getReward(address recipient, bool claim) external returns (bool);
    function stake(uint256 amount) external returns (bool);
    function stakeFor(address account, uint256 amount) external returns (bool);
}


// File src/interfaces/external/convex/IConvexFraxBooster.sol

pragma solidity >=0.5.0;

interface IConvexFraxBooster {
    function createVault(uint256 _pid) external returns (address);
}


// File src/interfaces/external/convex/IConvexToken.sol

pragma solidity >=0.5.0;

interface IConvexToken is IERC20 {
    function maxSupply() external view returns (uint256);
    function totalCliffs() external view returns (uint256);
    function reductionPerCliff() external view returns (uint256);
}


// File src/PoolAssetManager.sol

pragma solidity 0.8.13;









/// @notice A struct used to define initialization parameters. This is not included
///         in the contract to prevent naming collisions.
struct InitializationParams {
    address admin;
    address operator;
    address rewardReceiver;
    address transmuterBuffer;
    IERC20 fraxShareToken;
    IERC20 curveToken;
    IStableSwap2Pool twoPool;
    uint256 twoPoolSlippage;
    IConvexToken convexToken;
    IConvexStakingWrapper convexStakingWrapper;
    IConvexFraxBooster convexFraxBooster;
    uint256 convexPoolId;
}

struct LockParams {
    uint256 amount;
    uint256 timeLocked;
}

/// @dev The amount of precision that slippage parameters have.
uint256 constant SLIPPAGE_PRECISION = 1e4;

/// @dev The amount of precision that curve pools use for price calculations.
uint256 constant CURVE_PRECISION = 1e18;

uint256 constant MINIMUM_LOCK_TIME = 604800;

/// @notice Enumerations for FRAX/USDC two pool assets.
///
/// @dev Do not change the order of these fields.
enum PoolAsset {
    ALETH, FRXETH
}

/// @title  PoolAssetManager
/// @author Alchemix Finance
contract PoolAssetManager is Multicall, MutexLock, IERC20TokenReceiver {
    /// @notice Emitted when the admin is updated.
    ///
    /// @param admin The admin.
    event AdminUpdated(address admin);

    /// @notice Emitted when the pending admin is updated.
    ///
    /// @param pendingAdmin The pending admin.
    event PendingAdminUpdated(address pendingAdmin);

    /// @notice Emitted when the operator is updated.
    ///
    /// @param operator The operator.
    event OperatorUpdated(address operator);

    /// @notice Emitted when the reward receiver is updated.
    ///
    /// @param rewardReceiver The reward receiver.
    event RewardReceiverUpdated(address rewardReceiver);

    /// @notice Emitted when the transmuter buffer is updated.
    ///
    /// @param transmuterBuffer The transmuter buffer.
    event TransmuterBufferUpdated(address transmuterBuffer);

    /// @notice Emitted when the 2pool slippage is updated.
    ///
    /// @param twoPoolSlippage The 2pool slippage.
    event TwoPoolSlippageUpdated(uint256 twoPoolSlippage);

    /// @notice Emitted when 2pool tokens are minted.
    ///
    /// @param amounts               The amounts of each 2pool asset used to mint liquidity.
    /// @param mintedTwoPoolTokens The amount of 2pool tokens minted.
    event MintTwoPoolTokens(uint256[NUM_STABLE_COINS] amounts, uint256 mintedTwoPoolTokens);

    /// @notice Emitted when 2pool tokens are minted.
    ///
    /// @param asset                 The 2pool asset used to mint 2pool tokens.
    /// @param amount                The amount of the asset used to mint 2pool tokens.
    /// @param mintedTwoPoolTokens The amount of 2pool tokens minted.
    event MintTwoPoolTokens(PoolAsset asset, uint256 amount, uint256 mintedTwoPoolTokens);

    /// @notice Emitted when 2pool tokens are burned.
    ///
    /// @param asset     The 2pool asset that was received.
    /// @param amount    The amount of 2pool tokens that were burned.
    /// @param withdrawn The amount of the 2pool asset that was withdrawn.
    event BurnTwoPoolTokens(PoolAsset asset, uint256 amount, uint256 withdrawn);

    /// @notice Emitted when meta pool tokens are deposited into convex.
    ///
    /// @param amount  The amount of meta pool tokens that were deposited.
    /// @param id      The ID of the new lock.
    /// @param success If the operation was successful.
    event DepositTwoPoolTokens(uint256 amount, bytes32 id, bool success);

    /// @notice Emitted when meta pool tokens are withdrawn from convex.
    ///
    /// @param amount  The amount of meta pool tokens that were withdrawn.
    /// @param success If the operation was successful.
    event WithdrawTwoPoolTokens(uint256 amount, bool success);

    /// @notice Emitted when convex rewards are claimed.
    ///
    /// @param success      If the operation was successful.
    /// @param amountFxs    The amount of frax share tokens sent to the reward recipient.
    /// @param amountCurve  The amount of curve tokens sent to the reward recipient.
    /// @param amountConvex The amount of convex tokens sent to the reward recipient.
    event ClaimRewards(bool success, uint256 amountFxs, uint256 amountCurve, uint256 amountConvex);

    /// @notice Emitted when 2pool assets are sent to the transmuter buffer.
    ///
    /// @param asset  The 2pool asset that was reclaimed.
    /// @param amount The amount of the asset that was reclaimed.
    event ReclaimTwoPoolAsset(PoolAsset asset, uint256 amount);

    /// @notice The admin.
    address public admin;

    /// @notice The current pending admin.
    address public pendingAdmin;

    /// @notice The operators.
    mapping(address => bool) public operators;

    // @notice The reward receiver.
    address public rewardReceiver;

    /// @notice The transmuter buffer.
    address public transmuterBuffer;

    /// @notice The frax share token.
    IERC20 public immutable fraxShareToken;

    /// @notice The curve token.
    IERC20 public immutable curveToken;

    /// @notice The 2pool contract.
    IStableSwap2Pool public immutable twoPool;

    /// @notice The amount of slippage that will be tolerated when depositing and withdrawing assets
    ///         from the stable swap pool. In units of basis points.
    uint256 public twoPoolSlippage;

    /// @notice The convex token.
    IConvexToken public immutable convexToken;

    /// @notice The staking wrapper.
    IConvexStakingWrapper public immutable convexStakingWrapper;

    /// @notice The convex booster contract.
    IConvexFraxBooster public immutable convexFraxBooster;

    /// @notice The address of the vault created during the contructor.
    IConvexFraxVault public convexFraxVault;

    /// @notice The convex pool identifier.
    uint256 public immutable convexPoolId;

    /// @notice the kek_id of the twoPool token deposit.
    mapping (bytes32 => LockParams) public kekId;

    /// @dev A cache of the tokens that the stable swap pool supports.
    IERC20[NUM_STABLE_COINS] private _twoPoolAssetCache;

    /// @dev A modifier which reverts if the message sender is not the admin.
    modifier onlyAdmin() {
        if (msg.sender != admin) {
            revert Unauthorized("Not admin");
        }
        _;
    }

    /// @dev A modifier which reverts if the message sender is not the operator.
    modifier onlyOperator() {
        if (!operators[msg.sender]) {
            revert Unauthorized("Not operator");
        }
        _;
    }

    constructor(InitializationParams memory params) {
        admin                   = params.admin;
        rewardReceiver          = params.rewardReceiver;
        transmuterBuffer        = params.transmuterBuffer;
        fraxShareToken          = params.fraxShareToken;
        curveToken              = params.curveToken;
        twoPool                 = params.twoPool;
        twoPoolSlippage         = params.twoPoolSlippage;
        convexToken             = params.convexToken;
        convexStakingWrapper    = params.convexStakingWrapper;
        convexFraxBooster       = params.convexFraxBooster;
        convexPoolId            = params.convexPoolId;

        operators[params.operator] = true;

        convexFraxVault = IConvexFraxVault(convexFraxBooster.createVault(convexPoolId));

        for (uint256 i = 0; i < NUM_STABLE_COINS; i++) {
            _twoPoolAssetCache[i] = IERC20(params.twoPool.coins(i));
        }

        emit AdminUpdated(admin);
        emit OperatorUpdated(params.operator);
        emit RewardReceiverUpdated(rewardReceiver);
        emit TransmuterBufferUpdated(transmuterBuffer);
        emit TwoPoolSlippageUpdated(twoPoolSlippage);
    }

    /// @notice Gets the amount of a 2pool asset that this contract has in reserves.
    ///
    /// @param asset The 2pool asset.
    ///
    /// @return The reserves.
    function twoPoolAssetReserves(PoolAsset asset) external view returns (uint256) {
        IERC20 token = getTokenForTwoPoolAsset(asset);
        return token.balanceOf(address(this));
    }

    /// @notice Gets the amount of a 2pool asset that one alUSD is worth.
    ///
    /// @param asset The 2pool asset.
    ///
    /// @return The amount of the underying.
    function exchangeRate(PoolAsset asset) public view returns (uint256) {
        return twoPool.calc_withdraw_one_coin(1e18, int128(uint128(uint256(asset))));
    }

    /// @notice Gets the ERC20 token associated with a 2pool asset.
    ///
    /// @param asset The asset to get the token for.
    ///
    /// @return The token.
    function getTokenForTwoPoolAsset(PoolAsset asset) public view returns (IERC20) {
        uint256 index = uint256(asset);
        if (index >= NUM_STABLE_COINS) {
            revert IllegalArgument("Asset index out of bounds");
        }
        return _twoPoolAssetCache[index];
    }

    /// @notice Begins the 2-step process of setting the administrator.
    ///
    /// The caller must be the admin. Setting the pending timelock to the zero address will stop
    /// the process of setting a new timelock.
    ///
    /// @param value The value to set the pending timelock to.
    function setPendingAdmin(address value) external onlyAdmin {
        pendingAdmin = value;
        emit PendingAdminUpdated(value);
    }

    /// @notice Completes the 2-step process of setting the administrator.
    ///
    /// The pending admin must be set and the caller must be the pending admin. After this function
    /// is successfully executed, the admin will be set to the pending admin and the pending admin
    /// will be reset.
    function acceptAdmin() external {
        if (pendingAdmin == address(0)) {
            revert IllegalState("Pending admin unset");
        }

        if (pendingAdmin != msg.sender) {
            revert Unauthorized("Not pending admin");
        }

        admin = pendingAdmin;
        pendingAdmin = address(0);

        emit AdminUpdated(admin);
        emit PendingAdminUpdated(address(0));
    }

    /// @notice Sets the operator.
    ///
    /// The caller must be the admin.
    ///
    /// @param operator The address to set
    /// @param value The value to set the admin to.
    function setOperator(address operator, bool value) external onlyAdmin {
        operators[operator] = value;
        emit OperatorUpdated(operator);
    }

    /// @notice Sets the reward receiver.
    ///
    /// @param value The value to set the reward receiver to.
    function setRewardReceiver(address value) external onlyAdmin {
        rewardReceiver = value;
        emit RewardReceiverUpdated(value);
    }

    /// @notice Sets the transmuter buffer.
    ///
    /// @param value The value to set the transmuter buffer to.
    function setTransmuterBuffer(address value) external onlyAdmin {
        transmuterBuffer = value;
        emit TransmuterBufferUpdated(value);
    }

    /// @notice Sets the slippage that will be tolerated when depositing and withdrawing 2pool
    ///         assets. The slippage has a resolution of 6 decimals.
    ///
    /// The operator is allowed to set the slippage because it is a volatile parameter that may need
    /// fine adjustment in a short time window.
    ///
    /// @param value The value to set the slippage to.
    function setTwoPoolSlippage(uint256 value) external onlyOperator {
        if (value > SLIPPAGE_PRECISION) {
            revert IllegalArgument("Slippage not in range");
        }
        twoPoolSlippage = value;
        emit TwoPoolSlippageUpdated(value);
    }

    /// @notice Mints 2pool tokens with a combination of assets.
    ///
    /// @param amounts The amounts of the assets to deposit.
    ///
    /// @return minted The number of 2pool tokens minted.
    function mintTwoPoolTokens(
        uint256[NUM_STABLE_COINS] calldata amounts
    ) external lock onlyOperator returns (uint256 minted) {
        return _mintTwoPoolTokens(amounts);
    }

    /// @notice Mints 2pool tokens with an asset.
    ///
    /// @param asset  The asset to deposit into the 2pool.
    /// @param amount The amount of the asset to deposit.
    ///
    /// @return minted The number of 2pool tokens minted.
    function mintTwoPoolTokens(
        PoolAsset asset,
        uint256 amount
    ) external lock onlyOperator returns (uint256 minted) {
        return _mintTwoPoolTokens(asset, amount);
    }

    /// @notice Burns 2pool tokens to withdraw an asset.
    ///
    /// @param asset  The asset to withdraw.
    /// @param amount The amount of 2pool tokens to burn.
    ///
    /// @return withdrawn The amount of the asset withdrawn from the pool.
    function burnTwoPoolTokens(
        PoolAsset asset,
        uint256 amount
    ) external lock onlyOperator returns (uint256 withdrawn) {
        return _burnTwoPoolTokens(asset, amount);
    }

    /// @notice Deposits and stakes meta pool tokens into convex.
    ///
    /// @param amount The amount of meta pool tokens to deposit.
    ///
    /// @return success If the tokens were successfully deposited.
    /// @return id      The ID of the new lock.
    function depositTwoPoolTokens(
        uint256 amount
    ) external lock onlyOperator returns (bool success, bytes32 id) {
        return _depositTwoPoolTokens(amount, MINIMUM_LOCK_TIME);
    }

    /// @notice Deposits and stakes meta pool tokens into convex.
    ///
    /// @param amount The amount of meta pool tokens to deposit.
    ///
    /// @return success If the tokens were successfully deposited.
    /// @return id      The ID of the new lock.
    function depositTwoPoolTokensCustomLock(
        uint256 amount,
        uint256 lockTime
    ) external lock onlyOperator returns (bool success, bytes32 id) {
        return _depositTwoPoolTokens(amount, lockTime);
    }

    /// @notice Withdraws and unwraps meta pool tokens from convex.
    ///
    /// @param  amount  The amount of meta pool tokens to withdraw.
    /// @param  id      The id of the lock to withdraw from.  
    ///
    /// @return success If the tokens were successfully withdrawn.
    function withdrawTwoPoolTokens(
        uint256 amount,
        bytes32 id
    ) external lock onlyOperator returns (bool success) {
        return _withdrawTwoPoolTokens(amount, id);
    }

    /// @notice Claims convex, curve, and auxiliary rewards.
    ///
    /// @return success If the claim was successful.
    function claimRewards() external lock onlyOperator returns (bool success) {
        convexFraxVault.getReward();
        success = true;

        uint256 fxsBalance    = fraxShareToken.balanceOf(address(this));
        uint256 curveBalance  = curveToken.balanceOf(address(this));
        uint256 convexBalance = convexToken.balanceOf(address(this));

        SafeERC20.safeTransfer(address(curveToken), rewardReceiver, curveBalance);
        SafeERC20.safeTransfer(address(convexToken), rewardReceiver, convexBalance);
        SafeERC20.safeTransfer(address(fraxShareToken), rewardReceiver, fxsBalance);

        emit ClaimRewards(success, fxsBalance, curveBalance, convexBalance);
    }

    /// @notice Flushes two pool assets into convex by minting 2pool tokens from the assets,
    ///         minting meta pool tokens using the 2pool tokens, and then depositing the meta pool
    ///         tokens into convex.
    ///
    /// This function is provided for ease of use.
    ///
    /// @param amounts The amounts of the 2pool assets to flush.
    ///
    /// @return The amount of meta pool tokens deposited into convex.
    function flush(
        uint256[NUM_STABLE_COINS] calldata amounts
    ) external lock onlyOperator returns (uint256) {
        uint256 mintedTwoPoolTokens = _mintTwoPoolTokens(amounts);

        (bool success,) = _depositTwoPoolTokens(mintedTwoPoolTokens, MINIMUM_LOCK_TIME);

        if (!success) {
            revert IllegalState("Deposit into convex failed");
        }

        return mintedTwoPoolTokens;
    }

    /// @notice Flushes two pool assets into convex by minting 2pool tokens from the assets,
    ///         minting meta pool tokens using the 2pool tokens, and then depositing the meta pool
    ///         tokens into convex. Allows specification of locking period.
    ///
    /// This function is provided for ease of use.
    ///
    /// @param amounts The amounts of the 2pool assets to flush.
    /// @param lockTime The amount of time to lock the staked tokens.
    ///
    /// @return The amount of meta pool tokens deposited into convex.
    function flushCustomLock(
        uint256[NUM_STABLE_COINS] calldata amounts,
        uint256 lockTime
    ) external lock onlyOperator returns (uint256) {
        uint256 mintedTwoPoolTokens = _mintTwoPoolTokens(amounts);

        (bool success, ) = _depositTwoPoolTokens(mintedTwoPoolTokens, lockTime);

        if (!success) {
            revert IllegalState("Deposit into convex failed");
        }

        return mintedTwoPoolTokens;
    }

    /// @notice Flushes a two pool asset into convex by minting 2pool tokens using the asset,
    ///         minting meta pool tokens using the 2pool tokens, and then depositing the meta pool
    ///         tokens into convex.
    ///
    /// This function is provided for ease of use.
    ///
    /// @param asset  The 2pool asset to flush.
    /// @param amount The amount of the 2pool asset to flush.
    ///
    /// @return The amount of meta pool tokens deposited into convex.
    function flush(
        PoolAsset asset,
        uint256 amount
    ) external lock onlyOperator returns (uint256) {
        uint256 mintedTwoPoolTokens = _mintTwoPoolTokens(asset, amount);

        (bool success,) = _depositTwoPoolTokens(mintedTwoPoolTokens, MINIMUM_LOCK_TIME);

        if (!success) {
            revert IllegalState("Deposit into convex failed");
        }

        return mintedTwoPoolTokens;
    }

    /// @notice Flushes a two pool asset into convex by minting 2pool tokens using the asset,
    ///         minting meta pool tokens using the 2pool tokens, and then depositing the meta pool
    ///         tokens into convex. Allows specification of locking period.
    ///
    /// This function is provided for ease of use.
    ///
    /// @param asset    The 2pool asset to flush.
    /// @param amount   The amount of the 2pool asset to flush.
    /// @param lockTime The amount of time to lock the staked tokens.
    ///
    /// @return The amount of meta pool tokens deposited into convex.
    function flushCustomLock(
        PoolAsset asset,
        uint256 amount,
        uint256 lockTime
    ) external lock onlyOperator returns (uint256) {
        uint256 mintedTwoPoolTokens = _mintTwoPoolTokens(asset, amount);

        (bool success, bytes32 id) = _depositTwoPoolTokens(mintedTwoPoolTokens, lockTime);

        if (!success) {
            revert IllegalState("Deposit into convex failed");
        }

        return mintedTwoPoolTokens;
    }

    /// @notice Recalls a two pool asset into reserves by withdrawing meta pool tokens from
    ///         convex, burning the meta pool tokens for 2pool tokens, and then burning the 2pool
    ///         tokens for an asset.
    ///
    /// This function is provided for ease of use.
    ///
    /// @param asset  The 2pool asset to recall.
    /// @param amount The amount of the meta pool tokens to withdraw from convex and burn.
    /// @param  id      The id of the lock to withdraw from.  
    ///
    /// @return The amount of the 2pool asset recalled.
    function recall(
        PoolAsset asset,
        uint256 amount,
        bytes32 id
    ) external lock onlyOperator returns (uint256) {

        if (!_withdrawTwoPoolTokens(amount, id)) {
            revert IllegalState("Withdraw from convex failed");
        }
        return _burnTwoPoolTokens(asset, amount);
    }

    /// @notice Recalls tokens in a balanced manner in case of an emergency
    function emergencyRecall(uint256 amount, bytes32 id) external lock onlyOperator {
        if (!_withdrawTwoPoolTokens(amount, id)) {
            revert IllegalState("Withdraw from convex failed");
        }        

        IERC20 twoPoolToken = IERC20(address(twoPool));

        SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), 0);
        SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), amount);

        // Remove the liquidity from the pool.
        uint256[2] memory minAmounts = [uint256(0), uint256(0)];
        twoPool.remove_liquidity(amount, minAmounts, address(this));
    }

    /// @notice Reclaims a two pool asset to the transmuter buffer.
    ///
    /// @param asset  The 2pool asset to reclaim.
    /// @param amount The amount to reclaim.
    function reclaimTwoPoolAsset(PoolAsset asset, uint256 amount) public lock onlyAdmin {
        IERC20 token = getTokenForTwoPoolAsset(asset);
        SafeERC20.safeTransfer(address(token), transmuterBuffer, amount);

        IERC20TokenReceiver(transmuterBuffer).onERC20Received(address(token), amount);

        emit ReclaimTwoPoolAsset(asset, amount);
    }

    /// @notice Sweeps a token out of the contract to the admin.
    ///
    /// @param token  The token to sweep.
    /// @param amount The amount of the token to sweep.
    function sweep(address token, uint256 amount) external lock onlyAdmin {
        SafeERC20.safeTransfer(address(token), msg.sender, amount);
    }

    /// @inheritdoc IERC20TokenReceiver
    ///
    /// @dev This function is required in order to receive tokens from the conduit.
    function onERC20Received(address token, uint256 value) external { /* noop */ }

    /// @dev Mints 2pool tokens with a combination of assets.
    ///
    /// @param amounts The amounts of the assets to deposit.
    ///
    /// @return minted The number of 2pool tokens minted.
    function _mintTwoPoolTokens(
        uint256[NUM_STABLE_COINS] calldata amounts
    ) internal returns (uint256 minted) {
        IERC20[NUM_STABLE_COINS] memory tokens = _twoPoolAssetCache;

        IERC20 twoPoolToken = IERC20(address(twoPool));

        uint256 twoPoolDecimals = SafeERC20.expectDecimals(address(twoPoolToken));
        uint256 normalizedTotal   = 0;

        for (uint256 i = 0; i < NUM_STABLE_COINS; i++) {
            if (amounts[i] == 0) continue;

            uint256 tokenDecimals   = SafeERC20.expectDecimals(address(tokens[i]));
            uint256 missingDecimals = twoPoolDecimals - tokenDecimals;

            normalizedTotal += amounts[i] * 10**missingDecimals;

            // For assets like USDT, the approval must be first set to zero before updating it.
            SafeERC20.safeApprove(address(tokens[i]), address(twoPool), 0);
            SafeERC20.safeApprove(address(tokens[i]), address(twoPool), amounts[i]);
        }

        // Calculate what the normalized value of the tokens is.
        uint256 expectedOutput = normalizedTotal * CURVE_PRECISION / twoPool.get_virtual_price();

        // Calculate the minimum amount of 2pool lp tokens that we are expecting out when
        // adding liquidity for all of the assets. This value is twod off the optimistic
        // assumption that one of each token is approximately equal to one 2pool lp token.
        uint256 minimumMintAmount = expectedOutput * twoPoolSlippage / SLIPPAGE_PRECISION;

        // Record the amount of 2pool lp tokens that we start with before adding liquidity
        // so that we can determine how many we minted.
        uint256 startingBalance = twoPoolToken.balanceOf(address(this));

        // Add the liquidity to the pool.
        twoPool.add_liquidity(amounts, minimumMintAmount);

        // Calculate how many 2pool lp tokens were minted.
        minted = twoPoolToken.balanceOf(address(this)) - startingBalance;

        emit MintTwoPoolTokens(amounts, minted);
    }

    /// @dev Mints 2pool tokens with an asset.
    ///
    /// @param asset  The asset to deposit into the 2pool.
    /// @param amount The amount of the asset to deposit.
    ///
    /// @return minted The number of 2pool tokens minted.
    function _mintTwoPoolTokens(
        PoolAsset asset,
        uint256 amount
    ) internal returns (uint256 minted) {
        IERC20 token          = getTokenForTwoPoolAsset(asset);
        IERC20 twoPoolToken = IERC20(address(twoPool));

        uint256 twoPoolDecimals = SafeERC20.expectDecimals(address(twoPoolToken));
        uint256 missingDecimals   = twoPoolDecimals - SafeERC20.expectDecimals(address(token));

        uint256[NUM_STABLE_COINS] memory amounts;
        amounts[uint256(asset)] = amount;

        // Calculate the minimum amount of 2pool lp tokens that we are expecting out when
        // adding single sided liquidity. This value is twod off the optimistic assumption that
        // one of each token is approximately equal to one 2pool lp token.
        uint256 expectedOutput    = amount * CURVE_PRECISION / twoPool.get_virtual_price();
        uint256 minimumMintAmount = expectedOutput * twoPoolSlippage / SLIPPAGE_PRECISION;

        // Record the amount of 2pool lp tokens that we start with before adding liquidity
        // so that we can determine how many we minted.
        uint256 startingBalance = twoPoolToken.balanceOf(address(this));

        // For assets like USDT, the approval must be first set to zero before updating it.
        SafeERC20.safeApprove(address(token), address(twoPool), 0);
        SafeERC20.safeApprove(address(token), address(twoPool), amount);

        // Add the liquidity to the pool.
        twoPool.add_liquidity(amounts, minimumMintAmount);

        // Calculate how many 2pool lp tokens were minted.
        minted = twoPoolToken.balanceOf(address(this)) - startingBalance;

        emit MintTwoPoolTokens(asset, amount, minted);
    }

    /// @dev Burns 2pool tokens to withdraw an asset.
    ///
    /// @param asset  The asset to withdraw.
    /// @param amount The amount of 2pool tokens to burn.
    ///
    /// @return withdrawn The amount of the asset withdrawn from the pool.
    function _burnTwoPoolTokens(
        PoolAsset asset,
        uint256 amount
    ) internal returns (uint256 withdrawn) {
        IERC20 token          = getTokenForTwoPoolAsset(asset);
        IERC20 twoPoolToken = IERC20(address(twoPool));

        uint256 index = uint256(asset);

        // Calculate the minimum amount of underlying tokens that we are expecting out when
        // removing single sided liquidity. This value is twod off the optimistic assumption that
        // one of each token is approximately equal to one 2pool lp token.
        uint256 normalizedAmount = amount * twoPoolSlippage / SLIPPAGE_PRECISION;
        uint256 minimumAmountOut   = normalizedAmount * twoPool.get_virtual_price() / CURVE_PRECISION;

        // Record the amount of underlying tokens that we start with before removing liquidity
        // so that we can determine how many we withdrew from the pool.
        uint256 startingBalance = token.balanceOf(address(this));

        SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), 0);
        SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), amount);

        // Remove the liquidity from the pool.
        twoPool.remove_liquidity_one_coin(amount, int128(uint128(index)), minimumAmountOut);

        // Calculate how many underlying tokens that were withdrawn.
        withdrawn = token.balanceOf(address(this)) - startingBalance;

        emit BurnTwoPoolTokens(asset, amount, withdrawn);
    }

    // /// @dev Burns 2pool tokens to withdraw an asset.
    // ///
    // /// @param amount The amount of 2pool tokens to burn.
    // function _burnTwoPoolTokensBalanced(
    //     uint256 amount,
    //     uint256[2] calldata minAmounts
    // ) internal {
    //     IERC20 twoPoolToken = IERC20(address(twoPool));

    //     SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), 0);
    //     SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), amount);

    //     // Remove the liquidity from the pool.
    //     twoPool.remove_liquidity(amount, minAmounts, address(this));
    // }

    /// @dev Deposits and stakes meta pool tokens into convex.
    ///
    /// @param amount   The amount of meta pool tokens to deposit.
    /// @param lockTime The time of the new lock.
    ///
    /// @return success If the tokens were successfully deposited.
    /// @return id      The id of the new lock.
    function _depositTwoPoolTokens(uint256 amount, uint256 lockTime) internal returns (bool success, bytes32 id) {
        SafeERC20.safeApprove(address(twoPool), address(convexFraxVault), amount);
        id = convexFraxVault.stakeLockedCurveLp(amount, lockTime);
        kekId[id] = LockParams({amount: amount, timeLocked: lockTime});

        success = true;

        emit DepositTwoPoolTokens(amount, id, success);
    }

    /// @dev Withdraws and unwraps meta pool tokens from convex.
    ///
    /// @param amount   The amount of meta pool tokens to withdraw.
    /// @param id       The id of the lock you wish to withdraw from.
    ///
    /// @return success If the tokens were successfully withdrawn.
    function _withdrawTwoPoolTokens(uint256 amount, bytes32 id) internal returns (bool success) {
        uint256 originalBalance = IERC20(address(twoPool)).balanceOf(address(this));

        convexFraxVault.withdrawLockedAndUnwrap(id);

        uint256 newBalance = IERC20(address(twoPool)).balanceOf(address(this));

        // Frax vaults require to withdraw all meta tokens.
        // We must re-stake any remaining tokens.
        uint256 restakeAmount = newBalance - originalBalance - amount;

        if (restakeAmount > 1) {
            SafeERC20.safeApprove(address(twoPool), address(convexFraxVault), restakeAmount);
            bytes32 newId = convexFraxVault.stakeLockedCurveLp(restakeAmount, MINIMUM_LOCK_TIME);
            kekId[newId] = LockParams({amount: restakeAmount, timeLocked: MINIMUM_LOCK_TIME});
            emit DepositTwoPoolTokens(restakeAmount, newId, success);
        }

        success = true;
        emit WithdrawTwoPoolTokens(IERC20(address(twoPool)).balanceOf(address(this)), success);
    }

    /// @dev Claims convex, curve, and auxiliary rewards.
    ///
    /// @return success If the claim was successful.
    function _claimRewards() internal returns (bool) {
        convexFraxVault.getReward();

        uint256 fxsBalance    = fraxShareToken.balanceOf(address(this));
        uint256 curveBalance  = curveToken.balanceOf(address(this));
        uint256 convexBalance = convexToken.balanceOf(address(this));

        SafeERC20.safeTransfer(address(curveToken), rewardReceiver, curveBalance);
        SafeERC20.safeTransfer(address(convexToken), rewardReceiver, convexBalance);
        
        emit ClaimRewards(true, fxsBalance, curveBalance, convexBalance);

        return true;
    }

    /// @dev Gets the minimum of two integers.
    ///
    /// @param x The first integer.
    /// @param y The second integer.
    ///
    /// @return The minimum value.
    function min(uint256 x , uint256 y) private pure returns (uint256) {
        return x > y ? y : x;
    }

    /// @dev Gets the absolute value of the difference of two integers.
    ///
    /// @param x The first integer.
    /// @param y The second integer.
    ///
    /// @return The absolute value.
    function abs(uint256 x , uint256 y) private pure returns (uint256) {
        return x > y ? x - y : y - x;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"components":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"rewardReceiver","type":"address"},{"internalType":"address","name":"transmuterBuffer","type":"address"},{"internalType":"contract IERC20","name":"fraxShareToken","type":"address"},{"internalType":"contract IERC20","name":"curveToken","type":"address"},{"internalType":"contract IStableSwap2Pool","name":"twoPool","type":"address"},{"internalType":"uint256","name":"twoPoolSlippage","type":"uint256"},{"internalType":"contract IConvexToken","name":"convexToken","type":"address"},{"internalType":"contract IConvexStakingWrapper","name":"convexStakingWrapper","type":"address"},{"internalType":"contract IConvexFraxBooster","name":"convexFraxBooster","type":"address"},{"internalType":"uint256","name":"convexPoolId","type":"uint256"}],"internalType":"struct InitializationParams","name":"params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"ERC20CallFailed","type":"error"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"IllegalArgument","type":"error"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"IllegalState","type":"error"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"result","type":"bytes"}],"name":"MulticallFailed","type":"error"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"AdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"}],"name":"BurnTwoPoolTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amountFxs","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountCurve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountConvex","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"DepositTwoPoolTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[2]","name":"amounts","type":"uint256[2]"},{"indexed":false,"internalType":"uint256","name":"mintedTwoPoolTokens","type":"uint256"}],"name":"MintTwoPoolTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintedTwoPoolTokens","type":"uint256"}],"name":"MintTwoPoolTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingAdmin","type":"address"}],"name":"PendingAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReclaimTwoPoolAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardReceiver","type":"address"}],"name":"RewardReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"transmuterBuffer","type":"address"}],"name":"TransmuterBufferUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"twoPoolSlippage","type":"uint256"}],"name":"TwoPoolSlippageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"WithdrawTwoPoolTokens","type":"event"},{"inputs":[],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnTwoPoolTokens","outputs":[{"internalType":"uint256","name":"withdrawn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"convexFraxBooster","outputs":[{"internalType":"contract IConvexFraxBooster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexFraxVault","outputs":[{"internalType":"contract IConvexFraxVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexStakingWrapper","outputs":[{"internalType":"contract IConvexStakingWrapper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexToken","outputs":[{"internalType":"contract IConvexToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTwoPoolTokens","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockTime","type":"uint256"}],"name":"depositTwoPoolTokensCustomLock","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"emergencyRecall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"}],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"amounts","type":"uint256[2]"}],"name":"flush","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flush","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"amounts","type":"uint256[2]"},{"internalType":"uint256","name":"lockTime","type":"uint256"}],"name":"flushCustomLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockTime","type":"uint256"}],"name":"flushCustomLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fraxShareToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"}],"name":"getTokenForTwoPoolAsset","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"kekId","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timeLocked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintTwoPoolTokens","outputs":[{"internalType":"uint256","name":"minted","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"amounts","type":"uint256[2]"}],"name":"mintTwoPoolTokens","outputs":[{"internalType":"uint256","name":"minted","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"onERC20Received","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"recall","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reclaimTwoPoolAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setPendingAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setRewardReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setTransmuterBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setTwoPoolSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transmuterBuffer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"twoPool","outputs":[{"internalType":"contract IStableSwap2Pool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"}],"name":"twoPoolAssetReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"twoPoolSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"withdrawTwoPoolTokens","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6101606040526000805460ff191660011790553480156200001f57600080fd5b5060405162003af738038062003af7833981016040819052620000429162000401565b805160008054610100600160a81b0319166101006001600160a01b039384168102919091178255604080850151600380546001600160a01b03199081169287169290921790556060860151600480549092169086161781556080808701518616905260a0808701518616905260c0808701518616905260e080870151600555838701518616905261012080870151861690935261014080870151861693849052610160870151908190526020808801519096168552600290955292819020805460ff1916600117905551639abbdf4b60e01b815291820192909252639abbdf4b906024016020604051808303816000875af115801562000146573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016c9190620004f8565b600680546001600160a01b0319166001600160a01b039290921691909117905560005b6002811015620002555760c082015160405163c661065760e01b8152600481018390526001600160a01b039091169063c661065790602401602060405180830381865afa158015620001e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020b9190620004f8565b600882600281106200022157620002216200051f565b0180546001600160a01b0319166001600160a01b0392909216919091179055806200024c8162000535565b9150506200018f565b506000546040516101009091046001600160a01b031681527f54e4612788f90384e6843298d7854436f3a585b2c3831ab66abf1de63bfa6c2d9060200160405180910390a16020808201516040516001600160a01b0390911681527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec4910160405180910390a16003546040516001600160a01b0390911681527f2bebe3801c306ffa893b76894d5baf1cef32807aa974f6449595a9c2392f61749060200160405180910390a16004546040516001600160a01b0390911681527f59dea4585e1df1b7a22cafd3486f3c6080e7bd27c1450af2f11f192cb637658b9060200160405180910390a17f32c890dda1c5857193234f885837d184a81efbb9b84bd7697acd063461950bb16005546040516200038f91815260200190565b60405180910390a1506200055d565b60405161018081016001600160401b0381118282101715620003d057634e487b7160e01b600052604160045260246000fd5b60405290565b6001600160a01b0381168114620003ec57600080fd5b50565b8051620003fc81620003d6565b919050565b600061018082840312156200041557600080fd5b6200041f6200039e565b6200042a83620003ef565b81526200043a60208401620003ef565b60208201526200044d60408401620003ef565b60408201526200046060608401620003ef565b60608201526200047360808401620003ef565b60808201526200048660a08401620003ef565b60a08201526200049960c08401620003ef565b60c082015260e083015160e0820152610100620004b8818501620003ef565b90820152610120620004cc848201620003ef565b90820152610140620004e0848201620003ef565b90820152610160928301519281019290925250919050565b6000602082840312156200050b57600080fd5b81516200051881620003d6565b9392505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016200055657634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161346d6200068a60003960006107cd015260006105bb015260006104d301526000818161080101528181610dc20152610e7101526000818161025d015281816117000152818161184101528181611872015281816118c001528181611ad901528181611bbb01528181611bfd01528181611c5201528181611d9501528181611ec70152818161200401528181612086015281816121b7015281816121e30152818161221f01528181612357015281816123b8015281816124c2015281816124ee0152818161253a0152818161278501528181612866015281816129070152612a6101526000818161052701528181610d340152610e390152600081816102ae01528181610c9d0152610ea9015261346d6000f3fe6080604052600436106102465760003560e01c80635dd077e311610139578063ac9650d8116100b6578063c48fb9101161007a578063c48fb9101461077b578063dae254dd1461079b578063e529ee95146107bb578063e89133b2146107ef578063f851a44014610823578063f999ea661461084857600080fd5b8063ac9650d8146106b3578063bc04f0af146106d3578063bd6acfa6146106f2578063be4b853414610712578063c0511c251461073257600080fd5b80636ea056a9116100fd5780636ea056a91461061d5780639459f2861461063d578063a608d79a1461065d578063a6f74b141461067d578063aa45bd291461069357600080fd5b80635dd077e314610569578063602955f114610589578063625540ea146105a95780636426177d146105dd5780636464cdb1146105fd57600080fd5b80632c9d737a116101c757806341af8cb21161018b57806341af8cb2146104a15780634a9fc49c146104c15780634dd18bf5146104f55780634f39059c14610515578063558a72971461054957600080fd5b80632c9d737a1461040c578063357aa4e11461042c578063372500ab1461044c578063397d9663146104615780634070a3481461048157600080fd5b806318d123211161020e57806318d12321146103475780631a637fe1146103755780631dac30b0146103ac57806326782247146103cc57806327409b3c146103ec57600080fd5b806307e6754c1461024b5780630896f2c61461029c5780630dc3d0ff146102d05780630e18b681146102f057806313e7c9d814610307575b600080fd5b34801561025757600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102a857600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102dc57600080fd5b5060045461027f906001600160a01b031681565b3480156102fc57600080fd5b50610305610868565b005b34801561031357600080fd5b50610337610322366004612c36565b60026020526000908152604090205460ff1681565b6040519015158152602001610293565b34801561035357600080fd5b50610367610362366004612c62565b6109b3565b604051908152602001610293565b34801561038157600080fd5b50610395610390366004612c8d565b610a38565b604080519215158352602083019190915201610293565b3480156103b857600080fd5b5060035461027f906001600160a01b031681565b3480156103d857600080fd5b5060015461027f906001600160a01b031681565b3480156103f857600080fd5b50610367610407366004612cbe565b610a90565b34801561041857600080fd5b50610367610427366004612cf1565b610b1b565b34801561043857600080fd5b50610367610447366004612d1b565b610b69565b34801561045857600080fd5b50610337610be0565b34801561046d57600080fd5b5061027f61047c366004612d1b565b610f30565b34801561048d57600080fd5b5061036761049c366004612cf1565b610fbd565b3480156104ad57600080fd5b506103676104bc366004612d36565b611001565b3480156104cd57600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050157600080fd5b50610305610510366004612c36565b611088565b34801561052157600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561055557600080fd5b50610305610564366004612d63565b61110d565b34801561057557600080fd5b50610367610584366004612cbe565b611199565b34801561059557600080fd5b5060065461027f906001600160a01b031681565b3480156105b557600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e957600080fd5b506103056105f8366004612cf1565b61123e565b34801561060957600080fd5b50610305610618366004612c36565b611346565b34801561062957600080fd5b50610305610638366004612d9a565b6113c4565b34801561064957600080fd5b50610305610658366004612db6565b61140f565b34801561066957600080fd5b50610367610678366004612d36565b6114bf565b34801561068957600080fd5b5061036760055481565b34801561069f57600080fd5b506103376106ae366004612c8d565b61150c565b6106c66106c1366004612dcf565b611550565b6040516102939190612ea0565b3480156106df57600080fd5b506103056106ee366004612d9a565b5050565b3480156106fe57600080fd5b5061036761070d366004612cf1565b6116a5565b34801561071e57600080fd5b5061036761072d366004612d1b565b6116fc565b34801561073e57600080fd5b5061076661074d366004612db6565b6007602052600090815260409020805460019091015482565b60408051928352602083019190915201610293565b34801561078757600080fd5b50610305610796366004612c8d565b6117b0565b3480156107a757600080fd5b506103056107b6366004612c36565b61194b565b3480156107c757600080fd5b506103677f000000000000000000000000000000000000000000000000000000000000000081565b3480156107fb57600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561082f57600080fd5b5060005461027f9061010090046001600160a01b031681565b34801561085457600080fd5b50610395610863366004612db6565b6119c9565b6001546001600160a01b03166108bc5760405163c50656df60e01b815260206004820152601360248201527214195b991a5b99c818591b5a5b881d5b9cd95d606a1b60448201526064015b60405180910390fd5b6001546001600160a01b0316331461090b5760405163973d02cb60e01b81526020600482015260116024820152702737ba103832b73234b7339030b236b4b760791b60448201526064016108b3565b6001805460008054610100600160a81b0319166101006001600160a01b03808516820292909217928390556001600160a01b031990931690935560405191900490911681527f54e4612788f90384e6843298d7854436f3a585b2c3831ab66abf1de63bfa6c2d9060200160405180910390a1604051600081527fa728e84b447788a55ff664fbfb5c3983925f88b80b672a1b0b8271c94b22df359060200160405180910390a1565b60006109bd611a22565b3360009081526002602052604090205460ff166109ed5760405163973d02cb60e01b81526004016108b390612f02565b60006109f884611a97565b90506000610a068285611eb9565b50905080610a275760405163c50656df60e01b81526004016108b390612f28565b509050610a32611fe1565b92915050565b600080610a43611a22565b3360009081526002602052604090205460ff16610a735760405163973d02cb60e01b81526004016108b390612f02565b610a7d8484611eb9565b91509150610a89611fe1565b9250929050565b6000610a9a611a22565b3360009081526002602052604090205460ff16610aca5760405163973d02cb60e01b81526004016108b390612f02565b6000610ad68585611ff4565b9050600080610ae58386611eb9565b9150915081610b075760405163c50656df60e01b81526004016108b390612f28565b5090915050610b14611fe1565b9392505050565b6000610b25611a22565b3360009081526002602052604090205460ff16610b555760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383612347565b9050610a32611fe1565b600080610b7583610f30565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a0823190602401602060405180830381865afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b149190612f5f565b6000610bea611a22565b3360009081526002602052604090205460ff16610c1a5760405163973d02cb60e01b81526004016108b390612f02565b600660009054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6a57600080fd5b505af1158015610c7e573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260019350600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa158015610ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d119190612f5f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f9190612f5f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2d9190612f5f565b600354909150610e68907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03168461265b565b600354610ea0907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03168361265b565b600354610ed8907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03168561265b565b60408051851515815260208101859052908101839052606081018290527fc3a2bfdd669309fab32bff187e250ae46596032d10653edb1c04abc3988c44459060800160405180910390a1505050610f2d611fe1565b90565b600080826001811115610f4557610f45612f78565b905060028110610f98576040516354a1577760e11b815260206004820152601960248201527f417373657420696e646578206f7574206f6620626f756e64730000000000000060448201526064016108b3565b60088160028110610fab57610fab612f8e565b01546001600160a01b03169392505050565b6000610fc7611a22565b3360009081526002602052604090205460ff16610ff75760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383611ff4565b600061100b611a22565b3360009081526002602052604090205460ff1661103b5760405163973d02cb60e01b81526004016108b390612f02565b600061104683611a97565b905060006110578262093a80611eb9565b509050806110785760405163c50656df60e01b81526004016108b390612f28565b509050611083611fe1565b919050565b60005461010090046001600160a01b031633146110b85760405163973d02cb60e01b81526004016108b390612fa4565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fa728e84b447788a55ff664fbfb5c3983925f88b80b672a1b0b8271c94b22df35906020015b60405180910390a150565b60005461010090046001600160a01b0316331461113d5760405163973d02cb60e01b81526004016108b390612fa4565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151517905590519182527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec4910160405180910390a15050565b60006111a3611a22565b3360009081526002602052604090205460ff166111d35760405163973d02cb60e01b81526004016108b390612f02565b6111dd8383612763565b61122a5760405163c50656df60e01b815260206004820152601b60248201527f57697468647261772066726f6d20636f6e766578206661696c6564000000000060448201526064016108b3565b6112348484612347565b9050610b14611fe1565b611246611a22565b60005461010090046001600160a01b031633146112765760405163973d02cb60e01b81526004016108b390612fa4565b600061128183610f30565b60045490915061129c9082906001600160a01b03168461265b565b6004805460405163bc04f0af60e01b81526001600160a01b03848116938201939093526024810185905291169063bc04f0af90604401600060405180830381600087803b1580156112ec57600080fd5b505af1158015611300573d6000803e3d6000fd5b505050507f79b317be1efd69d6bf9fcbcd2f3353788aadfc2d546bf7ed03dabab1488b28178383604051611335929190612fe9565b60405180910390a1506106ee611fe1565b60005461010090046001600160a01b031633146113765760405163973d02cb60e01b81526004016108b390612fa4565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f59dea4585e1df1b7a22cafd3486f3c6080e7bd27c1450af2f11f192cb637658b90602001611102565b6113cc611a22565b60005461010090046001600160a01b031633146113fc5760405163973d02cb60e01b81526004016108b390612fa4565b61140782338361265b565b6106ee611fe1565b3360009081526002602052604090205460ff1661143f5760405163973d02cb60e01b81526004016108b390612f02565b61271081111561148a576040516354a1577760e11b8152602060048201526015602482015274536c697070616765206e6f7420696e2072616e676560581b60448201526064016108b3565b60058190556040518181527f32c890dda1c5857193234f885837d184a81efbb9b84bd7697acd063461950bb190602001611102565b60006114c9611a22565b3360009081526002602052604090205460ff166114f95760405163973d02cb60e01b81526004016108b390612f02565b61150282611a97565b9050611083611fe1565b6000611516611a22565b3360009081526002602052604090205460ff166115465760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383612763565b60608167ffffffffffffffff81111561156b5761156b613004565b60405190808252806020026020018201604052801561159e57816020015b60608152602001906001900390816115895790505b50905060005b8281101561169e57600080308686858181106115c2576115c2612f8e565b90506020028101906115d4919061301a565b6040516115e2929190613061565b600060405180830381855af49150503d806000811461161d576040519150601f19603f3d011682016040523d82523d6000602084013e611622565b606091505b50915091508161166d5785858481811061163e5761163e612f8e565b9050602002810190611650919061301a565b8260405163070c497560e21b81526004016108b393929190613071565b8084848151811061168057611680612f8e565b6020026020010181905250505080611697906130cf565b90506115a4565b5092915050565b60006116af611a22565b3360009081526002602052604090205460ff166116df5760405163973d02cb60e01b81526004016108b390612f02565b60006116eb8484611ff4565b90506000610a068262093a80611eb9565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cc2b27d7670de0b6b3a764000084600181111561174857611748612f78565b6040516001600160e01b031960e085901b1681526004810192909252600f0b6024820152604401602060405180830381865afa15801561178c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a329190612f5f565b6117b8611a22565b3360009081526002602052604090205460ff166117e85760405163973d02cb60e01b81526004016108b390612f02565b6117f28282612763565b61183f5760405163c50656df60e01b815260206004820152601b60248201527f57697468647261772066726f6d20636f6e766578206661696c6564000000000060448201526064016108b3565b7f000000000000000000000000000000000000000000000000000000000000000061186c81806000612af5565b611897817f000000000000000000000000000000000000000000000000000000000000000085612af5565b604080518082018252600080825260208201529051633eb1719f60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633eb1719f906118f99087908590309060040161310b565b6000604051808303816000875af1158015611918573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119409190810190613138565b5050506106ee611fe1565b60005461010090046001600160a01b0316331461197b5760405163973d02cb60e01b81526004016108b390612fa4565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f2bebe3801c306ffa893b76894d5baf1cef32807aa974f6449595a9c2392f617490602001611102565b6000806119d4611a22565b3360009081526002602052604090205460ff16611a045760405163973d02cb60e01b81526004016108b390612f02565b611a118362093a80611eb9565b91509150611a1d611fe1565b915091565b600160005460ff166002811115611a3b57611a3b612f78565b14611a805760405163c50656df60e01b8152602060048201526014602482015273131bd8dac8185b1c9958591e4818db185a5b595960621b60448201526064016108b3565b600080546002919060ff19166001835b0217905550565b604080518082019182905260009182919060089060029082845b81546001600160a01b03168152600190910190602001808311611ab1575050505050905060007f000000000000000000000000000000000000000000000000000000000000000090506000611b0582612b28565b60ff1690506000805b6002811015611c4d57868160028110611b2957611b29612f8e565b602002013515611c3b576000611b54868360028110611b4a57611b4a612f8e565b6020020151612b28565b60ff1690506000611b6582866131f6565b9050611b7281600a6132f1565b898460028110611b8457611b84612f8e565b6020020135611b9391906132fd565b611b9d908561331c565b9350611be1878460028110611bb457611bb4612f8e565b60200201517f00000000000000000000000000000000000000000000000000000000000000006000612af5565b611c38878460028110611bf657611bf6612f8e565b60200201517f00000000000000000000000000000000000000000000000000000000000000008b8660028110611c2e57611c2e612f8e565b6020020135612af5565b50505b80611c45816130cf565b915050611b0e565b5060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd29190612f5f565b611ce4670de0b6b3a7640000846132fd565b611cee9190613334565b9050600061271060055483611d0391906132fd565b611d0d9190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a0823190602401602060405180830381865afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b9190612f5f565b604051630b4c7e4d60e01b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630b4c7e4d90611dcc908c908690600401613356565b600060405180830381600087803b158015611de657600080fd5b505af1158015611dfa573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b03891691506370a0823190602401602060405180830381865afa158015611e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e689190612f5f565b611e7291906131f6565b97507f517ddf7483018304eeee2bc47b77b2f2b8b4f0519936b5c1bc4a78e808522c998989604051611ea5929190613356565b60405180910390a150505050505050919050565b6006546000908190611ef6907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031686612af5565b60065460405163a41ce7e960e01b815260048101869052602481018590526001600160a01b039091169063a41ce7e9906044016020604051808303816000875af1158015611f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6c9190612f5f565b60408051808201825286815260208082018781526000858152600783528490209251835551600192830155825188815290810184905291820181905293509091507fdb587f4327457f553eae7150dcd48cd4659b0dc3850b87117885bbfa8d20864f9060600160405180910390a19250929050565b600080546001919060ff19168280611a90565b60008061200084610f30565b90507f0000000000000000000000000000000000000000000000000000000000000000600061202e82612b28565b60ff169050600061203e84612b28565b61204b9060ff16836131f6565b9050612055612c01565b868189600181111561206957612069612f78565b6002811061207957612079612f8e565b60200201818152505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121069190612f5f565b612118670de0b6b3a76400008a6132fd565b6121229190613334565b905060006127106005548361213791906132fd565b6121419190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa15801561218b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121af9190612f5f565b90506121dd887f00000000000000000000000000000000000000000000000000000000000000006000612af5565b612208887f00000000000000000000000000000000000000000000000000000000000000008c612af5565b604051630b4c7e4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630b4c7e4d90612256908790869060040161336c565b600060405180830381600087803b15801561227057600080fd5b505af1158015612284573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b038a1691506370a0823190602401602060405180830381865afa1580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f29190612f5f565b6122fc91906131f6565b98507f92eab167f439529a32b5391965d26b5f172158ac6931fae02a936e50ba8d16608b8b8b60405161233193929190613387565b60405180910390a1505050505050505092915050565b60008061235384610f30565b90507f0000000000000000000000000000000000000000000000000000000000000000600085600181111561238a5761238a612f78565b905060006127106005548761239f91906132fd565b6123a99190613334565b90506000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124389190612f5f565b61244290846132fd565b61244c9190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a0823190602401602060405180830381865afa158015612496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ba9190612f5f565b90506124e8857f00000000000000000000000000000000000000000000000000000000000000006000612af5565b612513857f00000000000000000000000000000000000000000000000000000000000000008a612af5565b604051630d2680e960e11b815260048101899052600f85900b6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631a4d01d290606401600060405180830381600087803b15801561258657600080fd5b505af115801561259a573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b03891691506370a0823190602401602060405180830381865afa1580156125e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126089190612f5f565b61261291906131f6565b96507ff00c2bb112527cee6bc4b721538408ee2f9ecc2ca6998706b4b71b23774e365689898960405161264793929190613387565b60405180910390a150505050505092915050565b6040516001600160a01b03838116602483015260448201839052600091829186169063a9059cbb60e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516126c891906133a6565b6000604051808303816000865af19150503d8060008114612705576040519150601f19603f3d011682016040523d82523d6000602084013e61270a565b606091505b5091509150811580612738575080511580159061273857508080602001905181019061273691906133c2565b155b1561275c5784828260405163e7e40b5b60e01b81526004016108b3939291906133df565b5050505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f09190612f5f565b600654604051634ab794a360e01b8152600481018690529192506001600160a01b031690634ab794a390602401600060405180830381600087803b15801561283757600080fd5b505af115801561284b573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa1580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da9190612f5f565b90506000856128e984846131f6565b6128f391906131f6565b90506001811115612a2657600654612936907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031683612af5565b60065460405163a41ce7e960e01b81526004810183905262093a8060248201526000916001600160a01b03169063a41ce7e9906044016020604051808303816000875af115801561298b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129af9190612f5f565b60408051808201825284815262093a80602080830191825260008581526007825284902092518355905160019092019190915581518581529081018390528715158183015290519192507fdb587f4327457f553eae7150dcd48cd4659b0dc3850b87117885bbfa8d20864f919081900360600190a1505b6040516370a0823160e01b8152306004820152600194507f554ea882a1b2a34679dfdcdd2fbca86efdadd76d2fb7902b4f0a31b7b2a7fc98907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad49190612f5f565b6040805191825286151560208301520160405180910390a150505092915050565b6040516001600160a01b03838116602483015260448201839052600091829186169063095ea7b360e01b9060640161268a565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691612b6e91906133a6565b600060405180830381855afa9150503d8060008114612ba9576040519150601f19603f3d011682016040523d82523d6000602084013e612bae565b606091505b5091509150811580612bc1575060208151105b15612be55783828260405163e7e40b5b60e01b81526004016108b3939291906133df565b80806020019051810190612bf99190613414565b949350505050565b60405180604001604052806002906020820280368337509192915050565b80356001600160a01b038116811461108357600080fd5b600060208284031215612c4857600080fd5b610b1482612c1f565b8060408101831015610a3257600080fd5b60008060608385031215612c7557600080fd5b612c7f8484612c51565b946040939093013593505050565b60008060408385031215612ca057600080fd5b50508035926020909101359150565b80356002811061108357600080fd5b600080600060608486031215612cd357600080fd5b612cdc84612caf565b95602085013595506040909401359392505050565b60008060408385031215612d0457600080fd5b612d0d83612caf565b946020939093013593505050565b600060208284031215612d2d57600080fd5b610b1482612caf565b600060408284031215612d4857600080fd5b610b148383612c51565b8015158114612d6057600080fd5b50565b60008060408385031215612d7657600080fd5b612d7f83612c1f565b91506020830135612d8f81612d52565b809150509250929050565b60008060408385031215612dad57600080fd5b612d0d83612c1f565b600060208284031215612dc857600080fd5b5035919050565b60008060208385031215612de257600080fd5b823567ffffffffffffffff80821115612dfa57600080fd5b818501915085601f830112612e0e57600080fd5b813581811115612e1d57600080fd5b8660208260051b8501011115612e3257600080fd5b60209290920196919550909350505050565b60005b83811015612e5f578181015183820152602001612e47565b83811115612e6e576000848401525b50505050565b60008151808452612e8c816020860160208601612e44565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612ef557603f19888603018452612ee3858351612e74565b94509285019290850190600101612ec7565b5092979650505050505050565b6020808252600c908201526b2737ba1037b832b930ba37b960a11b604082015260600190565b6020808252601a908201527f4465706f73697420696e746f20636f6e766578206661696c6564000000000000604082015260600190565b600060208284031215612f7157600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252600990820152682737ba1030b236b4b760b91b604082015260600190565b60028110612fe557634e487b7160e01b600052602160045260246000fd5b9052565b60408101612ff78285612fc7565b8260208301529392505050565b634e487b7160e01b600052604160045260246000fd5b6000808335601e1984360301811261303157600080fd5b83018035915067ffffffffffffffff82111561304c57600080fd5b602001915036819003821315610a8957600080fd5b8183823760009101908152919050565b60408152826040820152828460608301376000606084830101526000601f19601f850116820160608382030160208401526130af6060820185612e74565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016130e1576130e16130b9565b5060010190565b8060005b6002811015612e6e5781518452602093840193909101906001016130ec565b8381526080810161311f60208301856130e8565b6001600160a01b03929092166060919091015292915050565b6000602080838503121561314b57600080fd5b825167ffffffffffffffff8082111561316357600080fd5b818501915085601f83011261317757600080fd5b81518181111561318957613189613004565b8060051b604051601f19603f830116810181811085821117156131ae576131ae613004565b6040529182528482019250838101850191888311156131cc57600080fd5b938501935b828510156131ea578451845293850193928501926131d1565b98975050505050505050565b600082821015613208576132086130b9565b500390565b600181815b8085111561324857816000190482111561322e5761322e6130b9565b8085161561323b57918102915b93841c9390800290613212565b509250929050565b60008261325f57506001610a32565b8161326c57506000610a32565b8160018114613282576002811461328c576132a8565b6001915050610a32565b60ff84111561329d5761329d6130b9565b50506001821b610a32565b5060208310610133831016604e8410600b84101617156132cb575081810a610a32565b6132d5838361320d565b80600019048211156132e9576132e96130b9565b029392505050565b6000610b148383613250565b6000816000190483118215151615613317576133176130b9565b500290565b6000821982111561332f5761332f6130b9565b500190565b60008261335157634e487b7160e01b600052601260045260246000fd5b500490565b6060810160408483378260408301529392505050565b6060810161337a82856130e8565b8260408301529392505050565b606081016133958286612fc7565b602082019390935260400152919050565b600082516133b8818460208701612e44565b9190910192915050565b6000602082840312156133d457600080fd5b8151610b1481612d52565b6001600160a01b0384168152821515602082015260606040820181905260009061340b90830184612e74565b95945050505050565b60006020828403121561342657600080fd5b815160ff81168114610b1457600080fdfea2646970667358221220251a6c160b472c1629c1866b390108437c06adfc2e17b178cc5c8a998d60d67f64736f6c634300080d00330000000000000000000000008392f6669292fa56123f71949b52d883ae57e2250000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf90000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9000000000000000000000000bc2fb245594a68c927c930fbe2d00680a8c90b9e0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d00000000000000000000000000000000000000000000000000000000000026fc0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b0000000000000000000000008a59781b415288f9e633b948618726cb6e47e9800000000000000000000000002b8b301b90eb8801f1eefe73285eec117d2ffc950000000000000000000000000000000000000000000000000000000000000036

Deployed Bytecode

0x6080604052600436106102465760003560e01c80635dd077e311610139578063ac9650d8116100b6578063c48fb9101161007a578063c48fb9101461077b578063dae254dd1461079b578063e529ee95146107bb578063e89133b2146107ef578063f851a44014610823578063f999ea661461084857600080fd5b8063ac9650d8146106b3578063bc04f0af146106d3578063bd6acfa6146106f2578063be4b853414610712578063c0511c251461073257600080fd5b80636ea056a9116100fd5780636ea056a91461061d5780639459f2861461063d578063a608d79a1461065d578063a6f74b141461067d578063aa45bd291461069357600080fd5b80635dd077e314610569578063602955f114610589578063625540ea146105a95780636426177d146105dd5780636464cdb1146105fd57600080fd5b80632c9d737a116101c757806341af8cb21161018b57806341af8cb2146104a15780634a9fc49c146104c15780634dd18bf5146104f55780634f39059c14610515578063558a72971461054957600080fd5b80632c9d737a1461040c578063357aa4e11461042c578063372500ab1461044c578063397d9663146104615780634070a3481461048157600080fd5b806318d123211161020e57806318d12321146103475780631a637fe1146103755780631dac30b0146103ac57806326782247146103cc57806327409b3c146103ec57600080fd5b806307e6754c1461024b5780630896f2c61461029c5780630dc3d0ff146102d05780630e18b681146102f057806313e7c9d814610307575b600080fd5b34801561025757600080fd5b5061027f7f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102a857600080fd5b5061027f7f0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d081565b3480156102dc57600080fd5b5060045461027f906001600160a01b031681565b3480156102fc57600080fd5b50610305610868565b005b34801561031357600080fd5b50610337610322366004612c36565b60026020526000908152604090205460ff1681565b6040519015158152602001610293565b34801561035357600080fd5b50610367610362366004612c62565b6109b3565b604051908152602001610293565b34801561038157600080fd5b50610395610390366004612c8d565b610a38565b604080519215158352602083019190915201610293565b3480156103b857600080fd5b5060035461027f906001600160a01b031681565b3480156103d857600080fd5b5060015461027f906001600160a01b031681565b3480156103f857600080fd5b50610367610407366004612cbe565b610a90565b34801561041857600080fd5b50610367610427366004612cf1565b610b1b565b34801561043857600080fd5b50610367610447366004612d1b565b610b69565b34801561045857600080fd5b50610337610be0565b34801561046d57600080fd5b5061027f61047c366004612d1b565b610f30565b34801561048d57600080fd5b5061036761049c366004612cf1565b610fbd565b3480156104ad57600080fd5b506103676104bc366004612d36565b611001565b3480156104cd57600080fd5b5061027f7f0000000000000000000000008a59781b415288f9e633b948618726cb6e47e98081565b34801561050157600080fd5b50610305610510366004612c36565b611088565b34801561052157600080fd5b5061027f7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5281565b34801561055557600080fd5b50610305610564366004612d63565b61110d565b34801561057557600080fd5b50610367610584366004612cbe565b611199565b34801561059557600080fd5b5060065461027f906001600160a01b031681565b3480156105b557600080fd5b5061027f7f0000000000000000000000002b8b301b90eb8801f1eefe73285eec117d2ffc9581565b3480156105e957600080fd5b506103056105f8366004612cf1565b61123e565b34801561060957600080fd5b50610305610618366004612c36565b611346565b34801561062957600080fd5b50610305610638366004612d9a565b6113c4565b34801561064957600080fd5b50610305610658366004612db6565b61140f565b34801561066957600080fd5b50610367610678366004612d36565b6114bf565b34801561068957600080fd5b5061036760055481565b34801561069f57600080fd5b506103376106ae366004612c8d565b61150c565b6106c66106c1366004612dcf565b611550565b6040516102939190612ea0565b3480156106df57600080fd5b506103056106ee366004612d9a565b5050565b3480156106fe57600080fd5b5061036761070d366004612cf1565b6116a5565b34801561071e57600080fd5b5061036761072d366004612d1b565b6116fc565b34801561073e57600080fd5b5061076661074d366004612db6565b6007602052600090815260409020805460019091015482565b60408051928352602083019190915201610293565b34801561078757600080fd5b50610305610796366004612c8d565b6117b0565b3480156107a757600080fd5b506103056107b6366004612c36565b61194b565b3480156107c757600080fd5b506103677f000000000000000000000000000000000000000000000000000000000000003681565b3480156107fb57600080fd5b5061027f7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b34801561082f57600080fd5b5060005461027f9061010090046001600160a01b031681565b34801561085457600080fd5b50610395610863366004612db6565b6119c9565b6001546001600160a01b03166108bc5760405163c50656df60e01b815260206004820152601360248201527214195b991a5b99c818591b5a5b881d5b9cd95d606a1b60448201526064015b60405180910390fd5b6001546001600160a01b0316331461090b5760405163973d02cb60e01b81526020600482015260116024820152702737ba103832b73234b7339030b236b4b760791b60448201526064016108b3565b6001805460008054610100600160a81b0319166101006001600160a01b03808516820292909217928390556001600160a01b031990931690935560405191900490911681527f54e4612788f90384e6843298d7854436f3a585b2c3831ab66abf1de63bfa6c2d9060200160405180910390a1604051600081527fa728e84b447788a55ff664fbfb5c3983925f88b80b672a1b0b8271c94b22df359060200160405180910390a1565b60006109bd611a22565b3360009081526002602052604090205460ff166109ed5760405163973d02cb60e01b81526004016108b390612f02565b60006109f884611a97565b90506000610a068285611eb9565b50905080610a275760405163c50656df60e01b81526004016108b390612f28565b509050610a32611fe1565b92915050565b600080610a43611a22565b3360009081526002602052604090205460ff16610a735760405163973d02cb60e01b81526004016108b390612f02565b610a7d8484611eb9565b91509150610a89611fe1565b9250929050565b6000610a9a611a22565b3360009081526002602052604090205460ff16610aca5760405163973d02cb60e01b81526004016108b390612f02565b6000610ad68585611ff4565b9050600080610ae58386611eb9565b9150915081610b075760405163c50656df60e01b81526004016108b390612f28565b5090915050610b14611fe1565b9392505050565b6000610b25611a22565b3360009081526002602052604090205460ff16610b555760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383612347565b9050610a32611fe1565b600080610b7583610f30565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a0823190602401602060405180830381865afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b149190612f5f565b6000610bea611a22565b3360009081526002602052604090205460ff16610c1a5760405163973d02cb60e01b81526004016108b390612f02565b600660009054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6a57600080fd5b505af1158015610c7e573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260019350600092507f0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d06001600160a01b031691506370a0823190602401602060405180830381865afa158015610ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d119190612f5f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5216906370a0823190602401602060405180830381865afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f9190612f5f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b16906370a0823190602401602060405180830381865afa158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2d9190612f5f565b600354909150610e68907f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52906001600160a01b03168461265b565b600354610ea0907f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906001600160a01b03168361265b565b600354610ed8907f0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0906001600160a01b03168561265b565b60408051851515815260208101859052908101839052606081018290527fc3a2bfdd669309fab32bff187e250ae46596032d10653edb1c04abc3988c44459060800160405180910390a1505050610f2d611fe1565b90565b600080826001811115610f4557610f45612f78565b905060028110610f98576040516354a1577760e11b815260206004820152601960248201527f417373657420696e646578206f7574206f6620626f756e64730000000000000060448201526064016108b3565b60088160028110610fab57610fab612f8e565b01546001600160a01b03169392505050565b6000610fc7611a22565b3360009081526002602052604090205460ff16610ff75760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383611ff4565b600061100b611a22565b3360009081526002602052604090205460ff1661103b5760405163973d02cb60e01b81526004016108b390612f02565b600061104683611a97565b905060006110578262093a80611eb9565b509050806110785760405163c50656df60e01b81526004016108b390612f28565b509050611083611fe1565b919050565b60005461010090046001600160a01b031633146110b85760405163973d02cb60e01b81526004016108b390612fa4565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fa728e84b447788a55ff664fbfb5c3983925f88b80b672a1b0b8271c94b22df35906020015b60405180910390a150565b60005461010090046001600160a01b0316331461113d5760405163973d02cb60e01b81526004016108b390612fa4565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151517905590519182527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec4910160405180910390a15050565b60006111a3611a22565b3360009081526002602052604090205460ff166111d35760405163973d02cb60e01b81526004016108b390612f02565b6111dd8383612763565b61122a5760405163c50656df60e01b815260206004820152601b60248201527f57697468647261772066726f6d20636f6e766578206661696c6564000000000060448201526064016108b3565b6112348484612347565b9050610b14611fe1565b611246611a22565b60005461010090046001600160a01b031633146112765760405163973d02cb60e01b81526004016108b390612fa4565b600061128183610f30565b60045490915061129c9082906001600160a01b03168461265b565b6004805460405163bc04f0af60e01b81526001600160a01b03848116938201939093526024810185905291169063bc04f0af90604401600060405180830381600087803b1580156112ec57600080fd5b505af1158015611300573d6000803e3d6000fd5b505050507f79b317be1efd69d6bf9fcbcd2f3353788aadfc2d546bf7ed03dabab1488b28178383604051611335929190612fe9565b60405180910390a1506106ee611fe1565b60005461010090046001600160a01b031633146113765760405163973d02cb60e01b81526004016108b390612fa4565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f59dea4585e1df1b7a22cafd3486f3c6080e7bd27c1450af2f11f192cb637658b90602001611102565b6113cc611a22565b60005461010090046001600160a01b031633146113fc5760405163973d02cb60e01b81526004016108b390612fa4565b61140782338361265b565b6106ee611fe1565b3360009081526002602052604090205460ff1661143f5760405163973d02cb60e01b81526004016108b390612f02565b61271081111561148a576040516354a1577760e11b8152602060048201526015602482015274536c697070616765206e6f7420696e2072616e676560581b60448201526064016108b3565b60058190556040518181527f32c890dda1c5857193234f885837d184a81efbb9b84bd7697acd063461950bb190602001611102565b60006114c9611a22565b3360009081526002602052604090205460ff166114f95760405163973d02cb60e01b81526004016108b390612f02565b61150282611a97565b9050611083611fe1565b6000611516611a22565b3360009081526002602052604090205460ff166115465760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383612763565b60608167ffffffffffffffff81111561156b5761156b613004565b60405190808252806020026020018201604052801561159e57816020015b60608152602001906001900390816115895790505b50905060005b8281101561169e57600080308686858181106115c2576115c2612f8e565b90506020028101906115d4919061301a565b6040516115e2929190613061565b600060405180830381855af49150503d806000811461161d576040519150601f19603f3d011682016040523d82523d6000602084013e611622565b606091505b50915091508161166d5785858481811061163e5761163e612f8e565b9050602002810190611650919061301a565b8260405163070c497560e21b81526004016108b393929190613071565b8084848151811061168057611680612f8e565b6020026020010181905250505080611697906130cf565b90506115a4565b5092915050565b60006116af611a22565b3360009081526002602052604090205460ff166116df5760405163973d02cb60e01b81526004016108b390612f02565b60006116eb8484611ff4565b90506000610a068262093a80611eb9565b60007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031663cc2b27d7670de0b6b3a764000084600181111561174857611748612f78565b6040516001600160e01b031960e085901b1681526004810192909252600f0b6024820152604401602060405180830381865afa15801561178c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a329190612f5f565b6117b8611a22565b3360009081526002602052604090205460ff166117e85760405163973d02cb60e01b81526004016108b390612f02565b6117f28282612763565b61183f5760405163c50656df60e01b815260206004820152601b60248201527f57697468647261772066726f6d20636f6e766578206661696c6564000000000060448201526064016108b3565b7f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d61186c81806000612af5565b611897817f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d85612af5565b604080518082018252600080825260208201529051633eb1719f60e01b81526001600160a01b037f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d1690633eb1719f906118f99087908590309060040161310b565b6000604051808303816000875af1158015611918573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119409190810190613138565b5050506106ee611fe1565b60005461010090046001600160a01b0316331461197b5760405163973d02cb60e01b81526004016108b390612fa4565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f2bebe3801c306ffa893b76894d5baf1cef32807aa974f6449595a9c2392f617490602001611102565b6000806119d4611a22565b3360009081526002602052604090205460ff16611a045760405163973d02cb60e01b81526004016108b390612f02565b611a118362093a80611eb9565b91509150611a1d611fe1565b915091565b600160005460ff166002811115611a3b57611a3b612f78565b14611a805760405163c50656df60e01b8152602060048201526014602482015273131bd8dac8185b1c9958591e4818db185a5b595960621b60448201526064016108b3565b600080546002919060ff19166001835b0217905550565b604080518082019182905260009182919060089060029082845b81546001600160a01b03168152600190910190602001808311611ab1575050505050905060007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d90506000611b0582612b28565b60ff1690506000805b6002811015611c4d57868160028110611b2957611b29612f8e565b602002013515611c3b576000611b54868360028110611b4a57611b4a612f8e565b6020020151612b28565b60ff1690506000611b6582866131f6565b9050611b7281600a6132f1565b898460028110611b8457611b84612f8e565b6020020135611b9391906132fd565b611b9d908561331c565b9350611be1878460028110611bb457611bb4612f8e565b60200201517f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6000612af5565b611c38878460028110611bf657611bf6612f8e565b60200201517f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d8b8660028110611c2e57611c2e612f8e565b6020020135612af5565b50505b80611c45816130cf565b915050611b0e565b5060007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd29190612f5f565b611ce4670de0b6b3a7640000846132fd565b611cee9190613334565b9050600061271060055483611d0391906132fd565b611d0d9190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a0823190602401602060405180830381865afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b9190612f5f565b604051630b4c7e4d60e01b81529091506001600160a01b037f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d1690630b4c7e4d90611dcc908c908690600401613356565b600060405180830381600087803b158015611de657600080fd5b505af1158015611dfa573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b03891691506370a0823190602401602060405180830381865afa158015611e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e689190612f5f565b611e7291906131f6565b97507f517ddf7483018304eeee2bc47b77b2f2b8b4f0519936b5c1bc4a78e808522c998989604051611ea5929190613356565b60405180910390a150505050505050919050565b6006546000908190611ef6907f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d906001600160a01b031686612af5565b60065460405163a41ce7e960e01b815260048101869052602481018590526001600160a01b039091169063a41ce7e9906044016020604051808303816000875af1158015611f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6c9190612f5f565b60408051808201825286815260208082018781526000858152600783528490209251835551600192830155825188815290810184905291820181905293509091507fdb587f4327457f553eae7150dcd48cd4659b0dc3850b87117885bbfa8d20864f9060600160405180910390a19250929050565b600080546001919060ff19168280611a90565b60008061200084610f30565b90507f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d600061202e82612b28565b60ff169050600061203e84612b28565b61204b9060ff16836131f6565b9050612055612c01565b868189600181111561206957612069612f78565b6002811061207957612079612f8e565b60200201818152505060007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121069190612f5f565b612118670de0b6b3a76400008a6132fd565b6121229190613334565b905060006127106005548361213791906132fd565b6121419190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa15801561218b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121af9190612f5f565b90506121dd887f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6000612af5565b612208887f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d8c612af5565b604051630b4c7e4d60e01b81526001600160a01b037f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d1690630b4c7e4d90612256908790869060040161336c565b600060405180830381600087803b15801561227057600080fd5b505af1158015612284573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b038a1691506370a0823190602401602060405180830381865afa1580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f29190612f5f565b6122fc91906131f6565b98507f92eab167f439529a32b5391965d26b5f172158ac6931fae02a936e50ba8d16608b8b8b60405161233193929190613387565b60405180910390a1505050505050505092915050565b60008061235384610f30565b90507f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d600085600181111561238a5761238a612f78565b905060006127106005548761239f91906132fd565b6123a99190613334565b90506000670de0b6b3a76400007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124389190612f5f565b61244290846132fd565b61244c9190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a0823190602401602060405180830381865afa158015612496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ba9190612f5f565b90506124e8857f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6000612af5565b612513857f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d8a612af5565b604051630d2680e960e11b815260048101899052600f85900b6024820152604481018390527f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031690631a4d01d290606401600060405180830381600087803b15801561258657600080fd5b505af115801561259a573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b03891691506370a0823190602401602060405180830381865afa1580156125e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126089190612f5f565b61261291906131f6565b96507ff00c2bb112527cee6bc4b721538408ee2f9ecc2ca6998706b4b71b23774e365689898960405161264793929190613387565b60405180910390a150505050505092915050565b6040516001600160a01b03838116602483015260448201839052600091829186169063a9059cbb60e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516126c891906133a6565b6000604051808303816000865af19150503d8060008114612705576040519150601f19603f3d011682016040523d82523d6000602084013e61270a565b606091505b5091509150811580612738575080511580159061273857508080602001905181019061273691906133c2565b155b1561275c5784828260405163e7e40b5b60e01b81526004016108b3939291906133df565b5050505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d16906370a0823190602401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f09190612f5f565b600654604051634ab794a360e01b8152600481018690529192506001600160a01b031690634ab794a390602401600060405180830381600087803b15801561283757600080fd5b505af115801561284b573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031691506370a0823190602401602060405180830381865afa1580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da9190612f5f565b90506000856128e984846131f6565b6128f391906131f6565b90506001811115612a2657600654612936907f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d906001600160a01b031683612af5565b60065460405163a41ce7e960e01b81526004810183905262093a8060248201526000916001600160a01b03169063a41ce7e9906044016020604051808303816000875af115801561298b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129af9190612f5f565b60408051808201825284815262093a80602080830191825260008581526007825284902092518355905160019092019190915581518581529081018390528715158183015290519192507fdb587f4327457f553eae7150dcd48cd4659b0dc3850b87117885bbfa8d20864f919081900360600190a1505b6040516370a0823160e01b8152306004820152600194507f554ea882a1b2a34679dfdcdd2fbca86efdadd76d2fb7902b4f0a31b7b2a7fc98907f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b0316906370a0823190602401602060405180830381865afa158015612ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad49190612f5f565b6040805191825286151560208301520160405180910390a150505092915050565b6040516001600160a01b03838116602483015260448201839052600091829186169063095ea7b360e01b9060640161268a565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691612b6e91906133a6565b600060405180830381855afa9150503d8060008114612ba9576040519150601f19603f3d011682016040523d82523d6000602084013e612bae565b606091505b5091509150811580612bc1575060208151105b15612be55783828260405163e7e40b5b60e01b81526004016108b3939291906133df565b80806020019051810190612bf99190613414565b949350505050565b60405180604001604052806002906020820280368337509192915050565b80356001600160a01b038116811461108357600080fd5b600060208284031215612c4857600080fd5b610b1482612c1f565b8060408101831015610a3257600080fd5b60008060608385031215612c7557600080fd5b612c7f8484612c51565b946040939093013593505050565b60008060408385031215612ca057600080fd5b50508035926020909101359150565b80356002811061108357600080fd5b600080600060608486031215612cd357600080fd5b612cdc84612caf565b95602085013595506040909401359392505050565b60008060408385031215612d0457600080fd5b612d0d83612caf565b946020939093013593505050565b600060208284031215612d2d57600080fd5b610b1482612caf565b600060408284031215612d4857600080fd5b610b148383612c51565b8015158114612d6057600080fd5b50565b60008060408385031215612d7657600080fd5b612d7f83612c1f565b91506020830135612d8f81612d52565b809150509250929050565b60008060408385031215612dad57600080fd5b612d0d83612c1f565b600060208284031215612dc857600080fd5b5035919050565b60008060208385031215612de257600080fd5b823567ffffffffffffffff80821115612dfa57600080fd5b818501915085601f830112612e0e57600080fd5b813581811115612e1d57600080fd5b8660208260051b8501011115612e3257600080fd5b60209290920196919550909350505050565b60005b83811015612e5f578181015183820152602001612e47565b83811115612e6e576000848401525b50505050565b60008151808452612e8c816020860160208601612e44565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612ef557603f19888603018452612ee3858351612e74565b94509285019290850190600101612ec7565b5092979650505050505050565b6020808252600c908201526b2737ba1037b832b930ba37b960a11b604082015260600190565b6020808252601a908201527f4465706f73697420696e746f20636f6e766578206661696c6564000000000000604082015260600190565b600060208284031215612f7157600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252600990820152682737ba1030b236b4b760b91b604082015260600190565b60028110612fe557634e487b7160e01b600052602160045260246000fd5b9052565b60408101612ff78285612fc7565b8260208301529392505050565b634e487b7160e01b600052604160045260246000fd5b6000808335601e1984360301811261303157600080fd5b83018035915067ffffffffffffffff82111561304c57600080fd5b602001915036819003821315610a8957600080fd5b8183823760009101908152919050565b60408152826040820152828460608301376000606084830101526000601f19601f850116820160608382030160208401526130af6060820185612e74565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016130e1576130e16130b9565b5060010190565b8060005b6002811015612e6e5781518452602093840193909101906001016130ec565b8381526080810161311f60208301856130e8565b6001600160a01b03929092166060919091015292915050565b6000602080838503121561314b57600080fd5b825167ffffffffffffffff8082111561316357600080fd5b818501915085601f83011261317757600080fd5b81518181111561318957613189613004565b8060051b604051601f19603f830116810181811085821117156131ae576131ae613004565b6040529182528482019250838101850191888311156131cc57600080fd5b938501935b828510156131ea578451845293850193928501926131d1565b98975050505050505050565b600082821015613208576132086130b9565b500390565b600181815b8085111561324857816000190482111561322e5761322e6130b9565b8085161561323b57918102915b93841c9390800290613212565b509250929050565b60008261325f57506001610a32565b8161326c57506000610a32565b8160018114613282576002811461328c576132a8565b6001915050610a32565b60ff84111561329d5761329d6130b9565b50506001821b610a32565b5060208310610133831016604e8410600b84101617156132cb575081810a610a32565b6132d5838361320d565b80600019048211156132e9576132e96130b9565b029392505050565b6000610b148383613250565b6000816000190483118215151615613317576133176130b9565b500290565b6000821982111561332f5761332f6130b9565b500190565b60008261335157634e487b7160e01b600052601260045260246000fd5b500490565b6060810160408483378260408301529392505050565b6060810161337a82856130e8565b8260408301529392505050565b606081016133958286612fc7565b602082019390935260400152919050565b600082516133b8818460208701612e44565b9190910192915050565b6000602082840312156133d457600080fd5b8151610b1481612d52565b6001600160a01b0384168152821515602082015260606040820181905260009061340b90830184612e74565b95945050505050565b60006020828403121561342657600080fd5b815160ff81168114610b1457600080fdfea2646970667358221220251a6c160b472c1629c1866b390108437c06adfc2e17b178cc5c8a998d60d67f64736f6c634300080d0033

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

0000000000000000000000008392f6669292fa56123f71949b52d883ae57e2250000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf90000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9000000000000000000000000bc2fb245594a68c927c930fbe2d00680a8c90b9e0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d00000000000000000000000000000000000000000000000000000000000026fc0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b0000000000000000000000008a59781b415288f9e633b948618726cb6e47e9800000000000000000000000002b8b301b90eb8801f1eefe73285eec117d2ffc950000000000000000000000000000000000000000000000000000000000000036

-----Decoded View---------------
Arg [0] : params (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000008392f6669292fa56123f71949b52d883ae57e225
Arg [1] : 0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9
Arg [2] : 0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9
Arg [3] : 000000000000000000000000bc2fb245594a68c927c930fbe2d00680a8c90b9e
Arg [4] : 0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0
Arg [5] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [6] : 000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d
Arg [7] : 00000000000000000000000000000000000000000000000000000000000026fc
Arg [8] : 0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b
Arg [9] : 0000000000000000000000008a59781b415288f9e633b948618726cb6e47e980
Arg [10] : 0000000000000000000000002b8b301b90eb8801f1eefe73285eec117d2ffc95
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000036


Deployed Bytecode Sourcemap

16067:31124:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20218:41;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;202:32:1;;;184:51;;172:2;157:18;20218:41:0;;;;;;;;20057:38;;;;;;;;;;;;;;;19978:31;;;;;;;;;;-1:-1:-1;19978:31:0;;;;-1:-1:-1;;;;;19978:31:0;;;24856:415;;;;;;;;;;;;;:::i;:::-;;19813:41;;;;;;;;;;-1:-1:-1;19813:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1210:14:1;;1203:22;1185:41;;1173:2;1158:18;19813:41:0;1045:187:1;31910:458:0;;;;;;;;;;-1:-1:-1;31910:458:0;;;;;:::i;:::-;;:::i;:::-;;;1855:25:1;;;1843:2;1828:18;31910:458:0;1709:177:1;28911:226:0;;;;;;;;;;-1:-1:-1;28911:226:0;;;;;:::i;:::-;;:::i;:::-;;;;2337:14:1;;2330:22;2312:41;;2384:2;2369:18;;2362:34;;;;2285:18;28911:226:0;2144:258:1;19900:29:0;;;;;;;;;;-1:-1:-1;19900:29:0;;;;-1:-1:-1;;;;;19900:29:0;;;19745:27;;;;;;;;;;-1:-1:-1;19745:27:0;;;;-1:-1:-1;;;;;19745:27:0;;;33920:472;;;;;;;;;;-1:-1:-1;33920:472:0;;;;;:::i;:::-;;:::i;27962:199::-;;;;;;;;;;-1:-1:-1;27962:199:0;;;;;:::i;:::-;;:::i;23081:191::-;;;;;;;;;;-1:-1:-1;23081:191:0;;;;;:::i;:::-;;:::i;29760:700::-;;;;;;;;;;;;;:::i;23799:290::-;;;;;;;;;;-1:-1:-1;23799:290:0;;;;;:::i;:::-;;:::i;27501:196::-;;;;;;;;;;-1:-1:-1;27501:196:0;;;;;:::i;:::-;;:::i;30915:429::-;;;;;;;;;;-1:-1:-1;30915:429:0;;;;;:::i;:::-;;:::i;20602:59::-;;;;;;;;;;;;;;;24398:140;;;;;;;;;;-1:-1:-1;24398:140:0;;;;;:::i;:::-;;:::i;20138:34::-;;;;;;;;;;;;;;;25469:157;;;;;;;;;;-1:-1:-1;25469:157:0;;;;;:::i;:::-;;:::i;34972:329::-;;;;;;;;;;-1:-1:-1;34972:329:0;;;;;:::i;:::-;;:::i;20851:39::-;;;;;;;;;;-1:-1:-1;20851:39:0;;;;-1:-1:-1;;;;;20851:39:0;;;20716:53;;;;;;;;;;;;;;;36197:365;;;;;;;;;;-1:-1:-1;36197:365:0;;;;;:::i;:::-;;:::i;26022:152::-;;;;;;;;;;-1:-1:-1;26022:152:0;;;;;:::i;:::-;;:::i;36745:147::-;;;;;;;;;;-1:-1:-1;36745:147:0;;;;;:::i;:::-;;:::i;26573:268::-;;;;;;;;;;-1:-1:-1;26573:268:0;;;;;:::i;:::-;;:::i;27054:192::-;;;;;;;;;;-1:-1:-1;27054:192:0;;;;;:::i;:::-;;:::i;20440:30::-;;;;;;;;;;;;;;;;29433:194;;;;;;;;;;-1:-1:-1;29433:194:0;;;;;:::i;:::-;;:::i;392:453::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37035:78::-;;;;;;;;;;-1:-1:-1;37035:78:0;;;;;:::i;:::-;36197:365;;;32870:433;;;;;;;;;;-1:-1:-1;32870:433:0;;;;;:::i;:::-;;:::i;23458:164::-;;;;;;;;;;-1:-1:-1;23458:164:0;;;;;:::i;:::-;;:::i;21048:44::-;;;;;;;;;;-1:-1:-1;21048:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;8149:25:1;;;8205:2;8190:18;;8183:34;;;;8122:18;21048:44:0;7975:248:1;35386:628:0;;;;;;;;;;-1:-1:-1;35386:628:0;;;;;:::i;:::-;;:::i;25749:146::-;;;;;;;;;;-1:-1:-1;25749:146:0;;;;;:::i;:::-;;:::i;20944:37::-;;;;;;;;;;;;;;;20514:41;;;;;;;;;;;;;;;19672:20;;;;;;;;;;-1:-1:-1;19672:20:0;;;;;;;-1:-1:-1;;;;;19672:20:0;;;28437:198;;;;;;;;;;-1:-1:-1;28437:198:0;;;;;:::i;:::-;;:::i;24856:415::-;24903:12;;-1:-1:-1;;;;;24903:12:0;24899:101;;24953:35;;-1:-1:-1;;;24953:35:0;;8658:2:1;24953:35:0;;;8640:21:1;8697:2;8677:18;;;8670:30;-1:-1:-1;;;8716:18:1;;;8709:49;8775:18;;24953:35:0;;;;;;;;24899:101;25016:12;;-1:-1:-1;;;;;25016:12:0;25032:10;25016:26;25012:99;;25066:33;;-1:-1:-1;;;25066:33:0;;9006:2:1;25066:33:0;;;8988:21:1;9045:2;9025:18;;;9018:30;-1:-1:-1;;;9064:18:1;;;9057:47;9121:18;;25066:33:0;8804:341:1;25012:99:0;25131:12;;;;25123:20;;-1:-1:-1;;;;;;25123:20:0;25131:12;-1:-1:-1;;;;;25131:12:0;;;25123:20;;;;;;;;;;-1:-1:-1;;;;;;25154:25:0;;;;;;25197:19;;25210:5;;;;;;184:51:1;;25197:19:0;;172:2:1;157:18;25197:19:0;;;;;;;25232:31;;25260:1;184:51:1;;25232:31:0;;172:2:1;157:18;25232:31:0;;;;;;;24856:415::o;31910:458::-;32058:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;32078:27:::2;32108;32127:7;32108:18;:27::i;:::-;32078:57;;32149:12;32167:52;32189:19;32210:8;32167:21;:52::i;:::-;32148:71;;;32237:7;32232:90;;32268:42;;-1:-1:-1::0;;;32268:42:0::2;;;;;;;:::i;32232:90::-;-1:-1:-1::0;32341:19:0;-1:-1:-1;2158:11:0;:9;:11::i;:::-;31910:458;;;;:::o;28911:226::-;29046:12;29060:10;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;29090:39:::2;29112:6;29120:8;29090:21;:39::i;:::-;29083:46;;;;2158:11:::0;:9;:11::i;:::-;28911:226;;;;;:::o;33920:472::-;34066:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;34086:27:::2;34116:33;34135:5;34142:6;34116:18;:33::i;:::-;34086:63;;34163:12;34177:10:::0;34191:52:::2;34213:19;34234:8;34191:21;:52::i;:::-;34162:81;;;;34261:7;34256:90;;34292:42;;-1:-1:-1::0;;;34292:42:0::2;;;;;;;:::i;34256:90::-;-1:-1:-1::0;34365:19:0;;-1:-1:-1;;2158:11:0;:9;:11::i;:::-;33920:472;;;;;:::o;27962:199::-;28083:17;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;28120:33:::2;28139:5;28146:6;28120:18;:33::i;:::-;28113:40;;2158:11:::0;:9;:11::i;23081:191::-;23151:7;23171:12;23186:30;23210:5;23186:23;:30::i;:::-;23234;;-1:-1:-1;;;23234:30:0;;23258:4;23234:30;;;184:51:1;23171:45:0;;-1:-1:-1;;;;;;23234:15:0;;;;;157:18:1;;23234:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29760:700::-;29820:12;2119;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;29845:15:::2;;;;;;;;;-1:-1:-1::0;;;;;29845:15:0::2;-1:-1:-1::0;;;;;29845:25:0::2;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;29934:39:0::2;::::0;-1:-1:-1;;;29934:39:0;;29967:4:::2;29934:39;::::0;::::2;184:51:1::0;29893:4:0::2;::::0;-1:-1:-1;29910:18:0::2;::::0;-1:-1:-1;29934:14:0::2;-1:-1:-1::0;;;;;29934:24:0::2;::::0;-1:-1:-1;29934:24:0::2;::::0;157:18:1;;29934:39:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30008:35;::::0;-1:-1:-1;;;30008:35:0;;30037:4:::2;30008:35;::::0;::::2;184:51:1::0;29910:63:0;;-1:-1:-1;29984:20:0::2;::::0;-1:-1:-1;;;;;30008:10:0::2;:20;::::0;::::2;::::0;157:18:1;;30008:35:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30078:36;::::0;-1:-1:-1;;;30078:36:0;;30108:4:::2;30078:36;::::0;::::2;184:51:1::0;29984:59:0;;-1:-1:-1;30054:21:0::2;::::0;-1:-1:-1;;;;;30078:11:0::2;:21;::::0;::::2;::::0;157:18:1;;30078:36:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30171:14;::::0;30054:60;;-1:-1:-1;30127:73:0::2;::::0;30158:10:::2;::::0;-1:-1:-1;;;;;30171:14:0::2;30187:12:::0;30127:22:::2;:73::i;:::-;30256:14;::::0;30211:75:::2;::::0;30242:11:::2;::::0;-1:-1:-1;;;;;30256:14:0::2;30272:13:::0;30211:22:::2;:75::i;:::-;30345:14;::::0;30297:75:::2;::::0;30328:14:::2;::::0;-1:-1:-1;;;;;30345:14:0::2;30361:10:::0;30297:22:::2;:75::i;:::-;30390:62;::::0;;10285:14:1;;10278:22;10260:41;;10332:2;10317:18;;10310:34;;;10360:18;;;10353:34;;;10418:2;10403:18;;10396:34;;;30390:62:0::2;::::0;10247:3:1;10232:19;30390:62:0::2;;;;;;;29834:626;;;2158:11:::0;:9;:11::i;:::-;29760:700;:::o;23799:290::-;23870:6;23889:13;23913:5;23905:14;;;;;;;;:::i;:::-;23889:30;;135:1;23934:5;:25;23930:109;;23983:44;;-1:-1:-1;;;23983:44:0;;10775:2:1;23983:44:0;;;10757:21:1;10814:2;10794:18;;;10787:30;10853:27;10833:18;;;10826:55;10898:18;;23983:44:0;10573:349:1;23930:109:0;24056:18;24075:5;24056:25;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;24056:25:0;;23799:290;-1:-1:-1;;;23799:290:0:o;27501:196::-;27622:14;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;27656:33:::2;27675:5;27682:6;27656:18;:33::i;30915:429::-:0;31026:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;31046:27:::2;31076;31095:7;31076:18;:27::i;:::-;31046:57;;31117:12;31134:61;31156:19;15841:6;31134:21;:61::i;:::-;31116:79;;;31213:7;31208:90;;31244:42;;-1:-1:-1::0;;;31244:42:0::2;;;;;;;:::i;31208:90::-;-1:-1:-1::0;31317:19:0;-1:-1:-1;2158:11:0;:9;:11::i;:::-;30915:429;;;:::o;24398:140::-;21362:5;;;;;-1:-1:-1;;;;;21362:5:0;21348:10;:19;21344:84;;21391:25;;-1:-1:-1;;;21391:25:0;;;;;;;:::i;21344:84::-;24468:12:::1;:20:::0;;-1:-1:-1;;;;;;24468:20:0::1;-1:-1:-1::0;;;;;24468:20:0;::::1;::::0;;::::1;::::0;;;24504:26:::1;::::0;184:51:1;;;24504:26:0::1;::::0;172:2:1;157:18;24504:26:0::1;;;;;;;;24398:140:::0;:::o;25469:157::-;21362:5;;;;;-1:-1:-1;;;;;21362:5:0;21348:10;:19;21344:84;;21391:25;;-1:-1:-1;;;21391:25:0;;;;;;;:::i;21344:84::-;-1:-1:-1;;;;;25550:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;;;;:27;;-1:-1:-1;;25550:27:0::1;::::0;::::1;;;::::0;;25593:25;;184:51:1;;;25593:25:0::1;::::0;157:18:1;25593:25:0::1;;;;;;;25469:157:::0;;:::o;34972:329::-;35103:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;35130:34:::2;35153:6;35161:2;35130:22;:34::i;:::-;35125:118;;35188:43;::::0;-1:-1:-1;;;35188:43:0;;11598:2:1;35188:43:0::2;::::0;::::2;11580:21:1::0;11637:2;11617:18;;;11610:30;11676:29;11656:18;;;11649:57;11723:18;;35188:43:0::2;11396:351:1::0;35125:118:0::2;35260:33;35279:5;35286:6;35260:18;:33::i;:::-;35253:40;;2158:11:::0;:9;:11::i;36197:365::-;2119:12;:10;:12::i;:::-;21362:5:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;21362:5:0::1;21348:10;:19;21344:84;;21391:25;;-1:-1:-1::0;;;21391:25:0::1;;;;;;;:::i;21344:84::-;36292:12:::2;36307:30;36331:5;36307:23;:30::i;:::-;36387:16;::::0;36292:45;;-1:-1:-1;36348:64:0::2;::::0;36292:45;;-1:-1:-1;;;;;36387:16:0::2;36405:6:::0;36348:22:::2;:64::i;:::-;36445:16;::::0;;36425:77:::2;::::0;-1:-1:-1;;;36425:77:0;;-1:-1:-1;;;;;11944:32:1;;;36425:77:0;;::::2;11926:51:1::0;;;;11993:18;;;11986:34;;;36445:16:0;::::2;::::0;36425:53:::2;::::0;11899:18:1;;36425:77:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;36520:34;36540:5;36547:6;36520:34;;;;;;;:::i;:::-;;;;;;;;36281:281;2158:11:::0;:9;:11::i;26022:152::-;21362:5;;;;;-1:-1:-1;;;;;21362:5:0;21348:10;:19;21344:84;;21391:25;;-1:-1:-1;;;21391:25:0;;;;;;;:::i;21344:84::-;26096:16:::1;:24:::0;;-1:-1:-1;;;;;;26096:24:0::1;-1:-1:-1::0;;;;;26096:24:0;::::1;::::0;;::::1;::::0;;;26136:30:::1;::::0;184:51:1;;;26136:30:0::1;::::0;172:2:1;157:18;26136:30:0::1;14:227:1::0;36745:147:0;2119:12;:10;:12::i;:::-;21362:5:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;21362:5:0::1;21348:10;:19;21344:84;;21391:25;;-1:-1:-1::0;;;21391:25:0::1;;;;;;;:::i;21344:84::-;36826:58:::2;36857:5;36865:10;36877:6;36826:22;:58::i;:::-;2158:11:::0;:9;:11::i;26573:268::-;21587:10;21577:21;;;;:9;:21;;;;;;;;21572:90;;21622:28;;-1:-1:-1;;;21622:28:0;;;;;;;:::i;21572:90::-;15673:3:::1;26653:5;:26;26649:106;;;26703:40;::::0;-1:-1:-1;;;26703:40:0;;12758:2:1;26703:40:0::1;::::0;::::1;12740:21:1::0;12797:2;12777:18;;;12770:30;-1:-1:-1;;;12816:18:1;;;12809:51;12877:18;;26703:40:0::1;12556:345:1::0;26649:106:0::1;26765:15;:23:::0;;;26804:29:::1;::::0;1855:25:1;;;26804:29:0::1;::::0;1843:2:1;1828:18;26804:29:0::1;1709:177:1::0;27054:192:0;27177:14;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;27211:27:::2;27230:7;27211:18;:27::i;:::-;27204:34;;2158:11:::0;:9;:11::i;29433:194::-;29553:12;2119;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;29585:34:::2;29608:6;29616:2;29585:22;:34::i;392:453::-:0;476:22;533:4;521:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;511:34;;561:9;556:282;576:15;;;556:282;;;614:12;;659:4;678;;683:1;678:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;651:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;613:73;;;;708:7;703:88;;759:4;;764:1;759:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;768:6;743:32;;-1:-1:-1;;;743:32:0;;;;;;;;;;:::i;703:88::-;820:6;807:7;815:1;807:10;;;;;;;;:::i;:::-;;;;;;:19;;;;598:240;;593:3;;;;:::i;:::-;;;556:282;;;;392:453;;;;:::o;32870:433::-;32979:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;32999:27:::2;33029:33;33048:5;33055:6;33029:18;:33::i;:::-;32999:63;;33076:12;33093:61;33115:19;15841:6;33093:21;:61::i;23458:164::-:0;23518:7;23545;-1:-1:-1;;;;;23545:30:0;;23576:4;23605:5;23597:14;;;;;;;;:::i;:::-;23545:69;;-1:-1:-1;;;;;;23545:69:0;;;;;;;;;;14862:25:1;;;;14934:2;14923:22;14903:18;;;14896:50;14835:18;;23545:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35386:628::-;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;35482:34:::2;35505:6;35513:2;35482:22;:34::i;:::-;35477:118;;35540:43;::::0;-1:-1:-1;;;35540:43:0;;11598:2:1;35540:43:0::2;::::0;::::2;11580:21:1::0;11637:2;11617:18;;;11610:30;11676:29;11656:18;;;11649:57;11723:18;;35540:43:0::2;11396:351:1::0;35477:118:0::2;35652:7;35674:65;35652:7:::0;;35615:19:::2;35674:21;:65::i;:::-;35750:70;35780:12;35803:7;35813:6;35750:21;:70::i;:::-;35881:55;::::0;;;;::::2;::::0;;:28:::2;:55:::0;;;::::2;::::0;::::2;::::0;35947:59;;-1:-1:-1;;;35947:59:0;;-1:-1:-1;;;;;35947:7:0::2;:24;::::0;::::2;::::0;:59:::2;::::0;35972:6;;35881:55;;36000:4:::2;::::0;35947:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;35947:59:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;;35466:548;;2158:11:::0;:9;:11::i;25749:146::-;21362:5;;;;;-1:-1:-1;;;;;21362:5:0;21348:10;:19;21344:84;;21391:25;;-1:-1:-1;;;21391:25:0;;;;;;;:::i;21344:84::-;25821:14:::1;:22:::0;;-1:-1:-1;;;;;;25821:22:0::1;-1:-1:-1::0;;;;;25821:22:0;::::1;::::0;;::::1;::::0;;;25859:28:::1;::::0;184:51:1;;;25859:28:0::1;::::0;172:2:1;157:18;25859:28:0::1;14:227:1::0;28437:198:0;28535:12;28549:10;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;28579:48:::2;28601:6;15841;28579:21;:48::i;:::-;28572:55;;;;2158:11:::0;:9;:11::i;:::-;28437:198;;;:::o;2474:277::-;2592:14;2578:10;;;;:28;;;;;;;;:::i;:::-;;2574:104;;2630:36;;-1:-1:-1;;;2630:36:0;;17015:2:1;2630:36:0;;;16997:21:1;17054:2;17034:18;;;17027:30;-1:-1:-1;;;17073:18:1;;;17066:50;17133:18;;2630:36:0;16813:344:1;2574:104:0;2718:10;:25;;2731:12;;2718:10;-1:-1:-1;;2718:25:0;;2731:12;2718:25;;;;;;2474:277::o;37323:2042::-;37456:59;;;;;;;;;;-1:-1:-1;;;;37456:59:0;37497:18;;37456:59;;37497:18;37456:59;;;;-1:-1:-1;;;;;37456:59:0;;;;;;;;;;;;;;;;;;;;;;37528:19;37565:7;37528:46;;37587:23;37613:47;37646:12;37613:24;:47::i;:::-;37587:73;;;;37671:23;37718:9;37713:592;135:1;37733;:20;37713:592;;;37779:7;37787:1;37779:10;;;;;;;:::i;:::-;;;;;37775:29;37796:8;37775:29;37821:21;37847:44;37880:6;37887:1;37880:9;;;;;;;:::i;:::-;;;;;37847:24;:44::i;:::-;37821:70;;;-1:-1:-1;37906:23:0;37932:31;37821:70;37932:15;:31;:::i;:::-;37906:57;-1:-1:-1;38012:19:0;37906:57;38012:2;:19;:::i;:::-;37999:7;38007:1;37999:10;;;;;;;:::i;:::-;;;;;:32;;;;:::i;:::-;37980:51;;;;:::i;:::-;;;38145:62;38175:6;38182:1;38175:9;;;;;;;:::i;:::-;;;;;38195:7;38205:1;38145:21;:62::i;:::-;38222:71;38252:6;38259:1;38252:9;;;;;;;:::i;:::-;;;;;38272:7;38282;38290:1;38282:10;;;;;;;:::i;:::-;;;;;38222:21;:71::i;:::-;37760:545;;37713:592;37755:3;;;;:::i;:::-;;;;37713:592;;;;38383:22;38444:7;-1:-1:-1;;;;;38444:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38408:33;15795:4;38408:15;:33;:::i;:::-;:63;;;;:::i;:::-;38383:88;;38757:25;15673:3;38802:15;;38785:14;:32;;;;:::i;:::-;:53;;;;:::i;:::-;39026:37;;-1:-1:-1;;;39026:37:0;;39057:4;39026:37;;;184:51:1;38757:81:0;;-1:-1:-1;39000:23:0;;-1:-1:-1;;;;;39026:22:0;;;;;157:18:1;;39026:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39119:49;;-1:-1:-1;;;39119:49:0;;39000:63;;-1:-1:-1;;;;;;39119:7:0;:21;;;;:49;;39141:7;;39150:17;;39119:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39250:37:0;;-1:-1:-1;;;39250:37:0;;39281:4;39250:37;;;184:51:1;39290:15:0;;-1:-1:-1;;;;;;39250:22:0;;;-1:-1:-1;39250:22:0;;157:18:1;;39250:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;39241:64;;39323:34;39341:7;39350:6;39323:34;;;;;;;:::i;:::-;;;;;;;;37445:1920;;;;;;;37323:2042;;;:::o;44078:428::-;44246:15;;44161:12;;;;44198:73;;44228:7;;-1:-1:-1;;;;;44246:15:0;44264:6;44198:21;:73::i;:::-;44287:15;;:52;;-1:-1:-1;;;44287:52:0;;;;;8149:25:1;;;8190:18;;;8183:34;;;-1:-1:-1;;;;;44287:15:0;;;;:34;;8122:18:1;;44287:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44362:50;;;;;;;;;;;;;;;;;;-1:-1:-1;44350:9:0;;;:5;:9;;;;;:62;;;;;;;;;;44457:41;;19894:25:1;;;19935:18;;;19928:34;;;19978:18;;;19971:50;;;44350:62:0;-1:-1:-1;44350:9:0;;-1:-1:-1;44457:41:0;;19882:2:1;19867:18;44457:41:0;;;;;;;44078:428;;;;;:::o;2789:76::-;2830:10;:27;;2843:14;;2830:10;-1:-1:-1;;2830:27:0;2843:14;;2830:27;;39617:1743;39721:14;39748:12;39772:30;39796:5;39772:23;:30::i;:::-;39748:54;-1:-1:-1;39850:7:0;39813:19;39898:47;39850:7;39898:24;:47::i;:::-;39872:73;;;;39956:23;40002:40;40035:5;40002:24;:40::i;:::-;39984:58;;;;:15;:58;:::i;:::-;39956:86;;40055:40;;:::i;:::-;40132:6;40106:7;40122:5;40114:14;;;;;;;;:::i;:::-;40106:23;;;;;;;:::i;:::-;;;;:32;;;;;40415:22;40470:7;-1:-1:-1;;;;;40470:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40443:24;15795:4;40443:6;:24;:::i;:::-;:54;;;;:::i;:::-;40415:82;;40508:25;15673:3;40553:15;;40536:14;:32;;;;:::i;:::-;:53;;;;:::i;:::-;40777:37;;-1:-1:-1;;;40777:37:0;;40808:4;40777:37;;;184:51:1;40508:81:0;;-1:-1:-1;40751:23:0;;-1:-1:-1;;;;;40777:22:0;;;;;157:18:1;;40777:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40751:63;;40920:58;40950:5;40966:7;40976:1;40920:21;:58::i;:::-;40989:63;41019:5;41035:7;41045:6;40989:21;:63::i;:::-;41108:49;;-1:-1:-1;;;41108:49:0;;-1:-1:-1;;;;;41108:7:0;:21;;;;:49;;41130:7;;41139:17;;41108:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41239:37:0;;-1:-1:-1;;;41239:37:0;;41270:4;41239:37;;;184:51:1;41279:15:0;;-1:-1:-1;;;;;;41239:22:0;;;-1:-1:-1;41239:22:0;;157:18:1;;41239:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;41230:64;;41312:40;41330:5;41337:6;41345;41312:40;;;;;;;;:::i;:::-;;;;;;;;39737:1623;;;;;;;;39617:1743;;;;:::o;41622:1498::-;41726:17;41756:12;41780:30;41804:5;41780:23;:30::i;:::-;41756:54;-1:-1:-1;41858:7:0;41821:19;41904:5;41896:14;;;;;;;;:::i;:::-;41880:30;;42191:24;15673:3;42227:15;;42218:6;:24;;;;:::i;:::-;:45;;;;:::i;:::-;42191:72;;42274:24;15795:4;42322:7;-1:-1:-1;;;;;42322:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42303:46;;:16;:46;:::i;:::-;:64;;;;:::i;:::-;42575:30;;-1:-1:-1;;;42575:30:0;;42599:4;42575:30;;;184:51:1;42274:93:0;;-1:-1:-1;42549:23:0;;-1:-1:-1;;;;;42575:15:0;;;;;157:18:1;;42575:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42549:56;;42618:65;42648:12;42671:7;42681:1;42618:21;:65::i;:::-;42694:70;42724:12;42747:7;42757:6;42694:21;:70::i;:::-;42825:83;;-1:-1:-1;;;42825:83:0;;;;;20903:25:1;;;20975:2;20964:22;;;20944:18;;;20937:50;21003:18;;;20996:34;;;42825:7:0;-1:-1:-1;;;;;42825:33:0;;;;20876:18:1;;42825:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43003:30:0;;-1:-1:-1;;;43003:30:0;;43027:4;43003:30;;;184:51:1;43036:15:0;;-1:-1:-1;;;;;;43003:15:0;;;-1:-1:-1;43003:15:0;;157:18:1;;43003:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;42991:60;;43069:43;43087:5;43094:6;43102:9;43069:43;;;;;;;;:::i;:::-;;;;;;;;41745:1375;;;;;;41622:1498;;;;:::o;8081:387::-;8234:67;;-1:-1:-1;;;;;11944:32:1;;;8234:67:0;;;11926:51:1;11993:18;;;11986:34;;;8174:12:0;;;;8209:10;;;-1:-1:-1;;;8257:24:0;11899:18:1;;8234:67:0;;;;-1:-1:-1;;8234:67:0;;;;;;;;;;;;;;-1:-1:-1;;;;;8234:67:0;-1:-1:-1;;;;;;8234:67:0;;;;;;;;;;8209:103;;;;8234:67;8209:103;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8173:139;;;;8330:7;8329:8;:59;;;-1:-1:-1;8342:11:0;;:16;;;;:45;;;8374:4;8363:24;;;;;;;;;;;;:::i;:::-;8362:25;8342:45;8325:136;;;8428:5;8435:7;8444:4;8412:37;;-1:-1:-1;;;8412:37:0;;;;;;;;;;:::i;8325:136::-;8162:306;;8081:387;;;:::o;44806:1043::-;44935:49;;-1:-1:-1;;;44935:49:0;;44978:4;44935:49;;;184:51:1;44884:12:0;;;;-1:-1:-1;;;;;44950:7:0;44935:34;;;;157:18:1;;44935:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44997:15;;:43;;-1:-1:-1;;;44997:43:0;;;;;1855:25:1;;;44909:75:0;;-1:-1:-1;;;;;;44997:15:0;;:39;;1828:18:1;;44997:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45074:49:0;;-1:-1:-1;;;45074:49:0;;45117:4;45074:49;;;184:51:1;45053:18:0;;-1:-1:-1;45089:7:0;-1:-1:-1;;;;;45074:34:0;;-1:-1:-1;45074:34:0;;157:18:1;;45074:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45053:70;-1:-1:-1;45248:21:0;45303:6;45272:28;45285:15;45053:70;45272:28;:::i;:::-;:37;;;;:::i;:::-;45248:61;;45342:1;45326:13;:17;45322:396;;;45408:15;;45360:80;;45390:7;;-1:-1:-1;;;;;45408:15:0;45426:13;45360:21;:80::i;:::-;45471:15;;:68;;-1:-1:-1;;;45471:68:0;;;;;8149:25:1;;;15841:6:0;8190:18:1;;;8183:34;45455:13:0;;-1:-1:-1;;;;;45471:15:0;;:34;;8122:18:1;;45471:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45569:66;;;;;;;;;;;15841:6;45569:66;;;;;;;-1:-1:-1;45554:12:0;;;:5;:12;;;;;:81;;;;;;;;;;;;;;45655:51;;19894:25:1;;;19935:18;;;19928:34;;;20005:14;;19998:22;19978:18;;;19971:50;45655:51:0;;45554:12;;-1:-1:-1;45655:51:0;;;;;;19882:2:1;45655:51:0;;;45345:373;45322:396;45782:49;;-1:-1:-1;;;45782:49:0;;45825:4;45782:49;;;184:51:1;45740:4:0;;-1:-1:-1;45760:81:0;;45797:7;-1:-1:-1;;;;;45782:34:0;;;;157:18:1;;45782:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45760:81;;;22320:25:1;;;22388:14;;22381:22;22376:2;22361:18;;22354:50;22293:18;45760:81:0;;;;;;;44898:951;;;44806:1043;;;;:::o;8838:379::-;8987:63;;-1:-1:-1;;;;;11944:32:1;;;8987:63:0;;;11926:51:1;11993:18;;;11986:34;;;8927:12:0;;;;8962:10;;;-1:-1:-1;;;9010:23:0;11899:18:1;;8987:63:0;11752:274:1;7325:384:0;7472:56;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7472:56:0;-1:-1:-1;;;7472:56:0;;;7441:98;;7387:5;;;;;;-1:-1:-1;;;;;7441:16:0;;;:98;;7472:56;7441:98;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7405:134;;;;7557:7;7556:8;:28;;;;7582:2;7568:4;:11;:16;7556:28;7552:105;;;7624:5;7631:7;7640:4;7608:37;;-1:-1:-1;;;7608:37:0;;;;;;;;;;:::i;7552:105::-;7687:4;7676:25;;;;;;;;;;;;:::i;:::-;7669:32;7325:384;-1:-1:-1;;;;7325:384:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;676:173:1:-;744:20;;-1:-1:-1;;;;;793:31:1;;783:42;;773:70;;839:1;836;829:12;854:186;913:6;966:2;954:9;945:7;941:23;937:32;934:52;;;982:1;979;972:12;934:52;1005:29;1024:9;1005:29;:::i;1237:159::-;1331:6;1364:2;1352:15;;1349:24;-1:-1:-1;1346:44:1;;;1386:1;1383;1376:12;1401:303;1494:6;1502;1555:2;1543:9;1534:7;1530:23;1526:32;1523:52;;;1571:1;1568;1561:12;1523:52;1594:53;1639:7;1628:9;1594:53;:::i;:::-;1584:63;1694:2;1679:18;;;;1666:32;;-1:-1:-1;;;1401:303:1:o;1891:248::-;1959:6;1967;2020:2;2008:9;1999:7;1995:23;1991:32;1988:52;;;2036:1;2033;2026:12;1988:52;-1:-1:-1;;2059:23:1;;;2129:2;2114:18;;;2101:32;;-1:-1:-1;1891:248:1:o;2407:150::-;2482:20;;2531:1;2521:12;;2511:40;;2547:1;2544;2537:12;2562:342;2652:6;2660;2668;2721:2;2709:9;2700:7;2696:23;2692:32;2689:52;;;2737:1;2734;2727:12;2689:52;2760:36;2786:9;2760:36;:::i;:::-;2750:46;2843:2;2828:18;;2815:32;;-1:-1:-1;2894:2:1;2879:18;;;2866:32;;2562:342;-1:-1:-1;;;2562:342:1:o;2909:274::-;2990:6;2998;3051:2;3039:9;3030:7;3026:23;3022:32;3019:52;;;3067:1;3064;3057:12;3019:52;3090:36;3116:9;3090:36;:::i;:::-;3080:46;3173:2;3158:18;;;;3145:32;;-1:-1:-1;;;2909:274:1:o;3188:206::-;3260:6;3313:2;3301:9;3292:7;3288:23;3284:32;3281:52;;;3329:1;3326;3319:12;3281:52;3352:36;3378:9;3352:36;:::i;3399:235::-;3483:6;3536:2;3524:9;3515:7;3511:23;3507:32;3504:52;;;3552:1;3549;3542:12;3504:52;3575:53;3620:7;3609:9;3575:53;:::i;3876:118::-;3962:5;3955:13;3948:21;3941:5;3938:32;3928:60;;3984:1;3981;3974:12;3928:60;3876:118;:::o;3999:315::-;4064:6;4072;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4164:29;4183:9;4164:29;:::i;:::-;4154:39;;4243:2;4232:9;4228:18;4215:32;4256:28;4278:5;4256:28;:::i;:::-;4303:5;4293:15;;;3999:315;;;;;:::o;5132:254::-;5200:6;5208;5261:2;5249:9;5240:7;5236:23;5232:32;5229:52;;;5277:1;5274;5267:12;5229:52;5300:29;5319:9;5300:29;:::i;5391:180::-;5450:6;5503:2;5491:9;5482:7;5478:23;5474:32;5471:52;;;5519:1;5516;5509:12;5471:52;-1:-1:-1;5542:23:1;;5391:180;-1:-1:-1;5391:180:1:o;5829:626::-;5926:6;5934;5987:2;5975:9;5966:7;5962:23;5958:32;5955:52;;;6003:1;6000;5993:12;5955:52;6043:9;6030:23;6072:18;6113:2;6105:6;6102:14;6099:34;;;6129:1;6126;6119:12;6099:34;6167:6;6156:9;6152:22;6142:32;;6212:7;6205:4;6201:2;6197:13;6193:27;6183:55;;6234:1;6231;6224:12;6183:55;6274:2;6261:16;6300:2;6292:6;6289:14;6286:34;;;6316:1;6313;6306:12;6286:34;6369:7;6364:2;6354:6;6351:1;6347:14;6343:2;6339:23;6335:32;6332:45;6329:65;;;6390:1;6387;6380:12;6329:65;6421:2;6413:11;;;;;6443:6;;-1:-1:-1;5829:626:1;;-1:-1:-1;;;;5829:626:1:o;6460:258::-;6532:1;6542:113;6556:6;6553:1;6550:13;6542:113;;;6632:11;;;6626:18;6613:11;;;6606:39;6578:2;6571:10;6542:113;;;6673:6;6670:1;6667:13;6664:48;;;6708:1;6699:6;6694:3;6690:16;6683:27;6664:48;;6460:258;;;:::o;6723:257::-;6764:3;6802:5;6796:12;6829:6;6824:3;6817:19;6845:63;6901:6;6894:4;6889:3;6885:14;6878:4;6871:5;6867:16;6845:63;:::i;:::-;6962:2;6941:15;-1:-1:-1;;6937:29:1;6928:39;;;;6969:4;6924:50;;6723:257;-1:-1:-1;;6723:257:1:o;6985:800::-;7145:4;7174:2;7214;7203:9;7199:18;7244:2;7233:9;7226:21;7267:6;7302;7296:13;7333:6;7325;7318:22;7371:2;7360:9;7356:18;7349:25;;7433:2;7423:6;7420:1;7416:14;7405:9;7401:30;7397:39;7383:53;;7471:2;7463:6;7459:15;7492:1;7502:254;7516:6;7513:1;7510:13;7502:254;;;7609:2;7605:7;7593:9;7585:6;7581:22;7577:36;7572:3;7565:49;7637:39;7669:6;7660;7654:13;7637:39;:::i;:::-;7627:49;-1:-1:-1;7734:12:1;;;;7699:15;;;;7538:1;7531:9;7502:254;;;-1:-1:-1;7773:6:1;;6985:800;-1:-1:-1;;;;;;;6985:800:1:o;9150:336::-;9352:2;9334:21;;;9391:2;9371:18;;;9364:30;-1:-1:-1;;;9425:2:1;9410:18;;9403:42;9477:2;9462:18;;9150:336::o;9491:350::-;9693:2;9675:21;;;9732:2;9712:18;;;9705:30;9771:28;9766:2;9751:18;;9744:56;9832:2;9817:18;;9491:350::o;9846:184::-;9916:6;9969:2;9957:9;9948:7;9944:23;9940:32;9937:52;;;9985:1;9982;9975:12;9937:52;-1:-1:-1;10008:16:1;;9846:184;-1:-1:-1;9846:184:1:o;10441:127::-;10502:10;10497:3;10493:20;10490:1;10483:31;10533:4;10530:1;10523:15;10557:4;10554:1;10547:15;10927:127;10988:10;10983:3;10979:20;10976:1;10969:31;11019:4;11016:1;11009:15;11043:4;11040:1;11033:15;11059:332;11261:2;11243:21;;;11300:1;11280:18;;;11273:29;-1:-1:-1;;;11333:2:1;11318:18;;11311:39;11382:2;11367:18;;11059:332::o;12031:237::-;12112:1;12105:5;12102:12;12092:143;;12157:10;12152:3;12148:20;12145:1;12138:31;12192:4;12189:1;12182:15;12220:4;12217:1;12210:15;12092:143;12244:18;;12031:237::o;12273:278::-;12446:2;12431:18;;12458:44;12435:9;12484:6;12458:44;:::i;:::-;12538:6;12533:2;12522:9;12518:18;12511:34;12273:278;;;;;:::o;12906:127::-;12967:10;12962:3;12958:20;12955:1;12948:31;12998:4;12995:1;12988:15;13022:4;13019:1;13012:15;13038:521;13115:4;13121:6;13181:11;13168:25;13275:2;13271:7;13260:8;13244:14;13240:29;13236:43;13216:18;13212:68;13202:96;;13294:1;13291;13284:12;13202:96;13321:33;;13373:20;;;-1:-1:-1;13416:18:1;13405:30;;13402:50;;;13448:1;13445;13438:12;13402:50;13481:4;13469:17;;-1:-1:-1;13512:14:1;13508:27;;;13498:38;;13495:58;;;13549:1;13546;13539:12;13564:271;13747:6;13739;13734:3;13721:33;13703:3;13773:16;;13798:13;;;13773:16;13564:271;-1:-1:-1;13564:271:1:o;13840:547::-;14043:2;14032:9;14025:21;14082:6;14077:2;14066:9;14062:18;14055:34;14139:6;14131;14126:2;14115:9;14111:18;14098:48;14195:1;14190:2;14181:6;14170:9;14166:22;14162:31;14155:42;14006:4;14256:2;14252:7;14247:2;14239:6;14235:15;14231:29;14220:9;14216:45;14323:2;14311:9;14307:2;14303:18;14299:27;14292:4;14281:9;14277:20;14270:57;14344:37;14377:2;14373;14369:11;14361:6;14344:37;:::i;:::-;14336:45;13840:547;-1:-1:-1;;;;;;13840:547:1:o;14392:127::-;14453:10;14448:3;14444:20;14441:1;14434:31;14484:4;14481:1;14474:15;14508:4;14505:1;14498:15;14524:135;14563:3;14584:17;;;14581:43;;14604:18;;:::i;:::-;-1:-1:-1;14651:1:1;14640:13;;14524:135::o;14957:326::-;15050:5;15073:1;15083:194;15097:4;15094:1;15091:11;15083:194;;;15156:13;;15144:26;;15193:4;15217:12;;;;15252:15;;;;15117:1;15110:9;15083:194;;15288:410;15537:25;;;15524:3;15509:19;;15571:52;15619:2;15604:18;;15596:6;15571:52;:::i;:::-;-1:-1:-1;;;;;15659:32:1;;;;15654:2;15639:18;;;;15632:60;15288:410;;-1:-1:-1;;15288:410:1:o;15703:1105::-;15798:6;15829:2;15872;15860:9;15851:7;15847:23;15843:32;15840:52;;;15888:1;15885;15878:12;15840:52;15921:9;15915:16;15950:18;15991:2;15983:6;15980:14;15977:34;;;16007:1;16004;15997:12;15977:34;16045:6;16034:9;16030:22;16020:32;;16090:7;16083:4;16079:2;16075:13;16071:27;16061:55;;16112:1;16109;16102:12;16061:55;16141:2;16135:9;16163:2;16159;16156:10;16153:36;;;16169:18;;:::i;:::-;16215:2;16212:1;16208:10;16247:2;16241:9;16310:2;16306:7;16301:2;16297;16293:11;16289:25;16281:6;16277:38;16365:6;16353:10;16350:22;16345:2;16333:10;16330:18;16327:46;16324:72;;;16376:18;;:::i;:::-;16412:2;16405:22;16462:18;;;16496:15;;;;-1:-1:-1;16538:11:1;;;16534:20;;;16566:19;;;16563:39;;;16598:1;16595;16588:12;16563:39;16622:11;;;;16642:135;16658:6;16653:3;16650:15;16642:135;;;16724:10;;16712:23;;16675:12;;;;16755;;;;16642:135;;;16796:6;15703:1105;-1:-1:-1;;;;;;;;15703:1105:1:o;17162:125::-;17202:4;17230:1;17227;17224:8;17221:34;;;17235:18;;:::i;:::-;-1:-1:-1;17272:9:1;;17162:125::o;17292:422::-;17381:1;17424:5;17381:1;17438:270;17459:7;17449:8;17446:21;17438:270;;;17518:4;17514:1;17510:6;17506:17;17500:4;17497:27;17494:53;;;17527:18;;:::i;:::-;17577:7;17567:8;17563:22;17560:55;;;17597:16;;;;17560:55;17676:22;;;;17636:15;;;;17438:270;;;17442:3;17292:422;;;;;:::o;17719:806::-;17768:5;17798:8;17788:80;;-1:-1:-1;17839:1:1;17853:5;;17788:80;17887:4;17877:76;;-1:-1:-1;17924:1:1;17938:5;;17877:76;17969:4;17987:1;17982:59;;;;18055:1;18050:130;;;;17962:218;;17982:59;18012:1;18003:10;;18026:5;;;18050:130;18087:3;18077:8;18074:17;18071:43;;;18094:18;;:::i;:::-;-1:-1:-1;;18150:1:1;18136:16;;18165:5;;17962:218;;18264:2;18254:8;18251:16;18245:3;18239:4;18236:13;18232:36;18226:2;18216:8;18213:16;18208:2;18202:4;18199:12;18195:35;18192:77;18189:159;;;-1:-1:-1;18301:19:1;;;18333:5;;18189:159;18380:34;18405:8;18399:4;18380:34;:::i;:::-;18450:6;18446:1;18442:6;18438:19;18429:7;18426:32;18423:58;;;18461:18;;:::i;:::-;18499:20;;17719:806;-1:-1:-1;;;17719:806:1:o;18530:131::-;18590:5;18619:36;18646:8;18640:4;18619:36;:::i;18666:168::-;18706:7;18772:1;18768;18764:6;18760:14;18757:1;18754:21;18749:1;18742:9;18735:17;18731:45;18728:71;;;18779:18;;:::i;:::-;-1:-1:-1;18819:9:1;;18666:168::o;18839:128::-;18879:3;18910:1;18906:6;18903:1;18900:13;18897:39;;;18916:18;;:::i;:::-;-1:-1:-1;18952:9:1;;18839:128::o;18972:217::-;19012:1;19038;19028:132;;19082:10;19077:3;19073:20;19070:1;19063:31;19117:4;19114:1;19107:15;19145:4;19142:1;19135:15;19028:132;-1:-1:-1;19174:9:1;;18972:217::o;19194:310::-;19404:2;19389:18;;19448:4;19440:6;19393:9;19416:37;19491:6;19484:4;19473:9;19469:20;19462:36;19194:310;;;;;:::o;20032:312::-;20240:2;20225:18;;20252:43;20229:9;20277:6;20252:43;:::i;:::-;20331:6;20326:2;20315:9;20311:18;20304:34;20032:312;;;;;:::o;20349:349::-;20550:2;20535:18;;20562:44;20539:9;20588:6;20562:44;:::i;:::-;20637:2;20622:18;;20615:34;;;;20680:2;20665:18;20658:34;20349:349;;-1:-1:-1;20349:349:1:o;21041:274::-;21170:3;21208:6;21202:13;21224:53;21270:6;21265:3;21258:4;21250:6;21246:17;21224:53;:::i;:::-;21293:16;;;;;21041:274;-1:-1:-1;;21041:274:1:o;21320:245::-;21387:6;21440:2;21428:9;21419:7;21415:23;21411:32;21408:52;;;21456:1;21453;21446:12;21408:52;21488:9;21482:16;21507:28;21529:5;21507:28;:::i;21570:395::-;-1:-1:-1;;;;;21767:32:1;;21749:51;;21843:14;;21836:22;21831:2;21816:18;;21809:50;21895:2;21890;21875:18;;21868:30;;;-1:-1:-1;;21915:44:1;;21940:18;;21932:6;21915:44;:::i;:::-;21907:52;21570:395;-1:-1:-1;;;;;21570:395:1:o;22415:273::-;22483:6;22536:2;22524:9;22515:7;22511:23;22507:32;22504:52;;;22552:1;22549;22542:12;22504:52;22584:9;22578:16;22634:4;22627:5;22623:16;22616:5;22613:27;22603:55;;22654:1;22651;22644:12

Swarm Source

ipfs://251a6c160b472c1629c1866b390108437c06adfc2e17b178cc5c8a998d60d67f

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

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.