ETH Price: $2,432.07 (+0.39%)
Gas: 0.13 GWei

Contract

0x009a0b7C38B542208936F1179151CD08E2943833

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0 ETH

ETH Value

$0.00

Token Holdings

Transaction Hash
Method
Block
From
To
Redeem Underlyin...103948172024-10-06 12:35:413 mins ago1728218141IN
0x009a0b7C...8E2943833
0 ETH0.00003130.13599573
Redeem Underlyin...103944622024-10-06 12:23:5115 mins ago1728217431IN
0x009a0b7C...8E2943833
0 ETH0.000071580.15740881
Supply103943602024-10-06 12:20:2719 mins ago1728217227IN
0x009a0b7C...8E2943833
0.00481212 ETH0.000033830.15827411
Enter Markets103943492024-10-06 12:20:0519 mins ago1728217205IN
0x009a0b7C...8E2943833
0 ETH0.000014770.15833152
Redeem Underlyin...103938762024-10-06 12:04:1935 mins ago1728216259IN
0x009a0b7C...8E2943833
0 ETH0.000054370.15809358
Redeem Underlyin...103937872024-10-06 12:01:2138 mins ago1728216081IN
0x009a0b7C...8E2943833
0 ETH0.000055770.15770885
Redeem Underlyin...103937412024-10-06 11:59:4939 mins ago1728215989IN
0x009a0b7C...8E2943833
0 ETH0.000073820.16571022
Repay Borrow103936672024-10-06 11:57:2142 mins ago1728215841IN
0x009a0b7C...8E2943833
0.0000901 ETH0.00002540.15704987
Repay Borrow103936632024-10-06 11:57:1342 mins ago1728215833IN
0x009a0b7C...8E2943833
0.00067018 ETH0.00002540.15702167
Borrow103932462024-10-06 11:43:1856 mins ago1728214998IN
0x009a0b7C...8E2943833
0 ETH0.00006970.1549459
Borrow103931722024-10-06 11:40:4958 mins ago1728214849IN
0x009a0b7C...8E2943833
0 ETH0.000070810.15464315
Supply103931672024-10-06 11:40:3958 mins ago1728214839IN
0x009a0b7C...8E2943833
0.00016921 ETH0.000033040.15460754
Supply103930602024-10-06 11:37:051 hr ago1728214625IN
0x009a0b7C...8E2943833
0 ETH0.000040650.16877789
Enter Markets103930192024-10-06 11:35:431 hr ago1728214543IN
0x009a0b7C...8E2943833
0 ETH0.000014810.15885565
Redeem Underlyin...103921642024-10-06 11:07:131 hr ago1728212833IN
0x009a0b7C...8E2943833
0 ETH0.000068940.14816673
Repay Borrow103920822024-10-06 11:04:291 hr ago1728212669IN
0x009a0b7C...8E2943833
0.0001645 ETH0.000023890.14767047
Borrow103916582024-10-06 10:50:211 hr ago1728211821IN
0x009a0b7C...8E2943833
0 ETH0.00007570.14628198
Supply103915692024-10-06 10:47:231 hr ago1728211643IN
0x009a0b7C...8E2943833
0 ETH0.000035950.1459081
Enter Markets103915412024-10-06 10:46:271 hr ago1728211587IN
0x009a0b7C...8E2943833
0 ETH0.00001110.14575884
Supply103913162024-10-06 10:38:572 hrs ago1728211137IN
0x009a0b7C...8E2943833
0 ETH0.000027350.14429202
Redeem Underlyin...103910922024-10-06 10:31:292 hrs ago1728210689IN
0x009a0b7C...8E2943833
0 ETH0.000016530.04232905
Claim Lab103908472024-10-06 10:23:172 hrs ago1728210197IN
0x009a0b7C...8E2943833
0 ETH0.000028460.143
Redeem Underlyin...103908272024-10-06 10:22:372 hrs ago1728210157IN
0x009a0b7C...8E2943833
0 ETH0.000033850.143
Redeem Underlyin...103906152024-10-06 10:15:332 hrs ago1728209733IN
0x009a0b7C...8E2943833
0 ETH0.000016490.04222398
Redeem Underlyin...103904342024-10-06 10:09:302 hrs ago1728209370IN
0x009a0b7C...8E2943833
0 ETH0.000012940.04352919
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
103948172024-10-06 12:35:413 mins ago1728218141
0x009a0b7C...8E2943833
0 ETH
103948172024-10-06 12:35:413 mins ago1728218141
0x009a0b7C...8E2943833
0 ETH
103948172024-10-06 12:35:413 mins ago1728218141
0x009a0b7C...8E2943833
0 ETH
103948172024-10-06 12:35:413 mins ago1728218141
0x009a0b7C...8E2943833
0 ETH
103948172024-10-06 12:35:413 mins ago1728218141
0x009a0b7C...8E2943833
0 ETH
103944622024-10-06 12:23:5115 mins ago1728217431
0x009a0b7C...8E2943833
0 ETH
103944622024-10-06 12:23:5115 mins ago1728217431
0x009a0b7C...8E2943833
0 ETH
103944622024-10-06 12:23:5115 mins ago1728217431
0x009a0b7C...8E2943833
0 ETH
103944622024-10-06 12:23:5115 mins ago1728217431
0x009a0b7C...8E2943833
0 ETH
103944622024-10-06 12:23:5115 mins ago1728217431
0x009a0b7C...8E2943833
0 ETH
103944622024-10-06 12:23:5115 mins ago1728217431
0x009a0b7C...8E2943833
0 ETH
103944622024-10-06 12:23:5115 mins ago1728217431
0x009a0b7C...8E2943833
0 ETH
103943602024-10-06 12:20:2719 mins ago1728217227
0x009a0b7C...8E2943833
0 ETH
103943602024-10-06 12:20:2719 mins ago1728217227
0x009a0b7C...8E2943833
0.00481212 ETH
103943602024-10-06 12:20:2719 mins ago1728217227
0x009a0b7C...8E2943833
0 ETH
103938762024-10-06 12:04:1935 mins ago1728216259
0x009a0b7C...8E2943833
0 ETH
103938762024-10-06 12:04:1935 mins ago1728216259
0x009a0b7C...8E2943833
0 ETH
103938762024-10-06 12:04:1935 mins ago1728216259
0x009a0b7C...8E2943833
0 ETH
103938762024-10-06 12:04:1935 mins ago1728216259
0x009a0b7C...8E2943833
0 ETH
103938762024-10-06 12:04:1935 mins ago1728216259
0x009a0b7C...8E2943833
0 ETH
103938762024-10-06 12:04:1935 mins ago1728216259
0x009a0b7C...8E2943833
0 ETH
103937872024-10-06 12:01:2138 mins ago1728216081
0x009a0b7C...8E2943833
0 ETH
103937872024-10-06 12:01:2138 mins ago1728216081
0x009a0b7C...8E2943833
0 ETH
103937872024-10-06 12:01:2138 mins ago1728216081
0x009a0b7C...8E2943833
0 ETH
103937872024-10-06 12:01:2138 mins ago1728216081
0x009a0b7C...8E2943833
0 ETH
View All Internal Transactions
Loading...
Loading

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

Contract Name:
Core

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at lineascan.build/ on 2023-07-19
*/

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

// File contracts/library/Constant.sol

pragma solidity ^0.6.12;

library Constant {
  uint256 public constant CLOSE_FACTOR_MIN = 5e16;
  uint256 public constant CLOSE_FACTOR_MAX = 9e17;
  uint256 public constant COLLATERAL_FACTOR_MAX = 9e17;
  uint256 public constant LIQUIDATION_THRESHOLD_MAX = 9e17;
  uint256 public constant LIQUIDATION_BONUS_MAX = 5e17;

  enum EcoScorePreviewOption {
    LOCK,
    CLAIM,
    EXTEND,
    LOCK_MORE
  }

  enum LoanState {
    None,
    Active,
    Auction,
    Repaid,
    Defaulted
  }

  struct MarketInfo {
    bool isListed;
    uint256 supplyCap;
    uint256 borrowCap;
    uint256 collateralFactor;
  }

  struct BorrowInfo {
    uint256 borrow;
    uint256 interestIndex;
  }

  struct LoanData {
    uint256 loanId;
    LoanState state;
    address borrower;
    address gNft;
    address nftAsset;
    uint256 nftTokenId;
    uint256 borrowAmount;
    uint256 interestIndex;
    uint256 bidStartTimestamp;
    address bidderAddress;
    uint256 bidPrice;
    uint256 bidBorrowAmount;
    uint256 floorPrice;
    uint256 bidCount;
    address firstBidderAddress;
  }

  struct AccountSnapshot {
    uint256 gTokenBalance;
    uint256 borrowBalance;
    uint256 exchangeRate;
  }

  struct AccrueSnapshot {
    uint256 totalBorrow;
    uint256 totalReserve;
    uint256 accInterestIndex;
  }

  struct AccrueLoanSnapshot {
    uint256 totalBorrow;
    uint256 accInterestIndex;
  }

  struct DistributionInfo {
    uint256 supplySpeed;
    uint256 borrowSpeed;
    uint256 totalBoostedSupply;
    uint256 totalBoostedBorrow;
    uint256 accPerShareSupply;
    uint256 accPerShareBorrow;
    uint256 accruedAt;
  }

  struct DistributionAccountInfo {
    uint256 accuredLAB; // Unclaimed LAB rewards amount
    uint256 boostedSupply; // effective(boosted) supply balance of user  (since last_action)
    uint256 boostedBorrow; // effective(boosted) borrow balance of user  (since last_action)
    uint256 accPerShareSupply; // Last integral value of LAB rewards per share. ∫(LABRate(t) / totalShare(t) dt) from 0 till (last_action)
    uint256 accPerShareBorrow; // Last integral value of LAB rewards per share. ∫(LABRate(t) / totalShare(t) dt) from 0 till (last_action)
  }

  struct DistributionAPY {
    uint256 apySupplyLab;
    uint256 apyBorrowLab;
    uint256 apyAccountSupplyLab;
    uint256 apyAccountBorrowLab;
  }

  struct RebateCheckpoint {
    uint256 timestamp;
    uint256 totalScore;
    uint256 adminFeeRate;
    uint256 weeklyLabSpeed;
    uint256 additionalLabAmount;
    mapping(address => uint256) marketFees;
  }

  struct LockInfo {
    uint256 timestamp;
    uint256 amount;
    uint256 expiry;
  }
}


// File contracts/interfaces/ILToken.sol

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

interface ILToken {
  function underlying() external view returns (address);

  function totalSupply() external view returns (uint256);

  function accountSnapshot(address account) external view returns (Constant.AccountSnapshot memory);

  function underlyingBalanceOf(address account) external view returns (uint256);

  function borrowBalanceOf(address account) external view returns (uint256);

  function totalBorrow() external view returns (uint256);

  function _totalBorrow() external view returns (uint256);

  function totalReserve() external view returns (uint256);

  function reserveFactor() external view returns (uint256);

  function lastAccruedTime() external view returns (uint256);

  function accInterestIndex() external view returns (uint256);

  function exchangeRate() external view returns (uint256);

  function getCash() external view returns (uint256);

  function getRateModel() external view returns (address);

  function getAccInterestIndex() external view returns (uint256);

  function accruedAccountSnapshot(address account) external returns (Constant.AccountSnapshot memory);

  function accruedBorrowBalanceOf(address account) external returns (uint256);

  function accruedTotalBorrow() external returns (uint256);

  function accruedExchangeRate() external returns (uint256);

  function approve(address spender, uint256 amount) external returns (bool);

  function allowance(address owner, address spender) external view returns (uint256);

  function balanceOf(address account) external view returns (uint256);

  function transfer(address dst, uint256 amount) external returns (bool);

  function transferFrom(address src, address dst, uint256 amount) external returns (bool);

  function supply(address account, uint256 underlyingAmount) external payable returns (uint256);

  function redeemToken(address account, uint256 gTokenAmount) external returns (uint256);

  function redeemUnderlying(address account, uint256 underlyingAmount) external returns (uint256);

  function borrow(address account, uint256 amount) external returns (uint256);

  function repayBorrow(address account, uint256 amount) external payable returns (uint256);

  function repayBorrowBehalf(address payer, address borrower, uint256 amount) external payable returns (uint256);

  function liquidateBorrow(
    address gTokenCollateral,
    address liquidator,
    address borrower,
    uint256 amount
  ) external payable returns (uint256 seizeGAmount, uint256 rebateGAmount, uint256 liquidatorGAmount);

  function seize(address liquidator, address borrower, uint256 gTokenAmount) external;

  function withdrawReserves() external;

  function transferTokensInternal(address spender, address src, address dst, uint256 amount) external;
}


// File contracts/interfaces/ICore.sol

pragma solidity ^0.6.12;

interface ICore {
  /* ========== Event ========== */
  event MarketSupply(address user, address gToken, uint256 uAmount);
  event MarketRedeem(address user, address gToken, uint256 uAmount);

  event MarketListed(address gToken);
  event MarketEntered(address gToken, address account);
  event MarketExited(address gToken, address account);

  event CloseFactorUpdated(uint256 newCloseFactor);
  event CollateralFactorUpdated(address gToken, uint256 newCollateralFactor);
  event LiquidationIncentiveUpdated(uint256 newLiquidationIncentive);
  event SupplyCapUpdated(address indexed gToken, uint256 newSupplyCap);
  event BorrowCapUpdated(address indexed gToken, uint256 newBorrowCap);
  event KeeperUpdated(address newKeeper);
  event NftCoreUpdated(address newNftCore);
  event ValidatorUpdated(address newValidator);
  event LABDistributorUpdated(address newLABDistributor);
  event RebateDistributorUpdated(address newRebateDistributor);
  event FlashLoan(
    address indexed target,
    address indexed initiator,
    address indexed asset,
    uint256 amount,
    uint256 premium
  );

  function nftCore() external view returns (address);

  function validator() external view returns (address);

  function rebateDistributor() external view returns (address);

  function allMarkets() external view returns (address[] memory);

  function marketListOf(address account) external view returns (address[] memory);

  function marketInfoOf(address gToken) external view returns (Constant.MarketInfo memory);

  function checkMembership(address account, address gToken) external view returns (bool);

  function accountLiquidityOf(
    address account
  ) external view returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD);

  function closeFactor() external view returns (uint256);

  function liquidationIncentive() external view returns (uint256);

  function enterMarkets(address[] memory gTokens) external;

  function exitMarket(address gToken) external;

  function supply(address gToken, uint256 underlyingAmount) external payable returns (uint256);

  function redeemToken(address gToken, uint256 gTokenAmount) external returns (uint256 redeemed);

  function redeemUnderlying(address gToken, uint256 underlyingAmount) external returns (uint256 redeemed);

  function borrow(address gToken, uint256 amount) external;

  function nftBorrow(address gToken, address user, uint256 amount) external;

  function repayBorrow(address gToken, uint256 amount) external payable;

  function nftRepayBorrow(address gToken, address user, uint256 amount) external payable;

  function repayBorrowBehalf(address gToken, address borrower, uint256 amount) external payable;

  function liquidateBorrow(
    address gTokenBorrowed,
    address gTokenCollateral,
    address borrower,
    uint256 amount
  ) external payable;

  function claimLab() external;

  function claimLab(address market) external;

  function transferTokens(address spender, address src, address dst, uint256 amount) external;

  function compoundLab() external;
}


// File contracts/interfaces/IPriceCalculator.sol

pragma solidity ^0.6.12;

interface IPriceCalculator {
  struct ReferenceData {
    uint256 lastData;
    uint256 lastUpdated;
  }

  function priceOf(address asset) external view returns (uint256);

  function pricesOf(address[] memory assets) external view returns (uint256[] memory);

  function priceOfETH() external view returns (uint256);

  function getUnderlyingPrice(address gToken) external view returns (uint256);

  function getUnderlyingPrices(address[] memory gTokens) external view returns (uint256[] memory);
}


// File contracts/interfaces/ILABDistributor.sol

pragma solidity ^0.6.12;

interface ILABDistributor {
  /* ========== EVENTS ========== */
  event DistributionSpeedUpdated(address indexed gToken, uint256 supplySpeed, uint256 borrowSpeed);
  event Claimed(address indexed user, uint256 amount);
  event Compound(address indexed user, uint256 amount);

  function accuredLAB(address[] calldata markets, address account) external view returns (uint);

  function distributionInfoOf(address market) external view returns (Constant.DistributionInfo memory);

  function accountDistributionInfoOf(
    address market,
    address account
  ) external view returns (Constant.DistributionAccountInfo memory);

  function apyDistributionOf(address market, address account) external view returns (Constant.DistributionAPY memory);

  function boostedRatioOf(
    address market,
    address account
  ) external view returns (uint boostedSupplyRatio, uint boostedBorrowRatio);

  function notifySupplyUpdated(address market, address user) external;

  function notifyBorrowUpdated(address market, address user) external;

  function notifyTransferred(address qToken, address sender, address receiver) external;

  function claim(address[] calldata markets, address account) external;

  function kick(address user) external;

  function updateAccountBoostedInfo(address user) external;

  function compound(address[] calldata markets, address account) external;
   
  function pause() external;

  function unpause() external;

  function approve(address _spender, uint256 amount) external returns (bool);
}


// File contracts/interfaces/IRebateDistributor.sol

pragma solidity ^0.6.12;

interface IRebateDistributor {
  function setKeeper(address _keeper) external;

  function pause() external;

  function unpause() external;

  function updateAdminFeeRate(uint256 newAdminFeeRate) external;

  function checkpoint() external;

  function weeklyRebatePool() external view returns (uint256);

  function weeklyProfitOfVP(uint256 vp) external view returns (uint256);

  function weeklyProfitOf(address account) external view returns (uint256);

  function indicativeYearProfit() external view returns (uint256);

  function accruedRebates(address account) external view returns (uint256, uint256, uint256[] memory);

  function claimRebates() external returns (uint256, uint256, uint256[] memory);

  function claimAdminRebates() external returns (uint256, uint256[] memory);

  function addLABToRebatePool(uint256 amount) external;

  function addMarketUTokenToRebatePool(address lToken, uint256 uAmount) external payable;
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/*
 * @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.
 */
abstract contract Context {
    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;
    }
}


// File @openzeppelin/contracts/access/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @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.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: 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 Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.0 <0.8.0;

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

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

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


// File contracts/CoreAdmin.sol

pragma solidity ^0.6.12;






abstract contract CoreAdmin is ICore, Ownable, ReentrancyGuard, Pausable {
  /* ========== STATE VARIABLES ========== */

  address public keeper;
  address public override nftCore;
  address public override validator;
  address public override rebateDistributor;
  ILABDistributor public labDistributor;
  IPriceCalculator public priceCalculator;

  address[] public markets; // gTokenAddress[]
  mapping(address => Constant.MarketInfo) public marketInfos; // (gTokenAddress => MarketInfo)

  uint256 public override closeFactor;
  uint256 public override liquidationIncentive;

  /* ========== MODIFIERS ========== */

  /// @dev sender 가 keeper address 인지 검증
  modifier onlyKeeper() {
    require(msg.sender == keeper || msg.sender == owner(), "Core: caller is not the owner or keeper");
    _;
  }

  /// @dev Market 에 list 된 gToken address 인지 검증
  /// @param gToken gToken address
  modifier onlyListedMarket(address gToken) {
    require(marketInfos[gToken].isListed, "Core: invalid market");
    _;
  }

  modifier onlyNftCore() {
    require(msg.sender == nftCore, "Core: caller is not the nft core");
    _;
  }

  /* ========== INITIALIZER ========== */

  function __Core_init() internal {
    closeFactor = 5e17; // 0.5
    liquidationIncentive = 115e16; // 1.15
  }

  /* ========== RESTRICTED FUNCTIONS ========== */

  function setPriceCalculator(address _priceCalculator) external onlyKeeper {
    require(_priceCalculator != address(0), "Core: invalid calculator address");
    priceCalculator = IPriceCalculator(_priceCalculator);
  }

  /// @notice keeper address 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param _keeper 새로운 keeper address
  function setKeeper(address _keeper) external onlyKeeper {
    require(_keeper != address(0), "Core: invalid keeper address");
    keeper = _keeper;
    emit KeeperUpdated(_keeper);
  }

  function setNftCore(address _nftCore) external onlyKeeper {
    require(_nftCore != address(0), "Core: invalid nft core address");
    nftCore = _nftCore;
    emit NftCoreUpdated(_nftCore);
  }

  /// @notice validator 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param _validator 새로운 validator address
  function setValidator(address _validator) external onlyKeeper {
    require(_validator != address(0), "Core: invalid validator address");
    validator = _validator;
    emit ValidatorUpdated(_validator);
  }

  /// @notice labDistributor 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param _labDistributor 새로운 labDistributor address
  function setLABDistributor(address _labDistributor) external onlyKeeper {
    require(_labDistributor != address(0), "Core: invalid labDistributor address");
    labDistributor = ILABDistributor(_labDistributor);
    emit LABDistributorUpdated(_labDistributor);
  }

  function setRebateDistributor(address _rebateDistributor) external onlyKeeper {
    require(_rebateDistributor != address(0), "Core: invalid rebateDistributor address");
    rebateDistributor = _rebateDistributor;
    emit RebateDistributorUpdated(_rebateDistributor);
  }

  /// @notice close factor 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param newCloseFactor 새로운 close factor 값 (TBD)
  function setCloseFactor(uint256 newCloseFactor) external onlyKeeper {
    require(
      newCloseFactor >= Constant.CLOSE_FACTOR_MIN && newCloseFactor <= Constant.CLOSE_FACTOR_MAX,
      "Core: invalid close factor"
    );
    closeFactor = newCloseFactor;
    emit CloseFactorUpdated(newCloseFactor);
  }

  /// @notice Market collateral factor (담보 인정 비율) 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param gToken gToken address
  /// @param newCollateralFactor collateral factor (담보 인정 비율)
  function setCollateralFactor(
    address gToken,
    uint256 newCollateralFactor
  ) external onlyKeeper onlyListedMarket(gToken) {
    require(newCollateralFactor <= Constant.COLLATERAL_FACTOR_MAX, "Core: invalid collateral factor");
    if (newCollateralFactor != 0 && priceCalculator.getUnderlyingPrice(gToken) == 0) {
      revert("Core: invalid underlying price");
    }

    marketInfos[gToken].collateralFactor = newCollateralFactor;
    emit CollateralFactorUpdated(gToken, newCollateralFactor);
  }

  /// @notice 청산 인센티브 설정
  /// @dev keeper address 에서만 요청 가능
  /// @param newLiquidationIncentive 새로운 청산 인센티브 값 (TBD)
  function setLiquidationIncentive(uint256 newLiquidationIncentive) external onlyKeeper {
    liquidationIncentive = newLiquidationIncentive;
    emit LiquidationIncentiveUpdated(newLiquidationIncentive);
  }

  /// @notice Market supply cap 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param gTokens gToken addresses
  /// @param newSupplyCaps new supply caps in array
  function setMarketSupplyCaps(address[] calldata gTokens, uint256[] calldata newSupplyCaps) external onlyKeeper {
    require(gTokens.length != 0 && gTokens.length == newSupplyCaps.length, "Core: invalid data");

    for (uint256 i = 0; i < gTokens.length; i++) {
      marketInfos[gTokens[i]].supplyCap = newSupplyCaps[i];
      emit SupplyCapUpdated(gTokens[i], newSupplyCaps[i]);
    }
  }

  /// @notice Market borrow cap 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param gTokens gToken addresses
  /// @param newBorrowCaps new borrow caps in array
  function setMarketBorrowCaps(address[] calldata gTokens, uint256[] calldata newBorrowCaps) external onlyKeeper {
    require(gTokens.length != 0 && gTokens.length == newBorrowCaps.length, "Core: invalid data");

    for (uint256 i = 0; i < gTokens.length; i++) {
      marketInfos[gTokens[i]].borrowCap = newBorrowCaps[i];
      emit BorrowCapUpdated(gTokens[i], newBorrowCaps[i]);
    }
  }

  /// @notice Market 추가
  /// @dev keeper address 에서만 요청 가능
  /// @param gToken gToken address
  /// @param supplyCap supply cap
  /// @param borrowCap borrow cap
  /// @param collateralFactor collateral factor (담보 인정 비율)
  function listMarket(
    address payable gToken,
    uint256 supplyCap,
    uint256 borrowCap,
    uint256 collateralFactor
  ) external onlyKeeper {
    require(!marketInfos[gToken].isListed, "Core: already listed market");
    for (uint256 i = 0; i < markets.length; i++) {
      require(markets[i] != gToken, "Core: already listed market");
    }

    marketInfos[gToken] = Constant.MarketInfo({
      isListed: true,
      supplyCap: supplyCap,
      borrowCap: borrowCap,
      collateralFactor: collateralFactor
    });
    markets.push(gToken);
    emit MarketListed(gToken);
  }

  /// @notice Market 제거
  /// @dev keeper address 에서만 요청 가능
  /// @param gToken gToken address
  function removeMarket(address payable gToken) external onlyKeeper {
    require(marketInfos[gToken].isListed, "Core: unlisted market");
    require(ILToken(gToken).totalSupply() == 0 && ILToken(gToken).totalBorrow() == 0, "Core: cannot remove market");

    uint256 length = markets.length;
    for (uint256 i = 0; i < length; i++) {
      if (markets[i] == gToken) {
        markets[i] = markets[length - 1];
        markets.pop();
        delete marketInfos[gToken];
        break;
      }
    }
  }

  function pause() external onlyKeeper {
    _pause();
  }

  function unpause() external onlyKeeper {
    _unpause();
  }
}


// File contracts/interfaces/IValidator.sol

pragma solidity ^0.6.12;

interface IValidator {
  function redeemAllowed(address gToken, address redeemer, uint256 redeemAmount) external returns (bool);

  function borrowAllowed(address gToken, address borrower, uint256 borrowAmount) external returns (bool);

  function liquidateAllowed(
    address gTokenBorrowed,
    address borrower,
    uint256 repayAmount,
    uint256 closeFactor
  ) external returns (bool);

  function gTokenAmountToSeize(
    address gTokenBorrowed,
    address gTokenCollateral,
    uint256 actualRepayAmount
  ) external returns (uint256 seizeGAmount, uint256 rebateGAmount, uint256 liquidatorGAmount);

  function getAccountLiquidity(
    address account
  ) external view returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD);
}


// File @openzeppelin/contracts/math/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}


// File contracts/Core.sol

pragma solidity ^0.6.12;



contract Core is CoreAdmin {
  using SafeMath for uint256;

  /* ========== CONSTANT VARIABLES ========== */

  address internal constant ETH = 0x0000000000000000000000000000000000000000;

  /* ========== STATE VARIABLES ========== */

  mapping(address => address[]) public marketListOfUsers; // (account => gTokenAddress[])
  mapping(address => mapping(address => bool)) public usersOfMarket; // (gTokenAddress => (account => joined))

  // initializer
  bool public initialized;

  /* ========== INITIALIZER ========== */

  constructor() public {}

  function initialize(address _priceCalculator) external onlyOwner {
    require(initialized == false, "already initialized");

    __Core_init();
    priceCalculator = IPriceCalculator(_priceCalculator);

    initialized = true;
  }

  /* ========== MODIFIERS ========== */

  /// @dev sender 가 해당 gToken 의 Market Enter 되어있는 상태인지 검사
  /// @param gToken 검사할 Market 의 gToken address
  modifier onlyMemberOfMarket(address gToken) {
    require(usersOfMarket[gToken][msg.sender], "Core: must enter market");
    _;
  }

  /// @dev caller 가 market 인지 검사
  modifier onlyMarket() {
    bool fromMarket = false;
    for (uint256 i = 0; i < markets.length; i++) {
      if (msg.sender == markets[i]) {
        fromMarket = true;
        break;
      }
    }
    require(fromMarket == true, "Core: caller should be market");
    _;
  }

  /* ========== VIEWS ========== */

  /// @notice market addresses 조회
  /// @return markets address[]
  function allMarkets() external view override returns (address[] memory) {
    return markets;
  }

  /// @notice gToken 의 marketInfo 조회
  /// @param gToken gToken address
  /// @return Market info
  function marketInfoOf(address gToken) external view override returns (Constant.MarketInfo memory) {
    return marketInfos[gToken];
  }

  /// @notice account 의 market addresses
  /// @param account account address
  /// @return Market addresses of account
  function marketListOf(address account) external view override returns (address[] memory) {
    return marketListOfUsers[account];
  }

  /// @notice account market enter 상태인지 여부 조회
  /// @param account account address
  /// @param gToken gToken address
  /// @return Market enter 여부에 대한 boolean value
  function checkMembership(address account, address gToken) external view override returns (bool) {
    return usersOfMarket[gToken][account];
  }

  /// @notice !TBD
  function accountLiquidityOf(
    address account
  ) external view override returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD) {
    return IValidator(validator).getAccountLiquidity(account);
  }

  /* ========== MUTATIVE FUNCTIONS ========== */

  /// @notice 여러 token 에 대하여 Enter Market 수행
  /// @dev 해당 Token 을 대출하거나, 담보로 enable 하기 위해서는 Enter Market 이 필요함
  /// @param gTokens gToken addresses
  function enterMarkets(address[] memory gTokens) public override {
    for (uint256 i = 0; i < gTokens.length; i++) {
      _enterMarket(payable(gTokens[i]), msg.sender);
    }
  }

  /// @notice 하나의 token 에 대하여 Market Exit 수행
  /// @dev Market 에서 제거할 시에 해당 토큰이 담보물에서 제거되어 청산되지 않음
  /// @param gToken Token address
  function exitMarket(address gToken) external override onlyListedMarket(gToken) onlyMemberOfMarket(gToken) {
    Constant.AccountSnapshot memory snapshot = ILToken(gToken).accruedAccountSnapshot(msg.sender);
    require(snapshot.borrowBalance == 0, "Core: borrow balance must be zero");
    require(IValidator(validator).redeemAllowed(gToken, msg.sender, snapshot.gTokenBalance), "Core: cannot redeem");

    _removeUserMarket(gToken, msg.sender);
    emit MarketExited(gToken, msg.sender);
  }

  /// @notice 담보 제공 트랜잭션
  /// @param gToken 담보 gToken address
  /// @param uAmount 담보 gToken amount
  /// @return gAmount
  function supply(
    address gToken,
    uint256 uAmount
  ) external payable override onlyListedMarket(gToken) nonReentrant whenNotPaused returns (uint256) {
    uAmount = ILToken(gToken).underlying() == address(ETH) ? msg.value : uAmount;
    uint256 supplyCap = marketInfos[gToken].supplyCap;
    require(
      supplyCap == 0 ||
        ILToken(gToken).totalSupply().mul(ILToken(gToken).exchangeRate()).div(1e18).add(uAmount) <= supplyCap,
      "Core: supply cap reached"
    );

    uint256 gAmount = ILToken(gToken).supply{value: msg.value}(msg.sender, uAmount);
    labDistributor.notifySupplyUpdated(gToken, msg.sender);

    emit MarketSupply(msg.sender, gToken, uAmount);
    return gAmount;
  }

  /// @notice 담보로 제공한 토큰을 전부 Redeem All
  /// @param gToken 담보 gToken address
  /// @param gAmount 담보 gToken redeem amount
  /// @return uAmountRedeem
  function redeemToken(
    address gToken,
    uint256 gAmount
  ) external override onlyListedMarket(gToken) nonReentrant whenNotPaused returns (uint256) {
    uint256 uAmountRedeem = ILToken(gToken).redeemToken(msg.sender, gAmount);
    labDistributor.notifySupplyUpdated(gToken, msg.sender);

    emit MarketRedeem(msg.sender, gToken, uAmountRedeem);
    return uAmountRedeem;
  }

  /// @notice 담보로 제공한 토큰 중 일부를 Redeem
  /// @param gToken 담보 gToken address
  /// @param uAmount 담보 gToken redeem amount
  /// @return uAmountRedeem
  function redeemUnderlying(
    address gToken,
    uint256 uAmount
  ) external override onlyListedMarket(gToken) nonReentrant whenNotPaused returns (uint256) {
    uint256 uAmountRedeem = ILToken(gToken).redeemUnderlying(msg.sender, uAmount);
    labDistributor.notifySupplyUpdated(gToken, msg.sender);

    emit MarketRedeem(msg.sender, gToken, uAmountRedeem);
    return uAmountRedeem;
  }

  /// @notice 원하는 자산을 Borrow 하는 트랜잭션
  /// @param gToken 빌리는 gToken address
  //labDistributort 빌리는 underlying token amount
  function borrow(
    address gToken,
    uint256 amount
  ) external override onlyListedMarket(gToken) nonReentrant whenNotPaused {
    _enterMarket(gToken, msg.sender);
    require(IValidator(validator).borrowAllowed(gToken, msg.sender, amount), "Core: cannot borrow");

    ILToken(payable(gToken)).borrow(msg.sender, amount);
    labDistributor.notifyBorrowUpdated(gToken, msg.sender);
  }

  function nftBorrow(
    address gToken,
    address user,
    uint256 amount
  ) external override onlyListedMarket(gToken) onlyNftCore nonReentrant whenNotPaused {
    require(ILToken(gToken).underlying() == address(ETH), "Core: invalid underlying asset");
    _enterMarket(gToken, msg.sender);
    ILToken(payable(gToken)).borrow(msg.sender, amount);
    labDistributor.notifyBorrowUpdated(gToken, user);
  }

  /// @notice 대출한 자산을 상환하는 트랜잭션
  /// @dev UI 에서의 Repay All 도 본 트랜잭션을 사용함
  ///      amount 를 넉넉하게 주면 repay 후 초과분은 환불함
  /// @param gToken 상환하려는 gToken address
  /// @param amount 상환하려는 gToken amount
  function repayBorrow(
    address gToken,
    uint256 amount
  ) external payable override onlyListedMarket(gToken) nonReentrant whenNotPaused {
    ILToken(payable(gToken)).repayBorrow{value: msg.value}(msg.sender, amount);
    labDistributor.notifyBorrowUpdated(gToken, msg.sender);
  }

  function nftRepayBorrow(
    address gToken,
    address user,
    uint256 amount
  ) external payable override onlyListedMarket(gToken) onlyNftCore nonReentrant whenNotPaused {
    require(ILToken(gToken).underlying() == address(ETH), "Core: invalid underlying asset");
    ILToken(payable(gToken)).repayBorrow{value: msg.value}(msg.sender, amount);
    labDistributor.notifyBorrowUpdated(gToken, user);
  }

  /// @notice 본인이 아닌 특정한 주소의 대출을 청산시키는 트랜잭션
  /// @dev UI 에서 본 트랜잭션 호출을 확인하지 못했음
  /// @param gToken 상환하려는 gToken address
  /// @param amount 상환하려는 gToken amount
  function repayBorrowBehalf(
    address gToken,
    address borrower,
    uint256 amount
  ) external payable override onlyListedMarket(gToken) nonReentrant whenNotPaused {
    ILToken(payable(gToken)).repayBorrowBehalf{value: msg.value}(msg.sender, borrower, amount);
    labDistributor.notifyBorrowUpdated(gToken, borrower);
  }

  /// @notice 본인이 아닌 특정한 주소의 대출을 청산시키는 트랜잭션
  /// @dev UI 에서 본 트랜잭션 호출을 확인하지 못했음
  function liquidateBorrow(
    address gTokenBorrowed,
    address gTokenCollateral,
    address borrower,
    uint256 amount
  ) external payable override nonReentrant whenNotPaused {
    amount = ILToken(gTokenBorrowed).underlying() == address(ETH) ? msg.value : amount;
    require(marketInfos[gTokenBorrowed].isListed && marketInfos[gTokenCollateral].isListed, "Core: invalid market");
    require(usersOfMarket[gTokenCollateral][borrower], "Core: not a collateral");
    require(marketInfos[gTokenCollateral].collateralFactor > 0, "Core: not a collateral");
    require(
      IValidator(validator).liquidateAllowed(gTokenBorrowed, borrower, amount, closeFactor),
      "Core: cannot liquidate borrow"
    );

    (, uint256 rebateGAmount, uint256 liquidatorGAmount) = ILToken(gTokenBorrowed).liquidateBorrow{value: msg.value}(
      gTokenCollateral,
      msg.sender,
      borrower,
      amount
    );

    ILToken(gTokenCollateral).seize(msg.sender, borrower, liquidatorGAmount);
    labDistributor.notifyTransferred(gTokenCollateral, borrower, msg.sender);

    if (rebateGAmount > 0) {
      ILToken(gTokenCollateral).seize(rebateDistributor, borrower, rebateGAmount);
      labDistributor.notifyTransferred(gTokenCollateral, borrower, rebateDistributor);
    }

    labDistributor.notifyBorrowUpdated(gTokenBorrowed, borrower);
  }

  /// @notice 모든 마켓의 Reward LAB 클레임 트랜잭션
  function claimLab() external override nonReentrant {
    labDistributor.claim(markets, msg.sender);
  }

  /// @notice 하나의 market 의 Reward LAB 클레임 트랜잭션
  //labDistributort 클레임 하는 market 의 address
  function claimLab(address market) external override nonReentrant {
    address[] memory _markets = new address[](1);
    _markets[0] = market;
    labDistributor.claim(_markets, msg.sender);
  }

  /// @notice 쌓인 보상을 Locker에 바로 deposit
  function compoundLab() external override {
    labDistributor.compound(markets, msg.sender);
  }

  /// @notice Called when gToken has transfered
  /// @dev gToken 에서 grvDistributor 의 메서드를 호출하기 위해 중간 역할을 함
  ///      gToken -> Core -> gToken, grvDistributor
  function transferTokens(
    address spender,
    address src,
    address dst,
    uint256 amount
  ) external override nonReentrant onlyMarket {
    ILToken(msg.sender).transferTokensInternal(spender, src, dst, amount);
    labDistributor.notifyTransferred(msg.sender, src, dst);
  }

  /* ========== PRIVATE FUNCTIONS ========== */

  /// @notice Enter Market
  /// @dev 해당 Token 을 대출하거나, 담보로 enable 하기 위해서는 Enter Market 이 필요함
  /// @param gToken Token address
  /// @param _account Market 에 Enter 할 account address
  function _enterMarket(address gToken, address _account) internal onlyListedMarket(gToken) {
    if (!usersOfMarket[gToken][_account]) {
      usersOfMarket[gToken][_account] = true;
      marketListOfUsers[_account].push(gToken);
      emit MarketEntered(gToken, _account);
    }
  }

  /// @notice remove user from market
  /// @dev Market 에서 제거할 시에 해당 토큰이 담보물에서 제거되어 청산되지 않음
  /// @param gTokenToExit Token address
  /// @param _account Market 에 제거할 account address
  function _removeUserMarket(address gTokenToExit, address _account) private {
    require(marketListOfUsers[_account].length > 0, "Core: cannot pop user market");
    delete usersOfMarket[gTokenToExit][_account];

    uint256 length = marketListOfUsers[_account].length;
    for (uint256 i = 0; i < length; i++) {
      if (marketListOfUsers[_account][i] == gTokenToExit) {
        marketListOfUsers[_account][i] = marketListOfUsers[_account][length - 1];
        marketListOfUsers[_account].pop();
        break;
      }
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newBorrowCap","type":"uint256"}],"name":"BorrowCapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newCloseFactor","type":"uint256"}],"name":"CloseFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newCollateralFactor","type":"uint256"}],"name":"CollateralFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"}],"name":"FlashLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"KeeperUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newLABDistributor","type":"address"}],"name":"LABDistributorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"LiquidationIncentiveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gToken","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"MarketEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gToken","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"MarketExited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gToken","type":"address"}],"name":"MarketListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"gToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"MarketRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"gToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"MarketSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newNftCore","type":"address"}],"name":"NftCoreUpdated","type":"event"},{"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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRebateDistributor","type":"address"}],"name":"RebateDistributorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newSupplyCap","type":"uint256"}],"name":"SupplyCapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newValidator","type":"address"}],"name":"ValidatorUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accountLiquidityOf","outputs":[{"internalType":"uint256","name":"collateralInUSD","type":"uint256"},{"internalType":"uint256","name":"supplyInUSD","type":"uint256"},{"internalType":"uint256","name":"borrowInUSD","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allMarkets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"gToken","type":"address"}],"name":"checkMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"}],"name":"claimLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compoundLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"gTokens","type":"address[]"}],"name":"enterMarkets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"}],"name":"exitMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceCalculator","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"labDistributor","outputs":[{"internalType":"contract ILABDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gTokenBorrowed","type":"address"},{"internalType":"address","name":"gTokenCollateral","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"liquidateBorrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"liquidationIncentive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"gToken","type":"address"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"}],"name":"listMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"}],"name":"marketInfoOf","outputs":[{"components":[{"internalType":"bool","name":"isListed","type":"bool"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"}],"internalType":"struct Constant.MarketInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketInfos","outputs":[{"internalType":"bool","name":"isListed","type":"bool"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"marketListOf","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketListOfUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"nftBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftCore","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"nftRepayBorrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceCalculator","outputs":[{"internalType":"contract IPriceCalculator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebateDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"uint256","name":"gAmount","type":"uint256"}],"name":"redeemToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"gToken","type":"address"}],"name":"removeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayBorrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayBorrowBehalf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCloseFactor","type":"uint256"}],"name":"setCloseFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"uint256","name":"newCollateralFactor","type":"uint256"}],"name":"setCollateralFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_labDistributor","type":"address"}],"name":"setLABDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"setLiquidationIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"gTokens","type":"address[]"},{"internalType":"uint256[]","name":"newBorrowCaps","type":"uint256[]"}],"name":"setMarketBorrowCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"gTokens","type":"address[]"},{"internalType":"uint256[]","name":"newSupplyCaps","type":"uint256[]"}],"name":"setMarketSupplyCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftCore","type":"address"}],"name":"setNftCore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceCalculator","type":"address"}],"name":"setPriceCalculator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rebateDistributor","type":"address"}],"name":"setRebateDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"usersOfMarket","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

Deployed Bytecode

0x60806040526004361061031a5760003560e01c80638456cb59116101ab578063c2998238116100f7578063e61604cf11610095578063f2b9fdb81161006f578063f2b9fdb8146108b7578063f2fde38b146108ca578063f8982e7a146108ea578063fa680561146109195761031a565b8063e61604cf14610864578063ede4edd014610877578063eefc5947146108975761031a565b8063d6b76b9c116100d1578063d6b76b9c146107f1578063d9452b0414610804578063db91323614610824578063de02d642146108445761031a565b8063c299823814610791578063c4d66de8146107b1578063d136af44146107d15761031a565b80639629417811610164578063abdb5ea81161013e578063abdb5ea814610729578063aced16611461073c578063b1283e7714610751578063c04f31ff146107715761031a565b806396294178146106c9578063a2a2d5bb146106e9578063a8431081146107095761031a565b80638456cb59146106355780638b95e3351461064a5780638c765e941461065f5780638da5cb5b14610674578063928fe47714610689578063929fe9a1146106a95761031a565b8063571abe301161026a5780636922d7b611610223578063748747e6116101fd578063748747e6146105c05780637a81308f146105e05780637f0927f214610600578063830cbbbd146106155761031a565b80636922d7b61461055e5780636e8584fd1461057e578063715018a6146105ab5761031a565b8063571abe30146104cc57806359086a5e146104e157806359341a1a146104f45780635c975abb1461050957806366ae02091461051e57806368155ec11461053e5761031a565b8063186db48f116102d75780633a941f73116102b15780633a941f73146104575780633f4ba83a146104775780634b8a35291461048c5780635189e110146104ac5761031a565b8063186db48f14610400578063375a7cba146104205780633a5381b5146104425761031a565b806305308b9f1461031f5780630c5ff1021461034a57806312348e961461036c5780631327d3d81461038e5780631488ca08146103ae578063158ef93e146103de575b600080fd5b34801561032b57600080fd5b5061033461092e565b604051610341919061474f565b60405180910390f35b34801561035657600080fd5b5061035f610934565b6040516103419190613e02565b34801561037857600080fd5b5061038c610387366004613d62565b610943565b005b34801561039a57600080fd5b5061038c6103a9366004613a9a565b610a19565b3480156103ba57600080fd5b506103ce6103c9366004613a9a565b610adc565b6040516103419493929190613f8d565b3480156103ea57600080fd5b506103f3610b07565b6040516103419190613f82565b34801561040c57600080fd5b5061038c61041b366004613bff565b610b10565b34801561042c57600080fd5b50610435610c6e565b6040516103419190613ee3565b34801561044e57600080fd5b5061035f610cd0565b34801561046357600080fd5b5061038c610472366004613b94565b610cdf565b34801561048357600080fd5b5061038c610f2b565b34801561049857600080fd5b5061038c6104a7366004613bd4565b610f87565b3480156104b857600080fd5b506104356104c7366004613a9a565b6111a7565b3480156104d857600080fd5b5061035f61121d565b61038c6104ef366004613b94565b61122c565b34801561050057600080fd5b5061035f611337565b34801561051557600080fd5b506103f3611346565b34801561052a57600080fd5b5061038c610539366004613a9a565b61134f565b34801561054a57600080fd5b5061038c610559366004613b44565b611412565b34801561056a57600080fd5b5061038c610579366004613a9a565b611571565b34801561058a57600080fd5b5061059e610599366004613a9a565b61160b565b6040516103419190614722565b3480156105b757600080fd5b5061038c611666565b3480156105cc57600080fd5b5061038c6105db366004613a9a565b6116ef565b3480156105ec57600080fd5b5061038c6105fb366004613a9a565b6117b7565b34801561060c57600080fd5b5061038c61187a565b34801561062157600080fd5b50610334610630366004613bd4565b61190d565b34801561064157600080fd5b5061038c611ac3565b34801561065657600080fd5b5061035f611b1d565b34801561066b57600080fd5b50610334611b2c565b34801561068057600080fd5b5061035f611b32565b34801561069557600080fd5b506103f36106a4366004613b0c565b611b41565b3480156106b557600080fd5b506103f36106c4366004613b0c565b611b61565b3480156106d557600080fd5b506103346106e4366004613bd4565b611b91565b3480156106f557600080fd5b5061035f610704366004613bd4565b611c49565b34801561071557600080fd5b5061038c610724366004613d62565b611c7e565b61038c610737366004613bd4565b611d05565b34801561074857600080fd5b5061035f611e0e565b34801561075d57600080fd5b5061035f61076c366004613d62565b611e22565b34801561077d57600080fd5b5061038c61078c366004613bd4565b611e49565b34801561079d57600080fd5b5061038c6107ac366004613c68565b612003565b3480156107bd57600080fd5b5061038c6107cc366004613a9a565b612038565b3480156107dd57600080fd5b5061038c6107ec366004613bff565b6120d1565b61038c6107ff366004613b94565b612228565b34801561081057600080fd5b5061038c61081f366004613ad2565b6123ab565b34801561083057600080fd5b5061038c61083f366004613a9a565b612570565b34801561085057600080fd5b5061038c61085f366004613a9a565b612817565b61038c610872366004613b44565b6128da565b34801561088357600080fd5b5061038c610892366004613a9a565b612ddc565b3480156108a357600080fd5b5061038c6108b2366004613a9a565b612fe3565b6103346108c5366004613bd4565b6130b4565b3480156108d657600080fd5b5061038c6108e5366004613a9a565b61344b565b3480156108f657600080fd5b5061090a610905366004613a9a565b61350b565b60405161034193929190614758565b34801561092557600080fd5b5061038c61359e565b600a5481565b6003546001600160a01b031681565b60025461010090046001600160a01b03163314806109795750610964611b32565b6001600160a01b0316336001600160a01b0316145b61099e5760405162461bcd60e51b81526004016109959061417f565b60405180910390fd5b66b1a2bc2ec5000081101580156109bd5750670c7d713b49da00008111155b6109d95760405162461bcd60e51b81526004016109959061449d565b600a8190556040517fd88469f5aa8525dce9ae07fa2d8df83e2ec766fc060483b66a0082ff36d6582d90610a0e90839061474f565b60405180910390a150565b60025461010090046001600160a01b0316331480610a4f5750610a3a611b32565b6001600160a01b0316336001600160a01b0316145b610a6b5760405162461bcd60e51b81526004016109959061417f565b6001600160a01b038116610a915760405162461bcd60e51b81526004016109959061456e565b600480546001600160a01b0319166001600160a01b0383161790556040517fb3a3a56265020415cf2f7ff198e2052a6e1d43d7eb127450af725829e40e08c290610a0e908390613e02565b600960205260009081526040902080546001820154600283015460039093015460ff90921692909184565b600e5460ff1681565b60025461010090046001600160a01b0316331480610b465750610b31611b32565b6001600160a01b0316336001600160a01b0316145b610b625760405162461bcd60e51b81526004016109959061417f565b8215801590610b7057508281145b610b8c5760405162461bcd60e51b8152600401610995906145dc565b60005b83811015610c6757828282818110610ba357fe5b9050602002013560096000878785818110610bba57fe5b9050602002016020810190610bcf9190613a9a565b6001600160a01b03168152602081019190915260400160002060020155848482818110610bf857fe5b9050602002016020810190610c0d9190613a9a565b6001600160a01b03167f84d2db42497fc6f1882756be420935d982025ad8a2a903dfb83638a09e49a775848484818110610c4357fe5b90506020020135604051610c57919061474f565b60405180910390a2600101610b8f565b5050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610cc657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ca8575b5050505050905090565b6004546001600160a01b031681565b6001600160a01b038316600090815260096020526040902054839060ff16610d195760405162461bcd60e51b8152600401610995906144d4565b6003546001600160a01b03163314610d435760405162461bcd60e51b8152600401610995906146ed565b60026001541415610d665760405162461bcd60e51b81526004016109959061467f565b6002600155610d73611346565b15610d905760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610dd457600080fd5b505afa158015610de8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0c9190613ab6565b6001600160a01b031614610e325760405162461bcd60e51b8152600401610995906141c6565b610e3c8433613605565b604051634b8a352960e01b81526001600160a01b03851690634b8a352990610e6a9033908690600401613e5d565b602060405180830381600087803b158015610e8457600080fd5b505af1158015610e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebc9190613d7a565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90610eef9087908790600401613e76565b600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b505060018055505050505050565b60025461010090046001600160a01b0316331480610f615750610f4c611b32565b6001600160a01b0316336001600160a01b0316145b610f7d5760405162461bcd60e51b81526004016109959061417f565b610f856136f5565b565b6001600160a01b038216600090815260096020526040902054829060ff16610fc15760405162461bcd60e51b8152600401610995906144d4565b60026001541415610fe45760405162461bcd60e51b81526004016109959061467f565b6002600155610ff1611346565b1561100e5760405162461bcd60e51b8152600401610995906142a2565b6110188333613605565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c9161104b9187913391889101613e39565b602060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109d9190613d05565b6110b95760405162461bcd60e51b8152600401610995906142cc565b604051634b8a352960e01b81526001600160a01b03841690634b8a3529906110e79033908690600401613e5d565b602060405180830381600087803b15801561110157600080fd5b505af1158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190613d7a565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce9061116c9086903390600401613e76565b600060405180830381600087803b15801561118657600080fd5b505af115801561119a573d6000803e3d6000fd5b5050600180555050505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561121157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116111f3575b50505050509050919050565b6006546001600160a01b031681565b6001600160a01b038316600090815260096020526040902054839060ff166112665760405162461bcd60e51b8152600401610995906144d4565b600260015414156112895760405162461bcd60e51b81526004016109959061467f565b6002600155611296611346565b156112b35760405162461bcd60e51b8152600401610995906142a2565b604051632c84352f60e11b81526001600160a01b038516906359086a5e9034906112e590339088908890600401613e39565b6020604051808303818588803b1580156112fe57600080fd5b505af1158015611312573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ebc9190613d7a565b6005546001600160a01b031681565b60025460ff1690565b60025461010090046001600160a01b03163314806113855750611370611b32565b6001600160a01b0316336001600160a01b0316145b6113a15760405162461bcd60e51b81526004016109959061417f565b6001600160a01b0381166113c75760405162461bcd60e51b815260040161099590614050565b600680546001600160a01b0319166001600160a01b0383161790556040517f2351f252c60252e548e93df4d785886faa1d88410325b8bce69d624a25583ae790610a0e908390613e02565b600260015414156114355760405162461bcd60e51b81526004016109959061467f565b60026001556000805b600854811015611482576008818154811061145557fe5b6000918252602090912001546001600160a01b031633141561147a5760019150611482565b60010161143e565b506001811515146114a55760405162461bcd60e51b8152600401610995906141fd565b604051636119bced60e11b8152339063c23379da906114ce908890889088908890600401613e90565b600060405180830381600087803b1580156114e857600080fd5b505af11580156114fc573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b915061153490339088908890600401613e16565b600060405180830381600087803b15801561154e57600080fd5b505af1158015611562573d6000803e3d6000fd5b50506001805550505050505050565b60025461010090046001600160a01b03163314806115a75750611592611b32565b6001600160a01b0316336001600160a01b0316145b6115c35760405162461bcd60e51b81526004016109959061417f565b6001600160a01b0381166115e95760405162461bcd60e51b815260040161099590614539565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6116136139fb565b506001600160a01b03166000908152600960209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015290565b61166e613763565b6001600160a01b031661167f611b32565b6001600160a01b0316146116a55760405162461bcd60e51b8152600401610995906143fa565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025461010090046001600160a01b03163314806117255750611710611b32565b6001600160a01b0316336001600160a01b0316145b6117415760405162461bcd60e51b81526004016109959061417f565b6001600160a01b0381166117675760405162461bcd60e51b81526004016109959061426b565b60028054610100600160a81b0319166101006001600160a01b038416021790556040517f0425bcd291db1d48816f2a98edc7ecaf6dd5c64b973d9e4b3b6b750763dc6c2e90610a0e908390613e02565b60025461010090046001600160a01b03163314806117ed57506117d8611b32565b6001600160a01b0316336001600160a01b0316145b6118095760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03811661182f5760405162461bcd60e51b81526004016109959061442f565b600380546001600160a01b0319166001600160a01b0383161790556040517fa0db7f35e3369b887ccd7d6757ea475d09c689b97f5d0b4ee395add6a5d4545d90610a0e908390613e02565b6002600154141561189d5760405162461bcd60e51b81526004016109959061467f565b600260015560065460405163025181bb60e41b81526001600160a01b03909116906325181bb0906118d5906008903390600401613f20565b600060405180830381600087803b1580156118ef57600080fd5b505af1158015611903573d6000803e3d6000fd5b5050600180555050565b6001600160a01b038216600090815260096020526040812054839060ff166119475760405162461bcd60e51b8152600401610995906144d4565b6002600154141561196a5760405162461bcd60e51b81526004016109959061467f565b6002600155611977611346565b156119945760405162461bcd60e51b8152600401610995906142a2565b60405163830cbbbd60e01b81526000906001600160a01b0386169063830cbbbd906119c59033908890600401613e5d565b602060405180830381600087803b1580156119df57600080fd5b505af11580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a179190613d7a565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90611a4a9088903390600401613e76565b600060405180830381600087803b158015611a6457600080fd5b505af1158015611a78573d6000803e3d6000fd5b505050507fda2fcb771cce6a80cd6c0101db394f4fd1f8755def9185535cc97509f3e03cdd338683604051611aaf93929190613e39565b60405180910390a160018055949350505050565b60025461010090046001600160a01b0316331480611af95750611ae4611b32565b6001600160a01b0316336001600160a01b0316145b611b155760405162461bcd60e51b81526004016109959061417f565b610f85613767565b6007546001600160a01b031681565b600b5481565b6000546001600160a01b031690565b600d60209081526000928352604080842090915290825290205460ff1681565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205460ff165b92915050565b6001600160a01b038216600090815260096020526040812054839060ff16611bcb5760405162461bcd60e51b8152600401610995906144d4565b60026001541415611bee5760405162461bcd60e51b81526004016109959061467f565b6002600155611bfb611346565b15611c185760405162461bcd60e51b8152600401610995906142a2565b6040516312c5282f60e31b81526000906001600160a01b038616906396294178906119c59033908890600401613e5d565b600c6020528160005260406000208181548110611c6257fe5b6000918252602090912001546001600160a01b03169150829050565b60025461010090046001600160a01b0316331480611cb45750611c9f611b32565b6001600160a01b0316336001600160a01b0316145b611cd05760405162461bcd60e51b81526004016109959061417f565b600b8190556040517f6791c9b68799eda502f8f7808e4ab556a632237eea58a66c4f7e4e6f94574d0d90610a0e90839061474f565b6001600160a01b038216600090815260096020526040902054829060ff16611d3f5760405162461bcd60e51b8152600401610995906144d4565b60026001541415611d625760405162461bcd60e51b81526004016109959061467f565b6002600155611d6f611346565b15611d8c5760405162461bcd60e51b8152600401610995906142a2565b60405163157b6bd560e31b81526001600160a01b0384169063abdb5ea8903490611dbc9033908790600401613e5d565b6020604051808303818588803b158015611dd557600080fd5b505af1158015611de9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111399190613d7a565b60025461010090046001600160a01b031681565b60088181548110611e2f57fe5b6000918252602090912001546001600160a01b0316905081565b60025461010090046001600160a01b0316331480611e7f5750611e6a611b32565b6001600160a01b0316336001600160a01b0316145b611e9b5760405162461bcd60e51b81526004016109959061417f565b6001600160a01b038216600090815260096020526040902054829060ff16611ed55760405162461bcd60e51b8152600401610995906144d4565b670c7d713b49da0000821115611efd5760405162461bcd60e51b815260040161099590614466565b8115801590611f89575060075460405163fc57d4df60e01b81526001600160a01b039091169063fc57d4df90611f37908690600401613e02565b60206040518083038186803b158015611f4f57600080fd5b505afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f879190613d7a565b155b15611fa65760405162461bcd60e51b8152600401610995906140da565b6001600160a01b03831660009081526009602052604090819020600301839055517f275d6207ccd4271a12c584febf2bcf32254205dfb4639ce1a9184d2e2609e2d090611ff69085908590613e5d565b60405180910390a1505050565b60005b81518110156120345761202c82828151811061201e57fe5b602002602001015133613605565b600101612006565b5050565b612040613763565b6001600160a01b0316612051611b32565b6001600160a01b0316146120775760405162461bcd60e51b8152600401610995906143fa565b600e5460ff161561209a5760405162461bcd60e51b8152600401610995906142f9565b6120a26137c2565b600780546001600160a01b0319166001600160a01b0392909216919091179055600e805460ff19166001179055565b60025461010090046001600160a01b031633148061210757506120f2611b32565b6001600160a01b0316336001600160a01b0316145b6121235760405162461bcd60e51b81526004016109959061417f565b821580159061213157508281145b61214d5760405162461bcd60e51b8152600401610995906145dc565b60005b83811015610c675782828281811061216457fe5b905060200201356009600087878581811061217b57fe5b90506020020160208101906121909190613a9a565b6001600160a01b031681526020810191909152604001600020600101558484828181106121b957fe5b90506020020160208101906121ce9190613a9a565b6001600160a01b03167f638a463c59949a284e093291dedfbadcb32ebf9007e649767344e67346ab882984848481811061220457fe5b90506020020135604051612218919061474f565b60405180910390a2600101612150565b6001600160a01b038316600090815260096020526040902054839060ff166122625760405162461bcd60e51b8152600401610995906144d4565b6003546001600160a01b0316331461228c5760405162461bcd60e51b8152600401610995906146ed565b600260015414156122af5760405162461bcd60e51b81526004016109959061467f565b60026001556122bc611346565b156122d95760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561231d57600080fd5b505afa158015612331573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123559190613ab6565b6001600160a01b03161461237b5760405162461bcd60e51b8152600401610995906141c6565b60405163157b6bd560e31b81526001600160a01b0385169063abdb5ea89034906112e59033908790600401613e5d565b60025461010090046001600160a01b03163314806123e157506123cc611b32565b6001600160a01b0316336001600160a01b0316145b6123fd5760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03841660009081526009602052604090205460ff16156124365760405162461bcd60e51b8152600401610995906146b6565b60005b60085481101561249557846001600160a01b03166008828154811061245a57fe5b6000918252602090912001546001600160a01b0316141561248d5760405162461bcd60e51b8152600401610995906146b6565b600101612439565b506040805160808101825260018082526020808301878152838501878152606085018781526001600160a01b038b16600081815260099095528785209651875460ff1916901515178755925186860155905160028601555160039094019390935560088054928301815590527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055517fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f90612562908690613e02565b60405180910390a150505050565b60025461010090046001600160a01b03163314806125a65750612591611b32565b6001600160a01b0316336001600160a01b0316145b6125c25760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03811660009081526009602052604090205460ff166125fa5760405162461bcd60e51b815260040161099590614326565b806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561263357600080fd5b505afa158015612647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266b9190613d7a565b1580156126e65750806001600160a01b0316638285ef406040518163ffffffff1660e01b815260040160206040518083038186803b1580156126ac57600080fd5b505afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e49190613d7a565b155b6127025760405162461bcd60e51b8152600401610995906145a5565b60085460005b8181101561281257826001600160a01b03166008828154811061272757fe5b6000918252602090912001546001600160a01b0316141561280a576008600183038154811061275257fe5b600091825260209091200154600880546001600160a01b03909216918390811061277857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060088054806127b157fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03851682526009905260408120805460ff19168155600181018290556002810182905560030155612812565b600101612708565b505050565b60025461010090046001600160a01b031633148061284d5750612838611b32565b6001600160a01b0316336001600160a01b0316145b6128695760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03811661288f5760405162461bcd60e51b815260040161099590614608565b600580546001600160a01b0319166001600160a01b0383161790556040517f827daa11640de0eb908d0b06593ffb3f2b5e14e83d678fb922e512075f1d36f090610a0e908390613e02565b600260015414156128fd5760405162461bcd60e51b81526004016109959061467f565b600260015561290a611346565b156129275760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561296b57600080fd5b505afa15801561297f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a39190613ab6565b6001600160a01b0316146129b757806129b9565b345b6001600160a01b03851660009081526009602052604090205490915060ff1680156129fc57506001600160a01b03831660009081526009602052604090205460ff165b612a185760405162461bcd60e51b8152600401610995906144d4565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612a5d5760405162461bcd60e51b81526004016109959061464f565b6001600160a01b038316600090815260096020526040902060030154612a955760405162461bcd60e51b81526004016109959061464f565b60048054600a546040516312e8123160e11b81526001600160a01b03909216926325d0246292612acc928992889288929101613eba565b602060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1e9190613d05565b612b3a5760405162461bcd60e51b815260040161099590614502565b600080856001600160a01b031663e61604cf34873388886040518663ffffffff1660e01b8152600401612b709493929190613e90565b6060604051808303818588803b158015612b8957600080fd5b505af1158015612b9d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bc29190613d92565b60405163b2a02ff160e01b815291945092506001600160a01b038716915063b2a02ff190612bf890339088908690600401613e39565b600060405180830381600087803b158015612c1257600080fd5b505af1158015612c26573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b9150612c5e90889088903390600401613e16565b600060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b505050506000821115612d6c5760055460405163b2a02ff160e01b81526001600160a01b038781169263b2a02ff192612ccf929091169088908790600401613e39565b600060405180830381600087803b158015612ce957600080fd5b505af1158015612cfd573d6000803e3d6000fd5b505060065460055460405163dd9aba1b60e01b81526001600160a01b03928316945063dd9aba1b9350612d39928a928a92911690600401613e16565b600060405180830381600087803b158015612d5357600080fd5b505af1158015612d67573d6000803e3d6000fd5b505050505b6006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90612d9e9089908890600401613e76565b600060405180830381600087803b158015612db857600080fd5b505af1158015612dcc573d6000803e3d6000fd5b5050600180555050505050505050565b6001600160a01b038116600090815260096020526040902054819060ff16612e165760405162461bcd60e51b8152600401610995906144d4565b6001600160a01b0382166000908152600d60209081526040808320338452909152902054829060ff16612e5b5760405162461bcd60e51b815260040161099590614019565b612e63613a25565b60405163497d274760e11b81526001600160a01b038516906392fa4e8e90612e8f903390600401613e02565b606060405180830381600087803b158015612ea957600080fd5b505af1158015612ebd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee19190613d25565b90508060200151600014612f075760405162461bcd60e51b815260040161099590613fd8565b60048054825160405163eabe7d9160e01b81526001600160a01b039092169263eabe7d9192612f3a928992339201613e39565b602060405180830381600087803b158015612f5457600080fd5b505af1158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c9190613d05565b612fa85760405162461bcd60e51b815260040161099590614355565b612fb284336137dc565b7fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d8433604051612562929190613e76565b600260015414156130065760405162461bcd60e51b81526004016109959061467f565b600260019081556040805182815280820190915260609160208083019080368337019050509050818160008151811061303b57fe5b6001600160a01b03928316602091820292909201015260065460405163025181bb60e41b81529116906325181bb09061307a9084903390600401613ef6565b600060405180830381600087803b15801561309457600080fd5b505af11580156130a8573d6000803e3d6000fd5b50506001805550505050565b6001600160a01b038216600090815260096020526040812054839060ff166130ee5760405162461bcd60e51b8152600401610995906144d4565b600260015414156131115760405162461bcd60e51b81526004016109959061467f565b600260015561311e611346565b1561313b5760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561317f57600080fd5b505afa158015613193573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b79190613ab6565b6001600160a01b0316146131cb57826131cd565b345b6001600160a01b0385166000908152600960205260409020600101549093508015806132ff5750806132fc856132f6670de0b6b3a76400006132f08a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561324157600080fd5b505afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132799190613d7a565b8b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132b257600080fd5b505afa1580156132c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ea9190613d7a565b90613963565b906139a4565b906139d6565b11155b61331b5760405162461bcd60e51b815260040161099590614148565b6000856001600160a01b031663f2b9fdb83433886040518463ffffffff1660e01b815260040161334c929190613e5d565b6020604051808303818588803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061339e9190613d7a565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b906133d19089903390600401613e76565b600060405180830381600087803b1580156133eb57600080fd5b505af11580156133ff573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe17333878760405161343693929190613e39565b60405180910390a16001805595945050505050565b613453613763565b6001600160a01b0316613464611b32565b6001600160a01b03161461348a5760405162461bcd60e51b8152600401610995906143fa565b6001600160a01b0381166134b05760405162461bcd60e51b815260040161099590614094565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60048054604051635ec88c7960e01b8152600092839283926001600160a01b0390911691635ec88c799161354191889101613e02565b60606040518083038186803b15801561355957600080fd5b505afa15801561356d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135919190613d92565b9250925092509193909250565b600654604051637ee0d61360e01b81526001600160a01b0390911690637ee0d613906135d1906008903390600401613f20565b600060405180830381600087803b1580156135eb57600080fd5b505af11580156135ff573d6000803e3d6000fd5b50505050565b6001600160a01b038216600090815260096020526040902054829060ff1661363f5760405162461bcd60e51b8152600401610995906144d4565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612812576001600160a01b038084166000818152600d602090815260408083209487168352938152838220805460ff19166001908117909155600c825284832080549182018155835291200180546001600160a01b0319169091179055517f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a590611ff69085908590613e76565b6136fd611346565b6137195760405162461bcd60e51b815260040161099590613faa565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61374c613763565b6040516137599190613e02565b60405180910390a1565b3390565b61376f611346565b1561378c5760405162461bcd60e51b8152600401610995906142a2565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861374c613763565b6706f05b59d3b20000600a55670ff59ee833b30000600b55565b6001600160a01b0381166000908152600c60205260409020546138115760405162461bcd60e51b8152600401610995906143c3565b6001600160a01b038083166000908152600d602090815260408083209385168352928152828220805460ff19169055600c905290812054905b818110156135ff576001600160a01b038381166000908152600c602052604090208054918616918390811061387b57fe5b6000918252602090912001546001600160a01b0316141561395b576001600160a01b0383166000908152600c60205260409020805460001984019081106138be57fe5b60009182526020808320909101546001600160a01b038681168452600c90925260409092208054919092169190839081106138f557fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600c9091526040902080548061393457fe5b600082815260209020810160001990810180546001600160a01b03191690550190556135ff565b60010161384a565b60008261397257506000611b8b565b8282028284828161397f57fe5b041461399d5760405162461bcd60e51b815260040161099590614382565b9392505050565b60008082116139c55760405162461bcd60e51b815260040161099590614234565b8183816139ce57fe5b049392505050565b60008282018381101561399d5760405162461bcd60e51b815260040161099590614111565b60405180608001604052806000151581526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b8035611b8b816147b5565b60008083601f840112613a62578182fd5b50813567ffffffffffffffff811115613a79578182fd5b6020830191508360208083028501011115613a9357600080fd5b9250929050565b600060208284031215613aab578081fd5b813561399d816147b5565b600060208284031215613ac7578081fd5b815161399d816147b5565b60008060008060808587031215613ae7578283fd5b8435613af2816147b5565b966020860135965060408601359560600135945092505050565b60008060408385031215613b1e578182fd5b8235613b29816147b5565b91506020830135613b39816147b5565b809150509250929050565b60008060008060808587031215613b59578384fd5b8435613b64816147b5565b93506020850135613b74816147b5565b92506040850135613b84816147b5565b9396929550929360600135925050565b600080600060608486031215613ba8578283fd5b8335613bb3816147b5565b92506020840135613bc3816147b5565b929592945050506040919091013590565b60008060408385031215613be6578182fd5b8235613bf1816147b5565b946020939093013593505050565b60008060008060408587031215613c14578384fd5b843567ffffffffffffffff80821115613c2b578586fd5b613c3788838901613a51565b90965094506020870135915080821115613c4f578384fd5b50613c5c87828801613a51565b95989497509550505050565b60006020808385031215613c7a578182fd5b823567ffffffffffffffff811115613c90578283fd5b8301601f81018513613ca0578283fd5b8035613cb3613cae82614795565b61476e565b8181528381019083850185840285018601891015613ccf578687fd5b8694505b83851015613cf957613ce58982613a46565b835260019490940193918501918501613cd3565b50979650505050505050565b600060208284031215613d16578081fd5b8151801515811461399d578182fd5b600060608284031215613d36578081fd5b613d40606061476e565b8251815260208301516020820152604083015160408201528091505092915050565b600060208284031215613d73578081fd5b5035919050565b600060208284031215613d8b578081fd5b5051919050565b600080600060608486031215613da6578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015613df75781516001600160a01b031687529582019590820190600101613dd2565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b60006020825261399d6020830184613dbf565b600060408252613f096040830185613dbf565b905060018060a01b03831660208301529392505050565b6000604082016040835280855480835260608501915086845260209250828420845b82811015613f675781546001600160a01b031684529284019260019182019101613f42565b5050506001600160a01b039490941692019190915250919050565b901515815260200190565b931515845260208401929092526040830152606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526021908201527f436f72653a20626f72726f772062616c616e6365206d757374206265207a65726040820152606f60f81b606082015260800190565b60208082526017908201527f436f72653a206d75737420656e746572206d61726b6574000000000000000000604082015260600190565b60208082526024908201527f436f72653a20696e76616c6964206c61624469737472696275746f72206164646040820152637265737360e01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672070726963650000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f436f72653a20737570706c792063617020726561636865640000000000000000604082015260600190565b60208082526027908201527f436f72653a2063616c6c6572206973206e6f7420746865206f776e6572206f726040820152661035b2b2b832b960c91b606082015260800190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672061737365740000604082015260600190565b6020808252601d908201527f436f72653a2063616c6c65722073686f756c64206265206d61726b6574000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f436f72653a20696e76616c6964206b6565706572206164647265737300000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f7420626f72726f7760681b604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526015908201527410dbdc994e881d5b9b1a5cdd1959081b585c9ad95d605a1b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f742072656465656d60681b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f436f72653a2063616e6e6f7420706f702075736572206d61726b657400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f436f72653a20696e76616c6964206e667420636f726520616464726573730000604082015260600190565b6020808252601f908201527f436f72653a20696e76616c696420636f6c6c61746572616c20666163746f7200604082015260600190565b6020808252601a908201527f436f72653a20696e76616c696420636c6f736520666163746f72000000000000604082015260600190565b60208082526014908201527310dbdc994e881a5b9d985b1a59081b585c9ad95d60621b604082015260600190565b6020808252601d908201527f436f72653a2063616e6e6f74206c697175696461746520626f72726f77000000604082015260600190565b6020808252818101527f436f72653a20696e76616c69642063616c63756c61746f722061646472657373604082015260600190565b6020808252601f908201527f436f72653a20696e76616c69642076616c696461746f72206164647265737300604082015260600190565b6020808252601a908201527f436f72653a2063616e6e6f742072656d6f7665206d61726b6574000000000000604082015260600190565b602080825260129082015271436f72653a20696e76616c6964206461746160701b604082015260600190565b60208082526027908201527f436f72653a20696e76616c6964207265626174654469737472696275746f72206040820152666164647265737360c81b606082015260800190565b60208082526016908201527510dbdc994e881b9bdd08184818dbdb1b185d195c985b60521b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601b908201527f436f72653a20616c7265616479206c6973746564206d61726b65740000000000604082015260600190565b6020808252818101527f436f72653a2063616c6c6572206973206e6f7420746865206e667420636f7265604082015260600190565b81511515815260208083015190820152604080830151908201526060918201519181019190915260800190565b90815260200190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561478d57600080fd5b604052919050565b600067ffffffffffffffff8211156147ab578081fd5b5060209081020190565b6001600160a01b03811681146147ca57600080fd5b5056fea2646970667358221220151fcb4dd0a54ec178948cebb8313a1e99b96e5482dae622bd2c3d035475d03b64736f6c634300060c0033

Deployed Bytecode Sourcemap

36775:12749:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21246:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20892:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24109:312::-;;;;;;;;;;-1:-1:-1;24109:312:0;;;;;:::i;:::-;;:::i;:::-;;23035:212;;;;;;;;;;-1:-1:-1;23035:212:0;;;;;:::i;:::-;;:::i;21148:58::-;;;;;;;;;;-1:-1:-1;21148:58:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;37245:23::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26340:398::-;;;;;;;;;;-1:-1:-1;26340:398:0;;;;;:::i;:::-;;:::i;38365:99::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20928:33::-;;;;;;;;;;;;;:::i;43374:419::-;;;;;;;;;;-1:-1:-1;43374:419:0;;;;;:::i;:::-;;:::i;28313:62::-;;;;;;;;;;;;;:::i;42967:401::-;;;;;;;;;;-1:-1:-1;42967:401:0;;;;;:::i;:::-;;:::i;38845:135::-;;;;;;;;;;-1:-1:-1;38845:135:0;;;;;:::i;:::-;;:::i;21012:37::-;;;;;;;;;;;;;:::i;45096:337::-;;;;;;:::i;:::-;;:::i;20966:41::-;;;;;;;;;;;;;:::i;19478:86::-;;;;;;;;;;;;;:::i;23404:269::-;;;;;;;;;;-1:-1:-1;23404:269:0;;;;;:::i;:::-;;:::i;47852:293::-;;;;;;;;;;-1:-1:-1;47852:293:0;;;;;:::i;:::-;;:::i;22140:221::-;;;;;;;;;;-1:-1:-1;22140:221:0;;;;;:::i;:::-;;:::i;38577:137::-;;;;;;;;;;-1:-1:-1;38577:137:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15122:148::-;;;;;;;;;;;;;:::i;22502:188::-;;;;;;;;;;-1:-1:-1;22502:188:0;;;;;:::i;:::-;;:::i;22696:197::-;;;;;;;;;;-1:-1:-1;22696:197:0;;;;;:::i;:::-;;:::i;47048:105::-;;;;;;;;;;;;;:::i;41815:391::-;;;;;;;;;;-1:-1:-1;41815:391:0;;;;;:::i;:::-;;:::i;28249:58::-;;;;;;;;;;;;;:::i;21054:39::-;;;;;;;;;;;;;:::i;21286:44::-;;;;;;;;;;;;;:::i;14471:87::-;;;;;;;;;;;;;:::i;37113:65::-;;;;;;;;;;-1:-1:-1;37113:65:0;;;;;:::i;:::-;;:::i;39182:146::-;;;;;;;;;;-1:-1:-1;39182:146:0;;;;;:::i;:::-;;:::i;42397:401::-;;;;;;;;;;-1:-1:-1;42397:401:0;;;;;:::i;:::-;;:::i;37022:54::-;;;;;;;;;;-1:-1:-1;37022:54:0;;;;;:::i;:::-;;:::i;25355:209::-;;;;;;;;;;-1:-1:-1;25355:209:0;;;;;:::i;:::-;;:::i;44108:294::-;;;;;;:::i;:::-;;:::i;20866:21::-;;;;;;;;;;;;;:::i;21100:24::-;;;;;;;;;;-1:-1:-1;21100:24:0;;;;;:::i;:::-;;:::i;24659:519::-;;;;;;;;;;-1:-1:-1;24659:519:0;;;;;:::i;:::-;;:::i;39847:183::-;;;;;;;;;;-1:-1:-1;39847:183:0;;;;;:::i;:::-;;:::i;37349:238::-;;;;;;;;;;-1:-1:-1;37349:238:0;;;;;:::i;:::-;;:::i;25753:398::-;;;;;;;;;;-1:-1:-1;25753:398:0;;;;;:::i;:::-;;:::i;44408:416::-;;;;;;:::i;:::-;;:::i;27002:605::-;;;;;;;;;;-1:-1:-1;27002:605:0;;;;;:::i;:::-;;:::i;27729:514::-;;;;;;;;;;-1:-1:-1;27729:514:0;;;;;:::i;:::-;;:::i;23679:276::-;;;;;;;;;;-1:-1:-1;23679:276:0;;;;;:::i;:::-;;:::i;45602:1374::-;;;;;;:::i;:::-;;:::i;40244:500::-;;;;;;;;;;-1:-1:-1;40244:500:0;;;;;:::i;:::-;;:::i;47286:198::-;;;;;;;;;;-1:-1:-1;47286:198:0;;;;;:::i;:::-;;:::i;40901:723::-;;;;;;:::i;:::-;;:::i;15425:244::-;;;;;;;;;;-1:-1:-1;15425:244:0;;;;;:::i;:::-;;:::i;39354:224::-;;;;;;;;;;-1:-1:-1;39354:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;47547:98::-;;;;;;;;;;;;;:::i;21246:35::-;;;;:::o;20892:31::-;;;-1:-1:-1;;;;;20892:31:0;;:::o;24109:312::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;;;;;;;;;200:4:::1;24200:14;:43;;:90;;;;;252:4;24247:14;:43;;24200:90;24184:150;;;;-1:-1:-1::0;;;24184:150:0::1;;;;;;;:::i;:::-;24341:11;:28:::0;;;24381:34:::1;::::0;::::1;::::0;::::1;::::0;24355:14;;24381:34:::1;:::i;:::-;;;;;;;;24109:312:::0;:::o;23035:212::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23112:24:0;::::1;23104:68;;;;-1:-1:-1::0;;;23104:68:0::1;;;;;;;:::i;:::-;23179:9;:22:::0;;-1:-1:-1;;;;;;23179:22:0::1;-1:-1:-1::0;;;;;23179:22:0;::::1;;::::0;;23213:28:::1;::::0;::::1;::::0;::::1;::::0;23179:22;;23213:28:::1;:::i;21148:58::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37245:23::-;;;;;;:::o;26340:398::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;26466:19;;;::::1;::::0;:61:::1;;-1:-1:-1::0;26489:38:0;;::::1;26466:61;26458:92;;;;-1:-1:-1::0;;;26458:92:0::1;;;;;;;:::i;:::-;26564:9;26559:174;26579:18:::0;;::::1;26559:174;;;26649:13;;26663:1;26649:16;;;;;;;;;;;;;26613:11;:23;26625:7;;26633:1;26625:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26613:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;26613:23:0;:33:::1;;:52:::0;26696:7;;26704:1;26696:10;;::::1;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26679:46:0::1;;26708:13;;26722:1;26708:16;;;;;;;;;;;;;26679:46;;;;;;:::i;:::-;;;;;;;;26599:3;;26559:174;;;;26340:398:::0;;;;:::o;38365:99::-;38419:16;38451:7;38444:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38444:14:0;;;;;;;;;;;;;;;;;;;;;;;38365:99;:::o;20928:33::-;;;-1:-1:-1;;;;;20928:33:0;;:::o;43374:419::-;-1:-1:-1;;;;;21732:19:0;;;;;;:11;:19;;;;;:28;43494:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;21857:7:::1;::::0;-1:-1:-1;;;;;21857:7:0::1;21843:10;:21;21835:66;;;;-1:-1:-1::0;;;21835:66:0::1;;;;;;;:::i;:::-;17432:1:::2;18038:7;;:19;;18030:63;;;;-1:-1:-1::0;;;18030:63:0::2;;;;;;;:::i;:::-;17432:1;18171:7;:18:::0;19804:8:::3;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1::0;;;19795:38:0::3;;;;;;;:::i;:::-;36924:42:::4;-1:-1:-1::0;;;;;43556:44:0::4;43564:6;-1:-1:-1::0;;;;;43556:26:0::4;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43556:44:0::4;;43548:87;;;;-1:-1:-1::0;;;43548:87:0::4;;;;;;;:::i;:::-;43642:32;43655:6;43663:10;43642:12;:32::i;:::-;43681:51;::::0;-1:-1:-1;;;43681:51:0;;-1:-1:-1;;;;;43681:31:0;::::4;::::0;::::4;::::0;:51:::4;::::0;43713:10:::4;::::0;43725:6;;43681:51:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;43739:14:0::4;::::0;:48:::4;::::0;-1:-1:-1;;;43739:48:0;;-1:-1:-1;;;;;43739:14:0;;::::4;::::0;:34:::4;::::0;:48:::4;::::0;43774:6;;43782:4;;43739:48:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;17388:1:0::2;18350:22:::0;;-1:-1:-1;;;;;;43374:419:0:o;28313:62::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;28359:10:::1;:8;:10::i;:::-;28313:62::o:0;42967:401::-;-1:-1:-1;;;;;21732:19:0;;;;;;:11;:19;;;;;:28;43065:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;17432:1:::1;18038:7;;:19;;18030:63;;;;-1:-1:-1::0;;;18030:63:0::1;;;;;;;:::i;:::-;17432:1;18171:7;:18:::0;19804:8:::2;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1::0;;;19795:38:0::2;;;;;;;:::i;:::-;43107:32:::3;43120:6;43128:10;43107:12;:32::i;:::-;43165:9;::::0;;43154:63:::3;::::0;-1:-1:-1;;;43154:63:0;;-1:-1:-1;;;;;43165:9:0;;::::3;::::0;43154:35:::3;::::0;:63:::3;::::0;43190:6;;43198:10:::3;::::0;43210:6;;43154:63:::3;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43146:95;;;;-1:-1:-1::0;;;43146:95:0::3;;;;;;;:::i;:::-;43250:51;::::0;-1:-1:-1;;;43250:51:0;;-1:-1:-1;;;;;43250:31:0;::::3;::::0;::::3;::::0;:51:::3;::::0;43282:10:::3;::::0;43294:6;;43250:51:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;43308:14:0::3;::::0;:54:::3;::::0;-1:-1:-1;;;43308:54:0;;-1:-1:-1;;;;;43308:14:0;;::::3;::::0;:34:::3;::::0;:54:::3;::::0;43343:6;;43351:10:::3;::::0;43308:54:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;17388:1:0::1;18350:22:::0;;-1:-1:-1;;;;;42967:401:0:o;38845:135::-;-1:-1:-1;;;;;38948:26:0;;;;;;:17;:26;;;;;;;;;38941:33;;;;;;;;;;;;;;;;;38916:16;;38941:33;;;38948:26;38941:33;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38941:33:0;;;;;;;;;;;;;;;;;;;;;;;38845:135;;;:::o;21012:37::-;;;-1:-1:-1;;;;;21012:37:0;;:::o;45096:337::-;-1:-1:-1;;;;;21732:19:0;;;;;;:11;:19;;;;;:28;45236:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;17432:1:::1;18038:7;;:19;;18030:63;;;;-1:-1:-1::0;;;18030:63:0::1;;;;;;;:::i;:::-;17432:1;18171:7;:18:::0;19804:8:::2;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1::0;;;19795:38:0::2;;;;;;;:::i;:::-;45278:90:::3;::::0;-1:-1:-1;;;45278:90:0;;-1:-1:-1;;;;;45278:42:0;::::3;::::0;::::3;::::0;45328:9:::3;::::0;45278:90:::3;::::0;45339:10:::3;::::0;45351:8;;45361:6;;45278:90:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20966:41::-:0;;;-1:-1:-1;;;;;20966:41:0;;:::o;19478:86::-;19549:7;;;;19478:86;:::o;23404:269::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23491:29:0;::::1;23483:78;;;;-1:-1:-1::0;;;23483:78:0::1;;;;;;;:::i;:::-;23568:14;:49:::0;;-1:-1:-1;;;;;;23568:49:0::1;-1:-1:-1::0;;;;;23568:49:0;::::1;;::::0;;23629:38:::1;::::0;::::1;::::0;::::1;::::0;23568:49;;23629:38:::1;:::i;47852:293::-:0;17432:1;18038:7;;:19;;18030:63;;;;-1:-1:-1;;;18030:63:0;;;;;;;:::i;:::-;17432:1;18171:7;:18;37993:15:::1;::::0;38023:145:::1;38047:7;:14:::0;38043:18;::::1;38023:145;;;38095:7;38103:1;38095:10;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38095:10:0::1;38081;:24;38077:84;;;38131:4;38118:17;;38146:5;;38077:84;38063:3;;38023:145;;;-1:-1:-1::0;38196:4:0::1;38182:18:::0;::::1;;;38174:60;;;;-1:-1:-1::0;;;38174:60:0::1;;;;;;;:::i;:::-;48009:69:::2;::::0;-1:-1:-1;;;48009:69:0;;48017:10:::2;::::0;48009:42:::2;::::0;:69:::2;::::0;48052:7;;48061:3;;48066;;48071:6;;48009:69:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;48085:14:0::2;::::0;:54:::2;::::0;-1:-1:-1;;;48085:54:0;;-1:-1:-1;;;;;48085:14:0;;::::2;::::0;-1:-1:-1;48085:32:0::2;::::0;-1:-1:-1;48085:54:0::2;::::0;48118:10:::2;::::0;48130:3;;48135;;48085:54:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;17388:1:0;18350:22;;-1:-1:-1;;;;;;;47852:293:0:o;22140:221::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22229:30:0;::::1;22221:75;;;;-1:-1:-1::0;;;22221:75:0::1;;;;;;;:::i;:::-;22303:15;:52:::0;;-1:-1:-1;;;;;;22303:52:0::1;-1:-1:-1::0;;;;;22303:52:0;;;::::1;::::0;;;::::1;::::0;;22140:221::o;38577:137::-;38647:26;;:::i;:::-;-1:-1:-1;;;;;;38689:19:0;;;;;:11;:19;;;;;;;;;38682:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38577:137::o;15122:148::-;14702:12;:10;:12::i;:::-;-1:-1:-1;;;;;14691:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14691:23:0;;14683:68;;;;-1:-1:-1;;;14683:68:0;;;;;;;:::i;:::-;15229:1:::1;15213:6:::0;;15192:40:::1;::::0;-1:-1:-1;;;;;15213:6:0;;::::1;::::0;15192:40:::1;::::0;15229:1;;15192:40:::1;15260:1;15243:19:::0;;-1:-1:-1;;;;;;15243:19:0::1;::::0;;15122:148::o;22502:188::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22573:21:0;::::1;22565:62;;;;-1:-1:-1::0;;;22565:62:0::1;;;;;;;:::i;:::-;22634:6;:16:::0;;-1:-1:-1;;;;;;22634:16:0::1;;-1:-1:-1::0;;;;;22634:16:0;::::1;;;::::0;;22662:22:::1;::::0;::::1;::::0;::::1;::::0;22634:16;;22662:22:::1;:::i;22696:197::-:0;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22769:22:0;::::1;22761:65;;;;-1:-1:-1::0;;;22761:65:0::1;;;;;;;:::i;:::-;22833:7;:18:::0;;-1:-1:-1;;;;;;22833:18:0::1;-1:-1:-1::0;;;;;22833:18:0;::::1;;::::0;;22863:24:::1;::::0;::::1;::::0;::::1;::::0;22833:18;;22863:24:::1;:::i;47048:105::-:0;17432:1;18038:7;;:19;;18030:63;;;;-1:-1:-1;;;18030:63:0;;;;;;;:::i;:::-;17432:1;18171:7;:18;47106:14:::1;::::0;:41:::1;::::0;-1:-1:-1;;;47106:41:0;;-1:-1:-1;;;;;47106:14:0;;::::1;::::0;:20:::1;::::0;:41:::1;::::0;47127:7:::1;::::0;47136:10:::1;::::0;47106:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;17388:1:0;18350:22;;-1:-1:-1;;47048:105:0:o;41815:391::-;-1:-1:-1;;;;;21732:19:0;;41963:7;21732:19;;;:11;:19;;;;;:28;41919:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;17432:1:::1;18038:7;;:19;;18030:63;;;;-1:-1:-1::0;;;18030:63:0::1;;;;;;;:::i;:::-;17432:1;18171:7;:18:::0;19804:8:::2;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1::0;;;19795:38:0::2;;;;;;;:::i;:::-;42003:48:::3;::::0;-1:-1:-1;;;42003:48:0;;41979:21:::3;::::0;-1:-1:-1;;;;;42003:27:0;::::3;::::0;::::3;::::0;:48:::3;::::0;42031:10:::3;::::0;42043:7;;42003:48:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42058:14;::::0;:54:::3;::::0;-1:-1:-1;;;42058:54:0;;41979:72;;-1:-1:-1;;;;;;42058:14:0::3;::::0;:34:::3;::::0;:54:::3;::::0;42093:6;;42101:10:::3;::::0;42058:54:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;42126:47;42139:10;42151:6;42159:13;42126:47;;;;;;;;:::i;:::-;;;;;;;;17388:1:::1;18350:22:::0;;42187:13;41815:391;-1:-1:-1;;;;41815:391:0:o;28249:58::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;28293:8:::1;:6;:8::i;21054:39::-:0;;;-1:-1:-1;;;;;21054:39:0;;:::o;21286:44::-;;;;:::o;14471:87::-;14517:7;14544:6;-1:-1:-1;;;;;14544:6:0;14471:87;:::o;37113:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39182:146::-;-1:-1:-1;;;;;39292:21:0;;;39272:4;39292:21;;;:13;:21;;;;;;;;:30;;;;;;;;;;;;39182:146;;;;;:::o;42397:401::-;-1:-1:-1;;;;;21732:19:0;;42550:7;21732:19;;;:11;:19;;;;;:28;42506:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;17432:1:::1;18038:7;;:19;;18030:63;;;;-1:-1:-1::0;;;18030:63:0::1;;;;;;;:::i;:::-;17432:1;18171:7;:18:::0;19804:8:::2;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1::0;;;19795:38:0::2;;;;;;;:::i;:::-;42590:53:::3;::::0;-1:-1:-1;;;42590:53:0;;42566:21:::3;::::0;-1:-1:-1;;;;;42590:32:0;::::3;::::0;::::3;::::0;:53:::3;::::0;42623:10:::3;::::0;42635:7;;42590:53:::3;;;:::i;37022:54::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37022:54:0;;-1:-1:-1;37022:54:0;;-1:-1:-1;37022:54:0:o;25355:209::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;25448:20:::1;:46:::0;;;25506:52:::1;::::0;::::1;::::0;::::1;::::0;25471:23;;25506:52:::1;:::i;44108:294::-:0;-1:-1:-1;;;;;21732:19:0;;;;;;:11;:19;;;;;:28;44219:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;17432:1:::1;18038:7;;:19;;18030:63;;;;-1:-1:-1::0;;;18030:63:0::1;;;;;;;:::i;:::-;17432:1;18171:7;:18:::0;19804:8:::2;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1::0;;;19795:38:0::2;;;;;;;:::i;:::-;44261:74:::3;::::0;-1:-1:-1;;;44261:74:0;;-1:-1:-1;;;;;44261:36:0;::::3;::::0;::::3;::::0;44305:9:::3;::::0;44261:74:::3;::::0;44316:10:::3;::::0;44328:6;;44261:74:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20866:21::-:0;;;;;;-1:-1:-1;;;;;20866:21:0;;:::o;21100:24::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21100:24:0;;-1:-1:-1;21100:24:0;:::o;24659:519::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21732:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;24785:6;;21732:28:::1;;21724:61;;;;-1:-1:-1::0;;;21724:61:0::1;;;;;;;:::i;:::-;309:4:::2;24808:19;:53;;24800:97;;;;-1:-1:-1::0;;;24800:97:0::2;;;;;;;:::i;:::-;24908:24:::0;;;::::2;::::0;:75:::2;;-1:-1:-1::0;24936:15:0::2;::::0;:42:::2;::::0;-1:-1:-1;;;24936:42:0;;-1:-1:-1;;;;;24936:15:0;;::::2;::::0;:34:::2;::::0;:42:::2;::::0;24971:6;;24936:42:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47:::0;24908:75:::2;24904:138;;;24994:40;;-1:-1:-1::0;;;24994:40:0::2;;;;;;;:::i;24904:138::-;-1:-1:-1::0;;;;;25050:19:0;::::2;;::::0;;;:11:::2;:19;::::0;;;;;;:36:::2;;:58:::0;;;25120:52;::::2;::::0;::::2;::::0;25062:6;;25089:19;;25120:52:::2;:::i;:::-;;;;;;;;21565:1:::1;24659:519:::0;;:::o;39847:183::-;39923:9;39918:107;39942:7;:14;39938:1;:18;39918:107;;;39972:45;39993:7;40001:1;39993:10;;;;;;;;;;;;;;40006;39972:12;:45::i;:::-;39958:3;;39918:107;;;;39847:183;:::o;37349:238::-;14702:12;:10;:12::i;:::-;-1:-1:-1;;;;;14691:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14691:23:0;;14683:68;;;;-1:-1:-1;;;14683:68:0;;;;;;;:::i;:::-;37429:11:::1;::::0;::::1;;:20;37421:52;;;;-1:-1:-1::0;;;37421:52:0::1;;;;;;;:::i;:::-;37482:13;:11;:13::i;:::-;37502:15;:52:::0;;-1:-1:-1;;;;;;37502:52:0::1;-1:-1:-1::0;;;;;37502:52:0;;;::::1;::::0;;;::::1;::::0;;37563:11:::1;:18:::0;;-1:-1:-1;;37563:18:0::1;-1:-1:-1::0;37563:18:0::1;::::0;;37349:238::o;25753:398::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;25879:19;;;::::1;::::0;:61:::1;;-1:-1:-1::0;25902:38:0;;::::1;25879:61;25871:92;;;;-1:-1:-1::0;;;25871:92:0::1;;;;;;;:::i;:::-;25977:9;25972:174;25992:18:::0;;::::1;25972:174;;;26062:13;;26076:1;26062:16;;;;;;;;;;;;;26026:11;:23;26038:7;;26046:1;26038:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26026:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;26026:23:0;:33:::1;;:52:::0;26109:7;;26117:1;26109:10;;::::1;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26092:46:0::1;;26121:13;;26135:1;26121:16;;;;;;;;;;;;;26092:46;;;;;;:::i;:::-;;;;;;;;26012:3;;25972:174;;44408:416:::0;-1:-1:-1;;;;;21732:19:0;;;;;;:11;:19;;;;;:28;44541:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;21857:7:::1;::::0;-1:-1:-1;;;;;21857:7:0::1;21843:10;:21;21835:66;;;;-1:-1:-1::0;;;21835:66:0::1;;;;;;;:::i;:::-;17432:1:::2;18038:7;;:19;;18030:63;;;;-1:-1:-1::0;;;18030:63:0::2;;;;;;;:::i;:::-;17432:1;18171:7;:18:::0;19804:8:::3;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1::0;;;19795:38:0::3;;;;;;;:::i;:::-;36924:42:::4;-1:-1:-1::0;;;;;44603:44:0::4;44611:6;-1:-1:-1::0;;;;;44603:26:0::4;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44603:44:0::4;;44595:87;;;;-1:-1:-1::0;;;44595:87:0::4;;;;;;;:::i;:::-;44689:74;::::0;-1:-1:-1;;;44689:74:0;;-1:-1:-1;;;;;44689:36:0;::::4;::::0;::::4;::::0;44733:9:::4;::::0;44689:74:::4;::::0;44744:10:::4;::::0;44756:6;;44689:74:::4;;;:::i;27002:605::-:0;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27171:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;::::1;;27170:29;27162:69;;;;-1:-1:-1::0;;;27162:69:0::1;;;;;;;:::i;:::-;27243:9;27238:122;27262:7;:14:::0;27258:18;::::1;27238:122;;;27314:6;-1:-1:-1::0;;;;;27300:20:0::1;:7;27308:1;27300:10;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27300:10:0::1;:20;;27292:60;;;;-1:-1:-1::0;;;27292:60:0::1;;;;;;;:::i;:::-;27278:3;;27238:122;;;-1:-1:-1::0;27390:152:0::1;::::0;;::::1;::::0;::::1;::::0;;27429:4:::1;27390:152:::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27368:19:0;::::1;-1:-1:-1::0;27368:19:0;;;:11:::1;:19:::0;;;;;;:174;;;;-1:-1:-1;;27368:174:0::1;::::0;::::1;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;27549:7:::1;:20:::0;;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;27549:20:0::1;::::0;;::::1;::::0;;27581;::::1;::::0;::::1;::::0;27368:19;;27581:20:::1;:::i;:::-;;;;;;;;27002:605:::0;;;;:::o;27729:514::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27810:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;::::1;;27802:62;;;;-1:-1:-1::0;;;27802:62:0::1;;;;;;;:::i;:::-;27887:6;-1:-1:-1::0;;;;;27879:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34:::0;:72;::::1;;;;27925:6;-1:-1:-1::0;;;;;27917:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34:::0;27879:72:::1;27871:111;;;;-1:-1:-1::0;;;27871:111:0::1;;;;;;;:::i;:::-;28008:7;:14:::0;27991::::1;28029:209;28053:6;28049:1;:10;28029:209;;;28093:6;-1:-1:-1::0;;;;;28079:20:0::1;:7;28087:1;28079:10;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;28079:10:0::1;:20;28075:156;;;28125:7;28142:1;28133:6;:10;28125:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;28112:7:::1;:10:::0;;-1:-1:-1;;;;;28125:19:0;;::::1;::::0;28120:1;;28112:10;::::1;;;;;;;;;;;;;:32;;;;;-1:-1:-1::0;;;;;28112:32:0::1;;;;;-1:-1:-1::0;;;;;28112:32:0::1;;;;;;28155:7;:13;;;;;;;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;28155:13:0;;;;;-1:-1:-1;;;;;;28155:13:0::1;::::0;;;;;;;;-1:-1:-1;;;;;28186:19:0;::::1;::::0;;:11:::1;:19:::0;;;;;28179:26;;-1:-1:-1;;28179:26:0::1;::::0;;28155:13:::1;28179:26:::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;28216:5:::1;;28075:156;28061:3;;28029:209;;;;21565:1;27729:514:::0;:::o;23679:276::-;21483:6;;;;;-1:-1:-1;;;;;21483:6:0;21469:10;:20;;:45;;;21507:7;:5;:7::i;:::-;-1:-1:-1;;;;;21493:21:0;:10;-1:-1:-1;;;;;21493:21:0;;21469:45;21461:97;;;;-1:-1:-1;;;21461:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23772:32:0;::::1;23764:84;;;;-1:-1:-1::0;;;23764:84:0::1;;;;;;;:::i;:::-;23855:17;:38:::0;;-1:-1:-1;;;;;;23855:38:0::1;-1:-1:-1::0;;;;;23855:38:0;::::1;;::::0;;23905:44:::1;::::0;::::1;::::0;::::1;::::0;23855:38;;23905:44:::1;:::i;45602:1374::-:0;17432:1;18038:7;;:19;;18030:63;;;;-1:-1:-1;;;18030:63:0;;;;;;;:::i;:::-;17432:1;18171:7;:18;19804:8:::1;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1::0;;;19795:38:0::1;;;;;;;:::i;:::-;36924:42:::2;-1:-1:-1::0;;;;;45805:52:0::2;45813:14;-1:-1:-1::0;;;;;45805:34:0::2;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45805:52:0::2;;:73;;45872:6;45805:73;;;45860:9;45805:73;-1:-1:-1::0;;;;;45893:27:0;::::2;;::::0;;;:11:::2;:27;::::0;;;;:36;45796:82;;-1:-1:-1;45893:36:0::2;;:78:::0;::::2;;;-1:-1:-1::0;;;;;;45933:29:0;::::2;;::::0;;;:11:::2;:29;::::0;;;;:38;::::2;;45893:78;45885:111;;;;-1:-1:-1::0;;;45885:111:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46011:31:0;;::::2;;::::0;;;:13:::2;:31;::::0;;;;;;;:41;;::::2;::::0;;;;;;;::::2;;46003:76;;;;-1:-1:-1::0;;;46003:76:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46094:29:0;::::2;46143:1;46094:29:::0;;;:11:::2;:29;::::0;;;;:46:::2;;::::0;46086:85:::2;;;;-1:-1:-1::0;;;46086:85:0::2;;;;;;;:::i;:::-;46205:9;::::0;;46267:11:::2;::::0;46194:85:::2;::::0;-1:-1:-1;;;46194:85:0;;-1:-1:-1;;;;;46205:9:0;;::::2;::::0;46194:38:::2;::::0;:85:::2;::::0;46233:14;;46249:8;;46259:6;;46267:11;46194:85:::2;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46178:148;;;;-1:-1:-1::0;;;46178:148:0::2;;;;;;;:::i;:::-;46338:21;46361:25:::0;46398:14:::2;-1:-1:-1::0;;;;;46390:39:0::2;;46437:9;46456:16;46481:10;46500:8;46517:6;46390:140;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46539:72;::::0;-1:-1:-1;;;46539:72:0;;46335:195;;-1:-1:-1;46335:195:0;-1:-1:-1;;;;;;46539:31:0;::::2;::::0;-1:-1:-1;46539:31:0::2;::::0;:72:::2;::::0;46571:10:::2;::::0;46583:8;;46335:195;;46539:72:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;46618:14:0::2;::::0;:72:::2;::::0;-1:-1:-1;;;46618:72:0;;-1:-1:-1;;;;;46618:14:0;;::::2;::::0;-1:-1:-1;46618:32:0::2;::::0;-1:-1:-1;46618:72:0::2;::::0;46651:16;;46669:8;;46679:10:::2;::::0;46618:72:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;46719:1;46703:13;:17;46699:203;;;46763:17;::::0;46731:75:::2;::::0;-1:-1:-1;;;46731:75:0;;-1:-1:-1;;;;;46731:31:0;;::::2;::::0;::::2;::::0;:75:::2;::::0;46763:17;;::::2;::::0;46782:8;;46792:13;;46731:75:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;46815:14:0::2;::::0;46876:17:::2;::::0;46815:79:::2;::::0;-1:-1:-1;;;46815:79:0;;-1:-1:-1;;;;;46815:14:0;;::::2;::::0;-1:-1:-1;46815:32:0::2;::::0;-1:-1:-1;46815:79:0::2;::::0;46848:16;;46866:8;;46876:17;::::2;::::0;46815:79:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;46699:203;46910:14;::::0;:60:::2;::::0;-1:-1:-1;;;46910:60:0;;-1:-1:-1;;;;;46910:14:0;;::::2;::::0;:34:::2;::::0;:60:::2;::::0;46945:14;;46961:8;;46910:60:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;17388:1:0;18350:22;;-1:-1:-1;;;;;;;;45602:1374:0:o;40244:500::-;-1:-1:-1;;;;;21732:19:0;;;;;;:11;:19;;;;;:28;40315:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37839:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;;;37861:10:::1;37839:33:::0;;;;;;;;40342:6;;37839:33:::1;;37831:69;;;;-1:-1:-1::0;;;37831:69:0::1;;;;;;;:::i;:::-;40357:40:::2;;:::i;:::-;40400:50;::::0;-1:-1:-1;;;40400:50:0;;-1:-1:-1;;;;;40400:38:0;::::2;::::0;::::2;::::0;:50:::2;::::0;40439:10:::2;::::0;40400:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40357:93;;40465:8;:22;;;40491:1;40465:27;40457:73;;;;-1:-1:-1::0;;;40457:73:0::2;;;;;;;:::i;:::-;40556:9;::::0;;40601:22;;40545:79:::2;::::0;-1:-1:-1;;;40545:79:0;;-1:-1:-1;;;;;40556:9:0;;::::2;::::0;40545:35:::2;::::0;:79:::2;::::0;40581:6;;40589:10:::2;::::0;40545:79:::2;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40537:111;;;;-1:-1:-1::0;;;40537:111:0::2;;;;;;;:::i;:::-;40657:37;40675:6;40683:10;40657:17;:37::i;:::-;40706:32;40719:6;40727:10;40706:32;;;;;;;:::i;47286:198::-:0;17432:1;18038:7;;:19;;18030:63;;;;-1:-1:-1;;;18030:63:0;;;;;;;:::i;:::-;17432:1;18171:7;:18;;;47386:16:::1;::::0;;;;;;;::::1;::::0;;;47358:25:::1;::::0;47386:16:::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;47386:16:0::1;47358:44;;47423:6;47409:8;47418:1;47409:11;;;;;;;;-1:-1:-1::0;;;;;47409:20:0;;::::1;:11;::::0;;::::1;::::0;;;;;:20;47436:14:::1;::::0;:42:::1;::::0;-1:-1:-1;;;47436:42:0;;:14;::::1;::::0;:20:::1;::::0;:42:::1;::::0;47457:8;;47467:10:::1;::::0;47436:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;17388:1:0;18350:22;;-1:-1:-1;;;;47286:198:0:o;40901:723::-;-1:-1:-1;;;;;21732:19:0;;41052:7;21732:19;;;:11;:19;;;;;:28;41008:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;17432:1:::1;18038:7;;:19;;18030:63;;;;-1:-1:-1::0;;;18030:63:0::1;;;;;;;:::i;:::-;17432:1;18171:7;:18:::0;19804:8:::2;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1::0;;;19795:38:0::2;;;;;;;:::i;:::-;36924:42:::3;-1:-1:-1::0;;;;;41078:44:0::3;41086:6;-1:-1:-1::0;;;;;41078:26:0::3;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41078:44:0::3;;:66;;41137:7;41078:66;;;41125:9;41078:66;-1:-1:-1::0;;;;;41171:19:0;::::3;41151:17;41171:19:::0;;;:11:::3;:19;::::0;;;;:29:::3;;::::0;41068:76;;-1:-1:-1;41223:14:0;;;:128:::3;;;41342:9;41250:88;41330:7;41250:75;41320:4;41250:65;41292:6;-1:-1:-1::0;;;;;41284:28:0::3;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41258:6;-1:-1:-1::0;;;;;41250:27:0::3;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33:::0;::::3;:65::i;:::-;:69:::0;::::3;:75::i;:::-;:79:::0;::::3;:88::i;:::-;:101;;41223:128;41207:186;;;;-1:-1:-1::0;;;41207:186:0::3;;;;;;;:::i;:::-;41402:15;41428:6;-1:-1:-1::0;;;;;41420:22:0::3;;41450:9;41461:10;41473:7;41420:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41488:14;::::0;:54:::3;::::0;-1:-1:-1;;;41488:54:0;;41402:79;;-1:-1:-1;;;;;;41488:14:0::3;::::0;:34:::3;::::0;:54:::3;::::0;41523:6;;41531:10:::3;::::0;41488:54:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;41556:41;41569:10;41581:6;41589:7;41556:41;;;;;;;;:::i;:::-;;;;;;;;17388:1:::1;18350:22:::0;;41611:7;40901:723;-1:-1:-1;;;;;40901:723:0:o;15425:244::-;14702:12;:10;:12::i;:::-;-1:-1:-1;;;;;14691:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14691:23:0;;14683:68;;;;-1:-1:-1;;;14683:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15514:22:0;::::1;15506:73;;;;-1:-1:-1::0;;;15506:73:0::1;;;;;;;:::i;:::-;15616:6;::::0;;15595:38:::1;::::0;-1:-1:-1;;;;;15595:38:0;;::::1;::::0;15616:6;::::1;::::0;15595:38:::1;::::0;::::1;15644:6;:17:::0;;-1:-1:-1;;;;;;15644:17:0::1;-1:-1:-1::0;;;;;15644:17:0;;;::::1;::::0;;;::::1;::::0;;15425:244::o;39354:224::-;39533:9;;;39522:50;;-1:-1:-1;;;39522:50:0;;39441:23;;;;;;-1:-1:-1;;;;;39533:9:0;;;;39522:41;;:50;;39564:7;;39522:50;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39515:57;;;;;;39354:224;;;;;:::o;47547:98::-;47595:14;;:44;;-1:-1:-1;;;47595:44:0;;-1:-1:-1;;;;;47595:14:0;;;;:23;;:44;;47619:7;;47628:10;;47595:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47547:98::o;48435:289::-;-1:-1:-1;;;;;21732:19:0;;;;;;:11;:19;;;;;:28;48517:6;;21732:28;;21724:61;;;;-1:-1:-1;;;21724:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48537:21:0;;::::1;;::::0;;;:13:::1;:21;::::0;;;;;;;:31;;::::1;::::0;;;;;;;::::1;;48532:187;;-1:-1:-1::0;;;;;48579:21:0;;::::1;;::::0;;;:13:::1;:21;::::0;;;;;;;:31;;::::1;::::0;;;;;;;;:38;;-1:-1:-1;;48579:38:0::1;48613:4;48579:38:::0;;::::1;::::0;;;48626:17:::1;:27:::0;;;;;:40;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;48626:40:0::1;::::0;;::::1;::::0;;48680:31;::::1;::::0;::::1;::::0;48593:6;;48601:8;;48680:31:::1;:::i;20537:120::-:0;20081:8;:6;:8::i;:::-;20073:41;;;;-1:-1:-1;;;20073:41:0;;;;;;;:::i;:::-;20596:7:::1;:15:::0;;-1:-1:-1;;20596:15:0::1;::::0;;20627:22:::1;20636:12;:10;:12::i;:::-;20627:22;;;;;;:::i;:::-;;;;;;;;20537:120::o:0;13002:106::-;13090:10;13002:106;:::o;20278:118::-;19804:8;:6;:8::i;:::-;19803:9;19795:38;;;;-1:-1:-1;;;19795:38:0;;;;;;;:::i;:::-;20338:7:::1;:14:::0;;-1:-1:-1;;20338:14:0::1;20348:4;20338:14;::::0;;20368:20:::1;20375:12;:10;:12::i;21966:114::-:0;22019:4;22005:11;:18;22060:6;22037:20;:29;21966:114::o;48979:542::-;-1:-1:-1;;;;;49069:27:0;;49106:1;49069:27;;;:17;:27;;;;;:34;49061:79;;;;-1:-1:-1;;;49061:79:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49154:27:0;;;;;;;:13;:27;;;;;;;;:37;;;;;;;;;;;49147:44;;-1:-1:-1;;49147:44:0;;;49217:17;:27;;;;;:34;;49258:258;49282:6;49278:1;:10;49258:258;;;-1:-1:-1;;;;;49308:27:0;;;;;;;:17;:27;;;;;:30;;:46;;;;49336:1;;49308:30;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49308:30:0;:46;49304:205;;;-1:-1:-1;;;;;49400:27:0;;;;;;:17;:27;;;;;:39;;-1:-1:-1;;49428:10:0;;;49400:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49367:27:0;;;;;:17;:27;;;;;;;:30;;49400:39;;;;;49367:27;49395:1;;49367:30;;;;;;;;;;;;;;;;;;:72;;-1:-1:-1;;;;;;49367:72:0;-1:-1:-1;;;;;49367:72:0;;;;;;49450:27;;;;;:17;:27;;;;;;:33;;;;;;;;;;;;;;;;-1:-1:-1;;49450:33:0;;;;;-1:-1:-1;;;;;;49450:33:0;;;;;;49494:5;;49304:205;49290:3;;49258:258;;32923:220;32981:7;33005:6;33001:20;;-1:-1:-1;33020:1:0;33013:8;;33001:20;33044:5;;;33048:1;33044;:5;:1;33068:5;;;;;:10;33060:56;;;;-1:-1:-1;;;33060:56:0;;;;;;;:::i;:::-;33134:1;32923:220;-1:-1:-1;;;32923:220:0:o;33621:153::-;33679:7;33711:1;33707;:5;33699:44;;;;-1:-1:-1;;;33699:44:0;;;;;;;:::i;:::-;33765:1;33761;:5;;;;;;;33621:153;-1:-1:-1;;;33621:153:0:o;32044:179::-;32102:7;32134:5;;;32158:6;;;;32150:46;;;;-1:-1:-1;;;32150:46:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;454:352::-;;;584:3;577:4;569:6;565:17;561:27;551:2;;-1:-1;;592:12;551:2;-1:-1;622:20;;662:18;651:30;;648:2;;;-1:-1;;684:12;648:2;728:4;720:6;716:17;704:29;;779:3;728:4;;763:6;759:17;720:6;745:32;;742:41;739:2;;;796:1;;786:12;739:2;544:262;;;;;:::o;3070:241::-;;3174:2;3162:9;3153:7;3149:23;3145:32;3142:2;;;-1:-1;;3180:12;3142:2;85:6;72:20;97:33;124:5;97:33;:::i;3318:263::-;;3433:2;3421:9;3412:7;3408:23;3404:32;3401:2;;;-1:-1;;3439:12;3401:2;226:6;220:13;238:33;265:5;238:33;:::i;3852:633::-;;;;;4015:3;4003:9;3994:7;3990:23;3986:33;3983:2;;;-1:-1;;4022:12;3983:2;371:6;358:20;383:41;418:5;383:41;:::i;:::-;4074:71;4182:2;4221:22;;2859:20;;-1:-1;4290:2;4329:22;;2859:20;;4398:2;4437:22;2859:20;;-1:-1;3977:508;-1:-1;;;3977:508::o;4492:366::-;;;4613:2;4601:9;4592:7;4588:23;4584:32;4581:2;;;-1:-1;;4619:12;4581:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4671:63;-1:-1;4771:2;4810:22;;72:20;97:33;72:20;97:33;:::i;:::-;4779:63;;;;4575:283;;;;;:::o;4865:617::-;;;;;5020:3;5008:9;4999:7;4995:23;4991:33;4988:2;;;-1:-1;;5027:12;4988:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5079:63;-1:-1;5179:2;5218:22;;72:20;97:33;72:20;97:33;:::i;:::-;5187:63;-1:-1;5287:2;5326:22;;72:20;97:33;72:20;97:33;:::i;:::-;4982:500;;;;-1:-1;5295:63;;5395:2;5434:22;2859:20;;-1:-1;;4982:500::o;5489:491::-;;;;5627:2;5615:9;5606:7;5602:23;5598:32;5595:2;;;-1:-1;;5633:12;5595:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5685:63;-1:-1;5785:2;5824:22;;72:20;97:33;72:20;97:33;:::i;:::-;5589:391;;5793:63;;-1:-1;;;5893:2;5932:22;;;;2859:20;;5589:391::o;5987:366::-;;;6108:2;6096:9;6087:7;6083:23;6079:32;6076:2;;;-1:-1;;6114:12;6076:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6166:63;6266:2;6305:22;;;;2859:20;;-1:-1;;;6070:283::o;6360:678::-;;;;;6551:2;6539:9;6530:7;6526:23;6522:32;6519:2;;;-1:-1;;6557:12;6519:2;6615:17;6602:31;6653:18;;6645:6;6642:30;6639:2;;;-1:-1;;6675:12;6639:2;6713:80;6785:7;6776:6;6765:9;6761:22;6713:80;:::i;:::-;6695:98;;-1:-1;6695:98;-1:-1;6858:2;6843:18;;6830:32;;-1:-1;6871:30;;;6868:2;;;-1:-1;;6904:12;6868:2;;6942:80;7014:7;7005:6;6994:9;6990:22;6942:80;:::i;:::-;6513:525;;;;-1:-1;6924:98;-1:-1;;;;6513:525::o;7045:377::-;;7174:2;;7162:9;7153:7;7149:23;7145:32;7142:2;;;-1:-1;;7180:12;7142:2;7238:17;7225:31;7276:18;7268:6;7265:30;7262:2;;;-1:-1;;7298:12;7262:2;7374:22;;942:4;930:17;;926:27;-1:-1;916:2;;-1:-1;;957:12;916:2;1004:6;991:20;1026:80;1041:64;1098:6;1041:64;:::i;:::-;1026:80;:::i;:::-;1134:21;;;1191:14;;;;1166:17;;;1280;;;1271:27;;;;1268:36;-1:-1;1265:2;;;-1:-1;;1307:12;1265:2;-1:-1;1333:10;;1327:206;1352:6;1349:1;1346:13;1327:206;;;1432:37;1465:3;1453:10;1432:37;:::i;:::-;1420:50;;1374:1;1367:9;;;;;1484:14;;;;1512;;1327:206;;;-1:-1;7318:88;7136:286;-1:-1;;;;;;;7136:286::o;7429:257::-;;7541:2;7529:9;7520:7;7516:23;7512:32;7509:2;;;-1:-1;;7547:12;7509:2;2006:6;2000:13;53869:5;51862:13;51855:21;53847:5;53844:32;53834:2;;-1:-1;;53880:12;7693:325;;7839:2;7827:9;7818:7;7814:23;7810:32;7807:2;;;-1:-1;;7845:12;7807:2;2265:20;7839:2;2265:20;:::i;:::-;3013:6;3007:13;2358:16;2351:86;2507:2;2576:9;2572:22;3007:13;2507:2;2526:5;2522:16;2515:86;2670:2;2739:9;2735:22;3007:13;2670:2;2689:5;2685:16;2678:86;7897:105;;;;7801:217;;;;:::o;8025:241::-;;8129:2;8117:9;8108:7;8104:23;8100:32;8097:2;;;-1:-1;;8135:12;8097:2;-1:-1;2859:20;;8091:175;-1:-1;8091:175::o;8273:263::-;;8388:2;8376:9;8367:7;8363:23;8359:32;8356:2;;;-1:-1;;8394:12;8356:2;-1:-1;3007:13;;8350:186;-1:-1;8350:186::o;8543:535::-;;;;8692:2;8680:9;8671:7;8667:23;8663:32;8660:2;;;-1:-1;;8698:12;8660:2;3013:6;3007:13;8750:74;;8861:2;8915:9;8911:22;3007:13;8869:74;;8980:2;9034:9;9030:22;3007:13;8988:74;;8654:424;;;;;:::o;9677:690::-;;9870:5;50676:12;51223:6;51218:3;51211:19;51260:4;;51255:3;51251:14;9882:93;;51260:4;10046:5;50350:14;-1:-1;10085:260;10110:6;10107:1;10104:13;10085:260;;;10171:13;;-1:-1;;;;;51526:54;9477:37;;9239:14;;;;50954;;;;662:18;10125:9;10085:260;;;-1:-1;10351:10;;9801:566;-1:-1;;;;;9801:566::o;24802:222::-;-1:-1;;;;;51526:54;;;;9477:37;;24929:2;24914:18;;24900:124::o;25276:460::-;-1:-1;;;;;51526:54;;;9346:58;;51526:54;;;25639:2;25624:18;;9477:37;51526:54;;;25722:2;25707:18;;9477:37;25467:2;25452:18;;25438:298::o;25743:460::-;-1:-1;;;;;51526:54;;;9346:58;;51526:54;;;;26106:2;26091:18;;9477:37;26189:2;26174:18;;24633:37;;;;25934:2;25919:18;;25905:298::o;26210:349::-;-1:-1;;;;;51526:54;;;;9346:58;;26545:2;26530:18;;24633:37;26373:2;26358:18;;26344:215::o;26566:333::-;-1:-1;;;;;51526:54;;;9477:37;;51526:54;;26885:2;26870:18;;9477:37;26721:2;26706:18;;26692:207::o;27262:572::-;-1:-1;;;;;51526:54;;;9477:37;;51526:54;;;27654:2;27639:18;;9346:58;51526:54;;27737:2;27722:18;;9477:37;27820:2;27805:18;;24633:37;;;;27481:3;27466:19;;27452:382::o;30240:556::-;-1:-1;;;;;51526:54;;;9477:37;;51526:54;;;;30616:2;30601:18;;9477:37;30699:2;30684:18;;24633:37;30782:2;30767:18;;24633:37;;;;30451:3;30436:19;;30422:374::o;31143:370::-;;31320:2;31341:17;31334:47;31395:108;31320:2;31309:9;31305:18;31489:6;31395:108;:::i;31520:497::-;;31733:2;31754:17;31747:47;31808:108;31733:2;31722:9;31718:18;31902:6;31808:108;:::i;:::-;31800:116;;662:18;;51537:42;;;51530:5;51526:54;32003:2;31992:9;31988:18;9346:58;31704:313;;;;;:::o;32024:491::-;;32234:2;32223:9;32219:18;32234:2;32255:17;32248:47;32309:105;10593:5;50823:12;51223:6;51218:3;51211:19;51251:14;32223:9;51251:14;10605:93;;50513:3;-1:-1;50503:14;51260:4;;;;-1:-1;50532:18;-1:-1;10805:288;10830:6;10827:1;10824:13;10805:288;;;53390:11;;-1:-1;;;;;51526:54;9477:37;;9239:14;;;;662:18;51066:14;;;;10845:9;10805:288;;;-1:-1;;;;;;;;51526:54;;;;32486:18;;9346:58;;;;-1:-1;32301:113;32205:310;-1:-1;32205:310::o;32522:210::-;51862:13;;51855:21;11178:34;;32643:2;32628:18;;32614:118::o;32739:544::-;51862:13;;51855:21;11178:34;;33103:2;33088:18;;24633:37;;;;33186:2;33171:18;;24633:37;33269:2;33254:18;;24633:37;32944:3;32929:19;;32915:368::o;33842:416::-;34042:2;34056:47;;;11920:2;34027:18;;;51211:19;-1:-1;;;51251:14;;;11936:43;11998:12;;;34013:245::o;34265:416::-;34465:2;34479:47;;;12249:2;34450:18;;;51211:19;12285:34;51251:14;;;12265:55;-1:-1;;;12340:12;;;12333:25;12377:12;;;34436:245::o;34688:416::-;34888:2;34902:47;;;12628:2;34873:18;;;51211:19;12664:25;51251:14;;;12644:46;12709:12;;;34859:245::o;35111:416::-;35311:2;35325:47;;;12960:2;35296:18;;;51211:19;12996:34;51251:14;;;12976:55;-1:-1;;;13051:12;;;13044:28;13091:12;;;35282:245::o;35534:416::-;35734:2;35748:47;;;13342:2;35719:18;;;51211:19;13378:34;51251:14;;;13358:55;-1:-1;;;13433:12;;;13426:30;13475:12;;;35705:245::o;35957:416::-;36157:2;36171:47;;;13726:2;36142:18;;;51211:19;13762:32;51251:14;;;13742:53;13814:12;;;36128:245::o;36380:416::-;36580:2;36594:47;;;14065:2;36565:18;;;51211:19;14101:29;51251:14;;;14081:50;14150:12;;;36551:245::o;36803:416::-;37003:2;37017:47;;;14401:2;36988:18;;;51211:19;14437:26;51251:14;;;14417:47;14483:12;;;36974:245::o;37226:416::-;37426:2;37440:47;;;14734:2;37411:18;;;51211:19;14770:34;51251:14;;;14750:55;-1:-1;;;14825:12;;;14818:31;14868:12;;;37397:245::o;37649:416::-;37849:2;37863:47;;;15119:2;37834:18;;;51211:19;15155:32;51251:14;;;15135:53;15207:12;;;37820:245::o;38072:416::-;38272:2;38286:47;;;15458:2;38257:18;;;51211:19;15494:31;51251:14;;;15474:52;15545:12;;;38243:245::o;38495:416::-;38695:2;38709:47;;;15796:2;38680:18;;;51211:19;15832:28;51251:14;;;15812:49;15880:12;;;38666:245::o;38918:416::-;39118:2;39132:47;;;16131:2;39103:18;;;51211:19;16167:30;51251:14;;;16147:51;16217:12;;;39089:245::o;39341:416::-;39541:2;39555:47;;;16468:2;39526:18;;;51211:19;-1:-1;;;51251:14;;;16484:39;16542:12;;;39512:245::o;39764:416::-;39964:2;39978:47;;;16793:2;39949:18;;;51211:19;-1:-1;;;51251:14;;;16809:42;16870:12;;;39935:245::o;40187:416::-;40387:2;40401:47;;;17121:2;40372:18;;;51211:19;-1:-1;;;51251:14;;;17137:42;17198:12;;;40358:245::o;40610:416::-;40810:2;40824:47;;;17449:2;40795:18;;;51211:19;-1:-1;;;51251:14;;;17465:44;17528:12;;;40781:245::o;41033:416::-;41233:2;41247:47;;;17779:2;41218:18;;;51211:19;-1:-1;;;51251:14;;;17795:42;17856:12;;;41204:245::o;41456:416::-;41656:2;41670:47;;;18107:2;41641:18;;;51211:19;18143:34;51251:14;;;18123:55;-1:-1;;;18198:12;;;18191:25;18235:12;;;41627:245::o;41879:416::-;42079:2;42093:47;;;18486:2;42064:18;;;51211:19;18522:30;51251:14;;;18502:51;18572:12;;;42050:245::o;42302:416::-;42502:2;42516:47;;;42487:18;;;51211:19;18859:34;51251:14;;;18839:55;18913:12;;;42473:245::o;42725:416::-;42925:2;42939:47;;;19164:2;42910:18;;;51211:19;19200:32;51251:14;;;19180:53;19252:12;;;42896:245::o;43148:416::-;43348:2;43362:47;;;19503:2;43333:18;;;51211:19;19539:33;51251:14;;;19519:54;19592:12;;;43319:245::o;43571:416::-;43771:2;43785:47;;;19843:2;43756:18;;;51211:19;19879:28;51251:14;;;19859:49;19927:12;;;43742:245::o;43994:416::-;44194:2;44208:47;;;20178:2;44179:18;;;51211:19;-1:-1;;;51251:14;;;20194:43;20256:12;;;44165:245::o;44417:416::-;44617:2;44631:47;;;20507:2;44602:18;;;51211:19;20543:31;51251:14;;;20523:52;20594:12;;;44588:245::o;44840:416::-;45040:2;45054:47;;;45025:18;;;51211:19;20881:34;51251:14;;;20861:55;20935:12;;;45011:245::o;45263:416::-;45463:2;45477:47;;;21186:2;45448:18;;;51211:19;21222:33;51251:14;;;21202:54;21275:12;;;45434:245::o;45686:416::-;45886:2;45900:47;;;21526:2;45871:18;;;51211:19;21562:28;51251:14;;;21542:49;21610:12;;;45857:245::o;46109:416::-;46309:2;46323:47;;;21861:2;46294:18;;;51211:19;-1:-1;;;51251:14;;;21877:41;21937:12;;;46280:245::o;46532:416::-;46732:2;46746:47;;;22188:2;46717:18;;;51211:19;22224:34;51251:14;;;22204:55;-1:-1;;;22279:12;;;22272:31;22322:12;;;46703:245::o;46955:416::-;47155:2;47169:47;;;22573:2;47140:18;;;51211:19;-1:-1;;;51251:14;;;22589:45;22653:12;;;47126:245::o;47378:416::-;47578:2;47592:47;;;22904:2;47563:18;;;51211:19;22940:33;51251:14;;;22920:54;22993:12;;;47549:245::o;47801:416::-;48001:2;48015:47;;;23244:2;47986:18;;;51211:19;23280:29;51251:14;;;23260:50;23329:12;;;47972:245::o;48224:416::-;48424:2;48438:47;;;48409:18;;;51211:19;23616:34;51251:14;;;23596:55;23670:12;;;48395:245::o;48647:327::-;23974:23;;51862:13;51855:21;11178:34;;24144:4;24133:16;;;24127:23;24204:14;;;24633:37;24303:4;24292:16;;;24286:23;24363:14;;;24633:37;24469:4;24458:16;;;24452:23;24529:14;;;24633:37;;;;48826:3;48811:19;;48797:177::o;48981:222::-;24633:37;;;49108:2;49093:18;;49079:124::o;49210:444::-;24633:37;;;49557:2;49542:18;;24633:37;;;;49640:2;49625:18;;24633:37;49393:2;49378:18;;49364:290::o;49661:256::-;49723:2;49717:9;49749:17;;;49824:18;49809:34;;49845:22;;;49806:62;49803:2;;;49881:1;;49871:12;49803:2;49723;49890:22;49701:216;;-1:-1;49701:216::o;49924:304::-;;50083:18;50075:6;50072:30;50069:2;;;-1:-1;;50105:12;50069:2;-1:-1;50150:4;50138:17;;;50203:15;;50006:222::o;53524:117::-;-1:-1;;;;;51526:54;;53583:35;;53573:2;;53632:1;;53622:12;53573:2;53567:74;:::o

Swarm Source

ipfs://151fcb4dd0a54ec178948cebb8313a1e99b96e5482dae622bd2c3d035475d03b

Block Transaction Gas Used Reward
view all blocks sequenced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.