Contract 0x8ef63770bfa4a8d31768be5e2989a0864624c44d

Contract Overview

Balance:
0 AVAX
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5f73f76c68c8cb0bd90bbe5a28c897b032e8da78b240303e97fd557da01e72280x6080604025955742021-11-18 19:19:30320 days 9 hrs ago0x574366e84f74f2e913ad9a6782ce6ac8022e16eb IN  Create: InsuranceFund0 AVAX0.046064425
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd3b7c27000f916b60d82f5e74ad6ea97700ea30a31f9bf55aed721dbfa5aa6ea143040202022-10-05 4:07:0433 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0xd2051713337a674bb2b7e15f210e48318be4e2e5084b5ad31f3446b57338ead3143039902022-10-05 4:05:5434 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x1dae9939c351013f2176aab7669b5a6749964b8c552e67b683a90f4207510aa2143038202022-10-05 3:59:5040 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x4a480f9eb40148cfc03a026ceec9efc39d0f33700cebd2ac27b19ac4f7d8af99143038152022-10-05 3:59:4041 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x4a480f9eb40148cfc03a026ceec9efc39d0f33700cebd2ac27b19ac4f7d8af99143038152022-10-05 3:59:4041 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0xa6bb2b83aac709c3fc021e9094f7fc63266005af7d56235b611cba5c670a6515143038082022-10-05 3:59:2541 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x279a806a08a76b2d645a7b8cea3302539fe79ed1c1d7763a74ab00ac9f5ea86d143038032022-10-05 3:59:1541 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0xdca7b77611aff7406b281e3185dd1e474aee5805d79c79f7b4dc358554710e5b143037992022-10-05 3:59:0741 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x0f795e2d9ef28865685b6cd2d24c4e439601d5c2cecb6084a1721d6502edc8f3143030312022-10-05 3:24:081 hr 16 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0xf5576564a13c151b8cbe93eeb3c9477d18f1e08f2effd31988be9a7060084e1a143025722022-10-05 3:00:311 hr 40 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x10c66bebd617aa09d430d128e7c94e2dbc8c6d8b856da5ec7007a6dbac5e1d26143025562022-10-05 2:59:581 hr 40 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x7db3389fd2c5b23582a3abf83a2346c26ad390a9f6ce8eab86e61059f4a1f249143025482022-10-05 2:59:421 hr 41 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x02b082827e66fd82b04f625aae9339b02bc28158dfd8d69e04384504b35c290c143025412022-10-05 2:59:281 hr 41 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x57f4a5cfbc4e5e68f4a4d41866232db960c544ab9f924284a655d8e3895c8529143025372022-10-05 2:59:181 hr 41 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x05a64a882435b378938b86303f0c2a0072fda3f0ff608a7e28dfe2935c954490143025322022-10-05 2:59:081 hr 41 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x3b87716c2ec04da493897c59b226a66f2a8e7f119ab4d2ea1b2531e0c3b6552f143011742022-10-05 1:59:532 hrs 40 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0xa089a8870f1c9eb1b196c94f95ad3f8062893e168bff15e0b76cecf8c81759d7143011682022-10-05 1:59:412 hrs 41 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0xa089a8870f1c9eb1b196c94f95ad3f8062893e168bff15e0b76cecf8c81759d7143011682022-10-05 1:59:412 hrs 41 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x4cc251bcd41067d40adc9d795b58ef3b643370a641d9340ff483a072b25ddb54143011602022-10-05 1:59:212 hrs 41 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x91d6cf8947ae269afa5baf70038a4dee5ad834aeb74089df422517bcbf21f95d143011572022-10-05 1:59:152 hrs 41 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0xca11ee6f374ccddbcf714b5c21a89ffac01cc63726469e6d633278732ba51e6e143011542022-10-05 1:59:092 hrs 41 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0xf26acc49b172732df89dbac6b1dc08b711f1e0e645b88493e9c54281aa2fbbb4143008222022-10-05 1:45:382 hrs 55 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x401a9554257a0cc5a15b4b7f886adbfd68bcbc6df3d16f422d57ab42217d020b142998522022-10-05 1:00:373 hrs 40 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0x9252da6d6a61267210cbc9b212839bec35c8019409bfc835085f11508d11e346142998362022-10-05 0:59:593 hrs 40 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
0xb48b179ff7ebee0b553f78839574ae5084172a27c2c200e12edae3e96507ca09142998312022-10-05 0:59:493 hrs 40 mins ago 0x14e852487881dfa47bc05a97d10296de632bc19b0x8ef63770bfa4a8d31768be5e2989a0864624c44d0 AVAX
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InsuranceFund

Compiler Version
v0.6.9+commit.3e3065ac

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.snowtrace.io on 2021-11-18
*/

// File: @openzeppelin/contracts-ethereum-package/contracts/Initializable.sol

pragma solidity >=0.4.24 <0.7.0;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

// File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol



/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract ContextUpgradeSafe is Initializable {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.

    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {


    }


    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }

    uint256[50] private __gap;
}

// File: src/utils/PerpFiOwnableUpgrade.sol

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


// copy from openzeppelin Ownable, only modify how the owner transfer
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract PerpFiOwnableUpgrade is ContextUpgradeSafe {
    address private _owner;
    address private _candidate;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */

    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    function candidate() public view returns (address) {
        return _candidate;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "PerpFiOwnableUpgrade: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Set ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function setOwner(address newOwner) public onlyOwner {
        require(newOwner != address(0), "PerpFiOwnableUpgrade: zero address");
        require(newOwner != _owner, "PerpFiOwnableUpgrade: same as original");
        require(newOwner != _candidate, "PerpFiOwnableUpgrade: same as candidate");
        _candidate = newOwner;
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`_candidate`).
     * Can only be called by the new owner.
     */
    function updateOwner() public {
        require(_candidate != address(0), "PerpFiOwnableUpgrade: candidate is zero address");
        require(_candidate == _msgSender(), "PerpFiOwnableUpgrade: not the new owner");

        emit OwnershipTransferred(_owner, _candidate);
        _owner = _candidate;
        _candidate = address(0);
    }

    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-ethereum-package/contracts/utils/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].
 */
contract ReentrancyGuardUpgradeSafe is Initializable {
    bool private _notEntered;


    function __ReentrancyGuard_init() internal initializer {
        __ReentrancyGuard_init_unchained();
    }

    function __ReentrancyGuard_init_unchained() internal initializer {


        // Storing an initial 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 percetange 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.
        _notEntered = true;

    }


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

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

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

    uint256[49] private __gap;
}

// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol


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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

// File: src/utils/DecimalMath.sol



/// @dev Implements simple fixed point math add, sub, mul and div operations.
/// @author Alberto Cuesta Cañada
library DecimalMath {
    using SafeMath for uint256;

    /// @dev Returns 1 in the fixed point representation, with `decimals` decimals.
    function unit(uint8 decimals) internal pure returns (uint256) {
        return 10**uint256(decimals);
    }

    /// @dev Adds x and y, assuming they are both fixed point with 18 decimals.
    function addd(uint256 x, uint256 y) internal pure returns (uint256) {
        return x.add(y);
    }

    /// @dev Subtracts y from x, assuming they are both fixed point with 18 decimals.
    function subd(uint256 x, uint256 y) internal pure returns (uint256) {
        return x.sub(y);
    }

    /// @dev Multiplies x and y, assuming they are both fixed point with 18 digits.
    function muld(uint256 x, uint256 y) internal pure returns (uint256) {
        return muld(x, y, 18);
    }

    /// @dev Multiplies x and y, assuming they are both fixed point with `decimals` digits.
    function muld(
        uint256 x,
        uint256 y,
        uint8 decimals
    ) internal pure returns (uint256) {
        return x.mul(y).div(unit(decimals));
    }

    /// @dev Divides x between y, assuming they are both fixed point with 18 digits.
    function divd(uint256 x, uint256 y) internal pure returns (uint256) {
        return divd(x, y, 18);
    }

    /// @dev Divides x between y, assuming they are both fixed point with `decimals` digits.
    function divd(
        uint256 x,
        uint256 y,
        uint8 decimals
    ) internal pure returns (uint256) {
        return x.mul(unit(decimals)).div(y);
    }
}

// File: src/utils/Decimal.sol




library Decimal {
    using DecimalMath for uint256;
    using SafeMath for uint256;

    struct decimal {
        uint256 d;
    }

    function zero() internal pure returns (decimal memory) {
        return decimal(0);
    }

    function one() internal pure returns (decimal memory) {
        return decimal(DecimalMath.unit(18));
    }

    function toUint(decimal memory x) internal pure returns (uint256) {
        return x.d;
    }

    function modD(decimal memory x, decimal memory y) internal pure returns (decimal memory) {
        return decimal(x.d.mul(DecimalMath.unit(18)) % y.d);
    }

    function cmp(decimal memory x, decimal memory y) internal pure returns (int8) {
        if (x.d > y.d) {
            return 1;
        } else if (x.d < y.d) {
            return -1;
        }
        return 0;
    }

    /// @dev add two decimals
    function addD(decimal memory x, decimal memory y) internal pure returns (decimal memory) {
        decimal memory t;
        t.d = x.d.add(y.d);
        return t;
    }

    /// @dev subtract two decimals
    function subD(decimal memory x, decimal memory y) internal pure returns (decimal memory) {
        decimal memory t;
        t.d = x.d.sub(y.d);
        return t;
    }

    /// @dev multiple two decimals
    function mulD(decimal memory x, decimal memory y) internal pure returns (decimal memory) {
        decimal memory t;
        t.d = x.d.muld(y.d);
        return t;
    }

    /// @dev multiple a decimal by a uint256
    function mulScalar(decimal memory x, uint256 y) internal pure returns (decimal memory) {
        decimal memory t;
        t.d = x.d.mul(y);
        return t;
    }

    /// @dev divide two decimals
    function divD(decimal memory x, decimal memory y) internal pure returns (decimal memory) {
        decimal memory t;
        t.d = x.d.divd(y.d);
        return t;
    }

    /// @dev divide a decimal by a uint256
    function divScalar(decimal memory x, uint256 y) internal pure returns (decimal memory) {
        decimal memory t;
        t.d = x.d.div(y);
        return t;
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/math/SignedSafeMath.sol


/**
 * @title SignedSafeMath
 * @dev Signed math operations with safety checks that revert on error.
 */
library SignedSafeMath {
    int256 constant private _INT256_MIN = -2**255;

    /**
     * @dev Multiplies two signed integers, reverts on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

        int256 c = a * b;
        require(c / a == b, "SignedSafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "SignedSafeMath: division by zero");
        require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

        int256 c = a / b;

        return c;
    }

    /**
     * @dev Subtracts two signed integers, reverts on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

        return c;
    }

    /**
     * @dev Adds two signed integers, reverts on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");

        return c;
    }
}

// File: src/utils/SignedDecimalMath.sol



/// @dev Implements simple signed fixed point math add, sub, mul and div operations.
library SignedDecimalMath {
    using SignedSafeMath for int256;

    /// @dev Returns 1 in the fixed point representation, with `decimals` decimals.
    function unit(uint8 decimals) internal pure returns (int256) {
        return int256(10**uint256(decimals));
    }

    /// @dev Adds x and y, assuming they are both fixed point with 18 decimals.
    function addd(int256 x, int256 y) internal pure returns (int256) {
        return x.add(y);
    }

    /// @dev Subtracts y from x, assuming they are both fixed point with 18 decimals.
    function subd(int256 x, int256 y) internal pure returns (int256) {
        return x.sub(y);
    }

    /// @dev Multiplies x and y, assuming they are both fixed point with 18 digits.
    function muld(int256 x, int256 y) internal pure returns (int256) {
        return muld(x, y, 18);
    }

    /// @dev Multiplies x and y, assuming they are both fixed point with `decimals` digits.
    function muld(
        int256 x,
        int256 y,
        uint8 decimals
    ) internal pure returns (int256) {
        return x.mul(y).div(unit(decimals));
    }

    /// @dev Divides x between y, assuming they are both fixed point with 18 digits.
    function divd(int256 x, int256 y) internal pure returns (int256) {
        return divd(x, y, 18);
    }

    /// @dev Divides x between y, assuming they are both fixed point with `decimals` digits.
    function divd(
        int256 x,
        int256 y,
        uint8 decimals
    ) internal pure returns (int256) {
        return x.mul(unit(decimals)).div(y);
    }
}

// File: src/utils/SignedDecimal.sol





library SignedDecimal {
    using SignedDecimalMath for int256;
    using SignedSafeMath for int256;

    struct signedDecimal {
        int256 d;
    }

    function zero() internal pure returns (signedDecimal memory) {
        return signedDecimal(0);
    }

    function toInt(signedDecimal memory x) internal pure returns (int256) {
        return x.d;
    }

    function isNegative(signedDecimal memory x) internal pure returns (bool) {
        if (x.d < 0) {
            return true;
        }
        return false;
    }

    function abs(signedDecimal memory x) internal pure returns (Decimal.decimal memory) {
        Decimal.decimal memory t;
        if (x.d < 0) {
            t.d = uint256(0 - x.d);
        } else {
            t.d = uint256(x.d);
        }
        return t;
    }

    /// @dev add two decimals
    function addD(signedDecimal memory x, signedDecimal memory y) internal pure returns (signedDecimal memory) {
        signedDecimal memory t;
        t.d = x.d.add(y.d);
        return t;
    }

    /// @dev subtract two decimals
    function subD(signedDecimal memory x, signedDecimal memory y) internal pure returns (signedDecimal memory) {
        signedDecimal memory t;
        t.d = x.d.sub(y.d);
        return t;
    }

    /// @dev multiple two decimals
    function mulD(signedDecimal memory x, signedDecimal memory y) internal pure returns (signedDecimal memory) {
        signedDecimal memory t;
        t.d = x.d.muld(y.d);
        return t;
    }

    /// @dev multiple a signedDecimal by a int256
    function mulScalar(signedDecimal memory x, int256 y) internal pure returns (signedDecimal memory) {
        signedDecimal memory t;
        t.d = x.d.mul(y);
        return t;
    }

    /// @dev divide two decimals
    function divD(signedDecimal memory x, signedDecimal memory y) internal pure returns (signedDecimal memory) {
        signedDecimal memory t;
        t.d = x.d.divd(y.d);
        return t;
    }

    /// @dev divide a signedDecimal by a int256
    function divScalar(signedDecimal memory x, int256 y) internal pure returns (signedDecimal memory) {
        signedDecimal memory t;
        t.d = x.d.div(y);
        return t;
    }
}

// File: src/interface/IAmm.sol

pragma experimental ABIEncoderV2;




interface IAmm {
    /**
     * @notice asset direction, used in getInputPrice, getOutputPrice, swapInput and swapOutput
     * @param ADD_TO_AMM add asset to Amm
     * @param REMOVE_FROM_AMM remove asset from Amm
     */
    enum Dir { ADD_TO_AMM, REMOVE_FROM_AMM }

    struct LiquidityChangedSnapshot {
        SignedDecimal.signedDecimal cumulativeNotional;
        // the base/quote reserve of amm right before liquidity changed
        Decimal.decimal quoteAssetReserve;
        Decimal.decimal baseAssetReserve;
        // total position size owned by amm after last snapshot taken
        // `totalPositionSize` = currentBaseAssetReserve - lastLiquidityChangedHistoryItem.baseAssetReserve + prevTotalPositionSize
        SignedDecimal.signedDecimal totalPositionSize;
    }

    function swapInput(
        Dir _dir,
        Decimal.decimal calldata _quoteAssetAmount,
        Decimal.decimal calldata _baseAssetAmountLimit
    ) external returns (Decimal.decimal memory);

    function swapOutput(
        Dir _dir,
        Decimal.decimal calldata _baseAssetAmount,
        Decimal.decimal calldata _quoteAssetAmountLimit,
        bool _skipFluctuationCheck
    ) external returns (Decimal.decimal memory);

    function migrateLiquidity(Decimal.decimal calldata _liquidityMultiplier, Decimal.decimal calldata _priceLimitRatio)
        external;

    function shutdown() external;

    function settleFunding() external returns (SignedDecimal.signedDecimal memory);

    function calcFee(Decimal.decimal calldata _quoteAssetAmount)
        external
        view
        returns (Decimal.decimal memory, Decimal.decimal memory);

    //
    // VIEW
    //

    function calcBaseAssetAfterLiquidityMigration(
        SignedDecimal.signedDecimal memory _baseAssetAmount,
        Decimal.decimal memory _fromQuoteReserve,
        Decimal.decimal memory _fromBaseReserve
    ) external view returns (SignedDecimal.signedDecimal memory);

    function getInputTwap(Dir _dir, Decimal.decimal calldata _quoteAssetAmount)
        external
        view
        returns (Decimal.decimal memory);

    function getOutputTwap(Dir _dir, Decimal.decimal calldata _baseAssetAmount)
        external
        view
        returns (Decimal.decimal memory);

    function getInputPrice(Dir _dir, Decimal.decimal calldata _quoteAssetAmount)
        external
        view
        returns (Decimal.decimal memory);

    function getOutputPrice(Dir _dir, Decimal.decimal calldata _baseAssetAmount)
        external
        view
        returns (Decimal.decimal memory);

    function getInputPriceWithReserves(
        Dir _dir,
        Decimal.decimal memory _quoteAssetAmount,
        Decimal.decimal memory _quoteAssetPoolAmount,
        Decimal.decimal memory _baseAssetPoolAmount
    ) external pure returns (Decimal.decimal memory);

    function getOutputPriceWithReserves(
        Dir _dir,
        Decimal.decimal memory _baseAssetAmount,
        Decimal.decimal memory _quoteAssetPoolAmount,
        Decimal.decimal memory _baseAssetPoolAmount
    ) external pure returns (Decimal.decimal memory);

    function getSpotPrice() external view returns (Decimal.decimal memory);

    function getLiquidityHistoryLength() external view returns (uint256);

    // overridden by state variable
    function quoteAsset() external view returns (IERC20);

    function open() external view returns (bool);

    // can not be overridden by state variable due to type `Deciaml.decimal`
    function getSettlementPrice() external view returns (Decimal.decimal memory);

    function getBaseAssetDeltaThisFundingPeriod() external view returns (SignedDecimal.signedDecimal memory);

    function getCumulativeNotional() external view returns (SignedDecimal.signedDecimal memory);

    function getMaxHoldingBaseAsset() external view returns (Decimal.decimal memory);

    function getOpenInterestNotionalCap() external view returns (Decimal.decimal memory);

    function getLiquidityChangedSnapshots(uint256 i) external view returns (LiquidityChangedSnapshot memory);
}

// File: src/interface/IInsuranceFund.sol





interface IInsuranceFund {
    function withdraw(IERC20 _quoteToken, Decimal.decimal calldata _amount) external;

    function isExistedAmm(IAmm _amm) external view returns (bool);

    function getAllAmms() external view returns (IAmm[] memory);
}

// File: src/utils/BlockContext.sol


// wrap block.xxx functions for testing
// only support timestamp and number so far
abstract contract BlockContext {
    //◥◤◥◤◥◤◥◤◥◤◥◤◥◤◥◤ add state variables below ◥◤◥◤◥◤◥◤◥◤◥◤◥◤◥◤//

    //◢◣◢◣◢◣◢◣◢◣◢◣◢◣◢◣ add state variables above ◢◣◢◣◢◣◢◣◢◣◢◣◢◣◢◣//
    uint256[50] private __gap;

    function _blockTimestamp() internal view virtual returns (uint256) {
        return block.timestamp;
    }

    function _blockNumber() internal view virtual returns (uint256) {
        return block.number;
    }
}

// File: src/utils/DecimalERC20.sol





abstract contract DecimalERC20 {
    using SafeMath for uint256;
    using Decimal for Decimal.decimal;

    mapping(address => uint256) private decimalMap;

    //◥◤◥◤◥◤◥◤◥◤◥◤◥◤◥◤ add state variables below ◥◤◥◤◥◤◥◤◥◤◥◤◥◤◥◤//

    //◢◣◢◣◢◣◢◣◢◣◢◣◢◣◢◣ add state variables above ◢◣◢◣◢◣◢◣◢◣◢◣◢◣◢◣//
    uint256[50] private __gap;

    //
    // INTERNAL functions
    //

    // CAUTION: do not input _from == _to s.t. this function will always fail
    function _transfer(
        IERC20 _token,
        address _to,
        Decimal.decimal memory _value
    ) internal {
        _updateDecimal(address(_token));
        Decimal.decimal memory balanceBefore = _balanceOf(_token, _to);
        uint256 roundedDownValue = _toUint(_token, _value);

        // solhint-disable avoid-low-level-calls
        (bool success, bytes memory data) = address(_token).call(
            abi.encodeWithSelector(_token.transfer.selector, _to, roundedDownValue)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "DecimalERC20: transfer failed");
        _validateBalance(_token, _to, roundedDownValue, balanceBefore);
    }

    function _transferFrom(
        IERC20 _token,
        address _from,
        address _to,
        Decimal.decimal memory _value
    ) internal {
        _updateDecimal(address(_token));
        Decimal.decimal memory balanceBefore = _balanceOf(_token, _to);
        uint256 roundedDownValue = _toUint(_token, _value);

        // solhint-disable avoid-low-level-calls
        (bool success, bytes memory data) = address(_token).call(
            abi.encodeWithSelector(_token.transferFrom.selector, _from, _to, roundedDownValue)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "DecimalERC20: transferFrom failed");
        _validateBalance(_token, _to, roundedDownValue, balanceBefore);
    }

    function _approve(
        IERC20 _token,
        address _spender,
        Decimal.decimal memory _value
    ) internal {
        _updateDecimal(address(_token));
        // to be compatible with some erc20 tokens like USDT
        __approve(_token, _spender, Decimal.zero());
        __approve(_token, _spender, _value);
    }

    //
    // VIEW
    //
    function _allowance(
        IERC20 _token,
        address _owner,
        address _spender
    ) internal view returns (Decimal.decimal memory) {
        return _toDecimal(_token, _token.allowance(_owner, _spender));
    }

    function _balanceOf(IERC20 _token, address _owner) internal view returns (Decimal.decimal memory) {
        return _toDecimal(_token, _token.balanceOf(_owner));
    }

    function _totalSupply(IERC20 _token) internal view returns (Decimal.decimal memory) {
        return _toDecimal(_token, _token.totalSupply());
    }

    function _toDecimal(IERC20 _token, uint256 _number) internal view returns (Decimal.decimal memory) {
        uint256 tokenDecimals = _getTokenDecimals(address(_token));
        if (tokenDecimals >= 18) {
            return Decimal.decimal(_number.div(10**(tokenDecimals.sub(18))));
        }

        return Decimal.decimal(_number.mul(10**(uint256(18).sub(tokenDecimals))));
    }

    function _toUint(IERC20 _token, Decimal.decimal memory _decimal) internal view returns (uint256) {
        uint256 tokenDecimals = _getTokenDecimals(address(_token));
        if (tokenDecimals >= 18) {
            return _decimal.toUint().mul(10**(tokenDecimals.sub(18)));
        }
        return _decimal.toUint().div(10**(uint256(18).sub(tokenDecimals)));
    }

    function _getTokenDecimals(address _token) internal view returns (uint256) {
        uint256 tokenDecimals = decimalMap[_token];
        if (tokenDecimals == 0) {
            (bool success, bytes memory data) = _token.staticcall(abi.encodeWithSignature("decimals()"));
            require(success && data.length != 0, "DecimalERC20: get decimals failed");
            tokenDecimals = abi.decode(data, (uint256));
        }
        return tokenDecimals;
    }

    //
    // PRIVATE
    //
    function _updateDecimal(address _token) private {
        uint256 tokenDecimals = _getTokenDecimals(_token);
        if (decimalMap[_token] != tokenDecimals) {
            decimalMap[_token] = tokenDecimals;
        }
    }

    function __approve(
        IERC20 _token,
        address _spender,
        Decimal.decimal memory _value
    ) private {
        // solhint-disable avoid-low-level-calls
        (bool success, bytes memory data) = address(_token).call(
            abi.encodeWithSelector(_token.approve.selector, _spender, _toUint(_token, _value))
        );
        require(success && (data.length == 0 || abi.decode(data, (bool))), "DecimalERC20: approve failed");
    }

    // To prevent from deflationary token, check receiver's balance is as expectation.
    function _validateBalance(
        IERC20 _token,
        address _to,
        uint256 _roundedDownValue,
        Decimal.decimal memory _balanceBefore
    ) private view {
        require(
            _balanceOf(_token, _to).cmp(_balanceBefore.addD(_toDecimal(_token, _roundedDownValue))) == 0,
            "DecimalERC20: balance inconsistent"
        );
    }
}

// File: src/interface/IArk.sol




interface IArk {
    function withdrawForLoss(Decimal.decimal memory _amount, IERC20 _quoteToken) external;
}

// File: src/InsuranceFund.sol



contract InsuranceFund is IInsuranceFund, PerpFiOwnableUpgrade, BlockContext, ReentrancyGuardUpgradeSafe, DecimalERC20 {
    using Decimal for Decimal.decimal;

    //
    // EVENTS
    //

    event Withdrawn(address withdrawer, uint256 amount);
    event TokenAdded(address tokenAddress);
    event TokenRemoved(address tokenAddress);
    event ShutdownAllAmms(uint256 blockNumber);

    //**********************************************************//
    //    The below state variables can not change the order    //
    //**********************************************************//

    mapping(address => bool) private ammMap;
    mapping(address => bool) private quoteTokenMap;
    IAmm[] private amms;
    IERC20[] public quoteTokens;

    // contract dependencies
    IERC20 public emdxToken;
    IArk public ark;
    address private beneficiary;

    //**********************************************************//
    //    The above state variables can not change the order    //
    //**********************************************************//

    //◥◤◥◤◥◤◥◤◥◤◥◤◥◤◥◤ add state variables below ◥◤◥◤◥◤◥◤◥◤◥◤◥◤◥◤//

    //◢◣◢◣◢◣◢◣◢◣◢◣◢◣◢◣ add state variables above ◢◣◢◣◢◣◢◣◢◣◢◣◢◣◢◣//
    uint256[50] private __gap;

    //
    // FUNCTIONS
    //

    function initialize() external initializer {
        __Ownable_init();
        __ReentrancyGuard_init();
    }

    /**
     * @dev only owner can call
     * @param _amm IAmm address
     */
    function addAmm(IAmm _amm) public onlyOwner {
        require(!isExistedAmm(_amm), "amm already added");
        ammMap[address(_amm)] = true;
        amms.push(_amm);

        // add token if it's new one
        IERC20 token = _amm.quoteAsset();
        if (!isQuoteTokenExisted(token)) {
            quoteTokens.push(token);
            quoteTokenMap[address(token)] = true;
            emit TokenAdded(address(token));
        }
    }

    /**
     * @dev only owner can call. no need to call
     * @param _amm IAmm address
     */
    function removeAmm(IAmm _amm) external onlyOwner {
        require(isExistedAmm(_amm), "amm not existed");
        ammMap[address(_amm)] = false;
        uint256 ammLength = amms.length;
        for (uint256 i = 0; i < ammLength; i++) {
            if (amms[i] == _amm) {
                amms[i] = amms[ammLength - 1];
                amms.pop();
                break;
            }
        }
    }

    /**
     * @notice shutdown all Amms when fatal error happens
     * @dev only owner can call. Emit `ShutdownAllAmms` event
     */
    function shutdownAllAmm() external onlyOwner {
        for (uint256 i; i < amms.length; i++) {
            amms[i].shutdown();
        }
        emit ShutdownAllAmms(block.number);
    }

    function removeToken(IERC20 _token) external onlyOwner {
        require(isQuoteTokenExisted(_token), "token not existed");

        quoteTokenMap[address(_token)] = false;
        uint256 quoteTokensLength = getQuoteTokenLength();
        for (uint256 i = 0; i < quoteTokensLength; i++) {
            if (quoteTokens[i] == _token) {
                if (i < quoteTokensLength - 1) {
                    quoteTokens[i] = quoteTokens[quoteTokensLength - 1];
                }
                quoteTokens.pop();
                break;
            }
        }

        // transfer all fund to ark
        if (balanceOf(_token).toUint() > 0) {
            _transfer(_token, address(ark), balanceOf(_token));
        }

        emit TokenRemoved(address(_token));
    }

    /**
     * @notice withdraw token to caller
     * @param _amount the amount of quoteToken caller want to withdraw
     */
    function withdraw(IERC20 _quoteToken, Decimal.decimal calldata _amount) external override {
        require(beneficiary == _msgSender(), "caller is not beneficiary");
        require(isQuoteTokenExisted(_quoteToken), "Asset is not supported");

        Decimal.decimal memory quoteBalance = balanceOf(_quoteToken);
        if (_amount.toUint() > quoteBalance.toUint()) {
            Decimal.decimal memory insufficientAmount = _amount.subD(quoteBalance);
            ark.withdrawForLoss(insufficientAmount, _quoteToken);
            quoteBalance = balanceOf(_quoteToken);
        }
        require(quoteBalance.toUint() >= _amount.toUint(), "Fund not enough");

        _transfer(_quoteToken, _msgSender(), _amount);
        emit Withdrawn(_msgSender(), _amount.toUint());
    }

    //
    // SETTER
    //

    function setBeneficiary(address _beneficiary) external onlyOwner {
        beneficiary = _beneficiary;
    }

    function setArk(IArk _ark) public onlyOwner {
        ark = _ark;
    }

    function setEmdxToken(IERC20 _token) public onlyOwner {
        emdxToken = _token;
    }

    function getQuoteTokenLength() public view returns (uint256) {
        return quoteTokens.length;
    }

    //
    // VIEW
    //
    function isExistedAmm(IAmm _amm) public view override returns (bool) {
        return ammMap[address(_amm)];
    }

    function getAllAmms() external view override returns (IAmm[] memory) {
        return amms;
    }

    function isQuoteTokenExisted(IERC20 _token) internal view returns (bool) {
        return quoteTokenMap[address(_token)];
    }

    function balanceOf(IERC20 _quoteToken) internal view returns (Decimal.decimal memory) {
        return _balanceOf(_quoteToken, address(this));
    }

    function claimTokens(address payable _to, IERC20 _token) external onlyOwner {
        require(_to != address(0), "to address is required");
        if (_token == IERC20(0)) {
            _to.transfer(address(this).balance);
        } else {
            _transfer(_token, _to, _balanceOf(_token, address(this)));
        }
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"ShutdownAllAmms","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"contract IAmm","name":"_amm","type":"address"}],"name":"addAmm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ark","outputs":[{"internalType":"contract IArk","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"candidate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emdxToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllAmms","outputs":[{"internalType":"contract IAmm[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQuoteTokenLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAmm","name":"_amm","type":"address"}],"name":"isExistedAmm","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"quoteTokens","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAmm","name":"_amm","type":"address"}],"name":"removeAmm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"removeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IArk","name":"_ark","type":"address"}],"name":"setArk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"setEmdxToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shutdownAllAmm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_quoteToken","type":"address"},{"components":[{"internalType":"uint256","name":"d","type":"uint256"}],"internalType":"struct Decimal.decimal","name":"_amount","type":"tuple"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061205f806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806379e07ae1116100b8578063bc5920ba1161007c578063bc5920ba1461023e578063beb0597a14610246578063cf2309791461025b578063d51388661461026e578063d926de1c14610276578063f9c8740f1461028957610137565b806379e07ae1146101fe5780638129fc1c146102115780638da5cb5b146102195780639dd96eb214610221578063b7538c621461022957610137565b80632c9115c7116100ff5780632c9115c7146101b55780635fa7b584146101c857806369ffa08a146101db5780636c8381f8146101ee578063715018a6146101f657610137565b80630774a7841461013c5780630a807af81461016557806313af40351461017a5780631c31f7101461018f578063252978b8146101a2575b600080fd5b61014f61014a366004611946565b61029c565b60405161015c9190611b18565b60405180910390f35b61016d6102bb565b60405161015c9190611a9e565b61018d610188366004611946565b6102cb565b005b61018d61019d366004611946565b6103ad565b61018d6101b03660046119d6565b610405565b61016d6101c3366004611a52565b6105e2565b61018d6101d6366004611946565b61060a565b61018d6101e9366004611962565b6107e6565b61016d61089d565b61018d6108ac565b61018d61020c366004611946565b61092b565b61018d610983565b61016d610a16565b61018d610a25565b610231610b1c565b60405161015c9190611acb565b61018d610b7f565b61024e610c42565b60405161015c9190611fdf565b61018d610269366004611946565b610c49565b61016d610dab565b61018d610284366004611946565b610dbb565b61018d610297366004611946565b610f8f565b6001600160a01b03166000908152610130602052604090205460ff1690565b610135546001600160a01b031681565b6102d3610fe7565b6065546001600160a01b039081169116146103095760405162461bcd60e51b815260040161030090611f34565b60405180910390fd5b6001600160a01b03811661032f5760405162461bcd60e51b815260040161030090611dbf565b6065546001600160a01b038281169116141561035d5760405162461bcd60e51b815260040161030090611f81565b6066546001600160a01b038281169116141561038b5760405162461bcd60e51b815260040161030090611c56565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6103b5610fe7565b6065546001600160a01b039081169116146103e25760405162461bcd60e51b815260040161030090611f34565b61013680546001600160a01b0319166001600160a01b0392909216919091179055565b61040d610fe7565b610136546001600160a01b0390811691161461043b5760405162461bcd60e51b815260040161030090611be8565b61044482610feb565b6104605760405162461bcd60e51b815260040161030090611d4e565b610468611933565b6104718361100a565b905061047c81611022565b61049361048e36859003850185611a15565b611022565b1115610533576104a1611933565b6104c0826104b436869003860186611a15565b9063ffffffff61102616565b61013554604051636244e2ed60e01b81529192506001600160a01b031690636244e2ed906104f49084908890600401611fc7565b600060405180830381600087803b15801561050e57600080fd5b505af1158015610522573d6000803e3d6000fd5b5050505061052f8461100a565b9150505b61054561048e36849003840184611a15565b61054e82611022565b101561056c5760405162461bcd60e51b815260040161030090611f0b565b61058c83610578610fe7565b61058736869003860186611a15565b611052565b7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56105b5610fe7565b6105c761048e36869003860186611a15565b6040516105d5929190611ab2565b60405180910390a1505050565b61013381815481106105f057fe5b6000918252602090912001546001600160a01b0316905081565b610612610fe7565b6065546001600160a01b0390811691161461063f5760405162461bcd60e51b815260040161030090611f34565b61064881610feb565b6106645760405162461bcd60e51b815260040161030090611b86565b6001600160a01b038116600090815261013160205260408120805460ff1916905561068d610c42565b905060005b8181101561077a57826001600160a01b031661013382815481106106b257fe5b6000918252602090912001546001600160a01b03161415610772576001820381101561073f5761013360018303815481106106e957fe5b60009182526020909120015461013380546001600160a01b03909216918390811061071057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b61013380548061074b57fe5b600082815260209020810160001990810180546001600160a01b031916905501905561077a565b600101610692565b50600061078961048e8461100a565b11156107ab57610135546107ab9083906001600160a01b03166105878261100a565b7f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd3826040516107da9190611a9e565b60405180910390a15050565b6107ee610fe7565b6065546001600160a01b0390811691161461081b5760405162461bcd60e51b815260040161030090611f34565b6001600160a01b0382166108415760405162461bcd60e51b815260040161030090611b56565b6001600160a01b03811661088a576040516001600160a01b038316904780156108fc02916000818181858888f19350505050158015610884573d6000803e3d6000fd5b50610899565b61089981836105878430611181565b5050565b6066546001600160a01b031690565b6108b4610fe7565b6065546001600160a01b039081169116146108e15760405162461bcd60e51b815260040161030090611f34565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b610933610fe7565b6065546001600160a01b039081169116146109605760405162461bcd60e51b815260040161030090611f34565b61013480546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff168061099c575061099c611215565b806109aa575060005460ff16155b6109c65760405162461bcd60e51b815260040161030090611e01565b600054610100900460ff161580156109f1576000805460ff1961ff0019909116610100171660011790555b6109f961121b565b610a01611299565b8015610a13576000805461ff00191690555b50565b6065546001600160a01b031690565b610a2d610fe7565b6065546001600160a01b03908116911614610a5a5760405162461bcd60e51b815260040161030090611f34565b60005b61013254811015610ae2576101328181548110610a7657fe5b60009182526020822001546040805163fc0e74d160e01b815290516001600160a01b039092169263fc0e74d19260048084019382900301818387803b158015610abe57600080fd5b505af1158015610ad2573d6000803e3d6000fd5b505060019092019150610a5d9050565b507ffc9f9c6cbb93f675af09b9bb43859333114dfa5e4c5abd35297e153f2434810143604051610b129190611fdf565b60405180910390a1565b6060610132805480602002602001604051908101604052809291908181526020018280548015610b7557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b57575b5050505050905090565b6066546001600160a01b0316610ba75760405162461bcd60e51b815260040161030090611ebc565b610baf610fe7565b6066546001600160a01b03908116911614610bdc5760405162461bcd60e51b815260040161030090611c9d565b6066546065546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360668054606580546001600160a01b03199081166001600160a01b03841617909155169055565b6101335490565b610c51610fe7565b6065546001600160a01b03908116911614610c7e5760405162461bcd60e51b815260040161030090611f34565b610c878161029c565b610ca35760405162461bcd60e51b815260040161030090611d25565b6001600160a01b038116600090815261013060205260408120805460ff1916905561013254905b81811015610da657826001600160a01b03166101328281548110610cea57fe5b6000918252602090912001546001600160a01b03161415610d9e576101326001830381548110610d1657fe5b60009182526020909120015461013280546001600160a01b039092169183908110610d3d57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610132805480610d7757fe5b600082815260209020810160001990810180546001600160a01b0319169055019055610da6565b600101610cca565b505050565b610134546001600160a01b031681565b610dc3610fe7565b6065546001600160a01b03908116911614610df05760405162461bcd60e51b815260040161030090611f34565b610df98161029c565b15610e165760405162461bcd60e51b815260040161030090611e4f565b6001600160a01b038116600081815261013060209081526040808320805460ff191660019081179091556101328054918201815584527fc53bdfd4aa1ab65dfdaf681ca6bda958ae4a123d4ed68c4277796592280e78350180546001600160a01b03191685179055805163fdf262b760e01b8152905192939263fdf262b792600480840193919291829003018186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea91906119ba565b9050610ef581610feb565b61089957610133805460018082019092557f92e985329fb94cc1b424ebb0f7f2929b6d27383ca94c0ec71c44fb48bdf96d2c0180546001600160a01b0319166001600160a01b0384169081179091556000908152610131602052604090819020805460ff1916909217909155517f784c8f4dbf0ffedd6e72c76501c545a70f8b203b30a26ce542bf92ba87c248a4906107da908390611a9e565b610f97610fe7565b6065546001600160a01b03908116911614610fc45760405162461bcd60e51b815260040161030090611f34565b61013580546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b03166000908152610131602052604090205460ff1690565b611012611933565b61101c8230611181565b92915050565b5190565b61102e611933565b611036611933565b825184516110499163ffffffff61130f16565b81529392505050565b61105b83611351565b611063611933565b61106d8484611181565b9050600061107b858461139b565b905060006060866001600160a01b031663a9059cbb60e01b87856040516024016110a6929190611ab2565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516110e49190611a82565b6000604051808303816000865af19150503d8060008114611121576040519150601f19603f3d011682016040523d82523d6000602084013e611126565b606091505b5091509150818015611150575080511580611150575080806020019051810190611150919061199a565b61116c5760405162461bcd60e51b815260040161030090611bb1565b61117887878587611419565b50505050505050565b611189611933565b61120e83846001600160a01b03166370a08231856040518263ffffffff1660e01b81526004016111b99190611a9e565b60206040518083038186803b1580156111d157600080fd5b505afa1580156111e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112099190611a6a565b611472565b9392505050565b303b1590565b600054610100900460ff16806112345750611234611215565b80611242575060005460ff16155b61125e5760405162461bcd60e51b815260040161030090611e01565b600054610100900460ff16158015611289576000805460ff1961ff0019909116610100171660011790555b611291611504565b610a01611585565b600054610100900460ff16806112b257506112b2611215565b806112c0575060005460ff16155b6112dc5760405162461bcd60e51b815260040161030090611e01565b600054610100900460ff16158015611307576000805460ff1961ff0019909116610100171660011790555b610a0161165f565b600061120e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506116ee565b600061135c8261171a565b6001600160a01b038316600090815260fd60205260409020549091508114610899576001600160a01b0391909116600090815260fd6020526040902055565b6000806113a78461171a565b9050601281106113e5576113dd6113c582601263ffffffff61130f16565b600a0a6113d185611022565b9063ffffffff61180716565b91505061101c565b6114116113f960128363ffffffff61130f16565b600a0a61140585611022565b9063ffffffff61184116565b949350505050565b61144c6114366114298685611472565b839063ffffffff61188316565b6114408686611181565b9063ffffffff6118a616565b60000b1561146c5760405162461bcd60e51b815260040161030090611e7a565b50505050565b61147a611933565b60006114858461171a565b9050601281106114ca576040805160208101909152806114bf6114af84601263ffffffff61130f16565b8690600a0a63ffffffff61184116565b81525091505061101c565b6040805160208101909152806114fa6114ea60128563ffffffff61130f16565b8690600a0a63ffffffff61180716565b9052949350505050565b600054610100900460ff168061151d575061151d611215565b8061152b575060005460ff16155b6115475760405162461bcd60e51b815260040161030090611e01565b600054610100900460ff16158015610a01576000805460ff1961ff0019909116610100171660011790558015610a13576000805461ff001916905550565b600054610100900460ff168061159e575061159e611215565b806115ac575060005460ff16155b6115c85760405162461bcd60e51b815260040161030090611e01565b600054610100900460ff161580156115f3576000805460ff1961ff0019909116610100171660011790555b60006115fd610fe7565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610a13576000805461ff001916905550565b600054610100900460ff16806116785750611678611215565b80611686575060005460ff16155b6116a25760405162461bcd60e51b815260040161030090611e01565b600054610100900460ff161580156116cd576000805460ff1961ff0019909116610100171660011790555b60cb805460ff191660011790558015610a13576000805461ff001916905550565b600081848411156117125760405162461bcd60e51b81526004016103009190611b23565b505050900390565b6001600160a01b038116600090815260fd60205260408120548061101c5760408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916060916001600160a01b0387169161177c91611a82565b600060405180830381855afa9150503d80600081146117b7576040519150601f19603f3d011682016040523d82523d6000602084013e6117bc565b606091505b50915091508180156117ce5750805115155b6117ea5760405162461bcd60e51b815260040161030090611ce4565b808060200190518101906117fe9190611a6a565b95945050505050565b6000826118165750600061101c565b8282028284828161182357fe5b041461120e5760405162461bcd60e51b815260040161030090611d7e565b600061120e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506118d7565b61188b611933565b611893611933565b825184516110499163ffffffff61190e16565b8051825160009110156118bb5750600161101c565b8151835110156118ce575060001961101c565b50600092915050565b600081836118f85760405162461bcd60e51b81526004016103009190611b23565b50600083858161190457fe5b0495945050505050565b60008282018381101561120e5760405162461bcd60e51b815260040161030090611c1f565b6040518060200160405280600081525090565b600060208284031215611957578081fd5b813561120e81612014565b60008060408385031215611974578081fd5b823561197f81612014565b9150602083013561198f81612014565b809150509250929050565b6000602082840312156119ab578081fd5b8151801515811461120e578182fd5b6000602082840312156119cb578081fd5b815161120e81612014565b60008082840360408112156119e9578283fd5b83356119f481612014565b92506020601f1982011215611a07578182fd5b506020830190509250929050565b600060208284031215611a26578081fd5b6040516020810181811067ffffffffffffffff82111715611a45578283fd5b6040529135825250919050565b600060208284031215611a63578081fd5b5035919050565b600060208284031215611a7b578081fd5b5051919050565b60008251611a94818460208701611fe8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611b0c5783516001600160a01b031683529284019291840191600101611ae7565b50909695505050505050565b901515815260200190565b6000602082528251806020840152611b42816040850160208701611fe8565b601f01601f19169190910160400192915050565b6020808252601690820152751d1bc81859191c995cdcc81a5cc81c995c5d5a5c995960521b604082015260600190565b6020808252601190820152701d1bdad95b881b9bdd08195e1a5cdd1959607a1b604082015260600190565b6020808252601d908201527f446563696d616c45524332303a207472616e73666572206661696c6564000000604082015260600190565b60208082526019908201527f63616c6c6572206973206e6f742062656e656669636961727900000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526027908201527f5065727046694f776e61626c65557067726164653a2073616d652061732063616040820152666e64696461746560c81b606082015260800190565b60208082526027908201527f5065727046694f776e61626c65557067726164653a206e6f7420746865206e656040820152663b9037bbb732b960c91b606082015260800190565b60208082526021908201527f446563696d616c45524332303a2067657420646563696d616c73206661696c656040820152601960fa1b606082015260800190565b6020808252600f908201526e185b5b481b9bdd08195e1a5cdd1959608a1b604082015260600190565b602080825260169082015275105cdcd95d081a5cc81b9bdd081cdd5c1c1bdc9d195960521b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526022908201527f5065727046694f776e61626c65557067726164653a207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b602080825260119082015270185b5b48185b1c9958591e481859191959607a1b604082015260600190565b60208082526022908201527f446563696d616c45524332303a2062616c616e636520696e636f6e73697374656040820152611b9d60f21b606082015260800190565b6020808252602f908201527f5065727046694f776e61626c65557067726164653a2063616e6469646174652060408201526e6973207a65726f206164647265737360881b606082015260800190565b6020808252600f908201526e08ceadcc840dcdee840cadcdeeaced608b1b604082015260600190565b6020808252602d908201527f5065727046694f776e61626c65557067726164653a2063616c6c65722069732060408201526c3737ba103a34329037bbb732b960991b606082015260800190565b60208082526026908201527f5065727046694f776e61626c65557067726164653a2073616d65206173206f726040820152651a59da5b985b60d21b606082015260800190565b915182526001600160a01b0316602082015260400190565b90815260200190565b60005b83811015612003578181015183820152602001611feb565b8381111561146c5750506000910152565b6001600160a01b0381168114610a1357600080fdfea264697066735822122099edc94eabf6e15e3a356ae758084b1c9de17de3e11379609cada71f7b12668664736f6c63430006090033

Deployed ByteCode Sourcemap

38440:6011:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43588:116;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39269:15;;;:::i;:::-;;;;;;;;5982:338;;;;;;;;;:::i;:::-;;43148:110;;;;;;;;;:::i;42315:792::-;;;;;;;;;:::i;39173:27::-;;;;;;;;;:::i;41392:784::-;;;;;;;;;:::i;44114:334::-;;;;;;;;;:::i;5022:87::-;;;:::i;5685:148::-;;;:::i;43347:91::-;;;;;;;;;:::i;39871:113::-;;;:::i;4935:79::-;;;:::i;41193:191::-;;;:::i;43712:99::-;;;:::i;:::-;;;;;;;;6473:344;;;:::i;43446:105::-;;;:::i;:::-;;;;;;;;40635:410;;;;;;;;;:::i;39239:23::-;;;:::i;40076:450::-;;;;;;;;;:::i;43266:73::-;;;;;;;;;:::i;43588:116::-;-1:-1:-1;;;;;43675:21:0;43651:4;43675:21;;;:6;:21;;;;;;;;;43588:116::o;39269:15::-;;;-1:-1:-1;;;;;39269:15:0;;:::o;5982:338::-;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6054:22:0;::::1;6046:69;;;;-1:-1:-1::0;;;6046:69:0::1;;;;;;;;;6146:6;::::0;-1:-1:-1;;;;;6134:18:0;;::::1;6146:6:::0;::::1;6134:18;;6126:69;;;;-1:-1:-1::0;;;6126:69:0::1;;;;;;;;;6226:10;::::0;-1:-1:-1;;;;;6214:22:0;;::::1;6226:10:::0;::::1;6214:22;;6206:74;;;;-1:-1:-1::0;;;6206:74:0::1;;;;;;;;;6291:10;:21:::0;;-1:-1:-1;;;;;;6291:21:0::1;-1:-1:-1::0;;;;;6291:21:0;;;::::1;::::0;;;::::1;::::0;;5982:338::o;43148:110::-;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;43224:11:::1;:26:::0;;-1:-1:-1;;;;;;43224:26:0::1;-1:-1:-1::0;;;;;43224:26:0;;;::::1;::::0;;;::::1;::::0;;43148:110::o;42315:792::-;42439:12;:10;:12::i;:::-;42424:11;;-1:-1:-1;;;;;42424:11:0;;;:27;;;42416:65;;;;-1:-1:-1;;;42416:65:0;;;;;;;;;42500:32;42520:11;42500:19;:32::i;:::-;42492:67;;;;-1:-1:-1;;;42492:67:0;;;;;;;;;42572:35;;:::i;:::-;42610:22;42620:11;42610:9;:22::i;:::-;42572:60;;42666:21;:12;:19;:21::i;:::-;42647:16;:14;;;;;;;:7;:14;;;;:16::i;:::-;:40;42643:262;;;42704:41;;:::i;:::-;42748:26;42761:12;42748;;;;;;;:7;:12;;;;:26;:12;:26;:::i;:::-;42789:3;;:52;;-1:-1:-1;;;42789:52:0;;42704:70;;-1:-1:-1;;;;;;42789:3:0;;:19;;:52;;42704:70;;42829:11;;42789:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42871:22;42881:11;42871:9;:22::i;:::-;42856:37;;42643:262;;42948:16;:14;;;;;;;:7;:14;;:16;42923:21;:12;:19;:21::i;:::-;:41;;42915:69;;;;-1:-1:-1;;;42915:69:0;;;;;;;;;42997:45;43007:11;43020:12;:10;:12::i;:::-;42997:45;;;;;;;43034:7;42997:45;;;:9;:45::i;:::-;43058:41;43068:12;:10;:12::i;:::-;43082:16;:14;;;;;;;:7;:14;;:16;43058:41;;;;;;;;;;;;;;;;42315:792;;;:::o;39173:27::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39173:27:0;;-1:-1:-1;39173:27:0;:::o;41392:784::-;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;41466:27:::1;41486:6;41466:19;:27::i;:::-;41458:57;;;;-1:-1:-1::0;;;41458:57:0::1;;;;;;;;;-1:-1:-1::0;;;;;41528:30:0;::::1;41561:5;41528:30:::0;;;:13:::1;:30;::::0;;;;:38;;-1:-1:-1;;41528:38:0::1;::::0;;41605:21:::1;:19;:21::i;:::-;41577:49:::0;-1:-1:-1;41642:9:0::1;41637:323;41661:17;41657:1;:21;41637:323;;;41722:6;-1:-1:-1::0;;;;;41704:24:0::1;:11;41716:1;41704:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;41704:14:0::1;:24;41700:249;;;41777:1;41757:17;:21;41753:1;:25;41749:125;;;41820:11;41852:1;41832:17;:21;41820:34;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;41803:11:::1;:14:::0;;-1:-1:-1;;;;;41820:34:0;;::::1;::::0;41815:1;;41803:14;::::1;;;;;;;;;;;;;:51;;;;;-1:-1:-1::0;;;;;41803:51:0::1;;;;;-1:-1:-1::0;;;;;41803:51:0::1;;;;;;41749:125;41892:11;:17;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;41892:17:0;;;;;-1:-1:-1;;;;;;41892:17:0::1;::::0;;;;;41928:5:::1;;41700:249;41680:3;;41637:323;;;;42042:1;42013:26;:17;42023:6;42013:9;:17::i;:26::-;:30;42009:113;;;42086:3;::::0;42060:50:::1;::::0;42070:6;;-1:-1:-1;;;;;42086:3:0::1;42092:17;42070:6:::0;42092:9:::1;:17::i;42060:50::-;42139:29;42160:6;42139:29;;;;;;;;;;;;;;;5325:1;41392:784:::0;:::o;44114:334::-;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;-1:-1:-1;;;;;44209:17:0;::::1;44201:52;;;;-1:-1:-1::0;;;44201:52:0::1;;;;;;;;;-1:-1:-1::0;;;;;44268:19:0;::::1;44264:177;;44304:35;::::0;-1:-1:-1;;;;;44304:12:0;::::1;::::0;44317:21:::1;44304:35:::0;::::1;;;::::0;::::1;::::0;;;44317:21;44304:12;:35;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;44264:177;;;44372:57;44382:6;44390:3;44395:33;44406:6;44422:4;44395:10;:33::i;44372:57::-;44114:334:::0;;:::o;5022:87::-;5091:10;;-1:-1:-1;;;;;5091:10:0;5022:87;:::o;5685:148::-;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;5776:6:::1;::::0;5755:40:::1;::::0;5792:1:::1;::::0;-1:-1:-1;;;;;5776:6:0::1;::::0;5755:40:::1;::::0;5792:1;;5755:40:::1;5806:6;:19:::0;;-1:-1:-1;;;;;;5806:19:0::1;::::0;;5685:148::o;43347:91::-;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;43412:9:::1;:18:::0;;-1:-1:-1;;;;;;43412:18:0::1;-1:-1:-1::0;;;;;43412:18:0;;;::::1;::::0;;;::::1;::::0;;43347:91::o;39871:113::-;1136:12;;;;;;;;:31;;;1152:15;:13;:15::i;:::-;1136:47;;;-1:-1:-1;1172:11:0;;;;1171:12;1136:47;1128:106;;;;-1:-1:-1;;;1128:106:0;;;;;;;;;1243:19;1266:12;;;;;;1265:13;1285:83;;;;1314:12;:19;;-1:-1:-1;;;;1314:19:0;;;;;1342:18;1329:4;1342:18;;;1285:83;39925:16:::1;:14;:16::i;:::-;39952:24;:22;:24::i;:::-;1390:14:::0;1386:57;;;1430:5;1415:20;;-1:-1:-1;;1415:20:0;;;1386:57;39871:113;:::o;4935:79::-;5000:6;;-1:-1:-1;;;;;5000:6:0;4935:79;:::o;41193:191::-;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;41254:9:::1;41249:83;41269:4;:11:::0;41265:15;::::1;41249:83;;;41302:4;41307:1;41302:7;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;:18:::1;::::0;;-1:-1:-1;;;41302:18:0;;;;-1:-1:-1;;;;;41302:7:0;;::::1;::::0;:16:::1;::::0;:18:::1;::::0;;::::1;::::0;;;;;;:7;;:18;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41282:3:0::1;::::0;;::::1;::::0;-1:-1:-1;41249:83:0::1;::::0;-1:-1:-1;41249:83:0::1;;;41347:29;41363:12;41347:29;;;;;;;;;;;;;;;41193:191::o:0;43712:99::-;43766:13;43799:4;43792:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43792:11:0;;;;;;;;;;;;;;;;;;;;;;;43712:99;:::o;6473:344::-;6522:10;;-1:-1:-1;;;;;6522:10:0;6514:84;;;;-1:-1:-1;;;6514:84:0;;;;;;;;;6631:12;:10;:12::i;:::-;6617:10;;-1:-1:-1;;;;;6617:10:0;;;:26;;;6609:78;;;;-1:-1:-1;;;6609:78:0;;;;;;;;;6734:10;;6726:6;;6705:40;;-1:-1:-1;;;;;6734:10:0;;;;6726:6;;;;6705:40;;6734:10;;6705:40;6765:10;;;6756:6;:19;;-1:-1:-1;;;;;;6756:19:0;;;-1:-1:-1;;;;;6765:10:0;;6756:19;;;;6786:23;;;6473:344::o;43446:105::-;43525:11;:18;43446:105;:::o;40635:410::-;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;40703:18:::1;40716:4;40703:12;:18::i;:::-;40695:46;;;;-1:-1:-1::0;;;40695:46:0::1;;;;;;;;;-1:-1:-1::0;;;;;40752:21:0;::::1;40776:5;40752:21:::0;;;:6:::1;:21;::::0;;;;:29;;-1:-1:-1;;40752:29:0::1;::::0;;40812:4:::1;:11:::0;;40834:204:::1;40858:9;40854:1;:13;40834:204;;;40904:4;-1:-1:-1::0;;;;;40893:15:0::1;:4;40898:1;40893:7;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;40893:7:0::1;:15;40889:138;;;40939:4;40956:1;40944:9;:13;40939:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;40929:4:::1;:7:::0;;-1:-1:-1;;;;;40939:19:0;;::::1;::::0;40934:1;;40929:7;::::1;;;;;;;;;;;;;:29;;;;;-1:-1:-1::0;;;;;40929:29:0::1;;;;;-1:-1:-1::0;;;;;40929:29:0::1;;;;;;40977:4;:10;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;40977:10:0;;;;;-1:-1:-1;;;;;;40977:10:0::1;::::0;;;;;41006:5:::1;;40889:138;40869:3;;40834:204;;;;5325:1;40635:410:::0;:::o;39239:23::-;;;-1:-1:-1;;;;;39239:23:0;;:::o;40076:450::-;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;40140:18:::1;40153:4;40140:12;:18::i;:::-;40139:19;40131:49;;;;-1:-1:-1::0;;;40131:49:0::1;;;;;;;;;-1:-1:-1::0;;;;;40191:21:0;::::1;;::::0;;;:6:::1;:21;::::0;;;;;;;:28;;-1:-1:-1;;40191:28:0::1;40215:4;40191:28:::0;;::::1;::::0;;;40230:4:::1;:15:::0;;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;40230:15:0::1;::::0;::::1;::::0;;40311:17;;-1:-1:-1;;;40311:17:0;;;;40191:21;;;40311:15:::1;::::0;:17:::1;::::0;;::::1;::::0;40191:21;;40311:17;;;;;;40191:21;40311:17;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40296:32;;40344:26;40364:5;40344:19;:26::i;:::-;40339:180;;40387:11;:23:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;40387:23:0::1;-1:-1:-1::0;;;;;40387:23:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;40425:29:0;;;:13:::1;40387:23;40425:29:::0;;;;;;:36;;-1:-1:-1;;40425:36:0::1;::::0;;::::1;::::0;;;40481:26;::::1;::::0;::::1;::::0;40387:23;;40481:26:::1;;43266:73:::0;5252:12;:10;:12::i;:::-;5242:6;;-1:-1:-1;;;;;5242:6:0;;;:22;;;5234:80;;;;-1:-1:-1;;;5234:80:0;;;;;;;;;43321:3:::1;:10:::0;;-1:-1:-1;;;;;;43321:10:0::1;-1:-1:-1::0;;;;;43321:10:0;;;::::1;::::0;;;::::1;::::0;;43266:73::o;3142:106::-;3230:10;3142:106;:::o;43819:129::-;-1:-1:-1;;;;;43910:30:0;43886:4;43910:30;;;:13;:30;;;;;;;;;43819:129::o;43956:150::-;44018:22;;:::i;:::-;44060:38;44071:11;44092:4;44060:10;:38::i;:::-;44053:45;43956:150;-1:-1:-1;;43956:150:0:o;19674:95::-;19758:3;;19674:95::o;20421:172::-;20494:14;;:::i;:::-;20521:16;;:::i;:::-;20562:3;;20554;;:12;;;:7;:12;:::i;:::-;20548:18;;;20421:172;-1:-1:-1;;;20421:172:0:o;33372:706::-;33504:31;33527:6;33504:14;:31::i;:::-;33546:36;;:::i;:::-;33585:23;33596:6;33604:3;33585:10;:23::i;:::-;33546:62;;33619:24;33646:23;33654:6;33662;33646:7;:23::i;:::-;33619:50;;33733:12;33747:17;33776:6;-1:-1:-1;;;;;33768:20:0;33826:24;;;33852:3;33857:16;33803:71;;;;;;;;;;;;;;-1:-1:-1;;33803:71:0;;;;;;;;;;;;;;-1:-1:-1;;;;;33803:71:0;-1:-1:-1;;;;;;33803:71:0;;;;;;;;;;33768:117;;;;33803:71;33768:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33732:153;;;;33906:7;:57;;;;-1:-1:-1;33918:11:0;;:16;;:44;;;33949:4;33938:24;;;;;;;;;;;;;;33898:99;;;;-1:-1:-1;;;33898:99:0;;;;;;;;;34008:62;34025:6;34033:3;34038:16;34056:13;34008:16;:62::i;:::-;33372:706;;;;;;;:::o;35455:168::-;35529:22;;:::i;:::-;35571:44;35582:6;35590;-1:-1:-1;;;;;35590:16:0;;35607:6;35590:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35571:10;:44::i;:::-;35564:51;35455:168;-1:-1:-1;;;35455:168:0:o;1537:508::-;1954:4;2000:17;2032:7;1537:508;:::o;4521:129::-;1136:12;;;;;;;;:31;;;1152:15;:13;:15::i;:::-;1136:47;;;-1:-1:-1;1172:11:0;;;;1171:12;1136:47;1128:106;;;;-1:-1:-1;;;1128:106:0;;;;;;;;;1243:19;1266:12;;;;;;1265:13;1285:83;;;;1314:12;:19;;-1:-1:-1;;;;1314:19:0;;;;;1342:18;1329:4;1342:18;;;1285:83;4579:26:::1;:24;:26::i;:::-;4616;:24;:26::i;7813:108::-:0;1136:12;;;;;;;;:31;;;1152:15;:13;:15::i;:::-;1136:47;;;-1:-1:-1;1172:11:0;;;;1171:12;1136:47;1128:106;;;;-1:-1:-1;;;1128:106:0;;;;;;;;;1243:19;1266:12;;;;;;1265:13;1285:83;;;;1314:12;:19;;-1:-1:-1;;;;1314:19:0;;;;;1342:18;1329:4;1342:18;;;1285:83;7879:34:::1;:32;:34::i;13500:136::-:0;13558:7;13585:43;13589:1;13592;13585:43;;;;;;;;;;;;;;;;;:3;:43::i;37069:228::-;37128:21;37152:25;37170:6;37152:17;:25::i;:::-;-1:-1:-1;;;;;37192:18:0;;;;;;:10;:18;;;;;;37128:49;;-1:-1:-1;37192:35:0;;37188:102;;-1:-1:-1;;;;;37244:18:0;;;;;;;;:10;:18;;;;;:34;37069:228::o;36185:370::-;36273:7;36293:21;36317:34;36343:6;36317:17;:34::i;:::-;36293:58;;36383:2;36366:13;:19;36362:109;;36409:50;36436:21;:13;36454:2;36436:21;:17;:21;:::i;:::-;36431:2;:27;36409:17;:8;:15;:17::i;:::-;:21;:50;:21;:50;:::i;:::-;36402:57;;;;;36362:109;36488:59;36515:30;36523:2;36531:13;36515:30;:15;:30;:::i;:::-;36510:2;:36;36488:17;:8;:15;:17::i;:::-;:21;:59;:21;:59;:::i;:::-;36481:66;36185:370;-1:-1:-1;;;;36185:370:0:o;37868:371::-;38077:87;38105:58;38125:37;38136:6;38144:17;38125:10;:37::i;:::-;38105:14;;:58;:19;:58;:::i;:::-;38077:23;38088:6;38096:3;38077:10;:23::i;:::-;:27;:87;:27;:87;:::i;:::-;:92;;;38055:176;;;;-1:-1:-1;;;38055:176:0;;;;;;;;;37868:371;;;;:::o;35789:388::-;35864:22;;:::i;:::-;35899:21;35923:34;35949:6;35923:17;:34::i;:::-;35899:58;;35989:2;35972:13;:19;35968:116;;36015:57;;;;;;;;;;36031:40;36048:21;:13;36066:2;36048:21;:17;:21;:::i;:::-;36031:7;;36043:2;:27;36031:40;:11;:40;:::i;:::-;36015:57;;;36008:64;;;;;35968:116;36103:66;;;;;;;;;;36119:49;36136:30;36144:2;36152:13;36136:30;:15;:30;:::i;:::-;36119:7;;36131:2;:36;36119:49;:11;:49;:::i;:::-;36103:66;;36096:73;35789:388;-1:-1:-1;;;;35789:388:0:o;3063:69::-;1136:12;;;;;;;;:31;;;1152:15;:13;:15::i;:::-;1136:47;;;-1:-1:-1;1172:11:0;;;;1171:12;1136:47;1128:106;;;;-1:-1:-1;;;1128:106:0;;;;;;;;;1243:19;1266:12;;;;;;1265:13;1285:83;;;;1314:12;:19;;-1:-1:-1;;;;1314:19:0;;;;;1342:18;1329:4;1342:18;;;1390:14;1386:57;;;1430:5;1415:20;;-1:-1:-1;;1415:20:0;;;3063:69;:::o;4658:196::-;1136:12;;;;;;;;:31;;;1152:15;:13;:15::i;:::-;1136:47;;;-1:-1:-1;1172:11:0;;;;1171:12;1136:47;1128:106;;;;-1:-1:-1;;;1128:106:0;;;;;;;;;1243:19;1266:12;;;;;;1265:13;1285:83;;;;1314:12;:19;;-1:-1:-1;;;;1314:19:0;;;;;1342:18;1329:4;1342:18;;;1285:83;4726:17:::1;4746:12;:10;:12::i;:::-;4769:6;:18:::0;;-1:-1:-1;;;;;;4769:18:0::1;-1:-1:-1::0;;;;;4769:18:0;::::1;::::0;;::::1;::::0;;;4803:43:::1;::::0;4769:18;;-1:-1:-1;4769:18:0;-1:-1:-1;;4803:43:0::1;::::0;-1:-1:-1;;4803:43:0::1;1376:1;1390:14:::0;1386:57;;;1430:5;1415:20;;-1:-1:-1;;1415:20:0;;;4658:196;:::o;7929:526::-;1136:12;;;;;;;;:31;;;1152:15;:13;:15::i;:::-;1136:47;;;-1:-1:-1;1172:11:0;;;;1171:12;1136:47;1128:106;;;;-1:-1:-1;;;1128:106:0;;;;;;;;;1243:19;1266:12;;;;;;1265:13;1285:83;;;;1314:12;:19;;-1:-1:-1;;;;1314:19:0;;;;;1342:18;1329:4;1342:18;;;1285:83;8427:11:::1;:18:::0;;-1:-1:-1;;8427:18:0::1;8441:4;8427:18;::::0;;1386:57;;;;1430:5;1415:20;;-1:-1:-1;;1415:20:0;;;7929:526;:::o;13931:192::-;14017:7;14053:12;14045:6;;;;14037:29;;;;-1:-1:-1;;;14037:29:0;;;;;;;;;;-1:-1:-1;;;14089:5:0;;;13931:192::o;36563:466::-;-1:-1:-1;;;;;36673:18:0;;36629:7;36673:18;;;:10;:18;;;;;;36706;36702:289;;36795:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36795:37:0;-1:-1:-1;;;36795:37:0;;;36777:56;;36742:12;;36756:17;;-1:-1:-1;;;;;36777:17:0;;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36741:92;;;;36856:7;:27;;;;-1:-1:-1;36867:11:0;;:16;;36856:27;36848:73;;;;-1:-1:-1;;;36848:73:0;;;;;;;;;36963:4;36952:27;;;;;;;;;;;;;;36936:43;37008:13;-1:-1:-1;;;;;36563:466:0:o;14374:471::-;14432:7;14677:6;14673:47;;-1:-1:-1;14707:1:0;14700:8;;14673:47;14744:5;;;14748:1;14744;:5;:1;14768:5;;;;;:10;14760:56;;;;-1:-1:-1;;;14760:56:0;;;;;;;;15313:132;15371:7;15398:39;15402:1;15405;15398:39;;;;;;;;;;;;;;;;;:3;:39::i;20205:172::-;20278:14;;:::i;:::-;20305:16;;:::i;:::-;20346:3;;20338;;:12;;;:7;:12;:::i;19944:222::-;20043:3;;20037;;20016:4;;-1:-1:-1;20033:107:0;;;-1:-1:-1;20070:1:0;20063:8;;20033:107;20099:3;;20093;;:9;20089:51;;;-1:-1:-1;;;20119:9:0;;20089:51;-1:-1:-1;20157:1:0;19944:222;;;;:::o;15933:345::-;16019:7;16121:12;16114:5;16106:28;;;;-1:-1:-1;;;16106:28:0;;;;;;;;;;;16145:9;16161:1;16157;:5;;;;;;;15933:345;-1:-1:-1;;;;;15933:345:0:o;13044:181::-;13102:7;13134:5;;;13158:6;;;;13150:46;;;;-1:-1:-1;;;13150:46:0;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;:::o;1918:241::-;;2022:2;2010:9;2001:7;1997:23;1993:32;1990:2;;;-1:-1;;2028:12;1990:2;85:6;72:20;97:33;124:5;97:33;;2166:410;;;2309:2;2297:9;2288:7;2284:23;2280:32;2277:2;;;-1:-1;;2315:12;2277:2;230:6;217:20;242:41;277:5;242:41;;;2367:71;-1:-1;2475:2;2528:22;;837:20;862:47;837:20;862:47;;;2483:77;;;;2271:305;;;;;;2583:257;;2695:2;2683:9;2674:7;2670:23;2666:32;2663:2;;;-1:-1;;2701:12;2663:2;376:6;370:13;30899:5;28377:13;28370:21;30877:5;30874:32;30864:2;;-1:-1;;30910:12;3671:291;;3800:2;3788:9;3779:7;3775:23;3771:32;3768:2;;;-1:-1;;3806:12;3768:2;1019:6;1013:13;1031:47;1072:5;1031:47;;3969:446;;;4118:9;4109:7;4105:23;4130:2;4105:23;4101:32;4098:2;;;-1:-1;;4136:12;4098:2;850:6;837:20;862:47;903:5;862:47;;;4188:77;-1:-1;4302:2;-1:-1;;1213:16;;1209:25;1206:2;;;-1:-1;;1237:12;1206:2;;4302;4371:9;4367:22;4310:89;;4092:323;;;;;;4422:289;;4550:2;4538:9;4529:7;4525:23;4521:32;4518:2;;;-1:-1;;4556:12;4518:2;26681;26675:9;4550:2;26711:6;26707:17;26818:6;26806:10;26803:22;26782:18;26770:10;26767:34;26764:62;26761:2;;;-1:-1;;26829:12;26761:2;26681;26848:22;1707:20;;1537:75;;-1:-1;1544:16;4512:199;-1:-1;4512:199;4718:241;;4822:2;4810:9;4801:7;4797:23;4793:32;4790:2;;;-1:-1;;4828:12;4790:2;-1:-1;1707:20;;4784:175;-1:-1;4784:175;4966:263;;5081:2;5069:9;5060:7;5056:23;5052:32;5049:2;;;-1:-1;;5087:12;5049:2;-1:-1;1855:13;;5043:186;-1:-1;5043:186;15237:271;;6784:5;27169:12;6895:52;6940:6;6935:3;6928:4;6921:5;6917:16;6895:52;;;6959:16;;;;;15371:137;-1:-1;;15371:137;15515:222;-1:-1;;;;;28799:54;;;;5664:37;;15642:2;15627:18;;15613:124;15744:349;-1:-1;;;;;28799:54;;;;5523:58;;16079:2;16064:18;;15068:37;15907:2;15892:18;;15878:215;16440:396;16630:2;16644:47;;;27169:12;;16615:18;;;27714:19;;;16440:396;;16630:2;27010:14;;;;27754;;;;16440:396;6197:286;6222:6;6219:1;6216:13;6197:286;;;6283:13;;-1:-1;;;;;28799:54;7061:63;;27569:14;;;;5416;;;;26782:18;6237:9;6197:286;;;-1:-1;16697:129;;16601:235;-1:-1;;;;;;16601:235;16843:210;28377:13;;28370:21;6578:34;;16964:2;16949:18;;16935:118;17572:310;;17719:2;17740:17;17733:47;7601:5;27169:12;27726:6;17719:2;17708:9;17704:18;27714:19;7695:52;7740:6;27754:14;17708:9;27754:14;17719:2;7721:5;7717:16;7695:52;;;1213:16;30517:14;-1:-1;;30513:28;7759:39;;;;27754:14;7759:39;;17690:192;-1:-1;;17690:192;17889:416;18089:2;18103:47;;;8035:2;18074:18;;;27714:19;-1:-1;;;27754:14;;;8051:45;8115:12;;;18060:245;18312:416;18512:2;18526:47;;;8366:2;18497:18;;;27714:19;-1:-1;;;27754:14;;;8382:40;8441:12;;;18483:245;18735:416;18935:2;18949:47;;;8692:2;18920:18;;;27714:19;8728:31;27754:14;;;8708:52;8779:12;;;18906:245;19158:416;19358:2;19372:47;;;9030:2;19343:18;;;27714:19;9066:27;27754:14;;;9046:48;9113:12;;;19329:245;19581:416;19781:2;19795:47;;;9364:2;19766:18;;;27714:19;9400:29;27754:14;;;9380:50;9449:12;;;19752:245;20004:416;20204:2;20218:47;;;9700:2;20189:18;;;27714:19;9736:34;27754:14;;;9716:55;-1:-1;;;9791:12;;;9784:31;9834:12;;;20175:245;20427:416;20627:2;20641:47;;;10085:2;20612:18;;;27714:19;10121:34;27754:14;;;10101:55;-1:-1;;;10176:12;;;10169:31;10219:12;;;20598:245;20850:416;21050:2;21064:47;;;10470:2;21035:18;;;27714:19;10506:34;27754:14;;;10486:55;-1:-1;;;10561:12;;;10554:25;10598:12;;;21021:245;21273:416;21473:2;21487:47;;;10849:2;21458:18;;;27714:19;-1:-1;;;27754:14;;;10865:38;10922:12;;;21444:245;21696:416;21896:2;21910:47;;;11173:2;21881:18;;;27714:19;-1:-1;;;27754:14;;;11189:45;11253:12;;;21867:245;22119:416;22319:2;22333:47;;;11504:2;22304:18;;;27714:19;11540:34;27754:14;;;11520:55;-1:-1;;;11595:12;;;11588:25;11632:12;;;22290:245;22542:416;22742:2;22756:47;;;11883:2;22727:18;;;27714:19;11919:34;27754:14;;;11899:55;-1:-1;;;11974:12;;;11967:26;12012:12;;;22713:245;22965:416;23165:2;23179:47;;;12263:2;23150:18;;;27714:19;12299:34;27754:14;;;12279:55;-1:-1;;;12354:12;;;12347:38;12404:12;;;23136:245;23388:416;23588:2;23602:47;;;12655:2;23573:18;;;27714:19;-1:-1;;;27754:14;;;12671:40;12730:12;;;23559:245;23811:416;24011:2;24025:47;;;12981:2;23996:18;;;27714:19;13017:34;27754:14;;;12997:55;-1:-1;;;13072:12;;;13065:26;13110:12;;;23982:245;24234:416;24434:2;24448:47;;;13361:2;24419:18;;;27714:19;13397:34;27754:14;;;13377:55;-1:-1;;;13452:12;;;13445:39;13503:12;;;24405:245;24657:416;24857:2;24871:47;;;13754:2;24842:18;;;27714:19;-1:-1;;;27754:14;;;13770:38;13827:12;;;24828:245;25080:416;25280:2;25294:47;;;14078:2;25265:18;;;27714:19;14114:34;27754:14;;;14094:55;-1:-1;;;14169:12;;;14162:37;14218:12;;;25251:245;25503:416;25703:2;25717:47;;;14469:2;25688:18;;;27714:19;14505:34;27754:14;;;14485:55;-1:-1;;;14560:12;;;14553:30;14602:12;;;25674:245;25926:457;14887:23;;15068:37;;-1:-1;;;;;28799:54;26369:2;26354:18;;7061:63;26143:2;26128:18;;26114:269;26390:222;15068:37;;;26517:2;26502:18;;26488:124;30173:268;30238:1;30245:101;30259:6;30256:1;30253:13;30245:101;;;30326:11;;;30320:18;30307:11;;;30300:39;30281:2;30274:10;30245:101;;;30361:6;30358:1;30355:13;30352:2;;;-1:-1;;30238:1;30408:16;;30401:27;30222:219;30554:117;-1:-1;;;;;28799:54;;30613:35;;30603:2;;30662:1;;30652:12

Swarm Source

ipfs://99edc94eabf6e15e3a356ae758084b1c9de17de3e11379609cada71f7b126686
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading