ETH Price: $3,235.23 (-2.09%)

Contract

0x7837d182a80d9eec653cd39ab63454e819BEE55B
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Token Contra...158357962022-10-27 0:21:59815 days ago1666830119IN
0x7837d182...819BEE55B
0 ETH0.000597212.1423124
Transfer Ownersh...158357822022-10-27 0:19:11815 days ago1666829951IN
0x7837d182...819BEE55B
0 ETH0.0003567512.25629985

Advanced mode:
Parent Transaction Hash Block
From
To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EthericeStaking

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-27
*/

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/security/[email protected]
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File contracts/EthericeStaking.sol
pragma solidity 0.8.16;



interface TokenContractInterface {
    function calcDay() external view returns (uint256);

    function lobbyEntry(uint256 _day) external view returns (uint256);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transfer(address _to, uint256 _value)
        external
        returns (bool success);
    function allowance(address owner, address spender) external view returns (uint256);
    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function dev_addr() external view returns (address);
}

contract EthericeStaking is Ownable, ReentrancyGuard {
    event NewStake(
        address indexed addr,
        uint256 timestamp,
        uint256 indexed stakeId,
        uint256 stakeAmount,
        uint256 stakeDuration
    );
    event StakeCollected(
        address indexed addr,
        uint256 timestamp,
        uint256 indexed stakeId,
        uint256 stakeAmount,
        uint256 divsReceived
    );
    event SellStakeRequest(
        address indexed addr,
        uint256 timestamp,
        uint256 indexed stakeId,
        uint256 price
    );
    event CancelStakeSellRequest(
        address indexed addr,
        uint256 timestamp,
        uint256 indexed stakeId
    );
    event StakeSold(
        address indexed from,
        address indexed to,
        uint256 timestamp,
        uint256 sellAmount,
        uint256 indexed stakeId
    );
    event NewLoanRequest(
        address indexed addr,
        uint256 timestamp,
        uint256 loanAmount,
        uint256 interestAmount,
        uint256 duration,
        uint256 indexed stakeId
    );
    event LoanRequestFilled(
        address indexed filledBy,
        uint256 timestamp,
        address indexed receivedBy,
        uint256 loanamount,
        uint256 indexed stakeId
    );
    event LoanRepaid(
        address indexed paidTo,
        uint256 timestamp,
        uint256 interestAmount,
        uint256 loanamount,
        uint256 indexed stakeId
    );
    event CancelLoanRequest(
        address indexed addr,
        uint256 timestamp,
        uint256 indexed stakeId
    );

    struct stake {
        address owner;
        uint256 tokensStaked;
        uint256 startDay;
        uint256 endDay;
        uint256 forSalePrice;
        uint256 loanRepayments; // loan repayments made on this stake (deduct from divs on withdrawal)
        bool hasCollected;
    }

    /* A map for each  stakeId => struct stake */
    mapping(uint256 => stake) public mapStakes;
    uint256 public lastStakeIndex;
    /* Address => stakeId for a users stakes */
    mapping(address => uint256[]) internal _userStakes;

    struct loan {
        address requestedBy;
        address filledBy;
        uint256 loanAmount;
        uint256 loanInterest;
        uint256 loanDuration;
        uint256 startDay;
        uint256 endDay;
    }
    /* A map for each loan loanId => struct loan */
    mapping(uint256 => loan) public mapLoans;
    /* Address => stakeId for a users loans (address is the person filling the loan not receiving it) */
    mapping(address => uint256[]) internal _userLends;

    /** Hold amount of eth owed to dev fees */
    uint256 public devFees;

    /** Total ETH in the dividend pool for each day */
    mapping(uint256 => uint256) public dayDividendPool;

    /** Total tokens that have been staked each day */
    mapping(uint256 => uint256) public tokensInActiveStake;

    /** TokenContract object  */
    TokenContractInterface public _tokenContract;

    /** Ensures that token contract can't be changed for securiy */
    bool public tokenContractAddressSet = false;

    /** The amount of days each days divs would be spread over */
    uint256 public maxDividendRewardDays = 30;

    /** The max amount of days user can stake */
    uint256 public maxStakeDays = 60;

    uint256 constant public devSellStakeFee = 10;
    uint256 constant public devLoanFeePercent = 2;

    address public deployer;

    constructor() {
        deployer = msg.sender;
    }

    receive() external payable {}

    /**
        @dev Set the contract address, must be run before any eth is posted
        to the contract
        @param _address the token contract address
    */
    function setTokenContractAddress(address _address) external {
        require(_address != address(0), "Address cannot be zero");
        require(tokenContractAddressSet == false, "Token contract address already set");
        require(msg.sender==deployer, "Only deployer can set this value");
        require(owner() != deployer, "Ownership must be transferred before contract start");
        tokenContractAddressSet = true;
        _tokenContract = TokenContractInterface(_address);
    }

    /**
        @dev runs when and eth is sent to the divs contract and distros
        it out across the total div days
    */
    function receiveDivs() external payable {
        // calcDay will return 2 when we're processing the divs from day 1
        uint256 _day =  _tokenContract.calcDay();
        require(_day > 1, "receive divs not yet enabled");
        // We process divs for previous day;
        _day--;

        require(msg.sender == address(_tokenContract), "Unauthorized");
        uint256 _daysToSplitRewardsOver = _day < maxDividendRewardDays
            ? _day
            : maxDividendRewardDays;

        if(_day == 1) {
            _daysToSplitRewardsOver = 2 ;
        }
        
        uint256 _totalDivsPerDay = msg.value / _daysToSplitRewardsOver ;
        
        for (uint256 i = 1; i <= _daysToSplitRewardsOver; ) {
            dayDividendPool[_day + i] += _totalDivsPerDay;
            unchecked {
                i++;
            }
        }
    }

    /**
        @dev update the max days dividends are spread over
        @param _newMaxRewardDays the max days
    */
    function updateMaxDividendRewardDays(uint256 _newMaxRewardDays) external onlyOwner {
        require((_newMaxRewardDays <= 60 && _newMaxRewardDays >= 10), "New value must be <= 60 & >= 10");
        maxDividendRewardDays = _newMaxRewardDays;
    }

    /**
     * @dev set the max staking days
     * @param _amount the number of days
     */
    function updateMaxStakeDays(uint256 _amount) external onlyOwner {
        require((_amount <= 300 && _amount > 30), "New value must be <= 300 and > 30");
        maxStakeDays = _amount;
    }

    /**
     * @dev User creates a new stake 
     * @param _amount total tokens to stake
     * @param _days must be less than max stake days. 
     * the more days the higher the gas fee
     */
    function newStake(uint256 _amount, uint256 _days) external nonReentrant {
        require(_days > 1, "Staking: Staking days < 1");
        require(
            _days <= maxStakeDays,
            "Staking: Staking days > max_stake_days"
        );

        uint256 _currentDay = _tokenContract.calcDay();
        require(_currentDay > 0, "Staking not enabled");

        bool success = _tokenContract.transferFrom(msg.sender, address(this), _amount);
        require(success, "Transfer failed");


        uint256 _stakeId = _getNextStakeId();

        uint256 _endDay =_currentDay + 1 + _days;
        uint256 _startDay = _currentDay + 1;
        mapStakes[_stakeId] = stake({
            owner: msg.sender,
            tokensStaked: _amount,
            startDay: _startDay,
            endDay: _endDay,
            forSalePrice: 0,
            hasCollected: false,
            loanRepayments: 0
        });

        for (uint256 i = _startDay; i < _endDay ;) {
            tokensInActiveStake[i] += _amount;

            unchecked{ i++; }
        }

        _userStakes[msg.sender].push(_stakeId);

        emit NewStake(msg.sender, block.timestamp, _stakeId, _amount, _days);
    }

    /** 
     * @dev Get the next stake id index 
     */
    function _getNextStakeId() internal returns (uint256) {
        lastStakeIndex++;
        return lastStakeIndex;
    }

    /**
     * @dev called by user to collect an outstading stake
     */
    function collectStake(uint256 _stakeId) external nonReentrant {
        stake storage _stake = mapStakes[_stakeId];
        uint256 currentDay = _tokenContract.calcDay();
        
        require(_stake.owner == msg.sender, "Unauthorised");
        require(_stake.hasCollected == false, "Already Collected");
        require( currentDay > _stake.endDay , "Stake hasn't ended");

        // Check for outstanding loans
        loan storage _loan = mapLoans[_stakeId];
        if(_loan.filledBy != address(0)){
            // Outstanding loan has not been paid off 
            // so do that now
            repayLoan(_stakeId);
        } else if (_loan.requestedBy != address(0)) {
            _clearLoan(_stakeId);   
        }

        // Get new instance of loan after potential updates
        _loan = mapLoans[_stakeId];

         // Get the loan from storage again 
         // and check its cleard before we move on
        require(_loan.filledBy == address(0), "Stake has unpaid loan");
        require(_loan.requestedBy == address(0), "Stake has outstanding loan request");
            
        uint256 profit = calcStakeCollecting(_stakeId);
        mapStakes[_stakeId].hasCollected = true;

        // Send user the stake back
        bool success = _tokenContract.transfer(
            msg.sender,
            _stake.tokensStaked
        );
        require(success, "Transfer failed");

        // Send the user divs
        Address.sendValue( payable(_stake.owner) , profit);

        emit StakeCollected(
            _stake.owner,
            block.timestamp,
            _stakeId,
            _stake.tokensStaked,
            profit
        );
    }

    /** 
     * Added an auth wrapper to the cancel loan request
     * so it cant be canceled by just anyone externally
     */
    function cancelLoanRequest(uint256 _stakeId) external {
        stake storage _stake = mapStakes[_stakeId];
        require(msg.sender == _stake.owner, "Unauthorised");
        _cancelLoanRequest(_stakeId);
    }

    function _cancelLoanRequest(uint256 _stakeId) internal {
        mapLoans[_stakeId] = loan({
            requestedBy: address(0),
            filledBy: address(0),
            loanAmount: 0,
            loanInterest: 0,
            loanDuration: 0,
            startDay: 0,
            endDay: 0
        });

        emit CancelLoanRequest(
            msg.sender,
            block.timestamp,
            _stakeId
        );
    }

    function _clearLoan(uint256 _stakeId) internal {
        loan storage _loan = mapLoans[_stakeId];
         if(_loan.filledBy == address(0)) {
                // Just an unfilled loan request so we can cancel it off
                _cancelLoanRequest(_stakeId);
            } else  {
                // Loan was filled so if its not been claimed yet we need to 
                // send the repayment back to the loaner
                repayLoan(_stakeId);
            }
    }

    /**
     * @dev Calculating a stakes ETH divs payout value by looping through each day of it
     * @param _stakeId Id of the target stake
     */
    function calcStakeCollecting(uint256 _stakeId)
        public
        view
        returns (uint256)
    {
        uint256 currentDay = _tokenContract.calcDay();
        uint256 userDivs;
        stake memory _stake = mapStakes[_stakeId];

        for (
            uint256 _day = _stake.startDay;
            _day < _stake.endDay && _day < currentDay;
        ) {
            userDivs +=
                (dayDividendPool[_day] * _stake.tokensStaked) /
                tokensInActiveStake[_day];

                unchecked {
                    _day++;
                }
        }

        delete currentDay;
        delete _stake;

        // remove any loans returned amount from the total
        return (userDivs - _stake.loanRepayments);
    }

    function listStakeForSale(uint256 _stakeId, uint256 _price) external {
        stake memory _stake = mapStakes[_stakeId];
        require(_stake.owner == msg.sender, "Unauthorised");
        require(_stake.hasCollected == false, "Already Collected");

        uint256 _currentDay = _tokenContract.calcDay();
        require(_stake.endDay >= _currentDay, "Stake has ended");

         // can't list a stake for sale whilst we have an outstanding loan against it
        loan storage _loan = mapLoans[_stakeId];
        require(_loan.requestedBy == address(0), "Stake has an outstanding loan request");

        mapStakes[_stakeId].forSalePrice = _price;

        emit SellStakeRequest(msg.sender, block.timestamp, _stakeId, _price);

        delete _currentDay;
        delete _stake;
    }

    function cancelStakeSellRequest(uint256 _stakeId) external {
        require(mapStakes[_stakeId].owner == msg.sender, "Unauthorised");
        require(mapStakes[_stakeId].forSalePrice > 0, "Stake is not for sale");
        mapStakes[_stakeId].forSalePrice = 0;

        emit CancelStakeSellRequest(
            msg.sender,
            block.timestamp,
            _stakeId
        );
    }

    function buyStake(uint256 _stakeId) external payable nonReentrant {
        stake memory _stake = mapStakes[_stakeId];
        require(_stake.forSalePrice > 0, "Stake not for sale");
        require(_stake.owner != msg.sender, "Can't buy own stakes");

        loan storage _loan = mapLoans[_stakeId];
        require(_loan.filledBy == address(0), "Can't buy stake with unpaid loan");

        uint256 _currentDay = _tokenContract.calcDay();
        require(
            _stake.endDay > _currentDay,
            "stake can't be brought after it has ended"
        );
        require(_stake.hasCollected == false, "Stake already collected");
        require(msg.value >= _stake.forSalePrice, "msg.value is < stake price");

        uint256 _devShare = (_stake.forSalePrice * devSellStakeFee) / 100;
        uint256 _sellAmount =  _stake.forSalePrice - _devShare;

        dayDividendPool[_currentDay] += _devShare / 2;
        devFees += _devShare / 2;

        _userStakes[msg.sender].push(_stakeId);

        mapStakes[_stakeId].owner = msg.sender;
        mapStakes[_stakeId].forSalePrice = 0;

        Address.sendValue(payable(_stake.owner), _sellAmount);

        emit StakeSold(
            _stake.owner,
            msg.sender,
            block.timestamp,
            _sellAmount,
            _stakeId
        );

        delete _stake;
    }

    /**
     * @dev send the devFees to the dev wallet
     */
    function flushDevTaxes() external nonReentrant{
        address _devWallet = _tokenContract.dev_addr();
        uint256 _devFees = devFees;
        devFees = 0;
        Address.sendValue(payable(_devWallet), _devFees);
    }

    function requestLoanOnStake(
        uint256 _stakeId,
        uint256 _loanAmount,
        uint256 _interestAmount,
        uint256 _duration
    ) external {

        stake storage _stake = mapStakes[_stakeId];
        require(_stake.owner == msg.sender, "Unauthorised");
        require(_stake.hasCollected == false, "Already Collected");

        uint256 _currentDay = _tokenContract.calcDay();
        require(_stake.endDay > (_currentDay + _duration), "Loan must expire before stake end day");

        loan storage _loan = mapLoans[_stakeId];
        require(_loan.filledBy == address(0), "Stake already has outstanding loan");

        uint256 userDivs = calcStakeCollecting(_stakeId);
        require(userDivs > ( _stake.loanRepayments + _loanAmount + _interestAmount), "Loan amount is > divs earned so far");


        mapLoans[_stakeId] = loan({
            requestedBy: msg.sender,
            filledBy: address(0),
            loanAmount: _loanAmount,
            loanInterest: _interestAmount,
            loanDuration: _duration,
            startDay: 0,
            endDay: 0
        });

        emit NewLoanRequest(
            msg.sender,
            block.timestamp,
            _loanAmount,
            _interestAmount,
            _duration,
            _stakeId
        );
    }

    function fillLoan(uint256 _stakeId) external payable nonReentrant {
        stake storage _stake = mapStakes[_stakeId];
        loan storage _loan = mapLoans[_stakeId];
        
        require(_loan.requestedBy != address(0), "No active loan on this stake");
        require(_stake.hasCollected == false, "Stake Collected");

        uint256 _currentDay = _tokenContract.calcDay();
        require(_stake.endDay > _currentDay, "Stake ended");

        require(_stake.endDay > (_currentDay + _loan.loanDuration), "Loan must expire before stake end day");
        
        require(_loan.filledBy == address(0), "Already filled");
        require(_loan.loanAmount <= msg.value, "Not enough eth");

        require(msg.sender != _stake.owner, "No lend on own stakes");

        if (_stake.forSalePrice > 0) {
            // Can't sell a stake with an outstanding loan so we remove from sale
            mapStakes[_stakeId].forSalePrice = 0;
        }

        mapLoans[_stakeId] = loan({
            requestedBy: _loan.requestedBy,
            filledBy: msg.sender,
            loanAmount: _loan.loanAmount,
            loanInterest: _loan.loanInterest,
            loanDuration: _loan.loanDuration,
            startDay: _currentDay + 1,
            endDay: _currentDay + 1 + _loan.loanDuration
        });

        // Deduct fees
        uint256 _devShare = (_loan.loanAmount * devLoanFeePercent) / 100;
        uint256 _loanAmount = _loan.loanAmount - _devShare; 

        dayDividendPool[_currentDay] += _devShare / 2;
        devFees += _devShare / 2;

        // Send the loan to the requester
        Address.sendValue(payable(_loan.requestedBy), _loanAmount);

        _userLends[msg.sender].push(_stakeId);

        emit LoanRequestFilled(
            msg.sender,
            block.timestamp,
            _stake.owner,
            _loanAmount,
            _stakeId
        );
    }

    /**
     * This function is public so any can call and it
     * will repay the loan to the loaner. Stakes can only
     * have 1 active loan at a time so if the staker wants
     * to take out a new loan they will have to call the 
     * repayLoan function first to pay the outstanding 
     * loan.
     * This avoids us having to use an array and loop
     * through loans to see which ones need paying back
     * @param _stakeId the stake to repay the loan from 
     */
    function repayLoan(uint256 _stakeId) public {
        loan memory _loan = mapLoans[_stakeId];
        require(_loan.requestedBy != address(0), "No loan on stake");
        require(_loan.filledBy != address(0), "Loan not filled");

        uint256 _currentDay = _tokenContract.calcDay();
        require(_loan.endDay <= _currentDay, "Loan duration not met");

        // Save the payment here so its deducted from the divs 
        // on withdrawal
        mapStakes[_stakeId].loanRepayments += (  _loan.loanAmount + _loan.loanInterest );

        _cancelLoanRequest(_stakeId);
        
        Address.sendValue(payable(_loan.filledBy), _loan.loanAmount + _loan.loanInterest);

        // address indexed paidTo,
        // uint256 timestamp,
        // address interestAmount,
        // uint256 loanamount,
        // uint256 stakeId
        emit LoanRepaid(
            _loan.filledBy,
            block.timestamp,
            _loan.loanInterest,
            _loan.loanAmount,
            _stakeId
        );
    }

    function totalDividendPool() external view returns (uint256) {
        uint256 _day = _tokenContract.calcDay();
        // Prevent start day going to -1 on day 0
        if(_day <= 0) {
            return 0;
        }
        uint256 _startDay = _day;
        uint256 _total;
        for (uint256 i = 0; i <= (_startDay +  maxDividendRewardDays) ; ) {
            _total += dayDividendPool[_startDay + i];
            unchecked {
                 i++;
            }
        }
    
        return _total;
    }

    function userStakes(address _address) external view returns(uint256[] memory){
        return _userStakes[_address];
    }

    function userLends(address _address) external view returns (uint256[] memory) {
        return _userLends[_address];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"CancelLoanRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"CancelStakeSellRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"paidTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interestAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanamount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"LoanRepaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"filledBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"address","name":"receivedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanamount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"LoanRequestFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interestAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"NewLoanRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeDuration","type":"uint256"}],"name":"NewStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"SellStakeRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"divsReceived","type":"uint256"}],"name":"StakeCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"StakeSold","type":"event"},{"inputs":[],"name":"_tokenContract","outputs":[{"internalType":"contract TokenContractInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"buyStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"calcStakeCollecting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"cancelLoanRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"cancelStakeSellRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"collectStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dayDividendPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devLoanFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devSellStakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"fillLoan","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flushDevTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastStakeIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"listStakeForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mapLoans","outputs":[{"internalType":"address","name":"requestedBy","type":"address"},{"internalType":"address","name":"filledBy","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"loanInterest","type":"uint256"},{"internalType":"uint256","name":"loanDuration","type":"uint256"},{"internalType":"uint256","name":"startDay","type":"uint256"},{"internalType":"uint256","name":"endDay","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mapStakes","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokensStaked","type":"uint256"},{"internalType":"uint256","name":"startDay","type":"uint256"},{"internalType":"uint256","name":"endDay","type":"uint256"},{"internalType":"uint256","name":"forSalePrice","type":"uint256"},{"internalType":"uint256","name":"loanRepayments","type":"uint256"},{"internalType":"bool","name":"hasCollected","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDividendRewardDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxStakeDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"newStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveDivs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"repayLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"},{"internalType":"uint256","name":"_loanAmount","type":"uint256"},{"internalType":"uint256","name":"_interestAmount","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"requestLoanOnStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTokenContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenContractAddressSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensInActiveStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxRewardDays","type":"uint256"}],"name":"updateMaxDividendRewardDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMaxStakeDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"userLends","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"userStakes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600a60146101000a81548160ff021916908315150217905550601e600b55603c600c553480156200003657600080fd5b50620000576200004b620000a560201b60201c565b620000ad60201b60201c565b6001808190555033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000171565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b615bde80620001816000396000f3fe6080604052600436106101fd5760003560e01c80637605a8131161010d578063b23d4854116100a0578063d5f394881161006f578063d5f394881461071a578063e21b6ade14610745578063ebcac85114610770578063ec2af8cb14610799578063f2fde38b146107a357610204565b8063b23d485414610681578063b54ec8e6146106aa578063b9d2b803146106d5578063d11e7fff146106f157610204565b80639595ec05116100dc5780639595ec05146105db57806397d98efe146106045780639c26d9b11461062f578063ab7b1c891461065857610204565b80637605a813146104f95780637b1f4ec0146105365780638da5cb5b146105735780638da7ad231461059e57610204565b806348dd0c8c116101905780636026e2771161015f5780636026e2771461040e578063674a9112146104395780636af2d88f1461047c578063715018a6146104a557806374eca038146104bc57610204565b806348dd0c8c1461036657806349c64c0d1461039157806350ede095146103ba5780635a680367146103e557610204565b80633758ca16116101cc5780633758ca16146102a6578063376ac76c146102e957806345340f9f146103005780634711e1481461032957610204565b80630224e9a7146102095780631cd6fd1d1461023457806327b743f11461025f5780632d8612c41461027b57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e6107cc565b60405161022b9190613f7e565b60405180910390f35b34801561024057600080fd5b506102496107d2565b6040516102569190613fb4565b60405180910390f35b61027960048036038101906102749190614000565b6107e5565b005b34801561028757600080fd5b50610290610f5c565b60405161029d9190613f7e565b60405180910390f35b3480156102b257600080fd5b506102cd60048036038101906102c89190614000565b610f61565b6040516102e0979695949392919061406e565b60405180910390f35b3480156102f557600080fd5b506102fe610fe3565b005b34801561030c57600080fd5b50610327600480360381019061032291906140dd565b6110e9565b005b34801561033557600080fd5b50610350600480360381019061034b9190614170565b61157a565b60405161035d919061425b565b60405180910390f35b34801561037257600080fd5b5061037b611611565b6040516103889190613f7e565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b3919061427d565b611617565b005b3480156103c657600080fd5b506103cf611aef565b6040516103dc9190613f7e565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190614000565b611af4565b005b34801561041a57600080fd5b50610423611baa565b604051610430919061431c565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190614000565b611bd0565b6040516104739796959493929190614337565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190614000565b611c3f565b005b3480156104b157600080fd5b506104ba61225f565b005b3480156104c857600080fd5b506104e360048036038101906104de9190614000565b612273565b6040516104f09190613f7e565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190614000565b612474565b60405161052d9190613f7e565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190614000565b61248c565b60405161056a9190613f7e565b60405180910390f35b34801561057f57600080fd5b506105886124a4565b60405161059591906143a6565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c09190614170565b6124cd565b6040516105d2919061425b565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190614000565b612564565b005b34801561061057600080fd5b506106196126cf565b6040516106269190613f7e565b60405180910390f35b34801561063b57600080fd5b506106566004803603810190610651919061427d565b6126d5565b005b34801561066457600080fd5b5061067f600480360381019061067a9190614000565b612a5e565b005b34801561068d57600080fd5b506106a860048036038101906106a39190614170565b612dee565b005b3480156106b657600080fd5b506106bf613039565b6040516106cc9190613f7e565b60405180910390f35b6106ef60048036038101906106ea9190614000565b613146565b005b3480156106fd57600080fd5b5061071860048036038101906107139190614000565b613722565b005b34801561072657600080fd5b5061072f613785565b60405161073c91906143a6565b60405180910390f35b34801561075157600080fd5b5061075a6137ab565b6040516107679190613f7e565b60405180910390f35b34801561077c57600080fd5b5061079760048036038101906107929190614000565b6137b1565b005b6107a1613814565b005b3480156107af57600080fd5b506107ca60048036038101906107c59190614170565b613a14565b005b60075481565b600a60149054906101000a900460ff1681565b60026001540361082a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108219061441e565b60405180910390fd5b600260018190555060006002600083815260200190815260200160002090506000600560008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036108f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ea9061448a565b60405180910390fd5b600015158260060160009054906101000a900460ff1615151461094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906144f6565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109de919061452b565b905080836003015411610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d906145a4565b60405180910390fd5b816004015481610a3691906145f3565b836003015411610a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7290614699565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590614705565b60405180910390fd5b3482600201541115610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c90614771565b60405180910390fd5b8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde906147dd565b60405180910390fd5b600083600401541115610c1157600060026000868152602001908152602001600020600401819055505b6040518060e001604052808360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001836002015481526020018360030154815260200183600401548152602001600183610ca391906145f3565b81526020018360040154600184610cba91906145f3565b610cc491906145f3565b8152506005600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506000606460028460020154610db291906147fd565b610dbc9190614886565b90506000818460020154610dd091906148b7565b9050600282610ddf9190614886565b600860008581526020019081526020016000206000828254610e0191906145f3565b92505081905550600282610e159190614886565b60076000828254610e2691906145f3565b92505081905550610e5b8460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613a97565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190915055858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb0ce0257a82207c2c8b55d683b2ae00db4daa00047172540f40f2fe1d9cba4774285604051610f459291906148eb565b60405180910390a450505050506001808190555050565b600281565b60056020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154905087565b600260015403611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f9061441e565b60405180910390fd5b60026001819055506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302d8325c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c39190614929565b90506000600754905060006007819055506110de8282613a97565b505060018081905550565b60006002600086815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611189906149a2565b60405180910390fd5b600015158160060160009054906101000a900460ff161515146111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e190614a0e565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127d919061452b565b9050828161128b91906145f3565b8260030154116112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614699565b60405180910390fd5b6000600560008881526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190614aa0565b60405180910390fd5b600061138588612273565b90508587856005015461139891906145f3565b6113a291906145f3565b81116113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614b32565b60405180910390fd5b6040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001888152602001878152602001868152602001600081526020016000815250600560008a815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050873373ffffffffffffffffffffffffffffffffffffffff167fee4e63527eab0cf8549cf3eca00578865449f07bbc187a47b942857129cf4837428a8a8a6040516115689493929190614b52565b60405180910390a35050505050505050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561160557602002820191906000526020600020905b8154815260200190600101908083116115f1575b50505050509050919050565b60035481565b60026001540361165c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116539061441e565b60405180910390fd5b6002600181905550600181116116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90614be3565b60405180910390fd5b600c548111156116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390614c75565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561175b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177f919061452b565b9050600081116117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb90614ce1565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161182593929190614d01565b6020604051808303816000875af1158015611844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118689190614d64565b9050806118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190614ddd565b60405180910390fd5b60006118b4613b8b565b90506000846001856118c691906145f3565b6118d091906145f3565b905060006001856118e191906145f3565b90506040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018281526020018381526020016000815260200160008152602001600015158152506002600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555090505060008190505b82811015611a255787600960008381526020019081526020016000206000828254611a1191906145f3565b9250508190555080806001019150506119e6565b50600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055823373ffffffffffffffffffffffffffffffffffffffff167f3cd01c2058c2b0d3a8d3e58ece55745b3f6e47ecf7b462f1a057fce69c4c8685428a8a604051611ad793929190614dfd565b60405180910390a35050505050600180819055505050565b600a81565b60006002600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b94906149a2565b60405180910390fd5b611ba682613bad565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154908060060160009054906101000a900460ff16905087565b600260015403611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b9061441e565b60405180910390fd5b600260018190555060006002600083815260200190815260200160002090506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d36919061452b565b90503373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc1906149a2565b60405180910390fd5b600015158260060160009054906101000a900460ff16151514611e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1990614a0e565b60405180910390fd5b81600301548111611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90614e80565b60405180910390fd5b6000600560008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ee557611ee084612a5e565b611f48565b600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f4757611f4684613d3b565b5b5b600560008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe790614eec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a90614f7e565b60405180910390fd5b600061208e85612273565b905060016002600087815260200190815260200160002060060160006101000a81548160ff0219169083151502179055506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3387600101546040518363ffffffff1660e01b8152600401612122929190614f9e565b6020604051808303816000875af1158015612141573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121659190614d64565b9050806121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219e90614ddd565b60405180910390fd5b6121d58560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613a97565b858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f43bb4ee8d800c54c9aec6cc191189bd7eee83cb6888c1ff853a11c5d8880538d4288600101548660405161224893929190614dfd565b60405180910390a350505050506001808190555050565b612267613dc6565b6122716000613e44565b565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612307919061452b565b9050600080600260008681526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff16151515158152505090506000816040015190505b8160600151811080156123eb57508381105b1561244b5760096000828152602001908152602001600020548260200151600860008481526020019081526020016000205461242791906147fd565b6124319190614886565b8361243c91906145f3565b925080806001019150506123d9565b5060009250612458613f10565b90508060a001518261246a91906148b7565b9350505050919050565b60086020528060005260406000206000915090505481565b60096020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561255857602002820191906000526020600020905b815481526020019060010190808311612544575b50505050509050919050565b3373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff906149a2565b60405180910390fd5b6000600260008381526020019081526020016000206004015411612661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265890615013565b60405180910390fd5b60006002600083815260200190815260200160002060040181905550803373ffffffffffffffffffffffffffffffffffffffff167f90955dee6bd40110dfa22804a1ec3b5fca241c6a3db21ef081604c2c082f1c4a426040516126c49190613f7e565b60405180910390a350565b600b5481565b6000600260008481526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff16151515158152505090503373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461280c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612803906149a2565b60405180910390fd5b600015158160c00151151514612857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284e90614a0e565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ea919061452b565b90508082606001511015612933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292a9061507f565b60405180910390fd5b6000600560008681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d490615111565b60405180910390fd5b836002600087815260200190815260200160002060040181905550843373ffffffffffffffffffffffffffffffffffffffff167ffb6aff63b7192760984b335f5d89c20a2d9ecaa6e915e36678550ad59d4cb1d94287604051612a419291906148eb565b60405180910390a360009150612a55613f10565b92505050505050565b6000600560008381526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603612bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc89061517d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1603612c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3b906151e9565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd7919061452b565b9050808260c001511115612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1790615255565b60405180910390fd5b81606001518260400151612d3491906145f3565b600260008581526020019081526020016000206005016000828254612d5991906145f3565b92505081905550612d6983613bad565b612d8a826020015183606001518460400151612d8591906145f3565b613a97565b82826020015173ffffffffffffffffffffffffffffffffffffffff167f85ec8df3a97b90227e1fa3d869c0e8b1c9dc31c409479bc44a4e504d0fc75c814285606001518660400151604051612de193929190614dfd565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e54906152c1565b60405180910390fd5b60001515600a60149054906101000a900460ff16151514612eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaa90615353565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3a906153bf565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612f846124a4565b73ffffffffffffffffffffffffffffffffffffffff1603612fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd190615451565b60405180910390fd5b6001600a60146101000a81548160ff02191690831515021790555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130cd919061452b565b9050600081116130e1576000915050613143565b6000819050600080600090505b600b54836130fc91906145f3565b811161313b5760086000828561311291906145f3565b8152602001908152602001600020548261312c91906145f3565b915080806001019150506130ee565b508093505050505b90565b60026001540361318b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131829061441e565b60405180910390fd5b60026001819055506000600260008381526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509050600081608001511161329f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613296906154bd565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603613311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330890615529565b60405180910390fd5b6000600560008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146133bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b290615595565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561342a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344e919061452b565b905080836060015111613496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348d90615627565b60405180910390fd5b600015158360c001511515146134e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d890615693565b60405180910390fd5b8260800151341015613528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351f906156ff565b60405180910390fd5b60006064600a856080015161353d91906147fd565b6135479190614886565b9050600081856080015161355b91906148b7565b905060028261356a9190614886565b60086000858152602001908152602001600020600082825461358c91906145f3565b925050819055506002826135a09190614886565b600760008282546135b191906145f3565b92505081905550600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190915055336002600088815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008881526020019081526020016000206004018190555061369d856000015182613a97565b853373ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f6de9de43ae0292eda3ebb7e292c3a620433660b8fb20bc59689c45ba3d46e13642856040516137019291906148eb565b60405180910390a4613711613f10565b945050505050506001808190555050565b61372a613dc6565b61012c811115801561373c5750601e81115b61377b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377290615791565b60405180910390fd5b80600c8190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b6137b9613dc6565b603c81111580156137cb5750600a8110155b61380a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613801906157fd565b60405180910390fd5b80600b8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a7919061452b565b9050600181116138ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e390615869565b60405180910390fd5b80806138f790615889565b915050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461398a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613981906158fe565b60405180910390fd5b6000600b54821061399d57600b5461399f565b815b9050600182036139ae57600290505b600081346139bc9190614886565b90506000600190505b828111613a0e57816008600083876139dd91906145f3565b815260200190815260200160002060008282546139fa91906145f3565b9250508190555080806001019150506139c5565b50505050565b613a1c613dc6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8290615990565b60405180910390fd5b613a9481613e44565b50565b80471015613ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad1906159fc565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051613b0090615a4d565b60006040518083038185875af1925050503d8060008114613b3d576040519150601f19603f3d011682016040523d82523d6000602084013e613b42565b606091505b5050905080613b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b7d90615ad4565b60405180910390fd5b505050565b600060036000815480929190613ba090615af4565b9190505550600354905090565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152506005600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050803373ffffffffffffffffffffffffffffffffffffffff167f4dcf08b812b93395304b19883a41ddbbf9186dfe0f8f3a208b3ad8ab4a93e06a42604051613d309190613f7e565b60405180910390a350565b6000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613db857613db382613bad565b613dc2565b613dc182612a5e565b5b5050565b613dce613f08565b73ffffffffffffffffffffffffffffffffffffffff16613dec6124a4565b73ffffffffffffffffffffffffffffffffffffffff1614613e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e3990615b88565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6000819050919050565b613f7881613f65565b82525050565b6000602082019050613f936000830184613f6f565b92915050565b60008115159050919050565b613fae81613f99565b82525050565b6000602082019050613fc96000830184613fa5565b92915050565b600080fd5b613fdd81613f65565b8114613fe857600080fd5b50565b600081359050613ffa81613fd4565b92915050565b60006020828403121561401657614015613fcf565b5b600061402484828501613feb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140588261402d565b9050919050565b6140688161404d565b82525050565b600060e082019050614083600083018a61405f565b614090602083018961405f565b61409d6040830188613f6f565b6140aa6060830187613f6f565b6140b76080830186613f6f565b6140c460a0830185613f6f565b6140d160c0830184613f6f565b98975050505050505050565b600080600080608085870312156140f7576140f6613fcf565b5b600061410587828801613feb565b945050602061411687828801613feb565b935050604061412787828801613feb565b925050606061413887828801613feb565b91505092959194509250565b61414d8161404d565b811461415857600080fd5b50565b60008135905061416a81614144565b92915050565b60006020828403121561418657614185613fcf565b5b60006141948482850161415b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141d281613f65565b82525050565b60006141e483836141c9565b60208301905092915050565b6000602082019050919050565b60006142088261419d565b61421281856141a8565b935061421d836141b9565b8060005b8381101561424e57815161423588826141d8565b9750614240836141f0565b925050600181019050614221565b5085935050505092915050565b6000602082019050818103600083015261427581846141fd565b905092915050565b6000806040838503121561429457614293613fcf565b5b60006142a285828601613feb565b92505060206142b385828601613feb565b9150509250929050565b6000819050919050565b60006142e26142dd6142d88461402d565b6142bd565b61402d565b9050919050565b60006142f4826142c7565b9050919050565b6000614306826142e9565b9050919050565b614316816142fb565b82525050565b6000602082019050614331600083018461430d565b92915050565b600060e08201905061434c600083018a61405f565b6143596020830189613f6f565b6143666040830188613f6f565b6143736060830187613f6f565b6143806080830186613f6f565b61438d60a0830185613f6f565b61439a60c0830184613fa5565b98975050505050505050565b60006020820190506143bb600083018461405f565b92915050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614408601f836143c1565b9150614413826143d2565b602082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4e6f20616374697665206c6f616e206f6e2074686973207374616b6500000000600082015250565b6000614474601c836143c1565b915061447f8261443e565b602082019050919050565b600060208201905081810360008301526144a381614467565b9050919050565b7f5374616b6520436f6c6c65637465640000000000000000000000000000000000600082015250565b60006144e0600f836143c1565b91506144eb826144aa565b602082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b60008151905061452581613fd4565b92915050565b60006020828403121561454157614540613fcf565b5b600061454f84828501614516565b91505092915050565b7f5374616b6520656e646564000000000000000000000000000000000000000000600082015250565b600061458e600b836143c1565b915061459982614558565b602082019050919050565b600060208201905081810360008301526145bd81614581565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145fe82613f65565b915061460983613f65565b9250828201905080821115614621576146206145c4565b5b92915050565b7f4c6f616e206d75737420657870697265206265666f7265207374616b6520656e60008201527f6420646179000000000000000000000000000000000000000000000000000000602082015250565b60006146836025836143c1565b915061468e82614627565b604082019050919050565b600060208201905081810360008301526146b281614676565b9050919050565b7f416c72656164792066696c6c6564000000000000000000000000000000000000600082015250565b60006146ef600e836143c1565b91506146fa826146b9565b602082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b7f4e6f7420656e6f75676820657468000000000000000000000000000000000000600082015250565b600061475b600e836143c1565b915061476682614725565b602082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f4e6f206c656e64206f6e206f776e207374616b65730000000000000000000000600082015250565b60006147c76015836143c1565b91506147d282614791565b602082019050919050565b600060208201905081810360008301526147f6816147ba565b9050919050565b600061480882613f65565b915061481383613f65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561484c5761484b6145c4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061489182613f65565b915061489c83613f65565b9250826148ac576148ab614857565b5b828204905092915050565b60006148c282613f65565b91506148cd83613f65565b92508282039050818111156148e5576148e46145c4565b5b92915050565b60006040820190506149006000830185613f6f565b61490d6020830184613f6f565b9392505050565b60008151905061492381614144565b92915050565b60006020828403121561493f5761493e613fcf565b5b600061494d84828501614914565b91505092915050565b7f556e617574686f72697365640000000000000000000000000000000000000000600082015250565b600061498c600c836143c1565b915061499782614956565b602082019050919050565b600060208201905081810360008301526149bb8161497f565b9050919050565b7f416c726561647920436f6c6c6563746564000000000000000000000000000000600082015250565b60006149f86011836143c1565b9150614a03826149c2565b602082019050919050565b60006020820190508181036000830152614a27816149eb565b9050919050565b7f5374616b6520616c726561647920686173206f75747374616e64696e67206c6f60008201527f616e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a8a6022836143c1565b9150614a9582614a2e565b604082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f4c6f616e20616d6f756e74206973203e2064697673206561726e656420736f2060008201527f6661720000000000000000000000000000000000000000000000000000000000602082015250565b6000614b1c6023836143c1565b9150614b2782614ac0565b604082019050919050565b60006020820190508181036000830152614b4b81614b0f565b9050919050565b6000608082019050614b676000830187613f6f565b614b746020830186613f6f565b614b816040830185613f6f565b614b8e6060830184613f6f565b95945050505050565b7f5374616b696e673a205374616b696e672064617973203c203100000000000000600082015250565b6000614bcd6019836143c1565b9150614bd882614b97565b602082019050919050565b60006020820190508181036000830152614bfc81614bc0565b9050919050565b7f5374616b696e673a205374616b696e672064617973203e206d61785f7374616b60008201527f655f646179730000000000000000000000000000000000000000000000000000602082015250565b6000614c5f6026836143c1565b9150614c6a82614c03565b604082019050919050565b60006020820190508181036000830152614c8e81614c52565b9050919050565b7f5374616b696e67206e6f7420656e61626c656400000000000000000000000000600082015250565b6000614ccb6013836143c1565b9150614cd682614c95565b602082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b6000606082019050614d16600083018661405f565b614d23602083018561405f565b614d306040830184613f6f565b949350505050565b614d4181613f99565b8114614d4c57600080fd5b50565b600081519050614d5e81614d38565b92915050565b600060208284031215614d7a57614d79613fcf565b5b6000614d8884828501614d4f565b91505092915050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614dc7600f836143c1565b9150614dd282614d91565b602082019050919050565b60006020820190508181036000830152614df681614dba565b9050919050565b6000606082019050614e126000830186613f6f565b614e1f6020830185613f6f565b614e2c6040830184613f6f565b949350505050565b7f5374616b65206861736e277420656e6465640000000000000000000000000000600082015250565b6000614e6a6012836143c1565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b7f5374616b652068617320756e70616964206c6f616e0000000000000000000000600082015250565b6000614ed66015836143c1565b9150614ee182614ea0565b602082019050919050565b60006020820190508181036000830152614f0581614ec9565b9050919050565b7f5374616b6520686173206f75747374616e64696e67206c6f616e20726571756560008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f686022836143c1565b9150614f7382614f0c565b604082019050919050565b60006020820190508181036000830152614f9781614f5b565b9050919050565b6000604082019050614fb3600083018561405f565b614fc06020830184613f6f565b9392505050565b7f5374616b65206973206e6f7420666f722073616c650000000000000000000000600082015250565b6000614ffd6015836143c1565b915061500882614fc7565b602082019050919050565b6000602082019050818103600083015261502c81614ff0565b9050919050565b7f5374616b652068617320656e6465640000000000000000000000000000000000600082015250565b6000615069600f836143c1565b915061507482615033565b602082019050919050565b600060208201905081810360008301526150988161505c565b9050919050565b7f5374616b652068617320616e206f75747374616e64696e67206c6f616e20726560008201527f7175657374000000000000000000000000000000000000000000000000000000602082015250565b60006150fb6025836143c1565b91506151068261509f565b604082019050919050565b6000602082019050818103600083015261512a816150ee565b9050919050565b7f4e6f206c6f616e206f6e207374616b6500000000000000000000000000000000600082015250565b60006151676010836143c1565b915061517282615131565b602082019050919050565b600060208201905081810360008301526151968161515a565b9050919050565b7f4c6f616e206e6f742066696c6c65640000000000000000000000000000000000600082015250565b60006151d3600f836143c1565b91506151de8261519d565b602082019050919050565b60006020820190508181036000830152615202816151c6565b9050919050565b7f4c6f616e206475726174696f6e206e6f74206d65740000000000000000000000600082015250565b600061523f6015836143c1565b915061524a82615209565b602082019050919050565b6000602082019050818103600083015261526e81615232565b9050919050565b7f416464726573732063616e6e6f74206265207a65726f00000000000000000000600082015250565b60006152ab6016836143c1565b91506152b682615275565b602082019050919050565b600060208201905081810360008301526152da8161529e565b9050919050565b7f546f6b656e20636f6e7472616374206164647265737320616c7265616479207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b600061533d6022836143c1565b9150615348826152e1565b604082019050919050565b6000602082019050818103600083015261536c81615330565b9050919050565b7f4f6e6c79206465706c6f7965722063616e2073657420746869732076616c7565600082015250565b60006153a96020836143c1565b91506153b482615373565b602082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4f776e657273686970206d757374206265207472616e7366657272656420626560008201527f666f726520636f6e747261637420737461727400000000000000000000000000602082015250565b600061543b6033836143c1565b9150615446826153df565b604082019050919050565b6000602082019050818103600083015261546a8161542e565b9050919050565b7f5374616b65206e6f7420666f722073616c650000000000000000000000000000600082015250565b60006154a76012836143c1565b91506154b282615471565b602082019050919050565b600060208201905081810360008301526154d68161549a565b9050919050565b7f43616e277420627579206f776e207374616b6573000000000000000000000000600082015250565b60006155136014836143c1565b915061551e826154dd565b602082019050919050565b6000602082019050818103600083015261554281615506565b9050919050565b7f43616e277420627579207374616b65207769746820756e70616964206c6f616e600082015250565b600061557f6020836143c1565b915061558a82615549565b602082019050919050565b600060208201905081810360008301526155ae81615572565b9050919050565b7f7374616b652063616e27742062652062726f756768742061667465722069742060008201527f68617320656e6465640000000000000000000000000000000000000000000000602082015250565b60006156116029836143c1565b915061561c826155b5565b604082019050919050565b6000602082019050818103600083015261564081615604565b9050919050565b7f5374616b6520616c726561647920636f6c6c6563746564000000000000000000600082015250565b600061567d6017836143c1565b915061568882615647565b602082019050919050565b600060208201905081810360008301526156ac81615670565b9050919050565b7f6d73672e76616c7565206973203c207374616b65207072696365000000000000600082015250565b60006156e9601a836143c1565b91506156f4826156b3565b602082019050919050565b60006020820190508181036000830152615718816156dc565b9050919050565b7f4e65772076616c7565206d757374206265203c3d2033303020616e64203e203360008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b600061577b6021836143c1565b91506157868261571f565b604082019050919050565b600060208201905081810360008301526157aa8161576e565b9050919050565b7f4e65772076616c7565206d757374206265203c3d2036302026203e3d20313000600082015250565b60006157e7601f836143c1565b91506157f2826157b1565b602082019050919050565b60006020820190508181036000830152615816816157da565b9050919050565b7f726563656976652064697673206e6f742079657420656e61626c656400000000600082015250565b6000615853601c836143c1565b915061585e8261581d565b602082019050919050565b6000602082019050818103600083015261588281615846565b9050919050565b600061589482613f65565b9150600082036158a7576158a66145c4565b5b600182039050919050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b60006158e8600c836143c1565b91506158f3826158b2565b602082019050919050565b60006020820190508181036000830152615917816158db565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061597a6026836143c1565b91506159858261591e565b604082019050919050565b600060208201905081810360008301526159a98161596d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006159e6601d836143c1565b91506159f1826159b0565b602082019050919050565b60006020820190508181036000830152615a15816159d9565b9050919050565b600081905092915050565b50565b6000615a37600083615a1c565b9150615a4282615a27565b600082019050919050565b6000615a5882615a2a565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615abe603a836143c1565b9150615ac982615a62565b604082019050919050565b60006020820190508181036000830152615aed81615ab1565b9050919050565b6000615aff82613f65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615b3157615b306145c4565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615b726020836143c1565b9150615b7d82615b3c565b602082019050919050565b60006020820190508181036000830152615ba181615b65565b905091905056fea2646970667358221220126a82cd51b125a36a88ecf18f018542d8e7d70f3419d9e43e3c67709d04dd6a64736f6c63430008100033

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c80637605a8131161010d578063b23d4854116100a0578063d5f394881161006f578063d5f394881461071a578063e21b6ade14610745578063ebcac85114610770578063ec2af8cb14610799578063f2fde38b146107a357610204565b8063b23d485414610681578063b54ec8e6146106aa578063b9d2b803146106d5578063d11e7fff146106f157610204565b80639595ec05116100dc5780639595ec05146105db57806397d98efe146106045780639c26d9b11461062f578063ab7b1c891461065857610204565b80637605a813146104f95780637b1f4ec0146105365780638da5cb5b146105735780638da7ad231461059e57610204565b806348dd0c8c116101905780636026e2771161015f5780636026e2771461040e578063674a9112146104395780636af2d88f1461047c578063715018a6146104a557806374eca038146104bc57610204565b806348dd0c8c1461036657806349c64c0d1461039157806350ede095146103ba5780635a680367146103e557610204565b80633758ca16116101cc5780633758ca16146102a6578063376ac76c146102e957806345340f9f146103005780634711e1481461032957610204565b80630224e9a7146102095780631cd6fd1d1461023457806327b743f11461025f5780632d8612c41461027b57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e6107cc565b60405161022b9190613f7e565b60405180910390f35b34801561024057600080fd5b506102496107d2565b6040516102569190613fb4565b60405180910390f35b61027960048036038101906102749190614000565b6107e5565b005b34801561028757600080fd5b50610290610f5c565b60405161029d9190613f7e565b60405180910390f35b3480156102b257600080fd5b506102cd60048036038101906102c89190614000565b610f61565b6040516102e0979695949392919061406e565b60405180910390f35b3480156102f557600080fd5b506102fe610fe3565b005b34801561030c57600080fd5b50610327600480360381019061032291906140dd565b6110e9565b005b34801561033557600080fd5b50610350600480360381019061034b9190614170565b61157a565b60405161035d919061425b565b60405180910390f35b34801561037257600080fd5b5061037b611611565b6040516103889190613f7e565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b3919061427d565b611617565b005b3480156103c657600080fd5b506103cf611aef565b6040516103dc9190613f7e565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190614000565b611af4565b005b34801561041a57600080fd5b50610423611baa565b604051610430919061431c565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190614000565b611bd0565b6040516104739796959493929190614337565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190614000565b611c3f565b005b3480156104b157600080fd5b506104ba61225f565b005b3480156104c857600080fd5b506104e360048036038101906104de9190614000565b612273565b6040516104f09190613f7e565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190614000565b612474565b60405161052d9190613f7e565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190614000565b61248c565b60405161056a9190613f7e565b60405180910390f35b34801561057f57600080fd5b506105886124a4565b60405161059591906143a6565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c09190614170565b6124cd565b6040516105d2919061425b565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190614000565b612564565b005b34801561061057600080fd5b506106196126cf565b6040516106269190613f7e565b60405180910390f35b34801561063b57600080fd5b506106566004803603810190610651919061427d565b6126d5565b005b34801561066457600080fd5b5061067f600480360381019061067a9190614000565b612a5e565b005b34801561068d57600080fd5b506106a860048036038101906106a39190614170565b612dee565b005b3480156106b657600080fd5b506106bf613039565b6040516106cc9190613f7e565b60405180910390f35b6106ef60048036038101906106ea9190614000565b613146565b005b3480156106fd57600080fd5b5061071860048036038101906107139190614000565b613722565b005b34801561072657600080fd5b5061072f613785565b60405161073c91906143a6565b60405180910390f35b34801561075157600080fd5b5061075a6137ab565b6040516107679190613f7e565b60405180910390f35b34801561077c57600080fd5b5061079760048036038101906107929190614000565b6137b1565b005b6107a1613814565b005b3480156107af57600080fd5b506107ca60048036038101906107c59190614170565b613a14565b005b60075481565b600a60149054906101000a900460ff1681565b60026001540361082a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108219061441e565b60405180910390fd5b600260018190555060006002600083815260200190815260200160002090506000600560008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036108f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ea9061448a565b60405180910390fd5b600015158260060160009054906101000a900460ff1615151461094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906144f6565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109de919061452b565b905080836003015411610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d906145a4565b60405180910390fd5b816004015481610a3691906145f3565b836003015411610a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7290614699565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590614705565b60405180910390fd5b3482600201541115610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c90614771565b60405180910390fd5b8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde906147dd565b60405180910390fd5b600083600401541115610c1157600060026000868152602001908152602001600020600401819055505b6040518060e001604052808360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001836002015481526020018360030154815260200183600401548152602001600183610ca391906145f3565b81526020018360040154600184610cba91906145f3565b610cc491906145f3565b8152506005600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506000606460028460020154610db291906147fd565b610dbc9190614886565b90506000818460020154610dd091906148b7565b9050600282610ddf9190614886565b600860008581526020019081526020016000206000828254610e0191906145f3565b92505081905550600282610e159190614886565b60076000828254610e2691906145f3565b92505081905550610e5b8460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613a97565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190915055858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb0ce0257a82207c2c8b55d683b2ae00db4daa00047172540f40f2fe1d9cba4774285604051610f459291906148eb565b60405180910390a450505050506001808190555050565b600281565b60056020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154905087565b600260015403611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f9061441e565b60405180910390fd5b60026001819055506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302d8325c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c39190614929565b90506000600754905060006007819055506110de8282613a97565b505060018081905550565b60006002600086815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611189906149a2565b60405180910390fd5b600015158160060160009054906101000a900460ff161515146111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e190614a0e565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127d919061452b565b9050828161128b91906145f3565b8260030154116112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614699565b60405180910390fd5b6000600560008881526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190614aa0565b60405180910390fd5b600061138588612273565b90508587856005015461139891906145f3565b6113a291906145f3565b81116113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614b32565b60405180910390fd5b6040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001888152602001878152602001868152602001600081526020016000815250600560008a815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050873373ffffffffffffffffffffffffffffffffffffffff167fee4e63527eab0cf8549cf3eca00578865449f07bbc187a47b942857129cf4837428a8a8a6040516115689493929190614b52565b60405180910390a35050505050505050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561160557602002820191906000526020600020905b8154815260200190600101908083116115f1575b50505050509050919050565b60035481565b60026001540361165c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116539061441e565b60405180910390fd5b6002600181905550600181116116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90614be3565b60405180910390fd5b600c548111156116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390614c75565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561175b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177f919061452b565b9050600081116117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb90614ce1565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161182593929190614d01565b6020604051808303816000875af1158015611844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118689190614d64565b9050806118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190614ddd565b60405180910390fd5b60006118b4613b8b565b90506000846001856118c691906145f3565b6118d091906145f3565b905060006001856118e191906145f3565b90506040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018281526020018381526020016000815260200160008152602001600015158152506002600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555090505060008190505b82811015611a255787600960008381526020019081526020016000206000828254611a1191906145f3565b9250508190555080806001019150506119e6565b50600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055823373ffffffffffffffffffffffffffffffffffffffff167f3cd01c2058c2b0d3a8d3e58ece55745b3f6e47ecf7b462f1a057fce69c4c8685428a8a604051611ad793929190614dfd565b60405180910390a35050505050600180819055505050565b600a81565b60006002600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b94906149a2565b60405180910390fd5b611ba682613bad565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154908060060160009054906101000a900460ff16905087565b600260015403611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b9061441e565b60405180910390fd5b600260018190555060006002600083815260200190815260200160002090506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d36919061452b565b90503373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc1906149a2565b60405180910390fd5b600015158260060160009054906101000a900460ff16151514611e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1990614a0e565b60405180910390fd5b81600301548111611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90614e80565b60405180910390fd5b6000600560008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ee557611ee084612a5e565b611f48565b600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f4757611f4684613d3b565b5b5b600560008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe790614eec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a90614f7e565b60405180910390fd5b600061208e85612273565b905060016002600087815260200190815260200160002060060160006101000a81548160ff0219169083151502179055506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3387600101546040518363ffffffff1660e01b8152600401612122929190614f9e565b6020604051808303816000875af1158015612141573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121659190614d64565b9050806121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219e90614ddd565b60405180910390fd5b6121d58560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613a97565b858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f43bb4ee8d800c54c9aec6cc191189bd7eee83cb6888c1ff853a11c5d8880538d4288600101548660405161224893929190614dfd565b60405180910390a350505050506001808190555050565b612267613dc6565b6122716000613e44565b565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612307919061452b565b9050600080600260008681526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff16151515158152505090506000816040015190505b8160600151811080156123eb57508381105b1561244b5760096000828152602001908152602001600020548260200151600860008481526020019081526020016000205461242791906147fd565b6124319190614886565b8361243c91906145f3565b925080806001019150506123d9565b5060009250612458613f10565b90508060a001518261246a91906148b7565b9350505050919050565b60086020528060005260406000206000915090505481565b60096020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561255857602002820191906000526020600020905b815481526020019060010190808311612544575b50505050509050919050565b3373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff906149a2565b60405180910390fd5b6000600260008381526020019081526020016000206004015411612661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265890615013565b60405180910390fd5b60006002600083815260200190815260200160002060040181905550803373ffffffffffffffffffffffffffffffffffffffff167f90955dee6bd40110dfa22804a1ec3b5fca241c6a3db21ef081604c2c082f1c4a426040516126c49190613f7e565b60405180910390a350565b600b5481565b6000600260008481526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff16151515158152505090503373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461280c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612803906149a2565b60405180910390fd5b600015158160c00151151514612857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284e90614a0e565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ea919061452b565b90508082606001511015612933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292a9061507f565b60405180910390fd5b6000600560008681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d490615111565b60405180910390fd5b836002600087815260200190815260200160002060040181905550843373ffffffffffffffffffffffffffffffffffffffff167ffb6aff63b7192760984b335f5d89c20a2d9ecaa6e915e36678550ad59d4cb1d94287604051612a419291906148eb565b60405180910390a360009150612a55613f10565b92505050505050565b6000600560008381526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603612bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc89061517d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1603612c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3b906151e9565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd7919061452b565b9050808260c001511115612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1790615255565b60405180910390fd5b81606001518260400151612d3491906145f3565b600260008581526020019081526020016000206005016000828254612d5991906145f3565b92505081905550612d6983613bad565b612d8a826020015183606001518460400151612d8591906145f3565b613a97565b82826020015173ffffffffffffffffffffffffffffffffffffffff167f85ec8df3a97b90227e1fa3d869c0e8b1c9dc31c409479bc44a4e504d0fc75c814285606001518660400151604051612de193929190614dfd565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e54906152c1565b60405180910390fd5b60001515600a60149054906101000a900460ff16151514612eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaa90615353565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3a906153bf565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612f846124a4565b73ffffffffffffffffffffffffffffffffffffffff1603612fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd190615451565b60405180910390fd5b6001600a60146101000a81548160ff02191690831515021790555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130cd919061452b565b9050600081116130e1576000915050613143565b6000819050600080600090505b600b54836130fc91906145f3565b811161313b5760086000828561311291906145f3565b8152602001908152602001600020548261312c91906145f3565b915080806001019150506130ee565b508093505050505b90565b60026001540361318b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131829061441e565b60405180910390fd5b60026001819055506000600260008381526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509050600081608001511161329f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613296906154bd565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603613311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330890615529565b60405180910390fd5b6000600560008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146133bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b290615595565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561342a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344e919061452b565b905080836060015111613496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348d90615627565b60405180910390fd5b600015158360c001511515146134e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d890615693565b60405180910390fd5b8260800151341015613528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351f906156ff565b60405180910390fd5b60006064600a856080015161353d91906147fd565b6135479190614886565b9050600081856080015161355b91906148b7565b905060028261356a9190614886565b60086000858152602001908152602001600020600082825461358c91906145f3565b925050819055506002826135a09190614886565b600760008282546135b191906145f3565b92505081905550600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190915055336002600088815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008881526020019081526020016000206004018190555061369d856000015182613a97565b853373ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f6de9de43ae0292eda3ebb7e292c3a620433660b8fb20bc59689c45ba3d46e13642856040516137019291906148eb565b60405180910390a4613711613f10565b945050505050506001808190555050565b61372a613dc6565b61012c811115801561373c5750601e81115b61377b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377290615791565b60405180910390fd5b80600c8190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b6137b9613dc6565b603c81111580156137cb5750600a8110155b61380a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613801906157fd565b60405180910390fd5b80600b8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636572ca0c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a7919061452b565b9050600181116138ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e390615869565b60405180910390fd5b80806138f790615889565b915050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461398a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613981906158fe565b60405180910390fd5b6000600b54821061399d57600b5461399f565b815b9050600182036139ae57600290505b600081346139bc9190614886565b90506000600190505b828111613a0e57816008600083876139dd91906145f3565b815260200190815260200160002060008282546139fa91906145f3565b9250508190555080806001019150506139c5565b50505050565b613a1c613dc6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8290615990565b60405180910390fd5b613a9481613e44565b50565b80471015613ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad1906159fc565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051613b0090615a4d565b60006040518083038185875af1925050503d8060008114613b3d576040519150601f19603f3d011682016040523d82523d6000602084013e613b42565b606091505b5050905080613b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b7d90615ad4565b60405180910390fd5b505050565b600060036000815480929190613ba090615af4565b9190505550600354905090565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152506005600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050803373ffffffffffffffffffffffffffffffffffffffff167f4dcf08b812b93395304b19883a41ddbbf9186dfe0f8f3a208b3ad8ab4a93e06a42604051613d309190613f7e565b60405180910390a350565b6000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613db857613db382613bad565b613dc2565b613dc182612a5e565b5b5050565b613dce613f08565b73ffffffffffffffffffffffffffffffffffffffff16613dec6124a4565b73ffffffffffffffffffffffffffffffffffffffff1614613e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e3990615b88565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6000819050919050565b613f7881613f65565b82525050565b6000602082019050613f936000830184613f6f565b92915050565b60008115159050919050565b613fae81613f99565b82525050565b6000602082019050613fc96000830184613fa5565b92915050565b600080fd5b613fdd81613f65565b8114613fe857600080fd5b50565b600081359050613ffa81613fd4565b92915050565b60006020828403121561401657614015613fcf565b5b600061402484828501613feb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140588261402d565b9050919050565b6140688161404d565b82525050565b600060e082019050614083600083018a61405f565b614090602083018961405f565b61409d6040830188613f6f565b6140aa6060830187613f6f565b6140b76080830186613f6f565b6140c460a0830185613f6f565b6140d160c0830184613f6f565b98975050505050505050565b600080600080608085870312156140f7576140f6613fcf565b5b600061410587828801613feb565b945050602061411687828801613feb565b935050604061412787828801613feb565b925050606061413887828801613feb565b91505092959194509250565b61414d8161404d565b811461415857600080fd5b50565b60008135905061416a81614144565b92915050565b60006020828403121561418657614185613fcf565b5b60006141948482850161415b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141d281613f65565b82525050565b60006141e483836141c9565b60208301905092915050565b6000602082019050919050565b60006142088261419d565b61421281856141a8565b935061421d836141b9565b8060005b8381101561424e57815161423588826141d8565b9750614240836141f0565b925050600181019050614221565b5085935050505092915050565b6000602082019050818103600083015261427581846141fd565b905092915050565b6000806040838503121561429457614293613fcf565b5b60006142a285828601613feb565b92505060206142b385828601613feb565b9150509250929050565b6000819050919050565b60006142e26142dd6142d88461402d565b6142bd565b61402d565b9050919050565b60006142f4826142c7565b9050919050565b6000614306826142e9565b9050919050565b614316816142fb565b82525050565b6000602082019050614331600083018461430d565b92915050565b600060e08201905061434c600083018a61405f565b6143596020830189613f6f565b6143666040830188613f6f565b6143736060830187613f6f565b6143806080830186613f6f565b61438d60a0830185613f6f565b61439a60c0830184613fa5565b98975050505050505050565b60006020820190506143bb600083018461405f565b92915050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614408601f836143c1565b9150614413826143d2565b602082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4e6f20616374697665206c6f616e206f6e2074686973207374616b6500000000600082015250565b6000614474601c836143c1565b915061447f8261443e565b602082019050919050565b600060208201905081810360008301526144a381614467565b9050919050565b7f5374616b6520436f6c6c65637465640000000000000000000000000000000000600082015250565b60006144e0600f836143c1565b91506144eb826144aa565b602082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b60008151905061452581613fd4565b92915050565b60006020828403121561454157614540613fcf565b5b600061454f84828501614516565b91505092915050565b7f5374616b6520656e646564000000000000000000000000000000000000000000600082015250565b600061458e600b836143c1565b915061459982614558565b602082019050919050565b600060208201905081810360008301526145bd81614581565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145fe82613f65565b915061460983613f65565b9250828201905080821115614621576146206145c4565b5b92915050565b7f4c6f616e206d75737420657870697265206265666f7265207374616b6520656e60008201527f6420646179000000000000000000000000000000000000000000000000000000602082015250565b60006146836025836143c1565b915061468e82614627565b604082019050919050565b600060208201905081810360008301526146b281614676565b9050919050565b7f416c72656164792066696c6c6564000000000000000000000000000000000000600082015250565b60006146ef600e836143c1565b91506146fa826146b9565b602082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b7f4e6f7420656e6f75676820657468000000000000000000000000000000000000600082015250565b600061475b600e836143c1565b915061476682614725565b602082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f4e6f206c656e64206f6e206f776e207374616b65730000000000000000000000600082015250565b60006147c76015836143c1565b91506147d282614791565b602082019050919050565b600060208201905081810360008301526147f6816147ba565b9050919050565b600061480882613f65565b915061481383613f65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561484c5761484b6145c4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061489182613f65565b915061489c83613f65565b9250826148ac576148ab614857565b5b828204905092915050565b60006148c282613f65565b91506148cd83613f65565b92508282039050818111156148e5576148e46145c4565b5b92915050565b60006040820190506149006000830185613f6f565b61490d6020830184613f6f565b9392505050565b60008151905061492381614144565b92915050565b60006020828403121561493f5761493e613fcf565b5b600061494d84828501614914565b91505092915050565b7f556e617574686f72697365640000000000000000000000000000000000000000600082015250565b600061498c600c836143c1565b915061499782614956565b602082019050919050565b600060208201905081810360008301526149bb8161497f565b9050919050565b7f416c726561647920436f6c6c6563746564000000000000000000000000000000600082015250565b60006149f86011836143c1565b9150614a03826149c2565b602082019050919050565b60006020820190508181036000830152614a27816149eb565b9050919050565b7f5374616b6520616c726561647920686173206f75747374616e64696e67206c6f60008201527f616e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a8a6022836143c1565b9150614a9582614a2e565b604082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f4c6f616e20616d6f756e74206973203e2064697673206561726e656420736f2060008201527f6661720000000000000000000000000000000000000000000000000000000000602082015250565b6000614b1c6023836143c1565b9150614b2782614ac0565b604082019050919050565b60006020820190508181036000830152614b4b81614b0f565b9050919050565b6000608082019050614b676000830187613f6f565b614b746020830186613f6f565b614b816040830185613f6f565b614b8e6060830184613f6f565b95945050505050565b7f5374616b696e673a205374616b696e672064617973203c203100000000000000600082015250565b6000614bcd6019836143c1565b9150614bd882614b97565b602082019050919050565b60006020820190508181036000830152614bfc81614bc0565b9050919050565b7f5374616b696e673a205374616b696e672064617973203e206d61785f7374616b60008201527f655f646179730000000000000000000000000000000000000000000000000000602082015250565b6000614c5f6026836143c1565b9150614c6a82614c03565b604082019050919050565b60006020820190508181036000830152614c8e81614c52565b9050919050565b7f5374616b696e67206e6f7420656e61626c656400000000000000000000000000600082015250565b6000614ccb6013836143c1565b9150614cd682614c95565b602082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b6000606082019050614d16600083018661405f565b614d23602083018561405f565b614d306040830184613f6f565b949350505050565b614d4181613f99565b8114614d4c57600080fd5b50565b600081519050614d5e81614d38565b92915050565b600060208284031215614d7a57614d79613fcf565b5b6000614d8884828501614d4f565b91505092915050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614dc7600f836143c1565b9150614dd282614d91565b602082019050919050565b60006020820190508181036000830152614df681614dba565b9050919050565b6000606082019050614e126000830186613f6f565b614e1f6020830185613f6f565b614e2c6040830184613f6f565b949350505050565b7f5374616b65206861736e277420656e6465640000000000000000000000000000600082015250565b6000614e6a6012836143c1565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b7f5374616b652068617320756e70616964206c6f616e0000000000000000000000600082015250565b6000614ed66015836143c1565b9150614ee182614ea0565b602082019050919050565b60006020820190508181036000830152614f0581614ec9565b9050919050565b7f5374616b6520686173206f75747374616e64696e67206c6f616e20726571756560008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f686022836143c1565b9150614f7382614f0c565b604082019050919050565b60006020820190508181036000830152614f9781614f5b565b9050919050565b6000604082019050614fb3600083018561405f565b614fc06020830184613f6f565b9392505050565b7f5374616b65206973206e6f7420666f722073616c650000000000000000000000600082015250565b6000614ffd6015836143c1565b915061500882614fc7565b602082019050919050565b6000602082019050818103600083015261502c81614ff0565b9050919050565b7f5374616b652068617320656e6465640000000000000000000000000000000000600082015250565b6000615069600f836143c1565b915061507482615033565b602082019050919050565b600060208201905081810360008301526150988161505c565b9050919050565b7f5374616b652068617320616e206f75747374616e64696e67206c6f616e20726560008201527f7175657374000000000000000000000000000000000000000000000000000000602082015250565b60006150fb6025836143c1565b91506151068261509f565b604082019050919050565b6000602082019050818103600083015261512a816150ee565b9050919050565b7f4e6f206c6f616e206f6e207374616b6500000000000000000000000000000000600082015250565b60006151676010836143c1565b915061517282615131565b602082019050919050565b600060208201905081810360008301526151968161515a565b9050919050565b7f4c6f616e206e6f742066696c6c65640000000000000000000000000000000000600082015250565b60006151d3600f836143c1565b91506151de8261519d565b602082019050919050565b60006020820190508181036000830152615202816151c6565b9050919050565b7f4c6f616e206475726174696f6e206e6f74206d65740000000000000000000000600082015250565b600061523f6015836143c1565b915061524a82615209565b602082019050919050565b6000602082019050818103600083015261526e81615232565b9050919050565b7f416464726573732063616e6e6f74206265207a65726f00000000000000000000600082015250565b60006152ab6016836143c1565b91506152b682615275565b602082019050919050565b600060208201905081810360008301526152da8161529e565b9050919050565b7f546f6b656e20636f6e7472616374206164647265737320616c7265616479207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b600061533d6022836143c1565b9150615348826152e1565b604082019050919050565b6000602082019050818103600083015261536c81615330565b9050919050565b7f4f6e6c79206465706c6f7965722063616e2073657420746869732076616c7565600082015250565b60006153a96020836143c1565b91506153b482615373565b602082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4f776e657273686970206d757374206265207472616e7366657272656420626560008201527f666f726520636f6e747261637420737461727400000000000000000000000000602082015250565b600061543b6033836143c1565b9150615446826153df565b604082019050919050565b6000602082019050818103600083015261546a8161542e565b9050919050565b7f5374616b65206e6f7420666f722073616c650000000000000000000000000000600082015250565b60006154a76012836143c1565b91506154b282615471565b602082019050919050565b600060208201905081810360008301526154d68161549a565b9050919050565b7f43616e277420627579206f776e207374616b6573000000000000000000000000600082015250565b60006155136014836143c1565b915061551e826154dd565b602082019050919050565b6000602082019050818103600083015261554281615506565b9050919050565b7f43616e277420627579207374616b65207769746820756e70616964206c6f616e600082015250565b600061557f6020836143c1565b915061558a82615549565b602082019050919050565b600060208201905081810360008301526155ae81615572565b9050919050565b7f7374616b652063616e27742062652062726f756768742061667465722069742060008201527f68617320656e6465640000000000000000000000000000000000000000000000602082015250565b60006156116029836143c1565b915061561c826155b5565b604082019050919050565b6000602082019050818103600083015261564081615604565b9050919050565b7f5374616b6520616c726561647920636f6c6c6563746564000000000000000000600082015250565b600061567d6017836143c1565b915061568882615647565b602082019050919050565b600060208201905081810360008301526156ac81615670565b9050919050565b7f6d73672e76616c7565206973203c207374616b65207072696365000000000000600082015250565b60006156e9601a836143c1565b91506156f4826156b3565b602082019050919050565b60006020820190508181036000830152615718816156dc565b9050919050565b7f4e65772076616c7565206d757374206265203c3d2033303020616e64203e203360008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b600061577b6021836143c1565b91506157868261571f565b604082019050919050565b600060208201905081810360008301526157aa8161576e565b9050919050565b7f4e65772076616c7565206d757374206265203c3d2036302026203e3d20313000600082015250565b60006157e7601f836143c1565b91506157f2826157b1565b602082019050919050565b60006020820190508181036000830152615816816157da565b9050919050565b7f726563656976652064697673206e6f742079657420656e61626c656400000000600082015250565b6000615853601c836143c1565b915061585e8261581d565b602082019050919050565b6000602082019050818103600083015261588281615846565b9050919050565b600061589482613f65565b9150600082036158a7576158a66145c4565b5b600182039050919050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b60006158e8600c836143c1565b91506158f3826158b2565b602082019050919050565b60006020820190508181036000830152615917816158db565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061597a6026836143c1565b91506159858261591e565b604082019050919050565b600060208201905081810360008301526159a98161596d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006159e6601d836143c1565b91506159f1826159b0565b602082019050919050565b60006020820190508181036000830152615a15816159d9565b9050919050565b600081905092915050565b50565b6000615a37600083615a1c565b9150615a4282615a27565b600082019050919050565b6000615a5882615a2a565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615abe603a836143c1565b9150615ac982615a62565b604082019050919050565b60006020820190508181036000830152615aed81615ab1565b9050919050565b6000615aff82613f65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615b3157615b306145c4565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615b726020836143c1565b9150615b7d82615b3c565b602082019050919050565b60006020820190508181036000830152615ba181615b65565b905091905056fea2646970667358221220126a82cd51b125a36a88ecf18f018542d8e7d70f3419d9e43e3c67709d04dd6a64736f6c63430008100033

Deployed Bytecode Sourcemap

15736:20214:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18451:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18872:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31667:1938;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19183:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18192:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;30082:229;;;;;;;;;;;;;:::i;:::-;;30319:1340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35823:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17769:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21943:1221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19132:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25289:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18750:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17720:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;23439:1709;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2880:103;;;;;;;;;;;;;:::i;:::-;;26615:775;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18538:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18653:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2232:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35691:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28213:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18991:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27398:807;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34105:1045;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19539:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35158:525;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28620:1388;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21538:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19237:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19091:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21182:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20176:874;;;:::i;:::-;;3138:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18451:22;;;;:::o;18872:43::-;;;;;;;;;;;;;:::o;31667:1938::-;5513:1;6111:7;;:19;6103:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5513:1;6244:7;:18;;;;31744:20:::1;31767:9;:19;31777:8;31767:19;;;;;;;;;;;31744:42;;31797:18;31818:8;:18;31827:8;31818:18;;;;;;;;;;;31797:39;;31894:1;31865:31;;:5;:17;;;;;;;;;;;;:31;;::::0;31857:72:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;31971:5;31948:28;;:6;:19;;;;;;;;;;;;:28;;;31940:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;32009:19;32031:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32009:46;;32090:11;32074:6;:13;;;:27;32066:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;32169:5;:18;;;32155:11;:32;;;;:::i;:::-;32138:6;:13;;;:50;32130:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;32285:1;32259:28;;:5;:14;;;;;;;;;;;;:28;;;32251:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32345:9;32325:5;:16;;;:29;;32317:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;32408:6;:12;;;;;;;;;;;;32394:26;;:10;:26;;::::0;32386:60:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32485:1;32463:6;:19;;;:23;32459:175;;;32621:1;32586:9;:19;32596:8;32586:19;;;;;;;;;;;:32;;:36;;;;32459:175;32667:333;;;;;;;;32700:5;:17;;;;;;;;;;;;32667:333;;;;;;32742:10;32667:333;;;;;;32779:5;:16;;;32667:333;;;;32824:5;:18;;;32667:333;;;;32871:5;:18;;;32667:333;;;;32928:1;32914:11;:15;;;;:::i;:::-;32667:333;;;;32970:5;:18;;;32966:1;32952:11;:15;;;;:::i;:::-;:36;;;;:::i;:::-;32667:333;;::::0;32646:8:::1;:18;32655:8;32646:18;;;;;;;;;;;:354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33037:17;33098:3;19227:1;33058:5;:16;;;:36;;;;:::i;:::-;33057:44;;;;:::i;:::-;33037:64;;33112:19;33153:9;33134:5;:16;;;:28;;;;:::i;:::-;33112:50;;33220:1;33208:9;:13;;;;:::i;:::-;33176:15;:28;33192:11;33176:28;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;33255:1;33243:9;:13;;;;:::i;:::-;33232:7;;:24;;;;;;;:::i;:::-;;;;;;;;33312:58;33338:5;:17;;;;;;;;;;;;33358:11;33312:17;:58::i;:::-;33383:10;:22;33394:10;33383:22;;;;;;;;;;;;;;;33411:8;33383:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33578:8;33525:6;:12;;;;;;;;;;;;33438:159;;33470:10;33438:159;;;33495:15;33552:11;33438:159;;;;;;;:::i;:::-;;;;;;;;31733:1872;;;;;5469:1:::0;6423:7;:22;;;;31667:1938;:::o;19183:45::-;19227:1;19183:45;:::o;18192:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30082:229::-;5513:1;6111:7;;:19;6103:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5513:1;6244:7;:18;;;;30139::::1;30160:14;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30139:46;;30196:16;30215:7;;30196:26;;30243:1;30233:7;:11;;;;30255:48;30281:10;30294:8;30255:17;:48::i;:::-;30128:183;;5469:1:::0;6423:7;:22;;;;30082:229::o;30319:1340::-;30495:20;30518:9;:19;30528:8;30518:19;;;;;;;;;;;30495:42;;30572:10;30556:26;;:6;:12;;;;;;;;;;;;:26;;;30548:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;30641:5;30618:28;;:6;:19;;;;;;;;;;;;:28;;;30610:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30681:19;30703:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30681:46;;30777:9;30763:11;:23;;;;:::i;:::-;30746:6;:13;;;:41;30738:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;30842:18;30863:8;:18;30872:8;30863:18;;;;;;;;;;;30842:39;;30926:1;30900:28;;:5;:14;;;;;;;;;;;;:28;;;30892:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;30980:16;30999:29;31019:8;30999:19;:29::i;:::-;30980:48;;31098:15;31084:11;31060:6;:21;;;:35;;;;:::i;:::-;:53;;;;:::i;:::-;31047:8;:67;31039:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;31190:260;;;;;;;;31223:10;31190:260;;;;;;31266:1;31190:260;;;;;;31295:11;31190:260;;;;31335:15;31190:260;;;;31379:9;31190:260;;;;31413:1;31190:260;;;;31437:1;31190:260;;;31169:8;:18;31178:8;31169:18;;;;;;;;;;;:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31632:8;31497:10;31468:183;;;31522:15;31552:11;31578:15;31608:9;31468:183;;;;;;;;;:::i;:::-;;;;;;;;30482:1177;;;;30319:1340;;;;:::o;35823:124::-;35883:16;35919:10;:20;35930:8;35919:20;;;;;;;;;;;;;;;35912:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35823:124;;;:::o;17769:29::-;;;;:::o;21943:1221::-;5513:1;6111:7;;:19;6103:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5513:1;6244:7;:18;;;;22042:1:::1;22034:5;:9;22026:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;22115:12;;22106:5;:21;;22084:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;22206:19;22228:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22206:46;;22285:1;22271:11;:15;22263:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;22323:12;22338:14;;;;;;;;;;;:27;;;22366:10;22386:4;22393:7;22338:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22323:78;;22420:7;22412:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;22462:16;22481:17;:15;:17::i;:::-;22462:36;;22511:15;22546:5;22542:1;22528:11;:15;;;;:::i;:::-;:23;;;;:::i;:::-;22511:40;;22562:17;22596:1;22582:11;:15;;;;:::i;:::-;22562:35;;22630:246;;;;;;;;22658:10;22630:246;;;;;;22697:7;22630:246;;;;22729:9;22630:246;;;;22761:7;22630:246;;;;22797:1;22630:246;;;;22863:1;22630:246;;;;22827:5;22630:246;;;;::::0;22608:9:::1;:19;22618:8;22608:19;;;;;;;;;;;:268;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22894:9;22906;22894:21;;22889:136;22921:7;22917:1;:11;22889:136;;;22973:7;22947:19;:22;22967:1;22947:22;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;23008:3;;;;;;;22889:136;;;;23037:11;:23;23049:10;23037:23;;;;;;;;;;;;;;;23066:8;23037:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23131:8;23102:10;23093:63;;;23114:15;23141:7;23150:5;23093:63;;;;;;;;:::i;:::-;;;;;;;;22015:1149;;;;;5469:1:::0;6423:7;:22;;;;21943:1221;;:::o;19132:44::-;19174:2;19132:44;:::o;25289:216::-;25354:20;25377:9;:19;25387:8;25377:19;;;;;;;;;;;25354:42;;25429:6;:12;;;;;;;;;;;;25415:26;;:10;:26;;;25407:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;25469:28;25488:8;25469:18;:28::i;:::-;25343:162;25289:216;:::o;18750:44::-;;;;;;;;;;;;;:::o;17720:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23439:1709::-;5513:1;6111:7;;:19;6103:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5513:1;6244:7;:18;;;;23512:20:::1;23535:9;:19;23545:8;23535:19;;;;;;;;;;;23512:42;;23565:18;23586:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23565:45;;23655:10;23639:26;;:6;:12;;;;;;;;;;;;:26;;;23631:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;23724:5;23701:28;;:6;:19;;;;;;;;;;;;:28;;;23693:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;23784:6;:13;;;23771:10;:26;23762:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;23874:18;23895:8;:18;23904:8;23895:18;;;;;;;;;;;23874:39;;23953:1;23927:28;;:5;:14;;;;;;;;;;;;:28;;;23924:258;;24058:19;24068:8;24058:9;:19::i;:::-;23924:258;;;24128:1;24099:31;;:5;:17;;;;;;;;;;;;:31;;;24095:87;;24147:20;24158:8;24147:10;:20::i;:::-;24095:87;23924:258;24263:8;:18;24272:8;24263:18;;;;;;;;;;;24255:26;;24426:1;24400:28;;:5;:14;;;;;;;;;;;;:28;;;24392:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24502:1;24473:31;;:5;:17;;;;;;;;;;;;:31;;;24465:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;24568:14;24585:29;24605:8;24585:19;:29::i;:::-;24568:46;;24660:4;24625:9;:19;24635:8;24625:19;;;;;;;;;;;:32;;;:39;;;;;;;;;;;;;;;;;;24714:12;24729:14;;;;;;;;;;;:23;;;24767:10;24792:6;:19;;;24729:93;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24714:108;;24841:7;24833:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;24912:50;24939:6;:12;;;;;;;;;;;;24955:6;24912:17;:50::i;:::-;25066:8;25009:6;:12;;;;;;;;;;;;24980:160;;;25036:15;25089:6;:19;;;25123:6;24980:160;;;;;;;;:::i;:::-;;;;;;;;23501:1647;;;;;5469:1:::0;6423:7;:22;;;;23439:1709;:::o;2880:103::-;2118:13;:11;:13::i;:::-;2945:30:::1;2972:1;2945:18;:30::i;:::-;2880:103::o:0;26615:775::-;26710:7;26735:18;26756:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26735:45;;26791:16;26818:19;26840:9;:19;26850:8;26840:19;;;;;;;;;;;26818:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26891:12;26906:6;:15;;;26891:30;;26872:343;26943:6;:13;;;26936:4;:20;:41;;;;;26967:10;26960:4;:17;26936:41;26872:343;;;27099:19;:25;27119:4;27099:25;;;;;;;;;;;;27059:6;:19;;;27035:15;:21;27051:4;27035:21;;;;;;;;;;;;:43;;;;:::i;:::-;27034:90;;;;:::i;:::-;27005:119;;;;;:::i;:::-;;;27178:6;;;;;;;26872:343;;;;27227:17;;;27255:13;;:::i;:::-;;;27360:6;:21;;;27349:8;:32;;;;:::i;:::-;27341:41;;;;;26615:775;;;:::o;18538:50::-;;;;;;;;;;;;;;;;;:::o;18653:54::-;;;;;;;;;;;;;;;;;:::o;2232:87::-;2278:7;2305:6;;;;;;;;;;;2298:13;;2232:87;:::o;35691:124::-;35751:16;35786:11;:21;35798:8;35786:21;;;;;;;;;;;;;;;35779:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35691:124;;;:::o;28213:399::-;28320:10;28291:39;;:9;:19;28301:8;28291:19;;;;;;;;;;;:25;;;;;;;;;;;;:39;;;28283:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28401:1;28366:9;:19;28376:8;28366:19;;;;;;;;;;;:32;;;:36;28358:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;28474:1;28439:9;:19;28449:8;28439:19;;;;;;;;;;;:32;;:36;;;;28585:8;28530:10;28493:111;;;28555:15;28493:111;;;;;;:::i;:::-;;;;;;;;28213:399;:::o;18991:41::-;;;;:::o;27398:807::-;27478:19;27500:9;:19;27510:8;27500:19;;;;;;;;;;;27478:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27554:10;27538:26;;:6;:12;;;:26;;;27530:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;27623:5;27600:28;;:6;:19;;;:28;;;27592:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27663:19;27685:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27663:46;;27745:11;27728:6;:13;;;:28;;27720:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27876:18;27897:8;:18;27906:8;27897:18;;;;;;;;;;;27876:39;;27963:1;27934:31;;:5;:17;;;;;;;;;;;;:31;;;27926:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28055:6;28020:9;:19;28030:8;28020:19;;;;;;;;;;;:32;;:41;;;;28125:8;28096:10;28079:63;;;28108:15;28135:6;28079:63;;;;;;;:::i;:::-;;;;;;;;28155:18;;;28184:13;;:::i;:::-;;;27467:738;;;27398:807;;:::o;34105:1045::-;34160:17;34180:8;:18;34189:8;34180:18;;;;;;;;;;;34160:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34246:1;34217:31;;:5;:17;;;:31;;;34209:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;34314:1;34288:28;;:5;:14;;;:28;;;34280:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;34349:19;34371:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34349:46;;34430:11;34414:5;:12;;;:27;;34406:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34631:5;:18;;;34612:5;:16;;;:37;;;;:::i;:::-;34571:9;:19;34581:8;34571:19;;;;;;;;;;;:34;;;:80;;;;;;;:::i;:::-;;;;;;;;34664:28;34683:8;34664:18;:28::i;:::-;34713:81;34739:5;:14;;;34775:5;:18;;;34756:5;:16;;;:37;;;;:::i;:::-;34713:17;:81::i;:::-;35123:8;35000:5;:14;;;34975:167;;;35029:15;35059:5;:18;;;35092:5;:16;;;34975:167;;;;;;;;:::i;:::-;;;;;;;;34149:1001;;34105:1045;:::o;19539:497::-;19638:1;19618:22;;:8;:22;;;19610:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;19713:5;19686:32;;:23;;;;;;;;;;;:32;;;19678:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;19788:8;;;;;;;;;;;19776:20;;:10;:20;;;19768:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;19863:8;;;;;;;;;;;19852:19;;:7;:5;:7::i;:::-;:19;;;19844:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;19964:4;19938:23;;:30;;;;;;;;;;;;;;;;;;20019:8;19979:14;;:49;;;;;;;;;;;;;;;;;;19539:497;:::o;35158:525::-;35210:7;35230:12;35245:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35230:39;;35342:1;35334:4;:9;35331:49;;35367:1;35360:8;;;;;35331:49;35390:17;35410:4;35390:24;;35425:14;35455:9;35467:1;35455:13;;35450:196;35489:21;;35476:9;:34;;;;:::i;:::-;35470:1;:41;35450:196;;35541:15;:30;35569:1;35557:9;:13;;;;:::i;:::-;35541:30;;;;;;;;;;;;35531:40;;;;;:::i;:::-;;;35616:3;;;;;;;35450:196;;;;35669:6;35662:13;;;;;35158:525;;:::o;28620:1388::-;5513:1;6111:7;;:19;6103:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5513:1;6244:7;:18;;;;28697:19:::1;28719:9;:19;28729:8;28719:19;;;;;;;;;;;28697:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;28779:1;28757:6;:19;;;:23;28749:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;28838:10;28822:26;;:6;:12;;;:26;;::::0;28814:59:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28886:18;28907:8;:18;28916:8;28907:18;;;;;;;;;;;28886:39;;28970:1;28944:28;;:5;:14;;;;;;;;;;;;:28;;;28936:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29022:19;29044:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29022:46;;29117:11;29101:6;:13;;;:27;29079:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;29239:5;29216:28;;:6;:19;;;:28;;;29208:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;29304:6;:19;;;29291:9;:32;;29283:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29367:17;29429:3;19174:2;29388:6;:19;;;:37;;;;:::i;:::-;29387:45;;;;:::i;:::-;29367:65;;29443:19;29488:9;29466:6;:19;;;:31;;;;:::i;:::-;29443:54;;29554:1;29542:9;:13;;;;:::i;:::-;29510:15;:28;29526:11;29510:28;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;29589:1;29577:9;:13;;;;:::i;:::-;29566:7;;:24;;;;;;;:::i;:::-;;;;;;;;29603:11;:23;29615:10;29603:23;;;;;;;;;;;;;;;29632:8;29603:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29682:10;29654:9;:19;29664:8;29654:19;;;;;;;;;;;:25;;;:38;;;;;;;;;;;;;;;;;;29738:1;29703:9;:19;29713:8;29703:19;;;;;;;;;;;:32;;:36;;;;29752:53;29778:6;:12;;;29793:11;29752:17;:53::i;:::-;29955:8;29874:10;29823:151;;29847:6;:12;;;29823:151;;;29899:15;29929:11;29823:151;;;;;;;:::i;:::-;;;;;;;;29987:13;;:::i;:::-;;;28686:1322;;;;;5469:1:::0;6423:7;:22;;;;28620:1388;:::o;21538:194::-;2118:13;:11;:13::i;:::-;21633:3:::1;21622:7;:14;;:30;;;;;21650:2;21640:7;:12;21622:30;21613:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;21717:7;21702:12;:22;;;;21538:194:::0;:::o;19237:23::-;;;;;;;;;;;;;:::o;19091:32::-;;;;:::o;21182:250::-;2118:13;:11;:13::i;:::-;21306:2:::1;21285:17;:23;;:50;;;;;21333:2;21312:17;:23;;21285:50;21276:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;21407:17;21383:21;:41;;;;21182:250:::0;:::o;20176:874::-;20303:12;20319:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20303:40;;20369:1;20362:4;:8;20354:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;20460:6;;;;;:::i;:::-;;;;20509:14;;;;;;;;;;;20487:37;;:10;:37;;;20479:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;20552:31;20593:21;;20586:4;:28;:85;;20650:21;;20586:85;;;20630:4;20586:85;20552:119;;20695:1;20687:4;:9;20684:69;;20739:1;20713:27;;20684:69;20773:24;20812:23;20800:9;:35;;;;:::i;:::-;20773:62;;20862:9;20874:1;20862:13;;20857:186;20882:23;20877:1;:28;20857:186;;20953:16;20924:15;:25;20947:1;20940:4;:8;;;;:::i;:::-;20924:25;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;21013:3;;;;;;;20857:186;;;;20216:834;;;20176:874::o;3138:201::-;2118:13;:11;:13::i;:::-;3247:1:::1;3227:22;;:8;:22;;::::0;3219:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3303:28;3322:8;3303:18;:28::i;:::-;3138:201:::0;:::o;8958:317::-;9073:6;9048:21;:31;;9040:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9127:12;9145:9;:14;;9167:6;9145:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9126:52;;;9197:7;9189:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;9029:246;8958:317;;:::o;23233:121::-;23278:7;23298:14;;:16;;;;;;;;;:::i;:::-;;;;;;23332:14;;23325:21;;23233:121;:::o;25513:447::-;25600:228;;;;;;;;25641:1;25600:228;;;;;;25676:1;25600:228;;;;;;25705:1;25600:228;;;;25735:1;25600:228;;;;25765:1;25600:228;;;;25791:1;25600:228;;;;25815:1;25600:228;;;25579:8;:18;25588:8;25579:18;;;;;;;;;;;:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25933:8;25878:10;25846:106;;;25903:15;25846:106;;;;;;:::i;:::-;;;;;;;;25513:447;:::o;25968:484::-;26026:18;26047:8;:18;26056:8;26047:18;;;;;;;;;;;26026:39;;26106:1;26080:28;;:5;:14;;;;;;;;;;;;:28;;;26077:368;;26203:28;26222:8;26203:18;:28::i;:::-;26077:368;;;26410:19;26420:8;26410:9;:19::i;:::-;26077:368;26015:437;25968:484;:::o;2397:132::-;2472:12;:10;:12::i;:::-;2461:23;;:7;:5;:7::i;:::-;:23;;;2453:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2397:132::o;3499:191::-;3573:16;3592:6;;;;;;;;;;;3573:25;;3618:8;3609:6;;:17;;;;;;;;;;;;;;;;;;3673:8;3642:40;;3663:8;3642:40;;;;;;;;;;;;3562:128;3499:191;:::o;781:98::-;834:7;861:10;854:17;;781:98;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:90::-;476:7;519:5;512:13;505:21;494:32;;442:90;;;:::o;538:109::-;619:21;634:5;619:21;:::i;:::-;614:3;607:34;538:109;;:::o;653:210::-;740:4;778:2;767:9;763:18;755:26;;791:65;853:1;842:9;838:17;829:6;791:65;:::i;:::-;653:210;;;;:::o;950:117::-;1059:1;1056;1049:12;1196:122;1269:24;1287:5;1269:24;:::i;:::-;1262:5;1259:35;1249:63;;1308:1;1305;1298:12;1249:63;1196:122;:::o;1324:139::-;1370:5;1408:6;1395:20;1386:29;;1424:33;1451:5;1424:33;:::i;:::-;1324:139;;;;:::o;1469:329::-;1528:6;1577:2;1565:9;1556:7;1552:23;1548:32;1545:119;;;1583:79;;:::i;:::-;1545:119;1703:1;1728:53;1773:7;1764:6;1753:9;1749:22;1728:53;:::i;:::-;1718:63;;1674:117;1469:329;;;;:::o;1804:126::-;1841:7;1881:42;1874:5;1870:54;1859:65;;1804:126;;;:::o;1936:96::-;1973:7;2002:24;2020:5;2002:24;:::i;:::-;1991:35;;1936:96;;;:::o;2038:118::-;2125:24;2143:5;2125:24;:::i;:::-;2120:3;2113:37;2038:118;;:::o;2162:886::-;2423:4;2461:3;2450:9;2446:19;2438:27;;2475:71;2543:1;2532:9;2528:17;2519:6;2475:71;:::i;:::-;2556:72;2624:2;2613:9;2609:18;2600:6;2556:72;:::i;:::-;2638;2706:2;2695:9;2691:18;2682:6;2638:72;:::i;:::-;2720;2788:2;2777:9;2773:18;2764:6;2720:72;:::i;:::-;2802:73;2870:3;2859:9;2855:19;2846:6;2802:73;:::i;:::-;2885;2953:3;2942:9;2938:19;2929:6;2885:73;:::i;:::-;2968;3036:3;3025:9;3021:19;3012:6;2968:73;:::i;:::-;2162:886;;;;;;;;;;:::o;3054:765::-;3140:6;3148;3156;3164;3213:3;3201:9;3192:7;3188:23;3184:33;3181:120;;;3220:79;;:::i;:::-;3181:120;3340:1;3365:53;3410:7;3401:6;3390:9;3386:22;3365:53;:::i;:::-;3355:63;;3311:117;3467:2;3493:53;3538:7;3529:6;3518:9;3514:22;3493:53;:::i;:::-;3483:63;;3438:118;3595:2;3621:53;3666:7;3657:6;3646:9;3642:22;3621:53;:::i;:::-;3611:63;;3566:118;3723:2;3749:53;3794:7;3785:6;3774:9;3770:22;3749:53;:::i;:::-;3739:63;;3694:118;3054:765;;;;;;;:::o;3825:122::-;3898:24;3916:5;3898:24;:::i;:::-;3891:5;3888:35;3878:63;;3937:1;3934;3927:12;3878:63;3825:122;:::o;3953:139::-;3999:5;4037:6;4024:20;4015:29;;4053:33;4080:5;4053:33;:::i;:::-;3953:139;;;;:::o;4098:329::-;4157:6;4206:2;4194:9;4185:7;4181:23;4177:32;4174:119;;;4212:79;;:::i;:::-;4174:119;4332:1;4357:53;4402:7;4393:6;4382:9;4378:22;4357:53;:::i;:::-;4347:63;;4303:117;4098:329;;;;:::o;4433:114::-;4500:6;4534:5;4528:12;4518:22;;4433:114;;;:::o;4553:184::-;4652:11;4686:6;4681:3;4674:19;4726:4;4721:3;4717:14;4702:29;;4553:184;;;;:::o;4743:132::-;4810:4;4833:3;4825:11;;4863:4;4858:3;4854:14;4846:22;;4743:132;;;:::o;4881:108::-;4958:24;4976:5;4958:24;:::i;:::-;4953:3;4946:37;4881:108;;:::o;4995:179::-;5064:10;5085:46;5127:3;5119:6;5085:46;:::i;:::-;5163:4;5158:3;5154:14;5140:28;;4995:179;;;;:::o;5180:113::-;5250:4;5282;5277:3;5273:14;5265:22;;5180:113;;;:::o;5329:732::-;5448:3;5477:54;5525:5;5477:54;:::i;:::-;5547:86;5626:6;5621:3;5547:86;:::i;:::-;5540:93;;5657:56;5707:5;5657:56;:::i;:::-;5736:7;5767:1;5752:284;5777:6;5774:1;5771:13;5752:284;;;5853:6;5847:13;5880:63;5939:3;5924:13;5880:63;:::i;:::-;5873:70;;5966:60;6019:6;5966:60;:::i;:::-;5956:70;;5812:224;5799:1;5796;5792:9;5787:14;;5752:284;;;5756:14;6052:3;6045:10;;5453:608;;;5329:732;;;;:::o;6067:373::-;6210:4;6248:2;6237:9;6233:18;6225:26;;6297:9;6291:4;6287:20;6283:1;6272:9;6268:17;6261:47;6325:108;6428:4;6419:6;6325:108;:::i;:::-;6317:116;;6067:373;;;;:::o;6446:474::-;6514:6;6522;6571:2;6559:9;6550:7;6546:23;6542:32;6539:119;;;6577:79;;:::i;:::-;6539:119;6697:1;6722:53;6767:7;6758:6;6747:9;6743:22;6722:53;:::i;:::-;6712:63;;6668:117;6824:2;6850:53;6895:7;6886:6;6875:9;6871:22;6850:53;:::i;:::-;6840:63;;6795:118;6446:474;;;;;:::o;6926:60::-;6954:3;6975:5;6968:12;;6926:60;;;:::o;6992:142::-;7042:9;7075:53;7093:34;7102:24;7120:5;7102:24;:::i;:::-;7093:34;:::i;:::-;7075:53;:::i;:::-;7062:66;;6992:142;;;:::o;7140:126::-;7190:9;7223:37;7254:5;7223:37;:::i;:::-;7210:50;;7140:126;;;:::o;7272:156::-;7352:9;7385:37;7416:5;7385:37;:::i;:::-;7372:50;;7272:156;;;:::o;7434:191::-;7551:67;7612:5;7551:67;:::i;:::-;7546:3;7539:80;7434:191;;:::o;7631:282::-;7754:4;7792:2;7781:9;7777:18;7769:26;;7805:101;7903:1;7892:9;7888:17;7879:6;7805:101;:::i;:::-;7631:282;;;;:::o;7919:874::-;8174:4;8212:3;8201:9;8197:19;8189:27;;8226:71;8294:1;8283:9;8279:17;8270:6;8226:71;:::i;:::-;8307:72;8375:2;8364:9;8360:18;8351:6;8307:72;:::i;:::-;8389;8457:2;8446:9;8442:18;8433:6;8389:72;:::i;:::-;8471;8539:2;8528:9;8524:18;8515:6;8471:72;:::i;:::-;8553:73;8621:3;8610:9;8606:19;8597:6;8553:73;:::i;:::-;8636;8704:3;8693:9;8689:19;8680:6;8636:73;:::i;:::-;8719:67;8781:3;8770:9;8766:19;8757:6;8719:67;:::i;:::-;7919:874;;;;;;;;;;:::o;8799:222::-;8892:4;8930:2;8919:9;8915:18;8907:26;;8943:71;9011:1;9000:9;8996:17;8987:6;8943:71;:::i;:::-;8799:222;;;;:::o;9027:169::-;9111:11;9145:6;9140:3;9133:19;9185:4;9180:3;9176:14;9161:29;;9027:169;;;;:::o;9202:181::-;9342:33;9338:1;9330:6;9326:14;9319:57;9202:181;:::o;9389:366::-;9531:3;9552:67;9616:2;9611:3;9552:67;:::i;:::-;9545:74;;9628:93;9717:3;9628:93;:::i;:::-;9746:2;9741:3;9737:12;9730:19;;9389:366;;;:::o;9761:419::-;9927:4;9965:2;9954:9;9950:18;9942:26;;10014:9;10008:4;10004:20;10000:1;9989:9;9985:17;9978:47;10042:131;10168:4;10042:131;:::i;:::-;10034:139;;9761:419;;;:::o;10186:178::-;10326:30;10322:1;10314:6;10310:14;10303:54;10186:178;:::o;10370:366::-;10512:3;10533:67;10597:2;10592:3;10533:67;:::i;:::-;10526:74;;10609:93;10698:3;10609:93;:::i;:::-;10727:2;10722:3;10718:12;10711:19;;10370:366;;;:::o;10742:419::-;10908:4;10946:2;10935:9;10931:18;10923:26;;10995:9;10989:4;10985:20;10981:1;10970:9;10966:17;10959:47;11023:131;11149:4;11023:131;:::i;:::-;11015:139;;10742:419;;;:::o;11167:165::-;11307:17;11303:1;11295:6;11291:14;11284:41;11167:165;:::o;11338:366::-;11480:3;11501:67;11565:2;11560:3;11501:67;:::i;:::-;11494:74;;11577:93;11666:3;11577:93;:::i;:::-;11695:2;11690:3;11686:12;11679:19;;11338:366;;;:::o;11710:419::-;11876:4;11914:2;11903:9;11899:18;11891:26;;11963:9;11957:4;11953:20;11949:1;11938:9;11934:17;11927:47;11991:131;12117:4;11991:131;:::i;:::-;11983:139;;11710:419;;;:::o;12135:143::-;12192:5;12223:6;12217:13;12208:22;;12239:33;12266:5;12239:33;:::i;:::-;12135:143;;;;:::o;12284:351::-;12354:6;12403:2;12391:9;12382:7;12378:23;12374:32;12371:119;;;12409:79;;:::i;:::-;12371:119;12529:1;12554:64;12610:7;12601:6;12590:9;12586:22;12554:64;:::i;:::-;12544:74;;12500:128;12284:351;;;;:::o;12641:161::-;12781:13;12777:1;12769:6;12765:14;12758:37;12641:161;:::o;12808:366::-;12950:3;12971:67;13035:2;13030:3;12971:67;:::i;:::-;12964:74;;13047:93;13136:3;13047:93;:::i;:::-;13165:2;13160:3;13156:12;13149:19;;12808:366;;;:::o;13180:419::-;13346:4;13384:2;13373:9;13369:18;13361:26;;13433:9;13427:4;13423:20;13419:1;13408:9;13404:17;13397:47;13461:131;13587:4;13461:131;:::i;:::-;13453:139;;13180:419;;;:::o;13605:180::-;13653:77;13650:1;13643:88;13750:4;13747:1;13740:15;13774:4;13771:1;13764:15;13791:191;13831:3;13850:20;13868:1;13850:20;:::i;:::-;13845:25;;13884:20;13902:1;13884:20;:::i;:::-;13879:25;;13927:1;13924;13920:9;13913:16;;13948:3;13945:1;13942:10;13939:36;;;13955:18;;:::i;:::-;13939:36;13791:191;;;;:::o;13988:224::-;14128:34;14124:1;14116:6;14112:14;14105:58;14197:7;14192:2;14184:6;14180:15;14173:32;13988:224;:::o;14218:366::-;14360:3;14381:67;14445:2;14440:3;14381:67;:::i;:::-;14374:74;;14457:93;14546:3;14457:93;:::i;:::-;14575:2;14570:3;14566:12;14559:19;;14218:366;;;:::o;14590:419::-;14756:4;14794:2;14783:9;14779:18;14771:26;;14843:9;14837:4;14833:20;14829:1;14818:9;14814:17;14807:47;14871:131;14997:4;14871:131;:::i;:::-;14863:139;;14590:419;;;:::o;15015:164::-;15155:16;15151:1;15143:6;15139:14;15132:40;15015:164;:::o;15185:366::-;15327:3;15348:67;15412:2;15407:3;15348:67;:::i;:::-;15341:74;;15424:93;15513:3;15424:93;:::i;:::-;15542:2;15537:3;15533:12;15526:19;;15185:366;;;:::o;15557:419::-;15723:4;15761:2;15750:9;15746:18;15738:26;;15810:9;15804:4;15800:20;15796:1;15785:9;15781:17;15774:47;15838:131;15964:4;15838:131;:::i;:::-;15830:139;;15557:419;;;:::o;15982:164::-;16122:16;16118:1;16110:6;16106:14;16099:40;15982:164;:::o;16152:366::-;16294:3;16315:67;16379:2;16374:3;16315:67;:::i;:::-;16308:74;;16391:93;16480:3;16391:93;:::i;:::-;16509:2;16504:3;16500:12;16493:19;;16152:366;;;:::o;16524:419::-;16690:4;16728:2;16717:9;16713:18;16705:26;;16777:9;16771:4;16767:20;16763:1;16752:9;16748:17;16741:47;16805:131;16931:4;16805:131;:::i;:::-;16797:139;;16524:419;;;:::o;16949:171::-;17089:23;17085:1;17077:6;17073:14;17066:47;16949:171;:::o;17126:366::-;17268:3;17289:67;17353:2;17348:3;17289:67;:::i;:::-;17282:74;;17365:93;17454:3;17365:93;:::i;:::-;17483:2;17478:3;17474:12;17467:19;;17126:366;;;:::o;17498:419::-;17664:4;17702:2;17691:9;17687:18;17679:26;;17751:9;17745:4;17741:20;17737:1;17726:9;17722:17;17715:47;17779:131;17905:4;17779:131;:::i;:::-;17771:139;;17498:419;;;:::o;17923:348::-;17963:7;17986:20;18004:1;17986:20;:::i;:::-;17981:25;;18020:20;18038:1;18020:20;:::i;:::-;18015:25;;18208:1;18140:66;18136:74;18133:1;18130:81;18125:1;18118:9;18111:17;18107:105;18104:131;;;18215:18;;:::i;:::-;18104:131;18263:1;18260;18256:9;18245:20;;17923:348;;;;:::o;18277:180::-;18325:77;18322:1;18315:88;18422:4;18419:1;18412:15;18446:4;18443:1;18436:15;18463:185;18503:1;18520:20;18538:1;18520:20;:::i;:::-;18515:25;;18554:20;18572:1;18554:20;:::i;:::-;18549:25;;18593:1;18583:35;;18598:18;;:::i;:::-;18583:35;18640:1;18637;18633:9;18628:14;;18463:185;;;;:::o;18654:194::-;18694:4;18714:20;18732:1;18714:20;:::i;:::-;18709:25;;18748:20;18766:1;18748:20;:::i;:::-;18743:25;;18792:1;18789;18785:9;18777:17;;18816:1;18810:4;18807:11;18804:37;;;18821:18;;:::i;:::-;18804:37;18654:194;;;;:::o;18854:332::-;18975:4;19013:2;19002:9;18998:18;18990:26;;19026:71;19094:1;19083:9;19079:17;19070:6;19026:71;:::i;:::-;19107:72;19175:2;19164:9;19160:18;19151:6;19107:72;:::i;:::-;18854:332;;;;;:::o;19192:143::-;19249:5;19280:6;19274:13;19265:22;;19296:33;19323:5;19296:33;:::i;:::-;19192:143;;;;:::o;19341:351::-;19411:6;19460:2;19448:9;19439:7;19435:23;19431:32;19428:119;;;19466:79;;:::i;:::-;19428:119;19586:1;19611:64;19667:7;19658:6;19647:9;19643:22;19611:64;:::i;:::-;19601:74;;19557:128;19341:351;;;;:::o;19698:162::-;19838:14;19834:1;19826:6;19822:14;19815:38;19698:162;:::o;19866:366::-;20008:3;20029:67;20093:2;20088:3;20029:67;:::i;:::-;20022:74;;20105:93;20194:3;20105:93;:::i;:::-;20223:2;20218:3;20214:12;20207:19;;19866:366;;;:::o;20238:419::-;20404:4;20442:2;20431:9;20427:18;20419:26;;20491:9;20485:4;20481:20;20477:1;20466:9;20462:17;20455:47;20519:131;20645:4;20519:131;:::i;:::-;20511:139;;20238:419;;;:::o;20663:167::-;20803:19;20799:1;20791:6;20787:14;20780:43;20663:167;:::o;20836:366::-;20978:3;20999:67;21063:2;21058:3;20999:67;:::i;:::-;20992:74;;21075:93;21164:3;21075:93;:::i;:::-;21193:2;21188:3;21184:12;21177:19;;20836:366;;;:::o;21208:419::-;21374:4;21412:2;21401:9;21397:18;21389:26;;21461:9;21455:4;21451:20;21447:1;21436:9;21432:17;21425:47;21489:131;21615:4;21489:131;:::i;:::-;21481:139;;21208:419;;;:::o;21633:221::-;21773:34;21769:1;21761:6;21757:14;21750:58;21842:4;21837:2;21829:6;21825:15;21818:29;21633:221;:::o;21860:366::-;22002:3;22023:67;22087:2;22082:3;22023:67;:::i;:::-;22016:74;;22099:93;22188:3;22099:93;:::i;:::-;22217:2;22212:3;22208:12;22201:19;;21860:366;;;:::o;22232:419::-;22398:4;22436:2;22425:9;22421:18;22413:26;;22485:9;22479:4;22475:20;22471:1;22460:9;22456:17;22449:47;22513:131;22639:4;22513:131;:::i;:::-;22505:139;;22232:419;;;:::o;22657:222::-;22797:34;22793:1;22785:6;22781:14;22774:58;22866:5;22861:2;22853:6;22849:15;22842:30;22657:222;:::o;22885:366::-;23027:3;23048:67;23112:2;23107:3;23048:67;:::i;:::-;23041:74;;23124:93;23213:3;23124:93;:::i;:::-;23242:2;23237:3;23233:12;23226:19;;22885:366;;;:::o;23257:419::-;23423:4;23461:2;23450:9;23446:18;23438:26;;23510:9;23504:4;23500:20;23496:1;23485:9;23481:17;23474:47;23538:131;23664:4;23538:131;:::i;:::-;23530:139;;23257:419;;;:::o;23682:553::-;23859:4;23897:3;23886:9;23882:19;23874:27;;23911:71;23979:1;23968:9;23964:17;23955:6;23911:71;:::i;:::-;23992:72;24060:2;24049:9;24045:18;24036:6;23992:72;:::i;:::-;24074;24142:2;24131:9;24127:18;24118:6;24074:72;:::i;:::-;24156;24224:2;24213:9;24209:18;24200:6;24156:72;:::i;:::-;23682:553;;;;;;;:::o;24241:175::-;24381:27;24377:1;24369:6;24365:14;24358:51;24241:175;:::o;24422:366::-;24564:3;24585:67;24649:2;24644:3;24585:67;:::i;:::-;24578:74;;24661:93;24750:3;24661:93;:::i;:::-;24779:2;24774:3;24770:12;24763:19;;24422:366;;;:::o;24794:419::-;24960:4;24998:2;24987:9;24983:18;24975:26;;25047:9;25041:4;25037:20;25033:1;25022:9;25018:17;25011:47;25075:131;25201:4;25075:131;:::i;:::-;25067:139;;24794:419;;;:::o;25219:225::-;25359:34;25355:1;25347:6;25343:14;25336:58;25428:8;25423:2;25415:6;25411:15;25404:33;25219:225;:::o;25450:366::-;25592:3;25613:67;25677:2;25672:3;25613:67;:::i;:::-;25606:74;;25689:93;25778:3;25689:93;:::i;:::-;25807:2;25802:3;25798:12;25791:19;;25450:366;;;:::o;25822:419::-;25988:4;26026:2;26015:9;26011:18;26003:26;;26075:9;26069:4;26065:20;26061:1;26050:9;26046:17;26039:47;26103:131;26229:4;26103:131;:::i;:::-;26095:139;;25822:419;;;:::o;26247:169::-;26387:21;26383:1;26375:6;26371:14;26364:45;26247:169;:::o;26422:366::-;26564:3;26585:67;26649:2;26644:3;26585:67;:::i;:::-;26578:74;;26661:93;26750:3;26661:93;:::i;:::-;26779:2;26774:3;26770:12;26763:19;;26422:366;;;:::o;26794:419::-;26960:4;26998:2;26987:9;26983:18;26975:26;;27047:9;27041:4;27037:20;27033:1;27022:9;27018:17;27011:47;27075:131;27201:4;27075:131;:::i;:::-;27067:139;;26794:419;;;:::o;27219:442::-;27368:4;27406:2;27395:9;27391:18;27383:26;;27419:71;27487:1;27476:9;27472:17;27463:6;27419:71;:::i;:::-;27500:72;27568:2;27557:9;27553:18;27544:6;27500:72;:::i;:::-;27582;27650:2;27639:9;27635:18;27626:6;27582:72;:::i;:::-;27219:442;;;;;;:::o;27667:116::-;27737:21;27752:5;27737:21;:::i;:::-;27730:5;27727:32;27717:60;;27773:1;27770;27763:12;27717:60;27667:116;:::o;27789:137::-;27843:5;27874:6;27868:13;27859:22;;27890:30;27914:5;27890:30;:::i;:::-;27789:137;;;;:::o;27932:345::-;27999:6;28048:2;28036:9;28027:7;28023:23;28019:32;28016:119;;;28054:79;;:::i;:::-;28016:119;28174:1;28199:61;28252:7;28243:6;28232:9;28228:22;28199:61;:::i;:::-;28189:71;;28145:125;27932:345;;;;:::o;28283:165::-;28423:17;28419:1;28411:6;28407:14;28400:41;28283:165;:::o;28454:366::-;28596:3;28617:67;28681:2;28676:3;28617:67;:::i;:::-;28610:74;;28693:93;28782:3;28693:93;:::i;:::-;28811:2;28806:3;28802:12;28795:19;;28454:366;;;:::o;28826:419::-;28992:4;29030:2;29019:9;29015:18;29007:26;;29079:9;29073:4;29069:20;29065:1;29054:9;29050:17;29043:47;29107:131;29233:4;29107:131;:::i;:::-;29099:139;;28826:419;;;:::o;29251:442::-;29400:4;29438:2;29427:9;29423:18;29415:26;;29451:71;29519:1;29508:9;29504:17;29495:6;29451:71;:::i;:::-;29532:72;29600:2;29589:9;29585:18;29576:6;29532:72;:::i;:::-;29614;29682:2;29671:9;29667:18;29658:6;29614:72;:::i;:::-;29251:442;;;;;;:::o;29699:168::-;29839:20;29835:1;29827:6;29823:14;29816:44;29699:168;:::o;29873:366::-;30015:3;30036:67;30100:2;30095:3;30036:67;:::i;:::-;30029:74;;30112:93;30201:3;30112:93;:::i;:::-;30230:2;30225:3;30221:12;30214:19;;29873:366;;;:::o;30245:419::-;30411:4;30449:2;30438:9;30434:18;30426:26;;30498:9;30492:4;30488:20;30484:1;30473:9;30469:17;30462:47;30526:131;30652:4;30526:131;:::i;:::-;30518:139;;30245:419;;;:::o;30670:171::-;30810:23;30806:1;30798:6;30794:14;30787:47;30670:171;:::o;30847:366::-;30989:3;31010:67;31074:2;31069:3;31010:67;:::i;:::-;31003:74;;31086:93;31175:3;31086:93;:::i;:::-;31204:2;31199:3;31195:12;31188:19;;30847:366;;;:::o;31219:419::-;31385:4;31423:2;31412:9;31408:18;31400:26;;31472:9;31466:4;31462:20;31458:1;31447:9;31443:17;31436:47;31500:131;31626:4;31500:131;:::i;:::-;31492:139;;31219:419;;;:::o;31644:221::-;31784:34;31780:1;31772:6;31768:14;31761:58;31853:4;31848:2;31840:6;31836:15;31829:29;31644:221;:::o;31871:366::-;32013:3;32034:67;32098:2;32093:3;32034:67;:::i;:::-;32027:74;;32110:93;32199:3;32110:93;:::i;:::-;32228:2;32223:3;32219:12;32212:19;;31871:366;;;:::o;32243:419::-;32409:4;32447:2;32436:9;32432:18;32424:26;;32496:9;32490:4;32486:20;32482:1;32471:9;32467:17;32460:47;32524:131;32650:4;32524:131;:::i;:::-;32516:139;;32243:419;;;:::o;32668:332::-;32789:4;32827:2;32816:9;32812:18;32804:26;;32840:71;32908:1;32897:9;32893:17;32884:6;32840:71;:::i;:::-;32921:72;32989:2;32978:9;32974:18;32965:6;32921:72;:::i;:::-;32668:332;;;;;:::o;33006:171::-;33146:23;33142:1;33134:6;33130:14;33123:47;33006:171;:::o;33183:366::-;33325:3;33346:67;33410:2;33405:3;33346:67;:::i;:::-;33339:74;;33422:93;33511:3;33422:93;:::i;:::-;33540:2;33535:3;33531:12;33524:19;;33183:366;;;:::o;33555:419::-;33721:4;33759:2;33748:9;33744:18;33736:26;;33808:9;33802:4;33798:20;33794:1;33783:9;33779:17;33772:47;33836:131;33962:4;33836:131;:::i;:::-;33828:139;;33555:419;;;:::o;33980:165::-;34120:17;34116:1;34108:6;34104:14;34097:41;33980:165;:::o;34151:366::-;34293:3;34314:67;34378:2;34373:3;34314:67;:::i;:::-;34307:74;;34390:93;34479:3;34390:93;:::i;:::-;34508:2;34503:3;34499:12;34492:19;;34151:366;;;:::o;34523:419::-;34689:4;34727:2;34716:9;34712:18;34704:26;;34776:9;34770:4;34766:20;34762:1;34751:9;34747:17;34740:47;34804:131;34930:4;34804:131;:::i;:::-;34796:139;;34523:419;;;:::o;34948:224::-;35088:34;35084:1;35076:6;35072:14;35065:58;35157:7;35152:2;35144:6;35140:15;35133:32;34948:224;:::o;35178:366::-;35320:3;35341:67;35405:2;35400:3;35341:67;:::i;:::-;35334:74;;35417:93;35506:3;35417:93;:::i;:::-;35535:2;35530:3;35526:12;35519:19;;35178:366;;;:::o;35550:419::-;35716:4;35754:2;35743:9;35739:18;35731:26;;35803:9;35797:4;35793:20;35789:1;35778:9;35774:17;35767:47;35831:131;35957:4;35831:131;:::i;:::-;35823:139;;35550:419;;;:::o;35975:166::-;36115:18;36111:1;36103:6;36099:14;36092:42;35975:166;:::o;36147:366::-;36289:3;36310:67;36374:2;36369:3;36310:67;:::i;:::-;36303:74;;36386:93;36475:3;36386:93;:::i;:::-;36504:2;36499:3;36495:12;36488:19;;36147:366;;;:::o;36519:419::-;36685:4;36723:2;36712:9;36708:18;36700:26;;36772:9;36766:4;36762:20;36758:1;36747:9;36743:17;36736:47;36800:131;36926:4;36800:131;:::i;:::-;36792:139;;36519:419;;;:::o;36944:165::-;37084:17;37080:1;37072:6;37068:14;37061:41;36944:165;:::o;37115:366::-;37257:3;37278:67;37342:2;37337:3;37278:67;:::i;:::-;37271:74;;37354:93;37443:3;37354:93;:::i;:::-;37472:2;37467:3;37463:12;37456:19;;37115:366;;;:::o;37487:419::-;37653:4;37691:2;37680:9;37676:18;37668:26;;37740:9;37734:4;37730:20;37726:1;37715:9;37711:17;37704:47;37768:131;37894:4;37768:131;:::i;:::-;37760:139;;37487:419;;;:::o;37912:171::-;38052:23;38048:1;38040:6;38036:14;38029:47;37912:171;:::o;38089:366::-;38231:3;38252:67;38316:2;38311:3;38252:67;:::i;:::-;38245:74;;38328:93;38417:3;38328:93;:::i;:::-;38446:2;38441:3;38437:12;38430:19;;38089:366;;;:::o;38461:419::-;38627:4;38665:2;38654:9;38650:18;38642:26;;38714:9;38708:4;38704:20;38700:1;38689:9;38685:17;38678:47;38742:131;38868:4;38742:131;:::i;:::-;38734:139;;38461:419;;;:::o;38886:172::-;39026:24;39022:1;39014:6;39010:14;39003:48;38886:172;:::o;39064:366::-;39206:3;39227:67;39291:2;39286:3;39227:67;:::i;:::-;39220:74;;39303:93;39392:3;39303:93;:::i;:::-;39421:2;39416:3;39412:12;39405:19;;39064:366;;;:::o;39436:419::-;39602:4;39640:2;39629:9;39625:18;39617:26;;39689:9;39683:4;39679:20;39675:1;39664:9;39660:17;39653:47;39717:131;39843:4;39717:131;:::i;:::-;39709:139;;39436:419;;;:::o;39861:221::-;40001:34;39997:1;39989:6;39985:14;39978:58;40070:4;40065:2;40057:6;40053:15;40046:29;39861:221;:::o;40088:366::-;40230:3;40251:67;40315:2;40310:3;40251:67;:::i;:::-;40244:74;;40327:93;40416:3;40327:93;:::i;:::-;40445:2;40440:3;40436:12;40429:19;;40088:366;;;:::o;40460:419::-;40626:4;40664:2;40653:9;40649:18;40641:26;;40713:9;40707:4;40703:20;40699:1;40688:9;40684:17;40677:47;40741:131;40867:4;40741:131;:::i;:::-;40733:139;;40460:419;;;:::o;40885:182::-;41025:34;41021:1;41013:6;41009:14;41002:58;40885:182;:::o;41073:366::-;41215:3;41236:67;41300:2;41295:3;41236:67;:::i;:::-;41229:74;;41312:93;41401:3;41312:93;:::i;:::-;41430:2;41425:3;41421:12;41414:19;;41073:366;;;:::o;41445:419::-;41611:4;41649:2;41638:9;41634:18;41626:26;;41698:9;41692:4;41688:20;41684:1;41673:9;41669:17;41662:47;41726:131;41852:4;41726:131;:::i;:::-;41718:139;;41445:419;;;:::o;41870:238::-;42010:34;42006:1;41998:6;41994:14;41987:58;42079:21;42074:2;42066:6;42062:15;42055:46;41870:238;:::o;42114:366::-;42256:3;42277:67;42341:2;42336:3;42277:67;:::i;:::-;42270:74;;42353:93;42442:3;42353:93;:::i;:::-;42471:2;42466:3;42462:12;42455:19;;42114:366;;;:::o;42486:419::-;42652:4;42690:2;42679:9;42675:18;42667:26;;42739:9;42733:4;42729:20;42725:1;42714:9;42710:17;42703:47;42767:131;42893:4;42767:131;:::i;:::-;42759:139;;42486:419;;;:::o;42911:168::-;43051:20;43047:1;43039:6;43035:14;43028:44;42911:168;:::o;43085:366::-;43227:3;43248:67;43312:2;43307:3;43248:67;:::i;:::-;43241:74;;43324:93;43413:3;43324:93;:::i;:::-;43442:2;43437:3;43433:12;43426:19;;43085:366;;;:::o;43457:419::-;43623:4;43661:2;43650:9;43646:18;43638:26;;43710:9;43704:4;43700:20;43696:1;43685:9;43681:17;43674:47;43738:131;43864:4;43738:131;:::i;:::-;43730:139;;43457:419;;;:::o;43882:170::-;44022:22;44018:1;44010:6;44006:14;43999:46;43882:170;:::o;44058:366::-;44200:3;44221:67;44285:2;44280:3;44221:67;:::i;:::-;44214:74;;44297:93;44386:3;44297:93;:::i;:::-;44415:2;44410:3;44406:12;44399:19;;44058:366;;;:::o;44430:419::-;44596:4;44634:2;44623:9;44619:18;44611:26;;44683:9;44677:4;44673:20;44669:1;44658:9;44654:17;44647:47;44711:131;44837:4;44711:131;:::i;:::-;44703:139;;44430:419;;;:::o;44855:182::-;44995:34;44991:1;44983:6;44979:14;44972:58;44855:182;:::o;45043:366::-;45185:3;45206:67;45270:2;45265:3;45206:67;:::i;:::-;45199:74;;45282:93;45371:3;45282:93;:::i;:::-;45400:2;45395:3;45391:12;45384:19;;45043:366;;;:::o;45415:419::-;45581:4;45619:2;45608:9;45604:18;45596:26;;45668:9;45662:4;45658:20;45654:1;45643:9;45639:17;45632:47;45696:131;45822:4;45696:131;:::i;:::-;45688:139;;45415:419;;;:::o;45840:228::-;45980:34;45976:1;45968:6;45964:14;45957:58;46049:11;46044:2;46036:6;46032:15;46025:36;45840:228;:::o;46074:366::-;46216:3;46237:67;46301:2;46296:3;46237:67;:::i;:::-;46230:74;;46313:93;46402:3;46313:93;:::i;:::-;46431:2;46426:3;46422:12;46415:19;;46074:366;;;:::o;46446:419::-;46612:4;46650:2;46639:9;46635:18;46627:26;;46699:9;46693:4;46689:20;46685:1;46674:9;46670:17;46663:47;46727:131;46853:4;46727:131;:::i;:::-;46719:139;;46446:419;;;:::o;46871:173::-;47011:25;47007:1;46999:6;46995:14;46988:49;46871:173;:::o;47050:366::-;47192:3;47213:67;47277:2;47272:3;47213:67;:::i;:::-;47206:74;;47289:93;47378:3;47289:93;:::i;:::-;47407:2;47402:3;47398:12;47391:19;;47050:366;;;:::o;47422:419::-;47588:4;47626:2;47615:9;47611:18;47603:26;;47675:9;47669:4;47665:20;47661:1;47650:9;47646:17;47639:47;47703:131;47829:4;47703:131;:::i;:::-;47695:139;;47422:419;;;:::o;47847:176::-;47987:28;47983:1;47975:6;47971:14;47964:52;47847:176;:::o;48029:366::-;48171:3;48192:67;48256:2;48251:3;48192:67;:::i;:::-;48185:74;;48268:93;48357:3;48268:93;:::i;:::-;48386:2;48381:3;48377:12;48370:19;;48029:366;;;:::o;48401:419::-;48567:4;48605:2;48594:9;48590:18;48582:26;;48654:9;48648:4;48644:20;48640:1;48629:9;48625:17;48618:47;48682:131;48808:4;48682:131;:::i;:::-;48674:139;;48401:419;;;:::o;48826:220::-;48966:34;48962:1;48954:6;48950:14;48943:58;49035:3;49030:2;49022:6;49018:15;49011:28;48826:220;:::o;49052:366::-;49194:3;49215:67;49279:2;49274:3;49215:67;:::i;:::-;49208:74;;49291:93;49380:3;49291:93;:::i;:::-;49409:2;49404:3;49400:12;49393:19;;49052:366;;;:::o;49424:419::-;49590:4;49628:2;49617:9;49613:18;49605:26;;49677:9;49671:4;49667:20;49663:1;49652:9;49648:17;49641:47;49705:131;49831:4;49705:131;:::i;:::-;49697:139;;49424:419;;;:::o;49849:181::-;49989:33;49985:1;49977:6;49973:14;49966:57;49849:181;:::o;50036:366::-;50178:3;50199:67;50263:2;50258:3;50199:67;:::i;:::-;50192:74;;50275:93;50364:3;50275:93;:::i;:::-;50393:2;50388:3;50384:12;50377:19;;50036:366;;;:::o;50408:419::-;50574:4;50612:2;50601:9;50597:18;50589:26;;50661:9;50655:4;50651:20;50647:1;50636:9;50632:17;50625:47;50689:131;50815:4;50689:131;:::i;:::-;50681:139;;50408:419;;;:::o;50833:178::-;50973:30;50969:1;50961:6;50957:14;50950:54;50833:178;:::o;51017:366::-;51159:3;51180:67;51244:2;51239:3;51180:67;:::i;:::-;51173:74;;51256:93;51345:3;51256:93;:::i;:::-;51374:2;51369:3;51365:12;51358:19;;51017:366;;;:::o;51389:419::-;51555:4;51593:2;51582:9;51578:18;51570:26;;51642:9;51636:4;51632:20;51628:1;51617:9;51613:17;51606:47;51670:131;51796:4;51670:131;:::i;:::-;51662:139;;51389:419;;;:::o;51814:171::-;51853:3;51876:24;51894:5;51876:24;:::i;:::-;51867:33;;51922:4;51915:5;51912:15;51909:41;;51930:18;;:::i;:::-;51909:41;51977:1;51970:5;51966:13;51959:20;;51814:171;;;:::o;51991:162::-;52131:14;52127:1;52119:6;52115:14;52108:38;51991:162;:::o;52159:366::-;52301:3;52322:67;52386:2;52381:3;52322:67;:::i;:::-;52315:74;;52398:93;52487:3;52398:93;:::i;:::-;52516:2;52511:3;52507:12;52500:19;;52159:366;;;:::o;52531:419::-;52697:4;52735:2;52724:9;52720:18;52712:26;;52784:9;52778:4;52774:20;52770:1;52759:9;52755:17;52748:47;52812:131;52938:4;52812:131;:::i;:::-;52804:139;;52531:419;;;:::o;52956:225::-;53096:34;53092:1;53084:6;53080:14;53073:58;53165:8;53160:2;53152:6;53148:15;53141:33;52956:225;:::o;53187:366::-;53329:3;53350:67;53414:2;53409:3;53350:67;:::i;:::-;53343:74;;53426:93;53515:3;53426:93;:::i;:::-;53544:2;53539:3;53535:12;53528:19;;53187:366;;;:::o;53559:419::-;53725:4;53763:2;53752:9;53748:18;53740:26;;53812:9;53806:4;53802:20;53798:1;53787:9;53783:17;53776:47;53840:131;53966:4;53840:131;:::i;:::-;53832:139;;53559:419;;;:::o;53984:179::-;54124:31;54120:1;54112:6;54108:14;54101:55;53984:179;:::o;54169:366::-;54311:3;54332:67;54396:2;54391:3;54332:67;:::i;:::-;54325:74;;54408:93;54497:3;54408:93;:::i;:::-;54526:2;54521:3;54517:12;54510:19;;54169:366;;;:::o;54541:419::-;54707:4;54745:2;54734:9;54730:18;54722:26;;54794:9;54788:4;54784:20;54780:1;54769:9;54765:17;54758:47;54822:131;54948:4;54822:131;:::i;:::-;54814:139;;54541:419;;;:::o;54966:147::-;55067:11;55104:3;55089:18;;54966:147;;;;:::o;55119:114::-;;:::o;55239:398::-;55398:3;55419:83;55500:1;55495:3;55419:83;:::i;:::-;55412:90;;55511:93;55600:3;55511:93;:::i;:::-;55629:1;55624:3;55620:11;55613:18;;55239:398;;;:::o;55643:379::-;55827:3;55849:147;55992:3;55849:147;:::i;:::-;55842:154;;56013:3;56006:10;;55643:379;;;:::o;56028:245::-;56168:34;56164:1;56156:6;56152:14;56145:58;56237:28;56232:2;56224:6;56220:15;56213:53;56028:245;:::o;56279:366::-;56421:3;56442:67;56506:2;56501:3;56442:67;:::i;:::-;56435:74;;56518:93;56607:3;56518:93;:::i;:::-;56636:2;56631:3;56627:12;56620:19;;56279:366;;;:::o;56651:419::-;56817:4;56855:2;56844:9;56840:18;56832:26;;56904:9;56898:4;56894:20;56890:1;56879:9;56875:17;56868:47;56932:131;57058:4;56932:131;:::i;:::-;56924:139;;56651:419;;;:::o;57076:233::-;57115:3;57138:24;57156:5;57138:24;:::i;:::-;57129:33;;57184:66;57177:5;57174:77;57171:103;;57254:18;;:::i;:::-;57171:103;57301:1;57294:5;57290:13;57283:20;;57076:233;;;:::o;57315:182::-;57455:34;57451:1;57443:6;57439:14;57432:58;57315:182;:::o;57503:366::-;57645:3;57666:67;57730:2;57725:3;57666:67;:::i;:::-;57659:74;;57742:93;57831:3;57742:93;:::i;:::-;57860:2;57855:3;57851:12;57844:19;;57503:366;;;:::o;57875:419::-;58041:4;58079:2;58068:9;58064:18;58056:26;;58128:9;58122:4;58118:20;58114:1;58103:9;58099:17;58092:47;58156:131;58282:4;58156:131;:::i;:::-;58148:139;;57875:419;;;:::o

Swarm Source

ipfs://126a82cd51b125a36a88ecf18f018542d8e7d70f3419d9e43e3c67709d04dd6a

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.