ETH Price: $2,475.20 (-1.89%)

Token

ICHIGO (ICHIGO)
 

Overview

Max Total Supply

1,000,000,000 ICHIGO

Holders

45

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
622,953.614473615 ICHIGO

Value
$0.00
0xb10c98acffdd34bc92befeefe17de40c239caf0e
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:
ICHIGO

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : Ichigo.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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
    );
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

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

    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"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

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

        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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 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 getTime() public view returns (uint256) {
        return block.timestamp;
    }
}


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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}


interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract ICHIGO is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    address payable public marketingAddress;
    address payable public infrastructure;
    address payable public liquidityAddress;
        
    mapping(address => uint256) private _holders;
    mapping(address => mapping(address => uint256)) private _allowances;
    
    mapping(address => bool) private _isExcludedFromFee;
    
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal =  1000000000 * 1e9;
 
    string private constant _name = "ICHIGO";
    string private constant _symbol = "ICHIGO";
    uint8 private constant _decimals = 9;

    uint256 private _taxFee;
    uint256 private _previousTaxFee = _taxFee;

    uint256 private _marketingFee;
    
    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee = _liquidityFee;
    
    uint256 private constant BUY = 1;
    uint256 private constant SELL = 2;
    uint256 private constant TRANSFER = 3;
    uint256 private buyOrSellSwitch;

    uint256 public _buyTaxFee = 3;
    uint256 public _buyLiquidityFee = 1;
    uint256 public _buyMarketingFee = 2;

    uint256 public _sellTaxFee = 3;
    uint256 public _sellLiquidityFee = 1;
    uint256 public _sellMarketingFee = 2;
        
    uint256 public maxHoldAmount;
    mapping (address => bool) public _isExcludedMaxHoldAmount;
        
    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    uint256 private minimumTokensBeforeSwap;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;
    bool public tradingActive = false;

    event SwapAndLiquifyEnabledUpdated(bool enabled);
            
    event TransferForeignToken(address token, uint256 amount);
    
    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        _holders[_msgSender()] = _tTotal;
     
        maxHoldAmount = _tTotal.mul(4).div(100); 
        minimumTokensBeforeSwap = 2000000 * 1e9;
        
        marketingAddress = payable(0x67FD71b8e33600f44E05cD16E9507d98CEfB0F84);
        infrastructure = payable(0x5A2919010Be09a61Ed1a7985ef6A1DC136CeA9bE); 
        
        liquidityAddress = _msgSender();
        
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[marketingAddress] = true;
        _isExcludedFromFee[infrastructure] = true;

        
        excludeFromMaxHold(owner(), true);
        excludeFromMaxHold(address(0xdead), true);
        excludeFromMaxHold(address(0), true);
        excludeFromMaxHold(address(this), true);
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() external pure returns (string memory) {
        return _name;
    }

    function symbol() external pure returns (string memory) {
        return _symbol;
    }

    function decimals() external pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() external pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _holders[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)
        public
        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;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }
    
    function excludeFromMaxHold(address account, bool status) public onlyOwner {
        _isExcludedMaxHoldAmount[account] = status;
    }
    
    // once enabled, can never be turned off
    function enableTrading() internal onlyOwner {
        tradingActive = true;
        swapAndLiquifyEnabled = true;
    }
    
    function launch(address[] memory airdropWallets, uint256[] memory amounts) external onlyOwner returns (bool){
        require(!tradingActive, "trading is already active");
        require(airdropWallets.length < 100, "max 100 wallets");
        for(uint256 i = 0; i < airdropWallets.length; i++){
            address wallet = airdropWallets[i];
            uint256 amount = amounts[i];
            _transfer(msg.sender, wallet, amount);
        }
        enableTrading();
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        excludeFromMaxHold(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxHold(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        require(address(this).balance > 0, "ETH required for launch");
        addLiquidity(balanceOf(address(this)), address(this).balance);
        swapAndLiquifyEnabled = true;
        return true;
    }
    
    function minimumTokensBeforeSwapAmount() external view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    function setMinimumTokensBeforeSwapAmount(uint256 amount) external onlyOwner {
        minimumTokensBeforeSwap = amount;
    }

    function setMaxHoldAmount(uint256 amount) external onlyOwner {
        maxHoldAmount = amount;
    }
    
    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
        _isExcludedMaxHoldAmount[pair] = value;
    }
    
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        if(!tradingActive){
            require(_isExcludedFromFee[from] || _isExcludedFromFee[to], "Trading is not active yet.");
        }

        if (!_isExcludedMaxHoldAmount[to]) {
            uint256 toBalance = balanceOf(to);
            require(toBalance.add(amount) <= maxHoldAmount, "Exceeded max hold");
        }
        
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;

        // swap and liquify
        if (
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled &&
            balanceOf(uniswapV2Pair) > 0 &&
            !_isExcludedFromFee[to] &&
            !_isExcludedFromFee[from] &&
            automatedMarketMakerPairs[to] &&
            overMinimumTokenBalance
        ) {
            swapBack();
        }

        bool takeFee = true;

        // If any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
            buyOrSellSwitch = TRANSFER; // zero tax
        } else {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                removeAllFee();
                _taxFee = _buyTaxFee;
                _liquidityFee = _buyLiquidityFee + _buyMarketingFee;
                buyOrSellSwitch = BUY;
            } 
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                removeAllFee();
                _taxFee = _sellTaxFee;
                _liquidityFee = _sellLiquidityFee + _sellMarketingFee;
                buyOrSellSwitch = SELL;
             
            } else {
                removeAllFee();
                buyOrSellSwitch = TRANSFER; // zero tax
            }
        }
        
        _tokenTransfer(from, to, amount, takeFee);
        
    }

    function swapBack() private lockTheSwap {
        uint256 contractBalance = balanceOf(address(this));
        uint256 _totalFee = _buyTaxFee + _buyLiquidityFee + _buyMarketingFee;

        // totalFees must not be zero
        _totalFee = _totalFee > 0 ? _totalFee : 6;

        uint256 _infrastructureTokensToSwap = contractBalance.mul(_buyTaxFee > 0? _buyTaxFee : 3).div(_totalFee);
        uint256 _liquidityTokensToSwap = contractBalance.mul(_buyLiquidityFee > 0 ? _buyLiquidityFee : 1).div(_totalFee);
        uint256 _marketingTokensToSwap = contractBalance.mul(_buyMarketingFee > 0? _buyMarketingFee : 2).div(_totalFee);

        uint256 totalTokensToSwap = _liquidityTokensToSwap + _marketingTokensToSwap + _infrastructureTokensToSwap;
        
        // Halve the amount of liquidity tokens
        uint256 tokensForLiquidity = _liquidityTokensToSwap.div(2);
        uint256 amountToSwapForETH = contractBalance.sub(tokensForLiquidity);
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForETH(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        
        uint256 ethForMarketing = ethBalance.mul(_marketingTokensToSwap).div(totalTokensToSwap);
        
        uint256 ethForLiquidity = ethBalance.mul(_liquidityTokensToSwap).div(totalTokensToSwap);
        
        uint256 ethForDev = ethBalance.sub(ethForMarketing + ethForLiquidity);
        
        (bool success,) = address(marketingAddress).call{value: ethForMarketing}("");
        (success,) = address(infrastructure).call{value: ethForDev}("");
        
        addLiquidity(tokensForLiquidity, ethForLiquidity);
        
        // send remaining eth
        if(address(this).balance > 1e17){
            (success,) = address(infrastructure).call{value: address(this).balance}("");
        }
    }
    
    function forceSwapBack() external onlyOwner {
        uint256 contractBalance = balanceOf(address(this));
        require(contractBalance >= 500000 * 1e9, " < 0.05% of tokens stuck");
        swapBack();
    }
    
    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityAddress,
            block.timestamp
        );
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (!takeFee) removeAllFee();

        (
            uint256 transferAmount,
            uint256 tFee
        ) = _getValues(amount);
        _holders[sender] = _holders[sender].sub(amount);
        _holders[address(this)] = _holders[address(this)].add(tFee);
        _holders[recipient] = _holders[recipient].add(transferAmount);

        emit Transfer(sender, recipient, transferAmount);

        if (!takeFee) restoreAllFee();
    }

    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 liquidityAmount = calculateLiquidityFee(tAmount);
        uint256 transferAmount = tAmount.sub(tFee).sub(liquidityAmount);
        uint256 fees = tFee.add(liquidityAmount);
        
        return (transferAmount, fees);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_liquidityFee).div(10**2);
    }

    function removeAllFee() private {
        if (_taxFee == 0 && _liquidityFee == 0) return;

        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;

        _taxFee = 0;
        _liquidityFee = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
    }

    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }
    
    function excludeFromFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setBuyFee(uint256 buyTaxFee, uint256 buyLiquidityFee, uint256 buyMarketingFee)
        external
        onlyOwner
    {
        _buyTaxFee = buyTaxFee;
        _buyLiquidityFee = buyLiquidityFee;
        _buyMarketingFee = buyMarketingFee;
        require(_buyTaxFee + _buyLiquidityFee + _buyMarketingFee <= 10, " > 10%");
    }

    function setSellFee(uint256 sellTaxFee, uint256 sellLiquidityFee, uint256 sellMarketingFee)
        external
        onlyOwner
    {
        _sellTaxFee = sellTaxFee;
        _sellLiquidityFee = sellLiquidityFee;
        _sellMarketingFee = sellMarketingFee;
        require(_sellTaxFee + _sellLiquidityFee + _sellMarketingFee <= 15, " > 15%");
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner {
        require(_marketingAddress != address(0), "0 address");
        _isExcludedFromFee[marketingAddress] = false;
        marketingAddress = payable(_marketingAddress);
        _isExcludedFromFee[marketingAddress] = true;
    }
    
    function setLiquidityAddress(address _liquidityAddress) public onlyOwner {
        require(_liquidityAddress != address(0), "0 address");
        liquidityAddress = payable(_liquidityAddress);
        _isExcludedFromFee[liquidityAddress] = true;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    // To receive ETH from uniswapV2Router when swapping
    receive() external payable {}

    function transferForeignToken(address _token, address _to)
        external
        onlyOwner
        returns (bool _sent)
    {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this), "ICHIGO not allowed");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }
    
    function withdrawStuckETH() external onlyOwner {
        require(!tradingActive, "Can only withdraw if trading hasn't started");
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"inputs":[],"name":"_buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxHoldAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"excludeFromMaxHold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","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":[],"name":"infrastructure","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","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":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"launch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHoldAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyTaxFee","type":"uint256"},{"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"buyMarketingFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityAddress","type":"address"}],"name":"setLiquidityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxHoldAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinimumTokensBeforeSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellTaxFee","type":"uint256"},{"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"sellMarketingFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600954600a55600c54600d556003600f55600160105560026011556003601255600160135560026014556000601a60156101000a81548160ff0219169083151502179055506000601a60166101000a81548160ff0219169083151502179055503480156200007157600080fd5b506000620000846200055e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350670de0b6b3a7640000600660006200013f6200055e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001ba6064620001a66004670de0b6b3a76400006200056660201b620028d91790919060201c565b620005e960201b620029531790919060201c565b60158190555066071afd498d00006018819055507367fd71b8e33600f44e05cd16e9507d98cefb0f84600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735a2919010be09a61ed1a7985ef6a1dc136cea9be600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002886200055e60201b60201c565b600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160086000620002de6200063b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200049d6200048f6200063b60201b60201c565b60016200066460201b60201c565b620004b261dead60016200066460201b60201c565b620004c6600060016200066460201b60201c565b620004d93060016200066460201b60201c565b620004e96200055e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef670de0b6b3a7640000604051620005509190620007e2565b60405180910390a362000aa8565b600033905090565b60008083036200057a5760009050620005e3565b600082846200058a91906200082e565b90508284826200059b9190620008a8565b14620005de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d59062000967565b60405180910390fd5b809150505b92915050565b60006200063383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200075f60201b60201c565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620006746200055e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000704576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006fb90620009d9565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083118290620007a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a0919062000a84565b60405180910390fd5b5060008385620007ba9190620008a8565b9050809150509392505050565b6000819050919050565b620007dc81620007c7565b82525050565b6000602082019050620007f96000830184620007d1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200083b82620007c7565b91506200084883620007c7565b92508282026200085881620007c7565b91508282048414831517620008725762000871620007ff565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620008b582620007c7565b9150620008c283620007c7565b925082620008d557620008d462000879565b5b828204905092915050565b600082825260208201905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006200094f602183620008e0565b91506200095c82620008f1565b604082019050919050565b60006020820190508181036000830152620009828162000940565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620009c1602083620008e0565b9150620009ce8262000989565b602082019050919050565b60006020820190508181036000830152620009f481620009b2565b9050919050565b600081519050919050565b60005b8381101562000a2657808201518184015260208101905062000a09565b60008484015250505050565b6000601f19601f8301169050919050565b600062000a5082620009fb565b62000a5c8185620008e0565b935062000a6e81856020860162000a06565b62000a798162000a32565b840191505092915050565b6000602082019050818103600083015262000aa0818462000a43565b905092915050565b6156e58062000ab86000396000f3fe6080604052600436106102975760003560e01c8063906e9dd01161015a578063c8607952116100c1578063ea2f0b371161007a578063ea2f0b3714610a51578063ef10fb9714610a7a578063efcc52de14610ab7578063f2fde38b14610ae2578063f5648a4f14610b0b578063fb02f76f14610b225761029e565b8063c860795214610941578063cd03425c1461096c578063d8b6004014610997578063dc44b6a0146109c0578063dd62ed3e146109eb578063df4fd51514610a285761029e565b8063a5ece94111610113578063a5ece9411461081d578063a9059cbb14610848578063b62496f514610885578063bbc0c742146108c2578063c49b9a80146108ed578063c5d24189146109165761029e565b8063906e9dd01461070d57806395d89b41146107365780639a7a23d6146107615780639bd565d61461078a578063a073d37f146107b5578063a457c2d7146107e05761029e565b806349bd5a5e116101fe578063602bc62b116101b7578063602bc62b146105d557806370a08231146106005780638366e79a1461063d578063837917581461067a57806388790a68146106b75780638da5cb5b146106e25761029e565b806349bd5a5e146104d75780634a74bb021461050257806351f205e41461052d578063525fa81f146105445780635342acb41461056d578063557ed1ba146105aa5761029e565b806323b872dd1161025057806323b872dd146103b557806325519cf2146103f2578063313ce5671461041b5780633221c93f146104465780633950935114610471578063437823ec146104ae5761029e565b806306fdde03146102a3578063095ea7b3146102ce5780631694505e1461030b57806318160ddd146103365780631d865c3014610361578063200a692d1461038a5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610b4b565b6040516102c59190613fd7565b60405180910390f35b3480156102da57600080fd5b506102f560048036038101906102f091906140a1565b610b88565b60405161030291906140fc565b60405180910390f35b34801561031757600080fd5b50610320610ba6565b60405161032d9190614176565b60405180910390f35b34801561034257600080fd5b5061034b610bcc565b60405161035891906141a0565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906141bb565b610bdc565b005b34801561039657600080fd5b5061039f610ceb565b6040516103ac91906141a0565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d7919061420e565b610cf1565b6040516103e991906140fc565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906141bb565b610dca565b005b34801561042757600080fd5b50610430610ed9565b60405161043d919061427d565b60405180910390f35b34801561045257600080fd5b5061045b610ee2565b60405161046891906142b9565b60405180910390f35b34801561047d57600080fd5b50610498600480360381019061049391906140a1565b610f08565b6040516104a591906140fc565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d091906142d4565b610fbb565b005b3480156104e357600080fd5b506104ec6110ab565b6040516104f99190614310565b60405180910390f35b34801561050e57600080fd5b506105176110d1565b60405161052491906140fc565b60405180910390f35b34801561053957600080fd5b506105426110e4565b005b34801561055057600080fd5b5061056b600480360381019061056691906142d4565b6111db565b005b34801561057957600080fd5b50610594600480360381019061058f91906142d4565b61139d565b6040516105a191906140fc565b60405180910390f35b3480156105b657600080fd5b506105bf6113f3565b6040516105cc91906141a0565b60405180910390f35b3480156105e157600080fd5b506105ea6113fb565b6040516105f791906141a0565b60405180910390f35b34801561060c57600080fd5b50610627600480360381019061062291906142d4565b611405565b60405161063491906141a0565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f919061432b565b61144e565b60405161067191906140fc565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190614576565b611700565b6040516106ae91906140fc565b60405180910390f35b3480156106c357600080fd5b506106cc611ba7565b6040516106d991906141a0565b60405180910390f35b3480156106ee57600080fd5b506106f7611bad565b6040516107049190614310565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906142d4565b611bd6565b005b34801561074257600080fd5b5061074b611e12565b6040516107589190613fd7565b60405180910390f35b34801561076d57600080fd5b506107886004803603810190610783919061461a565b611e4f565b005b34801561079657600080fd5b5061079f611f82565b6040516107ac91906142b9565b60405180910390f35b3480156107c157600080fd5b506107ca611fa8565b6040516107d791906141a0565b60405180910390f35b3480156107ec57600080fd5b50610807600480360381019061080291906140a1565b611fb2565b60405161081491906140fc565b60405180910390f35b34801561082957600080fd5b5061083261207f565b60405161083f91906142b9565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a91906140a1565b6120a5565b60405161087c91906140fc565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a791906142d4565b6120c3565b6040516108b991906140fc565b60405180910390f35b3480156108ce57600080fd5b506108d76120e3565b6040516108e491906140fc565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f919061465a565b6120f6565b005b34801561092257600080fd5b5061092b6121df565b60405161093891906141a0565b60405180910390f35b34801561094d57600080fd5b506109566121e5565b60405161096391906141a0565b60405180910390f35b34801561097857600080fd5b506109816121eb565b60405161098e91906141a0565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b99190614687565b6121f1565b005b3480156109cc57600080fd5b506109d5612290565b6040516109e291906141a0565b60405180910390f35b3480156109f757600080fd5b50610a126004803603810190610a0d919061432b565b612296565b604051610a1f91906141a0565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a9190614687565b61231d565b005b348015610a5d57600080fd5b50610a786004803603810190610a7391906142d4565b6123bc565b005b348015610a8657600080fd5b50610aa16004803603810190610a9c91906142d4565b6124ac565b604051610aae91906140fc565b60405180910390f35b348015610ac357600080fd5b50610acc6124cc565b604051610ad991906141a0565b60405180910390f35b348015610aee57600080fd5b50610b096004803603810190610b0491906142d4565b6124d2565b005b348015610b1757600080fd5b50610b20612693565b005b348015610b2e57600080fd5b50610b496004803603810190610b44919061461a565b6127e9565b005b60606040518060400160405280600681526020017f49434849474f0000000000000000000000000000000000000000000000000000815250905090565b6000610b9c610b9561299d565b84846129a5565b6001905092915050565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000670de0b6b3a7640000905090565b610be461299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6890614700565b60405180910390fd5b826012819055508160138190555080601481905550600f601454601354601254610c9b919061474f565b610ca5919061474f565b1115610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd906147cf565b60405180910390fd5b505050565b60125481565b6000610cfe848484612b6e565b610dbf84610d0a61299d565b610dba8560405180606001604052806028815260200161566360289139600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d7061299d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131b99092919063ffffffff16565b6129a5565b600190509392505050565b610dd261299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690614700565b60405180910390fd5b82600f819055508160108190555080601181905550600a601154601054600f54610e89919061474f565b610e93919061474f565b1115610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb9061483b565b60405180910390fd5b505050565b60006009905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610fb1610f1561299d565b84610fac8560076000610f2661299d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461321d90919063ffffffff16565b6129a5565b6001905092915050565b610fc361299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790614700565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601a60159054906101000a900460ff1681565b6110ec61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614700565b60405180910390fd5b600061118430611405565b90506601c6bf526340008110156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c7906148a7565b60405180910390fd5b6111d861327b565b50565b6111e361299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126790614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690614913565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160086000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600042905090565b6000600254905090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061145861299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b9061497f565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b9906149eb565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115fd9190614310565b602060405180830381865afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190614a20565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161167b929190614a4d565b6020604051808303816000875af115801561169a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116be9190614a8b565b91507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e43884826040516116f1929190614a4d565b60405180910390a15092915050565b600061170a61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e90614700565b60405180910390fd5b601a60169054906101000a900460ff16156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90614b04565b60405180910390fd5b606483511061182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614b70565b60405180910390fd5b60005b835181101561189557600084828151811061184c5761184b614b90565b5b60200260200101519050600084838151811061186b5761186a614b90565b5b60200260200101519050611880338383612b6e565b5050808061188d90614bbf565b91505061182e565b5061189e613661565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506118c28160016127e9565b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061193830601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16670de0b6b3a76400006129a5565b8073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a79190614c1c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a329190614c1c565b6040518363ffffffff1660e01b8152600401611a4f929190614c49565b6020604051808303816000875af1158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190614c1c565b601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611aff601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016127e9565b611b2c601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161372e565b60004711611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690614cbe565b60405180910390fd5b611b81611b7b30611405565b476137e0565b6001601a60156101000a81548160ff021916908315150217905550600191505092915050565b60135481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bde61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6290614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190614913565b60405180910390fd5b600060086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606040518060400160405280600681526020017f49434849474f0000000000000000000000000000000000000000000000000000815250905090565b611e5761299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90614700565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6b90614d2a565b60405180910390fd5b611f7e828261372e565b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601854905090565b6000612075611fbf61299d565b846120708560405180606001604052806025815260200161568b6025913960076000611fe961299d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131b99092919063ffffffff16565b6129a5565b6001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120b96120b261299d565b8484612b6e565b6001905092915050565b60176020528060005260406000206000915054906101000a900460ff1681565b601a60169054906101000a900460ff1681565b6120fe61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461218b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218290614700565b60405180910390fd5b80601a60156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516121d491906140fc565b60405180910390a150565b60115481565b60145481565b60155481565b6121f961299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614700565b60405180910390fd5b8060158190555050565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61232561299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990614700565b60405180910390fd5b8060188190555050565b6123c461299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614700565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60166020528060005260406000206000915054906101000a900460ff1681565b600f5481565b6124da61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255e90614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cd90614dbc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61269b61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271f90614700565b60405180910390fd5b601a60169054906101000a900460ff1615612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f90614e4e565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161279e90614e9f565b60006040518083038185875af1925050503d80600081146127db576040519150601f19603f3d011682016040523d82523d6000602084013e6127e0565b606091505b50508091505050565b6127f161299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590614700565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083036128eb576000905061294d565b600082846128f99190614eb4565b90508284826129089190614f25565b14612948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293f90614fc8565b60405180910390fd5b809150505b92915050565b600061299583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138e0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0b9061505a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7a906150ec565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612b6191906141a0565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd49061517e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4390615210565b60405180910390fd5b60008111612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c86906152a2565b60405180910390fd5b601a60169054906101000a900460ff16612d8457600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d445750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7a9061530e565b60405180910390fd5b5b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612e3b576000612de083611405565b9050601554612df8838361321d90919063ffffffff16565b1115612e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e309061537a565b60405180910390fd5b505b6000612e4630611405565b905060006018548210159050601a60149054906101000a900460ff16158015612e7b5750601a60159054906101000a900460ff165b8015612eb157506000612eaf601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611405565b115b8015612f075750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612f5d5750600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612fb25750601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612fbb5750805b15612fc957612fc861327b565b5b600060019050600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806130705750600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561308657600090506003600e819055506131a5565b601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561310c576130e0613943565b600f546009819055506011546010546130f9919061474f565b600c819055506001600e819055506131a4565b601760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561319257613166613943565b60125460098190555060145460135461317f919061474f565b600c819055506002600e819055506131a3565b61319a613943565b6003600e819055505b5b5b6131b186868684613980565b505050505050565b6000838311158290613201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f89190613fd7565b60405180910390fd5b5060008385613210919061539a565b9050809150509392505050565b600080828461322c919061474f565b905083811015613271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132689061541a565b60405180910390fd5b8091505092915050565b6001601a60146101000a81548160ff02191690831515021790555060006132a130611405565b90506000601154601054600f546132b8919061474f565b6132c2919061474f565b9050600081116132d35760066132d5565b805b90506000613312826133046000600f54116132f15760036132f5565b600f545b866128d990919063ffffffff16565b61295390919063ffffffff16565b9050600061334f8361334160006010541161332e576001613332565b6010545b876128d990919063ffffffff16565b61295390919063ffffffff16565b9050600061338c8461337e60006011541161336b57600261336f565b6011545b886128d990919063ffffffff16565b61295390919063ffffffff16565b9050600083828461339d919061474f565b6133a7919061474f565b905060006133bf60028561295390919063ffffffff16565b905060006133d68289613bd890919063ffffffff16565b905060004790506133e682613c22565b60006133fb8247613bd890919063ffffffff16565b905060006134248661341689856128d990919063ffffffff16565b61295390919063ffffffff16565b9050600061344d8761343f8b866128d990919063ffffffff16565b61295390919063ffffffff16565b9050600061346f8284613460919061474f565b85613bd890919063ffffffff16565b90506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516134b990614e9f565b60006040518083038185875af1925050503d80600081146134f6576040519150601f19603f3d011682016040523d82523d6000602084013e6134fb565b606091505b50509050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161354590614e9f565b60006040518083038185875af1925050503d8060008114613582576040519150601f19603f3d011682016040523d82523d6000602084013e613587565b606091505b50508091505061359788846137e0565b67016345785d8a000047111561363657600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516135ed90614e9f565b60006040518083038185875af1925050503d806000811461362a576040519150601f19603f3d011682016040523d82523d6000602084013e61362f565b606091505b5050809150505b50505050505050505050505050506000601a60146101000a81548160ff021916908315150217905550565b61366961299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ed90614700565b60405180910390fd5b6001601a60166101000a81548160ff0219169083151502179055506001601a60156101000a81548160ff021916908315150217905550565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61380d30601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846129a5565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161389696959493929190615496565b60606040518083038185885af11580156138b4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906138d991906154f7565b5050505050565b60008083118290613927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391e9190613fd7565b60405180910390fd5b50600083856139369190614f25565b9050809150509392505050565b600060095414801561395757506000600c54145b61397e57600954600a81905550600c54600d8190555060006009819055506000600c819055505b565b8061398e5761398d613943565b5b60008061399a84613e65565b915091506139f084600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613bd890919063ffffffff16565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a8581600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461321d90919063ffffffff16565b600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b1a82600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461321d90919063ffffffff16565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bba91906141a0565b60405180910390a382613bd057613bcf613ed1565b5b505050505050565b6000613c1a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506131b9565b905092915050565b6000600267ffffffffffffffff811115613c3f57613c3e614370565b5b604051908082528060200260200182016040528015613c6d5781602001602082028036833780820191505090505b5090503081600081518110613c8557613c84614b90565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d509190614c1c565b81600181518110613d6457613d63614b90565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613dcb30601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846129a5565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613e2f959493929190615608565b600060405180830381600087803b158015613e4957600080fd5b505af1158015613e5d573d6000803e3d6000fd5b505050505050565b6000806000613e7384613ee5565b90506000613e8085613f16565b90506000613ea982613e9b8589613bd890919063ffffffff16565b613bd890919063ffffffff16565b90506000613ec0838561321d90919063ffffffff16565b905081819550955050505050915091565b600a54600981905550600d54600c81905550565b6000613f0f6064613f01600954856128d990919063ffffffff16565b61295390919063ffffffff16565b9050919050565b6000613f406064613f32600c54856128d990919063ffffffff16565b61295390919063ffffffff16565b9050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f81578082015181840152602081019050613f66565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fa982613f47565b613fb38185613f52565b9350613fc3818560208601613f63565b613fcc81613f8d565b840191505092915050565b60006020820190508181036000830152613ff18184613f9e565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140388261400d565b9050919050565b6140488161402d565b811461405357600080fd5b50565b6000813590506140658161403f565b92915050565b6000819050919050565b61407e8161406b565b811461408957600080fd5b50565b60008135905061409b81614075565b92915050565b600080604083850312156140b8576140b7614003565b5b60006140c685828601614056565b92505060206140d78582860161408c565b9150509250929050565b60008115159050919050565b6140f6816140e1565b82525050565b600060208201905061411160008301846140ed565b92915050565b6000819050919050565b600061413c6141376141328461400d565b614117565b61400d565b9050919050565b600061414e82614121565b9050919050565b600061416082614143565b9050919050565b61417081614155565b82525050565b600060208201905061418b6000830184614167565b92915050565b61419a8161406b565b82525050565b60006020820190506141b56000830184614191565b92915050565b6000806000606084860312156141d4576141d3614003565b5b60006141e28682870161408c565b93505060206141f38682870161408c565b92505060406142048682870161408c565b9150509250925092565b60008060006060848603121561422757614226614003565b5b600061423586828701614056565b935050602061424686828701614056565b92505060406142578682870161408c565b9150509250925092565b600060ff82169050919050565b61427781614261565b82525050565b6000602082019050614292600083018461426e565b92915050565b60006142a38261400d565b9050919050565b6142b381614298565b82525050565b60006020820190506142ce60008301846142aa565b92915050565b6000602082840312156142ea576142e9614003565b5b60006142f884828501614056565b91505092915050565b61430a8161402d565b82525050565b60006020820190506143256000830184614301565b92915050565b6000806040838503121561434257614341614003565b5b600061435085828601614056565b925050602061436185828601614056565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143a882613f8d565b810181811067ffffffffffffffff821117156143c7576143c6614370565b5b80604052505050565b60006143da613ff9565b90506143e6828261439f565b919050565b600067ffffffffffffffff82111561440657614405614370565b5b602082029050602081019050919050565b600080fd5b600061442f61442a846143eb565b6143d0565b9050808382526020820190506020840283018581111561445257614451614417565b5b835b8181101561447b57806144678882614056565b845260208401935050602081019050614454565b5050509392505050565b600082601f83011261449a5761449961436b565b5b81356144aa84826020860161441c565b91505092915050565b600067ffffffffffffffff8211156144ce576144cd614370565b5b602082029050602081019050919050565b60006144f26144ed846144b3565b6143d0565b9050808382526020820190506020840283018581111561451557614514614417565b5b835b8181101561453e578061452a888261408c565b845260208401935050602081019050614517565b5050509392505050565b600082601f83011261455d5761455c61436b565b5b813561456d8482602086016144df565b91505092915050565b6000806040838503121561458d5761458c614003565b5b600083013567ffffffffffffffff8111156145ab576145aa614008565b5b6145b785828601614485565b925050602083013567ffffffffffffffff8111156145d8576145d7614008565b5b6145e485828601614548565b9150509250929050565b6145f7816140e1565b811461460257600080fd5b50565b600081359050614614816145ee565b92915050565b6000806040838503121561463157614630614003565b5b600061463f85828601614056565b925050602061465085828601614605565b9150509250929050565b6000602082840312156146705761466f614003565b5b600061467e84828501614605565b91505092915050565b60006020828403121561469d5761469c614003565b5b60006146ab8482850161408c565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146ea602083613f52565b91506146f5826146b4565b602082019050919050565b60006020820190508181036000830152614719816146dd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061475a8261406b565b91506147658361406b565b925082820190508082111561477d5761477c614720565b5b92915050565b7f203e203135250000000000000000000000000000000000000000000000000000600082015250565b60006147b9600683613f52565b91506147c482614783565b602082019050919050565b600060208201905081810360008301526147e8816147ac565b9050919050565b7f203e203130250000000000000000000000000000000000000000000000000000600082015250565b6000614825600683613f52565b9150614830826147ef565b602082019050919050565b6000602082019050818103600083015261485481614818565b9050919050565b7f203c20302e303525206f6620746f6b656e7320737475636b0000000000000000600082015250565b6000614891601883613f52565b915061489c8261485b565b602082019050919050565b600060208201905081810360008301526148c081614884565b9050919050565b7f3020616464726573730000000000000000000000000000000000000000000000600082015250565b60006148fd600983613f52565b9150614908826148c7565b602082019050919050565b6000602082019050818103600083015261492c816148f0565b9050919050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000614969601a83613f52565b915061497482614933565b602082019050919050565b600060208201905081810360008301526149988161495c565b9050919050565b7f49434849474f206e6f7420616c6c6f7765640000000000000000000000000000600082015250565b60006149d5601283613f52565b91506149e08261499f565b602082019050919050565b60006020820190508181036000830152614a04816149c8565b9050919050565b600081519050614a1a81614075565b92915050565b600060208284031215614a3657614a35614003565b5b6000614a4484828501614a0b565b91505092915050565b6000604082019050614a626000830185614301565b614a6f6020830184614191565b9392505050565b600081519050614a85816145ee565b92915050565b600060208284031215614aa157614aa0614003565b5b6000614aaf84828501614a76565b91505092915050565b7f74726164696e6720697320616c72656164792061637469766500000000000000600082015250565b6000614aee601983613f52565b9150614af982614ab8565b602082019050919050565b60006020820190508181036000830152614b1d81614ae1565b9050919050565b7f6d6178203130302077616c6c6574730000000000000000000000000000000000600082015250565b6000614b5a600f83613f52565b9150614b6582614b24565b602082019050919050565b60006020820190508181036000830152614b8981614b4d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614bca8261406b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bfc57614bfb614720565b5b600182019050919050565b600081519050614c168161403f565b92915050565b600060208284031215614c3257614c31614003565b5b6000614c4084828501614c07565b91505092915050565b6000604082019050614c5e6000830185614301565b614c6b6020830184614301565b9392505050565b7f45544820726571756972656420666f72206c61756e6368000000000000000000600082015250565b6000614ca8601783613f52565b9150614cb382614c72565b602082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f766564000000000000600082015250565b6000614d14601a83613f52565b9150614d1f82614cde565b602082019050919050565b60006020820190508181036000830152614d4381614d07565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614da6602683613f52565b9150614db182614d4a565b604082019050919050565b60006020820190508181036000830152614dd581614d99565b9050919050565b7f43616e206f6e6c792077697468647261772069662074726164696e672068617360008201527f6e27742073746172746564000000000000000000000000000000000000000000602082015250565b6000614e38602b83613f52565b9150614e4382614ddc565b604082019050919050565b60006020820190508181036000830152614e6781614e2b565b9050919050565b600081905092915050565b50565b6000614e89600083614e6e565b9150614e9482614e79565b600082019050919050565b6000614eaa82614e7c565b9150819050919050565b6000614ebf8261406b565b9150614eca8361406b565b9250828202614ed88161406b565b91508282048414831517614eef57614eee614720565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f308261406b565b9150614f3b8361406b565b925082614f4b57614f4a614ef6565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fb2602183613f52565b9150614fbd82614f56565b604082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615044602483613f52565b915061504f82614fe8565b604082019050919050565b6000602082019050818103600083015261507381615037565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006150d6602283613f52565b91506150e18261507a565b604082019050919050565b60006020820190508181036000830152615105816150c9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615168602583613f52565b91506151738261510c565b604082019050919050565b600060208201905081810360008301526151978161515b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006151fa602383613f52565b91506152058261519e565b604082019050919050565b60006020820190508181036000830152615229816151ed565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061528c602983613f52565b915061529782615230565b604082019050919050565b600060208201905081810360008301526152bb8161527f565b9050919050565b7f54726164696e67206973206e6f7420616374697665207965742e000000000000600082015250565b60006152f8601a83613f52565b9150615303826152c2565b602082019050919050565b60006020820190508181036000830152615327816152eb565b9050919050565b7f4578636565646564206d617820686f6c64000000000000000000000000000000600082015250565b6000615364601183613f52565b915061536f8261532e565b602082019050919050565b6000602082019050818103600083015261539381615357565b9050919050565b60006153a58261406b565b91506153b08361406b565b92508282039050818111156153c8576153c7614720565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615404601b83613f52565b915061540f826153ce565b602082019050919050565b60006020820190508181036000830152615433816153f7565b9050919050565b6000819050919050565b600061545f61545a6154558461543a565b614117565b61406b565b9050919050565b61546f81615444565b82525050565b600061548082614143565b9050919050565b61549081615475565b82525050565b600060c0820190506154ab6000830189614301565b6154b86020830188614191565b6154c56040830187615466565b6154d26060830186615466565b6154df6080830185615487565b6154ec60a0830184614191565b979650505050505050565b6000806000606084860312156155105761550f614003565b5b600061551e86828701614a0b565b935050602061552f86828701614a0b565b925050604061554086828701614a0b565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61557f8161402d565b82525050565b60006155918383615576565b60208301905092915050565b6000602082019050919050565b60006155b58261554a565b6155bf8185615555565b93506155ca83615566565b8060005b838110156155fb5781516155e28882615585565b97506155ed8361559d565b9250506001810190506155ce565b5085935050505092915050565b600060a08201905061561d6000830188614191565b61562a6020830187615466565b818103604083015261563c81866155aa565b905061564b6060830185614301565b6156586080830184614191565b969550505050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207678e9edd3c827b24b25e092f5f2d487d6df07eb7c638d4884ed99196468633964736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102975760003560e01c8063906e9dd01161015a578063c8607952116100c1578063ea2f0b371161007a578063ea2f0b3714610a51578063ef10fb9714610a7a578063efcc52de14610ab7578063f2fde38b14610ae2578063f5648a4f14610b0b578063fb02f76f14610b225761029e565b8063c860795214610941578063cd03425c1461096c578063d8b6004014610997578063dc44b6a0146109c0578063dd62ed3e146109eb578063df4fd51514610a285761029e565b8063a5ece94111610113578063a5ece9411461081d578063a9059cbb14610848578063b62496f514610885578063bbc0c742146108c2578063c49b9a80146108ed578063c5d24189146109165761029e565b8063906e9dd01461070d57806395d89b41146107365780639a7a23d6146107615780639bd565d61461078a578063a073d37f146107b5578063a457c2d7146107e05761029e565b806349bd5a5e116101fe578063602bc62b116101b7578063602bc62b146105d557806370a08231146106005780638366e79a1461063d578063837917581461067a57806388790a68146106b75780638da5cb5b146106e25761029e565b806349bd5a5e146104d75780634a74bb021461050257806351f205e41461052d578063525fa81f146105445780635342acb41461056d578063557ed1ba146105aa5761029e565b806323b872dd1161025057806323b872dd146103b557806325519cf2146103f2578063313ce5671461041b5780633221c93f146104465780633950935114610471578063437823ec146104ae5761029e565b806306fdde03146102a3578063095ea7b3146102ce5780631694505e1461030b57806318160ddd146103365780631d865c3014610361578063200a692d1461038a5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610b4b565b6040516102c59190613fd7565b60405180910390f35b3480156102da57600080fd5b506102f560048036038101906102f091906140a1565b610b88565b60405161030291906140fc565b60405180910390f35b34801561031757600080fd5b50610320610ba6565b60405161032d9190614176565b60405180910390f35b34801561034257600080fd5b5061034b610bcc565b60405161035891906141a0565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906141bb565b610bdc565b005b34801561039657600080fd5b5061039f610ceb565b6040516103ac91906141a0565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d7919061420e565b610cf1565b6040516103e991906140fc565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906141bb565b610dca565b005b34801561042757600080fd5b50610430610ed9565b60405161043d919061427d565b60405180910390f35b34801561045257600080fd5b5061045b610ee2565b60405161046891906142b9565b60405180910390f35b34801561047d57600080fd5b50610498600480360381019061049391906140a1565b610f08565b6040516104a591906140fc565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d091906142d4565b610fbb565b005b3480156104e357600080fd5b506104ec6110ab565b6040516104f99190614310565b60405180910390f35b34801561050e57600080fd5b506105176110d1565b60405161052491906140fc565b60405180910390f35b34801561053957600080fd5b506105426110e4565b005b34801561055057600080fd5b5061056b600480360381019061056691906142d4565b6111db565b005b34801561057957600080fd5b50610594600480360381019061058f91906142d4565b61139d565b6040516105a191906140fc565b60405180910390f35b3480156105b657600080fd5b506105bf6113f3565b6040516105cc91906141a0565b60405180910390f35b3480156105e157600080fd5b506105ea6113fb565b6040516105f791906141a0565b60405180910390f35b34801561060c57600080fd5b50610627600480360381019061062291906142d4565b611405565b60405161063491906141a0565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f919061432b565b61144e565b60405161067191906140fc565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190614576565b611700565b6040516106ae91906140fc565b60405180910390f35b3480156106c357600080fd5b506106cc611ba7565b6040516106d991906141a0565b60405180910390f35b3480156106ee57600080fd5b506106f7611bad565b6040516107049190614310565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906142d4565b611bd6565b005b34801561074257600080fd5b5061074b611e12565b6040516107589190613fd7565b60405180910390f35b34801561076d57600080fd5b506107886004803603810190610783919061461a565b611e4f565b005b34801561079657600080fd5b5061079f611f82565b6040516107ac91906142b9565b60405180910390f35b3480156107c157600080fd5b506107ca611fa8565b6040516107d791906141a0565b60405180910390f35b3480156107ec57600080fd5b50610807600480360381019061080291906140a1565b611fb2565b60405161081491906140fc565b60405180910390f35b34801561082957600080fd5b5061083261207f565b60405161083f91906142b9565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a91906140a1565b6120a5565b60405161087c91906140fc565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a791906142d4565b6120c3565b6040516108b991906140fc565b60405180910390f35b3480156108ce57600080fd5b506108d76120e3565b6040516108e491906140fc565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f919061465a565b6120f6565b005b34801561092257600080fd5b5061092b6121df565b60405161093891906141a0565b60405180910390f35b34801561094d57600080fd5b506109566121e5565b60405161096391906141a0565b60405180910390f35b34801561097857600080fd5b506109816121eb565b60405161098e91906141a0565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b99190614687565b6121f1565b005b3480156109cc57600080fd5b506109d5612290565b6040516109e291906141a0565b60405180910390f35b3480156109f757600080fd5b50610a126004803603810190610a0d919061432b565b612296565b604051610a1f91906141a0565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a9190614687565b61231d565b005b348015610a5d57600080fd5b50610a786004803603810190610a7391906142d4565b6123bc565b005b348015610a8657600080fd5b50610aa16004803603810190610a9c91906142d4565b6124ac565b604051610aae91906140fc565b60405180910390f35b348015610ac357600080fd5b50610acc6124cc565b604051610ad991906141a0565b60405180910390f35b348015610aee57600080fd5b50610b096004803603810190610b0491906142d4565b6124d2565b005b348015610b1757600080fd5b50610b20612693565b005b348015610b2e57600080fd5b50610b496004803603810190610b44919061461a565b6127e9565b005b60606040518060400160405280600681526020017f49434849474f0000000000000000000000000000000000000000000000000000815250905090565b6000610b9c610b9561299d565b84846129a5565b6001905092915050565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000670de0b6b3a7640000905090565b610be461299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6890614700565b60405180910390fd5b826012819055508160138190555080601481905550600f601454601354601254610c9b919061474f565b610ca5919061474f565b1115610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd906147cf565b60405180910390fd5b505050565b60125481565b6000610cfe848484612b6e565b610dbf84610d0a61299d565b610dba8560405180606001604052806028815260200161566360289139600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d7061299d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131b99092919063ffffffff16565b6129a5565b600190509392505050565b610dd261299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690614700565b60405180910390fd5b82600f819055508160108190555080601181905550600a601154601054600f54610e89919061474f565b610e93919061474f565b1115610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb9061483b565b60405180910390fd5b505050565b60006009905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610fb1610f1561299d565b84610fac8560076000610f2661299d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461321d90919063ffffffff16565b6129a5565b6001905092915050565b610fc361299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790614700565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601a60159054906101000a900460ff1681565b6110ec61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614700565b60405180910390fd5b600061118430611405565b90506601c6bf526340008110156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c7906148a7565b60405180910390fd5b6111d861327b565b50565b6111e361299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126790614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690614913565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160086000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600042905090565b6000600254905090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061145861299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b9061497f565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b9906149eb565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115fd9190614310565b602060405180830381865afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190614a20565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161167b929190614a4d565b6020604051808303816000875af115801561169a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116be9190614a8b565b91507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e43884826040516116f1929190614a4d565b60405180910390a15092915050565b600061170a61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e90614700565b60405180910390fd5b601a60169054906101000a900460ff16156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90614b04565b60405180910390fd5b606483511061182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614b70565b60405180910390fd5b60005b835181101561189557600084828151811061184c5761184b614b90565b5b60200260200101519050600084838151811061186b5761186a614b90565b5b60200260200101519050611880338383612b6e565b5050808061188d90614bbf565b91505061182e565b5061189e613661565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506118c28160016127e9565b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061193830601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16670de0b6b3a76400006129a5565b8073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a79190614c1c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a329190614c1c565b6040518363ffffffff1660e01b8152600401611a4f929190614c49565b6020604051808303816000875af1158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190614c1c565b601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611aff601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016127e9565b611b2c601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161372e565b60004711611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690614cbe565b60405180910390fd5b611b81611b7b30611405565b476137e0565b6001601a60156101000a81548160ff021916908315150217905550600191505092915050565b60135481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bde61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6290614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190614913565b60405180910390fd5b600060086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606040518060400160405280600681526020017f49434849474f0000000000000000000000000000000000000000000000000000815250905090565b611e5761299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90614700565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6b90614d2a565b60405180910390fd5b611f7e828261372e565b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601854905090565b6000612075611fbf61299d565b846120708560405180606001604052806025815260200161568b6025913960076000611fe961299d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131b99092919063ffffffff16565b6129a5565b6001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120b96120b261299d565b8484612b6e565b6001905092915050565b60176020528060005260406000206000915054906101000a900460ff1681565b601a60169054906101000a900460ff1681565b6120fe61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461218b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218290614700565b60405180910390fd5b80601a60156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516121d491906140fc565b60405180910390a150565b60115481565b60145481565b60155481565b6121f961299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614700565b60405180910390fd5b8060158190555050565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61232561299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990614700565b60405180910390fd5b8060188190555050565b6123c461299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614700565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60166020528060005260406000206000915054906101000a900460ff1681565b600f5481565b6124da61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255e90614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cd90614dbc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61269b61299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271f90614700565b60405180910390fd5b601a60169054906101000a900460ff1615612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f90614e4e565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161279e90614e9f565b60006040518083038185875af1925050503d80600081146127db576040519150601f19603f3d011682016040523d82523d6000602084013e6127e0565b606091505b50508091505050565b6127f161299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590614700565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083036128eb576000905061294d565b600082846128f99190614eb4565b90508284826129089190614f25565b14612948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293f90614fc8565b60405180910390fd5b809150505b92915050565b600061299583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138e0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0b9061505a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7a906150ec565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612b6191906141a0565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd49061517e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4390615210565b60405180910390fd5b60008111612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c86906152a2565b60405180910390fd5b601a60169054906101000a900460ff16612d8457600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d445750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7a9061530e565b60405180910390fd5b5b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612e3b576000612de083611405565b9050601554612df8838361321d90919063ffffffff16565b1115612e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e309061537a565b60405180910390fd5b505b6000612e4630611405565b905060006018548210159050601a60149054906101000a900460ff16158015612e7b5750601a60159054906101000a900460ff165b8015612eb157506000612eaf601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611405565b115b8015612f075750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612f5d5750600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612fb25750601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612fbb5750805b15612fc957612fc861327b565b5b600060019050600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806130705750600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561308657600090506003600e819055506131a5565b601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561310c576130e0613943565b600f546009819055506011546010546130f9919061474f565b600c819055506001600e819055506131a4565b601760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561319257613166613943565b60125460098190555060145460135461317f919061474f565b600c819055506002600e819055506131a3565b61319a613943565b6003600e819055505b5b5b6131b186868684613980565b505050505050565b6000838311158290613201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f89190613fd7565b60405180910390fd5b5060008385613210919061539a565b9050809150509392505050565b600080828461322c919061474f565b905083811015613271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132689061541a565b60405180910390fd5b8091505092915050565b6001601a60146101000a81548160ff02191690831515021790555060006132a130611405565b90506000601154601054600f546132b8919061474f565b6132c2919061474f565b9050600081116132d35760066132d5565b805b90506000613312826133046000600f54116132f15760036132f5565b600f545b866128d990919063ffffffff16565b61295390919063ffffffff16565b9050600061334f8361334160006010541161332e576001613332565b6010545b876128d990919063ffffffff16565b61295390919063ffffffff16565b9050600061338c8461337e60006011541161336b57600261336f565b6011545b886128d990919063ffffffff16565b61295390919063ffffffff16565b9050600083828461339d919061474f565b6133a7919061474f565b905060006133bf60028561295390919063ffffffff16565b905060006133d68289613bd890919063ffffffff16565b905060004790506133e682613c22565b60006133fb8247613bd890919063ffffffff16565b905060006134248661341689856128d990919063ffffffff16565b61295390919063ffffffff16565b9050600061344d8761343f8b866128d990919063ffffffff16565b61295390919063ffffffff16565b9050600061346f8284613460919061474f565b85613bd890919063ffffffff16565b90506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516134b990614e9f565b60006040518083038185875af1925050503d80600081146134f6576040519150601f19603f3d011682016040523d82523d6000602084013e6134fb565b606091505b50509050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161354590614e9f565b60006040518083038185875af1925050503d8060008114613582576040519150601f19603f3d011682016040523d82523d6000602084013e613587565b606091505b50508091505061359788846137e0565b67016345785d8a000047111561363657600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516135ed90614e9f565b60006040518083038185875af1925050503d806000811461362a576040519150601f19603f3d011682016040523d82523d6000602084013e61362f565b606091505b5050809150505b50505050505050505050505050506000601a60146101000a81548160ff021916908315150217905550565b61366961299d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ed90614700565b60405180910390fd5b6001601a60166101000a81548160ff0219169083151502179055506001601a60156101000a81548160ff021916908315150217905550565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61380d30601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846129a5565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161389696959493929190615496565b60606040518083038185885af11580156138b4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906138d991906154f7565b5050505050565b60008083118290613927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391e9190613fd7565b60405180910390fd5b50600083856139369190614f25565b9050809150509392505050565b600060095414801561395757506000600c54145b61397e57600954600a81905550600c54600d8190555060006009819055506000600c819055505b565b8061398e5761398d613943565b5b60008061399a84613e65565b915091506139f084600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613bd890919063ffffffff16565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a8581600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461321d90919063ffffffff16565b600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b1a82600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461321d90919063ffffffff16565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bba91906141a0565b60405180910390a382613bd057613bcf613ed1565b5b505050505050565b6000613c1a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506131b9565b905092915050565b6000600267ffffffffffffffff811115613c3f57613c3e614370565b5b604051908082528060200260200182016040528015613c6d5781602001602082028036833780820191505090505b5090503081600081518110613c8557613c84614b90565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d509190614c1c565b81600181518110613d6457613d63614b90565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613dcb30601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846129a5565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613e2f959493929190615608565b600060405180830381600087803b158015613e4957600080fd5b505af1158015613e5d573d6000803e3d6000fd5b505050505050565b6000806000613e7384613ee5565b90506000613e8085613f16565b90506000613ea982613e9b8589613bd890919063ffffffff16565b613bd890919063ffffffff16565b90506000613ec0838561321d90919063ffffffff16565b905081819550955050505050915091565b600a54600981905550600d54600c81905550565b6000613f0f6064613f01600954856128d990919063ffffffff16565b61295390919063ffffffff16565b9050919050565b6000613f406064613f32600c54856128d990919063ffffffff16565b61295390919063ffffffff16565b9050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f81578082015181840152602081019050613f66565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fa982613f47565b613fb38185613f52565b9350613fc3818560208601613f63565b613fcc81613f8d565b840191505092915050565b60006020820190508181036000830152613ff18184613f9e565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140388261400d565b9050919050565b6140488161402d565b811461405357600080fd5b50565b6000813590506140658161403f565b92915050565b6000819050919050565b61407e8161406b565b811461408957600080fd5b50565b60008135905061409b81614075565b92915050565b600080604083850312156140b8576140b7614003565b5b60006140c685828601614056565b92505060206140d78582860161408c565b9150509250929050565b60008115159050919050565b6140f6816140e1565b82525050565b600060208201905061411160008301846140ed565b92915050565b6000819050919050565b600061413c6141376141328461400d565b614117565b61400d565b9050919050565b600061414e82614121565b9050919050565b600061416082614143565b9050919050565b61417081614155565b82525050565b600060208201905061418b6000830184614167565b92915050565b61419a8161406b565b82525050565b60006020820190506141b56000830184614191565b92915050565b6000806000606084860312156141d4576141d3614003565b5b60006141e28682870161408c565b93505060206141f38682870161408c565b92505060406142048682870161408c565b9150509250925092565b60008060006060848603121561422757614226614003565b5b600061423586828701614056565b935050602061424686828701614056565b92505060406142578682870161408c565b9150509250925092565b600060ff82169050919050565b61427781614261565b82525050565b6000602082019050614292600083018461426e565b92915050565b60006142a38261400d565b9050919050565b6142b381614298565b82525050565b60006020820190506142ce60008301846142aa565b92915050565b6000602082840312156142ea576142e9614003565b5b60006142f884828501614056565b91505092915050565b61430a8161402d565b82525050565b60006020820190506143256000830184614301565b92915050565b6000806040838503121561434257614341614003565b5b600061435085828601614056565b925050602061436185828601614056565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143a882613f8d565b810181811067ffffffffffffffff821117156143c7576143c6614370565b5b80604052505050565b60006143da613ff9565b90506143e6828261439f565b919050565b600067ffffffffffffffff82111561440657614405614370565b5b602082029050602081019050919050565b600080fd5b600061442f61442a846143eb565b6143d0565b9050808382526020820190506020840283018581111561445257614451614417565b5b835b8181101561447b57806144678882614056565b845260208401935050602081019050614454565b5050509392505050565b600082601f83011261449a5761449961436b565b5b81356144aa84826020860161441c565b91505092915050565b600067ffffffffffffffff8211156144ce576144cd614370565b5b602082029050602081019050919050565b60006144f26144ed846144b3565b6143d0565b9050808382526020820190506020840283018581111561451557614514614417565b5b835b8181101561453e578061452a888261408c565b845260208401935050602081019050614517565b5050509392505050565b600082601f83011261455d5761455c61436b565b5b813561456d8482602086016144df565b91505092915050565b6000806040838503121561458d5761458c614003565b5b600083013567ffffffffffffffff8111156145ab576145aa614008565b5b6145b785828601614485565b925050602083013567ffffffffffffffff8111156145d8576145d7614008565b5b6145e485828601614548565b9150509250929050565b6145f7816140e1565b811461460257600080fd5b50565b600081359050614614816145ee565b92915050565b6000806040838503121561463157614630614003565b5b600061463f85828601614056565b925050602061465085828601614605565b9150509250929050565b6000602082840312156146705761466f614003565b5b600061467e84828501614605565b91505092915050565b60006020828403121561469d5761469c614003565b5b60006146ab8482850161408c565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146ea602083613f52565b91506146f5826146b4565b602082019050919050565b60006020820190508181036000830152614719816146dd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061475a8261406b565b91506147658361406b565b925082820190508082111561477d5761477c614720565b5b92915050565b7f203e203135250000000000000000000000000000000000000000000000000000600082015250565b60006147b9600683613f52565b91506147c482614783565b602082019050919050565b600060208201905081810360008301526147e8816147ac565b9050919050565b7f203e203130250000000000000000000000000000000000000000000000000000600082015250565b6000614825600683613f52565b9150614830826147ef565b602082019050919050565b6000602082019050818103600083015261485481614818565b9050919050565b7f203c20302e303525206f6620746f6b656e7320737475636b0000000000000000600082015250565b6000614891601883613f52565b915061489c8261485b565b602082019050919050565b600060208201905081810360008301526148c081614884565b9050919050565b7f3020616464726573730000000000000000000000000000000000000000000000600082015250565b60006148fd600983613f52565b9150614908826148c7565b602082019050919050565b6000602082019050818103600083015261492c816148f0565b9050919050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000614969601a83613f52565b915061497482614933565b602082019050919050565b600060208201905081810360008301526149988161495c565b9050919050565b7f49434849474f206e6f7420616c6c6f7765640000000000000000000000000000600082015250565b60006149d5601283613f52565b91506149e08261499f565b602082019050919050565b60006020820190508181036000830152614a04816149c8565b9050919050565b600081519050614a1a81614075565b92915050565b600060208284031215614a3657614a35614003565b5b6000614a4484828501614a0b565b91505092915050565b6000604082019050614a626000830185614301565b614a6f6020830184614191565b9392505050565b600081519050614a85816145ee565b92915050565b600060208284031215614aa157614aa0614003565b5b6000614aaf84828501614a76565b91505092915050565b7f74726164696e6720697320616c72656164792061637469766500000000000000600082015250565b6000614aee601983613f52565b9150614af982614ab8565b602082019050919050565b60006020820190508181036000830152614b1d81614ae1565b9050919050565b7f6d6178203130302077616c6c6574730000000000000000000000000000000000600082015250565b6000614b5a600f83613f52565b9150614b6582614b24565b602082019050919050565b60006020820190508181036000830152614b8981614b4d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614bca8261406b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bfc57614bfb614720565b5b600182019050919050565b600081519050614c168161403f565b92915050565b600060208284031215614c3257614c31614003565b5b6000614c4084828501614c07565b91505092915050565b6000604082019050614c5e6000830185614301565b614c6b6020830184614301565b9392505050565b7f45544820726571756972656420666f72206c61756e6368000000000000000000600082015250565b6000614ca8601783613f52565b9150614cb382614c72565b602082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f766564000000000000600082015250565b6000614d14601a83613f52565b9150614d1f82614cde565b602082019050919050565b60006020820190508181036000830152614d4381614d07565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614da6602683613f52565b9150614db182614d4a565b604082019050919050565b60006020820190508181036000830152614dd581614d99565b9050919050565b7f43616e206f6e6c792077697468647261772069662074726164696e672068617360008201527f6e27742073746172746564000000000000000000000000000000000000000000602082015250565b6000614e38602b83613f52565b9150614e4382614ddc565b604082019050919050565b60006020820190508181036000830152614e6781614e2b565b9050919050565b600081905092915050565b50565b6000614e89600083614e6e565b9150614e9482614e79565b600082019050919050565b6000614eaa82614e7c565b9150819050919050565b6000614ebf8261406b565b9150614eca8361406b565b9250828202614ed88161406b565b91508282048414831517614eef57614eee614720565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f308261406b565b9150614f3b8361406b565b925082614f4b57614f4a614ef6565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fb2602183613f52565b9150614fbd82614f56565b604082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615044602483613f52565b915061504f82614fe8565b604082019050919050565b6000602082019050818103600083015261507381615037565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006150d6602283613f52565b91506150e18261507a565b604082019050919050565b60006020820190508181036000830152615105816150c9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615168602583613f52565b91506151738261510c565b604082019050919050565b600060208201905081810360008301526151978161515b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006151fa602383613f52565b91506152058261519e565b604082019050919050565b60006020820190508181036000830152615229816151ed565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061528c602983613f52565b915061529782615230565b604082019050919050565b600060208201905081810360008301526152bb8161527f565b9050919050565b7f54726164696e67206973206e6f7420616374697665207965742e000000000000600082015250565b60006152f8601a83613f52565b9150615303826152c2565b602082019050919050565b60006020820190508181036000830152615327816152eb565b9050919050565b7f4578636565646564206d617820686f6c64000000000000000000000000000000600082015250565b6000615364601183613f52565b915061536f8261532e565b602082019050919050565b6000602082019050818103600083015261539381615357565b9050919050565b60006153a58261406b565b91506153b08361406b565b92508282039050818111156153c8576153c7614720565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615404601b83613f52565b915061540f826153ce565b602082019050919050565b60006020820190508181036000830152615433816153f7565b9050919050565b6000819050919050565b600061545f61545a6154558461543a565b614117565b61406b565b9050919050565b61546f81615444565b82525050565b600061548082614143565b9050919050565b61549081615475565b82525050565b600060c0820190506154ab6000830189614301565b6154b86020830188614191565b6154c56040830187615466565b6154d26060830186615466565b6154df6080830185615487565b6154ec60a0830184614191565b979650505050505050565b6000806000606084860312156155105761550f614003565b5b600061551e86828701614a0b565b935050602061552f86828701614a0b565b925050604061554086828701614a0b565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61557f8161402d565b82525050565b60006155918383615576565b60208301905092915050565b6000602082019050919050565b60006155b58261554a565b6155bf8185615555565b93506155ca83615566565b8060005b838110156155fb5781516155e28882615585565b97506155ed8361559d565b9250506001810190506155ce565b5085935050505092915050565b600060a08201905061561d6000830188614191565b61562a6020830187615466565b818103604083015261563c81866155aa565b905061564b6060830185614301565b6156586080830184614191565b969550505050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207678e9edd3c827b24b25e092f5f2d487d6df07eb7c638d4884ed99196468633964736f6c63430008110033

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.