ETH Price: $2,910.91 (+2.45%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040147283572022-05-07 7:03:50915 days ago1651907030IN
 Create: NestBatchPlatform2
0 ETH0.103198820

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NestBatchPlatform2

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 256 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-07
*/

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

// File contracts/libs/TransferHelper.sol

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

pragma solidity ^0.8.6;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value,gas:5000}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}


// File contracts/interfaces/INestBatchPriceView.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;

/// @dev This contract implemented the mining logic of nest
interface INestBatchPriceView {
    
    /// @dev Get the latest trigger price
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @return blockNumber The block number of price
    /// @return price The token price. (1eth equivalent to (price) token)
    function triggeredPrice(uint channelId, uint pairIndex) external view returns (uint blockNumber, uint price);

    /// @dev Get the full information of latest trigger price
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @return blockNumber The block number of price
    /// @return price The token price. (1eth equivalent to (price) token)
    /// @return avgPrice Average price
    /// @return sigmaSQ The square of the volatility (18 decimal places). The current implementation assumes that 
    ///         the volatility cannot exceed 1. Correspondingly, when the return value is equal to 999999999999996447,
    ///         it means that the volatility has exceeded the range that can be expressed
    function triggeredPriceInfo(uint channelId, uint pairIndex) external view returns (
        uint blockNumber,
        uint price,
        uint avgPrice,
        uint sigmaSQ
    );

    /// @dev Find the price at block number
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @param height Destination block number
    /// @return blockNumber The block number of price
    /// @return price The token price. (1eth equivalent to (price) token)
    function findPrice(
        uint channelId, 
        uint pairIndex,
        uint height
    ) external view returns (uint blockNumber, uint price);

    /// @dev Get the last (num) effective price
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @param count The number of prices that want to return
    /// @return An array which length is num * 2, each two element expresses one price like blockNumber|price
    function lastPriceList(uint channelId, uint pairIndex, uint count) external view returns (uint[] memory);

    /// @dev Returns lastPriceList and triggered price info
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @param count The number of prices that want to return
    /// @return prices An array which length is num * 2, each two element expresses one price like blockNumber|price
    /// @return triggeredPriceBlockNumber The block number of triggered price
    /// @return triggeredPriceValue The token triggered price. (1eth equivalent to (price) token)
    /// @return triggeredAvgPrice Average price
    /// @return triggeredSigmaSQ The square of the volatility (18 decimal places). The current implementation 
    /// assumes that the volatility cannot exceed 1. Correspondingly, when the return value is equal to 
    /// 999999999999996447, it means that the volatility has exceeded the range that can be expressed
    function lastPriceListAndTriggeredPriceInfo(uint channelId, uint pairIndex, uint count) external view 
    returns (
        uint[] memory prices,
        uint triggeredPriceBlockNumber,
        uint triggeredPriceValue,
        uint triggeredAvgPrice,
        uint triggeredSigmaSQ
    );
}


// File contracts/interfaces/INestBatchPrice2.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;

/// @dev This contract implemented the mining logic of nest
interface INestBatchPrice2 {

    /// @dev Get the latest trigger price
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param payback Address to receive refund
    /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price
    function triggeredPrice(
        uint channelId,
        uint[] calldata pairIndices, 
        address payback
    ) external payable returns (uint[] memory prices);

    /// @dev Get the full information of latest trigger price
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param payback Address to receive refund
    /// @return prices Price array, i * 4 is the block where the ith price is located, i * 4 + 1 is the ith price,
    /// i * 4 + 2 is the ith average price and i * 4 + 3 is the ith volatility
    function triggeredPriceInfo(
        uint channelId, 
        uint[] calldata pairIndices,
        address payback
    ) external payable returns (uint[] memory prices);

    /// @dev Find the price at block number
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param height Destination block number
    /// @param payback Address to receive refund
    /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price
    function findPrice(
        uint channelId,
        uint[] calldata pairIndices, 
        uint height, 
        address payback
    ) external payable returns (uint[] memory prices);

    /// @dev Get the last (num) effective price
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param count The number of prices that want to return
    /// @param payback Address to receive refund
    /// @return prices Result array, i * count * 2 to (i + 1) * count * 2 - 1 are 
    /// the price results of group i quotation pairs
    function lastPriceList(
        uint channelId, 
        uint[] calldata pairIndices, 
        uint count, 
        address payback
    ) external payable returns (uint[] memory prices);

    /// @dev Returns lastPriceList and triggered price info
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param count The number of prices that want to return
    /// @param payback Address to receive refund
    /// @return prices result of group i quotation pair. Among them, the first two count * are the latest prices, 
    /// and the last four are: trigger price block number, trigger price, average price and volatility
    function lastPriceListAndTriggeredPriceInfo(
        uint channelId, 
        uint[] calldata pairIndices,
        uint count, 
        address payback
    ) external payable returns (uint[] memory prices);
}


// File contracts/libs/IERC20.sol

// MIT

pragma solidity ^0.8.6;

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

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

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

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

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

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

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

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


// File contracts/interfaces/INestBatchMining.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;

/// @dev This interface defines the mining methods for nest
interface INestBatchMining {
    
    /// @dev PriceChannel open event
    /// @param channelId Target channelId
    /// @param token0 Address of token0, use to mensuration, 0 means eth
    /// @param unit Unit of token0
    /// @param reward Reward token address
    event Open(uint channelId, address token0, uint unit, address reward);

    /// @dev Post event
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @param miner Address of miner
    /// @param index Index of the price sheet
    /// @param scale Scale of this post. (Which times of unit)
    event Post(uint channelId, uint pairIndex, address miner, uint index, uint scale, uint price);

    /* ========== Structures ========== */
    
    /// @dev Nest mining configuration structure
    struct Config {
        
        // -- Public configuration
        // The number of times the sheet assets have doubled. 4
        uint8 maxBiteNestedLevel;
        
        // Price effective block interval. 20
        uint16 priceEffectSpan;

        // The amount of nest to pledge for each post (Unit: 1000). 100
        uint16 pledgeNest;
    }

    /// @dev PriceSheetView structure
    struct PriceSheetView {
        
        // Index of the price sheet
        uint32 index;

        // Address of miner
        address miner;

        // The block number of this price sheet packaged
        uint32 height;

        // The remain number of this price sheet
        uint32 remainNum;

        // The eth number which miner will got
        uint32 ethNumBal;

        // The eth number which equivalent to token's value which miner will got
        uint32 tokenNumBal;

        // The pledged number of nest in this sheet. (Unit: 1000nest)
        uint24 nestNum1k;

        // The level of this sheet. 0 expresses initial price sheet, a value greater than 0 expresses bite price sheet
        uint8 level;

        // Post fee shares, if there are many sheets in one block, this value is used to divide up mining value
        uint8 shares;

        // The token price. (1eth equivalent to (price) token)
        uint152 price;
    }

    // Price channel configuration
    struct ChannelConfig {

        // Reward per block standard
        uint96 rewardPerBlock;

        // Post fee(0.0001eth, DIMI_ETHER). 1000
        uint16 postFeeUnit;

        // Single query fee (0.0001 ether, DIMI_ETHER). 100
        uint16 singleFee;

        // Reduction rate(10000 based). 8000
        uint16 reductionRate;
    }

    /// @dev PricePair view
    struct PairView {
        // Target token address
        address target;
        // Count of price sheets
        uint96 sheetCount;
    }

    /// @dev Price channel view
    struct PriceChannelView {
        
        uint channelId;

        // Address of token0, use to mensuration, 0 means eth
        address token0;
        // Unit of token0
        uint96 unit;

        // Reward token address
        address reward;
        // Reward per block standard
        uint96 rewardPerBlock;

        // Reward total
        uint128 vault;
        // The information of mining fee
        uint96 rewards;
        // Post fee(0.0001eth, DIMI_ETHER). 1000
        uint16 postFeeUnit;
        // Count of price pairs in this channel
        uint16 count;

        // Address of opener
        address opener;
        // Genesis block of this channel
        uint32 genesisBlock;
        // Single query fee (0.0001 ether, DIMI_ETHER). 100
        uint16 singleFee;
        // Reduction rate(10000 based). 8000
        uint16 reductionRate;
        
        // Price pair array
        PairView[] pairs;
    }

    /* ========== Configuration ========== */

    /// @dev Modify configuration
    /// @param config Configuration object
    function setConfig(Config calldata config) external;

    /// @dev Get configuration
    /// @return Configuration object
    function getConfig() external view returns (Config memory);

    /// @dev Open price channel
    /// @param token0 Address of token0, use to mensuration, 0 means eth
    /// @param unit Unit of token0
    /// @param reward Reward token address
    /// @param tokens Target tokens
    /// @param config Channel configuration
    function open(
        address token0, 
        uint96 unit, 
        address reward, 
        address[] calldata tokens,
        ChannelConfig calldata config
    ) external;

    /// @dev Modify channel configuration
    /// @param channelId Target channelId
    /// @param config Channel configuration
    function modify(uint channelId, ChannelConfig calldata config) external;

    /// @dev Increase vault to channel
    /// @param channelId Target channelId
    /// @param vault Total to increase
    function increase(uint channelId, uint128 vault) external payable;

    /// @dev Decrease vault from channel
    /// @param channelId Target channelId
    /// @param vault Total to decrease
    function decrease(uint channelId, uint128 vault) external;

    /// @dev Get channel information
    /// @param channelId Target channelId
    /// @return Information of channel
    function getChannelInfo(uint channelId) external view returns (PriceChannelView memory);

    /// @dev Post price
    /// @param channelId Target channelId
    /// @param scale Scale of this post. (Which times of unit)
    /// @param equivalents Price array, one to one with pairs
    function post(uint channelId, uint scale, uint[] calldata equivalents) external payable;

    /// @notice Call the function to buy TOKEN/NTOKEN from a posted price sheet
    /// @dev bite TOKEN(NTOKEN) by ETH,  (+ethNumBal, -tokenNumBal)
    /// @param channelId Target price channelId
    /// @param pairIndex Target pairIndex. When take token0, use pairIndex direct, or add 65536 conversely
    /// @param index The position of the sheet in priceSheetList[token]
    /// @param takeNum The amount of biting (in the unit of ETH), realAmount = takeNum * newTokenAmountPerEth
    /// @param newEquivalent The new price of token (1 ETH : some TOKEN), here some means newTokenAmountPerEth
    function take(uint channelId, uint pairIndex, uint index, uint takeNum, uint newEquivalent) external payable;

    /// @dev List sheets by page
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @param offset Skip previous (offset) records
    /// @param count Return (count) records
    /// @param order Order. 0 reverse order, non-0 positive order
    /// @return List of price sheets
    function list(
        uint channelId, 
        uint pairIndex, 
        uint offset, 
        uint count, 
        uint order
    ) external view returns (PriceSheetView[] memory);

    /// @notice Close a batch of price sheets passed VERIFICATION-PHASE
    /// @dev Empty sheets but in VERIFICATION-PHASE aren't allowed
    /// @param channelId Target channelId
    /// @param indices Two-dimensional array of sheet indices, first means pair indices, seconds means sheet indices
    function close(uint channelId, uint[][] calldata indices) external;

    /// @dev View the number of assets specified by the user
    /// @param tokenAddress Destination token address
    /// @param addr Destination address
    /// @return Number of assets
    function balanceOf(address tokenAddress, address addr) external view returns (uint);

    /// @dev Withdraw assets
    /// @param tokenAddress Destination token address
    /// @param value The value to withdraw
    function withdraw(address tokenAddress, uint value) external;

    /// @dev Estimated mining amount
    /// @param channelId Target channelId
    /// @return Estimated mining amount
    function estimate(uint channelId) external view returns (uint);

    /// @dev Query the quantity of the target quotation
    /// @param channelId Target channelId
    /// @param index The index of the sheet
    /// @return minedBlocks Mined block period from previous block
    /// @return totalShares Total shares of sheets in the block
    function getMinedBlocks(
        uint channelId,
        uint index
    ) external view returns (uint minedBlocks, uint totalShares);

    /// @dev The function returns eth rewards of specified ntoken
    /// @param channelId Target channelId
    function totalETHRewards(uint channelId) external view returns (uint);

    /// @dev Pay
    /// @param channelId Target channelId
    /// @param to Address to receive
    /// @param value Amount to receive
    function pay(uint channelId, address to, uint value) external;

    /// @dev Donate to dao
    /// @param channelId Target channelId
    /// @param value Amount to receive
    function donate(uint channelId, uint value) external;
}


// File contracts/interfaces/INestLedger.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;

/// @dev This interface defines the nest ledger methods
interface INestLedger {

    /// @dev Application Flag Changed event
    /// @param addr DAO application contract address
    /// @param flag Authorization flag, 1 means authorization, 0 means cancel authorization
    event ApplicationChanged(address addr, uint flag);
    
    /// @dev Set DAO application
    /// @param addr DAO application contract address
    /// @param flag Authorization flag, 1 means authorization, 0 means cancel authorization
    function setApplication(address addr, uint flag) external;

    /// @dev Check DAO application flag
    /// @param addr DAO application contract address
    /// @return Authorization flag, 1 means authorization, 0 means cancel authorization
    function checkApplication(address addr) external view returns (uint);

    /// @dev Add reward
    /// @param channelId Target channelId
    function addETHReward(uint channelId) external payable;

    /// @dev The function returns eth rewards of specified ntoken
    /// @param channelId Target channelId
    function totalETHRewards(uint channelId) external view returns (uint);

    /// @dev Pay
    /// @param channelId Target channelId
    /// @param tokenAddress Token address of receiving funds (0 means ETH)
    /// @param to Address to receive
    /// @param value Amount to receive
    function pay(uint channelId, address tokenAddress, address to, uint value) external;
}


// File contracts/interfaces/INToken.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;

/// @dev ntoken interface
interface INToken {
        
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /// @dev Mint 
    /// @param value The amount of NToken to add
    function increaseTotal(uint256 value) external;

    /// @notice The view of variables about minting 
    /// @dev The naming follows nest v3.0
    /// @return createBlock The block number where the contract was created
    /// @return recentlyUsedBlock The block number where the last minting went
    function checkBlockInfo() external view returns(uint256 createBlock, uint256 recentlyUsedBlock);

    /// @dev The ABI keeps unchanged with old NTokens, so as to support token-and-ntoken-mining
    /// @return The address of bidder
    function checkBidder() external view returns(address);
    
    /// @notice The view of totalSupply
    /// @return The total supply of ntoken
    function totalSupply() external view returns (uint256);

    /// @dev The view of balances
    /// @param owner The address of an account
    /// @return The balance of the account
    function balanceOf(address owner) external view returns (uint256);

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

    function transfer(address to, uint256 value) external returns (bool);

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

    function transferFrom(address from, address to, uint256 value) external returns (bool);
}


// File contracts/custom/ChainConfig.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;

/// @dev Base contract of nest
contract ChainConfig {

    // ******** Ethereum ******** //

    // Ethereum average block time interval, 14000 milliseconds
    uint constant ETHEREUM_BLOCK_TIMESPAN = 14000;

    // Nest ore drawing attenuation interval. 2400000 blocks, about one year
    uint constant NEST_REDUCTION_SPAN = 2400000;
    // The decay limit of nest ore drawing becomes stable after exceeding this interval. 
    // 24 million blocks, about 10 years
    uint constant NEST_REDUCTION_LIMIT = 24000000; //NEST_REDUCTION_SPAN * 10;
    // Attenuation gradient array, each attenuation step value occupies 16 bits. The attenuation value is an integer
    uint constant NEST_REDUCTION_STEPS = 0x280035004300530068008300A300CC010001400190;
        // 0
        // | (uint(400 / uint(1)) << (16 * 0))
        // | (uint(400 * 8 / uint(10)) << (16 * 1))
        // | (uint(400 * 8 * 8 / uint(10 * 10)) << (16 * 2))
        // | (uint(400 * 8 * 8 * 8 / uint(10 * 10 * 10)) << (16 * 3))
        // | (uint(400 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10)) << (16 * 4))
        // | (uint(400 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10)) << (16 * 5))
        // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10)) << (16 * 6))
        // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 7))
        // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 8))
        // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 9))
        // //| (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 10));
        // | (uint(40) << (16 * 10));

    // ******** BSC ******** //
    
    // // Ethereum average block time interval, 3000 milliseconds
    // uint constant ETHEREUM_BLOCK_TIMESPAN = 3000;

    // // Nest ore drawing attenuation interval. 2400000 blocks, about one year
    // uint constant NEST_REDUCTION_SPAN = 10000000;
    // // The decay limit of nest ore drawing becomes stable after exceeding this interval. 
    // // 24 million blocks, about 10 years
    // uint constant NEST_REDUCTION_LIMIT = 100000000; //NEST_REDUCTION_SPAN * 10;
    // // Attenuation gradient array, each attenuation step value occupies 16 bits. The attenuation value is an integer
    // uint constant NEST_REDUCTION_STEPS = 0x280035004300530068008300A300CC010001400190;
    //     // 0
    //     // | (uint(400 / uint(1)) << (16 * 0))
    //     // | (uint(400 * 8 / uint(10)) << (16 * 1))
    //     // | (uint(400 * 8 * 8 / uint(10 * 10)) << (16 * 2))
    //     // | (uint(400 * 8 * 8 * 8 / uint(10 * 10 * 10)) << (16 * 3))
    //     // | (uint(400 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10)) << (16 * 4))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10)) << (16 * 5))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10)) << (16 * 6))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 7))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 8))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 9))
    //     // //| (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 10));
    //     // | (uint(40) << (16 * 10));

    // ******** Ploygon ******** //

    // // Ethereum average block time interval, 2200 milliseconds
    // uint constant ETHEREUM_BLOCK_TIMESPAN = 2200;

    // // Nest ore drawing attenuation interval. 2400000 blocks, about one year
    // uint constant NEST_REDUCTION_SPAN = 15000000;
    // // The decay limit of nest ore drawing becomes stable after exceeding this interval. 
    // // 24 million blocks, about 10 years
    // uint constant NEST_REDUCTION_LIMIT = 150000000; //NEST_REDUCTION_SPAN * 10;
    // // Attenuation gradient array, each attenuation step value occupies 16 bits. The attenuation value is an integer
    // uint constant NEST_REDUCTION_STEPS = 0x280035004300530068008300A300CC010001400190;
    //     // 0
    //     // | (uint(400 / uint(1)) << (16 * 0))
    //     // | (uint(400 * 8 / uint(10)) << (16 * 1))
    //     // | (uint(400 * 8 * 8 / uint(10 * 10)) << (16 * 2))
    //     // | (uint(400 * 8 * 8 * 8 / uint(10 * 10 * 10)) << (16 * 3))
    //     // | (uint(400 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10)) << (16 * 4))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10)) << (16 * 5))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10)) << (16 * 6))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 7))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 8))
    //     // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 9))
    //     // //| (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 10));
        // | (uint(40) << (16 * 10));
}


// File contracts/interfaces/INestMapping.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;

/// @dev The interface defines methods for nest builtin contract address mapping
interface INestMapping {

    /// @dev Set the built-in contract address of the system
    /// @param nestTokenAddress Address of nest token contract
    /// @param nestNodeAddress Address of nest node contract
    /// @param nestLedgerAddress INestLedger implementation contract address
    /// @param nestMiningAddress INestMining implementation contract address for nest
    /// @param ntokenMiningAddress INestMining implementation contract address for ntoken
    /// @param nestPriceFacadeAddress INestPriceFacade implementation contract address
    /// @param nestVoteAddress INestVote implementation contract address
    /// @param nestQueryAddress INestQuery implementation contract address
    /// @param nnIncomeAddress NNIncome contract address
    /// @param nTokenControllerAddress INTokenController implementation contract address
    function setBuiltinAddress(
        address nestTokenAddress,
        address nestNodeAddress,
        address nestLedgerAddress,
        address nestMiningAddress,
        address ntokenMiningAddress,
        address nestPriceFacadeAddress,
        address nestVoteAddress,
        address nestQueryAddress,
        address nnIncomeAddress,
        address nTokenControllerAddress
    ) external;

    /// @dev Get the built-in contract address of the system
    /// @return nestTokenAddress Address of nest token contract
    /// @return nestNodeAddress Address of nest node contract
    /// @return nestLedgerAddress INestLedger implementation contract address
    /// @return nestMiningAddress INestMining implementation contract address for nest
    /// @return ntokenMiningAddress INestMining implementation contract address for ntoken
    /// @return nestPriceFacadeAddress INestPriceFacade implementation contract address
    /// @return nestVoteAddress INestVote implementation contract address
    /// @return nestQueryAddress INestQuery implementation contract address
    /// @return nnIncomeAddress NNIncome contract address
    /// @return nTokenControllerAddress INTokenController implementation contract address
    function getBuiltinAddress() external view returns (
        address nestTokenAddress,
        address nestNodeAddress,
        address nestLedgerAddress,
        address nestMiningAddress,
        address ntokenMiningAddress,
        address nestPriceFacadeAddress,
        address nestVoteAddress,
        address nestQueryAddress,
        address nnIncomeAddress,
        address nTokenControllerAddress
    );

    /// @dev Get address of nest token contract
    /// @return Address of nest token contract
    function getNestTokenAddress() external view returns (address);

    /// @dev Get address of nest node contract
    /// @return Address of nest node contract
    function getNestNodeAddress() external view returns (address);

    /// @dev Get INestLedger implementation contract address
    /// @return INestLedger implementation contract address
    function getNestLedgerAddress() external view returns (address);

    /// @dev Get INestMining implementation contract address for nest
    /// @return INestMining implementation contract address for nest
    function getNestMiningAddress() external view returns (address);

    /// @dev Get INestMining implementation contract address for ntoken
    /// @return INestMining implementation contract address for ntoken
    function getNTokenMiningAddress() external view returns (address);

    /// @dev Get INestPriceFacade implementation contract address
    /// @return INestPriceFacade implementation contract address
    function getNestPriceFacadeAddress() external view returns (address);

    /// @dev Get INestVote implementation contract address
    /// @return INestVote implementation contract address
    function getNestVoteAddress() external view returns (address);

    /// @dev Get INestQuery implementation contract address
    /// @return INestQuery implementation contract address
    function getNestQueryAddress() external view returns (address);

    /// @dev Get NNIncome contract address
    /// @return NNIncome contract address
    function getNnIncomeAddress() external view returns (address);

    /// @dev Get INTokenController implementation contract address
    /// @return INTokenController implementation contract address
    function getNTokenControllerAddress() external view returns (address);

    /// @dev Registered address. The address registered here is the address accepted by nest system
    /// @param key The key
    /// @param addr Destination address. 0 means to delete the registration information
    function registerAddress(string memory key, address addr) external;

    /// @dev Get registered address
    /// @param key The key
    /// @return Destination address. 0 means empty
    function checkAddress(string memory key) external view returns (address);
}


// File contracts/interfaces/INestGovernance.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;
/// @dev This interface defines the governance methods
interface INestGovernance is INestMapping {

    /// @dev Set governance authority
    /// @param addr Destination address
    /// @param flag Weight. 0 means to delete the governance permission of the target address. Weight is not 
    ///        implemented in the current system, only the difference between authorized and unauthorized. 
    ///        Here, a uint96 is used to represent the weight, which is only reserved for expansion
    function setGovernance(address addr, uint flag) external;

    /// @dev Get governance rights
    /// @param addr Destination address
    /// @return Weight. 0 means to delete the governance permission of the target address. Weight is not 
    ///        implemented in the current system, only the difference between authorized and unauthorized. 
    ///        Here, a uint96 is used to represent the weight, which is only reserved for expansion
    function getGovernance(address addr) external view returns (uint);

    /// @dev Check whether the target address has governance rights for the given target
    /// @param addr Destination address
    /// @param flag Permission weight. The permission of the target address must be greater than this weight 
    /// to pass the check
    /// @return True indicates permission
    function checkGovernance(address addr, uint flag) external view returns (bool);
}


// File contracts/NestBase.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;
/// @dev Base contract of nest
contract NestBase {

    /// @dev INestGovernance implementation contract address
    address public _governance;

    /// @dev To support open-zeppelin/upgrades
    /// @param governance INestGovernance implementation contract address
    function initialize(address governance) public virtual {
        require(_governance == address(0), "NEST:!initialize");
        _governance = governance;
    }

    /// @dev Rewritten in the implementation contract, for load other contract addresses. Call 
    ///      super.update(newGovernance) when overriding, and override method without onlyGovernance
    /// @param newGovernance INestGovernance implementation contract address
    function update(address newGovernance) public virtual {

        address governance = _governance;
        require(governance == msg.sender || INestGovernance(governance).checkGovernance(msg.sender, 0), "NEST:!gov");
        _governance = newGovernance;
    }

    //---------modifier------------

    modifier onlyGovernance() {
        require(INestGovernance(_governance).checkGovernance(msg.sender, 0), "NEST:!gov");
        _;
    }

    modifier noContract() {
        require(msg.sender == tx.origin, "NEST:!contract");
        _;
    }
}


// File contracts/custom/NestFrequentlyUsed.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;
/// @dev Base contract of nest
contract NestFrequentlyUsed is NestBase {

    // Address of nest token contract
    address constant NEST_TOKEN_ADDRESS = 0x04abEdA201850aC0124161F037Efd70c74ddC74C;

    // Genesis block number of nest
    // NEST token contract is created at block height 6913517. However, because the mining algorithm of nest1.0
    // is different from that at present, a new mining algorithm is adopted from nest2.0. The new algorithm
    // includes the attenuation logic according to the block. Therefore, it is necessary to trace the block
    // where the nest begins to decay. According to the circulation when nest2.0 is online, the new mining
    // algorithm is used to deduce and convert the nest, and the new algorithm is used to mine the nest2.0
    // on-line flow, the actual block is 5120000
    //uint constant NEST_GENESIS_BLOCK = 0;

    // /// @dev Rewritten in the implementation contract, for load other contract addresses. Call 
    // ///      super.update(newGovernance) when overriding, and override method without onlyGovernance
    // /// @param newGovernance IHedgeGovernance implementation contract address
    // function update(address newGovernance) public virtual override {
    //     super.update(newGovernance);
    //     NEST_TOKEN_ADDRESS = INestGovernance(newGovernance).getNestTokenAddress();
    // }
}


// File contracts/NestBatchMining.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;
/// @dev This contract implemented the mining logic of nest
contract NestBatchMining is ChainConfig, NestFrequentlyUsed, INestBatchMining {

    /// @dev To support open-zeppelin/upgrades
    /// @param governance INestGovernance implementation contract address
    function initialize(address governance) public override {
        super.initialize(governance);
        // Placeholder in _accounts, the index of a real account must greater than 0
        _accounts.push();
    }

    /// @dev Definitions for the price sheet, include the full information. 
    /// (use 256-bits, a storage unit in ethereum evm)
    struct PriceSheet {
        
        // Index of miner account in _accounts. for this way, mapping an address(which need 160-bits) to a 32-bits 
        // integer, support 4 billion accounts
        uint32 miner;

        // The block number of this price sheet packaged
        uint32 height;

        // The remain number of this price sheet
        uint32 remainNum;

        // The eth number which miner will got
        uint32 ethNumBal;

        // The eth number which equivalent to token's value which miner will got
        uint32 tokenNumBal;

        // The pledged number of nest in this sheet. (Unit: 1000nest)
        uint24 nestNum1k;

        // The level of this sheet. 0 expresses initial price sheet, a value greater than 0 expresses bite price sheet
        uint8 level;

        // Post fee shares, if there are many sheets in one block, this value is used to divide up mining value
        uint8 shares;

        // Represent price as this way, may lose precision, the error less than 1/10^14
        // price = priceFraction * 16 ^ priceExponent
        uint56 priceFloat;
    }

    /// @dev Definitions for the price information
    struct PriceInfo {

        // Record the index of price sheet, for update price information from price sheet next time.
        uint32 index;

        // The block number of this price
        uint32 height;

        // The remain number of this price sheet
        uint32 remainNum;

        // Price, represent as float
        // Represent price as this way, may lose precision, the error less than 1/10^14
        uint56 priceFloat;

        // Avg Price, represent as float
        // Represent price as this way, may lose precision, the error less than 1/10^14
        uint56 avgFloat;

        // Square of price volatility, need divide by 2^48
        uint48 sigmaSQ;
    }

    // Price pair structure
    struct PricePair {
        address target;
        PriceInfo price;
        PriceSheet[] sheets;    
    }

    /// @dev Price channel
    struct PriceChannel {

        // Address of token0, use to mensuration, 0 means eth
        address token0;
        // Unit of token0
        uint96 unit;

        // Reward token address
        address reward;        
        // Reward per block standard
        uint96 rewardPerBlock;

        // Reward total
        uint128 vault;        
        // The information of mining fee
        uint96 rewards;
        // Post fee(0.0001eth, DIMI_ETHER). 1000
        uint16 postFeeUnit;
        // Count of price pairs in this channel
        uint16 count;

        // Address of opener
        address opener;
        // Genesis block of this channel
        uint32 genesisBlock;
        // Single query fee (0.0001 ether, DIMI_ETHER). 100
        uint16 singleFee;
        // Reduction rate(10000 based). 8000
        uint16 reductionRate;
        
        // Price pair array
        PricePair[0xFFFF] pairs;
    }

    /// @dev Structure is used to represent a storage location. Storage variable can be used to avoid indexing 
    /// from mapping many times
    struct UINT {
        uint value;
    }

    /// @dev Account information
    struct Account {
        
        // Address of account
        address addr;

        // Balances of mining account
        // tokenAddress=>balance
        mapping(address=>UINT) balances;
    }

    // Configuration
    Config _config;

    // Registered account information
    Account[] _accounts;

    // Mapping from address to index of account. address=>accountIndex
    mapping(address=>uint) _accountMapping;

    // Price channels
    PriceChannel[] _channels;

    // Unit of post fee. 0.0001 ether
    uint constant DIMI_ETHER = 0.0001 ether;

    /* ========== Governance ========== */

    /// @dev Modify configuration
    /// @param config Configuration object
    function setConfig(Config calldata config) external override onlyGovernance {
        _config = config;
    }

    /// @dev Get configuration
    /// @return Configuration object
    function getConfig() external view override returns (Config memory) {
        return _config;
    }

    /// @dev Open price channel
    /// @param token0 Address of token0, use to mensuration, 0 means eth
    /// @param unit Unit of token0
    /// @param reward Reward token address
    /// @param tokens Target tokens
    /// @param config Channel configuration
    function open(
        address token0, 
        uint96 unit, 
        address reward, 
        address[] calldata tokens,
        ChannelConfig calldata config
    ) external override {

        // Emit open event
        emit Open(_channels.length, token0, unit, reward);
        
        PriceChannel storage channel = _channels.push();

        // Address of token0
        channel.token0 = token0;
        // Unit of token0
        channel.unit = unit;

        // Address of reward
        channel.reward = reward;

        channel.vault = uint128(0);
        channel.rewards = uint96(0);
        channel.count = uint16(tokens.length);
        
        // Address of opener
        channel.opener = msg.sender;
        // Genesis block of this channel
        channel.genesisBlock = uint32(block.number);

        // Create price pairs
        for (uint i = 0; i < tokens.length; ++i) {
            require(token0 != tokens[i], "NOM:token can't equal token0");
            for (uint j = 0; j < i; ++j) {
                require(tokens[i] != tokens[j], "NOM:token reiterated");
            }
            channel.pairs[i].target = tokens[i];
        }

        _modify(channel, config);
    }

    /// @dev Modify channel configuration
    /// @param channelId Target channelId
    /// @param config Channel configuration
    function modify(uint channelId, ChannelConfig calldata config) external override {
        PriceChannel storage channel = _channels[channelId];
        require(channel.opener == msg.sender, "NOM:not opener");
        _modify(channel, config);
    }

    /// @dev Modify channel configuration
    /// @param channel Target channel
    /// @param config Channel configuration
    function _modify(PriceChannel storage channel, ChannelConfig calldata config) private {
        // Reward per block standard
        channel.rewardPerBlock = config.rewardPerBlock;

        // Post fee(0.0001eth, DIMI_ETHER). 1000
        channel.postFeeUnit = config.postFeeUnit;

        // Single query fee (0.0001 ether, DIMI_ETHER). 100
        channel.singleFee = config.singleFee;
        // Reduction rate(10000 based). 8000
        channel.reductionRate = config.reductionRate;
    }

    /// @dev Add price token, make a pair with token0. (Not support remove, be careful!)
    /// @param channelId Target channelId
    /// @param target Target token address
    function addPair(uint channelId, address target) external {
        PriceChannel storage channel = _channels[channelId];
        require(channel.opener == msg.sender, "NOM:not opener");
        require(channel.token0 != target, "NOM:token can't equal token0");
        uint count = uint(channel.count);
        for (uint j = 0; j < count; ++j) {
            require(channel.pairs[j].target != target, "NOM:token reiterated");
        }
        channel.pairs[count].target = target;
        ++channel.count;
    }

    /// @dev Increase vault to channel
    /// @param channelId Target channelId
    /// @param vault Total to increase
    function increase(uint channelId, uint128 vault) external payable override {
        PriceChannel storage channel = _channels[channelId];
        address reward = channel.reward;
        if (reward == address(0)) {
            require(msg.value == uint(vault), "NOM:vault error");
        } else {
            TransferHelper.safeTransferFrom(reward, msg.sender, address(this), uint(vault));
        }
        channel.vault += vault;
    }

    /// @dev Decrease vault from channel
    /// @param channelId Target channelId
    /// @param vault Total to decrease
    function decrease(uint channelId, uint128 vault) external override {
        PriceChannel storage channel = _channels[channelId];
        require(channel.opener == msg.sender, "NOM:not opener");
        address reward = channel.reward;
        channel.vault -= vault;
        if (reward == address(0)) {
            payable(msg.sender).transfer(uint(vault));
        } else {
            TransferHelper.safeTransfer(reward, msg.sender, uint(vault));
        }
    }

    /// @dev Change opener
    /// @param channelId Target channelId
    /// @param newOpener New opener address
    function changeOpener(uint channelId, address newOpener) external {
        PriceChannel storage channel = _channels[channelId];
        require(channel.opener == msg.sender, "NOM:not opener");
        channel.opener = newOpener;
    }

    /// @dev Get channel information
    /// @param channelId Target channelId
    /// @return Information of channel
    function getChannelInfo(uint channelId) external view override returns (PriceChannelView memory) {
        PriceChannel storage channel = _channels[channelId];

        uint count = uint(channel.count);
        PairView[] memory pairs = new PairView[](count);
        for (uint i = 0; i < count; ++i) {
            PricePair storage pair = channel.pairs[i];
            pairs[i] = PairView(pair.target, uint96(pair.sheets.length));
        }

        return PriceChannelView (
            channelId,

            // Address of token0, use to mensuration, 0 means eth
            channel.token0,
            // Unit of token0
            channel.unit,

            // Reward token address
            channel.reward,
            // Reward per block standard
            channel.rewardPerBlock,

            // Reward total
            channel.vault,
            // The information of mining fee
            channel.rewards,
            // Post fee(0.0001eth, DIMI_ETHER). 1000
            channel.postFeeUnit,
            // Count of price pairs in this channel
            channel.count,

            // Address of opener
            channel.opener,
            // Genesis block of this channel
            channel.genesisBlock,
            // Single query fee (0.0001 ether, DIMI_ETHER). 100
            channel.singleFee,
            // Reduction rate(10000 based). 8000
            channel.reductionRate,

            pairs
        );
    }

    /* ========== Mining ========== */

    /// @dev Post price
    /// @param channelId Target channelId
    /// @param scale Scale of this post. (Which times of unit)
    /// @param equivalents Price array, one to one with pairs
    function post(uint channelId, uint scale, uint[] calldata equivalents) external payable override {

        // 0. Load config
        Config memory config = _config;

        // 1. Check arguments
        require(scale == 1, "NOM:!scale");

        // 2. Load price channel
        PriceChannel storage channel = _channels[channelId];

        // 3. Freeze assets
        uint accountIndex = _addressIndex(msg.sender);

        // Freeze token and nest
        // Because of the use of floating-point representation(fraction * 16 ^ exponent), it may bring some precision 
        // loss After assets are frozen according to tokenAmountPerEth * ethNum, the part with poor accuracy may be 
        // lost when the assets are returned, It should be frozen according to decodeFloat(fraction, exponent) * ethNum
        // However, considering that the loss is less than 1 / 10 ^ 14, the loss here is ignored, and the part of
        // precision loss can be transferred out as system income in the future
        mapping(address=>UINT) storage balances = _accounts[accountIndex].balances;

        uint cn = uint(channel.count);
        uint fee = msg.value;

        // Freeze nest
        fee = _freeze(balances, NEST_TOKEN_ADDRESS, cn * uint(config.pledgeNest) * 1000 ether, fee);
    
        // Freeze token0
        fee = _freeze(balances, channel.token0, cn * uint(channel.unit) * scale, fee);

        // Freeze token1
        while (cn > 0) {
            PricePair storage pair = channel.pairs[--cn];
            uint equivalent = equivalents[cn];
            require(equivalent > 0, "NOM:!equivalent");
            fee = _freeze(balances, pair.target, scale * equivalent, fee);

            // Calculate the price
            // According to the current mechanism, the newly added sheet cannot take effect, so the calculated price
            // is placed before the sheet is added, which can reduce unnecessary traversal
            _stat(config, pair);
            
            // 6. Create token price sheet
            emit Post(channelId, cn, msg.sender, pair.sheets.length, scale, equivalent);
            // Only pairIndex 0 has reward
            _create(pair.sheets, accountIndex, uint32(scale), uint(config.pledgeNest), cn == 0 ? 1 : 0, equivalent);
        }

        // // 4. Deposit fee
        // // Only postFeeUnit > 0 need fee
        // uint postFeeUnit = uint(channel.postFeeUnit);
        // if (postFeeUnit > 0) {
        //     require(fee >= postFeeUnit * DIMI_ETHER + tx.gasprice * 400000, "NM:!fee");
        // }
        // if (fee > 0) {
        //     channel.rewards += _toUInt96(fee);
        // }
    }

    /// @notice Call the function to buy TOKEN/NTOKEN from a posted price sheet
    /// @dev bite TOKEN(NTOKEN) by ETH,  (+ethNumBal, -tokenNumBal)
    /// @param channelId Target price channelId
    /// @param pairIndex Target pairIndex. When take token0, use pairIndex direct, or add 65536 conversely
    /// @param index The position of the sheet in priceSheetList[token]
    /// @param takeNum The amount of biting (in the unit of ETH), realAmount = takeNum * newTokenAmountPerEth
    /// @param newEquivalent The new price of token (1 ETH : some TOKEN), here some means newTokenAmountPerEth
    function take(
        uint channelId, 
        uint pairIndex, 
        uint index, 
        uint takeNum, 
        uint newEquivalent
    ) external payable override {

        Config memory config = _config;

        // 1. Check arguments
        require(takeNum > 0, "NM:!takeNum");
        require(newEquivalent > 0, "NM:!price");

        // 2. Load price sheet
        PriceChannel storage channel = _channels[channelId];
        PricePair storage pair = channel.pairs[pairIndex < 0x10000 ? pairIndex : pairIndex - 0x10000];
        PriceSheet memory sheet = pair.sheets[index];

        // 3. Check state
        require(uint(sheet.height) + uint(config.priceEffectSpan) >= block.number, "NM:!state");
        sheet.remainNum = uint32(uint(sheet.remainNum) - takeNum);

        uint accountIndex = _addressIndex(msg.sender);
        // Number of nest to be pledged
        // sheet.ethNumBal + sheet.tokenNumBal is always two times to sheet.ethNum
        uint needNest1k = (takeNum << 2) * uint(sheet.nestNum1k) / (uint(sheet.ethNumBal) + uint(sheet.tokenNumBal));

        // 4. Calculate the number of eth, token and nest needed, and freeze them
        uint needEthNum = takeNum;
        uint level = uint(sheet.level);
        if (level < 255) {
            if (level < uint(config.maxBiteNestedLevel)) {
                // Double scale sheet
                needEthNum <<= 1;
            }
            ++level;
        }

        {
            // Freeze nest and token
            // Freeze assets: token0, token1, nest
            mapping(address=>UINT) storage balances = _accounts[accountIndex].balances;
            uint fee = msg.value;

            // Target pairIndex. When take token0, use pairIndex direct, or add 65536 conversely
            // pairIndex < 0x10000 means take token0
            if (pairIndex < 0x10000) {
                // Update the bitten sheet
                sheet.ethNumBal = uint32(uint(sheet.ethNumBal) - takeNum);
                sheet.tokenNumBal = uint32(uint(sheet.tokenNumBal) + takeNum);
                pair.sheets[index] = sheet;

                // Freeze token0
                fee = _freeze(balances, channel.token0, (needEthNum - takeNum) * uint(channel.unit), fee);
                // Freeze token1
                fee = _freeze(
                    balances, 
                    pair.target, 
                    needEthNum * newEquivalent + _decodeFloat(sheet.priceFloat) * takeNum, 
                    fee
                );
            } 
            // pairIndex >= 0x10000 means take target token1
            else {
                pairIndex -= 0x10000;
                // Update the bitten sheet
                sheet.ethNumBal = uint32(uint(sheet.ethNumBal) + takeNum);
                sheet.tokenNumBal = uint32(uint(sheet.tokenNumBal) - takeNum);
                pair.sheets[index] = sheet;

                // Freeze token0
                fee = _freeze(balances, channel.token0, (needEthNum + takeNum) * uint(channel.unit), fee);
                // Freeze token1
                uint backTokenValue = _decodeFloat(sheet.priceFloat) * takeNum;
                if (needEthNum * newEquivalent > backTokenValue) {
                    fee = _freeze(balances, pair.target, needEthNum * newEquivalent - backTokenValue, fee);
                } else {
                    _unfreeze(balances, pair.target, backTokenValue - needEthNum * newEquivalent, msg.sender);
                }
            }
                
            // Freeze nest
            fee = _freeze(balances, NEST_TOKEN_ADDRESS, needNest1k * 1000 ether, fee);

            require(fee == 0, "NOM:!fee");
        }
            
        // 5. Calculate the price
        // According to the current mechanism, the newly added sheet cannot take effect, so the calculated price
        // is placed before the sheet is added, which can reduce unnecessary traversal
        _stat(config, pair);

        // 6. Create price sheet
        emit Post(channelId, pairIndex, msg.sender, pair.sheets.length, needEthNum, newEquivalent);
        _create(pair.sheets, accountIndex, uint32(needEthNum), needNest1k, level << 8, newEquivalent);
    }

    /// @dev List sheets by page
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @param offset Skip previous (offset) records
    /// @param count Return (count) records
    /// @param order Order. 0 reverse order, non-0 positive order
    /// @return List of price sheets
    function list(
        uint channelId,
        uint pairIndex,
        uint offset,
        uint count,
        uint order
    ) external view override noContract returns (PriceSheetView[] memory) {

        PriceSheet[] storage sheets = _channels[channelId].pairs[pairIndex].sheets;
        PriceSheetView[] memory result = new PriceSheetView[](count);
        uint length = sheets.length;
        uint i = 0;

        // Reverse order
        if (order == 0) {

            uint index = length - offset;
            uint end = index > count ? index - count : 0;
            while (index > end) {
                --index;
                result[i++] = _toPriceSheetView(sheets[index], index);
            }
        } 
        // Positive order
        else {

            uint index = offset;
            uint end = index + count;
            if (end > length) {
                end = length;
            }
            while (index < end) {
                result[i++] = _toPriceSheetView(sheets[index], index);
                ++index;
            }
        }
        return result;
    }

    /// @notice Close a batch of price sheets passed VERIFICATION-PHASE
    /// @dev Empty sheets but in VERIFICATION-PHASE aren't allowed
    /// @param channelId Target channelId
    /// @param indices Two-dimensional array of sheet indices, first means pair indices, seconds means sheet indices
    function close(uint channelId, uint[][] calldata indices) external override {
        
        Config memory config = _config;
        PriceChannel storage channel = _channels[channelId];
        
        uint accountIndex = 0;
        uint reward = 0;
        uint nestNum1k = 0;
        uint ethNum = 0;

        // storage variable must given a value at declaring, this is useless
        mapping(address=>UINT) storage balances = _accounts[0/*accountIndex*/].balances;
        uint[3] memory vars = [
            uint(channel.rewardPerBlock), 
            uint(channel.genesisBlock), 
            uint(channel.reductionRate)
        ];

        for (uint j = indices.length; j > 0;) {
            PricePair storage pair = channel.pairs[--j];

            ///////////////////////////////////////////////////////////////////////////////////////
            uint tokenValue = 0;

            // 1. Traverse sheets
            for (uint i = indices[j].length; i > 0;) {

                // ---------------------------------------------------------------------------------
                uint index = indices[j][--i];
                PriceSheet memory sheet = pair.sheets[index];
                
                // Batch closing quotation can only close sheet of the same user
                if (accountIndex == 0) {
                    // accountIndex == 0 means the first sheet, and the number of this sheet is taken
                    accountIndex = uint(sheet.miner);
                    balances = _accounts[accountIndex].balances;
                } else {
                    // accountIndex != 0 means that it is a follow-up sheet, and the miner number must be 
                    // consistent with the previous record
                    require(accountIndex == uint(sheet.miner), "NM:!miner");
                }

                // Check the status of the price sheet to see if it has reached the effective block interval 
                // or has been finished
                if (accountIndex > 0 && (uint(sheet.height) + uint(config.priceEffectSpan) < block.number)) {

                    // Only pairIndex 0 has reward
                    if (j == 0) {
                        uint shares = uint(sheet.shares);
                        // Mining logic
                        // The price sheet which shares is zero doesn't mining
                        if (shares > 0) {

                            // Currently, mined represents the number of blocks has mined
                            (uint mined, uint totalShares) = _calcMinedBlocks(pair.sheets, index, sheet);
                            
                            // When rewardPerBlock is very large, this calculated may be truncated, 
                            // resulting in a significant reduction in the actual reward,
                            // This situation is unreasonable and needs to be borne by the opener.
                            reward += (
                                mined
                                * shares
                                * _reduction(uint(sheet.height) - vars[1], vars[2])
                                * vars[0]
                                / totalShares / 400
                            );
                        }
                    }

                    nestNum1k += uint(sheet.nestNum1k);
                    ethNum += uint(sheet.ethNumBal);
                    tokenValue += _decodeFloat(sheet.priceFloat) * uint(sheet.tokenNumBal);

                    // Set sheet.miner to 0, express the sheet is closed
                    sheet.miner = uint32(0);
                    sheet.ethNumBal = uint32(0);
                    sheet.tokenNumBal = uint32(0);
                    pair.sheets[index] = sheet;
                }

                // ---------------------------------------------------------------------------------
            }

            _stat(config, pair);
            ///////////////////////////////////////////////////////////////////////////////////////

            // Unfreeze token1
            _unfreeze(balances, pair.target, tokenValue, accountIndex);
        }

        // Unfreeze token0
        _unfreeze(balances, channel.token0, ethNum * uint(channel.unit), accountIndex);
        
        // Unfreeze nest
        _unfreeze(balances, NEST_TOKEN_ADDRESS, nestNum1k * 1000 ether, accountIndex);

        uint vault = uint(channel.vault);
        if (reward > vault) {
            reward = vault;
        }
        // Record the vault for each channel to prevent the opener use the funds in this contract without increase
        channel.vault = uint96(vault - reward);
        
        // Record reward
        _unfreeze(balances, channel.reward, reward, accountIndex);
    }

    /// @dev View the number of assets specified by the user
    /// @param tokenAddress Destination token address
    /// @param addr Destination address
    /// @return Number of assets
    function balanceOf(address tokenAddress, address addr) external view override returns (uint) {
        return _accounts[_accountMapping[addr]].balances[tokenAddress].value;
    }

    /// @dev Withdraw assets
    /// @param tokenAddress Destination token address
    /// @param value The value to withdraw
    function withdraw(address tokenAddress, uint value) external override {

        // The user's locked nest and the mining pool's nest are stored together. When the nest is mined over,
        // the problem of taking the locked nest as the ore drawing will appear
        // As it will take a long time for nest to finish mining, this problem will not be considered for the time being
        UINT storage balance = _accounts[_accountMapping[msg.sender]].balances[tokenAddress];
        balance.value -= value;
        TransferHelper.safeTransfer(tokenAddress, msg.sender, value);
    }

    /// @dev Estimated mining amount
    /// @param channelId Target channelId
    /// @return Estimated mining amount
    function estimate(uint channelId) external view override returns (uint) {

        PriceChannel storage channel = _channels[channelId];
        PriceSheet[] storage sheets = channel.pairs[0].sheets;
        uint index = sheets.length;
        uint blocks = 10;
        while (index > 0) {

            PriceSheet memory sheet = sheets[--index];
            if (uint(sheet.shares) > 0) {
                blocks = block.number - uint(sheet.height);
                break;
            }
        }

        return 
            blocks
            * uint(channel.rewardPerBlock) 
            * _reduction(block.number - uint(channel.genesisBlock), uint(channel.reductionRate))
            / 400;
    }

    /// @dev Query the quantity of the target quotation
    /// @param channelId Target channelId
    /// @param index The index of the sheet
    /// @return minedBlocks Mined block period from previous block
    /// @return totalShares Total shares of sheets in the block
    function getMinedBlocks(
        uint channelId,
        uint index
    ) external view override returns (uint minedBlocks, uint totalShares) {
        PriceSheet[] storage sheets = _channels[channelId].pairs[0].sheets;
        return _calcMinedBlocks(sheets, index, sheets[index]);
    }

    /// @dev The function returns eth rewards of specified ntoken
    /// @param channelId Target channelId
    function totalETHRewards(uint channelId) external view override returns (uint) {
        return uint(_channels[channelId].rewards);
    }

    /// @dev Pay
    /// @param channelId Target channelId
    /// @param to Address to receive
    /// @param value Amount to receive
    function pay(uint channelId, address to, uint value) external override {

        PriceChannel storage channel = _channels[channelId];
        require(channel.opener == msg.sender, "NOM:!opener");
        channel.rewards -= _toUInt96(value);
        // pay
        payable(to).transfer(value);
    }

    /// @dev Donate to dao
    /// @param channelId Target channelId
    /// @param value Amount to receive
    function donate(uint channelId, uint value) external override {

        PriceChannel storage channel = _channels[channelId];
        require(channel.opener == msg.sender, "NOM:!opener");
        channel.rewards -= _toUInt96(value);
        INestLedger(INestMapping(_governance).getNestLedgerAddress()).addETHReward { value: value } (channelId);
    }

    /// @dev Gets the address corresponding to the given index number
    /// @param index The index number of the specified address
    /// @return The address corresponding to the given index number
    function indexAddress(uint index) public view returns (address) {
        return _accounts[index].addr;
    }

    /// @dev Gets the registration index number of the specified address
    /// @param addr Destination address
    /// @return 0 means nonexistent, non-0 means index number
    function getAccountIndex(address addr) external view returns (uint) {
        return _accountMapping[addr];
    }

    /// @dev Get the length of registered account array
    /// @return The length of registered account array
    function getAccountCount() external view returns (uint) {
        return _accounts.length;
    }

    // Convert PriceSheet to PriceSheetView
    function _toPriceSheetView(PriceSheet memory sheet, uint index) private view returns (PriceSheetView memory) {

        return PriceSheetView(
            // Index number
            uint32(index),
            // Miner address
            indexAddress(sheet.miner),
            // The block number of this price sheet packaged
            sheet.height,
            // The remain number of this price sheet
            sheet.remainNum,
            // The eth number which miner will got
            sheet.ethNumBal,
            // The eth number which equivalent to token's value which miner will got
            sheet.tokenNumBal,
            // The pledged number of nest in this sheet. (Unit: 1000nest)
            sheet.nestNum1k,
            // The level of this sheet. 0 expresses initial price sheet, a value greater than 0 expresses 
            // bite price sheet
            sheet.level,
            // Post fee shares
            sheet.shares,
            // Price
            uint152(_decodeFloat(sheet.priceFloat))
        );
    }

    // Create price sheet
    function _create(
        PriceSheet[] storage sheets,
        uint accountIndex,
        uint32 ethNum,
        uint nestNum1k,
        uint level_shares,
        uint equivalent
    ) private {

        sheets.push(PriceSheet(
            uint32(accountIndex),                       // uint32 miner;
            uint32(block.number),                       // uint32 height;
            ethNum,                                     // uint32 remainNum;
            ethNum,                                     // uint32 ethNumBal;
            ethNum,                                     // uint32 tokenNumBal;
            uint24(nestNum1k),                          // uint32 nestNum1k;
            uint8(level_shares >> 8),                   // uint8 level;
            uint8(level_shares & 0xFF),
            _encodeFloat(equivalent)
        ));
    }

    // Calculate price, average price and volatility
    function _stat(Config memory config, PricePair storage pair) private {
        
        PriceSheet[] storage sheets = pair.sheets;
        // Load token price information
        PriceInfo memory p0 = pair.price;

        // Length of sheets
        uint length = sheets.length;
        // The index of the sheet to be processed in the sheet array
        uint index = uint(p0.index);
        // The latest block number for which the price has been calculated
        uint prev = uint(p0.height);
        // It's not necessary to load the price information in p0
        // Eth count variable used to calculate price
        uint totalEthNum = 0; 
        // Token count variable for price calculation
        uint totalTokenValue = 0; 
        // Block number of current sheet
        uint height = 0;

        // Traverse the sheets to find the effective price
        //uint effectBlock = block.number - uint(config.priceEffectSpan);
        PriceSheet memory sheet;
        for (; ; ++index) {

            // Gas attack analysis, each post transaction, calculated according to post, needs to write
            // at least one sheet and freeze two kinds of assets, which needs to consume at least 30000 gas,
            // In addition to the basic cost of the transaction, at least 50000 gas is required.
            // In addition, there are other reading and calculation operations. The gas consumed by each
            // transaction is impossible less than 70000 gas, The attacker can accumulate up to 20 blocks
            // of sheets to be generated. To ensure that the calculation can be completed in one block,
            // it is necessary to ensure that the consumption of each price does not exceed 70000 / 20 = 3500 gas,
            // According to the current logic, each calculation of a price needs to read a storage unit (800)
            // and calculate the consumption, which can not reach the dangerous value of 3500, so the gas attack
            // is not considered

            // Traverse the sheets that has reached the effective interval from the current position
            bool flag = index >= length
                || (height = uint((sheet = sheets[index]).height)) + uint(config.priceEffectSpan) >= block.number;

            // Not the same block (or flag is false), calculate the price and update it
            if (flag || prev != height) {

                // totalEthNum > 0 Can calculate the price
                if (totalEthNum > 0) {

                    // Calculate average price and Volatility
                    // Calculation method of volatility of follow-up price
                    uint tmp = _decodeFloat(p0.priceFloat);
                    // New price
                    uint price = totalTokenValue / totalEthNum;
                    // Update price
                    p0.remainNum = uint32(totalEthNum);
                    p0.priceFloat = _encodeFloat(price);
                    // Clear cumulative values
                    totalEthNum = 0;
                    totalTokenValue = 0;

                    if (tmp > 0) {
                        // Calculate average price
                        // avgPrice[i + 1] = avgPrice[i] * 90% + price[i] * 10%
                        p0.avgFloat = _encodeFloat((_decodeFloat(p0.avgFloat) * 9 + price) / 10);

                        // When the accuracy of the token is very high or the value of the token relative to
                        // eth is very low, the price may be very large, and there may be overflow problem,
                        // it is not considered for the moment
                        tmp = (price << 48) / tmp;
                        if (tmp > 0x1000000000000) {
                            tmp = tmp - 0x1000000000000;
                        } else {
                            tmp = 0x1000000000000 - tmp;
                        }

                        // earn = price[i] / price[i - 1] - 1;
                        // seconds = time[i] - time[i - 1];
                        // sigmaSQ[i + 1] = sigmaSQ[i] * 90% + (earn ^ 2 / seconds) * 10%
                        tmp = (
                            uint(p0.sigmaSQ) * 9 + 
                            // It is inevitable that prev greater than p0.height
                            ((tmp * tmp * 1000 / ETHEREUM_BLOCK_TIMESPAN / (prev - uint(p0.height))) >> 48)
                        ) / 10;

                        // The current implementation assumes that the volatility cannot exceed 1, and
                        // corresponding to this, when the calculated value exceeds 1, expressed as 0xFFFFFFFFFFFF
                        if (tmp > 0xFFFFFFFFFFFF) {
                            tmp = 0xFFFFFFFFFFFF;
                        }
                        p0.sigmaSQ = uint48(tmp);
                    }
                    // The calculation methods of average price and volatility are different for first price
                    else {
                        // The average price is equal to the price
                        //p0.avgTokenAmount = uint64(price);
                        p0.avgFloat = p0.priceFloat;

                        // The volatility is 0
                        p0.sigmaSQ = uint48(0);
                    }

                    // Update price block number
                    p0.height = uint32(prev);
                }

                // Move to new block number
                prev = height;
            }

            if (flag) {
                break;
            }

            // Cumulative price information
            totalEthNum += uint(sheet.remainNum);
            totalTokenValue += _decodeFloat(sheet.priceFloat) * uint(sheet.remainNum);
        }

        // Update price information
        if (index > uint(p0.index)) {
            p0.index = uint32(index);
            pair.price = p0;
        }
    }

    // Calculation number of blocks which mined
    function _calcMinedBlocks(
        PriceSheet[] storage sheets,
        uint index,
        PriceSheet memory sheet
    ) private view returns (uint minedBlocks, uint totalShares) {

        uint length = sheets.length;
        uint height = uint(sheet.height);
        totalShares = uint(sheet.shares);

        // Backward looking for sheets in the same block
        for (uint i = index; ++i < length && uint(sheets[i].height) == height;) {
            
            // Multiple sheets in the same block is a small probability event at present, so it can be ignored
            // to read more than once, if there are always multiple sheets in the same block, it means that the
            // sheets are very intensive, and the gas consumed here does not have a great impact
            totalShares += uint(sheets[i].shares);
        }

        // Find sheets in the same block forward
        uint prev = height;
        while (index > 0 && uint(prev = sheets[--index].height) == height) {

            // Multiple sheets in the same block is a small probability event at present, so it can be ignored 
            // to read more than once, if there are always multiple sheets in the same block, it means that the
            // sheets are very intensive, and the gas consumed here does not have a great impact
            totalShares += uint(sheets[index].shares);
        }

        if (index > 0 || height > prev) {
            minedBlocks = height - prev;
        } else {
            minedBlocks = 10;
        }
    }

    /// @dev freeze token
    /// @param balances Balances ledger
    /// @param tokenAddress Destination token address
    /// @param tokenValue token amount
    /// @param value The remain value
    function _freeze(
        mapping(address=>UINT) storage balances, 
        address tokenAddress, 
        uint tokenValue,
        uint value
    ) private returns (uint) {
        if (tokenAddress == address(0)) {
            return value - tokenValue;
        } else {
            // Unfreeze nest
            UINT storage balance = balances[tokenAddress];
            uint balanceValue = balance.value;
            if (balanceValue < tokenValue) {
                balance.value = 0;
                TransferHelper.safeTransferFrom(tokenAddress, msg.sender, address(this), tokenValue - balanceValue);
            } else {
                balance.value = balanceValue - tokenValue;
            }
            return value;
        }
    }

    function _unfreeze(
        mapping(address=>UINT) storage balances, 
        address tokenAddress, 
        uint tokenValue,
        uint accountIndex
    ) private {
        if (tokenValue > 0) {
            if (tokenAddress == address(0)) {
                payable(indexAddress(accountIndex)).transfer(tokenValue);
            } else {
                balances[tokenAddress].value += tokenValue;
            }
        }
    }

    function _unfreeze(
        mapping(address=>UINT) storage balances, 
        address tokenAddress, 
        uint tokenValue,
        address owner
    ) private {
        if (tokenValue > 0) {
            if (tokenAddress == address(0)) {
                payable(owner).transfer(tokenValue);
            } else {
                balances[tokenAddress].value += tokenValue;
            }
        }
    }

    /// @dev Gets the index number of the specified address. If it does not exist, register
    /// @param addr Destination address
    /// @return The index number of the specified address
    function _addressIndex(address addr) private returns (uint) {

        uint index = _accountMapping[addr];
        if (index == 0) {
            // If it exceeds the maximum number that 32 bits can store, you can't continue to register a new account.
            // If you need to support a new account, you need to update the contract
            require((_accountMapping[addr] = index = _accounts.length) < 0x100000000, "NM:!accounts");
            _accounts.push().addr = addr;
        }

        return index;
    }

    function _reduction(uint delta, uint reductionRate) private pure returns (uint) {
        if (delta < NEST_REDUCTION_LIMIT) {
            uint n = delta / NEST_REDUCTION_SPAN;
            return 400 * reductionRate ** n / 10000 ** n;
        }
        return 400 * reductionRate ** 10 / 10000 ** 10;
    }

    /* ========== Tools and methods ========== */

    /// @dev Encode the uint value as a floating-point representation in the form of fraction * 16 ^ exponent
    /// @param value Destination uint value
    /// @return float format
    function _encodeFloat(uint value) private pure returns (uint56) {

        uint exponent = 0; 
        while (value > 0x3FFFFFFFFFFFF) {
            value >>= 4;
            ++exponent;
        }
        return uint56((value << 6) | exponent);
    }

    /// @dev Decode the floating-point representation of fraction * 16 ^ exponent to uint
    /// @param floatValue fraction value
    /// @return decode format
    function _decodeFloat(uint56 floatValue) private pure returns (uint) {
        return (uint(floatValue) >> 6) << ((uint(floatValue) & 0x3F) << 2);
    }

    // Convert uint to uint96
    function _toUInt96(uint value) internal pure returns (uint96) {
        require(value < 0x1000000000000000000000000);
        return uint96(value);
    }

    /* ========== Price Query ========== */
    
    /// @dev Get the latest trigger price
    /// @param pair Target price pair
    /// @return blockNumber The block number of price
    /// @return price The token price. (1eth equivalent to (price) token)
    function _triggeredPrice(PricePair storage pair) internal view returns (uint blockNumber, uint price) {

        PriceInfo memory priceInfo = pair.price;

        if (uint(priceInfo.remainNum) > 0) {
            return (uint(priceInfo.height) + uint(_config.priceEffectSpan), _decodeFloat(priceInfo.priceFloat));
        }
        
        return (0, 0);
    }

    /// @dev Get the full information of latest trigger price
    /// @param pair Target price pair
    /// @return blockNumber The block number of price
    /// @return price The token price. (1eth equivalent to (price) token)
    /// @return avgPrice Average price
    /// @return sigmaSQ The square of the volatility (18 decimal places). The current implementation assumes that 
    ///         the volatility cannot exceed 1. Correspondingly, when the return value is equal to 999999999999996447,
    ///         it means that the volatility has exceeded the range that can be expressed
    function _triggeredPriceInfo(PricePair storage pair) internal view returns (
        uint blockNumber,
        uint price,
        uint avgPrice,
        uint sigmaSQ
    ) {

        PriceInfo memory priceInfo = pair.price;

        if (uint(priceInfo.remainNum) > 0) {
            return (
                uint(priceInfo.height) + uint(_config.priceEffectSpan),
                _decodeFloat(priceInfo.priceFloat),
                _decodeFloat(priceInfo.avgFloat),
                (uint(priceInfo.sigmaSQ) * 1 ether) >> 48
            );
        }

        return (0, 0, 0, 0);
    }

    /// @dev Find the price at block number
    /// @param pair Target price pair
    /// @param height Destination block number
    /// @return blockNumber The block number of price
    /// @return price The token price. (1eth equivalent to (price) token)
    function _findPrice(
        PricePair storage pair,
        uint height
    ) internal view returns (uint blockNumber, uint price) {

        PriceSheet[] storage sheets = pair.sheets;
        uint priceEffectSpan = uint(_config.priceEffectSpan);

        uint length = sheets.length;
        uint index = 0;
        uint sheetHeight;
        height -= priceEffectSpan;
        {
            // If there is no sheet in this channel, length is 0, length - 1 will overflow,
            uint right = length - 1;
            uint left = 0;
            // Find the index use Binary Search
            while (left < right) {

                index = (left + right) >> 1;
                sheetHeight = uint(sheets[index].height);
                if (height > sheetHeight) {
                    left = ++index;
                } else if (height < sheetHeight) {
                    // When index = 0, this statement will have an underflow exception, which usually 
                    // indicates that the effective block height passed during the call is lower than 
                    // the block height of the first quotation
                    right = --index;
                } else {
                    break;
                }
            }
        }

        // Calculate price
        uint totalEthNum = 0;
        uint totalTokenValue = 0;
        uint h = 0;
        uint remainNum;
        PriceSheet memory sheet;

        // Find sheets forward
        for (uint i = index; i < length;) {

            sheet = sheets[i++];
            sheetHeight = uint(sheet.height);
            if (height < sheetHeight) {
                break;
            }
            remainNum = uint(sheet.remainNum);
            if (remainNum > 0) {
                if (h == 0) {
                    h = sheetHeight;
                } else if (h != sheetHeight) {
                    break;
                }
                totalEthNum += remainNum;
                totalTokenValue += _decodeFloat(sheet.priceFloat) * remainNum;
            }
        }

        // Find sheets backward
        while (index > 0) {

            sheet = sheets[--index];
            remainNum = uint(sheet.remainNum);
            if (remainNum > 0) {
                sheetHeight = uint(sheet.height);
                if (h == 0) {
                    h = sheetHeight;
                } else if (h != sheetHeight) {
                    break;
                }
                totalEthNum += remainNum;
                totalTokenValue += _decodeFloat(sheet.priceFloat) * remainNum;
            }
        }

        if (totalEthNum > 0) {
            return (h + priceEffectSpan, totalTokenValue / totalEthNum);
        }
        return (0, 0);
    }

    /// @dev Get the last (num) effective price
    /// @param pair Target price pair
    /// @param count The number of prices that want to return
    /// @return An array which length is num * 2, each two element expresses one price like blockNumber|price
    function _lastPriceList(PricePair storage pair, uint count) internal view returns (uint[] memory) {

        PriceSheet[] storage sheets = pair.sheets;
        PriceSheet memory sheet;
        uint[] memory array = new uint[](count <<= 1);

        uint priceEffectSpan = uint(_config.priceEffectSpan);
        uint index = sheets.length;
        uint totalEthNum = 0;
        uint totalTokenValue = 0;
        uint height = 0;

        for (uint i = 0; i < count;) {

            bool flag = index == 0;
            if (flag || height != uint((sheet = sheets[--index]).height)) {
                if (totalEthNum > 0 && height + priceEffectSpan < block.number) {
                    array[i++] = height + priceEffectSpan;
                    array[i++] = totalTokenValue / totalEthNum;
                }
                if (flag) {
                    break;
                }
                totalEthNum = 0;
                totalTokenValue = 0;
                height = uint(sheet.height);
            }

            uint remainNum = uint(sheet.remainNum);
            totalEthNum += remainNum;
            totalTokenValue += _decodeFloat(sheet.priceFloat) * remainNum;
        }

        return array;
    }
}


// File contracts/NestBatchPlatform2.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;
/// @dev This contract implemented the query logic of nest
contract NestBatchPlatform2 is NestBatchMining, INestBatchPriceView, INestBatchPrice2 {

    /* ========== INestBatchPriceView ========== */

    /// @dev Get the latest trigger price
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @return blockNumber The block number of price
    /// @return price The token price. (1eth equivalent to (price) token)
    function triggeredPrice(uint channelId, uint pairIndex) external view override noContract returns (uint blockNumber, uint price) {
        return _triggeredPrice(_channels[channelId].pairs[pairIndex]);
    }

    /// @dev Get the full information of latest trigger price
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @return blockNumber The block number of price
    /// @return price The token price. (1eth equivalent to (price) token)
    /// @return avgPrice Average price
    /// @return sigmaSQ The square of the volatility (18 decimal places). The current implementation assumes that 
    ///         the volatility cannot exceed 1. Correspondingly, when the return value is equal to 999999999999996447,
    ///         it means that the volatility has exceeded the range that can be expressed
    function triggeredPriceInfo(uint channelId, uint pairIndex) external view override noContract returns (
        uint blockNumber,
        uint price,
        uint avgPrice,
        uint sigmaSQ
    ) {
        return _triggeredPriceInfo(_channels[channelId].pairs[pairIndex]);
    }

    /// @dev Find the price at block number
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @param height Destination block number
    /// @return blockNumber The block number of price
    /// @return price The token price. (1eth equivalent to (price) token)
    function findPrice(
        uint channelId,
        uint pairIndex,
        uint height
    ) external view override noContract returns (uint blockNumber, uint price) {
        return _findPrice(_channels[channelId].pairs[pairIndex], height);
    }

    /// @dev Get the last (num) effective price
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @param count The number of prices that want to return
    /// @return An array which length is num * 2, each two element expresses one price like blockNumber|price
    function lastPriceList(uint channelId, uint pairIndex, uint count) external view override noContract returns (uint[] memory) {
        return _lastPriceList(_channels[channelId].pairs[pairIndex], count);
    } 

    /// @dev Returns lastPriceList and triggered price info
    /// @param channelId Target channelId
    /// @param pairIndex Target pairIndex
    /// @param count The number of prices that want to return
    /// @return prices An array which length is num * 2, each two element expresses one price like blockNumber|price
    /// @return triggeredPriceBlockNumber The block number of triggered price
    /// @return triggeredPriceValue The token triggered price. (1eth equivalent to (price) token)
    /// @return triggeredAvgPrice Average price
    /// @return triggeredSigmaSQ The square of the volatility (18 decimal places). The current implementation 
    /// assumes that the volatility cannot exceed 1. Correspondingly, when the return value is equal to 
    /// 999999999999996447, it means that the volatility has exceeded the range that can be expressed
    function lastPriceListAndTriggeredPriceInfo(uint channelId, uint pairIndex, uint count) external view override noContract
    returns (
        uint[] memory prices,
        uint triggeredPriceBlockNumber,
        uint triggeredPriceValue,
        uint triggeredAvgPrice,
        uint triggeredSigmaSQ
    ) {
        //return _lastPriceListAndTriggeredPriceInfo(_channels[channelId].pairs[pairIndex], count);
        PricePair storage pair = _channels[channelId].pairs[pairIndex];
        prices = _lastPriceList(pair, count);
        (
            triggeredPriceBlockNumber, 
            triggeredPriceValue, 
            triggeredAvgPrice, 
            triggeredSigmaSQ
        ) = _triggeredPriceInfo(pair);
    }

    /* ========== INestBatchPrice ========== */

    /// @dev Get the latest trigger price
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param payback Address to receive refund
    /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price
    function triggeredPrice(
        uint channelId,
        uint[] calldata pairIndices, 
        address payback
    ) external payable override returns (uint[] memory prices) {
        PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs;

        uint n = pairIndices.length << 1;
        prices = new uint[](n);
        while (n > 0) {
            n -= 2;
            (prices[n], prices[n + 1]) = _triggeredPrice(pairs[pairIndices[n >> 1]]);
        }
    }

    /// @dev Get the full information of latest trigger price
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param payback Address to receive refund
    /// @return prices Price array, i * 4 is the block where the ith price is located, i * 4 + 1 is the ith price,
    /// i * 4 + 2 is the ith average price and i * 4 + 3 is the ith volatility
    function triggeredPriceInfo(
        uint channelId, 
        uint[] calldata pairIndices,
        address payback
    ) external payable override returns (uint[] memory prices) {
        PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs;

        uint n = pairIndices.length << 2;
        prices = new uint[](n);
        while (n > 0) {
            n -= 4;
            (prices[n], prices[n + 1], prices[n + 2], prices[n + 3]) = _triggeredPriceInfo(pairs[pairIndices[n >> 2]]);
        }
    }

    /// @dev Find the price at block number
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param height Destination block number
    /// @param payback Address to receive refund
    /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price
    function findPrice(
        uint channelId,
        uint[] calldata pairIndices, 
        uint height, 
        address payback
    ) external payable override returns (uint[] memory prices) {
        PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs;

        uint n = pairIndices.length << 1;
        prices = new uint[](n);
        while (n > 0) {
            n -= 2;
            (prices[n], prices[n + 1]) = _findPrice(pairs[pairIndices[n >> 1]], height);
        }
    }

    /// @dev Get the last (num) effective price
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param count The number of prices that want to return
    /// @param payback Address to receive refund
    /// @return prices Result array, i * count * 2 to (i + 1) * count * 2 - 1 are 
    /// the price results of group i quotation pairs
    function lastPriceList(
        uint channelId, 
        uint[] calldata pairIndices, 
        uint count, 
        address payback
    ) external payable override returns (uint[] memory prices) {
        PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs;

        uint row = count << 1;
        uint n = pairIndices.length * row;
        prices = new uint[](n);
        while (n > 0) {
            n -= row;
            uint[] memory pi = _lastPriceList(pairs[pairIndices[n / row]], count);
            for (uint i = 0; i < row; ++i) {
                prices[n + i] = pi[i];
            }
        }
    }

    /// @dev Returns lastPriceList and triggered price info
    /// @param channelId Target channelId
    /// @param pairIndices Array of pair indices
    /// @param count The number of prices that want to return
    /// @param payback Address to receive refund
    /// @return prices result of group i quotation pair. Among them, the first two count * are the latest prices, 
    /// and the last four are: trigger price block number, trigger price, average price and volatility
    function lastPriceListAndTriggeredPriceInfo(
        uint channelId, 
        uint[] calldata pairIndices,
        uint count, 
        address payback
    ) external payable override returns (uint[] memory prices) {
        PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs;

        uint row = (count << 1) + 4;
        uint n = pairIndices.length * row;
        prices = new uint[](n);
        while (n > 0) {
            n -= row;

            PricePair storage pair = pairs[pairIndices[n / row]];
            uint[] memory pi = _lastPriceList(pair, count);
            for (uint i = 0; i + 4 < row; ++i) {
                prices[n + i] = pi[i];
            }
            uint j = n + row - 4;
            (
                prices[j],
                prices[j + 1],
                prices[j + 2],
                prices[j + 3]
            ) = _triggeredPriceInfo(pair);
        }
    }

    // Payment of transfer fee
    function _pay(uint channelId, address payback) private returns (PriceChannel storage channel) {

        channel = _channels[channelId];
        uint fee = uint(channel.singleFee) * DIMI_ETHER;
        if (msg.value > fee) {
            payable(payback).transfer(msg.value - fee);
            // BSC adopts the old gas calculation strategy. Direct transfer may lead to the excess of gas 
            // in the agency contract. The following methods should be used for transfer
            //TransferHelper.safeTransferETH(payback, msg.value - fee);
        } else {
            require(msg.value == fee, "NOP:!fee");
        }

        channel.rewards += _toUInt96(fee);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token0","type":"address"},{"indexed":false,"internalType":"uint256","name":"unit","type":"uint256"},{"indexed":false,"internalType":"address","name":"reward","type":"address"}],"name":"Open","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"scale","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Post","type":"event"},{"inputs":[],"name":"_governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"addPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"newOpener","type":"address"}],"name":"changeOpener","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[][]","name":"indices","type":"uint256[][]"}],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint128","name":"vault","type":"uint128"}],"name":"decrease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"donate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"estimate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"uint256","name":"height","type":"uint256"},{"internalType":"address","name":"payback","type":"address"}],"name":"findPrice","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"height","type":"uint256"}],"name":"findPrice","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAccountCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getAccountIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"getChannelInfo","outputs":[{"components":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"uint96","name":"unit","type":"uint96"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint96","name":"rewardPerBlock","type":"uint96"},{"internalType":"uint128","name":"vault","type":"uint128"},{"internalType":"uint96","name":"rewards","type":"uint96"},{"internalType":"uint16","name":"postFeeUnit","type":"uint16"},{"internalType":"uint16","name":"count","type":"uint16"},{"internalType":"address","name":"opener","type":"address"},{"internalType":"uint32","name":"genesisBlock","type":"uint32"},{"internalType":"uint16","name":"singleFee","type":"uint16"},{"internalType":"uint16","name":"reductionRate","type":"uint16"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint96","name":"sheetCount","type":"uint96"}],"internalType":"struct INestBatchMining.PairView[]","name":"pairs","type":"tuple[]"}],"internalType":"struct INestBatchMining.PriceChannelView","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConfig","outputs":[{"components":[{"internalType":"uint8","name":"maxBiteNestedLevel","type":"uint8"},{"internalType":"uint16","name":"priceEffectSpan","type":"uint16"},{"internalType":"uint16","name":"pledgeNest","type":"uint16"}],"internalType":"struct INestBatchMining.Config","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getMinedBlocks","outputs":[{"internalType":"uint256","name":"minedBlocks","type":"uint256"},{"internalType":"uint256","name":"totalShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint128","name":"vault","type":"uint128"}],"name":"increase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"indexAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"governance","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"payback","type":"address"}],"name":"lastPriceList","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"lastPriceList","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"lastPriceListAndTriggeredPriceInfo","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"},{"internalType":"uint256","name":"triggeredPriceBlockNumber","type":"uint256"},{"internalType":"uint256","name":"triggeredPriceValue","type":"uint256"},{"internalType":"uint256","name":"triggeredAvgPrice","type":"uint256"},{"internalType":"uint256","name":"triggeredSigmaSQ","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"payback","type":"address"}],"name":"lastPriceListAndTriggeredPriceInfo","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"order","type":"uint256"}],"name":"list","outputs":[{"components":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint32","name":"height","type":"uint32"},{"internalType":"uint32","name":"remainNum","type":"uint32"},{"internalType":"uint32","name":"ethNumBal","type":"uint32"},{"internalType":"uint32","name":"tokenNumBal","type":"uint32"},{"internalType":"uint24","name":"nestNum1k","type":"uint24"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"shares","type":"uint8"},{"internalType":"uint152","name":"price","type":"uint152"}],"internalType":"struct INestBatchMining.PriceSheetView[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"components":[{"internalType":"uint96","name":"rewardPerBlock","type":"uint96"},{"internalType":"uint16","name":"postFeeUnit","type":"uint16"},{"internalType":"uint16","name":"singleFee","type":"uint16"},{"internalType":"uint16","name":"reductionRate","type":"uint16"}],"internalType":"struct INestBatchMining.ChannelConfig","name":"config","type":"tuple"}],"name":"modify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"uint96","name":"unit","type":"uint96"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"components":[{"internalType":"uint96","name":"rewardPerBlock","type":"uint96"},{"internalType":"uint16","name":"postFeeUnit","type":"uint16"},{"internalType":"uint16","name":"singleFee","type":"uint16"},{"internalType":"uint16","name":"reductionRate","type":"uint16"}],"internalType":"struct INestBatchMining.ChannelConfig","name":"config","type":"tuple"}],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"pay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"scale","type":"uint256"},{"internalType":"uint256[]","name":"equivalents","type":"uint256[]"}],"name":"post","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"maxBiteNestedLevel","type":"uint8"},{"internalType":"uint16","name":"priceEffectSpan","type":"uint16"},{"internalType":"uint16","name":"pledgeNest","type":"uint16"}],"internalType":"struct INestBatchMining.Config","name":"config","type":"tuple"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"takeNum","type":"uint256"},{"internalType":"uint256","name":"newEquivalent","type":"uint256"}],"name":"take","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"totalETHRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"address","name":"payback","type":"address"}],"name":"triggeredPrice","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"triggeredPrice","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"triggeredPriceInfo","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"avgPrice","type":"uint256"},{"internalType":"uint256","name":"sigmaSQ","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"address","name":"payback","type":"address"}],"name":"triggeredPriceInfo","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernance","type":"address"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615c6180620000216000396000f3fe60806040526004361061020f5760003560e01c80639ba63e9e11610118578063d2a53f61116100a0578063f3a713211161006f578063f3a71321146106b2578063f3fef3a3146106d2578063f781feb3146106f2578063f7888aec14610705578063fd9b53871461072557600080fd5b8063d2a53f611461061f578063d4aa113c1461063f578063d99f05831461067f578063de0777ed1461069f57600080fd5b8063ba2d4a8f116100e7578063ba2d4a8f14610518578063c3f909d414610538578063c4d66de8146105cc578063c708ba0c146105ec578063c86fe6521461060c57600080fd5b80639ba63e9e1461047f5780639c792938146104c3578063a98e4e77146104e3578063b7e004fa146104f857600080fd5b80634353e7421161019b578063594e25b51161016a578063594e25b5146103e45780636e2f74b9146103f75780637ba3033d1461042c578063860506801461043f578063954b756f1461045f57600080fd5b80634353e74214610371578063493183541461039157806354a80f04146103b15780635938b38d146103c457600080fd5b80631c2f3e3d116101e25780631c2f3e3d146102965780631d7a4993146102d35780632a651c54146103005780632d1e4721146103315780633ac30e4b1461034457600080fd5b80630313766f14610214578063045b2f44146102365780630cdd53f6146102565780631c1b877214610276575b600080fd5b34801561022057600080fd5b5061023461022f366004615081565b610745565b005b34801561024257600080fd5b506102346102513660046150d1565b610850565b34801561026257600080fd5b506102346102713660046150fe565b6108b6565b34801561028257600080fd5b50610234610291366004615120565b610a56565b3480156102a257600080fd5b506000546102b6906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102df57600080fd5b506102f36102ee36600461513d565b610b35565b6040516102ca91906151ae565b34801561030c57600080fd5b5061032061031b3660046152ea565b610dac565b6040516102ca959493929190615346565b61023461033f36600461537d565b610e39565b34801561035057600080fd5b5061036461035f3660046153b9565b610f24565b6040516102ca91906153f4565b61038461037f36600461550f565b6111a0565b6040516102ca919061556e565b34801561039d57600080fd5b506102346103ac366004615581565b6112a1565b6103846103bf3660046155cd565b6118f9565b3480156103d057600080fd5b506102346103df366004615638565b611a2c565b6103846103f23660046155cd565b611aa7565b34801561040357600080fd5b506104176104123660046150fe565b611baa565b604080519283526020830191909152016102ca565b61023461043a36600461565d565b611c13565b34801561044b57600080fd5b506102b661045a36600461513d565b611ecf565b34801561046b57600080fd5b5061023461047a3660046156b0565b611f04565b34801561048b57600080fd5b506104b561049a366004615120565b6001600160a01b031660009081526003602052604090205490565b6040519081526020016102ca565b3480156104cf57600080fd5b506104b56104de36600461513d565b611fbc565b3480156104ef57600080fd5b506002546104b5565b34801561050457600080fd5b506104176105133660046150fe565b612160565b34801561052457600080fd5b506102346105333660046156de565b612265565b34801561054457600080fd5b5061059b6040805160608101825260008082526020820181905291810191909152506040805160608101825260015460ff8116825261ffff6101008204811660208401526301000000909104169181019190915290565b60408051825160ff16815260208084015161ffff9081169183019190915292820151909216908201526060016102ca565b3480156105d857600080fd5b506102346105e7366004615120565b6125b0565b3480156105f857600080fd5b50610234610607366004615638565b6125c8565b61023461061a3660046153b9565b61278f565b34801561062b57600080fd5b5061038461063a3660046152ea565b61309c565b34801561064b57600080fd5b5061065f61065a3660046150fe565b61310a565b6040805194855260208501939093529183015260608201526080016102ca565b34801561068b57600080fd5b506104b561069a36600461513d565b613182565b6103846106ad36600461550f565b6131c3565b3480156106be57600080fd5b506104176106cd3660046152ea565b613302565b3480156106de57600080fd5b506102346106ed366004615769565b613375565b6103846107003660046155cd565b6133e7565b34801561071157600080fd5b506104b5610720366004615795565b6135ea565b34801561073157600080fd5b5061023461074036600461537d565b61364a565b60006004848154811061075a5761075a6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146107bf5760405162461bcd60e51b815260206004820152600b60248201526a2727a69d10b7b832b732b960a91b60448201526064015b60405180910390fd5b6107c882613765565b6002820180546010906107ec908490600160801b90046001600160601b03166157ef565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550826001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610849573d6000803e3d6000fd5b5050505050565b600060048381548110610865576108656157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146108a75760405162461bcd60e51b81526004016107b690615817565b6108b1818361377b565b505050565b6000600483815481106108cb576108cb6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461092b5760405162461bcd60e51b815260206004820152600b60248201526a2727a69d10b7b832b732b960a91b60448201526064016107b6565b61093482613765565b600282018054601090610958908490600160801b90046001600160601b03166157ef565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555060008054906101000a90046001600160a01b03166001600160a01b0316638df18bb56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061583f565b6001600160a01b031663c840ff2683856040518363ffffffff1660e01b8152600401610a1f91815260200190565b6000604051808303818588803b158015610a3857600080fd5b505af1158015610a4c573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633811480610ada57506040516391e1472b60e01b8152336004820152600060248201526001600160a01b038216906391e1472b90604401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada919061585c565b610b125760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016107b6565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516101c08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a08201526004805491929184908110610bbb57610bbb6157c3565b6000918252602082206203000191909102016002810154909250600160f01b900461ffff16908167ffffffffffffffff811115610bfa57610bfa61587e565b604051908082528060200260200182016040528015610c3f57816020015b6040805180820190915260008082526020820152815260200190600190039081610c185790505b50905060005b82811015610ccd576000846004018261ffff8110610c6557610c656157c3565b604080518082019091526003919091029190910180546001600160a01b0316825260028101546001600160601b031660208301528451909250849084908110610cb057610cb06157c3565b60200260200101819052505080610cc690615894565b9050610c45565b50604080516101c08101825295865283546001600160a01b0380821660208901526001600160601b03600160a01b92839004811693890193909352600186015480821660608a01528290048316608089015260028601546001600160801b03811660a08a0152600160801b810490931660c089015261ffff600160e01b8404811660e08a0152600160f01b909304831661010089015260039095015494851661012088015263ffffffff90850416610140870152600160c01b84048116610160870152600160d01b909304909216610180850152506101a08301525090565b60606000808080333214610dd25760405162461bcd60e51b81526004016107b6906158ad565b600060048981548110610de757610de76157c3565b906000526020600020906203000102016004018861ffff8110610e0c57610e0c6157c3565b600302019050610e1c8188613849565b9550610e2781613aa4565b989c929b509099509750945050505050565b600060048381548110610e4e57610e4e6157c3565b60009182526020909120620300019091020160018101549091506001600160a01b031680610ec557826001600160801b03163414610ec05760405162461bcd60e51b815260206004820152600f60248201526e2727a69d3b30bab63a1032b93937b960891b60448201526064016107b6565b610eda565b610eda813330866001600160801b0316613bc4565b600282018054849190600090610efa9084906001600160801b03166158d5565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555050505050565b6060333214610f455760405162461bcd60e51b81526004016107b6906158ad565b600060048781548110610f5a57610f5a6157c3565b906000526020600020906203000102016004018661ffff8110610f7f57610f7f6157c3565b60030201600201905060008467ffffffffffffffff811115610fa357610fa361587e565b604051908082528060200260200182016040528015610fdc57816020015b610fc9614fc9565b815260200190600190039081610fc15790505b508254909150600085810361111f576000610ff78984615900565b90506000888211611009576000611013565b6110138983615900565b90505b808211156111185761102782615917565b91506110eb86838154811061103e5761103e6157c3565b60009182526020918290206040805161012081018252919092015463ffffffff8082168352600160201b8204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b9091041661010082015283613cf4565b85846110f681615894565b955081518110611108576111086157c3565b6020026020010181905250611016565b5050611192565b87600061112c898361592e565b9050838111156111395750825b8082101561118f5761115686838154811061103e5761103e6157c3565b858461116181615894565b955081518110611173576111736157c3565b60200260200101819052508161118890615894565b9150611139565b50505b509098975050505050505050565b606060006111ae8684613dd7565b6004019050600184901b8067ffffffffffffffff8111156111d1576111d161587e565b6040519080825280602002602001820160405280156111fa578160200160208202803683370190505b5092505b80156112975761120f600282615900565b905061124c828787600185901c81811061122b5761122b6157c3565b9050602002013561ffff8110611243576112436157c3565b60030201613f03565b84838151811061125e5761125e6157c3565b6020026020010185846001611273919061592e565b81518110611283576112836157c3565b6020908102919091010191909152526111fe565b5050949350505050565b6040805160608101825260015460ff8116825261ffff610100820481166020840152630100000090910416918101919091526004805460009190869081106112eb576112eb6157c3565b90600052602060002090620300010201905060008060008060006002600081548110611319576113196157c3565b60009182526020918290206040805160608101825260018b810154600160a01b908190046001600160601b0316835260038d015490810463ffffffff1696830196909652600160d01b90950461ffff1691810191909152600292909202019091019150885b80156118215760006004890161139383615917565b92508261ffff81106113a7576113a76157c3565b6003020190506000808d8d858181106113c2576113c26157c3565b90506020028101906113d49190615946565b9150505b80156117f75760008e8e868181106113f2576113f26157c3565b90506020028101906114049190615946565b61140d84615917565b93508381811061141f5761141f6157c3565b905060200201359050600084600201828154811061143f5761143f6157c3565b600091825260208083206040805161012081018252939091015463ffffffff8082168552600160201b8204811693850193909352600160401b8104831691840191909152600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015291508c900361152657806000015163ffffffff169b5060028c8154811061150e5761150e6157c3565b90600052602060002090600202016001019750611568565b805163ffffffff168c146115685760405162461bcd60e51b815260206004820152600960248201526827269d10b6b4b732b960b91b60448201526064016107b6565b60008c1180156115945750438e6020015161ffff16826020015163ffffffff16611592919061592e565b105b156117f057856000036116395760e081015160ff168015611637576000806115c0886002018686613fcf565b8b516020808e0151908801519395509193506101909284926115f6916115ec919063ffffffff16615900565b60408f0151614129565b6116008787615990565b61160a9190615990565b6116149190615990565b61161e91906159af565b61162891906159af565b611632908f61592e565b9d5050505b505b60a081015161164d9062ffffff168b61592e565b9950806060015163ffffffff1689611665919061592e565b6080820151610100830151919a5063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b61169c9190615990565b6116a6908561592e565b60008083526060830181905260808301526002860180549195508291849081106116d2576116d26157c3565b60009182526020918290208351910180549284015160408501516060860151608087015160a088015160c089015160e08a0151610100909a015166ffffffffffffff16600160c81b026001600160c81b0360ff9b8c16600160c01b0260ff60c01b199c909316600160b81b029b909b1661ffff60b81b1962ffffff909416600160a01b0262ffffff60a01b1963ffffffff968716600160801b021666ffffffffffffff60801b19978716600160601b0263ffffffff60601b19998816600160401b029990991667ffffffffffffffff60401b199a8816600160201b0267ffffffffffffffff19909e1697909c16969096179b909b17979097169890981794909417929092161795909517949094161792909217929092169190911790555b50506113d8565b506118028b836141b6565b815461181a9086906001600160a01b0316838c6146ac565b505061137e565b5086546118559083906001600160a01b0381169061184f90600160a01b90046001600160601b031687615990565b896146ac565b611881827304abeda201850ac0124161f037efd70c74ddc74c61184f87683635c9adc5dea00000615990565b60028701546001600160801b03168086111561189b578095505b6118a58682615900565b6002890180546fffffffffffffffffffffffffffffffff19166001600160601b039290921691909117905560018801546118eb9084906001600160a01b0316888a6146ac565b505050505050505050505050565b606060006119078784613dd7565b6004019050600184901b600061191d8288615990565b90508067ffffffffffffffff8111156119385761193861587e565b604051908082528060200260200182016040528015611961578160200160208202803683370190505b5093505b8015611a20576119758282615900565b905060006119ba848a8a61198987876159af565b818110611998576119986157c3565b9050602002013561ffff81106119b0576119b06157c3565b6003020188613849565b905060005b83811015611a19578181815181106119d9576119d96157c3565b60200260200101518682856119ee919061592e565b815181106119fe576119fe6157c3565b6020908102919091010152611a1281615894565b90506119bf565b5050611965565b50505095945050505050565b600060048381548110611a4157611a416157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b03163314611a835760405162461bcd60e51b81526004016107b690615817565b60030180546001600160a01b0319166001600160a01b039290921691909117905550565b60606000611ab58784613dd7565b6004019050600185901b8067ffffffffffffffff811115611ad857611ad861587e565b604051908082528060200260200182016040528015611b01578160200160208202803683370190505b5092505b8015611b9f57611b16600282615900565b9050611b54828888600185901c818110611b3257611b326157c3565b9050602002013561ffff8110611b4a57611b4a6157c3565b6003020186614734565b848381518110611b6657611b666157c3565b6020026020010185846001611b7b919061592e565b81518110611b8b57611b8b6157c3565b602090810291909101019190915252611b05565b505095945050505050565b600080333214611bcc5760405162461bcd60e51b81526004016107b6906158ad565b611c0760048581548110611be257611be26157c3565b906000526020600020906203000102016004018461ffff8110611243576112436157c3565b915091505b9250929050565b604080516060810182526001805460ff8116835261ffff61010082048116602085015263010000009091041692820192909252908414611c825760405162461bcd60e51b815260206004820152600a6024820152694e4f4d3a217363616c6560b01b60448201526064016107b6565b600060048681548110611c9757611c976157c3565b9060005260206000209062030001020190506000611cb433614ace565b9050600060028281548110611ccb57611ccb6157c3565b60009182526020909120600285810154604088015160019290940290920101925061ffff600160f01b9091048116913491611d3c9185917304abeda201850ac0124161f037efd70c74ddc74c91611d23911686615990565b611d3690683635c9adc5dea00000615990565b84614ba1565b8554909150611d789084906001600160a01b038116908c90611d6e90600160a01b90046001600160601b031687615990565b611d369190615990565b90505b8115611ec357600060048601611d9084615917565b93508361ffff8110611da457611da46157c3565b6003020190506000898985818110611dbe57611dbe6157c3565b90506020020135905060008111611e095760405162461bcd60e51b815260206004820152600f60248201526e1393d34e88595c5d5a5d985b195b9d608a1b60448201526064016107b6565b8154611e2a9086906001600160a01b0316611e24848f615990565b86614ba1565b9250611e3688836141b6565b6002820154604080518e81526020810187905233818301526060810192909252608082018d905260a08201839052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a1611ebc82600201878d8b6040015161ffff1688600014611eb0576000611eb3565b60015b60ff1686614c1a565b5050611d7b565b50505050505050505050565b600060028281548110611ee457611ee46157c3565b60009182526020909120600290910201546001600160a01b031692915050565b600080546040516391e1472b60e01b815233600482015260248101929092526001600160a01b0316906391e1472b90604401602060405180830381865afa158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f77919061585c565b611faf5760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016107b6565b8060016108b182826159e1565b60008060048381548110611fd257611fd26157c3565b60009182526020909120620300019091020160068101805491925090600a5b81156120ea5760008361200384615917565b93508381548110612016576120166157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b8204811694840194909452600160401b8104841691830191909152600160601b810483166060830152600160801b81049092166080820152600160a01b820462ffffff1660a0820152600160b81b820460ff90811660c0830152600160c01b83041660e08201819052600160c81b90920466ffffffffffffff166101008201529150156120e45760208101516120dc9063ffffffff1643615900565b9150506120ea565b50611ff1565b6003840154610190906121239061210e90600160a01b900463ffffffff1643615900565b6003870154600160d01b900461ffff16614129565b600186015461214290600160a01b90046001600160601b031684615990565b61214c9190615990565b61215691906159af565b9695505050505050565b600080600060048581548110612178576121786157c3565b60009182526020822060046203000190920201019060030201600201905061225981858387815481106121ad576121ad6157c3565b60009182526020918290206040805161012081018252919092015463ffffffff8082168352600160201b8204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b90910416610100820152613fcf565b92509250509250929050565b600454604080519182526001600160a01b0388811660208401526001600160601b0388168383015286166060830152517fd5d675c43c23a6c1e3ad060a603f30590f57c52d5e4a71994bf009848e8fe9e19181900360800190a16004805460018101825560009182526001600160a01b03888116600160a01b6001600160601b038a168102919091177f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b620300019094029384019081557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c840180546001600160a01b031916938a16939093179092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d8301805461ffff60e01b16600160f01b61ffff8916021790557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e90920180546001600160c01b0319163363ffffffff60a01b1916174363ffffffff1690930292909217909155905b8381101561259c578484828181106123f8576123f86157c3565b905060200201602081019061240d9190615120565b6001600160a01b0316886001600160a01b03160361246d5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016107b6565b60005b8181101561252c5785858281811061248a5761248a6157c3565b905060200201602081019061249f9190615120565b6001600160a01b03168686848181106124ba576124ba6157c3565b90506020020160208101906124cf9190615120565b6001600160a01b03160361251c5760405162461bcd60e51b81526020600482015260146024820152731393d34e9d1bdad95b881c995a5d195c985d195960621b60448201526064016107b6565b61252581615894565b9050612470565b5084848281811061253f5761253f6157c3565b90506020020160208101906125549190615120565b826004018261ffff811061256a5761256a6157c3565b6003020180546001600160a01b0319166001600160a01b039290921691909117905561259581615894565b90506123de565b506125a7818361377b565b50505050505050565b6125b981614dc5565b50600280546001018155600052565b6000600483815481106125dd576125dd6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461261f5760405162461bcd60e51b81526004016107b690615817565b80546001600160a01b0380841691160361267b5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016107b6565b6002810154600160f01b900461ffff1660005b8181101561271857836001600160a01b0316836004018261ffff81106126b6576126b66157c3565b60030201546001600160a01b0316036127085760405162461bcd60e51b81526020600482015260146024820152731393d34e9d1bdad95b881c995a5d195c985d195960621b60448201526064016107b6565b61271181615894565b905061268e565b5082826004018261ffff8110612730576127306157c3565b6003020180546001600160a01b0319166001600160a01b0392909216919091179055600282018054601e9061276f90600160f01b900461ffff16615a56565b91906101000a81548161ffff021916908361ffff16021790555050505050565b6040805160608101825260015460ff8116825261ffff61010082048116602084015263010000009091041691810191909152826127fc5760405162461bcd60e51b815260206004820152600b60248201526a4e4d3a2174616b654e756d60a81b60448201526064016107b6565b600082116128385760405162461bcd60e51b81526020600482015260096024820152684e4d3a21707269636560b81b60448201526064016107b6565b60006004878154811061284d5761284d6157c3565b9060005260206000209062030001020190506000816004016201000088106128815761287c6201000089615900565b612883565b875b61ffff8110612894576128946157c3565b60030201905060008160020187815481106128b1576128b16157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116848601819052600160401b8304821693850193909352600160601b820481166060850152600160801b8204166080840152600160a01b810462ffffff1660a0840152600160b81b810460ff90811660c0850152600160c01b82041660e0840152600160c81b900466ffffffffffffff1661010083015291860151909250439161296c9161ffff169061592e565b10156129a65760405162461bcd60e51b81526020600482015260096024820152684e4d3a21737461746560b81b60448201526064016107b6565b85816040015163ffffffff166129bc9190615900565b63ffffffff16604082015260006129d233614ace565b90506000826080015163ffffffff16836060015163ffffffff166129f6919061592e565b60a0840151612a0e9062ffffff1660028b901b615990565b612a1891906159af565b60c0840151909150889060ff90811690811015612a4f57875160ff16811015612a4357600182901b91505b612a4c81615894565b90505b600060028581548110612a6457612a646157c3565b906000526020600020906002020160010190506000349050620100008e1015612ce7578b876060015163ffffffff16612a9d9190615900565b63ffffffff90811660608901526080880151612abb918e911661592e565b63ffffffff1660808801526002880180548891908f908110612adf57612adf6157c3565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612c8d828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88611d6e9190615900565b8854610100890151919250612ce09184916001600160a01b0316908f90600681901c6603ffffffffffff1660029190911b60fc161b612ccc9190615990565b612cd68f89615990565b611d36919061592e565b9050612fac565b612cf4620100008f615900565b9d508b876060015163ffffffff16612d0c919061592e565b63ffffffff90811660608901526080880151612d2a918e9116615900565b63ffffffff1660808801526002880180548891908f908110612d4e57612d4e6157c3565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612efc828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88611d6e919061592e565b6101008801519091506000908d90600681901c6603ffffffffffff1660029190911b60fc161b612f2c9190615990565b905080612f398d87615990565b1115612f7f57612f78838a60000160009054906101000a90046001600160a01b0316838f89612f689190615990565b612f729190615900565b85614ba1565b9150612faa565b8854612faa9084906001600160a01b0316612f9a8f89615990565b612fa49085615900565b33614e33565b505b612fd8827304abeda201850ac0124161f037efd70c74ddc74c611d3688683635c9adc5dea00000615990565b905080156130135760405162461bcd60e51b81526020600482015260086024820152674e4f4d3a2166656560c01b60448201526064016107b6565b505061301f88876141b6565b6002860154604080518f8152602081018f9052338183015260608101929092526080820184905260a082018b9052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a161308d86600201858486600886901b8e614c1a565b50505050505050505050505050565b60603332146130bd5760405162461bcd60e51b81526004016107b6906158ad565b613102600485815481106130d3576130d36157c3565b906000526020600020906203000102016004018461ffff81106130f8576130f86157c3565b6003020183613849565b949350505050565b600080808033321461312e5760405162461bcd60e51b81526004016107b6906158ad565b61317260048781548110613144576131446157c3565b906000526020600020906203000102016004018661ffff8110613169576131696157c3565b60030201613aa4565b9299919850965090945092505050565b600060048281548110613197576131976157c3565b60009182526020909120620300019091020160020154600160801b90046001600160601b031692915050565b606060006131d18684613dd7565b6004019050600284901b8067ffffffffffffffff8111156131f4576131f461587e565b60405190808252806020026020018201604052801561321d578160200160208202803683370190505b5092505b801561129757613232600482615900565b9050613266828787600285901c81811061324e5761324e6157c3565b9050602002013561ffff8110613169576131696157c3565b868581518110613278576132786157c3565b602002602001018786600161328d919061592e565b8151811061329d5761329d6157c3565b60200260200101888760026132b2919061592e565b815181106132c2576132c26157c3565b60200260200101898860036132d7919061592e565b815181106132e7576132e76157c3565b60209081029190910101939093529290915291905252613221565b6000803332146133245760405162461bcd60e51b81526004016107b6906158ad565b6133696004868154811061333a5761333a6157c3565b906000526020600020906203000102016004018561ffff811061335f5761335f6157c3565b6003020184614734565b91509150935093915050565b3360009081526003602052604081205460028054909190811061339a5761339a6157c3565b600091825260208083206001600160a01b03871684526001600290930201919091019052604081208054909250839183916133d6908490615900565b909155506108b19050833384614e7d565b606060006133f58784613dd7565b60040190506000600185901b600461340d919061592e565b9050600061341b8288615990565b90508067ffffffffffffffff8111156134365761343661587e565b60405190808252806020026020018201604052801561345f578160200160208202803683370190505b5093505b8015611a20576134738282615900565b9050600083898961348486866159af565b818110613493576134936157c3565b9050602002013561ffff81106134ab576134ab6157c3565b60030201905060006134bd8289613849565b905060005b846134ce82600461592e565b1015613526578181815181106134e6576134e66157c3565b60200260200101518782866134fb919061592e565b8151811061350b5761350b6157c3565b602090810291909101015261351f81615894565b90506134c2565b5060006004613535868661592e565b61353f9190615900565b905061354a83613aa4565b8a858151811061355c5761355c6157c3565b602002602001018b866001613571919061592e565b81518110613581576135816157c3565b602002602001018c876002613596919061592e565b815181106135a6576135a66157c3565b602002602001018d8860036135bb919061592e565b815181106135cb576135cb6157c3565b6020908102919091010193909352929091529190525250613463915050565b6001600160a01b038116600090815260036020526040812054600280549091908110613618576136186157c3565b600091825260208083206001600160a01b03871684526001600290930201919091019052604090205490505b92915050565b60006004838154811061365f5761365f6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146136a15760405162461bcd60e51b81526004016107b690615817565b60018101546002820180546001600160a01b03909216918491906000906136d29084906001600160801b0316615a77565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060006001600160a01b0316816001600160a01b03160361374b5760405133906001600160801b03851680156108fc02916000818181858888f19350505050158015613745573d6000803e3d6000fd5b5061375f565b61375f8133856001600160801b0316614e7d565b50505050565b6000600160601b821061377757600080fd5b5090565b6137886020820182615a97565b6001830180546001600160601b0392909216600160a01b026001600160a01b039092169190911790556137c16040820160208301615ab2565b60028301805461ffff92909216600160e01b0261ffff60e01b199092169190911790556137f46060820160408301615ab2565b60038301805461ffff92909216600160c01b0261ffff60c01b199092169190911790556138276080820160608301615ab2565b82600301601a6101000a81548161ffff021916908361ffff1602179055505050565b60606002830161385761501d565b6000600185901b94508467ffffffffffffffff8111156138795761387961587e565b6040519080825280602002602001820160405280156138a2578160200160208202803683370190505b506001548454919250610100900461ffff169060008080805b8a811015613a9457841580806139955750896138d687615917565b965086815481106138e9576138e96157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015299508314155b15613a3f576000851180156139b25750436139b0888561592e565b105b15613a1d576139c1878461592e565b88836139cc81615894565b9450815181106139de576139de6157c3565b60209081029190910101526139f385856159af565b88836139fe81615894565b945081518110613a1057613a106157c3565b6020026020010181815250505b8015613a295750613a94565b6000945060009350886020015163ffffffff1692505b604089015163ffffffff16613a54818761592e565b6101008b01519096508190600681901c6603ffffffffffff1660029190911b60fc161b613a819190615990565b613a8b908661592e565b945050506138bb565b50949a9950505050505050505050565b6040805160c081018252600183015463ffffffff8082168352600160201b820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a08201526000918291829182919015613bad576001546020820151613b4191610100900461ffff169063ffffffff1661592e565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b6080830151600681901c6603ffffffffffff1660029190911b60fc161b60308460a0015165ffffffffffff16670de0b6b3a7640000613b9d9190615990565b901c945094509450945050613bbd565b6000806000809450945094509450505b9193509193565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691613c289190615acf565b6000604051808303816000865af19150503d8060008114613c65576040519150601f19603f3d011682016040523d82523d6000602084013e613c6a565b606091505b5091509150818015613c94575080511580613c94575080806020019051810190613c94919061585c565b613cec5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016107b6565b505050505050565b613cfc614fc9565b6040518061014001604052808363ffffffff168152602001613d27856000015163ffffffff16611ecf565b6001600160a01b03168152602001846020015163ffffffff168152602001846040015163ffffffff168152602001846060015163ffffffff168152602001846080015163ffffffff1681526020018460a0015162ffffff1681526020018460c0015160ff1681526020018460e0015160ff168152602001613dc58561010001516603ffffffffffff600682901c1660fc60029290921b919091161b90565b6001600160981b031690529392505050565b600060048381548110613dec57613dec6157c3565b6000918252602082206203000191909102016003810154909250613e2290655af3107a400090600160c01b900461ffff16615990565b905080341115613e71576001600160a01b0383166108fc613e438334615900565b6040518115909202916000818181858888f19350505050158015613e6b573d6000803e3d6000fd5b50613eab565b803414613eab5760405162461bcd60e51b81526020600482015260086024820152674e4f503a2166656560c01b60448201526064016107b6565b613eb481613765565b600283018054601090613ed8908490600160801b90046001600160601b0316615b0a565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505092915050565b6040805160c081018252600183015463ffffffff8082168352600160201b820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a082015260009182919015613fc3576001546020820151613f9c91610100900461ffff169063ffffffff1661592e565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b9250925050915091565b50600093849350915050565b8254602082015160e083015160009260ff9091169163ffffffff16855b82613ff682615894565b91508110801561402f575081888281548110614014576140146157c3565b600091825260209091200154600160201b900463ffffffff16145b1561406d57878181548110614046576140466157c3565b60009182526020909120015461406690600160c01b900460ff168561592e565b9350613fec565b50805b6000871180156140b75750818861408689615917565b98508881548110614099576140996157c3565b600091825260209091200154600160201b900463ffffffff16915081145b156140f5578787815481106140ce576140ce6157c3565b6000918252602090912001546140ee90600160c01b900460ff168561592e565b9350614070565b600087118061410357508082115b15614119576141128183615900565b945061411e565b600a94505b505050935093915050565b600063016e360083101561417c57600061414662249f00856159af565b905061415481612710615c10565b61415e8285615c10565b61416a90610190615990565b61417491906159af565b915050613644565b701d6329f1c35ca4bfabb9f5610000000000614199600a84615c1c565b6141a590610190615990565b6141af91906159af565b9392505050565b6040805160c081018252600183015463ffffffff808216808452600160201b8304821660208501819052600160401b840490921694840194909452600160601b820466ffffffffffffff9081166060850152600160981b8304166080840152600160d01b90910465ffffffffffff1660a0830152600284018054909390916000808061424061501d565b600087871015806143205750438c6020015161ffff168b8981548110614268576142686157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff16610100820152909550935061431d908561592e565b10155b9050808061432e5750828614155b156144ff5784156144fb576060890151600681901c6603ffffffffffff1660029190911b60fc161b600061436287876159af565b63ffffffff881660408d0152905061437981614f91565b66ffffffffffffff1660608c01526000965086955081156144d15760808b01516143de90600a908390600681901c6603ffffffffffff1660029190911b60fc161b6143c5906009615990565b6143cf919061592e565b6143d991906159af565b614f91565b66ffffffffffffff1660808c01526143fa82603083901b6159af565b9150600160301b82111561441d57614416600160301b83615900565b915061442e565b61442b82600160301b615900565b91505b600a60308c6020015163ffffffff168a6144489190615900565b6136b06144558680615990565b614461906103e8615990565b61446b91906159af565b61447591906159af565b901c8c60a0015165ffffffffffff1660096144909190615990565b61449a919061592e565b6144a491906159af565b915065ffffffffffff8211156144be5765ffffffffffff91505b65ffffffffffff821660a08c01526144ec565b60608b015166ffffffffffffff1660808c0152600060a08c01525b505063ffffffff861660208a01525b8295505b801561450b5750614575565b60408201516145209063ffffffff168661592e565b604083015161010084015191965063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b6145579190615990565b614561908561592e565b9350508561456e90615894565b9550614240565b875163ffffffff1686111561469f5785886000019063ffffffff16908163ffffffff1681525050878a60010160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060808201518160000160136101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060a082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050505b5050505050505050505050565b811561375f576001600160a01b038316614701576146c981611ecf565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015613745573d6000803e3d6000fd5b6001600160a01b0383166000908152602085905260408120805484929061472990849061592e565b909155505050505050565b60015460028301805460009283929161010090910461ffff1690838061475a8489615900565b97506000614769600185615900565b905060005b818110156147e9576001614782838361592e565b901c9350868481548110614798576147986157c3565b600091825260209091200154600160201b900463ffffffff169250828a11156147ce576147c484615894565b935083905061476e565b828a10156147e9576147df84615917565b935083915061476e565b50506000806000806147f961501d565b865b88811015614946578a8161480e81615894565b925081548110614820576148206157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff166101008201529097509150868e1061494657604082015163ffffffff169250821561494157836000036148f5578693506148fd565b868403614946575b614907838761592e565b6101008301519096508390600681901c6603ffffffffffff1660029190911b60fc161b6149349190615990565b61493e908661592e565b94505b6147fb565b505b8615614a8b578961495888615917565b9750878154811061496b5761496b6157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b8204811694840194909452600160401b81048416918301829052600160601b810484166060840152600160801b81049093166080830152600160a01b830462ffffff1660a0830152600160b81b830460ff90811660c0840152600160c01b84041660e0830152600160c81b90920466ffffffffffffff1661010082015290925090508115614a8657806020015163ffffffff16955082600003614a3a57859250614a42565b858303614a8b575b614a4c828661592e565b6101008201519095508290600681901c6603ffffffffffff1660029190911b60fc161b614a799190615990565b614a83908561592e565b93505b614948565b8415614ab857614a9b898461592e565b614aa586866159af565b9b509b5050505050505050505050611c0c565b5060009d8e9d509b505050505050505050505050565b6001600160a01b03811660009081526003602052604081205480820361364457506002546001600160a01b0383166000908152600360205260409020819055600160201b8110614b4f5760405162461bcd60e51b815260206004820152600c60248201526b4e4d3a216163636f756e747360a01b60448201526064016107b6565b6002805460018101825560008290527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace91020180546001600160a01b0319166001600160a01b03851617905592915050565b60006001600160a01b038416614bc257614bbb8383615900565b9050613102565b6001600160a01b0384166000908152602086905260409020805484811015614c025760008255614bfd863330614bf8858a615900565b613bc4565b614c0f565b614c0c8582615900565b82555b509195945050505050565b856040518061012001604052808763ffffffff1681526020014363ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018562ffffff168152602001600885901c60ff1681526020018460ff1660ff168152602001614c9084614f91565b66ffffffffffffff908116909152825460018101845560009384526020938490208351910180549484015160408501516060860151608087015160a088015160c089015160e08a0151610100909a0151909816600160c81b026001600160c81b0360ff9a8b16600160c01b0260ff60c01b199b909a16600160b81b029a909a1661ffff60b81b1962ffffff909316600160a01b0262ffffff60a01b1963ffffffff958616600160801b021666ffffffffffffff60801b19968616600160601b0263ffffffff60601b19988716600160401b029890981667ffffffffffffffff60401b19998716600160201b0267ffffffffffffffff19909f1696909b16959095179c909c1796909616979097179390931791909116179690961795909516949094179190911791909116179055505050505050565b6000546001600160a01b031615614e115760405162461bcd60e51b815260206004820152601060248201526f4e4553543a21696e697469616c697a6560801b60448201526064016107b6565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b811561375f576001600160a01b038316614701576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015613745573d6000803e3d6000fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691614ed99190615acf565b6000604051808303816000865af19150503d8060008114614f16576040519150601f19603f3d011682016040523d82523d6000602084013e614f1b565b606091505b5091509150818015614f45575080511580614f45575080806020019051810190614f45919061585c565b6108495760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016107b6565b6000805b6603ffffffffffff831115614fbb5760049290921c91614fb481615894565b9050614f95565b60069290921b909117919050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6001600160a01b038116811461507e57600080fd5b50565b60008060006060848603121561509657600080fd5b8335925060208401356150a881615069565b929592945050506040919091013590565b6000608082840312156150cb57600080fd5b50919050565b60008060a083850312156150e457600080fd5b823591506150f584602085016150b9565b90509250929050565b6000806040838503121561511157600080fd5b50508035926020909101359150565b60006020828403121561513257600080fd5b81356141af81615069565b60006020828403121561514f57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156151a357815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010161516a565b509495945050505050565b6020815281516020820152600060208301516151d560408401826001600160a01b03169052565b5060408301516001600160601b03811660608401525060608301516001600160a01b03811660808401525060808301516001600160601b03811660a08401525060a08301516001600160801b03811660c08401525060c08301516001600160601b03811660e08401525060e08301516101006152568185018361ffff169052565b840151905061012061526d8482018361ffff169052565b8401519050610140615289848201836001600160a01b03169052565b84015190506101606152a28482018363ffffffff169052565b84015190506101806152b98482018361ffff169052565b84015190506101a06152d08482018361ffff169052565b8401516101c08481015290506131026101e0840182615156565b6000806000606084860312156152ff57600080fd5b505081359360208301359350604090920135919050565b600081518084526020808501945080840160005b838110156151a35781518752958201959082019060010161532a565b60a08152600061535960a0830188615316565b90508560208301528460408301528360608301528260808301529695505050505050565b6000806040838503121561539057600080fd5b8235915060208301356001600160801b03811681146153ae57600080fd5b809150509250929050565b600080600080600060a086880312156153d157600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825282518282018190526000919060409081850190868401855b828110156154bd578151805163ffffffff9081168652878201516001600160a01b0316888701528682015181168787015260608083015182169087015260808083015182169087015260a0808301519091169086015260c08082015162ffffff169086015260e08082015160ff908116918701919091526101008083015190911690860152610120908101516001600160981b0316908501526101409093019290850190600101615411565b5091979650505050505050565b60008083601f8401126154dc57600080fd5b50813567ffffffffffffffff8111156154f457600080fd5b6020830191508360208260051b8501011115611c0c57600080fd5b6000806000806060858703121561552557600080fd5b84359350602085013567ffffffffffffffff81111561554357600080fd5b61554f878288016154ca565b909450925050604085013561556381615069565b939692955090935050565b6020815260006141af6020830184615316565b60008060006040848603121561559657600080fd5b83359250602084013567ffffffffffffffff8111156155b457600080fd5b6155c0868287016154ca565b9497909650939450505050565b6000806000806000608086880312156155e557600080fd5b85359450602086013567ffffffffffffffff81111561560357600080fd5b61560f888289016154ca565b90955093505060408601359150606086013561562a81615069565b809150509295509295909350565b6000806040838503121561564b57600080fd5b8235915060208301356153ae81615069565b6000806000806060858703121561567357600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561569857600080fd5b6156a4878288016154ca565b95989497509550505050565b6000606082840312156150cb57600080fd5b80356001600160601b03811681146156d957600080fd5b919050565b60008060008060008061010087890312156156f857600080fd5b863561570381615069565b9550615711602088016156c2565b9450604087013561572181615069565b9350606087013567ffffffffffffffff81111561573d57600080fd5b61574989828a016154ca565b909450925061575d905088608089016150b9565b90509295509295509295565b6000806040838503121561577c57600080fd5b823561578781615069565b946020939093013593505050565b600080604083850312156157a857600080fd5b82356157b381615069565b915060208301356153ae81615069565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160601b038381169083168181101561580f5761580f6157d9565b039392505050565b6020808252600e908201526d2727a69d3737ba1037b832b732b960911b604082015260600190565b60006020828403121561585157600080fd5b81516141af81615069565b60006020828403121561586e57600080fd5b815180151581146141af57600080fd5b634e487b7160e01b600052604160045260246000fd5b6000600182016158a6576158a66157d9565b5060010190565b6020808252600e908201526d139154d50e8858dbdb9d1c9858dd60921b604082015260600190565b60006001600160801b038083168185168083038211156158f7576158f76157d9565b01949350505050565b600082821015615912576159126157d9565b500390565b600081615926576159266157d9565b506000190190565b60008219821115615941576159416157d9565b500190565b6000808335601e1984360301811261595d57600080fd5b83018035915067ffffffffffffffff82111561597857600080fd5b6020019150600581901b3603821315611c0c57600080fd5b60008160001904831182151516156159aa576159aa6157d9565b500290565b6000826159cc57634e487b7160e01b600052601260045260246000fd5b500490565b61ffff8116811461507e57600080fd5b813560ff81168082146159f357600080fd5b825460ff1981168217845591506020840135615a0e816159d1565b62ffff008160081b169050808262ffffff198516171784556040850135615a34816159d1565b64ffffffffff19939093169091171760189190911b64ffff0000001617905550565b600061ffff808316818103615a6d57615a6d6157d9565b6001019392505050565b60006001600160801b038381169083168181101561580f5761580f6157d9565b600060208284031215615aa957600080fd5b6141af826156c2565b600060208284031215615ac457600080fd5b81356141af816159d1565b6000825160005b81811015615af05760208186018101518583015201615ad6565b81811115615aff576000828501525b509190910192915050565b60006001600160601b038083168185168083038211156158f7576158f76157d9565b600181815b80851115615b67578160001904821115615b4d57615b4d6157d9565b80851615615b5a57918102915b93841c9390800290615b31565b509250929050565b600082615b7e57506001613644565b81615b8b57506000613644565b8160018114615ba15760028114615bab57615bc7565b6001915050613644565b60ff841115615bbc57615bbc6157d9565b50506001821b613644565b5060208310610133831016604e8410600b8410161715615bea575081810a613644565b615bf48383615b2c565b8060001904821115615c0857615c086157d9565b029392505050565b60006141af8383615b6f565b60006141af60ff841683615b6f56fea26469706673582212200cee153871bd293e04467f2aa670731da84919fc24550faf488e9dd64550843364736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80639ba63e9e11610118578063d2a53f61116100a0578063f3a713211161006f578063f3a71321146106b2578063f3fef3a3146106d2578063f781feb3146106f2578063f7888aec14610705578063fd9b53871461072557600080fd5b8063d2a53f611461061f578063d4aa113c1461063f578063d99f05831461067f578063de0777ed1461069f57600080fd5b8063ba2d4a8f116100e7578063ba2d4a8f14610518578063c3f909d414610538578063c4d66de8146105cc578063c708ba0c146105ec578063c86fe6521461060c57600080fd5b80639ba63e9e1461047f5780639c792938146104c3578063a98e4e77146104e3578063b7e004fa146104f857600080fd5b80634353e7421161019b578063594e25b51161016a578063594e25b5146103e45780636e2f74b9146103f75780637ba3033d1461042c578063860506801461043f578063954b756f1461045f57600080fd5b80634353e74214610371578063493183541461039157806354a80f04146103b15780635938b38d146103c457600080fd5b80631c2f3e3d116101e25780631c2f3e3d146102965780631d7a4993146102d35780632a651c54146103005780632d1e4721146103315780633ac30e4b1461034457600080fd5b80630313766f14610214578063045b2f44146102365780630cdd53f6146102565780631c1b877214610276575b600080fd5b34801561022057600080fd5b5061023461022f366004615081565b610745565b005b34801561024257600080fd5b506102346102513660046150d1565b610850565b34801561026257600080fd5b506102346102713660046150fe565b6108b6565b34801561028257600080fd5b50610234610291366004615120565b610a56565b3480156102a257600080fd5b506000546102b6906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102df57600080fd5b506102f36102ee36600461513d565b610b35565b6040516102ca91906151ae565b34801561030c57600080fd5b5061032061031b3660046152ea565b610dac565b6040516102ca959493929190615346565b61023461033f36600461537d565b610e39565b34801561035057600080fd5b5061036461035f3660046153b9565b610f24565b6040516102ca91906153f4565b61038461037f36600461550f565b6111a0565b6040516102ca919061556e565b34801561039d57600080fd5b506102346103ac366004615581565b6112a1565b6103846103bf3660046155cd565b6118f9565b3480156103d057600080fd5b506102346103df366004615638565b611a2c565b6103846103f23660046155cd565b611aa7565b34801561040357600080fd5b506104176104123660046150fe565b611baa565b604080519283526020830191909152016102ca565b61023461043a36600461565d565b611c13565b34801561044b57600080fd5b506102b661045a36600461513d565b611ecf565b34801561046b57600080fd5b5061023461047a3660046156b0565b611f04565b34801561048b57600080fd5b506104b561049a366004615120565b6001600160a01b031660009081526003602052604090205490565b6040519081526020016102ca565b3480156104cf57600080fd5b506104b56104de36600461513d565b611fbc565b3480156104ef57600080fd5b506002546104b5565b34801561050457600080fd5b506104176105133660046150fe565b612160565b34801561052457600080fd5b506102346105333660046156de565b612265565b34801561054457600080fd5b5061059b6040805160608101825260008082526020820181905291810191909152506040805160608101825260015460ff8116825261ffff6101008204811660208401526301000000909104169181019190915290565b60408051825160ff16815260208084015161ffff9081169183019190915292820151909216908201526060016102ca565b3480156105d857600080fd5b506102346105e7366004615120565b6125b0565b3480156105f857600080fd5b50610234610607366004615638565b6125c8565b61023461061a3660046153b9565b61278f565b34801561062b57600080fd5b5061038461063a3660046152ea565b61309c565b34801561064b57600080fd5b5061065f61065a3660046150fe565b61310a565b6040805194855260208501939093529183015260608201526080016102ca565b34801561068b57600080fd5b506104b561069a36600461513d565b613182565b6103846106ad36600461550f565b6131c3565b3480156106be57600080fd5b506104176106cd3660046152ea565b613302565b3480156106de57600080fd5b506102346106ed366004615769565b613375565b6103846107003660046155cd565b6133e7565b34801561071157600080fd5b506104b5610720366004615795565b6135ea565b34801561073157600080fd5b5061023461074036600461537d565b61364a565b60006004848154811061075a5761075a6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146107bf5760405162461bcd60e51b815260206004820152600b60248201526a2727a69d10b7b832b732b960a91b60448201526064015b60405180910390fd5b6107c882613765565b6002820180546010906107ec908490600160801b90046001600160601b03166157ef565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550826001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610849573d6000803e3d6000fd5b5050505050565b600060048381548110610865576108656157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146108a75760405162461bcd60e51b81526004016107b690615817565b6108b1818361377b565b505050565b6000600483815481106108cb576108cb6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461092b5760405162461bcd60e51b815260206004820152600b60248201526a2727a69d10b7b832b732b960a91b60448201526064016107b6565b61093482613765565b600282018054601090610958908490600160801b90046001600160601b03166157ef565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555060008054906101000a90046001600160a01b03166001600160a01b0316638df18bb56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061583f565b6001600160a01b031663c840ff2683856040518363ffffffff1660e01b8152600401610a1f91815260200190565b6000604051808303818588803b158015610a3857600080fd5b505af1158015610a4c573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633811480610ada57506040516391e1472b60e01b8152336004820152600060248201526001600160a01b038216906391e1472b90604401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada919061585c565b610b125760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016107b6565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516101c08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a08201526004805491929184908110610bbb57610bbb6157c3565b6000918252602082206203000191909102016002810154909250600160f01b900461ffff16908167ffffffffffffffff811115610bfa57610bfa61587e565b604051908082528060200260200182016040528015610c3f57816020015b6040805180820190915260008082526020820152815260200190600190039081610c185790505b50905060005b82811015610ccd576000846004018261ffff8110610c6557610c656157c3565b604080518082019091526003919091029190910180546001600160a01b0316825260028101546001600160601b031660208301528451909250849084908110610cb057610cb06157c3565b60200260200101819052505080610cc690615894565b9050610c45565b50604080516101c08101825295865283546001600160a01b0380821660208901526001600160601b03600160a01b92839004811693890193909352600186015480821660608a01528290048316608089015260028601546001600160801b03811660a08a0152600160801b810490931660c089015261ffff600160e01b8404811660e08a0152600160f01b909304831661010089015260039095015494851661012088015263ffffffff90850416610140870152600160c01b84048116610160870152600160d01b909304909216610180850152506101a08301525090565b60606000808080333214610dd25760405162461bcd60e51b81526004016107b6906158ad565b600060048981548110610de757610de76157c3565b906000526020600020906203000102016004018861ffff8110610e0c57610e0c6157c3565b600302019050610e1c8188613849565b9550610e2781613aa4565b989c929b509099509750945050505050565b600060048381548110610e4e57610e4e6157c3565b60009182526020909120620300019091020160018101549091506001600160a01b031680610ec557826001600160801b03163414610ec05760405162461bcd60e51b815260206004820152600f60248201526e2727a69d3b30bab63a1032b93937b960891b60448201526064016107b6565b610eda565b610eda813330866001600160801b0316613bc4565b600282018054849190600090610efa9084906001600160801b03166158d5565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555050505050565b6060333214610f455760405162461bcd60e51b81526004016107b6906158ad565b600060048781548110610f5a57610f5a6157c3565b906000526020600020906203000102016004018661ffff8110610f7f57610f7f6157c3565b60030201600201905060008467ffffffffffffffff811115610fa357610fa361587e565b604051908082528060200260200182016040528015610fdc57816020015b610fc9614fc9565b815260200190600190039081610fc15790505b508254909150600085810361111f576000610ff78984615900565b90506000888211611009576000611013565b6110138983615900565b90505b808211156111185761102782615917565b91506110eb86838154811061103e5761103e6157c3565b60009182526020918290206040805161012081018252919092015463ffffffff8082168352600160201b8204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b9091041661010082015283613cf4565b85846110f681615894565b955081518110611108576111086157c3565b6020026020010181905250611016565b5050611192565b87600061112c898361592e565b9050838111156111395750825b8082101561118f5761115686838154811061103e5761103e6157c3565b858461116181615894565b955081518110611173576111736157c3565b60200260200101819052508161118890615894565b9150611139565b50505b509098975050505050505050565b606060006111ae8684613dd7565b6004019050600184901b8067ffffffffffffffff8111156111d1576111d161587e565b6040519080825280602002602001820160405280156111fa578160200160208202803683370190505b5092505b80156112975761120f600282615900565b905061124c828787600185901c81811061122b5761122b6157c3565b9050602002013561ffff8110611243576112436157c3565b60030201613f03565b84838151811061125e5761125e6157c3565b6020026020010185846001611273919061592e565b81518110611283576112836157c3565b6020908102919091010191909152526111fe565b5050949350505050565b6040805160608101825260015460ff8116825261ffff610100820481166020840152630100000090910416918101919091526004805460009190869081106112eb576112eb6157c3565b90600052602060002090620300010201905060008060008060006002600081548110611319576113196157c3565b60009182526020918290206040805160608101825260018b810154600160a01b908190046001600160601b0316835260038d015490810463ffffffff1696830196909652600160d01b90950461ffff1691810191909152600292909202019091019150885b80156118215760006004890161139383615917565b92508261ffff81106113a7576113a76157c3565b6003020190506000808d8d858181106113c2576113c26157c3565b90506020028101906113d49190615946565b9150505b80156117f75760008e8e868181106113f2576113f26157c3565b90506020028101906114049190615946565b61140d84615917565b93508381811061141f5761141f6157c3565b905060200201359050600084600201828154811061143f5761143f6157c3565b600091825260208083206040805161012081018252939091015463ffffffff8082168552600160201b8204811693850193909352600160401b8104831691840191909152600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015291508c900361152657806000015163ffffffff169b5060028c8154811061150e5761150e6157c3565b90600052602060002090600202016001019750611568565b805163ffffffff168c146115685760405162461bcd60e51b815260206004820152600960248201526827269d10b6b4b732b960b91b60448201526064016107b6565b60008c1180156115945750438e6020015161ffff16826020015163ffffffff16611592919061592e565b105b156117f057856000036116395760e081015160ff168015611637576000806115c0886002018686613fcf565b8b516020808e0151908801519395509193506101909284926115f6916115ec919063ffffffff16615900565b60408f0151614129565b6116008787615990565b61160a9190615990565b6116149190615990565b61161e91906159af565b61162891906159af565b611632908f61592e565b9d5050505b505b60a081015161164d9062ffffff168b61592e565b9950806060015163ffffffff1689611665919061592e565b6080820151610100830151919a5063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b61169c9190615990565b6116a6908561592e565b60008083526060830181905260808301526002860180549195508291849081106116d2576116d26157c3565b60009182526020918290208351910180549284015160408501516060860151608087015160a088015160c089015160e08a0151610100909a015166ffffffffffffff16600160c81b026001600160c81b0360ff9b8c16600160c01b0260ff60c01b199c909316600160b81b029b909b1661ffff60b81b1962ffffff909416600160a01b0262ffffff60a01b1963ffffffff968716600160801b021666ffffffffffffff60801b19978716600160601b0263ffffffff60601b19998816600160401b029990991667ffffffffffffffff60401b199a8816600160201b0267ffffffffffffffff19909e1697909c16969096179b909b17979097169890981794909417929092161795909517949094161792909217929092169190911790555b50506113d8565b506118028b836141b6565b815461181a9086906001600160a01b0316838c6146ac565b505061137e565b5086546118559083906001600160a01b0381169061184f90600160a01b90046001600160601b031687615990565b896146ac565b611881827304abeda201850ac0124161f037efd70c74ddc74c61184f87683635c9adc5dea00000615990565b60028701546001600160801b03168086111561189b578095505b6118a58682615900565b6002890180546fffffffffffffffffffffffffffffffff19166001600160601b039290921691909117905560018801546118eb9084906001600160a01b0316888a6146ac565b505050505050505050505050565b606060006119078784613dd7565b6004019050600184901b600061191d8288615990565b90508067ffffffffffffffff8111156119385761193861587e565b604051908082528060200260200182016040528015611961578160200160208202803683370190505b5093505b8015611a20576119758282615900565b905060006119ba848a8a61198987876159af565b818110611998576119986157c3565b9050602002013561ffff81106119b0576119b06157c3565b6003020188613849565b905060005b83811015611a19578181815181106119d9576119d96157c3565b60200260200101518682856119ee919061592e565b815181106119fe576119fe6157c3565b6020908102919091010152611a1281615894565b90506119bf565b5050611965565b50505095945050505050565b600060048381548110611a4157611a416157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b03163314611a835760405162461bcd60e51b81526004016107b690615817565b60030180546001600160a01b0319166001600160a01b039290921691909117905550565b60606000611ab58784613dd7565b6004019050600185901b8067ffffffffffffffff811115611ad857611ad861587e565b604051908082528060200260200182016040528015611b01578160200160208202803683370190505b5092505b8015611b9f57611b16600282615900565b9050611b54828888600185901c818110611b3257611b326157c3565b9050602002013561ffff8110611b4a57611b4a6157c3565b6003020186614734565b848381518110611b6657611b666157c3565b6020026020010185846001611b7b919061592e565b81518110611b8b57611b8b6157c3565b602090810291909101019190915252611b05565b505095945050505050565b600080333214611bcc5760405162461bcd60e51b81526004016107b6906158ad565b611c0760048581548110611be257611be26157c3565b906000526020600020906203000102016004018461ffff8110611243576112436157c3565b915091505b9250929050565b604080516060810182526001805460ff8116835261ffff61010082048116602085015263010000009091041692820192909252908414611c825760405162461bcd60e51b815260206004820152600a6024820152694e4f4d3a217363616c6560b01b60448201526064016107b6565b600060048681548110611c9757611c976157c3565b9060005260206000209062030001020190506000611cb433614ace565b9050600060028281548110611ccb57611ccb6157c3565b60009182526020909120600285810154604088015160019290940290920101925061ffff600160f01b9091048116913491611d3c9185917304abeda201850ac0124161f037efd70c74ddc74c91611d23911686615990565b611d3690683635c9adc5dea00000615990565b84614ba1565b8554909150611d789084906001600160a01b038116908c90611d6e90600160a01b90046001600160601b031687615990565b611d369190615990565b90505b8115611ec357600060048601611d9084615917565b93508361ffff8110611da457611da46157c3565b6003020190506000898985818110611dbe57611dbe6157c3565b90506020020135905060008111611e095760405162461bcd60e51b815260206004820152600f60248201526e1393d34e88595c5d5a5d985b195b9d608a1b60448201526064016107b6565b8154611e2a9086906001600160a01b0316611e24848f615990565b86614ba1565b9250611e3688836141b6565b6002820154604080518e81526020810187905233818301526060810192909252608082018d905260a08201839052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a1611ebc82600201878d8b6040015161ffff1688600014611eb0576000611eb3565b60015b60ff1686614c1a565b5050611d7b565b50505050505050505050565b600060028281548110611ee457611ee46157c3565b60009182526020909120600290910201546001600160a01b031692915050565b600080546040516391e1472b60e01b815233600482015260248101929092526001600160a01b0316906391e1472b90604401602060405180830381865afa158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f77919061585c565b611faf5760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016107b6565b8060016108b182826159e1565b60008060048381548110611fd257611fd26157c3565b60009182526020909120620300019091020160068101805491925090600a5b81156120ea5760008361200384615917565b93508381548110612016576120166157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b8204811694840194909452600160401b8104841691830191909152600160601b810483166060830152600160801b81049092166080820152600160a01b820462ffffff1660a0820152600160b81b820460ff90811660c0830152600160c01b83041660e08201819052600160c81b90920466ffffffffffffff166101008201529150156120e45760208101516120dc9063ffffffff1643615900565b9150506120ea565b50611ff1565b6003840154610190906121239061210e90600160a01b900463ffffffff1643615900565b6003870154600160d01b900461ffff16614129565b600186015461214290600160a01b90046001600160601b031684615990565b61214c9190615990565b61215691906159af565b9695505050505050565b600080600060048581548110612178576121786157c3565b60009182526020822060046203000190920201019060030201600201905061225981858387815481106121ad576121ad6157c3565b60009182526020918290206040805161012081018252919092015463ffffffff8082168352600160201b8204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b90910416610100820152613fcf565b92509250509250929050565b600454604080519182526001600160a01b0388811660208401526001600160601b0388168383015286166060830152517fd5d675c43c23a6c1e3ad060a603f30590f57c52d5e4a71994bf009848e8fe9e19181900360800190a16004805460018101825560009182526001600160a01b03888116600160a01b6001600160601b038a168102919091177f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b620300019094029384019081557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c840180546001600160a01b031916938a16939093179092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d8301805461ffff60e01b16600160f01b61ffff8916021790557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e90920180546001600160c01b0319163363ffffffff60a01b1916174363ffffffff1690930292909217909155905b8381101561259c578484828181106123f8576123f86157c3565b905060200201602081019061240d9190615120565b6001600160a01b0316886001600160a01b03160361246d5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016107b6565b60005b8181101561252c5785858281811061248a5761248a6157c3565b905060200201602081019061249f9190615120565b6001600160a01b03168686848181106124ba576124ba6157c3565b90506020020160208101906124cf9190615120565b6001600160a01b03160361251c5760405162461bcd60e51b81526020600482015260146024820152731393d34e9d1bdad95b881c995a5d195c985d195960621b60448201526064016107b6565b61252581615894565b9050612470565b5084848281811061253f5761253f6157c3565b90506020020160208101906125549190615120565b826004018261ffff811061256a5761256a6157c3565b6003020180546001600160a01b0319166001600160a01b039290921691909117905561259581615894565b90506123de565b506125a7818361377b565b50505050505050565b6125b981614dc5565b50600280546001018155600052565b6000600483815481106125dd576125dd6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461261f5760405162461bcd60e51b81526004016107b690615817565b80546001600160a01b0380841691160361267b5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016107b6565b6002810154600160f01b900461ffff1660005b8181101561271857836001600160a01b0316836004018261ffff81106126b6576126b66157c3565b60030201546001600160a01b0316036127085760405162461bcd60e51b81526020600482015260146024820152731393d34e9d1bdad95b881c995a5d195c985d195960621b60448201526064016107b6565b61271181615894565b905061268e565b5082826004018261ffff8110612730576127306157c3565b6003020180546001600160a01b0319166001600160a01b0392909216919091179055600282018054601e9061276f90600160f01b900461ffff16615a56565b91906101000a81548161ffff021916908361ffff16021790555050505050565b6040805160608101825260015460ff8116825261ffff61010082048116602084015263010000009091041691810191909152826127fc5760405162461bcd60e51b815260206004820152600b60248201526a4e4d3a2174616b654e756d60a81b60448201526064016107b6565b600082116128385760405162461bcd60e51b81526020600482015260096024820152684e4d3a21707269636560b81b60448201526064016107b6565b60006004878154811061284d5761284d6157c3565b9060005260206000209062030001020190506000816004016201000088106128815761287c6201000089615900565b612883565b875b61ffff8110612894576128946157c3565b60030201905060008160020187815481106128b1576128b16157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116848601819052600160401b8304821693850193909352600160601b820481166060850152600160801b8204166080840152600160a01b810462ffffff1660a0840152600160b81b810460ff90811660c0850152600160c01b82041660e0840152600160c81b900466ffffffffffffff1661010083015291860151909250439161296c9161ffff169061592e565b10156129a65760405162461bcd60e51b81526020600482015260096024820152684e4d3a21737461746560b81b60448201526064016107b6565b85816040015163ffffffff166129bc9190615900565b63ffffffff16604082015260006129d233614ace565b90506000826080015163ffffffff16836060015163ffffffff166129f6919061592e565b60a0840151612a0e9062ffffff1660028b901b615990565b612a1891906159af565b60c0840151909150889060ff90811690811015612a4f57875160ff16811015612a4357600182901b91505b612a4c81615894565b90505b600060028581548110612a6457612a646157c3565b906000526020600020906002020160010190506000349050620100008e1015612ce7578b876060015163ffffffff16612a9d9190615900565b63ffffffff90811660608901526080880151612abb918e911661592e565b63ffffffff1660808801526002880180548891908f908110612adf57612adf6157c3565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612c8d828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88611d6e9190615900565b8854610100890151919250612ce09184916001600160a01b0316908f90600681901c6603ffffffffffff1660029190911b60fc161b612ccc9190615990565b612cd68f89615990565b611d36919061592e565b9050612fac565b612cf4620100008f615900565b9d508b876060015163ffffffff16612d0c919061592e565b63ffffffff90811660608901526080880151612d2a918e9116615900565b63ffffffff1660808801526002880180548891908f908110612d4e57612d4e6157c3565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612efc828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88611d6e919061592e565b6101008801519091506000908d90600681901c6603ffffffffffff1660029190911b60fc161b612f2c9190615990565b905080612f398d87615990565b1115612f7f57612f78838a60000160009054906101000a90046001600160a01b0316838f89612f689190615990565b612f729190615900565b85614ba1565b9150612faa565b8854612faa9084906001600160a01b0316612f9a8f89615990565b612fa49085615900565b33614e33565b505b612fd8827304abeda201850ac0124161f037efd70c74ddc74c611d3688683635c9adc5dea00000615990565b905080156130135760405162461bcd60e51b81526020600482015260086024820152674e4f4d3a2166656560c01b60448201526064016107b6565b505061301f88876141b6565b6002860154604080518f8152602081018f9052338183015260608101929092526080820184905260a082018b9052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a161308d86600201858486600886901b8e614c1a565b50505050505050505050505050565b60603332146130bd5760405162461bcd60e51b81526004016107b6906158ad565b613102600485815481106130d3576130d36157c3565b906000526020600020906203000102016004018461ffff81106130f8576130f86157c3565b6003020183613849565b949350505050565b600080808033321461312e5760405162461bcd60e51b81526004016107b6906158ad565b61317260048781548110613144576131446157c3565b906000526020600020906203000102016004018661ffff8110613169576131696157c3565b60030201613aa4565b9299919850965090945092505050565b600060048281548110613197576131976157c3565b60009182526020909120620300019091020160020154600160801b90046001600160601b031692915050565b606060006131d18684613dd7565b6004019050600284901b8067ffffffffffffffff8111156131f4576131f461587e565b60405190808252806020026020018201604052801561321d578160200160208202803683370190505b5092505b801561129757613232600482615900565b9050613266828787600285901c81811061324e5761324e6157c3565b9050602002013561ffff8110613169576131696157c3565b868581518110613278576132786157c3565b602002602001018786600161328d919061592e565b8151811061329d5761329d6157c3565b60200260200101888760026132b2919061592e565b815181106132c2576132c26157c3565b60200260200101898860036132d7919061592e565b815181106132e7576132e76157c3565b60209081029190910101939093529290915291905252613221565b6000803332146133245760405162461bcd60e51b81526004016107b6906158ad565b6133696004868154811061333a5761333a6157c3565b906000526020600020906203000102016004018561ffff811061335f5761335f6157c3565b6003020184614734565b91509150935093915050565b3360009081526003602052604081205460028054909190811061339a5761339a6157c3565b600091825260208083206001600160a01b03871684526001600290930201919091019052604081208054909250839183916133d6908490615900565b909155506108b19050833384614e7d565b606060006133f58784613dd7565b60040190506000600185901b600461340d919061592e565b9050600061341b8288615990565b90508067ffffffffffffffff8111156134365761343661587e565b60405190808252806020026020018201604052801561345f578160200160208202803683370190505b5093505b8015611a20576134738282615900565b9050600083898961348486866159af565b818110613493576134936157c3565b9050602002013561ffff81106134ab576134ab6157c3565b60030201905060006134bd8289613849565b905060005b846134ce82600461592e565b1015613526578181815181106134e6576134e66157c3565b60200260200101518782866134fb919061592e565b8151811061350b5761350b6157c3565b602090810291909101015261351f81615894565b90506134c2565b5060006004613535868661592e565b61353f9190615900565b905061354a83613aa4565b8a858151811061355c5761355c6157c3565b602002602001018b866001613571919061592e565b81518110613581576135816157c3565b602002602001018c876002613596919061592e565b815181106135a6576135a66157c3565b602002602001018d8860036135bb919061592e565b815181106135cb576135cb6157c3565b6020908102919091010193909352929091529190525250613463915050565b6001600160a01b038116600090815260036020526040812054600280549091908110613618576136186157c3565b600091825260208083206001600160a01b03871684526001600290930201919091019052604090205490505b92915050565b60006004838154811061365f5761365f6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146136a15760405162461bcd60e51b81526004016107b690615817565b60018101546002820180546001600160a01b03909216918491906000906136d29084906001600160801b0316615a77565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060006001600160a01b0316816001600160a01b03160361374b5760405133906001600160801b03851680156108fc02916000818181858888f19350505050158015613745573d6000803e3d6000fd5b5061375f565b61375f8133856001600160801b0316614e7d565b50505050565b6000600160601b821061377757600080fd5b5090565b6137886020820182615a97565b6001830180546001600160601b0392909216600160a01b026001600160a01b039092169190911790556137c16040820160208301615ab2565b60028301805461ffff92909216600160e01b0261ffff60e01b199092169190911790556137f46060820160408301615ab2565b60038301805461ffff92909216600160c01b0261ffff60c01b199092169190911790556138276080820160608301615ab2565b82600301601a6101000a81548161ffff021916908361ffff1602179055505050565b60606002830161385761501d565b6000600185901b94508467ffffffffffffffff8111156138795761387961587e565b6040519080825280602002602001820160405280156138a2578160200160208202803683370190505b506001548454919250610100900461ffff169060008080805b8a811015613a9457841580806139955750896138d687615917565b965086815481106138e9576138e96157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015299508314155b15613a3f576000851180156139b25750436139b0888561592e565b105b15613a1d576139c1878461592e565b88836139cc81615894565b9450815181106139de576139de6157c3565b60209081029190910101526139f385856159af565b88836139fe81615894565b945081518110613a1057613a106157c3565b6020026020010181815250505b8015613a295750613a94565b6000945060009350886020015163ffffffff1692505b604089015163ffffffff16613a54818761592e565b6101008b01519096508190600681901c6603ffffffffffff1660029190911b60fc161b613a819190615990565b613a8b908661592e565b945050506138bb565b50949a9950505050505050505050565b6040805160c081018252600183015463ffffffff8082168352600160201b820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a08201526000918291829182919015613bad576001546020820151613b4191610100900461ffff169063ffffffff1661592e565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b6080830151600681901c6603ffffffffffff1660029190911b60fc161b60308460a0015165ffffffffffff16670de0b6b3a7640000613b9d9190615990565b901c945094509450945050613bbd565b6000806000809450945094509450505b9193509193565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691613c289190615acf565b6000604051808303816000865af19150503d8060008114613c65576040519150601f19603f3d011682016040523d82523d6000602084013e613c6a565b606091505b5091509150818015613c94575080511580613c94575080806020019051810190613c94919061585c565b613cec5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016107b6565b505050505050565b613cfc614fc9565b6040518061014001604052808363ffffffff168152602001613d27856000015163ffffffff16611ecf565b6001600160a01b03168152602001846020015163ffffffff168152602001846040015163ffffffff168152602001846060015163ffffffff168152602001846080015163ffffffff1681526020018460a0015162ffffff1681526020018460c0015160ff1681526020018460e0015160ff168152602001613dc58561010001516603ffffffffffff600682901c1660fc60029290921b919091161b90565b6001600160981b031690529392505050565b600060048381548110613dec57613dec6157c3565b6000918252602082206203000191909102016003810154909250613e2290655af3107a400090600160c01b900461ffff16615990565b905080341115613e71576001600160a01b0383166108fc613e438334615900565b6040518115909202916000818181858888f19350505050158015613e6b573d6000803e3d6000fd5b50613eab565b803414613eab5760405162461bcd60e51b81526020600482015260086024820152674e4f503a2166656560c01b60448201526064016107b6565b613eb481613765565b600283018054601090613ed8908490600160801b90046001600160601b0316615b0a565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505092915050565b6040805160c081018252600183015463ffffffff8082168352600160201b820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a082015260009182919015613fc3576001546020820151613f9c91610100900461ffff169063ffffffff1661592e565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b9250925050915091565b50600093849350915050565b8254602082015160e083015160009260ff9091169163ffffffff16855b82613ff682615894565b91508110801561402f575081888281548110614014576140146157c3565b600091825260209091200154600160201b900463ffffffff16145b1561406d57878181548110614046576140466157c3565b60009182526020909120015461406690600160c01b900460ff168561592e565b9350613fec565b50805b6000871180156140b75750818861408689615917565b98508881548110614099576140996157c3565b600091825260209091200154600160201b900463ffffffff16915081145b156140f5578787815481106140ce576140ce6157c3565b6000918252602090912001546140ee90600160c01b900460ff168561592e565b9350614070565b600087118061410357508082115b15614119576141128183615900565b945061411e565b600a94505b505050935093915050565b600063016e360083101561417c57600061414662249f00856159af565b905061415481612710615c10565b61415e8285615c10565b61416a90610190615990565b61417491906159af565b915050613644565b701d6329f1c35ca4bfabb9f5610000000000614199600a84615c1c565b6141a590610190615990565b6141af91906159af565b9392505050565b6040805160c081018252600183015463ffffffff808216808452600160201b8304821660208501819052600160401b840490921694840194909452600160601b820466ffffffffffffff9081166060850152600160981b8304166080840152600160d01b90910465ffffffffffff1660a0830152600284018054909390916000808061424061501d565b600087871015806143205750438c6020015161ffff168b8981548110614268576142686157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff16610100820152909550935061431d908561592e565b10155b9050808061432e5750828614155b156144ff5784156144fb576060890151600681901c6603ffffffffffff1660029190911b60fc161b600061436287876159af565b63ffffffff881660408d0152905061437981614f91565b66ffffffffffffff1660608c01526000965086955081156144d15760808b01516143de90600a908390600681901c6603ffffffffffff1660029190911b60fc161b6143c5906009615990565b6143cf919061592e565b6143d991906159af565b614f91565b66ffffffffffffff1660808c01526143fa82603083901b6159af565b9150600160301b82111561441d57614416600160301b83615900565b915061442e565b61442b82600160301b615900565b91505b600a60308c6020015163ffffffff168a6144489190615900565b6136b06144558680615990565b614461906103e8615990565b61446b91906159af565b61447591906159af565b901c8c60a0015165ffffffffffff1660096144909190615990565b61449a919061592e565b6144a491906159af565b915065ffffffffffff8211156144be5765ffffffffffff91505b65ffffffffffff821660a08c01526144ec565b60608b015166ffffffffffffff1660808c0152600060a08c01525b505063ffffffff861660208a01525b8295505b801561450b5750614575565b60408201516145209063ffffffff168661592e565b604083015161010084015191965063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b6145579190615990565b614561908561592e565b9350508561456e90615894565b9550614240565b875163ffffffff1686111561469f5785886000019063ffffffff16908163ffffffff1681525050878a60010160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060808201518160000160136101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060a082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050505b5050505050505050505050565b811561375f576001600160a01b038316614701576146c981611ecf565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015613745573d6000803e3d6000fd5b6001600160a01b0383166000908152602085905260408120805484929061472990849061592e565b909155505050505050565b60015460028301805460009283929161010090910461ffff1690838061475a8489615900565b97506000614769600185615900565b905060005b818110156147e9576001614782838361592e565b901c9350868481548110614798576147986157c3565b600091825260209091200154600160201b900463ffffffff169250828a11156147ce576147c484615894565b935083905061476e565b828a10156147e9576147df84615917565b935083915061476e565b50506000806000806147f961501d565b865b88811015614946578a8161480e81615894565b925081548110614820576148206157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff166101008201529097509150868e1061494657604082015163ffffffff169250821561494157836000036148f5578693506148fd565b868403614946575b614907838761592e565b6101008301519096508390600681901c6603ffffffffffff1660029190911b60fc161b6149349190615990565b61493e908661592e565b94505b6147fb565b505b8615614a8b578961495888615917565b9750878154811061496b5761496b6157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b8204811694840194909452600160401b81048416918301829052600160601b810484166060840152600160801b81049093166080830152600160a01b830462ffffff1660a0830152600160b81b830460ff90811660c0840152600160c01b84041660e0830152600160c81b90920466ffffffffffffff1661010082015290925090508115614a8657806020015163ffffffff16955082600003614a3a57859250614a42565b858303614a8b575b614a4c828661592e565b6101008201519095508290600681901c6603ffffffffffff1660029190911b60fc161b614a799190615990565b614a83908561592e565b93505b614948565b8415614ab857614a9b898461592e565b614aa586866159af565b9b509b5050505050505050505050611c0c565b5060009d8e9d509b505050505050505050505050565b6001600160a01b03811660009081526003602052604081205480820361364457506002546001600160a01b0383166000908152600360205260409020819055600160201b8110614b4f5760405162461bcd60e51b815260206004820152600c60248201526b4e4d3a216163636f756e747360a01b60448201526064016107b6565b6002805460018101825560008290527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace91020180546001600160a01b0319166001600160a01b03851617905592915050565b60006001600160a01b038416614bc257614bbb8383615900565b9050613102565b6001600160a01b0384166000908152602086905260409020805484811015614c025760008255614bfd863330614bf8858a615900565b613bc4565b614c0f565b614c0c8582615900565b82555b509195945050505050565b856040518061012001604052808763ffffffff1681526020014363ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018562ffffff168152602001600885901c60ff1681526020018460ff1660ff168152602001614c9084614f91565b66ffffffffffffff908116909152825460018101845560009384526020938490208351910180549484015160408501516060860151608087015160a088015160c089015160e08a0151610100909a0151909816600160c81b026001600160c81b0360ff9a8b16600160c01b0260ff60c01b199b909a16600160b81b029a909a1661ffff60b81b1962ffffff909316600160a01b0262ffffff60a01b1963ffffffff958616600160801b021666ffffffffffffff60801b19968616600160601b0263ffffffff60601b19988716600160401b029890981667ffffffffffffffff60401b19998716600160201b0267ffffffffffffffff19909f1696909b16959095179c909c1796909616979097179390931791909116179690961795909516949094179190911791909116179055505050505050565b6000546001600160a01b031615614e115760405162461bcd60e51b815260206004820152601060248201526f4e4553543a21696e697469616c697a6560801b60448201526064016107b6565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b811561375f576001600160a01b038316614701576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015613745573d6000803e3d6000fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691614ed99190615acf565b6000604051808303816000865af19150503d8060008114614f16576040519150601f19603f3d011682016040523d82523d6000602084013e614f1b565b606091505b5091509150818015614f45575080511580614f45575080806020019051810190614f45919061585c565b6108495760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016107b6565b6000805b6603ffffffffffff831115614fbb5760049290921c91614fb481615894565b9050614f95565b60069290921b909117919050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6001600160a01b038116811461507e57600080fd5b50565b60008060006060848603121561509657600080fd5b8335925060208401356150a881615069565b929592945050506040919091013590565b6000608082840312156150cb57600080fd5b50919050565b60008060a083850312156150e457600080fd5b823591506150f584602085016150b9565b90509250929050565b6000806040838503121561511157600080fd5b50508035926020909101359150565b60006020828403121561513257600080fd5b81356141af81615069565b60006020828403121561514f57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156151a357815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010161516a565b509495945050505050565b6020815281516020820152600060208301516151d560408401826001600160a01b03169052565b5060408301516001600160601b03811660608401525060608301516001600160a01b03811660808401525060808301516001600160601b03811660a08401525060a08301516001600160801b03811660c08401525060c08301516001600160601b03811660e08401525060e08301516101006152568185018361ffff169052565b840151905061012061526d8482018361ffff169052565b8401519050610140615289848201836001600160a01b03169052565b84015190506101606152a28482018363ffffffff169052565b84015190506101806152b98482018361ffff169052565b84015190506101a06152d08482018361ffff169052565b8401516101c08481015290506131026101e0840182615156565b6000806000606084860312156152ff57600080fd5b505081359360208301359350604090920135919050565b600081518084526020808501945080840160005b838110156151a35781518752958201959082019060010161532a565b60a08152600061535960a0830188615316565b90508560208301528460408301528360608301528260808301529695505050505050565b6000806040838503121561539057600080fd5b8235915060208301356001600160801b03811681146153ae57600080fd5b809150509250929050565b600080600080600060a086880312156153d157600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825282518282018190526000919060409081850190868401855b828110156154bd578151805163ffffffff9081168652878201516001600160a01b0316888701528682015181168787015260608083015182169087015260808083015182169087015260a0808301519091169086015260c08082015162ffffff169086015260e08082015160ff908116918701919091526101008083015190911690860152610120908101516001600160981b0316908501526101409093019290850190600101615411565b5091979650505050505050565b60008083601f8401126154dc57600080fd5b50813567ffffffffffffffff8111156154f457600080fd5b6020830191508360208260051b8501011115611c0c57600080fd5b6000806000806060858703121561552557600080fd5b84359350602085013567ffffffffffffffff81111561554357600080fd5b61554f878288016154ca565b909450925050604085013561556381615069565b939692955090935050565b6020815260006141af6020830184615316565b60008060006040848603121561559657600080fd5b83359250602084013567ffffffffffffffff8111156155b457600080fd5b6155c0868287016154ca565b9497909650939450505050565b6000806000806000608086880312156155e557600080fd5b85359450602086013567ffffffffffffffff81111561560357600080fd5b61560f888289016154ca565b90955093505060408601359150606086013561562a81615069565b809150509295509295909350565b6000806040838503121561564b57600080fd5b8235915060208301356153ae81615069565b6000806000806060858703121561567357600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561569857600080fd5b6156a4878288016154ca565b95989497509550505050565b6000606082840312156150cb57600080fd5b80356001600160601b03811681146156d957600080fd5b919050565b60008060008060008061010087890312156156f857600080fd5b863561570381615069565b9550615711602088016156c2565b9450604087013561572181615069565b9350606087013567ffffffffffffffff81111561573d57600080fd5b61574989828a016154ca565b909450925061575d905088608089016150b9565b90509295509295509295565b6000806040838503121561577c57600080fd5b823561578781615069565b946020939093013593505050565b600080604083850312156157a857600080fd5b82356157b381615069565b915060208301356153ae81615069565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160601b038381169083168181101561580f5761580f6157d9565b039392505050565b6020808252600e908201526d2727a69d3737ba1037b832b732b960911b604082015260600190565b60006020828403121561585157600080fd5b81516141af81615069565b60006020828403121561586e57600080fd5b815180151581146141af57600080fd5b634e487b7160e01b600052604160045260246000fd5b6000600182016158a6576158a66157d9565b5060010190565b6020808252600e908201526d139154d50e8858dbdb9d1c9858dd60921b604082015260600190565b60006001600160801b038083168185168083038211156158f7576158f76157d9565b01949350505050565b600082821015615912576159126157d9565b500390565b600081615926576159266157d9565b506000190190565b60008219821115615941576159416157d9565b500190565b6000808335601e1984360301811261595d57600080fd5b83018035915067ffffffffffffffff82111561597857600080fd5b6020019150600581901b3603821315611c0c57600080fd5b60008160001904831182151516156159aa576159aa6157d9565b500290565b6000826159cc57634e487b7160e01b600052601260045260246000fd5b500490565b61ffff8116811461507e57600080fd5b813560ff81168082146159f357600080fd5b825460ff1981168217845591506020840135615a0e816159d1565b62ffff008160081b169050808262ffffff198516171784556040850135615a34816159d1565b64ffffffffff19939093169091171760189190911b64ffff0000001617905550565b600061ffff808316818103615a6d57615a6d6157d9565b6001019392505050565b60006001600160801b038381169083168181101561580f5761580f6157d9565b600060208284031215615aa957600080fd5b6141af826156c2565b600060208284031215615ac457600080fd5b81356141af816159d1565b6000825160005b81811015615af05760208186018101518583015201615ad6565b81811115615aff576000828501525b509190910192915050565b60006001600160601b038083168185168083038211156158f7576158f76157d9565b600181815b80851115615b67578160001904821115615b4d57615b4d6157d9565b80851615615b5a57918102915b93841c9390800290615b31565b509250929050565b600082615b7e57506001613644565b81615b8b57506000613644565b8160018114615ba15760028114615bab57615bc7565b6001915050613644565b60ff841115615bbc57615bbc6157d9565b50506001821b613644565b5060208310610133831016604e8410600b8410161715615bea575081810a613644565b615bf48383615b2c565b8060001904821115615c0857615c086157d9565b029392505050565b60006141af8383615b6f565b60006141af60ff841683615b6f56fea26469706673582212200cee153871bd293e04467f2aa670731da84919fc24550faf488e9dd64550843364736f6c634300080d0033

Deployed Bytecode Sourcemap

89168:10122:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67341:306;;;;;;;;;;-1:-1:-1;67341:306:0;;;;;:::i;:::-;;:::i;:::-;;45197:252;;;;;;;;;;-1:-1:-1;45197:252:0;;;;;:::i;:::-;;:::i;67766:357::-;;;;;;;;;;-1:-1:-1;67766:357:0;;;;;:::i;:::-;;:::i;36503:264::-;;;;;;;;;;-1:-1:-1;36503:264:0;;;;;:::i;:::-;;:::i;35897:26::-;;;;;;;;;;-1:-1:-1;35897:26:0;;;;-1:-1:-1;;;;;35897:26:0;;;;;;-1:-1:-1;;;;;1852:55:1;;;1834:74;;1822:2;1807:18;35897:26:0;;;;;;;;48472:1486;;;;;;;;;;-1:-1:-1;48472:1486:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;92713:734::-;;;;;;;;;;-1:-1:-1;92713:734:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;46925:447::-;;;;;;:::i;:::-;;:::i;58107:1127::-;;;;;;;;;;-1:-1:-1;58107:1127:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;93811:483::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59544:4857::-;;;;;;;;;;-1:-1:-1;59544:4857:0;;;;;:::i;:::-;;:::i;96493:638::-;;;;;;:::i;:::-;;:::i;48104:239::-;;;;;;;;;;-1:-1:-1;48104:239:0;;;;;:::i;:::-;;:::i;95588:504::-;;;;;;:::i;:::-;;:::i;89577:209::-;;;;;;;;;;-1:-1:-1;89577:209:0;;;;;:::i;:::-;;:::i;:::-;;;;12604:25:1;;;12660:2;12645:18;;12638:34;;;;12577:18;89577:209:0;12430:248:1;50203:2699:0;;;;;;:::i;:::-;;:::i;68335:111::-;;;;;;;;;;-1:-1:-1;68335:111:0;;;;;:::i;:::-;;:::i;43256:::-;;;;;;;;;;-1:-1:-1;43256:111:0;;;;;:::i;:::-;;:::i;68632:115::-;;;;;;;;;;-1:-1:-1;68632:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;68718:21:0;68694:4;68718:21;;;:15;:21;;;;;;;68632:115;;;;13603:25:1;;;13591:2;13576:18;68632:115:0;13457:177:1;65642:715:0;;;;;;;;;;-1:-1:-1;65642:715:0;;;;;:::i;:::-;;:::i;68868:98::-;;;;;;;;;;-1:-1:-1;68942:9:0;:16;68868:98;;66643:294;;;;;;;;;;-1:-1:-1;66643:294:0;;;;;:::i;:::-;;:::i;43823:1235::-;;;;;;;;;;-1:-1:-1;43823:1235:0;;;;;:::i;:::-;;:::i;43445:101::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;43524:14:0;;;;;;;;43531:7;43524:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43445:101;;;;;14966:13:1;;14981:4;14962:24;14944:43;;15034:4;15022:17;;;15016:24;15059:6;15103:21;;;15081:20;;;15074:51;;;;15173:17;;;15167:24;15163:33;;;15141:20;;;15134:63;14932:2;14917:18;43445:101:0;14752:451:1;38922:216:0;;;;;;;;;;-1:-1:-1;38922:216:0;;;;;:::i;:::-;;:::i;46272:522::-;;;;;;;;;;-1:-1:-1;46272:522:0;;;;;:::i;:::-;;:::i;53513:4262::-;;;;;;:::i;:::-;;:::i;91617:211::-;;;;;;;;;;-1:-1:-1;91617:211:0;;;;;:::i;:::-;;:::i;90440:289::-;;;;;;;;;;-1:-1:-1;90440:289:0;;;;;:::i;:::-;;:::i;:::-;;;;15439:25:1;;;15495:2;15480:18;;15473:34;;;;15523:18;;;15516:34;15581:2;15566:18;;15559:34;15426:3;15411:19;90440:289:0;15208:391:1;67055:139:0;;;;;;;;;;-1:-1:-1;67055:139:0;;;;;:::i;:::-;;:::i;94704:521::-;;;;;;:::i;:::-;;:::i;91046:254::-;;;;;;;;;;-1:-1:-1;91046:254:0;;;;;:::i;:::-;;:::i;64918:594::-;;;;;;;;;;-1:-1:-1;64918:594:0;;;;;:::i;:::-;;:::i;97626:931::-;;;;;;:::i;:::-;;:::i;64601:180::-;;;;;;;;;;-1:-1:-1;64601:180:0;;;;;:::i;:::-;;:::i;47505:475::-;;;;;;;;;;-1:-1:-1;47505:475:0;;;;;:::i;:::-;;:::i;67341:306::-;67425:28;67456:9;67466;67456:20;;;;;;;;:::i;:::-;;;;;;;;;67495:14;67456:20;;;;;67495:14;;;;67456:20;;-1:-1:-1;;;;;;67495:14:0;67513:10;67495:28;67487:52;;;;-1:-1:-1;;;67487:52:0;;16651:2:1;67487:52:0;;;16633:21:1;16690:2;16670:18;;;16663:30;-1:-1:-1;;;16709:18:1;;;16702:41;16760:18;;67487:52:0;;;;;;;;;67569:16;67579:5;67569:9;:16::i;:::-;67550:15;;;:35;;:15;;:35;;;;-1:-1:-1;;;67550:35:0;;-1:-1:-1;;;;;67550:35:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;67550:35:0;;;;;-1:-1:-1;;;;;67550:35:0;;;;;;67620:2;-1:-1:-1;;;;;67612:20:0;:27;67633:5;67612:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67412:235;67341:306;;;:::o;45197:252::-;45289:28;45320:9;45330;45320:20;;;;;;;;:::i;:::-;;;;;;;;;45359:14;45320:20;;;;;45359:14;;;;45320:20;;-1:-1:-1;;;;;;45359:14:0;45377:10;45359:28;45351:55;;;;-1:-1:-1;;;45351:55:0;;;;;;;:::i;:::-;45417:24;45425:7;45434:6;45417:7;:24::i;:::-;45278:171;45197:252;;:::o;67766:357::-;67841:28;67872:9;67882;67872:20;;;;;;;;:::i;:::-;;;;;;;;;67911:14;67872:20;;;;;67911:14;;;;67872:20;;-1:-1:-1;;;;;;67911:14:0;67929:10;67911:28;67903:52;;;;-1:-1:-1;;;67903:52:0;;16651:2:1;67903:52:0;;;16633:21:1;16690:2;16670:18;;;16663:30;-1:-1:-1;;;16709:18:1;;;16702:41;16760:18;;67903:52:0;16449:335:1;67903:52:0;67985:16;67995:5;67985:9;:16::i;:::-;67966:15;;;:35;;:15;;:35;;;;-1:-1:-1;;;67966:35:0;;-1:-1:-1;;;;;67966:35:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;67966:35:0;;;;;-1:-1:-1;;;;;67966:35:0;;;;;;68037:11;;;;;;;;-1:-1:-1;;;;;68037:11:0;-1:-1:-1;;;;;68024:46:0;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;68012:74:0;;68096:5;68105:9;68012:103;;;;;;;;;;;;;13603:25:1;;13591:2;13576:18;;13457:177;68012:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67828:295;67766:357;;:::o;36503:264::-;36570:18;36591:11;-1:-1:-1;;;;;36591:11:0;36635:10;36621:24;;;:86;;-1:-1:-1;36649:58:0;;-1:-1:-1;;;36649:58:0;;36693:10;36649:58;;;17944:74:1;36705:1:0;18034:18:1;;;18027:34;-1:-1:-1;;;;;36649:43:0;;;;;17917:18:1;;36649:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36613:108;;;;-1:-1:-1;;;36613:108:0;;18556:2:1;36613:108:0;;;18538:21:1;18595:1;18575:18;;;18568:29;-1:-1:-1;;;18613:18:1;;;18606:39;18662:18;;36613:108:0;18354:332:1;36613:108:0;-1:-1:-1;36732:11:0;:27;;-1:-1:-1;;;;;;36732:27:0;-1:-1:-1;;;;;36732:27:0;;;;;;;;;;36503:264::o;48472:1486::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48611:9:0;:20;;-1:-1:-1;;;48621:9:0;;48611:20;;;;;;:::i;:::-;;;;;;;;;;;;;;48662:13;;;;48611:20;;-1:-1:-1;;;;48662:13:0;;;;;;48713:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;48713:21:0;;;;;;;;;;;;;;;;48687:47;;48750:6;48745:176;48766:5;48762:1;:9;48745:176;;;48793:22;48818:7;:13;;48832:1;48818:16;;;;;;;:::i;:::-;48860:49;;;;;;;;;48818:16;;;;;;;;;48869:11;;-1:-1:-1;;;;;48869:11:0;48860:49;;48889:11;;;:18;-1:-1:-1;;;;;48860:49:0;;;;;48849:8;;48818:16;;-1:-1:-1;48849:5:0;;48855:1;;48849:8;;;;;;:::i;:::-;;;;;;:60;;;;48778:143;48773:3;;;;:::i;:::-;;;48745:176;;;-1:-1:-1;48940:1010:0;;;;;;;;;;;49065:14;;-1:-1:-1;;;;;49065:14:0;;;48940:1010;;;;-1:-1:-1;;;;;;;;49125:12:0;;;;;;48940:1010;;;;;;;49065:14;49191;;;;;;48940:1010;;;;49262:22;;;;;48940:1010;;;;49330:13;;;;-1:-1:-1;;;;;49330:13:0;;48940:1010;;;;-1:-1:-1;;;49404:15:0;;;;;48940:1010;;;;49488:19;-1:-1:-1;;;49488:19:0;;;;48940:1010;;;;-1:-1:-1;;;49575:13:0;;;;;49065:14;48940:1010;;;49639:14;;;;;;;;48940:1010;;;;49714:20;;;;;48940:1010;;;;-1:-1:-1;;;49814:17:0;;;;48940:1010;;;;-1:-1:-1;;;49896:21:0;;;;;;48940:1010;;;;-1:-1:-1;48940:1010:0;;;;-1:-1:-1;48940:1010:0;48472:1486::o;92713:734::-;92859:20;92890:30;;;;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;93140:22:::1;93165:9;93175;93165:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;93192:9;93165:37;;;;;;;:::i;:::-;;;;93140:62;;93222:27;93237:4;93243:5;93222:14;:27::i;:::-;93213:36;;93414:25;93434:4;93414:19;:25::i;:::-;92713:734:::0;;93260:179;;-1:-1:-1;93260:179:0;;-1:-1:-1;93260:179:0;-1:-1:-1;92713:734:0;-1:-1:-1;;;;;92713:734:0:o;46925:447::-;47011:28;47042:9;47052;47042:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;47090:14;;;;47042:20;;-1:-1:-1;;;;;;47090:14:0;;47115:217;;47182:5;-1:-1:-1;;;;;47177:11:0;47164:9;:24;47156:52;;;;-1:-1:-1;;;47156:52:0;;19508:2:1;47156:52:0;;;19490:21:1;19547:2;19527:18;;;19520:30;-1:-1:-1;;;19566:18:1;;;19559:45;19621:18;;47156:52:0;19306:339:1;47156:52:0;47115:217;;;47241:79;47273:6;47281:10;47301:4;47313:5;-1:-1:-1;;;;;47308:11:0;47241:31;:79::i;:::-;47342:13;;;:22;;47359:5;;47342:13;;;:22;;47359:5;;-1:-1:-1;;;;;47342:22:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;47342:22:0;;;;;-1:-1:-1;;;;;47342:22:0;;;;;;47000:372;;46925:447;;:::o;58107:1127::-;58285:23;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;58323:27:::1;58353:9;58363;58353:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;58380:9;58353:37;;;;;;;:::i;:::-;;;;:44;;58323:74;;58408:30;58462:5;58441:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;58493:13:0;;58408:60;;-1:-1:-1;58479:11:0::1;58570:10:::0;;;58566:637:::1;;58599:10;58612:15;58621:6:::0;58612;:15:::1;:::i;:::-;58599:28;;58642:8;58661:5;58653;:13;:33;;58685:1;58653:33;;;58669:13;58677:5:::0;58669;:13:::1;:::i;:::-;58642:44;;58701:134;58716:3;58708:5;:11;58701:134;;;58740:7;::::0;::::1;:::i;:::-;;;58780:39;58798:6;58805:5;58798:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;58780:39:::1;::::0;;::::1;::::0;::::1;::::0;;58798:13;;;::::1;58780:39:::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;58780:39:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;58780:39:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;58780:39:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;58780:39:0;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;58780:39:0;::::1;;::::0;;;;::::1;-1:-1:-1::0;;;58780:39:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;58780:39:0;::::1;;::::0;;;;::::1;-1:-1:-1::0;;;58780:39:0;;::::1;;;::::0;;;58813:5;58780:17:::1;:39::i;:::-;58766:6:::0;58773:3;::::1;::::0;::::1;:::i;:::-;;;58766:11;;;;;;;;:::i;:::-;;;;;;:53;;;;58701:134;;;58582:264;;58566:637;;;58919:6:::0;58906:10:::1;58951:13;58959:5:::0;58919:6;58951:13:::1;:::i;:::-;58940:24;;58989:6;58983:3;:12;58979:65;;;-1:-1:-1::0;59022:6:0;58979:65:::1;59073:3;59065:5;:11;59058:134;;;59111:39;59129:6;59136:5;59129:13;;;;;;;;:::i;59111:39::-;59097:6:::0;59104:3;::::1;::::0;::::1;:::i;:::-;;;59097:11;;;;;;;;:::i;:::-;;;;;;:53;;;;59169:7;;;;:::i;:::-;;;59058:134;;;58889:314;;58566:637;-1:-1:-1::0;59220:6:0;;58107:1127;-1:-1:-1;;;;;;;;58107:1127:0:o;93811:483::-;93967:20;94000:31;94034:24;94039:9;94050:7;94034:4;:24::i;:::-;:30;;;-1:-1:-1;94108:1:0;94086:23;;;;94129:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;94129:13:0;;94120:22;;94153:134;94160:5;;94153:134;;94182:6;94187:1;94182:6;;:::i;:::-;;;94232:43;94248:5;94254:11;;94271:1;94266;:6;;94254:19;;;;;;;:::i;:::-;;;;;;;94248:26;;;;;;;:::i;:::-;;;;94232:15;:43::i;:::-;94204:6;94211:1;94204:9;;;;;;;;:::i;:::-;;;;;;94215:6;94222:1;94226;94222:5;;;;:::i;:::-;94215:13;;;;;;;;:::i;:::-;;;;;;;;;;94203:72;;;;;94153:134;;;93989:305;;93811:483;;;;;;:::o;59544:4857::-;59641:30;;;;;;;;59664:7;59641:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;59713:9;:20;;59641;;59713:9;59723;;59713:20;;;;;;:::i;:::-;;;;;;;;;;;59682:51;;59754:17;59786:11;59812:14;59841:11;59947:39;59989:9;59999:1;59989:28;;;;;;;;:::i;:::-;;;;;;;;;;60037:161;;;;;;;;59989:37;60079:22;;;;-1:-1:-1;;;60079:22:0;;;;-1:-1:-1;;;;;60079:22:0;60037:161;;60123:20;;;;;;;;;60037:161;;;;;;;-1:-1:-1;;;60165:21:0;;;;;60037:161;;;;;;;59989:28;;;;;;:37;;;;-1:-1:-1;60225:7:0;60211:3555;60241:5;;60211:3555;;60264:22;60289:13;;;60303:3;;;:::i;:::-;;;;60289:18;;;;;;;:::i;:::-;;;;60264:43;;60425:15;60501:6;60510:7;;60518:1;60510:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:17;-1:-1:-1;;60496:3015:0;60529:5;;60496:3015;;60660:10;60673:7;;60681:1;60673:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;60684:3;;;:::i;:::-;;;;60673:15;;;;;;;:::i;:::-;;;;;;;60660:28;;60707:23;60733:4;:11;;60745:5;60733:18;;;;;;;;:::i;:::-;;;;;;;;;60707:44;;;;;;;;60733:18;;;;60707:44;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;-1:-1:-1;60874:17:0;;;60870:539;;61039:5;:11;;;61034:17;;61019:32;;61085:9;61095:12;61085:23;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;61074:43;;60870:539;;;61363:11;;61358:17;;61342:33;;61334:55;;;;-1:-1:-1;;;61334:55:0;;21064:2:1;61334:55:0;;;21046:21:1;21103:1;21083:18;;;21076:29;-1:-1:-1;;;21121:18:1;;;21114:39;21170:18;;61334:55:0;20862:332:1;61334:55:0;61600:1;61585:12;:16;:86;;;;;61658:12;61632:6;:22;;;61627:28;;61611:5;:12;;;61606:18;;:49;;;;:::i;:::-;:64;61585:86;61581:1811;;;61754:1;61759;61754:6;61750:1144;;61808:12;;;;61803:18;;61973:10;;61969:902;;62110:10;62122:16;62142:43;62159:4;:11;;62172:5;62179;62142:16;:43::i;:::-;62752:7;;;62699;;;;62683:12;;;;62109:76;;-1:-1:-1;62109:76:0;;-1:-1:-1;62809:3:0;;62109:76;;62667:49;;62678:28;;62699:7;62678:18;;:28;:::i;:::-;62708:7;;;;62667:10;:49::i;:::-;62584:47;62625:6;62584:5;:47;:::i;:::-;:132;;;;:::i;:::-;:175;;;;:::i;:::-;:222;;;;:::i;:::-;:228;;;;:::i;:::-;62539:304;;;;:::i;:::-;;;61985:886;;61969:902;61762:1132;61750:1144;62936:15;;;;62918:34;;62931:21;;62918:34;;:::i;:::-;;;62990:5;:15;;;62985:21;;62975:31;;;;;:::i;:::-;63081:17;;;;63056:16;;;;62975:31;;-1:-1:-1;63076:23:0;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;63043:56;;;;:::i;:::-;63029:70;;;;:::i;:::-;63219:1;63198:23;;;63244:15;;;:27;;;63294:17;;;:29;63346:11;;;:18;;63029:70;;-1:-1:-1;63198:5:0;;63358;;63346:18;;;;;;:::i;:::-;;;;;;;;;;:26;;:18;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;;;;63346:26:0;;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;;;63346:26:0;;;;-1:-1:-1;;;63346:26:0;;;;;-1:-1:-1;;;;63346:26:0;;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;;;63346:26:0;;;;-1:-1:-1;;;63346:26:0;;-1:-1:-1;;;;63346:26:0;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;;;63346:26:0;;;-1:-1:-1;;;63346:26:0;;;;;-1:-1:-1;;;;63346:26:0;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;63346:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61581:1811;60537:2974;;60496:3015;;;;63527:19;63533:6;63541:4;63527:5;:19::i;:::-;63716:11;;63696:58;;63706:8;;-1:-1:-1;;;;;63716:11:0;63729:10;63741:12;63696:9;:58::i;:::-;60249:3517;;60211:3555;;;-1:-1:-1;63826:14:0;;63806:78;;63816:8;;-1:-1:-1;;;;;63826:14:0;;;63842:27;;-1:-1:-1;;;63856:12:0;;-1:-1:-1;;;;;63856:12:0;63842:6;:27;:::i;:::-;63871:12;63806:9;:78::i;:::-;63931:77;63941:8;37329:42;63971:22;:9;63983:10;63971:22;:::i;63931:77::-;64039:13;;;;-1:-1:-1;;;;;64039:13:0;64068:14;;;64064:61;;;64108:5;64099:14;;64064:61;64274:14;64282:6;64274:5;:14;:::i;:::-;64251:13;;;:38;;-1:-1:-1;;64251:38:0;-1:-1:-1;;;;;64251:38:0;;;;;;;;;;;64356:14;;;64336:57;;64346:8;;-1:-1:-1;;;;;64356:14:0;64372:6;64380:12;64336:9;:57::i;:::-;59620:4781;;;;;;;;;59544:4857;;;:::o;96493:638::-;96671:20;96704:31;96738:24;96743:9;96754:7;96738:4;:24::i;:::-;:30;;;-1:-1:-1;96801:1:0;96792:10;;;96781:8;96822:24;96792:10;96822:11;:24;:::i;:::-;96813:33;;96877:1;96866:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;96866:13:0;;96857:22;;96890:234;96897:5;;96890:234;;96919:8;96924:3;96919:8;;:::i;:::-;;-1:-1:-1;96942:16:0;96961:50;96976:5;96982:11;;96994:7;96998:3;96919:8;96994:7;:::i;:::-;96982:20;;;;;;;:::i;:::-;;;;;;;96976:27;;;;;;;:::i;:::-;;;;97005:5;96961:14;:50::i;:::-;96942:69;;97031:6;97026:87;97047:3;97043:1;:7;97026:87;;;97092:2;97095:1;97092:5;;;;;;;;:::i;:::-;;;;;;;97076:6;97087:1;97083;:5;;;;:::i;:::-;97076:13;;;;;;;;:::i;:::-;;;;;;;;;;:21;97052:3;;;:::i;:::-;;;97026:87;;;;96904:220;96890:234;;;96693:438;;;96493:638;;;;;;;:::o;48104:239::-;48181:28;48212:9;48222;48212:20;;;;;;;;:::i;:::-;;;;;;;;;48251:14;48212:20;;;;;48251:14;;;;48212:20;;-1:-1:-1;;;;;;48251:14:0;48269:10;48251:28;48243:55;;;;-1:-1:-1;;;48243:55:0;;;;;;;:::i;:::-;48309:14;;:26;;-1:-1:-1;;;;;;48309:26:0;-1:-1:-1;;;;;48309:26:0;;;;;;;;;;-1:-1:-1;48104:239:0:o;95588:504::-;95762:20;95795:31;95829:24;95834:9;95845:7;95829:4;:24::i;:::-;:30;;;-1:-1:-1;95903:1:0;95881:23;;;;95924:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95924:13:0;;95915:22;;95948:137;95955:5;;95948:137;;95977:6;95982:1;95977:6;;:::i;:::-;;;96027:46;96038:5;96044:11;;96061:1;96056;:6;;96044:19;;;;;;;:::i;:::-;;;;;;;96038:26;;;;;;;:::i;:::-;;;;96066:6;96027:10;:46::i;:::-;95999:6;96006:1;95999:9;;;;;;;;:::i;:::-;;;;;;96010:6;96017:1;96021;96017:5;;;;:::i;:::-;96010:13;;;;;;;;:::i;:::-;;;;;;;;;;95998:75;;;;;95948:137;;;95784:308;;95588:504;;;;;;;:::o;89577:209::-;89676:16;;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;89724:54:::1;89740:9;89750;89740:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;89767:9;89740:37;;;;;;;:::i;89724:54::-;89717:61;;;;37054:1;89577:209:::0;;;;;:::o;50203:2699::-;50340:30;;;;;;;;50363:7;50340:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50422:10;;50414:33;;;;-1:-1:-1;;;50414:33:0;;21796:2:1;50414:33:0;;;21778:21:1;21835:2;21815:18;;;21808:30;-1:-1:-1;;;21854:18:1;;;21847:40;21904:18;;50414:33:0;21594:334:1;50414:33:0;50494:28;50525:9;50535;50525:20;;;;;;;;:::i;:::-;;;;;;;;;;;50494:51;;50587:17;50607:25;50621:10;50607:13;:25::i;:::-;50587:45;;51234:39;51276:9;51286:12;51276:23;;;;;;;;:::i;:::-;;;;;;;;;;51336:13;;;;51472:17;;;;51276:32;:23;;;;;;;:32;;-1:-1:-1;51336:13:0;-1:-1:-1;;;51336:13:0;;;;;;51372:9;;51424:85;;51276:32;;37329:42;;51462:28;;51467:23;51336:13;51462:28;:::i;:::-;:41;;51493:10;51462:41;:::i;:::-;51505:3;51424:7;:85::i;:::-;51576:14;;51418:91;;-1:-1:-1;51558:71:0;;51566:8;;-1:-1:-1;;;;;51576:14:0;;;51618:5;;51592:23;;-1:-1:-1;;;51602:12:0;;-1:-1:-1;;;;;51602:12:0;51592:2;:23;:::i;:::-;:31;;;;:::i;51558:71::-;51552:77;;51668:859;51675:6;;51668:859;;51698:22;51723:13;;;51737:4;;;:::i;:::-;;;;51723:19;;;;;;;:::i;:::-;;;;51698:44;;51757:15;51775:11;;51787:2;51775:15;;;;;;;:::i;:::-;;;;;;;51757:33;;51826:1;51813:10;:14;51805:42;;;;-1:-1:-1;;;51805:42:0;;22135:2:1;51805:42:0;;;22117:21:1;22174:2;22154:18;;;22147:30;-1:-1:-1;;;22193:18:1;;;22186:45;22248:18;;51805:42:0;21933:339:1;51805:42:0;51886:11;;51868:55;;51876:8;;-1:-1:-1;;;;;51886:11:0;51899:18;51907:10;51899:5;:18;:::i;:::-;51919:3;51868:7;:55::i;:::-;51862:61;;52186:19;52192:6;52200:4;52186:5;:19::i;:::-;52315:11;;;:18;52283:70;;;22564:25:1;;;22620:2;22605:18;;22598:34;;;52303:10:0;22648:18:1;;;22641:83;22755:2;22740:18;;22733:34;;;;22798:3;22783:19;;22776:35;;;22842:3;22827:19;;22820:35;;;52283:70:0;;;;;;22551:3:1;52283:70:0;;;52412:103;52420:4;:11;;52433:12;52454:5;52467:6;:17;;;52462:23;;52487:2;52493:1;52487:7;:15;;52501:1;52487:15;;;52497:1;52487:15;52412:103;;52504:10;52412:7;:103::i;:::-;51683:844;;51668:859;;;50300:2602;;;;;;50203:2699;;;;:::o;68335:111::-;68390:7;68417:9;68427:5;68417:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;68417:21:0;;68335:111;-1:-1:-1;;68335:111:0:o;43256:::-;36875:11;;;36859:59;;-1:-1:-1;;;36859:59:0;;36904:10;36859:59;;;17944:74:1;18034:18;;;18027:34;;;;-1:-1:-1;;;;;36875:11:0;;36859:44;;17917:18:1;;36859:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36851:81;;;;-1:-1:-1;;;36851:81:0;;18556:2:1;36851:81:0;;;18538:21:1;18595:1;18575:18;;;18568:29;-1:-1:-1;;;18613:18:1;;;18606:39;18662:18;;36851:81:0;18354:332:1;36851:81:0;43353:6;43343:7:::1;:16;43353:6:::0;43343:7;:16:::1;:::i;65642:715::-:0;65708:4;65727:28;65758:9;65768;65758:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;65819:23;;;65866:13;;65758:20;;-1:-1:-1;65819:23:0;65904:2;65917:231;65924:9;;65917:231;;65952:23;65978:6;65985:7;;;:::i;:::-;;;;65978:15;;;;;;;;:::i;:::-;;;;;;;;;;65952:41;;;;;;;;65978:15;;;;65952:41;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;;-1:-1:-1;66012:22:0;66008:129;;66084:12;;;;66064:33;;66079:18;;66064:12;:33;:::i;:::-;66055:42;;66116:5;;;66008:129;65935:213;65917:231;;;66279:20;;;;66346:3;;66248:82;;66259:41;;-1:-1:-1;;;66279:20:0;;;;66259:12;:41;:::i;:::-;66307:21;;;;-1:-1:-1;;;66307:21:0;;;;66248:10;:82::i;:::-;66208:22;;;;66181:50;;-1:-1:-1;;;66208:22:0;;-1:-1:-1;;;;;66208:22:0;66181:6;:50;:::i;:::-;:149;;;;:::i;:::-;:168;;;;:::i;:::-;66160:189;65642:715;-1:-1:-1;;;;;;65642:715:0:o;66643:294::-;66752:16;66770;66799:27;66829:9;66839;66829:20;;;;;;;;:::i;:::-;;;;;;;;:26;:20;;;;;:26;;:29;;;:36;;66799:66;;66883:46;66900:6;66908:5;66915:6;66922:5;66915:13;;;;;;;;:::i;:::-;;;;;;;;;;66883:46;;;;;;;;66915:13;;;;66883:46;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;:16;:46::i;:::-;66876:53;;;;;66643:294;;;;;:::o;43823:1235::-;44064:9;:16;44059:44;;;23983:25:1;;;-1:-1:-1;;;;;24105:15:1;;;24100:2;24085:18;;24078:43;-1:-1:-1;;;;;24157:39:1;;24137:18;;;24130:67;24233:15;;24228:2;24213:18;;24206:43;44059:44:0;;;;;;23970:3:1;44059:44:0;;;44155:9;:16;;;;;;;-1:-1:-1;44155:16:0;;;-1:-1:-1;;;;;44214:23:0;;;-1:-1:-1;;;;;;;;44275:19:0;;;;;;;;44155:16;;;;;;;;44275:19;;;44337:14;;;:23;;-1:-1:-1;;;;;;44337:23:0;;;;;;;;;;;44373:13;;;:26;;-1:-1:-1;;;44448:37:0;-1:-1:-1;;;44448:37:0;;;;;;;44536:14;;;;:27;;-1:-1:-1;;;;;;44616:43:0;44553:10;-1:-1:-1;;;;44616:43:0;;44646:12;44616:43;;;;;;;;;;;;44155:16;44703:311;44720:17;;;44703:311;;;44777:6;;44784:1;44777:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44767:19:0;:6;-1:-1:-1;;;;;44767:19:0;;44759:60;;;;-1:-1:-1;;;44759:60:0;;24462:2:1;44759:60:0;;;24444:21:1;24501:2;24481:18;;;24474:30;24540;24520:18;;;24513:58;24588:18;;44759:60:0;24260:352:1;44759:60:0;44839:6;44834:119;44855:1;44851;:5;44834:119;;;44903:6;;44910:1;44903:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44890:22:0;:6;;44897:1;44890:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44890:22:0;;44882:55;;;;-1:-1:-1;;;44882:55:0;;24819:2:1;44882:55:0;;;24801:21:1;24858:2;24838:18;;;24831:30;-1:-1:-1;;;24877:18:1;;;24870:50;24937:18;;44882:55:0;24617:344:1;44882:55:0;44858:3;;;:::i;:::-;;;44834:119;;;;44993:6;;45000:1;44993:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;44967:7;:13;;44981:1;44967:16;;;;;;;:::i;:::-;;;;:35;;-1:-1:-1;;;;;;44967:35:0;-1:-1:-1;;;;;44967:35:0;;;;;;;;;;44739:3;;;:::i;:::-;;;44703:311;;;;45026:24;45034:7;45043:6;45026:7;:24::i;:::-;44013:1045;43823:1235;;;;;;:::o;38922:216::-;38989:28;39006:10;38989:16;:28::i;:::-;-1:-1:-1;39114:9:0;:16;;;;;;-1:-1:-1;39114:16:0;38922:216::o;46272:522::-;46341:28;46372:9;46382;46372:20;;;;;;;;:::i;:::-;;;;;;;;;46411:14;46372:20;;;;;46411:14;;;;46372:20;;-1:-1:-1;;;;;;46411:14:0;46429:10;46411:28;46403:55;;;;-1:-1:-1;;;46403:55:0;;;;;;;:::i;:::-;46477:14;;-1:-1:-1;;;;;46477:24:0;;;:14;;:24;46469:65;;;;-1:-1:-1;;;46469:65:0;;24462:2:1;46469:65:0;;;24444:21:1;24501:2;24481:18;;;24474:30;24540;24520:18;;;24513:58;24588:18;;46469:65:0;24260:352:1;46469:65:0;46563:13;;;;-1:-1:-1;;;46563:13:0;;;;46545:10;46588:126;46609:5;46605:1;:9;46588:126;;;46671:6;-1:-1:-1;;;;;46644:33:0;:7;:13;;46658:1;46644:16;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;46644:23:0;:33;46636:66;;;;-1:-1:-1;;;46636:66:0;;24819:2:1;46636:66:0;;;24801:21:1;24858:2;24838:18;;;24831:30;-1:-1:-1;;;24877:18:1;;;24870:50;24937:18;;46636:66:0;24617:344:1;46636:66:0;46616:3;;;:::i;:::-;;;46588:126;;;;46754:6;46724:7;:13;;46738:5;46724:20;;;;;;;:::i;:::-;;;;:36;;-1:-1:-1;;;;;;46724:36:0;-1:-1:-1;;;;;46724:36:0;;;;;;;;;;46773:13;;;46771:15;;46773:13;;46771:15;;-1:-1:-1;;;46771:15:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46330:464;;46272:522;;:::o;53513:4262::-;53700:30;;;;;;;;53723:7;53700:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;53782:11;53774:35;;;;-1:-1:-1;;;53774:35:0;;25370:2:1;53774:35:0;;;25352:21:1;25409:2;25389:18;;;25382:30;-1:-1:-1;;;25428:18:1;;;25421:41;25479:18;;53774:35:0;25168:335:1;53774:35:0;53844:1;53828:13;:17;53820:39;;;;-1:-1:-1;;;53820:39:0;;25710:2:1;53820:39:0;;;25692:21:1;25749:1;25729:18;;;25722:29;-1:-1:-1;;;25767:18:1;;;25760:39;25816:18;;53820:39:0;25508:332:1;53820:39:0;53904:28;53935:9;53945;53935:20;;;;;;;;:::i;:::-;;;;;;;;;;;53904:51;;53966:22;53991:7;:13;;54017:7;54005:9;:19;:53;;54039:19;54051:7;54039:9;:19;:::i;:::-;54005:53;;;54027:9;54005:53;53991:68;;;;;;;:::i;:::-;;;;53966:93;;54070:23;54096:4;:11;;54108:5;54096:18;;;;;;;;:::i;:::-;;;;;;;;;;54070:44;;;;;;;;54096:18;;;;54070:44;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;54188:22;;;;54070:44;;-1:-1:-1;54215:12:0;;54162:49;;54183:28;;;54162:49;:::i;:::-;:65;;54154:87;;;;-1:-1:-1;;;54154:87:0;;26047:2:1;54154:87:0;;;26029:21:1;26086:1;26066:18;;;26059:29;-1:-1:-1;;;26104:18:1;;;26097:39;26153:18;;54154:87:0;25845:332:1;54154:87:0;54301:7;54282:5;:15;;;54277:21;;:31;;;;:::i;:::-;54252:57;;:15;;;:57;54322:17;54342:25;54356:10;54342:13;:25::i;:::-;54322:45;;54503:15;54592:5;:17;;;54587:23;;54568:5;:15;;;54563:21;;:47;;;;:::i;:::-;54543:15;;;;54521:38;;54538:21;;54533:1;54522:12;;;54521:38;:::i;:::-;:90;;;;:::i;:::-;54761:11;;;;54503:108;;-1:-1:-1;54725:7:0;;54756:17;;;;;54788:11;;54784:200;;;54833:25;;54828:31;;54820:39;;54816:135;;;54934:1;54919:16;;;;;54816:135;54965:7;;;:::i;:::-;;;54784:200;55101:39;55143:9;55153:12;55143:23;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;55101:74;;55190:8;55201:9;55190:20;;55395:7;55383:9;:19;55379:1676;;;55516:7;55497:5;:15;;;55492:21;;:31;;;;:::i;:::-;55467:57;;;;:15;;;:57;55575:17;;;;55570:33;;55596:7;;55570:23;:33;:::i;:::-;55543:61;;:17;;;:61;55623:11;;;:18;;55543:5;;55623:11;55635:5;;55623:18;;;;;;:::i;:::-;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55710:83;55718:8;55728:7;:14;;;;;;;;;;-1:-1:-1;;;;;55728:14:0;55774:7;:12;;;;;;;;;;-1:-1:-1;;;;;55774:12:0;-1:-1:-1;;;;;55769:18:0;55758:7;55745:10;:20;;;;:::i;55710:83::-;55914:11;;;55991:16;;;55704:89;;-1:-1:-1;55852:212:0;;55882:8;;-1:-1:-1;;;;;55914:11:0;;56011:7;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;55978:40;;;;:::i;:::-;55949:26;55962:13;55949:10;:26;:::i;:::-;:69;;;;:::i;55852:212::-;55846:218;;55379:1676;;;56181:20;56194:7;56181:20;;:::i;:::-;;;56313:7;56294:5;:15;;;56289:21;;:31;;;;:::i;:::-;56264:57;;;;:15;;;:57;56372:17;;;;56367:33;;56393:7;;56367:23;:33;:::i;:::-;56340:61;;:17;;;:61;56420:11;;;:18;;56340:5;;56420:11;56432:5;;56420:18;;;;;;:::i;:::-;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56507:83;56515:8;56525:7;:14;;;;;;;;;;-1:-1:-1;;;;;56525:14:0;56571:7;:12;;;;;;;;;;-1:-1:-1;;;;;56571:12:0;-1:-1:-1;;;;;56566:18:0;56555:7;56542:10;:20;;;;:::i;56507:83::-;56678:16;;;;56501:89;;-1:-1:-1;56643:19:0;;56698:7;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;56665:40;;;;:::i;:::-;56643:62;-1:-1:-1;56643:62:0;56728:26;56741:13;56728:10;:26;:::i;:::-;:43;56724:316;;;56802:80;56810:8;56820:4;:11;;;;;;;;;;-1:-1:-1;;;;;56820:11:0;56862:14;56846:13;56833:10;:26;;;;:::i;:::-;:43;;;;:::i;:::-;56878:3;56802:7;:80::i;:::-;56796:86;;56724:316;;;56951:11;;56931:89;;56941:8;;-1:-1:-1;;;;;56951:11:0;56981:26;56994:13;56981:10;:26;:::i;:::-;56964:43;;:14;:43;:::i;:::-;57009:10;56931:9;:89::i;:::-;56162:893;55379:1676;57121:67;57129:8;37329:42;57159:23;:10;57172;57159:23;:::i;57121:67::-;57115:73;-1:-1:-1;57213:8:0;;57205:29;;;;-1:-1:-1;;;57205:29:0;;26384:2:1;57205:29:0;;;26366:21:1;26423:1;26403:18;;;26396:29;-1:-1:-1;;;26441:18:1;;;26434:38;26489:18;;57205:29:0;26182:331:1;57205:29:0;54996:2250;;57507:19;57513:6;57521:4;57507:5;:19::i;:::-;57617:11;;;:18;57578:85;;;22564:25:1;;;22620:2;22605:18;;22598:34;;;57605:10:0;22648:18:1;;;22641:83;22755:2;22740:18;;22733:34;;;;22798:3;22783:19;;22776:35;;;22842:3;22827:19;;22820:35;;;57578:85:0;;;;;;22551:3:1;57578:85:0;;;57674:93;57682:4;:11;;57695:12;57716:10;57729;57750:1;57741:5;:10;;57753:13;57674:7;:93::i;:::-;53687:4088;;;;;;;;53513:4262;;;;;:::o;91617:211::-;91727:13;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;91760:60:::1;91775:9;91785;91775:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;91802:9;91775:37;;;;;;;:::i;:::-;;;;91814:5;91760:14;:60::i;:::-;91753:67:::0;91617:211;-1:-1:-1;;;;91617:211:0:o;90440:289::-;90553:16;;;;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;90663:58:::1;90683:9;90693;90683:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;90710:9;90683:37;;;;;;;:::i;:::-;;;;90663:19;:58::i;:::-;90656:65:::0;;;;-1:-1:-1;90656:65:0;-1:-1:-1;90656:65:0;;-1:-1:-1;90440:289:0;-1:-1:-1;;;90440:289:0:o;67055:139::-;67128:4;67157:9;67167;67157:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:28;;;-1:-1:-1;;;67157:28:0;;-1:-1:-1;;;;;67157:28:0;;;-1:-1:-1;;67055:139:0:o;94704:521::-;94864:20;94897:31;94931:24;94936:9;94947:7;94931:4;:24::i;:::-;:30;;;-1:-1:-1;95005:1:0;94983:23;;;;95026:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95026:13:0;;95017:22;;95050:168;95057:5;;95050:168;;95079:6;95084:1;95079:6;;:::i;:::-;;;95159:47;95179:5;95185:11;;95202:1;95197;:6;;95185:19;;;;;;;:::i;:::-;;;;;;;95179:26;;;;;;;:::i;95159:47::-;95101:6;95108:1;95101:9;;;;;;;;:::i;:::-;;;;;;95112:6;95119:1;95123;95119:5;;;;:::i;:::-;95112:13;;;;;;;;:::i;:::-;;;;;;95127:6;95134:1;95138;95134:5;;;;:::i;:::-;95127:13;;;;;;;;:::i;:::-;;;;;;95142:6;95149:1;95153;95149:5;;;;:::i;:::-;95142:13;;;;;;;;:::i;:::-;;;;;;;;;;95100:106;;;;;;;;;;;;95050:168;;91046:254;91187:16;;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;91235:57:::1;91246:9;91256;91246:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;91273:9;91246:37;;;;;;;:::i;:::-;;;;91285:6;91235:10;:57::i;:::-;91228:64;;;;91046:254:::0;;;;;;:::o;64918:594::-;65365:10;65316:20;65349:27;;;:15;:27;;;;;;65339:9;:38;;:9;;65349:27;65339:38;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;65339:61:0;;;;:47;:38;;;;;:47;;;;:61;;;;;65411:22;;65339:61;;-1:-1:-1;65428:5:0;;65339:61;;65411:22;;65428:5;;65411:22;:::i;:::-;;;;-1:-1:-1;65444:60:0;;-1:-1:-1;65472:12:0;65486:10;65498:5;65444:27;:60::i;97626:931::-;97824:20;97857:31;97891:24;97896:9;97907:7;97891:4;:24::i;:::-;:30;;97857:64;;97934:8;97955:1;97946:5;:10;;97960:1;97945:16;;;;:::i;:::-;97934:27;-1:-1:-1;97972:6:0;97981:24;97934:27;97981:11;:24;:::i;:::-;97972:33;;98036:1;98025:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;98025:13:0;;98016:22;;98049:501;98056:5;;98049:501;;98078:8;98083:3;98078:8;;:::i;:::-;;-1:-1:-1;98103:22:0;98128:5;98134:11;;98146:7;98150:3;98078:8;98146:7;:::i;:::-;98134:20;;;;;;;:::i;:::-;;;;;;;98128:27;;;;;;;:::i;:::-;;;;98103:52;;98170:16;98189:27;98204:4;98210:5;98189:14;:27::i;:::-;98170:46;;98236:6;98231:91;98256:3;98248:5;:1;98252;98248:5;:::i;:::-;:11;98231:91;;;98301:2;98304:1;98301:5;;;;;;;;:::i;:::-;;;;;;;98285:6;98296:1;98292;:5;;;;:::i;:::-;98285:13;;;;;;;;:::i;:::-;;;;;;;;;;:21;98261:3;;;:::i;:::-;;;98231:91;;;-1:-1:-1;98336:6:0;98355:1;98345:7;98349:3;98345:1;:7;:::i;:::-;:11;;;;:::i;:::-;98336:20;;98513:25;98533:4;98513:19;:25::i;:::-;98390:6;98397:1;98390:9;;;;;;;;:::i;:::-;;;;;;98418:6;98425:1;98429;98425:5;;;;:::i;:::-;98418:13;;;;;;;;:::i;:::-;;;;;;98450:6;98457:1;98461;98457:5;;;;:::i;:::-;98450:13;;;;;;;;:::i;:::-;;;;;;98482:6;98489:1;98493;98489:5;;;;:::i;:::-;98482:13;;;;;;;;:::i;:::-;;;;;;;;;;98371:167;;;;;;;;;;;;-1:-1:-1;98049:501:0;;-1:-1:-1;;98049:501:0;64601:180;-1:-1:-1;;;;;64722:21:0;;64688:4;64722:21;;;:15;:21;;;;;;64712:9;:32;;:9;;64722:21;64712:32;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;64712:55:0;;;;:41;:32;;;;;:41;;;;:55;;;;;:61;;-1:-1:-1;64601:180:0;;;;;:::o;47505:475::-;47583:28;47614:9;47624;47614:20;;;;;;;;:::i;:::-;;;;;;;;;47653:14;47614:20;;;;;47653:14;;;;47614:20;;-1:-1:-1;;;;;;47653:14:0;47671:10;47653:28;47645:55;;;;-1:-1:-1;;;47645:55:0;;;;;;;:::i;:::-;47728:14;;;;47753:13;;;:22;;-1:-1:-1;;;;;47728:14:0;;;;47770:5;;47753:13;47711:14;;47753:22;;47770:5;;-1:-1:-1;;;;;47753:22:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;47753:22:0;;;;;-1:-1:-1;;;;;47753:22:0;;;;;;47808:1;-1:-1:-1;;;;;47790:20:0;:6;-1:-1:-1;;;;;47790:20:0;;47786:187;;47827:41;;47835:10;;-1:-1:-1;;;;;47856:11:0;;47827:41;;;;;;;;;47856:11;47835:10;47827:41;;;;;;;;;;;;;;;;;;;;;47786:187;;;47901:60;47929:6;47937:10;47954:5;-1:-1:-1;;;;;47949:11:0;47901:27;:60::i;:::-;47572:408;;47505:475;;:::o;82418:156::-;82472:6;-1:-1:-1;;;82499:5:0;:35;82491:44;;;;;;-1:-1:-1;82560:5:0;82418:156::o;45584:503::-;45744:21;;;;:6;:21;:::i;:::-;45719:22;;;:46;;-1:-1:-1;;;;;45719:46:0;;;;-1:-1:-1;;;45719:46:0;-1:-1:-1;;;;;45719:46:0;;;;;;;;;45850:18;;;;;;;;:::i;:::-;45828:19;;;:40;;;;;;;-1:-1:-1;;;45828:40:0;-1:-1:-1;;;;45828:40:0;;;;;;;;;45962:16;;;;;;;;:::i;:::-;45942:17;;;:36;;;;;;;-1:-1:-1;;;45942:36:0;-1:-1:-1;;;;45942:36:0;;;;;;;;;46059:20;;;;;;;;:::i;:::-;46035:7;:21;;;:44;;;;;;;;;;;;;;;;;;45584:503;;:::o;87763:1244::-;87846:13;87904:11;;;87926:23;;:::i;:::-;87960:19;88003:1;87993:11;;;;;;87982:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87982:23:0;-1:-1:-1;88046:7:0;:23;88094:13;;87960:45;;-1:-1:-1;88046:23:0;;;;;;88018:20;;;;88212:763;88233:5;88229:1;:9;88212:763;;;88270:10;;;;88299:56;;-1:-1:-1;88331:6:0;88338:7;;;:::i;:::-;;;;88331:15;;;;;;;;:::i;:::-;;;;;;;;;;88323:23;;;;;;;;88331:15;;;;88323:23;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;-1:-1:-1;88307:48:0;;;88299:56;88295:499;;;88394:1;88380:11;:15;:58;;;;-1:-1:-1;88426:12:0;88399:24;88408:15;88399:6;:24;:::i;:::-;:39;88380:58;88376:209;;;88476:24;88485:15;88476:6;:24;:::i;:::-;88463:5;88469:3;;;;:::i;:::-;;;88463:10;;;;;;;;:::i;:::-;;;;;;;;;;:37;88536:29;88554:11;88536:15;:29;:::i;:::-;88523:5;88529:3;;;;:::i;:::-;;;88523:10;;;;;;;;:::i;:::-;;;;;;:42;;;;;88376:209;88607:4;88603:58;;;88636:5;;;88603:58;88693:1;88679:15;;88731:1;88713:19;;88765:5;:12;;;88760:18;;88751:27;;88295:499;88832:15;;;;88827:21;;88863:24;88827:21;88863:24;;:::i;:::-;88934:16;;;;88863:24;;-1:-1:-1;88954:9:0;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;88921:42;;;;:::i;:::-;88902:61;;;;:::i;:::-;;;88241:734;;88212:763;;;-1:-1:-1;88994:5:0;;87763:1244;-1:-1:-1;;;;;;;;;;87763:1244:0:o;83821:603::-;84012:39;;;;;;;;84041:10;;;84012:39;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;83907:16;;;;;;;;84012:39;84068:29;84064:321;;84170:7;:23;84145:16;;;;84140:54;;84170:23;;;;;;84140:22;;:54;:::i;:::-;84226:20;;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;84279:18;;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;84356:2;84323:9;:17;;;84318:23;;84344:7;84318:33;;;;:::i;:::-;84317:41;;84114:259;;;;;;;;;;;84064:321;84405:1;84408;84411;84414;84397:19;;;;;;;;;83821:603;;;;;;:::o;1055:399::-;1277:51;;;-1:-1:-1;;;;;27489:15:1;;;1277:51:0;;;27471:34:1;27541:15;;;27521:18;;;27514:43;27573:18;;;;27566:34;;;1277:51:0;;;;;;;;;;27383:18:1;;;;1277:51:0;;;;;;;-1:-1:-1;;;;;1277:51:0;-1:-1:-1;;;1277:51:0;;;1266:63;;-1:-1:-1;;;;1266:10:0;;;;:63;;1277:51;1266:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1230:99;;;;1348:7;:57;;;;-1:-1:-1;1360:11:0;;:16;;:44;;;1391:4;1380:24;;;;;;;;;;;;:::i;:::-;1340:106;;;;-1:-1:-1;;;1340:106:0;;28244:2:1;1340:106:0;;;28226:21:1;28283:2;28263:18;;;28256:30;28322:34;28302:18;;;28295:62;-1:-1:-1;;;28373:18:1;;;28366:34;28417:19;;1340:106:0;28042:400:1;1340:106:0;1143:311;;1055:399;;;;:::o;69019:1069::-;69105:21;;:::i;:::-;69148:932;;;;;;;;69213:5;69148:932;;;;;;69264:25;69277:5;:11;;;69264:25;;:12;:25::i;:::-;-1:-1:-1;;;;;69148:932:0;;;;;69366:5;:12;;;69148:932;;;;;;69447:5;:15;;;69148:932;;;;;;69529:5;:15;;;69148:932;;;;;;69645:5;:17;;;69148:932;;;;;;69752:5;:15;;;69148:932;;;;;;69923:5;:11;;;69148:932;;;;;;69981:5;:12;;;69148:932;;;;;;70038:30;70051:5;:16;;;82313:21;82333:1;82313:21;;;;82340:30;82369:1;82340:30;;;;;;;;82312:59;;82225:154;70038:30;-1:-1:-1;;;;;69148:932:0;;;69141:939;69019:1069;-1:-1:-1;;;69019:1069:0:o;98597:690::-;98661:28;98714:9;98724;98714:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;98761:17;;;;98714:20;;-1:-1:-1;98756:36:0;;43110:12;;-1:-1:-1;;;98761:17:0;;;;98756:36;:::i;:::-;98745:47;;98819:3;98807:9;:15;98803:431;;;-1:-1:-1;;;;;98839:25:0;;:42;98865:15;98877:3;98865:9;:15;:::i;:::-;98839:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98803:431;;;99206:3;99193:9;:16;99185:37;;;;-1:-1:-1;;;99185:37:0;;28649:2:1;99185:37:0;;;28631:21:1;28688:1;28668:18;;;28661:29;-1:-1:-1;;;28706:18:1;;;28699:38;28754:18;;99185:37:0;28447:331:1;99185:37:0;99265:14;99275:3;99265:9;:14::i;:::-;99246:15;;;:33;;:15;;:33;;;;-1:-1:-1;;;99246:33:0;;-1:-1:-1;;;;;99246:33:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;99246:33:0;;;;;-1:-1:-1;;;;;99246:33:0;;;;;;98691:596;98597:690;;;;:::o;82845:369::-;82960:39;;;;;;;;82989:10;;;82960:39;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;82917:16;;;;82960:39;83016:29;83012:161;;83100:7;:23;83075:16;;;;83070:54;;83100:23;;;;;;83070:22;;:54;:::i;:::-;83139:20;;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;83062:99;;;;;82845:369;;;:::o;83012:161::-;-1:-1:-1;83201:1:0;;;;-1:-1:-1;82845:369:0;-1:-1:-1;;82845:369:0:o;77097:1560::-;77308:13;;77351:12;;;;77394;;;;77245:16;;77389:18;;;;;77346;;77492:5;77478:473;77505:6;77499:3;;;:::i;:::-;;;;:12;:48;;;;;77541:6;77520;77527:1;77520:9;;;;;;;;:::i;:::-;;;;;;;;;;:16;-1:-1:-1;;;77520:16:0;;;;77515:32;77499:48;77478:473;;;77922:6;77929:1;77922:9;;;;;;;;:::i;:::-;;;;;;;;;;:16;77902:37;;-1:-1:-1;;;77922:16:0;;;;77902:37;;:::i;:::-;;;77478:473;;;-1:-1:-1;78025:6:0;78042:461;78057:1;78049:5;:9;:58;;;;-1:-1:-1;78101:6:0;78074;78081:7;;;:::i;:::-;;;;78074:15;;;;;;;;:::i;:::-;;;;;;;;;;:22;-1:-1:-1;;;78074:22:0;;;;;-1:-1:-1;78062:45:0;;78049:58;78042:461;;;78470:6;78477:5;78470:13;;;;;;;;:::i;:::-;;;;;;;;;;:20;78450:41;;-1:-1:-1;;;78470:20:0;;;;78450:41;;:::i;:::-;;;78042:461;;;78527:1;78519:5;:9;:26;;;;78541:4;78532:6;:13;78519:26;78515:135;;;78576:13;78585:4;78576:6;:13;:::i;:::-;78562:27;;78515:135;;;78636:2;78622:16;;78515:135;77281:1376;;;77097:1560;;;;;;:::o;81238:311::-;81312:4;24094:8;81333:5;:28;81329:156;;;81378:6;81387:27;23910:7;81387:5;:27;:::i;:::-;81378:36;-1:-1:-1;81463:10:0;81378:36;81463:5;:10;:::i;:::-;81442:18;81459:1;81442:13;:18;:::i;:::-;81436:24;;:3;:24;:::i;:::-;:37;;;;:::i;:::-;81429:44;;;;;81329:156;81530:11;81508:19;81525:2;81508:13;:19;:::i;:::-;81502:25;;:3;:25;:::i;:::-;:39;;;;:::i;:::-;81495:46;81238:311;-1:-1:-1;;;81238:311:0:o;71057:5983::-;71240:32;;;;;;;;71262:10;;;71240:32;;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;;;71177:11;;;71328:13;;71177:11;;71328:13;;-1:-1:-1;;;72024:23:0;;:::i;:::-;73203:9;73224:6;73215:5;:15;;:130;;;;73333:12;73306:6;:22;;;73301:28;;73275:6;73282:5;73275:13;;;;;;;;:::i;:::-;;;;;;;;;;73267:21;;;;;;;;73275:13;;;;73267:21;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;;-1:-1:-1;73267:21:0;-1:-1:-1;73251:78:0;;73267:21;73251:78;:::i;:::-;:94;;73215:130;73203:142;;73455:4;:22;;;;73471:6;73463:4;:14;;73455:22;73451:3161;;;73564:15;;73560:2958;;73769:13;;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;73745:8;73853:29;73871:11;73853:15;:29;:::i;:::-;73942:34;;;:12;;;:34;73840:42;-1:-1:-1;74015:19:0;73840:42;74015:12;:19::i;:::-;73999:35;;:13;;;:35;74119:1;;-1:-1:-1;74119:1:0;;-1:-1:-1;74191:7:0;;74187:2213;;74401:11;;;;74374:58;;74429:2;;74420:5;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;74388:29;;74416:1;74388:29;:::i;:::-;:37;;;;:::i;:::-;74387:44;;;;:::i;:::-;74374:12;:58::i;:::-;74360:72;;:11;;;:72;74750:19;74766:3;74760:2;74751:11;;;74750:19;:::i;:::-;74744:25;;-1:-1:-1;;;74800:3:0;:21;74796:205;;;74860:21;-1:-1:-1;;;74860:3:0;:21;:::i;:::-;74854:27;;74796:205;;;74952:21;74970:3;-1:-1:-1;;;74952:21:0;:::i;:::-;74946:27;;74796:205;75526:2;75493;75477;:9;;;75472:15;;75465:4;:22;;;;:::i;:::-;23782:5;75419:9;75425:3;;75419:9;:::i;:::-;:16;;75431:4;75419:16;:::i;:::-;:42;;;;:::i;:::-;:69;;;;:::i;:::-;75418:77;;75287:2;:10;;;75282:16;;75301:1;75282:20;;;;:::i;:::-;:214;;;;:::i;:::-;75251:277;;;;:::i;:::-;75245:283;;75787:14;75781:3;:20;75777:105;;;75840:14;75834:20;;75777:105;75908:24;;;:10;;;:24;74187:2213;;;76264:13;;;;76250:27;;:11;;;:27;-1:-1:-1;76354:10:0;;;:22;74187:2213;-1:-1:-1;;76474:24:0;;;:9;;;:24;73560:2958;76590:6;76583:13;;73451:3161;76632:4;76628:50;;;76657:5;;;76628:50;76759:15;;;;76739:36;;76754:21;;76739:36;;:::i;:::-;76847:15;;;;76822:16;;;;76739:36;;-1:-1:-1;76842:21:0;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;76809:54;;;;:::i;:::-;76790:73;;;;:::i;:::-;;;72076:4799;72067:7;;;;:::i;:::-;;;72058:4817;;;76941:8;;76936:14;;76928:22;;76924:109;;;76985:5;76967:2;:8;;:24;;;;;;;;;;;77019:2;77006:4;:10;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76924:109;71126:5914;;;;;;;;;71057:5983;;:::o;79634:441::-;79820:14;;79816:252;;-1:-1:-1;;;;;79855:26:0;;79851:206;;79910:26;79923:12;79910;:26::i;:::-;-1:-1:-1;;;;;79902:44:0;:56;79947:10;79902:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79851:206;-1:-1:-1;;;;;79999:22:0;;;;;;;;;;;;;:42;;80031:10;;79999:22;:42;;80031:10;;79999:42;:::i;:::-;;;;-1:-1:-1;;79634:441:0;;;;:::o;84694:2799::-;84922:7;:23;84872:11;;;84973:13;;84799:16;;;;84872:11;84922:23;;;;;;;84799:16;;85049:25;84922:23;85049:25;;:::i;:::-;;-1:-1:-1;85193:10:0;85206;85215:1;85206:6;:10;:::i;:::-;85193:23;;85231:9;85308:661;85322:5;85315:4;:12;85308:661;;;85376:1;85359:12;85366:5;85359:4;:12;:::i;:::-;85358:19;;85350:27;;85415:6;85422:5;85415:13;;;;;;;;:::i;:::-;;;;;;;;;;:20;-1:-1:-1;;;85415:20:0;;;;;-1:-1:-1;85459:20:0;;;85455:499;;;85511:7;;;:::i;:::-;;;;85504:14;;85308:661;;85455:499;85557:11;85548:6;:20;85544:410;;;85873:7;;;:::i;:::-;;;;85865:15;;85308:661;;85544:410;85085:895;;86020:16;86051:20;86086:6;86107:14;86132:23;;:::i;:::-;86214:5;86200:593;86225:6;86221:1;:10;86200:593;;;86259:6;86266:3;;;;:::i;:::-;;;86259:11;;;;;;;;:::i;:::-;;;;;;;;;;86251:19;;;;;;;;86259:11;;;;86251:19;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;;-1:-1:-1;86251:19:0;-1:-1:-1;86336:20:0;;;86377:5;86332:66;86429:15;;;;86424:21;;;-1:-1:-1;86464:13:0;;86460:322;;86502:1;86507;86502:6;86498:146;;86537:11;86533:15;;86498:146;;;86583:11;86578:1;:16;86619:5;86574:70;;86662:24;86677:9;86662:24;;:::i;:::-;86737:16;;;;86662:24;;-1:-1:-1;86757:9:0;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;86724:42;;;;:::i;:::-;86705:61;;;;:::i;:::-;;;86460:322;86200:593;;;;86838:505;86845:9;;86838:505;;86881:6;86888:7;;;:::i;:::-;;;;86881:15;;;;;;;;:::i;:::-;;;;;;;;;;86873:23;;;;;;;;86881:15;;;;86873:23;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;;;-1:-1:-1;86873:23:0;-1:-1:-1;86963:13:0;;86959:373;;87016:5;:12;;;87011:18;;86997:32;;87052:1;87057;87052:6;87048:146;;87087:11;87083:15;;87048:146;;;87133:11;87128:1;:16;87169:5;87124:70;;87212:24;87227:9;87212:24;;:::i;:::-;87287:16;;;;87212:24;;-1:-1:-1;87307:9:0;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;87274:42;;;;:::i;:::-;87255:61;;;;:::i;:::-;;;86959:373;86838:505;;;87359:15;;87355:107;;87399:19;87403:15;87399:1;:19;:::i;:::-;87420:29;87438:11;87420:15;:29;:::i;:::-;87391:59;;;;;;;;;;;;;;;;87355:107;-1:-1:-1;87480:1:0;;;;-1:-1:-1;84694:2799:0;-1:-1:-1;;;;;;;;;;;;84694:2799:0:o;80700:530::-;-1:-1:-1;;;;;80786:21:0;;80754:4;80786:21;;;:15;:21;;;;;;80822:10;;;80818:380;;-1:-1:-1;81095:9:0;:16;-1:-1:-1;;;;;81063:21:0;;;;;;:15;:21;;;;;:48;;;-1:-1:-1;;;81062:64:0;;81054:89;;;;-1:-1:-1;;;81054:89:0;;30753:2:1;81054:89:0;;;30735:21:1;30792:2;30772:18;;;30765:30;-1:-1:-1;;;30811:18:1;;;30804:42;30863:18;;81054:89:0;30551:336:1;81054:89:0;81158:9;:16;;;;;;;-1:-1:-1;81158:16:0;;;;;;;:28;;-1:-1:-1;;;;;;81158:28:0;-1:-1:-1;;;;;81158:28:0;;;;;81217:5;80700:530;-1:-1:-1;;80700:530:0:o;78867:759::-;79038:4;-1:-1:-1;;;;;79059:26:0;;79055:564;;79109:18;79117:10;79109:5;:18;:::i;:::-;79102:25;;;;79055:564;-1:-1:-1;;;;;79213:22:0;;79190:20;79213:22;;;;;;;;;;79270:13;;79302:25;;;79298:283;;;79364:1;79348:17;;79384:99;79416:12;79430:10;79450:4;79457:25;79470:12;79457:10;:25;:::i;:::-;79384:31;:99::i;:::-;79298:283;;;79540:25;79555:10;79540:12;:25;:::i;:::-;79524:41;;79298:283;-1:-1:-1;79602:5:0;;78867:759;-1:-1:-1;;;;;78867:759:0:o;70123:872::-;70337:6;70349:637;;;;;;;;70381:12;70349:637;;;;;;70455:12;70349:637;;;;;;70523:6;70349:637;;;;;;70601:6;70349:637;;;;;;70679:6;70349:637;;;;;;70766:9;70349:637;;;;;;70859:1;70843:12;:17;;70349:637;;;;;;70916:12;70931:4;70916:19;70349:637;;;;;;70951:24;70964:10;70951:12;:24::i;:::-;70349:637;;;;;;;70337:650;;;;;;;-1:-1:-1;70337:650:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;;;;70337:650:0;;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;;;70337:650:0;;;;-1:-1:-1;;;70337:650:0;;;;;-1:-1:-1;;;;70337:650:0;;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;;;70337:650:0;;;;-1:-1:-1;;;70337:650:0;;-1:-1:-1;;;;70337:650:0;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;;;70337:650:0;;;-1:-1:-1;;;70337:650:0;;;;;-1:-1:-1;;;;70337:650:0;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;70337:650:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;70123:872:0:o;36055:163::-;36152:1;36129:11;-1:-1:-1;;;;;36129:11:0;:25;36121:54;;;;-1:-1:-1;;;36121:54:0;;31094:2:1;36121:54:0;;;31076:21:1;31133:2;31113:18;;;31106:30;-1:-1:-1;;;31152:18:1;;;31145:46;31208:18;;36121:54:0;30892:340:1;36121:54:0;36186:11;:24;;-1:-1:-1;;;;;;36186:24:0;-1:-1:-1;;;;;36186:24:0;;;;;;;;;;36055:163::o;80083:416::-;80265:14;;80261:231;;-1:-1:-1;;;;;80300:26:0;;80296:185;;80347:35;;-1:-1:-1;;;;;80347:23:0;;;:35;;;;;80371:10;;80347:35;;;;80371:10;80347:23;:35;;;;;;;;;;;;;;;;;;;689:358;881:45;;;-1:-1:-1;;;;;17962:55:1;;;881:45:0;;;17944:74:1;18034:18;;;;18027:34;;;881:45:0;;;;;;;;;;17917:18:1;;;;881:45:0;;;;;;;-1:-1:-1;;;;;881:45:0;-1:-1:-1;;;881:45:0;;;870:57;;-1:-1:-1;;;;870:10:0;;;;:57;;881:45;870:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;834:93;;;;946:7;:57;;;;-1:-1:-1;958:11:0;;:16;;:44;;;989:4;978:24;;;;;;;;;;;;:::i;:::-;938:101;;;;-1:-1:-1;;;938:101:0;;31741:2:1;938:101:0;;;31723:21:1;31780:2;31760:18;;;31753:30;31819:33;31799:18;;;31792:61;31870:18;;938:101:0;31539:355:1;81796:257:0;81852:6;;81902:95;81917:15;81909:5;:23;81902:95;;;81959:1;81949:11;;;;;81975:10;;;:::i;:::-;;;81902:95;;;82031:1;82022:10;;;;82021:23;;;;81796:257;-1:-1:-1;81796:257:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:154:1:-;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;69:93;14:154;:::o;173:383::-;250:6;258;266;319:2;307:9;298:7;294:23;290:32;287:52;;;335:1;332;325:12;287:52;371:9;358:23;348:33;;431:2;420:9;416:18;403:32;444:31;469:5;444:31;:::i;:::-;173:383;;494:5;;-1:-1:-1;;;546:2:1;531:18;;;;518:32;;173:383::o;561:162::-;627:5;672:3;663:6;658:3;654:16;650:26;647:46;;;689:1;686;679:12;647:46;-1:-1:-1;711:6:1;561:162;-1:-1:-1;561:162:1:o;728:318::-;828:6;836;889:3;877:9;868:7;864:23;860:33;857:53;;;906:1;903;896:12;857:53;942:9;929:23;919:33;;971:69;1032:7;1027:2;1016:9;1012:18;971:69;:::i;:::-;961:79;;728:318;;;;;:::o;1051:248::-;1119:6;1127;1180:2;1168:9;1159:7;1155:23;1151:32;1148:52;;;1196:1;1193;1186:12;1148:52;-1:-1:-1;;1219:23:1;;;1289:2;1274:18;;;1261:32;;-1:-1:-1;1051:248:1:o;1304:247::-;1363:6;1416:2;1404:9;1395:7;1391:23;1387:32;1384:52;;;1432:1;1429;1422:12;1384:52;1471:9;1458:23;1490:31;1515:5;1490:31;:::i;1919:180::-;1978:6;2031:2;2019:9;2010:7;2006:23;2002:32;1999:52;;;2047:1;2044;2037:12;1999:52;-1:-1:-1;2070:23:1;;1919:180;-1:-1:-1;1919:180:1:o;2537:612::-;2598:3;2636:5;2630:12;2663:6;2658:3;2651:19;2689:4;2718:2;2713:3;2709:12;2702:19;;2755:2;2748:5;2744:14;2776:1;2786:338;2800:6;2797:1;2794:13;2786:338;;;2859:13;;2901:9;;-1:-1:-1;;;;;2897:58:1;2885:71;;3000:11;;2994:18;-1:-1:-1;;;;;2990:51:1;2976:12;;;2969:73;3071:4;3062:14;;;;3099:15;;;;2822:1;2815:9;2786:338;;;-1:-1:-1;3140:3:1;;2537:612;-1:-1:-1;;;;;2537:612:1:o;3154:1987::-;3349:2;3338:9;3331:21;3394:6;3388:13;3383:2;3372:9;3368:18;3361:41;3312:4;3449:2;3441:6;3437:15;3431:22;3462:52;3510:2;3499:9;3495:18;3481:12;-1:-1:-1;;;;;1622:54:1;1610:67;;1556:127;3462:52;-1:-1:-1;3563:2:1;3551:15;;3545:22;-1:-1:-1;;;;;2169:38:1;;3625:2;3610:18;;2157:51;-1:-1:-1;3678:2:1;3666:15;;3660:22;-1:-1:-1;;;;;1622:54:1;;3741:3;3726:19;;1610:67;-1:-1:-1;3795:3:1;3783:16;;3777:23;-1:-1:-1;;;;;2169:38:1;;3858:3;3843:19;;2157:51;-1:-1:-1;3912:3:1;3900:16;;3894:23;-1:-1:-1;;;;;2285:46:1;;3976:3;3961:19;;2273:59;-1:-1:-1;4030:3:1;4018:16;;4012:23;-1:-1:-1;;;;;2169:38:1;;4093:3;4078:19;;2157:51;4044:54;4147:3;4139:6;4135:16;4129:23;4171:3;4183:53;4232:2;4221:9;4217:18;4201:14;2419:6;2408:18;2396:31;;2343:90;4183:53;4273:15;;4267:22;;-1:-1:-1;4308:3:1;4320:53;4354:18;;;4267:22;2419:6;2408:18;2396:31;;2343:90;4320:53;4410:15;;4404:22;;-1:-1:-1;4445:3:1;4457:54;4492:18;;;4404:22;-1:-1:-1;;;;;1622:54:1;1610:67;;1556:127;4457:54;4548:15;;4542:22;;-1:-1:-1;4583:3:1;4595:53;4629:18;;;4542:22;2514:10;2503:22;2491:35;;2438:94;4595:53;4686:15;;4680:22;;-1:-1:-1;4721:3:1;4733:54;4768:18;;;4680:22;2419:6;2408:18;2396:31;;2343:90;4733:54;4825:15;;4819:22;;-1:-1:-1;4860:3:1;4872:54;4907:18;;;4819:22;2419:6;2408:18;2396:31;;2343:90;4872:54;4964:15;;4958:22;4999:6;5021:18;;;5014:30;4958:22;-1:-1:-1;5061:74:1;5130:3;5115:19;;4958:22;5061:74;:::i;5146:316::-;5223:6;5231;5239;5292:2;5280:9;5271:7;5267:23;5263:32;5260:52;;;5308:1;5305;5298:12;5260:52;-1:-1:-1;;5331:23:1;;;5401:2;5386:18;;5373:32;;-1:-1:-1;5452:2:1;5437:18;;;5424:32;;5146:316;-1:-1:-1;5146:316:1:o;5467:435::-;5520:3;5558:5;5552:12;5585:6;5580:3;5573:19;5611:4;5640:2;5635:3;5631:12;5624:19;;5677:2;5670:5;5666:14;5698:1;5708:169;5722:6;5719:1;5716:13;5708:169;;;5783:13;;5771:26;;5817:12;;;;5852:15;;;;5744:1;5737:9;5708:169;;5907:548;6198:3;6187:9;6180:22;6161:4;6219:57;6271:3;6260:9;6256:19;6248:6;6219:57;:::i;:::-;6211:65;;6312:6;6307:2;6296:9;6292:18;6285:34;6355:6;6350:2;6339:9;6335:18;6328:34;6398:6;6393:2;6382:9;6378:18;6371:34;6442:6;6436:3;6425:9;6421:19;6414:35;5907:548;;;;;;;;:::o;6460:369::-;6528:6;6536;6589:2;6577:9;6568:7;6564:23;6560:32;6557:52;;;6605:1;6602;6595:12;6557:52;6641:9;6628:23;6618:33;;6701:2;6690:9;6686:18;6673:32;-1:-1:-1;;;;;6738:5:1;6734:46;6727:5;6724:57;6714:85;;6795:1;6792;6785:12;6714:85;6818:5;6808:15;;;6460:369;;;;;:::o;6834:454::-;6929:6;6937;6945;6953;6961;7014:3;7002:9;6993:7;6989:23;6985:33;6982:53;;;7031:1;7028;7021:12;6982:53;-1:-1:-1;;7054:23:1;;;7124:2;7109:18;;7096:32;;-1:-1:-1;7175:2:1;7160:18;;7147:32;;7226:2;7211:18;;7198:32;;-1:-1:-1;7277:3:1;7262:19;7249:33;;-1:-1:-1;6834:454:1;-1:-1:-1;6834:454:1:o;7600:1971::-;7833:2;7885:21;;;7955:13;;7858:18;;;7977:22;;;7804:4;;7833:2;8018;;8036:18;;;;8077:15;;;7804:4;8120:1425;8134:6;8131:1;8128:13;8120:1425;;;8193:13;;8237:9;;2514:10;2503:22;;;2491:35;;8291:11;;;8285:18;-1:-1:-1;;;;;1622:54:1;8349:12;;;1610:67;8403:11;;;8397:18;2503:22;;8462:12;;;2491:35;8498:4;8543:11;;;8537:18;2503:22;;8602:12;;;2491:35;8638:4;8683:11;;;8677:18;2503:22;;8742:12;;;2491:35;8778:4;8823:11;;;8817:18;2503:22;;;8882:12;;;2491:35;8918:4;8963:11;;;8957:18;7369:8;7358:20;9022:12;;;7346:33;9058:4;9103:11;;;9097:18;7457:4;7446:16;;;9161:12;;;7434:29;;;;9197:6;9244:11;;;9238:18;7446:16;;;9302:12;;;7434:29;9339:6;9386:12;;;9380:19;-1:-1:-1;;;;;7536:52:1;9447:13;;;7524:65;9490:6;9481:16;;;;9520:15;;;;8156:1;8149:9;8120:1425;;;-1:-1:-1;9562:3:1;;7600:1971;-1:-1:-1;;;;;;;7600:1971:1:o;9576:367::-;9639:8;9649:6;9703:3;9696:4;9688:6;9684:17;9680:27;9670:55;;9721:1;9718;9711:12;9670:55;-1:-1:-1;9744:20:1;;9787:18;9776:30;;9773:50;;;9819:1;9816;9809:12;9773:50;9856:4;9848:6;9844:17;9832:29;;9916:3;9909:4;9899:6;9896:1;9892:14;9884:6;9880:27;9876:38;9873:47;9870:67;;;9933:1;9930;9923:12;9948:640;10052:6;10060;10068;10076;10129:2;10117:9;10108:7;10104:23;10100:32;10097:52;;;10145:1;10142;10135:12;10097:52;10181:9;10168:23;10158:33;;10242:2;10231:9;10227:18;10214:32;10269:18;10261:6;10258:30;10255:50;;;10301:1;10298;10291:12;10255:50;10340:70;10402:7;10393:6;10382:9;10378:22;10340:70;:::i;:::-;10429:8;;-1:-1:-1;10314:96:1;-1:-1:-1;;10514:2:1;10499:18;;10486:32;10527:31;10486:32;10527:31;:::i;:::-;9948:640;;;;-1:-1:-1;9948:640:1;;-1:-1:-1;;9948:640:1:o;10593:261::-;10772:2;10761:9;10754:21;10735:4;10792:56;10844:2;10833:9;10829:18;10821:6;10792:56;:::i;10859:532::-;10981:6;10989;10997;11050:2;11038:9;11029:7;11025:23;11021:32;11018:52;;;11066:1;11063;11056:12;11018:52;11102:9;11089:23;11079:33;;11163:2;11152:9;11148:18;11135:32;11190:18;11182:6;11179:30;11176:50;;;11222:1;11219;11212:12;11176:50;11261:70;11323:7;11314:6;11303:9;11299:22;11261:70;:::i;:::-;10859:532;;11350:8;;-1:-1:-1;11235:96:1;;-1:-1:-1;;;;10859:532:1:o;11396:709::-;11509:6;11517;11525;11533;11541;11594:3;11582:9;11573:7;11569:23;11565:33;11562:53;;;11611:1;11608;11601:12;11562:53;11647:9;11634:23;11624:33;;11708:2;11697:9;11693:18;11680:32;11735:18;11727:6;11724:30;11721:50;;;11767:1;11764;11757:12;11721:50;11806:70;11868:7;11859:6;11848:9;11844:22;11806:70;:::i;:::-;11895:8;;-1:-1:-1;11780:96:1;-1:-1:-1;;11977:2:1;11962:18;;11949:32;;-1:-1:-1;12031:2:1;12016:18;;12003:32;12044:31;12003:32;12044:31;:::i;:::-;12094:5;12084:15;;;11396:709;;;;;;;;:::o;12110:315::-;12178:6;12186;12239:2;12227:9;12218:7;12214:23;12210:32;12207:52;;;12255:1;12252;12245:12;12207:52;12291:9;12278:23;12268:33;;12351:2;12340:9;12336:18;12323:32;12364:31;12389:5;12364:31;:::i;12683:573::-;12787:6;12795;12803;12811;12864:2;12852:9;12843:7;12839:23;12835:32;12832:52;;;12880:1;12877;12870:12;12832:52;12916:9;12903:23;12893:33;;12973:2;12962:9;12958:18;12945:32;12935:42;;13028:2;13017:9;13013:18;13000:32;13055:18;13047:6;13044:30;13041:50;;;13087:1;13084;13077:12;13041:50;13126:70;13188:7;13179:6;13168:9;13164:22;13126:70;:::i;:::-;12683:573;;;;-1:-1:-1;13215:8:1;-1:-1:-1;;;;12683:573:1:o;13261:191::-;13345:6;13398:2;13386:9;13377:7;13373:23;13369:32;13366:52;;;13414:1;13411;13404:12;13639:179;13706:20;;-1:-1:-1;;;;;13755:38:1;;13745:49;;13735:77;;13808:1;13805;13798:12;13735:77;13639:179;;;:::o;13823:924::-;13976:6;13984;13992;14000;14008;14016;14069:3;14057:9;14048:7;14044:23;14040:33;14037:53;;;14086:1;14083;14076:12;14037:53;14125:9;14112:23;14144:31;14169:5;14144:31;:::i;:::-;14194:5;-1:-1:-1;14218:37:1;14251:2;14236:18;;14218:37;:::i;:::-;14208:47;;14307:2;14296:9;14292:18;14279:32;14320:33;14345:7;14320:33;:::i;:::-;14372:7;-1:-1:-1;14430:2:1;14415:18;;14402:32;14457:18;14446:30;;14443:50;;;14489:1;14486;14479:12;14443:50;14528:70;14590:7;14581:6;14570:9;14566:22;14528:70;:::i;:::-;14617:8;;-1:-1:-1;14502:96:1;-1:-1:-1;14671:70:1;;-1:-1:-1;14733:7:1;14727:3;14712:19;;14671:70;:::i;:::-;14661:80;;13823:924;;;;;;;;:::o;15604:315::-;15672:6;15680;15733:2;15721:9;15712:7;15708:23;15704:32;15701:52;;;15749:1;15746;15739:12;15701:52;15788:9;15775:23;15807:31;15832:5;15807:31;:::i;:::-;15857:5;15909:2;15894:18;;;;15881:32;;-1:-1:-1;;;15604:315:1:o;15924:388::-;15992:6;16000;16053:2;16041:9;16032:7;16028:23;16024:32;16021:52;;;16069:1;16066;16059:12;16021:52;16108:9;16095:23;16127:31;16152:5;16127:31;:::i;:::-;16177:5;-1:-1:-1;16234:2:1;16219:18;;16206:32;16247:33;16206:32;16247:33;:::i;16317:127::-;16378:10;16373:3;16369:20;16366:1;16359:31;16409:4;16406:1;16399:15;16433:4;16430:1;16423:15;16789:127;16850:10;16845:3;16841:20;16838:1;16831:31;16881:4;16878:1;16871:15;16905:4;16902:1;16895:15;16921:237;16960:4;-1:-1:-1;;;;;17065:10:1;;;;17035;;17087:12;;;17084:38;;;17102:18;;:::i;:::-;17139:13;;16921:237;-1:-1:-1;;;16921:237:1:o;17163:338::-;17365:2;17347:21;;;17404:2;17384:18;;;17377:30;-1:-1:-1;;;17438:2:1;17423:18;;17416:44;17492:2;17477:18;;17163:338::o;17506:251::-;17576:6;17629:2;17617:9;17608:7;17604:23;17600:32;17597:52;;;17645:1;17642;17635:12;17597:52;17677:9;17671:16;17696:31;17721:5;17696:31;:::i;18072:277::-;18139:6;18192:2;18180:9;18171:7;18167:23;18163:32;18160:52;;;18208:1;18205;18198:12;18160:52;18240:9;18234:16;18293:5;18286:13;18279:21;18272:5;18269:32;18259:60;;18315:1;18312;18305:12;18691:127;18752:10;18747:3;18743:20;18740:1;18733:31;18783:4;18780:1;18773:15;18807:4;18804:1;18797:15;18823:135;18862:3;18883:17;;;18880:43;;18903:18;;:::i;:::-;-1:-1:-1;18950:1:1;18939:13;;18823:135::o;18963:338::-;19165:2;19147:21;;;19204:2;19184:18;;;19177:30;-1:-1:-1;;;19238:2:1;19223:18;;19216:44;19292:2;19277:18;;18963:338::o;19650:253::-;19690:3;-1:-1:-1;;;;;19779:2:1;19776:1;19772:10;19809:2;19806:1;19802:10;19840:3;19836:2;19832:12;19827:3;19824:21;19821:47;;;19848:18;;:::i;:::-;19884:13;;19650:253;-1:-1:-1;;;;19650:253:1:o;19908:125::-;19948:4;19976:1;19973;19970:8;19967:34;;;19981:18;;:::i;:::-;-1:-1:-1;20018:9:1;;19908:125::o;20038:136::-;20077:3;20105:5;20095:39;;20114:18;;:::i;:::-;-1:-1:-1;;;20150:18:1;;20038:136::o;20179:128::-;20219:3;20250:1;20246:6;20243:1;20240:13;20237:39;;;20256:18;;:::i;:::-;-1:-1:-1;20292:9:1;;20179:128::o;20312:545::-;20405:4;20411:6;20471:11;20458:25;20565:2;20561:7;20550:8;20534:14;20530:29;20526:43;20506:18;20502:68;20492:96;;20584:1;20581;20574:12;20492:96;20611:33;;20663:20;;;-1:-1:-1;20706:18:1;20695:30;;20692:50;;;20738:1;20735;20728:12;20692:50;20771:4;20759:17;;-1:-1:-1;20822:1:1;20818:14;;;20802;20798:35;20788:46;;20785:66;;;20847:1;20844;20837:12;21199:168;21239:7;21305:1;21301;21297:6;21293:14;21290:1;21287:21;21282:1;21275:9;21268:17;21264:45;21261:71;;;21312:18;;:::i;:::-;-1:-1:-1;21352:9:1;;21199:168::o;21372:217::-;21412:1;21438;21428:132;;21482:10;21477:3;21473:20;21470:1;21463:31;21517:4;21514:1;21507:15;21545:4;21542:1;21535:15;21428:132;-1:-1:-1;21574:9:1;;21372:217::o;22866:117::-;22951:6;22944:5;22940:18;22933:5;22930:29;22920:57;;22973:1;22970;22963:12;22988:760;23149:5;23136:19;23187:4;23178:7;23174:18;23223:2;23214:7;23211:15;23201:43;;23240:1;23237;23230:12;23201:43;23263:11;;-1:-1:-1;;23299:17:1;;23296:25;;23283:39;;23263:11;-1:-1:-1;23370:2:1;23359:14;;23346:28;23383:32;23346:28;23383:32;:::i;:::-;23461:8;23451:7;23448:1;23444:15;23440:30;23424:46;;23527:8;23522:2;23510:8;23506:13;23502:2;23498:22;23495:30;23492:44;23486:4;23479:58;23585:2;23578:5;23574:14;23561:28;23598:32;23622:7;23598:32;:::i;:::-;-1:-1:-1;;23671:26:1;;;;23668:34;;;23655:48;23713:2;23709:16;;;;23727:12;23705:35;23652:89;23639:103;;-1:-1:-1;22988:760:1:o;24966:197::-;25004:3;25032:6;25073:2;25066:5;25062:14;25100:2;25091:7;25088:15;25085:41;;25106:18;;:::i;:::-;25155:1;25142:15;;24966:197;-1:-1:-1;;;24966:197:1:o;26518:246::-;26558:4;-1:-1:-1;;;;;26671:10:1;;;;26641;;26693:12;;;26690:38;;;26708:18;;:::i;26769:184::-;26827:6;26880:2;26868:9;26859:7;26855:23;26851:32;26848:52;;;26896:1;26893;26886:12;26848:52;26919:28;26937:9;26919:28;:::i;26958:245::-;27016:6;27069:2;27057:9;27048:7;27044:23;27040:32;27037:52;;;27085:1;27082;27075:12;27037:52;27124:9;27111:23;27143:30;27167:5;27143:30;:::i;27611:426::-;27740:3;27778:6;27772:13;27803:1;27813:129;27827:6;27824:1;27821:13;27813:129;;;27925:4;27909:14;;;27905:25;;27899:32;27886:11;;;27879:53;27842:12;27813:129;;;27960:6;27957:1;27954:13;27951:48;;;27995:1;27986:6;27981:3;27977:16;27970:27;27951:48;-1:-1:-1;28015:16:1;;;;;27611:426;-1:-1:-1;;27611:426:1:o;28783:244::-;28822:3;-1:-1:-1;;;;;28903:2:1;28900:1;28896:10;28933:2;28930:1;28926:10;28964:3;28960:2;28956:12;28951:3;28948:21;28945:47;;;28972:18;;:::i;29032:422::-;29121:1;29164:5;29121:1;29178:270;29199:7;29189:8;29186:21;29178:270;;;29258:4;29254:1;29250:6;29246:17;29240:4;29237:27;29234:53;;;29267:18;;:::i;:::-;29317:7;29307:8;29303:22;29300:55;;;29337:16;;;;29300:55;29416:22;;;;29376:15;;;;29178:270;;;29182:3;29032:422;;;;;:::o;29459:806::-;29508:5;29538:8;29528:80;;-1:-1:-1;29579:1:1;29593:5;;29528:80;29627:4;29617:76;;-1:-1:-1;29664:1:1;29678:5;;29617:76;29709:4;29727:1;29722:59;;;;29795:1;29790:130;;;;29702:218;;29722:59;29752:1;29743:10;;29766:5;;;29790:130;29827:3;29817:8;29814:17;29811:43;;;29834:18;;:::i;:::-;-1:-1:-1;;29890:1:1;29876:16;;29905:5;;29702:218;;30004:2;29994:8;29991:16;29985:3;29979:4;29976:13;29972:36;29966:2;29956:8;29953:16;29948:2;29942:4;29939:12;29935:35;29932:77;29929:159;;;-1:-1:-1;30041:19:1;;;30073:5;;29929:159;30120:34;30145:8;30139:4;30120:34;:::i;:::-;30190:6;30186:1;30182:6;30178:19;30169:7;30166:32;30163:58;;;30201:18;;:::i;:::-;30239:20;;29459:806;-1:-1:-1;;;29459:806:1:o;30270:131::-;30330:5;30359:36;30386:8;30380:4;30359:36;:::i;30406:140::-;30464:5;30493:47;30534:4;30524:8;30520:19;30514:4;30493:47;:::i

Swarm Source

ipfs://0cee153871bd293e04467f2aa670731da84919fc24550faf488e9dd645508433

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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