ETH Price: $2,878.76 (-2.08%)

Contract

0x57DCc7B8867a61d82AF5B9763687480Aa0f040b6
 

Overview

ETH Balance

0.05984 ETH

ETH Value

$172.26 (@ $2,878.76/ETH)

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Create Burn Requ...8488562024-03-15 12:58:47681 days ago1710507527IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000085360.00112481
Create Burn Requ...8486032024-03-15 12:50:21681 days ago1710507021IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000091070.00000043
Unstake Llp8485902024-03-15 12:49:55681 days ago1710506995IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000055820.00000042
Create Burn Requ...8485272024-03-15 12:47:49681 days ago1710506869IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000087780.0012
Stake Llp8484772024-03-15 12:46:09681 days ago1710506769IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000064120.00031309
Create Mint Requ...8484642024-03-15 12:45:43681 days ago1710506743IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000084960.00000091
Stake Llp8482812024-03-15 12:39:37681 days ago1710506377IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000065750.00018904
Stake Llp8482782024-03-15 12:39:31681 days ago1710506371IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000059310.00019048
Create Mint Requ...8482622024-03-15 12:38:59681 days ago1710506339IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000098130.0001984
Create Mint Requ...8482562024-03-15 12:38:47681 days ago1710506327IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000097780.00019397
Create Mint Requ...8479062024-03-15 12:27:07681 days ago1710505627IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000080560.0002752
Create Burn Requ...8477072024-03-15 12:20:29681 days ago1710505229IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000088530.00000027
Stake Llp8469522024-03-15 11:55:19681 days ago1710503719IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000058390.0000645
Create Mint Requ...8469482024-03-15 11:55:11681 days ago1710503711IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000083590.00113033
Create Mint Requ...8469342024-03-15 11:54:43681 days ago1710503683IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.00008660.00006664
Create Burn Requ...8469022024-03-15 11:53:39681 days ago1710503619IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000092810.00030099
Unstake Llp8468472024-03-15 11:51:49681 days ago1710503509IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000058070.00025027
Create Mint Requ...8466922024-03-15 11:46:39681 days ago1710503199IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000080860.0012
Create Burn Requ...8465982024-03-15 11:43:31681 days ago1710503011IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000090350.0011
Unstake Llp8465472024-03-15 11:41:49681 days ago1710502909IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000053130.0011
Stake Llp8463972024-03-15 11:36:49681 days ago1710502609IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000067010.00007511
Create Burn Requ...8458552024-03-15 11:18:45681 days ago1710501525IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000082680.0011
Unstake Llp8458302024-03-15 11:17:55681 days ago1710501475IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000051150.0011
Create Burn Requ...8446032024-03-15 10:37:01681 days ago1710499021IN
0x57DCc7B8...Aa0f040b6
0.00055 ETH0.000099860.00005276
Unstake Llp8445392024-03-15 10:34:53681 days ago1710498893IN
0x57DCc7B8...Aa0f040b6
0 ETH0.000061130.00025044
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
8488582024-03-15 12:58:51681 days ago1710507531
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8486042024-03-15 12:50:23681 days ago1710507023
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8485292024-03-15 12:47:53681 days ago1710506873
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8484672024-03-15 12:45:49681 days ago1710506749
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8482642024-03-15 12:39:03681 days ago1710506343
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8482582024-03-15 12:38:51681 days ago1710506331
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8479082024-03-15 12:27:11681 days ago1710505631
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8477092024-03-15 12:20:33681 days ago1710505233
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8469512024-03-15 11:55:17681 days ago1710503717
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8469362024-03-15 11:54:47681 days ago1710503687
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8469042024-03-15 11:53:43681 days ago1710503623
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8466942024-03-15 11:46:43681 days ago1710503203
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8465992024-03-15 11:43:33681 days ago1710503013
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8458572024-03-15 11:18:49681 days ago1710501529
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8446052024-03-15 10:37:05681 days ago1710499025
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8439732024-03-15 10:16:01681 days ago1710497761
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8435552024-03-15 10:02:05681 days ago1710496925
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8435202024-03-15 10:00:55681 days ago1710496855
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8435002024-03-15 10:00:15681 days ago1710496815
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8434822024-03-15 9:59:39681 days ago1710496779
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8434822024-03-15 9:59:39681 days ago1710496779
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8409382024-03-15 8:34:51681 days ago1710491691
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8408092024-03-15 8:30:33681 days ago1710491433
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8400702024-03-15 8:05:55681 days ago1710489955
0x57DCc7B8...Aa0f040b6
0.00055 ETH
8385832024-03-15 7:16:21681 days ago1710486981
0x57DCc7B8...Aa0f040b6
0.00055 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardRouter

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at blastscan.io on 2024-03-01
*/

// SPDX-License-Identifier: GPL-2.0-or-later

pragma solidity 0.8.19;

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

/**
 * @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);
    function decimals() external view returns (uint8);
}

// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

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

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

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        if (_status == _ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

interface IRewardTracker {
    function depositBalances(address _account, address _depositToken) external view returns (uint256);
    function stakeForAccount(address _fundingAccount, address _account, address _depositToken, uint256 _amount) external;
    function unstakeForAccount(address _account, address _depositToken, uint256 _amount, address _receiver) external;
    function claimForAccount(address _account, address _receiver) external returns (uint256);
    function claimable(address _account) external view returns (uint256);
}

interface IRewardRouter {
    function feeLlpTracker() external view returns (address);
    function executeMintRequests(uint endIndex, address payable feeReceiver ) external returns(uint);
    function executeBurnRequests(uint endIndex, address payable feeReceiver ) external returns (uint);
    function mintAccountIdx(address user) external returns (uint);
    function burnAccountIdx(address user) external returns (uint);
}

interface IUtils {
    function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view;
    function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong, address _receiver) external view;
    function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise,  uint256 _markPrice) external returns (uint256, int256);
    function getEntryBorrowingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256);
    function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (int256);
    function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256);
    function getBorrowingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryBorrowingRate) external view returns (uint256);
    function getBuyUsdlFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
    function getSellUsdlFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
    function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, bool _increment) external view returns (uint256);
    function getDelta(
        address _indexToken,
        uint256 _size,
        uint256 _averagePrice,
        uint256 _nextPrice,
        bool _isLong,
        uint256 _lastIncreasedTime
    ) external view returns (bool, uint256);
    function getNextGlobalAveragePrice(
        address _account,
        address _collateralToken,
        address _indexToken,
        uint256 _nextPrice,
        uint256 _sizeDelta,
        bool _isLong,
        bool _isIncrease
    ) external view returns (uint256);
    function getNextAveragePrice(
        address _indexToken,
        uint256 _size,
        uint256 _averagePrice,
        bool _isLong,
        uint256 _nextPrice,
        uint256 _sizeDelta,
        uint256 _lastIncreasedTime
    ) external view returns (uint256);
    function adjustForDecimals(
        uint256 _amount,
        address _tokenDiv,
        address _tokenMul
    ) external view returns (uint256);
    function getGlobalPositionDelta(address _token, uint size, bool _isLong) external view returns (bool, uint256);
    function getAum(bool maximise) external view returns (uint256);
    function getAumInUsdl(
        bool maximise
    ) external view returns (uint256);
    function validatePosition(
        uint256 _size,
        uint256 _collateral
    ) external view;

    function getNextBorrowingRate(address _indexToken, bool _isLong) external view returns(uint);
    function getMinPrice(address _token) external view returns (uint256);
    function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);
    function getMaxPrice(address _token) external view returns (uint256);
    function usdToTokenMin(address _token, uint256 _usdAmount) external view returns (uint256);
    function usdToTokenMax(address _token, uint256 _usdAmount) external view returns (uint256);
    function updateCumulativeBorrowingRate(address _indexToken) external view returns(uint256 borrowingTime, uint256 borrowingRateForLongs, uint256 borrowingRateForShorts);
    function updateCumulativeFundingRate(address _indexToken, uint256 lastFundingTime) external returns(uint lastFundingUpdateTime, int256 fundingRateForLong, int256 fundingRateForShort);
    function getRedemptionAmount(address _token, uint256 _usdlAmount) external view  returns (uint256);
    function collectMarginFees(
        address _account,
        address _collateralToken,
        address _indexToken,
        bool _isLong,
        uint256 _sizeDelta,
        uint256 _size,
        uint256 _entryBorrowingRate,
        int256 _entryFundingRate
    ) external returns (int256 feeUsd);
    function getTPPrice(uint256 sizeDelta, bool isLong, uint256 markPrice, uint256 _maxTPAmount, address collateralToken) external returns(uint256);
    function calcLiquidationFee(uint256 size, address indexToken) external returns(uint);
    function setPriceFeed(address _pricefeed) external;
    function getOI(address _token, bool _isLong) view external returns(uint);
    function getLPAmountInUSD() external view returns(uint lpAmountInUSD);
    function getTotalOI() view external returns(uint totalOI);
    function maintanenceMargin(address token) external view returns(uint);
    function tokenPremiumPositionFee(address token) external view returns(int);

}

library StructsUtils {
    struct IncreasePositionRequest {
        address account;
        address _collateralToken;
        address indexToken;
        uint256 amountIn;
        uint256 sizeDelta;
        bool isLong;
        uint256 acceptablePrice;
        uint256 executionFee;
        uint256 blockNumber;
        uint256 blockTime;
    }
    struct DecreasePositionRequest {
        address account;
        address _collateralToken;
        address indexToken;
        uint256 sizeDelta;
        bool isLong;
        address receiver;
        uint256 acceptablePrice;
        uint256 executionFee;
        uint256 blockNumber;
        uint256 blockTime;
    }
    struct Order {
        address account;
        address collateralToken;
        address indexToken;
        uint256 collateralDelta;
        uint256 sizeDelta;
        uint256 triggerPrice;
        uint256 executionFee;
        bool isLong;
        bool triggerAboveThreshold;
        bool isIncreaseOrder;
        bool isMaxOrder;
        uint256 orderIndex;
    }
    struct Position {
        address account;
        address collateralToken;
        address indexToken;
        bool isLong;
        uint256 size;
        uint256 collateral;
        uint256 averagePrice;
        uint256 entryBorrowingRate;
        int256 entryFundingRate;
        int256 realisedPnl;
        uint256 lastIncreasedTime;
    }

    struct MintLLPRequest {
        address account;
        uint256 amount;
        address collateralToken;
        uint256 executionFee;
        uint256 minUsdl;
        uint256 minLLP;
    }

    struct BurnLLPRequest {
        address account;
        uint256 amount;
        address collateralToken;
        uint256 minOut;
        address receiver;
        uint256 executionFee;
    }

    struct LiquidatorCacheReturn {
        IndexTokenDetails[] indexTokenDetailsArray;
        VaultDetails vaultDetails;
    }

    struct IndexTokenDetails {
        address indexToken;
        uint256 minProfitBasisPoints;
        uint256 maintanenceMargin;
        CumulativeBorrowingRate cumulativeBorrowingRate;
        CumulativeFundingRate cumulativeFundingRate;
    }

    struct CumulativeBorrowingRate {
        uint256 borrowingTime;
        uint256 currentBorrowingRateLongs;
        uint256 currentBorrowingRateShorts;
    }

    struct CumulativeFundingRate {
        uint lastFundingTime;
        int currentFundingRateLongs;
        int currentFundingRateShorts;
    }

    struct VaultDetails {
        uint256 minProfitTime;
        uint256 liquidationFactor;
        uint256 liquidationFeeUsd;
        uint256 marginFeeBasisPoints;
    }

    struct FECacheReturn {
        IndexTokenDetailsFE[] indexTokenDetailsArray;
        PoolDetailsFE poolDetails;
    }

    struct IndexTokenDetailsFE {
        address indexToken;
        uint borrowingRateLong;
        uint borrowingRateShort;
        int256 fundingRateLong;
        int256 fundingRateShort;
        uint longOpenInterest;
        uint shortOpenInterest;
        uint256 globalLongSizesLimitBps;
        uint256 globalShortSizesLimitBps;
    }

    struct PoolDetailsFE {
        uint256 totalSupply;
        uint256 totalStaked;
        uint256 poolValue;
        uint256 poolAmounts;
    }
}

interface IVault {
    struct FundingFeeData {
        uint256 fundingRateFactor;
        uint256 fundingInterval;
        uint256 fundingExponent;
    }
    struct BorrowingFeeData {
        uint256 borrowingRateFactor;
        uint256 borrowingInterval;
        uint256 borrowingExponent;
    }

    function isInitialized() external view returns (bool);

    function setUtils(address _utils) external;

    function usdl() external view returns (address);

    function maxLeverage(address _token) external view returns (uint256);

    function oiImbalanceThreshold(
        address _token
    ) external view returns (uint256);

    function gov() external view returns (address);

    function ceaseTradingActivity() external view returns (bool);

    function ceaseLPActivity() external view returns (bool);

    function minProfitTime() external view returns (uint256);

    function hasDynamicFees() external view returns (bool);

    function inManagerMode() external view returns (bool);

    function inPrivateLiquidationMode() external view returns (bool);

    function maxGasPrice() external view returns (uint256);

    function isLiquidator(address _account) external view returns (bool);

    function isManager(address _account) external view returns (bool);

    function minProfitBasisPoints(
        address _token
    ) external view returns (uint256);

    function tokenBalances(address _token) external view returns (uint256);

    function lastBorrowingTimes(address _token) external view returns (uint256);

    function lastFundingTimes(address _token) external view returns (uint256);

    function setMaxLeverage(uint256 _maxLeverage, address _token) external;

    function setInManagerMode(bool _inManagerMode) external;

    function setManager(address _manager, bool _isManager) external;

    function setMaxGasPrice(uint256 _maxGasPrice) external;

    function setMaxGlobalShortSize(address _token, uint256 _amount) external;

    function setMaxGlobalLongSize(address _token, uint256 _amount) external;

    function setInPrivateLiquidationMode(
        bool _inPrivateLiquidationMode
    ) external;

    function setLiquidator(address _liquidator, bool _isActive) external;

    function setBorrowingRate(
        address token,
        uint256 _borrowingInterval,
        uint256 _borrowingRateFactor,
        uint256 borrowingExponent
    ) external;

    function setFundingRate(
        address token,
        uint256 _fundingInterval,
        uint256 _fundingRateFactor,
        uint256 fundingExponent
    ) external;

    function setFees(
        uint256 _mintBurnFeeBasisPoints,
        uint256 _marginFeeBasisPoints,
        uint256 _liquidationFeeUsd,
        uint256 liquidationFactor,
        uint256 _minProfitTime,
        bool _hasDynamicFees
    ) external;

    function setTokenConfig(
        address _token,
        uint256 _tokenDecimals,
        uint256 _minProfitBps,
        bool _isStable,
        bool _canBeCollateralToken,
        bool _canBeIndexToken,
        uint _maxLeverage
    ) external;

    function setCeaseLPActivity(bool _cease) external;

    function setCeaseTradingActivity(bool _cease) external;

    function setPriceFeed(address _priceFeed) external;

    function withdrawFees(
        address _token,
        address _receiver
    ) external returns (uint256);

    function setGov(address _gov) external;

    function directPoolDeposit(address _token) external;

    function buyUSDL(
        address _token,
        address _receiver
    ) external returns (uint256);

    function sellUSDL(
        address _token,
        address _receiver
    ) external returns (uint256);

    function increasePosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        uint256 _sizeDelta,
        bool _isLong
    ) external;

    function decreasePosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        uint256 _sizeDelta,
        bool _isLong,
        address _receiver
    ) external returns (uint256);

    function liquidatePosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        bool _isLong,
        address _feeReceiver
    ) external;

    function liquidatePosition(bytes32 key, address feeReceiver) external;

    function priceFeed() external view returns (address);

    function fundingRateFactor(
        address
    ) external view returns (uint256, uint256, uint256);

    function borrowingRateFactor(
        address
    ) external view returns (uint256, uint256, uint256);

    function cumulativeBorrowingRatesForLongs(
        address _token
    ) external view returns (uint256);

    function cumulativeBorrowingRatesForShorts(
        address _token
    ) external view returns (uint256);

    function cumulativeFundingRatesForLongs(
        address _token
    ) external view returns (int);

    function cumulativeFundingRatesForShorts(
        address _token
    ) external view returns (int);

    function liquidationFeeUsd() external view returns (uint256);

    function liquidationFactor() external view returns (uint256);

    function mintBurnFeeBasisPoints() external view returns (uint256);

    function marginFeeBasisPoints() external view returns (uint256);

    function allWhitelistedTokensLength() external view returns (uint256);

    function allWhitelistedTokens(uint256) external view returns (address);

    function whitelistedTokens(address _token) external view returns (bool);

    function stableTokens(address _token) external view returns (bool);

    function feeReserves(address _token) external view returns (uint256);

    function globalShortSizes(address _token) external view returns (uint256);

    function globalLongSizes(address _token) external view returns (uint256);

    function globalShortAveragePrices(
        address _token
    ) external view returns (uint256);

    function globalLongAveragePrices(
        address _token
    ) external view returns (uint256);

    function maxGlobalShortSizesBps(
        address _token
    ) external view returns (uint256);

    function maxGlobalLongSizesBps(
        address _token
    ) external view returns (uint256);

    function tokenDecimals(address _token) external view returns (uint256);

    function canBeIndexToken(address _token) external view returns (bool);

    function canBeCollateralToken(address _token) external view returns (bool);

    function poolAmounts(address _token) external view returns (uint256);

    function setGlobalLongSizesLimitBps(address token, uint amount) external;

    function setGlobalShortSizesLimitBps(address token, uint amount) external;

    function setPoolSafetyFactorInBps(uint _poolSafetyFactorInBps) external;

    function getPosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        bool _isLong
    ) external view returns (StructsUtils.Position memory);

    function globalShortSizesLimitBps(
        address _token
    ) external view returns (uint256);

    function globalLongSizesLimitBps(
        address _token
    ) external view returns (uint256);
}

interface ILlpManager {
    function llp() external view returns (address);
    function usdl() external view returns (address);
    function vault() external view returns (IVault);
    function cooldownDuration() external returns (uint256);
    function lastAddedAt(address _account) external returns (uint256);
    function addLiquidityForAccount(address _fundingAccount, address _account, address _token, uint256 _amount, uint256 _minUsdl, uint256 _minllp) external returns (uint256);
    function removeLiquidityForAccount(address _account, address _tokenOut, uint256 _llpAmount, uint256 _minOut, address _receiver) external returns (uint256);
    function setCooldownDuration(uint256 _cooldownDuration) external;
    function whiteListedTokens(address token) external returns (bool);
}

contract Governable {
    address public gov;

    constructor() {
        gov = msg.sender;
    }

    modifier onlyGov() {
        require(msg.sender == gov, "Governable: forbidden");
        _;
    }

    function setGov(address _gov) external onlyGov {
        gov = _gov;
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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

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

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

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

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

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

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

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

interface IBlastPoints {
	function configurePointsOperator(address operator) external;
}

contract RewardRouter is IRewardRouter, ReentrancyGuard, Governable {
    using SafeERC20 for IERC20;
    using Address for address payable;

    bool public isInitialized;

    address public llp; // logX Liquidity Provider token

    address public llpManager;
    uint256 public minExecutionFee;
    mapping(address => bool) public isKeeper;

    mapping(address=>uint) public mintAccountIdx;
    mapping(address=>uint) public burnAccountIdx;
    mapping(bytes32=>StructsUtils.MintLLPRequest) public mintRequests;
    mapping(bytes32=>StructsUtils.BurnLLPRequest) public burnReqeusts;

    address public override feeLlpTracker;
    bytes32[] public arrayOfMintRequests;
    bytes32[] public arrayOfBurnRequests;
    uint256 public mintRequestExecuteStart;
    uint256 public burnRequestExecuteStart;

    event CreateMintRequest(address indexed account, uint256 amount);
    event CreateBurnRequest(address indexed account, uint256 amount);
    event CancelMintRequest(address indexed account, uint256 amount);
    event CancelBurnRequest(address indexed account, uint256 amount);
    event Mintllp(address indexed account, uint256 amount);
    event Burnllp(address indexed account, uint256 amount);

    function initialize(
        address _llp,
        address _llpManager,
        address _feeLlpTracker
    ) external onlyGov {
        require(!isInitialized, "RewardRouter: already initialized");
        isInitialized = true;
        llp = _llp;
        llpManager = _llpManager;
        feeLlpTracker = _feeLlpTracker;
    }

    modifier onlyKeeper(){
        require(isKeeper[msg.sender]||(msg.sender == address(this)), "RewardRouter: Not keeper");
        _;
    }

    function setFeeLlpTracker(address _feeLlpTracker) external onlyGov {
        feeLlpTracker = _feeLlpTracker;
    }

    function setLlpManager(address _llpManager) external onlyGov {
        llpManager = _llpManager;
    }

    function setLlp(address _llp) external onlyGov {
        llp = _llp;
    }

    function setMinExecutionFee(uint256 _minExecutionFee) external onlyGov {
        minExecutionFee = _minExecutionFee;
    }

    function setKeeperStatus(address newKeeper, bool status) external onlyGov {
        isKeeper[newKeeper] = status;
    }

    // to help users who accidentally send their tokens to this contract
    function withdrawToken(address _token, address _account, uint256 _amount) external onlyGov {
        IERC20(_token).safeTransfer(_account, _amount);
    }

    function mintLlp(address _token, uint256 _amount, uint256 _minUsdl, uint256 _minLlp) external nonReentrant returns (uint256) {
        require(_amount > 0, "RewardRouter: invalid _amount");

        address account = msg.sender;
        uint256 llpAmount = ILlpManager(llpManager).addLiquidityForAccount(account, account, _token, _amount, _minUsdl, _minLlp);
        emit Mintllp(account, llpAmount);
        return llpAmount;
    }

    function burnLlp( uint256 _llpAmount, uint256 _minOut, address tokenOut) external nonReentrant returns (uint256) {
        require(_llpAmount > 0, "RewardRouter: invalid _llpAmount");

        address account = msg.sender;
        uint256 amountOut = ILlpManager(llpManager).removeLiquidityForAccount(account, tokenOut, _llpAmount, _minOut, account);
        emit Burnllp(account, _llpAmount);

        return amountOut;
    }

    function stakeLlp(uint256 llpAmount) external nonReentrant {
        require(llpAmount > 0, "RewardRouter: llpAmount too low");
        address account = msg.sender;
        IRewardTracker(feeLlpTracker).stakeForAccount(account, account, llp, llpAmount);
    }

    function unstakeLlp(uint256 amount) external nonReentrant {
        address account = msg.sender;
        IRewardTracker(feeLlpTracker).unstakeForAccount(account, llp, amount, account);
    }

    function claimStakeRewards() external nonReentrant returns(uint256){
        address account = msg.sender;
        return IRewardTracker(feeLlpTracker).claimForAccount(account, account);
    }

    function createMintRequest(address account, uint256 executionFee, address token, uint256 amount,uint256 minUsdl, uint256 minLLP) payable external {
        require(executionFee >= minExecutionFee, "RewardRouter: Not enough execution fee");
        require(executionFee == msg.value, "RewardRouter: execution fee doesn't match");
        require(ILlpManager(llpManager).whiteListedTokens(token), "RewardRouter: not suported LP token");
        IERC20(token).safeTransferFrom(account, address(this), amount);
        _createMintRequest(account, executionFee, token, amount, minUsdl, minLLP);
    }

    function _createMintRequest(address account, uint256 executionFee, address token, uint256 amount, uint256 minUsdl, uint256 minLLP) internal {
        uint256 requestIdx = mintAccountIdx[account];
        bytes32 requestKey = getRequestKey(account, requestIdx);
        mintAccountIdx[account] = requestIdx +1;
        StructsUtils.MintLLPRequest memory mintRequest = StructsUtils.MintLLPRequest(account, amount, token, executionFee, minUsdl, minLLP);
        mintRequests[requestKey] = mintRequest;
        arrayOfMintRequests.push(requestKey);
        emit CreateMintRequest(account, amount);
    }

    function createBurnRequest(address account, uint256 executionFee, address token, uint256 amount,uint256 minOut, address receiver) payable external {
        require(executionFee >= minExecutionFee, "RewardRouter: Not enough execution fee");
        require(executionFee == msg.value, "RewardRouter: execution fee doesn't match");
        require(msg.sender==account, "RewardRouter: account should be same as msg.sender");
        require(IERC20(llp).balanceOf(account) >= amount,"RewardRouter: insuff LLP");
        uint256 requestIdx = burnAccountIdx[account];
        bytes32 requestKey = getRequestKey(account, requestIdx);
        burnAccountIdx[account] = requestIdx +1;
        StructsUtils.BurnLLPRequest memory burnRequest = StructsUtils.BurnLLPRequest(account, amount, token, minOut, receiver, executionFee);
        burnReqeusts[requestKey] = burnRequest;
        arrayOfBurnRequests.push(requestKey);
        emit CreateBurnRequest(account, amount);
    }

    function getRequestKey(
        address account,
        uint256 index
    ) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account, index));
    }

    function executeMintRequests(uint endIndex, address payable feeReceiver ) external onlyKeeper returns(uint) {
        uint256 lastIdx = arrayOfMintRequests.length;
        uint256 index = mintRequestExecuteStart;
        if(index >= lastIdx){
            return index;
        }

        if(endIndex>lastIdx){
            endIndex = lastIdx;
        }
        while(index<endIndex){
            bytes32 requestKey = arrayOfMintRequests[index];
            try
                this._executeMintRequest(requestKey, feeReceiver)
            returns(bool _wasExecuted){
                if (!_wasExecuted) {
                    break;
                }
            } catch {
                try
                    this._cancelMintRequest(requestKey, feeReceiver)
                returns (bool _wasCancelled) {
                    if (!_wasCancelled) {}
                } catch {
                    continue;
                }
            }
            index++;
            delete mintRequests[requestKey];
        }
        mintRequestExecuteStart = index;
        return index;
    } 

    function executeBurnRequests(uint endIndex, address payable feeReceiver ) external onlyKeeper returns (uint) {
        uint256 lastIdx = arrayOfBurnRequests.length;
        uint256 index = burnRequestExecuteStart;
        if(index >= lastIdx){
            return index;
        }

        if(endIndex>lastIdx){
            endIndex = lastIdx;
        }
        while(index<endIndex){
            bytes32 requestKey = arrayOfBurnRequests[index];
            try
                this._executeBurnRequest(requestKey, feeReceiver)
            returns(bool _wasExecuted){
                if (!_wasExecuted) {
                    break;
                }
            } catch {
                try
                    this._cancelBurnRequest(requestKey, feeReceiver)
                returns (bool _wasCancelled) {
                    if (!_wasCancelled) {}
                } catch {
                    continue;
                }
            }
            index++;
            delete burnReqeusts[requestKey];
        }
        burnRequestExecuteStart = index;
        return index;
    } 

    function _executeMintRequest(bytes32 requestKey, address payable feeReceiver) public onlyKeeper returns(bool) {
        StructsUtils.MintLLPRequest memory mintRequest = mintRequests[requestKey];
        if(mintRequest.account == address(0)){
            return true;
        }
        IERC20(mintRequest.collateralToken).approve(llpManager, mintRequest.amount);
        uint256 llpAmount = ILlpManager(llpManager).addLiquidityForAccount(address(this), mintRequest.account, mintRequest.collateralToken, mintRequest.amount, mintRequest.minUsdl, mintRequest.minUsdl);
        emit Mintllp(mintRequest.account, llpAmount);
        (bool success,  ) = feeReceiver.call{value: mintRequest.executionFee}("");
        require(success, "Failed to send mint execution fee to keeper");
        return true;
    }

    function _cancelMintRequest(bytes32 requestKey, address payable feeReceiver) public onlyKeeper returns(bool) {
        StructsUtils.MintLLPRequest memory mintRequest = mintRequests[requestKey];
        if(mintRequest.account == address(0)){
            return true;
        }
        IERC20(mintRequest.collateralToken).transfer(mintRequest.account, mintRequest.amount);
        (bool success,  ) = feeReceiver.call{value: mintRequest.executionFee}("");
        require(success, "Failed to send mint execution fee to keeper");
        emit CancelMintRequest(mintRequest.account, mintRequest.amount);
        return true;
    }

    function _executeBurnRequest(bytes32 requestKey, address payable feeReceiver) public onlyKeeper returns(bool) {
        StructsUtils.BurnLLPRequest memory burnRequest = burnReqeusts[requestKey];
        if(burnRequest.account == address(0)){
            return true;
        }
        uint256 llpAmount = ILlpManager(llpManager).removeLiquidityForAccount(burnRequest.account, burnRequest.collateralToken, burnRequest.amount, burnRequest.minOut, burnRequest.receiver);
        emit Burnllp(burnRequest.account, llpAmount);
        (bool success,  ) = feeReceiver.call{value: burnRequest.executionFee}("");
        require(success, "Failed to send mint execution fee to keeper");
        return true;
    }

    function _cancelBurnRequest(bytes32 requestKey, address payable feeReceiver) public onlyKeeper returns(bool) {
        StructsUtils.BurnLLPRequest memory burnRequest = burnReqeusts[requestKey];
        if(burnRequest.account == address(0)){
            return true;
        }
        emit CancelBurnRequest(burnRequest.account, burnRequest.amount);
        return true;
    }

    function getMintRequestsCount() public view returns(uint){
        return arrayOfMintRequests.length;
    }
    function getBurnRequestsCount() public view returns(uint){
        return arrayOfBurnRequests.length;
    }

    function initiateBlastPoints(address blastPointContract, address pointsOperator) onlyGov external {
        IBlastPoints(blastPointContract).configurePointsOperator(pointsOperator);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burnllp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CancelBurnRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CancelMintRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CreateBurnRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CreateMintRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mintllp","type":"event"},{"inputs":[{"internalType":"bytes32","name":"requestKey","type":"bytes32"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"_cancelBurnRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestKey","type":"bytes32"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"_cancelMintRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestKey","type":"bytes32"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"_executeBurnRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestKey","type":"bytes32"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"_executeMintRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"arrayOfBurnRequests","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"arrayOfMintRequests","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burnAccountIdx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_llpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"burnLlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"burnReqeusts","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"executionFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRequestExecuteStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimStakeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"createBurnRequest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minUsdl","type":"uint256"},{"internalType":"uint256","name":"minLLP","type":"uint256"}],"name":"createMintRequest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"endIndex","type":"uint256"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"executeBurnRequests","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"endIndex","type":"uint256"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"executeMintRequests","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeLlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnRequestsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintRequestsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_llp","type":"address"},{"internalType":"address","name":"_llpManager","type":"address"},{"internalType":"address","name":"_feeLlpTracker","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"blastPointContract","type":"address"},{"internalType":"address","name":"pointsOperator","type":"address"}],"name":"initiateBlastPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"llp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"llpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minExecutionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintAccountIdx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdl","type":"uint256"},{"internalType":"uint256","name":"_minLlp","type":"uint256"}],"name":"mintLlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintRequestExecuteStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintRequests","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"uint256","name":"minUsdl","type":"uint256"},{"internalType":"uint256","name":"minLLP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeLlpTracker","type":"address"}],"name":"setFeeLlpTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newKeeper","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setKeeperStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_llp","type":"address"}],"name":"setLlp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_llpManager","type":"address"}],"name":"setLlpManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minExecutionFee","type":"uint256"}],"name":"setMinExecutionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"llpAmount","type":"uint256"}],"name":"stakeLlp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstakeLlp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506001600081905580546001600160a01b031916331790556128be806100376000396000f3fe60806040526004361061022f5760003560e01c80636ba42aaa1161012e578063b46d32a3116100ab578063ee536a661161006f578063ee536a6614610795578063f540c10d146107b5578063f76d014f146107d5578063fc2cee62146107eb578063fc2e30a51461080b57600080fd5b8063b46d32a31461070a578063c0c53b8b1461071f578063c1bb9ebc1461073f578063cfad57a214610755578063d54eefaf1461077557600080fd5b80638ad24a86116100f25780638ad24a861461065d57806391fcf5a81461067d578063a0a48d521461069d578063ae4ca2d0146106ca578063b2419939146106ea57600080fd5b80636ba42aaa146105ad5780637c5babaa146105dd5780637e5c153f146105fd5780638116f1311461061d57806381abfdc91461063d57600080fd5b80632649bc79116101bc5780634d3a5992116101805780634d3a59921461053c5780634e8a7e801461054f5780635126c9021461056457806363ae2103146105775780636acd58ba1461058d57600080fd5b80632649bc791461049b578063392e53cd146104bb578063396119fa146104dc5780633a50a3b5146104fc5780633ad13bfa1461051c57600080fd5b80630d39e46d116102035780630d39e46d146102e35780630fa503b61461037d57806312d43a51146103ab5780631f2c7b5b146103cb578063239e2e461461046e57600080fd5b8062389ac51461023457806301e336671461027157806302e963f114610293578063036f5ade146102c3575b600080fd5b34801561024057600080fd5b50600a54610254906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027d57600080fd5b5061029161028c366004612386565b610820565b005b34801561029f57600080fd5b506102b36102ae3660046123c7565b61086c565b6040519015158152602001610268565b3480156102cf57600080fd5b506102916102de3660046123f7565b610a5f565b3480156102ef57600080fd5b5061033f6102fe366004612414565b6008602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909186565b604080516001600160a01b039788168152602081019690965293909516928401929092526060830152608082015260a081019190915260c001610268565b34801561038957600080fd5b5061039d610398366004612414565b610aab565b604051908152602001610268565b3480156103b757600080fd5b50600154610254906001600160a01b031681565b3480156103d757600080fd5b5061042b6103e6366004612414565b6009602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039485169593949283169391929091169086565b604080516001600160a01b0397881681526020810196909652938616938501939093526060840191909152909216608082015260a081019190915260c001610268565b34801561047a57600080fd5b5061039d6104893660046123f7565b60076020526000908152604090205481565b3480156104a757600080fd5b5061039d6104b636600461242d565b610acc565b3480156104c757600080fd5b506001546102b390600160a01b900460ff1681565b3480156104e857600080fd5b506102916104f7366004612414565b610c10565b34801561050857600080fd5b506102b36105173660046123c7565b610ca1565b34801561052857600080fd5b506102b36105373660046123c7565b610f1c565b61029161054a366004612466565b6110c9565b34801561055b57600080fd5b50600c5461039d565b6102916105723660046124c2565b6111fd565b34801561058357600080fd5b5061039d60045481565b34801561059957600080fd5b506102916105a8366004612537565b611546565b3480156105b957600080fd5b506102b36105c83660046123f7565b60056020526000908152604090205460ff1681565b3480156105e957600080fd5b506102916105f83660046123f7565b61159b565b34801561060957600080fd5b50610291610618366004612414565b6115e7565b34801561062957600080fd5b50600254610254906001600160a01b031681565b34801561064957600080fd5b50600354610254906001600160a01b031681565b34801561066957600080fd5b5061039d6106783660046123c7565b61168c565b34801561068957600080fd5b5061039d610698366004612565565b61186b565b3480156106a957600080fd5b5061039d6106b83660046123f7565b60066020526000908152604090205481565b3480156106d657600080fd5b506102916106e53660046123f7565b6119a1565b3480156106f657600080fd5b506102b36107053660046123c7565b6119ed565b34801561071657600080fd5b5061039d611aed565b34801561072b57600080fd5b5061029161073a3660046125a0565b611b7d565b34801561074b57600080fd5b5061039d600e5481565b34801561076157600080fd5b506102916107703660046123f7565b611c5d565b34801561078157600080fd5b5061039d6107903660046123c7565b611ca9565b3480156107a157600080fd5b5061039d6107b0366004612414565b611e8b565b3480156107c157600080fd5b506102916107d03660046125e0565b611e9b565b3480156107e157600080fd5b5061039d600d5481565b3480156107f757600080fd5b50610291610806366004612414565b611f1c565b34801561081757600080fd5b50600b5461039d565b6001546001600160a01b031633146108535760405162461bcd60e51b815260040161084a9061260e565b60405180910390fd5b6108676001600160a01b0384168383611f4b565b505050565b3360009081526005602052604081205460ff168061088957503330145b6108a55760405162461bcd60e51b815260040161084a9061263d565b600083815260086020908152604091829020825160c08101845281546001600160a01b039081168083526001840154948301949094526002830154169381019390935260038101546060840152600481015460808401526005015460a0830152610913576001915050610a59565b60408181015182516020840151925163a9059cbb60e01b81526001600160a01b0391821660048201526024810193909352169063a9059cbb906044016020604051808303816000875af115801561096e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109929190612674565b5060608101516040516000916001600160a01b038616918381818185875af1925050503d80600081146109e1576040519150601f19603f3d011682016040523d82523d6000602084013e6109e6565b606091505b5050905080610a075760405162461bcd60e51b815260040161084a90612691565b81600001516001600160a01b03167fe3861323d3496a71690430a440d3f89298d4cede5317e52cff163abb909aab208360200151604051610a4a91815260200190565b60405180910390a26001925050505b92915050565b6001546001600160a01b03163314610a895760405162461bcd60e51b815260040161084a9061260e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600b8181548110610abb57600080fd5b600091825260209091200154905081565b6000610ad6611fae565b60008411610b265760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f6c6c70416d6f756e74604482015260640161084a565b6003546040516371d597ad60e01b815233600482018190526001600160a01b03858116602484015260448301889052606483018790526084830182905290926000929116906371d597ad9060a4016020604051808303816000875af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb791906126dc565b9050816001600160a01b03167fbfed372bc52735a8e622ff9ce7bcf01f9031fb1beb6aca08ac87480a1dbe471087604051610bf491815260200190565b60405180910390a2915050610c096001600055565b9392505050565b610c18611fae565b600a5460025460405163098bf59d60e01b815233600482018190526001600160a01b039283166024830152604482018590526064820181905292919091169063098bf59d906084015b600060405180830381600087803b158015610c7b57600080fd5b505af1158015610c8f573d6000803e3d6000fd5b5050505050610c9e6001600055565b50565b3360009081526005602052604081205460ff1680610cbe57503330145b610cda5760405162461bcd60e51b815260040161084a9061263d565b600083815260086020908152604091829020825160c08101845281546001600160a01b039081168083526001840154948301949094526002830154169381019390935260038101546060840152600481015460808401526005015460a0830152610d48576001915050610a59565b6040818101516003546020840151925163095ea7b360e01b81526001600160a01b0391821660048201526024810193909352169063095ea7b3906044016020604051808303816000875af1158015610da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc89190612674565b5060035481516040808401516020850151608086015192516317eb2a1560e01b81526000956001600160a01b0316946317eb2a1594610e1394309492939092919081906004016126f5565b6020604051808303816000875af1158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5691906126dc565b82516040518281529192506001600160a01b0316907f41115caaff93d0fb3d6d596733e2442429850baef9d556b420e59b096b1ffe759060200160405180910390a26000846001600160a01b031683606001516040515b60006040518083038185875af1925050503d8060008114610eea576040519150601f19603f3d011682016040523d82523d6000602084013e610eef565b606091505b5050905080610f105760405162461bcd60e51b815260040161084a90612691565b50600195945050505050565b3360009081526005602052604081205460ff1680610f3957503330145b610f555760405162461bcd60e51b815260040161084a9061263d565b600083815260096020908152604091829020825160c08101845281546001600160a01b03908116808352600184015494830194909452600283015481169482019490945260038201546060820152600482015490931660808401526005015460a0830152610fc7576001915050610a59565b600354815160408084015160208501516060860151608087015193516371d597ad60e01b81526001600160a01b039586166004820152928516602484015260448301919091526064820152908216608482015260009291909116906371d597ad9060a4016020604051808303816000875af115801561104a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106e91906126dc565b82516040518281529192506001600160a01b0316907fbfed372bc52735a8e622ff9ce7bcf01f9031fb1beb6aca08ac87480a1dbe47109060200160405180910390a26000846001600160a01b03168360a00151604051610ead565b6004548510156110eb5760405162461bcd60e51b815260040161084a9061272e565b34851461110a5760405162461bcd60e51b815260040161084a90612774565b60035460405163d3c2638360e01b81526001600160a01b0386811660048301529091169063d3c26383906024016020604051808303816000875af1158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a9190612674565b6111d25760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a206e6f74207375706f72746564204c5020746f60448201526235b2b760e91b606482015260840161084a565b6111e76001600160a01b038516873086611fd8565b6111f5868686868686612016565b505050505050565b60045485101561121f5760405162461bcd60e51b815260040161084a9061272e565b34851461123e5760405162461bcd60e51b815260040161084a90612774565b336001600160a01b038716146112b15760405162461bcd60e51b815260206004820152603260248201527f526577617264526f757465723a206163636f756e742073686f756c642062652060448201527139b0b6b29030b99036b9b39739b2b73232b960711b606482015260840161084a565b6002546040516370a0823160e01b81526001600160a01b038881166004830152859216906370a0823190602401602060405180830381865afa1580156112fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131f91906126dc565b101561136d5760405162461bcd60e51b815260206004820152601860248201527f526577617264526f757465723a20696e73756666204c4c500000000000000000604482015260640161084a565b6001600160a01b03861660009081526007602052604081205490611391888361214d565b905061139e8260016127d3565b600760008a6001600160a01b03166001600160a01b031681526020019081526020016000208190555060006040518060c001604052808a6001600160a01b03168152602001878152602001886001600160a01b03168152602001868152602001856001600160a01b03168152602001898152509050806009600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015560808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050155905050600c829080600181540180825580915050600190039060005260206000200160009091909190915055886001600160a01b03167fac0d6b7d4c519f3e82e78a6df78c4275349679c06ff6c0cbe7ef2245f2d225fc8760405161153391815260200190565b60405180910390a2505050505050505050565b6001546001600160a01b031633146115705760405162461bcd60e51b815260040161084a9061260e565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6001546001600160a01b031633146115c55760405162461bcd60e51b815260040161084a9061260e565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6115ef611fae565b6000811161163f5760405162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a206c6c70416d6f756e7420746f6f206c6f7700604482015260640161084a565b600a54600254604051631e42d69b60e21b81523360048201819052602482018190526001600160a01b0392831660448301526064820185905292919091169063790b5a6c90608401610c61565b3360009081526005602052604081205460ff16806116a957503330145b6116c55760405162461bcd60e51b815260040161084a9061263d565b600b54600d548181106116db579150610a599050565b818511156116e7578194505b8481101561185e576000600b8281548110611704576117046127e6565b600091825260209091200154604051633a50a3b560e01b8152600481018290526001600160a01b03871660248201529091503090633a50a3b5906044016020604051808303816000875af192505050801561177c575060408051601f3d908101601f1916820190925261177991810190612674565b60015b6117f9576040516302e963f160e01b8152600481018290526001600160a01b038616602482015230906302e963f1906044016020604051808303816000875af19250505080156117e9575060408051601f3d908101601f191682019092526117e691810190612674565b60015b6117f357506116e7565b50611807565b8061180557505061185e565b505b81611811816127fc565b600092835260086020526040832080546001600160a01b031990811682556001820185905560028201805490911690556003810184905560048101849055600501929092555090506116e7565b600d819055949350505050565b6000611875611fae565b600084116118c55760405162461bcd60e51b815260206004820152601d60248201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604482015260640161084a565b6003546040516317eb2a1560e01b815233916000916001600160a01b03909116906317eb2a159061190490859081908c908c908c908c906004016126f5565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194791906126dc565b9050816001600160a01b03167f41115caaff93d0fb3d6d596733e2442429850baef9d556b420e59b096b1ffe758260405161198491815260200190565b60405180910390a29150506119996001600055565b949350505050565b6001546001600160a01b031633146119cb5760405162461bcd60e51b815260040161084a9061260e565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604081205460ff1680611a0a57503330145b611a265760405162461bcd60e51b815260040161084a9061263d565b600083815260096020908152604091829020825160c08101845281546001600160a01b03908116808352600184015494830194909452600283015481169482019490945260038201546060820152600482015490931660808401526005015460a0830152611a98576001915050610a59565b80600001516001600160a01b03167fef06bcb737aaf23cece9d2cf084e7044f7fc556929f7b317e9459301fc5429668260200151604051611adb91815260200190565b60405180910390a25060019392505050565b6000611af7611fae565b600a546040516309f4173d60e11b8152336004820181905260248201819052916001600160a01b0316906313e82e7a906044016020604051808303816000875af1158015611b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6d91906126dc565b915050611b7a6001600055565b90565b6001546001600160a01b03163314611ba75760405162461bcd60e51b815260040161084a9061260e565b600154600160a01b900460ff1615611c0b5760405162461bcd60e51b815260206004820152602160248201527f526577617264526f757465723a20616c726561647920696e697469616c697a656044820152601960fa1b606482015260840161084a565b6001805460ff60a01b1916600160a01b179055600280546001600160a01b039485166001600160a01b0319918216179091556003805493851693821693909317909255600a8054919093169116179055565b6001546001600160a01b03163314611c875760405162461bcd60e51b815260040161084a9061260e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604081205460ff1680611cc657503330145b611ce25760405162461bcd60e51b815260040161084a9061263d565b600c54600e54818110611cf8579150610a599050565b81851115611d04578194505b84811015611e7e576000600c8281548110611d2157611d216127e6565b600091825260209091200154604051631d689dfd60e11b8152600481018290526001600160a01b03871660248201529091503090633ad13bfa906044016020604051808303816000875af1925050508015611d99575060408051601f3d908101601f19168201909252611d9691810190612674565b60015b611e165760405163b241993960e01b8152600481018290526001600160a01b0386166024820152309063b2419939906044016020604051808303816000875af1925050508015611e06575060408051601f3d908101601f19168201909252611e0391810190612674565b60015b611e105750611d04565b50611e24565b80611e22575050611e7e565b505b81611e2e816127fc565b600092835260096020526040832080546001600160a01b03199081168255600182018590556002820180548216905560038201859055600482018054909116905560050192909255509050611d04565b600e819055949350505050565b600c8181548110610abb57600080fd5b6001546001600160a01b03163314611ec55760405162461bcd60e51b815260040161084a9061260e565b6040516336b91f2b60e01b81526001600160a01b0382811660048301528316906336b91f2b90602401600060405180830381600087803b158015611f0857600080fd5b505af11580156111f5573d6000803e3d6000fd5b6001546001600160a01b03163314611f465760405162461bcd60e51b815260040161084a9061260e565b600455565b6040516001600160a01b03831660248201526044810182905261086790849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612194565b600260005403611fd157604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6040516001600160a01b03808516602483015283166044820152606481018290526120109085906323b872dd60e01b90608401611f77565b50505050565b6001600160a01b0386166000908152600660205260408120549061203a888361214d565b90506120478260016127d3565b6001600160a01b03898116600081815260066020908152604080832095909555845160c0810186528381528082018b81528c8616828801908152606083018f8152608084018d815260a085018d81528b8852600887528a882086518154908c166001600160a01b03199182161782559551600180830191909155945160028201805491909c16961695909517909955905160038401555160048301559551600590910155600b805495860181559092527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9909301859055925188815290917f6f0c1e1d0dd3edf10dfe8838209c4930d845b1f29d1cb64019f6198afc69ef2c9101611533565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b60006121e9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122669092919063ffffffff16565b80519091501561086757808060200190518101906122079190612674565b6108675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161084a565b6060611999848460008585843b6122bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161084a565b600080866001600160a01b031685876040516122db9190612839565b60006040518083038185875af1925050503d8060008114612318576040519150601f19603f3d011682016040523d82523d6000602084013e61231d565b606091505b509150915061232d828286612338565b979650505050505050565b60608315612347575081610c09565b8251156123575782518084602001fd5b8160405162461bcd60e51b815260040161084a9190612855565b6001600160a01b0381168114610c9e57600080fd5b60008060006060848603121561239b57600080fd5b83356123a681612371565b925060208401356123b681612371565b929592945050506040919091013590565b600080604083850312156123da57600080fd5b8235915060208301356123ec81612371565b809150509250929050565b60006020828403121561240957600080fd5b8135610c0981612371565b60006020828403121561242657600080fd5b5035919050565b60008060006060848603121561244257600080fd5b8335925060208401359150604084013561245b81612371565b809150509250925092565b60008060008060008060c0878903121561247f57600080fd5b863561248a81612371565b95506020870135945060408701356124a181612371565b959894975094956060810135955060808101359460a0909101359350915050565b60008060008060008060c087890312156124db57600080fd5b86356124e681612371565b95506020870135945060408701356124fd81612371565b9350606087013592506080870135915060a087013561251b81612371565b809150509295509295509295565b8015158114610c9e57600080fd5b6000806040838503121561254a57600080fd5b823561255581612371565b915060208301356123ec81612529565b6000806000806080858703121561257b57600080fd5b843561258681612371565b966020860135965060408601359560600135945092505050565b6000806000606084860312156125b557600080fd5b83356125c081612371565b925060208401356125d081612371565b9150604084013561245b81612371565b600080604083850312156125f357600080fd5b82356125fe81612371565b915060208301356123ec81612371565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b60208082526018908201527f526577617264526f757465723a204e6f74206b65657065720000000000000000604082015260600190565b60006020828403121561268657600080fd5b8151610c0981612529565b6020808252602b908201527f4661696c656420746f2073656e64206d696e7420657865637574696f6e20666560408201526a32903a379035b2b2b832b960a91b606082015260800190565b6000602082840312156126ee57600080fd5b5051919050565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b60208082526026908201527f526577617264526f757465723a204e6f7420656e6f75676820657865637574696040820152656f6e2066656560d01b606082015260800190565b60208082526029908201527f526577617264526f757465723a20657865637574696f6e2066656520646f65736040820152680dc4ee840dac2e8c6d60bb1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a5957610a596127bd565b634e487b7160e01b600052603260045260246000fd5b60006001820161280e5761280e6127bd565b5060010190565b60005b83811015612830578181015183820152602001612818565b50506000910152565b6000825161284b818460208701612815565b9190910192915050565b6020815260008251806020840152612874816040850160208701612815565b601f01601f1916919091016040019291505056fea264697066735822122077f47cc471b611a71849e9641b7f50d9d66533242f584831ac14fc8c48b04c3864736f6c63430008130033

Deployed Bytecode

0x60806040526004361061022f5760003560e01c80636ba42aaa1161012e578063b46d32a3116100ab578063ee536a661161006f578063ee536a6614610795578063f540c10d146107b5578063f76d014f146107d5578063fc2cee62146107eb578063fc2e30a51461080b57600080fd5b8063b46d32a31461070a578063c0c53b8b1461071f578063c1bb9ebc1461073f578063cfad57a214610755578063d54eefaf1461077557600080fd5b80638ad24a86116100f25780638ad24a861461065d57806391fcf5a81461067d578063a0a48d521461069d578063ae4ca2d0146106ca578063b2419939146106ea57600080fd5b80636ba42aaa146105ad5780637c5babaa146105dd5780637e5c153f146105fd5780638116f1311461061d57806381abfdc91461063d57600080fd5b80632649bc79116101bc5780634d3a5992116101805780634d3a59921461053c5780634e8a7e801461054f5780635126c9021461056457806363ae2103146105775780636acd58ba1461058d57600080fd5b80632649bc791461049b578063392e53cd146104bb578063396119fa146104dc5780633a50a3b5146104fc5780633ad13bfa1461051c57600080fd5b80630d39e46d116102035780630d39e46d146102e35780630fa503b61461037d57806312d43a51146103ab5780631f2c7b5b146103cb578063239e2e461461046e57600080fd5b8062389ac51461023457806301e336671461027157806302e963f114610293578063036f5ade146102c3575b600080fd5b34801561024057600080fd5b50600a54610254906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027d57600080fd5b5061029161028c366004612386565b610820565b005b34801561029f57600080fd5b506102b36102ae3660046123c7565b61086c565b6040519015158152602001610268565b3480156102cf57600080fd5b506102916102de3660046123f7565b610a5f565b3480156102ef57600080fd5b5061033f6102fe366004612414565b6008602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909186565b604080516001600160a01b039788168152602081019690965293909516928401929092526060830152608082015260a081019190915260c001610268565b34801561038957600080fd5b5061039d610398366004612414565b610aab565b604051908152602001610268565b3480156103b757600080fd5b50600154610254906001600160a01b031681565b3480156103d757600080fd5b5061042b6103e6366004612414565b6009602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039485169593949283169391929091169086565b604080516001600160a01b0397881681526020810196909652938616938501939093526060840191909152909216608082015260a081019190915260c001610268565b34801561047a57600080fd5b5061039d6104893660046123f7565b60076020526000908152604090205481565b3480156104a757600080fd5b5061039d6104b636600461242d565b610acc565b3480156104c757600080fd5b506001546102b390600160a01b900460ff1681565b3480156104e857600080fd5b506102916104f7366004612414565b610c10565b34801561050857600080fd5b506102b36105173660046123c7565b610ca1565b34801561052857600080fd5b506102b36105373660046123c7565b610f1c565b61029161054a366004612466565b6110c9565b34801561055b57600080fd5b50600c5461039d565b6102916105723660046124c2565b6111fd565b34801561058357600080fd5b5061039d60045481565b34801561059957600080fd5b506102916105a8366004612537565b611546565b3480156105b957600080fd5b506102b36105c83660046123f7565b60056020526000908152604090205460ff1681565b3480156105e957600080fd5b506102916105f83660046123f7565b61159b565b34801561060957600080fd5b50610291610618366004612414565b6115e7565b34801561062957600080fd5b50600254610254906001600160a01b031681565b34801561064957600080fd5b50600354610254906001600160a01b031681565b34801561066957600080fd5b5061039d6106783660046123c7565b61168c565b34801561068957600080fd5b5061039d610698366004612565565b61186b565b3480156106a957600080fd5b5061039d6106b83660046123f7565b60066020526000908152604090205481565b3480156106d657600080fd5b506102916106e53660046123f7565b6119a1565b3480156106f657600080fd5b506102b36107053660046123c7565b6119ed565b34801561071657600080fd5b5061039d611aed565b34801561072b57600080fd5b5061029161073a3660046125a0565b611b7d565b34801561074b57600080fd5b5061039d600e5481565b34801561076157600080fd5b506102916107703660046123f7565b611c5d565b34801561078157600080fd5b5061039d6107903660046123c7565b611ca9565b3480156107a157600080fd5b5061039d6107b0366004612414565b611e8b565b3480156107c157600080fd5b506102916107d03660046125e0565b611e9b565b3480156107e157600080fd5b5061039d600d5481565b3480156107f757600080fd5b50610291610806366004612414565b611f1c565b34801561081757600080fd5b50600b5461039d565b6001546001600160a01b031633146108535760405162461bcd60e51b815260040161084a9061260e565b60405180910390fd5b6108676001600160a01b0384168383611f4b565b505050565b3360009081526005602052604081205460ff168061088957503330145b6108a55760405162461bcd60e51b815260040161084a9061263d565b600083815260086020908152604091829020825160c08101845281546001600160a01b039081168083526001840154948301949094526002830154169381019390935260038101546060840152600481015460808401526005015460a0830152610913576001915050610a59565b60408181015182516020840151925163a9059cbb60e01b81526001600160a01b0391821660048201526024810193909352169063a9059cbb906044016020604051808303816000875af115801561096e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109929190612674565b5060608101516040516000916001600160a01b038616918381818185875af1925050503d80600081146109e1576040519150601f19603f3d011682016040523d82523d6000602084013e6109e6565b606091505b5050905080610a075760405162461bcd60e51b815260040161084a90612691565b81600001516001600160a01b03167fe3861323d3496a71690430a440d3f89298d4cede5317e52cff163abb909aab208360200151604051610a4a91815260200190565b60405180910390a26001925050505b92915050565b6001546001600160a01b03163314610a895760405162461bcd60e51b815260040161084a9061260e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600b8181548110610abb57600080fd5b600091825260209091200154905081565b6000610ad6611fae565b60008411610b265760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f6c6c70416d6f756e74604482015260640161084a565b6003546040516371d597ad60e01b815233600482018190526001600160a01b03858116602484015260448301889052606483018790526084830182905290926000929116906371d597ad9060a4016020604051808303816000875af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb791906126dc565b9050816001600160a01b03167fbfed372bc52735a8e622ff9ce7bcf01f9031fb1beb6aca08ac87480a1dbe471087604051610bf491815260200190565b60405180910390a2915050610c096001600055565b9392505050565b610c18611fae565b600a5460025460405163098bf59d60e01b815233600482018190526001600160a01b039283166024830152604482018590526064820181905292919091169063098bf59d906084015b600060405180830381600087803b158015610c7b57600080fd5b505af1158015610c8f573d6000803e3d6000fd5b5050505050610c9e6001600055565b50565b3360009081526005602052604081205460ff1680610cbe57503330145b610cda5760405162461bcd60e51b815260040161084a9061263d565b600083815260086020908152604091829020825160c08101845281546001600160a01b039081168083526001840154948301949094526002830154169381019390935260038101546060840152600481015460808401526005015460a0830152610d48576001915050610a59565b6040818101516003546020840151925163095ea7b360e01b81526001600160a01b0391821660048201526024810193909352169063095ea7b3906044016020604051808303816000875af1158015610da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc89190612674565b5060035481516040808401516020850151608086015192516317eb2a1560e01b81526000956001600160a01b0316946317eb2a1594610e1394309492939092919081906004016126f5565b6020604051808303816000875af1158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5691906126dc565b82516040518281529192506001600160a01b0316907f41115caaff93d0fb3d6d596733e2442429850baef9d556b420e59b096b1ffe759060200160405180910390a26000846001600160a01b031683606001516040515b60006040518083038185875af1925050503d8060008114610eea576040519150601f19603f3d011682016040523d82523d6000602084013e610eef565b606091505b5050905080610f105760405162461bcd60e51b815260040161084a90612691565b50600195945050505050565b3360009081526005602052604081205460ff1680610f3957503330145b610f555760405162461bcd60e51b815260040161084a9061263d565b600083815260096020908152604091829020825160c08101845281546001600160a01b03908116808352600184015494830194909452600283015481169482019490945260038201546060820152600482015490931660808401526005015460a0830152610fc7576001915050610a59565b600354815160408084015160208501516060860151608087015193516371d597ad60e01b81526001600160a01b039586166004820152928516602484015260448301919091526064820152908216608482015260009291909116906371d597ad9060a4016020604051808303816000875af115801561104a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106e91906126dc565b82516040518281529192506001600160a01b0316907fbfed372bc52735a8e622ff9ce7bcf01f9031fb1beb6aca08ac87480a1dbe47109060200160405180910390a26000846001600160a01b03168360a00151604051610ead565b6004548510156110eb5760405162461bcd60e51b815260040161084a9061272e565b34851461110a5760405162461bcd60e51b815260040161084a90612774565b60035460405163d3c2638360e01b81526001600160a01b0386811660048301529091169063d3c26383906024016020604051808303816000875af1158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a9190612674565b6111d25760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a206e6f74207375706f72746564204c5020746f60448201526235b2b760e91b606482015260840161084a565b6111e76001600160a01b038516873086611fd8565b6111f5868686868686612016565b505050505050565b60045485101561121f5760405162461bcd60e51b815260040161084a9061272e565b34851461123e5760405162461bcd60e51b815260040161084a90612774565b336001600160a01b038716146112b15760405162461bcd60e51b815260206004820152603260248201527f526577617264526f757465723a206163636f756e742073686f756c642062652060448201527139b0b6b29030b99036b9b39739b2b73232b960711b606482015260840161084a565b6002546040516370a0823160e01b81526001600160a01b038881166004830152859216906370a0823190602401602060405180830381865afa1580156112fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131f91906126dc565b101561136d5760405162461bcd60e51b815260206004820152601860248201527f526577617264526f757465723a20696e73756666204c4c500000000000000000604482015260640161084a565b6001600160a01b03861660009081526007602052604081205490611391888361214d565b905061139e8260016127d3565b600760008a6001600160a01b03166001600160a01b031681526020019081526020016000208190555060006040518060c001604052808a6001600160a01b03168152602001878152602001886001600160a01b03168152602001868152602001856001600160a01b03168152602001898152509050806009600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015560808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050155905050600c829080600181540180825580915050600190039060005260206000200160009091909190915055886001600160a01b03167fac0d6b7d4c519f3e82e78a6df78c4275349679c06ff6c0cbe7ef2245f2d225fc8760405161153391815260200190565b60405180910390a2505050505050505050565b6001546001600160a01b031633146115705760405162461bcd60e51b815260040161084a9061260e565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6001546001600160a01b031633146115c55760405162461bcd60e51b815260040161084a9061260e565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6115ef611fae565b6000811161163f5760405162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a206c6c70416d6f756e7420746f6f206c6f7700604482015260640161084a565b600a54600254604051631e42d69b60e21b81523360048201819052602482018190526001600160a01b0392831660448301526064820185905292919091169063790b5a6c90608401610c61565b3360009081526005602052604081205460ff16806116a957503330145b6116c55760405162461bcd60e51b815260040161084a9061263d565b600b54600d548181106116db579150610a599050565b818511156116e7578194505b8481101561185e576000600b8281548110611704576117046127e6565b600091825260209091200154604051633a50a3b560e01b8152600481018290526001600160a01b03871660248201529091503090633a50a3b5906044016020604051808303816000875af192505050801561177c575060408051601f3d908101601f1916820190925261177991810190612674565b60015b6117f9576040516302e963f160e01b8152600481018290526001600160a01b038616602482015230906302e963f1906044016020604051808303816000875af19250505080156117e9575060408051601f3d908101601f191682019092526117e691810190612674565b60015b6117f357506116e7565b50611807565b8061180557505061185e565b505b81611811816127fc565b600092835260086020526040832080546001600160a01b031990811682556001820185905560028201805490911690556003810184905560048101849055600501929092555090506116e7565b600d819055949350505050565b6000611875611fae565b600084116118c55760405162461bcd60e51b815260206004820152601d60248201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604482015260640161084a565b6003546040516317eb2a1560e01b815233916000916001600160a01b03909116906317eb2a159061190490859081908c908c908c908c906004016126f5565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194791906126dc565b9050816001600160a01b03167f41115caaff93d0fb3d6d596733e2442429850baef9d556b420e59b096b1ffe758260405161198491815260200190565b60405180910390a29150506119996001600055565b949350505050565b6001546001600160a01b031633146119cb5760405162461bcd60e51b815260040161084a9061260e565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604081205460ff1680611a0a57503330145b611a265760405162461bcd60e51b815260040161084a9061263d565b600083815260096020908152604091829020825160c08101845281546001600160a01b03908116808352600184015494830194909452600283015481169482019490945260038201546060820152600482015490931660808401526005015460a0830152611a98576001915050610a59565b80600001516001600160a01b03167fef06bcb737aaf23cece9d2cf084e7044f7fc556929f7b317e9459301fc5429668260200151604051611adb91815260200190565b60405180910390a25060019392505050565b6000611af7611fae565b600a546040516309f4173d60e11b8152336004820181905260248201819052916001600160a01b0316906313e82e7a906044016020604051808303816000875af1158015611b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6d91906126dc565b915050611b7a6001600055565b90565b6001546001600160a01b03163314611ba75760405162461bcd60e51b815260040161084a9061260e565b600154600160a01b900460ff1615611c0b5760405162461bcd60e51b815260206004820152602160248201527f526577617264526f757465723a20616c726561647920696e697469616c697a656044820152601960fa1b606482015260840161084a565b6001805460ff60a01b1916600160a01b179055600280546001600160a01b039485166001600160a01b0319918216179091556003805493851693821693909317909255600a8054919093169116179055565b6001546001600160a01b03163314611c875760405162461bcd60e51b815260040161084a9061260e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604081205460ff1680611cc657503330145b611ce25760405162461bcd60e51b815260040161084a9061263d565b600c54600e54818110611cf8579150610a599050565b81851115611d04578194505b84811015611e7e576000600c8281548110611d2157611d216127e6565b600091825260209091200154604051631d689dfd60e11b8152600481018290526001600160a01b03871660248201529091503090633ad13bfa906044016020604051808303816000875af1925050508015611d99575060408051601f3d908101601f19168201909252611d9691810190612674565b60015b611e165760405163b241993960e01b8152600481018290526001600160a01b0386166024820152309063b2419939906044016020604051808303816000875af1925050508015611e06575060408051601f3d908101601f19168201909252611e0391810190612674565b60015b611e105750611d04565b50611e24565b80611e22575050611e7e565b505b81611e2e816127fc565b600092835260096020526040832080546001600160a01b03199081168255600182018590556002820180548216905560038201859055600482018054909116905560050192909255509050611d04565b600e819055949350505050565b600c8181548110610abb57600080fd5b6001546001600160a01b03163314611ec55760405162461bcd60e51b815260040161084a9061260e565b6040516336b91f2b60e01b81526001600160a01b0382811660048301528316906336b91f2b90602401600060405180830381600087803b158015611f0857600080fd5b505af11580156111f5573d6000803e3d6000fd5b6001546001600160a01b03163314611f465760405162461bcd60e51b815260040161084a9061260e565b600455565b6040516001600160a01b03831660248201526044810182905261086790849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612194565b600260005403611fd157604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6040516001600160a01b03808516602483015283166044820152606481018290526120109085906323b872dd60e01b90608401611f77565b50505050565b6001600160a01b0386166000908152600660205260408120549061203a888361214d565b90506120478260016127d3565b6001600160a01b03898116600081815260066020908152604080832095909555845160c0810186528381528082018b81528c8616828801908152606083018f8152608084018d815260a085018d81528b8852600887528a882086518154908c166001600160a01b03199182161782559551600180830191909155945160028201805491909c16961695909517909955905160038401555160048301559551600590910155600b805495860181559092527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9909301859055925188815290917f6f0c1e1d0dd3edf10dfe8838209c4930d845b1f29d1cb64019f6198afc69ef2c9101611533565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b60006121e9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122669092919063ffffffff16565b80519091501561086757808060200190518101906122079190612674565b6108675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161084a565b6060611999848460008585843b6122bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161084a565b600080866001600160a01b031685876040516122db9190612839565b60006040518083038185875af1925050503d8060008114612318576040519150601f19603f3d011682016040523d82523d6000602084013e61231d565b606091505b509150915061232d828286612338565b979650505050505050565b60608315612347575081610c09565b8251156123575782518084602001fd5b8160405162461bcd60e51b815260040161084a9190612855565b6001600160a01b0381168114610c9e57600080fd5b60008060006060848603121561239b57600080fd5b83356123a681612371565b925060208401356123b681612371565b929592945050506040919091013590565b600080604083850312156123da57600080fd5b8235915060208301356123ec81612371565b809150509250929050565b60006020828403121561240957600080fd5b8135610c0981612371565b60006020828403121561242657600080fd5b5035919050565b60008060006060848603121561244257600080fd5b8335925060208401359150604084013561245b81612371565b809150509250925092565b60008060008060008060c0878903121561247f57600080fd5b863561248a81612371565b95506020870135945060408701356124a181612371565b959894975094956060810135955060808101359460a0909101359350915050565b60008060008060008060c087890312156124db57600080fd5b86356124e681612371565b95506020870135945060408701356124fd81612371565b9350606087013592506080870135915060a087013561251b81612371565b809150509295509295509295565b8015158114610c9e57600080fd5b6000806040838503121561254a57600080fd5b823561255581612371565b915060208301356123ec81612529565b6000806000806080858703121561257b57600080fd5b843561258681612371565b966020860135965060408601359560600135945092505050565b6000806000606084860312156125b557600080fd5b83356125c081612371565b925060208401356125d081612371565b9150604084013561245b81612371565b600080604083850312156125f357600080fd5b82356125fe81612371565b915060208301356123ec81612371565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b60208082526018908201527f526577617264526f757465723a204e6f74206b65657065720000000000000000604082015260600190565b60006020828403121561268657600080fd5b8151610c0981612529565b6020808252602b908201527f4661696c656420746f2073656e64206d696e7420657865637574696f6e20666560408201526a32903a379035b2b2b832b960a91b606082015260800190565b6000602082840312156126ee57600080fd5b5051919050565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b60208082526026908201527f526577617264526f757465723a204e6f7420656e6f75676820657865637574696040820152656f6e2066656560d01b606082015260800190565b60208082526029908201527f526577617264526f757465723a20657865637574696f6e2066656520646f65736040820152680dc4ee840dac2e8c6d60bb1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a5957610a596127bd565b634e487b7160e01b600052603260045260246000fd5b60006001820161280e5761280e6127bd565b5060010190565b60005b83811015612830578181015183820152602001612818565b50506000910152565b6000825161284b818460208701612815565b9190910192915050565b6020815260008251806020840152612874816040850160208701612815565b601f01601f1916919091016040019291505056fea264697066735822122077f47cc471b611a71849e9641b7f50d9d66533242f584831ac14fc8c48b04c3864736f6c63430008130033

Deployed Bytecode Sourcemap

37956:11762:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38566:37;;;;;;;;;;-1:-1:-1;38566:37:0;;;;-1:-1:-1;;;;;38566:37:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;38566:37:0;;;;;;;;40344:156;;;;;;;;;;-1:-1:-1;40344:156:0;;;;;:::i;:::-;;:::i;:::-;;47538:636;;;;;;;;;;-1:-1:-1;47538:636:0;;;;;:::i;:::-;;:::i;:::-;;;1312:14:1;;1305:22;1287:41;;1275:2;1260:18;47538:636:0;1147:187:1;39925:76:0;;;;;;;;;;-1:-1:-1;39925:76:0;;;;;:::i;:::-;;:::i;38420:65::-;;;;;;;;;;-1:-1:-1;38420:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38420:65:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2119:15:1;;;2101:34;;2166:2;2151:18;;2144:34;;;;2214:15;;;;2194:18;;;2187:43;;;;2261:2;2246:18;;2239:34;2304:3;2289:19;;2282:35;2081:3;2333:19;;2326:35;;;;2050:3;2035:19;38420:65:0;1776:591:1;38610:36:0;;;;;;;;;;-1:-1:-1;38610:36:0;;;;;:::i;:::-;;:::i;:::-;;;2703:25:1;;;2691:2;2676:18;38610:36:0;2557:177:1;31690:18:0;;;;;;;;;;-1:-1:-1;31690:18:0;;;;-1:-1:-1;;;;;31690:18:0;;;38492:65;;;;;;;;;;-1:-1:-1;38492:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38492:65:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3082:15:1;;;3064:34;;3129:2;3114:18;;3107:34;;;;3177:15;;;3157:18;;;3150:43;;;;3224:2;3209:18;;3202:34;;;;3273:15;;;3267:3;3252:19;;3245:44;3044:3;3305:19;;3298:35;;;;3013:3;2998:19;38492:65:0;2739:600:1;38369:44:0;;;;;;;;;;-1:-1:-1;38369:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;40955:434;;;;;;;;;;-1:-1:-1;40955:434:0;;;;;:::i;:::-;;:::i;38106:25::-;;;;;;;;;;-1:-1:-1;38106:25:0;;;;-1:-1:-1;;;38106:25:0;;;;;;41669:194;;;;;;;;;;-1:-1:-1;41669:194:0;;;;;:::i;:::-;;:::i;46718:812::-;;;;;;;;;;-1:-1:-1;46718:812:0;;;;;:::i;:::-;;:::i;48182:714::-;;;;;;;;;;-1:-1:-1;48182:714:0;;;;;:::i;:::-;;:::i;42074:601::-;;;;;;:::i;:::-;;:::i;49409:109::-;;;;;;;;;;-1:-1:-1;49484:19:0;:26;49409:109;;43298:978;;;;;;:::i;:::-;;:::i;38232:30::-;;;;;;;;;;;;;;;;40141:121;;;;;;;;;;-1:-1:-1;40141:121:0;;;;;:::i;:::-;;:::i;38269:40::-;;;;;;;;;;-1:-1:-1;38269:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39689:116;;;;;;;;;;-1:-1:-1;39689:116:0;;;;;:::i;:::-;;:::i;41397:264::-;;;;;;;;;;-1:-1:-1;41397:264:0;;;;;:::i;:::-;;:::i;38140:18::-;;;;;;;;;;-1:-1:-1;38140:18:0;;;;-1:-1:-1;;;;;38140:18:0;;;38200:25;;;;;;;;;;-1:-1:-1;38200:25:0;;;;-1:-1:-1;;;;;38200:25:0;;;44473:1113;;;;;;;;;;-1:-1:-1;44473:1113:0;;;;;:::i;:::-;;:::i;40508:439::-;;;;;;;;;;-1:-1:-1;40508:439:0;;;;;:::i;:::-;;:::i;38318:44::-;;;;;;;;;;-1:-1:-1;38318:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;39813:104;;;;;;;;;;-1:-1:-1;39813:104:0;;;;;:::i;:::-;;:::i;48904:382::-;;;;;;;;;;-1:-1:-1;48904:382:0;;;;;:::i;:::-;;:::i;41871:195::-;;;;;;;;;;;;;:::i;39196:337::-;;;;;;;;;;-1:-1:-1;39196:337:0;;;;;:::i;:::-;;:::i;38741:38::-;;;;;;;;;;;;;;;;31883:76;;;;;;;;;;-1:-1:-1;31883:76:0;;;;;:::i;:::-;;:::i;45595:1114::-;;;;;;;;;;-1:-1:-1;45595:1114:0;;;;;:::i;:::-;;:::i;38653:36::-;;;;;;;;;;-1:-1:-1;38653:36:0;;;;;:::i;:::-;;:::i;49526:189::-;;;;;;;;;;-1:-1:-1;49526:189:0;;;;;:::i;:::-;;:::i;38696:38::-;;;;;;;;;;;;;;;;40009:124;;;;;;;;;;-1:-1:-1;40009:124:0;;;;;:::i;:::-;;:::i;49294:109::-;;;;;;;;;;-1:-1:-1;49369:19:0;:26;49294:109;;40344:156;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;;;;;;;;;40446:46:::1;-1:-1:-1::0;;;;;40446:27:0;::::1;40474:8:::0;40484:7;40446:27:::1;:46::i;:::-;40344:156:::0;;;:::o;47538:636::-;39590:10;47641:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;47658:46:::1;47707:24:::0;;;:12:::1;:24;::::0;;;;;;;;47658:73;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;47658:73:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;47742:75:::1;;47801:4;47794:11;;;;;47742:75;47834:27;::::0;;::::1;::::0;47872:19;;47893:18:::1;::::0;::::1;::::0;47827:85;;-1:-1:-1;;;47827:85:0;;-1:-1:-1;;;;;8440:32:1;;;47827:85:0::1;::::0;::::1;8422:51:1::0;8489:18;;;8482:34;;;;47827:44:0::1;::::0;::::1;::::0;8395:18:1;;47827:85:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;47967:24:0::1;::::0;::::1;::::0;47943:53:::1;::::0;47924:12:::1;::::0;-1:-1:-1;;;;;47943:16:0;::::1;::::0;47924:12;47943:53;47924:12;47943:53;47967:24;47943:16;:53:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47923:73;;;48015:7;48007:63;;;;-1:-1:-1::0;;;48007:63:0::1;;;;;;;:::i;:::-;48104:11;:19;;;-1:-1:-1::0;;;;;48086:58:0::1;;48125:11;:18;;;48086:58;;;;2703:25:1::0;;2691:2;2676:18;;2557:177;48086:58:0::1;;;;;;;;48162:4;48155:11;;;;39672:1;47538:636:::0;;;;:::o;39925:76::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;39983:3:::1;:10:::0;;-1:-1:-1;;;;;;39983:10:0::1;-1:-1:-1::0;;;;;39983:10:0;;;::::1;::::0;;;::::1;::::0;;39925:76::o;38610:36::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38610:36:0;:::o;40955:434::-;41059:7;5244:21;:19;:21::i;:::-;41100:1:::1;41087:10;:14;41079:59;;;::::0;-1:-1:-1;;;41079:59:0;;9601:2:1;41079:59:0::1;::::0;::::1;9583:21:1::0;;;9620:18;;;9613:30;9679:34;9659:18;;;9652:62;9731:18;;41079:59:0::1;9399:356:1::0;41079:59:0::1;41222:10;::::0;41210:98:::1;::::0;-1:-1:-1;;;41210:98:0;;41169:10:::1;41210:98;::::0;::::1;10057:34:1::0;;;-1:-1:-1;;;;;10127:15:1;;;10107:18;;;10100:43;10159:18;;;10152:34;;;10202:18;;;10195:34;;;10245:19;;;10238:44;;;41169:10:0;;41151:15:::1;::::0;41222:10;::::1;::::0;41210:49:::1;::::0;9991:19:1;;41210:98:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41190:118;;41332:7;-1:-1:-1::0;;;;;41324:28:0::1;;41341:10;41324:28;;;;2703:25:1::0;;2691:2;2676:18;;2557:177;41324:28:0::1;;;;;;;;41372:9:::0;-1:-1:-1;;5288:20:0;4577:1;5833:7;:22;5650:213;5288:20;40955:434;;;;;:::o;41669:194::-;5244:21;:19;:21::i;:::-;41792:13:::1;::::0;41834:3:::1;::::0;41777:78:::1;::::0;-1:-1:-1;;;41777:78:0;;41756:10:::1;41777:78;::::0;::::1;10751:34:1::0;;;-1:-1:-1;;;;;41834:3:0;;::::1;10801:18:1::0;;;10794:43;10853:18;;;10846:34;;;10896:18;;;10889:43;;;41756:10:0;41792:13;;;::::1;::::0;41777:47:::1;::::0;10685:19:1;;41777:78:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41727:136;5288:20:::0;4577:1;5833:7;:22;5650:213;5288:20;41669:194;:::o;46718:812::-;39590:10;46822:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;46839:46:::1;46888:24:::0;;;:12:::1;:24;::::0;;;;;;;;46839:73;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;46839:73:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;46923:75:::1;;46982:4;46975:11;;;;;46923:75;47015:27;::::0;;::::1;::::0;47052:10:::1;::::0;47064:18:::1;::::0;::::1;::::0;47008:75;;-1:-1:-1;;;47008:75:0;;-1:-1:-1;;;;;47052:10:0;;::::1;47008:75;::::0;::::1;8422:51:1::0;8489:18;;;8482:34;;;;47008:43:0::1;::::0;::::1;::::0;8395:18:1;;47008:75:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;47126:10:0::1;::::0;47176:19;;47197:27:::1;::::0;;::::1;::::0;47226:18:::1;::::0;::::1;::::0;47246:19:::1;::::0;::::1;::::0;47114:173;;-1:-1:-1;;;47114:173:0;;47094:17:::1;::::0;-1:-1:-1;;;;;47126:10:0::1;::::0;47114:46:::1;::::0;:173:::1;::::0;47169:4:::1;::::0;47176:19;;47197:27;;47226:18;47246:19;;;47114:173:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47311:19:::0;;47303:39:::1;::::0;2703:25:1;;;47094:193:0;;-1:-1:-1;;;;;;47303:39:0::1;::::0;::::1;::::0;2691:2:1;2676:18;47303:39:0::1;;;;;;;47354:12;47373:11;-1:-1:-1::0;;;;;47373:16:0::1;47397:11;:24;;;47373:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47353:73;;;47445:7;47437:63;;;;-1:-1:-1::0;;;47437:63:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;47518:4:0::1;::::0;46718:812;-1:-1:-1;;;;;46718:812:0:o;48182:714::-;39590:10;48286:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;48303:46:::1;48352:24:::0;;;:12:::1;:24;::::0;;;;;;;;48303:73;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;48303:73:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;;::::0;;;;;48387:75:::1;;48446:4;48439:11;;;;;48387:75;48504:10;::::0;48542:19;;48563:27:::1;::::0;;::::1;::::0;48592:18:::1;::::0;::::1;::::0;48612::::1;::::0;::::1;::::0;48632:20:::1;::::0;::::1;::::0;48492:161;;-1:-1:-1;;;48492:161:0;;-1:-1:-1;;;;;10075:15:1;;;48492:161:0::1;::::0;::::1;10057:34:1::0;10127:15;;;10107:18;;;10100:43;10159:18;;;10152:34;;;;10202:18;;;10195:34;10266:15;;;10245:19;;;10238:44;48472:17:0::1;::::0;48504:10;;;::::1;::::0;48492:49:::1;::::0;9991:19:1;;48492:161:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48677:19:::0;;48669:39:::1;::::0;2703:25:1;;;48472:181:0;;-1:-1:-1;;;;;;48669:39:0::1;::::0;::::1;::::0;2691:2:1;2676:18;48669:39:0::1;;;;;;;48720:12;48739:11;-1:-1:-1::0;;;;;48739:16:0::1;48763:11;:24;;;48739:53;;;8777:205:1::0;42074:601:0;42255:15;;42239:12;:31;;42231:82;;;;-1:-1:-1;;;42231:82:0;;;;;;;:::i;:::-;42348:9;42332:12;:25;42324:79;;;;-1:-1:-1;;;42324:79:0;;;;;;;:::i;:::-;42434:10;;42422:48;;-1:-1:-1;;;42422:48:0;;-1:-1:-1;;;;;178:32:1;;;42422:48:0;;;160:51:1;42434:10:0;;;;42422:41;;133:18:1;;42422:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42414:96;;;;-1:-1:-1;;;42414:96:0;;12567:2:1;42414:96:0;;;12549:21:1;12606:2;12586:18;;;12579:30;12645:34;12625:18;;;12618:62;-1:-1:-1;;;12696:18:1;;;12689:33;12739:19;;42414:96:0;12365:399:1;42414:96:0;42521:62;-1:-1:-1;;;;;42521:30:0;;42552:7;42569:4;42576:6;42521:30;:62::i;:::-;42594:73;42613:7;42622:12;42636:5;42643:6;42651:7;42660:6;42594:18;:73::i;:::-;42074:601;;;;;;:::o;43298:978::-;43480:15;;43464:12;:31;;43456:82;;;;-1:-1:-1;;;43456:82:0;;;;;;;:::i;:::-;43573:9;43557:12;:25;43549:79;;;;-1:-1:-1;;;43549:79:0;;;;;;;:::i;:::-;43647:10;-1:-1:-1;;;;;43647:19:0;;;43639:82;;;;-1:-1:-1;;;43639:82:0;;12971:2:1;43639:82:0;;;12953:21:1;13010:2;12990:18;;;12983:30;13049:34;13029:18;;;13022:62;-1:-1:-1;;;13100:18:1;;;13093:48;13158:19;;43639:82:0;12769:414:1;43639:82:0;43747:3;;43740:30;;-1:-1:-1;;;43740:30:0;;-1:-1:-1;;;;;178:32:1;;;43740:30:0;;;160:51:1;43774:6:0;;43747:3;;43740:21;;133:18:1;;43740:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;43732:76;;;;-1:-1:-1;;;43732:76:0;;13390:2:1;43732:76:0;;;13372:21:1;13429:2;13409:18;;;13402:30;13468:26;13448:18;;;13441:54;13512:18;;43732:76:0;13188:348:1;43732:76:0;-1:-1:-1;;;;;43840:23:0;;43819:18;43840:23;;;:14;:23;;;;;;;43895:34;43855:7;43840:23;43895:13;:34::i;:::-;43874:55;-1:-1:-1;43966:13:0;:10;43978:1;43966:13;:::i;:::-;43940:14;:23;43955:7;-1:-1:-1;;;;;43940:23:0;-1:-1:-1;;;;;43940:23:0;;;;;;;;;;;;:39;;;;43990:46;44039:83;;;;;;;;44067:7;-1:-1:-1;;;;;44039:83:0;;;;;44076:6;44039:83;;;;44084:5;-1:-1:-1;;;;;44039:83:0;;;;;44091:6;44039:83;;;;44099:8;-1:-1:-1;;;;;44039:83:0;;;;;44109:12;44039:83;;;43990:132;;44160:11;44133:12;:24;44146:10;44133:24;;;;;;;;;;;:38;;;;;;;;;;;;;-1:-1:-1;;;;;44133:38:0;;;;;-1:-1:-1;;;;;44133:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44133:38:0;;;;;-1:-1:-1;;;;;44133:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44133:38:0;;;;;-1:-1:-1;;;;;44133:38:0;;;;;;;;;;;;;;;;;44182:19;44207:10;44182:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44252:7;-1:-1:-1;;;;;44234:34:0;;44261:6;44234:34;;;;2703:25:1;;2691:2;2676:18;;2557:177;44234:34:0;;;;;;;;43445:831;;;43298:978;;;;;;:::o;40141:121::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40226:19:0;;;::::1;;::::0;;;:8:::1;:19;::::0;;;;:28;;-1:-1:-1;;40226:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40141:121::o;39689:116::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;39767:13:::1;:30:::0;;-1:-1:-1;;;;;;39767:30:0::1;-1:-1:-1::0;;;;;39767:30:0;;;::::1;::::0;;;::::1;::::0;;39689:116::o;41397:264::-;5244:21;:19;:21::i;:::-;41487:1:::1;41475:9;:13;41467:57;;;::::0;-1:-1:-1;;;41467:57:0;;14005:2:1;41467:57:0::1;::::0;::::1;13987:21:1::0;14044:2;14024:18;;;14017:30;14083:33;14063:18;;;14056:61;14134:18;;41467:57:0::1;13803:355:1::0;41467:57:0::1;41589:13;::::0;41638:3:::1;::::0;41574:79:::1;::::0;-1:-1:-1;;;41574:79:0;;41553:10:::1;41574:79;::::0;::::1;14432:34:1::0;;;14482:18;;;14475:43;;;-1:-1:-1;;;;;41638:3:0;;::::1;14534:18:1::0;;;14527:43;14586:18;;;14579:34;;;41553:10:0;41589:13;;;::::1;::::0;41574:45:::1;::::0;14366:19:1;;41574:79:0::1;14163:456:1::0;44473:1113:0;39590:10;44575:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;44610:19:::1;:26:::0;44663:23:::1;::::0;44700:16;;::::1;44697:59;;44739:5:::0;-1:-1:-1;44732:12:0::1;::::0;-1:-1:-1;44732:12:0::1;44697:59;44780:7;44771:8;:16;44768:65;;;44814:7;44803:18;;44768:65;44855:8;44849:5;:14;44843:671;;;44879:18;44900:19;44920:5;44900:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;44962:49:::1;::::0;-1:-1:-1;;;44962:49:0;;::::1;::::0;::::1;14946:25:1::0;;;-1:-1:-1;;;;;15007:32:1;;14987:18;;;14980:60;44900:26:0;;-1:-1:-1;44962:4:0::1;::::0;:24:::1;::::0;14919:18:1;;44962:49:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;44962:49:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;44962:49:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;44941:494;;45203:48;::::0;-1:-1:-1;;;45203:48:0;;::::1;::::0;::::1;14946:25:1::0;;;-1:-1:-1;;;;;15007:32:1;;14987:18;;;14980:60;45203:4:0::1;::::0;:23:::1;::::0;14919:18:1;;45203:48:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;45203:48:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;45203:48:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;45178:242;;45392:8;;;45178:242;45269:93;44941:494;;;45075:12;45070:67;;45112:5;;;;45070:67;45025:127;44941:494;45449:7:::0;::::1;::::0;::::1;:::i;:::-;45478:24;::::0;;;:12:::1;:24;::::0;;;;45471:31;;-1:-1:-1;;;;;;45471:31:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;-1:-1:-1;45449:7:0;-1:-1:-1;44843:671:0::1;;;45524:23;:31:::0;;;;44473:1113;-1:-1:-1;;;;44473:1113:0:o;40508:439::-;40624:7;5244:21;:19;:21::i;:::-;40662:1:::1;40652:7;:11;40644:53;;;::::0;-1:-1:-1;;;40644:53:0;;15393:2:1;40644:53:0::1;::::0;::::1;15375:21:1::0;15432:2;15412:18;;;15405:30;15471:31;15451:18;;;15444:59;15520:18;;40644:53:0::1;15191:353:1::0;40644:53:0::1;40781:10;::::0;40769:100:::1;::::0;-1:-1:-1;;;40769:100:0;;40728:10:::1;::::0;40710:15:::1;::::0;-1:-1:-1;;;;;40781:10:0;;::::1;::::0;40769:46:::1;::::0;:100:::1;::::0;40728:10;;;;40834:6;;40842:7;;40851:8;;40861:7;;40769:100:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40749:120;;40893:7;-1:-1:-1::0;;;;;40885:27:0::1;;40902:9;40885:27;;;;2703:25:1::0;;2691:2;2676:18;;2557:177;40885:27:0::1;;;;;;;;40930:9:::0;-1:-1:-1;;5288:20:0;4577:1;5833:7;:22;5650:213;5288:20;40508:439;;;;;;:::o;39813:104::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;39885:10:::1;:24:::0;;-1:-1:-1;;;;;;39885:24:0::1;-1:-1:-1::0;;;;;39885:24:0;;;::::1;::::0;;;::::1;::::0;;39813:104::o;48904:382::-;39590:10;49007:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;49024:46:::1;49073:24:::0;;;:12:::1;:24;::::0;;;;;;;;49024:73;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;49024:73:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;;::::0;;;;;49108:75:::1;;49167:4;49160:11;;;;;49108:75;49216:11;:19;;;-1:-1:-1::0;;;;;49198:58:0::1;;49237:11;:18;;;49198:58;;;;2703:25:1::0;;2691:2;2676:18;;2557:177;49198:58:0::1;;;;;;;;-1:-1:-1::0;49274:4:0::1;::::0;48904:382;-1:-1:-1;;;48904:382:0:o;41871:195::-;41930:7;5244:21;:19;:21::i;:::-;42010:13:::1;::::0;41995:63:::1;::::0;-1:-1:-1;;;41995:63:0;;41967:10:::1;41995:63;::::0;::::1;15761:34:1::0;;;15811:18;;;15804:43;;;41967:10:0;-1:-1:-1;;;;;42010:13:0::1;::::0;41995:45:::1;::::0;15696:18:1;;41995:63:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41988:70;;;5288:20:::0;4577:1;5833:7;:22;5650:213;5288:20;41871:195;:::o;39196:337::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;39346:13:::1;::::0;-1:-1:-1;;;39346:13:0;::::1;;;39345:14;39337:60;;;::::0;-1:-1:-1;;;39337:60:0;;16060:2:1;39337:60:0::1;::::0;::::1;16042:21:1::0;16099:2;16079:18;;;16072:30;16138:34;16118:18;;;16111:62;-1:-1:-1;;;16189:18:1;;;16182:31;16230:19;;39337:60:0::1;15858:397:1::0;39337:60:0::1;39424:4;39408:20:::0;;-1:-1:-1;;;;39408:20:0::1;-1:-1:-1::0;;;39408:20:0::1;::::0;;39439:3:::1;:10:::0;;-1:-1:-1;;;;;39439:10:0;;::::1;-1:-1:-1::0;;;;;;39439:10:0;;::::1;;::::0;;;39460::::1;:24:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;39495:13:::1;:30:::0;;;;;::::1;::::0;::::1;;::::0;;39196:337::o;31883:76::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;31941:3:::1;:10:::0;;-1:-1:-1;;;;;;31941:10:0::1;-1:-1:-1::0;;;;;31941:10:0;;;::::1;::::0;;;::::1;::::0;;31883:76::o;45595:1114::-;39590:10;45698:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;45733:19:::1;:26:::0;45786:23:::1;::::0;45823:16;;::::1;45820:59;;45862:5:::0;-1:-1:-1;45855:12:0::1;::::0;-1:-1:-1;45855:12:0::1;45820:59;45903:7;45894:8;:16;45891:65;;;45937:7;45926:18;;45891:65;45978:8;45972:5;:14;45966:671;;;46002:18;46023:19;46043:5;46023:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;46085:49:::1;::::0;-1:-1:-1;;;46085:49:0;;::::1;::::0;::::1;14946:25:1::0;;;-1:-1:-1;;;;;15007:32:1;;14987:18;;;14980:60;46023:26:0;;-1:-1:-1;46085:4:0::1;::::0;:24:::1;::::0;14919:18:1;;46085:49:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;46085:49:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;46085:49:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;46064:494;;46326:48;::::0;-1:-1:-1;;;46326:48:0;;::::1;::::0;::::1;14946:25:1::0;;;-1:-1:-1;;;;;15007:32:1;;14987:18;;;14980:60;46326:4:0::1;::::0;:23:::1;::::0;14919:18:1;;46326:48:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;46326:48:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;46326:48:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;46301:242;;46515:8;;;46301:242;46392:93;46064:494;;;46198:12;46193:67;;46235:5;;;;46193:67;46148:127;46064:494;46572:7:::0;::::1;::::0;::::1;:::i;:::-;46601:24;::::0;;;:12:::1;:24;::::0;;;;46594:31;;-1:-1:-1;;;;;;46594:31:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;;::::0;;;;-1:-1:-1;46572:7:0;-1:-1:-1;45966:671:0::1;;;46647:23;:31:::0;;;;45595:1114;-1:-1:-1;;;;45595:1114:0:o;38653:36::-;;;;;;;;;;;;49526:189;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;49635:72:::1;::::0;-1:-1:-1;;;49635:72:0;;-1:-1:-1;;;;;178:32:1;;;49635:72:0::1;::::0;::::1;160:51:1::0;49635:56:0;::::1;::::0;::::1;::::0;133:18:1;;49635:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;40009:124:::0;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;40091:15:::1;:34:::0;40009:124::o;34840:177::-;34950:58;;-1:-1:-1;;;;;8440:32:1;;34950:58:0;;;8422:51:1;8489:18;;;8482:34;;;34923:86:0;;34943:5;;-1:-1:-1;;;34973:23:0;8395:18:1;;34950:58:0;;;;-1:-1:-1;;34950:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34950:58:0;-1:-1:-1;;;;;;34950:58:0;;;;;;;;;;34923:19;:86::i;5324:318::-;4621:1;5454:7;;:19;5450:89;;5497:30;;-1:-1:-1;;;5497:30:0;;;;;;;;;;;5450:89;4621:1;5616:7;:18;5324:318::o;35025:205::-;35153:68;;-1:-1:-1;;;;;16518:15:1;;;35153:68:0;;;16500:34:1;16570:15;;16550:18;;;16543:43;16602:18;;;16595:34;;;35126:96:0;;35146:5;;-1:-1:-1;;;35176:27:0;16435:18:1;;35153:68:0;16260:375:1;35126:96:0;35025:205;;;;:::o;42683:607::-;-1:-1:-1;;;;;42855:23:0;;42834:18;42855:23;;;:14;:23;;;;;;;42910:34;42870:7;42855:23;42910:13;:34::i;:::-;42889:55;-1:-1:-1;42981:13:0;:10;42993:1;42981:13;:::i;:::-;-1:-1:-1;;;;;42955:23:0;;;;;;;:14;:23;;;;;;;;:39;;;;43054:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43147:24;;;:12;:24;;;;;:38;;;;;;;-1:-1:-1;;;;;;43147:38:0;;;;;;;;-1:-1:-1;43147:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43196:19;:36;;;;;;;;;;;;;;;;;43248:34;;2703:25:1;;;42955:23:0;;43248:34;;2676:18:1;43248:34:0;2557:177:1;44284:181:0;44424:32;;-1:-1:-1;;16817:2:1;16813:15;;;16809:53;44424:32:0;;;16797:66:1;16879:12;;;16872:28;;;44387:7:0;;16916:12:1;;44424:32:0;;;;;;;;;;;;44414:43;;;;;;44407:50;;44284:181;;;;:::o;37094:761::-;37518:23;37544:69;37572:4;37544:69;;;;;;;;;;;;;;;;;37552:5;-1:-1:-1;;;;;37544:27:0;;;:69;;;;;:::i;:::-;37628:17;;37518:95;;-1:-1:-1;37628:21:0;37624:224;;37770:10;37759:30;;;;;;;;;;;;:::i;:::-;37751:85;;;;-1:-1:-1;;;37751:85:0;;17141:2:1;37751:85:0;;;17123:21:1;17180:2;17160:18;;;17153:30;17219:34;17199:18;;;17192:62;-1:-1:-1;;;17270:18:1;;;17263:40;17320:19;;37751:85:0;16939:406:1;9834:195:0;9937:12;9969:52;9991:6;9999:4;10005:1;10008:12;9937;7283:20;;11130:60;;;;-1:-1:-1;;;11130:60:0;;17959:2:1;11130:60:0;;;17941:21:1;17998:2;17978:18;;;17971:30;18037:31;18017:18;;;18010:59;18086:18;;11130:60:0;17757:353:1;11130:60:0;11264:12;11278:23;11305:6;-1:-1:-1;;;;;11305:11:0;11325:5;11333:4;11305:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11263:75;;;;11356:52;11374:7;11383:10;11395:12;11356:17;:52::i;:::-;11349:59;10886:530;-1:-1:-1;;;;;;;10886:530:0:o;13426:742::-;13541:12;13570:7;13566:595;;;-1:-1:-1;13601:10:0;13594:17;;13566:595;13715:17;;:21;13711:439;;13978:10;13972:17;14039:15;14026:10;14022:2;14018:19;14011:44;13711:439;14121:12;14114:20;;-1:-1:-1;;;14114:20:0;;;;;;;;:::i;222:131:1:-;-1:-1:-1;;;;;297:31:1;;287:42;;277:70;;343:1;340;333:12;358:456;435:6;443;451;504:2;492:9;483:7;479:23;475:32;472:52;;;520:1;517;510:12;472:52;559:9;546:23;578:31;603:5;578:31;:::i;:::-;628:5;-1:-1:-1;685:2:1;670:18;;657:32;698:33;657:32;698:33;:::i;:::-;358:456;;750:7;;-1:-1:-1;;;804:2:1;789:18;;;;776:32;;358:456::o;819:323::-;895:6;903;956:2;944:9;935:7;931:23;927:32;924:52;;;972:1;969;962:12;924:52;1008:9;995:23;985:33;;1068:2;1057:9;1053:18;1040:32;1081:31;1106:5;1081:31;:::i;:::-;1131:5;1121:15;;;819:323;;;;;:::o;1339:247::-;1398:6;1451:2;1439:9;1430:7;1426:23;1422:32;1419:52;;;1467:1;1464;1457:12;1419:52;1506:9;1493:23;1525:31;1550:5;1525:31;:::i;1591:180::-;1650:6;1703:2;1691:9;1682:7;1678:23;1674:32;1671:52;;;1719:1;1716;1709:12;1671:52;-1:-1:-1;1742:23:1;;1591:180;-1:-1:-1;1591:180:1:o;3526:383::-;3603:6;3611;3619;3672:2;3660:9;3651:7;3647:23;3643:32;3640:52;;;3688:1;3685;3678:12;3640:52;3724:9;3711:23;3701:33;;3781:2;3770:9;3766:18;3753:32;3743:42;;3835:2;3824:9;3820:18;3807:32;3848:31;3873:5;3848:31;:::i;:::-;3898:5;3888:15;;;3526:383;;;;;:::o;3914:663::-;4018:6;4026;4034;4042;4050;4058;4111:3;4099:9;4090:7;4086:23;4082:33;4079:53;;;4128:1;4125;4118:12;4079:53;4167:9;4154:23;4186:31;4211:5;4186:31;:::i;:::-;4236:5;-1:-1:-1;4288:2:1;4273:18;;4260:32;;-1:-1:-1;4344:2:1;4329:18;;4316:32;4357:33;4316:32;4357:33;:::i;:::-;3914:663;;;;-1:-1:-1;4409:7:1;;4463:2;4448:18;;4435:32;;-1:-1:-1;4514:3:1;4499:19;;4486:33;;4566:3;4551:19;;;4538:33;;-1:-1:-1;3914:663:1;-1:-1:-1;;3914:663:1:o;4582:736::-;4686:6;4694;4702;4710;4718;4726;4779:3;4767:9;4758:7;4754:23;4750:33;4747:53;;;4796:1;4793;4786:12;4747:53;4835:9;4822:23;4854:31;4879:5;4854:31;:::i;:::-;4904:5;-1:-1:-1;4956:2:1;4941:18;;4928:32;;-1:-1:-1;5012:2:1;4997:18;;4984:32;5025:33;4984:32;5025:33;:::i;:::-;5077:7;-1:-1:-1;5131:2:1;5116:18;;5103:32;;-1:-1:-1;5182:3:1;5167:19;;5154:33;;-1:-1:-1;5239:3:1;5224:19;;5211:33;5253;5211;5253;:::i;:::-;5305:7;5295:17;;;4582:736;;;;;;;;:::o;5323:118::-;5409:5;5402:13;5395:21;5388:5;5385:32;5375:60;;5431:1;5428;5421:12;5446:382;5511:6;5519;5572:2;5560:9;5551:7;5547:23;5543:32;5540:52;;;5588:1;5585;5578:12;5540:52;5627:9;5614:23;5646:31;5671:5;5646:31;:::i;:::-;5696:5;-1:-1:-1;5753:2:1;5738:18;;5725:32;5766:30;5725:32;5766:30;:::i;6161:452::-;6247:6;6255;6263;6271;6324:3;6312:9;6303:7;6299:23;6295:33;6292:53;;;6341:1;6338;6331:12;6292:53;6380:9;6367:23;6399:31;6424:5;6399:31;:::i;:::-;6449:5;6501:2;6486:18;;6473:32;;-1:-1:-1;6552:2:1;6537:18;;6524:32;;6603:2;6588:18;6575:32;;-1:-1:-1;6161:452:1;-1:-1:-1;;;6161:452:1:o;6618:529::-;6695:6;6703;6711;6764:2;6752:9;6743:7;6739:23;6735:32;6732:52;;;6780:1;6777;6770:12;6732:52;6819:9;6806:23;6838:31;6863:5;6838:31;:::i;:::-;6888:5;-1:-1:-1;6945:2:1;6930:18;;6917:32;6958:33;6917:32;6958:33;:::i;:::-;7010:7;-1:-1:-1;7069:2:1;7054:18;;7041:32;7082:33;7041:32;7082:33;:::i;7152:388::-;7220:6;7228;7281:2;7269:9;7260:7;7256:23;7252:32;7249:52;;;7297:1;7294;7287:12;7249:52;7336:9;7323:23;7355:31;7380:5;7355:31;:::i;:::-;7405:5;-1:-1:-1;7462:2:1;7447:18;;7434:32;7475:33;7434:32;7475:33;:::i;7545:345::-;7747:2;7729:21;;;7786:2;7766:18;;;7759:30;-1:-1:-1;;;7820:2:1;7805:18;;7798:51;7881:2;7866:18;;7545:345::o;7895:348::-;8097:2;8079:21;;;8136:2;8116:18;;;8109:30;8175:26;8170:2;8155:18;;8148:54;8234:2;8219:18;;7895:348::o;8527:245::-;8594:6;8647:2;8635:9;8626:7;8622:23;8618:32;8615:52;;;8663:1;8660;8653:12;8615:52;8695:9;8689:16;8714:28;8736:5;8714:28;:::i;8987:407::-;9189:2;9171:21;;;9228:2;9208:18;;;9201:30;9267:34;9262:2;9247:18;;9240:62;-1:-1:-1;;;9333:2:1;9318:18;;9311:41;9384:3;9369:19;;8987:407::o;10293:184::-;10363:6;10416:2;10404:9;10395:7;10391:23;10387:32;10384:52;;;10432:1;10429;10422:12;10384:52;-1:-1:-1;10455:16:1;;10293:184;-1:-1:-1;10293:184:1:o;10943:600::-;-1:-1:-1;;;;;11286:15:1;;;11268:34;;11338:15;;;11333:2;11318:18;;11311:43;11390:15;;;;11385:2;11370:18;;11363:43;11437:2;11422:18;;11415:34;11480:3;11465:19;;11458:35;;;;11248:3;11509:19;;11502:35;;;;11217:3;11202:19;;10943:600::o;11548:402::-;11750:2;11732:21;;;11789:2;11769:18;;;11762:30;11828:34;11823:2;11808:18;;11801:62;-1:-1:-1;;;11894:2:1;11879:18;;11872:36;11940:3;11925:19;;11548:402::o;11955:405::-;12157:2;12139:21;;;12196:2;12176:18;;;12169:30;12235:34;12230:2;12215:18;;12208:62;-1:-1:-1;;;12301:2:1;12286:18;;12279:39;12350:3;12335:19;;11955:405::o;13541:127::-;13602:10;13597:3;13593:20;13590:1;13583:31;13633:4;13630:1;13623:15;13657:4;13654:1;13647:15;13673:125;13738:9;;;13759:10;;;13756:36;;;13772:18;;:::i;14624:127::-;14685:10;14680:3;14676:20;14673:1;14666:31;14716:4;14713:1;14706:15;14740:4;14737:1;14730:15;15051:135;15090:3;15111:17;;;15108:43;;15131:18;;:::i;:::-;-1:-1:-1;15178:1:1;15167:13;;15051:135::o;18115:250::-;18200:1;18210:113;18224:6;18221:1;18218:13;18210:113;;;18300:11;;;18294:18;18281:11;;;18274:39;18246:2;18239:10;18210:113;;;-1:-1:-1;;18357:1:1;18339:16;;18332:27;18115:250::o;18370:287::-;18499:3;18537:6;18531:13;18553:66;18612:6;18607:3;18600:4;18592:6;18588:17;18553:66;:::i;:::-;18635:16;;;;;18370:287;-1:-1:-1;;18370:287:1:o;18662:396::-;18811:2;18800:9;18793:21;18774:4;18843:6;18837:13;18886:6;18881:2;18870:9;18866:18;18859:34;18902:79;18974:6;18969:2;18958:9;18954:18;18949:2;18941:6;18937:15;18902:79;:::i;:::-;19042:2;19021:15;-1:-1:-1;;19017:29:1;19002:45;;;;19049:2;18998:54;;18662:396;-1:-1:-1;;18662:396:1:o

Swarm Source

ipfs://77f47cc471b611a71849e9641b7f50d9d66533242f584831ac14fc8c48b04c38

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.