ETH Price: $2,659.65 (+1.46%)

Token

Keys Farm (KEYSFARM)
 

Overview

Max Total Supply

0.146581226410993213 KEYSFARM

Holders

97

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KEYSFarm

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 5 of 7: KeysFarm.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

import "./SafeMath.sol";
import "./Address.sol";
import "./IERC20.sol";
import "./ReentrantGuard.sol";
import "./IUniswapV2Router02.sol";
import "./IKeysStaking.sol";

/**
 *
 * KEYS Farming Contract
 * Grants Passive KEYS To Users Who Stake + Lock KEYS+ETH Liquidity
 * Developed by DeFi Mark (MoonMark)
 *
 */
contract KEYSFarm is ReentrancyGuard, IERC20, IKeysStaking{

    using SafeMath for uint256;
    using Address for address;
    
    // KEYS Contract
    address constant KEYS = 0xe0a189C975e4928222978A74517442239a0b86ff;
    address constant KEYS_LP = 0x5BaCB4114Ad2D448E79aDdef121714b74D67faeC;
    
    // Uniswap Router
    IUniswapV2Router02 router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    // precision factor
    uint256 constant precision = 10**36;
    
    // Total Dividends Per Farm
    uint256 public dividendsPerToken;
 
    // 88 day lock time
    uint256 public lockTime = 2534400;
    
    // 8 day harvest time
    uint256 public harvestTime = 230400;
    
    // Locker Structure
    struct StakedUser {
        uint256 tokensLocked;
        uint256 timeLocked;
        uint256 lastClaim;
        uint256 totalExcluded;
    }
    
    // Users -> StakedUser
    mapping ( address => StakedUser ) users;
    
    // total locked across all lockers
    uint256 totalLocked;
    
    // reduced purchase fee
    uint256 public fee = 1;
    
    // fee for unstaking too early
    uint256 public earlyFee = 8;
    
    // multisignature wallet
    address public multisig = 0xfCacEAa7b4cf845f2cfcE6a3dA680dF1BB05015c;
    
    bool receiveDisabled;
    bool refundEnabled = true;
    
    // Ownership
    address public owner;
    modifier onlyOwner(){require(owner == msg.sender, 'Only Owner'); _;}
    
    // Events
    event TransferOwnership(address newOwner);
    event UpdateFee(uint256 newFee);
    event UpdateLockTime(uint256 newTime);
    event UpdatedStakingMinimum(uint256 minimumKeys);
    event UpdatedFeeReceiver(address feeReceiver);
    event UpdatedEarlyFee(uint256 newFee);
    event UpdatedHarvestTime(uint256 newTime);
    
    constructor() {
        owner = 0xfCacEAa7b4cf845f2cfcE6a3dA680dF1BB05015c;
        
    }
    
    function totalSupply() external view override returns (uint256) { return totalLocked; }
    function balanceOf(address account) public view override returns (uint256) { return users[account].tokensLocked; }
    function allowance(address holder, address spender) external view override returns (uint256) { return holder == spender ? balanceOf(holder) : 0; }
    function name() public pure override returns (string memory) {
        return "Keys Farm";
    }
    function symbol() public pure override returns (string memory) {
        return "KEYSFARM";
    }
    function decimals() public pure override returns (uint8) {
        return 18;
    }
    function approve(address spender, uint256 amount) public view override returns (bool) {
        return users[msg.sender].tokensLocked >= amount && spender != msg.sender;
    }
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        // ensure claim requirements
        if (recipient == KEYS) {
            _unlock(msg.sender, msg.sender, amount, false);
        } else {
            _makeClaim(msg.sender);
        }
        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (recipient == KEYS) {
            _unlock(msg.sender, msg.sender, amount, false);
        } else {
            _makeClaim(msg.sender);
        }
        return true && sender == recipient;
    }
    
    
    ///////////////////////////////////
    //////    OWNER FUNCTIONS   ///////
    ///////////////////////////////////
    
    function transferOwnership(address newOwner) external onlyOwner {
        owner = newOwner;
        emit TransferOwnership(newOwner);
    }
    
    function updateFee(uint256 newFee) external onlyOwner {
        require(earlyFee <= 5, 'Fee Too Large');
        fee = newFee;
        emit UpdateFee(newFee);
    }
    
    function setRefundEnabled(bool _refundEnabled) external onlyOwner {
        refundEnabled = _refundEnabled;
    }
    
    function updateFeeReceiver(address newReceiver) external onlyOwner {
        multisig = newReceiver;
        emit UpdatedFeeReceiver(newReceiver);
    }
    
    function setEarlyFee(uint256 newFee) external onlyOwner {
        require(earlyFee <= 30, 'Fee Too Large');
        earlyFee = newFee;
        emit UpdatedEarlyFee(newFee);
    }

    function setHarvestTime(uint256 newTime) external onlyOwner {
        require(newTime <= 10**7, 'Time Too Long');
        harvestTime = newTime;
        emit UpdatedHarvestTime(newTime);
    }
    
    function setLockTime(uint256 newTime) external onlyOwner {
        require(newTime <= 10**7, 'Lock Time Too Long');
        lockTime = newTime;
        emit UpdateLockTime(newTime);
    }
    
    function withdraw(bool ETH, address token, uint256 amount, address recipient) external onlyOwner {
        if (ETH) {
            require(address(this).balance >= amount, 'Insufficient Balance');
            (bool s,) = payable(recipient).call{value: amount}("");
            require(s, 'Failure on ETH Withdrawal');
        } else {
            require(token != KEYS_LP, 'Cannot Withdraw KEYS LP');
            IERC20(token).transfer(recipient, amount);
        }
    }
    
    
    ///////////////////////////////////
    //////   PUBLIC FUNCTIONS   ///////
    ///////////////////////////////////

    /** Adds KEYS To The Pending Rewards Of KEYS Stakers */
    function deposit(uint256 amount) external override {
        uint256 received = _transferIn(KEYS, amount);
        dividendsPerToken += received.mul(precision).div(totalLocked);
    }

    function claimReward() external nonReentrant {
        _makeClaim(msg.sender);      
    }
    
    function claimRewardForUser(address user) external nonReentrant {
        _makeClaim(user);
    }
    
    function unlock(uint256 amount) external nonReentrant {
        _unlock(msg.sender, msg.sender, amount, false);
    }
    
    function unlockFor(uint256 amount, address keysRecipient) external nonReentrant {
        _unlock(msg.sender, keysRecipient, amount, false);
    }
    
    function unlockAll() external nonReentrant {
        _unlock(msg.sender, msg.sender, users[msg.sender].tokensLocked, false);
    }
    
    function unstake(uint256 amount) external nonReentrant {
        _unlock(msg.sender, msg.sender, amount, true);
    }
    
    function unstakeAll() external nonReentrant {
        _unlock(msg.sender, msg.sender, users[msg.sender].tokensLocked, true);
    }
    
    function unstakeFor(uint256 amount, address recipient) external nonReentrant {
        _unlock(msg.sender, recipient, amount, true);
    }
    
    function stakeLP(uint256 numLPTokens) external nonReentrant {
        uint256 received = _transferIn(KEYS_LP, numLPTokens);
        _lock(msg.sender, received);
    }
    
    function stakeKeysAndETH(uint256 numKeys) external payable nonReentrant {
        require(numKeys >= 10 && msg.value >= 10**9, 'Minimum Amount');
        
        // transfer keys in
        uint256 keysReceived = _transferIn(KEYS, numKeys);
        // ETH -> KEYS
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = KEYS;
        
        // Estimated KEYS To Receive From ETHER
        uint256 estimate = router.getAmountsOut(msg.value, path)[1];
        
        // Estimate Difference
        uint256 diff = estimate < keysReceived ? keysReceived - estimate : estimate - keysReceived;
        
        // Ensure Difference Within Bounds
        require(diff <= estimate.div(20), 'Error: Over 5% Slippage Detected');
        
        // Pair Halves Into Liquidity + Lock LP Received
        _pairAndLock(keysReceived, msg.value);
    }
    
    ///////////////////////////////////
    //////  INTERNAL FUNCTIONS  ///////
    ///////////////////////////////////
    
    function _pairAndLock(uint256 KEYSAmount, uint256 ethAmount) internal {
        
        // balance of LP Tokens Before
        uint256 lBefore = IERC20(KEYS_LP).balanceOf(address(this));
        
        // approve router to move tokens
        IERC20(KEYS).approve(address(router), KEYSAmount);
        
        // check slippage
        (uint256 minAmountKEYS, uint256 minETH) = (KEYSAmount.mul(75).div(100), ethAmount.mul(75).div(100));
        
        // Disable Receive 
        receiveDisabled = true;
        
        // Calculated Expected Amounts After LP Pairing
        uint256 expectedKEYS = IERC20(KEYS).balanceOf(address(this)).sub(KEYSAmount, 'ERR KEYS Amount');
        uint256 expectedETH = address(this).balance.sub(ethAmount, 'ERR ETH Amount');
        
        // add liquidity
        router.addLiquidityETH{value: ethAmount}(
            KEYS,
            KEYSAmount,
            minAmountKEYS,
            minETH,
            address(this),
            block.timestamp.add(30)
        );
        
        // Re Enable Receive
        receiveDisabled = false;
        
        uint256 KEYSAfter = IERC20(KEYS).balanceOf(address(this));
        uint256 ETHAfter = address(this).balance;

        // note LP Tokens Received
        uint256 lpReceived = IERC20(KEYS_LP).balanceOf(address(this)).sub(lBefore);
        require(lpReceived > 0, 'Zero LP Tokens Received');
        
        // Lock LP Tokens Received
        _lock(msg.sender, lpReceived);
        
        if (refundEnabled) {
            if (KEYSAfter > expectedKEYS) {
                uint256 diff = KEYSAfter.sub(expectedKEYS);
                IERC20(KEYS).transfer(msg.sender, diff);
            }
        
            if (ETHAfter > expectedETH) {
                uint256 diff = ETHAfter.sub(expectedETH);
                (bool s,) = payable(msg.sender).call{value: diff, gas: 2600}("");
                require(s, 'Failure on ETH Refund');
            }
        }
    }
    
    function _removeLiquidity(uint256 nLiquidity, address recipient) private {
        
        IERC20(KEYS_LP).approve(address(router), 2*nLiquidity);
        
        router.removeLiquidityETHSupportingFeeOnTransferTokens(
            KEYS,
            nLiquidity,
            0,
            0,
            recipient,
            block.timestamp.add(30)
        );
        
    }
    
    function _makeClaim(address user) internal {
        // ensure claim requirements
        require(users[user].tokensLocked > 0, 'Zero Tokens Locked');
        require(users[user].lastClaim + harvestTime <= block.number, 'Claim Wait Time Not Reached');
        
        uint256 amount = pendingRewards(user);
        require(amount > 0,'Zero Rewards');
        _claimReward(user);
    }
    
    function _claimReward(address user) internal {
        
        uint256 amount = pendingRewards(user);
        if (amount == 0) return;
        
        // update claim stats 
        users[user].lastClaim = block.number;
        users[user].totalExcluded = currentDividends(users[user].tokensLocked);
        // transfer tokens
        bool s = IERC20(KEYS).transfer(user, amount);
        require(s,'Failure On Token Transfer');
    }
    
    function _transferIn(address token, uint256 amount) internal returns (uint256) {
        
        uint256 before = IERC20(token).balanceOf(address(this));
        bool s = IERC20(token).transferFrom(msg.sender, address(this), amount);
        
        uint256 difference = IERC20(token).balanceOf(address(this)).sub(before);
        require(s && difference <= amount, 'Error On Transfer In');
        return difference;
    }
    
    function _buyAndStake() internal {
        
        uint256 feeAmount = msg.value.mul(fee).div(100);
        uint256 purchaseAmount = msg.value.sub(feeAmount);
        
        uint256 keysAmount = purchaseAmount.mul(49).div(100);
        uint256 ethAmount = purchaseAmount.sub(keysAmount);
        
        (bool success,) = payable(multisig).call{value: feeAmount}("");
        require(success, 'Failure on Dev Payment');
        
        uint256 before = IERC20(KEYS).balanceOf(address(this));
        (bool s,) = payable(KEYS).call{value: keysAmount}("");
        require(s, 'Failure on KEYS Purchase');
        
        uint256 keysReceived = IERC20(KEYS).balanceOf(address(this)).sub(before);
        
        _pairAndLock(keysReceived, ethAmount);
    }
    
    function _lock(address user, uint256 received) private {
        
        if (users[user].tokensLocked > 0) { // recurring staker
            _claimReward(user);
        } else { // new user
            users[user].lastClaim = block.number;
        }
        
        // add locker data
        users[user].tokensLocked += received;
        users[user].timeLocked = block.number;
        users[user].totalExcluded = currentDividends(users[user].tokensLocked);
        
        // increment total locked
        totalLocked += received;
        
        emit Transfer(address(0), user, received);
    }

    function _unlock(address user, address recipient, uint256 nTokens, bool removeLiquidity) private {
        
        // Ensure Lock Requirements
        require(users[user].tokensLocked > 0, 'Zero Tokens Locked');
        require(users[user].tokensLocked >= nTokens && nTokens > 0, 'Insufficient Tokens');
        
        // expiration
        uint256 lockExpiration = users[user].timeLocked + lockTime;
        
        // claim reward 
        _claimReward(user);
        
        // Update Staked Balances
        if (users[user].tokensLocked == nTokens) {
            delete users[user]; // Free Storage
        } else {
            users[user].tokensLocked = users[user].tokensLocked.sub(nTokens, 'Insufficient Lock Amount');
            users[user].totalExcluded = currentDividends(users[user].tokensLocked);
        }
        
        // Update Total Locked
        totalLocked = totalLocked.sub(nTokens, 'Negative Locked');

        // Calculate Tokens To Send Recipient
        uint256 tokensToSend = lockExpiration > block.number ? _calculateEarlyFee(nTokens) : nTokens;

        if (removeLiquidity) {
            // Remove LP Send To User
            _removeLiquidity(tokensToSend, recipient);
        } else {
            // Transfer LP Tokens To User
            bool s = IERC20(KEYS_LP).transfer(recipient, tokensToSend);
            require(s, 'Failure on LP Token Transfer');
        }
        
        if (tokensToSend < nTokens) {
            uint256 dif = nTokens.sub(tokensToSend);
            IERC20(KEYS_LP).transfer(owner, dif);
        }
        
        // tell Blockchain
        emit Transfer(user, address(0), nTokens);
    }
    
    function _calculateEarlyFee(uint256 nTokens) internal view returns (uint256) {
        
        // apply early leave tax
        uint256 tax = nTokens.mul(earlyFee).div(100);
        
        // Return Send Amount
        return nTokens.sub(tax);
    }
    
    ///////////////////////////////////
    //////    READ FUNCTIONS    ///////
    ///////////////////////////////////
    
    
    function getTimeUntilUnlock(address user) external view returns (uint256) {
        uint256 endTime = users[user].timeLocked + lockTime;
        return endTime > block.number ? endTime.sub(block.number) : 0;
    }
    
    function getTimeUntilNextClaim(address user) external view returns (uint256) {
        uint256 endTime = users[user].lastClaim + harvestTime;
        return endTime > block.number ? endTime.sub(block.number) : 0;
    }
    
    function currentDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerToken).div(precision);
    }
    
    function pendingRewards(address user) public view returns (uint256) {
        uint256 amount = users[user].tokensLocked;
        if(amount == 0){ return 0; }

        uint256 shareholderTotalDividends = currentDividends(amount);
        uint256 shareholderTotalExcluded = users[user].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }
    
    function totalPendingRewards() external view returns (uint256) {
        return IERC20(KEYS).balanceOf(address(this)).sub(totalLocked);
    }
    
    function calculateKEYSBalance(address user) external view returns (uint256) {
        return IERC20(KEYS).balanceOf(user);
    }
    
    function calculateKEYSContractBalance() external view returns (uint256) {
        return IERC20(KEYS).balanceOf(address(this));
    }

    receive() external payable {
        if (receiveDisabled || msg.sender == address(router) || msg.sender == KEYS_LP) return;
        _buyAndStake();
    }

}

File 1 of 7: Address.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;


library Address {

    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

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

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

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

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

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

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

}

File 2 of 7: IERC20.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

interface IERC20 {

    function totalSupply() external view returns (uint256);
    
    function symbol() external view returns(string memory);
    
    function name() external view returns(string memory);

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

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

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

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

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

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

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

File 3 of 7: IKeysStaking.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

/**
 * Exempt Surge Interface
 */
interface IKeysStaking {
    function deposit(uint256 amount) external;
}

File 4 of 7: IUniswapV2Router02.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;



interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 6 of 7: ReentrantGuard.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    constructor () {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

File 7 of 7: SafeMath.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"UpdateFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"UpdateLockTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"UpdatedEarlyFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeReceiver","type":"address"}],"name":"UpdatedFeeReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"UpdatedHarvestTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minimumKeys","type":"uint256"}],"name":"UpdatedStakingMinimum","type":"event"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calculateKEYSBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateKEYSContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimRewardForUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dividendsPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTimeUntilNextClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTimeUntilUnlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setEarlyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"setHarvestTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"setLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_refundEnabled","type":"bool"}],"name":"setRefundEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numKeys","type":"uint256"}],"name":"stakeKeysAndETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numLPTokens","type":"uint256"}],"name":"stakeLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"keysRecipient","type":"address"}],"name":"unlockFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"unstakeFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newReceiver","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"ETH","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052737a250d5630b4cf539739df2c5dacb4c659f2488d600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506226ac006003556203840060045560016007556008805573fcaceaa7b4cf845f2cfce6a3da680df1bb05015c600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600960156101000a81548160ff0219169083151502179055503480156100ec57600080fd5b50600160008190555073fcaceaa7b4cf845f2cfce6a3da680df1bb05015c600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550615611806200015a6000396000f3fe60806040526004361061024a5760003560e01c806370a0823111610139578063c69bebe4116100b6578063e231dc271161007a578063e231dc2714610929578063e4049b0314610966578063e5da2cb21461098f578063ec1371f2146109b8578063f2fde38b146109e3578063f480821014610a0c57610316565b8063c69bebe414610858578063cd24b0a314610881578063da2a37f214610898578063dd62ed3e146108c1578063ddca3f43146108fe57610316565b806395d89b41116100fd57806395d89b4114610787578063a9059cbb146107b2578063ae04d45d146107ef578063b6b55f2514610818578063b88a802f1461084157610316565b806370a08231146106b157806370b909d5146106ee5780638da5cb5b1461070a5780638df0c65c146107355780639012c4a81461075e57610316565b80632e17de78116101c75780634783c35b1161018b5780634783c35b146105ba5780634fe24748146105e55780636003681d146106225780636198e3391461064b5780636d07b7e51461067457610316565b80632e17de78146104e7578063313ce5671461051057806331d7a2621461053b57806335322f3714610578578063401738111461058f57610316565b80630dd27dee1161020e5780630dd27dee1461040257806315bbd78f1461042b57806318160ddd1461045657806323b872dd1461048157806329694648146104be57610316565b8063030cd3161461031b578063044431f01461034657806306fdde031461036f578063095ea7b31461039a5780630d668087146103d757610316565b3661031657600960149054906101000a900460ff16806102b75750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806103015750735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561030b57610314565b610313610a37565b5b005b600080fd5b34801561032757600080fd5b50610330610db2565b60405161033d9190614e29565b60405180910390f35b34801561035257600080fd5b5061036d600480360381019061036891906143d7565b610e56565b005b34801561037b57600080fd5b50610384610f03565b6040516103919190614b27565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc919061435a565b610f40565b6040516103ce9190614b0c565b60405180910390f35b3480156103e357600080fd5b506103ec610fc8565b6040516103f99190614e29565b60405180910390f35b34801561040e57600080fd5b506104296004803603810190610424919061427d565b610fce565b005b34801561043757600080fd5b50610440611030565b60405161044d9190614e29565b60405180910390f35b34801561046257600080fd5b5061046b611036565b6040516104789190614e29565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a3919061430b565b611040565b6040516104b59190614b0c565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e0919061448c565b6110e8565b005b3480156104f357600080fd5b5061050e6004803603810190610509919061448c565b6111ff565b005b34801561051c57600080fd5b50610525611265565b6040516105329190614e74565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d919061427d565b61126e565b60405161056f9190614e29565b60405180910390f35b34801561058457600080fd5b5061058d61134e565b005b34801561059b57600080fd5b506105a46113f5565b6040516105b19190614e29565b60405180910390f35b3480156105c657600080fd5b506105cf6113fb565b6040516105dc91906149cf565b60405180910390f35b3480156105f157600080fd5b5061060c6004803603810190610607919061427d565b611421565b6040516106199190614e29565b60405180910390f35b34801561062e57600080fd5b50610649600480360381019061064491906144de565b6114c7565b005b34801561065757600080fd5b50610672600480360381019061066d919061448c565b61152e565b005b34801561068057600080fd5b5061069b6004803603810190610696919061427d565b611594565b6040516106a89190614e29565b60405180910390f35b3480156106bd57600080fd5b506106d860048036038101906106d3919061427d565b611613565b6040516106e59190614e29565b60405180910390f35b6107086004803603810190610703919061448c565b61165f565b005b34801561071657600080fd5b5061071f611ac3565b60405161072c91906149cf565b60405180910390f35b34801561074157600080fd5b5061075c60048036038101906107579190614429565b611ae9565b005b34801561076a57600080fd5b506107856004803603810190610780919061448c565b611d8c565b005b34801561079357600080fd5b5061079c611ea3565b6040516107a99190614b27565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d4919061435a565b611ee0565b6040516107e69190614b0c565b60405180910390f35b3480156107fb57600080fd5b506108166004803603810190610811919061448c565b611f50565b005b34801561082457600080fd5b5061083f600480360381019061083a919061448c565b612067565b005b34801561084d57600080fd5b506108566120db565b005b34801561086457600080fd5b5061087f600480360381019061087a919061427d565b61213c565b005b34801561088d57600080fd5b50610896612247565b005b3480156108a457600080fd5b506108bf60048036038101906108ba91906144de565b6122ee565b005b3480156108cd57600080fd5b506108e860048036038101906108e391906142cf565b612355565b6040516108f59190614e29565b60405180910390f35b34801561090a57600080fd5b506109136123a3565b6040516109209190614e29565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b919061427d565b6123a9565b60405161095d9190614e29565b60405180910390f35b34801561097257600080fd5b5061098d6004803603810190610988919061448c565b612428565b005b34801561099b57600080fd5b506109b660048036038101906109b1919061448c565b61253f565b005b3480156109c457600080fd5b506109cd6125c5565b6040516109da9190614e29565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a05919061427d565b61267d565b005b348015610a1857600080fd5b50610a21612788565b604051610a2e9190614e29565b60405180910390f35b6000610a616064610a536007543461278e90919063ffffffff16565b61280990919063ffffffff16565b90506000610a78823461285390919063ffffffff16565b90506000610aa36064610a9560318561278e90919063ffffffff16565b61280990919063ffffffff16565b90506000610aba828461285390919063ffffffff16565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685604051610b04906149ba565b60006040518083038185875af1925050503d8060008114610b41576040519150601f19603f3d011682016040523d82523d6000602084013e610b46565b606091505b5050905080610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190614b89565b60405180910390fd5b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bd991906149cf565b60206040518083038186803b158015610bf157600080fd5b505afa158015610c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2991906144b5565b9050600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1685604051610c65906149ba565b60006040518083038185875af1925050503d8060008114610ca2576040519150601f19603f3d011682016040523d82523d6000602084013e610ca7565b606091505b5050905080610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290614c69565b60405180910390fd5b6000610d9c8373e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d3e91906149cf565b60206040518083038186803b158015610d5657600080fd5b505afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e91906144b5565b61285390919063ffffffff16565b9050610da8818661289d565b5050505050505050565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e0191906149cf565b60206040518083038186803b158015610e1957600080fd5b505afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5191906144b5565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90614dc9565b60405180910390fd5b80600960156101000a81548160ff02191690831515021790555050565b60606040518060400160405280600981526020017f4b657973204661726d0000000000000000000000000000000000000000000000815250905090565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410158015610fc057503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b60035481565b60026000541415611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90614d89565b60405180910390fd5b600260008190555061102581613005565b600160008190555050565b60085481565b6000600654905090565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561109c576110973333846000613179565b6110a6565b6110a533613005565b5b600180156110df57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90509392505050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90614dc9565b60405180910390fd5b629896808111156111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590614ce9565b60405180910390fd5b806004819055507fa2a2ddb43294154c1ddb8c46f3a3919d9c87ca4edb3dc02d9f03bc53c72e1bc1816040516111f49190614e29565b60405180910390a150565b60026000541415611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90614d89565b60405180910390fd5b600260008190555061125a3333836001613179565b600160008190555050565b60006012905090565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008114156112c9576000915050611349565b60006112d4826137bd565b90506000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015490508082116113305760009350505050611349565b611343818361285390919063ffffffff16565b93505050505b919050565b60026000541415611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b90614d89565b60405180910390fd5b60026000819055506113eb3333600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546001613179565b6001600081905550565b60025481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161147091906149cf565b60206040518083038186803b15801561148857600080fd5b505afa15801561149c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c091906144b5565b9050919050565b6002600054141561150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150490614d89565b60405180910390fd5b60026000819055506115223382846001613179565b60016000819055505050565b60026000541415611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b90614d89565b60405180910390fd5b60026000819055506115893333836000613179565b600160008190555050565b600080600454600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546115e79190614f40565b90504381116115f757600061160b565b61160a438261285390919063ffffffff16565b5b915050919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b600260005414156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90614d89565b60405180910390fd5b6002600081905550600a81101580156116c25750633b9aca003410155b611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890614d49565b60405180910390fd5b600061172173e0a189c975e4928222978a74517442239a0b86ff836137fc565b90506000600267ffffffffffffffff811115611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117945781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ff57600080fd5b505afa158015611813573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183791906142a6565b81600081518110611871577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073e0a189c975e4928222978a74517442239a0b86ff816001815181106118fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f34846040518363ffffffff1660e01b8152600401611993929190614e44565b60006040518083038186803b1580156119ab57600080fd5b505afa1580156119bf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119e89190614396565b600181518110611a21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000838210611a45578382611a409190615021565b611a52565b8184611a519190615021565b5b9050611a6860148361280990919063ffffffff16565b811115611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa190614da9565b60405180910390fd5b611ab4843461289d565b50505050600160008190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7090614dc9565b60405180910390fd5b8315611c745781471015611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990614d09565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051611be8906149ba565b60006040518083038185875af1925050503d8060008114611c25576040519150601f19603f3d011682016040523d82523d6000602084013e611c2a565b606091505b5050905080611c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6590614d29565b60405180910390fd5b50611d86565b735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee90614de9565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401611d32929190614a21565b602060405180830381600087803b158015611d4c57600080fd5b505af1158015611d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d849190614400565b505b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1390614dc9565b60405180910390fd5b60056008541115611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990614ca9565b60405180910390fd5b806007819055507f38e229a7f3f9c329892d08eb37c4e91ccac6d12c798d394990ca4f56028ec26681604051611e989190614e29565b60405180910390a150565b60606040518060400160405280600881526020017f4b4559534641524d000000000000000000000000000000000000000000000000815250905090565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f3c57611f373333846000613179565b611f46565b611f4533613005565b5b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd790614dc9565b60405180910390fd5b62989680811115612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90614c89565b60405180910390fd5b806003819055507f76f15e9a1f6aff29e3af90c686f28fc78998700d6fc4d719359b3db4057663eb8160405161205c9190614e29565b60405180910390a150565b600061208773e0a189c975e4928222978a74517442239a0b86ff836137fc565b90506120bf6006546120b16ec097ce7bc90715b34b9f10000000008461278e90919063ffffffff16565b61280990919063ffffffff16565b600260008282546120d09190614f40565b925050819055505050565b60026000541415612121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211890614d89565b60405180910390fd5b600260008190555061213233613005565b6001600081905550565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c390614dc9565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb4280c2c6d34a766a6e479b994060c3b1390228520ecfccc63ce21cd32ebbc648160405161223c91906149cf565b60405180910390a150565b6002600054141561228d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490614d89565b60405180910390fd5b60026000819055506122e43333600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546000613179565b6001600081905550565b60026000541415612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90614d89565b60405180910390fd5b60026000819055506123493382846000613179565b60016000819055505050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461239157600061239b565b61239a83611613565b5b905092915050565b60075481565b600080600354600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546123fc9190614f40565b905043811161240c576000612420565b61241f438261285390919063ffffffff16565b5b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124af90614dc9565b60405180910390fd5b601e60085411156124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f590614ca9565b60405180910390fd5b806008819055507f08ac8802e9e8a639797eea08f528069fa79711b44449d7fb8e3d40487fab06b3816040516125349190614e29565b60405180910390a150565b60026000541415612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257c90614d89565b60405180910390fd5b600260008190555060006125ad735bacb4114ad2d448e79addef121714b74d67faec836137fc565b90506125b93382613a14565b50600160008190555050565b600061267860065473e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161261a91906149cf565b60206040518083038186803b15801561263257600080fd5b505afa158015612646573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266a91906144b5565b61285390919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461270d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270490614dc9565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a48160405161277d91906149cf565b60405180910390a150565b60045481565b6000808314156127a15760009050612803565b600082846127af9190614fc7565b90508284826127be9190614f96565b146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614c49565b60405180910390fd5b809150505b92915050565b600061284b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c69565b905092915050565b600061289583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ccc565b905092915050565b6000735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016128ec91906149cf565b60206040518083038186803b15801561290457600080fd5b505afa158015612918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293c91906144b5565b905073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b81526004016129af929190614a21565b602060405180830381600087803b1580156129c957600080fd5b505af11580156129dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a019190614400565b50600080612a2c6064612a1e604b8861278e90919063ffffffff16565b61280990919063ffffffff16565b612a536064612a45604b8861278e90919063ffffffff16565b61280990919063ffffffff16565b915091506001600960146101000a81548160ff0219169083151502179055506000612b5a866040518060400160405280600f81526020017f455252204b45595320416d6f756e74000000000000000000000000000000000081525073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612afb91906149cf565b60206040518083038186803b158015612b1357600080fd5b505afa158015612b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4b91906144b5565b613ccc9092919063ffffffff16565b90506000612ba8866040518060400160405280600e81526020017f4552522045544820416d6f756e7400000000000000000000000000000000000081525047613ccc9092919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198773e0a189c975e4928222978a74517442239a0b86ff8a888830612c16601e42613d3090919063ffffffff16565b6040518863ffffffff1660e01b8152600401612c3796959493929190614aab565b6060604051808303818588803b158015612c5057600080fd5b505af1158015612c64573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c89919061451a565b5050506000600960146101000a81548160ff021916908315150217905550600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612cf691906149cf565b60206040518083038186803b158015612d0e57600080fd5b505afa158015612d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4691906144b5565b905060004790506000612dfe88735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612da091906149cf565b60206040518083038186803b158015612db857600080fd5b505afa158015612dcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df091906144b5565b61285390919063ffffffff16565b905060008111612e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3a90614c09565b60405180910390fd5b612e4d3382613a14565b600960159054906101000a900460ff1615612ff95784831115612f25576000612e7f868561285390919063ffffffff16565b905073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612ed0929190614a21565b602060405180830381600087803b158015612eea57600080fd5b505af1158015612efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f229190614400565b50505b83821115612ff8576000612f42858461285390919063ffffffff16565b905060003373ffffffffffffffffffffffffffffffffffffffff1682610a2890604051612f6e906149ba565b600060405180830381858888f193505050503d8060008114612fac576040519150601f19603f3d011682016040523d82523d6000602084013e612fb1565b606091505b5050905080612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec90614b49565b60405180910390fd5b50505b5b50505050505050505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541161308a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308190614cc9565b60405180910390fd5b43600454600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546130db9190614f40565b111561311c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311390614d69565b60405180910390fd5b60006131278261126e565b90506000811161316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390614be9565b60405180910390fd5b61317582613d8e565b5050565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154116131fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f590614cc9565b60405180910390fd5b81600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154101580156132505750600082115b61328f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328690614bc9565b60405180910390fd5b6000600354600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546132e19190614f40565b90506132ec85613d8e565b82600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561339d57600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090555050613501565b613429836040518060400160405280601881526020017f496e73756666696369656e74204c6f636b20416d6f756e740000000000000000815250600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613ccc9092919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506134ba600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546137bd565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b61354d836040518060400160405280600f81526020017f4e65676174697665204c6f636b65640000000000000000000000000000000000815250600654613ccc9092919063ffffffff16565b6006819055506000438211613562578361356c565b61356b84613f6d565b5b905082156135835761357e8186613fb5565b61366a565b6000735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87846040518363ffffffff1660e01b81526004016135d4929190614a21565b602060405180830381600087803b1580156135ee57600080fd5b505af1158015613602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136269190614400565b905080613668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365f90614b69565b60405180910390fd5b505b8381101561374f576000613687828661285390919063ffffffff16565b9050735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016136fa929190614a21565b602060405180830381600087803b15801561371457600080fd5b505af1158015613728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374c9190614400565b50505b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516137ad9190614e29565b60405180910390a3505050505050565b60006137f56ec097ce7bc90715b34b9f10000000006137e76002548561278e90919063ffffffff16565b61280990919063ffffffff16565b9050919050565b6000808373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161383891906149cf565b60206040518083038186803b15801561385057600080fd5b505afa158015613864573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388891906144b5565b905060008473ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b81526004016138c9939291906149ea565b602060405180830381600087803b1580156138e357600080fd5b505af11580156138f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391b9190614400565b905060006139ba838773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161395c91906149cf565b60206040518083038186803b15801561397457600080fd5b505afa158015613988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ac91906144b5565b61285390919063ffffffff16565b90508180156139c95750848111155b613a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ff90614c29565b60405180910390fd5b80935050505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115613a6d57613a6882613d8e565b613ab5565b43600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254613b079190614f40565b9250508190555043600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550613ba0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546137bd565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055508060066000828254613bf89190614f40565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c5d9190614e29565b60405180910390a35050565b60008083118290613cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ca79190614b27565b60405180910390fd5b5060008385613cbf9190614f96565b9050809150509392505050565b6000838311158290613d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d0b9190614b27565b60405180910390fd5b5060008385613d239190615021565b9050809150509392505050565b6000808284613d3f9190614f40565b905083811015613d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7b90614ba9565b60405180910390fd5b8091505092915050565b6000613d998261126e565b90506000811415613daa5750613f6a565b43600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550613e3c600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546137bd565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401613ed3929190614a21565b602060405180830381600087803b158015613eed57600080fd5b505af1158015613f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f259190614400565b905080613f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f5e90614e09565b60405180910390fd5b50505b50565b600080613f986064613f8a6008548661278e90919063ffffffff16565b61280990919063ffffffff16565b9050613fad818461285390919063ffffffff16565b915050919050565b735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460026140159190614fc7565b6040518363ffffffff1660e01b8152600401614032929190614a21565b602060405180830381600087803b15801561404c57600080fd5b505af1158015614060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140849190614400565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af2979eb73e0a189c975e4928222978a74517442239a0b86ff84600080866140f1601e42613d3090919063ffffffff16565b6040518763ffffffff1660e01b815260040161411296959493929190614a4a565b602060405180830381600087803b15801561412c57600080fd5b505af1158015614140573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416491906144b5565b505050565b600061417c61417784614eb4565b614e8f565b9050808382526020820190508285602086028201111561419b57600080fd5b60005b858110156141cb57816141b18882614268565b84526020840193506020830192505060018101905061419e565b5050509392505050565b6000813590506141e481615596565b92915050565b6000815190506141f981615596565b92915050565b600082601f83011261421057600080fd5b8151614220848260208601614169565b91505092915050565b600081359050614238816155ad565b92915050565b60008151905061424d816155ad565b92915050565b600081359050614262816155c4565b92915050565b600081519050614277816155c4565b92915050565b60006020828403121561428f57600080fd5b600061429d848285016141d5565b91505092915050565b6000602082840312156142b857600080fd5b60006142c6848285016141ea565b91505092915050565b600080604083850312156142e257600080fd5b60006142f0858286016141d5565b9250506020614301858286016141d5565b9150509250929050565b60008060006060848603121561432057600080fd5b600061432e868287016141d5565b935050602061433f868287016141d5565b925050604061435086828701614253565b9150509250925092565b6000806040838503121561436d57600080fd5b600061437b858286016141d5565b925050602061438c85828601614253565b9150509250929050565b6000602082840312156143a857600080fd5b600082015167ffffffffffffffff8111156143c257600080fd5b6143ce848285016141ff565b91505092915050565b6000602082840312156143e957600080fd5b60006143f784828501614229565b91505092915050565b60006020828403121561441257600080fd5b60006144208482850161423e565b91505092915050565b6000806000806080858703121561443f57600080fd5b600061444d87828801614229565b945050602061445e878288016141d5565b935050604061446f87828801614253565b9250506060614480878288016141d5565b91505092959194509250565b60006020828403121561449e57600080fd5b60006144ac84828501614253565b91505092915050565b6000602082840312156144c757600080fd5b60006144d584828501614268565b91505092915050565b600080604083850312156144f157600080fd5b60006144ff85828601614253565b9250506020614510858286016141d5565b9150509250929050565b60008060006060848603121561452f57600080fd5b600061453d86828701614268565b935050602061454e86828701614268565b925050604061455f86828701614268565b9150509250925092565b60006145758383614581565b60208301905092915050565b61458a81615055565b82525050565b61459981615055565b82525050565b60006145aa82614ef0565b6145b48185614f13565b93506145bf83614ee0565b8060005b838110156145f05781516145d78882614569565b97506145e283614f06565b9250506001810190506145c3565b5085935050505092915050565b61460681615067565b82525050565b614615816150aa565b82525050565b600061462682614efb565b6146308185614f2f565b93506146408185602086016150bc565b614649816151ad565b840191505092915050565b6000614661601583614f2f565b915061466c826151be565b602082019050919050565b6000614684601c83614f2f565b915061468f826151e7565b602082019050919050565b60006146a7601683614f2f565b91506146b282615210565b602082019050919050565b60006146ca601b83614f2f565b91506146d582615239565b602082019050919050565b60006146ed601383614f2f565b91506146f882615262565b602082019050919050565b6000614710600c83614f2f565b915061471b8261528b565b602082019050919050565b6000614733601783614f2f565b915061473e826152b4565b602082019050919050565b6000614756601483614f2f565b9150614761826152dd565b602082019050919050565b6000614779602183614f2f565b915061478482615306565b604082019050919050565b600061479c601883614f2f565b91506147a782615355565b602082019050919050565b60006147bf601283614f2f565b91506147ca8261537e565b602082019050919050565b60006147e2600d83614f2f565b91506147ed826153a7565b602082019050919050565b6000614805601283614f2f565b9150614810826153d0565b602082019050919050565b6000614828600d83614f2f565b9150614833826153f9565b602082019050919050565b600061484b601483614f2f565b915061485682615422565b602082019050919050565b600061486e601983614f2f565b91506148798261544b565b602082019050919050565b6000614891600083614f24565b915061489c82615474565b600082019050919050565b60006148b4600e83614f2f565b91506148bf82615477565b602082019050919050565b60006148d7601b83614f2f565b91506148e2826154a0565b602082019050919050565b60006148fa601f83614f2f565b9150614905826154c9565b602082019050919050565b600061491d602083614f2f565b9150614928826154f2565b602082019050919050565b6000614940600a83614f2f565b915061494b8261551b565b602082019050919050565b6000614963601783614f2f565b915061496e82615544565b602082019050919050565b6000614986601983614f2f565b91506149918261556d565b602082019050919050565b6149a581615093565b82525050565b6149b48161509d565b82525050565b60006149c582614884565b9150819050919050565b60006020820190506149e46000830184614590565b92915050565b60006060820190506149ff6000830186614590565b614a0c6020830185614590565b614a19604083018461499c565b949350505050565b6000604082019050614a366000830185614590565b614a43602083018461499c565b9392505050565b600060c082019050614a5f6000830189614590565b614a6c602083018861499c565b614a79604083018761460c565b614a86606083018661460c565b614a936080830185614590565b614aa060a083018461499c565b979650505050505050565b600060c082019050614ac06000830189614590565b614acd602083018861499c565b614ada604083018761499c565b614ae7606083018661499c565b614af46080830185614590565b614b0160a083018461499c565b979650505050505050565b6000602082019050614b2160008301846145fd565b92915050565b60006020820190508181036000830152614b41818461461b565b905092915050565b60006020820190508181036000830152614b6281614654565b9050919050565b60006020820190508181036000830152614b8281614677565b9050919050565b60006020820190508181036000830152614ba28161469a565b9050919050565b60006020820190508181036000830152614bc2816146bd565b9050919050565b60006020820190508181036000830152614be2816146e0565b9050919050565b60006020820190508181036000830152614c0281614703565b9050919050565b60006020820190508181036000830152614c2281614726565b9050919050565b60006020820190508181036000830152614c4281614749565b9050919050565b60006020820190508181036000830152614c628161476c565b9050919050565b60006020820190508181036000830152614c828161478f565b9050919050565b60006020820190508181036000830152614ca2816147b2565b9050919050565b60006020820190508181036000830152614cc2816147d5565b9050919050565b60006020820190508181036000830152614ce2816147f8565b9050919050565b60006020820190508181036000830152614d028161481b565b9050919050565b60006020820190508181036000830152614d228161483e565b9050919050565b60006020820190508181036000830152614d4281614861565b9050919050565b60006020820190508181036000830152614d62816148a7565b9050919050565b60006020820190508181036000830152614d82816148ca565b9050919050565b60006020820190508181036000830152614da2816148ed565b9050919050565b60006020820190508181036000830152614dc281614910565b9050919050565b60006020820190508181036000830152614de281614933565b9050919050565b60006020820190508181036000830152614e0281614956565b9050919050565b60006020820190508181036000830152614e2281614979565b9050919050565b6000602082019050614e3e600083018461499c565b92915050565b6000604082019050614e59600083018561499c565b8181036020830152614e6b818461459f565b90509392505050565b6000602082019050614e8960008301846149ab565b92915050565b6000614e99614eaa565b9050614ea582826150ef565b919050565b6000604051905090565b600067ffffffffffffffff821115614ecf57614ece61517e565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614f4b82615093565b9150614f5683615093565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f8b57614f8a615120565b5b828201905092915050565b6000614fa182615093565b9150614fac83615093565b925082614fbc57614fbb61514f565b5b828204905092915050565b6000614fd282615093565b9150614fdd83615093565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561501657615015615120565b5b828202905092915050565b600061502c82615093565b915061503783615093565b92508282101561504a57615049615120565b5b828203905092915050565b600061506082615073565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006150b582615093565b9050919050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6150f8826151ad565b810181811067ffffffffffffffff821117156151175761511661517e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4661696c757265206f6e2045544820526566756e640000000000000000000000600082015250565b7f4661696c757265206f6e204c5020546f6b656e205472616e7366657200000000600082015250565b7f4661696c757265206f6e20446576205061796d656e7400000000000000000000600082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f496e73756666696369656e7420546f6b656e7300000000000000000000000000600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f5a65726f204c5020546f6b656e73205265636569766564000000000000000000600082015250565b7f4572726f72204f6e205472616e7366657220496e000000000000000000000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c757265206f6e204b4559532050757263686173650000000000000000600082015250565b7f4c6f636b2054696d6520546f6f204c6f6e670000000000000000000000000000600082015250565b7f46656520546f6f204c6172676500000000000000000000000000000000000000600082015250565b7f5a65726f20546f6b656e73204c6f636b65640000000000000000000000000000600082015250565b7f54696d6520546f6f204c6f6e6700000000000000000000000000000000000000600082015250565b7f496e73756666696369656e742042616c616e6365000000000000000000000000600082015250565b7f4661696c757265206f6e20455448205769746864726177616c00000000000000600082015250565b50565b7f4d696e696d756d20416d6f756e74000000000000000000000000000000000000600082015250565b7f436c61696d20576169742054696d65204e6f7420526561636865640000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4572726f723a204f76657220352520536c697070616765204465746563746564600082015250565b7f4f6e6c79204f776e657200000000000000000000000000000000000000000000600082015250565b7f43616e6e6f74205769746864726177204b455953204c50000000000000000000600082015250565b7f4661696c757265204f6e20546f6b656e205472616e7366657200000000000000600082015250565b61559f81615055565b81146155aa57600080fd5b50565b6155b681615067565b81146155c157600080fd5b50565b6155cd81615093565b81146155d857600080fd5b5056fea26469706673582212209fba9c8cb0ccb71bfc40e76fe60bd5bc579a3ae708740e4c3b2e7d58b7828a4964736f6c63430008040033

Deployed Bytecode

0x60806040526004361061024a5760003560e01c806370a0823111610139578063c69bebe4116100b6578063e231dc271161007a578063e231dc2714610929578063e4049b0314610966578063e5da2cb21461098f578063ec1371f2146109b8578063f2fde38b146109e3578063f480821014610a0c57610316565b8063c69bebe414610858578063cd24b0a314610881578063da2a37f214610898578063dd62ed3e146108c1578063ddca3f43146108fe57610316565b806395d89b41116100fd57806395d89b4114610787578063a9059cbb146107b2578063ae04d45d146107ef578063b6b55f2514610818578063b88a802f1461084157610316565b806370a08231146106b157806370b909d5146106ee5780638da5cb5b1461070a5780638df0c65c146107355780639012c4a81461075e57610316565b80632e17de78116101c75780634783c35b1161018b5780634783c35b146105ba5780634fe24748146105e55780636003681d146106225780636198e3391461064b5780636d07b7e51461067457610316565b80632e17de78146104e7578063313ce5671461051057806331d7a2621461053b57806335322f3714610578578063401738111461058f57610316565b80630dd27dee1161020e5780630dd27dee1461040257806315bbd78f1461042b57806318160ddd1461045657806323b872dd1461048157806329694648146104be57610316565b8063030cd3161461031b578063044431f01461034657806306fdde031461036f578063095ea7b31461039a5780630d668087146103d757610316565b3661031657600960149054906101000a900460ff16806102b75750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806103015750735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561030b57610314565b610313610a37565b5b005b600080fd5b34801561032757600080fd5b50610330610db2565b60405161033d9190614e29565b60405180910390f35b34801561035257600080fd5b5061036d600480360381019061036891906143d7565b610e56565b005b34801561037b57600080fd5b50610384610f03565b6040516103919190614b27565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc919061435a565b610f40565b6040516103ce9190614b0c565b60405180910390f35b3480156103e357600080fd5b506103ec610fc8565b6040516103f99190614e29565b60405180910390f35b34801561040e57600080fd5b506104296004803603810190610424919061427d565b610fce565b005b34801561043757600080fd5b50610440611030565b60405161044d9190614e29565b60405180910390f35b34801561046257600080fd5b5061046b611036565b6040516104789190614e29565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a3919061430b565b611040565b6040516104b59190614b0c565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e0919061448c565b6110e8565b005b3480156104f357600080fd5b5061050e6004803603810190610509919061448c565b6111ff565b005b34801561051c57600080fd5b50610525611265565b6040516105329190614e74565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d919061427d565b61126e565b60405161056f9190614e29565b60405180910390f35b34801561058457600080fd5b5061058d61134e565b005b34801561059b57600080fd5b506105a46113f5565b6040516105b19190614e29565b60405180910390f35b3480156105c657600080fd5b506105cf6113fb565b6040516105dc91906149cf565b60405180910390f35b3480156105f157600080fd5b5061060c6004803603810190610607919061427d565b611421565b6040516106199190614e29565b60405180910390f35b34801561062e57600080fd5b50610649600480360381019061064491906144de565b6114c7565b005b34801561065757600080fd5b50610672600480360381019061066d919061448c565b61152e565b005b34801561068057600080fd5b5061069b6004803603810190610696919061427d565b611594565b6040516106a89190614e29565b60405180910390f35b3480156106bd57600080fd5b506106d860048036038101906106d3919061427d565b611613565b6040516106e59190614e29565b60405180910390f35b6107086004803603810190610703919061448c565b61165f565b005b34801561071657600080fd5b5061071f611ac3565b60405161072c91906149cf565b60405180910390f35b34801561074157600080fd5b5061075c60048036038101906107579190614429565b611ae9565b005b34801561076a57600080fd5b506107856004803603810190610780919061448c565b611d8c565b005b34801561079357600080fd5b5061079c611ea3565b6040516107a99190614b27565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d4919061435a565b611ee0565b6040516107e69190614b0c565b60405180910390f35b3480156107fb57600080fd5b506108166004803603810190610811919061448c565b611f50565b005b34801561082457600080fd5b5061083f600480360381019061083a919061448c565b612067565b005b34801561084d57600080fd5b506108566120db565b005b34801561086457600080fd5b5061087f600480360381019061087a919061427d565b61213c565b005b34801561088d57600080fd5b50610896612247565b005b3480156108a457600080fd5b506108bf60048036038101906108ba91906144de565b6122ee565b005b3480156108cd57600080fd5b506108e860048036038101906108e391906142cf565b612355565b6040516108f59190614e29565b60405180910390f35b34801561090a57600080fd5b506109136123a3565b6040516109209190614e29565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b919061427d565b6123a9565b60405161095d9190614e29565b60405180910390f35b34801561097257600080fd5b5061098d6004803603810190610988919061448c565b612428565b005b34801561099b57600080fd5b506109b660048036038101906109b1919061448c565b61253f565b005b3480156109c457600080fd5b506109cd6125c5565b6040516109da9190614e29565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a05919061427d565b61267d565b005b348015610a1857600080fd5b50610a21612788565b604051610a2e9190614e29565b60405180910390f35b6000610a616064610a536007543461278e90919063ffffffff16565b61280990919063ffffffff16565b90506000610a78823461285390919063ffffffff16565b90506000610aa36064610a9560318561278e90919063ffffffff16565b61280990919063ffffffff16565b90506000610aba828461285390919063ffffffff16565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685604051610b04906149ba565b60006040518083038185875af1925050503d8060008114610b41576040519150601f19603f3d011682016040523d82523d6000602084013e610b46565b606091505b5050905080610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190614b89565b60405180910390fd5b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bd991906149cf565b60206040518083038186803b158015610bf157600080fd5b505afa158015610c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2991906144b5565b9050600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1685604051610c65906149ba565b60006040518083038185875af1925050503d8060008114610ca2576040519150601f19603f3d011682016040523d82523d6000602084013e610ca7565b606091505b5050905080610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290614c69565b60405180910390fd5b6000610d9c8373e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d3e91906149cf565b60206040518083038186803b158015610d5657600080fd5b505afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e91906144b5565b61285390919063ffffffff16565b9050610da8818661289d565b5050505050505050565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e0191906149cf565b60206040518083038186803b158015610e1957600080fd5b505afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5191906144b5565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90614dc9565b60405180910390fd5b80600960156101000a81548160ff02191690831515021790555050565b60606040518060400160405280600981526020017f4b657973204661726d0000000000000000000000000000000000000000000000815250905090565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410158015610fc057503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b60035481565b60026000541415611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90614d89565b60405180910390fd5b600260008190555061102581613005565b600160008190555050565b60085481565b6000600654905090565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561109c576110973333846000613179565b6110a6565b6110a533613005565b5b600180156110df57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90509392505050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90614dc9565b60405180910390fd5b629896808111156111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590614ce9565b60405180910390fd5b806004819055507fa2a2ddb43294154c1ddb8c46f3a3919d9c87ca4edb3dc02d9f03bc53c72e1bc1816040516111f49190614e29565b60405180910390a150565b60026000541415611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90614d89565b60405180910390fd5b600260008190555061125a3333836001613179565b600160008190555050565b60006012905090565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008114156112c9576000915050611349565b60006112d4826137bd565b90506000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015490508082116113305760009350505050611349565b611343818361285390919063ffffffff16565b93505050505b919050565b60026000541415611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b90614d89565b60405180910390fd5b60026000819055506113eb3333600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546001613179565b6001600081905550565b60025481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161147091906149cf565b60206040518083038186803b15801561148857600080fd5b505afa15801561149c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c091906144b5565b9050919050565b6002600054141561150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150490614d89565b60405180910390fd5b60026000819055506115223382846001613179565b60016000819055505050565b60026000541415611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b90614d89565b60405180910390fd5b60026000819055506115893333836000613179565b600160008190555050565b600080600454600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546115e79190614f40565b90504381116115f757600061160b565b61160a438261285390919063ffffffff16565b5b915050919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b600260005414156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90614d89565b60405180910390fd5b6002600081905550600a81101580156116c25750633b9aca003410155b611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890614d49565b60405180910390fd5b600061172173e0a189c975e4928222978a74517442239a0b86ff836137fc565b90506000600267ffffffffffffffff811115611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117945781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ff57600080fd5b505afa158015611813573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183791906142a6565b81600081518110611871577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073e0a189c975e4928222978a74517442239a0b86ff816001815181106118fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f34846040518363ffffffff1660e01b8152600401611993929190614e44565b60006040518083038186803b1580156119ab57600080fd5b505afa1580156119bf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119e89190614396565b600181518110611a21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000838210611a45578382611a409190615021565b611a52565b8184611a519190615021565b5b9050611a6860148361280990919063ffffffff16565b811115611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa190614da9565b60405180910390fd5b611ab4843461289d565b50505050600160008190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7090614dc9565b60405180910390fd5b8315611c745781471015611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990614d09565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051611be8906149ba565b60006040518083038185875af1925050503d8060008114611c25576040519150601f19603f3d011682016040523d82523d6000602084013e611c2a565b606091505b5050905080611c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6590614d29565b60405180910390fd5b50611d86565b735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee90614de9565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401611d32929190614a21565b602060405180830381600087803b158015611d4c57600080fd5b505af1158015611d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d849190614400565b505b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1390614dc9565b60405180910390fd5b60056008541115611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990614ca9565b60405180910390fd5b806007819055507f38e229a7f3f9c329892d08eb37c4e91ccac6d12c798d394990ca4f56028ec26681604051611e989190614e29565b60405180910390a150565b60606040518060400160405280600881526020017f4b4559534641524d000000000000000000000000000000000000000000000000815250905090565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f3c57611f373333846000613179565b611f46565b611f4533613005565b5b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd790614dc9565b60405180910390fd5b62989680811115612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90614c89565b60405180910390fd5b806003819055507f76f15e9a1f6aff29e3af90c686f28fc78998700d6fc4d719359b3db4057663eb8160405161205c9190614e29565b60405180910390a150565b600061208773e0a189c975e4928222978a74517442239a0b86ff836137fc565b90506120bf6006546120b16ec097ce7bc90715b34b9f10000000008461278e90919063ffffffff16565b61280990919063ffffffff16565b600260008282546120d09190614f40565b925050819055505050565b60026000541415612121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211890614d89565b60405180910390fd5b600260008190555061213233613005565b6001600081905550565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c390614dc9565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb4280c2c6d34a766a6e479b994060c3b1390228520ecfccc63ce21cd32ebbc648160405161223c91906149cf565b60405180910390a150565b6002600054141561228d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490614d89565b60405180910390fd5b60026000819055506122e43333600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546000613179565b6001600081905550565b60026000541415612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90614d89565b60405180910390fd5b60026000819055506123493382846000613179565b60016000819055505050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461239157600061239b565b61239a83611613565b5b905092915050565b60075481565b600080600354600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546123fc9190614f40565b905043811161240c576000612420565b61241f438261285390919063ffffffff16565b5b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124af90614dc9565b60405180910390fd5b601e60085411156124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f590614ca9565b60405180910390fd5b806008819055507f08ac8802e9e8a639797eea08f528069fa79711b44449d7fb8e3d40487fab06b3816040516125349190614e29565b60405180910390a150565b60026000541415612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257c90614d89565b60405180910390fd5b600260008190555060006125ad735bacb4114ad2d448e79addef121714b74d67faec836137fc565b90506125b93382613a14565b50600160008190555050565b600061267860065473e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161261a91906149cf565b60206040518083038186803b15801561263257600080fd5b505afa158015612646573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266a91906144b5565b61285390919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461270d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270490614dc9565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a48160405161277d91906149cf565b60405180910390a150565b60045481565b6000808314156127a15760009050612803565b600082846127af9190614fc7565b90508284826127be9190614f96565b146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614c49565b60405180910390fd5b809150505b92915050565b600061284b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c69565b905092915050565b600061289583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ccc565b905092915050565b6000735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016128ec91906149cf565b60206040518083038186803b15801561290457600080fd5b505afa158015612918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293c91906144b5565b905073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b81526004016129af929190614a21565b602060405180830381600087803b1580156129c957600080fd5b505af11580156129dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a019190614400565b50600080612a2c6064612a1e604b8861278e90919063ffffffff16565b61280990919063ffffffff16565b612a536064612a45604b8861278e90919063ffffffff16565b61280990919063ffffffff16565b915091506001600960146101000a81548160ff0219169083151502179055506000612b5a866040518060400160405280600f81526020017f455252204b45595320416d6f756e74000000000000000000000000000000000081525073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612afb91906149cf565b60206040518083038186803b158015612b1357600080fd5b505afa158015612b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4b91906144b5565b613ccc9092919063ffffffff16565b90506000612ba8866040518060400160405280600e81526020017f4552522045544820416d6f756e7400000000000000000000000000000000000081525047613ccc9092919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198773e0a189c975e4928222978a74517442239a0b86ff8a888830612c16601e42613d3090919063ffffffff16565b6040518863ffffffff1660e01b8152600401612c3796959493929190614aab565b6060604051808303818588803b158015612c5057600080fd5b505af1158015612c64573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c89919061451a565b5050506000600960146101000a81548160ff021916908315150217905550600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612cf691906149cf565b60206040518083038186803b158015612d0e57600080fd5b505afa158015612d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4691906144b5565b905060004790506000612dfe88735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612da091906149cf565b60206040518083038186803b158015612db857600080fd5b505afa158015612dcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df091906144b5565b61285390919063ffffffff16565b905060008111612e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3a90614c09565b60405180910390fd5b612e4d3382613a14565b600960159054906101000a900460ff1615612ff95784831115612f25576000612e7f868561285390919063ffffffff16565b905073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612ed0929190614a21565b602060405180830381600087803b158015612eea57600080fd5b505af1158015612efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f229190614400565b50505b83821115612ff8576000612f42858461285390919063ffffffff16565b905060003373ffffffffffffffffffffffffffffffffffffffff1682610a2890604051612f6e906149ba565b600060405180830381858888f193505050503d8060008114612fac576040519150601f19603f3d011682016040523d82523d6000602084013e612fb1565b606091505b5050905080612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec90614b49565b60405180910390fd5b50505b5b50505050505050505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541161308a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308190614cc9565b60405180910390fd5b43600454600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546130db9190614f40565b111561311c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311390614d69565b60405180910390fd5b60006131278261126e565b90506000811161316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390614be9565b60405180910390fd5b61317582613d8e565b5050565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154116131fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f590614cc9565b60405180910390fd5b81600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154101580156132505750600082115b61328f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328690614bc9565b60405180910390fd5b6000600354600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546132e19190614f40565b90506132ec85613d8e565b82600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561339d57600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090555050613501565b613429836040518060400160405280601881526020017f496e73756666696369656e74204c6f636b20416d6f756e740000000000000000815250600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613ccc9092919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506134ba600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546137bd565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b61354d836040518060400160405280600f81526020017f4e65676174697665204c6f636b65640000000000000000000000000000000000815250600654613ccc9092919063ffffffff16565b6006819055506000438211613562578361356c565b61356b84613f6d565b5b905082156135835761357e8186613fb5565b61366a565b6000735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87846040518363ffffffff1660e01b81526004016135d4929190614a21565b602060405180830381600087803b1580156135ee57600080fd5b505af1158015613602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136269190614400565b905080613668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365f90614b69565b60405180910390fd5b505b8381101561374f576000613687828661285390919063ffffffff16565b9050735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016136fa929190614a21565b602060405180830381600087803b15801561371457600080fd5b505af1158015613728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374c9190614400565b50505b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516137ad9190614e29565b60405180910390a3505050505050565b60006137f56ec097ce7bc90715b34b9f10000000006137e76002548561278e90919063ffffffff16565b61280990919063ffffffff16565b9050919050565b6000808373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161383891906149cf565b60206040518083038186803b15801561385057600080fd5b505afa158015613864573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388891906144b5565b905060008473ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b81526004016138c9939291906149ea565b602060405180830381600087803b1580156138e357600080fd5b505af11580156138f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391b9190614400565b905060006139ba838773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161395c91906149cf565b60206040518083038186803b15801561397457600080fd5b505afa158015613988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ac91906144b5565b61285390919063ffffffff16565b90508180156139c95750848111155b613a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ff90614c29565b60405180910390fd5b80935050505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115613a6d57613a6882613d8e565b613ab5565b43600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254613b079190614f40565b9250508190555043600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550613ba0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546137bd565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055508060066000828254613bf89190614f40565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c5d9190614e29565b60405180910390a35050565b60008083118290613cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ca79190614b27565b60405180910390fd5b5060008385613cbf9190614f96565b9050809150509392505050565b6000838311158290613d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d0b9190614b27565b60405180910390fd5b5060008385613d239190615021565b9050809150509392505050565b6000808284613d3f9190614f40565b905083811015613d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7b90614ba9565b60405180910390fd5b8091505092915050565b6000613d998261126e565b90506000811415613daa5750613f6a565b43600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550613e3c600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546137bd565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401613ed3929190614a21565b602060405180830381600087803b158015613eed57600080fd5b505af1158015613f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f259190614400565b905080613f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f5e90614e09565b60405180910390fd5b50505b50565b600080613f986064613f8a6008548661278e90919063ffffffff16565b61280990919063ffffffff16565b9050613fad818461285390919063ffffffff16565b915050919050565b735bacb4114ad2d448e79addef121714b74d67faec73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460026140159190614fc7565b6040518363ffffffff1660e01b8152600401614032929190614a21565b602060405180830381600087803b15801561404c57600080fd5b505af1158015614060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140849190614400565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af2979eb73e0a189c975e4928222978a74517442239a0b86ff84600080866140f1601e42613d3090919063ffffffff16565b6040518763ffffffff1660e01b815260040161411296959493929190614a4a565b602060405180830381600087803b15801561412c57600080fd5b505af1158015614140573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416491906144b5565b505050565b600061417c61417784614eb4565b614e8f565b9050808382526020820190508285602086028201111561419b57600080fd5b60005b858110156141cb57816141b18882614268565b84526020840193506020830192505060018101905061419e565b5050509392505050565b6000813590506141e481615596565b92915050565b6000815190506141f981615596565b92915050565b600082601f83011261421057600080fd5b8151614220848260208601614169565b91505092915050565b600081359050614238816155ad565b92915050565b60008151905061424d816155ad565b92915050565b600081359050614262816155c4565b92915050565b600081519050614277816155c4565b92915050565b60006020828403121561428f57600080fd5b600061429d848285016141d5565b91505092915050565b6000602082840312156142b857600080fd5b60006142c6848285016141ea565b91505092915050565b600080604083850312156142e257600080fd5b60006142f0858286016141d5565b9250506020614301858286016141d5565b9150509250929050565b60008060006060848603121561432057600080fd5b600061432e868287016141d5565b935050602061433f868287016141d5565b925050604061435086828701614253565b9150509250925092565b6000806040838503121561436d57600080fd5b600061437b858286016141d5565b925050602061438c85828601614253565b9150509250929050565b6000602082840312156143a857600080fd5b600082015167ffffffffffffffff8111156143c257600080fd5b6143ce848285016141ff565b91505092915050565b6000602082840312156143e957600080fd5b60006143f784828501614229565b91505092915050565b60006020828403121561441257600080fd5b60006144208482850161423e565b91505092915050565b6000806000806080858703121561443f57600080fd5b600061444d87828801614229565b945050602061445e878288016141d5565b935050604061446f87828801614253565b9250506060614480878288016141d5565b91505092959194509250565b60006020828403121561449e57600080fd5b60006144ac84828501614253565b91505092915050565b6000602082840312156144c757600080fd5b60006144d584828501614268565b91505092915050565b600080604083850312156144f157600080fd5b60006144ff85828601614253565b9250506020614510858286016141d5565b9150509250929050565b60008060006060848603121561452f57600080fd5b600061453d86828701614268565b935050602061454e86828701614268565b925050604061455f86828701614268565b9150509250925092565b60006145758383614581565b60208301905092915050565b61458a81615055565b82525050565b61459981615055565b82525050565b60006145aa82614ef0565b6145b48185614f13565b93506145bf83614ee0565b8060005b838110156145f05781516145d78882614569565b97506145e283614f06565b9250506001810190506145c3565b5085935050505092915050565b61460681615067565b82525050565b614615816150aa565b82525050565b600061462682614efb565b6146308185614f2f565b93506146408185602086016150bc565b614649816151ad565b840191505092915050565b6000614661601583614f2f565b915061466c826151be565b602082019050919050565b6000614684601c83614f2f565b915061468f826151e7565b602082019050919050565b60006146a7601683614f2f565b91506146b282615210565b602082019050919050565b60006146ca601b83614f2f565b91506146d582615239565b602082019050919050565b60006146ed601383614f2f565b91506146f882615262565b602082019050919050565b6000614710600c83614f2f565b915061471b8261528b565b602082019050919050565b6000614733601783614f2f565b915061473e826152b4565b602082019050919050565b6000614756601483614f2f565b9150614761826152dd565b602082019050919050565b6000614779602183614f2f565b915061478482615306565b604082019050919050565b600061479c601883614f2f565b91506147a782615355565b602082019050919050565b60006147bf601283614f2f565b91506147ca8261537e565b602082019050919050565b60006147e2600d83614f2f565b91506147ed826153a7565b602082019050919050565b6000614805601283614f2f565b9150614810826153d0565b602082019050919050565b6000614828600d83614f2f565b9150614833826153f9565b602082019050919050565b600061484b601483614f2f565b915061485682615422565b602082019050919050565b600061486e601983614f2f565b91506148798261544b565b602082019050919050565b6000614891600083614f24565b915061489c82615474565b600082019050919050565b60006148b4600e83614f2f565b91506148bf82615477565b602082019050919050565b60006148d7601b83614f2f565b91506148e2826154a0565b602082019050919050565b60006148fa601f83614f2f565b9150614905826154c9565b602082019050919050565b600061491d602083614f2f565b9150614928826154f2565b602082019050919050565b6000614940600a83614f2f565b915061494b8261551b565b602082019050919050565b6000614963601783614f2f565b915061496e82615544565b602082019050919050565b6000614986601983614f2f565b91506149918261556d565b602082019050919050565b6149a581615093565b82525050565b6149b48161509d565b82525050565b60006149c582614884565b9150819050919050565b60006020820190506149e46000830184614590565b92915050565b60006060820190506149ff6000830186614590565b614a0c6020830185614590565b614a19604083018461499c565b949350505050565b6000604082019050614a366000830185614590565b614a43602083018461499c565b9392505050565b600060c082019050614a5f6000830189614590565b614a6c602083018861499c565b614a79604083018761460c565b614a86606083018661460c565b614a936080830185614590565b614aa060a083018461499c565b979650505050505050565b600060c082019050614ac06000830189614590565b614acd602083018861499c565b614ada604083018761499c565b614ae7606083018661499c565b614af46080830185614590565b614b0160a083018461499c565b979650505050505050565b6000602082019050614b2160008301846145fd565b92915050565b60006020820190508181036000830152614b41818461461b565b905092915050565b60006020820190508181036000830152614b6281614654565b9050919050565b60006020820190508181036000830152614b8281614677565b9050919050565b60006020820190508181036000830152614ba28161469a565b9050919050565b60006020820190508181036000830152614bc2816146bd565b9050919050565b60006020820190508181036000830152614be2816146e0565b9050919050565b60006020820190508181036000830152614c0281614703565b9050919050565b60006020820190508181036000830152614c2281614726565b9050919050565b60006020820190508181036000830152614c4281614749565b9050919050565b60006020820190508181036000830152614c628161476c565b9050919050565b60006020820190508181036000830152614c828161478f565b9050919050565b60006020820190508181036000830152614ca2816147b2565b9050919050565b60006020820190508181036000830152614cc2816147d5565b9050919050565b60006020820190508181036000830152614ce2816147f8565b9050919050565b60006020820190508181036000830152614d028161481b565b9050919050565b60006020820190508181036000830152614d228161483e565b9050919050565b60006020820190508181036000830152614d4281614861565b9050919050565b60006020820190508181036000830152614d62816148a7565b9050919050565b60006020820190508181036000830152614d82816148ca565b9050919050565b60006020820190508181036000830152614da2816148ed565b9050919050565b60006020820190508181036000830152614dc281614910565b9050919050565b60006020820190508181036000830152614de281614933565b9050919050565b60006020820190508181036000830152614e0281614956565b9050919050565b60006020820190508181036000830152614e2281614979565b9050919050565b6000602082019050614e3e600083018461499c565b92915050565b6000604082019050614e59600083018561499c565b8181036020830152614e6b818461459f565b90509392505050565b6000602082019050614e8960008301846149ab565b92915050565b6000614e99614eaa565b9050614ea582826150ef565b919050565b6000604051905090565b600067ffffffffffffffff821115614ecf57614ece61517e565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614f4b82615093565b9150614f5683615093565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f8b57614f8a615120565b5b828201905092915050565b6000614fa182615093565b9150614fac83615093565b925082614fbc57614fbb61514f565b5b828204905092915050565b6000614fd282615093565b9150614fdd83615093565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561501657615015615120565b5b828202905092915050565b600061502c82615093565b915061503783615093565b92508282101561504a57615049615120565b5b828203905092915050565b600061506082615073565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006150b582615093565b9050919050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6150f8826151ad565b810181811067ffffffffffffffff821117156151175761511661517e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4661696c757265206f6e2045544820526566756e640000000000000000000000600082015250565b7f4661696c757265206f6e204c5020546f6b656e205472616e7366657200000000600082015250565b7f4661696c757265206f6e20446576205061796d656e7400000000000000000000600082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f496e73756666696369656e7420546f6b656e7300000000000000000000000000600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f5a65726f204c5020546f6b656e73205265636569766564000000000000000000600082015250565b7f4572726f72204f6e205472616e7366657220496e000000000000000000000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c757265206f6e204b4559532050757263686173650000000000000000600082015250565b7f4c6f636b2054696d6520546f6f204c6f6e670000000000000000000000000000600082015250565b7f46656520546f6f204c6172676500000000000000000000000000000000000000600082015250565b7f5a65726f20546f6b656e73204c6f636b65640000000000000000000000000000600082015250565b7f54696d6520546f6f204c6f6e6700000000000000000000000000000000000000600082015250565b7f496e73756666696369656e742042616c616e6365000000000000000000000000600082015250565b7f4661696c757265206f6e20455448205769746864726177616c00000000000000600082015250565b50565b7f4d696e696d756d20416d6f756e74000000000000000000000000000000000000600082015250565b7f436c61696d20576169742054696d65204e6f7420526561636865640000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4572726f723a204f76657220352520536c697070616765204465746563746564600082015250565b7f4f6e6c79204f776e657200000000000000000000000000000000000000000000600082015250565b7f43616e6e6f74205769746864726177204b455953204c50000000000000000000600082015250565b7f4661696c757265204f6e20546f6b656e205472616e7366657200000000000000600082015250565b61559f81615055565b81146155aa57600080fd5b50565b6155b681615067565b81146155c157600080fd5b50565b6155cd81615093565b81146155d857600080fd5b5056fea26469706673582212209fba9c8cb0ccb71bfc40e76fe60bd5bc579a3ae708740e4c3b2e7d58b7828a4964736f6c63430008040033

Deployed Bytecode Sourcemap

384:16971:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17236:15;;;;;;;;;;;:48;;;;17277:6;;;;;;;;;;;17255:29;;:10;:29;;;17236:48;:73;;;;644:42;17288:21;;:10;:21;;;17236:73;17232:86;;;17311:7;;17232:86;17328:14;:12;:14::i;:::-;17194:156;384:16971;;;;;17051:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4316:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2711:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3011:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;994:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6192:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1550:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2346:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3515:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4800:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6738:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2920:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16275:467;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6869:132;;;;;;;;;;;;;:::i;:::-;;927:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1620:68;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16909:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7013:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6303:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15888:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2439:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7346:908;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1784:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5211:479;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4136:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2815:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3194:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5008:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5894:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6088:92;;;;;;;;;;;;;:::i;:::-;;4443:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6594:132;;;;;;;;;;;;;:::i;:::-;;6434:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2559:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1479:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15660:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4610:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7165:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16754:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3982:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1067:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12130:778;12184:17;12204:27;12227:3;12204:18;12218:3;;12204:9;:13;;:18;;;;:::i;:::-;:22;;:27;;;;:::i;:::-;12184:47;;12242:22;12267:24;12281:9;12267;:13;;:24;;;;:::i;:::-;12242:49;;12312:18;12333:31;12360:3;12333:22;12352:2;12333:14;:18;;:22;;;;:::i;:::-;:26;;:31;;;;:::i;:::-;12312:52;;12375:17;12395:30;12414:10;12395:14;:18;;:30;;;;:::i;:::-;12375:50;;12447:12;12472:8;;;;;;;;;;;12464:22;;12494:9;12464:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12446:62;;;12527:7;12519:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;12582:14;568:42;12599:22;;;12630:4;12599:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12582:54;;12648:6;568:42;12659:18;;12685:10;12659:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12647:53;;;12719:1;12711:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;12770:20;12793:49;12835:6;568:42;12793:22;;;12824:4;12793:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:49;;;;:::i;:::-;12770:72;;12863:37;12876:12;12890:9;12863:12;:37::i;:::-;12130:778;;;;;;;;:::o;17051:135::-;17114:7;568:42;17141:22;;;17172:4;17141:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17134:44;;17051:135;:::o;4316:115::-;1849:10;1840:19;;:5;;;;;;;;;;;:19;;;1832:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4409:14:::1;4393:13;;:30;;;;;;;;;;;;;;;;;;4316:115:::0;:::o;2711:98::-;2757:13;2783:18;;;;;;;;;;;;;;;;;;;2711:98;:::o;3011:177::-;3091:4;3149:6;3115:5;:17;3121:10;3115:17;;;;;;;;;;;;;;;:30;;;:40;;:65;;;;;3170:10;3159:21;;:7;:21;;;;3115:65;3108:72;;3011:177;;;;:::o;994:33::-;;;;:::o;6192:99::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6267:16:4::1;6278:4;6267:10;:16::i;:::-;139:1:5::0;435:7;:22;;;;6192:99:4;:::o;1550:27::-;;;;:::o;2346:87::-;2401:7;2419:11;;2412:18;;2346:87;:::o;3515:320::-;3615:4;568:42;3636:17;;:9;:17;;;3632:151;;;3670:46;3678:10;3690;3702:6;3710:5;3670:7;:46::i;:::-;3632:151;;;3749:22;3760:10;3749;:22::i;:::-;3632:151;3800:4;:27;;;;;3818:9;3808:19;;:6;:19;;;3800:27;3793:34;;3515:320;;;;;:::o;4800:196::-;1849:10;1840:19;;:5;;;;;;;;;;;:19;;;1832:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4890:5:::1;4879:7;:16;;4871:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4938:7;4924:11;:21;;;;4961:27;4980:7;4961:27;;;;;;:::i;:::-;;;;;;;;4800:196:::0;:::o;6738:119::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6804:45:4::1;6812:10;6824;6836:6;6844:4;6804:7;:45::i;:::-;139:1:5::0;435:7;:22;;;;6738:119:4;:::o;2920:85::-;2970:5;2995:2;2988:9;;2920:85;:::o;16275:467::-;16334:7;16354:14;16371:5;:11;16377:4;16371:11;;;;;;;;;;;;;;;:24;;;16354:41;;16419:1;16409:6;:11;16406:28;;;16430:1;16423:8;;;;;16406:28;16446:33;16482:24;16499:6;16482:16;:24::i;:::-;16446:60;;16517:32;16552:5;:11;16558:4;16552:11;;;;;;;;;;;;;;;:25;;;16517:60;;16622:24;16593:25;:53;16590:70;;16656:1;16649:8;;;;;;;16590:70;16679:55;16709:24;16679:25;:29;;:55;;;;:::i;:::-;16672:62;;;;;16275:467;;;;:::o;6869:132::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6924:69:4::1;6932:10;6944;6956:5;:17;6962:10;6956:17;;;;;;;;;;;;;;;:30;;;6988:4;6924:7;:69::i;:::-;139:1:5::0;435:7;:22;;;;6869:132:4:o;927:32::-;;;;:::o;1620:68::-;;;;;;;;;;;;;:::o;16909:130::-;16976:7;568:42;17003:22;;;17026:4;17003:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16996:35;;16909:130;;;:::o;7013:140::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;7101:44:4::1;7109:10;7121:9;7132:6;7140:4;7101:7;:44::i;:::-;139:1:5::0;435:7;:22;;;;7013:140:4;;:::o;6303:119::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6368:46:4::1;6376:10;6388;6400:6;6408:5;6368:7;:46::i;:::-;139:1:5::0;435:7;:22;;;;6303:119:4;:::o;15888:221::-;15956:7;15976:15;16018:11;;15994:5;:11;16000:4;15994:11;;;;;;;;;;;;;;;:21;;;:35;;;;:::i;:::-;15976:53;;16057:12;16047:7;:22;:54;;16100:1;16047:54;;;16072:25;16084:12;16072:7;:11;;:25;;;;:::i;:::-;16047:54;16040:61;;;15888:221;;;:::o;2439:114::-;2505:7;2523:5;:14;2529:7;2523:14;;;;;;;;;;;;;;;:27;;;2516:34;;2439:114;;;:::o;7346:908::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;7448:2:4::1;7437:7;:13;;:35;;;;;7467:5;7454:9;:18;;7437:35;7429:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;7541:20;7564:26;568:42;7582:7;7564:11;:26::i;:::-;7541:49;;7625:21;7663:1;7649:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7625:40;;7686:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7676:4;7681:1;7676:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;568:42;7710:4;7715:1;7710:7;;;;;;;;;;;;;;;;;;;;;:14;;;;;;;;;::::0;::::1;7794:16;7813:6;;;;;;;;;;;:20;;;7834:9;7845:4;7813:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7851:1;7813:40;;;;;;;;;;;;;;;;;;;;;;7794:59;;7906:12;7932;7921:8;:23;:75;;7984:12;7973:8;:23;;;;:::i;:::-;7921:75;;;7962:8;7947:12;:23;;;;:::i;:::-;7921:75;7906:90;;8077:16;8090:2;8077:8;:12;;:16;;;;:::i;:::-;8069:4;:24;;8061:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;8209:37;8222:12;8236:9;8209:12;:37::i;:::-;423:1:5;;;;139::::0;435:7;:22;;;;7346:908:4;:::o;1784:20::-;;;;;;;;;;;;;:::o;5211:479::-;1849:10;1840:19;;:5;;;;;;;;;;;:19;;;1832:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;5323:3:::1;5319:364;;;5376:6;5351:21;:31;;5343:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5423:6;5442:9;5434:23;;5465:6;5434:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5422:54;;;5499:1;5491:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;5319:364;;;;644:42;5571:16;;:5;:16;;;;5563:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;5637:5;5630:22;;;5653:9;5664:6;5630:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5319:364;5211:479:::0;;;;:::o;4136:168::-;1849:10;1840:19;;:5;;;;;;;;;;;:19;;;1832:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4221:1:::1;4209:8;;:13;;4201:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;4257:6;4251:3;:12;;;;4279:17;4289:6;4279:17;;;;;;:::i;:::-;;;;;;;;4136:168:::0;:::o;2815:99::-;2863:13;2889:17;;;;;;;;;;;;;;;;;;;2815:99;:::o;3194:315::-;3274:4;568:42;3333:17;;:9;:17;;;3329:151;;;3367:46;3375:10;3387;3399:6;3407:5;3367:7;:46::i;:::-;3329:151;;;3446:22;3457:10;3446;:22::i;:::-;3329:151;3497:4;3490:11;;3194:315;;;;:::o;5008:191::-;1849:10;1840:19;;:5;;;;;;;;;;;:19;;;1832:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;5095:5:::1;5084:7;:16;;5076:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;5145:7;5134:8;:18;;;;5168:23;5183:7;5168:23;;;;;;:::i;:::-;;;;;;;;5008:191:::0;:::o;5894:186::-;5956:16;5975:25;568:42;5993:6;5975:11;:25::i;:::-;5956:44;;6032:40;6060:11;;6032:23;875:6;6032:8;:12;;:23;;;;:::i;:::-;:27;;:40;;;;:::i;:::-;6011:17;;:61;;;;;;;:::i;:::-;;;;;;;;5894:186;;:::o;6088:92::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6144:22:4::1;6155:10;6144;:22::i;:::-;139:1:5::0;435:7;:22;;;;6088:92:4:o;4443:155::-;1849:10;1840:19;;:5;;;;;;;;;;;:19;;;1832:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4532:11:::1;4521:8;;:22;;;;;;;;;;;;;;;;;;4559:31;4578:11;4559:31;;;;;;:::i;:::-;;;;;;;;4443:155:::0;:::o;6594:132::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6648:70:4::1;6656:10;6668;6680:5;:17;6686:10;6680:17;;;;;;;;;;;;;;;:30;;;6712:5;6648:7;:70::i;:::-;139:1:5::0;435:7;:22;;;;6594:132:4:o;6434:148::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6525:49:4::1;6533:10;6545:13;6560:6;6568:5;6525:7;:49::i;:::-;139:1:5::0;435:7;:22;;;;6434:148:4;;:::o;2559:146::-;2643:7;2671;2661:17;;:6;:17;;;:41;;2701:1;2661:41;;;2681:17;2691:6;2681:9;:17::i;:::-;2661:41;2654:48;;2559:146;;;;:::o;1479:22::-;;;;:::o;15660:216::-;15725:7;15745:15;15788:8;;15763:5;:11;15769:4;15763:11;;;;;;;;;;;;;;;:22;;;:33;;;;:::i;:::-;15745:51;;15824:12;15814:7;:22;:54;;15867:1;15814:54;;;15839:25;15851:12;15839:7;:11;;:25;;;;:::i;:::-;15814:54;15807:61;;;15660:216;;;:::o;4610:182::-;1849:10;1840:19;;:5;;;;;;;;;;;:19;;;1832:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4697:2:::1;4685:8;;:14;;4677:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;4739:6;4728:8;:17;;;;4761:23;4777:6;4761:23;;;;;;:::i;:::-;;;;;;;;4610:182:::0;:::o;7165:169::-;183:1:5;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;7236:16:4::1;7255:33;644:42;7276:11;7255;:33::i;:::-;7236:52;;7299:27;7305:10;7317:8;7299:5;:27::i;:::-;423:1:5;139::::0;435:7;:22;;;;7165:169:4;:::o;16754:143::-;16808:7;16835:54;16877:11;;568:42;16835:22;;;16866:4;16835:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:54;;;;:::i;:::-;16828:61;;16754:143;:::o;3982:142::-;1849:10;1840:19;;:5;;;;;;;;;;;:19;;;1832:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4065:8:::1;4057:5;;:16;;;;;;;;;;;;;;;;;;4089:27;4107:8;4089:27;;;;;;:::i;:::-;;;;;;;;3982:142:::0;:::o;1067:35::-;;;;:::o;1675:471:6:-;1733:7;1983:1;1978;:6;1974:47;;;2008:1;2001:8;;;;1974:47;2033:9;2049:1;2045;:5;;;;:::i;:::-;2033:17;;2078:1;2073;2069;:5;;;;:::i;:::-;:10;2061:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:1;2130:8;;;1675:471;;;;;:::o;2622:132::-;2680:7;2707:39;2711:1;2714;2707:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2700:46;;2622:132;;;;:::o;785:136::-;843:7;870:43;874:1;877;870:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;863:50;;785:136;;;;:::o;8395:2012:4:-;8526:15;644:42;8544:25;;;8578:4;8544:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8526:58;;568:42;8647:20;;;8676:6;;;;;;;;;;;8685:10;8647:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8745:21;8768:14;8787:27;8810:3;8787:18;8802:2;8787:10;:14;;:18;;;;:::i;:::-;:22;;:27;;;;:::i;:::-;8816:26;8838:3;8816:17;8830:2;8816:9;:13;;:17;;;;:::i;:::-;:21;;:26;;;;:::i;:::-;8744:99;;;;8911:4;8893:15;;:22;;;;;;;;;;;;;;;;;;8993:20;9016:72;9058:10;9016:72;;;;;;;;;;;;;;;;;568:42;9016:22;;;9047:4;9016:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:72;;;;;:::i;:::-;8993:95;;9099:19;9121:54;9147:9;9121:54;;;;;;;;;;;;;;;;;:21;:25;;:54;;;;;:::i;:::-;9099:76;;9222:6;;;;;;;;;;;:22;;;9252:9;568:42;9296:10;9321:13;9349:6;9378:4;9398:23;9418:2;9398:15;:19;;:23;;;;:::i;:::-;9222:210;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;9501:5;9483:15;;:23;;;;;;;;;;;;;;;;;;9527:17;568:42;9547:22;;;9578:4;9547:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9527:57;;9595:16;9614:21;9595:40;;9684:18;9705:53;9750:7;644:42;9705:25;;;9739:4;9705:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;:53;;;;:::i;:::-;9684:74;;9790:1;9777:10;:14;9769:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;9876:29;9882:10;9894;9876:5;:29::i;:::-;9930:13;;;;;;;;;;;9926:474;;;9976:12;9964:9;:24;9960:165;;;10009:12;10024:27;10038:12;10024:9;:13;;:27;;;;:::i;:::-;10009:42;;568;10070:21;;;10092:10;10104:4;10070:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9960:165;;10164:11;10153:8;:22;10149:240;;;10196:12;10211:25;10224:11;10211:8;:12;;:25;;;;:::i;:::-;10196:40;;10256:6;10275:10;10267:24;;10299:4;10310;10267:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10255:64;;;10346:1;10338:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;10149:240;;;9926:474;8395:2012;;;;;;;;;;:::o;10821:393::-;10948:1;10921:5;:11;10927:4;10921:11;;;;;;;;;;;;;;;:24;;;:28;10913:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;11030:12;11015:11;;10991:5;:11;10997:4;10991:11;;;;;;;;;;;;;;;:21;;;:35;;;;:::i;:::-;:51;;10983:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;11095:14;11112:20;11127:4;11112:14;:20::i;:::-;11095:37;;11160:1;11151:6;:10;11143:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;11188:18;11201:4;11188:12;:18::i;:::-;10821:393;;:::o;13546:1696::-;13736:1;13709:5;:11;13715:4;13709:11;;;;;;;;;;;;;;;:24;;;:28;13701:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;13807:7;13779:5;:11;13785:4;13779:11;;;;;;;;;;;;;;;:24;;;:35;;:50;;;;;13828:1;13818:7;:11;13779:50;13771:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;13897:22;13947:8;;13922:5;:11;13928:4;13922:11;;;;;;;;;;;;;;;:22;;;:33;;;;:::i;:::-;13897:58;;14002:18;14015:4;14002:12;:18::i;:::-;14108:7;14080:5;:11;14086:4;14080:11;;;;;;;;;;;;;;;:24;;;:35;14076:312;;;14139:5;:11;14145:4;14139:11;;;;;;;;;;;;;;;;14132:18;;;;;;;;;;;;;;;;;;;;;;;;;;14076:312;;;14226:65;14255:7;14226:65;;;;;;;;;;;;;;;;;:5;:11;14232:4;14226:11;;;;;;;;;;;;;;;:24;;;:28;;:65;;;;;:::i;:::-;14199:5;:11;14205:4;14199:11;;;;;;;;;;;;;;;:24;;:92;;;;14334:42;14351:5;:11;14357:4;14351:11;;;;;;;;;;;;;;;:24;;;14334:16;:42::i;:::-;14306:5;:11;14312:4;14306:11;;;;;;;;;;;;;;;:25;;:70;;;;14076:312;14454:43;14470:7;14454:43;;;;;;;;;;;;;;;;;:11;;:15;;:43;;;;;:::i;:::-;14440:11;:57;;;;14557:20;14597:12;14580:14;:29;:69;;14642:7;14580:69;;;14612:27;14631:7;14612:18;:27::i;:::-;14580:69;14557:92;;14666:15;14662:319;;;14737:41;14754:12;14768:9;14737:16;:41::i;:::-;14662:319;;;14854:6;644:42;14863:24;;;14888:9;14899:12;14863:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14854:58;;14935:1;14927:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;14662:319;;15020:7;15005:12;:22;15001:145;;;15044:11;15058:25;15070:12;15058:7;:11;;:25;;;;:::i;:::-;15044:39;;644:42;15098:24;;;15123:5;;;;;;;;;;;15130:3;15098:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15001:145;;15222:1;15199:35;;15208:4;15199:35;;;15226:7;15199:35;;;;;;:::i;:::-;;;;;;;;13546:1696;;;;;;:::o;16121:142::-;16185:7;16212:43;875:6;16212:28;16222:17;;16212:5;:9;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;16205:50;;16121:142;;;:::o;11685:433::-;11755:7;11785:14;11809:5;11802:23;;;11834:4;11802:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11785:55;;11851:6;11867:5;11860:26;;;11887:10;11907:4;11914:6;11860:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11851:70;;11942:18;11963:50;12006:6;11970:5;11963:23;;;11995:4;11963:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;:50;;;;:::i;:::-;11942:71;;12032:1;:25;;;;;12051:6;12037:10;:20;;12032:25;12024:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;12100:10;12093:17;;;;;11685:433;;;;:::o;12920:618::-;13027:1;13000:5;:11;13006:4;13000:11;;;;;;;;;;;;;;;:24;;;:28;12996:180;;;13065:18;13078:4;13065:12;:18::i;:::-;12996:180;;;13152:12;13128:5;:11;13134:4;13128:11;;;;;;;;;;;;;;;:21;;:36;;;;12996:180;13252:8;13224:5;:11;13230:4;13224:11;;;;;;;;;;;;;;;:24;;;:36;;;;;;;:::i;:::-;;;;;;;;13296:12;13271:5;:11;13277:4;13271:11;;;;;;;;;;;;;;;:22;;:37;;;;13347:42;13364:5;:11;13370:4;13364:11;;;;;;;;;;;;;;;:24;;;13347:16;:42::i;:::-;13319:5;:11;13325:4;13319:11;;;;;;;;;;;;;;;:25;;:70;;;;13460:8;13445:11;;:23;;;;;;;:::i;:::-;;;;;;;;13515:4;13494:36;;13511:1;13494:36;;;13521:8;13494:36;;;;;;:::i;:::-;;;;;;;;12920:618;;:::o;3250:278:6:-;3336:7;3368:1;3364;:5;3371:12;3356:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3395:9;3411:1;3407;:5;;;;:::i;:::-;3395:17;;3519:1;3512:8;;;3250:278;;;;;:::o;1224:192::-;1310:7;1343:1;1338;:6;;1346:12;1330:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1370:9;1386:1;1382;:5;;;;:::i;:::-;1370:17;;1407:1;1400:8;;;1224:192;;;;;:::o;321:181::-;379:7;399:9;415:1;411;:5;;;;:::i;:::-;399:17;;440:1;435;:6;;427:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;493:1;486:8;;;321:181;;;;:::o;11226:447:4:-;11292:14;11309:20;11324:4;11309:14;:20::i;:::-;11292:37;;11354:1;11344:6;:11;11340:24;;;11357:7;;;11340:24;11440:12;11416:5;:11;11422:4;11416:11;;;;;;;;;;;;;;;:21;;:36;;;;11491:42;11508:5;:11;11514:4;11508:11;;;;;;;;;;;;;;;:24;;;11491:16;:42::i;:::-;11463:5;:11;11469:4;11463:11;;;;;;;;;;;;;;;:25;;:70;;;;11572:6;568:42;11581:21;;;11603:4;11609:6;11581:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11572:44;;11635:1;11627:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;11226:447;;;;:::o;15254:259::-;15322:7;15386:11;15400:30;15426:3;15400:21;15412:8;;15400:7;:11;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;15386:44;;15489:16;15501:3;15489:7;:11;;:16;;;;:::i;:::-;15482:23;;;15254:259;;;:::o;10419:390::-;644:42;10513:23;;;10545:6;;;;;;;;;;;10556:10;10554:1;:12;;;;:::i;:::-;10513:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10588:6;;;;;;;;;;;:54;;;568:42;10676:10;10701:1;10717;10733:9;10757:23;10777:2;10757:15;:19;;:23;;;;:::i;:::-;10588:203;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10419:390;;:::o;24:677:7:-;131:5;156:81;172:64;229:6;172:64;:::i;:::-;156:81;:::i;:::-;147:90;;257:5;286:6;279:5;272:21;320:4;313:5;309:16;302:23;;346:6;396:3;388:4;380:6;376:17;371:3;367:27;364:36;361:2;;;425:1;422;415:12;361:2;461:1;446:249;471:6;468:1;465:13;446:249;;;539:3;568:48;612:3;600:10;568:48;:::i;:::-;563:3;556:61;646:4;641:3;637:14;630:21;;680:4;675:3;671:14;664:21;;506:189;493:1;490;486:9;481:14;;446:249;;;450:14;137:564;;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:143::-;909:5;940:6;934:13;925:22;;956:33;983:5;956:33;:::i;:::-;915:80;;;;:::o;1018:318::-;1100:5;1149:3;1142:4;1134:6;1130:17;1126:27;1116:2;;1167:1;1164;1157:12;1116:2;1200:6;1194:13;1225:105;1326:3;1318:6;1311:4;1303:6;1299:17;1225:105;:::i;:::-;1216:114;;1106:230;;;;;:::o;1342:133::-;1385:5;1423:6;1410:20;1401:29;;1439:30;1463:5;1439:30;:::i;:::-;1391:84;;;;:::o;1481:137::-;1535:5;1566:6;1560:13;1551:22;;1582:30;1606:5;1582:30;:::i;:::-;1541:77;;;;:::o;1624:139::-;1670:5;1708:6;1695:20;1686:29;;1724:33;1751:5;1724:33;:::i;:::-;1676:87;;;;:::o;1769:143::-;1826:5;1857:6;1851:13;1842:22;;1873:33;1900:5;1873:33;:::i;:::-;1832:80;;;;:::o;1918:262::-;1977:6;2026:2;2014:9;2005:7;2001:23;1997:32;1994:2;;;2042:1;2039;2032:12;1994:2;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;1984:196;;;;:::o;2186:284::-;2256:6;2305:2;2293:9;2284:7;2280:23;2276:32;2273:2;;;2321:1;2318;2311:12;2273:2;2364:1;2389:64;2445:7;2436:6;2425:9;2421:22;2389:64;:::i;:::-;2379:74;;2335:128;2263:207;;;;:::o;2476:407::-;2544:6;2552;2601:2;2589:9;2580:7;2576:23;2572:32;2569:2;;;2617:1;2614;2607:12;2569:2;2660:1;2685:53;2730:7;2721:6;2710:9;2706:22;2685:53;:::i;:::-;2675:63;;2631:117;2787:2;2813:53;2858:7;2849:6;2838:9;2834:22;2813:53;:::i;:::-;2803:63;;2758:118;2559:324;;;;;:::o;2889:552::-;2966:6;2974;2982;3031:2;3019:9;3010:7;3006:23;3002:32;2999:2;;;3047:1;3044;3037:12;2999:2;3090:1;3115:53;3160:7;3151:6;3140:9;3136:22;3115:53;:::i;:::-;3105:63;;3061:117;3217:2;3243:53;3288:7;3279:6;3268:9;3264:22;3243:53;:::i;:::-;3233:63;;3188:118;3345:2;3371:53;3416:7;3407:6;3396:9;3392:22;3371:53;:::i;:::-;3361:63;;3316:118;2989:452;;;;;:::o;3447:407::-;3515:6;3523;3572:2;3560:9;3551:7;3547:23;3543:32;3540:2;;;3588:1;3585;3578:12;3540:2;3631:1;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3602:117;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3530:324;;;;;:::o;3860:420::-;3955:6;4004:2;3992:9;3983:7;3979:23;3975:32;3972:2;;;4020:1;4017;4010:12;3972:2;4084:1;4073:9;4069:17;4063:24;4114:18;4106:6;4103:30;4100:2;;;4146:1;4143;4136:12;4100:2;4174:89;4255:7;4246:6;4235:9;4231:22;4174:89;:::i;:::-;4164:99;;4034:239;3962:318;;;;:::o;4286:256::-;4342:6;4391:2;4379:9;4370:7;4366:23;4362:32;4359:2;;;4407:1;4404;4397:12;4359:2;4450:1;4475:50;4517:7;4508:6;4497:9;4493:22;4475:50;:::i;:::-;4465:60;;4421:114;4349:193;;;;:::o;4548:278::-;4615:6;4664:2;4652:9;4643:7;4639:23;4635:32;4632:2;;;4680:1;4677;4670:12;4632:2;4723:1;4748:61;4801:7;4792:6;4781:9;4777:22;4748:61;:::i;:::-;4738:71;;4694:125;4622:204;;;;:::o;4832:692::-;4915:6;4923;4931;4939;4988:3;4976:9;4967:7;4963:23;4959:33;4956:2;;;5005:1;5002;4995:12;4956:2;5048:1;5073:50;5115:7;5106:6;5095:9;5091:22;5073:50;:::i;:::-;5063:60;;5019:114;5172:2;5198:53;5243:7;5234:6;5223:9;5219:22;5198:53;:::i;:::-;5188:63;;5143:118;5300:2;5326:53;5371:7;5362:6;5351:9;5347:22;5326:53;:::i;:::-;5316:63;;5271:118;5428:2;5454:53;5499:7;5490:6;5479:9;5475:22;5454:53;:::i;:::-;5444:63;;5399:118;4946:578;;;;;;;:::o;5530:262::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:2;;;5654:1;5651;5644:12;5606:2;5697:1;5722:53;5767:7;5758:6;5747:9;5743:22;5722:53;:::i;:::-;5712:63;;5668:117;5596:196;;;;:::o;5798:284::-;5868:6;5917:2;5905:9;5896:7;5892:23;5888:32;5885:2;;;5933:1;5930;5923:12;5885:2;5976:1;6001:64;6057:7;6048:6;6037:9;6033:22;6001:64;:::i;:::-;5991:74;;5947:128;5875:207;;;;:::o;6088:407::-;6156:6;6164;6213:2;6201:9;6192:7;6188:23;6184:32;6181:2;;;6229:1;6226;6219:12;6181:2;6272:1;6297:53;6342:7;6333:6;6322:9;6318:22;6297:53;:::i;:::-;6287:63;;6243:117;6399:2;6425:53;6470:7;6461:6;6450:9;6446:22;6425:53;:::i;:::-;6415:63;;6370:118;6171:324;;;;;:::o;6501:596::-;6589:6;6597;6605;6654:2;6642:9;6633:7;6629:23;6625:32;6622:2;;;6670:1;6667;6660:12;6622:2;6713:1;6738:64;6794:7;6785:6;6774:9;6770:22;6738:64;:::i;:::-;6728:74;;6684:128;6851:2;6877:64;6933:7;6924:6;6913:9;6909:22;6877:64;:::i;:::-;6867:74;;6822:129;6990:2;7016:64;7072:7;7063:6;7052:9;7048:22;7016:64;:::i;:::-;7006:74;;6961:129;6612:485;;;;;:::o;7103:179::-;7172:10;7193:46;7235:3;7227:6;7193:46;:::i;:::-;7271:4;7266:3;7262:14;7248:28;;7183:99;;;;:::o;7288:108::-;7365:24;7383:5;7365:24;:::i;:::-;7360:3;7353:37;7343:53;;:::o;7402:118::-;7489:24;7507:5;7489:24;:::i;:::-;7484:3;7477:37;7467:53;;:::o;7556:732::-;7675:3;7704:54;7752:5;7704:54;:::i;:::-;7774:86;7853:6;7848:3;7774:86;:::i;:::-;7767:93;;7884:56;7934:5;7884:56;:::i;:::-;7963:7;7994:1;7979:284;8004:6;8001:1;7998:13;7979:284;;;8080:6;8074:13;8107:63;8166:3;8151:13;8107:63;:::i;:::-;8100:70;;8193:60;8246:6;8193:60;:::i;:::-;8183:70;;8039:224;8026:1;8023;8019:9;8014:14;;7979:284;;;7983:14;8279:3;8272:10;;7680:608;;;;;;;:::o;8294:109::-;8375:21;8390:5;8375:21;:::i;:::-;8370:3;8363:34;8353:50;;:::o;8409:147::-;8504:45;8543:5;8504:45;:::i;:::-;8499:3;8492:58;8482:74;;:::o;8562:364::-;8650:3;8678:39;8711:5;8678:39;:::i;:::-;8733:71;8797:6;8792:3;8733:71;:::i;:::-;8726:78;;8813:52;8858:6;8853:3;8846:4;8839:5;8835:16;8813:52;:::i;:::-;8890:29;8912:6;8890:29;:::i;:::-;8885:3;8881:39;8874:46;;8654:272;;;;;:::o;8932:366::-;9074:3;9095:67;9159:2;9154:3;9095:67;:::i;:::-;9088:74;;9171:93;9260:3;9171:93;:::i;:::-;9289:2;9284:3;9280:12;9273:19;;9078:220;;;:::o;9304:366::-;9446:3;9467:67;9531:2;9526:3;9467:67;:::i;:::-;9460:74;;9543:93;9632:3;9543:93;:::i;:::-;9661:2;9656:3;9652:12;9645:19;;9450:220;;;:::o;9676:366::-;9818:3;9839:67;9903:2;9898:3;9839:67;:::i;:::-;9832:74;;9915:93;10004:3;9915:93;:::i;:::-;10033:2;10028:3;10024:12;10017:19;;9822:220;;;:::o;10048:366::-;10190:3;10211:67;10275:2;10270:3;10211:67;:::i;:::-;10204:74;;10287:93;10376:3;10287:93;:::i;:::-;10405:2;10400:3;10396:12;10389:19;;10194:220;;;:::o;10420:366::-;10562:3;10583:67;10647:2;10642:3;10583:67;:::i;:::-;10576:74;;10659:93;10748:3;10659:93;:::i;:::-;10777:2;10772:3;10768:12;10761:19;;10566:220;;;:::o;10792:366::-;10934:3;10955:67;11019:2;11014:3;10955:67;:::i;:::-;10948:74;;11031:93;11120:3;11031:93;:::i;:::-;11149:2;11144:3;11140:12;11133:19;;10938:220;;;:::o;11164:366::-;11306:3;11327:67;11391:2;11386:3;11327:67;:::i;:::-;11320:74;;11403:93;11492:3;11403:93;:::i;:::-;11521:2;11516:3;11512:12;11505:19;;11310:220;;;:::o;11536:366::-;11678:3;11699:67;11763:2;11758:3;11699:67;:::i;:::-;11692:74;;11775:93;11864:3;11775:93;:::i;:::-;11893:2;11888:3;11884:12;11877:19;;11682:220;;;:::o;11908:366::-;12050:3;12071:67;12135:2;12130:3;12071:67;:::i;:::-;12064:74;;12147:93;12236:3;12147:93;:::i;:::-;12265:2;12260:3;12256:12;12249:19;;12054:220;;;:::o;12280:366::-;12422:3;12443:67;12507:2;12502:3;12443:67;:::i;:::-;12436:74;;12519:93;12608:3;12519:93;:::i;:::-;12637:2;12632:3;12628:12;12621:19;;12426:220;;;:::o;12652:366::-;12794:3;12815:67;12879:2;12874:3;12815:67;:::i;:::-;12808:74;;12891:93;12980:3;12891:93;:::i;:::-;13009:2;13004:3;13000:12;12993:19;;12798:220;;;:::o;13024:366::-;13166:3;13187:67;13251:2;13246:3;13187:67;:::i;:::-;13180:74;;13263:93;13352:3;13263:93;:::i;:::-;13381:2;13376:3;13372:12;13365:19;;13170:220;;;:::o;13396:366::-;13538:3;13559:67;13623:2;13618:3;13559:67;:::i;:::-;13552:74;;13635:93;13724:3;13635:93;:::i;:::-;13753:2;13748:3;13744:12;13737:19;;13542:220;;;:::o;13768:366::-;13910:3;13931:67;13995:2;13990:3;13931:67;:::i;:::-;13924:74;;14007:93;14096:3;14007:93;:::i;:::-;14125:2;14120:3;14116:12;14109:19;;13914:220;;;:::o;14140:366::-;14282:3;14303:67;14367:2;14362:3;14303:67;:::i;:::-;14296:74;;14379:93;14468:3;14379:93;:::i;:::-;14497:2;14492:3;14488:12;14481:19;;14286:220;;;:::o;14512:366::-;14654:3;14675:67;14739:2;14734:3;14675:67;:::i;:::-;14668:74;;14751:93;14840:3;14751:93;:::i;:::-;14869:2;14864:3;14860:12;14853:19;;14658:220;;;:::o;14884:398::-;15043:3;15064:83;15145:1;15140:3;15064:83;:::i;:::-;15057:90;;15156:93;15245:3;15156:93;:::i;:::-;15274:1;15269:3;15265:11;15258:18;;15047:235;;;:::o;15288:366::-;15430:3;15451:67;15515:2;15510:3;15451:67;:::i;:::-;15444:74;;15527:93;15616:3;15527:93;:::i;:::-;15645:2;15640:3;15636:12;15629:19;;15434:220;;;:::o;15660:366::-;15802:3;15823:67;15887:2;15882:3;15823:67;:::i;:::-;15816:74;;15899:93;15988:3;15899:93;:::i;:::-;16017:2;16012:3;16008:12;16001:19;;15806:220;;;:::o;16032:366::-;16174:3;16195:67;16259:2;16254:3;16195:67;:::i;:::-;16188:74;;16271:93;16360:3;16271:93;:::i;:::-;16389:2;16384:3;16380:12;16373:19;;16178:220;;;:::o;16404:366::-;16546:3;16567:67;16631:2;16626:3;16567:67;:::i;:::-;16560:74;;16643:93;16732:3;16643:93;:::i;:::-;16761:2;16756:3;16752:12;16745:19;;16550:220;;;:::o;16776:366::-;16918:3;16939:67;17003:2;16998:3;16939:67;:::i;:::-;16932:74;;17015:93;17104:3;17015:93;:::i;:::-;17133:2;17128:3;17124:12;17117:19;;16922:220;;;:::o;17148:366::-;17290:3;17311:67;17375:2;17370:3;17311:67;:::i;:::-;17304:74;;17387:93;17476:3;17387:93;:::i;:::-;17505:2;17500:3;17496:12;17489:19;;17294:220;;;:::o;17520:366::-;17662:3;17683:67;17747:2;17742:3;17683:67;:::i;:::-;17676:74;;17759:93;17848:3;17759:93;:::i;:::-;17877:2;17872:3;17868:12;17861:19;;17666:220;;;:::o;17892:118::-;17979:24;17997:5;17979:24;:::i;:::-;17974:3;17967:37;17957:53;;:::o;18016:112::-;18099:22;18115:5;18099:22;:::i;:::-;18094:3;18087:35;18077:51;;:::o;18134:379::-;18318:3;18340:147;18483:3;18340:147;:::i;:::-;18333:154;;18504:3;18497:10;;18322:191;;;:::o;18519:222::-;18612:4;18650:2;18639:9;18635:18;18627:26;;18663:71;18731:1;18720:9;18716:17;18707:6;18663:71;:::i;:::-;18617:124;;;;:::o;18747:442::-;18896:4;18934:2;18923:9;18919:18;18911:26;;18947:71;19015:1;19004:9;19000:17;18991:6;18947:71;:::i;:::-;19028:72;19096:2;19085:9;19081:18;19072:6;19028:72;:::i;:::-;19110;19178:2;19167:9;19163:18;19154:6;19110:72;:::i;:::-;18901:288;;;;;;:::o;19195:332::-;19316:4;19354:2;19343:9;19339:18;19331:26;;19367:71;19435:1;19424:9;19420:17;19411:6;19367:71;:::i;:::-;19448:72;19516:2;19505:9;19501:18;19492:6;19448:72;:::i;:::-;19321:206;;;;;:::o;19533:807::-;19782:4;19820:3;19809:9;19805:19;19797:27;;19834:71;19902:1;19891:9;19887:17;19878:6;19834:71;:::i;:::-;19915:72;19983:2;19972:9;19968:18;19959:6;19915:72;:::i;:::-;19997:80;20073:2;20062:9;20058:18;20049:6;19997:80;:::i;:::-;20087;20163:2;20152:9;20148:18;20139:6;20087:80;:::i;:::-;20177:73;20245:3;20234:9;20230:19;20221:6;20177:73;:::i;:::-;20260;20328:3;20317:9;20313:19;20304:6;20260:73;:::i;:::-;19787:553;;;;;;;;;:::o;20346:775::-;20579:4;20617:3;20606:9;20602:19;20594:27;;20631:71;20699:1;20688:9;20684:17;20675:6;20631:71;:::i;:::-;20712:72;20780:2;20769:9;20765:18;20756:6;20712:72;:::i;:::-;20794;20862:2;20851:9;20847:18;20838:6;20794:72;:::i;:::-;20876;20944:2;20933:9;20929:18;20920:6;20876:72;:::i;:::-;20958:73;21026:3;21015:9;21011:19;21002:6;20958:73;:::i;:::-;21041;21109:3;21098:9;21094:19;21085:6;21041:73;:::i;:::-;20584:537;;;;;;;;;:::o;21127:210::-;21214:4;21252:2;21241:9;21237:18;21229:26;;21265:65;21327:1;21316:9;21312:17;21303:6;21265:65;:::i;:::-;21219:118;;;;:::o;21343:313::-;21456:4;21494:2;21483:9;21479:18;21471:26;;21543:9;21537:4;21533:20;21529:1;21518:9;21514:17;21507:47;21571:78;21644:4;21635:6;21571:78;:::i;:::-;21563:86;;21461:195;;;;:::o;21662:419::-;21828:4;21866:2;21855:9;21851:18;21843:26;;21915:9;21909:4;21905:20;21901:1;21890:9;21886:17;21879:47;21943:131;22069:4;21943:131;:::i;:::-;21935:139;;21833:248;;;:::o;22087:419::-;22253:4;22291:2;22280:9;22276:18;22268:26;;22340:9;22334:4;22330:20;22326:1;22315:9;22311:17;22304:47;22368:131;22494:4;22368:131;:::i;:::-;22360:139;;22258:248;;;:::o;22512:419::-;22678:4;22716:2;22705:9;22701:18;22693:26;;22765:9;22759:4;22755:20;22751:1;22740:9;22736:17;22729:47;22793:131;22919:4;22793:131;:::i;:::-;22785:139;;22683:248;;;:::o;22937:419::-;23103:4;23141:2;23130:9;23126:18;23118:26;;23190:9;23184:4;23180:20;23176:1;23165:9;23161:17;23154:47;23218:131;23344:4;23218:131;:::i;:::-;23210:139;;23108:248;;;:::o;23362:419::-;23528:4;23566:2;23555:9;23551:18;23543:26;;23615:9;23609:4;23605:20;23601:1;23590:9;23586:17;23579:47;23643:131;23769:4;23643:131;:::i;:::-;23635:139;;23533:248;;;:::o;23787:419::-;23953:4;23991:2;23980:9;23976:18;23968:26;;24040:9;24034:4;24030:20;24026:1;24015:9;24011:17;24004:47;24068:131;24194:4;24068:131;:::i;:::-;24060:139;;23958:248;;;:::o;24212:419::-;24378:4;24416:2;24405:9;24401:18;24393:26;;24465:9;24459:4;24455:20;24451:1;24440:9;24436:17;24429:47;24493:131;24619:4;24493:131;:::i;:::-;24485:139;;24383:248;;;:::o;24637:419::-;24803:4;24841:2;24830:9;24826:18;24818:26;;24890:9;24884:4;24880:20;24876:1;24865:9;24861:17;24854:47;24918:131;25044:4;24918:131;:::i;:::-;24910:139;;24808:248;;;:::o;25062:419::-;25228:4;25266:2;25255:9;25251:18;25243:26;;25315:9;25309:4;25305:20;25301:1;25290:9;25286:17;25279:47;25343:131;25469:4;25343:131;:::i;:::-;25335:139;;25233:248;;;:::o;25487:419::-;25653:4;25691:2;25680:9;25676:18;25668:26;;25740:9;25734:4;25730:20;25726:1;25715:9;25711:17;25704:47;25768:131;25894:4;25768:131;:::i;:::-;25760:139;;25658:248;;;:::o;25912:419::-;26078:4;26116:2;26105:9;26101:18;26093:26;;26165:9;26159:4;26155:20;26151:1;26140:9;26136:17;26129:47;26193:131;26319:4;26193:131;:::i;:::-;26185:139;;26083:248;;;:::o;26337:419::-;26503:4;26541:2;26530:9;26526:18;26518:26;;26590:9;26584:4;26580:20;26576:1;26565:9;26561:17;26554:47;26618:131;26744:4;26618:131;:::i;:::-;26610:139;;26508:248;;;:::o;26762:419::-;26928:4;26966:2;26955:9;26951:18;26943:26;;27015:9;27009:4;27005:20;27001:1;26990:9;26986:17;26979:47;27043:131;27169:4;27043:131;:::i;:::-;27035:139;;26933:248;;;:::o;27187:419::-;27353:4;27391:2;27380:9;27376:18;27368:26;;27440:9;27434:4;27430:20;27426:1;27415:9;27411:17;27404:47;27468:131;27594:4;27468:131;:::i;:::-;27460:139;;27358:248;;;:::o;27612:419::-;27778:4;27816:2;27805:9;27801:18;27793:26;;27865:9;27859:4;27855:20;27851:1;27840:9;27836:17;27829:47;27893:131;28019:4;27893:131;:::i;:::-;27885:139;;27783:248;;;:::o;28037:419::-;28203:4;28241:2;28230:9;28226:18;28218:26;;28290:9;28284:4;28280:20;28276:1;28265:9;28261:17;28254:47;28318:131;28444:4;28318:131;:::i;:::-;28310:139;;28208:248;;;:::o;28462:419::-;28628:4;28666:2;28655:9;28651:18;28643:26;;28715:9;28709:4;28705:20;28701:1;28690:9;28686:17;28679:47;28743:131;28869:4;28743:131;:::i;:::-;28735:139;;28633:248;;;:::o;28887:419::-;29053:4;29091:2;29080:9;29076:18;29068:26;;29140:9;29134:4;29130:20;29126:1;29115:9;29111:17;29104:47;29168:131;29294:4;29168:131;:::i;:::-;29160:139;;29058:248;;;:::o;29312:419::-;29478:4;29516:2;29505:9;29501:18;29493:26;;29565:9;29559:4;29555:20;29551:1;29540:9;29536:17;29529:47;29593:131;29719:4;29593:131;:::i;:::-;29585:139;;29483:248;;;:::o;29737:419::-;29903:4;29941:2;29930:9;29926:18;29918:26;;29990:9;29984:4;29980:20;29976:1;29965:9;29961:17;29954:47;30018:131;30144:4;30018:131;:::i;:::-;30010:139;;29908:248;;;:::o;30162:419::-;30328:4;30366:2;30355:9;30351:18;30343:26;;30415:9;30409:4;30405:20;30401:1;30390:9;30386:17;30379:47;30443:131;30569:4;30443:131;:::i;:::-;30435:139;;30333:248;;;:::o;30587:419::-;30753:4;30791:2;30780:9;30776:18;30768:26;;30840:9;30834:4;30830:20;30826:1;30815:9;30811:17;30804:47;30868:131;30994:4;30868:131;:::i;:::-;30860:139;;30758:248;;;:::o;31012:419::-;31178:4;31216:2;31205:9;31201:18;31193:26;;31265:9;31259:4;31255:20;31251:1;31240:9;31236:17;31229:47;31293:131;31419:4;31293:131;:::i;:::-;31285:139;;31183:248;;;:::o;31437:222::-;31530:4;31568:2;31557:9;31553:18;31545:26;;31581:71;31649:1;31638:9;31634:17;31625:6;31581:71;:::i;:::-;31535:124;;;;:::o;31665:483::-;31836:4;31874:2;31863:9;31859:18;31851:26;;31887:71;31955:1;31944:9;31940:17;31931:6;31887:71;:::i;:::-;32005:9;31999:4;31995:20;31990:2;31979:9;31975:18;31968:48;32033:108;32136:4;32127:6;32033:108;:::i;:::-;32025:116;;31841:307;;;;;:::o;32154:214::-;32243:4;32281:2;32270:9;32266:18;32258:26;;32294:67;32358:1;32347:9;32343:17;32334:6;32294:67;:::i;:::-;32248:120;;;;:::o;32374:129::-;32408:6;32435:20;;:::i;:::-;32425:30;;32464:33;32492:4;32484:6;32464:33;:::i;:::-;32415:88;;;:::o;32509:75::-;32542:6;32575:2;32569:9;32559:19;;32549:35;:::o;32590:311::-;32667:4;32757:18;32749:6;32746:30;32743:2;;;32779:18;;:::i;:::-;32743:2;32829:4;32821:6;32817:17;32809:25;;32889:4;32883;32879:15;32871:23;;32672:229;;;:::o;32907:132::-;32974:4;32997:3;32989:11;;33027:4;33022:3;33018:14;33010:22;;32979:60;;;:::o;33045:114::-;33112:6;33146:5;33140:12;33130:22;;33119:40;;;:::o;33165:99::-;33217:6;33251:5;33245:12;33235:22;;33224:40;;;:::o;33270:113::-;33340:4;33372;33367:3;33363:14;33355:22;;33345:38;;;:::o;33389:184::-;33488:11;33522:6;33517:3;33510:19;33562:4;33557:3;33553:14;33538:29;;33500:73;;;;:::o;33579:147::-;33680:11;33717:3;33702:18;;33692:34;;;;:::o;33732:169::-;33816:11;33850:6;33845:3;33838:19;33890:4;33885:3;33881:14;33866:29;;33828:73;;;;:::o;33907:305::-;33947:3;33966:20;33984:1;33966:20;:::i;:::-;33961:25;;34000:20;34018:1;34000:20;:::i;:::-;33995:25;;34154:1;34086:66;34082:74;34079:1;34076:81;34073:2;;;34160:18;;:::i;:::-;34073:2;34204:1;34201;34197:9;34190:16;;33951:261;;;;:::o;34218:185::-;34258:1;34275:20;34293:1;34275:20;:::i;:::-;34270:25;;34309:20;34327:1;34309:20;:::i;:::-;34304:25;;34348:1;34338:2;;34353:18;;:::i;:::-;34338:2;34395:1;34392;34388:9;34383:14;;34260:143;;;;:::o;34409:348::-;34449:7;34472:20;34490:1;34472:20;:::i;:::-;34467:25;;34506:20;34524:1;34506:20;:::i;:::-;34501:25;;34694:1;34626:66;34622:74;34619:1;34616:81;34611:1;34604:9;34597:17;34593:105;34590:2;;;34701:18;;:::i;:::-;34590:2;34749:1;34746;34742:9;34731:20;;34457:300;;;;:::o;34763:191::-;34803:4;34823:20;34841:1;34823:20;:::i;:::-;34818:25;;34857:20;34875:1;34857:20;:::i;:::-;34852:25;;34896:1;34893;34890:8;34887:2;;;34901:18;;:::i;:::-;34887:2;34946:1;34943;34939:9;34931:17;;34808:146;;;;:::o;34960:96::-;34997:7;35026:24;35044:5;35026:24;:::i;:::-;35015:35;;35005:51;;;:::o;35062:90::-;35096:7;35139:5;35132:13;35125:21;35114:32;;35104:48;;;:::o;35158:126::-;35195:7;35235:42;35228:5;35224:54;35213:65;;35203:81;;;:::o;35290:77::-;35327:7;35356:5;35345:16;;35335:32;;;:::o;35373:86::-;35408:7;35448:4;35441:5;35437:16;35426:27;;35416:43;;;:::o;35465:121::-;35523:9;35556:24;35574:5;35556:24;:::i;:::-;35543:37;;35533:53;;;:::o;35592:307::-;35660:1;35670:113;35684:6;35681:1;35678:13;35670:113;;;35769:1;35764:3;35760:11;35754:18;35750:1;35745:3;35741:11;35734:39;35706:2;35703:1;35699:10;35694:15;;35670:113;;;35801:6;35798:1;35795:13;35792:2;;;35881:1;35872:6;35867:3;35863:16;35856:27;35792:2;35641:258;;;;:::o;35905:281::-;35988:27;36010:4;35988:27;:::i;:::-;35980:6;35976:40;36118:6;36106:10;36103:22;36082:18;36070:10;36067:34;36064:62;36061:2;;;36129:18;;:::i;:::-;36061:2;36169:10;36165:2;36158:22;35948:238;;;:::o;36192:180::-;36240:77;36237:1;36230:88;36337:4;36334:1;36327:15;36361:4;36358:1;36351:15;36378:180;36426:77;36423:1;36416:88;36523:4;36520:1;36513:15;36547:4;36544:1;36537:15;36564:180;36612:77;36609:1;36602:88;36709:4;36706:1;36699:15;36733:4;36730:1;36723:15;36750:102;36791:6;36842:2;36838:7;36833:2;36826:5;36822:14;36818:28;36808:38;;36798:54;;;:::o;36858:171::-;36998:23;36994:1;36986:6;36982:14;36975:47;36964:65;:::o;37035:178::-;37175:30;37171:1;37163:6;37159:14;37152:54;37141:72;:::o;37219:172::-;37359:24;37355:1;37347:6;37343:14;37336:48;37325:66;:::o;37397:177::-;37537:29;37533:1;37525:6;37521:14;37514:53;37503:71;:::o;37580:169::-;37720:21;37716:1;37708:6;37704:14;37697:45;37686:63;:::o;37755:162::-;37895:14;37891:1;37883:6;37879:14;37872:38;37861:56;:::o;37923:173::-;38063:25;38059:1;38051:6;38047:14;38040:49;38029:67;:::o;38102:170::-;38242:22;38238:1;38230:6;38226:14;38219:46;38208:64;:::o;38278:220::-;38418:34;38414:1;38406:6;38402:14;38395:58;38487:3;38482:2;38474:6;38470:15;38463:28;38384:114;:::o;38504:174::-;38644:26;38640:1;38632:6;38628:14;38621:50;38610:68;:::o;38684:168::-;38824:20;38820:1;38812:6;38808:14;38801:44;38790:62;:::o;38858:163::-;38998:15;38994:1;38986:6;38982:14;38975:39;38964:57;:::o;39027:168::-;39167:20;39163:1;39155:6;39151:14;39144:44;39133:62;:::o;39201:163::-;39341:15;39337:1;39329:6;39325:14;39318:39;39307:57;:::o;39370:170::-;39510:22;39506:1;39498:6;39494:14;39487:46;39476:64;:::o;39546:175::-;39686:27;39682:1;39674:6;39670:14;39663:51;39652:69;:::o;39727:114::-;39833:8;:::o;39847:164::-;39987:16;39983:1;39975:6;39971:14;39964:40;39953:58;:::o;40017:177::-;40157:29;40153:1;40145:6;40141:14;40134:53;40123:71;:::o;40200:181::-;40340:33;40336:1;40328:6;40324:14;40317:57;40306:75;:::o;40387:182::-;40527:34;40523:1;40515:6;40511:14;40504:58;40493:76;:::o;40575:160::-;40715:12;40711:1;40703:6;40699:14;40692:36;40681:54;:::o;40741:173::-;40881:25;40877:1;40869:6;40865:14;40858:49;40847:67;:::o;40920:175::-;41060:27;41056:1;41048:6;41044:14;41037:51;41026:69;:::o;41101:122::-;41174:24;41192:5;41174:24;:::i;:::-;41167:5;41164:35;41154:2;;41213:1;41210;41203:12;41154:2;41144:79;:::o;41229:116::-;41299:21;41314:5;41299:21;:::i;:::-;41292:5;41289:32;41279:2;;41335:1;41332;41325:12;41279:2;41269:76;:::o;41351:122::-;41424:24;41442:5;41424:24;:::i;:::-;41417:5;41414:35;41404:2;;41463:1;41460;41453:12;41404:2;41394:79;:::o

Swarm Source

ipfs://9fba9c8cb0ccb71bfc40e76fe60bd5bc579a3ae708740e4c3b2e7d58b7828a49
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.