ETH Price: $2,103.74 (-14.11%)

Token

Fed Inu (COKEN)
 

Overview

Max Total Supply

1,000,000,000,000 COKEN

Holders

36

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
9,404,335,559.215968574717215477 COKEN

Value
$0.00
0xBe27De58170E0238e281520d7733988D316Dfd32
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:
COKEN

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-18
*/

/**
 *Submitted for verification at Etherscan.io on 2022-02-18
*/

/**
 *Submitted for verification at Etherscan.io on 2022-02-17
*/

// File: contracts/safetoken-imports.sol

/**
 * SPDX-License-Identifier: MIT
 */ 
pragma solidity ^0.8.4;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {return msg.sender;}
    function _msgData() internal view virtual returns (bytes calldata) {this; return msg.data;}
}
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {return a + b;}
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {return a - b;}
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {return a * b;}
    function div(uint256 a, uint256 b) internal pure returns (uint256) {return a / b;}
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {return a % b;}
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked { require(b <= a, errorMessage); return a - b; }
    }
}
library Address {
    function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0;}
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");(bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {return functionCall(target, data, "Address: low-level call failed");}
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {return functionCallWithValue(target, data, 0, errorMessage);}
    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");}
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) { return returndata; } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {revert(errorMessage);}
        }
    }
}
abstract contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "Only the previous owner can unlock onwership");
        require(block.timestamp > _lockTime , "The contract is still locked");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}
abstract contract Manageable is Context {
    address private _manager;
    event ManagementTransferred(address indexed previousManager, address indexed newManager);
    constructor(){
        address msgSender = _msgSender();
        _manager = msgSender;
        emit ManagementTransferred(address(0), msgSender);
    }
    function manager() public view returns(address){ return _manager; }
    modifier onlyManager(){
        require(_manager == _msgSender(), "Manageable: caller is not the manager");
        _;
    }
    function transferManagement(address newManager) external virtual onlyManager {
        emit ManagementTransferred(_manager, newManager);
        _manager = newManager;
    }
}
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

abstract contract Tokenomics {
    
    using SafeMath for uint256;
    
    // --------------------- Token Settings ------------------- //

    string internal constant NAME = "Fed Inu";
    string internal constant SYMBOL = "COKEN";
    
    uint16 internal constant FEES_DIVISOR = 10 ** 3;
    uint8 internal constant DECIMALS = 18;
    uint256 internal constant ZEROES = 10 ** DECIMALS;
    
    uint256 private constant MAX = ~uint256(0);
    uint256 internal constant TOTAL_SUPPLY = 10 ** 12 * ZEROES;
    uint256 internal _reflectedSupply = (MAX - (MAX % TOTAL_SUPPLY));

    /**
     * @dev Set the maximum transaction amount allowed in a transfer.
     * 
     * The default value is 1% of the total supply. 
     * 
     * NOTE: set the value to `TOTAL_SUPPLY` to have an unlimited max, i.e.
     * `maxTransactionAmount = TOTAL_SUPPLY;`
     */
    uint256 internal constant maxTransactionAmount = TOTAL_SUPPLY / 100; // 1% of the total supply
    
    /**
     * @dev Set the maximum allowed balance in a wallet.
     * 
     * The default value is 2% of the total supply. 
     * 
     * NOTE: set the value to 0 to have an unlimited max.
     *
     * IMPORTANT: This value MUST be greater than `numberOfTokensToSwapToLiquidity` set below,
     * otherwise the liquidity swap will never be executed
     */
    uint256 internal constant maxWalletBalance = TOTAL_SUPPLY;
    
    /**
     * @dev Set the number of tokens to swap and add to liquidity. 
     * 
     * Whenever the contract's balance reaches this number of tokens, swap & liquify will be 
     * executed in the very next transfer (via the `_beforeTokenTransfer`)
     * 
     * If the `FeeType.Liquidity` is enabled in `FeesSettings`, the given % of each transaction will be first
     * sent to the contract address. Once the contract's balance reaches `numberOfTokensToSwapToLiquidity` the
     * `swapAndLiquify` of `Liquifier` will be executed. Half of the tokens will be swapped for ETH 
     * (or BNB on BSC) and together with the other half converted into a Token-ETH/Token-BNB LP Token.
     * 
     * See: `Liquifier`
     */
    uint256 internal constant numberOfTokensToSwapToLiquidity = TOTAL_SUPPLY / 1000; // 0.1% of the total supply

    // --------------------- Fees Settings ------------------- //

    /**
     * @dev To add/edit/remove fees scroll down to the `addFees` function below
     */

    address internal marketingAddress = 0x608d654192B57C1a1c56731e2618eB52c37326BA;
    address internal teamAddress = 0x28D00bBf1739788bfbffCe75b61D752Fb142bc6A;
   
    address internal burnAddress = 0x0000000000000000000000000000000299792458;

    enum FeeType { Antiwhale, Burn, Liquidity, Rfi, External, ExternalToETH }
    
    struct Fee {
        FeeType name;
        uint256 value;
        address recipient;
        uint256 total;
    }

    Fee[] internal fees;
    uint256 internal sumOfFees;

    constructor() {
        _addFees();
    }

    function _addFee(FeeType name, uint256 value, address recipient) private {
        fees.push( Fee(name, value, recipient, 0 ) );
        sumOfFees += value;
    }

    function _addFees() private {

        /**
         * The RFI recipient is ignored but we need to give a valid address value
         *
         * CAUTION: If you don't want to use RFI this implementation isn't really for you!
         *      There are much more efficient and cleaner token contracts without RFI 
         *      so you should use one of those
         *
         * The value of fees is given in part per 1000 (based on the value of FEES_DIVISOR),
         * e.g. for 5% use 50, for 3.5% use 35, etc. 
         */ 
        _addFee(FeeType.Rfi, 40, address(this) ); 
        _addFee(FeeType.Liquidity, 60, address(this) );
        _addFee(FeeType.ExternalToETH, 20, teamAddress );
        _addFee(FeeType.ExternalToETH, 20, marketingAddress );
    }

    function _getFeesCount() internal view returns (uint256){ return fees.length; }

    function _getFeeStruct(uint256 index) private view returns(Fee storage){
        require( index >= 0 && index < fees.length, "FeesSettings._getFeeStruct: Fee index out of bounds");
        return fees[index];
    }

    function _getFee(uint256 index) internal view returns (FeeType, uint256, address, uint256){
        Fee memory fee = _getFeeStruct(index);
        return ( fee.name, fee.value, fee.recipient, fee.total );
    }

    function _addFeeCollectedAmount(uint256 index, uint256 amount) internal {
        Fee storage fee = _getFeeStruct(index);
        fee.total = fee.total.add(amount);
    }

    // function getCollectedFeeTotal(uint256 index) external view returns (uint256){
    function getCollectedFeeTotal(uint256 index) internal view returns (uint256){
        Fee memory fee = _getFeeStruct(index);
        return fee.total;
    }
}

abstract contract Presaleable is Manageable {
    bool internal isInPresale;
    function setPreseableEnabled(bool value) external onlyManager {
        isInPresale = value;
    }
}

abstract contract CokenRFI is IERC20, IERC20Metadata, Ownable, Presaleable, Tokenomics {

    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) internal _reflectedBalances;
    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowances;
    
    mapping (address => bool) internal _isExcludedFromFee;
    mapping (address => bool) internal _isExcludedFromRewards;
    address[] private _excluded;
    
    constructor(){
        
        _reflectedBalances[owner()] = _reflectedSupply;
        
        // exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        // exclude the owner and this contract from rewards
        _exclude(owner());
        _exclude(address(this));

        emit Transfer(address(0), owner(), TOTAL_SUPPLY);
        
    }
    
    /** Functions required by IERC20Metadat **/
        function name() external pure override returns (string memory) { return NAME; }
        function symbol() external pure override returns (string memory) { return SYMBOL; }
        function decimals() external pure override returns (uint8) { return DECIMALS; }
        
    /** Functions required by IERC20Metadat - END **/
    /** Functions required by IERC20 **/

        function totalSupply() external pure override returns (uint256) {
            return TOTAL_SUPPLY;
        }
        
        function balanceOf(address account) public view override returns (uint256){
            if (_isExcludedFromRewards[account]) return _balances[account];
            return tokenFromReflection(_reflectedBalances[account]);
        }
        
        function transfer(address recipient, uint256 amount) external override returns (bool){
            _transfer(_msgSender(), recipient, amount);
            return true;
        }
        
        function allowance(address owner, address spender) external view override returns (uint256){
            return _allowances[owner][spender];
        }
    
        function approve(address spender, uint256 amount) external override returns (bool) {
            _approve(_msgSender(), spender, amount);
            return true;
        }
        
        function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool){
            _transfer(sender, recipient, amount);
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
            return true;
        }
    /** Functions required by IERC20 - END **/

    function burn(uint256 amount) external {

        address sender = _msgSender();
        require(sender != address(0), "CokenRFI: burn from the zero address");
        require(sender != address(burnAddress), "CokenRFI: burn from the burn address");

        uint256 balance = balanceOf(sender);
        require(balance >= amount, "CokenRFI: burn amount exceeds balance");

        uint256 reflectedAmount = amount.mul(_getCurrentRate());

        // remove the amount from the sender's balance first
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(reflectedAmount);
        if (_isExcludedFromRewards[sender])
            _balances[sender] = _balances[sender].sub(amount);

        _burnTokens( sender, amount, reflectedAmount );
    }
    
    /**
     * @dev "Soft" burns the specified amount of tokens by sending them 
     * to the burn address
     */
    function _burnTokens(address sender, uint256 tBurn, uint256 rBurn) internal {

        /**
         * @dev Do not reduce _totalSupply and/or _reflectedSupply. (soft) burning by sending
         * tokens to the burn address (which should be excluded from rewards) is sufficient
         * in RFI
         */ 
        _reflectedBalances[burnAddress] = _reflectedBalances[burnAddress].add(rBurn);
        if (_isExcludedFromRewards[burnAddress])
            _balances[burnAddress] = _balances[burnAddress].add(tBurn);

        /**
         * @dev Emit the event so that the burn address balance is updated (on bscscan)
         */
        emit Transfer(sender, burnAddress, tBurn);
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    
    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcludedFromRewards[account];
    }

    /**
     * @dev Calculates and returns the reflected amount for the given amount with or without 
     * the transfer fees (deductTransferFee true/false)
     */
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) {
        require(tAmount <= TOTAL_SUPPLY, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount,0);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount,_getSumOfFees());
            return rTransferAmount;
        }
    }

    /**
     * @dev Calculates and returns the amount of tokens corresponding to the given reflected amount.
     */
    function tokenFromReflection(uint256 rAmount) internal view returns(uint256) {
        require(rAmount <= _reflectedSupply, "Amount must be less than total reflections");
        uint256 currentRate = _getCurrentRate();
        return rAmount.div(currentRate);
    }
    
    function _exclude(address account) internal {
        if(_reflectedBalances[account] > 0) {
            _balances[account] = tokenFromReflection(_reflectedBalances[account]);
        }
        _isExcludedFromRewards[account] = true;
        _excluded.push(account);
    }

    function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; }
    
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "CokenRFI: approve from the zero address");
        require(spender != address(0), "CokenRFI: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    
    /**
     */
    function _isUnlimitedSender(address account) internal view returns(bool){
        // the owner should be the only whitelisted sender
        return (account == owner());
    }
    /**
     */
    function _isUnlimitedRecipient(address account) internal view returns(bool){
        // the owner should be a white-listed recipient
        // and anyone should be able to burn as many tokens as 
        // he/she wants
        return (account == owner() || account == burnAddress);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "CokenRFI: transfer from the zero address");
        require(recipient != address(0), "CokenRFI: transfer to the zero address");
        require(sender != address(burnAddress), "CokenRFI: transfer from the burn address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        // indicates whether or not feee should be deducted from the transfer
        bool takeFee = true;

        if ( isInPresale ){ takeFee = false; }
        else {
            /**
            * Check the amount is within the max allowed limit as long as a
            * unlimited sender/recepient is not involved in the transaction
            */
            if ( amount > maxTransactionAmount && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) ){
                revert("Transfer amount exceeds the maxTxAmount.");
            }
            /**
            * The pair needs to excluded from the max wallet balance check; 
            * selling tokens is sending them back to the pair (without this
            * check, selling tokens would not work if the pair's balance 
            * was over the allowed max)
            *
            * Note: This does NOT take into account the fees which will be deducted 
            *       from the amount. As such it could be a bit confusing 
            */
            if ( maxWalletBalance > 0 && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) && !_isV2Pair(recipient) ){
                uint256 recipientBalance = balanceOf(recipient);
                require(recipientBalance + amount <= maxWalletBalance, "New balance would exceed the maxWalletBalance");
            }
        }

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]){ takeFee = false; }

        _beforeTokenTransfer(sender, recipient, amount, takeFee);
        _transferTokens(sender, recipient, amount, takeFee);
        
    }

    function _transferTokens(address sender, address recipient, uint256 amount, bool takeFee) private {
    
        /**
         * We don't need to know anything about the individual fees here 
         * (like Safemoon does with `_getValues`). All that is required 
         * for the transfer is the sum of all fees to calculate the % of the total 
         * transaction amount which should be transferred to the recipient. 
         *
         * The `_takeFees` call will/should take care of the individual fees
         */
        uint256 sumOfFees = _getSumOfFees();
        if ( !takeFee ){ sumOfFees = 0; }
        
        (uint256 rAmount, uint256 rTransferAmount, uint256 tAmount, uint256 tTransferAmount, uint256 currentRate ) = _getValues(amount, sumOfFees);
        
        /** 
         * Sender's and Recipient's reflected balances must be always updated regardless of
         * whether they are excluded from rewards or not.
         */ 
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(rAmount);
        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rTransferAmount);

        /**
         * Update the true/nominal balances for excluded accounts
         */        
        if (_isExcludedFromRewards[sender]){ _balances[sender] = _balances[sender].sub(tAmount); }
        if (_isExcludedFromRewards[recipient] ){ _balances[recipient] = _balances[recipient].add(tTransferAmount); }
        
        _takeFees( amount, currentRate, sumOfFees );
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function _takeFees(uint256 amount, uint256 currentRate, uint256 sumOfFees ) private {
        if ( sumOfFees > 0 && !isInPresale ){
            _takeTransactionFees(amount, currentRate);
        }
    }
    
    function _getValues(uint256 tAmount, uint256 feesSum) internal view returns (uint256, uint256, uint256, uint256, uint256) {
        
        uint256 tTotalFees = tAmount.mul(feesSum).div(FEES_DIVISOR);
        uint256 tTransferAmount = tAmount.sub(tTotalFees);
        uint256 currentRate = _getCurrentRate();
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rTotalFees = tTotalFees.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rTotalFees);
        
        return (rAmount, rTransferAmount, tAmount, tTransferAmount, currentRate);
    }
    
    function _getCurrentRate() internal view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }
    
    function _getCurrentSupply() internal view returns(uint256, uint256) {
        uint256 rSupply = _reflectedSupply;
        uint256 tSupply = TOTAL_SUPPLY;  

        /**
         * The code below removes balances of addresses excluded from rewards from
         * rSupply and tSupply, which effectively increases the % of transaction fees
         * delivered to non-excluded holders
         */    
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_reflectedBalances[_excluded[i]] > rSupply || _balances[_excluded[i]] > tSupply) return (_reflectedSupply, TOTAL_SUPPLY);
            rSupply = rSupply.sub(_reflectedBalances[_excluded[i]]);
            tSupply = tSupply.sub(_balances[_excluded[i]]);
        }

        if (tSupply == 0 || rSupply < _reflectedSupply.div(TOTAL_SUPPLY)) return (_reflectedSupply, TOTAL_SUPPLY);
        return (rSupply, tSupply);
    }
    
    /**
     * @dev Hook that is called before any transfer of tokens.
     */
    function _beforeTokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) internal virtual;
    
    /**
     * @dev Returns the total sum of fees to be processed in each transaction. 
     * 
     * To separate concerns this contract (class) will take care of ONLY handling RFI, i.e. 
     * changing the rates and updating the holder's balance (via `_redistribute`). 
     * It is the responsibility of the dev/user to handle all other fees and taxes 
     * in the appropriate contracts (classes).
     */ 
    function _getSumOfFees() internal view virtual returns (uint256);

    /**
     * @dev A delegate which should return true if the given address is the V2 Pair and false otherwise
     */
    function _isV2Pair(address account) internal view virtual returns(bool);

    function _redistribute(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) internal {
        uint256 tFee = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rFee = tFee.mul(currentRate);

        _reflectedSupply = _reflectedSupply.sub(rFee);
        _addFeeCollectedAmount(index, tFee);
    }

    /**
     * @dev Hook that is called before the `Transfer` event is emitted if fees are enabled for the transfer
     */
    function _takeTransactionFees(uint256 amount, uint256 currentRate) internal virtual;
}

abstract contract Liquifier is Ownable, Manageable {

    using SafeMath for uint256;

    uint256 private withdrawableBalance;

    IUniswapV2Router internal _router = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public _pair;
    
    bool private inSwapAndLiquify;
    bool private swapAndLiquifyEnabled = true;

    uint256 private maxTransactionAmount;
    uint256 private numberOfTokensToSwapToLiquidity;

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    event RouterSet(address indexed router);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event LiquidityAdded(uint256 tokenAmountSent, uint256 ethAmountSent, uint256 liquidity);

    receive() external payable {}

    function initializeLiquiditySwapper(uint256 maxTx, uint256 liquifyAmount) internal {
        _pair = IUniswapV2Factory(_router.factory()).createPair(address(this), _router.WETH());
        maxTransactionAmount = maxTx;
        numberOfTokensToSwapToLiquidity = liquifyAmount;
    }

    /**
     * NOTE: passing the `contractTokenBalance` here is preferred to creating `balanceOfDelegate`
     */
    function liquify(uint256 contractTokenBalance, address sender) internal {

        if (contractTokenBalance >= maxTransactionAmount) contractTokenBalance = maxTransactionAmount;
        
        bool isOverRequiredTokenBalance = ( contractTokenBalance >= numberOfTokensToSwapToLiquidity );
        
        /**
         * - first check if the contract has collected enough tokens to swap and liquify
         * - then check swap and liquify is enabled
         * - then make sure not to get caught in a circular liquidity event
         * - finally, don't swap & liquify if the sender is the uniswap pair
         */
        if ( isOverRequiredTokenBalance && swapAndLiquifyEnabled && !inSwapAndLiquify && (sender != _pair) ){
            // TODO check if the `(sender != _pair)` is necessary because that basically
            // stops swap and liquify for all "buy" transactions
            _swapAndLiquify(contractTokenBalance);            
        }

    }
    
    function _swapAndLiquify(uint256 amount) private lockTheSwap {
        
        // split the contract balance into halves
        uint256 half = amount.div(2);
        uint256 otherHalf = amount.sub(half);
        
        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;
        
        // swap tokens for ETH
        _swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        _addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }
    
    function _swapTokensForEth(uint256 tokenAmount) internal {
        
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _router.WETH();

        _approveDelegate(address(this), address(_router), tokenAmount);

        // make the swap
        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    
    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approveDelegate(address(this), address(_router), tokenAmount);

        // add tahe liquidity
        (uint256 tokenAmountSent, uint256 ethAmountSent, uint256 liquidity) = _router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );

        // fix the forever locked BNBs as per the certik's audit
        /**
         * The swapAndLiquify function converts half of the contractTokenBalance SafeMoon tokens to BNB. 
         * For every swapAndLiquify function call, a small amount of BNB remains in the contract. 
         * This amount grows over time with the swapAndLiquify function being called throughout the life 
         * of the contract. The Safemoon contract does not contain a method to withdraw these funds, 
         * and the BNB will be locked in the Safemoon contract forever.
         */
        withdrawableBalance = address(this).balance;
        emit LiquidityAdded(tokenAmountSent, ethAmountSent, liquidity);
    }
    
    function setSwapAndLiquifyEnabled(bool enabled) external onlyManager {
        swapAndLiquifyEnabled = enabled;
        emit SwapAndLiquifyEnabledUpdated(swapAndLiquifyEnabled);
    }

    function withdrawLockedEth(address payable recipient) external onlyManager(){
        require(recipient != address(0), "Cannot withdraw the ETH balance to the zero address");
        require(withdrawableBalance > 0, "The ETH balance must be greater than 0");

        // prevent re-entrancy attacks
        uint256 amount = withdrawableBalance;
        withdrawableBalance = 0;
        recipient.transfer(amount);
    }

    /**
     * @dev Use this delegate instead of having (unnecessarily) extend `CokenRFI` to gained access 
     * to the `_approve` function.
     */
    function _approveDelegate(address owner, address spender, uint256 amount) internal virtual;

}

contract COKEN is CokenRFI, Liquifier {
    
    using SafeMath for uint256;

    // constructor(string memory _name, string memory _symbol, uint8 _decimals){
    constructor(){

        _approve(owner(),address(_router), ~uint256(0));
        initializeLiquiditySwapper(maxTransactionAmount, numberOfTokensToSwapToLiquidity);

        // exclude the pair address from rewards - we don't want to redistribute
        // tx fees to these two; redistribution is only for holders, dah!
        _exclude(_pair);
        _exclude(burnAddress);
    }
    
    function _isV2Pair(address account) internal view override returns(bool){
        return (account == _pair);
    }

    function _getSumOfFees() internal view override returns (uint256){ 
        return sumOfFees; 
    }
    
    // function _beforeTokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) internal override {
    function _beforeTokenTransfer(address sender, address , uint256 , bool ) internal override {
        if ( !isInPresale ){
            uint256 contractTokenBalance = balanceOf(address(this));
            liquify( contractTokenBalance, sender );
        }
    }

    function _takeTransactionFees(uint256 amount, uint256 currentRate) internal override {
        
        if( isInPresale ){ return; }

        uint256 feesCount = _getFeesCount();
        for (uint256 index = 0; index < feesCount; index++ ){
            (FeeType name, uint256 value, address recipient,) = _getFee(index);
            // no need to check value < 0 as the value is uint (i.e. from 0 to 2^256-1)
            if ( value == 0 ) continue;

            if ( name == FeeType.Rfi ){
                _redistribute( amount, currentRate, value, index );
            }

            else if ( name == FeeType.ExternalToETH){
                _takeFeeToETH( amount, value, recipient);
            }

            else {
                _takeFee( amount, currentRate, value, recipient, index );
            }
        }
    }

    function _burn(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) private {
        uint256 tBurn = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rBurn = tBurn.mul(currentRate);

        _burnTokens(address(this), tBurn, rBurn);
        _addFeeCollectedAmount(index, tBurn);
    }

    function _takeFee(uint256 amount, uint256 currentRate, uint256 fee, address recipient, uint256 index) private {

        uint256 tAmount = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rAmount = tAmount.mul(currentRate);

        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rAmount);
        if(_isExcludedFromRewards[recipient])
            _balances[recipient] = _balances[recipient].add(tAmount);

        _addFeeCollectedAmount(index, tAmount);
    }
    
    /**
     * @dev When implemented this will convert the fee amount of tokens into ETH/BNB
     * and send to the recipient's wallet. Note that this reduces liquidity so it 
     * might be a good idea to add a % into the liquidity fee for % you take our through
     * this method (just a suggestions)
     */
    function _takeFeeToETH(uint256 amount, uint256 fee, address recipient) private {
        uint256 initialBalance = address(this).balance;
        uint256 _fee = amount.mul(fee).div(FEES_DIVISOR);
        _swapTokensForEth(_fee);
        uint256 newBalance = address(this).balance.sub(initialBalance);
        payable(recipient).transfer(newBalance);
    }

    function _approveDelegate(address owner, address spender, uint256 amount) internal override {
        _approve(owner, spender, amount);
    }
}

Contract Security Audit

Contract ABI

API
[{"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":false,"internalType":"uint256","name":"tokenAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousManager","type":"address"},{"indexed":true,"internalType":"address","name":"newManager","type":"address"}],"name":"ManagementTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"RouterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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"},{"inputs":[],"name":"_pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","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":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPreseableEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":"newManager","type":"address"}],"name":"transferManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdrawLockedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526012600a62000014919062001564565b64e8d4a51000620000269190620016a1565b600019620000359190620017d6565b60001962000044919062001702565b60045573608d654192b57c1a1c56731e2618eb52c37326ba600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507328d00bbf1739788bfbffce75b61d752fb142bc6a600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550640299792458600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601260156101000a81548160ff021916908315150217905550348015620001b457600080fd5b506000620001c76200062660201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000620002776200062660201b60201c565b905080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8560405160405180910390a350620003266200062e60201b60201c565b600454600a60006200033d620006c860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600d600062000391620006c860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200045a6200044e620006c860201b60201c565b620006f160201b60201c565b6200046b30620006f160201b60201c565b6200047b620006c860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6012600a620004da919062001564565b64e8d4a51000620004ec9190620016a1565b604051620004fb919062001446565b60405180910390a36200054962000517620006c860201b60201c565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000196200088c60201b60201c565b620005ba60646012600a6200055f919062001564565b64e8d4a51000620005719190620016a1565b6200057d9190620014d1565b6103e86012600a62000590919062001564565b64e8d4a51000620005a29190620016a1565b620005ae9190620014d1565b62000a5f60201b60201c565b620005ed601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620006f160201b60201c565b62000620600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620006f160201b60201c565b62001980565b600033905090565b62000643600360283062000c8a60201b60201c565b620006586002603c3062000c8a60201b60201c565b6200068f60056014600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000c8a60201b60201c565b620006c660056014600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000c8a60201b60201c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115620007ce576200078a600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000dfa60201b60201c565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620008ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008f69062001424565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000972576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009699062001402565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000a52919062001446565b60405180910390a3505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801562000ac857600080fd5b505afa15801562000add573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b039190620012f0565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801562000b8857600080fd5b505afa15801562000b9d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc39190620012f0565b6040518363ffffffff1660e01b815260040162000be2929190620013b3565b602060405180830381600087803b15801562000bfd57600080fd5b505af115801562000c12573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c389190620012f0565b601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601381905550806014819055505050565b6008604051806080016040528085600581111562000cd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548160ff0219169083600581111562000d78577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301555050816009600082825462000dee919062001474565b92505081905550505050565b600060045482111562000e44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e3b90620013e0565b60405180910390fd5b600062000e5662000e7a60201b60201c565b905062000e72818462000eb460201b62001b9c1790919060201c565b915050919050565b600080600062000e8f62000ecc60201b60201c565b9150915062000ead818362000eb460201b62001b9c1790919060201c565b9250505090565b6000818362000ec49190620014d1565b905092915050565b6000806000600454905060006012600a62000ee8919062001564565b64e8d4a5100062000efa9190620016a1565b905060005b600f80549050811015620012315782600a6000600f848154811062000f4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118062001063575081600b6000600f848154811062000ffb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156200109b576004546012600a6200107c919062001564565b64e8d4a510006200108e9190620016a1565b94509450505050620012bd565b62001159600a6000600f8481548110620010de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484620012c160201b62001bb21790919060201c565b925062001219600b6000600f84815481106200119e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483620012c160201b62001bb21790919060201c565b91508080620012289062001788565b91505062000eff565b5060008114806200127d57506200127a6012600a62001251919062001564565b64e8d4a51000620012639190620016a1565b60045462000eb460201b62001b9c1790919060201c565b82105b15620012b4576004546012600a62001296919062001564565b64e8d4a51000620012a89190620016a1565b935093505050620012bd565b81819350935050505b9091565b60008183620012d1919062001702565b905092915050565b600081519050620012ea8162001966565b92915050565b6000602082840312156200130357600080fd5b60006200131384828501620012d9565b91505092915050565b62001327816200173d565b82525050565b60006200133c602a8362001463565b9150620013498262001879565b604082019050919050565b60006200136360258362001463565b91506200137082620018c8565b604082019050919050565b60006200138a60278362001463565b9150620013978262001917565b604082019050919050565b620013ad8162001771565b82525050565b6000604082019050620013ca60008301856200131c565b620013d960208301846200131c565b9392505050565b60006020820190508181036000830152620013fb816200132d565b9050919050565b600060208201905081810360008301526200141d8162001354565b9050919050565b600060208201905081810360008301526200143f816200137b565b9050919050565b60006020820190506200145d6000830184620013a2565b92915050565b600082825260208201905092915050565b6000620014818262001771565b91506200148e8362001771565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620014c657620014c56200180e565b5b828201905092915050565b6000620014de8262001771565b9150620014eb8362001771565b925082620014fe57620014fd6200183d565b5b828204905092915050565b6000808291508390505b60018511156200155b578086048111156200153357620015326200180e565b5b6001851615620015435780820291505b808102905062001553856200186c565b945062001513565b94509492505050565b6000620015718262001771565b91506200157e836200177b565b9250620015ad7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620015b5565b905092915050565b600082620015c757600190506200169a565b81620015d757600090506200169a565b8160018114620015f05760028114620015fb5762001631565b60019150506200169a565b60ff84111562001610576200160f6200180e565b5b8360020a9150848211156200162a57620016296200180e565b5b506200169a565b5060208310610133831016604e8410600b84101617156200166b5782820a9050838111156200166557620016646200180e565b5b6200169a565b6200167a848484600162001509565b925090508184048111156200169457620016936200180e565b5b81810290505b9392505050565b6000620016ae8262001771565b9150620016bb8362001771565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620016f757620016f66200180e565b5b828202905092915050565b60006200170f8262001771565b91506200171c8362001771565b9250828210156200173257620017316200180e565b5b828203905092915050565b60006200174a8262001751565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000620017958262001771565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620017cb57620017ca6200180e565b5b600182019050919050565b6000620017e38262001771565b9150620017f08362001771565b9250826200180357620018026200183d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008160011c9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a20617070726f766520746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a20617070726f76652066726f6d20746865207a65726f2060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b62001971816200173d565b81146200197d57600080fd5b50565b61514a80620019906000396000f3fe6080604052600436106101a05760003560e01c806374778cdc116100ec578063b51449bb1161008a578063dd46706411610064578063dd467064146105fb578063dd62ed3e14610624578063e4edf85214610661578063f2fde38b1461068a576101a7565b8063b51449bb1461057e578063b7671a0d146105a9578063c49b9a80146105d2576101a7565b806395d89b41116100c657806395d89b41146104c2578063a457c2d7146104ed578063a69df4b51461052a578063a9059cbb14610541576101a7565b806374778cdc1461043157806388f820201461045a5780638da5cb5b14610497576101a7565b806342966c68116101595780635342acb4116101335780635342acb414610375578063602bc62b146103b257806370a08231146103dd578063715018a61461041a576101a7565b806342966c68146102e45780634549b0391461030d578063481c6a751461034a576101a7565b806306fdde03146101ac578063095ea7b3146101d757806318160ddd1461021457806323b872dd1461023f578063313ce5671461027c57806339509351146102a7576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101c16106b3565b6040516101ce919061428d565b60405180910390f35b3480156101e357600080fd5b506101fe60048036038101906101f99190613cf5565b6106f0565b60405161020b9190614272565b60405180910390f35b34801561022057600080fd5b5061022961070e565b604051610236919061454f565b60405180910390f35b34801561024b57600080fd5b5061026660048036038101906102619190613ca6565b610733565b6040516102739190614272565b60405180910390f35b34801561028857600080fd5b5061029161080c565b60405161029e91906145fb565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613cf5565b610815565b6040516102db9190614272565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613d5a565b6108c8565b005b34801561031957600080fd5b50610334600480360381019061032f9190613d83565b610bd1565b604051610341919061454f565b60405180910390f35b34801561035657600080fd5b5061035f610c78565b60405161036c91906141f6565b60405180910390f35b34801561038157600080fd5b5061039c60048036038101906103979190613bef565b610ca2565b6040516103a99190614272565b60405180910390f35b3480156103be57600080fd5b506103c7610cf8565b6040516103d4919061454f565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff9190613bef565b610d02565b604051610411919061454f565b60405180910390f35b34801561042657600080fd5b5061042f610ded565b005b34801561043d57600080fd5b5061045860048036038101906104539190613d31565b610f40565b005b34801561046657600080fd5b50610481600480360381019061047c9190613bef565b610ff4565b60405161048e9190614272565b60405180910390f35b3480156104a357600080fd5b506104ac61104a565b6040516104b991906141f6565b60405180910390f35b3480156104ce57600080fd5b506104d7611073565b6040516104e4919061428d565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613cf5565b6110b0565b6040516105219190614272565b60405180910390f35b34801561053657600080fd5b5061053f61117d565b005b34801561054d57600080fd5b5061056860048036038101906105639190613cf5565b611351565b6040516105759190614272565b60405180910390f35b34801561058a57600080fd5b5061059361136f565b6040516105a091906141f6565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613c41565b611395565b005b3480156105de57600080fd5b506105f960048036038101906105f49190613d31565b61153b565b005b34801561060757600080fd5b50610622600480360381019061061d9190613d5a565b611635565b005b34801561063057600080fd5b5061064b60048036038101906106469190613c6a565b6117fc565b604051610658919061454f565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613bef565b611883565b005b34801561069657600080fd5b506106b160048036038101906106ac9190613bef565b6119da565b005b60606040518060400160405280600781526020017f46656420496e7500000000000000000000000000000000000000000000000000815250905090565b60006107046106fd611bc8565b8484611bd0565b6001905092915050565b60006012600a61071e9190614745565b64e8d4a5100061072e9190614863565b905090565b6000610740848484611d9b565b6108018461074c611bc8565b6107fc856040518060600160405280602881526020016150c860289139600c60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006107b2611bc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121a39092919063ffffffff16565b611bd0565b600190509392505050565b60006012905090565b60006108be610822611bc8565b846108b985600c6000610833611bc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b611bd0565b6001905092915050565b60006108d2611bc8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b906142ef565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc9061436f565b60405180910390fd5b60006109e082610d02565b905082811015610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c9061450f565b60405180910390fd5b6000610a41610a3261220e565b8561223990919063ffffffff16565b9050610a9581600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb290919063ffffffff16565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610bc057610b7c84600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb290919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610bcb83858361224f565b50505050565b60006012600a610be19190614745565b64e8d4a51000610bf19190614863565b831115610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a906143cf565b60405180910390fd5b81610c54576000610c45846000612502565b50505050905080915050610c72565b6000610c6784610c626125bf565b612502565b505050915050809150505b92915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600254905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d9d57600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610de8565b610de5600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125c9565b90505b919050565b610df5611bc8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e799061442f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610f48611bc8565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce906144cf565b60405180910390fd5b80600360146101000a81548160ff02191690831515021790555050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600581526020017f434f4b454e000000000000000000000000000000000000000000000000000000815250905090565b60006111736110bd611bc8565b8461116e856040518060600160405280602581526020016150f060259139600c60006110e7611bc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121a39092919063ffffffff16565b611bd0565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061430f565b60405180910390fd5b6002544211611251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611248906142af565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061136561135e611bc8565b8484611d9b565b6001905092915050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61139d611bc8565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611423906144cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561149c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114939061440f565b60405180910390fd5b6000601054116114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d89061446f565b60405180910390fd5b6000601054905060006010819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611536573d6000803e3d6000fd5b505050565b611543611bc8565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c9906144cf565b60405180910390fd5b80601260156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159601260159054906101000a900460ff1660405161162a9190614272565b60405180910390a150565b61163d611bc8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c19061442f565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508042611778919061466b565b600281905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61188b611bc8565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611911906144cf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8560405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119e2611bc8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a669061442f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad69061434f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008183611baa91906146c1565b905092915050565b60008183611bc091906148bd565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c379061452f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca79061438f565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d8e919061454f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e02906144af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e72906143af565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f03906142cf565b60405180910390fd5b60008111611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f469061444f565b60405180910390fd5b600060019050600360149054906101000a900460ff1615611f7357600090506120da565b60646012600a611f839190614745565b64e8d4a51000611f939190614863565b611f9d91906146c1565b82118015611fb15750611faf84612637565b155b8015611fc35750611fc183612676565b155b15612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa906143ef565b60405180910390fd5b60006012600a6120139190614745565b64e8d4a510006120239190614863565b118015612036575061203484612637565b155b8015612048575061204683612676565b155b801561205a57506120588361270d565b155b156120d957600061206a84610d02565b90506012600a61207a9190614745565b64e8d4a5100061208a9190614863565b8382612096919061466b565b11156120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce9061448f565b60405180910390fd5b505b5b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061217b5750600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561218557600090505b61219184848484612767565b61219d8484848461279a565b50505050565b60008383111582906121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e2919061428d565b60405180910390fd5b5082840390509392505050565b60008183612206919061466b565b905092915050565b600080600061221b612b42565b915091506122328183611b9c90919063ffffffff16565b9250505090565b600081836122479190614863565b905092915050565b6122c381600a6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600a6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156124765761241082600b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124f5919061454f565b60405180910390a3505050565b6000806000806000806125366103e861ffff16612528898b61223990919063ffffffff16565b611b9c90919063ffffffff16565b9050600061254d828a611bb290919063ffffffff16565b9050600061255961220e565b90506000612570828c61223990919063ffffffff16565b90506000612587838661223990919063ffffffff16565b9050600061259e8284611bb290919063ffffffff16565b905082818e87879a509a509a509a509a505050505050509295509295909350565b6000600954905090565b6000600454821115612610576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126079061432f565b60405180910390fd5b600061261a61220e565b905061262f8184611b9c90919063ffffffff16565b915050919050565b600061264161104a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600061268061104a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806127065750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600360149054906101000a900460ff1661279457600061278630610d02565b90506127928186612f04565b505b50505050565b60006127a46125bf565b9050816127b057600090505b60008060008060006127c28887612502565b9450945094509450945061281e85600a60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb290919063ffffffff16565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506128b384600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156129de5761299a83600b60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb290919063ffffffff16565b600b60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ac657612a8282600b60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b612ad1888288612fbd565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b2e919061454f565b60405180910390a350505050505050505050565b6000806000600454905060006012600a612b5c9190614745565b64e8d4a51000612b6c9190614863565b905060005b600f80549050811015612e865782600a6000600f8481548110612bbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180612cd1575081600b6000600f8481548110612c69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15612d03576004546012600a612ce79190614745565b64e8d4a51000612cf79190614863565b94509450505050612f00565b612db9600a6000600f8481548110612d44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484611bb290919063ffffffff16565b9250612e71600b6000600f8481548110612dfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611bb290919063ffffffff16565b91508080612e7e9061499d565b915050612b71565b506000811480612ec65750612ec36012600a612ea29190614745565b64e8d4a51000612eb29190614863565b600454611b9c90919063ffffffff16565b82105b15612ef7576004546012600a612edc9190614745565b64e8d4a51000612eec9190614863565b935093505050612f00565b81819350935050505b9091565b6013548210612f135760135491505b60006014548310159050808015612f365750601260159054906101000a900460ff165b8015612f4f5750601260149054906101000a900460ff16155b8015612fa95750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612fb857612fb783612fef565b5b505050565b600081118015612fda5750600360149054906101000a900460ff16155b15612fea57612fe983836130c5565b5b505050565b6001601260146101000a81548160ff0219169083151502179055506000613020600283611b9c90919063ffffffff16565b905060006130378284611bb290919063ffffffff16565b905060004790506130478361325b565b600061305c8247611bb290919063ffffffff16565b9050613068838261351f565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161309b939291906145c4565b60405180910390a1505050506000601260146101000a81548160ff02191690831515021790555050565b600360149054906101000a900460ff16156130df57613257565b60006130e9613660565b905060005b818110156132545760008060006131048461366d565b50925092509250600082141561311c57505050613241565b60036005811115613156577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b83600581111561318f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156131a6576131a1878784876137a0565b61323d565b6005808111156131df577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613218577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561322e57613229878383613813565b61323c565b61323b87878484886138b6565b5b5b5050505b808061324c9061499d565b9150506130ee565b50505b5050565b6000600267ffffffffffffffff81111561329e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156132cc5781602001602082028036833780820191505090505b509050308160008151811061330a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ac57600080fd5b505afa1580156133c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e49190613c18565b8160018151811061341e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061348530601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613a8c565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016134e995949392919061456a565b600060405180830381600087803b15801561350357600080fd5b505af1158015613517573d6000803e3d6000fd5b505050505050565b61354c30601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613a8c565b6000806000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71985308860008061359d61104a565b426040518863ffffffff1660e01b81526004016135bf96959493929190614211565b6060604051808303818588803b1580156135d857600080fd5b505af11580156135ec573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906136119190613dbf565b925092509250476010819055507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be3838383604051613651939291906145c4565b60405180910390a15050505050565b6000600880549050905090565b600080600080600061367e86613a9c565b6040518060800160405290816000820160009054906101000a900460ff1660058111156136d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581111561370c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001518160200151826040015183606001519450945094509450509193509193565b60006137cd6103e861ffff166137bf858861223990919063ffffffff16565b611b9c90919063ffffffff16565b905060006137e4858361223990919063ffffffff16565b90506137fb81600454611bb290919063ffffffff16565b60048190555061380b8383613b40565b505050505050565b600047905060006138456103e861ffff16613837868861223990919063ffffffff16565b611b9c90919063ffffffff16565b90506138508161325b565b60006138658347611bb290919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156138ad573d6000803e3d6000fd5b50505050505050565b60006138e36103e861ffff166138d5868961223990919063ffffffff16565b611b9c90919063ffffffff16565b905060006138fa868361223990919063ffffffff16565b905061394e81600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613a7957613a3582600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b613a838383613b40565b50505050505050565b613a97838383611bd0565b505050565b6000808210158015613ab2575060088054905082105b613af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae8906144ef565b60405180910390fd5b60088281548110613b2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402019050919050565b6000613b4b83613a9c565b9050613b648282600301546121f890919063ffffffff16565b8160030181905550505050565b600081359050613b808161506b565b92915050565b600081519050613b958161506b565b92915050565b600081359050613baa81615082565b92915050565b600081359050613bbf81615099565b92915050565b600081359050613bd4816150b0565b92915050565b600081519050613be9816150b0565b92915050565b600060208284031215613c0157600080fd5b6000613c0f84828501613b71565b91505092915050565b600060208284031215613c2a57600080fd5b6000613c3884828501613b86565b91505092915050565b600060208284031215613c5357600080fd5b6000613c6184828501613b9b565b91505092915050565b60008060408385031215613c7d57600080fd5b6000613c8b85828601613b71565b9250506020613c9c85828601613b71565b9150509250929050565b600080600060608486031215613cbb57600080fd5b6000613cc986828701613b71565b9350506020613cda86828701613b71565b9250506040613ceb86828701613bc5565b9150509250925092565b60008060408385031215613d0857600080fd5b6000613d1685828601613b71565b9250506020613d2785828601613bc5565b9150509250929050565b600060208284031215613d4357600080fd5b6000613d5184828501613bb0565b91505092915050565b600060208284031215613d6c57600080fd5b6000613d7a84828501613bc5565b91505092915050565b60008060408385031215613d9657600080fd5b6000613da485828601613bc5565b9250506020613db585828601613bb0565b9150509250929050565b600080600060608486031215613dd457600080fd5b6000613de286828701613bda565b9350506020613df386828701613bda565b9250506040613e0486828701613bda565b9150509250925092565b6000613e1a8383613e26565b60208301905092915050565b613e2f816148f1565b82525050565b613e3e816148f1565b82525050565b6000613e4f82614626565b613e598185614649565b9350613e6483614616565b8060005b83811015613e95578151613e7c8882613e0e565b9750613e878361463c565b925050600181019050613e68565b5085935050505092915050565b613eab81614915565b82525050565b613eba81614958565b82525050565b6000613ecb82614631565b613ed5818561465a565b9350613ee581856020860161496a565b613eee81614a44565b840191505092915050565b6000613f06601c8361465a565b9150613f1182614a62565b602082019050919050565b6000613f2960288361465a565b9150613f3482614a8b565b604082019050919050565b6000613f4c60248361465a565b9150613f5782614ada565b604082019050919050565b6000613f6f602c8361465a565b9150613f7a82614b29565b604082019050919050565b6000613f92602a8361465a565b9150613f9d82614b78565b604082019050919050565b6000613fb560268361465a565b9150613fc082614bc7565b604082019050919050565b6000613fd860248361465a565b9150613fe382614c16565b604082019050919050565b6000613ffb60258361465a565b915061400682614c65565b604082019050919050565b600061401e60268361465a565b915061402982614cb4565b604082019050919050565b6000614041601f8361465a565b915061404c82614d03565b602082019050919050565b600061406460288361465a565b915061406f82614d2c565b604082019050919050565b600061408760338361465a565b915061409282614d7b565b604082019050919050565b60006140aa60208361465a565b91506140b582614dca565b602082019050919050565b60006140cd60298361465a565b91506140d882614df3565b604082019050919050565b60006140f060268361465a565b91506140fb82614e42565b604082019050919050565b6000614113602d8361465a565b915061411e82614e91565b604082019050919050565b600061413660288361465a565b915061414182614ee0565b604082019050919050565b600061415960258361465a565b915061416482614f2f565b604082019050919050565b600061417c60338361465a565b915061418782614f7e565b604082019050919050565b600061419f60258361465a565b91506141aa82614fcd565b604082019050919050565b60006141c260278361465a565b91506141cd8261501c565b604082019050919050565b6141e181614941565b82525050565b6141f08161494b565b82525050565b600060208201905061420b6000830184613e35565b92915050565b600060c0820190506142266000830189613e35565b61423360208301886141d8565b6142406040830187613eb1565b61424d6060830186613eb1565b61425a6080830185613e35565b61426760a08301846141d8565b979650505050505050565b60006020820190506142876000830184613ea2565b92915050565b600060208201905081810360008301526142a78184613ec0565b905092915050565b600060208201905081810360008301526142c881613ef9565b9050919050565b600060208201905081810360008301526142e881613f1c565b9050919050565b6000602082019050818103600083015261430881613f3f565b9050919050565b6000602082019050818103600083015261432881613f62565b9050919050565b6000602082019050818103600083015261434881613f85565b9050919050565b6000602082019050818103600083015261436881613fa8565b9050919050565b6000602082019050818103600083015261438881613fcb565b9050919050565b600060208201905081810360008301526143a881613fee565b9050919050565b600060208201905081810360008301526143c881614011565b9050919050565b600060208201905081810360008301526143e881614034565b9050919050565b6000602082019050818103600083015261440881614057565b9050919050565b600060208201905081810360008301526144288161407a565b9050919050565b600060208201905081810360008301526144488161409d565b9050919050565b60006020820190508181036000830152614468816140c0565b9050919050565b60006020820190508181036000830152614488816140e3565b9050919050565b600060208201905081810360008301526144a881614106565b9050919050565b600060208201905081810360008301526144c881614129565b9050919050565b600060208201905081810360008301526144e88161414c565b9050919050565b600060208201905081810360008301526145088161416f565b9050919050565b6000602082019050818103600083015261452881614192565b9050919050565b60006020820190508181036000830152614548816141b5565b9050919050565b600060208201905061456460008301846141d8565b92915050565b600060a08201905061457f60008301886141d8565b61458c6020830187613eb1565b818103604083015261459e8186613e44565b90506145ad6060830185613e35565b6145ba60808301846141d8565b9695505050505050565b60006060820190506145d960008301866141d8565b6145e660208301856141d8565b6145f360408301846141d8565b949350505050565b600060208201905061461060008301846141e7565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061467682614941565b915061468183614941565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146b6576146b56149e6565b5b828201905092915050565b60006146cc82614941565b91506146d783614941565b9250826146e7576146e6614a15565b5b828204905092915050565b6000808291508390505b600185111561473c57808604811115614718576147176149e6565b5b60018516156147275780820291505b808102905061473585614a55565b94506146fc565b94509492505050565b600061475082614941565b915061475b8361494b565b92506147887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614790565b905092915050565b6000826147a0576001905061485c565b816147ae576000905061485c565b81600181146147c457600281146147ce576147fd565b600191505061485c565b60ff8411156147e0576147df6149e6565b5b8360020a9150848211156147f7576147f66149e6565b5b5061485c565b5060208310610133831016604e8410600b84101617156148325782820a90508381111561482d5761482c6149e6565b5b61485c565b61483f84848460016146f2565b92509050818404811115614856576148556149e6565b5b81810290505b9392505050565b600061486e82614941565b915061487983614941565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148b2576148b16149e6565b5b828202905092915050565b60006148c882614941565b91506148d383614941565b9250828210156148e6576148e56149e6565b5b828203905092915050565b60006148fc82614921565b9050919050565b600061490e82614921565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061496382614941565b9050919050565b60005b8381101561498857808201518184015260208101905061496d565b83811115614997576000848401525b50505050565b60006149a882614941565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149db576149da6149e6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f54686520636f6e7472616374206973207374696c6c206c6f636b656400000000600082015250565b7f436f6b656e5246493a207472616e736665722066726f6d20746865206275726e60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a206275726e2066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c79207468652070726576696f7573206f776e65722063616e20756e6c6f60008201527f636b206f6e776572736869700000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a206275726e2066726f6d20746865206275726e2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a20617070726f766520746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a207472616e7366657220746f20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420776974686472617720746865204554482062616c616e63652060008201527f746f20746865207a65726f206164647265737300000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f546865204554482062616c616e6365206d75737420626520677265617465722060008201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b7f4e65772062616c616e636520776f756c642065786365656420746865206d617860008201527f57616c6c657442616c616e636500000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a207472616e736665722066726f6d20746865207a65726f60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b7f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d6160008201527f6e61676572000000000000000000000000000000000000000000000000000000602082015250565b7f4665657353657474696e67732e5f6765744665655374727563743a204665652060008201527f696e646578206f7574206f6620626f756e647300000000000000000000000000602082015250565b7f436f6b656e5246493a206275726e20616d6f756e74206578636565647320626160008201527f6c616e6365000000000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a20617070726f76652066726f6d20746865207a65726f2060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b615074816148f1565b811461507f57600080fd5b50565b61508b81614903565b811461509657600080fd5b50565b6150a281614915565b81146150ad57600080fd5b50565b6150b981614941565b81146150c457600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220672236937ca7b5b03bb460c3d27708a3cc93572bdbeb53792484261b91e2223564736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101a05760003560e01c806374778cdc116100ec578063b51449bb1161008a578063dd46706411610064578063dd467064146105fb578063dd62ed3e14610624578063e4edf85214610661578063f2fde38b1461068a576101a7565b8063b51449bb1461057e578063b7671a0d146105a9578063c49b9a80146105d2576101a7565b806395d89b41116100c657806395d89b41146104c2578063a457c2d7146104ed578063a69df4b51461052a578063a9059cbb14610541576101a7565b806374778cdc1461043157806388f820201461045a5780638da5cb5b14610497576101a7565b806342966c68116101595780635342acb4116101335780635342acb414610375578063602bc62b146103b257806370a08231146103dd578063715018a61461041a576101a7565b806342966c68146102e45780634549b0391461030d578063481c6a751461034a576101a7565b806306fdde03146101ac578063095ea7b3146101d757806318160ddd1461021457806323b872dd1461023f578063313ce5671461027c57806339509351146102a7576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101c16106b3565b6040516101ce919061428d565b60405180910390f35b3480156101e357600080fd5b506101fe60048036038101906101f99190613cf5565b6106f0565b60405161020b9190614272565b60405180910390f35b34801561022057600080fd5b5061022961070e565b604051610236919061454f565b60405180910390f35b34801561024b57600080fd5b5061026660048036038101906102619190613ca6565b610733565b6040516102739190614272565b60405180910390f35b34801561028857600080fd5b5061029161080c565b60405161029e91906145fb565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613cf5565b610815565b6040516102db9190614272565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613d5a565b6108c8565b005b34801561031957600080fd5b50610334600480360381019061032f9190613d83565b610bd1565b604051610341919061454f565b60405180910390f35b34801561035657600080fd5b5061035f610c78565b60405161036c91906141f6565b60405180910390f35b34801561038157600080fd5b5061039c60048036038101906103979190613bef565b610ca2565b6040516103a99190614272565b60405180910390f35b3480156103be57600080fd5b506103c7610cf8565b6040516103d4919061454f565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff9190613bef565b610d02565b604051610411919061454f565b60405180910390f35b34801561042657600080fd5b5061042f610ded565b005b34801561043d57600080fd5b5061045860048036038101906104539190613d31565b610f40565b005b34801561046657600080fd5b50610481600480360381019061047c9190613bef565b610ff4565b60405161048e9190614272565b60405180910390f35b3480156104a357600080fd5b506104ac61104a565b6040516104b991906141f6565b60405180910390f35b3480156104ce57600080fd5b506104d7611073565b6040516104e4919061428d565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613cf5565b6110b0565b6040516105219190614272565b60405180910390f35b34801561053657600080fd5b5061053f61117d565b005b34801561054d57600080fd5b5061056860048036038101906105639190613cf5565b611351565b6040516105759190614272565b60405180910390f35b34801561058a57600080fd5b5061059361136f565b6040516105a091906141f6565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613c41565b611395565b005b3480156105de57600080fd5b506105f960048036038101906105f49190613d31565b61153b565b005b34801561060757600080fd5b50610622600480360381019061061d9190613d5a565b611635565b005b34801561063057600080fd5b5061064b60048036038101906106469190613c6a565b6117fc565b604051610658919061454f565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613bef565b611883565b005b34801561069657600080fd5b506106b160048036038101906106ac9190613bef565b6119da565b005b60606040518060400160405280600781526020017f46656420496e7500000000000000000000000000000000000000000000000000815250905090565b60006107046106fd611bc8565b8484611bd0565b6001905092915050565b60006012600a61071e9190614745565b64e8d4a5100061072e9190614863565b905090565b6000610740848484611d9b565b6108018461074c611bc8565b6107fc856040518060600160405280602881526020016150c860289139600c60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006107b2611bc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121a39092919063ffffffff16565b611bd0565b600190509392505050565b60006012905090565b60006108be610822611bc8565b846108b985600c6000610833611bc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b611bd0565b6001905092915050565b60006108d2611bc8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b906142ef565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc9061436f565b60405180910390fd5b60006109e082610d02565b905082811015610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c9061450f565b60405180910390fd5b6000610a41610a3261220e565b8561223990919063ffffffff16565b9050610a9581600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb290919063ffffffff16565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610bc057610b7c84600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb290919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610bcb83858361224f565b50505050565b60006012600a610be19190614745565b64e8d4a51000610bf19190614863565b831115610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a906143cf565b60405180910390fd5b81610c54576000610c45846000612502565b50505050905080915050610c72565b6000610c6784610c626125bf565b612502565b505050915050809150505b92915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600254905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d9d57600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610de8565b610de5600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125c9565b90505b919050565b610df5611bc8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e799061442f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610f48611bc8565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce906144cf565b60405180910390fd5b80600360146101000a81548160ff02191690831515021790555050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600581526020017f434f4b454e000000000000000000000000000000000000000000000000000000815250905090565b60006111736110bd611bc8565b8461116e856040518060600160405280602581526020016150f060259139600c60006110e7611bc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121a39092919063ffffffff16565b611bd0565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061430f565b60405180910390fd5b6002544211611251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611248906142af565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061136561135e611bc8565b8484611d9b565b6001905092915050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61139d611bc8565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611423906144cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561149c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114939061440f565b60405180910390fd5b6000601054116114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d89061446f565b60405180910390fd5b6000601054905060006010819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611536573d6000803e3d6000fd5b505050565b611543611bc8565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c9906144cf565b60405180910390fd5b80601260156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159601260159054906101000a900460ff1660405161162a9190614272565b60405180910390a150565b61163d611bc8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c19061442f565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508042611778919061466b565b600281905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61188b611bc8565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611911906144cf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8560405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119e2611bc8565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a669061442f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad69061434f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008183611baa91906146c1565b905092915050565b60008183611bc091906148bd565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c379061452f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca79061438f565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d8e919061454f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e02906144af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e72906143af565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f03906142cf565b60405180910390fd5b60008111611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f469061444f565b60405180910390fd5b600060019050600360149054906101000a900460ff1615611f7357600090506120da565b60646012600a611f839190614745565b64e8d4a51000611f939190614863565b611f9d91906146c1565b82118015611fb15750611faf84612637565b155b8015611fc35750611fc183612676565b155b15612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa906143ef565b60405180910390fd5b60006012600a6120139190614745565b64e8d4a510006120239190614863565b118015612036575061203484612637565b155b8015612048575061204683612676565b155b801561205a57506120588361270d565b155b156120d957600061206a84610d02565b90506012600a61207a9190614745565b64e8d4a5100061208a9190614863565b8382612096919061466b565b11156120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce9061448f565b60405180910390fd5b505b5b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061217b5750600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561218557600090505b61219184848484612767565b61219d8484848461279a565b50505050565b60008383111582906121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e2919061428d565b60405180910390fd5b5082840390509392505050565b60008183612206919061466b565b905092915050565b600080600061221b612b42565b915091506122328183611b9c90919063ffffffff16565b9250505090565b600081836122479190614863565b905092915050565b6122c381600a6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600a6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156124765761241082600b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124f5919061454f565b60405180910390a3505050565b6000806000806000806125366103e861ffff16612528898b61223990919063ffffffff16565b611b9c90919063ffffffff16565b9050600061254d828a611bb290919063ffffffff16565b9050600061255961220e565b90506000612570828c61223990919063ffffffff16565b90506000612587838661223990919063ffffffff16565b9050600061259e8284611bb290919063ffffffff16565b905082818e87879a509a509a509a509a505050505050509295509295909350565b6000600954905090565b6000600454821115612610576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126079061432f565b60405180910390fd5b600061261a61220e565b905061262f8184611b9c90919063ffffffff16565b915050919050565b600061264161104a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600061268061104a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806127065750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600360149054906101000a900460ff1661279457600061278630610d02565b90506127928186612f04565b505b50505050565b60006127a46125bf565b9050816127b057600090505b60008060008060006127c28887612502565b9450945094509450945061281e85600a60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb290919063ffffffff16565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506128b384600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156129de5761299a83600b60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb290919063ffffffff16565b600b60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ac657612a8282600b60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b612ad1888288612fbd565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b2e919061454f565b60405180910390a350505050505050505050565b6000806000600454905060006012600a612b5c9190614745565b64e8d4a51000612b6c9190614863565b905060005b600f80549050811015612e865782600a6000600f8481548110612bbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180612cd1575081600b6000600f8481548110612c69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15612d03576004546012600a612ce79190614745565b64e8d4a51000612cf79190614863565b94509450505050612f00565b612db9600a6000600f8481548110612d44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484611bb290919063ffffffff16565b9250612e71600b6000600f8481548110612dfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611bb290919063ffffffff16565b91508080612e7e9061499d565b915050612b71565b506000811480612ec65750612ec36012600a612ea29190614745565b64e8d4a51000612eb29190614863565b600454611b9c90919063ffffffff16565b82105b15612ef7576004546012600a612edc9190614745565b64e8d4a51000612eec9190614863565b935093505050612f00565b81819350935050505b9091565b6013548210612f135760135491505b60006014548310159050808015612f365750601260159054906101000a900460ff165b8015612f4f5750601260149054906101000a900460ff16155b8015612fa95750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612fb857612fb783612fef565b5b505050565b600081118015612fda5750600360149054906101000a900460ff16155b15612fea57612fe983836130c5565b5b505050565b6001601260146101000a81548160ff0219169083151502179055506000613020600283611b9c90919063ffffffff16565b905060006130378284611bb290919063ffffffff16565b905060004790506130478361325b565b600061305c8247611bb290919063ffffffff16565b9050613068838261351f565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161309b939291906145c4565b60405180910390a1505050506000601260146101000a81548160ff02191690831515021790555050565b600360149054906101000a900460ff16156130df57613257565b60006130e9613660565b905060005b818110156132545760008060006131048461366d565b50925092509250600082141561311c57505050613241565b60036005811115613156577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b83600581111561318f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156131a6576131a1878784876137a0565b61323d565b6005808111156131df577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613218577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561322e57613229878383613813565b61323c565b61323b87878484886138b6565b5b5b5050505b808061324c9061499d565b9150506130ee565b50505b5050565b6000600267ffffffffffffffff81111561329e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156132cc5781602001602082028036833780820191505090505b509050308160008151811061330a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ac57600080fd5b505afa1580156133c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e49190613c18565b8160018151811061341e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061348530601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613a8c565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016134e995949392919061456a565b600060405180830381600087803b15801561350357600080fd5b505af1158015613517573d6000803e3d6000fd5b505050505050565b61354c30601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613a8c565b6000806000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71985308860008061359d61104a565b426040518863ffffffff1660e01b81526004016135bf96959493929190614211565b6060604051808303818588803b1580156135d857600080fd5b505af11580156135ec573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906136119190613dbf565b925092509250476010819055507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be3838383604051613651939291906145c4565b60405180910390a15050505050565b6000600880549050905090565b600080600080600061367e86613a9c565b6040518060800160405290816000820160009054906101000a900460ff1660058111156136d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581111561370c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001518160200151826040015183606001519450945094509450509193509193565b60006137cd6103e861ffff166137bf858861223990919063ffffffff16565b611b9c90919063ffffffff16565b905060006137e4858361223990919063ffffffff16565b90506137fb81600454611bb290919063ffffffff16565b60048190555061380b8383613b40565b505050505050565b600047905060006138456103e861ffff16613837868861223990919063ffffffff16565b611b9c90919063ffffffff16565b90506138508161325b565b60006138658347611bb290919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156138ad573d6000803e3d6000fd5b50505050505050565b60006138e36103e861ffff166138d5868961223990919063ffffffff16565b611b9c90919063ffffffff16565b905060006138fa868361223990919063ffffffff16565b905061394e81600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613a7957613a3582600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121f890919063ffffffff16565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b613a838383613b40565b50505050505050565b613a97838383611bd0565b505050565b6000808210158015613ab2575060088054905082105b613af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae8906144ef565b60405180910390fd5b60088281548110613b2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402019050919050565b6000613b4b83613a9c565b9050613b648282600301546121f890919063ffffffff16565b8160030181905550505050565b600081359050613b808161506b565b92915050565b600081519050613b958161506b565b92915050565b600081359050613baa81615082565b92915050565b600081359050613bbf81615099565b92915050565b600081359050613bd4816150b0565b92915050565b600081519050613be9816150b0565b92915050565b600060208284031215613c0157600080fd5b6000613c0f84828501613b71565b91505092915050565b600060208284031215613c2a57600080fd5b6000613c3884828501613b86565b91505092915050565b600060208284031215613c5357600080fd5b6000613c6184828501613b9b565b91505092915050565b60008060408385031215613c7d57600080fd5b6000613c8b85828601613b71565b9250506020613c9c85828601613b71565b9150509250929050565b600080600060608486031215613cbb57600080fd5b6000613cc986828701613b71565b9350506020613cda86828701613b71565b9250506040613ceb86828701613bc5565b9150509250925092565b60008060408385031215613d0857600080fd5b6000613d1685828601613b71565b9250506020613d2785828601613bc5565b9150509250929050565b600060208284031215613d4357600080fd5b6000613d5184828501613bb0565b91505092915050565b600060208284031215613d6c57600080fd5b6000613d7a84828501613bc5565b91505092915050565b60008060408385031215613d9657600080fd5b6000613da485828601613bc5565b9250506020613db585828601613bb0565b9150509250929050565b600080600060608486031215613dd457600080fd5b6000613de286828701613bda565b9350506020613df386828701613bda565b9250506040613e0486828701613bda565b9150509250925092565b6000613e1a8383613e26565b60208301905092915050565b613e2f816148f1565b82525050565b613e3e816148f1565b82525050565b6000613e4f82614626565b613e598185614649565b9350613e6483614616565b8060005b83811015613e95578151613e7c8882613e0e565b9750613e878361463c565b925050600181019050613e68565b5085935050505092915050565b613eab81614915565b82525050565b613eba81614958565b82525050565b6000613ecb82614631565b613ed5818561465a565b9350613ee581856020860161496a565b613eee81614a44565b840191505092915050565b6000613f06601c8361465a565b9150613f1182614a62565b602082019050919050565b6000613f2960288361465a565b9150613f3482614a8b565b604082019050919050565b6000613f4c60248361465a565b9150613f5782614ada565b604082019050919050565b6000613f6f602c8361465a565b9150613f7a82614b29565b604082019050919050565b6000613f92602a8361465a565b9150613f9d82614b78565b604082019050919050565b6000613fb560268361465a565b9150613fc082614bc7565b604082019050919050565b6000613fd860248361465a565b9150613fe382614c16565b604082019050919050565b6000613ffb60258361465a565b915061400682614c65565b604082019050919050565b600061401e60268361465a565b915061402982614cb4565b604082019050919050565b6000614041601f8361465a565b915061404c82614d03565b602082019050919050565b600061406460288361465a565b915061406f82614d2c565b604082019050919050565b600061408760338361465a565b915061409282614d7b565b604082019050919050565b60006140aa60208361465a565b91506140b582614dca565b602082019050919050565b60006140cd60298361465a565b91506140d882614df3565b604082019050919050565b60006140f060268361465a565b91506140fb82614e42565b604082019050919050565b6000614113602d8361465a565b915061411e82614e91565b604082019050919050565b600061413660288361465a565b915061414182614ee0565b604082019050919050565b600061415960258361465a565b915061416482614f2f565b604082019050919050565b600061417c60338361465a565b915061418782614f7e565b604082019050919050565b600061419f60258361465a565b91506141aa82614fcd565b604082019050919050565b60006141c260278361465a565b91506141cd8261501c565b604082019050919050565b6141e181614941565b82525050565b6141f08161494b565b82525050565b600060208201905061420b6000830184613e35565b92915050565b600060c0820190506142266000830189613e35565b61423360208301886141d8565b6142406040830187613eb1565b61424d6060830186613eb1565b61425a6080830185613e35565b61426760a08301846141d8565b979650505050505050565b60006020820190506142876000830184613ea2565b92915050565b600060208201905081810360008301526142a78184613ec0565b905092915050565b600060208201905081810360008301526142c881613ef9565b9050919050565b600060208201905081810360008301526142e881613f1c565b9050919050565b6000602082019050818103600083015261430881613f3f565b9050919050565b6000602082019050818103600083015261432881613f62565b9050919050565b6000602082019050818103600083015261434881613f85565b9050919050565b6000602082019050818103600083015261436881613fa8565b9050919050565b6000602082019050818103600083015261438881613fcb565b9050919050565b600060208201905081810360008301526143a881613fee565b9050919050565b600060208201905081810360008301526143c881614011565b9050919050565b600060208201905081810360008301526143e881614034565b9050919050565b6000602082019050818103600083015261440881614057565b9050919050565b600060208201905081810360008301526144288161407a565b9050919050565b600060208201905081810360008301526144488161409d565b9050919050565b60006020820190508181036000830152614468816140c0565b9050919050565b60006020820190508181036000830152614488816140e3565b9050919050565b600060208201905081810360008301526144a881614106565b9050919050565b600060208201905081810360008301526144c881614129565b9050919050565b600060208201905081810360008301526144e88161414c565b9050919050565b600060208201905081810360008301526145088161416f565b9050919050565b6000602082019050818103600083015261452881614192565b9050919050565b60006020820190508181036000830152614548816141b5565b9050919050565b600060208201905061456460008301846141d8565b92915050565b600060a08201905061457f60008301886141d8565b61458c6020830187613eb1565b818103604083015261459e8186613e44565b90506145ad6060830185613e35565b6145ba60808301846141d8565b9695505050505050565b60006060820190506145d960008301866141d8565b6145e660208301856141d8565b6145f360408301846141d8565b949350505050565b600060208201905061461060008301846141e7565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061467682614941565b915061468183614941565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146b6576146b56149e6565b5b828201905092915050565b60006146cc82614941565b91506146d783614941565b9250826146e7576146e6614a15565b5b828204905092915050565b6000808291508390505b600185111561473c57808604811115614718576147176149e6565b5b60018516156147275780820291505b808102905061473585614a55565b94506146fc565b94509492505050565b600061475082614941565b915061475b8361494b565b92506147887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614790565b905092915050565b6000826147a0576001905061485c565b816147ae576000905061485c565b81600181146147c457600281146147ce576147fd565b600191505061485c565b60ff8411156147e0576147df6149e6565b5b8360020a9150848211156147f7576147f66149e6565b5b5061485c565b5060208310610133831016604e8410600b84101617156148325782820a90508381111561482d5761482c6149e6565b5b61485c565b61483f84848460016146f2565b92509050818404811115614856576148556149e6565b5b81810290505b9392505050565b600061486e82614941565b915061487983614941565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148b2576148b16149e6565b5b828202905092915050565b60006148c882614941565b91506148d383614941565b9250828210156148e6576148e56149e6565b5b828203905092915050565b60006148fc82614921565b9050919050565b600061490e82614921565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061496382614941565b9050919050565b60005b8381101561498857808201518184015260208101905061496d565b83811115614997576000848401525b50505050565b60006149a882614941565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149db576149da6149e6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f54686520636f6e7472616374206973207374696c6c206c6f636b656400000000600082015250565b7f436f6b656e5246493a207472616e736665722066726f6d20746865206275726e60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a206275726e2066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c79207468652070726576696f7573206f776e65722063616e20756e6c6f60008201527f636b206f6e776572736869700000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a206275726e2066726f6d20746865206275726e2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a20617070726f766520746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a207472616e7366657220746f20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420776974686472617720746865204554482062616c616e63652060008201527f746f20746865207a65726f206164647265737300000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f546865204554482062616c616e6365206d75737420626520677265617465722060008201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b7f4e65772062616c616e636520776f756c642065786365656420746865206d617860008201527f57616c6c657442616c616e636500000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a207472616e736665722066726f6d20746865207a65726f60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b7f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d6160008201527f6e61676572000000000000000000000000000000000000000000000000000000602082015250565b7f4665657353657474696e67732e5f6765744665655374727563743a204665652060008201527f696e646578206f7574206f6620626f756e647300000000000000000000000000602082015250565b7f436f6b656e5246493a206275726e20616d6f756e74206578636565647320626160008201527f6c616e6365000000000000000000000000000000000000000000000000000000602082015250565b7f436f6b656e5246493a20617070726f76652066726f6d20746865207a65726f2060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b615074816148f1565b811461507f57600080fd5b50565b61508b81614903565b811461509657600080fd5b50565b6150a281614915565b81146150ad57600080fd5b50565b6150b981614941565b81146150c457600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220672236937ca7b5b03bb460c3d27708a3cc93572bdbeb53792484261b91e2223564736f6c63430008040033

Deployed Bytecode Sourcemap

33973:3704:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14555:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15686:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14935:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15881:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14737:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17878:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16267:772;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18700:459;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7125:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19854:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6147:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15065:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5743:148;;;;;;;;;;;;;:::i;:::-;;13405:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18389:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5533:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14644:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18108:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6475:311;;;;;;;;;;;;;:::i;:::-;;15318:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28220:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33283:427;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33089:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6243:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15518:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7331:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5897:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14555:79;14603:13;14627:4;;;;;;;;;;;;;;;;;14620:11;;14555:79;:::o;15686:175::-;15763:4;15784:39;15793:12;:10;:12::i;:::-;15807:7;15816:6;15784:8;:39::i;:::-;15845:4;15838:11;;15686:175;;;;:::o;14935:110::-;14990:7;8704:2;8748;:14;;;;:::i;:::-;8865:8;:17;;;;:::i;:::-;15014:19;;14935:110;:::o;15881:330::-;15981:4;16001:36;16011:6;16019:9;16030:6;16001:9;:36::i;:::-;16052:121;16061:6;16069:12;:10;:12::i;:::-;16083:89;16121:6;16083:89;;;;;;;;;;;;;;;;;:11;:19;16095:6;16083:19;;;;;;;;;;;;;;;:33;16103:12;:10;:12::i;:::-;16083:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;16052:8;:121::i;:::-;16195:4;16188:11;;15881:330;;;;;:::o;14737:79::-;14789:5;8704:2;14798:15;;14737:79;:::o;17878:218::-;17966:4;17983:83;17992:12;:10;:12::i;:::-;18006:7;18015:50;18054:10;18015:11;:25;18027:12;:10;:12::i;:::-;18015:25;;;;;;;;;;;;;;;:34;18041:7;18015:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;17983:8;:83::i;:::-;18084:4;18077:11;;17878:218;;;;:::o;16267:772::-;16319:14;16336:12;:10;:12::i;:::-;16319:29;;16385:1;16367:20;;:6;:20;;;;16359:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;16465:11;;;;;;;;;;;16447:30;;:6;:30;;;;16439:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;16531:15;16549:17;16559:6;16549:9;:17::i;:::-;16531:35;;16596:6;16585:7;:17;;16577:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16657:23;16683:29;16694:17;:15;:17::i;:::-;16683:6;:10;;:29;;;;:::i;:::-;16657:55;;16816:47;16847:15;16816:18;:26;16835:6;16816:26;;;;;;;;;;;;;;;;:30;;:47;;;;:::i;:::-;16787:18;:26;16806:6;16787:26;;;;;;;;;;;;;;;:76;;;;16878:22;:30;16901:6;16878:30;;;;;;;;;;;;;;;;;;;;;;;;;16874:98;;;16943:29;16965:6;16943:9;:17;16953:6;16943:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;16923:9;:17;16933:6;16923:17;;;;;;;;;;;;;;;:49;;;;16874:98;16985:46;16998:6;17006;17014:15;16985:11;:46::i;:::-;16267:772;;;;:::o;18700:459::-;18792:7;8704:2;8748;:14;;;;:::i;:::-;8865:8;:17;;;;:::i;:::-;18820:7;:23;;18812:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;18895:17;18890:262;;18930:15;18953:21;18964:7;18972:1;18953:10;:21::i;:::-;18929:45;;;;;;18996:7;18989:14;;;;;18890:262;19038:23;19068:35;19079:7;19087:15;:13;:15::i;:::-;19068:10;:35::i;:::-;19036:67;;;;;;19125:15;19118:22;;;18700:459;;;;;:::o;7125:67::-;7164:7;7181:8;;;;;;;;;;;7174:15;;7125:67;:::o;19854:109::-;19918:4;19933:18;:27;19952:7;19933:27;;;;;;;;;;;;;;;;;;;;;;;;;19926:34;;19854:109;;;:::o;6147:90::-;6193:7;6220:9;;6213:16;;6147:90;:::o;15065:233::-;15131:7;15158:22;:31;15181:7;15158:31;;;;;;;;;;;;;;;;;;;;;;;;;15154:62;;;15198:9;:18;15208:7;15198:18;;;;;;;;;;;;;;;;15191:25;;;;15154:62;15238:48;15258:18;:27;15277:7;15258:27;;;;;;;;;;;;;;;;15238:19;:48::i;:::-;15231:55;;15065:233;;;;:::o;5743:148::-;5668:12;:10;:12::i;:::-;5658:22;;:6;;;;;;;;;;:22;;;5650:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5850:1:::1;5813:40;;5834:6;::::0;::::1;;;;;;;;5813:40;;;;;;;;;;;;5881:1;5864:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;5743:148::o:0;13405:100::-;7251:12;:10;:12::i;:::-;7239:24;;:8;;;;;;;;;;;:24;;;7231:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;13492:5:::1;13478:11;;:19;;;;;;;;;;;;;;;;;;13405:100:::0;:::o;18389:133::-;18459:4;18483:22;:31;18506:7;18483:31;;;;;;;;;;;;;;;;;;;;;;;;;18476:38;;18389:133;;;:::o;5533:79::-;5571:7;5598:6;;;;;;;;;;;5591:13;;5533:79;:::o;14644:83::-;14694:13;14718:6;;;;;;;;;;;;;;;;;14711:13;;14644:83;:::o;18108:269::-;18201:4;18218:129;18227:12;:10;:12::i;:::-;18241:7;18250:96;18289:15;18250:96;;;;;;;;;;;;;;;;;:11;:25;18262:12;:10;:12::i;:::-;18250:25;;;;;;;;;;;;;;;:34;18276:7;18250:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;18218:8;:129::i;:::-;18365:4;18358:11;;18108:269;;;;:::o;6475:311::-;6545:10;6527:28;;:14;;;;;;;;;;;:28;;;6519:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6641:9;;6623:15;:27;6615:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;6729:14;;;;;;;;;;;6700:44;;6721:6;;;;;;;;;;6700:44;;;;;;;;;;;;6764:14;;;;;;;;;;;6755:6;;:23;;;;;;;;;;;;;;;;;;6475:311::o;15318:180::-;15398:4;15418:42;15428:12;:10;:12::i;:::-;15442:9;15453:6;15418:9;:42::i;:::-;15482:4;15475:11;;15318:180;;;;:::o;28220:20::-;;;;;;;;;;;;;:::o;33283:427::-;7251:12;:10;:12::i;:::-;7239:24;;:8;;;;;;;;;;;:24;;;7231:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33399:1:::1;33378:23;;:9;:23;;;;33370:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33498:1;33476:19;;:23;33468:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33595:14;33612:19;;33595:36;;33664:1;33642:19;:23;;;;33676:9;:18;;:26;33695:6;33676:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7316:1;33283:427:::0;:::o;33089:186::-;7251:12;:10;:12::i;:::-;7239:24;;:8;;;;;;;;;;;:24;;;7231:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33193:7:::1;33169:21;;:31;;;;;;;;;;;;;;;;;;33216:51;33245:21;;;;;;;;;;;33216:51;;;;;;:::i;:::-;;;;;;;;33089:186:::0;:::o;6243:226::-;5668:12;:10;:12::i;:::-;5658:22;;:6;;;;;;;;;;:22;;;5650:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6324:6:::1;::::0;::::1;;;;;;;;6307:14;;:23;;;;;;;;;;;;;;;;;;6358:1;6341:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;6401:4;6383:15;:22;;;;:::i;:::-;6371:9;:34;;;;6458:1;6421:40;;6442:6;::::0;::::1;;;;;;;;6421:40;;;;;;;;;;;;6243:226:::0;:::o;15518:152::-;15601:7;15631:11;:18;15643:5;15631:18;;;;;;;;;;;;;;;:27;15650:7;15631:27;;;;;;;;;;;;;;;;15624:34;;15518:152;;;;:::o;7331:176::-;7251:12;:10;:12::i;:::-;7239:24;;:8;;;;;;;;;;;:24;;;7231:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7456:10:::1;7424:43;;7446:8;;;;;;;;;;;7424:43;;;;;;;;;;;;7489:10;7478:8;;:21;;;;;;;;;;;;;;;;;;7331:176:::0;:::o;5897:244::-;5668:12;:10;:12::i;:::-;5658:22;;:6;;;;;;;;;;:22;;;5650:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6006:1:::1;5986:22;;:8;:22;;;;5978:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6096:8;6067:38;;6088:6;::::0;::::1;;;;;;;;6067:38;;;;;;;;;;;;6125:8;6116:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;5897:244:::0;:::o;1656:82::-;1714:7;1735:1;1731;:5;;;;:::i;:::-;1724:12;;1656:82;;;;:::o;1480:::-;1538:7;1559:1;1555;:5;;;;:::i;:::-;1548:12;;1480:82;;;;:::o;1184:::-;1237:7;1254:10;1247:17;;1184:82;:::o;19975:344::-;20086:1;20069:19;;:5;:19;;;;20061:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;20170:1;20151:21;;:7;:21;;;;20143:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;20257:6;20227:11;:18;20239:5;20227:18;;;;;;;;;;;;;;;:27;20246:7;20227:27;;;;;;;;;;;;;;;:36;;;;20295:7;20279:32;;20288:5;20279:32;;;20304:6;20279:32;;;;;;:::i;:::-;;;;;;;;19975:344;;;:::o;20853:2149::-;20968:1;20950:20;;:6;:20;;;;20942:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21055:1;21034:23;;:9;:23;;;;21026:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21137:11;;;;;;;;;;;21119:30;;:6;:30;;;;21111:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;21222:1;21213:6;:10;21205:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;21369:12;21384:4;21369:19;;21406:11;;;;;;;;;;;21401:1273;;;21431:5;21421:15;;21401:1273;;;9311:3;8704:2;8748;:14;;;;:::i;:::-;8865:8;:17;;;;:::i;:::-;9296:18;;;;:::i;:::-;21661:6;:29;:60;;;;;21695:26;21714:6;21695:18;:26::i;:::-;21694:27;21661:60;:97;;;;;21726:32;21748:9;21726:21;:32::i;:::-;21725:33;21661:97;21656:189;;;21779:50;;;;;;;;;;:::i;:::-;;;;;;;;21656:189;22363:1;8704:2;8748;:14;;;;:::i;:::-;8865:8;:17;;;;:::i;:::-;22344:20;:51;;;;;22369:26;22388:6;22369:18;:26::i;:::-;22368:27;22344:51;:88;;;;;22400:32;22422:9;22400:21;:32::i;:::-;22399:33;22344:88;:113;;;;;22437:20;22447:9;22437;:20::i;:::-;22436:21;22344:113;22339:324;;;22478:24;22505:20;22515:9;22505;:20::i;:::-;22478:47;;8704:2;8748;:14;;;;:::i;:::-;8865:8;:17;;;;:::i;:::-;22571:6;22552:16;:25;;;;:::i;:::-;:45;;22544:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22339:324;;21401:1273;22774:18;:26;22793:6;22774:26;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;22804:18;:29;22823:9;22804:29;;;;;;;;;;;;;;;;;;;;;;;;;22774:59;22771:83;;;22846:5;22836:15;;22771:83;22866:56;22887:6;22895:9;22906:6;22914:7;22866:20;:56::i;:::-;22933:51;22949:6;22957:9;22968:6;22976:7;22933:15;:51::i;:::-;20853:2149;;;;:::o;1832:171::-;1918:7;1963:1;1958;:6;;1966:12;1950:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1992:1;1988;:5;1981:12;;1832:171;;;;;:::o;1392:82::-;1450:7;1471:1;1467;:5;;;;:::i;:::-;1460:12;;1392:82;;;;:::o;25432:171::-;25481:7;25502:15;25519;25538:19;:17;:19::i;:::-;25501:56;;;;25575:20;25587:7;25575;:11;;:20;;;;:::i;:::-;25568:27;;;;25432:171;:::o;1568:82::-;1626:7;1647:1;1643;:5;;;;:::i;:::-;1636:12;;1568:82;;;;:::o;17171:699::-;17528:42;17564:5;17528:18;:31;17547:11;;;;;;;;;;;17528:31;;;;;;;;;;;;;;;;:35;;:42;;;;:::i;:::-;17494:18;:31;17513:11;;;;;;;;;;;17494:31;;;;;;;;;;;;;;;:76;;;;17585:22;:35;17608:11;;;;;;;;;;;17585:35;;;;;;;;;;;;;;;;;;;;;;;;;17581:112;;;17660:33;17687:5;17660:9;:22;17670:11;;;;;;;;;;;17660:22;;;;;;;;;;;;;;;;:26;;:33;;;;:::i;:::-;17635:9;:22;17645:11;;;;;;;;;;;17635:22;;;;;;;;;;;;;;;:58;;;;17581:112;17843:11;;;;;;;;;;;17826:36;;17835:6;17826:36;;;17856:5;17826:36;;;;;;:::i;:::-;;;;;;;;17171:699;;;:::o;24835:585::-;24912:7;24921;24930;24939;24948;24978:18;24999:38;8655:7;24999:38;;:20;25011:7;24999;:11;;:20;;;;:::i;:::-;:24;;:38;;;;:::i;:::-;24978:59;;25048:23;25074;25086:10;25074:7;:11;;:23;;;;:::i;:::-;25048:49;;25108:19;25130:17;:15;:17::i;:::-;25108:39;;25158:15;25176:24;25188:11;25176:7;:11;;:24;;;;:::i;:::-;25158:42;;25211:18;25232:27;25247:11;25232:10;:14;;:27;;;;:::i;:::-;25211:48;;25270:23;25296;25308:10;25296:7;:11;;:23;;;;:::i;:::-;25270:49;;25348:7;25357:15;25374:7;25383:15;25400:11;25340:72;;;;;;;;;;;;;;;;24835:585;;;;;;;;:::o;34667:102::-;34724:7;34751:9;;34744:16;;34667:102;:::o;19287:270::-;19355:7;19394:16;;19383:7;:27;;19375:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;19468:19;19490:17;:15;:17::i;:::-;19468:39;;19525:24;19537:11;19525:7;:11;;:24;;;;:::i;:::-;19518:31;;;19287:270;;;:::o;20349:178::-;20416:4;20511:7;:5;:7::i;:::-;20500:18;;:7;:18;;;20492:27;;20349:178;;;:::o;20551:294::-;20621:4;20803:7;:5;:7::i;:::-;20792:18;;:7;:18;;;:44;;;;20825:11;;;;;;;;;;;20814:22;;:7;:22;;;20792:44;20784:53;;20551:294;;;:::o;34543:116::-;34610:4;34645:5;;;;;;;;;;;34634:16;;:7;:16;;;34626:25;;34543:116;;;:::o;34904:264::-;35012:11;;;;;;;;;;;35006:155;;35040:28;35071:24;35089:4;35071:9;:24::i;:::-;35040:55;;35110:39;35119:20;35141:6;35110:7;:39::i;:::-;35006:155;;34904:264;;;;:::o;23010:1595::-;23553:17;23573:15;:13;:15::i;:::-;23553:35;;23605:7;23599:33;;23628:1;23616:13;;23599:33;23653:15;23670:23;23695:15;23712:23;23737:19;23761:29;23772:6;23780:9;23761:10;:29::i;:::-;23652:138;;;;;;;;;;24020:39;24051:7;24020:18;:26;24039:6;24020:26;;;;;;;;;;;;;;;;:30;;:39;;;;:::i;:::-;23991:18;:26;24010:6;23991:26;;;;;;;;;;;;;;;:68;;;;24102:50;24136:15;24102:18;:29;24121:9;24102:29;;;;;;;;;;;;;;;;:33;;:50;;;;:::i;:::-;24070:18;:29;24089:9;24070:29;;;;;;;;;;;;;;;:82;;;;24270:22;:30;24293:6;24270:30;;;;;;;;;;;;;;;;;;;;;;;;;24266:90;;;24323:30;24345:7;24323:9;:17;24333:6;24323:17;;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;24303:9;:17;24313:6;24303:17;;;;;;;;;;;;;;;:50;;;;24266:90;24370:22;:33;24393:9;24370:33;;;;;;;;;;;;;;;;;;;;;;;;;24366:108;;;24430:41;24455:15;24430:9;:20;24440:9;24430:20;;;;;;;;;;;;;;;;:24;;:41;;;;:::i;:::-;24407:9;:20;24417:9;24407:20;;;;;;;;;;;;;;;:64;;;;24366:108;24494:43;24505:6;24513:11;24526:9;24494;:43::i;:::-;24570:9;24553:44;;24562:6;24553:44;;;24581:15;24553:44;;;;;;:::i;:::-;;;;;;;;23010:1595;;;;;;;;;;:::o;25615:907::-;25666:7;25675;25695:15;25713:16;;25695:34;;25740:15;8704:2;8748;:14;;;;:::i;:::-;8865:8;:17;;;;:::i;:::-;25740:30;;26037:9;26032:329;26056:9;:16;;;;26052:1;:20;26032:329;;;26133:7;26098:18;:32;26117:9;26127:1;26117:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26098:32;;;;;;;;;;;;;;;;:42;:79;;;;26170:7;26144:9;:23;26154:9;26164:1;26154:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26144:23;;;;;;;;;;;;;;;;:33;26098:79;26094:124;;;26187:16;;8704:2;8748;:14;;;;:::i;:::-;8865:8;:17;;;;:::i;:::-;26179:39;;;;;;;;;26094:124;26243:45;26255:18;:32;26274:9;26284:1;26274:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26255:32;;;;;;;;;;;;;;;;26243:7;:11;;:45;;;;:::i;:::-;26233:55;;26313:36;26325:9;:23;26335:9;26345:1;26335:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26325:23;;;;;;;;;;;;;;;;26313:7;:11;;:36;;;;:::i;:::-;26303:46;;26074:3;;;;;:::i;:::-;;;;26032:329;;;;26388:1;26377:7;:12;:60;;;;26403:34;8704:2;8748;:14;;;;:::i;:::-;8865:8;:17;;;;:::i;:::-;26403:16;;:20;;:34;;;;:::i;:::-;26393:7;:44;26377:60;26373:105;;;26447:16;;8704:2;8748;:14;;;;:::i;:::-;8865:8;:17;;;;:::i;:::-;26439:39;;;;;;;;26373:105;26497:7;26506;26489:25;;;;;;25615:907;;;:::o;29300:978::-;29413:20;;29389;:44;29385:93;;29458:20;;29435:43;;29385:93;29499:31;29559;;29535:20;:55;;29499:93;;29942:26;:51;;;;;29972:21;;;;;;;;;;;29942:51;:72;;;;;29998:16;;;;;;;;;;;29997:17;29942:72;:93;;;;;30029:5;;;;;;;;;;;30019:15;;:6;:15;;;;29942:93;29937:332;;;30208:37;30224:20;30208:15;:37::i;:::-;29937:332;29300:978;;;:::o;24617:206::-;24729:1;24717:9;:13;:29;;;;;24735:11;;;;;;;;;;;24734:12;24717:29;24712:104;;;24763:41;24784:6;24792:11;24763:20;:41::i;:::-;24712:104;24617:206;;;:::o;30290:972::-;28489:4;28470:16;;:23;;;;;;;;;;;;;;;;;;30423:12:::1;30438:13;30449:1;30438:6;:10;;:13;;;;:::i;:::-;30423:28;;30462:17;30482:16;30493:4;30482:6;:10;;:16;;;;:::i;:::-;30462:36;;30784:22;30809:21;30784:46;;30883:23;30901:4;30883:17;:23::i;:::-;31037:18;31058:41;31084:14;31058:21;:25;;:41;;;;:::i;:::-;31037:62;;31149:36;31163:9;31174:10;31149:13;:36::i;:::-;31211:43;31226:4;31232:10;31244:9;31211:43;;;;;;;;:::i;:::-;;;;;;;;28504:1;;;;28535:5:::0;28516:16;;:24;;;;;;;;;;;;;;;;;;30290:972;:::o;35176:844::-;35286:11;;;;;;;;;;;35282:28;;;35301:7;;35282:28;35322:17;35342:15;:13;:15::i;:::-;35322:35;;35373:13;35368:645;35400:9;35392:5;:17;35368:645;;;35436:12;35450:13;35465:17;35487:14;35495:5;35487:7;:14::i;:::-;35435:66;;;;;;;35619:1;35610:5;:10;35605:26;;;35623:8;;;;;35605:26;35661:11;35653:19;;;;;;;;;;;;;;;;:4;:19;;;;;;;;;;;;;;;;;35648:354;;;35693:50;35708:6;35716:11;35729:5;35736;35693:13;:50::i;:::-;35648:354;;;35793:21;35785:29;;;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;35780:222;;;35834:40;35849:6;35857:5;35864:9;35834:13;:40::i;:::-;35780:222;;;35930:56;35940:6;35948:11;35961:5;35968:9;35979:5;35930:8;:56::i;:::-;35780:222;35648:354;35368:645;;;;35411:7;;;;;:::i;:::-;;;;35368:645;;;;35176:844;;;;:::o;31274:557::-;31412:21;31450:1;31436:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31412:40;;31481:4;31463;31468:1;31463:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;31507:7;;;;;;;;;;;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31497:4;31502:1;31497:7;;;;;;;;;;;;;;;;;;;;;:24;;;;;;;;;;;31534:62;31559:4;31574:7;;;;;;;;;;;31584:11;31534:16;:62::i;:::-;31635:7;;;;;;;;;;;:58;;;31708:11;31734:1;31750:4;31777;31797:15;31635:188;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31274:557;;:::o;31843:1234::-;31992:62;32017:4;32032:7;;;;;;;;;;;32042:11;31992:16;:62::i;:::-;32099:23;32124:21;32147:17;32168:7;;;;;;;;;;;:23;;;32199:9;32232:4;32252:11;32278:1;32294;32310:7;:5;:7::i;:::-;32332:15;32168:190;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32098:260;;;;;;32975:21;32953:19;:43;;;;33012:57;33027:15;33044:13;33059:9;33012:57;;;;;;;;:::i;:::-;;;;;;;;31843:1234;;;;;:::o;12356:79::-;12404:7;12421:4;:11;;;;12414:18;;12356:79;:::o;12668:213::-;12723:7;12732;12741;12750;12769:14;12786:20;12800:5;12786:13;:20::i;:::-;12769:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12826:3;:8;;;12836:3;:9;;;12847:3;:13;;;12862:3;:9;;;12817:56;;;;;;;;;12668:213;;;;;:::o;27437:315::-;27545:12;27560:33;8655:7;27560:33;;:15;27571:3;27560:6;:10;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;27545:48;;27604:12;27619:21;27628:11;27619:4;:8;;:21;;;;:::i;:::-;27604:36;;27672:26;27693:4;27672:16;;:20;;:26;;;;:::i;:::-;27653:16;:45;;;;27709:35;27732:5;27739:4;27709:22;:35::i;:::-;27437:315;;;;;;:::o;37163:360::-;37253:22;37278:21;37253:46;;37310:12;37325:33;8655:7;37325:33;;:15;37336:3;37325:6;:10;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;37310:48;;37369:23;37387:4;37369:17;:23::i;:::-;37403:18;37424:41;37450:14;37424:21;:25;;:41;;;;:::i;:::-;37403:62;;37484:9;37476:27;;:39;37504:10;37476:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37163:360;;;;;;:::o;36341:491::-;36464:15;36482:33;8655:7;36482:33;;:15;36493:3;36482:6;:10;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;36464:51;;36526:15;36544:24;36556:11;36544:7;:11;;:24;;;;:::i;:::-;36526:42;;36613;36647:7;36613:18;:29;36632:9;36613:29;;;;;;;;;;;;;;;;:33;;:42;;;;:::i;:::-;36581:18;:29;36600:9;36581:29;;;;;;;;;;;;;;;:74;;;;36669:22;:33;36692:9;36669:33;;;;;;;;;;;;;;;;;;;;;;;;;36666:107;;;36740:33;36765:7;36740:9;:20;36750:9;36740:20;;;;;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;36717:9;:20;36727:9;36717:20;;;;;;;;;;;;;;;:56;;;;36666:107;36786:38;36809:5;36816:7;36786:22;:38::i;:::-;36341:491;;;;;;;:::o;37531:143::-;37634:32;37643:5;37650:7;37659:6;37634:8;:32::i;:::-;37531:143;;;:::o;12443:217::-;12502:11;12543:1;12534:5;:10;;:33;;;;;12556:4;:11;;;;12548:5;:19;12534:33;12525:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;12641:4;12646:5;12641:11;;;;;;;;;;;;;;;;;;;;;;;;;;12634:18;;12443:217;;;:::o;12889:173::-;12972:15;12990:20;13004:5;12990:13;:20::i;:::-;12972:38;;13033:21;13047:6;13033:3;:9;;;:13;;:21;;;;:::i;:::-;13021:3;:9;;:33;;;;12889:173;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:155::-;355:5;393:6;380:20;371:29;;409:41;444:5;409:41;:::i;:::-;361:95;;;;:::o;462:133::-;505:5;543:6;530:20;521:29;;559:30;583:5;559:30;:::i;:::-;511:84;;;;:::o;601:139::-;647:5;685:6;672:20;663:29;;701:33;728:5;701:33;:::i;:::-;653:87;;;;:::o;746:143::-;803:5;834:6;828:13;819:22;;850:33;877:5;850:33;:::i;:::-;809:80;;;;:::o;895:262::-;954:6;1003:2;991:9;982:7;978:23;974:32;971:2;;;1019:1;1016;1009:12;971:2;1062:1;1087:53;1132:7;1123:6;1112:9;1108:22;1087:53;:::i;:::-;1077:63;;1033:117;961:196;;;;:::o;1163:284::-;1233:6;1282:2;1270:9;1261:7;1257:23;1253:32;1250:2;;;1298:1;1295;1288:12;1250:2;1341:1;1366:64;1422:7;1413:6;1402:9;1398:22;1366:64;:::i;:::-;1356:74;;1312:128;1240:207;;;;:::o;1453:278::-;1520:6;1569:2;1557:9;1548:7;1544:23;1540:32;1537:2;;;1585:1;1582;1575:12;1537:2;1628:1;1653:61;1706:7;1697:6;1686:9;1682:22;1653:61;:::i;:::-;1643:71;;1599:125;1527:204;;;;:::o;1737:407::-;1805:6;1813;1862:2;1850:9;1841:7;1837:23;1833:32;1830:2;;;1878:1;1875;1868:12;1830:2;1921:1;1946:53;1991:7;1982:6;1971:9;1967:22;1946:53;:::i;:::-;1936:63;;1892:117;2048:2;2074:53;2119:7;2110:6;2099:9;2095:22;2074:53;:::i;:::-;2064:63;;2019:118;1820:324;;;;;:::o;2150:552::-;2227:6;2235;2243;2292:2;2280:9;2271:7;2267:23;2263:32;2260:2;;;2308:1;2305;2298:12;2260:2;2351:1;2376:53;2421:7;2412:6;2401:9;2397:22;2376:53;:::i;:::-;2366:63;;2322:117;2478:2;2504:53;2549:7;2540:6;2529:9;2525:22;2504:53;:::i;:::-;2494:63;;2449:118;2606:2;2632:53;2677:7;2668:6;2657:9;2653:22;2632:53;:::i;:::-;2622:63;;2577:118;2250:452;;;;;:::o;2708:407::-;2776:6;2784;2833:2;2821:9;2812:7;2808:23;2804:32;2801:2;;;2849:1;2846;2839:12;2801:2;2892:1;2917:53;2962:7;2953:6;2942:9;2938:22;2917:53;:::i;:::-;2907:63;;2863:117;3019:2;3045:53;3090:7;3081:6;3070:9;3066:22;3045:53;:::i;:::-;3035:63;;2990:118;2791:324;;;;;:::o;3121:256::-;3177:6;3226:2;3214:9;3205:7;3201:23;3197:32;3194:2;;;3242:1;3239;3232:12;3194:2;3285:1;3310:50;3352:7;3343:6;3332:9;3328:22;3310:50;:::i;:::-;3300:60;;3256:114;3184:193;;;;:::o;3383:262::-;3442:6;3491:2;3479:9;3470:7;3466:23;3462:32;3459:2;;;3507:1;3504;3497:12;3459:2;3550:1;3575:53;3620:7;3611:6;3600:9;3596:22;3575:53;:::i;:::-;3565:63;;3521:117;3449:196;;;;:::o;3651:401::-;3716:6;3724;3773:2;3761:9;3752:7;3748:23;3744:32;3741:2;;;3789:1;3786;3779:12;3741:2;3832:1;3857:53;3902:7;3893:6;3882:9;3878:22;3857:53;:::i;:::-;3847:63;;3803:117;3959:2;3985:50;4027:7;4018:6;4007:9;4003:22;3985:50;:::i;:::-;3975:60;;3930:115;3731:321;;;;;:::o;4058:596::-;4146:6;4154;4162;4211:2;4199:9;4190:7;4186:23;4182:32;4179:2;;;4227:1;4224;4217:12;4179:2;4270:1;4295:64;4351:7;4342:6;4331:9;4327:22;4295:64;:::i;:::-;4285:74;;4241:128;4408:2;4434:64;4490:7;4481:6;4470:9;4466:22;4434:64;:::i;:::-;4424:74;;4379:129;4547:2;4573:64;4629:7;4620:6;4609:9;4605:22;4573:64;:::i;:::-;4563:74;;4518:129;4169:485;;;;;:::o;4660:179::-;4729:10;4750:46;4792:3;4784:6;4750:46;:::i;:::-;4828:4;4823:3;4819:14;4805:28;;4740:99;;;;:::o;4845:108::-;4922:24;4940:5;4922:24;:::i;:::-;4917:3;4910:37;4900:53;;:::o;4959:118::-;5046:24;5064:5;5046:24;:::i;:::-;5041:3;5034:37;5024:53;;:::o;5113:732::-;5232:3;5261:54;5309:5;5261:54;:::i;:::-;5331:86;5410:6;5405:3;5331:86;:::i;:::-;5324:93;;5441:56;5491:5;5441:56;:::i;:::-;5520:7;5551:1;5536:284;5561:6;5558:1;5555:13;5536:284;;;5637:6;5631:13;5664:63;5723:3;5708:13;5664:63;:::i;:::-;5657:70;;5750:60;5803:6;5750:60;:::i;:::-;5740:70;;5596:224;5583:1;5580;5576:9;5571:14;;5536:284;;;5540:14;5836:3;5829:10;;5237:608;;;;;;;:::o;5851:109::-;5932:21;5947:5;5932:21;:::i;:::-;5927:3;5920:34;5910:50;;:::o;5966:147::-;6061:45;6100:5;6061:45;:::i;:::-;6056:3;6049:58;6039:74;;:::o;6119:364::-;6207:3;6235:39;6268:5;6235:39;:::i;:::-;6290:71;6354:6;6349:3;6290:71;:::i;:::-;6283:78;;6370:52;6415:6;6410:3;6403:4;6396:5;6392:16;6370:52;:::i;:::-;6447:29;6469:6;6447:29;:::i;:::-;6442:3;6438:39;6431:46;;6211:272;;;;;:::o;6489:366::-;6631:3;6652:67;6716:2;6711:3;6652:67;:::i;:::-;6645:74;;6728:93;6817:3;6728:93;:::i;:::-;6846:2;6841:3;6837:12;6830:19;;6635:220;;;:::o;6861:366::-;7003:3;7024:67;7088:2;7083:3;7024:67;:::i;:::-;7017:74;;7100:93;7189:3;7100:93;:::i;:::-;7218:2;7213:3;7209:12;7202:19;;7007:220;;;:::o;7233:366::-;7375:3;7396:67;7460:2;7455:3;7396:67;:::i;:::-;7389:74;;7472:93;7561:3;7472:93;:::i;:::-;7590:2;7585:3;7581:12;7574:19;;7379:220;;;:::o;7605:366::-;7747:3;7768:67;7832:2;7827:3;7768:67;:::i;:::-;7761:74;;7844:93;7933:3;7844:93;:::i;:::-;7962:2;7957:3;7953:12;7946:19;;7751:220;;;:::o;7977:366::-;8119:3;8140:67;8204:2;8199:3;8140:67;:::i;:::-;8133:74;;8216:93;8305:3;8216:93;:::i;:::-;8334:2;8329:3;8325:12;8318:19;;8123:220;;;:::o;8349:366::-;8491:3;8512:67;8576:2;8571:3;8512:67;:::i;:::-;8505:74;;8588:93;8677:3;8588:93;:::i;:::-;8706:2;8701:3;8697:12;8690:19;;8495:220;;;:::o;8721:366::-;8863:3;8884:67;8948:2;8943:3;8884:67;:::i;:::-;8877:74;;8960:93;9049:3;8960:93;:::i;:::-;9078:2;9073:3;9069:12;9062:19;;8867:220;;;:::o;9093:366::-;9235:3;9256:67;9320:2;9315:3;9256:67;:::i;:::-;9249:74;;9332:93;9421:3;9332:93;:::i;:::-;9450:2;9445:3;9441:12;9434:19;;9239:220;;;:::o;9465:366::-;9607:3;9628:67;9692:2;9687:3;9628:67;:::i;:::-;9621:74;;9704:93;9793:3;9704:93;:::i;:::-;9822:2;9817:3;9813:12;9806:19;;9611:220;;;:::o;9837:366::-;9979:3;10000:67;10064:2;10059:3;10000:67;:::i;:::-;9993:74;;10076:93;10165:3;10076:93;:::i;:::-;10194:2;10189:3;10185:12;10178:19;;9983:220;;;:::o;10209:366::-;10351:3;10372:67;10436:2;10431:3;10372:67;:::i;:::-;10365:74;;10448:93;10537:3;10448:93;:::i;:::-;10566:2;10561:3;10557:12;10550:19;;10355:220;;;:::o;10581:366::-;10723:3;10744:67;10808:2;10803:3;10744:67;:::i;:::-;10737:74;;10820:93;10909:3;10820:93;:::i;:::-;10938:2;10933:3;10929:12;10922:19;;10727:220;;;:::o;10953:366::-;11095:3;11116:67;11180:2;11175:3;11116:67;:::i;:::-;11109:74;;11192:93;11281:3;11192:93;:::i;:::-;11310:2;11305:3;11301:12;11294:19;;11099:220;;;:::o;11325:366::-;11467:3;11488:67;11552:2;11547:3;11488:67;:::i;:::-;11481:74;;11564:93;11653:3;11564:93;:::i;:::-;11682:2;11677:3;11673:12;11666:19;;11471:220;;;:::o;11697:366::-;11839:3;11860:67;11924:2;11919:3;11860:67;:::i;:::-;11853:74;;11936:93;12025:3;11936:93;:::i;:::-;12054:2;12049:3;12045:12;12038:19;;11843:220;;;:::o;12069:366::-;12211:3;12232:67;12296:2;12291:3;12232:67;:::i;:::-;12225:74;;12308:93;12397:3;12308:93;:::i;:::-;12426:2;12421:3;12417:12;12410:19;;12215:220;;;:::o;12441:366::-;12583:3;12604:67;12668:2;12663:3;12604:67;:::i;:::-;12597:74;;12680:93;12769:3;12680:93;:::i;:::-;12798:2;12793:3;12789:12;12782:19;;12587:220;;;:::o;12813:366::-;12955:3;12976:67;13040:2;13035:3;12976:67;:::i;:::-;12969:74;;13052:93;13141:3;13052:93;:::i;:::-;13170:2;13165:3;13161:12;13154:19;;12959:220;;;:::o;13185:366::-;13327:3;13348:67;13412:2;13407:3;13348:67;:::i;:::-;13341:74;;13424:93;13513:3;13424:93;:::i;:::-;13542:2;13537:3;13533:12;13526:19;;13331:220;;;:::o;13557:366::-;13699:3;13720:67;13784:2;13779:3;13720:67;:::i;:::-;13713:74;;13796:93;13885:3;13796:93;:::i;:::-;13914:2;13909:3;13905:12;13898:19;;13703:220;;;:::o;13929:366::-;14071:3;14092:67;14156:2;14151:3;14092:67;:::i;:::-;14085:74;;14168:93;14257:3;14168:93;:::i;:::-;14286:2;14281:3;14277:12;14270:19;;14075:220;;;:::o;14301:118::-;14388:24;14406:5;14388:24;:::i;:::-;14383:3;14376:37;14366:53;;:::o;14425:112::-;14508:22;14524:5;14508:22;:::i;:::-;14503:3;14496:35;14486:51;;:::o;14543:222::-;14636:4;14674:2;14663:9;14659:18;14651:26;;14687:71;14755:1;14744:9;14740:17;14731:6;14687:71;:::i;:::-;14641:124;;;;:::o;14771:807::-;15020:4;15058:3;15047:9;15043:19;15035:27;;15072:71;15140:1;15129:9;15125:17;15116:6;15072:71;:::i;:::-;15153:72;15221:2;15210:9;15206:18;15197:6;15153:72;:::i;:::-;15235:80;15311:2;15300:9;15296:18;15287:6;15235:80;:::i;:::-;15325;15401:2;15390:9;15386:18;15377:6;15325:80;:::i;:::-;15415:73;15483:3;15472:9;15468:19;15459:6;15415:73;:::i;:::-;15498;15566:3;15555:9;15551:19;15542:6;15498:73;:::i;:::-;15025:553;;;;;;;;;:::o;15584:210::-;15671:4;15709:2;15698:9;15694:18;15686:26;;15722:65;15784:1;15773:9;15769:17;15760:6;15722:65;:::i;:::-;15676:118;;;;:::o;15800:313::-;15913:4;15951:2;15940:9;15936:18;15928:26;;16000:9;15994:4;15990:20;15986:1;15975:9;15971:17;15964:47;16028:78;16101:4;16092:6;16028:78;:::i;:::-;16020:86;;15918:195;;;;:::o;16119:419::-;16285:4;16323:2;16312:9;16308:18;16300:26;;16372:9;16366:4;16362:20;16358:1;16347:9;16343:17;16336:47;16400:131;16526:4;16400:131;:::i;:::-;16392:139;;16290:248;;;:::o;16544:419::-;16710:4;16748:2;16737:9;16733:18;16725:26;;16797:9;16791:4;16787:20;16783:1;16772:9;16768:17;16761:47;16825:131;16951:4;16825:131;:::i;:::-;16817:139;;16715:248;;;:::o;16969:419::-;17135:4;17173:2;17162:9;17158:18;17150:26;;17222:9;17216:4;17212:20;17208:1;17197:9;17193:17;17186:47;17250:131;17376:4;17250:131;:::i;:::-;17242:139;;17140:248;;;:::o;17394:419::-;17560:4;17598:2;17587:9;17583:18;17575:26;;17647:9;17641:4;17637:20;17633:1;17622:9;17618:17;17611:47;17675:131;17801:4;17675:131;:::i;:::-;17667:139;;17565:248;;;:::o;17819:419::-;17985:4;18023:2;18012:9;18008:18;18000:26;;18072:9;18066:4;18062:20;18058:1;18047:9;18043:17;18036:47;18100:131;18226:4;18100:131;:::i;:::-;18092:139;;17990:248;;;:::o;18244:419::-;18410:4;18448:2;18437:9;18433:18;18425:26;;18497:9;18491:4;18487:20;18483:1;18472:9;18468:17;18461:47;18525:131;18651:4;18525:131;:::i;:::-;18517:139;;18415:248;;;:::o;18669:419::-;18835:4;18873:2;18862:9;18858:18;18850:26;;18922:9;18916:4;18912:20;18908:1;18897:9;18893:17;18886:47;18950:131;19076:4;18950:131;:::i;:::-;18942:139;;18840:248;;;:::o;19094:419::-;19260:4;19298:2;19287:9;19283:18;19275:26;;19347:9;19341:4;19337:20;19333:1;19322:9;19318:17;19311:47;19375:131;19501:4;19375:131;:::i;:::-;19367:139;;19265:248;;;:::o;19519:419::-;19685:4;19723:2;19712:9;19708:18;19700:26;;19772:9;19766:4;19762:20;19758:1;19747:9;19743:17;19736:47;19800:131;19926:4;19800:131;:::i;:::-;19792:139;;19690:248;;;:::o;19944:419::-;20110:4;20148:2;20137:9;20133:18;20125:26;;20197:9;20191:4;20187:20;20183:1;20172:9;20168:17;20161:47;20225:131;20351:4;20225:131;:::i;:::-;20217:139;;20115:248;;;:::o;20369:419::-;20535:4;20573:2;20562:9;20558:18;20550:26;;20622:9;20616:4;20612:20;20608:1;20597:9;20593:17;20586:47;20650:131;20776:4;20650:131;:::i;:::-;20642:139;;20540:248;;;:::o;20794:419::-;20960:4;20998:2;20987:9;20983:18;20975:26;;21047:9;21041:4;21037:20;21033:1;21022:9;21018:17;21011:47;21075:131;21201:4;21075:131;:::i;:::-;21067:139;;20965:248;;;:::o;21219:419::-;21385:4;21423:2;21412:9;21408:18;21400:26;;21472:9;21466:4;21462:20;21458:1;21447:9;21443:17;21436:47;21500:131;21626:4;21500:131;:::i;:::-;21492:139;;21390:248;;;:::o;21644:419::-;21810:4;21848:2;21837:9;21833:18;21825:26;;21897:9;21891:4;21887:20;21883:1;21872:9;21868:17;21861:47;21925:131;22051:4;21925:131;:::i;:::-;21917:139;;21815:248;;;:::o;22069:419::-;22235:4;22273:2;22262:9;22258:18;22250:26;;22322:9;22316:4;22312:20;22308:1;22297:9;22293:17;22286:47;22350:131;22476:4;22350:131;:::i;:::-;22342:139;;22240:248;;;:::o;22494:419::-;22660:4;22698:2;22687:9;22683:18;22675:26;;22747:9;22741:4;22737:20;22733:1;22722:9;22718:17;22711:47;22775:131;22901:4;22775:131;:::i;:::-;22767:139;;22665:248;;;:::o;22919:419::-;23085:4;23123:2;23112:9;23108:18;23100:26;;23172:9;23166:4;23162:20;23158:1;23147:9;23143:17;23136:47;23200:131;23326:4;23200:131;:::i;:::-;23192:139;;23090:248;;;:::o;23344:419::-;23510:4;23548:2;23537:9;23533:18;23525:26;;23597:9;23591:4;23587:20;23583:1;23572:9;23568:17;23561:47;23625:131;23751:4;23625:131;:::i;:::-;23617:139;;23515:248;;;:::o;23769:419::-;23935:4;23973:2;23962:9;23958:18;23950:26;;24022:9;24016:4;24012:20;24008:1;23997:9;23993:17;23986:47;24050:131;24176:4;24050:131;:::i;:::-;24042:139;;23940:248;;;:::o;24194:419::-;24360:4;24398:2;24387:9;24383:18;24375:26;;24447:9;24441:4;24437:20;24433:1;24422:9;24418:17;24411:47;24475:131;24601:4;24475:131;:::i;:::-;24467:139;;24365:248;;;:::o;24619:419::-;24785:4;24823:2;24812:9;24808:18;24800:26;;24872:9;24866:4;24862:20;24858:1;24847:9;24843:17;24836:47;24900:131;25026:4;24900:131;:::i;:::-;24892:139;;24790:248;;;:::o;25044:222::-;25137:4;25175:2;25164:9;25160:18;25152:26;;25188:71;25256:1;25245:9;25241:17;25232:6;25188:71;:::i;:::-;25142:124;;;;:::o;25272:831::-;25535:4;25573:3;25562:9;25558:19;25550:27;;25587:71;25655:1;25644:9;25640:17;25631:6;25587:71;:::i;:::-;25668:80;25744:2;25733:9;25729:18;25720:6;25668:80;:::i;:::-;25795:9;25789:4;25785:20;25780:2;25769:9;25765:18;25758:48;25823:108;25926:4;25917:6;25823:108;:::i;:::-;25815:116;;25941:72;26009:2;25998:9;25994:18;25985:6;25941:72;:::i;:::-;26023:73;26091:3;26080:9;26076:19;26067:6;26023:73;:::i;:::-;25540:563;;;;;;;;:::o;26109:442::-;26258:4;26296:2;26285:9;26281:18;26273:26;;26309:71;26377:1;26366:9;26362:17;26353:6;26309:71;:::i;:::-;26390:72;26458:2;26447:9;26443:18;26434:6;26390:72;:::i;:::-;26472;26540:2;26529:9;26525:18;26516:6;26472:72;:::i;:::-;26263:288;;;;;;:::o;26557:214::-;26646:4;26684:2;26673:9;26669:18;26661:26;;26697:67;26761:1;26750:9;26746:17;26737:6;26697:67;:::i;:::-;26651:120;;;;:::o;26777:132::-;26844:4;26867:3;26859:11;;26897:4;26892:3;26888:14;26880:22;;26849:60;;;:::o;26915:114::-;26982:6;27016:5;27010:12;27000:22;;26989:40;;;:::o;27035:99::-;27087:6;27121:5;27115:12;27105:22;;27094:40;;;:::o;27140:113::-;27210:4;27242;27237:3;27233:14;27225:22;;27215:38;;;:::o;27259:184::-;27358:11;27392:6;27387:3;27380:19;27432:4;27427:3;27423:14;27408:29;;27370:73;;;;:::o;27449:169::-;27533:11;27567:6;27562:3;27555:19;27607:4;27602:3;27598:14;27583:29;;27545:73;;;;:::o;27624:305::-;27664:3;27683:20;27701:1;27683:20;:::i;:::-;27678:25;;27717:20;27735:1;27717:20;:::i;:::-;27712:25;;27871:1;27803:66;27799:74;27796:1;27793:81;27790:2;;;27877:18;;:::i;:::-;27790:2;27921:1;27918;27914:9;27907:16;;27668:261;;;;:::o;27935:185::-;27975:1;27992:20;28010:1;27992:20;:::i;:::-;27987:25;;28026:20;28044:1;28026:20;:::i;:::-;28021:25;;28065:1;28055:2;;28070:18;;:::i;:::-;28055:2;28112:1;28109;28105:9;28100:14;;27977:143;;;;:::o;28126:848::-;28187:5;28194:4;28218:6;28209:15;;28242:5;28233:14;;28256:712;28277:1;28267:8;28264:15;28256:712;;;28372:4;28367:3;28363:14;28357:4;28354:24;28351:2;;;28381:18;;:::i;:::-;28351:2;28431:1;28421:8;28417:16;28414:2;;;28846:4;28839:5;28835:16;28826:25;;28414:2;28896:4;28890;28886:15;28878:23;;28926:32;28949:8;28926:32;:::i;:::-;28914:44;;28256:712;;;28199:775;;;;;;;:::o;28980:281::-;29038:5;29062:23;29080:4;29062:23;:::i;:::-;29054:31;;29106:25;29122:8;29106:25;:::i;:::-;29094:37;;29150:104;29187:66;29177:8;29171:4;29150:104;:::i;:::-;29141:113;;29044:217;;;;:::o;29267:1073::-;29321:5;29512:8;29502:2;;29533:1;29524:10;;29535:5;;29502:2;29561:4;29551:2;;29578:1;29569:10;;29580:5;;29551:2;29647:4;29695:1;29690:27;;;;29731:1;29726:191;;;;29640:277;;29690:27;29708:1;29699:10;;29710:5;;;29726:191;29771:3;29761:8;29758:17;29755:2;;;29778:18;;:::i;:::-;29755:2;29827:8;29824:1;29820:16;29811:25;;29862:3;29855:5;29852:14;29849:2;;;29869:18;;:::i;:::-;29849:2;29902:5;;;29640:277;;30026:2;30016:8;30013:16;30007:3;30001:4;29998:13;29994:36;29976:2;29966:8;29963:16;29958:2;29952:4;29949:12;29945:35;29929:111;29926:2;;;30082:8;30076:4;30072:19;30063:28;;30117:3;30110:5;30107:14;30104:2;;;30124:18;;:::i;:::-;30104:2;30157:5;;29926:2;30197:42;30235:3;30225:8;30219:4;30216:1;30197:42;:::i;:::-;30182:57;;;;30271:4;30266:3;30262:14;30255:5;30252:25;30249:2;;;30280:18;;:::i;:::-;30249:2;30329:4;30322:5;30318:16;30309:25;;29327:1013;;;;;;:::o;30346:348::-;30386:7;30409:20;30427:1;30409:20;:::i;:::-;30404:25;;30443:20;30461:1;30443:20;:::i;:::-;30438:25;;30631:1;30563:66;30559:74;30556:1;30553:81;30548:1;30541:9;30534:17;30530:105;30527:2;;;30638:18;;:::i;:::-;30527:2;30686:1;30683;30679:9;30668:20;;30394:300;;;;:::o;30700:191::-;30740:4;30760:20;30778:1;30760:20;:::i;:::-;30755:25;;30794:20;30812:1;30794:20;:::i;:::-;30789:25;;30833:1;30830;30827:8;30824:2;;;30838:18;;:::i;:::-;30824:2;30883:1;30880;30876:9;30868:17;;30745:146;;;;:::o;30897:96::-;30934:7;30963:24;30981:5;30963:24;:::i;:::-;30952:35;;30942:51;;;:::o;30999:104::-;31044:7;31073:24;31091:5;31073:24;:::i;:::-;31062:35;;31052:51;;;:::o;31109:90::-;31143:7;31186:5;31179:13;31172:21;31161:32;;31151:48;;;:::o;31205:126::-;31242:7;31282:42;31275:5;31271:54;31260:65;;31250:81;;;:::o;31337:77::-;31374:7;31403:5;31392:16;;31382:32;;;:::o;31420:86::-;31455:7;31495:4;31488:5;31484:16;31473:27;;31463:43;;;:::o;31512:121::-;31570:9;31603:24;31621:5;31603:24;:::i;:::-;31590:37;;31580:53;;;:::o;31639:307::-;31707:1;31717:113;31731:6;31728:1;31725:13;31717:113;;;31816:1;31811:3;31807:11;31801:18;31797:1;31792:3;31788:11;31781:39;31753:2;31750:1;31746:10;31741:15;;31717:113;;;31848:6;31845:1;31842:13;31839:2;;;31928:1;31919:6;31914:3;31910:16;31903:27;31839:2;31688:258;;;;:::o;31952:233::-;31991:3;32014:24;32032:5;32014:24;:::i;:::-;32005:33;;32060:66;32053:5;32050:77;32047:2;;;32130:18;;:::i;:::-;32047:2;32177:1;32170:5;32166:13;32159:20;;31995:190;;;:::o;32191:180::-;32239:77;32236:1;32229:88;32336:4;32333:1;32326:15;32360:4;32357:1;32350:15;32377:180;32425:77;32422:1;32415:88;32522:4;32519:1;32512:15;32546:4;32543:1;32536:15;32563:102;32604:6;32655:2;32651:7;32646:2;32639:5;32635:14;32631:28;32621:38;;32611:54;;;:::o;32671:102::-;32713:8;32760:5;32757:1;32753:13;32732:34;;32722:51;;;:::o;32779:178::-;32919:30;32915:1;32907:6;32903:14;32896:54;32885:72;:::o;32963:227::-;33103:34;33099:1;33091:6;33087:14;33080:58;33172:10;33167:2;33159:6;33155:15;33148:35;33069:121;:::o;33196:223::-;33336:34;33332:1;33324:6;33320:14;33313:58;33405:6;33400:2;33392:6;33388:15;33381:31;33302:117;:::o;33425:231::-;33565:34;33561:1;33553:6;33549:14;33542:58;33634:14;33629:2;33621:6;33617:15;33610:39;33531:125;:::o;33662:229::-;33802:34;33798:1;33790:6;33786:14;33779:58;33871:12;33866:2;33858:6;33854:15;33847:37;33768:123;:::o;33897:225::-;34037:34;34033:1;34025:6;34021:14;34014:58;34106:8;34101:2;34093:6;34089:15;34082:33;34003:119;:::o;34128:223::-;34268:34;34264:1;34256:6;34252:14;34245:58;34337:6;34332:2;34324:6;34320:15;34313:31;34234:117;:::o;34357:224::-;34497:34;34493:1;34485:6;34481:14;34474:58;34566:7;34561:2;34553:6;34549:15;34542:32;34463:118;:::o;34587:225::-;34727:34;34723:1;34715:6;34711:14;34704:58;34796:8;34791:2;34783:6;34779:15;34772:33;34693:119;:::o;34818:181::-;34958:33;34954:1;34946:6;34942:14;34935:57;34924:75;:::o;35005:227::-;35145:34;35141:1;35133:6;35129:14;35122:58;35214:10;35209:2;35201:6;35197:15;35190:35;35111:121;:::o;35238:238::-;35378:34;35374:1;35366:6;35362:14;35355:58;35447:21;35442:2;35434:6;35430:15;35423:46;35344:132;:::o;35482:182::-;35622:34;35618:1;35610:6;35606:14;35599:58;35588:76;:::o;35670:228::-;35810:34;35806:1;35798:6;35794:14;35787:58;35879:11;35874:2;35866:6;35862:15;35855:36;35776:122;:::o;35904:225::-;36044:34;36040:1;36032:6;36028:14;36021:58;36113:8;36108:2;36100:6;36096:15;36089:33;36010:119;:::o;36135:232::-;36275:34;36271:1;36263:6;36259:14;36252:58;36344:15;36339:2;36331:6;36327:15;36320:40;36241:126;:::o;36373:227::-;36513:34;36509:1;36501:6;36497:14;36490:58;36582:10;36577:2;36569:6;36565:15;36558:35;36479:121;:::o;36606:224::-;36746:34;36742:1;36734:6;36730:14;36723:58;36815:7;36810:2;36802:6;36798:15;36791:32;36712:118;:::o;36836:238::-;36976:34;36972:1;36964:6;36960:14;36953:58;37045:21;37040:2;37032:6;37028:15;37021:46;36942:132;:::o;37080:224::-;37220:34;37216:1;37208:6;37204:14;37197:58;37289:7;37284:2;37276:6;37272:15;37265:32;37186:118;:::o;37310:226::-;37450:34;37446:1;37438:6;37434:14;37427:58;37519:9;37514:2;37506:6;37502:15;37495:34;37416:120;:::o;37542:122::-;37615:24;37633:5;37615:24;:::i;:::-;37608:5;37605:35;37595:2;;37654:1;37651;37644:12;37595:2;37585:79;:::o;37670:138::-;37751:32;37777:5;37751:32;:::i;:::-;37744:5;37741:43;37731:2;;37798:1;37795;37788:12;37731:2;37721:87;:::o;37814:116::-;37884:21;37899:5;37884:21;:::i;:::-;37877:5;37874:32;37864:2;;37920:1;37917;37910:12;37864:2;37854:76;:::o;37936:122::-;38009:24;38027:5;38009:24;:::i;:::-;38002:5;37999:35;37989:2;;38048:1;38045;38038:12;37989:2;37979:79;:::o

Swarm Source

ipfs://672236937ca7b5b03bb460c3d27708a3cc93572bdbeb53792484261b91e22235
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.