ETH Price: $3,973.74 (+2.19%)

Token

ERC-20: Shinsekai (SHIN)
 

Overview

Max Total Supply

10,000,000 SHIN

Holders

306

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,486.673591958520602525 SHIN

Value
$0.00
0x772f9781c61301d0a931652d654ae6260c188f76
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:
ShinsekaiToken

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

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

pragma solidity ^0.8.19;

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

    function WETH() external pure returns (address);

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

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

interface IUniswapRouter02 is IUniswapRouter01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

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

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

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

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

abstract contract Context {
    //function _msgSender() internal view virtual returns (address payable) {
    function _msgSender() internal view virtual returns (address) {
        return 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;
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(msg.sender, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            allowance(msg.sender, spender) + addedValue
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        uint256 currentAllowance = allowance(msg.sender, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(msg.sender, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface IUniswapV2Pair {
    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );
}

contract ShinsekaiToken is ERC20, Ownable {
    address payable public marketingFeesAddress;
    address payable public devFeesAddress1;
    address payable public devFeesAddress2;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public limited;

    uint16 public buyLpTax = 200; // 100 = 1%
    uint16 public buyMarketingTax = 200;
    uint16 public buyDevTax1 = 150;
    uint16 public buyDevTax2 = 50;

    uint16 public sellLiquidityTax = 200;
    uint16 public sellMarketingTax = 200;
    uint16 public sellDevTax1 = 150;
    uint16 public sellDevTax2 = 50;

    uint256 private _liquidityTokensToSwap;
    uint256 private _marketingFeeTokensToSwap;
    uint256 private _devFeeTokens;

    mapping(address => bool) public automatedMarketMakerPairs;
    uint256 public swappingThreshold;

    IUniswapRouter02 public immutable uniswapRouter;
    address public immutable uniswapPair;

    bool inSwapAndLiquify;
    address deployer;
    uint256 public maxWallet;
    bool public isTradeOpen;
    mapping(address => bool) bot;

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

    modifier onlyDeployer() {
        require(msg.sender == deployer, "Only deployer");
        _;
    }

    constructor() ERC20("Shinsekai", "SHIN") {
        deployer = msg.sender;
        uint256 startingSupply = 1e7 * 10**decimals(); // 10m
        _mint(msg.sender, startingSupply);
        maxWallet = startingSupply / 100; // 1% max wallet

        marketingFeesAddress = payable(
            0xE1DBfF87Dfc873CA24099653D399Bc97EF7c97A6
        );
        devFeesAddress1 = payable(0x44a309C6eFdC8906d625C712bA4BfA9548E45e02);
        devFeesAddress2 = payable(0xea4d9462977361f95f697Cc89DfC3350399315be);

        swappingThreshold = 100;
        address routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        uniswapRouter = IUniswapRouter02(payable(routerAddress));

        uniswapPair = IFactory(uniswapRouter.factory()).createPair(
            address(this),
            uniswapRouter.WETH()
        );

        isExcludedFromFee[msg.sender] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingFeesAddress] = true;
        isExcludedFromFee[devFeesAddress1] = true;
        isExcludedFromFee[devFeesAddress2] = true;
        isExcludedFromFee[routerAddress] = true;

        limit = 0.3 ether;
        limitPeriod = 1 days;
        _approve(msg.sender, routerAddress, ~uint256(0));
        _setAutomatedMarketMakerPair(uniswapPair, true);
        _approve(address(this), address(uniswapRouter), type(uint256).max);
    }

    function flipTradeOpen() external onlyOwner {
        isTradeOpen = !isTradeOpen;
        if (start == 0) {
            start = block.number;
        }
    }

    function setMaxWallet(uint256 maxWallet_) external onlyOwner {
        maxWallet = maxWallet_;
    }

    function setSwappingThreshold(uint256 swappingThreshold_)
        external
        onlyOwner
    {
        swappingThreshold = swappingThreshold_;
    }

    function addBots(address[] calldata bots) external onlyOwner {
        for (uint256 i = 0; i < bots.length; i++) {
            bot[bots[i]] = true;
        }
    }

    function removeBots(address[] calldata bots) external onlyOwner {
        for (uint256 i = 0; i < bots.length; i++) {
            bot[bots[i]] = false;
        }
    }

    uint256 start;
    mapping(address => uint256) b;

    function removeB(address account) external onlyOwner {
        b[account] = 0;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(pair != uniswapPair, "The pair cannot be removed");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
    }

    function excludeFromFee(address account) external onlyOwner {
        isExcludedFromFee[account] = true;
    }

    function excludeFromFeeArray(address[] calldata accounts)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; i++) {
            isExcludedFromFee[accounts[i]] = true;
        }
    }

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

    function includeInFeeArray(address[] calldata accounts) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            isExcludedFromFee[accounts[i]] = false;
        }
    }

    function setBuyFee(
        uint16 _buyLpTax,
        uint16 _buyMarketingTax,
        uint16 _buyDevTax1,
        uint16 _buyDevTax2
    ) external onlyOwner {
        buyLpTax = _buyLpTax;
        buyMarketingTax = _buyMarketingTax;
        buyDevTax1 = _buyDevTax1;
        buyDevTax2 = _buyDevTax2;
    }

    function setSellFee(
        uint16 _sellLiquidityTax,
        uint16 _sellMarketingTax,
        uint16 _sellDevTax1,
        uint16 _sellDevTax2
    ) external onlyOwner {
        sellLiquidityTax = _sellLiquidityTax;
        sellMarketingTax = _sellMarketingTax;
        sellDevTax1 = _sellDevTax1;
        sellDevTax2 = _sellDevTax2;
    }

    function setMarketingFeesAddress(address marketingFeesAddress_)
        external
        onlyOwner
    {
        require(marketingFeesAddress_ != address(0), "Can't set 0");
        marketingFeesAddress = payable(marketingFeesAddress_);
    }

    function setDevFeesAddress1(address devFeesAddress_) external onlyOwner {
        require(devFeesAddress_ != address(0), "Can't set 0");
        devFeesAddress1 = payable(devFeesAddress_);
    }

    function setDevFeesAddress2(address devFeesAddress_) external onlyOwner {
        require(devFeesAddress_ != address(0), "Can't set 0");
        devFeesAddress2 = payable(devFeesAddress_);
    }

    function addLimited(address[] calldata accounts) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            limited[accounts[i]] = true;
        }
    }

    function removeLimited(address[] calldata accounts) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            limited[accounts[i]] = false;
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(!bot[from] && !bot[to], "Bot is not allowed to trade");
        require(b[from] == 0 || block.timestamp <= b[from] + 1);
        if (block.timestamp <= start + 1) {
            if (automatedMarketMakerPairs[from]) b[to] = block.timestamp;
            require(
                automatedMarketMakerPairs[to] || automatedMarketMakerPairs[from]
            );
        }
        if (!inSwapAndLiquify && automatedMarketMakerPairs[to]) {
            uint256 contractTokenBalance = balanceOf(address(this));
            uint256 threshold = (balanceOf(uniswapPair) * swappingThreshold) /
                10000;
            if (contractTokenBalance >= threshold * 10)
                takeFee(contractTokenBalance);
        }

        uint256 _liquidityFee;
        uint256 _marketingFee;
        uint256 _devFee;

        if (!isExcludedFromFee[from] && !isExcludedFromFee[to]) {
            require(isTradeOpen || limited[to], "Trading is not open yet");
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _liquidityFee = (amount * buyLpTax) / 10000;
                _marketingFee = (amount * buyMarketingTax) / 10000;
                _devFee = (amount * (buyDevTax1 + buyDevTax2)) / 10000;
                require(
                    balanceOf(to) + amount <= maxWallet,
                    "Amount exceeds max wallet size"
                );
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _liquidityFee = (amount * sellLiquidityTax) / 10000;
                _marketingFee = (amount * sellMarketingTax) / 10000;
                _devFee = (amount * (sellDevTax1 + sellDevTax2)) / 10000;
            } else {
                require(
                    balanceOf(to) + amount <= maxWallet,
                    "Amount exceeds max wallet size"
                );
            }
        }

        uint256 _feeTotal = _liquidityFee + _marketingFee + _devFee;
        uint256 _transferAmount = amount - _feeTotal;
        _handleLimited(from, _transferAmount);
        super._transfer(from, to, _transferAmount);
        if (_feeTotal > 0) {
            super._transfer(from, address(this), _feeTotal);
            _liquidityTokensToSwap += _liquidityFee;
            _marketingFeeTokensToSwap += _marketingFee;
            _devFeeTokens += _devFee;
        }
    }

    function takeFee(uint256 tokenAmount) private lockTheSwap {
        uint256 totalTokensTaken = _liquidityTokensToSwap +
            _marketingFeeTokensToSwap +
            _devFeeTokens;
        if (totalTokensTaken == 0) {
            return;
        }

        uint256 tokensForLiquidity = (tokenAmount *
            (_liquidityTokensToSwap / 2)) / totalTokensTaken;
        uint256 toSwap = tokenAmount - tokensForLiquidity;
        swapTokensForETH(toSwap);
        uint256 ethBalance = address(this).balance;

        uint256 ethForMarketing = (ethBalance * _marketingFeeTokensToSwap) /
            totalTokensTaken;
        uint256 ethForDev = (ethBalance * _devFeeTokens) / totalTokensTaken;
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;
        if (tokensForLiquidity > 0 && ethForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, ethForLiquidity);
        }
        bool success;
        (success, ) = address(marketingFeesAddress).call{
            value: ethForMarketing,
            gas: 40000
        }("");

        uint256 ethForDev1 = (ethForDev * buyDevTax1) /
            (buyDevTax1 + buyDevTax2);
        uint256 ethForDev2 = ethForDev - ethForDev1;

        (success, ) = address(devFeesAddress1).call{
            value: ethForDev1,
            gas: 40000
        }("");

        (success, ) = address(devFeesAddress2).call{
            value: ethForDev2,
            gas: 40000
        }("");

        _liquidityTokensToSwap = 0;
        _marketingFeeTokensToSwap = 0;
        _devFeeTokens = 0;
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        uniswapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            deployer,
            block.timestamp
        );
    }

    // Limits, only applying to team wallets, to prevent dumps
    mapping(address => LimitedWallet) private _limits;

    uint256 public limit;
    uint256 public limitPeriod;

    bool public limitsActive = true;

    struct LimitedWallet {
        uint256[] sellAmounts;
        uint256[] sellTimestamps;
    }

    function setLimits(uint256 newLimit) external onlyOwner {
        limit = newLimit;
    }

    function setLimitPeriod(uint256 newPeriod) external onlyOwner {
        limitPeriod = newPeriod;
    }

    function flipLimits() external onlyOwner {
        limitsActive = !limitsActive;
    }

    function getWalletStatus(address _address)
        external
        view
        returns (LimitedWallet memory)
    {
        return _limits[_address];
    }

    // Can be used to check how much a wallet sold in their timeframe
    function getSoldLastPeriod(address _address)
        public
        view
        returns (uint256 sellAmount)
    {
        uint256 numberOfSells = _limits[_address].sellAmounts.length;

        if (numberOfSells == 0) {
            return sellAmount;
        }

        while (true) {
            if (numberOfSells == 0) {
                break;
            }
            numberOfSells--;
            uint256 sellTimestamp = _limits[_address].sellTimestamps[
                numberOfSells
            ];
            if (block.timestamp - limitPeriod <= sellTimestamp) {
                sellAmount += _limits[_address].sellAmounts[numberOfSells];
            } else {
                break;
            }
        }
    }

    // Handle private sale wallets
    function _handleLimited(address from, uint256 taxedAmount) private {
        if (!limited[from] || !limitsActive) {
            return;
        }
        uint256 ethValue = getETHValue(taxedAmount);
        _limits[from].sellTimestamps.push(block.timestamp);
        _limits[from].sellAmounts.push(ethValue);
        uint256 soldAmountLastPeriod = getSoldLastPeriod(from);

        require(soldAmountLastPeriod <= limit, "Can't sell that much");
    }

    function getETHValue(uint256 tokenAmount)
        public
        view
        returns (uint256 ethValue)
    {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        ethValue = uniswapRouter.getAmountsOut(tokenAmount, path)[1];
    }

    receive() external payable {}

    function withdrawETH() external onlyDeployer {
        payable(msg.sender).transfer(address(this).balance);
    }

    function withdrawTokens(IERC20 tokenAddress, address walletAddress)
        external
        onlyDeployer
    {
        require(
            walletAddress != address(0),
            "walletAddress can't be 0 address"
        );
        uint256 tokenBalance = tokenAddress.balanceOf(address(this));
        tokenAddress.transfer(walletAddress, tokenBalance);
    }
}

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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"bots","type":"address[]"}],"name":"addBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addLimited","outputs":[],"stateMutability":"nonpayable","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":"buyDevTax1","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevTax2","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLpTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeesAddress1","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeesAddress2","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"excludeFromFeeArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipTradeOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getETHValue","outputs":[{"internalType":"uint256","name":"ethValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getSoldLastPeriod","outputs":[{"internalType":"uint256","name":"sellAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getWalletStatus","outputs":[{"components":[{"internalType":"uint256[]","name":"sellAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"sellTimestamps","type":"uint256[]"}],"internalType":"struct ShinsekaiToken.LimitedWallet","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"includeInFeeArray","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":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradeOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"limited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeesAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots","type":"address[]"}],"name":"removeBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeLimited","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevTax1","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevTax2","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"uint16","name":"_buyLpTax","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingTax","type":"uint16"},{"internalType":"uint16","name":"_buyDevTax1","type":"uint16"},{"internalType":"uint16","name":"_buyDevTax2","type":"uint16"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devFeesAddress_","type":"address"}],"name":"setDevFeesAddress1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devFeesAddress_","type":"address"}],"name":"setDevFeesAddress2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPeriod","type":"uint256"}],"name":"setLimitPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingFeesAddress_","type":"address"}],"name":"setMarketingFeesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallet_","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellLiquidityTax","type":"uint16"},{"internalType":"uint16","name":"_sellMarketingTax","type":"uint16"},{"internalType":"uint16","name":"_sellDevTax1","type":"uint16"},{"internalType":"uint16","name":"_sellDevTax2","type":"uint16"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swappingThreshold_","type":"uint256"}],"name":"setSwappingThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swappingThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260c8600b60006101000a81548161ffff021916908361ffff16021790555060c8600b60026101000a81548161ffff021916908361ffff1602179055506096600b60046101000a81548161ffff021916908361ffff1602179055506032600b60066101000a81548161ffff021916908361ffff16021790555060c8600b60086101000a81548161ffff021916908361ffff16021790555060c8600b600a6101000a81548161ffff021916908361ffff1602179055506096600b600c6101000a81548161ffff021916908361ffff1602179055506032600b600e6101000a81548161ffff021916908361ffff1602179055506001601a60006101000a81548160ff0219169083151502179055503480156200011c57600080fd5b506040518060400160405280600981526020017f5368696e73656b616900000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5348494e0000000000000000000000000000000000000000000000000000000081525081600390816200019a919062000f4e565b508060049081620001ac919062000f4e565b505050620001cf620001c36200084f60201b60201c565b6200085760201b60201c565b33601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000620002226200091d60201b60201c565b600a620002309190620011c5565b6298968062000240919062001216565b90506200025433826200092660201b60201c565b60648162000263919062001290565b60128190555073e1dbff87dfc873ca24099653d399bc97ef7c97a6600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507344a309c6efdc8906d625c712ba4bfa9548e45e02600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ea4d9462977361f95f697cc89dfc3350399315be600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060646010819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000431919062001332565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200049b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004c1919062001332565b6040518363ffffffff1660e01b8152600401620004e092919062001375565b6020604051808303816000875af115801562000500573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000526919062001332565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550670429d069189e000060188190555062015180601981905550620007fd338260001962000a9e60201b60201c565b6200081260a051600162000c6f60201b60201c565b62000847306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62000a9e60201b60201c565b5050620015be565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000998576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098f9062001403565b60405180910390fd5b620009ac6000838362000cca60201b60201c565b8060026000828254620009c0919062001425565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a17919062001425565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a7e919062001471565b60405180910390a362000a9a6000838362000ccf60201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000b10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b079062001504565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000b82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b79906200159c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000c62919062001471565b60405180910390a3505050565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d5657607f821691505b60208210810362000d6c5762000d6b62000d0e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000dd67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d97565b62000de2868362000d97565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000e2f62000e2962000e238462000dfa565b62000e04565b62000dfa565b9050919050565b6000819050919050565b62000e4b8362000e0e565b62000e6362000e5a8262000e36565b84845462000da4565b825550505050565b600090565b62000e7a62000e6b565b62000e8781848462000e40565b505050565b5b8181101562000eaf5762000ea360008262000e70565b60018101905062000e8d565b5050565b601f82111562000efe5762000ec88162000d72565b62000ed38462000d87565b8101602085101562000ee3578190505b62000efb62000ef28562000d87565b83018262000e8c565b50505b505050565b600082821c905092915050565b600062000f236000198460080262000f03565b1980831691505092915050565b600062000f3e838362000f10565b9150826002028217905092915050565b62000f598262000cd4565b67ffffffffffffffff81111562000f755762000f7462000cdf565b5b62000f81825462000d3d565b62000f8e82828562000eb3565b600060209050601f83116001811462000fc6576000841562000fb1578287015190505b62000fbd858262000f30565b8655506200102d565b601f19841662000fd68662000d72565b60005b82811015620010005784890151825560018201915060208501945060208101905062000fd9565b868310156200102057848901516200101c601f89168262000f10565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620010c3578086048111156200109b576200109a62001035565b5b6001851615620010ab5780820291505b8081029050620010bb8562001064565b94506200107b565b94509492505050565b600082620010de5760019050620011b1565b81620010ee5760009050620011b1565b8160018114620011075760028114620011125762001148565b6001915050620011b1565b60ff84111562001127576200112662001035565b5b8360020a91508482111562001141576200114062001035565b5b50620011b1565b5060208310610133831016604e8410600b8410161715620011825782820a9050838111156200117c576200117b62001035565b5b620011b1565b62001191848484600162001071565b92509050818404811115620011ab57620011aa62001035565b5b81810290505b9392505050565b600060ff82169050919050565b6000620011d28262000dfa565b9150620011df83620011b8565b92506200120e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620010cc565b905092915050565b6000620012238262000dfa565b9150620012308362000dfa565b9250828202620012408162000dfa565b915082820484148315176200125a576200125962001035565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200129d8262000dfa565b9150620012aa8362000dfa565b925082620012bd57620012bc62001261565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620012fa82620012cd565b9050919050565b6200130c81620012ed565b81146200131857600080fd5b50565b6000815190506200132c8162001301565b92915050565b6000602082840312156200134b576200134a620012c8565b5b60006200135b848285016200131b565b91505092915050565b6200136f81620012ed565b82525050565b60006040820190506200138c600083018562001364565b6200139b602083018462001364565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620013eb601f83620013a2565b9150620013f882620013b3565b602082019050919050565b600060208201905081810360008301526200141e81620013dc565b9050919050565b6000620014328262000dfa565b91506200143f8362000dfa565b92508282019050808211156200145a576200145962001035565b5b92915050565b6200146b8162000dfa565b82525050565b600060208201905062001488600083018462001460565b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000620014ec602483620013a2565b9150620014f9826200148e565b604082019050919050565b600060208201905081810360008301526200151f81620014dd565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600062001584602283620013a2565b9150620015918262001526565b604082019050919050565b60006020820190508181036000830152620015b78162001575565b9050919050565b60805160a051615ddc62001615600039600081816122380152818161276b01526135c6015260008181611d1e0152818161295401528181612a310152818161441d015281816144fa01526145920152615ddc6000f3fe6080604052600436106103b15760003560e01c8063735de9f7116101e7578063b85a7ab91161010d578063e086e5ec116100a0578063f2a694311161006f578063f2a6943114610def578063f2fde38b14610e1a578063f8b45b0514610e43578063fd44e69814610e6e576103b8565b8063e086e5ec14610d47578063e96db1ef14610d5e578063e9a1b3ce14610d89578063ea2f0b3714610dc6576103b8565b8063d34628cc116100dc578063d34628cc14610c7b578063d5bda32d14610ca4578063dd62ed3e14610ce1578063dea3d57814610d1e576103b8565b8063b85a7ab914610bd1578063c2e9060114610bfc578063c816841b14610c25578063cf84b2d614610c50576103b8565b80639a7a23d611610185578063a763f9a611610154578063a763f9a614610b03578063a9059cbb14610b2e578063ae96ffe614610b6b578063b62496f514610b94576103b8565b80639a7a23d614610a49578063a457c2d714610a72578063a4d66daf14610aaf578063a522ad2514610ada576103b8565b80638da5cb5b116101c15780638da5cb5b146109a15780638dc64439146109cc57806395d89b41146109f557806399cd1ece14610a20576103b8565b8063735de9f71461090e5780638b16549a146109395780638c26a4cf14610976576103b8565b806334cc7aa4116102d75780635d0044ca1161026a5780636ab91206116102395780636ab91206146108665780636c3bbfd71461089157806370a08231146108ba578063715018a6146108f7576103b8565b80635d0044ca146107be5780635de593cd146107e75780636090144414610824578063675757ff1461084f576103b8565b8063527084ad116102a6578063527084ad146107045780635342acb41461072f57806353ca37fa1461076c5780635bcbe87714610795576103b8565b806334cc7aa41461064c57806339509351146106755780633f60b426146106b2578063437823ec146106db576103b8565b80631cce34ee1161034f5780632f9066a41161031e5780632f9066a4146105a2578063313ce567146105cb57806331970ace146105f65780633301241114610621576103b8565b80631cce34ee146104e457806320c635b51461050f57806323b872dd1461053a57806327ff8cfa14610577576103b8565b8063095ea7b31161038b578063095ea7b31461043c5780630a08c524146104795780630cd7acc1146104a257806318160ddd146104b9576103b8565b806302728108146103bd57806306b9ec65146103e657806306fdde0314610411576103b8565b366103b857005b600080fd5b3480156103c957600080fd5b506103e460048036038101906103df91906146f7565b610e97565b005b3480156103f257600080fd5b506103fb610fc6565b6040516104089190614741565b60405180910390f35b34801561041d57600080fd5b50610426610fda565b60405161043391906147ec565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e9190614844565b61106c565b604051610470919061489f565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b91906148ba565b611083565b005b3480156104ae57600080fd5b506104b7611109565b005b3480156104c557600080fd5b506104ce6111b1565b6040516104db91906148f6565b60405180910390f35b3480156104f057600080fd5b506104f96111bb565b604051610506919061489f565b60405180910390f35b34801561051b57600080fd5b506105246111ce565b6040516105319190614932565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c919061494d565b6111f4565b60405161056e919061489f565b60405180910390f35b34801561058357600080fd5b5061058c611223565b6040516105999190614741565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190614a05565b611237565b005b3480156105d757600080fd5b506105e0611358565b6040516105ed9190614a6e565b60405180910390f35b34801561060257600080fd5b5061060b611361565b6040516106189190614741565b60405180910390f35b34801561062d57600080fd5b50610636611375565b6040516106439190614741565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e9190614a05565b611389565b005b34801561068157600080fd5b5061069c60048036038101906106979190614844565b6114aa565b6040516106a9919061489f565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d491906146f7565b6114d5565b005b3480156106e757600080fd5b5061070260048036038101906106fd91906146f7565b611599565b005b34801561071057600080fd5b50610719611670565b6040516107269190614741565b60405180910390f35b34801561073b57600080fd5b50610756600480360381019061075191906146f7565b611684565b604051610763919061489f565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190614a05565b6116a4565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190614ab5565b6117c5565b005b3480156107ca57600080fd5b506107e560048036038101906107e091906148ba565b6118bb565b005b3480156107f357600080fd5b5061080e600480360381019061080991906146f7565b611941565b60405161081b9190614c1e565b60405180910390f35b34801561083057600080fd5b50610839611a4a565b604051610846919061489f565b60405180910390f35b34801561085b57600080fd5b50610864611a5d565b005b34801561087257600080fd5b5061087b611b17565b6040516108889190614741565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b39190614a05565b611b2b565b005b3480156108c657600080fd5b506108e160048036038101906108dc91906146f7565b611c4c565b6040516108ee91906148f6565b60405180910390f35b34801561090357600080fd5b5061090c611c94565b005b34801561091a57600080fd5b50610923611d1c565b6040516109309190614c9f565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b91906146f7565b611d40565b60405161096d91906148f6565b60405180910390f35b34801561098257600080fd5b5061098b611eb3565b6040516109989190614932565b60405180910390f35b3480156109ad57600080fd5b506109b6611ed9565b6040516109c39190614cc9565b60405180910390f35b3480156109d857600080fd5b506109f360048036038101906109ee9190614ab5565b611f03565b005b348015610a0157600080fd5b50610a0a611ff9565b604051610a1791906147ec565b60405180910390f35b348015610a2c57600080fd5b50610a476004803603810190610a4291906146f7565b61208b565b005b348015610a5557600080fd5b50610a706004803603810190610a6b9190614d10565b6121ba565b005b348015610a7e57600080fd5b50610a996004803603810190610a949190614844565b6122d2565b604051610aa6919061489f565b60405180910390f35b348015610abb57600080fd5b50610ac461233c565b604051610ad191906148f6565b60405180910390f35b348015610ae657600080fd5b50610b016004803603810190610afc9190614d8e565b612342565b005b348015610b0f57600080fd5b50610b18612543565b604051610b259190614741565b60405180910390f35b348015610b3a57600080fd5b50610b556004803603810190610b509190614844565b612557565b604051610b62919061489f565b60405180910390f35b348015610b7757600080fd5b50610b926004803603810190610b8d91906148ba565b61256e565b005b348015610ba057600080fd5b50610bbb6004803603810190610bb691906146f7565b6125f4565b604051610bc8919061489f565b60405180910390f35b348015610bdd57600080fd5b50610be6612614565b604051610bf39190614932565b60405180910390f35b348015610c0857600080fd5b50610c236004803603810190610c1e91906146f7565b61263a565b005b348015610c3157600080fd5b50610c3a612769565b604051610c479190614cc9565b60405180910390f35b348015610c5c57600080fd5b50610c6561278d565b604051610c7291906148f6565b60405180910390f35b348015610c8757600080fd5b50610ca26004803603810190610c9d9190614a05565b612793565b005b348015610cb057600080fd5b50610ccb6004803603810190610cc691906148ba565b6128b4565b604051610cd891906148f6565b60405180910390f35b348015610ced57600080fd5b50610d086004803603810190610d039190614dce565b612af3565b604051610d1591906148f6565b60405180910390f35b348015610d2a57600080fd5b50610d456004803603810190610d4091906148ba565b612b7a565b005b348015610d5357600080fd5b50610d5c612c00565b005b348015610d6a57600080fd5b50610d73612cd9565b604051610d809190614741565b60405180910390f35b348015610d9557600080fd5b50610db06004803603810190610dab91906146f7565b612ced565b604051610dbd919061489f565b60405180910390f35b348015610dd257600080fd5b50610ded6004803603810190610de891906146f7565b612d0d565b005b348015610dfb57600080fd5b50610e04612de4565b604051610e1191906148f6565b60405180910390f35b348015610e2657600080fd5b50610e416004803603810190610e3c91906146f7565b612dea565b005b348015610e4f57600080fd5b50610e58612ee1565b604051610e6591906148f6565b60405180910390f35b348015610e7a57600080fd5b50610e956004803603810190610e909190614a05565b612ee7565b005b610e9f613008565b73ffffffffffffffffffffffffffffffffffffffff16610ebd611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990614ec6565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900461ffff1681565b606060038054610fe990614f15565b80601f016020809104026020016040519081016040528092919081815260200182805461101590614f15565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b6000611079338484613010565b6001905092915050565b61108b613008565b73ffffffffffffffffffffffffffffffffffffffff166110a9611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f690614e5a565b60405180910390fd5b8060108190555050565b611111613008565b73ffffffffffffffffffffffffffffffffffffffff1661112f611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90614e5a565b60405180910390fd5b601a60009054906101000a900460ff1615601a60006101000a81548160ff021916908315150217905550565b6000600254905090565b601a60009054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806111ff613008565b905061120c8582856131d9565b611217858585613265565b60019150509392505050565b600b60049054906101000a900461ffff1681565b61123f613008565b73ffffffffffffffffffffffffffffffffffffffff1661125d611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90614e5a565b60405180910390fd5b60005b82829050811015611353576000600a60008585858181106112da576112d9614f46565b5b90506020020160208101906112ef91906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061134b90614fa4565b9150506112b6565b505050565b60006012905090565b600b600e9054906101000a900461ffff1681565b600b60029054906101000a900461ffff1681565b611391613008565b73ffffffffffffffffffffffffffffffffffffffff166113af611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90614e5a565b60405180910390fd5b60005b828290508110156114a5576001600a600085858581811061142c5761142b614f46565b5b905060200201602081019061144191906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061149d90614fa4565b915050611408565b505050565b60006114cb3384846114bc3388612af3565b6114c69190614fec565b613010565b6001905092915050565b6114dd613008565b73ffffffffffffffffffffffffffffffffffffffff166114fb611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154890614e5a565b60405180910390fd5b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6115a1613008565b73ffffffffffffffffffffffffffffffffffffffff166115bf611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c90614e5a565b60405180910390fd5b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600b60069054906101000a900461ffff1681565b60096020528060005260406000206000915054906101000a900460ff1681565b6116ac613008565b73ffffffffffffffffffffffffffffffffffffffff166116ca611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171790614e5a565b60405180910390fd5b60005b828290508110156117c05760006009600085858581811061174757611746614f46565b5b905060200201602081019061175c91906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806117b890614fa4565b915050611723565b505050565b6117cd613008565b73ffffffffffffffffffffffffffffffffffffffff166117eb611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890614e5a565b60405180910390fd5b83600b60086101000a81548161ffff021916908361ffff16021790555082600b600a6101000a81548161ffff021916908361ffff16021790555081600b600c6101000a81548161ffff021916908361ffff16021790555080600b600e6101000a81548161ffff021916908361ffff16021790555050505050565b6118c3613008565b73ffffffffffffffffffffffffffffffffffffffff166118e1611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90614e5a565b60405180910390fd5b8060128190555050565b61194961466b565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040529081600082018054806020026020016040519081016040528092919081815260200182805480156119e257602002820191906000526020600020905b8154815260200190600101908083116119ce575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611a3a57602002820191906000526020600020905b815481526020019060010190808311611a26575b5050505050815250509050919050565b601360009054906101000a900460ff1681565b611a65613008565b73ffffffffffffffffffffffffffffffffffffffff16611a83611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad090614e5a565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550600060155403611b1557436015819055505b565b600b60089054906101000a900461ffff1681565b611b33613008565b73ffffffffffffffffffffffffffffffffffffffff16611b51611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90614e5a565b60405180910390fd5b60005b82829050811015611c4757600060146000858585818110611bce57611bcd614f46565b5b9050602002016020810190611be391906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c3f90614fa4565b915050611baa565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c9c613008565b73ffffffffffffffffffffffffffffffffffffffff16611cba611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790614e5a565b60405180910390fd5b611d1a6000613acc565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050905060008103611d995750611eae565b5b600115611eac576000810315611eac578080611db590615020565b9150506000601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018281548110611e0e57611e0d614f46565b5b906000526020600020015490508060195442611e2a9190615049565b11611ea057601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110611e8357611e82614f46565b5b906000526020600020015483611e999190614fec565b9250611ea6565b50611eac565b50611d9a565b505b919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611f0b613008565b73ffffffffffffffffffffffffffffffffffffffff16611f29611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690614e5a565b60405180910390fd5b83600b60006101000a81548161ffff021916908361ffff16021790555082600b60026101000a81548161ffff021916908361ffff16021790555081600b60046101000a81548161ffff021916908361ffff16021790555080600b60066101000a81548161ffff021916908361ffff16021790555050505050565b60606004805461200890614f15565b80601f016020809104026020016040519081016040528092919081815260200182805461203490614f15565b80156120815780601f1061205657610100808354040283529160200191612081565b820191906000526020600020905b81548152906001019060200180831161206457829003601f168201915b5050505050905090565b612093613008565b73ffffffffffffffffffffffffffffffffffffffff166120b1611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fe90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d90614ec6565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121c2613008565b73ffffffffffffffffffffffffffffffffffffffff166121e0611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90614e5a565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bb906150c9565b60405180910390fd5b6122ce8282613b92565b5050565b6000806122df3385612af3565b905082811015612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b9061515b565b60405180910390fd5b6123313385858403613010565b600191505092915050565b60185481565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c9906151c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890615233565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161247c9190614cc9565b602060405180830381865afa158015612499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bd9190615268565b90508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016124fa929190615295565b6020604051808303816000875af1158015612519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253d91906152d3565b50505050565b600b600c9054906101000a900461ffff1681565b6000612564338484613265565b6001905092915050565b612576613008565b73ffffffffffffffffffffffffffffffffffffffff16612594611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e190614e5a565b60405180910390fd5b8060188190555050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612642613008565b73ffffffffffffffffffffffffffffffffffffffff16612660611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271c90614ec6565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60105481565b61279b613008565b73ffffffffffffffffffffffffffffffffffffffff166127b9611ed9565b73ffffffffffffffffffffffffffffffffffffffff161461280f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280690614e5a565b60405180910390fd5b60005b828290508110156128af5760016014600085858581811061283657612835614f46565b5b905060200201602081019061284b91906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806128a790614fa4565b915050612812565b505050565b600080600267ffffffffffffffff8111156128d2576128d1615300565b5b6040519080825280602002602001820160405280156129005781602001602082028036833780820191505090505b509050308160008151811061291857612917614f46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e19190615344565b816001815181106129f5576129f4614f46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b8152600401612a8a92919061542f565b600060405180830381865afa158015612aa7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612ad0919061556e565b600181518110612ae357612ae2614f46565b5b6020026020010151915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612b82613008565b73ffffffffffffffffffffffffffffffffffffffff16612ba0611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bed90614e5a565b60405180910390fd5b8060198190555050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c87906151c7565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612cd6573d6000803e3d6000fd5b50565b600b600a9054906101000a900461ffff1681565b600a6020528060005260406000206000915054906101000a900460ff1681565b612d15613008565b73ffffffffffffffffffffffffffffffffffffffff16612d33611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8090614e5a565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60195481565b612df2613008565b73ffffffffffffffffffffffffffffffffffffffff16612e10611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5d90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc90615629565b60405180910390fd5b612ede81613acc565b50565b60125481565b612eef613008565b73ffffffffffffffffffffffffffffffffffffffff16612f0d611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5a90614e5a565b60405180910390fd5b60005b8282905081101561300357600160096000858585818110612f8a57612f89614f46565b5b9050602002016020810190612f9f91906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612ffb90614fa4565b915050612f66565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361307f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613076906156bb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e59061574d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516131cc91906148f6565b60405180910390a3505050565b60006131e58484612af3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461325f5781811015613251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613248906157b9565b60405180910390fd5b61325e8484848403613010565b5b50505050565b601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156133095750601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b613348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333f90615825565b60405180910390fd5b6000601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414806133e157506001601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133dd9190614fec565b4211155b6133ea57600080fd5b60016015546133f99190614fec565b421161354157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156134965742601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806135375750600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61354057600080fd5b5b601160009054906101000a900460ff161580156135a75750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156136205760006135b730611c4c565b905060006127106010546135ea7f0000000000000000000000000000000000000000000000000000000000000000611c4c565b6135f49190615845565b6135fe91906158b6565b9050600a8161360d9190615845565b821061361d5761361c82613bed565b5b50505b6000806000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156136c95750600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613a2257601360009054906101000a900460ff16806137325750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376890615933565b60405180910390fd5b600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156138c857612710600b60009054906101000a900461ffff1661ffff16856137e69190615845565b6137f091906158b6565b9250612710600b60029054906101000a900461ffff1661ffff16856138159190615845565b61381f91906158b6565b9150612710600b60069054906101000a900461ffff16600b60049054906101000a900461ffff166138509190615953565b61ffff168561385f9190615845565b61386991906158b6565b90506012548461387887611c4c565b6138829190614fec565b11156138c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ba906159d5565b60405180910390fd5b613a21565b600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156139c757612710600b60089054906101000a900461ffff1661ffff168561393d9190615845565b61394791906158b6565b9250612710600b600a9054906101000a900461ffff1661ffff168561396c9190615845565b61397691906158b6565b9150612710600b600e9054906101000a900461ffff16600b600c9054906101000a900461ffff166139a79190615953565b61ffff16856139b69190615845565b6139c091906158b6565b9050613a20565b601254846139d487611c4c565b6139de9190614fec565b1115613a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a16906159d5565b60405180910390fd5b5b5b5b6000818385613a319190614fec565b613a3b9190614fec565b905060008186613a4b9190615049565b9050613a578882613f5d565b613a628888836140ff565b6000821115613ac257613a768830846140ff565b84600c6000828254613a889190614fec565b9250508190555083600d6000828254613aa19190614fec565b9250508190555082600e6000828254613aba9190614fec565b925050819055505b5050505050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6001601160006101000a81548160ff0219169083151502179055506000600e54600d54600c54613c1d9190614fec565b613c279190614fec565b905060008103613c375750613f3f565b6000816002600c54613c4991906158b6565b84613c549190615845565b613c5e91906158b6565b905060008184613c6e9190615049565b9050613c798161437e565b6000479050600084600d5483613c8f9190615845565b613c9991906158b6565b9050600085600e5484613cac9190615845565b613cb691906158b6565b90506000818385613cc79190615049565b613cd19190615049565b9050600086118015613ce35750600081115b15613cf357613cf28682614590565b5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684619c4090604051613d3f90615a26565b600060405180830381858888f193505050503d8060008114613d7d576040519150601f19603f3d011682016040523d82523d6000602084013e613d82565b606091505b5050809150506000600b60069054906101000a900461ffff16600b60049054906101000a900461ffff16613db69190615953565b61ffff16600b60049054906101000a900461ffff1661ffff1685613dda9190615845565b613de491906158b6565b905060008185613df49190615049565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682619c4090604051613e4090615a26565b600060405180830381858888f193505050503d8060008114613e7e576040519150601f19603f3d011682016040523d82523d6000602084013e613e83565b606091505b505080935050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681619c4090604051613ed390615a26565b600060405180830381858888f193505050503d8060008114613f11576040519150601f19603f3d011682016040523d82523d6000602084013e613f16565b606091505b5050809350506000600c819055506000600d819055506000600e81905550505050505050505050505b6000601160006101000a81548160ff02191690831515021790555050565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580613fc35750601a60009054906101000a900460ff16155b6140fb576000613fd2826128b4565b9050601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101429080600181540180825580915050600190039060005260206000200160009091909190915055601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181908060018154018082558091505060019003906000526020600020016000909190919091505560006140b184611d40565b90506018548111156140f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ef90615a87565b60405180910390fd5b50505b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361416e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161416590615b19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036141dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d490615bab565b60405180910390fd5b6141e8838383614661565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561426e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161426590615c3d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143019190614fec565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161436591906148f6565b60405180910390a3614378848484614666565b50505050565b6000600267ffffffffffffffff81111561439b5761439a615300565b5b6040519080825280602002602001820160405280156143c95781602001602082028036833780820191505090505b50905030816000815181106143e1576143e0614f46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144aa9190615344565b816001815181106144be576144bd614f46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161455a959493929190615c98565b600060405180830381600087803b15801561457457600080fd5b505af1158015614588573d6000803e3d6000fd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161461796959493929190615cf2565b60606040518083038185885af1158015614635573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061465a9190615d53565b5050505050565b505050565b505050565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146c482614699565b9050919050565b6146d4816146b9565b81146146df57600080fd5b50565b6000813590506146f1816146cb565b92915050565b60006020828403121561470d5761470c61468f565b5b600061471b848285016146e2565b91505092915050565b600061ffff82169050919050565b61473b81614724565b82525050565b60006020820190506147566000830184614732565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561479657808201518184015260208101905061477b565b60008484015250505050565b6000601f19601f8301169050919050565b60006147be8261475c565b6147c88185614767565b93506147d8818560208601614778565b6147e1816147a2565b840191505092915050565b6000602082019050818103600083015261480681846147b3565b905092915050565b6000819050919050565b6148218161480e565b811461482c57600080fd5b50565b60008135905061483e81614818565b92915050565b6000806040838503121561485b5761485a61468f565b5b6000614869858286016146e2565b925050602061487a8582860161482f565b9150509250929050565b60008115159050919050565b61489981614884565b82525050565b60006020820190506148b46000830184614890565b92915050565b6000602082840312156148d0576148cf61468f565b5b60006148de8482850161482f565b91505092915050565b6148f08161480e565b82525050565b600060208201905061490b60008301846148e7565b92915050565b600061491c82614699565b9050919050565b61492c81614911565b82525050565b60006020820190506149476000830184614923565b92915050565b6000806000606084860312156149665761496561468f565b5b6000614974868287016146e2565b9350506020614985868287016146e2565b92505060406149968682870161482f565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126149c5576149c46149a0565b5b8235905067ffffffffffffffff8111156149e2576149e16149a5565b5b6020830191508360208202830111156149fe576149fd6149aa565b5b9250929050565b60008060208385031215614a1c57614a1b61468f565b5b600083013567ffffffffffffffff811115614a3a57614a39614694565b5b614a46858286016149af565b92509250509250929050565b600060ff82169050919050565b614a6881614a52565b82525050565b6000602082019050614a836000830184614a5f565b92915050565b614a9281614724565b8114614a9d57600080fd5b50565b600081359050614aaf81614a89565b92915050565b60008060008060808587031215614acf57614ace61468f565b5b6000614add87828801614aa0565b9450506020614aee87828801614aa0565b9350506040614aff87828801614aa0565b9250506060614b1087828801614aa0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b518161480e565b82525050565b6000614b638383614b48565b60208301905092915050565b6000602082019050919050565b6000614b8782614b1c565b614b918185614b27565b9350614b9c83614b38565b8060005b83811015614bcd578151614bb48882614b57565b9750614bbf83614b6f565b925050600181019050614ba0565b5085935050505092915050565b60006040830160008301518482036000860152614bf78282614b7c565b91505060208301518482036020860152614c118282614b7c565b9150508091505092915050565b60006020820190508181036000830152614c388184614bda565b905092915050565b6000819050919050565b6000614c65614c60614c5b84614699565b614c40565b614699565b9050919050565b6000614c7782614c4a565b9050919050565b6000614c8982614c6c565b9050919050565b614c9981614c7e565b82525050565b6000602082019050614cb46000830184614c90565b92915050565b614cc3816146b9565b82525050565b6000602082019050614cde6000830184614cba565b92915050565b614ced81614884565b8114614cf857600080fd5b50565b600081359050614d0a81614ce4565b92915050565b60008060408385031215614d2757614d2661468f565b5b6000614d35858286016146e2565b9250506020614d4685828601614cfb565b9150509250929050565b6000614d5b826146b9565b9050919050565b614d6b81614d50565b8114614d7657600080fd5b50565b600081359050614d8881614d62565b92915050565b60008060408385031215614da557614da461468f565b5b6000614db385828601614d79565b9250506020614dc4858286016146e2565b9150509250929050565b60008060408385031215614de557614de461468f565b5b6000614df3858286016146e2565b9250506020614e04858286016146e2565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e44602083614767565b9150614e4f82614e0e565b602082019050919050565b60006020820190508181036000830152614e7381614e37565b9050919050565b7f43616e2774207365742030000000000000000000000000000000000000000000600082015250565b6000614eb0600b83614767565b9150614ebb82614e7a565b602082019050919050565b60006020820190508181036000830152614edf81614ea3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f2d57607f821691505b602082108103614f4057614f3f614ee6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614faf8261480e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fe157614fe0614f75565b5b600182019050919050565b6000614ff78261480e565b91506150028361480e565b925082820190508082111561501a57615019614f75565b5b92915050565b600061502b8261480e565b91506000820361503e5761503d614f75565b5b600182039050919050565b60006150548261480e565b915061505f8361480e565b925082820390508181111561507757615076614f75565b5b92915050565b7f54686520706169722063616e6e6f742062652072656d6f766564000000000000600082015250565b60006150b3601a83614767565b91506150be8261507d565b602082019050919050565b600060208201905081810360008301526150e2816150a6565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000615145602583614767565b9150615150826150e9565b604082019050919050565b6000602082019050818103600083015261517481615138565b9050919050565b7f4f6e6c79206465706c6f79657200000000000000000000000000000000000000600082015250565b60006151b1600d83614767565b91506151bc8261517b565b602082019050919050565b600060208201905081810360008301526151e0816151a4565b9050919050565b7f77616c6c6574416464726573732063616e277420626520302061646472657373600082015250565b600061521d602083614767565b9150615228826151e7565b602082019050919050565b6000602082019050818103600083015261524c81615210565b9050919050565b60008151905061526281614818565b92915050565b60006020828403121561527e5761527d61468f565b5b600061528c84828501615253565b91505092915050565b60006040820190506152aa6000830185614cba565b6152b760208301846148e7565b9392505050565b6000815190506152cd81614ce4565b92915050565b6000602082840312156152e9576152e861468f565b5b60006152f7848285016152be565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008151905061533e816146cb565b92915050565b60006020828403121561535a5761535961468f565b5b60006153688482850161532f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6153a6816146b9565b82525050565b60006153b8838361539d565b60208301905092915050565b6000602082019050919050565b60006153dc82615371565b6153e6818561537c565b93506153f18361538d565b8060005b8381101561542257815161540988826153ac565b9750615414836153c4565b9250506001810190506153f5565b5085935050505092915050565b600060408201905061544460008301856148e7565b818103602083015261545681846153d1565b90509392505050565b615468826147a2565b810181811067ffffffffffffffff8211171561548757615486615300565b5b80604052505050565b600061549a614685565b90506154a6828261545f565b919050565b600067ffffffffffffffff8211156154c6576154c5615300565b5b602082029050602081019050919050565b60006154ea6154e5846154ab565b615490565b9050808382526020820190506020840283018581111561550d5761550c6149aa565b5b835b8181101561553657806155228882615253565b84526020840193505060208101905061550f565b5050509392505050565b600082601f830112615555576155546149a0565b5b81516155658482602086016154d7565b91505092915050565b6000602082840312156155845761558361468f565b5b600082015167ffffffffffffffff8111156155a2576155a1614694565b5b6155ae84828501615540565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615613602683614767565b915061561e826155b7565b604082019050919050565b6000602082019050818103600083015261564281615606565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006156a5602483614767565b91506156b082615649565b604082019050919050565b600060208201905081810360008301526156d481615698565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615737602283614767565b9150615742826156db565b604082019050919050565b600060208201905081810360008301526157668161572a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006157a3601d83614767565b91506157ae8261576d565b602082019050919050565b600060208201905081810360008301526157d281615796565b9050919050565b7f426f74206973206e6f7420616c6c6f77656420746f2074726164650000000000600082015250565b600061580f601b83614767565b915061581a826157d9565b602082019050919050565b6000602082019050818103600083015261583e81615802565b9050919050565b60006158508261480e565b915061585b8361480e565b92508282026158698161480e565b915082820484148315176158805761587f614f75565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158c18261480e565b91506158cc8361480e565b9250826158dc576158db615887565b5b828204905092915050565b7f54726164696e67206973206e6f74206f70656e20796574000000000000000000600082015250565b600061591d601783614767565b9150615928826158e7565b602082019050919050565b6000602082019050818103600083015261594c81615910565b9050919050565b600061595e82614724565b915061596983614724565b9250828201905061ffff81111561598357615982614f75565b5b92915050565b7f416d6f756e742065786365656473206d61782077616c6c65742073697a650000600082015250565b60006159bf601e83614767565b91506159ca82615989565b602082019050919050565b600060208201905081810360008301526159ee816159b2565b9050919050565b600081905092915050565b50565b6000615a106000836159f5565b9150615a1b82615a00565b600082019050919050565b6000615a3182615a03565b9150819050919050565b7f43616e27742073656c6c2074686174206d756368000000000000000000000000600082015250565b6000615a71601483614767565b9150615a7c82615a3b565b602082019050919050565b60006020820190508181036000830152615aa081615a64565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615b03602583614767565b9150615b0e82615aa7565b604082019050919050565b60006020820190508181036000830152615b3281615af6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615b95602383614767565b9150615ba082615b39565b604082019050919050565b60006020820190508181036000830152615bc481615b88565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615c27602683614767565b9150615c3282615bcb565b604082019050919050565b60006020820190508181036000830152615c5681615c1a565b9050919050565b6000819050919050565b6000615c82615c7d615c7884615c5d565b614c40565b61480e565b9050919050565b615c9281615c67565b82525050565b600060a082019050615cad60008301886148e7565b615cba6020830187615c89565b8181036040830152615ccc81866153d1565b9050615cdb6060830185614cba565b615ce860808301846148e7565b9695505050505050565b600060c082019050615d076000830189614cba565b615d1460208301886148e7565b615d216040830187615c89565b615d2e6060830186615c89565b615d3b6080830185614cba565b615d4860a08301846148e7565b979650505050505050565b600080600060608486031215615d6c57615d6b61468f565b5b6000615d7a86828701615253565b9350506020615d8b86828701615253565b9250506040615d9c86828701615253565b915050925092509256fea26469706673582212208f5699a8f83971e0b9d8cde2deed1419f8fa1396b237e8d7889ca0377d3925d464736f6c63430008130033

Deployed Bytecode

0x6080604052600436106103b15760003560e01c8063735de9f7116101e7578063b85a7ab91161010d578063e086e5ec116100a0578063f2a694311161006f578063f2a6943114610def578063f2fde38b14610e1a578063f8b45b0514610e43578063fd44e69814610e6e576103b8565b8063e086e5ec14610d47578063e96db1ef14610d5e578063e9a1b3ce14610d89578063ea2f0b3714610dc6576103b8565b8063d34628cc116100dc578063d34628cc14610c7b578063d5bda32d14610ca4578063dd62ed3e14610ce1578063dea3d57814610d1e576103b8565b8063b85a7ab914610bd1578063c2e9060114610bfc578063c816841b14610c25578063cf84b2d614610c50576103b8565b80639a7a23d611610185578063a763f9a611610154578063a763f9a614610b03578063a9059cbb14610b2e578063ae96ffe614610b6b578063b62496f514610b94576103b8565b80639a7a23d614610a49578063a457c2d714610a72578063a4d66daf14610aaf578063a522ad2514610ada576103b8565b80638da5cb5b116101c15780638da5cb5b146109a15780638dc64439146109cc57806395d89b41146109f557806399cd1ece14610a20576103b8565b8063735de9f71461090e5780638b16549a146109395780638c26a4cf14610976576103b8565b806334cc7aa4116102d75780635d0044ca1161026a5780636ab91206116102395780636ab91206146108665780636c3bbfd71461089157806370a08231146108ba578063715018a6146108f7576103b8565b80635d0044ca146107be5780635de593cd146107e75780636090144414610824578063675757ff1461084f576103b8565b8063527084ad116102a6578063527084ad146107045780635342acb41461072f57806353ca37fa1461076c5780635bcbe87714610795576103b8565b806334cc7aa41461064c57806339509351146106755780633f60b426146106b2578063437823ec146106db576103b8565b80631cce34ee1161034f5780632f9066a41161031e5780632f9066a4146105a2578063313ce567146105cb57806331970ace146105f65780633301241114610621576103b8565b80631cce34ee146104e457806320c635b51461050f57806323b872dd1461053a57806327ff8cfa14610577576103b8565b8063095ea7b31161038b578063095ea7b31461043c5780630a08c524146104795780630cd7acc1146104a257806318160ddd146104b9576103b8565b806302728108146103bd57806306b9ec65146103e657806306fdde0314610411576103b8565b366103b857005b600080fd5b3480156103c957600080fd5b506103e460048036038101906103df91906146f7565b610e97565b005b3480156103f257600080fd5b506103fb610fc6565b6040516104089190614741565b60405180910390f35b34801561041d57600080fd5b50610426610fda565b60405161043391906147ec565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e9190614844565b61106c565b604051610470919061489f565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b91906148ba565b611083565b005b3480156104ae57600080fd5b506104b7611109565b005b3480156104c557600080fd5b506104ce6111b1565b6040516104db91906148f6565b60405180910390f35b3480156104f057600080fd5b506104f96111bb565b604051610506919061489f565b60405180910390f35b34801561051b57600080fd5b506105246111ce565b6040516105319190614932565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c919061494d565b6111f4565b60405161056e919061489f565b60405180910390f35b34801561058357600080fd5b5061058c611223565b6040516105999190614741565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190614a05565b611237565b005b3480156105d757600080fd5b506105e0611358565b6040516105ed9190614a6e565b60405180910390f35b34801561060257600080fd5b5061060b611361565b6040516106189190614741565b60405180910390f35b34801561062d57600080fd5b50610636611375565b6040516106439190614741565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e9190614a05565b611389565b005b34801561068157600080fd5b5061069c60048036038101906106979190614844565b6114aa565b6040516106a9919061489f565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d491906146f7565b6114d5565b005b3480156106e757600080fd5b5061070260048036038101906106fd91906146f7565b611599565b005b34801561071057600080fd5b50610719611670565b6040516107269190614741565b60405180910390f35b34801561073b57600080fd5b50610756600480360381019061075191906146f7565b611684565b604051610763919061489f565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190614a05565b6116a4565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190614ab5565b6117c5565b005b3480156107ca57600080fd5b506107e560048036038101906107e091906148ba565b6118bb565b005b3480156107f357600080fd5b5061080e600480360381019061080991906146f7565b611941565b60405161081b9190614c1e565b60405180910390f35b34801561083057600080fd5b50610839611a4a565b604051610846919061489f565b60405180910390f35b34801561085b57600080fd5b50610864611a5d565b005b34801561087257600080fd5b5061087b611b17565b6040516108889190614741565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b39190614a05565b611b2b565b005b3480156108c657600080fd5b506108e160048036038101906108dc91906146f7565b611c4c565b6040516108ee91906148f6565b60405180910390f35b34801561090357600080fd5b5061090c611c94565b005b34801561091a57600080fd5b50610923611d1c565b6040516109309190614c9f565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b91906146f7565b611d40565b60405161096d91906148f6565b60405180910390f35b34801561098257600080fd5b5061098b611eb3565b6040516109989190614932565b60405180910390f35b3480156109ad57600080fd5b506109b6611ed9565b6040516109c39190614cc9565b60405180910390f35b3480156109d857600080fd5b506109f360048036038101906109ee9190614ab5565b611f03565b005b348015610a0157600080fd5b50610a0a611ff9565b604051610a1791906147ec565b60405180910390f35b348015610a2c57600080fd5b50610a476004803603810190610a4291906146f7565b61208b565b005b348015610a5557600080fd5b50610a706004803603810190610a6b9190614d10565b6121ba565b005b348015610a7e57600080fd5b50610a996004803603810190610a949190614844565b6122d2565b604051610aa6919061489f565b60405180910390f35b348015610abb57600080fd5b50610ac461233c565b604051610ad191906148f6565b60405180910390f35b348015610ae657600080fd5b50610b016004803603810190610afc9190614d8e565b612342565b005b348015610b0f57600080fd5b50610b18612543565b604051610b259190614741565b60405180910390f35b348015610b3a57600080fd5b50610b556004803603810190610b509190614844565b612557565b604051610b62919061489f565b60405180910390f35b348015610b7757600080fd5b50610b926004803603810190610b8d91906148ba565b61256e565b005b348015610ba057600080fd5b50610bbb6004803603810190610bb691906146f7565b6125f4565b604051610bc8919061489f565b60405180910390f35b348015610bdd57600080fd5b50610be6612614565b604051610bf39190614932565b60405180910390f35b348015610c0857600080fd5b50610c236004803603810190610c1e91906146f7565b61263a565b005b348015610c3157600080fd5b50610c3a612769565b604051610c479190614cc9565b60405180910390f35b348015610c5c57600080fd5b50610c6561278d565b604051610c7291906148f6565b60405180910390f35b348015610c8757600080fd5b50610ca26004803603810190610c9d9190614a05565b612793565b005b348015610cb057600080fd5b50610ccb6004803603810190610cc691906148ba565b6128b4565b604051610cd891906148f6565b60405180910390f35b348015610ced57600080fd5b50610d086004803603810190610d039190614dce565b612af3565b604051610d1591906148f6565b60405180910390f35b348015610d2a57600080fd5b50610d456004803603810190610d4091906148ba565b612b7a565b005b348015610d5357600080fd5b50610d5c612c00565b005b348015610d6a57600080fd5b50610d73612cd9565b604051610d809190614741565b60405180910390f35b348015610d9557600080fd5b50610db06004803603810190610dab91906146f7565b612ced565b604051610dbd919061489f565b60405180910390f35b348015610dd257600080fd5b50610ded6004803603810190610de891906146f7565b612d0d565b005b348015610dfb57600080fd5b50610e04612de4565b604051610e1191906148f6565b60405180910390f35b348015610e2657600080fd5b50610e416004803603810190610e3c91906146f7565b612dea565b005b348015610e4f57600080fd5b50610e58612ee1565b604051610e6591906148f6565b60405180910390f35b348015610e7a57600080fd5b50610e956004803603810190610e909190614a05565b612ee7565b005b610e9f613008565b73ffffffffffffffffffffffffffffffffffffffff16610ebd611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990614ec6565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900461ffff1681565b606060038054610fe990614f15565b80601f016020809104026020016040519081016040528092919081815260200182805461101590614f15565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b6000611079338484613010565b6001905092915050565b61108b613008565b73ffffffffffffffffffffffffffffffffffffffff166110a9611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f690614e5a565b60405180910390fd5b8060108190555050565b611111613008565b73ffffffffffffffffffffffffffffffffffffffff1661112f611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90614e5a565b60405180910390fd5b601a60009054906101000a900460ff1615601a60006101000a81548160ff021916908315150217905550565b6000600254905090565b601a60009054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806111ff613008565b905061120c8582856131d9565b611217858585613265565b60019150509392505050565b600b60049054906101000a900461ffff1681565b61123f613008565b73ffffffffffffffffffffffffffffffffffffffff1661125d611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90614e5a565b60405180910390fd5b60005b82829050811015611353576000600a60008585858181106112da576112d9614f46565b5b90506020020160208101906112ef91906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061134b90614fa4565b9150506112b6565b505050565b60006012905090565b600b600e9054906101000a900461ffff1681565b600b60029054906101000a900461ffff1681565b611391613008565b73ffffffffffffffffffffffffffffffffffffffff166113af611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90614e5a565b60405180910390fd5b60005b828290508110156114a5576001600a600085858581811061142c5761142b614f46565b5b905060200201602081019061144191906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061149d90614fa4565b915050611408565b505050565b60006114cb3384846114bc3388612af3565b6114c69190614fec565b613010565b6001905092915050565b6114dd613008565b73ffffffffffffffffffffffffffffffffffffffff166114fb611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154890614e5a565b60405180910390fd5b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6115a1613008565b73ffffffffffffffffffffffffffffffffffffffff166115bf611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c90614e5a565b60405180910390fd5b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600b60069054906101000a900461ffff1681565b60096020528060005260406000206000915054906101000a900460ff1681565b6116ac613008565b73ffffffffffffffffffffffffffffffffffffffff166116ca611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171790614e5a565b60405180910390fd5b60005b828290508110156117c05760006009600085858581811061174757611746614f46565b5b905060200201602081019061175c91906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806117b890614fa4565b915050611723565b505050565b6117cd613008565b73ffffffffffffffffffffffffffffffffffffffff166117eb611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890614e5a565b60405180910390fd5b83600b60086101000a81548161ffff021916908361ffff16021790555082600b600a6101000a81548161ffff021916908361ffff16021790555081600b600c6101000a81548161ffff021916908361ffff16021790555080600b600e6101000a81548161ffff021916908361ffff16021790555050505050565b6118c3613008565b73ffffffffffffffffffffffffffffffffffffffff166118e1611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90614e5a565b60405180910390fd5b8060128190555050565b61194961466b565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040529081600082018054806020026020016040519081016040528092919081815260200182805480156119e257602002820191906000526020600020905b8154815260200190600101908083116119ce575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611a3a57602002820191906000526020600020905b815481526020019060010190808311611a26575b5050505050815250509050919050565b601360009054906101000a900460ff1681565b611a65613008565b73ffffffffffffffffffffffffffffffffffffffff16611a83611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad090614e5a565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550600060155403611b1557436015819055505b565b600b60089054906101000a900461ffff1681565b611b33613008565b73ffffffffffffffffffffffffffffffffffffffff16611b51611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90614e5a565b60405180910390fd5b60005b82829050811015611c4757600060146000858585818110611bce57611bcd614f46565b5b9050602002016020810190611be391906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c3f90614fa4565b915050611baa565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c9c613008565b73ffffffffffffffffffffffffffffffffffffffff16611cba611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790614e5a565b60405180910390fd5b611d1a6000613acc565b565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b600080601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050905060008103611d995750611eae565b5b600115611eac576000810315611eac578080611db590615020565b9150506000601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018281548110611e0e57611e0d614f46565b5b906000526020600020015490508060195442611e2a9190615049565b11611ea057601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110611e8357611e82614f46565b5b906000526020600020015483611e999190614fec565b9250611ea6565b50611eac565b50611d9a565b505b919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611f0b613008565b73ffffffffffffffffffffffffffffffffffffffff16611f29611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690614e5a565b60405180910390fd5b83600b60006101000a81548161ffff021916908361ffff16021790555082600b60026101000a81548161ffff021916908361ffff16021790555081600b60046101000a81548161ffff021916908361ffff16021790555080600b60066101000a81548161ffff021916908361ffff16021790555050505050565b60606004805461200890614f15565b80601f016020809104026020016040519081016040528092919081815260200182805461203490614f15565b80156120815780601f1061205657610100808354040283529160200191612081565b820191906000526020600020905b81548152906001019060200180831161206457829003601f168201915b5050505050905090565b612093613008565b73ffffffffffffffffffffffffffffffffffffffff166120b1611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fe90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d90614ec6565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121c2613008565b73ffffffffffffffffffffffffffffffffffffffff166121e0611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90614e5a565b60405180910390fd5b7f0000000000000000000000001af68e48d3676b278cfa1659a23426a9a831628073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bb906150c9565b60405180910390fd5b6122ce8282613b92565b5050565b6000806122df3385612af3565b905082811015612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b9061515b565b60405180910390fd5b6123313385858403613010565b600191505092915050565b60185481565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c9906151c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890615233565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161247c9190614cc9565b602060405180830381865afa158015612499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bd9190615268565b90508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016124fa929190615295565b6020604051808303816000875af1158015612519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253d91906152d3565b50505050565b600b600c9054906101000a900461ffff1681565b6000612564338484613265565b6001905092915050565b612576613008565b73ffffffffffffffffffffffffffffffffffffffff16612594611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e190614e5a565b60405180910390fd5b8060188190555050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612642613008565b73ffffffffffffffffffffffffffffffffffffffff16612660611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271c90614ec6565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f0000000000000000000000001af68e48d3676b278cfa1659a23426a9a831628081565b60105481565b61279b613008565b73ffffffffffffffffffffffffffffffffffffffff166127b9611ed9565b73ffffffffffffffffffffffffffffffffffffffff161461280f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280690614e5a565b60405180910390fd5b60005b828290508110156128af5760016014600085858581811061283657612835614f46565b5b905060200201602081019061284b91906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806128a790614fa4565b915050612812565b505050565b600080600267ffffffffffffffff8111156128d2576128d1615300565b5b6040519080825280602002602001820160405280156129005781602001602082028036833780820191505090505b509050308160008151811061291857612917614f46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e19190615344565b816001815181106129f5576129f4614f46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b8152600401612a8a92919061542f565b600060405180830381865afa158015612aa7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612ad0919061556e565b600181518110612ae357612ae2614f46565b5b6020026020010151915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612b82613008565b73ffffffffffffffffffffffffffffffffffffffff16612ba0611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bed90614e5a565b60405180910390fd5b8060198190555050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c87906151c7565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612cd6573d6000803e3d6000fd5b50565b600b600a9054906101000a900461ffff1681565b600a6020528060005260406000206000915054906101000a900460ff1681565b612d15613008565b73ffffffffffffffffffffffffffffffffffffffff16612d33611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8090614e5a565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60195481565b612df2613008565b73ffffffffffffffffffffffffffffffffffffffff16612e10611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5d90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc90615629565b60405180910390fd5b612ede81613acc565b50565b60125481565b612eef613008565b73ffffffffffffffffffffffffffffffffffffffff16612f0d611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5a90614e5a565b60405180910390fd5b60005b8282905081101561300357600160096000858585818110612f8a57612f89614f46565b5b9050602002016020810190612f9f91906146f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612ffb90614fa4565b915050612f66565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361307f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613076906156bb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e59061574d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516131cc91906148f6565b60405180910390a3505050565b60006131e58484612af3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461325f5781811015613251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613248906157b9565b60405180910390fd5b61325e8484848403613010565b5b50505050565b601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156133095750601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b613348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333f90615825565b60405180910390fd5b6000601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414806133e157506001601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133dd9190614fec565b4211155b6133ea57600080fd5b60016015546133f99190614fec565b421161354157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156134965742601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806135375750600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61354057600080fd5b5b601160009054906101000a900460ff161580156135a75750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156136205760006135b730611c4c565b905060006127106010546135ea7f0000000000000000000000001af68e48d3676b278cfa1659a23426a9a8316280611c4c565b6135f49190615845565b6135fe91906158b6565b9050600a8161360d9190615845565b821061361d5761361c82613bed565b5b50505b6000806000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156136c95750600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613a2257601360009054906101000a900460ff16806137325750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376890615933565b60405180910390fd5b600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156138c857612710600b60009054906101000a900461ffff1661ffff16856137e69190615845565b6137f091906158b6565b9250612710600b60029054906101000a900461ffff1661ffff16856138159190615845565b61381f91906158b6565b9150612710600b60069054906101000a900461ffff16600b60049054906101000a900461ffff166138509190615953565b61ffff168561385f9190615845565b61386991906158b6565b90506012548461387887611c4c565b6138829190614fec565b11156138c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ba906159d5565b60405180910390fd5b613a21565b600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156139c757612710600b60089054906101000a900461ffff1661ffff168561393d9190615845565b61394791906158b6565b9250612710600b600a9054906101000a900461ffff1661ffff168561396c9190615845565b61397691906158b6565b9150612710600b600e9054906101000a900461ffff16600b600c9054906101000a900461ffff166139a79190615953565b61ffff16856139b69190615845565b6139c091906158b6565b9050613a20565b601254846139d487611c4c565b6139de9190614fec565b1115613a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a16906159d5565b60405180910390fd5b5b5b5b6000818385613a319190614fec565b613a3b9190614fec565b905060008186613a4b9190615049565b9050613a578882613f5d565b613a628888836140ff565b6000821115613ac257613a768830846140ff565b84600c6000828254613a889190614fec565b9250508190555083600d6000828254613aa19190614fec565b9250508190555082600e6000828254613aba9190614fec565b925050819055505b5050505050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6001601160006101000a81548160ff0219169083151502179055506000600e54600d54600c54613c1d9190614fec565b613c279190614fec565b905060008103613c375750613f3f565b6000816002600c54613c4991906158b6565b84613c549190615845565b613c5e91906158b6565b905060008184613c6e9190615049565b9050613c798161437e565b6000479050600084600d5483613c8f9190615845565b613c9991906158b6565b9050600085600e5484613cac9190615845565b613cb691906158b6565b90506000818385613cc79190615049565b613cd19190615049565b9050600086118015613ce35750600081115b15613cf357613cf28682614590565b5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684619c4090604051613d3f90615a26565b600060405180830381858888f193505050503d8060008114613d7d576040519150601f19603f3d011682016040523d82523d6000602084013e613d82565b606091505b5050809150506000600b60069054906101000a900461ffff16600b60049054906101000a900461ffff16613db69190615953565b61ffff16600b60049054906101000a900461ffff1661ffff1685613dda9190615845565b613de491906158b6565b905060008185613df49190615049565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682619c4090604051613e4090615a26565b600060405180830381858888f193505050503d8060008114613e7e576040519150601f19603f3d011682016040523d82523d6000602084013e613e83565b606091505b505080935050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681619c4090604051613ed390615a26565b600060405180830381858888f193505050503d8060008114613f11576040519150601f19603f3d011682016040523d82523d6000602084013e613f16565b606091505b5050809350506000600c819055506000600d819055506000600e81905550505050505050505050505b6000601160006101000a81548160ff02191690831515021790555050565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580613fc35750601a60009054906101000a900460ff16155b6140fb576000613fd2826128b4565b9050601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101429080600181540180825580915050600190039060005260206000200160009091909190915055601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181908060018154018082558091505060019003906000526020600020016000909190919091505560006140b184611d40565b90506018548111156140f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ef90615a87565b60405180910390fd5b50505b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361416e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161416590615b19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036141dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d490615bab565b60405180910390fd5b6141e8838383614661565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561426e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161426590615c3d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143019190614fec565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161436591906148f6565b60405180910390a3614378848484614666565b50505050565b6000600267ffffffffffffffff81111561439b5761439a615300565b5b6040519080825280602002602001820160405280156143c95781602001602082028036833780820191505090505b50905030816000815181106143e1576143e0614f46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144aa9190615344565b816001815181106144be576144bd614f46565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161455a959493929190615c98565b600060405180830381600087803b15801561457457600080fd5b505af1158015614588573d6000803e3d6000fd5b505050505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161461796959493929190615cf2565b60606040518083038185885af1158015614635573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061465a9190615d53565b5050505050565b505050565b505050565b604051806040016040528060608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146c482614699565b9050919050565b6146d4816146b9565b81146146df57600080fd5b50565b6000813590506146f1816146cb565b92915050565b60006020828403121561470d5761470c61468f565b5b600061471b848285016146e2565b91505092915050565b600061ffff82169050919050565b61473b81614724565b82525050565b60006020820190506147566000830184614732565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561479657808201518184015260208101905061477b565b60008484015250505050565b6000601f19601f8301169050919050565b60006147be8261475c565b6147c88185614767565b93506147d8818560208601614778565b6147e1816147a2565b840191505092915050565b6000602082019050818103600083015261480681846147b3565b905092915050565b6000819050919050565b6148218161480e565b811461482c57600080fd5b50565b60008135905061483e81614818565b92915050565b6000806040838503121561485b5761485a61468f565b5b6000614869858286016146e2565b925050602061487a8582860161482f565b9150509250929050565b60008115159050919050565b61489981614884565b82525050565b60006020820190506148b46000830184614890565b92915050565b6000602082840312156148d0576148cf61468f565b5b60006148de8482850161482f565b91505092915050565b6148f08161480e565b82525050565b600060208201905061490b60008301846148e7565b92915050565b600061491c82614699565b9050919050565b61492c81614911565b82525050565b60006020820190506149476000830184614923565b92915050565b6000806000606084860312156149665761496561468f565b5b6000614974868287016146e2565b9350506020614985868287016146e2565b92505060406149968682870161482f565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126149c5576149c46149a0565b5b8235905067ffffffffffffffff8111156149e2576149e16149a5565b5b6020830191508360208202830111156149fe576149fd6149aa565b5b9250929050565b60008060208385031215614a1c57614a1b61468f565b5b600083013567ffffffffffffffff811115614a3a57614a39614694565b5b614a46858286016149af565b92509250509250929050565b600060ff82169050919050565b614a6881614a52565b82525050565b6000602082019050614a836000830184614a5f565b92915050565b614a9281614724565b8114614a9d57600080fd5b50565b600081359050614aaf81614a89565b92915050565b60008060008060808587031215614acf57614ace61468f565b5b6000614add87828801614aa0565b9450506020614aee87828801614aa0565b9350506040614aff87828801614aa0565b9250506060614b1087828801614aa0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b518161480e565b82525050565b6000614b638383614b48565b60208301905092915050565b6000602082019050919050565b6000614b8782614b1c565b614b918185614b27565b9350614b9c83614b38565b8060005b83811015614bcd578151614bb48882614b57565b9750614bbf83614b6f565b925050600181019050614ba0565b5085935050505092915050565b60006040830160008301518482036000860152614bf78282614b7c565b91505060208301518482036020860152614c118282614b7c565b9150508091505092915050565b60006020820190508181036000830152614c388184614bda565b905092915050565b6000819050919050565b6000614c65614c60614c5b84614699565b614c40565b614699565b9050919050565b6000614c7782614c4a565b9050919050565b6000614c8982614c6c565b9050919050565b614c9981614c7e565b82525050565b6000602082019050614cb46000830184614c90565b92915050565b614cc3816146b9565b82525050565b6000602082019050614cde6000830184614cba565b92915050565b614ced81614884565b8114614cf857600080fd5b50565b600081359050614d0a81614ce4565b92915050565b60008060408385031215614d2757614d2661468f565b5b6000614d35858286016146e2565b9250506020614d4685828601614cfb565b9150509250929050565b6000614d5b826146b9565b9050919050565b614d6b81614d50565b8114614d7657600080fd5b50565b600081359050614d8881614d62565b92915050565b60008060408385031215614da557614da461468f565b5b6000614db385828601614d79565b9250506020614dc4858286016146e2565b9150509250929050565b60008060408385031215614de557614de461468f565b5b6000614df3858286016146e2565b9250506020614e04858286016146e2565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e44602083614767565b9150614e4f82614e0e565b602082019050919050565b60006020820190508181036000830152614e7381614e37565b9050919050565b7f43616e2774207365742030000000000000000000000000000000000000000000600082015250565b6000614eb0600b83614767565b9150614ebb82614e7a565b602082019050919050565b60006020820190508181036000830152614edf81614ea3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f2d57607f821691505b602082108103614f4057614f3f614ee6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614faf8261480e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fe157614fe0614f75565b5b600182019050919050565b6000614ff78261480e565b91506150028361480e565b925082820190508082111561501a57615019614f75565b5b92915050565b600061502b8261480e565b91506000820361503e5761503d614f75565b5b600182039050919050565b60006150548261480e565b915061505f8361480e565b925082820390508181111561507757615076614f75565b5b92915050565b7f54686520706169722063616e6e6f742062652072656d6f766564000000000000600082015250565b60006150b3601a83614767565b91506150be8261507d565b602082019050919050565b600060208201905081810360008301526150e2816150a6565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000615145602583614767565b9150615150826150e9565b604082019050919050565b6000602082019050818103600083015261517481615138565b9050919050565b7f4f6e6c79206465706c6f79657200000000000000000000000000000000000000600082015250565b60006151b1600d83614767565b91506151bc8261517b565b602082019050919050565b600060208201905081810360008301526151e0816151a4565b9050919050565b7f77616c6c6574416464726573732063616e277420626520302061646472657373600082015250565b600061521d602083614767565b9150615228826151e7565b602082019050919050565b6000602082019050818103600083015261524c81615210565b9050919050565b60008151905061526281614818565b92915050565b60006020828403121561527e5761527d61468f565b5b600061528c84828501615253565b91505092915050565b60006040820190506152aa6000830185614cba565b6152b760208301846148e7565b9392505050565b6000815190506152cd81614ce4565b92915050565b6000602082840312156152e9576152e861468f565b5b60006152f7848285016152be565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008151905061533e816146cb565b92915050565b60006020828403121561535a5761535961468f565b5b60006153688482850161532f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6153a6816146b9565b82525050565b60006153b8838361539d565b60208301905092915050565b6000602082019050919050565b60006153dc82615371565b6153e6818561537c565b93506153f18361538d565b8060005b8381101561542257815161540988826153ac565b9750615414836153c4565b9250506001810190506153f5565b5085935050505092915050565b600060408201905061544460008301856148e7565b818103602083015261545681846153d1565b90509392505050565b615468826147a2565b810181811067ffffffffffffffff8211171561548757615486615300565b5b80604052505050565b600061549a614685565b90506154a6828261545f565b919050565b600067ffffffffffffffff8211156154c6576154c5615300565b5b602082029050602081019050919050565b60006154ea6154e5846154ab565b615490565b9050808382526020820190506020840283018581111561550d5761550c6149aa565b5b835b8181101561553657806155228882615253565b84526020840193505060208101905061550f565b5050509392505050565b600082601f830112615555576155546149a0565b5b81516155658482602086016154d7565b91505092915050565b6000602082840312156155845761558361468f565b5b600082015167ffffffffffffffff8111156155a2576155a1614694565b5b6155ae84828501615540565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615613602683614767565b915061561e826155b7565b604082019050919050565b6000602082019050818103600083015261564281615606565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006156a5602483614767565b91506156b082615649565b604082019050919050565b600060208201905081810360008301526156d481615698565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615737602283614767565b9150615742826156db565b604082019050919050565b600060208201905081810360008301526157668161572a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006157a3601d83614767565b91506157ae8261576d565b602082019050919050565b600060208201905081810360008301526157d281615796565b9050919050565b7f426f74206973206e6f7420616c6c6f77656420746f2074726164650000000000600082015250565b600061580f601b83614767565b915061581a826157d9565b602082019050919050565b6000602082019050818103600083015261583e81615802565b9050919050565b60006158508261480e565b915061585b8361480e565b92508282026158698161480e565b915082820484148315176158805761587f614f75565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158c18261480e565b91506158cc8361480e565b9250826158dc576158db615887565b5b828204905092915050565b7f54726164696e67206973206e6f74206f70656e20796574000000000000000000600082015250565b600061591d601783614767565b9150615928826158e7565b602082019050919050565b6000602082019050818103600083015261594c81615910565b9050919050565b600061595e82614724565b915061596983614724565b9250828201905061ffff81111561598357615982614f75565b5b92915050565b7f416d6f756e742065786365656473206d61782077616c6c65742073697a650000600082015250565b60006159bf601e83614767565b91506159ca82615989565b602082019050919050565b600060208201905081810360008301526159ee816159b2565b9050919050565b600081905092915050565b50565b6000615a106000836159f5565b9150615a1b82615a00565b600082019050919050565b6000615a3182615a03565b9150819050919050565b7f43616e27742073656c6c2074686174206d756368000000000000000000000000600082015250565b6000615a71601483614767565b9150615a7c82615a3b565b602082019050919050565b60006020820190508181036000830152615aa081615a64565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615b03602583614767565b9150615b0e82615aa7565b604082019050919050565b60006020820190508181036000830152615b3281615af6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615b95602383614767565b9150615ba082615b39565b604082019050919050565b60006020820190508181036000830152615bc481615b88565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615c27602683614767565b9150615c3282615bcb565b604082019050919050565b60006020820190508181036000830152615c5681615c1a565b9050919050565b6000819050919050565b6000615c82615c7d615c7884615c5d565b614c40565b61480e565b9050919050565b615c9281615c67565b82525050565b600060a082019050615cad60008301886148e7565b615cba6020830187615c89565b8181036040830152615ccc81866153d1565b9050615cdb6060830185614cba565b615ce860808301846148e7565b9695505050505050565b600060c082019050615d076000830189614cba565b615d1460208301886148e7565b615d216040830187615c89565b615d2e6060830186615c89565b615d3b6080830185614cba565b615d4860a08301846148e7565b979650505050505050565b600080600060608486031215615d6c57615d6b61468f565b5b6000615d7a86828701615253565b9350506020615d8b86828701615253565b9250506040615d9c86828701615253565b915050925092509256fea26469706673582212208f5699a8f83971e0b9d8cde2deed1419f8fa1396b237e8d7889ca0377d3925d464736f6c63430008130033

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.