ETH Price: $2,537.95 (-3.79%)

Token

VerifAI (VFAI)
 

Overview

Max Total Supply

1,000,000,000 VFAI

Holders

86

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
600,000.060000001 VFAI

Value
$0.00
0x18180BDcDB0591346dCacd06821e355574E21c6E
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:
VerifAI

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-10
*/

/*

VerifAI — AI-Powered Authenticity Verification Platform

“Discovering the Truth Behind Digital Content”

Introduction: VerifAI is a decentralized AI platform that uses advanced algorithms
to detect whether digital content has been generated by humans or AI. The platform
will launch on the Ethereum network, providing a secure and transparent solution
for content authenticity verification.


💬 https://t.me/VerifAI
🐦 https://twitter.com/VerifAI_eth
🌐 https://medium.com/@verifAI/verifai-ai-powered-authenticity-verification-platform-fd5a3ffa48c8 

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function allPairsLength() external view returns (uint256);

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

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

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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);
}

/**
 * @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 decimals places of the token.
     */
    function decimals() external view returns (uint8);

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

/**
 * @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;
    }
}

/**
 * @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);
    }
}

/**
 * @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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

    /**
     * @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 9;
    }

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

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

    /**
     * @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)
        external
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @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)
        external
        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
    ) external virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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)
        external
        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 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)
        external
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /** @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");

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

    /**
     * @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");

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

    /**
     * @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);
            }
        }
    }

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

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

/**
 * @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 VerifAI is ERC20, Ownable {
    // TOKENOMICS START ==========================================================>
    string private _name = "VerifAI";
    string private _symbol = "VFAI";
    uint8 private _decimals = 9;
    uint256 private _supply = 1_000_000_000;
    uint256 public taxForLiquidity = 47; //sniper protection, to be lowered to 1% after launch
    uint256 public taxForMarketing = 47; //sniper protection, to be lowered to 2% after launch
    uint256 public maxTxAmount = 10_000_001 * 10**_decimals;
    uint256 public maxWalletAmount = 10_000_001 * 10**_decimals;
    address public marketingWallet = 0x35978D362Ebc3f1DCd71A02fAC2409A87425B4aE;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _marketingReserves = 0;
    mapping(address => bool) public _isExcludedFromFee;
    uint256 public numTokensSellToAddToLiquidity = 200000 * 10**_decimals;
    uint256 public numTokensSellToAddToETH = 100000 * 10**_decimals;
    bool public tradingActive = false;

    function postLaunch() external onlyOwner {
        taxForLiquidity = 1;
        taxForMarketing = 4;
        maxTxAmount = 20_000_001 * 10**_decimals;
        maxWalletAmount = 20_000_001 * 10**_decimals;
    }
    // TOKENOMICS END ============================================================>

    event ExcludedFromFeeUpdated(address _address, bool _status);
    
    event PairUpdated(address _address);

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    
    bool inSwapAndLiquify;

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

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

    /**
     * @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() ERC20(_name, _symbol) {
        _mint(msg.sender, (_supply * 10**_decimals));

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //eth mainnet
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        _isExcludedFromFee[address(uniswapV2Router)] = true;
        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[marketingWallet] = true;
    }

    function updatePair(address _pair) external onlyOwner {
        require(_pair != DEAD, "LP Pair cannot be the Dead wallet, or 0!");
        require(_pair != address(0), "LP Pair cannot be the Dead wallet, or 0!");
        uniswapV2Pair = _pair;
        emit PairUpdated(_pair);
    }

    /**
     * @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 override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(balanceOf(from) >= amount, "ERC20: transfer amount exceeds balance");
        if (!tradingActive) {
            require(from == owner(), "TOKEN: This account cannot send tokens until trading is enabled");
        }

        if ((from == uniswapV2Pair || to == uniswapV2Pair) && !inSwapAndLiquify) {
            if (from != uniswapV2Pair) {
                uint256 contractLiquidityBalance = balanceOf(address(this)) - _marketingReserves;
                if (contractLiquidityBalance >= numTokensSellToAddToLiquidity) {
                    _swapAndLiquify(numTokensSellToAddToLiquidity);
                }
                if ((_marketingReserves) >= numTokensSellToAddToETH) {
                    _swapTokensForEth(numTokensSellToAddToETH);
                    _marketingReserves -= numTokensSellToAddToETH;
                    bool sent = payable(marketingWallet).send(address(this).balance);
                    require(sent, "Failed to send ETH");
                }
            }

            uint256 transferAmount;
            if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
                transferAmount = amount;
            } 
            else {
                require(amount <= maxTxAmount, "ERC20: transfer amount exceeds the max transaction amount");
                if(from == uniswapV2Pair){
                    require((amount + balanceOf(to)) <= maxWalletAmount, "ERC20: balance amount exceeded max wallet amount limit");
                }

                uint256 marketingShare = ((amount * taxForMarketing) / 100);
                uint256 liquidityShare = ((amount * taxForLiquidity) / 100);
                transferAmount = amount - (marketingShare + liquidityShare);
                _marketingReserves += marketingShare;

                super._transfer(from, address(this), (marketingShare + liquidityShare));
            }
            super._transfer(from, to, transferAmount);
        } 
        else {
            super._transfer(from, to, amount);
        }
    }

    function excludeFromFee(address _address, bool _status) external onlyOwner {
        _isExcludedFromFee[_address] = _status;
        emit ExcludedFromFeeUpdated(_address, _status);
    }

    function _swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        uint256 half = (contractTokenBalance / 2);
        uint256 otherHalf = (contractTokenBalance - half);

        uint256 initialBalance = address(this).balance;

        _swapTokensForEth(half);

        uint256 newBalance = (address(this).balance - initialBalance);

        _addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function _swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount)
        private
        lockTheSwap
    {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            marketingWallet,
            block.timestamp
        );
    }

    function changeMarketingWallet(address newWallet)
        public
        onlyOwner
        returns (bool)
    {
        require(newWallet != DEAD, "LP Pair cannot be the Dead wallet, or 0!");
        require(newWallet != address(0), "LP Pair cannot be the Dead wallet, or 0!");
        marketingWallet = newWallet;
        return true;
    }

    function changeTaxForLiquidityAndMarketing(uint256 _taxForLiquidity, uint256 _taxForMarketing)
        public
        onlyOwner
        returns (bool)
    {
        taxForLiquidity = _taxForLiquidity;
        taxForMarketing = _taxForMarketing;
        return true;
    }

    function changeSwapThresholds(uint256 _numTokensSellToAddToLiquidity, uint256 _numTokensSellToAddToETH)
        public
        onlyOwner
        returns (bool)
    {
        require(_numTokensSellToAddToLiquidity < _supply / 98, "Cannot liquidate more than 2% of the supply at once!");
        require(_numTokensSellToAddToETH < _supply / 98, "Cannot liquidate more than 2% of the supply at once!");
        numTokensSellToAddToLiquidity = _numTokensSellToAddToLiquidity * 10**_decimals;
        numTokensSellToAddToETH = _numTokensSellToAddToETH * 10**_decimals;

        return true;
    }

    function changeMaxTxAmount(uint256 _maxTxAmount)
        public
        onlyOwner
        returns (bool)
    {
        maxTxAmount = _maxTxAmount;
        return true;
    }

    function changeMaxWalletAmount(uint256 _maxWalletAmount)
        public
        onlyOwner
        returns (bool)
    {
        maxWalletAmount = _maxWalletAmount;
        return true;
    }

     function enableTrading() external onlyOwner {
        require(!tradingActive, "Cannot re-enable trading");
        tradingActive = true;
    }

     function letsGo() external onlyOwner {
        require(!tradingActive, "Cannot re-enable trading");
        tradingActive = true;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"ExcludedFromFeeUpdated","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":"address","name":"_address","type":"address"}],"name":"PairUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeMarketingWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"changeMaxTxAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"changeMaxWalletAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokensSellToAddToLiquidity","type":"uint256"},{"internalType":"uint256","name":"_numTokensSellToAddToETH","type":"uint256"}],"name":"changeSwapThresholds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxForLiquidity","type":"uint256"},{"internalType":"uint256","name":"_taxForMarketing","type":"uint256"}],"name":"changeTaxForLiquidityAndMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"letsGo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","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":"numTokensSellToAddToETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"updatePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600760a0908152665665726966414960c81b60c0526006906200002890826200067f565b506040805180820190915260048152635646414960e01b60208201526007906200005390826200067f565b506008805460ff19166009908117909155633b9aca008155602f600a818155600b9190915562000084919062000860565b62000093906298968162000878565b600c55600854620000a99060ff16600a62000860565b620000b8906298968162000878565b600d55600e80546001600160a01b03199081167335978d362ebc3f1dcd71a02fac2409a87425b4ae17909155600f805490911661dead1790556000601055600854620001099060ff16600a62000860565b620001189062030d4062000878565b6012556008546200012e9060ff16600a62000860565b6200013d90620186a062000878565b6013556014805460ff191690553480156200015757600080fd5b50600680546200016790620005f0565b80601f01602080910402602001604051908101604052809291908181526020018280546200019590620005f0565b8015620001e65780601f10620001ba57610100808354040283529160200191620001e6565b820191906000526020600020905b815481529060010190602001808311620001c857829003601f168201915b505050505060078054620001fa90620005f0565b80601f01602080910402602001604051908101604052809291908181526020018280546200022890620005f0565b8015620002795780601f106200024d5761010080835404028352916020019162000279565b820191906000526020600020905b8154815290600101906020018083116200025b57829003601f168201915b505050505081600390816200028f91906200067f565b5060046200029e82826200067f565b505050620002bb620002b5620004be60201b60201c565b620004c2565b600854620002ea903390620002d59060ff16600a62000860565b600954620002e4919062000878565b62000514565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000342573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000368919062000892565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003dc919062000892565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200042a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000450919062000892565b60148054610100600160a81b0319166101006001600160a01b03938416021790559081166080819052600090815260116020526040808220805460ff1990811660019081179092553384528284208054821683179055600e54909416835291208054909216179055620008d3565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166200056f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620005839190620008bd565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200060557607f821691505b6020821081036200062657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200067a57600081815260208120601f850160051c81016020861015620006555750805b601f850160051c820191505b81811015620006765782815560010162000661565b5050505b505050565b81516001600160401b038111156200069b576200069b620005da565b620006b381620006ac8454620005f0565b846200062c565b602080601f831160018114620006eb5760008415620006d25750858301515b600019600386901b1c1916600185901b17855562000676565b600085815260208120601f198616915b828110156200071c57888601518255948401946001909101908401620006fb565b50858210156200073b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007a25781600019048211156200078657620007866200074b565b808516156200079457918102915b93841c939080029062000766565b509250929050565b600082620007bb575060016200085a565b81620007ca575060006200085a565b8160018114620007e35760028114620007ee576200080e565b60019150506200085a565b60ff8411156200080257620008026200074b565b50506001821b6200085a565b5060208310610133831016604e8410600b841016171562000833575081810a6200085a565b6200083f838362000761565b80600019048211156200085657620008566200074b565b0290505b92915050565b60006200087160ff841683620007aa565b9392505050565b80820281158282048414176200085a576200085a6200074b565b600060208284031215620008a557600080fd5b81516001600160a01b03811681146200087157600080fd5b808201808211156200085a576200085a6200074b565b608051611d0662000912600039600081816102e2015281816113ef015281816114a8015281816114e40152818161166a01526116d20152611d066000f3fe60806040526004361061021e5760003560e01c806381bfdcca11610123578063ad16a0cf116100ab578063d12a76881161006f578063d12a76881461060f578063dd62ed3e14610625578063df8408fe14610645578063f2fde38b14610665578063f345bd851461068557600080fd5b8063ad16a0cf14610589578063af8af6901461059f578063bb85c6d1146105bf578063bbc0c742146105df578063c0fdea57146105f957600080fd5b806395d89b41116100f257806395d89b4114610509578063a3996f7b1461051e578063a457c2d714610533578063a9059cbb14610553578063aa4bde281461057357600080fd5b806381bfdcca146104b55780638a8c523c146102b95780638c0b5e22146104d55780638da5cb5b146104eb57600080fd5b8063313ce567116101a6578063677daa5711610175578063677daa57146103fa57806370a082311461041a578063715018a61461045057806375f0a87414610465578063768dc7101461048557600080fd5b8063313ce56714610383578063395093511461039f57806349bd5a5e146103bf578063527ffabd146103e457600080fd5b80631694505e116101ed5780631694505e146102d057806318160ddd146103045780631b56bbf91461032357806323b872dd1461034357806330b63d801461036357600080fd5b806303fd2a451461022a57806306fdde0314610267578063095ea7b3146102895780631058bec8146102b957600080fd5b3661022557005b600080fd5b34801561023657600080fd5b50600f5461024a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027357600080fd5b5061027c61069b565b60405161025e9190611757565b34801561029557600080fd5b506102a96102a43660046117ba565b61072d565b604051901515815260200161025e565b3480156102c557600080fd5b506102ce610747565b005b3480156102dc57600080fd5b5061024a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031057600080fd5b506002545b60405190815260200161025e565b34801561032f57600080fd5b506102ce61033e3660046117e6565b6107b6565b34801561034f57600080fd5b506102a961035e36600461180a565b61086e565b34801561036f57600080fd5b506102a961037e36600461184b565b610892565b34801561038f57600080fd5b506040516009815260200161025e565b3480156103ab57600080fd5b506102a96103ba3660046117ba565b61093b565b3480156103cb57600080fd5b5060145461024a9061010090046001600160a01b031681565b3480156103f057600080fd5b50610315600b5481565b34801561040657600080fd5b506102a961041536600461186d565b61095d565b34801561042657600080fd5b506103156104353660046117e6565b6001600160a01b031660009081526020819052604090205490565b34801561045c57600080fd5b506102ce610970565b34801561047157600080fd5b50600e5461024a906001600160a01b031681565b34801561049157600080fd5b506102a96104a03660046117e6565b60116020526000908152604090205460ff1681565b3480156104c157600080fd5b506102a96104d036600461186d565b610984565b3480156104e157600080fd5b50610315600c5481565b3480156104f757600080fd5b506005546001600160a01b031661024a565b34801561051557600080fd5b5061027c610997565b34801561052a57600080fd5b506102ce6109a6565b34801561053f57600080fd5b506102a961054e3660046117ba565b610a01565b34801561055f57600080fd5b506102a961056e3660046117ba565b610a7c565b34801561057f57600080fd5b50610315600d5481565b34801561059557600080fd5b5061031560135481565b3480156105ab57600080fd5b506102a96105ba36600461184b565b610a8a565b3480156105cb57600080fd5b506102a96105da3660046117e6565b610aa3565b3480156105eb57600080fd5b506014546102a99060ff1681565b34801561060557600080fd5b5061031560105481565b34801561061b57600080fd5b5061031560125481565b34801561063157600080fd5b50610315610640366004611886565b610b26565b34801561065157600080fd5b506102ce6106603660046118bf565b610b51565b34801561067157600080fd5b506102ce6106803660046117e6565b610bbc565b34801561069157600080fd5b50610315600a5481565b6060600380546106aa906118f2565b80601f01602080910402602001604051908101604052809291908181526020018280546106d6906118f2565b80156107235780601f106106f857610100808354040283529160200191610723565b820191906000526020600020905b81548152906001019060200180831161070657829003601f168201915b5050505050905090565b60003361073b818585610c35565b60019150505b92915050565b61074f610d59565b60145460ff16156107a75760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e67000000000000000060448201526064015b60405180910390fd5b6014805460ff19166001179055565b6107be610d59565b600f546001600160a01b03908116908216036107ec5760405162461bcd60e51b815260040161079e9061192c565b6001600160a01b0381166108125760405162461bcd60e51b815260040161079e9061192c565b60148054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f9060200160405180910390a150565b60003361087c858285610db3565b610887858585610e2d565b506001949350505050565b600061089c610d59565b60626009546108ab919061198a565b83106108c95760405162461bcd60e51b815260040161079e906119ac565b60626009546108d8919061198a565b82106108f65760405162461bcd60e51b815260040161079e906119ac565b6008546109079060ff16600a611ae4565b6109119084611af3565b6012556008546109259060ff16600a611ae4565b61092f9083611af3565b60135550600192915050565b60003361073b81858561094e8383610b26565b6109589190611b0a565b610c35565b6000610967610d59565b50600c55600190565b610978610d59565b610982600061128c565b565b600061098e610d59565b50600d55600190565b6060600480546106aa906118f2565b6109ae610d59565b6001600a9081556004600b556008546109cc9160ff90911690611ae4565b6109da906301312d01611af3565b600c556008546109ee9060ff16600a611ae4565b6109fc906301312d01611af3565b600d55565b60003381610a0f8286610b26565b905083811015610a6f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161079e565b6108878286868403610c35565b60003361073b818585610e2d565b6000610a94610d59565b50600a91909155600b55600190565b6000610aad610d59565b600f546001600160a01b0390811690831603610adb5760405162461bcd60e51b815260040161079e9061192c565b6001600160a01b038216610b015760405162461bcd60e51b815260040161079e9061192c565b50600e80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610b59610d59565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b610bc4610d59565b6001600160a01b038116610c295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161079e565b610c328161128c565b50565b6001600160a01b038316610c975760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161079e565b6001600160a01b038216610cf85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161079e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146109825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161079e565b6000610dbf8484610b26565b90506000198114610e275781811015610e1a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161079e565b610e278484848403610c35565b50505050565b6001600160a01b038316610e535760405162461bcd60e51b815260040161079e90611b1d565b6001600160a01b038216610e795760405162461bcd60e51b815260040161079e90611b62565b80610e99846001600160a01b031660009081526020819052604090205490565b1015610eb75760405162461bcd60e51b815260040161079e90611ba5565b60145460ff16610f44576005546001600160a01b03848116911614610f445760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c656400606482015260840161079e565b6014546001600160a01b03848116610100909204161480610f7757506014546001600160a01b0383811661010090920416145b8015610f8d5750601454600160a81b900460ff16155b1561127c576014546001600160a01b03848116610100909204161461107f57601054306000908152602081905260408120549091610fca91611beb565b90506012548110610fe057610fe06012546112de565b6013546010541061107d57610ff6601354611385565b6013546010600082825461100a9190611beb565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f1935050505090508061107b5760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b604482015260640161079e565b505b505b6001600160a01b03831660009081526011602052604081205460ff16806110be57506001600160a01b03831660009081526011602052604090205460ff165b156110ca575080611271565b600c548211156111425760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e7400000000000000606482015260840161079e565b6014546001600160a01b036101009091048116908516036111f057600d546001600160a01b0384166000908152602081905260409020546111839084611b0a565b11156111f05760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b606482015260840161079e565b60006064600b54846112029190611af3565b61120c919061198a565b905060006064600a54856112209190611af3565b61122a919061198a565b90506112368183611b0a565b6112409085611beb565b925081601060008282546112549190611b0a565b9091555061126e905086306112698486611b0a565b611565565b50505b610e27848483611565565b611287838383611565565b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6014805460ff60a81b1916600160a81b17905560006112fe60028361198a565b9050600061130c8284611beb565b90504761131883611385565b60006113248247611beb565b90506113308382611651565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506014805460ff60a81b19169055505050565b6014805460ff60a81b1916600160a81b17905560408051600280825260608201835260009260208301908036833701905050905030816000815181106113cd576113cd611bfe565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f9190611c14565b8160018151811061148257611482611bfe565b60200260200101906001600160a01b031690816001600160a01b0316815250506114cd307f000000000000000000000000000000000000000000000000000000000000000084610c35565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611522908590600090869030904290600401611c31565b600060405180830381600087803b15801561153c57600080fd5b505af1158015611550573d6000803e3d6000fd5b50506014805460ff60a81b1916905550505050565b6001600160a01b03831661158b5760405162461bcd60e51b815260040161079e90611b1d565b6001600160a01b0382166115b15760405162461bcd60e51b815260040161079e90611b62565b6001600160a01b038316600090815260208190526040902054818110156115ea5760405162461bcd60e51b815260040161079e90611ba5565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b6014805460ff60a81b1916600160a81b17905561168f307f000000000000000000000000000000000000000000000000000000000000000084610c35565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af115801561171e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117439190611ca2565b50506014805460ff60a81b19169055505050565b600060208083528351808285015260005b8181101561178457858101830151858201604001528201611768565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c3257600080fd5b600080604083850312156117cd57600080fd5b82356117d8816117a5565b946020939093013593505050565b6000602082840312156117f857600080fd5b8135611803816117a5565b9392505050565b60008060006060848603121561181f57600080fd5b833561182a816117a5565b9250602084013561183a816117a5565b929592945050506040919091013590565b6000806040838503121561185e57600080fd5b50508035926020909101359150565b60006020828403121561187f57600080fd5b5035919050565b6000806040838503121561189957600080fd5b82356118a4816117a5565b915060208301356118b4816117a5565b809150509250929050565b600080604083850312156118d257600080fd5b82356118dd816117a5565b9150602083013580151581146118b457600080fd5b600181811c9082168061190657607f821691505b60208210810361192657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000826119a757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526034908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f666040820152732074686520737570706c79206174206f6e63652160601b606082015260800190565b600181815b80851115611a3b578160001904821115611a2157611a21611974565b80851615611a2e57918102915b93841c9390800290611a05565b509250929050565b600082611a5257506001610741565b81611a5f57506000610741565b8160018114611a755760028114611a7f57611a9b565b6001915050610741565b60ff841115611a9057611a90611974565b50506001821b610741565b5060208310610133831016604e8410600b8410161715611abe575081810a610741565b611ac88383611a00565b8060001904821115611adc57611adc611974565b029392505050565b600061180360ff841683611a43565b808202811582820484141761074157610741611974565b8082018082111561074157610741611974565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b8181038181111561074157610741611974565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611c2657600080fd5b8151611803816117a5565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611c815784516001600160a01b031683529383019391830191600101611c5c565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215611cb757600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122034ca30b2db37a5a70ccd690c132597e27e5ae1636a65fd276d1e33a40bdb1a3364736f6c63430008110033

Deployed Bytecode

0x60806040526004361061021e5760003560e01c806381bfdcca11610123578063ad16a0cf116100ab578063d12a76881161006f578063d12a76881461060f578063dd62ed3e14610625578063df8408fe14610645578063f2fde38b14610665578063f345bd851461068557600080fd5b8063ad16a0cf14610589578063af8af6901461059f578063bb85c6d1146105bf578063bbc0c742146105df578063c0fdea57146105f957600080fd5b806395d89b41116100f257806395d89b4114610509578063a3996f7b1461051e578063a457c2d714610533578063a9059cbb14610553578063aa4bde281461057357600080fd5b806381bfdcca146104b55780638a8c523c146102b95780638c0b5e22146104d55780638da5cb5b146104eb57600080fd5b8063313ce567116101a6578063677daa5711610175578063677daa57146103fa57806370a082311461041a578063715018a61461045057806375f0a87414610465578063768dc7101461048557600080fd5b8063313ce56714610383578063395093511461039f57806349bd5a5e146103bf578063527ffabd146103e457600080fd5b80631694505e116101ed5780631694505e146102d057806318160ddd146103045780631b56bbf91461032357806323b872dd1461034357806330b63d801461036357600080fd5b806303fd2a451461022a57806306fdde0314610267578063095ea7b3146102895780631058bec8146102b957600080fd5b3661022557005b600080fd5b34801561023657600080fd5b50600f5461024a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027357600080fd5b5061027c61069b565b60405161025e9190611757565b34801561029557600080fd5b506102a96102a43660046117ba565b61072d565b604051901515815260200161025e565b3480156102c557600080fd5b506102ce610747565b005b3480156102dc57600080fd5b5061024a7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561031057600080fd5b506002545b60405190815260200161025e565b34801561032f57600080fd5b506102ce61033e3660046117e6565b6107b6565b34801561034f57600080fd5b506102a961035e36600461180a565b61086e565b34801561036f57600080fd5b506102a961037e36600461184b565b610892565b34801561038f57600080fd5b506040516009815260200161025e565b3480156103ab57600080fd5b506102a96103ba3660046117ba565b61093b565b3480156103cb57600080fd5b5060145461024a9061010090046001600160a01b031681565b3480156103f057600080fd5b50610315600b5481565b34801561040657600080fd5b506102a961041536600461186d565b61095d565b34801561042657600080fd5b506103156104353660046117e6565b6001600160a01b031660009081526020819052604090205490565b34801561045c57600080fd5b506102ce610970565b34801561047157600080fd5b50600e5461024a906001600160a01b031681565b34801561049157600080fd5b506102a96104a03660046117e6565b60116020526000908152604090205460ff1681565b3480156104c157600080fd5b506102a96104d036600461186d565b610984565b3480156104e157600080fd5b50610315600c5481565b3480156104f757600080fd5b506005546001600160a01b031661024a565b34801561051557600080fd5b5061027c610997565b34801561052a57600080fd5b506102ce6109a6565b34801561053f57600080fd5b506102a961054e3660046117ba565b610a01565b34801561055f57600080fd5b506102a961056e3660046117ba565b610a7c565b34801561057f57600080fd5b50610315600d5481565b34801561059557600080fd5b5061031560135481565b3480156105ab57600080fd5b506102a96105ba36600461184b565b610a8a565b3480156105cb57600080fd5b506102a96105da3660046117e6565b610aa3565b3480156105eb57600080fd5b506014546102a99060ff1681565b34801561060557600080fd5b5061031560105481565b34801561061b57600080fd5b5061031560125481565b34801561063157600080fd5b50610315610640366004611886565b610b26565b34801561065157600080fd5b506102ce6106603660046118bf565b610b51565b34801561067157600080fd5b506102ce6106803660046117e6565b610bbc565b34801561069157600080fd5b50610315600a5481565b6060600380546106aa906118f2565b80601f01602080910402602001604051908101604052809291908181526020018280546106d6906118f2565b80156107235780601f106106f857610100808354040283529160200191610723565b820191906000526020600020905b81548152906001019060200180831161070657829003601f168201915b5050505050905090565b60003361073b818585610c35565b60019150505b92915050565b61074f610d59565b60145460ff16156107a75760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e67000000000000000060448201526064015b60405180910390fd5b6014805460ff19166001179055565b6107be610d59565b600f546001600160a01b03908116908216036107ec5760405162461bcd60e51b815260040161079e9061192c565b6001600160a01b0381166108125760405162461bcd60e51b815260040161079e9061192c565b60148054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f9060200160405180910390a150565b60003361087c858285610db3565b610887858585610e2d565b506001949350505050565b600061089c610d59565b60626009546108ab919061198a565b83106108c95760405162461bcd60e51b815260040161079e906119ac565b60626009546108d8919061198a565b82106108f65760405162461bcd60e51b815260040161079e906119ac565b6008546109079060ff16600a611ae4565b6109119084611af3565b6012556008546109259060ff16600a611ae4565b61092f9083611af3565b60135550600192915050565b60003361073b81858561094e8383610b26565b6109589190611b0a565b610c35565b6000610967610d59565b50600c55600190565b610978610d59565b610982600061128c565b565b600061098e610d59565b50600d55600190565b6060600480546106aa906118f2565b6109ae610d59565b6001600a9081556004600b556008546109cc9160ff90911690611ae4565b6109da906301312d01611af3565b600c556008546109ee9060ff16600a611ae4565b6109fc906301312d01611af3565b600d55565b60003381610a0f8286610b26565b905083811015610a6f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161079e565b6108878286868403610c35565b60003361073b818585610e2d565b6000610a94610d59565b50600a91909155600b55600190565b6000610aad610d59565b600f546001600160a01b0390811690831603610adb5760405162461bcd60e51b815260040161079e9061192c565b6001600160a01b038216610b015760405162461bcd60e51b815260040161079e9061192c565b50600e80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610b59610d59565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b610bc4610d59565b6001600160a01b038116610c295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161079e565b610c328161128c565b50565b6001600160a01b038316610c975760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161079e565b6001600160a01b038216610cf85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161079e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146109825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161079e565b6000610dbf8484610b26565b90506000198114610e275781811015610e1a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161079e565b610e278484848403610c35565b50505050565b6001600160a01b038316610e535760405162461bcd60e51b815260040161079e90611b1d565b6001600160a01b038216610e795760405162461bcd60e51b815260040161079e90611b62565b80610e99846001600160a01b031660009081526020819052604090205490565b1015610eb75760405162461bcd60e51b815260040161079e90611ba5565b60145460ff16610f44576005546001600160a01b03848116911614610f445760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c656400606482015260840161079e565b6014546001600160a01b03848116610100909204161480610f7757506014546001600160a01b0383811661010090920416145b8015610f8d5750601454600160a81b900460ff16155b1561127c576014546001600160a01b03848116610100909204161461107f57601054306000908152602081905260408120549091610fca91611beb565b90506012548110610fe057610fe06012546112de565b6013546010541061107d57610ff6601354611385565b6013546010600082825461100a9190611beb565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f1935050505090508061107b5760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b604482015260640161079e565b505b505b6001600160a01b03831660009081526011602052604081205460ff16806110be57506001600160a01b03831660009081526011602052604090205460ff165b156110ca575080611271565b600c548211156111425760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e7400000000000000606482015260840161079e565b6014546001600160a01b036101009091048116908516036111f057600d546001600160a01b0384166000908152602081905260409020546111839084611b0a565b11156111f05760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b606482015260840161079e565b60006064600b54846112029190611af3565b61120c919061198a565b905060006064600a54856112209190611af3565b61122a919061198a565b90506112368183611b0a565b6112409085611beb565b925081601060008282546112549190611b0a565b9091555061126e905086306112698486611b0a565b611565565b50505b610e27848483611565565b611287838383611565565b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6014805460ff60a81b1916600160a81b17905560006112fe60028361198a565b9050600061130c8284611beb565b90504761131883611385565b60006113248247611beb565b90506113308382611651565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506014805460ff60a81b19169055505050565b6014805460ff60a81b1916600160a81b17905560408051600280825260608201835260009260208301908036833701905050905030816000815181106113cd576113cd611bfe565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f9190611c14565b8160018151811061148257611482611bfe565b60200260200101906001600160a01b031690816001600160a01b0316815250506114cd307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84610c35565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611522908590600090869030904290600401611c31565b600060405180830381600087803b15801561153c57600080fd5b505af1158015611550573d6000803e3d6000fd5b50506014805460ff60a81b1916905550505050565b6001600160a01b03831661158b5760405162461bcd60e51b815260040161079e90611b1d565b6001600160a01b0382166115b15760405162461bcd60e51b815260040161079e90611b62565b6001600160a01b038316600090815260208190526040902054818110156115ea5760405162461bcd60e51b815260040161079e90611ba5565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b6014805460ff60a81b1916600160a81b17905561168f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84610c35565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af115801561171e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117439190611ca2565b50506014805460ff60a81b19169055505050565b600060208083528351808285015260005b8181101561178457858101830151858201604001528201611768565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c3257600080fd5b600080604083850312156117cd57600080fd5b82356117d8816117a5565b946020939093013593505050565b6000602082840312156117f857600080fd5b8135611803816117a5565b9392505050565b60008060006060848603121561181f57600080fd5b833561182a816117a5565b9250602084013561183a816117a5565b929592945050506040919091013590565b6000806040838503121561185e57600080fd5b50508035926020909101359150565b60006020828403121561187f57600080fd5b5035919050565b6000806040838503121561189957600080fd5b82356118a4816117a5565b915060208301356118b4816117a5565b809150509250929050565b600080604083850312156118d257600080fd5b82356118dd816117a5565b9150602083013580151581146118b457600080fd5b600181811c9082168061190657607f821691505b60208210810361192657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000826119a757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526034908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f666040820152732074686520737570706c79206174206f6e63652160601b606082015260800190565b600181815b80851115611a3b578160001904821115611a2157611a21611974565b80851615611a2e57918102915b93841c9390800290611a05565b509250929050565b600082611a5257506001610741565b81611a5f57506000610741565b8160018114611a755760028114611a7f57611a9b565b6001915050610741565b60ff841115611a9057611a90611974565b50506001821b610741565b5060208310610133831016604e8410600b8410161715611abe575081810a610741565b611ac88383611a00565b8060001904821115611adc57611adc611974565b029392505050565b600061180360ff841683611a43565b808202811582820484141761074157610741611974565b8082018082111561074157610741611974565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b8181038181111561074157610741611974565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611c2657600080fd5b8151611803816117a5565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611c815784516001600160a01b031683529383019391830191600101611c5c565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215611cb757600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122034ca30b2db37a5a70ccd690c132597e27e5ae1636a65fd276d1e33a40bdb1a3364736f6c63430008110033

Deployed Bytecode Sourcemap

28735:9371:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29421:64;;;;;;;;;;-1:-1:-1;29421:64:0;;;;-1:-1:-1;;;;;29421:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;29421:64:0;;;;;;;;18453:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20727:244::-;;;;;;;;;;-1:-1:-1;20727:244:0;;;;;:::i;:::-;;:::i;:::-;;;1396:14:1;;1389:22;1371:41;;1359:2;1344:18;20727:244:0;1231:187:1;37928:138:0;;;;;;;;;;;;;:::i;:::-;;30206:51;;;;;;;;;;;;;;;19591:110;;;;;;;;;;-1:-1:-1;19681:12:0;;19591:110;;;1803:25:1;;;1791:2;1776:18;19591:110:0;1657:177:1;31471:288:0;;;;;;;;;;-1:-1:-1;31471:288:0;;;;;:::i;:::-;;:::i;21551:297::-;;;;;;;;;;-1:-1:-1;21551:297:0;;;;;:::i;:::-;;:::i;36771:602::-;;;;;;;;;;-1:-1:-1;36771:602:0;;;;;:::i;:::-;;:::i;19434:92::-;;;;;;;;;;-1:-1:-1;19434:92:0;;19517:1;2947:36:1;;2935:2;2920:18;19434:92:0;2805:184:1;23267:272:0;;;;;;;;;;-1:-1:-1;23267:272:0;;;;;:::i;:::-;;:::i;30264:28::-;;;;;;;;;;-1:-1:-1;30264:28:0;;;;;;;-1:-1:-1;;;;;30264:28:0;;;29115:35;;;;;;;;;;;;;;;;37381:180;;;;;;;;;;-1:-1:-1;37381:180:0;;;;;:::i;:::-;;:::i;18618:177::-;;;;;;;;;;-1:-1:-1;18618:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;18769:18:0;18737:7;18769:18;;;;;;;;;;;;18618:177;15712:103;;;;;;;;;;;;;:::i;29339:75::-;;;;;;;;;;-1:-1:-1;29339:75:0;;;;-1:-1:-1;;;;;29339:75:0;;;29536:50;;;;;;;;;;-1:-1:-1;29536:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37569:196;;;;;;;;;;-1:-1:-1;37569:196:0;;;;;:::i;:::-;;:::i;29211:55::-;;;;;;;;;;;;;;;;15064:87;;;;;;;;;;-1:-1:-1;15137:6:0;;-1:-1:-1;;;;;15137:6:0;15064:87;;18277:106;;;;;;;;;;;;;:::i;29781:215::-;;;;;;;;;;;;;:::i;22351:507::-;;;;;;;;;;-1:-1:-1;22351:507:0;;;;;:::i;:::-;;:::i;20171:236::-;;;;;;;;;;-1:-1:-1;20171:236:0;;;;;:::i;:::-;;:::i;29273:59::-;;;;;;;;;;;;;;;;29669:63;;;;;;;;;;;;;;;;36484:279;;;;;;;;;;-1:-1:-1;36484:279:0;;;;;:::i;:::-;;:::i;36126:350::-;;;;;;;;;;-1:-1:-1;36126:350:0;;;;;:::i;:::-;;:::i;29739:33::-;;;;;;;;;;-1:-1:-1;29739:33:0;;;;;;;;29492:37;;;;;;;;;;;;;;;;29593:69;;;;;;;;;;;;;;;;19764:201;;;;;;;;;;-1:-1:-1;19764:201:0;;;;;:::i;:::-;;:::i;34537:189::-;;;;;;;;;;-1:-1:-1;34537:189:0;;;;;:::i;:::-;;:::i;15970:238::-;;;;;;;;;;-1:-1:-1;15970:238:0;;;;;:::i;:::-;;:::i;29019:35::-;;;;;;;;;;;;;;;;18453:102;18509:13;18542:5;18535:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18453:102;:::o;20727:244::-;20848:4;13937:10;20909:32;13937:10;20925:7;20934:6;20909:8;:32::i;:::-;20959:4;20952:11;;;20727:244;;;;;:::o;37928:138::-;14950:13;:11;:13::i;:::-;37985::::1;::::0;::::1;;37984:14;37976:51;;;::::0;-1:-1:-1;;;37976:51:0;;4580:2:1;37976:51:0::1;::::0;::::1;4562:21:1::0;4619:2;4599:18;;;4592:30;4658:26;4638:18;;;4631:54;4702:18;;37976:51:0::1;;;;;;;;;38038:13;:20:::0;;-1:-1:-1;;38038:20:0::1;38054:4;38038:20;::::0;;37928:138::o;31471:288::-;14950:13;:11;:13::i;:::-;31553:4:::1;::::0;-1:-1:-1;;;;;31553:4:0;;::::1;31544:13:::0;;::::1;::::0;31536:66:::1;;;;-1:-1:-1::0;;;31536:66:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31621:19:0;::::1;31613:72;;;;-1:-1:-1::0;;;31613:72:0::1;;;;;;;:::i;:::-;31696:13;:21:::0;;-1:-1:-1;;;;;;31696:21:0::1;;-1:-1:-1::0;;;;;31696:21:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;31733:18:::1;::::0;160:51:1;;;31733:18:0::1;::::0;148:2:1;133:18;31733::0::1;;;;;;;31471:288:::0;:::o;21551:297::-;21684:4;13937:10;21742:38;21758:4;13937:10;21773:6;21742:15;:38::i;:::-;21791:27;21801:4;21807:2;21811:6;21791:9;:27::i;:::-;-1:-1:-1;21836:4:0;;21551:297;-1:-1:-1;;;;21551:297:0:o;36771:602::-;36928:4;14950:13;:11;:13::i;:::-;37001:2:::1;36991:7;;:12;;;;:::i;:::-;36958:30;:45;36950:110;;;;-1:-1:-1::0;;;36950:110:0::1;;;;;;;:::i;:::-;37116:2;37106:7;;:12;;;;:::i;:::-;37079:24;:39;37071:104;;;;-1:-1:-1::0;;;37071:104:0::1;;;;;;;:::i;:::-;37255:9;::::0;37251:13:::1;::::0;37255:9:::1;;37251:2;:13;:::i;:::-;37218:46;::::0;:30;:46:::1;:::i;:::-;37186:29;:78:::0;37332:9:::1;::::0;37328:13:::1;::::0;37332:9:::1;;37328:2;:13;:::i;:::-;37301:40;::::0;:24;:40:::1;:::i;:::-;37275:23;:66:::0;-1:-1:-1;37361:4:0::1;36771:602:::0;;;;:::o;23267:272::-;23384:4;13937:10;23445:64;13937:10;23461:7;23498:10;23470:25;13937:10;23461:7;23470:9;:25::i;:::-;:38;;;;:::i;:::-;23445:8;:64::i;37381:180::-;37483:4;14950:13;:11;:13::i;:::-;-1:-1:-1;37505:11:0::1;:26:::0;37549:4:::1;::::0;37381:180::o;15712:103::-;14950:13;:11;:13::i;:::-;15777:30:::1;15804:1;15777:18;:30::i;:::-;15712:103::o:0;37569:196::-;37679:4;14950:13;:11;:13::i;:::-;-1:-1:-1;37701:15:0::1;:34:::0;37753:4:::1;::::0;37569:196::o;18277:106::-;18335:13;18368:7;18361:14;;;;;:::i;29781:215::-;14950:13;:11;:13::i;:::-;29851:1:::1;29833:15;:19:::0;;;29881:1:::1;29863:15;:19:::0;29924:9:::1;::::0;29920:13:::1;::::0;29924:9:::1;::::0;;::::1;::::0;29920:13:::1;:::i;:::-;29907:26;::::0;:10:::1;:26;:::i;:::-;29893:11;:40:::0;29979:9:::1;::::0;29975:13:::1;::::0;29979:9:::1;;29975:2;:13;:::i;:::-;29962:26;::::0;:10:::1;:26;:::i;:::-;29944:15;:44:::0;29781:215::o;22351:507::-;22473:4;13937:10;22473:4;22561:25;13937:10;22578:7;22561:9;:25::i;:::-;22534:52;;22639:15;22619:16;:35;;22597:122;;;;-1:-1:-1;;;22597:122:0;;7803:2:1;22597:122:0;;;7785:21:1;7842:2;7822:18;;;7815:30;7881:34;7861:18;;;7854:62;-1:-1:-1;;;7932:18:1;;;7925:35;7977:19;;22597:122:0;7601:401:1;22597:122:0;22755:60;22764:5;22771:7;22799:15;22780:16;:34;22755:8;:60::i;20171:236::-;20288:4;13937:10;20349:28;13937:10;20366:2;20370:6;20349:9;:28::i;36484:279::-;36632:4;14950:13;:11;:13::i;:::-;-1:-1:-1;36654:15:0::1;:34:::0;;;;36699:15:::1;:34:::0;36751:4:::1;::::0;36484:279::o;36126:350::-;36229:4;14950:13;:11;:13::i;:::-;36272:4:::1;::::0;-1:-1:-1;;;;;36272:4:0;;::::1;36259:17:::0;;::::1;::::0;36251:70:::1;;;;-1:-1:-1::0;;;36251:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36340:23:0;::::1;36332:76;;;;-1:-1:-1::0;;;36332:76:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;36419:15:0::1;:27:::0;;-1:-1:-1;;;;;36419:27:0;::::1;-1:-1:-1::0;;;;;;36419:27:0;;::::1;;::::0;;;36126:350;;;:::o;19764:201::-;-1:-1:-1;;;;;19930:18:0;;;19898:7;19930:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19764:201::o;34537:189::-;14950:13;:11;:13::i;:::-;-1:-1:-1;;;;;34623:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;;;;;:38;;-1:-1:-1;;34623:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34677:41;;8175:51:1;;;8242:18;;;8235:50;34677:41:0::1;::::0;8148:18:1;34677:41:0::1;;;;;;;34537:189:::0;;:::o;15970:238::-;14950:13;:11;:13::i;:::-;-1:-1:-1;;;;;16073:22:0;::::1;16051:110;;;::::0;-1:-1:-1;;;16051:110:0;;8498:2:1;16051:110:0::1;::::0;::::1;8480:21:1::0;8537:2;8517:18;;;8510:30;8576:34;8556:18;;;8549:62;-1:-1:-1;;;8627:18:1;;;8620:36;8673:19;;16051:110:0::1;8296:402:1::0;16051:110:0::1;16172:28;16191:8;16172:18;:28::i;:::-;15970:238:::0;:::o;25574:380::-;-1:-1:-1;;;;;25710:19:0;;25702:68;;;;-1:-1:-1;;;25702:68:0;;8905:2:1;25702:68:0;;;8887:21:1;8944:2;8924:18;;;8917:30;8983:34;8963:18;;;8956:62;-1:-1:-1;;;9034:18:1;;;9027:34;9078:19;;25702:68:0;8703:400:1;25702:68:0;-1:-1:-1;;;;;25789:21:0;;25781:68;;;;-1:-1:-1;;;25781:68:0;;9310:2:1;25781:68:0;;;9292:21:1;9349:2;9329:18;;;9322:30;9388:34;9368:18;;;9361:62;-1:-1:-1;;;9439:18:1;;;9432:32;9481:19;;25781:68:0;9108:398:1;25781:68:0;-1:-1:-1;;;;;25862:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25914:32;;1803:25:1;;;25914:32:0;;1776:18:1;25914:32:0;;;;;;;25574:380;;;:::o;15229:132::-;15137:6;;-1:-1:-1;;;;;15137:6:0;13937:10;15293:23;15285:68;;;;-1:-1:-1;;;15285:68:0;;9713:2:1;15285:68:0;;;9695:21:1;;;9732:18;;;9725:30;9791:34;9771:18;;;9764:62;9843:18;;15285:68:0;9511:356:1;26245:502:0;26380:24;26407:25;26417:5;26424:7;26407:9;:25::i;:::-;26380:52;;-1:-1:-1;;26447:16:0;:37;26443:297;;26547:6;26527:16;:26;;26501:117;;;;-1:-1:-1;;;26501:117:0;;10074:2:1;26501:117:0;;;10056:21:1;10113:2;10093:18;;;10086:30;10152:31;10132:18;;;10125:59;10201:18;;26501:117:0;9872:353:1;26501:117:0;26662:51;26671:5;26678:7;26706:6;26687:16;:25;26662:8;:51::i;:::-;26369:378;26245:502;;;:::o;32237:2292::-;-1:-1:-1;;;;;32335:18:0;;32327:68;;;;-1:-1:-1;;;32327:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32414:16:0;;32406:64;;;;-1:-1:-1;;;32406:64:0;;;;;;;:::i;:::-;32508:6;32489:15;32499:4;-1:-1:-1;;;;;18769:18:0;18737:7;18769:18;;;;;;;;;;;;18618:177;32489:15;:25;;32481:76;;;;-1:-1:-1;;;32481:76:0;;;;;;;:::i;:::-;32573:13;;;;32568:138;;15137:6;;-1:-1:-1;;;;;32611:15:0;;;15137:6;;32611:15;32603:91;;;;-1:-1:-1;;;32603:91:0;;11649:2:1;32603:91:0;;;11631:21:1;11688:2;11668:18;;;11661:30;11727:34;11707:18;;;11700:62;11798:33;11778:18;;;11771:61;11849:19;;32603:91:0;11447:427:1;32603:91:0;32731:13;;-1:-1:-1;;;;;32723:21:0;;;32731:13;;;;;32723:21;;:44;;-1:-1:-1;32754:13:0;;-1:-1:-1;;;;;32748:19:0;;;32754:13;;;;;32748:19;32723:44;32722:67;;;;-1:-1:-1;32773:16:0;;-1:-1:-1;;;32773:16:0;;;;32772:17;32722:67;32718:1804;;;32818:13;;-1:-1:-1;;;;;32810:21:0;;;32818:13;;;;;32810:21;32806:681;;32914:18;;32905:4;32852:32;18769:18;;;;;;;;;;;32852:32;;32887:45;;;:::i;:::-;32852:80;;32983:29;;32955:24;:57;32951:152;;33037:46;33053:29;;33037:15;:46::i;:::-;33149:23;;33126:18;;33125:47;33121:351;;33197:42;33215:23;;33197:17;:42::i;:::-;33284:23;;33262:18;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;33350:15:0;;33342:52;;33330:9;;-1:-1:-1;;;;;33350:15:0;;33372:21;33342:52;;;;;33330:9;33342:52;33330:9;33342:52;33372:21;33350:15;33342:52;;;;;;;33330:64;;33425:4;33417:35;;;;-1:-1:-1;;;33417:35:0;;12214:2:1;33417:35:0;;;12196:21:1;12253:2;12233:18;;;12226:30;-1:-1:-1;;;12272:18:1;;;12265:48;12330:18;;33417:35:0;12012:342:1;33417:35:0;33174:298;33121:351;32833:654;32806:681;-1:-1:-1;;;;;33544:24:0;;33503:22;33544:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;33572:22:0;;;;;;:18;:22;;;;;;;;33544:50;33540:839;;;-1:-1:-1;33632:6:0;33540:839;;;33711:11;;33701:6;:21;;33693:91;;;;-1:-1:-1;;;33693:91:0;;12561:2:1;33693:91:0;;;12543:21:1;12600:2;12580:18;;;12573:30;12639:34;12619:18;;;12612:62;12710:27;12690:18;;;12683:55;12755:19;;33693:91:0;12359:421:1;33693:91:0;33814:13;;-1:-1:-1;;;;;33814:13:0;;;;;;33806:21;;;;33803:178;;33887:15;;-1:-1:-1;;;;;18769:18:0;;18737:7;18769:18;;;;;;;;;;;33860:22;;:6;:22;:::i;:::-;33859:43;;33851:110;;;;-1:-1:-1;;;33851:110:0;;12987:2:1;33851:110:0;;;12969:21:1;13026:2;13006:18;;;12999:30;13065:34;13045:18;;;13038:62;-1:-1:-1;;;13116:18:1;;;13109:52;13178:19;;33851:110:0;12785:418:1;33851:110:0;34001:22;34056:3;34037:15;;34028:6;:24;;;;:::i;:::-;34027:32;;;;:::i;:::-;34001:59;;34079:22;34134:3;34115:15;;34106:6;:24;;;;:::i;:::-;34105:32;;;;:::i;:::-;34079:59;-1:-1:-1;34184:31:0;34079:59;34184:14;:31;:::i;:::-;34174:42;;:6;:42;:::i;:::-;34157:59;;34257:14;34235:18;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;34292:71:0;;-1:-1:-1;34308:4:0;34322;34330:31;34347:14;34330;:31;:::i;:::-;34292:15;:71::i;:::-;33674:705;;33540:839;34393:41;34409:4;34415:2;34419:14;34393:15;:41::i;32718:1804::-;34477:33;34493:4;34499:2;34503:6;34477:15;:33::i;:::-;32237:2292;;;:::o;16368:191::-;16461:6;;;-1:-1:-1;;;;;16478:17:0;;;-1:-1:-1;;;;;;16478:17:0;;;;;;;16511:40;;16461:6;;;16478:17;16461:6;;16511:40;;16442:16;;16511:40;16431:128;16368:191;:::o;34734:474::-;30504:16;:23;;-1:-1:-1;;;;30504:23:0;-1:-1:-1;;;30504:23:0;;;;34836:24:::1;34859:1;34836:20:::0;:24:::1;:::i;:::-;34820:41:::0;-1:-1:-1;34872:17:0::1;34893:27;34820:41:::0;34893:20;:27:::1;:::i;:::-;34872:49:::0;-1:-1:-1;34959:21:0::1;34993:23;35011:4:::0;34993:17:::1;:23::i;:::-;35029:18;35051:38;35075:14:::0;35051:21:::1;:38;:::i;:::-;35029:61;;35103:36;35117:9;35128:10;35103:13;:36::i;:::-;35157:43;::::0;;13410:25:1;;;13466:2;13451:18;;13444:34;;;13494:18;;;13487:34;;;35157:43:0::1;::::0;13398:2:1;13383:18;35157:43:0::1;;;;;;;-1:-1:-1::0;;30550:16:0;:24;;-1:-1:-1;;;;30550:24:0;;;-1:-1:-1;;;34734:474:0:o;35216:488::-;30504:16;:23;;-1:-1:-1;;;;30504:23:0;-1:-1:-1;;;30504:23:0;;;35319:16:::1;::::0;;35333:1:::1;35319:16:::0;;;;;::::1;::::0;;-1:-1:-1;;35319:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;35319:16:0::1;35295:40;;35364:4;35346;35351:1;35346:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;35346:23:0::1;;;-1:-1:-1::0;;;;;35346:23:0::1;;;::::0;::::1;35390:15;-1:-1:-1::0;;;;;35390:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35380:4;35385:1;35380:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;35380:32:0::1;;;-1:-1:-1::0;;;;;35380:32:0::1;;;::::0;::::1;35425:62;35442:4;35457:15;35475:11;35425:8;:62::i;:::-;35500:196;::::0;-1:-1:-1;;;35500:196:0;;-1:-1:-1;;;;;35500:15:0::1;:66;::::0;::::1;::::0;:196:::1;::::0;35581:11;;35607:1:::1;::::0;35623:4;;35650::::1;::::0;35670:15:::1;::::0;35500:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;30550:16:0;:24;;-1:-1:-1;;;;30550:24:0;;;-1:-1:-1;;;;35216:488:0:o;26755:776::-;-1:-1:-1;;;;;26886:18:0;;26878:68;;;;-1:-1:-1;;;26878:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26965:16:0;;26957:64;;;;-1:-1:-1;;;26957:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27056:15:0;;27034:19;27056:15;;;;;;;;;;;27104:21;;;;27082:109;;;;-1:-1:-1;;;27082:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27227:15:0;;;:9;:15;;;;;;;;;;;27245:20;;;27227:38;;27445:13;;;;;;;;;;:23;;;;;;27497:26;;1803:25:1;;;27445:13:0;;27497:26;;1776:18:1;27497:26:0;;;;;;;26867:664;26755:776;;;:::o;35712:406::-;30504:16;:23;;-1:-1:-1;;;;30504:23:0;-1:-1:-1;;;30504:23:0;;;35829:62:::1;35846:4;35861:15;35879:11:::0;35829:8:::1;:62::i;:::-;36054:15;::::0;35904:206:::1;::::0;-1:-1:-1;;;35904:206:0;;35976:4:::1;35904:206;::::0;::::1;15378:34:1::0;15428:18;;;15421:34;;;36022:1:0::1;15471:18:1::0;;;15464:34;;;15514:18;;;15507:34;-1:-1:-1;;;;;36054:15:0;;::::1;15557:19:1::0;;;15550:44;36084:15:0::1;15610:19:1::0;;;15603:35;35904:15:0::1;:31:::0;;::::1;::::0;::::1;::::0;35943:9;;15312:19:1;;35904:206:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;30550:16:0;:24;;-1:-1:-1;;;;30550:24:0;;;-1:-1:-1;;;35712:406:0:o;222:548:1:-;334:4;363:2;392;381:9;374:21;424:6;418:13;467:6;462:2;451:9;447:18;440:34;492:1;502:140;516:6;513:1;510:13;502:140;;;611:14;;;607:23;;601:30;577:17;;;596:2;573:26;566:66;531:10;;502:140;;;506:3;691:1;686:2;677:6;666:9;662:22;658:31;651:42;761:2;754;750:7;745:2;737:6;733:15;729:29;718:9;714:45;710:54;702:62;;;;222:548;;;;:::o;775:131::-;-1:-1:-1;;;;;850:31:1;;840:42;;830:70;;896:1;893;886:12;911:315;979:6;987;1040:2;1028:9;1019:7;1015:23;1011:32;1008:52;;;1056:1;1053;1046:12;1008:52;1095:9;1082:23;1114:31;1139:5;1114:31;:::i;:::-;1164:5;1216:2;1201:18;;;;1188:32;;-1:-1:-1;;;911:315:1:o;1839:247::-;1898:6;1951:2;1939:9;1930:7;1926:23;1922:32;1919:52;;;1967:1;1964;1957:12;1919:52;2006:9;1993:23;2025:31;2050:5;2025:31;:::i;:::-;2075:5;1839:247;-1:-1:-1;;;1839:247:1:o;2091:456::-;2168:6;2176;2184;2237:2;2225:9;2216:7;2212:23;2208:32;2205:52;;;2253:1;2250;2243:12;2205:52;2292:9;2279:23;2311:31;2336:5;2311:31;:::i;:::-;2361:5;-1:-1:-1;2418:2:1;2403:18;;2390:32;2431:33;2390:32;2431:33;:::i;:::-;2091:456;;2483:7;;-1:-1:-1;;;2537:2:1;2522:18;;;;2509:32;;2091:456::o;2552:248::-;2620:6;2628;2681:2;2669:9;2660:7;2656:23;2652:32;2649:52;;;2697:1;2694;2687:12;2649:52;-1:-1:-1;;2720:23:1;;;2790:2;2775:18;;;2762:32;;-1:-1:-1;2552:248:1:o;2994:180::-;3053:6;3106:2;3094:9;3085:7;3081:23;3077:32;3074:52;;;3122:1;3119;3112:12;3074:52;-1:-1:-1;3145:23:1;;2994:180;-1:-1:-1;2994:180:1:o;3179:388::-;3247:6;3255;3308:2;3296:9;3287:7;3283:23;3279:32;3276:52;;;3324:1;3321;3314:12;3276:52;3363:9;3350:23;3382:31;3407:5;3382:31;:::i;:::-;3432:5;-1:-1:-1;3489:2:1;3474:18;;3461:32;3502:33;3461:32;3502:33;:::i;:::-;3554:7;3544:17;;;3179:388;;;;;:::o;3572:416::-;3637:6;3645;3698:2;3686:9;3677:7;3673:23;3669:32;3666:52;;;3714:1;3711;3704:12;3666:52;3753:9;3740:23;3772:31;3797:5;3772:31;:::i;:::-;3822:5;-1:-1:-1;3879:2:1;3864:18;;3851:32;3921:15;;3914:23;3902:36;;3892:64;;3952:1;3949;3942:12;3993:380;4072:1;4068:12;;;;4115;;;4136:61;;4190:4;4182:6;4178:17;4168:27;;4136:61;4243:2;4235:6;4232:14;4212:18;4209:38;4206:161;;4289:10;4284:3;4280:20;4277:1;4270:31;4324:4;4321:1;4314:15;4352:4;4349:1;4342:15;4206:161;;3993:380;;;:::o;4731:404::-;4933:2;4915:21;;;4972:2;4952:18;;;4945:30;5011:34;5006:2;4991:18;;4984:62;-1:-1:-1;;;5077:2:1;5062:18;;5055:38;5125:3;5110:19;;4731:404::o;5140:127::-;5201:10;5196:3;5192:20;5189:1;5182:31;5232:4;5229:1;5222:15;5256:4;5253:1;5246:15;5272:217;5312:1;5338;5328:132;;5382:10;5377:3;5373:20;5370:1;5363:31;5417:4;5414:1;5407:15;5445:4;5442:1;5435:15;5328:132;-1:-1:-1;5474:9:1;;5272:217::o;5494:416::-;5696:2;5678:21;;;5735:2;5715:18;;;5708:30;5774:34;5769:2;5754:18;;5747:62;-1:-1:-1;;;5840:2:1;5825:18;;5818:50;5900:3;5885:19;;5494:416::o;5915:422::-;6004:1;6047:5;6004:1;6061:270;6082:7;6072:8;6069:21;6061:270;;;6141:4;6137:1;6133:6;6129:17;6123:4;6120:27;6117:53;;;6150:18;;:::i;:::-;6200:7;6190:8;6186:22;6183:55;;;6220:16;;;;6183:55;6299:22;;;;6259:15;;;;6061:270;;;6065:3;5915:422;;;;;:::o;6342:806::-;6391:5;6421:8;6411:80;;-1:-1:-1;6462:1:1;6476:5;;6411:80;6510:4;6500:76;;-1:-1:-1;6547:1:1;6561:5;;6500:76;6592:4;6610:1;6605:59;;;;6678:1;6673:130;;;;6585:218;;6605:59;6635:1;6626:10;;6649:5;;;6673:130;6710:3;6700:8;6697:17;6694:43;;;6717:18;;:::i;:::-;-1:-1:-1;;6773:1:1;6759:16;;6788:5;;6585:218;;6887:2;6877:8;6874:16;6868:3;6862:4;6859:13;6855:36;6849:2;6839:8;6836:16;6831:2;6825:4;6822:12;6818:35;6815:77;6812:159;;;-1:-1:-1;6924:19:1;;;6956:5;;6812:159;7003:34;7028:8;7022:4;7003:34;:::i;:::-;7073:6;7069:1;7065:6;7061:19;7052:7;7049:32;7046:58;;;7084:18;;:::i;:::-;7122:20;;6342:806;-1:-1:-1;;;6342:806:1:o;7153:140::-;7211:5;7240:47;7281:4;7271:8;7267:19;7261:4;7240:47;:::i;7298:168::-;7371:9;;;7402;;7419:15;;;7413:22;;7399:37;7389:71;;7440:18;;:::i;7471:125::-;7536:9;;;7557:10;;;7554:36;;;7570:18;;:::i;10230:401::-;10432:2;10414:21;;;10471:2;10451:18;;;10444:30;10510:34;10505:2;10490:18;;10483:62;-1:-1:-1;;;10576:2:1;10561:18;;10554:35;10621:3;10606:19;;10230:401::o;10636:399::-;10838:2;10820:21;;;10877:2;10857:18;;;10850:30;10916:34;10911:2;10896:18;;10889:62;-1:-1:-1;;;10982:2:1;10967:18;;10960:33;11025:3;11010:19;;10636:399::o;11040:402::-;11242:2;11224:21;;;11281:2;11261:18;;;11254:30;11320:34;11315:2;11300:18;;11293:62;-1:-1:-1;;;11386:2:1;11371:18;;11364:36;11432:3;11417:19;;11040:402::o;11879:128::-;11946:9;;;11967:11;;;11964:37;;;11981:18;;:::i;13664:127::-;13725:10;13720:3;13716:20;13713:1;13706:31;13756:4;13753:1;13746:15;13780:4;13777:1;13770:15;13796:251;13866:6;13919:2;13907:9;13898:7;13894:23;13890:32;13887:52;;;13935:1;13932;13925:12;13887:52;13967:9;13961:16;13986:31;14011:5;13986:31;:::i;14052:980::-;14314:4;14362:3;14351:9;14347:19;14393:6;14382:9;14375:25;14419:2;14457:6;14452:2;14441:9;14437:18;14430:34;14500:3;14495:2;14484:9;14480:18;14473:31;14524:6;14559;14553:13;14590:6;14582;14575:22;14628:3;14617:9;14613:19;14606:26;;14667:2;14659:6;14655:15;14641:29;;14688:1;14698:195;14712:6;14709:1;14706:13;14698:195;;;14777:13;;-1:-1:-1;;;;;14773:39:1;14761:52;;14868:15;;;;14833:12;;;;14809:1;14727:9;14698:195;;;-1:-1:-1;;;;;;;14949:32:1;;;;14944:2;14929:18;;14922:60;-1:-1:-1;;;15013:3:1;14998:19;14991:35;14910:3;14052:980;-1:-1:-1;;;14052:980:1:o;15649:306::-;15737:6;15745;15753;15806:2;15794:9;15785:7;15781:23;15777:32;15774:52;;;15822:1;15819;15812:12;15774:52;15851:9;15845:16;15835:26;;15901:2;15890:9;15886:18;15880:25;15870:35;;15945:2;15934:9;15930:18;15924:25;15914:35;;15649:306;;;;;:::o

Swarm Source

ipfs://34ca30b2db37a5a70ccd690c132597e27e5ae1636a65fd276d1e33a40bdb1a33
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.